PythonCard-0.8.2/0000755000076500007650000000000010434046773013522 5ustar alexalex00000000000000PythonCard-0.8.2/__init__.py0000644000076500007650000000022507333572647015642 0ustar alexalex00000000000000""" Created: 2001/08/05 Purpose: Turn PythonCard into a package __version__ = "$Revision: 1.1.1.1 $" __date__ = "$Date: 2001/08/06 19:53:11 $" """ PythonCard-0.8.2/__version__.py0000644000076500007650000000074310135311342016342 0ustar alexalex00000000000000""" Created: 2001/08/03 Purpose: When a new release is made, a tag will be created in the cvs tree and the VERSION below will be updated to match the tag and .zip release file posted. For example: tag: release_0_8_1 release file on SourceForge: PythonCard-0.8.1.zip __version__ = "$Revision: 1.39 $" __date__ = "$Date: 2004/10/19 22:19:14 $" """ VERSION = (0, 8, 2) VERSION_STRING = ".".join([str(digit) for digit in VERSION]) PythonCard-0.8.2/about.py0000644000076500007650000000232610130045242015170 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.6 $" __date__ = "$Date: 2004/10/03 18:53:22 $" """ import os, sys import wx import __version__ import dialog def aboutPythonCardDialog(parent=None): """Displays a ScrolledMessageDialog containing info about PythonCard and version numbers""" aboutTitle = "About PythonCard" txt = """PythonCard PythonCard is a GUI construction kit for building cross-platform desktop applications on Windows, Mac OS X, and Linux, using the Python language. """ txt += "PythonCard version: %s\n" % __version__.VERSION_STRING txt += "wxPython version: %s\n" % wx.VERSION_STRING txt += "Python version: %s\n" % sys.version txt += "Platform: %s\n" % os.sys.platform txt += """ For more information see the docs directory included with this distribution. Latest release files: http://sourceforge.net/project/showfiles.php?group_id=19015 PythonCard home page http://pythoncard.sourceforge.net/ SourceForge summary page http://sourceforge.net/projects/pythoncard/ Mailing list http://lists.sourceforge.net/lists/listinfo/pythoncard-users PythonCard requires Python 2.3 or later and wxPython 2.5.2.8 or later. """ dialog.scrolledMessageDialog(parent, txt, aboutTitle) PythonCard-0.8.2/clipboard.py0000644000076500007650000000213410037624642016027 0ustar alexalex00000000000000""" __version__ = "$Revision: 1.6 $" __date__ = "$Date: 2004/04/16 00:32:34 $" """ import wx def getClipboard(): data = None try: if wx.TheClipboard.Open(): if wx.TheClipboard.IsSupported(wx.DataFormat(wx.DF_TEXT)): do = wx.TextDataObject() wx.TheClipboard.GetData(do) data = do.GetText() elif wx.TheClipboard.IsSupported(wx.DataFormat(wx.DF_BITMAP)): do = wx.BitmapDataObject() wx.TheClipboard.GetData(do) data = do.GetBitmap() wx.TheClipboard.Close() except: data = None return data def setClipboard(data): try: if wx.TheClipboard.Open(): if isinstance(data, (str, unicode)): do = wx.TextDataObject() do.SetText(data) wx.TheClipboard.SetData(do) elif isinstance(data, wx.Bitmap): do = wx.BitmapDataObject() do.SetBitmap(data) wx.TheClipboard.SetData(do) wx.TheClipboard.Close() except: pass PythonCard-0.8.2/component.py0000644000076500007650000002522010165335031016064 0ustar alexalex00000000000000""" __version__ = "$Revision: 1.8 $" __date__ = "$Date: 2003/01/10 07:19:39 $" """ import event, registry, log import inspect class IScriptable(object): """ RDS - 2004-05-02 The public interface for all scriptable objects. """ def execute(self, name, event): raise NotImplementedError class NullScriptable(IScriptable): """ RDS - 2004-05-02 Installed as the parent of any Scriptable object that is instantiated with a parent=None. This implementation calls the EventLog when an event is executed and logs it as *not* used. """ def execute(self, name, event): event.EventLog.getInstance().log(event, '(not handled)', False) class Scriptable(IScriptable): """ RDS - 2004-05-02 A new Scriptable that will Component will inherit from. In this design, the Scriptable is responsible for execution of it's handlers. All classes that may contain PythonCard EventHandler definitions must implement Scriptable. A Scriptable object may be specified as the parent of this object. The parent will be searched for EventHandlers if a EventHandler can't be found in this object. """ def __init__(self, parent=None): if parent is None: parent = NullScriptable() self._parent = parent self._handlers = {} self._parseHandlers() def _parseHandlers(self): """ Find all of the methods in this object that are PythonCard handlers, and register them. """ found = [] methods = inspect.getmembers(self, inspect.ismethod) for m in methods: if m[ 0 ].split('_')[ 0 ] == 'on': found.append(m[ 1 ]) map(self._addHandler, found) def _isPythonCardHandler(self, aObject): """ Return true if the object is a PythonCard handler. """ return isinstance(aObject, types.FunctionType) and aObject.__name__.split('_')[0] == 'on' def _addHandler(self, method): # Add the EventHandlers to our EventHandler list. if method.__name__ not in self._handlers: log.debug("_addHandler: " + method.__name__) self._handlers[ method.__name__ ] = event.EventHandler(method) def _findHandler(self, name): """ Look for a EventHandlers that matches 'name' in our list of EventHandlers. """ handler = self._handlers.get(name, None) if handler is None: # Change the handler name to target this Scriptable object # and look in our list of EventHandlers. words = name.split('_') s = words[ 0 ] + '_' + self.getName() + '_' + words[ len(words) - 1 ] h = self._handlers.get(s, None) if h is not None: return (h) else: # search for Background and Stack handlers like # on_mouseClick, on_initialize s = words[ 0 ] + '_' + words[ len(words) - 1 ] return self._handlers.get(s, None) return handler def execute(self, name, event): """ RDS - 2004-05-02 Find the handler that matches handlerName and execute it. Should we throw an exception if the handler name is not found? The caller would be responsible for reporting a missing handler as an error. """ handler = self._findHandler(name) if handler is not None: handler.execute(event) event.EventLog.getInstance().log(event, handler.getSourceName(), True) else: self._parent.execute(name, event) class AttributeSpec: def __init__(self, name, properties): self.name = name self.presence = properties['presence'] self.default = None if self.presence is 'optional': self.default = properties['default'] if 'values' in properties: self.values = properties['values'] else: self.values = None # PUBLIC METHODS def getName(self): return self.name def isRequired(self): return self.presence is 'mandatory' def isOptional(self): return self.presence is 'optional' def getDefaultValue(self): return self.default def hasDefaultValueList(self): return self.values is not None def getDefaultValueList(self): return self.values class BaseSpec: def __init__(self, aDictionary): self._name = aDictionary[ 'name' ] self._parent = None self._events = aDictionary[ 'info' ][ 'events' ] self._attributes = self._parseAttributes(aDictionary[ 'info' ][ 'attributes' ]) self._requiredAttributes = self._parseRequiredAttributes() self._optionalAttributes = self._parseOptionalAttributes() def getName(self): return self._name def getParent(self): return self._parent def getEvents(self): return self._events # KEA 2002-07-01 def getEventNames(self): eventNames = [ e.name for e in self._events ] eventNames.sort() return eventNames def getAttributes(self): return self._attributes def getRequiredAttributes(self): return self._requiredAttributes def getOptionalAttributes(self): return self._optionalAttributes def _parseAttributes(self, aDictionary): attributes = {} for key in aDictionary: value = aDictionary[key] attribute = AttributeSpec(key, value) attributes[attribute.getName()] = attribute return attributes def _parseRequiredAttributes(self): required = {} for key in self._attributes: attribute = self._attributes[key] if attribute.isRequired(): required[key] = attribute return required def _parseOptionalAttributes(self): optional = {} for key in self._attributes: attribute = self._attributes[key] if attribute.isOptional(): optional[key] = attribute return optional def __repr__(self): return str(self.__dict__) class ComponentSpec(BaseSpec): def __init__(self, name, parent, events, subclassAttributes): # RDS - we should be calling BaseSpec.__init__(). # this is pretty messy. self._name = name self._parent = parent self._events = events attributes = { 'name': { 'presence': 'mandatory' }, 'command': { 'presence': 'optional', 'default': None }, 'actionBindings' : {'presence':'optional', 'default':None} } attributes.update(subclassAttributes) self._attributes = self._parseAttributes(attributes) self._requiredAttributes = self._parseRequiredAttributes() self._optionalAttributes = self._parseOptionalAttributes() def getMinimalResourceDict(self, name): """ Class method that returns the minimal resource dictionary needed to create a component. The spec will provide the optional attributes when the Resource is created. """ return {'type':self.getName(), 'name':name} class Component(event.EventSource): """ The superclass of all PythonCard components. Components can be visual (extend Widget) or non-visual (extend Component). """ _spec = ComponentSpec def getEvents(self): """ A convenience method to get the event classes for this component. """ return ComponentClassInspector(self.__class__).getEvents() def __init__(self, aResource): event.EventSource.__init__(self) self._name = aResource.name self._setCommand(aResource.command) if getattr(aResource, 'actionBindings', None): self._setActionBindings(dict(aResource.actionBindings.__dict__)) else: self._setActionBindings(dict()) def Lower(self): pass def _getName(self): return self._name def _setName(self, aString): raise AttributeError, "name attribute is read-only" def _setCommand( self, aString ) : self._command = aString def _getCommand( self ) : return self._command def _getActionBindings(self): return self._actionBindings def _setActionBindings(self, actionDict): self._actionBindings = actionDict name = property(_getName, _setName) command = property(_getCommand, _setCommand) actionBindings = property(_getActionBindings, _setActionBindings) def registerAsComponent(pythonClass, attributes={}): pythonClass._spec = ComponentSpec(pythonClass.__name__, 'Component', list(), attributes) import sys from PythonCard import registry registry.Registry.getInstance().register(pythonClass) class ComponentInspector: """ Provides an api for introspection on Component instances. """ def __init__(self, component): self.componentClass = component.__class__ def getAttributes(self): return self.componentClass._spec.getAttributes() def getEvents(self): return self.componentClass._spec.getEvents() class ComponentClassInspector: """ Provides an api for introspection on Component classes. """ def __init__(self, componentClass): self.componentClass = componentClass def getAttributes(self): return self.componentClass._spec.getAttributes() def getEvents(self): return self.componentClass._spec.getEvents() class ComponentFactory: """ An abstract factory for creating Widgets from a Resource description. """ def createComponent(self, aScriptable, aParent, aResource): """ Find the class object based on a component's Resource definition. """ # KEA 2001-08-05 is there a better way of coming up with # the module name for model as the package name changes? reggie = registry.Registry.getInstance() clazz = reggie.getComponentClass(aResource.__dict__['type']) # Construct a new Component. component = clazz(aParent, aResource) # KEA 2004-04-20 # this is for Widget to do #component.initialize() # Bind the Component to an EventDispatch that will translate # events generated by Component into calls to handlers that # are defined in a Scriptable object. ## event.EventDispatch(component, aScriptable) # Return the newly created Component return component PythonCard-0.8.2/components/0000755000076500007650000000000010434046770015704 5ustar alexalex00000000000000PythonCard-0.8.2/components/__init__.py0000644000076500007650000000022507405515377020024 0ustar alexalex00000000000000""" Created: 2001/08/05 Purpose: Turn components into a sub-package __version__ = "$Revision: 1.1 $" __date__ = "$Date: 2001/12/11 23:47:11 $" """ PythonCard-0.8.2/components/bitmapcanvas.py0000644000076500007650000004434310353522113020724 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.47 $" __date__ = "$Date: 2005/12/25 13:53:15 $" """ import wx from PythonCard import event, font, graphic, widget try: import Image # necessary to avoid name collision with Image class from Image import fromstring PIL_FOUND = True except ImportError: PIL_FOUND = False try: from Numeric import ArrayType NUMERIC_FOUND = True except ImportError: NUMERIC_FOUND = False class BitmapCanvasSpec(widget.WidgetSpec): def __init__(self): attributes = { 'size' : { 'presence' : 'optional', 'default' : [ 50, 50 ] }, } widget.WidgetSpec.__init__( self, 'BitmapCanvas', 'Widget', [], attributes ) # are NOR and NAND descriptions reversed?! # double-check wxWidgets docs and/or wxPython source again LogicalCopyModes = { "AND" : wx.AND, # src AND dst "AND_INVERT" : wx.AND_INVERT, # (NOT src) AND dst "AND_REVERSE" : wx.AND_REVERSE, # src AND (NOT dst) "CLEAR" : wx.CLEAR, # 0 "COPY" : wx.COPY, # src "EQUIV" : wx.EQUIV, # (NOT src) XOR dst "INVERT" : wx.INVERT, # NOT dst "NAND" : wx.NAND, # (NOT src) OR (NOT dst) "NOR" : wx.NOR, # (NOT src) AND (NOT dst) "NO_OP" : wx.NO_OP, # dst "OR" : wx.OR, # src OR dst "OR_INVERT" : wx.OR_INVERT, # (NOT src) OR dst "OR_REVERSE" : wx.OR_REVERSE, # src OR (NOT dst) "SET" : wx.SET, # 1 "SRC_INVERT" : wx.SRC_INVERT, # NOT src "XOR" : wx.XOR, # src XOR dst } BrushFillStyleList = { "TRANSPARENT" : wx.TRANSPARENT, "SOLID" : wx.SOLID, "BDIAGONAL_HATCH": wx.BDIAGONAL_HATCH, "CROSSDIAG_HATCH" : wx.CROSSDIAG_HATCH, "FDIAGONAL_HATCH": wx.FDIAGONAL_HATCH, "CROSS_HATCH" : wx.CROSS_HATCH, "HORIZONTAL_HATCH": wx.HORIZONTAL_HATCH, "VERTICAL_HATCH" : wx.VERTICAL_HATCH } class BitmapCanvas(widget.Widget, wx.Window): """ A double-bufferd bitmap drawing area. """ _spec = BitmapCanvasSpec() def __init__( self, aParent, aResource ) : self._thickness = 1 self.autoRefresh = True self._drawingInProgress = False self._bufImage = None wx.Window.__init__( self, aParent, widget.makeNewId(aResource.id), aResource.position, aResource.size, style = wx.NO_FULL_REPAINT_ON_RESIZE | wx.CLIP_SIBLINGS, name = aResource.name ) self._size = self.GetClientSize() # create offscreen buffer where drawing occurs bitmap = wx.EmptyBitmap(self._size[0], self._size[1]) self._bufImage = wx.MemoryDC() self._bufImage.SelectObject(bitmap) del bitmap widget.Widget.__init__(self, aParent, aResource) wx.EVT_PAINT(self, self._onPaint) wx.EVT_SIZE(self, self._onSize) wx.EVT_WINDOW_DESTROY(self, self._onDestroy) self.backgroundColor = (255, 255, 255) # 'white' self.clear() self._setForegroundColor((0,0,0)) # 'black' # these are the defaults for a new MemoryDC self._fillColor = 'WHITE' self._fillMode = 'SOLID' self._logicalCopyMode = 'COPY' self._bindEvents(event.WIDGET_EVENTS) def _onDestroy(self, event): # memory leak cleanup self._bufImage = None self._penColor = None self._pen = None event.Skip() def _getLogicalCopyMode(self): return self._logicalCopyMode def _setLogicalCopyMode(self, logicalCopyMode): self._bufImage.SetLogicalFunction(LogicalCopyModes[logicalCopyMode.upper()]) def _getBackgroundColor(self): if self._bufImage is not None: brush = self._bufImage.GetBackground() return brush.GetColour() def _setBackgroundColor(self, aColor): aColor = self._getDefaultColor(aColor) if self._bufImage is not None: brush = self._bufImage.GetBackground() brush.SetColour(aColor) self._bufImage.SetBackground(brush) def _getFillColor(self): return self._fillColor def _setFillColor(self, aColor): aColor = self._getDefaultColor(aColor) if self._bufImage is not None: # KEA 2004-03-01 # updated to work with wxPython 2.4.x # and wxPython 2.5.x # need to double-check other places copies of pen and brush # are manipulated in the rest of the framework and samples!!! nb = wx.Brush(aColor) ob = self._bufImage.GetBrush() if ob.Ok(): nb.SetStyle(ob.GetStyle()) s = ob.GetStipple() if s.Ok(): nb.SetStipple(s) self._bufImage.SetBrush(nb) def _getFillMode(self): return self._fillMode def _setFillMode(self, fillStyle): brush = self._bufImage.GetBrush() brush.SetStyle(BrushFillStyleList[fillStyle.upper()]) self._bufImage.SetBrush(brush) def _getForegroundColor(self): return self._penColor def _setForegroundColor(self, aColor): aColor = self._getDefaultColor( aColor ) self._penColor = aColor self._pen = wx.Pen(self._penColor, self._thickness, wx.SOLID) #self._pen.SetCap(wx.CAP_PROJECTING) if self._bufImage is not None: self._bufImage.SetPen(self._pen) self._bufImage.SetTextForeground(self._penColor) def _getThickness(self): return self._thickness def _setThickness(self, thickness): self._thickness = thickness self._pen = wx.Pen(self._penColor, self._thickness, wx.SOLID) if self._bufImage is not None: self._bufImage.SetPen(self._pen) def _getFont(self): if self._font is None: desc = font.fontDescription(self.GetFont()) self._font = font.Font(desc) return self._font def _setFont(self, aFont): if isinstance(aFont, dict): aFont = font.Font(aFont, aParent=self) else: # Bind the font to this widget. aFont._parent = self self._font = aFont aWxFont = aFont._getFont() self._bufImage.SetFont(aWxFont) # when we Blit to the "window", we're actually blitting to the # offscreen bitmap and then that is blitted onscreen in the same # operation def blit(self, destXY, widthHeight, source, srcXY, logicalFunc=wx.COPY, useMask=False): #, xsrcMask=-1, ysrcMask=-1): self._bufImage.BlitPointSize(destXY, widthHeight, source, srcXY, logicalFunc, useMask) #, xsrcMask, ysrcMask) if self.autoRefresh: dc = wx.ClientDC(self) dc.BlitPointSize((0, 0), (self._size[0], self._size[1]), self._bufImage, (0, 0)) def clear(self): self._bufImage.Clear() if self.autoRefresh: dc = wx.ClientDC(self) dc.BlitPointSize((0, 0), (self._size[0], self._size[1]), self._bufImage, (0, 0)) # this is poorly named, it should be DrawAxis def crossHair(self, xy): self._bufImage.CrossHairPoint(xy) if self.autoRefresh: dc = wx.ClientDC(self) dc.BlitPointSize((0, 0), (self._size[0], self._size[1]), self._bufImage, (0, 0)) def drawArc(self, x1y1, x2y2, xcyc): """ Draws an arc of a circle, centered on (xc, yc), with starting point (x1, y1) and ending at (x2, y2). The current pen is used for the outline and the current brush for filling the shape. The arc is drawn in an anticlockwise direction from the start point to the end point. """ self._bufImage.DrawArcPoint(x1y1, x2y2, xcyc) if self.autoRefresh: dc = wx.ClientDC(self) dc.BlitPointSize((0, 0), (self._size[0], self._size[1]), self._bufImage, (0, 0)) # doesn't exist in wxMemoryDC #def DrawCheckMark(self, xy, widthHeight): # self._bufImage.DrawCheckMark(xy, widthHeight) # if self.autoRefresh: self.refresh() def drawBitmap(self, aBitmap, xy=(0, 0), transparency=1): if isinstance(aBitmap, graphic.Bitmap): bmp = aBitmap.getBits() elif isinstance(aBitmap, wx.Bitmap): bmp = aBitmap elif isinstance(aBitmap, wx.Image): bmp = wx.BitmapFromImage(aBitmap) elif PIL_FOUND and isinstance(aBitmap, Image.Image): bmp = wx.BitmapFromImage(graphic.PILToImage(aBitmap)) elif NUMERIC_FOUND and isinstance(aBitmap, ArrayType): bmp = wx.BitmapFromImage(graphic.numericArrayToImage(aBitmap)) else: return self._bufImage.DrawBitmapPoint(bmp, xy, transparency) if self.autoRefresh: dc = wx.ClientDC(self) dc.BlitPointSize((0, 0), (self._size[0], self._size[1]), self._bufImage, (0, 0)) def drawBitmapScaled(self, aBitmap, xy, size, transparency=1): if isinstance(aBitmap, graphic.Bitmap): img = wx.ImageFromBitmap(aBitmap.getBits()) elif isinstance(aBitmap, wx.Bitmap): img = wx.ImageFromBitmap(aBitmap) elif isinstance(aBitmap, wx.Image): img = aBitmap elif PIL_FOUND and isinstance(aBitmap, Image.Image): img = graphic.PILToImage(aBitmap) elif NUMERIC_FOUND and isinstance(aBitmap, ArrayType): img = graphic.numericArrayToImage(aBitmap) else: return bmp = wx.BitmapFromImage(img.Scale(size[0], size[1])) self._bufImage.DrawBitmapPoint(bmp, xy, transparency) if self.autoRefresh: dc = wx.ClientDC(self) dc.BlitPointSize((0, 0), (self._size[0], self._size[1]), self._bufImage, (0, 0)) def drawCircle(self, xy, radius): self._bufImage.DrawCirclePoint(xy, radius) if self.autoRefresh: dc = wx.ClientDC(self) dc.BlitPointSize((0, 0), (self._size[0], self._size[1]), self._bufImage, (0, 0)) def drawEllipse(self, xy, widthHeight): self._bufImage.DrawEllipsePointSize(xy, widthHeight) if self.autoRefresh: dc = wx.ClientDC(self) dc.BlitPointSize((0, 0), (self._size[0], self._size[1]), self._bufImage, (0, 0)) def drawEllipticArc(self, xy, widthHeight, startEnd): self._bufImage.DrawEllipticArcPointSize(xy, widthHeight, startEnd) if self.autoRefresh: dc = wx.ClientDC(self) dc.BlitPointSize((0, 0), (self._size[0], self._size[1]), self._bufImage, (0, 0)) def drawIcon(self, aIcon, xy): self._bufImage.DrawIconPoint(aIcon, xy) if self.autoRefresh: dc = wx.ClientDC(self) dc.BlitPointSize((0, 0), (self._size[0], self._size[1]), self._bufImage, (0, 0)) def drawLine(self, startXY, endXY): self._bufImage.DrawLinePoint(startXY, endXY) if self.autoRefresh: dc = wx.ClientDC(self) dc.BlitPointSize((0, 0), (self._size[0], self._size[1]), self._bufImage, (0, 0)) def drawLines(self, pointsList): self._bufImage.DrawLines(pointsList) if self.autoRefresh: dc = wx.ClientDC(self) dc.BlitPointSize((0, 0), (self._size[0], self._size[1]), self._bufImage, (0, 0)) def drawPoint(self, xy): self._bufImage.DrawPointPoint(xy) if self.autoRefresh: dc = wx.ClientDC(self) dc.BlitPointSize((0, 0), (self._size[0], self._size[1]), self._bufImage, (0, 0)) def drawPolygon(self, pointsList): self._bufImage.DrawPolygon(pointsList) if self.autoRefresh: dc = wx.ClientDC(self) dc.BlitPointSize((0, 0), (self._size[0], self._size[1]), self._bufImage, (0, 0)) def drawRectangle(self, xy, widthHeight): self._bufImage.DrawRectanglePointSize(xy, widthHeight) if self.autoRefresh: dc = wx.ClientDC(self) dc.BlitPointSize((0, 0), (self._size[0], self._size[1]), self._bufImage, (0, 0)) def drawPointList(self, points, pens=None): self._bufImage.DrawPointList(points, pens) if self.autoRefresh: dc = wx.ClientDC(self) dc.BlitPointSize((0, 0), (self._size[0], self._size[1]), self._bufImage, (0, 0)) # KEA 2003-03-14 # need to add other DrawXXXList methods once we are # requiring wxPython 2.4.0.6 or higher def drawRectangleList(self, rects, pens=None, brushes=None): self._bufImage.DrawRectangleList(rects, pens, brushes) if self.autoRefresh: dc = wx.ClientDC(self) dc.BlitPointSize((0, 0), (self._size[0], self._size[1]), self._bufImage, (0, 0)) def drawRotatedText(self, aString, xy, angle): self._bufImage.DrawRotatedTextPoint(aString, xy, angle) if self.autoRefresh: dc = wx.ClientDC(self) dc.BlitPointSize((0, 0), (self._size[0], self._size[1]), self._bufImage, (0, 0)) def drawRoundedRectangle(self, xy, widthHeight, radius): self._bufImage.DrawRoundedRectanglePointSize(xy, widthHeight, radius) if self.autoRefresh: dc = wx.ClientDC(self) dc.BlitPointSize((0, 0), (self._size[0], self._size[1]), self._bufImage, (0, 0)) def drawSpline(self, pointsList): self._bufImage.DrawSpline(pointsList) if self.autoRefresh: dc = wx.ClientDC(self) dc.BlitPointSize((0, 0), (self._size[0], self._size[1]), self._bufImage, (0, 0)) def drawLineList(self, lines, pens=None): self._bufImage.DrawLineList(lines, pens) if self.autoRefresh: dc = wx.ClientDC(self) dc.BlitPointSize((0, 0), (self._size[0], self._size[1]), self._bufImage, (0, 0)) def drawText(self, aString, xy): self._bufImage.DrawTextPoint(aString, xy) if self.autoRefresh: dc = wx.ClientDC(self) dc.BlitPointSize((0, 0), (self._size[0], self._size[1]), self._bufImage, (0, 0)) # KEA 2002-03-31 this doesn't seem to work def floodFill(self, xy, colour, style=wx.FLOOD_SURFACE): self._bufImage.FloodFillPoint(xy, colour, style) if self.autoRefresh: dc = wx.ClientDC(self) dc.BlitPointSize((0, 0), (self._size[0], self._size[1]), self._bufImage, (0, 0)) def getPixel(self, xy): return self._bufImage.GetPixelPoint(xy) def getTextExtent(self, aString): return self._bufImage.GetTextExtent(aString) def getFullTextExtent(self, aString): return self._bufImage.GetFullTextExtent(aString) def refresh(self, enableAutoRefresh=False): if enableAutoRefresh: self.autoRefresh = True dc = wx.ClientDC(self) dc.BlitPointSize((0, 0), (self._size[0], self._size[1]), self._bufImage, (0, 0)) # KEA 2005-03-26 # this is necessary to force a screen update on the Mac if wx.Platform == '__WXMAC__': #self.canvas.Refresh() self.Update() def _onPaint(self, evt): #starttime = time.time() rect = self.GetUpdateRegion().GetBox() #print "OnPaint", rect dc = wx.PaintDC(self) #dc.BlitPointSize((0, 0), (self._size[0], self._size[1]), self._bufImage, (0, 0)) dc.BlitPointSize((rect[0], rect[1]), (rect[2], rect[3]), self._bufImage, (rect[0], rect[1])) #stoptime = time.time() #elapsed = stoptime - starttime #print "OnPaint time: %f seconds" % (elapsed) def resizeBuffer(self, size): brush = self._bufImage.GetBackground() bitmap = wx.EmptyBitmap(size[0], size[1]) _bufImage = wx.MemoryDC() _bufImage.SelectObject(bitmap) del bitmap _bufImage.SetBackground(brush) _bufImage.SetPen(self._pen) aWxFont = self._getFont()._getFont() _bufImage.SetFont(aWxFont) _bufImage.SetTextForeground(self._penColor) _bufImage.Clear() _bufImage.BlitPointSize((0, 0), (self._size[0], self._size[1]), self._bufImage, (0, 0)) self._size = size #self._bufImage.SelectObject(wx.NullBitmap) self._bufImage = _bufImage # need to copy the old bitmap # before resizing # plus the various pen attributes # there is probably a memory leak in the code below def _onSize(self, evt): size = self.GetClientSizeTuple() #print "OnSize", size, self._size if size == (0, 0) or not self._pen.GetColour().Ok(): evt.Skip() return try: # in case self._bufImage hasn't been initialized brush = self._bufImage.GetBackground() except: evt.Skip() return # KEA 2002-03-30 # only resize the offscreen bitmap when the onscreen window gets # larger than the offscreen bitmap #minX = min(size[0], self._size[0]) #minY = min(size[1], self._size[1]) maxX = max(size[0], self._size[0]) maxY = max(size[1], self._size[1]) #print minX, minY, maxX, maxY if (self._size[0] < maxX) or (self._size[1] < maxY): self.resizeBuffer((maxX, maxY)) evt.Skip() def getBitmap(self, xy=(0, 0), widthHeight=(-1, -1)): w, h = self.GetClientSizeTuple() if widthHeight[0] != -1: w = widthHeight[0] if widthHeight[1] != -1: h = widthHeight[1] memory = wx.MemoryDC() bitmap = wx.EmptyBitmap(w, h) memory.SelectObject(bitmap) memory.BlitPointSize((0, 0), (w, h), self._bufImage, xy) memory.SelectObject(wx.NullBitmap) return bitmap backgroundColor = property(_getBackgroundColor, _setBackgroundColor) fillColor = property(_getFillColor, _setFillColor) fillMode = property(_getFillMode, _setFillMode) font = property(_getFont, _setFont) foregroundColor = property(_getForegroundColor, _setForegroundColor) logicalCopyMode = property(_getLogicalCopyMode, _setLogicalCopyMode) thickness = property(_getThickness, _setThickness) import sys from PythonCard import registry registry.Registry.getInstance().register(sys.modules[__name__].BitmapCanvas) PythonCard-0.8.2/components/button.py0000644000076500007650000000712010050560030017551 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.31 $" __date__ = "$Date: 2004/05/13 02:40:24 $" """ import wx from PythonCard import event, widget class ButtonMouseClickEvent(event.MouseClickEvent): binding = wx.EVT_BUTTON id = wx.wxEVT_COMMAND_BUTTON_CLICKED ButtonEvents = (ButtonMouseClickEvent,) #ButtonEvents = [ButtonMouseClickEvent] class ButtonSpec(widget.WidgetSpec): def __init__(self): # KEA 2004-04-26 # test to use new event classes events = list(ButtonEvents) #events = ButtonEvents ## events = [event.MouseClickEvent] attributes = { 'label' : { 'presence' : 'optional', 'default':'Button' }, # KEA don't need style for Button unless we are going to support # Win32-specific attributes #'style':{'presence':'optional', 'default':'3d', 'values':['3d', 'none']}, 'default':{'presence':'optional', 'default':0} } widget.WidgetSpec.__init__(self, 'Button', 'Widget', events, attributes ) # KEA 2004-05-12 # this is here just so I have an example of a subclass # using getMinimalResourceDict def getMinimalResourceDict(self, name): d = widget.WidgetSpec.getMinimalResourceDict(self, name) d['label'] = d['name'] return d class Button(widget.Widget, wx.Button): """ A simple push-button with a label. """ _spec = ButtonSpec() def __init__(self, aParent, aResource): wx.Button.__init__(self, aParent, widget.makeNewId(aResource.id), aResource.label, aResource.position, aResource.size, style = wx.NO_FULL_REPAINT_ON_RESIZE | wx.CLIP_SIBLINGS, name = aResource.name ) widget.Widget.__init__(self, aParent, aResource) self._setDefault(self._resource.default) self._bindEvents(event.WIDGET_EVENTS + ButtonEvents) def _getDefault(self): #return self == self._parent.GetDefaultItem() # KEA 2002-03-26 # for some reason wxDialog doesn't have a # GetDefaultItem and SetDefaultItem try: return (self == self._parent.GetDefaultItem()) and self._default except: return self._default def _setDefault(self, aBoolean): self._default = aBoolean if aBoolean: self.SetDefault() else: # KEA 2002-03-26 # for some reason wxDialog doesn't have a # GetDefaultItem and SetDefaultItem try: if self == self._parent.GetDefaultItem(): self._parent.SetDefaultItem(None) except: pass default = property(_getDefault, _setDefault) label = property(wx.Button.GetLabel, wx.Button.SetLabel) # KEA 2001-12-09 # the registry could contain a dictionary of the class, its EventBinding, spec, etc. # some of those references could be class attributes instead # it seems like the spec for the class should be part of the class itself # RDS 2001-16-01 # A new module, registry, contains the Registry class. A Component's # class now contains it's spec, which contains meta data for it's events # and attributes. Components register with the ComponentRegistry. import sys from PythonCard import registry registry.Registry.getInstance().register(sys.modules[__name__].Button) if __name__ == "__main__": import pprint b = ButtonSpec() pprint.pprint(b.name) pprint.pprint(b.parent) pprint.pprint(b.events) pprint.pprint(b._attributes) PythonCard-0.8.2/components/calendar.py0000644000076500007650000000752010120516140020014 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.20 $" __date__ = "$Date: 2004/09/11 06:34:08 $" """ import datetime import wx from wx import calendar from PythonCard import event, widget class CalendarEvent(event.Event): def decorate(self, aWxEvent, source): aWxEvent = event.Event.decorate(self, aWxEvent, source) if wx.VERSION >= (2,5,2,9): aWxEvent.date = aWxEvent.PyGetDate() else: aWxEvent.date = aWxEvent.GetDate() return aWxEvent class CalendarMouseDoubleClickEvent(CalendarEvent): name = 'calendarMouseDoubleClick' binding = calendar.EVT_CALENDAR id = calendar.wxEVT_CALENDAR_DOUBLECLICKED class CalendarChangedEvent(CalendarEvent): name = 'calendarChanged' binding = calendar.EVT_CALENDAR_SEL_CHANGED id = calendar.wxEVT_CALENDAR_SEL_CHANGED class CalendarDayEvent(CalendarEvent): name = 'calendarDay' binding = calendar.EVT_CALENDAR_DAY id = calendar.wxEVT_CALENDAR_DAY_CHANGED class CalendarMonthEvent(CalendarEvent): name = 'calendarMonth' binding = calendar.EVT_CALENDAR_MONTH id = calendar.wxEVT_CALENDAR_MONTH_CHANGED class CalendarYearEvent(CalendarEvent): name = 'calendarYear' binding = calendar.EVT_CALENDAR_YEAR id = calendar.wxEVT_CALENDAR_YEAR_CHANGED class CalendarWeekDayHeaderEvent(event.Event): name = 'calendarWeekDayHeader' binding = calendar.EVT_CALENDAR_WEEKDAY_CLICKED id = calendar.wxEVT_CALENDAR_WEEKDAY_CLICKED CalendarEvents = (CalendarMouseDoubleClickEvent, CalendarChangedEvent, CalendarDayEvent, CalendarMonthEvent, CalendarYearEvent, CalendarWeekDayHeaderEvent) class CalendarSpec(widget.WidgetSpec): def __init__(self): ## events = [event.CalendarMouseDoubleClickEvent, ## event.CalendarChangedEvent, ## event.CalendarDayEvent, ## event.CalendarMonthEvent, ## event.CalendarYearEvent, ## event.CalendarWeekDayHeaderEvent] events = list(CalendarEvents) widget.WidgetSpec.__init__(self, 'Calendar', 'Widget', events, {} ) class Calendar(widget.Widget, calendar.CalendarCtrl): _spec = CalendarSpec() def __init__(self, aParent, aResource): # previously _createDelegate would be called by Widget.__init__ # so put CalendarCtrl.__init__ here calendar.CalendarCtrl.__init__(self, aParent, widget.makeNewId( aResource.id ), wx.DateTime_Now(), aResource.position, aResource.size, style = wx.CLIP_SIBLINGS | wx.NO_FULL_REPAINT_ON_RESIZE | calendar.CAL_SHOW_HOLIDAYS | calendar.CAL_SHOW_SURROUNDING_WEEKS | calendar.CAL_SEQUENTIAL_MONTH_SELECTION, name = aResource.name ) widget.Widget.__init__(self, aParent, aResource) # workaround for calendar init and GetPosition/SetPosition self.SetPosition((aResource.position[0], aResource.position[1])) self._bindEvents(event.WIDGET_EVENTS + CalendarEvents) if wx.VERSION >= (2,5,2,9): def SetNow(self): self.PySetDate(datetime.date.today()) date = property(calendar.CalendarCtrl.PyGetDate, calendar.CalendarCtrl.PySetDate) else: # KEA 2002-07-09 # use same name as wxPython calendar module def SetNow(self): self.SetDate(wx.DateTime_Now()) import sys from PythonCard import registry registry.Registry.getInstance().register(sys.modules[__name__].Calendar) PythonCard-0.8.2/components/checkbox.py0000644000076500007650000000312610050560030020026 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.19 $" __date__ = "$Date: 2004/05/13 02:40:24 $" """ import wx from PythonCard import event, widget class CheckBoxMouseClickEvent(event.MouseClickEvent): binding = wx.EVT_CHECKBOX id = wx.wxEVT_COMMAND_CHECKBOX_CLICKED CheckBoxEvents = (CheckBoxMouseClickEvent,) class CheckBoxSpec(widget.WidgetSpec): def __init__(self): ## events = [event.MouseClickEvent ] events = list(CheckBoxEvents) attributes = { 'label' : { 'presence' : 'optional', 'default':'CheckBox' }, 'checked' : { 'presence' : 'optional', 'default' : 0 } } widget.WidgetSpec.__init__(self, 'CheckBox', 'Widget', events, attributes ) class CheckBox(widget.Widget, wx.CheckBox): """ A check box. """ _spec = CheckBoxSpec() def __init__( self, aParent, aResource ) : wx.CheckBox.__init__( self, aParent, widget.makeNewId(aResource.id), aResource.label, aResource.position, aResource.size, style = wx.CLIP_SIBLINGS | wx.NO_FULL_REPAINT_ON_RESIZE, name = aResource.name ) widget.Widget.__init__( self, aParent, aResource) if aResource.checked: self.SetValue(True) self._bindEvents(event.WIDGET_EVENTS + CheckBoxEvents) checked = property(wx.CheckBox.GetValue, wx.CheckBox.SetValue) label = property(wx.CheckBox.GetLabel, wx.CheckBox.SetLabel) import sys from PythonCard import registry registry.Registry.getInstance().register(sys.modules[__name__].CheckBox) PythonCard-0.8.2/components/choice.py0000644000076500007650000000402110077546540017510 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.20 $" __date__ = "$Date: 2004/07/21 20:09:04 $" """ import wx from PythonCard import event, widget from list import ContainerMixin class ChoiceSelectEvent(event.SelectEvent): binding = wx.EVT_CHOICE id = wx.wxEVT_COMMAND_CHOICE_SELECTED ChoiceEvents = (ChoiceSelectEvent,) class ChoiceSpec(widget.WidgetSpec): def __init__(self): events = list(ChoiceEvents) ## events = [ event.SelectEvent ] attributes = { 'items' : { 'presence' : 'optional', 'default' : [] }, 'stringSelection' : { 'presence' : 'optional', 'default' : None } } widget.WidgetSpec.__init__(self, 'Choice', 'Widget', events, attributes ) class Choice(widget.Widget, wx.Choice, ContainerMixin): """ A popup menu. """ _spec = ChoiceSpec() def __init__( self, aParent, aResource ) : wx.Choice.__init__( self, aParent, widget.makeNewId(aResource.id), aResource.position, aResource.size, aResource.items, style = wx.CLIP_SIBLINGS | wx.NO_FULL_REPAINT_ON_RESIZE, name = aResource.name ) widget.Widget.__init__( self, aParent, aResource ) if aResource.stringSelection: self._setStringSelection(aResource.stringSelection) self._bindEvents(event.WIDGET_EVENTS + ChoiceEvents) def _getItems(self): if self.IsEmpty(): return [] else: items = [] for i in range(self.GetCount()): items.append(self.GetString(i)) return items def _setItems(self, items): self.Clear() self.AppendItems(items) def append(self, aString): self.Append(aString) def appendItems(self, aList): self.AppendItems(aList) items = property(_getItems, _setItems) import sys from PythonCard import registry registry.Registry.getInstance().register(sys.modules[__name__].Choice) PythonCard-0.8.2/components/codeeditor.py0000644000076500007650000003416610054721274020406 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.37 $" __date__ = "$Date: 2004/05/25 19:47:08 $" wxStyledTextCtrl documentation http://wiki.wxpython.org/index.cgi/wxStyledTextCtrl """ import wx from wx import stc import os import keyword from PythonCard import configuration, event, STCStyleEditor, widget LINE_NUMBER_MARGIN = 1 LINE_NUMBER_MARGIN_WIDTH = 40 CODE_FOLDING_MARGIN = 2 CODE_FOLDING_MARGIN_WIDTH = 12 class CodeEditorSpec(widget.WidgetSpec): def __init__(self): events = [event.KeyPressEvent, event.KeyDownEvent, event.KeyUpEvent, #event.TextEnterEvent, #event.TextUpdateEvent, #event.CloseFieldEvent ] attributes = { 'size' : { 'presence' : 'optional', 'default' : [ 50, 50 ] }, 'text' : { 'presence' : 'optional', 'default' : '' }, 'editable' : { 'presence' : 'optional', 'default' : 1 }, #'border' : { 'presence' : 'optional', 'default' : '3d', 'values' : [ '3d', 'none' ] } } widget.WidgetSpec.__init__(self, 'CodeEditor', 'Widget', events, attributes ) # POB 2002-05-04 # Borrowed stuff from PyCrust just to get this working. if wx.Platform == '__WXMSW__': faces = { 'times' : 'Times New Roman', 'mono' : 'Courier New', 'helv' : 'Lucida Console', 'lucida' : 'Lucida Console', 'other' : 'Comic Sans MS', 'size' : 10, 'lnsize' : 9, 'backcol': '#FFFFFF', } else: # GTK faces = { 'times' : 'Times', 'mono' : 'Courier', 'helv' : 'Helvetica', 'other' : 'new century schoolbook', 'size' : 12, 'lnsize' : 10, 'backcol': '#FFFFFF', } class CodeEditor(widget.Widget, stc.StyledTextCtrl): """ A Python source code editor. """ _spec = CodeEditorSpec() def __init__( self, aParent, aResource ) : stc.StyledTextCtrl.__init__( self, aParent, widget.makeNewId(aResource.id), #aResource.text, aResource.position, aResource.size, #style = wxTE_PROCESS_ENTER | borderStyle | wxCLIP_SIBLINGS, #style = borderStyle | wx.CLIP_SIBLINGS, style = wx.NO_FULL_REPAINT_ON_RESIZE | wx.CLIP_SIBLINGS, name = aResource.name ) widget.Widget.__init__( self, aParent, aResource ) # POB 2002-05-04 # Borrowed stuff from PyCrust just to get this working. self.SetMarginType(LINE_NUMBER_MARGIN, stc.STC_MARGIN_NUMBER) self.SetMarginWidth(LINE_NUMBER_MARGIN, LINE_NUMBER_MARGIN_WIDTH) self.SetLexer(stc.STC_LEX_PYTHON) self.SetKeyWords(0, ' '.join(keyword.kwlist)) self._setStyles(faces) self.SetViewWhiteSpace(0) self.SetTabWidth(4) self.SetUseTabs(0) self.CallTipSetBackground(wx.Colour(255, 255, 232)) self.SetBackSpaceUnIndents(1) stc.EVT_STC_UPDATEUI(self, self.GetId(), self.OnUpdateUI) # KEA 2002-12-16 # code folding code taken from # wxStyledTextCtrl_2.py self.SetProperty("fold", "1") # Setup a margin to hold fold markers self.SetFoldFlags(16) ### WHAT IS THIS VALUE? WHAT ARE THE OTHER FLAGS? DOES IT MATTER? self.SetMarginType(CODE_FOLDING_MARGIN, stc.STC_MARGIN_SYMBOL) self.SetMarginMask(CODE_FOLDING_MARGIN, stc.STC_MASK_FOLDERS) self.SetMarginSensitive(CODE_FOLDING_MARGIN, 1) self.SetMarginWidth(CODE_FOLDING_MARGIN, CODE_FOLDING_MARGIN_WIDTH) # initially code folding should be off self.SetMarginWidth(CODE_FOLDING_MARGIN, 0) self.MarkerDefine(stc.STC_MARKNUM_FOLDEREND, stc.STC_MARK_BOXPLUSCONNECTED, "white", "black") self.MarkerDefine(stc.STC_MARKNUM_FOLDEROPENMID, stc.STC_MARK_BOXMINUSCONNECTED, "white", "black") self.MarkerDefine(stc.STC_MARKNUM_FOLDERMIDTAIL, stc.STC_MARK_TCORNER, "white", "black") self.MarkerDefine(stc.STC_MARKNUM_FOLDERTAIL, stc.STC_MARK_LCORNER, "white", "black") self.MarkerDefine(stc.STC_MARKNUM_FOLDERSUB, stc.STC_MARK_VLINE, "white", "black") self.MarkerDefine(stc.STC_MARKNUM_FOLDER, stc.STC_MARK_BOXPLUS, "white", "black") self.MarkerDefine(stc.STC_MARKNUM_FOLDEROPEN, stc.STC_MARK_BOXMINUS, "white", "black") # KEA 2004-05-20 # get rid of the annoying text drag and drop #stc.EVT_STC_START_DRAG(self, self.GetId(), self.OnStartDrag) stc.EVT_STC_MARGINCLICK(self, self.GetId(), self.OnMarginClick) if not aResource.editable: self._setEditable(False) #adapter = CodeEditorEventBinding(self) #adapter.bindEvents() self._bindEvents(event.WIDGET_EVENTS + (event.KeyPressEvent, event.KeyDownEvent, event.KeyUpEvent)) # POB 2002-05-04 # Borrowed stuff from PyCrust just to get this working. def _setStyles(self, faces): """Configure font size, typeface and color for lexer.""" # Default style self.StyleSetSpec(stc.STC_STYLE_DEFAULT, "face:%(mono)s,size:%(size)d" % faces) self.StyleClearAll() # Built in styles self.StyleSetSpec(stc.STC_STYLE_LINENUMBER, "back:#C0C0C0,face:%(mono)s,size:%(lnsize)d" % faces) self.StyleSetSpec(stc.STC_STYLE_CONTROLCHAR, "face:%(mono)s" % faces) self.StyleSetSpec(stc.STC_STYLE_BRACELIGHT, "fore:#0000FF,back:#FFFF88") self.StyleSetSpec(stc.STC_STYLE_BRACEBAD, "fore:#FF0000,back:#FFFF88") # Python styles self.StyleSetSpec(stc.STC_P_DEFAULT, "face:%(mono)s" % faces) self.StyleSetSpec(stc.STC_P_COMMENTLINE, "fore:#007F00,face:%(mono)s" % faces) self.StyleSetSpec(stc.STC_P_NUMBER, "") self.StyleSetSpec(stc.STC_P_STRING, "fore:#7F007F,face:%(mono)s" % faces) self.StyleSetSpec(stc.STC_P_CHARACTER, "fore:#7F007F,face:%(mono)s" % faces) self.StyleSetSpec(stc.STC_P_WORD, "fore:#00007F,bold") self.StyleSetSpec(stc.STC_P_TRIPLE, "fore:#7F0000") self.StyleSetSpec(stc.STC_P_TRIPLEDOUBLE, "fore:#000033,back:#FFFFE8") self.StyleSetSpec(stc.STC_P_CLASSNAME, "fore:#0000FF,bold") self.StyleSetSpec(stc.STC_P_DEFNAME, "fore:#007F7F,bold") self.StyleSetSpec(stc.STC_P_OPERATOR, "") self.StyleSetSpec(stc.STC_P_IDENTIFIER, "") self.StyleSetSpec(stc.STC_P_COMMENTBLOCK, "fore:#7F7F7F") self.StyleSetSpec(stc.STC_P_STRINGEOL, "fore:#000000,face:%(mono)s,back:#E0C0E0,eolfilled" % faces) configfile = configuration.getStyleConfigPath() if os.path.exists(configfile): STCStyleEditor.initSTC(self, configfile, 'python') def _getLineNumbersVisible(self): return self.GetMarginWidth(LINE_NUMBER_MARGIN) / LINE_NUMBER_MARGIN_WIDTH def _setLineNumbersVisible(self, aBoolean): self.SetMarginWidth(LINE_NUMBER_MARGIN, LINE_NUMBER_MARGIN_WIDTH * int(aBoolean)) def _getCodeFoldingVisible(self): return self.GetMarginWidth(CODE_FOLDING_MARGIN) / CODE_FOLDING_MARGIN_WIDTH def _setCodeFoldingVisible(self, aBoolean): if not aBoolean: self.FoldAll(toggle=0) self.SetMarginWidth(CODE_FOLDING_MARGIN, CODE_FOLDING_MARGIN_WIDTH * int(aBoolean)) # KEA 2002-05-03 # GetReadOnly and SetReadOnly are the opposite of # IsEditable and SetEditable in wxTextCtrl # so the methods are wrapped below def _getEditable(self): return not self.GetReadOnly() def _setEditable(self, aBoolean): self.SetReadOnly(not aBoolean) def _getText(self): return self.GetText() def _setText(self, text): if self.GetReadOnly(): self.SetReadOnly(0) self.SetText(text) self.SetReadOnly(1) else: self.SetText(text) # KEA 2002-05-20 # methods added to mimic wxTextCtrl def CanCopy(self): return 1 def CanCut(self): return 1 # KEA 2002-05-06 # taken from wxPython\lib\pyshell.py def OnUpdateUI(self, evt): #document = self.components.document # check for matching braces braceAtCaret = -1 braceOpposite = -1 charBefore = None caretPos = self.GetCurrentPos() if caretPos > 0: charBefore = self.GetCharAt(caretPos - 1) # KEA 2002-05-29 # see message from Jean-Michel Fauth # http://aspn.activestate.com/ASPN/Mail/Message/wxPython-users/1218004 #****** if charBefore < 0: charBefore = 32 #mimic a space #****** styleBefore = self.GetStyleAt(caretPos - 1) # check before if charBefore and chr(charBefore) in "[]{}()" and styleBefore == stc.STC_P_OPERATOR: braceAtCaret = caretPos - 1 # check after if braceAtCaret < 0: charAfter = self.GetCharAt(caretPos) # KEA 2002-05-29 # see message from Jean-Michel Fauth # http://aspn.activestate.com/ASPN/Mail/Message/wxPython-users/1218004 #****** if charAfter < 0: charAfter = 32 #mimic a space #****** styleAfter = self.GetStyleAt(caretPos) if charAfter and chr(charAfter) in "[]{}()" and styleAfter == stc.STC_P_OPERATOR: braceAtCaret = caretPos if braceAtCaret >= 0: braceOpposite = self.BraceMatch(braceAtCaret) if braceAtCaret != -1 and braceOpposite == -1: self.BraceBadLight(braceAtCaret) else: self.BraceHighlight(braceAtCaret, braceOpposite) # KEA 2002-12-16 # code folding code taken from # wxStyledTextCtrl_2.py def OnMarginClick(self, evt): # fold and unfold as needed if evt.GetMargin() == 2: if evt.GetShift() and evt.GetControl(): self.FoldAll() else: lineClicked = self.LineFromPosition(evt.GetPosition()) if self.GetFoldLevel(lineClicked) & stc.STC_FOLDLEVELHEADERFLAG: if evt.GetShift(): self.SetFoldExpanded(lineClicked, 1) self.Expand(lineClicked, 1, 1, 1) elif evt.GetControl(): if self.GetFoldExpanded(lineClicked): self.SetFoldExpanded(lineClicked, 0) self.Expand(lineClicked, 0, 1, 0) else: self.SetFoldExpanded(lineClicked, 1) self.Expand(lineClicked, 1, 1, 100) else: self.ToggleFold(lineClicked) def FoldAll(self, toggle=1): lineCount = self.GetLineCount() expanding = 1 if toggle: # find out if we are folding or unfolding for lineNum in range(lineCount): if self.GetFoldLevel(lineNum) & stc.STC_FOLDLEVELHEADERFLAG: expanding = not self.GetFoldExpanded(lineNum) break; lineNum = 0 while lineNum < lineCount: level = self.GetFoldLevel(lineNum) if level & stc.STC_FOLDLEVELHEADERFLAG and \ (level & stc.STC_FOLDLEVELNUMBERMASK) == stc.STC_FOLDLEVELBASE: if expanding: self.SetFoldExpanded(lineNum, 1) lineNum = self.Expand(lineNum, 1) lineNum = lineNum - 1 else: lastChild = self.GetLastChild(lineNum, -1) self.SetFoldExpanded(lineNum, 0) if lastChild > lineNum: self.HideLines(lineNum+1, lastChild) lineNum = lineNum + 1 def Expand(self, line, doExpand, force=0, visLevels=0, level=-1): lastChild = self.GetLastChild(line, level) line = line + 1 while line <= lastChild: if force: if visLevels > 0: self.ShowLines(line, line) else: self.HideLines(line, line) else: if doExpand: self.ShowLines(line, line) if level == -1: level = self.GetFoldLevel(line) if level & stc.STC_FOLDLEVELHEADERFLAG: if force: if visLevels > 1: self.SetFoldExpanded(line, 1) else: self.SetFoldExpanded(line, 0) line = self.Expand(line, doExpand, force, visLevels-1) else: if doExpand and self.GetFoldExpanded(line): line = self.Expand(line, 1, force, visLevels-1) else: line = self.Expand(line, 0, force, visLevels-1) else: line = line + 1; return line def setEditorStyle(self, ext=None): config = configuration.getStyleConfigPath() if config is not None: if ext is not None: ext = ext.lower().split('.')[-1] if ext in ['py', 'pyw']: style = 'python' elif ext in ['ini', 'text', 'txt']: style = 'text' elif ext in ['htm', 'html']: # 'html' style appears broken, just use xml for now style = 'xml' elif ext in ['rdf', 'xml']: style = 'xml' else: style = 'text' STCStyleEditor.initSTC(self, config, style) def OnStartDrag(self, evt): evt.SetDragText("") pos = self.GetCurrentPos() self.SetSelection(pos, pos) evt.Skip() ClearSelection = stc.StyledTextCtrl.Clear codeFoldingVisible = property(_getCodeFoldingVisible, _setCodeFoldingVisible) editable = property(_getEditable, _setEditable) lineNumbersVisible = property(_getLineNumbersVisible, _setLineNumbersVisible) text = property(_getText, _setText) import sys from PythonCard import registry registry.Registry.getInstance().register(sys.modules[__name__].CodeEditor) PythonCard-0.8.2/components/combobox.py0000644000076500007650000000630210077546540020072 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.28 $" __date__ = "$Date: 2004/07/21 20:09:04 $" """ import wx import sys from PythonCard import event, widget from list import ContainerMixin class ComboBoxSelectEvent(event.SelectEvent): binding = wx.EVT_COMBOBOX id = wx.wxEVT_COMMAND_COMBOBOX_SELECTED # KEA 2004-05-04 # dropped TextEnterEvent since I'm not sure it is needed # use keyPress handler instead ComboBoxEvents = ( event.KeyPressEvent, event.KeyDownEvent, event.KeyUpEvent, #event.TextEnterEvent, event.TextUpdateEvent, ComboBoxSelectEvent ) class ComboBoxSpec(widget.WidgetSpec): def __init__(self): events = list(ComboBoxEvents) ## events = [event.SelectEvent, ## event.KeyPressEvent, ## event.KeyDownEvent, ## event.KeyUpEvent, ## event.TextEnterEvent, ## event.TextUpdateEvent] attributes = { 'text' : { 'presence' : 'optional', 'default' : '' }, 'items' : { 'presence' : 'optional', 'default' : [] }, 'stringSelection' : { 'presence' : 'optional', 'default' : None } } widget.WidgetSpec.__init__(self, 'ComboBox', 'Widget', events, attributes) class ComboBox(widget.Widget, wx.ComboBox, ContainerMixin): """ A combobox menu. """ _spec = ComboBoxSpec() def __init__( self, aParent, aResource ) : wx.ComboBox.__init__( self, aParent, widget.makeNewId(aResource.id), '', aResource.position, aResource.size, aResource.items, style = wx.CB_DROPDOWN | wx.NO_FULL_REPAINT_ON_RESIZE | wx.CLIP_SIBLINGS, name = aResource.name ) widget.Widget.__init__( self, aParent, aResource ) # KEA 2001-08-12 # need to fix this, these are supposed to be optional if aResource.stringSelection: self._setStringSelection(aResource.stringSelection) if aResource.text != '': self.SetValue(aResource.text) self._bindEvents(event.WIDGET_EVENTS + ComboBoxEvents) def _getItems(self): items = [] try: for i in range(self.GetCount()): items.append(self.GetString(i)) except: pass return items def _setItems(self, items): self.Clear() self.AppendItems(items) def append( self, aString ) : self.Append( aString ) def appendItems(self, aList): self.AppendItems(aList) items = property(_getItems, _setItems) text = property(wx.ComboBox.GetValue, wx.ComboBox.SetValue) # KEA 2004-04-24 # wxPython 2.5.1.5 workaround # Mac ComboBox is missing SetStringSelection if wx.Platform == '__WXMAC__': def _setStringSelection(self, s): self.SetSelection(self.FindString(s)) stringSelection = property(ContainerMixin._getStringSelection, _setStringSelection) import sys from PythonCard import registry registry.Registry.getInstance().register(sys.modules[__name__].ComboBox) PythonCard-0.8.2/components/container.py0000644000076500007650000000303210041367074020233 0ustar alexalex00000000000000 """ __version__ = "$Revision:$" __date__ = "$Date:$" """ import wx from PythonCard import event, widget, model class ContainerSpec( widget.WidgetSpec ) : def __init__( self ) : events = [ event.MouseClickEvent ] attributes = {} widget.WidgetSpec.__init__( self, 'Container', 'Widget', events, attributes ) class Container( widget.Widget, model.Scriptable, wx.Panel ) : """ A container panel for composite components. """ _spec = ContainerSpec() def __init__( self, aParent, aResource ) : model.Scriptable.__init__( self, aParent ) wx.Panel.__init__( self, aParent, widget.makeNewId(aResource.id), aResource.position, aResource.size, style = wx.CLIP_SIBLINGS, name = aResource.name ) widget.Widget.__init__( self, aParent, aResource ) adapter = event.DefaultEventBinding( self ) adapter.bindEvents() # KEA 2001-12-09 # the registry could contain a dictionary of the class, its EventBinding, spec, etc. # some of those references could be class attributes instead # it seems like the spec for the class should be part of the class itself # RDS 2001-16-01 # A new module, registry, contains the Registry class. A Component's # class now contains it's spec, which contains meta data for it's events # and attributes. Components register with the ComponentRegistry. import sys from PythonCard import registry registry.Registry.getInstance().register(sys.modules[__name__].Container) PythonCard-0.8.2/components/floatcanvas.py0000644000076500007650000000442110330263762020555 0ustar alexalex00000000000000 """ +__version__ = "$Revision: 1.3 $" +__date__ = "$Date: 2005/10/27 23:51:14 $" """ import wx from PythonCard import widget try: # I have to do this rename to avoid a name collision from wx.lib.floatcanvas import FloatCanvas as FCanvas FLOATCANVAS_LOADED = True # what is a better way of dealing with this error # caused by NumPy not being installed? # we don't want the component showing up in the resourceEditor # but the error message you get if you try and use an # application that requires the component isn't very meaningful class FloatCanvasSpec(widget.WidgetSpec): def __init__(self): events = [] attributes = { 'size' : { 'presence' : 'optional', 'default' : [ 50, 50 ] }, } widget.WidgetSpec.__init__(self, 'FloatCanvas', 'Widget', events, attributes ) class FloatCanvas(widget.Widget, FCanvas.FloatCanvas): _spec = FloatCanvasSpec() def __init__( self, aParent, aResource ) : FCanvas.FloatCanvas.__init__( self, aParent, widget.makeNewId(aResource.id), #wx.wxPoint(aResource.position[0], aResource.position[1]), size=aResource.size, #aResource.items, #style = wx.wxCLIP_SIBLINGS, #name = aResource.name, ProjectionFun = None, BackgroundColor = "WHITE", Debug = False, ) widget.Widget.__init__( self, aParent, aResource ) widget.Widget._setPosition(self, aResource.position) # if there are any events to bind this is where we would do it #self._bindEvents(event.WIDGET_EVENTS + CanvasEvents) # I don't think we need this anymore """ def __getattr__(self, name): if name[:3] == "Add": return FloatCanvas.FloatCanvas.__getattr__(self, name) else: return widget.Widget.__getattr__(self, name) """ import sys from PythonCard import registry registry.Registry.getInstance().register(sys.modules[__name__].FloatCanvas) except ImportError: FLOATCANVAS_LOADED = False PythonCard-0.8.2/components/gauge.py0000644000076500007650000000377410045747676017374 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.12 $" __date__ = "$Date: 2004/05/04 17:15:42 $" """ import wx from PythonCard import event, widget class GaugeSpec(widget.WidgetSpec): def __init__(self): events = [] attributes = { 'layout' : { 'presence' : 'optional', 'default' : 'horizontal', 'values' : [ 'horizontal', 'vertical' ] }, 'max' : { 'presence' : 'optional', 'default' : 100 }, 'value' : { 'presence' : 'optional', 'default' : 0 } } widget.WidgetSpec.__init__(self, 'Gauge', 'Widget', events, attributes) class Gauge(widget.Widget, wx.Gauge): """ A gauge component. """ _spec = GaugeSpec() def __init__( self, aParent, aResource ) : wx.Gauge.__init__( self, aParent, widget.makeNewId(aResource.id), aResource.max, aResource.position, aResource.size, style= self.__getLayout( aResource.layout ) | wx.GA_SMOOTH | wx.NO_FULL_REPAINT_ON_RESIZE | wx.CLIP_SIBLINGS, name = aResource.name ) widget.Widget.__init__( self, aParent, aResource ) self.SetValue(aResource.value) self._layout = aResource.layout self._bindEvents(event.WIDGET_EVENTS) def __getLayout( self, aString ) : if aString == 'horizontal' : return wx.GA_HORIZONTAL elif aString == 'vertical' : return wx.GA_VERTICAL else : raise 'invalid Gauge.layout value: ', aString def _getLayout( self ) : return self._layout def _setLayout( self, aString ) : raise AttributeError, "layout attribute is read-only" layout = property(_getLayout, _setLayout) max = property(wx.Gauge.GetRange, wx.Gauge.SetRange) value = property(wx.Gauge.GetValue, wx.Gauge.SetValue) import sys from PythonCard import registry registry.Registry.getInstance().register(sys.modules[__name__].Gauge) PythonCard-0.8.2/components/grid.py0000644000076500007650000001212010120143136017161 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.13 $" __date__ = "$Date: 2004/09/09 21:08:46 $" """ import wx from wx import grid from PythonCard import event, widget class GridEvent(event.Event): def decorate(self, aWxEvent, source): aWxEvent = event.Event.decorate(self, aWxEvent, source) try: aWxEvent.row = aWxEvent.GetRow() aWxEvent.column = aWxEvent.GetCol() aWxEvent.position = aWxEvent.GetPosition() except: pass return aWxEvent class GridMouseClickEvent(GridEvent): name = 'mouseClick' binding = wx.grid.EVT_GRID_CELL_LEFT_CLICK id = wx.grid.wxEVT_GRID_CELL_LEFT_CLICK class GridMouseContextClickEvent(GridEvent): name = 'mouseContextClick' binding = wx.grid.EVT_GRID_CELL_RIGHT_CLICK id = wx.grid.wxEVT_GRID_CELL_RIGHT_CLICK class GridMouseDoubleClickEvent(GridEvent): name = 'mouseDoubleClick' binding = wx.grid.EVT_GRID_CELL_LEFT_DCLICK id = wx.grid.wxEVT_GRID_CELL_LEFT_DCLICK class GridMouseContextDoubleClickEvent(GridEvent): name = 'mouseContextDoubleClick' binding = wx.grid.EVT_GRID_CELL_RIGHT_DCLICK id = wx.grid.wxEVT_GRID_CELL_RIGHT_DCLICK class GridLabelClickEvent(GridEvent): name = 'labelClick' binding = wx.grid.EVT_GRID_LABEL_LEFT_CLICK id = wx.grid.wxEVT_GRID_LABEL_LEFT_CLICK class GridLabelContextClickEvent(GridEvent): name = 'labelContextClick' binding = wx.grid.EVT_GRID_LABEL_RIGHT_CLICK id = wx.grid.wxEVT_GRID_LABEL_RIGHT_CLICK class GridLabelDoubleClickEvent(GridEvent): name = 'labelDoubleClick' binding = wx.grid.EVT_GRID_LABEL_LEFT_DCLICK id = wx.grid.wxEVT_GRID_LABEL_LEFT_DCLICK class GridLabelContextDoubleClickEvent(GridEvent): name = 'labelContextDoubleClick' binding = wx.grid.EVT_GRID_LABEL_RIGHT_DCLICK id = wx.grid.wxEVT_GRID_LABEL_RIGHT_DCLICK class GridRowSizeEvent(GridEvent): name = 'rowSize' binding = wx.grid.EVT_GRID_ROW_SIZE id = wx.grid.wxEVT_GRID_ROW_SIZE class GridColumnSizeEvent(GridEvent): name = 'columnSize' binding = wx.grid.EVT_GRID_COL_SIZE id = wx.grid.wxEVT_GRID_COL_SIZE class GridRangeSelectEvent(GridEvent): name = 'rangeSelect' binding = wx.grid.EVT_GRID_RANGE_SELECT id = wx.grid.wxEVT_GRID_RANGE_SELECT class GridCellChangeEvent(GridEvent): name = 'cellChange' binding = wx.grid.EVT_GRID_CELL_CHANGE id = wx.grid.wxEVT_GRID_CELL_CHANGE class GridSelectCellEvent(GridEvent): name = 'selectCell' binding = wx.grid.EVT_GRID_SELECT_CELL id = wx.grid.wxEVT_GRID_SELECT_CELL class GridEditorShownEvent(GridEvent): name = 'editorShown' binding = wx.grid.EVT_GRID_EDITOR_SHOWN id = wx.grid.wxEVT_GRID_EDITOR_SHOWN class GridEditorHiddenEvent(GridEvent): name = 'editorHidden' binding = wx.grid.EVT_GRID_EDITOR_HIDDEN id = wx.grid.wxEVT_GRID_EDITOR_HIDDEN class GridEditorCreatedEvent(GridEvent): name = 'editorCreated' binding = wx.grid.EVT_GRID_EDITOR_CREATED id = wx.grid.wxEVT_GRID_EDITOR_CREATED GridEvents = (#GridSelectEvent, GridMouseClickEvent, GridMouseContextClickEvent, GridMouseDoubleClickEvent, GridMouseContextDoubleClickEvent, GridLabelClickEvent, GridLabelContextClickEvent, GridLabelDoubleClickEvent, GridLabelContextDoubleClickEvent, GridRowSizeEvent, GridColumnSizeEvent, GridRangeSelectEvent, GridCellChangeEvent, GridSelectCellEvent, GridEditorShownEvent, GridEditorHiddenEvent, GridEditorCreatedEvent, ) class GridSpec(widget.WidgetSpec): def __init__(self): events = list(GridEvents) attributes = { 'size' : { 'presence' : 'optional', 'default' : [ 50, 50 ] }, #'items' : { 'presence' : 'optional', 'default' : [] }, #'style' : { 'presence' : 'optional', 'default' : [], 'values' : [ 'horizontal', 'vertical' ] }, } widget.WidgetSpec.__init__( self, 'Grid', 'Widget', events, attributes ) # might need to remove these events, not sure yet #self._events.remove(event.MouseDoubleClickEvent) #self._events.remove(event.MouseContextClickEvent) #self._events.remove(event.MouseContextDoubleClickEvent) class Grid(widget.Widget, grid.Grid): """ A Grid. """ _spec = GridSpec() def __init__(self, aParent, aResource) : grid.Grid.__init__( self, aParent, widget.makeNewId( aResource.id ), aResource.position, aResource.size, #aResource.items, #style = border | wx.LC_REPORT | wx.CLIP_SIBLINGS, name = aResource.name ) widget.Widget.__init__(self, aParent, aResource) ## self._bindEvents(event.WIDGET_EVENTS) self._bindEvents(self._spec._events) import sys from PythonCard import registry registry.Registry.getInstance().register(sys.modules[__name__].Grid) PythonCard-0.8.2/components/htmlwindow.py0000644000076500007650000000602610050560030020436 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.17 $" __date__ = "$Date: 2004/05/13 02:40:24 $" """ import wx from wx import html from PythonCard import event, log, widget class HtmlWindowSpec(widget.WidgetSpec): def __init__(self): events = [] attributes = { 'size' : { 'presence' : 'optional', 'default' : [ 50, 50 ] }, 'text' : { 'presence' : 'optional', 'default' : '' }, } widget.WidgetSpec.__init__(self, 'HtmlWindow', 'Widget', events, attributes ) class HtmlWindow(widget.Widget, html.HtmlWindow): """ An HTML window. """ _spec = HtmlWindowSpec() def __init__(self, aParent, aResource): self._addressField = None html.HtmlWindow.__init__( self, aParent, widget.makeNewId(aResource.id), aResource.position, aResource.size, #style = wx.HW_SCROLLBAR_AUTO | wx.CLIP_SIBLINGS, name = aResource.name ) widget.Widget.__init__(self, aParent, aResource) self._setText(aResource.text) self._bindEvents(event.WIDGET_EVENTS) def setAddressField(self, field): self._addressField = field def _getText(self) : return self.GetOpenedPage() def _setText(self, aString): if aString == '' or aString[0] == '<': self.SetPage(aString) else: # filename self.LoadPage(aString) #self._delegate.Refresh() def base_LoadPage(self, url): log.debug("base_LoadPage " + url) if self._addressField is not None: self._addressField.text = url log.debug("loaded") html.HtmlWindow.base_LoadPage(self, url) def LoadPage(self, url): log.debug("LoadPage " + url) if self._addressField is not None: self._addressField.text = url log.debug("loaded") html.HtmlWindow.LoadPage(self, url) def SetPage(self, text): log.debug("SetPage " + text) #if self._addressField is not None: # self._addressField.text = text # log.debug("set") html.HtmlWindow.SetPage(self, text) def OnLinkClicked(self, link): log.debug("OnLinkClicked " + str(link)) if self._addressField is not None: url = self.GetOpenedPage() log.debug("url: " + url) baseURL = url[:url.rfind('/')] log.debug("baseURL: " + baseURL) href = link.GetHref() log.debug("href: " + href) if href.find('://') != -1: self._addressField.text = href else: self._addressField.text = baseURL + '/' + href log.debug("full url: " + self._addressField.text) # Virtuals in the base class have been renamed with base_ on the front. html.HtmlWindow.base_OnLinkClicked(self, link) text = property(_getText, _setText) import sys from PythonCard import registry registry.Registry.getInstance().register(sys.modules[__name__].HtmlWindow) PythonCard-0.8.2/components/iehtmlwindow.py0000644000076500007650000002263310050560030020756 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.19 $" __date__ = "$Date: 2004/05/13 02:40:24 $" """ import wx if wx.Platform == '__WXMSW__': from wx.lib import iewin else: # need a graceful exit pass from PythonCard import event, log, widget """ # Hook up the event handlers for the IE window self.Bind(iewin.EVT_BeforeNavigate2, self.OnBeforeNavigate2, self.ie) self.Bind(iewin.EVT_NewWindow2, self.OnNewWindow2, self.ie) self.Bind(iewin.EVT_DocumentComplete, self.OnDocumentComplete, self.ie) ##self.Bind(iewin.EVT_ProgressChange, self.OnProgressChange, self.ie) self.Bind(iewin.EVT_StatusTextChange, self.OnStatusTextChange, self.ie) self.Bind(iewin.EVT_TitleChange, self.OnTitleChange, self.ie) """ class IEHtmlTitleChangeEvent(event.Event): name = 'titleChange' binding = iewin.EVT_TitleChange id = iewin.wxEVT_TitleChange class IEHtmlStatusTextChangeEvent(event.Event): name = 'statusTextChange' binding = iewin.EVT_StatusTextChange id = iewin.wxEVT_StatusTextChange class IEHtmlDocumentCompleteEvent(event.Event): name = 'documentComplete' binding = iewin.EVT_DocumentComplete id = iewin.wxEVT_DocumentComplete IEHtmlWindowEvents = ( IEHtmlTitleChangeEvent, IEHtmlStatusTextChangeEvent, IEHtmlDocumentCompleteEvent, ) class IEHtmlWindowSpec(widget.WidgetSpec): def __init__(self): self.name = 'IEHtmlWindow' self.parent = 'Widget' events = list(IEHtmlWindowEvents) ## events = [event.IEHtmlTitleChangeEvent, ## event.IEHtmlStatusTextChangeEvent, ## event.IEHtmlDocumentCompleteEvent, ## ] attributes = { 'size' : { 'presence' : 'optional', 'default' : [ 50, 50 ] }, 'text' : { 'presence' : 'optional', 'default' : '' }, } widget.WidgetSpec.__init__(self, 'IEHtmlWindow', 'Widget', events, attributes ) class IEHtmlWindow(widget.Widget, iewin.IEHtmlWindow): """ An HTML window using the MS HTML control. """ _spec = IEHtmlWindowSpec() def __init__(self, aParent, aResource): iewin.IEHtmlWindow.__init__( self, aParent, widget.makeNewId(aResource.id), aResource.position, aResource.size, style = wx.CLIP_SIBLINGS | wx.NO_FULL_REPAINT_ON_RESIZE, name = aResource.name ) widget.Widget.__init__(self, aParent, aResource) self._setText(aResource.text) self._bindEvents(event.WIDGET_EVENTS + IEHtmlWindowEvents) def _getText(self) : #return self.GetOpenedPage() return self.GetText() def _setText(self, aString): if aString == '' or aString[0] == '<': self.LoadString(aString) else: # filename or URL self.LoadUrl(aString) text = property(_getText, _setText) # KEA 2004-05-02 # this will probably end up in Scriptable or Component # it should be completely generic # the only problem part would be the reference to the parent (background) # where the events are actually defined which would make this problematic # for a compound component or events bound to a Panel # what we really want is a reference to the application instance # there is probably some method to give us that in wxWidgets # UPDATE - I think GetTopLevelParent is what I was looking for def _bindEvents(self, eventList): # shouldn't components be subclasses of Scriptable? # components would have their own handlers but when # looking for a handler match it will search the parents # for now just grab handlers from the background # the references below would be self.findHandler instead of # background.findHandler #background = self.GetParent().GetParent() background = wx.GetTopLevelParent(self) if wx.GetApp()._showDebugMenu: bindUnusedEvents = True else: bindUnusedEvents = False # helper variable to simplify test for whether to bind InsteadOfTypeEvents # there is a good chance we will need to know # which events are bound, if we want to dynamically add or remove # events later, so go ahead and keep a reference to the list self.boundEvents = {} self.eventIdToHandler = {} self.wxEventIdMap = {} if 0: print "\nBINDING...", self.name for eventClass in eventList: #for eventClass in ButtonEvents: # need to figure out a way to avoid the need # for this id to class mapping which is used in _dispatch below self.wxEventIdMap[eventClass.id] = eventClass # command handler overrides normal mouseClick or select handler # so dispatch will automatically dispatch to the command handler # by looking up the handler this way # it also means that if there is a command association with this component # then the regular mouseClick or select handler will never be bound, just ignored if issubclass(eventClass, event.CommandTypeEvent) and self.command: handler = background.findHandler('on_' + self.command + '_command') if not handler: handler = background.findHandler('on_' + self.name + '_' + eventClass.name) else: handler = background.findHandler('on_' + self.name + '_' + eventClass.name) if not handler: handler = background.findHandler('on_' + eventClass.name) if handler or bindUnusedEvents: # only bind events that have an event handler # in this scenario unused events are never bound # which is more efficient, but the Message Watcher needs # to be changed # alternatively we can bind everything and then in _dispatch # if there isn't a match in eventIdToHandler then we know # the event isn't used and we can set used to False # the complication would be that we probably have to have to # always call Skip() which may or may not be a hassle with components # this doesn't bind command events # they would be of the form on_somename_command # or perhaps on_command but I don't think we would want # to support that # the event binding would be specific to a component # since on dispatch command overrides something like mouseClickEvent # but the name of the command is not related to the component # need to look at whether self.command has a value and then bind # with ButtonMouseClickEvent.binding if that isn't already bound # then in dispatch have to check again I think # need to avoid double binding # also binding shouldn't be order-specific # so how to avoid binding mouseDrag to _dispatch # if mouseMove is already bound or if binding mouseMove # not rebinding if mouseDrag is already bound # perhaps MouseDragEvent keeps a reference to MouseMoveEvent # and that is inserted into boundEvents, then we check boundEvents # prior to rebinding? if not self.boundEvents.get(eventClass.binding, None): background.Bind(eventClass.binding, self._dispatch, self) self.boundEvents[eventClass.binding] = eventClass.name if handler: if 0: print " binding", self.name, eventClass.name, handler.__name__, eventClass.id # KEA 2004-05-02 # change to just using the method directly, Handler class not needed # actually the Handler class isn't needed at all # so if the initial list built to simplify findHandler # just stores a reference to the method that would be fine # as long as the whole system uses that # the only reason we don't just build the list ourselves # in _bindEvents is that every component needs to do findHandler # so it is more efficient to do once when the Scriptable object # is created than to reparse for each component #self.eventIdToHandler[eventClass.id] = handler #self.eventIdToHandler[eventClass.id] = handler.getFunction() self.eventIdToHandler[eventClass.id] = handler if 0: print "\n boundEvents:" for name in self.boundEvents.values(): print " ", name print "\n\n" print "\n self.eventIdToHandler:" for id in self.eventIdToHandler: # KEA 2004-05-02 # change to just using the method directly, Handler class not needed #print " ", id, self.eventIdToHandler[id]._function print " ", id, self.eventIdToHandler[id] print "\n\n" import sys from PythonCard import registry registry.Registry.getInstance().register(sys.modules[__name__].IEHtmlWindow) PythonCard-0.8.2/components/image.py0000644000076500007650000001153110106276453017340 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.24 $" __date__ = "$Date: 2004/08/11 01:58:03 $" """ import wx from PythonCard import event, graphic, widget USE_GENERIC = wx.Platform == '__WXGTK__' if USE_GENERIC: from wx.lib.statbmp import GenStaticBitmap as StaticBitmap else: StaticBitmap = wx.StaticBitmap class ImageSpec(widget.WidgetSpec): def __init__(self): events = [] attributes = { 'file' : { 'presence' : 'optional', 'default':'' }, # KEA shouldn't there be a 'file' attribute here # could call it 'image' to match background above # but it is mandatory #'bitmap' : { 'presence' : 'optional', 'default' : None }, # KEA kill border for now, until variations of what is possible are worked out # use ImageButton if you want images with transparent border #'border' : { 'presence' : 'optional', 'default' : '3d', 'values' : [ '3d', 'transparent', 'none' ] }, 'size' : { 'presence' : 'optional', 'default' : [ -1, -1 ] }, } widget.WidgetSpec.__init__( self, 'Image', 'Widget', events, attributes ) class Image(widget.Widget, StaticBitmap): """ A static image. """ _spec = ImageSpec() def __init__(self, aParent, aResource): self._bitmap = graphic.Bitmap(aResource.file, aResource.size) self._file = aResource.file self._size = tuple(aResource.size) w = aResource.size[0] if w == -2: w = self._bitmap.getWidth() h = aResource.size[1] if h == -2: h = self._bitmap.getHeight() size = (w, h) #size = wx.Size( self._bitmap.GetWidth(), self._bitmap.GetHeight() ) ##if aResource.border == 'transparent': ## mask = wx.MaskColour(self._bitmap, wxBLACK) ## self._bitmap.SetMask(mask) StaticBitmap.__init__( self, aParent, widget.makeNewId(aResource.id), self._bitmap.getBits(), aResource.position, size, style = wx.NO_FULL_REPAINT_ON_RESIZE | wx.CLIP_SIBLINGS, name = aResource.name ) widget.Widget.__init__( self, aParent, aResource ) wx.EVT_WINDOW_DESTROY(self, self._OnDestroy) self._bindEvents(event.WIDGET_EVENTS) def _OnDestroy(self, event): # memory leak cleanup self._bitmap = None event.Skip() # KEA added getBitmap, setBitmap def _getBitmap( self ) : return self._bitmap def _setBitmap( self, aValue ) : self._bitmap = aValue self.SetBitmap( aValue.getBits() ) # may actually need to refresh the panel as well # depending on the size of the new bitmap compared # to the old one # in addition, the size of the image or imagebutton needs # to be set appropriately after changing the bitmap so # there are still a few issues to work out self.Refresh() """ # KEA do we query the Bitmap to find the actual dimensions # _size can contain -1, and -2 # or provide a special getBitmapSize method? # this getSize is actually the same as its parent def _getSize( self ) : return self.GetSizeTuple() # get the actual size, not (-1, -1) """ # KEA special handling for -2 size option def _setSize(self, aSize): self._size = tuple(aSize) w = aSize[0] if w == -2: w = self._bitmap.getWidth() h = aSize[1] if h == -2: h = self._bitmap.getHeight() self.SetSize((w, h)) # KEA 2001-08-02 # right now the image is loaded from a filename # during initialization # but later these might not make any sense # if setBitmap is used directly in user code def _getFile( self ) : return self._file # KEA 2001-08-14 # if we're going to support setting the file # after initialization, then this will need to handle the bitmap loading # overhead def _setFile( self, aFile ) : self._file = aFile self._setBitmap(graphic.Bitmap(aFile)) def _setBackgroundColor( self, aColor ) : aColor = self._getDefaultColor( aColor ) if self._file == '': bmp = self._bitmap.getBits() dc = wx.MemoryDC() dc.SelectObject(bmp) dc.SetBackground(wx.Brush(aColor)) dc.Clear() dc.SelectObject(wx.NullBitmap) self.SetBackgroundColour( aColor ) self.Refresh() # KEA wxPython bug? backgroundColor = property(widget.Widget._getBackgroundColor, _setBackgroundColor) bitmap = property(_getBitmap, _setBitmap) file = property(_getFile, _setFile) size = property(widget.Widget._getSize, _setSize) import sys from PythonCard import registry registry.Registry.getInstance().register(sys.modules[__name__].Image) PythonCard-0.8.2/components/imagebutton.py0000644000076500007650000001415210106276453020576 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.19 $" __date__ = "$Date: 2004/08/11 01:58:03 $" """ import wx from PythonCard import event, graphic, widget import button, image class ImageButtonSpec( widget.WidgetSpec ): def __init__(self): # KEA 2004-04-26 # test to use new event classes events = [button.ButtonMouseClickEvent] #events = [ event.MouseClickEvent ] attributes = { 'file' : { 'presence' : 'optional', 'default':'' }, # KEA shouldn't there be a 'file' attribute here # could call it 'image' to match background above # but it is mandatory #'bitmap' : { 'presence' : 'optional', 'default' : None }, # KEA kill border for now, until variations of what is possible are worked out # use ImageButton if you want images with transparent border # KEA since 3d is Windows specific, make transparent the default 'border' : { 'presence' : 'optional', 'default' : 'transparent', 'values' : [ '3d', 'transparent', 'none' ] }, 'size' : { 'presence' : 'optional', 'default' : [ -1, -1 ] }, } widget.WidgetSpec.__init__( self, 'ImageButton', 'Image', events, attributes ) class ImageButton(image.Image, wx.BitmapButton): """ An image that plays the role of a button. """ _spec = ImageButtonSpec() def __init__( self, aParent, aResource ) : self._border = aResource.border self._bitmap = graphic.Bitmap(aResource.file, aResource.size) self._file = aResource.file # KEA # should we modify aResource instead? # is aResource used again later? #print aResource.size self._size = tuple(aResource.size) w = aResource.size[0] if w == -2: w = self._bitmap.getWidth() h = aResource.size[1] if h == -2: h = self._bitmap.getHeight() size = (w, h) # KEA need to check all possible variations on Win32 and Linux if aResource.border == '3d': style = wx.BU_AUTODRAW # Windows specific ?! else: style = 0 wx.BitmapButton.__init__( self, aParent, widget.makeNewId(aResource.id), self._bitmap.getBits(), aResource.position, size, style | wx.NO_FULL_REPAINT_ON_RESIZE | wx.CLIP_SIBLINGS, name = aResource.name ) widget.Widget.__init__( self, aParent, aResource ) wx.EVT_WINDOW_DESTROY(self, self._OnDestroy) # KEA 2001-07-27 # we should only be binding this if the button # is supposed to be transparent # so maybe a setTransparent method with true/false parameter? # keep track of _transparent attribute and if _transparent # then unbind EVT_ERASE_BACKGROUND # before changing _transparent to false # same kind of thing for setTransparent # don't rebind events if not needed # getTransparent as well # setBorder/getBorder #print aResource.border if aResource.border == 'transparent': #print aResource.border wx.EVT_ERASE_BACKGROUND( self, lambda evt: None) #adapter = button.ButtonEventBinding(self) #adapter.bindEvents() self._bindEvents(event.WIDGET_EVENTS + (button.ButtonMouseClickEvent,)) def _OnDestroy(self, event): # memory leak cleanup self._bitmap = None event.Skip() #def _setHelpText( self, aString ) : # pass # KEA added getBitmap, setBitmap # KEA wxWindows uses a different set for wxStaticBitmap # so we have to override def _getBitmap( self ) : return self._bitmap # KEA # should something other than Refresh be used to force # a screen update? def _setBitmap( self, aValue ) : self._bitmap = aValue bmp = aValue.getBits() self.SetBitmapLabel(bmp) if wx.Platform != "__WXMSW__": self.SetBitmapDisabled(bmp) self.SetBitmapFocus(bmp) self.SetBitmapSelected(bmp) self.Refresh() def _getBorder( self ) : return self._border def _setBorder( self, aString ) : raise AttributeError, "border attribute is read-only" """ # KEA do we query the Bitmap to find the actual dimensions # _size can contain -1, and -2 # or provide a special getBitmapSize method? # this getSize is actually the same as its parent def _getSize( self ) : return self.GetSizeTuple() # get the actual size, not (-1, -1) # KEA special handling for -2 size option def _setSize( self, aSize ): x = aSize[0] if x == -2: x = self._bitmap.getWidth() y = aSize[1] if y == -2: y = self._bitmap.getHeight() self.SetSize( ( x, y ) ) """ # KEA 2001-08-02 # right now the image is loaded from a filename # during initialization # but later these might not make any sense # if setBitmap is used directly in user code def _getFile( self ) : return self._file # KEA 2001-08-14 # if we're going to support setting the file # after initialization, then this will need to handle the bitmap loading # overhead def _setFile( self, aFile ) : self._file = aFile self._setBitmap(graphic.Bitmap(aFile)) def _setBackgroundColor( self, aColor ) : aColor = self._getDefaultColor( aColor ) if self._file == '': bmp = self._bitmap.getBits() dc = wx.MemoryDC() dc.SelectObject(bmp) dc.SetBackground(wx.Brush(aColor)) dc.Clear() dc.SelectObject(wx.NullBitmap) self.SetBackgroundColour( aColor ) self.Refresh() # KEA wxPython bug? backgroundColor = property(widget.Widget._getBackgroundColor, _setBackgroundColor) bitmap = property(_getBitmap, _setBitmap) border = property(_getBorder, _setBorder) file = property(_getFile, _setFile) import sys from PythonCard import registry registry.Registry.getInstance().register(sys.modules[__name__].ImageButton) PythonCard-0.8.2/components/list.py0000644000076500007650000000762610353521122017231 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.29 $" __date__ = "$Date: 2005/12/25 13:44:50 $" """ import wx from PythonCard import event, widget class ContainerMixin: def _getSelection(self): return self.GetSelection() def _setSelection(self, index): self.SetSelection(index) def _getStringSelection(self): return self.GetStringSelection() def _setStringSelection(self, s): # an arg of None or empty string will remove the selection if s is None or s == '': self.SetSelection(-1) else: self.SetStringSelection(s) selection = property(_getSelection, _setSelection) stringSelection = property(_getStringSelection, _setStringSelection) class ListSelectEvent(event.SelectEvent): name = 'select' binding = wx.EVT_LISTBOX id = wx.wxEVT_COMMAND_LISTBOX_SELECTED # can only have one CommandTypeEvent per component class ListMouseDoubleClickEvent(event.Event): name = 'mouseDoubleClick' binding = wx.EVT_LISTBOX_DCLICK id = wx.wxEVT_COMMAND_LISTBOX_DOUBLECLICKED ListEvents = (ListSelectEvent, ListMouseDoubleClickEvent) class ListSpec(widget.WidgetSpec): def __init__(self): ## events = [event.SelectEvent] # KEA 2004-05-03 # how do we cleanly remove the MouseDoubleClickEvent # which the subclass is automatically going to add? events = list(ListEvents) attributes = { 'items' : { 'presence' : 'optional', 'default' : [] }, 'stringSelection' : { 'presence' : 'optional', 'default' : None } } widget.WidgetSpec.__init__( self, 'List', 'Widget', events, attributes ) # KEA 2004-09-04 # this isn't particularly clean, but it does remove the extra event class # and since events unlike attributes don't get any further processing # in the spec this should be okay self._events.remove(event.MouseDoubleClickEvent) class List(widget.Widget, wx.ListBox, ContainerMixin): """ A list that only allows a single item to be selected. """ _spec = ListSpec() def __init__(self, aParent, aResource): wx.ListBox.__init__( self, aParent, widget.makeNewId(aResource.id), aResource.position, aResource.size, aResource.items, style = wx.LB_SINGLE | wx.NO_FULL_REPAINT_ON_RESIZE | wx.CLIP_SIBLINGS, name = aResource.name ) widget.Widget.__init__(self, aParent, aResource) if aResource.stringSelection: self._setStringSelection(aResource.stringSelection) self._bindEvents(self._spec._events) def _getItems(self): items = [] for i in range(self.GetCount()): items.append(self.GetString(i)) return items def _setItems( self, aList ) : self.Set(aList) def append(self, aString): self.Append(aString) def appendItems(self, aList): self.AppendItems(aList) def clear( self ) : self.Clear() def delete( self, aPosition ) : self.Delete( aPosition ) def findString( self, aString ) : return self.FindString( aString ) def getString( self, aPosition ) : return self.GetString( aPosition ) def insertItems( self, aList, aPosition ) : self.InsertItems( aList, aPosition ) def getCount(self): return self.GetCount() # KEA was getSelected def isSelected(self, aPosition): """Determines whether an item is selected. aPosition is the zero-based item index Returns True if the given item is selected, False otherwise. """ return self.IsSelected(aPosition) def setString( self, n, aString ) : self.SetString( n, aString ) items = property(_getItems, _setItems) import sys from PythonCard import registry registry.Registry.getInstance().register(sys.modules[__name__].List) PythonCard-0.8.2/components/multicolumnlist.py0000644000076500007650000004644410143462671021535 0ustar alexalex00000000000000 """ +__version__ = "$Revision: 1.28 $" +__date__ = "$Date: 2004/11/07 18:13:13 $" """ import wx from wx.lib.mixins.listctrl import ColumnSorterMixin, ListCtrlAutoWidthMixin from types import TupleType, ListType, StringTypes, NoneType, IntType from PythonCard import event, widget class MultiColumnListEvent(event.Event): def decorate(self, aWxEvent, source): aWxEvent = event.Event.decorate(self, aWxEvent, source) aWxEvent.item = aWxEvent.GetItem() return aWxEvent class MultiColumnListSelectEvent(MultiColumnListEvent, event.CommandTypeEvent): name = 'select' binding = wx.EVT_LIST_ITEM_SELECTED id = wx.wxEVT_COMMAND_LIST_ITEM_SELECTED class MultiColumnListItemActivatedEvent(MultiColumnListEvent): name = 'itemActivated' binding = wx.EVT_LIST_ITEM_ACTIVATED id = wx.wxEVT_COMMAND_LIST_ITEM_ACTIVATED class MultiColumnListItemFocusedEvent(MultiColumnListEvent): name = 'itemFocused' binding = wx.EVT_LIST_ITEM_FOCUSED id = wx.wxEVT_COMMAND_LIST_ITEM_FOCUSED class MultiColumnListMouseContextClickEvent(MultiColumnListEvent): name = 'mouseContextClick' binding = wx.EVT_LIST_ITEM_RIGHT_CLICK id = wx.wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK class MultiColumnListKeyDownEvent(MultiColumnListEvent): name = 'keyDown' binding = wx.EVT_LIST_KEY_DOWN id = wx.wxEVT_COMMAND_LIST_KEY_DOWN def decorate(self, aWxEvent, source): aWxEvent = MultiColumnListEvent.decorate(self, aWxEvent, source) aWxEvent.keyCode = aWxEvent.GetKeyCode() return aWxEvent class MultiColumnListColumnClickEvent(MultiColumnListEvent): name = 'columnClick' binding = wx.EVT_LIST_COL_CLICK id = wx.wxEVT_COMMAND_LIST_COL_CLICK MultiColumnListEvents =(MultiColumnListSelectEvent, MultiColumnListItemActivatedEvent, MultiColumnListItemFocusedEvent, MultiColumnListMouseContextClickEvent, MultiColumnListKeyDownEvent, MultiColumnListColumnClickEvent) class MultiColumnListSpec(widget.WidgetSpec): def __init__(self): ## events =[event.SelectEvent, ## event.ItemActivatedEvent, ## event.ItemFocusedEvent, ## event.MouseContextClickEvent, ## event.ListColumnClickEvent, ## event.KeyDownEvent] events = list(MultiColumnListEvents) attributes ={ 'items' : { 'presence' : 'optional', 'default' : [] }, #'selected' : { 'presence' : 'optional', 'default' : None }, 'maxColumns' : { 'presence' : 'optional', 'default' : 20 }, 'columnHeadings' : { 'presence' : 'optional', 'default' : [] }, 'rules' : { 'presence' : 'optional', 'default' : 1 }, #'style' : { 'presence' : 'optional', 'default' : [], 'values' : [ 'horizontal', 'vertical' ] }, 'size' : { 'presence' : 'optional', 'default' : [ 50, 50 ] }, } widget.WidgetSpec.__init__( self, 'MultiColumnList', 'Widget', events, attributes ) class MultiColumnList(widget.Widget, wx.ListCtrl, ColumnSorterMixin, ListCtrlAutoWidthMixin): """ A multi-column list. """ _spec = MultiColumnListSpec() def __init__( self, aParent, aResource ) : if aResource.rules: rules = wx.LC_HRULES | wx.LC_VRULES else: rules = 0 self._rules = aResource.rules self._maxColumns = aResource.maxColumns self._autoresize = 1 wx.ListCtrl.__init__( self, aParent, widget.makeNewId(aResource.id), aResource.position, aResource.size, #aResource.items, style = rules | wx.LC_REPORT | \ wx.NO_FULL_REPAINT_ON_RESIZE | wx.CLIP_SIBLINGS, name = aResource.name ) widget.Widget.__init__( self, aParent, aResource ) self.itemDataMap = {} # Now that the list exists we can init the other base class, # see wxPython/lib/mixins/listctrl.py ColumnSorterMixin.__init__(self, self._maxColumns) # Perform init for AutoWidth (resizes the last column to take up # the remaining display width) ListCtrlAutoWidthMixin.__init__(self) #if aResource.selected != "" and aResource.selected : # self._setSelection( aResource.selected ) # After creation we can set the headings self._setColumnHeadings(aResource.columnHeadings) # And load the list self._setItems(aResource.items) self._bindEvents(event.WIDGET_EVENTS + MultiColumnListEvents) # Emulate some listBox methods def Clear(self): self.DeleteAllItems() self.itemDataMap = {} # Emulate some listBox methods def GetCount(self): return self.GetItemCount() # Used by the wxColumnSorterMixin, see wxPython/lib/mixins/listctrl.py def GetListCtrl(self): return self """ # KEA 2003-09-04 # workaround typo bug in wxPython 2.4.1.2 controls2.py def GetColumn(self, *_args, **_kwargs): val = controls2c.ListCtrl_GetColumn(self, *_args, **_kwargs) if val is not None: val.thisown = 1 return val """ def _getColumnHeadings(self): return self._columnHeadings def GetColumnHeadingInfo(self): numcols = self.GetColumnCount() result = [None] * numcols if self._autoresize: for i in xrange(numcols): listItem = self.GetColumn(i) result[i] = [listItem.GetText(), wx.LIST_AUTOSIZE, listItem.GetAlign()] else: for i in xrange(numcols): listItem = self.GetColumn(i) result[i] = [listItem.GetText(), listItem.GetWidth(), listItem.GetAlign()] return result def GetSelectedItems(self): numcols = self.GetColumnCount() numitems = self.GetSelectedItemCount() items = [None] * numitems GetNextItem = self.GetNextItem if numcols == 1: GetItemText = self.GetItemText itemidx = -1 for i in xrange( numitems ): itemidx = GetNextItem(itemidx, wx.LIST_NEXT_ALL, wx.LIST_STATE_SELECTED) if itemidx == -1: #Odd, selection changed? break items[i] = GetItemText(itemidx) else: GetItem = self.GetItem cols = range(numcols) itemidx = -1 for i in xrange(numitems) : itemidx = GetNextItem(itemidx, wx.LIST_NEXT_ALL, wx.LIST_STATE_SELECTED) if itemidx == -1: #Odd, selection changed? break items[i] = map(lambda x: GetItem(itemidx, x).GetText(), cols) return items # Emulate some listBox methods def getStringSelection(self): return self.GetSelectedItems() # Emulate some listBox methods def Append(self, aList): self.InsertItems(aList, self.GetItemCount()) # Emulate some listBox methods def InsertItems(self, aList, position): if not isinstance(aList, ListType) and not isinstance(aList, TupleType): raise AttributeError, "unsupported type, list expected" if len(aList) == 0: return numcols = self.GetColumnCount() numitems = self.GetItemCount() # If the list is empty or uninitialized fake an assignment and return if numitems == 0 or numcols == 0: self._setItems(aList) return # Convert our input into a list of list entries of the appropriate # number of columns. if isinstance(aList[0], ListType) or isinstance(aList[0], TupleType): if isinstance(aList[0], TupleType): aList = list(aList) if numcols == len(aList[0]): pass elif numcols > len(aList[0]): blanks = [''] * (numcols - len(aList[0])) aList = map(lambda x:x + blanks, aList) else: aList = map(lambda x:x[:numcols], aList) elif isinstance(aList[0], StringTypes): blanks = [''] * (numcols - 1) aList = map(lambda x:[x] + blanks, aList) else: raise AttributeError, "unsupported type, list or string expected" # Allow negative indexing to mean from the end of the list if position < 0: position = numitems + position # But only allow from the start of the list on if position < 0: postiion = 0 # If inserting within the current span of the list, we have # to copy the portion below the insertion point if position < numitems: currentitems = self._getItems()[position:] if isinstance(currentitems[0], StringTypes): currentitems = map(lambda x:[x], currentitems) aList = aList + currentitems datamap = self.itemDataMap max = [0] * numcols for i in xrange(len(aList)): offset = position + i l = len(aList[i][0]) if l > max[0]: max[0] = l if offset >= numitems: self.InsertStringItem(offset, aList[i][0]) else: self.SetStringItem(offset, 0, aList[i][0]) for j in range(1,numcols): l = len(aList[i][j]) if l > max[j]: max[j] = l self.SetStringItem(offset, j, aList[i][j]) self.SetItemData(offset, offset) datamap[offset] = aList[i] if self._autoresize: charwidth = self.GetCharWidth() maxwidth = self.GetBestVirtualSize()[0]*2 for i in range(numcols): hdrwidth = (len(self._columnHeadings[i])+1) * charwidth colwidth = (max[i]+2) * charwidth curcolwidth = self.GetColumnWidth(i) if colwidth < curcolwidth: colwidth = curcolwidth if colwidth < hdrwidth: colwidth = hdrwidth if colwidth < 20: colwidth = 20 elif colwidth > maxwidth: colwidth = maxwidth self.SetColumnWidth(i, colwidth) self.resizeLastColumn(self.GetColumnWidth(numcols-1)) def _setColumnHeadings(self, aList): if isinstance(aList, ListType) or isinstance(aList, TupleType) or isinstance(aList, StringTypes): pass else: raise 'invalid MultiColumnList.SetHeading value: ', aList self.ClearAll() self.itemDataMap = {} self._autoresize = 1 if isinstance(aList, StringTypes): self.InsertColumn(0,aList,width=self.GetBestVirtualSize()[0]) self._columnHeadings = [aList] return elif isinstance(aList, TupleType): aList = list(aList) self._columnHeadings = aList numcols = len(aList) if numcols == 0: return elif numcols > self._maxColumns: numcols = self._maxColumns self._columnHeadings = aList[:numcols] if isinstance(aList[0], StringTypes): for i in xrange(numcols): self.InsertColumn(i, aList[i], width=wx.LIST_AUTOSIZE) elif isinstance(aList[0], ListType) or isinstance(aList[0], TupleType): w = len(aList[0]) if w == 2 and isinstance(aList[0][0], StringTypes) and isinstance(aList[0][1], IntType): flag = 0 for i in xrange(numcols): if aList[i][1] != wx.LIST_AUTOSIZE: flag = 1 self.InsertColumn(i, aList[i][0], width=aList[i][1]) if flag: self._autoresize = 0 elif w == 3 and \ isinstance(aList[0][0], StringTypes) and \ isinstance(aList[0][1], IntType) and \ isinstance(aList[0][2], IntType): flag = 0 for i in xrange(numcols): if aList[i][1] != wx.LIST_AUTOSIZE: flag = 1 self.InsertColumn(i, aList[i][0], format=aList[i][2], width=aList[i][1]) if flag: self._autoresize = 0 elif w == 1 and isinstance(aList[0][0], StringTypes): for i in xrange(numcols): self.InsertColumn(i, aList[i][0], width=wx.LIST_AUTOSIZE) self._autoresize = 1 else: raise 'invalid MultiColumnList.SetHeading value: ', aList else: raise 'invalid MultiColumnList.SetHeading value: ', aList if numcols == 1: self.SetColumnWidth(0, self.GetBestVirtualSize()[0]) def GetItemDataMap(self, aDict): return self.itemDataMap def SetItemDataMap(self, aDict): self.itemDataMap = aDict def SetSelection(self, itemidx, select=1): numitems = self.GetItemCount() if numitems == 0: return if itemidx < 0: itemidx = numitems + itemidx if itemidx < 0: itemidx = 0 elif itemidx >= numitems: itemidx = numitems - 1 if select: self.SetItemState(itemidx, wx.LIST_STATE_SELECTED, wx.LIST_STATE_SELECTED) else: self.SetItemState(itemidx, 0, wx.LIST_STATE_SELECTED) def SetStringSelection(self, item, select=1): numitems = self.GetItemCount() if numitems == 0: return -1 #TODO: Expand search to all columns, for now it adds no functionality itemidx = self.FindItem(-1, item, 1) if itemidx < 0: return itemidx if select: self.SetItemState(itemidx, wx.LIST_STATE_SELECTED, wx.LIST_STATE_SELECTED) else: self.SetItemState(itemidx, 0, wx.LIST_STATE_SELECTED) return itemidx def _getRules(self): return self._rules def _setRules(self, aString): raise AttributeError, "rules attribute is read-only" def _getMaxColumns(self): return self._maxColumns def _setMaxColumns(self, aString): # Could perhaps call the mixin __init__ method again, doesn't look # like it would cause harm. For now however leave this a restriction. raise AttributeError, "maxColumns attribute is read-only" def _getItems( self ) : numitems = self.GetItemCount() numcols = self.GetColumnCount() items = [None] * numitems if numcols == 1: GetItemText = self.GetItemText for i in xrange(numitems ) : items[i] = GetItemText(i) else: GetItem = self.GetItem cols = range(numcols) for i in xrange(numitems) : items[i] = map(lambda x: GetItem(i, x).GetText(), cols) return items def _setItems( self, aList ) : if isinstance(aList, NoneType): aList = [] elif not isinstance(aList, ListType) and not isinstance(aList, TupleType): raise AttributeError, "unsupported type, list expected" numitems = len(aList) if numitems == 0: self.DeleteAllItems() self.itemDataMap = {} return # If just simple list of strings convert it to a single column list if isinstance(aList[0], StringTypes): aList = map(lambda x:[x], aList) elif isinstance(aList[0], ListType) or isinstance(aList[0], TupleType): pass else: raise AttributeError, "unsupported element type" # Here we have a list of a list of values. # If the number of values is greater than the maximum number # of columns allowed, truncate it. Similarly remove or add # columns as necessary to accomodate the data up to the maximum # allowed. It could be thought to just throw an exception # since the programmer flubbed it however I chose the # 'do what you can' approach. Note that we depend on the # first item in the list setting the number of columns for # all remaining items in the list. numcols = len(aList[0]) if numcols > self._maxColumns: numcols = self._maxColumns if numcols != self.GetColumnCount(): if numcols == 1: self.ClearAll() self.InsertColumn(0,'List') self._columnHeadings = ['List'] else: c = self.GetColumnCount() if c > numcols: for i in range(c-1,numcols-1,-1): self.DeleteColumn(i) self._columnHeadings = self._columnHeadings[:-1] else: for i in range(c,numcols): colname = 'Col %d' % (i+1,) self.InsertColumn(i,colname) self._columnHeadings.append(colname) self.DeleteAllItems() datamap = {} max = [0] * numcols blanks = [''] * numcols columnlist = range(1,numcols) for i in xrange(numitems): aItem = aList[i] if len(aItem) < numcols: # Not the same number of columns in entry. # truncation is automatic, padding with # blanks is done here. aItem = aItem + blanks l = len(aItem[0]) if l > max[0]: max[0] = l self.InsertStringItem(i, aItem[0]) for j in columnlist: l = len(aItem[j]) if l > max[j]: max[j] = l self.SetStringItem(i, j, aItem[j]) self.SetItemData(i, i) datamap[i] = aItem if self._autoresize: charwidth = self.GetCharWidth() maxwidth = self.GetBestVirtualSize()[0]*2 for i in range(numcols): hdrwidth = (len(self._columnHeadings[i])+1) * charwidth colwidth = int((max[i]+1) * charwidth) if colwidth < hdrwidth: colwidth = hdrwidth if colwidth < 20: colwidth = 20 elif colwidth > maxwidth: colwidth = maxwidth self.SetColumnWidth(i, colwidth) self.resizeLastColumn(self.GetColumnWidth(numcols-1)) self.itemDataMap = datamap # KEA 2004-04-16 # theoretically this is fixed, need to check then delete this commented block """ def _getFont(self): if self._font is None: # workaround for GetFont() bug with ListCtrl with # wxPython 2.4.1.2 and earlier on wxMSW f = self.GetFont() if f.Ok(): desc = font.fontDescription(f) else: desc = font.fontDescription(self._parent.GetFont()) self._font = font.Font(desc) return self._font """ items = property(_getItems, _setItems) columnHeadings = property(_getColumnHeadings, _setColumnHeadings) maxColumns = property(_getMaxColumns, _setMaxColumns) rules = property(_getRules, _setRules) import sys from PythonCard import registry registry.Registry.getInstance().register(sys.modules[__name__].MultiColumnList) PythonCard-0.8.2/components/notebook.py0000644000076500007650000000652510141306472020077 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.4 $" __date__ = "$Date: 2004/11/01 01:11:22 $" """ import wx from PythonCard import event, widget class NotebookEvent(event.Event): def decorate(self, aWxEvent, source): aWxEvent = event.Event.decorate(self, aWxEvent, source) aWxEvent.oldSelection = aWxEvent.GetOldSelection() aWxEvent.selection = aWxEvent.GetSelection() return aWxEvent class NotebookPageChangedEvent(NotebookEvent): name = 'pageChanged' binding = wx.EVT_NOTEBOOK_PAGE_CHANGED id = wx.wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED class NotebookPageChangingEvent(NotebookEvent): name = 'pageChanging' binding = wx.EVT_NOTEBOOK_PAGE_CHANGING id = wx.wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING NotebookEvents = (NotebookPageChangedEvent, NotebookPageChangingEvent) class NotebookSpec(widget.WidgetSpec): def __init__(self): events = list(NotebookEvents) attributes = { # KEA 2004-09-14 # we could provide an attribute for the labels #'label' : { 'presence' : 'optional', 'default':'Button' }, #'default':{'presence':'optional', 'default':0} } widget.WidgetSpec.__init__(self, 'Notebook', 'Widget', events, attributes ) class Notebook(widget.Widget, wx.Notebook): _spec = NotebookSpec() def __init__(self, aParent, aResource): wx.Notebook.__init__(self, aParent, widget.makeNewId(aResource.id), aResource.position, aResource.size, style = wx.NO_FULL_REPAINT_ON_RESIZE | wx.CLIP_SIBLINGS, name = aResource.name ) widget.Widget.__init__(self, aParent, aResource) self._bindEvents(self._spec._events) def _getPageNames(self): names = [] for i in range(self.GetPageCount()): names.append(self.GetPageText(i)) return names def _getStringSelection(self): return self.GetPageText(self.GetSelection()) def _setStringSelection(self, s): names = self._getPageNames() try: self.SetSelection(names.index(s)) except: # what kind of exception should we throw here for # an invalid string selection? pass # KEA 2004-09-14 # rather than using all these methods there could # be a list wrapper where the __add__, __del__, etc. # methods call the right method below # but that might be needlessly complicated # I didn't add aliases for all methods # in particular I'm not sure about image support addPage = wx.Notebook.AddPage deleteAllPages = wx.Notebook.DeleteAllPages deletePage = wx.Notebook.DeletePage getPage = wx.Notebook.GetPage getPageCount = wx.Notebook.GetPageCount getPageText = wx.Notebook.GetPageText #getSelection = wx.Notebook.GetSelection insertPage = wx.Notebook.InsertPage removePage = wx.Notebook.RemovePage setPageText = wx.Notebook.SetPageText #setSelection = wx.Notebook.SetSelection selection = property(wx.Notebook.GetSelection, wx.Notebook.SetSelection) stringSelection = property(_getStringSelection, _setStringSelection) import sys from PythonCard import registry registry.Registry.getInstance().register(sys.modules[__name__].Notebook) PythonCard-0.8.2/components/passwordfield.py0000644000076500007650000000437110125162031021113 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.22 $" __date__ = "$Date: 2004/09/25 03:20:57 $" """ import wx from PythonCard import event, widget import textfield class PasswordFieldSpec(textfield.TextFieldSpec): def __init__(self): textfield.TextFieldSpec.__init__( self ) self._name = 'PasswordField' self._parent = 'TextField' class PasswordField(textfield.TextField): """ A text field that displays '*' characters in place of the actual characters typed - suitable for entering passwords securely. """ _spec = PasswordFieldSpec() def __init__( self, aParent, aResource ) : ##textfield.TextField.__init__( self, aParent, aResource ) self._border = aResource.border # previously _createDelegate would be called by Widget.__init__ # so put wxTextCtrl.__init__ here if aResource.border == 'none': borderStyle = wx.NO_BORDER else: borderStyle = 0 self._alignment = aResource.alignment wx.TextCtrl.__init__( self, aParent, widget.makeNewId(aResource.id), aResource.text, aResource.position, aResource.size, #style = wx.TE_PASSWORD | wx.TE_PROCESS_ENTER | borderStyle | wx.CLIP_SIBLINGS, style = wx.TE_PASSWORD | borderStyle | \ textfield.getAlignment(aResource.alignment) | \ wx.NO_FULL_REPAINT_ON_RESIZE | wx.CLIP_SIBLINGS, name = aResource.name ) widget.Widget.__init__( self, aParent, aResource ) if not aResource.editable: self.SetEditable(False) if aResource.border == 'none': self.SetBackgroundColour(self.GetParent().GetBackgroundColour()) #adapter = textfield.TextFieldEventBinding(self) #adapter.bindEvents() ## self._bindEvents(event.WIDGET_EVENTS + textfield.TextFieldEvents) # KEA 2004-09-24 # changing to CallAfter to force the gainFocus # event to occur after the initialize event wx.CallAfter(self._bindEvents, event.WIDGET_EVENTS + textfield.TextFieldEvents) import sys from PythonCard import registry registry.Registry.getInstance().register(sys.modules[__name__].PasswordField) PythonCard-0.8.2/components/radiogroup.py0000644000076500007650000000634410050560030020420 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.25 $" __date__ = "$Date: 2004/05/13 02:40:24 $" """ import wx from PythonCard import event, widget from list import ContainerMixin class RadioGroupSelectEvent(event.SelectEvent): binding = wx.EVT_RADIOBOX id = wx.wxEVT_COMMAND_RADIOBOX_SELECTED RadioGroupEvents = (RadioGroupSelectEvent,) class RadioGroupSpec(widget.WidgetSpec): def __init__(self): events = list(RadioGroupEvents) ## events = [event.SelectEvent] attributes = { 'label' : { 'presence' : 'optional', 'default' : '' }, 'items' : { 'presence' : 'optional', 'default' : ['one'] }, 'stringSelection' : { 'presence' : 'optional', 'default' : 'one' }, 'layout' : { 'presence' : 'optional', 'default' : 'vertical', 'values' : [ 'horizontal', 'vertical' ] }, 'max' : { 'presence' : 'optional', 'default' : 1 } # KEA we can't control the border of a wxRadioBox as far as I can tell #'border' : { 'presence' : 'optional', 'default' : None } } widget.WidgetSpec.__init__( self, 'RadioGroup', 'Widget', events, attributes ) class RadioGroup(widget.Widget, wx.RadioBox, ContainerMixin): """ A group of radio buttons. """ _spec = RadioGroupSpec() def __init__(self, aParent, aResource): wx.RadioBox.__init__( self, aParent, widget.makeNewId(aResource.id), aResource.label, aResource.position, aResource.size, aResource.items, aResource.max, self.__getLayout(aResource.layout) | \ wx.NO_FULL_REPAINT_ON_RESIZE | wx.CLIP_SIBLINGS, name=aResource.name ) widget.Widget.__init__(self, aParent, aResource) self._labels = aResource.items self._layout = aResource.layout self._max = aResource.max if aResource.stringSelection: self._setStringSelection(aResource.stringSelection) self._bindEvents(event.WIDGET_EVENTS + RadioGroupEvents) def __getLayout(self, aString): if aString == 'vertical': return wx.RA_SPECIFY_COLS elif aString == 'horizontal': return wx.RA_SPECIFY_ROWS else: raise 'invalid RadioGroup.layout value: ', aString def _getItems(self): return self._labels # KEA 2004-04-23 # I could probably manually call SetItemLabel(n, string) # to replace all the radio button lables but only # if there was the same number of items as radio buttons def _setItems(self, aList): raise NotImplementedError def _getLayout(self): return self._layout def _setLayout(self, aString): raise AttributeError, "layout attribute is read-only" def _getMax(self): return self._max def _setMax(self, aMax): raise AttributeError, "max attribute is read-only" items = property(_getItems, _setItems) label = property(wx.RadioBox.GetLabel, wx.RadioBox.SetLabel) layout = property(_getLayout, _setLayout) max = property(_getMax, _setMax) import sys from PythonCard import registry registry.Registry.getInstance().register(sys.modules[__name__].RadioGroup) PythonCard-0.8.2/components/slider.py0000644000076500007650000000756610047327560017555 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.19 $" __date__ = "$Date: 2004/05/09 04:11:28 $" """ import wx from PythonCard import event, widget class SliderSelectEvent(event.SelectEvent): binding = wx.EVT_SLIDER id = wx.wxEVT_COMMAND_SLIDER_UPDATED SliderEvents = (SliderSelectEvent,) class SliderSpec(widget.WidgetSpec): def __init__(self): events = list(SliderEvents) ## events = [event.SelectEvent] attributes = { 'layout' : { 'presence' : 'optional', 'default' : 'horizontal', 'values' : [ 'horizontal', 'vertical' ] }, 'labels' : { 'presence' : 'optional', 'default' : False }, 'ticks' : { 'presence' : 'optional', 'default' : False }, 'tickFrequency' : { 'presence' : 'optional', 'default' : 0 }, 'min' : { 'presence' : 'optional', 'default' : 0 }, 'max' : { 'presence' : 'optional', 'default' : 100 }, 'value' : { 'presence' : 'optional', 'default' : 0 } } widget.WidgetSpec.__init__( self, 'Slider', 'Widget', events, attributes ) class Slider(widget.Widget, wx.Slider): """ A slider component. """ _spec = SliderSpec() def __init__( self, aParent, aResource ) : wx.Slider.__init__( self, aParent, widget.makeNewId(aResource.id), aResource.value, aResource.min, aResource.max, aResource.position, aResource.size, style= self.__getLayout(aResource.layout) | \ self.__getLabels(aResource.labels) | \ self.__getTicks(aResource.ticks) | \ wx.NO_FULL_REPAINT_ON_RESIZE | wx.CLIP_SIBLINGS, name = aResource.name ) widget.Widget.__init__( self, aParent, aResource ) self._layout = aResource.layout self._labels = aResource.labels self._ticks = aResource.ticks if aResource.ticks and aResource.tickFrequency: self._setTickFrequency(aResource.tickFrequency) self._bindEvents(event.WIDGET_EVENTS + SliderEvents) def __getLayout( self, aString ) : if aString == 'horizontal' : return wx.SL_HORIZONTAL elif aString == 'vertical' : return wx.SL_VERTICAL else : raise 'invalid Slider.layout value: ', aString def __getLabels(self, aBoolean): if aBoolean: return wx.SL_LABELS else : return 0 def __getTicks(self, aBoolean): if aBoolean: return wx.SL_AUTOTICKS else : return 0 def setRange( self, aMin, aMax ) : self.SetRange( aMin, aMax ) def _setMin( self, aMin ) : self.SetRange( aMin, self.GetMax() ) def _setMax( self, aMax ) : self.SetRange( self.GetMin(), aMax ) def _getLayout( self ) : return self._layout def _setLayout( self, aString ) : raise AttributeError, "layout attribute is read-only" def _getLabels(self): return self._labels def _setLabels(self, aBoolean): raise AttributeError, "labels attribute is read-only" def _getTicks(self): return self._ticks def _setTicks(self, aBoolean): raise AttributeError, "ticks attribute is read-only" def _getTickFrequency(self): return self.GetTickFreq() def _setTickFrequency(self, aInteger): self.SetTickFreq(aInteger, 1) layout = property(_getLayout, _setLayout) labels = property(_getLabels, _setLabels) ticks = property(_getTicks, _setTicks) tickFrequency = property(_getTickFrequency, _setTickFrequency) max = property(wx.Slider.GetMax, _setMax) min = property(wx.Slider.GetMin, _setMin) value = property(wx.Slider.GetValue, wx.Slider.SetValue) import sys from PythonCard import registry registry.Registry.getInstance().register( sys.modules[__name__].Slider ) PythonCard-0.8.2/components/spinner.py0000644000076500007650000000473110045747676017754 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.16 $" __date__ = "$Date: 2004/05/04 17:15:42 $" """ import wx from PythonCard import event, widget # KEA 2004-05-04 # dropped TextEnterEvent since I'm not sure it is needed # use keyPress handler instead SpinnerEvents = ( event.KeyPressEvent, event.KeyDownEvent, event.KeyUpEvent, #event.TextEnterEvent, event.TextUpdateEvent, ) class SpinnerSpec(widget.WidgetSpec): def __init__(self): events = list(SpinnerEvents) ## events = [event.KeyPressEvent, ## event.KeyDownEvent, ## event.KeyUpEvent, ## event.TextEnterEvent, ## event.TextUpdateEvent, ## #event.SpinUpEvent, ## #event.SpinDownEvent ## ] attributes = { 'min' : { 'presence' : 'optional', 'default' : 0 }, 'max' : { 'presence' : 'optional', 'default' : 100 }, 'value' : { 'presence' : 'optional', 'default' : 0 } } widget.WidgetSpec.__init__( self, 'Spinner', 'Widget', events, attributes ) class Spinner(widget.Widget, wx.SpinCtrl): """ A Spinner component. """ _spec = SpinnerSpec() def __init__( self, aParent, aResource ) : wx.SpinCtrl.__init__( self, aParent, widget.makeNewId(aResource.id), str(aResource.value), aResource.position, aResource.size, style = wx.SP_ARROW_KEYS | wx.SP_WRAP | \ wx.NO_FULL_REPAINT_ON_RESIZE | wx.CLIP_SIBLINGS, min = aResource.min, max = aResource.max, initial = aResource.value, name = aResource.name ) widget.Widget.__init__( self, aParent, aResource ) self._bindEvents(event.WIDGET_EVENTS + SpinnerEvents) def setRange( self, aMin, aMax ) : self.SetRange( aMin, aMax ) def _setMin( self, aMin ) : self.SetRange( aMin, self.GetMax() ) def _setMax( self, aMax ) : self.SetRange( self.GetMin(), aMax ) max = property(wx.SpinCtrl.GetMax, _setMax) min = property(wx.SpinCtrl.GetMin, _setMin) value = property(wx.SpinCtrl.GetValue, wx.SpinCtrl.SetValue) import sys from PythonCard import registry registry.Registry.getInstance().register(sys.modules[__name__].Spinner) PythonCard-0.8.2/components/staticbox.py0000644000076500007650000000306610050560030020243 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.12 $" __date__ = "$Date: 2004/05/13 02:40:24 $" """ import wx from PythonCard import event, widget class StaticBoxSpec(widget.WidgetSpec): def __init__(self): attributes = { 'label' : { 'presence' : 'optional', 'default' : '' }, 'size' : { 'presence' : 'optional', 'default' : [ 50, 50 ] }, } widget.WidgetSpec.__init__( self, 'StaticBox', 'Widget', [], attributes ) class StaticBox(widget.Widget, wx.StaticBox): """ A static box is just a box which may be used to group controls. The box may have a label. """ _spec = StaticBoxSpec() def __init__( self, aParent, aResource ) : wx.StaticBox.__init__( self, aParent, widget.makeNewId(aResource.id), aResource.label, aResource.position, aResource.size, style = wx.NO_FULL_REPAINT_ON_RESIZE | wx.CLIP_SIBLINGS, name = aResource.name ) widget.Widget.__init__( self, aParent, aResource ) self._bindEvents(event.WIDGET_EVENTS) """ # KEA 2002-03-25 # this works, but is too much of a hack, wxWindows needs to be fixed def _setPosition(self, position): self.Move(position) size = self.GetSize() self.SetSize((size[0], size[1] - 1)) self.SetSize(size) """ label = property(wx.StaticBox.GetLabel, wx.StaticBox.SetLabel) import sys from PythonCard import registry registry.Registry.getInstance().register(sys.modules[__name__].StaticBox) PythonCard-0.8.2/components/staticline.py0000644000076500007650000000374110050560030020402 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.13 $" __date__ = "$Date: 2004/05/13 02:40:24 $" """ import wx from PythonCard import event, widget class StaticLineSpec(widget.WidgetSpec): def __init__(self): attributes = { 'layout' : { 'presence' : 'optional', 'default' : 'horizontal', 'values' : [ 'horizontal', 'vertical' ] }, 'size' : { 'presence' : 'optional', 'default' : [ 50, -1 ] }, } widget.WidgetSpec.__init__( self, 'StaticLine', 'Widget', [], attributes ) class StaticLine(widget.Widget, wx.StaticLine): """ A static line is just a line which may be used to separate a groups of controls. The line may be only vertical or horizontal. """ _spec = StaticLineSpec() def __init__( self, aParent, aResource ) : wx.StaticLine.__init__( self, aParent, widget.makeNewId(aResource.id), aResource.position, aResource.size, style = self.__getLayout( aResource.layout ) | wx.NO_FULL_REPAINT_ON_RESIZE | wx.CLIP_SIBLINGS, name = aResource.name ) widget.Widget.__init__( self, aParent, aResource ) # set attributes directly that can only be set at initialization self._layout = aResource.layout self._bindEvents(event.WIDGET_EVENTS) def __getLayout( self, aString ) : if aString == 'horizontal' : return wx.LI_HORIZONTAL elif aString == 'vertical' : return wx.LI_VERTICAL else : raise 'invalid StaticLine.layout value: ', aString #def _setHelpText( self, aString ) : # pass def _setLayout( self, aString ) : raise AttributeError, "layout attribute is read-only" def _getLayout( self ) : return self._layout layout = property(_getLayout, _setLayout) import sys from PythonCard import registry registry.Registry.getInstance().register(sys.modules[__name__].StaticLine) PythonCard-0.8.2/components/statictext.py0000644000076500007650000000411610050560030020434 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.17 $" __date__ = "$Date: 2004/05/13 02:40:24 $" """ import wx from PythonCard import event, widget class StaticTextSpec(widget.WidgetSpec): def __init__(self): attributes = { 'text' : { 'presence' : 'optional', 'default' : 'StaticText' }, 'alignment' : { 'presence' : 'optional', 'default' : 'left', 'values' :[ 'left', 'right', 'center' ] } } widget.WidgetSpec.__init__( self, 'StaticText', 'Widget', [], attributes ) class StaticText(widget.Widget, wx.StaticText): """ An uneditable block of text. """ _spec = StaticTextSpec() def __init__( self, aParent, aResource ) : wx.StaticText.__init__( self, aParent, widget.makeNewId(aResource.id), aResource.text, aResource.position, aResource.size, style = self.__getAlignment(aResource.alignment) | \ wx.NO_FULL_REPAINT_ON_RESIZE | wx.CLIP_SIBLINGS, name = aResource.name ) widget.Widget.__init__( self, aParent, aResource ) self._alignment = aResource.alignment self._bindEvents(event.WIDGET_EVENTS) def __getAlignment( self, aString ) : if aString == 'left' : return wx.ALIGN_LEFT elif aString == 'center' : return wx.ALIGN_CENTER | wx.ST_NO_AUTORESIZE elif aString == 'right' : return wx.ALIGN_RIGHT | wx.ST_NO_AUTORESIZE else : raise 'invalid StaticText.alignment value: ', aString def _setText( self, aString): self.SetLabel(aString) self.Refresh() self.Update() def _getAlignment( self ) : return self._alignment def _setAlignment( self, aString ) : raise AttributeError, "alignment attribute is read-only" alignment = property(_getAlignment, _setAlignment) text = property(wx.StaticText.GetLabel, _setText) import sys from PythonCard import registry registry.Registry.getInstance().register(sys.modules[__name__].StaticText) PythonCard-0.8.2/components/textarea.py0000644000076500007650000001133010127110424020054 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.29 $" __date__ = "$Date: 2004/09/30 23:04:52 $" """ import wx from PythonCard import event, widget import textfield # KEA 2004-05-12 # due to the way Spec inits are called, I had to duplicate the TextField spec # just so I could add a 'size' attribute, at least I think I needed to. class TextAreaSpec(textfield.TextFieldSpec): def __init__(self): events = list(textfield.TextFieldEvents) attributes = { 'text' : {'presence' : 'optional', 'default' : ''}, 'editable' : {'presence' : 'optional', 'default' : 1}, 'alignment' : {'presence' : 'optional', 'default' : 'left', 'values' :['left', 'right', 'center']}, 'border' : {'presence' : 'optional', 'default' : '3d', 'values' : ['3d', 'none']}, 'horizontalScrollbar' : {'presence' : 'optional', 'default' : False}, 'size' : { 'presence' : 'optional', 'default' : [ -1, 50 ] }, } widget.WidgetSpec.__init__( self, 'TextArea', 'TextField' , events, attributes ) class TextArea(textfield.TextField): """ A text area that can have multi-line text, scrollbars, etc.. """ _spec = TextAreaSpec() def __init__( self, aParent, aResource ) : self._horizontalScrollbar = aResource.horizontalScrollbar if aResource.horizontalScrollbar: hScroll = wx.HSCROLL else: hScroll = 0 self._border = aResource.border if aResource.border == 'none': borderStyle = wx.NO_BORDER else: borderStyle = 0 self._alignment = aResource.alignment wx.TextCtrl.__init__( self, aParent, widget.makeNewId(aResource.id), aResource.text, aResource.position, aResource.size, # KEA 2004-07-19 # don't use wx.TE_PROCESS_TAB with 2.5.2 and later ## style = wx.TE_RICH2 | wx.TE_PROCESS_TAB | wx.TE_MULTILINE | borderStyle | \ style = wx.TE_RICH2 | wx.TE_MULTILINE | borderStyle | \ textfield.getAlignment(aResource.alignment) | hScroll |\ wx.NO_FULL_REPAINT_ON_RESIZE | wx.CLIP_SIBLINGS, name = aResource.name ) widget.Widget.__init__(self, aParent, aResource) if not aResource.editable: self.SetEditable(False) if aResource.border == 'none': self.SetBackgroundColour(self.GetParent().GetBackgroundColour()) ## self._bindEvents(event.WIDGET_EVENTS + textfield.TextFieldEvents) # KEA 2004-09-24 # changing to CallAfter to force the gainFocus # event to occur after the initialize event wx.CallAfter(self._bindEvents, event.WIDGET_EVENTS + textfield.TextFieldEvents) # KEA 2004-04-20 # wxPython 2.5.1.5 workaround if wx.Platform == '__WXMSW__': def appendText(self, aString): """Appends the text to the end of the text widget. After the text is appended, the insertion point will be at the end of the text widget. If this behavior is not desired, the programmer should use getInsertionPoint and setInsertionPoint.""" self.AppendText(aString) # workaround for scroll bug # http://sourceforge.net/tracker/?func=detail&aid=665381&group_id=9863&atid=109863 self.ScrollLines(-1) # KEA 2004-04-19 # workaround Windows bug where control is shown # and the display left corrupted def _setText(self, text): if self.IsShown(): self.SetValue(text) else: parent = self.GetParent() parent.Freeze() self.SetValue(text) # have to toggle here because the control thinks # it is hidden self.Show() self.Hide() parent.Refresh() parent.Thaw() text = property(wx.TextCtrl.GetValue, _setText) elif wx.Platform == '__WXMAC__': # KEA 2004-04-23 # workaround for wxPython 2.4.x and 2.5.x # returning text with \r instead of \n def _getText(self): return "\n".join(self.GetValue().splitlines()) text = property(_getText, wx.TextCtrl.SetValue) def _getHorizontalScrollbar( self ) : return self._horizontalScrollbar def _setHorizontalScrollbar ( self, aBool ) : raise AttributeError, "horizontalScrollbar attribute is read-only" horizontalScrollbar = property(_getHorizontalScrollbar, _setHorizontalScrollbar) import sys from PythonCard import registry registry.Registry.getInstance().register(sys.modules[__name__].TextArea) PythonCard-0.8.2/components/textfield.py0000644000076500007650000002753210222037403020243 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.31 $" __date__ = "$Date: 2005/03/28 17:29:39 $" """ import wx from PythonCard import event, widget # KEA 2002-04-04 # custom event posted after loseFocus when a field # has been changed wxEVT_CLOSE_FIELD = wx.NewEventType() ##def EVT_CLOSE_FIELD(win, id, func): ## win.Connect(id, -1, wxEVT_CLOSE_FIELD, func) # use the new PyEventBinder in 2.5.x EVT_CLOSE_FIELD = wx.PyEventBinder(wxEVT_CLOSE_FIELD) class CloseFieldEvent(event.Event): name = 'closeField' binding = EVT_CLOSE_FIELD id = wxEVT_CLOSE_FIELD TextFieldEvents = ( event.KeyPressEvent, event.KeyDownEvent, event.KeyUpEvent, event.TextUpdateEvent, CloseFieldEvent ) class TextFieldSpec(widget.WidgetSpec): def __init__( self ) : events = list(TextFieldEvents) attributes = { 'text' : {'presence' : 'optional', 'default' : ''}, 'editable' : {'presence' : 'optional', 'default' : 1}, 'alignment' : {'presence' : 'optional', 'default' : 'left', 'values' :['left', 'right', 'center']}, 'border' : {'presence' : 'optional', 'default' : '3d', 'values' : ['3d', 'none']} } widget.WidgetSpec.__init__( self, 'TextField', 'Widget' , events, attributes ) def getAlignment(aString): if aString == 'left': return wx.TE_LEFT elif aString == 'center': return wx.TE_CENTRE elif aString == 'right': return wx.TE_RIGHT else : raise 'invalid TextField.alignment value:', aString class TextField(widget.Widget, wx.TextCtrl): """ A text field. """ _spec = TextFieldSpec() def __init__(self, aParent, aResource): self._border = aResource.border if aResource.border == 'none': borderStyle = wx.NO_BORDER else: borderStyle = 0 self._alignment = aResource.alignment wx.TextCtrl.__init__( self, aParent, widget.makeNewId(aResource.id), aResource.text, aResource.position, aResource.size, #style = wxTE_PROCESS_ENTER | borderStyle | wxCLIP_SIBLINGS, style = borderStyle | getAlignment(aResource.alignment) | \ wx.CLIP_SIBLINGS | wx.NO_FULL_REPAINT_ON_RESIZE, name = aResource.name) widget.Widget.__init__(self, aParent, aResource) if not aResource.editable: self.SetEditable(False) if aResource.border == 'none': # the erase background event doesn't appear to make the control # transparent, so further investigation is required #EVT_ERASE_BACKGROUND(delegate, lambda evt: None) self.SetBackgroundColour(self.GetParent().GetBackgroundColour()) #adapter = TextFieldEventBinding(self) #adapter.bindEvents() ## self._bindEvents(event.WIDGET_EVENTS + TextFieldEvents) # KEA 2004-09-24 # changing to CallAfter to force the gainFocus # event to occur after the initialize event wx.CallAfter(self._bindEvents, event.WIDGET_EVENTS + TextFieldEvents) def _getAlignment(self): return self._alignment def _setAlignment(self, aString): raise AttributeError, "alignment attribute is read-only" def ClearSelection(self): if self.CanCut(): # delete the current selection, # if we can't do a Cut we shouldn't be able to delete either # which is why i used the test above sel = self.replaceSelection('') else: ins = self.GetInsertionPoint() try: self.replace(ins, ins + 1, '') except: pass # KEA the methods for retrieving and manipulating the text # has to be greatly expanded to match wxPython # capabilities or more # KEA new methods to mirror wxPython wxTextCtrl capabilities def appendText( self, aString ) : """Appends the text to the end of the text widget. After the text is appended, the insertion point will be at the end of the text widget. If this behavior is not desired, the programmer should use getInsertionPoint and setInsertionPoint.""" self.AppendText( aString ) def canCopy( self ) : return self.CanCopy() def canCut( self ) : return self.CanCut() def canPaste( self ) : return self.CanPaste() def canRedo( self ) : return self.CanRedo() def canUndo( self ) : return self.CanUndo() def clear( self ) : self.Clear() def copy( self ) : self.Copy() def cut( self ) : self.Cut() def discardEdits( self ) : self.DiscardEdits() def getInsertionPoint( self ) : return self.GetInsertionPoint() def getLastPosition( self ) : return self.GetLastPosition() def getLineLength( self, aLineNumber ) : return self.GetLineLength( aLineNumber ) def getLineText( self, aLineNumber ) : return self.GetLineText( aLineNumber ) def getNumberOfLines( self ) : return self.GetNumberOfLines() def getSelection( self ) : return self.GetSelection() def getNumberOfLines( self ) : return self.GetNumberOfLines() # KEA rename to getModified? def isModified( self ) : """Returns 1 if the text has been modified, 0 otherwise.""" return self.IsModified() # KEA support LoadFile? If so, it only makes sense for TextArea # many of the other methods only make sense for the multiline TextArea # not TextField and PasswordField # KEA OnChar ties into our user code handlers and our events, # need to think about this one some more # KEA OnDropFiles is windows-specific, if you try and call it under *nix # what happens? just an exception? def paste( self ) : self.Paste() def positionToXY(self, aPosition): result = self.PositionToXY(aPosition) if len(result) == 2: return result else: # workaround for wxPython 2.3.2.1 return (result[1], result[2]) def redo( self ) : self.Redo() def remove( self, aFrom, aTo ) : self.Remove( aFrom, aTo ) def replace( self, aFrom, aTo, aString ) : # KEA workaround for Replace bug, has the side effect of # possibly changing the insertion point #self._delegate.Replace( aFrom, aTo, aString ) i = self.GetInsertionPoint() self.Remove( aFrom, aTo ) self.SetInsertionPoint( aFrom ) self.WriteText( aString ) self.SetInsertionPoint( i ) def replaceSelection(self, aString, select=0): sel = self.GetSelection() self.Remove(sel[0], sel[1]) self.WriteText(aString) if select: self.SetSelection(sel[0], sel[0] + len(aString)) # KEA support SaveFile? def setInsertionPoint( self, aPosition ) : self.SetInsertionPoint( aPosition ) def setInsertionPointEnd( self ) : self.SetInsertionPointEnd() def setSelection( self, aFrom, aTo ) : self.SetSelection( aFrom, aTo ) def showPosition( self, aPosition ) : self.ShowPosition( aPosition ) def undo( self ) : self.Undo() def writeText( self, aString ) : self.WriteText( aString ) def xyToPosition( self, aX, aY ) : return self.XYToPosition( aX, aY ) def _getBorder( self ) : return self._border def _setBorder( self, aString ) : raise AttributeError, "border attribute is read-only" getStringSelection = wx.TextCtrl.GetStringSelection def getString(self, aFrom, aTo): return self.GetValue()[aFrom:aTo] # mimic wxSTC method ClearAll = wx.TextCtrl.Clear def _bindEvents(self, eventList): widget.Widget._bindEvents(self, eventList) # in order for closeField to work properly # both gainFocus and loseFocus have to be bound to _dispatch # regardless of whether they have handlers or not for eventClass in [event.GainFocusEvent, event.LoseFocusEvent]: if not self.boundEvents.get(eventClass.binding, None): self.Bind(eventClass.binding, self._dispatch) self.boundEvents[eventClass.binding] = eventClass.name # calling widget.Widget._bindEvents after instead of before # our component specific initialization would mean any log debug # statements like this could just be in Widget_bindEvents # however, until we convert all the components I'm not sure # that changing the order will always work if 0: print "\n boundEvents:" for name in self.boundEvents.values(): print " ", name print "\n\n" print "\n self.eventIdToHandler:" for id in self.eventIdToHandler: print " ", id, self.eventIdToHandler[id]._function print "\n\n" def _dispatch(self, aWxEvent): eventType = aWxEvent.GetEventType() # TextField specific stuff # the question is how we either call the generic stuff above # due to the try/except blocks this code would probably # work in the generic event handling but that would be unclean if eventType == wx.wxEVT_SET_FOCUS: try: aWxEvent.GetEventObject().DiscardEdits() except: pass elif eventType == wx.wxEVT_KILL_FOCUS: try: aWxEvent.target = aWxEvent.GetEventObject() # only wxTextCtrl should have IsModified # so an exception will be thrown and the event won't be posted # for other components, but they shouldn't be binding to these # handlers anyway, so I'm just being overly defensive # same with DiscardEdits() above #modified = obj.IsModified() if not aWxEvent.target.IsBeingDeleted() and aWxEvent.target.IsModified(): #closeFieldEvent = aWxEvent.Clone() #closeFieldEvent.SetEventType(event.wxEVT_CLOSE_FIELD) # should I be using wx.PyEvent() instead? closeFieldEvent = wx.WindowCreateEvent() closeFieldEvent.SetEventType(wxEVT_CLOSE_FIELD) closeFieldEvent.SetEventObject(aWxEvent.target) closeFieldEvent.SetId(aWxEvent.GetId()) closeFieldEvent.SetTimestamp(aWxEvent.GetTimestamp()) # this is what Robin suggested instead, see: # http://aspn.activestate.com/ASPN/Mail/Message/wxPython-users/1103427 #obj.GetParent().GetEventHandler().ProcessEvent(closeFieldEvent) # KEA 2004-04-30 # ProcessEvent will cause closeField to occur before loseFocus and # gainFocus messages, so should we do a wxCallAfter instead? # in the case of fields should closeField be an InsteadOfTypeEvent # and replace the loseFocus event? probably not since they mean # different things aWxEvent.target.GetEventHandler().ProcessEvent(closeFieldEvent) #wx.PostEvent(obj.GetParent(), evt) #print 'posted closeField' except: pass # rest of the dispatch is standard widget.Widget._dispatch(self, aWxEvent) alignment = property(_getAlignment, _setAlignment) border = property(_getBorder, _setBorder) editable = property(wx.TextCtrl.IsEditable, wx.TextCtrl.SetEditable) text = property(wx.TextCtrl.GetValue, wx.TextCtrl.SetValue) import sys from PythonCard import registry registry.Registry.getInstance().register(sys.modules[__name__].TextField) PythonCard-0.8.2/components/togglebutton.py0000644000076500007650000000425310050560030020757 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.2 $" __date__ = "$Date: 2004/05/13 02:40:24 $" """ import wx from PythonCard import event, widget # KEA 2004-05-06 # expose the same interface as CheckBox class ToggleButtonMouseClickEvent(event.MouseClickEvent): binding = wx.EVT_TOGGLEBUTTON id = wx.wxEVT_COMMAND_TOGGLEBUTTON_CLICKED ToggleButtonEvents = (ToggleButtonMouseClickEvent,) class ToggleButtonSpec(widget.WidgetSpec): def __init__(self): events = list(ToggleButtonEvents) attributes = { 'label' : { 'presence' : 'optional', 'default':'ToggleButton' }, 'checked' : { 'presence' : 'optional', 'default' : 0 } } widget.WidgetSpec.__init__(self, 'ToggleButton', 'Widget', events, attributes ) class ToggleButton(widget.Widget, wx.ToggleButton): """ A toggle button. """ _spec = ToggleButtonSpec() def __init__( self, aParent, aResource ) : wx.ToggleButton.__init__( self, aParent, widget.makeNewId(aResource.id), aResource.label, aResource.position, aResource.size, style = wx.CLIP_SIBLINGS | wx.NO_FULL_REPAINT_ON_RESIZE, name = aResource.name ) widget.Widget.__init__( self, aParent, aResource) if aResource.checked: self.SetValue(True) self._bindEvents(event.WIDGET_EVENTS + ToggleButtonEvents) checked = property(wx.ToggleButton.GetValue, wx.ToggleButton.SetValue) label = property(wx.ToggleButton.GetLabel, wx.ToggleButton.SetLabel) # KEA 2004-05-06 # you can't actually set the foregroundColor and backgroundColor of # a ToggleButton so I wonder whether we should have those as valid # attributes? The same goes for other components where some of our # base attributes don't make any sense. OTOH, having the attribute # which fails silently when it tries to set it gives some symmetry # to the components and gets rid of the need for try/except blocks # when processing a group of component attributes. import sys from PythonCard import registry registry.Registry.getInstance().register(sys.modules[__name__].ToggleButton) PythonCard-0.8.2/components/tree.py0000644000076500007650000001167610050560031017211 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.15 $" __date__ = "$Date: 2004/05/13 02:40:25 $" """ import wx from PythonCard import event, widget class TreeEvent(event.Event): def decorate(self, aWxEvent, source): aWxEvent = event.Event.decorate(self, aWxEvent, source) aWxEvent.item = aWxEvent.GetItem() return aWxEvent class TreeItemActivatedEvent(TreeEvent): name = 'itemActivated' binding = wx.EVT_TREE_ITEM_ACTIVATED id = wx.wxEVT_COMMAND_TREE_ITEM_ACTIVATED class TreeItemCollapsedEvent(TreeEvent): name = 'itemCollapsed' binding = wx.EVT_TREE_ITEM_COLLAPSED id = wx.wxEVT_COMMAND_TREE_ITEM_COLLAPSED class TreeItemCollapsingEvent(TreeEvent): name = 'itemCollapsing' binding = wx.EVT_TREE_ITEM_COLLAPSING id = wx.wxEVT_COMMAND_TREE_ITEM_COLLAPSING class TreeItemExpandedEvent(TreeEvent): name = 'itemExpanded' binding = wx.EVT_TREE_ITEM_EXPANDED id = wx.wxEVT_COMMAND_TREE_ITEM_EXPANDED class TreeItemExpandingEvent(TreeEvent): name = 'itemExpanding' binding = wx.EVT_TREE_ITEM_EXPANDING id = wx.wxEVT_COMMAND_TREE_ITEM_EXPANDING class TreeSelectionChangedEvent(TreeEvent): name = 'selectionChanged' binding = wx.EVT_TREE_SEL_CHANGED id = wx.wxEVT_COMMAND_TREE_SEL_CHANGED def decorate(self, aWxEvent, source): aWxEvent = TreeEvent.decorate(self, aWxEvent, source) aWxEvent.oldItem = aWxEvent.GetOldItem() return aWxEvent class TreeSelectionChangingEvent(TreeEvent): name = 'selectionChanging' binding = wx.EVT_TREE_SEL_CHANGING id = wx.wxEVT_COMMAND_TREE_SEL_CHANGING def decorate(self, aWxEvent, source): aWxEvent = TreeEvent.decorate(self, aWxEvent, source) aWxEvent.oldItem = aWxEvent.GetOldItem() return aWxEvent class TreeKeyDownEvent(TreeEvent): name = 'keyDown' binding = wx.EVT_TREE_KEY_DOWN id = wx.wxEVT_COMMAND_TREE_KEY_DOWN def decorate(self, aWxEvent, source): aWxEvent = TreeEvent.decorate(self, aWxEvent, source) aWxEvent.keyCode = aWxEvent.GetKeyCode() keyEvent = aWxEvent.GetKeyEvent() aWxEvent.position = tuple(keyEvent.GetPosition()) aWxEvent.x = keyEvent.GetX() aWxEvent.y = keyEvent.GetY() aWxEvent.altDown = keyEvent.AltDown() aWxEvent.controlDown = keyEvent.ControlDown() aWxEvent.shiftDown = keyEvent.ShiftDown() keyEvent = None return aWxEvent TreeEvents = (#TreeSelectEvent, TreeItemActivatedEvent, TreeItemCollapsedEvent, TreeItemCollapsingEvent, TreeItemExpandedEvent, TreeItemExpandingEvent, TreeSelectionChangedEvent, TreeSelectionChangingEvent, TreeKeyDownEvent ) class TreeSpec(widget.WidgetSpec): def __init__(self) : ## events = [event.SelectEvent, ## event.ItemActivatedEvent, ## event.ItemExpandedEvent, ## event.ItemExpandingEvent, ## event.SelectionChangedEvent, ## event.SelectionChangingEvent, ## event.KeyDownEvent ## ] events = list(TreeEvents) attributes = { #'items' : { 'presence' : 'optional', 'default' : [] }, #'style' : { 'presence' : 'optional', 'default' : [], 'values' : [ 'horizontal', 'vertical' ] }, 'size' : { 'presence' : 'optional', 'default' : [ 50, 50 ] }, } widget.WidgetSpec.__init__( self, 'Tree', 'Widget', events, attributes ) class Tree(widget.Widget, wx.TreeCtrl): """ A tree. """ _spec = TreeSpec() def __init__(self, aParent, aResource) : wx.TreeCtrl.__init__( self, aParent, widget.makeNewId(aResource.id), aResource.position, aResource.size, #aResource.items, #style = border | wx.LC_REPORT | wx.CLIP_SIBLINGS, name = aResource.name ) widget.Widget.__init__(self, aParent, aResource) self._bindEvents(event.WIDGET_EVENTS + TreeEvents) # mixedCase aliases # probably need to do all the wxTreeCtrl methods # this just covers the ones in the minimalTree sample addRoot = wx.TreeCtrl.AddRoot appendItem = wx.TreeCtrl.AppendItem getChildrenCount = wx.TreeCtrl.GetChildrenCount getItemText = wx.TreeCtrl.GetItemText isExpanded = wx.TreeCtrl.IsExpanded selectItem = wx.TreeCtrl.SelectItem setItemHasChildren = wx.TreeCtrl.SetItemHasChildren # if it looks like there is a memory leak with Tree components # then Tree should have its own _dispatch method # and set aWxEvent.oldItem = None, and aWxEvent.item = None # after calling widget.Widget._dispatch import sys from PythonCard import registry registry.Registry.getInstance().register(sys.modules[__name__].Tree) PythonCard-0.8.2/configuration.py0000644000076500007650000002245710051216237016742 0ustar alexalex00000000000000""" __version__ = "$Revision: 1.23 $" __date__ = "$Date: 2003/07/21 18:45:53 $" """ import os, sys import shutil import util """ Unix os.environ['HOME'] Windows os.environ['USERPROFILE'] On Windows 2000: \Documents and Settings\%UserName% On Windows NT 4.0: \Winnt\Profiles\%UserName% On Windows 98: \Windows\Profiles\%UserName% On Windows Me: \Windows\Profiles\%UserName% On Windows 2000 after upgrading from Windows NT 4.0: \Winnt\Profiles\%UserName% fallback __file__ """ # KEA 2003-06-04 # the config dir was named .pythoncard in release 0.7 # but this caused problems on Windows and the Mac OS X Finder PYTHONCARD_CONFIG_DIR = "pythoncard_config" PYTHONCARD_CONFIG_FILE = 'pythoncard_config.txt' STC_CONFIG_FILE = 'stc-styles.cfg' # KEA 2003-06-04 # pythoncard_config.txt # for standalones # updated 2004-05-14 DEFAULT_CONFIG = { 'enableLogging':False, 'logfile':'pythoncard.log', 'logToStdout':True, 'showMessageWatcher':False, 'messageWatcherPosition':(0, 0), 'messageWatcherSize':(200, 300), 'showPropertyEditor':False, 'propertyEditorPosition':(0, 0), 'propertyEditorSize':(360, 240), 'showShell':False, 'shellPosition':(0, 0), 'shellSize':(500, 200), 'showNamespace':False, 'namespacePosition':(0, 0), 'namespaceSize':(600, 300), } #print "sys.path[0]", sys.path[0] if util.main_is_frozen(): # running standalone default_homedir = sys.path[0] homedir = default_homedir else: default_homedir = os.path.dirname(os.path.abspath(__file__)) #print "default_homedir", default_homedir for evar in ('HOME', 'USERPROFILE', 'TMP'): try: path = os.environ[evar] if os.path.isdir(path): homedir = os.path.join(path, PYTHONCARD_CONFIG_DIR) try: # create the config directory if it # doesn't already exist if not os.path.isdir(homedir): os.mkdir(homedir) # if we were able to create the dir we're done break except: print "unable to create config directory", homedir except: homedir = os.path.join(default_homedir, PYTHONCARD_CONFIG_DIR) #print "homedir", homedir # should copying the config files be within the block above? try: # make copies of the default configs # for the user to modify for file in (PYTHONCARD_CONFIG_FILE, STC_CONFIG_FILE): path = os.path.join(homedir, file) if not os.path.exists(path): shutil.copy2(os.path.join(default_homedir, file), path) except: print "unable to copy config files" try: configDict = util.readAndEvalFile(os.path.join(homedir, PYTHONCARD_CONFIG_FILE)) except: try: configDict = util.readAndEvalFile(os.path.join(default_homedir, PYTHONCARD_CONFIG_FILE)) except: configDict = DEFAULT_CONFIG def getStyleConfigPath(): configfile = os.path.join(homedir, STC_CONFIG_FILE) if not os.path.exists(configfile): configfile = os.path.join(default_homedir, STC_CONFIG_FILE) return configfile class Configuration : """ Provides access to PythonCard's runtime configuration options. """ class ConfigurationImpl : def __init__( self ) : # KEA 2001-11-17 # change to import on configs """ basePath = os.path.dirname( os.path.abspath( __file__ ) ) path = os.path.join( basePath, PYTHONCARD_USER_CONFIG_FILE ) # KEA 2001-08-09 # first look in the directory of the program we're going to run # can't do this yet, given how the loader runs right now # then look for a user config file, then finally use the default #if os.path.exists(PYTHONCARD_USER_CONFIG_FILE): # self._resource = resource.ResourceFile( PYTHONCARD_USER_CONFIG_FILE ).getResource() if os.path.exists(path): #print "using", path self._resource = resource.ResourceFile( path ).getResource() #print self._resource else: path = os.path.join( basePath, PYTHONCARD_CONFIG_FILE ) self._resource = resource.ResourceFile( path ).getResource() """ #self._resource = resource.Resource(configDict) self._resource = configDict def setOption( self, name, value ) : self._resource[name] = value #setattr( self._resource, name, value ) #eval( 'self._resource.' + name + ' = ' + value ) def getOption(self, name): return self._resource.get(name, None) #def getGuiToolkitName( self ) : # return self._resource.gui def getLogFileName( self ) : # KEA 2001-12-13 # return the application path for the log file directory # unless the user supplied filename contains a directory path = os.path.split(self.getOption('logfile'))[0] if path == '': return os.path.abspath( \ os.path.join( \ os.path.dirname(sys.argv[0]), \ self.getOption('logfile'))) else: return os.path.abspath(self.getOption('logfile')) #return self._resource.logfile # KEA 2001-09-10 # there should probably be generic method for turning Resources back into # dictionaries def saveConfig(self): global homedir #listX = self._resource.__dict__.keys() listX = self._resource.keys() listX.sort() dictStr = "{\n" for k in listX: if isinstance(self._resource[k], str): dictStr += "'%s':'%s',\n" % (k, self._resource[k]) else: dictStr += "'%s':%s,\n" % (k, self._resource[k]) """ if isinstance(self._resource.__dict__[k], str): dictStr += "'%s':'%s',\n" % (k, self._resource.__dict__[k]) else: dictStr += "'%s':%s,\n" % (k, self._resource.__dict__[k]) """ dictStr += "}\n" try: path = os.path.join(homedir, PYTHONCARD_CONFIG_FILE) f = open(path, 'w') f.write(dictStr) f.close() except: pass _impl = None def __init__( self ) : if Configuration._impl is None : Configuration._impl = self.ConfigurationImpl() def setOption( self, name, value ) : Configuration._impl.setOption( name, value ) def getOption( self, name ) : return Configuration._impl.getOption( name ) #def getGuiToolkitName( self ) : # return Configuration._impl.getGuiToolkitName() def getLogFileName( self ) : return Configuration._impl.getLogFileName() def saveConfig(self): Configuration._impl.saveConfig() config = Configuration() def getOption(name): return config.getOption(name) def setOption(name, value): config.setOption(name, value) def getLogFileName(): return config.getLogFileName() def saveConfig(): config.saveConfig() def hasOption( aOption ) : for arg in sys.argv : if arg == aOption : return 1 return 0 def configOptions(): # KEA 2001-08-09 # this needs to be reworked, the old implementation overwrites whatever # might be in the .config.py files # also this implementation can only turn on an option, not turn it off if hasOption('-p'): setOption('showPropertyEditor', 1) if hasOption('-m'): setOption('showMessageWatcher', 1) if hasOption('-l'): setOption('enableLogging', 1) if hasOption('-s'): setOption('showShell', 1) if hasOption('-n'): setOption('showNamespace', 1) if hasOption('-d'): setOption('showDebugMenu', 1) def saveUserConfiguration(app): """ Given an application instance, save the current settings of the runtime windows. """ if app.mw is not None: setOption('messageWatcherPosition', app.mw.GetPositionTuple()) setOption('messageWatcherSize', app.mw.GetSizeTuple()) setOption('showMessageWatcher', False) if app.namespaceFrame is not None: setOption('namespacePosition', app.namespaceFrame.GetPositionTuple()) setOption('namespaceSize', app.namespaceFrame.GetSizeTuple()) setOption('showNamespace', False) if app.pw is not None: setOption('propertyEditorPosition', app.pw.GetPositionTuple()) setOption('propertyEditorSize', app.pw.GetSizeTuple()) setOption('showPropertyEditor', False) if app.shellFrame is not None: setOption('shellPosition', app.shellFrame.GetPositionTuple()) setOption('shellSize', app.shellFrame.GetSizeTuple()) setOption('showShell', False) setOption('enableLogging', False) saveConfig() if __name__ == '__main__' : __file__ = 'config.py' print 'config.py - Unit Test' setOption( 'myOption', 'myValue' ) print getOption( 'myOption' ) print 'showMessageWatcher=', getOption( 'showMessageWatcher' ) setOption( 'showMessageWatcher', 1 ) print 'showMessageWatcher=', getOption( 'showMessageWatcher' ) PythonCard-0.8.2/debug.py0000644000076500007650000006257310353545550015174 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.135 $" __date__ = "$Date: 2005/12/25 16:40:08 $" """ import wx from wx import stc import STCStyleEditor import about import event import dialog import font import registry import pprint import configuration import os, sys import webbrowser from wx import py as PyCrust from wx.py.shell import Shell from wx.py.shell import ShellFacade from wx.py.filling import Filling from wx.py import introspect TOOL_WINDOW_STYLE = wx.DEFAULT_FRAME_STYLE | wx.FRAME_NO_TASKBAR PYTHONCARD_DEBUG_MENU_RESOURCE_FILE = 'debugmenu.rsrc.py' DEBUG_MENU_REDIRECT = 'Redirect stdout to Shell' DEBUG_MENU_ONLINE_HOME = 'PythonCard Home Page' DEBUG_MENU_ONLINE_HELP = 'Online Documentation' class PythonCardShellFacade(ShellFacade): def _getAttributeNames(self): names = ShellFacade._getAttributeNames(self) names.append('autoCompleteWxMethods') names.sort() return names class PythonCardShell(Shell): def setLocalShell(self): """Add 'shell' to locals as reference to ShellFacade instance.""" self.interp.locals['shell'] = PythonCardShellFacade(other=self) self.autoCompleteWxMethods = True def autoCompleteShow(self, command): """Display auto-completion popup list.""" names = self.interp.getAutoCompleteList(command, includeMagic=self.autoCompleteIncludeMagic, includeSingle=self.autoCompleteIncludeSingle, includeDouble=self.autoCompleteIncludeDouble) if not self.autoCompleteWxMethods: root = introspect.getRoot(command, terminator='.') try: # we have to use locals, right? #print root object = eval(root, self.interp.locals) #print object # only filter attribute names of wxPython objects if isinstance(object, wx.Object): names.remove('this') names.remove('thisown') names = [name for name in names if name[0] not in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'] except: # what is the proper thing to do here? pass if names: options = ' '.join(names) offset = 0 self.AutoCompShow(offset, options) class MessageWatcher(wx.Frame, event.EventListener): def __init__(self, parent, ID, title, pos, size, parentApp): wx.Frame.__init__(self, parent, ID, title, pos, size, TOOL_WINDOW_STYLE ) panel = wx.Panel(self, -1) self.parentApp = parentApp wx.EVT_CLOSE(self, self.onCloseMe) wx.EVT_WINDOW_DESTROY(self, self.onDestroyMe) sizer1 = wx.BoxSizer(wx.VERTICAL) sizer2 = wx.BoxSizer(wx.HORIZONTAL) self.hideTimers = wx.CheckBox(panel, -1, 'Hide timers', wx.DefaultPosition, wx.DefaultSize, wx.NO_BORDER) #self.hideTimers.SetValue(1) sizer2.Add(self.hideTimers, 0, wx.LEFT | wx.RIGHT | wx.BOTTOM, 5) sizer2.Add((5, 5), 1) # spacer self.hideUnused = wx.CheckBox(panel, -1, 'Hide unused (#)', wx.DefaultPosition, wx.DefaultSize, wx.NO_BORDER) # KEA 2004-04-10 # default to showing all events # otherwise unused events will be missed at startup # self.hideUnused.SetValue(1) sizer2.Add(self.hideUnused, 0, wx.LEFT | wx.BOTTOM, 5) sizer1.Add(sizer2, 0, wx.EXPAND) self.maxSizeMsgHistory = 29000 #self.maxSizeMsgHistory = 0 # Turn off # eventually, the font size should be settable in the user config self.msgHistory = stc.StyledTextCtrl(panel, -1, size=(100, 60)) self.msgHistory.SetReadOnly(True) if wx.Platform == '__WXMSW__': self.msgHistory.StyleSetSpec(stc.STC_STYLE_DEFAULT, "face:Arial,size:9") else: self.msgHistory.StyleSetSize(stc.STC_STYLE_DEFAULT, wx.NORMAL_FONT.GetPointSize()) # KEA 2005-12-25 # change the lexer to Python # and denote unused messages as comments (e.g. #mouseUp self.msgHistory.StyleSetSpec(stc.STC_P_COMMENTLINE, "fore:#7F7F7F") self.msgHistory.SetLexer(stc.STC_LEX_PYTHON) self.msgHistory.SetUseHorizontalScrollBar(0) self.msgHistory.SetMarginWidth(1,0) self.msgHistory.SetUndoCollection(0) sizer1.Add(self.msgHistory, 1, wx.EXPAND) sizer1.Fit(panel) sizer1.SetSizeHints(self) panel.SetSizer(sizer1) panel.SetAutoLayout(1) panel.Layout() # and now for a hack-fest if wx.Platform == '__WXMSW__': self.SetSize(size) event.EventLog.getInstance().addEventListener( self ) def eventOccurred(self, eventAdapter): # new way hack to stay compatible with one arg notifyEventListeners eventName, sourceName, used = eventAdapter if eventName == event.IdleEvent.name: return if used: eventText = eventName + ' : ' + sourceName else: eventText = '# ' + eventName + ' : ' + sourceName # show timer events? if (eventName == 'timer' and self.hideTimers.GetValue()): return if used or (not self.hideUnused.GetValue()): self.msgHistory.SetReadOnly(False) if self.maxSizeMsgHistory and self.msgHistory.GetLength() > self.maxSizeMsgHistory: # delete many lines at once to reduce overhead text = self.msgHistory.GetText() endDel = text.index('\n', self.maxSizeMsgHistory / 10) + 1 self.msgHistory.SetTargetStart(0) self.msgHistory.SetTargetEnd(endDel) self.msgHistory.ReplaceTarget("") self.msgHistory.GotoPos(self.msgHistory.GetLength()) self.msgHistory.AddText(eventText + '\n') self.msgHistory.GotoPos(self.msgHistory.GetLength()) self.msgHistory.SetReadOnly(True) def onCloseMe(self, evt): # KEA fixed showMessageWatcher in model.py # however, the fix probably needs more work self.Hide() def onDestroyMe(self, evt): # KEA 2004-05-04 # if we're in the midst of a shutdown # then the Message Watcher needs to be removed from the # event listeners so that we don't end up trying to access # a dead object event.EventLog.getInstance().removeEventListener( self ) evt.Skip() position = property(wx.Frame.GetPositionTuple, wx.Frame.SetPosition) size = property(wx.Frame.GetSizeTuple, wx.Frame.SetSize) visible = property(wx.Frame.IsShown, wx.Frame.Show) # KEA this is a load of dingos' kidneys and needs to be rewritten class PropertyEditor(wx.Frame, event.ChangeListener): def __init__(self, parent, ID, title, pos, size, parentApp ): wx.Frame.__init__(self, parent, ID, title, pos, size, TOOL_WINDOW_STYLE) panel = wx.Panel(self, -1) self.parentApp = parentApp bg = self.parentApp.getCurrentBackground() bg.components.addChangeEventListener(self) self.checkItems = ['enabled', 'visible', 'editable', 'checked', 'default', 'rules', 'labels', 'ticks', 'horizontalScrollbar'] self.popItems = ['layout', 'border', 'style', 'alignment', 'stringSelection'] self.cantModify = ['id', 'name', 'alignment', 'layout', 'style', 'border', 'horizontalScrollbar', \ 'min', 'max', 'columns', 'rules', 'labels', 'ticks'] wx.EVT_CLOSE(self, self.onCloseMe) wx.StaticText(panel, -1, 'Name : Class', wx.Point(3, 3)) wx.StaticText(panel, -1, 'Properties', wx.Point(228, 3)) self.wComponentList = wx.ListBox(panel, -1, wx.Point(0, 20), wx.Size(200, 100)) self.wPropertyList = wx.ListBox(panel, -1, wx.Point(225, 20), wx.Size(125, 100)) self.wName = wx.StaticText(panel, -1, 'name:', wx.Point(3, 135), wx.Size(90, -1), style = wx.ALIGN_RIGHT | wx.ST_NO_AUTORESIZE) self.wField = wx.TextCtrl(panel, -1, '', wx.Point(100, 130), wx.Size(180, -1)) self.wColor = wx.Button(panel, -1, 'Color...', wx.Point(290, 130), wx.Size(50, -1)) self.wColor.Show(0) self.wFont = wx.Button(panel, -1, 'Font...', wx.Point(290, 130), wx.Size(50, -1)) self.wFont.Show(0) self.wTextArea = wx.TextCtrl(panel, -1, '', wx.Point(100, 130), wx.Size(250, 50), style = wx.TE_MULTILINE) self.wTextArea.Show(0) self.wChecked = wx.CheckBox(panel, -1, '', wx.Point(100, 132), wx.DefaultSize, wx.NO_BORDER) self.wChecked.Show(0) self.wPop = wx.Choice(panel, -1, wx.Point(100, 130), wx.DefaultSize, []) self.wPop.Show(0) self.wCopy = wx.Button(panel, -1, 'Copy resource to clipboard', wx.Point(5, 185), wx.Size(150, -1)) self.wCopy.Show(0) self.wUpdate = wx.Button(panel, -1, 'Update', wx.Point(265, 185)) self.wUpdate.Show(0) self.editItems = [self.wField, self.wColor, self.wFont, self.wTextArea, self.wChecked, self.wPop] # KEA 2001-08-14 # this was causing an assertion error with the hybrid wxPython #self.wComponentList.SetSelection(0) if self.wComponentList.GetStringSelection() == "": wClass = "" else: wName, wClass = self.wComponentList.GetStringSelection().split(" : ") self.setValidProps(wClass) wx.EVT_LISTBOX(self, self.wComponentList.GetId(), self.onSelectComponentListEvent) wx.EVT_LISTBOX(self, self.wPropertyList.GetId(), self.onSelectPropertyListEvent) wx.EVT_BUTTON(self, self.wColor.GetId(), self.onSelectColor) wx.EVT_BUTTON(self, self.wFont.GetId(), self.onSelectFont) wx.EVT_BUTTON(self, self.wCopy.GetId(), self.onSelectCopy) wx.EVT_BUTTON(self, self.wUpdate.GetId(), self.onSelectUpdate) # and now for a hack-fest if wx.Platform == '__WXMSW__': self.SetSize(size) def addWidgetToComponentsList(self, widget): wName = widget.name wClass = widget.__class__.__name__ self.wComponentList.Append(wName + " : " + wClass) def deleteWidgetFromComponentsList(self, wName, wClass): i = self.wComponentList.GetSelection() j = self.wComponentList.FindString(wName + " : " + wClass) if i == -1 or i != j: if j != -1: self.wComponentList.Delete(j) else: if j > 0: self.wComponentList.SetSelection(j - 1) if j != -1: self.wComponentList.Delete(j) if self.wComponentList.GetSelection() == -1: self.setValidProps("") self.hideAllBut(self.wField) self.wUpdate.Show(0) self.wCopy.Show(0) else: wName, wClass = self.wComponentList.GetStringSelection().split(" : ") # deselect the name from properties list self.setValidProps(wClass) propName = self.wPropertyList.GetStringSelection() if propName == "": propName = "name" self.wPropertyList.SetStringSelection("name") self.displayProperty(wName, wClass, propName) def selectComponentsList(self, wName, wClass): self.wComponentList.SetStringSelection(wName + " : " + wClass) self.setValidProps(wClass) propName = self.wPropertyList.GetStringSelection() #print propName if propName == "": propName = "name" self.wPropertyList.SetStringSelection("name") self.displayProperty(wName, wClass, propName) def changed(self, evt): comp = self.parentApp.getCurrentBackground().components wName, wClass = evt.getOldValue().split(",") if wName in comp: # new item added self.addWidgetToComponentsList(comp[wName]) else: # item deleted self.deleteWidgetFromComponentsList(wName, wClass) def onSelectCopy(self, evt): wName, wClass = self.wComponentList.GetStringSelection().split(" : ") # what needs to happen here is to have a method for the Widget class that # will provide a valid resource description, each subclass of widget would # override the method to deal with their specific resource attributes # the Widget class should provide some ordering so that 'type', # 'position', 'size' comes before less commonly used items, the actual # ordering could just be defined in a list, so it is easy to change # also, if the current values match the defaults for a widget attribute # then that attribute should not be provided as part of the output print "this is just a placeholder method right now," print "the resource is not actually copied to the clipboard yet" pprint.pprint(self.parentApp.getCurrentBackground().components[wName]) # KEA 2002-08-22 # this should be updated to match the resourceEditor Property Editor # or the Property Editor code should be changed so that the same module # could be used at runtime? def onSelectUpdate(self, evt): wName, wClass = self.wComponentList.GetStringSelection().split(" : ") propName = self.wPropertyList.GetStringSelection() if propName not in self.cantModify: if propName in self.checkItems: value = self.wChecked.GetValue() elif propName in self.popItems: value = self.wPop.GetStringSelection() elif wClass == 'TextArea' and propName == 'text': value = self.wTextArea.GetValue() else: value = self.wField.GetValue() if propName not in ['label', 'text', 'toolTip']: try: value = eval(value) except: pass widget = self.parentApp.getCurrentBackground().components[wName] if propName == 'size': width, height = value if wClass not in ['BitmapCanvas', 'HtmlWindow']: bestWidth, bestHeight = widget.GetBestSize() if width == -1: width = bestWidth if height == -1: height = bestHeight widget.size = (width, height) else: setattr(widget, propName, value) def onSelectColor(self, evt): result = dialog.colorDialog(self) if result.accepted: self.wField.SetValue(str(result.color)) def onSelectFont(self, evt): wName, wClass = self.wComponentList.GetStringSelection().split(" : ") widget = self.parentApp.getCurrentBackground().components[wName] f = widget.font if f is None: desc = font.fontDescription(widget.GetFont()) f = font.Font(desc) result = dialog.fontDialog(self, f) if result.accepted: #color = dlg.getColor() f = result.font self.wField.SetValue("%s" % f) def setValidProps(self, wClass): oldProp = self.wPropertyList.GetStringSelection() if wClass == "": self.wPropertyList.Clear() else: klass = registry.Registry.getInstance().getComponentClass(wClass) props = klass._spec.getAttributes().keys() props.sort() self.wPropertyList.Clear() self.wPropertyList.InsertItems(props, 0) if oldProp in props: self.wPropertyList.SetStringSelection(oldProp) def hideAllBut(self, widget): for w in self.editItems: if widget.GetId() != w.GetId(): w.Show(0) def displayProperty(self, wName, wClass, propName): self.wName.SetLabel(propName + ":") widget = self.parentApp.getCurrentBackground().components[wName] if propName in ['label', 'text', 'toolTip'] or propName in self.checkItems: value = getattr(widget, propName) else: value = str(getattr(widget, propName)) if propName in self.checkItems: self.hideAllBut(self.wChecked) self.wChecked.Show(1) self.wChecked.SetValue(int(value)) elif propName in self.popItems: self.hideAllBut(self.wPop) self.wPop.Show(1) self.wPop.Clear() for v in widget._spec.getAttributes()[propName].values: self.wPop.Append(v) self.wPop.SetStringSelection(value) elif wClass == 'TextArea' and propName == 'text': self.hideAllBut(self.wTextArea) self.wTextArea.Show(1) self.wTextArea.SetValue(value) else: self.hideAllBut(self.wField) self.wField.Show(1) if propName == 'foregroundColor' or propName == 'backgroundColor': self.wColor.Show(1) elif propName == 'font': self.wFont.Show(1) self.wName.SetLabel(propName + ":") if propName == 'size': width, height = getattr(widget, propName) if wClass not in ['BitmapCanvas', 'HtmlWindow']: bestWidth, bestHeight = widget.GetBestSize() if width == bestWidth: width = -1 if height == bestHeight: height = -1 size = (width, height) value = str(size) self.wField.SetValue(value) # this should only display if the attribute is settable # so name, alignment, and others are read-only self.wUpdate.Show((propName not in self.cantModify) and not (propName == 'items' and wClass == 'RadioGroup')) def onSelectComponentListEvent(self, evt): wName, wClass = evt.GetString().split(" : ") # change the wPropertiesList to only show relevant properties # either display the name by default or try and preserve the # wPropertiesList selection and display that item, so for example # you could look at size for all widgets, simply by going up and down # the components list self.setValidProps(wClass) propName = self.wPropertyList.GetStringSelection() if propName == "": propName = "name" self.wPropertyList.SetStringSelection("name") self.displayProperty(wName, wClass, propName) def onSelectPropertyListEvent(self, evt): propName = evt.GetString() wName, wClass = self.wComponentList.GetStringSelection().split(" : ") if wName != "": self.displayProperty(wName, wClass, propName) def clearComponentsList(self): self.wComponentList.Clear() def displayComponents(self, components): for c in components.order: self.addWidgetToComponentsList(components[c]) def onCloseMe(self, evt): self.Show(0) position = property(wx.Frame.GetPositionTuple, wx.Frame.SetPosition) size = property(wx.Frame.GetSizeTuple, wx.Frame.SetSize) visible = property(wx.Frame.IsShown, wx.Frame.Show) class PyCrustFrame(wx.Frame): def __init__(self, parent, ID, title, pos, size, parentApp): wx.Frame.__init__(self, parent, ID, title, pos, size, TOOL_WINDOW_STYLE ) parentApp.shell = PythonCardShell(self, -1) configfile = configuration.getStyleConfigPath() if os.path.exists(configfile): STCStyleEditor.initSTC(parentApp.shell, configfile, 'python') # KEA this is temporary until we decide what reference # we want here parentApp.shell.interp.locals['pcapp'] = parentApp self.parentApp = parentApp wx.EVT_CLOSE(self, self.onCloseMe) # and now for a hack-fest if wx.Platform == '__WXMSW__': self.SetSize(size) def onCloseMe(self, evt): self.Show(0) position = property(wx.Frame.GetPositionTuple, wx.Frame.SetPosition) size = property(wx.Frame.GetSizeTuple, wx.Frame.SetSize) visible = property(wx.Frame.IsShown, wx.Frame.Show) class PyCrustNamespaceFrame(wx.Frame): def __init__(self, parent, ID, title, pos, size, parentApp): wx.Frame.__init__(self, parent, ID, title, pos, size, TOOL_WINDOW_STYLE) parentApp.namespace = PyCrust.filling.Filling(parent = self, \ rootObject = parentApp.shell.interp.locals, \ rootLabel = 'Shell Namespace', rootIsNamespace = 1) self.parentApp = parentApp wx.EVT_CLOSE(self, self.onCloseMe) # and now for a hack-fest if wx.Platform == '__WXMSW__': self.SetSize(size) def onCloseMe(self, evt): self.Show(0) position = property(wx.Frame.GetPositionTuple, wx.Frame.SetPosition) size = property(wx.Frame.GetSizeTuple, wx.Frame.SetSize) visible = property(wx.Frame.IsShown, wx.Frame.Show) def raiseAndShow(window): if window.IsIconized(): window.Iconize(False) window.Show() window.Raise() class DebugMenu: def __init__(self, parentApp): self.parentApp = parentApp self.menuIds = {DEBUG_MENU_REDIRECT:wx.NewId(), DEBUG_MENU_ONLINE_HELP:wx.NewId(), DEBUG_MENU_ONLINE_HOME:wx.NewId()} # decided not to use a resource in order to avoid getting the Debug # menu caught up in the PythonCard event model #basePath = os.path.dirname(os.path.abspath( __file__)) #path = os.path.join(basePath, PYTHONCARD_DEBUG_MENU_RESOURCE_FILE) #self._resource = ResourceFile(path).getResource() def createMenu(self, bg): menu = wx.Menu() menu.Append(wx.NewId(), '&Message Watcher') menu.Append(wx.NewId(), '&Namespace Viewer') menu.Append(wx.NewId(), '&Property Editor') menu.Append(wx.NewId(), '&Shell') menu.AppendSeparator() id = self.menuIds[DEBUG_MENU_REDIRECT] #menu.Append(id, "&" + DEBUG_MENU_REDIRECT, checkable = 1) menu.Append(id, "&" + DEBUG_MENU_REDIRECT, "", 1) # if we want to have a config option set redirect, this is the # place to do it menu.Append(wx.NewId(), 'Save &Configuration') menu.AppendSeparator() id = self.menuIds[DEBUG_MENU_ONLINE_HOME] menu.Append(wx.NewId(), DEBUG_MENU_ONLINE_HOME) id = self.menuIds[DEBUG_MENU_ONLINE_HELP] menu.Append(wx.NewId(), DEBUG_MENU_ONLINE_HELP) menu.AppendSeparator() menu.Append(wx.NewId(), '&About PythonCard...') menubar = bg.GetMenuBar() if menubar is None: menubar = wx.MenuBar() bg.SetMenuBar(menubar) menubar.Append(menu, 'Debug') def bindMenuEvents(self, bg): # it appears that at the time bindMenuEvent and createMenu are # called from Background, the _iterator doesn't exist yet?! # so I had to pass in the current background menubar = bg.GetMenuBar() id = menubar.FindMenuItem('Debug', 'About PythonCard...') wx.EVT_MENU(bg, id, self.doAboutPythonCard) id = menubar.FindMenuItem('Debug', 'Message Watcher') wx.EVT_MENU(bg, id, self.toggleMessageWatcher) id = menubar.FindMenuItem('Debug', 'Namespace Viewer') wx.EVT_MENU(bg, id, self.toggleNamespaceViewer) id = menubar.FindMenuItem('Debug', 'Property Editor') wx.EVT_MENU(bg, id, self.togglePropertyEditor) id = menubar.FindMenuItem('Debug', 'Shell') wx.EVT_MENU(bg, id, self.toggleShell) id = menubar.FindMenuItem('Debug', DEBUG_MENU_REDIRECT) wx.EVT_MENU(bg, id, self.toggleShellRedirect) id = menubar.FindMenuItem('Debug', 'Save Configuration') wx.EVT_MENU(bg, id, self.doSaveUserConfiguration) id = menubar.FindMenuItem('Debug', DEBUG_MENU_ONLINE_HOME) wx.EVT_MENU(bg, id, self.onlineHomePage) id = menubar.FindMenuItem('Debug', DEBUG_MENU_ONLINE_HELP) wx.EVT_MENU(bg, id, self.onlineDocumentation) def toggleMessageWatcher(self, evt): raiseAndShow(self.parentApp.mw) def toggleNamespaceViewer(self, evt): raiseAndShow(self.parentApp.namespaceFrame) def togglePropertyEditor(self, evt): raiseAndShow(self.parentApp.pw) def toggleShell(self, evt): raiseAndShow(self.parentApp.shellFrame) def toggleShellRedirect(self, evt): menubar = self.parentApp.getCurrentBackground().GetMenuBar() #id = menubar.FindMenuItem('Debug', 'Redirect stdout to Shell') id = self.menuIds[DEBUG_MENU_REDIRECT] # I don't know why, but this appears to be returning the opposite # of what it should return, so if IsChecked returns 1 (true) the # menu item isn't really checked checked = menubar.IsChecked(id) #print id, menubar.GetLabel(id), checked menubar.Check(id, checked) self.parentApp.shell.redirectStdout(checked) def doSaveUserConfiguration(self, evt): configuration.saveUserConfiguration(self.parentApp) def onlineHomePage(self, evt): url = 'http://pythoncard.sourceforge.net/' webbrowser.open(url, 1, 1) def onlineDocumentation(self, evt): url = 'http://pythoncard.sourceforge.net/documentation.html' webbrowser.open(url, 1, 1) # the references to self will have to be modified depending on where this # method ends up going. we do need a parent for the dialog def doAboutPythonCard(self, evt): about.aboutPythonCardDialog(self.parentApp.getCurrentBackground()) PythonCard-0.8.2/dialog.py0000644000076500007650000000325010125310304015310 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.39 $" __date__ = "$Date: 2004/09/25 15:37:40 $" """ import wx from wx.lib import dialogs from font import Font, fontDescription DialogResults = dialogs.DialogResults findDialog = dialogs.findDialog colorDialog = dialogs.colorDialog def fontDialog(parent, aFont=None): if aFont is not None: aFont = aFont._getFont() result = dialogs.fontDialog(parent, font=aFont) if result.accepted: fontData = result.fontData result.color = result.fontData.GetColour().Get() fontWx = result.fontData.GetChosenFont() result.fontDescription = fontDescription(fontWx) fontWx = None result.font = Font(result.fontDescription) return result def passwordTextEntryDialog(parent=None, message='', title='', defaultText='', style=wx.TE_PASSWORD | wx.OK | wx.CANCEL): return dialogs.textEntryDialog(parent, message, title, defaultText, style) def multilineTextEntryDialog(parent=None, message='', title='', defaultText='', style=wx.TE_MULTILINE | wx.OK | wx.CANCEL): result = dialogs.textEntryDialog(parent, message, title, defaultText, style) # workaround for Mac OS X result.text = '\n'.join(result.text.splitlines()) return result textEntryDialog = dialogs.textEntryDialog messageDialog = dialogs.messageDialog alertDialog = dialogs.alertDialog scrolledMessageDialog = dialogs.scrolledMessageDialog fileDialog = dialogs.fileDialog openFileDialog = dialogs.openFileDialog saveFileDialog = dialogs.saveFileDialog directoryDialog = dialogs.directoryDialog singleChoiceDialog = dialogs.singleChoiceDialog multipleChoiceDialog = dialogs.multipleChoiceDialog PythonCard-0.8.2/docs/0000755000076500007650000000000010434046770014447 5ustar alexalex00000000000000PythonCard-0.8.2/docs/changelog.txt0000644000076500007650000015215710433161724017146 0ustar alexalex00000000000000Changelog for PythonCard SPECIAL NOTE: at least as of wxPython 2.5.2.8 you must still use a GTK1 build of wxWidgets/wxPython on Linux in order for component dragging to work in the resourceEditor. You can track the following bug report to be notified when this issue is fixed. http://sourceforge.net/tracker/?func=detail&aid=1024777&group_id=9863&atid=109863 Release 0.8.2 2006-05-18 added minimized and maximized attributes to Background class created documentation.py module to hold code previously in widgets.py for automatically generating component and background docs added getTextExtent and getFullTextExtent methods to BitmapCanvas revised internationalResourceName to support platform-specific resources added UK <-> US to conversions.py and simplified SOAP.py module check updated turtle.py and bitmapcanvas.py component to force update on Mac renamed samples.py to samples.pyw added work-in-progress version of multiresourceEditor (tools/resourceEditor/multiresourceEditor) renamed to layoutEditor support customizable window styles in backgroundInfo of resourceEditor added convenience wrappers for pop-up menus, multiple check-box dialogs, multiple button dialogs (helpful.py and samples/helpfulWrappers) added sample for sudoku solver/helper (samples/sudoku) replaced StringType with StringTypes to handle Unicode better Major update standaloneBuilder, including support for py2exe allow for Python2.4 or Python 2.5 on Mac Release 0.8.1 2004-10-19 added fileMode, fillColor, logicalCopyMode attributes to BitmapCanvas removed setFillMode, setFillColor, setCopyMode methods the resourceEditor property editor now updates attributes automatically but you can still click the Update button (this is mostly useful on the Mac when editing text) resourceEditor (resourceOutput module) no longer saves background position in resource files added work-in-progress version of tabbed code editor (tools/oneEditor) renamed ver to VERSION_STRING in __version__.py and added VERSION tuple added horizontalScrollbar flag to TextArea component added appendText ScrollLines workaround to TextArea component on Windows added lexicon and pattern files downloading to life sample added time alias to util.py to use time.time() on Windows, time.clock() on *nix added gravity sample minimum requirement changed to wxPython 2.5.2.8 added passwordTextEntryDialog and multilineTextEntryDialog to dialog.py many minor bug fixes reworked dialogs sample interface added Show Grid Lines option to resourceEditor added cursor key support in resourceEditor for moving components added FloatCanvas component and sample added Notebook component, PageBackground, and testNotebook sample added relativePath to util.py added colorFromString to util.py added main_is_frozen workaround for bundlebuilder standalones on Mac added csv support to dbBrowser sample Release 0.8 2004-08-18 getCommandLineArgs moved to util.py runOptionsDialog moved to templates.dialogs.runOptionsDialog.py dialog.py is now a thin wrapper around wx.lib.dialogs.py all dialog results now use DialogResults class instead of dictionary e.g. result.accepted instead of result['accepted'] see dialogs sample and other samples and tools for examples of change menuDialog changed to insert in place, added default naming based on label changed Calendar component to CAL_SEQUENTIAL_MONTH_SELECTION style added mp3player sample switched to using wx.lib.statbmp.GenStaticBitmap on GTK for Image component Created unit-test facility. defined ignore files for files that should not be imported to check for tests. runAllTests.py runs all tests from the current working directory down, minus ignored. added sample unit test class, in UnitTestSample.py Added two unit tests for LSystem. Pulled out drawAbstractFractal() to allow this. Changed console_server.py and minimalTest.py so that importing the file didn't run code. updated childWindow resource loading to better support standalones refactored resourceEditor to query component spec for default set of attributes in on_componentAdd_command refactored resourceEditor to dynamically build list of available Components instead of using static list converted turtle sample to use Python modules for the script examples fixed resourceEditor so it saves on Run and validates component names changed all occurances of stack in resources to application removed Stack class the application is now the "parent" of the main Background changed __init__ for Background and CustomDialog so they don't take a stack parameter changed childWindow function self.stack.app references are now self.application added lsystem sample added ToggleButton component fixed enableCommand and disableCommand for components & menus added ataxx sample codeEditor now persists all View menu settings added reversi (Othello) sample made spirographInteractive its own sample added restore (inverse of minimize) background window event added twistedEchoClient sample added twistedModel.py module to hold TwistedApplication added redraw method to Widget to simplify immediate redraws added event.target workaround for timer events moved getStyleConfigPath to configuration module renamed stc-styles.rc.cfg to stc-styles.cfg removed unneeded WXMAC code blocks removed get/set methods for position, size, foregroundColor, backgroundColor in Background and CustomDialog and replaced with properties added removeListener method to EventQueue to enable the clean removal of the Message Watcher window when closing app changed codeEditor file dialog default from *.py to *.* fixed Windows border offset in resourceEditor by querying SystemSettings.GetMetric added Bruce Eckel's moderator sample updated Choice, ComboBox, List, RadioGroup to use 'selection' and 'stringSelection' attributes instead of mixed-capability 'selected' and 'selection' attribute see migration guide for more info added templates sub-package to hold common backgrounds and dialogs updated all samples and tools to use lowercase skip() removed CamelCase methods from BitmapCanvas (Draw -> draw) changed Component __init__ init underlying control before Widget class added makeNewId function removed postInit event binding is now part of component init removed getId() from Widget, using GetId() calls in framework *ROWLAND describe binding and spec changes here* added SetValue workaround for TextArea component on Windows removed dispatch.py and moved classes to event.py SetFocus -> setFocus Hide/Show -> visible attribute added visible, position, and size properties to tool windows added Tom Jacobs' montyhall sample added about.py module added About PythonCard dialog to codeEditor and resourceEditor added singleton.py module used by configuration.py, log.py, registry.py, and resource.py removed Ptr classes from isinstance checks removed old addresses052.py sample renamed res.py to resource.py replaced the use of __getattr__ and __setattr__ in Font, StatusBar, and Widget classes with property(), so those classes and components no longer have restrictive attribute access this change also eliminated the need for the _createAttributes and _getAttributeNames methods changed to wx.Frame for runtime tools on Windows to make them the same across platforms removed conditional code check PyCrust since PyCrust is a standard part of wxPython now added createStatusBar method to Background and CustomDialog classes so applications can override that method if they want to use a more complex StatusBar made statusbar.StatusBar a direct subclass of wx.StatusBar renamed PythonCardApp to Application refactored config.py to configuration.py removed PythonCardObject and all references to it removed ObjectMap and all references to it removed ObjectLookup and all references to it changed on_openBackground to on_initialize renamed pom.py to component.py added test.py added timer.py module and simple Timer wrapper added deactivate event to Background updated sound.py to use wx.Sound changed model.py to require Python >= 2.3 and wxPython >= 2.5 converted DC methods to use tuples instead of separate x, y and width, height args changed wx.NULL to None switched to wx package from wxPython import changed to import wx changed wx.wx style prefixes to wx. except for wx.wxEVT constants changed wx.wxHtmlEasyPrinting to wx.html.HtmlEasyPrinting changed default on Message Watcher to show unused events PythonCardPrototype package renamed to PythonCard all references to Prototype updated in source and docs Release 0.7.3.1 2004-04-09 added _getId back to widget.py menu.py workaround for FindMenuItem and GTK exception updated MANIFEST.in and setup.py for PyPI/distutils added testevents sample for debugging cross-platform event order Release 0.7.3 2004-04-03 changed py2exe scripts for version 0.5 syntax dropped support of PyCrust in wxPython 2.4.0.7 and earlier added check to avoid unneeded widget initialization added TextArea workaround for GetValue on the Mac McPC and RanchBiz added to moreapplications.html added lowercase skip alias for Skip to dispatch.py switched to mixedCase style names for BitmapCanvas added new-style class properties to Background and CustomDialog classes: position, size, etc. added leading underscore to addEventListener and notifyEventListeners methods changed _getAttributeNames to use inspect module updated Windows installation docs for Python 2.3 and wxPython 2.4.2.4 added explicit Stop() for timers when app is closed added donations.html fixed default Mac menubar handling converted legacy class name comparisons to __class__.__name__ removed RightTextField component, use TextField with 'alignment':'right' attribute instead many modifications to support wxPython 2.5 and higher in general, just look for code starting with if wx.wxVERSION > (2, 5): to see the version specific changes also modified spacers for sizers to use tuples instead of separate w, h args some items are marked with a "wxPython 2.5 change" comment all changes are being done so that release 0.7.3 will work with wxPython 2.4.x or wxPython 2.5.x or higher future releases may drop support for wxPython 2.4.x EXIF.py updated to remove Python 2.3 warnings added support for Python 2.3 .chm file on Windows Release 0.7.2 2003-09-08 ranamed MultiColumnList 'border' attribute to 'rules' enabled MultiColumnList and Tree in the resourceEditor added minimalList and minimalTree samples as tests of the MultiColumList and Tree components added multicolumnexample by William Volkman replaced older MultiColumnList component with version by William Volkman added workaround for wxMSW GetFont() bug in MultiColumnList switched to Raise() in fixComponentOrder to deal with wxPython 2.4.x change with Hide/Show added shell.autoCompleteWxMethods = False to pycrustrc.py to hide CamelCase wxPython methods of components and other wxPython classes by default added source.encode('iso-8859-1') to textToHtml to avoid print/print preview exceptions in codeEditor; this will probably require a more sophisticated solution added workaround for wxWindows AppendText bug in jabberChat sample. This might need to be added to TextArea appendText if wxWindows isn't fixed soon fixed popItems handling of RadioGroup and other components with an 'items' attribute in resourcEditor propertyEditor.py updated classes in menu.py to be direct wxPython subclasses added source file support to templates in resourceEditor updated File->New... process to save new files added moreapplications.html page to highlight other apps built with PythonCard added wx.wxDEFAULT_DIALOG_STYLE to singleChoiceDialog to workaround wxPython 2.4.1.2 bug fixed samples launcher selection and added double-click support added int(round()) conversions to fix Python 2.3 deprecation warnings added '' back to sys.path in pycrustrc.py for shell work changed default font size for findfiles tool on Mac and GTK added autoSetEOL to codeEditor to automatically use the line endings already in a document replaced \xa0 characters in source files with spaces added macbuild.py to the minimalStandalone sample to show how to build standalones on Mac OS X fixed double loading of pycrustrc.py files in loadShell fixed config directory creation fixed image rotation in slideshow sample for files in zips updated fixed getStyleConfigPath in colorizer fixed PILtoBitmap typo in graphic.py PythonCard now requires a minimum Python 2.2.1 or higher and wxPython 2.4.x or higher Release 0.7.1 2003-07-16 dbBrowser now supports PostgreSQL using the psycopg interface An alternative dbBrowser using a wxGrid to display query results has been added. Its called dbBrowser2 and it re-uses much of the code from the original changed wx.wxc.__version__ check to wx.__version__ added Save Configuration menu item to Scriptlet menu in the codeEditor fixed config.py for standalone usage added Thomas Heller's main_is_frozen function to util.py added GetPixel method to BitmapCanvas added userdata attribute to Widget so all components added support for userdata in the resourceEditor changed resourceEditor to use a drag rect so dragging works the same on all platforms and no longer requires the use of CaptureMouse on Linux added WMAvailable check for Mac OS X so the top frame appears in front when app starts fixed pycrustrc.py loading on Linux/GTK added Grid component and simpleGrid sample fixed script launching in samples.py, findfiles, codeEditor, and resourceEditor added spinUp and spinDown events to Spinner component added dirname() function to util module to use instead of os.path.dirname() updated model.py to use the new function changed true/false to True/False in STCStyleEditor.py to avoid wxPython 2.4.0.4 deprecation warning changed 'items' attribute in resourceEditor to use TextArea instead of TextField for editing fixed 'icon' handling in resourceOutput.py Phil Edwards' started making Linux RPMs for PythonCard added Phil Edwards Linux installation instructions added Mac OS X (Jaguar) installation instructions fixed font attribute in BitmapCanvas added David McNab's walkthrough Increasing Usefulness with Timers and Threads fixed order of wx imports so wx always comes first added jabberChat options for conferencing and Show/Raise slideshow sample changes added Goto Slide dialog changed F8 key to act as a Pause/Continue toggle added zip file support fixed relative directory reference in webserver sample Release 0.7 2003-01-15 added "Create Component Docs..." menu item to widgets sample for creating "component_documentation" directory added home directory config support, so user configs are no longer stored in PythonCardPrototype added numericArrayToImage function to graphic module BitmapCanvas can now draw numpy arrays renamed all variables named list and dict to listX and dictX to avoid built-in type name confusion numerous conversions to conform to PEP 290 replaced use of types module for type checks with built-in type factory - isinstance(i, int) replaced string module functions with string methods replaced '== None' with 'is None' and '!= None' with 'is not None' added many features to jabberChat sample added additional *. wildcards for Linux like *.TXT *.JPG, *.JPEG since Unix filenames are case-sensitive fixed stack in rpn calculator (Randy Lea) added CodeEditor component to resourceEditor added caseinsensitive_listKeySort function to util.py module used by flatfileDatabase for sorting list of dictionaries added caseinsensitive_sort function to util.py module added wordwrap function to util.py module fixed command event in slider component added new samples pages to main web site added code folding to CodeEditor component added openFileDialog and saveFileDialog wrappers to dialog.py added clipboard module added life sample added spirograph sample added wxNO_FULL_REPAINT_ON_RESIZE style to TextArea and CodeEditor components added dirwalk generator function to utils.py changed findfiles to use dirwalk fixed closeField event in RightTextField component fixed script launching to handle spaces in directory names added Phil Edwards' PySSHed sample added simpleIEBrowser sample to test IEHtmlWindow component added IEHtmlWindow component fixed default backgroundColor handling in resourceOutput.py Release 0.6.9 2002-10-23 added Thomas Heller's install-pythoncard.py script to create links under Windows added columnClick event to MultiColumnList added line and column display to statusbar in codeEditor added methods to graphic.Bitmap and BitmapCanvas classes to better support wxBimtap, wxImage and PIL updated webserver sample to run CGIs on Linux and Mac OS X; CGIs are no longer run as user 'nobody' added font utility functions to font.py module made resource argument optional for CustomDialog class added strings to dialog resources switched RadioGroup vertical and horizontal orientation added childWindow function to simplify loading windows added file_upload to webserver sample fixed label attribute in StaticBox Thomas Heller refactored the resourceEditor widget resizing runtime Property Editor fixes added jabberChat sample added code to disconnect wxEVT_KILL_FOCUS in WidgetDict to avoid hard crashes with wxPython 2.3.3 updated webserver.py with IE POST fixes and other Python lib changes added Robin Dunn's stattext.py and replacement StaticText component to the resourceEditor appcomponents fixed Scriptlets run code in textEditor to match codeEditor added dialog docs updated shell docs appled Tim Peters suggestions for sorting in flatfileDatabase for a roughly 5x sort time improvement added auto-rotation of images in pictureViewer and slideshow using EXIF.py and rotate90 method of the Bitmap class added EXIF.py by Gene Cash fixed typos in insertDialog.py scriptlet and scriptlet execution in textEditor fixed wxTAB_TRAVERSAL in panel switched back to a plain list in flatfileDatabase.py fixed missing webbrowser import in companies sample Release 0.6.8 2002-07-17 added keyDown event to Tree added itemFocused, mouseContextClick and keyDown events to MultiColumnList moved flatfileDatabase.py module into framework so that it can be used by both the companies and flatfileDatabase samples added clipboard flush when background is destroyed to preserve the clipboard revised flatfileDatabase sample, added pickle support added findString to util.py added hack in the resourceEditor for Unicode string attributes when using a wxPython unicode build added Fred Pacquier's fpop sample (in cvs, not release) added companies sample added file history to findfiles, resourceEditor, and textEditor fixed close event bug in binding.py added text and html/xml style support to codeEditor added links to PythonCard documentation in the Help menus of the codeEditor, findfiles, and resourceEditor tools updated Run options dialog in codeEditor to support optional args added insertDialog.py scriptlet to codeEditor tool removed the auto-shell loading to speed startup of apps the shell can be loaded manually with self.loadShell() codeEditor and textEditor tools updated to use loadShell added appcomponents sub-package support when loading components fixed ComboBox init so text attribute is set after 'items' and 'selected' attributes are set; text will override 'selected' added Sort menu item to flatfileDatabase updated runScript in codeEditor so it changes to the directory of the script being run and then back to the current dir added "Allow any machine to connect" menu item option to the webserver sample added -d command-line option to show the debug menu without showing any of the runtime windows added HTML file support to slideshow sample changed CodeEditor component to auto-load 'python' style configuration if available changed samples launcher to use CodeEditor component for source and resource files added Tree component Release 0.6.7 2002-06-14 added chat sample changed findfiles and simpleBrowser to use ComboBox changed ComboBox to use wxCB_DROPDOWN style changed findfiles sample to use re instead of regex added idle, move, size, close, activate, minimize, and maximize events to the background renamed OnCloseWindow to on_close moved webservices directory to avoid security hole added slideshow sample added pictureViewer sample added webgrabber sample added webserver sample moved (promoted) the codeEditor, findfiles, resourceEditor, and textEditor samples to the PythonCardPrototype/tools directory fixed string handling of label, text, and toolTip attributes for runtime and resourceEditor Property Editors added asterisks in the titlebar text to indicate when a document has changed fixed STCStyleEditor.py config loading on the Mac changed framework to support wxSTC on wxMac updated find and find next in flatfileDatabase added David Primmer's walkthrough: How to Add a Child Window to a PythonCard Application added Background 'style' attribute to resourceEditor for resizeable or static window size added Dan Shafer's resourceEditor overview added timer events to components timers are still created manually changed logging default to go to stdout in pythoncard_config.py changed runOptionDialog to use sizers added 'strings' attribute to Background resources to simplify localization updated resource output to escape strings correctly when string contains apostrophe and quotes workaround for stc-styles.rc.cfg loading in standalones Release 0.6.6 2002-05-09 added template.html added MultiColumnList component fixed position and size config saves in codeEditor, findfiles, textEditor, and resourceEditor the Background class now binds EVT_ICONIZE and saves the restoredPosition and restoredSize added Riaan Booysen's STCStyleEditor to provide style editing for codeEditor and the shell fixed missing 'label' attribute for CheckBox and RadioGroup (thanks Dan) added rpn (reverse polish notation) calculator sample by Randy Lea added CodeEditor component and codeEditor sample changed the default SourceForgeTracker resource to SourceForgeTracker.original.rsrc.py, renamed the one that has been in use SourceForgeTracker.colorized.rsrc.py the sample should now look better on Linux and OS X added File menu with a Quit (Exit) menu item for apps that wouldn't normally have a menubar on the Mac disabled the shell in the turtle sample on Mac OS X fixed findfiles to search sub-directories on Mac OS X fixed findfiles launching on Mac OS X modified findfiles to use a List rather than a TextArea on the Mac disabled Go To in textEditor on Mac to avoid Mac OS X segfault removed hard-coded window positioning such as (5, 5) so that windows wouldn't appear under Mac OS X menubar changed HtmlWindow to be a direct subclass fixed size handling in resourceEditor for BitmapCanvas and HtmlWindow added HtmlWindow and BitmapCanvas to widgets sample added workaround for missing wxComboBox SetStringSelection on Linux/GTK (thanks Andy) added Dan Shafer's Shell documentation switched to os.spawnv for script launching on all platforms added 'style' attribute to background so a background window can be 'resizeable' or not (the default) added 'visible' flag to background so a background window can be hidden until the user code calls self.Show(1) added flatfileDatabase sample updated sound.py and sounds sample with Richard Wolff's changes sound.py now uses the sndhdr standard library (thanks Richard) Release 0.6.5 2002-04-18 switched to os.spawnv for Windows script launching bound EVT_WINDOW_DESTROY in widget.py, image.py, imagebutton.py, and bitmapcanvas.py, and resourceEditor.py to do some memory leak cleanup for hybrid wxPython removed TODO.txt, replaced with wiki page http://wiki.wxpython.org/index.cgi/PythonCardToDoList added PythonCard wiki pages http://wiki.wxpython.org/index.cgi/PythonCard added import os, import sys to pycrustrc.py added closeField event for TextField, PasswordField, TextArea, and RightTextField components fixed distutils to include components sub-package .pyc and .pyo files are no longer created in win32 .exe and Linux tar.gz distributions (thanks Andy) updated BitmapCanvas to follow the wxDC API added noresource sample added dictionary/resource option to PythonCardApp class so it is possible to create an app that has no resource file switched to function calls for system dialogs renamed GenericDialog to CustomDialog and moved the class to model.py and removed dialognew.py from the package added minimalDialog to dialogs sample added custdb sample by Juergen Rauch fixed 'default' attribute handling in Button component including workaround for missing GetDefaultItem/SetDefaultItem in wxDialog fixed controlDown, altDown, and shiftDown for mouse events added Gauge component added dialog editing support to the resourceEditor sample added StaticBox component added ComboBox component added Spinner component added RightTextField component added Calendar component updated FindDialog in dialog.py and textEditor.pyw updated the license reference in index.html to Python 2.2 Release 0.6.4 2002-03-11 *** event handler argument change *** changed (self, target, event) to (self, event) arg list code written for PythonCard prior to release 0.6.4 will need to be updated added htmlpreview window to radioclient changed attribute binding where possible to use class methods if not hasattr(self.__class__, '_getPosition'): self.__class__._getPosition = self.__class__.GetPositionTuple Thanks to Patrick for that one! renamed toc.html to documentation.html commented out unused 'visible' lines in pythoncard_config.py changed Save Configuration so that it doesn't save the visible state of the windows added 'PythonCard Home Page' and 'Online Documentation' menu items to the Debug menu added Page Setup, Print, Print Preview to textEditor sample using wxHtmlEasyPrinting class to start the exploration of printing in PythonCard added simple Copy and Paste of the entire bitmap image in doodle added Open and Save As so an image can be imported into the current bitmap and saved to disk in a variety of supported formats: BMP, GIF, JPG/JPEG, PCX, PNG, PNM, TIF/TIFF, XBM, and XPM Not all formats are supported on every platform and saving as GIF results in a zero length image. added getBitmap to BitmapCanvas to support Copy and Save As in doodle sample changed findfiles to use sizers and remember the last position and size of the window added event to run pycrustrc.py files after the openBackground event added Run with interpreter option to resourceEditor Thanks Neil removed FAQ.txt and added FAQ.html added Cut, Copy, and Paste to resourceEditor for copying components between layouts changed from the runtime Property Editor window to a Property Editor window done as a PythonCard background so that the resourceEditor would be more intuitive changed Property Editor to get attributes from the class _spec added installation.html, walkthrough1.html, walkthrough2.html and learning_python.html Thanks to Dan Shafer for the docs work! changed resourceEditor sample to use sub-directories to explore how we might use standard sub-directories for organizing PythonCard apps changed dialog.py and samples to use single-line invocations of standard dialogs fixed resourceEditor backgroundColor handling by changing wx.wxSYS_COLOUR_3DLIGHT to wx.wxSYS_COLOUR_3DFACE also fixed counter sample switched components from using wxPython controls as delegates to direct subclasses of wxPython controls and the Widget class removed _createDelegate method and added _postInit method and restructured initialization removed some cached attributes such as _enabled, _position, _size, _visible updated all samples to get rid of _delegate references added stockprice SOAP sample added radioclient sample fixed typo in resourceEditor, so menu commands are saved correctly as 'command' rather than 'ommand' fixed some old turtle sample documentation added SourceForge logo to all HTML pages Release 0.6.3.2 2002-01-28 restored loseFocus event Release 0.6.3.1 2002-01-26 made sillywalk.gif and lrggumby.gif opaque to fix GTK drawing fixed exception when locale.getdefaultlocale() is None Release 0.6.3 2002-01-25 commented out stack info dialog in resourceEditor added FAQ.txt, updated toc.html and other documentation changed addEventListener so the MessageWatcher is always the first listener to be notified added localization support for resource files added minimal.fr.rsrc.py for French users as an example Linux fixes resourceEditor and samples file launching CaptureMouse() in resourceEditor fixed asserts in BitmapCanvas where OnSize event was called prior to __init__ finishing added registry.py, updated framework to use registry added quotes to path/filename in resourceEditor for launching Release 0.6.2 2002-01-16 added counter sample by Dan Shafer Dan wrote a great tutorial.txt file that explains how to recreate the sample step-by-step added wxMiniFrame support for Windows in debug.py GTK still uses wxFrame added findnth string function to util.py helps textEditor to fix Go to line under Windows added minimal.spec example for building standalones using Gordon McMillan's installer changed 'isdefault' attribute to 'default' added shell key bindings and usage link to toc.html added support in resourceEditor.py for resizing widgets under Linux/GTK updated setup.py and MANIFEST.in for distutils changed positionToXY to handle tuple of len 2 or 3 changed textEditor.pyw to show the filename in the title bar moved 'menubar' attribute from 'stack' to the background updated all sample .rsrc.py files updated Backround __init__ (model.py), menu.py, spec.py, and resourceEditor.py changed launching code in samples.py, resourceEditor.py, and findfiles.py to os.system(python + ' ' + filename + args + ' &') updated imagebutton.py component _setBitmap method to workaround setting the bitmap after initialization on GTK added positionSize.rsrc.py and PositionSize class to resourceEditor this is an example use of multiple windows added tentative multi-window support http://aspn.activestate.com/ASPN/Mail/Message/PythonCard/965583 updated SourceForgeTracker XML parsing changed Message Watcher window to wxPython.stc.wxStyledTextCtrl Thanks Neil! updated the _setIcon method in the Background class to support .xpm as well as .ico files for titlebar icons fixed numerous bugs on Linux findfiles should now work on Windows and Linux file launching in samples.py, resourceEditor.py and findfiles.py now uses sys.executable to launch python programs thanks to Cliff Wells for these fixes added htmlWindow component added simpleBrowser sample to experiment with htmlWindow http://aspn.activestate.com/ASPN/Mail/Message/PythonCard/962840 the list of supported tags is at: http://aspn.activestate.com/ASPN/Mail/Message/PythonCard/964327 added check for whether a component is already loaded to avoid unnecessary imports in res.py fixed addresses sample initialization when Outlook isn't installed Release 0.6.1 2001-12-28 changed all menu shortcuts from using - to + (Ctrl+F instead of Ctrl-F) changed GetSize to GetSizeTuple and GetPosition to GetPositionTuple hopefully this has fixed the selection bugs in resourceEditor using size or position attributes as a list will now result in a runtime error added New, Save, Revert to resourceEditor and documentChanged fixed default resource file loading Release 0.6 2001-12-27 *** wxPython 2.3.2 or later is now required to use PythonCard *** added assert wxc.__version__ >= "2.3.2" to model.py the move to wxPython 2.3.2 fixes the menu accelerator bugs *** resourceEditor sample is now a fully functional layout editor *** updated resourceEditor added Run command, Run Options, and dialogs for editing the stack, background, and menu for an application added commands to change the component order component order is shown in the Property Editor added a grid option, so components can be aligned to the grid this isn't a commercial-quality layout editor since it still uses the runtime Property Editor to edit component (widget) properties, lacks extensive error checking and field validation and has many missing features and some oddball bugs, but overall it works well enough to do a fixed position layout quickly and easily and there is no Undo! changed wxPython imports from from wxPython.wx import * to the more explicit from wxPython import wx added missing imports such as 'import types' where needed replaced occurences of wx.true and wx.false with 1 and 0 added a components directory merged wxPython_binding.py into binding.py and moved widget-specific bindings to individual module files moved spec.py descriptions for each widget to its respective widget module split widget.py so each widget is in its own file in the components directory all widgets (components) are now self-contained modules in the components directory. each module includes the spec, event bindings, and attribute descriptions (formerly in spec.py) in addition to the widget class. when the module is imported it "registers" itself, so that the class is available for applications. added drawPointList and drawLineList (2.3.2 feature) to the BitmapCanvas widget, switched to drawPointList in hopalong sample for a roughly 4x speed improvement also added Chaos1ScriptFastest.txt turtle script example updated the setup.py script for minimal.py and provided some basic instructions in the readme.txt. It is necessary to uncomment the import in minimal.py prior to using py2exe due to how the dynamic imports are done for components fixed _setFile bug in Image class updated findfiles open/save code to automatically load and save the last grep parameters used to a 'findfiles.grep' file updated log.py and config.py to use module-level functions in place of directly accessing the singleton classes from other modules log.info() instead of log.Log.getInstance().info() ... added logToStdout option to redirect log output to stdout changed defaultStackPosition to defaultBackgroundPosition in pythoncard_config.py and pythoncard_user_config.py moved title, position, size, statusBar, and icon attributes from the 'stack' to the 'background' fixed alternative resource file loading added example of usage to SourceForgeTracker sample Release 0.5.3 2001-11-30 *** wxPython 2.3.1 or later is now required to use PythonCard *** added assert wxc.__version__ >= "2.3.1" to model.py changed TextArea to use wxTE_RICH style modified getStringSelection, replaceSelection code updated samples that were counting newlines for find operations fixed assertion error with FontDialog added getString method to TextField and its subclasses changed FindDialog so that it automatically selects the search text and sets the focus to the search field when the dialog comes up numerous textEditor sample changes New and Save menu items reworked all the file operations so the user has a chance to save changes filename and line number arguments are accepted on the command-line Find Next and Go To commented out 'file' reference in Pyker.hta added setBackColor('white') to reset method in BitmapTurtle modified turtle sample added a check to sync the auto refresh state after drawing with the turtle sample and removed the Refresh menu item added more sample screen shots to web site added a new documentation page http://pythoncard.sourceforge.net/toc.html findfiles updated commented out the directory list, moved other widgets to the right added open and save as menu items fixed file launching using textEditor.pyw to do the launching updated samples.py to properly launch textEditor.pyw removed KillFocus from widget.py added getStringSelection/setStringSelection to Choice widget and added check for type of selection in setSelection changed all _getDelegate() references to _delegate changed all _getParent() references to _parent changed the default selection for Choice, List, and RadioButton to None updated setSelection in Choice, List, and RadioButton to accept either an integer or a string or None fixed some assertion bugs with the Property Editor Release 0.5.2 2001-11-22 (the "turkey" release) moved configOptions into the framework, so it is no longer needed in user code removed 'file' and 'classname' attributes from all samples updated all samples to use simpler import and startup model.PythonCardApp(Classname, [resource file]) the Classname is the actual class you want to use, not a string the resource file is optional and will default to the base name of the main module file with an extension of '.rsrc.py' *** IMPORTANT NOTE *** if you have an app of your own, you must update it to follow the same style as used by the samples such as minimal.py numerous textRouter sample updates updated textEditor and searchexplorer samples Del key handling added check for PyCrust in wxPython debug checks for PyCrust on the PYTHONPATH first added (thanks Andy) icon support under Windows to framework added applicationDirectory variable to PythonCardApp Release 0.5.1 2001-11-18 framework changes to simplify building Windows executables using py2exe. source and resource files and any other files needed to be loaded at runtime must be included with the distribution files. added setup.py example py2exe script to minimal sample complete documentation for using py2exe is still needed, see the mailing list changed res.py to import spec.py changed config loading to use import rather than readAndEvalFile renamed pythoncard.config.py to pythoncard_config.py user config is saved as pythoncard_user_config.py added SingleChoiceDialog and MultipleChoiceDialog to dialog.py added Simon Kittle's textRouter sample updated replaceSelection for text fields and added getStringSelection TextField, PasswordField, TextArea changed statusbar.py to use CreateStatusBar() fixed TextArea event binding to check for unused events dbBrowser sample supports Oracle Release 0.5 2001-11-09 added a method to preserve the status bar text when a menu is highlighted changed all import statements in the framework to be explicit rather than using the import * style removed loader.py moved configuration code to config.py changed all samples to use from PythonCardPrototype.config import configOptions instead of from PythonCardPrototype.loader import configOptions removed uniqueid.py uniqueid.UniqueIdFactory().createUniqueId() changed to wxNewId() removed monitor.py and navigation.py changed getCurrentBackground() to refer to always refer to the first background in the list; removed all references to _iterator default font size changed to self._size = wxNORMAL_FONT.GetPointSize() changed wxMiniFrame to wxFrame on all debug windows dbBrowser sample uses a modal dialog for login dbBrowser 0.3 also has an icon Release 0.4.6 2001-10-30 added FindDialog to textEditor sample to show use of GenericDialog class for user-defined modal dialogs. the user-defined FindDialog mimics the look and behavior of the FindDialog in dialog.py added GenericDialog class (dialognew.py) fixed _translateFont bug that was returning the wrong font family when using the Font dialog removed textEnter event pressing return in TextField or PasswordField should now be the same as pressing tab updated proof and searchexplorer samples added modal FindDialog to dialog.py updated dialogs sample to show FindDialog updated addresses sample to use FindDialog, but didn't implement find logic to do the actual searching added _used flag to Event class and associated methods to support proper use of skip with keyPress added keyDown, keyUp, and keyPress events added turtle.py module (AbstractTurtle and BitmapTurtle classes) updated turtle sample to use the new module minor fixes to BitmapCanvas added textEditor sample converted samples launcher to use sizers fixed CompactStack in textIndexer (thanks Patrick) Release 0.4.5 2001-09-17 PyCrust is no longer included in the PythonCardPrototype distribution, please download PyCrust at: http://sourceforge.net/project/showfiles.php?group_id=31263 moved Bitmap class to graphic.py module added getPILBits and setPILBits to Bitmap class to simplify using PIL with PythonCard added BitmapCanvas widget to widget.py added doodle and hopalong samples which use BitmapCanvas The BitmapCanvas is very experimental and will be enhanced and improved Debug windows are now children of the app window Namespace Viewer, Property Editor, Shell added 'Save Configuration' option to Debug menu this will create a pythoncard.user.config.py file with the current debug window position and sizes changed Message Watcher to use sizers renamed readDictionaryFile to readAndEvalFile updated addresses.py and searchexplorer.py to use the new function Release 0.4.4.5 2001-09-08 posted Help Wanted on SourceForge http://sourceforge.net/people/?group_id=19015 posted Python Conference request for papers/tutorials http://aspn.activestate.com/ASPN/Mail/Message/PythonCard/767719 added addMethod to Scriptable class for dynamically adding handlers at runtime, see: http://aspn.activestate.com/ASPN/Mail/Message/PythonCard/770015 added 'openBackground' message to replace using __init__ changed background handlers to on_mouseClick form modified SourceForgeTracker so that double-clicking on a topic launches the web page for that topic in a browser Neil added Pyker.hta and PykerLaunch.hta see the following URL for more info http://aspn.activestate.com/ASPN/Mail/Message/PythonCard/766307 Andy added a TODO.txt to document short-term plans for PythonCard development Property Editor and resourceEditor sample were changed to use default size (-1, -1) values added enable and check menu items to menu.py see the url below and thread replies http://aspn.activestate.com/ASPN/Mail/Message/PythonCard/766371 started some documentation for the Button class http://aspn.activestate.com/ASPN/Mail/Message/PythonCard/764832 added display of .rsrc.py files in samples.py Patrick added dot notation support to the Font class Jeff and Neil provided some Unix screenshots These show we need to get sizers working to deal with variable size widgets and fonts on different platforms http://aspn.activestate.com/ASPN/Mail/Message/PythonCard/763602 http://aspn.activestate.com/ASPN/Mail/Message/PythonCard/763659 res.py eval() changed to support using Windows-style line endings under Unix added "Redirect stdout to Shell" option to Debug menu Release 0.4.4.1 2001-08-31 added samples.py to launch the the various sample programs see samples\samples.py added readme.txt files to all samples that didn't already have one. the readme.txt is displayed as the 'description' for a sample Release 0.4.4 2001-08-30 added getting_started.html to docs\html added basic status bar support statusbar.py module see test_turtle.py for an example turtle sample updated test_turtle.py now uses a status bar and displays the time required to draw a design added line(x1, y1, x2, y2) method to turtle added extra parametes to FileDialog to support saving files see resourceEditor for an example see dialog.py for complete list of options added Namespace Viewer using PyFilling (part of PyCrust 0.6) fixed numerous Property Editor edit/display bugs widgets are now displayed in the proper order added Font support to all widgets Font class moved to font.py module the actual text descriptions of the fonts is going to change, so if you use them, just be aware that the format of the font descriptions will change by the next release a font can be passed to the Font dialog to set the initial font displayed commented out 'import warnings' for Python 2.0 support but PyCrust usage still means that you need Python 2.1.x if any Debug windows like the shell will be used fixed unitialized empty bitmaps on win98 added append method to Choice class added setFocus method to Widget dbBrowser sample updated to version 0.2 resourceEditor changes resourceEditor can now save .rsrc.py files make sure to only work on copies in case of bugs also some hand editing of .rsrc.py is still necessary depending on what you're trying to do Duplicate Widget menu item now causes the duplicate to be offset 10 pixels to make it easier to select added template.rsrc.py for defaults worldclock sample demonstrates simple use of logging Release 0.4.3 2001-08-23 Andy Todd converted worldclock so that it no longer requires an external JavaScript program to run added samples.txt file to the docs directory to document the purpose of each sample application fixed numerous display bugs in the Property Editor including the selection bug which was causing a KeyError when using the resourceEditor resourceEditor changes added a Help menu, About resourceEditor... menu item View attributes display is now more complete Property Editor is shown by default the Shell is now shown by default for the turtle sample added addresses sample, which shows the conversion of an existing HyperCard stack background layout and data to PythonCard. addresses does transparent saves of data and can import contacts from Outlook as well. disabled helpText attribute Release 0.4.2.1 2001-08-21 Property Editor is now a listener of the WidgetDict class so the component list is automatically updated as widgets are added and deleted resourceEditor sample changes added Duplicate Widget menu item fixed the selection code Property Editor now updates correctly script added to dbBrowser sample to populate a mySQL test database Release 0.4.2 2001-08-20 the PythonCard mailing list has moved to http://lists.sourceforge.net/lists/listinfo/pythoncard-users the home page has been redesigned and the other HTML pages have been validated to make sure they conform to the HTML spec. the HTML pages in the docs\html directory can now be used locally, they will fetch the large JPEG images from the web. the Property Editor can now edit widget attributes added getPosition/setPosition and getSize/setSize to Background added basic mouse events to StaticText, StaticLine, and Image widgets converted Dan Winkler's original PythonCard demo app to the PythonCardPrototype framework, renamed it textIndexer and made it a sample. It currently requires ZODB to run You can use standalone ZODB or ZODB from Zope, see the readme.txt in the textIndexer directory for more info Andy Todd added his dbBrowser sample which is able to browse mySQL databases. readme.txt in the dbBrowser directory for more info added a resourceEditor sample, which is the beginnings of a GUI resource (.rsrc.py files) editor. see the readme.txt in the resourceEditor directory for more info Release 0.4.1 2001-08-16 updated debug.py and pycrustrc.py to support PyCrust 0.5.2 due to changes between PyCrust 0.5.2 and earlier versions you must use the latest version of Pycrust with PythonCard, which is included in the release .zip for convenience added 'border' attribute to TextField and its subclasses to support a 'none' wxNO_BORDER option. updated worldclock and test_widgets.py to show TextField with a border of 'none' used in place of StaticText added empty bitmap support. Image and ImageButton now use the Bitmap class rather than an explicit wxBitmap. the convention is that if the file is '' then an empty bitmap is created. see SourceForgeTracker for an example of the use of empty bitmaps if the layout doesn't look right on Linux or Solaris, you can use the SourceForgeTracker.original.rsrc.py file by renaming it to SourceForgeTracker.rsrc.py fixed worldclock and tictactoe samples to use Bitmap Release 0.4 2001-08-14 added components dictionary find/findByName, createWidget, and deleteWidget were replaced by a dictionary, so that widgets on a background can be accessed as: self.components.button1 see the samples for numerous examples of the new usage. widgets now use dot notation to access their attributes print button1.label # get button1.label = 'hello' # set This was a major revision to widget.py that also impacted many other parts of the framework, so if you have any samples of your own done with release 0.3.1 or earlier, you'll need to update your code. updated all samples to use the new dot notation all widget attributes that can only be set at initialization will now throw an AttributeError if you try and change them. for example button1.name = 'bob' is not legal so you get: 'AttributeError: name attribute is read-only' *** note that while updating all the widget attributes to dot notation I realized that we had never cleaned up the 'selected' attribute for List, RadioGroup, and Choice, so be aware that the name and behavior of 'selected' will probably change in the next release PyCrust is now included as a separate package numerous changes were made to the PyCrust shell, see the PyCrust docs for more information. fixed backgroundColor and foregroundColor in class Background the widgets sample has a button to change the backgroundColor to show off this fix. added pycrustrc.py files whatever python code is in these files will be executed when the shell is first launched. there is a default pycrustrc.py in the package directory. there is another example in the turtle sample directory. changed pythoncard.config.py added options to set the position and size of all the "debug" windows: Message Watcher, Property Editor, Shell added pythoncard.user.config.py this file will override pythoncard.config.py if it exists you should copy pythoncard.user.config.py and update the position of each window for your own screen dimensions; you can update the shell size too added defaultStackPosition option you can add a key:value line to pythoncard.user.config.py to override the stack position that a PythonCard app may or may not specify. The most common would be something like 'defaultStackPosition':(5, 5), to force the window to the top-left of the screen (I prefer this over (0, 0) myself. added 'Debug' menu if any of the 'debug' windows are requested when an application is started, then all of the windows will be created, but only the requested ones will be shown initially. you can choose the window name from the Debug menu to show/hide the window. added an About PythonCard... menu item to the Debug menu displays version numbers and PythonCard project info added SourceForgeTracker sample downloads XML from SourceForge tracker database to display Bug Reports and Feature Requests for the following projects: PyChecker, PyCrust, Python, PythonCard, wxPython. Additional projects can be added. added conversions sample does Fahrenheit <-> Celsius and English <-> Morse Code conversions with a generic framework, so other conversions can be added added tutorial.txt to docs applications can now use the .pyw extension if you don't want an application to have a console window, then rename the application to .pyw, but don't change the file reference in the .rsrc.py file, leave that as .py as an example, you can change worldclock.py to worldclock.pyw Release 0.3.1 2001-08-07 Fixed line ending problems with PyCrust files that causes 0.3 release to not work correctly on *nix systems. Also, removed the background.gif file from the proof sample which is not needed. Release 0.3 2001-08-06 added changelog.txt and readme.txt files menubar is now optional if a 'menubar' key is not found in a Stack's resource file then a menubar won't be created. log.py documented proof.py updated to work with log.py changes MessageEvent was removed from proof.py since message sending bewteen widgets is currently disabled The working directory is changed to the directory of the main resource file such as minimal.rsrc.py when PythonCard starts up to avoid problems with filenames in the .rsrc.py files and any data files used by the application. Property Editor and Shell windows can be overlapped by the main app window Due to a bug, the Message Watcher must still remain on top added getCurrentBackground to PythonCardApp class PythonCard now includes PyCrust (-s on command-line) interactivePrompt renamed to shell, all references changed PyCrustFrame class moved to debug.py along with test for PyCrust import PyCrust shell is version 0.3 PythonCard turned into PythonCardPrototype package All samples changed to use the new package naming All samples can now be run "standalone" so any _standalone.py files in the samples have been removed. __version__.py contains the current release number New cvs tree on SourceForge, the old proto tree is no longer used PythonCard.py renamed to loader.py and loader.py overhauled added deleteWidget method added find, deprecated findByName added turtle graphics sample added a Property Editor (-p on command-line) due to time constraints, the Property Editor is only a property viewer in this release. You can use the set methods for widgets to change values inside the shell if you need to. added gainFocus and loseFocus messages to all widgets added StaticLine widget ComponentSpec and AttributeSpec classes added to enhance parsing of spec.py Release 0.2.1 2001-07-31 Added Edit menu with Cut, Copy, Paste, etc. to searchexplorer sample Added replaceSelection method to TextField Fixed setSize, setPosition Added findFocus to Background Fixed numerous functions that weren't returning values Added classes ComponentSpec and AttributeSpec, enhanced parsing of spec.py Added most of the remaining methods for TextField and List Added minimal sample to use as a template class_diagram_1.pdf removed from release to save space Release 0.2 2001-07-29 Release 0.1 2001-07-26 Initial release Revision: $Revision: 1.327 $ Date: $Date: 2006/05/18 21:15:00 $ PythonCard-0.8.2/docs/GettingStarted/0000755000076500007650000000000010434046770017377 5ustar alexalex00000000000000PythonCard-0.8.2/docs/GettingStarted/starter1.py0000644000076500007650000000046610351026242021512 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.8 $" __date__ = "$Date: 2005/12/17 15:20:02 $" """ from PythonCard import model class Minimal(model.Background): def on_menuFileAbout_select(self, event): pass if __name__ == '__main__': app = model.Application(Minimal) app.MainLoop() PythonCard-0.8.2/docs/GettingStarted/starter1.rsrc.py0000644000076500007650000000163610202343461022462 0ustar alexalex00000000000000 { 'application':{ 'type':'Application', 'name':'Minimal', 'backgrounds': [ { 'type':'Background', 'name':'bgMin', 'title':'Minimal PythonCard Application', 'size':( 200, 100 ), 'menubar': { 'type':'MenuBar', 'menus': [ { 'type':'Menu', 'name':'menuFile', 'label':'File', 'items': [ { 'type':'MenuItem', 'name':'menuFileAbout', 'label':'&About\tAlt+a', 'command':'about' }, { 'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit' } , ] }, ] }, 'components': [ { 'type':'TextField', 'name':'field1', 'position':(0, 0), 'text':'Hello PythonCard' }, ] } ] } } PythonCard-0.8.2/docs/html/0000755000076500007650000000000010434046770015413 5ustar alexalex00000000000000PythonCard-0.8.2/docs/html/dialogs/0000755000076500007650000000000010434046770017035 5ustar alexalex00000000000000PythonCard-0.8.2/docs/html/dialogs/alertdialog.html0000644000076500007650000000730610110453756022215 0ustar alexalex00000000000000 Alert Dialog

Alert Dialog

Alert Dialog Sample

Creating the Dialog

Create an Alert Dialog by calling dialog.alertDialog with the three arguments shown in the following table.

Argument
Data type/notes
self
the window (background) that is the parent for the dialog
message
quoted string of alert message to be displayed inside dialog
title
quoted string of text to be displayed in dialog's title bar

Example:

Above dialog was created with this line of code:

result = dialog.alertDialog(self, 'a message', 'a title')

Interacting With the Dialog

The alertDialog component returns two values, stored as elements of the Python dictionary called "results" returned by all PythonCard dialogs. These results are as shown in the following table.

Name of value
Description
accepted
True = user clicked OK
False = user clicked Cancel
returned string containing the name of the button clicked by the user

Example:

The sample dialog shown at the top of this page returns the following results when the user clicks its only button:

accepted: True
returned: Ok


 







PythonCard-0.8.2/docs/html/dialogs/colordialog.html0000644000076500007650000000432710110453767022226 0ustar alexalex00000000000000 Color Dialog

Color Dialog

Find Dialog Sample

Creating the Dialog

Create a Color Dialog by calling dialog.colorDialog with the single argument "self", representing the window or background that is the parent for the dialog.
Example:

Above dialog was created with this line of code:

result = dialog.colorDialog(self)

Interacting With the Dialog

The colorDialog component returns two values, stored as elements of the Python dictionary called "results" returned by all PythonCard dialogs. These results are as shown in the following table.

Name of value
Description
accepted
True = user clicked OK
False = user clicked Cancel
color
Tuple of three elements containing the red, blue, and green values representing the color (i.e., RGB format)

Example:

The sample dialog shown at the top of this page returns the following results:

accepted: True
Color: (64, 128, 128)



 




PythonCard-0.8.2/docs/html/dialogs/directorydialog.html0000644000076500007650000001075210110453767023113 0ustar alexalex00000000000000 Directory Dialog

Directory Dialog

Directory Dialog Sample

Creating the Dialog

Create a Directory Dialog by calling dialog.directoryDialog with the two  arguments shown in the following table.

Argument
Data type/notes
self
the window (background) that is the parent for the dialog

message

quoted string that provides a prompt to be displayed inside the dialog box

path
quoted string providing the initial directory in which to open the dialog. Providing an invalid or non-existent directory places the user at the top level of the directory structure. If this string is empty, the directory dialog opens to the top-level directory.

Example:

Above dialog was created with this line of code:

result = dialog.directoryDialog(self, 'Choose a directory', '')

Since the directory parameter is empty, the directory dialog opens at the top level of the directory structure as shown in the figure. To cause the directory dialog to open on a directory called, e.g., C:\PYTHON23, you would write:

result = dialog.directoryDialog(self, 'Choose a directory', 'C:\\Python23')

Interacting With the Dialog

The directoryDialog component returns two values, stored as elements of the Python dictionary called "results" returned by all PythonCard dialogs. These results are as shown in the following table.

Name of value
Description
accepted
True = user clicked OK
False = user clicked Cancel
path
string containing the full path to the chosen directory

Example:

The sample dialog shown at the top of this page returns the following results if the user navigates to the C: drive and picks the directory called "pycode."

accepted: True
path: C:\\pycode

 






PythonCard-0.8.2/docs/html/dialogs/filedialog.html0000644000076500007650000001203310123064543022012 0ustar alexalex00000000000000 File Dialog

File Dialog

Find Dialog Sample

Creating the Dialog

Create a File Dialog by calling dialog.fileDialog with the arguments shown in the following table.

Argument
Data type/notes
self
the window (background) that is the parent for the dialog
message
quoted string defining the title for the dialog

path

quoted string defining the default path to be used for the dialog

fileName

quoted string defining a file name to be used typically in saving a file

filter
quoted string containing the pattern to be used to identify files to be shown to the user by default when the File Dialog opens. The dialog above was created with a pattern of "*.py." A more complex example is shown below.

OPTIONAL style

A boolean logic expression containing one or more pre-defined window style constants that define how the window will look and behave.


Example:

The above dialog was created with this line of code:

 result = dialog.fileDialog(self, 'Open', '', '', wildcard )

after setting the variable wildcard to the string "*.py".

To open a File Dialog showing all JPEG and GIF files in the current directory, you would first set the wildcard string to "JPG files (*.jpg;*.jpeg)|*.jpg;*.jpeg|GIF files (*.gif)|*.gif|All Files (*.*)|*.*" and then use the above line to open the File Dialog.

The optional style argument in dialog.fileDialog is generally not used when opening a File dialog to save a document because its default settings -- wx.OPEN | wx.MULTIPLE -- is the generally accepted norm for such dialogs. In creating dialogs for saving files, on the other hand, it is often useful to define a variable (here called "aStyle") which defines more fully how the save process will be managed. For example:

aStyle = wx.SAVE | wx.HIDE_READONLY | wx.OVERWRITE_PROMPT

will create a file save dialog (rather than the default file open), in which read-only files are not shown and an attempt to overwrite an existing file is confirmed with a prompt dialog.

Interacting With the Dialog

The fileDialog component returns its values, stored as attributes of an instance of the DialogResults class called "results" returned by all PythonCard dialogs. These results are as shown in the following table.

Name of value
Description
accepted
True = user clicked OK
False = user clicked Cancel
paths
list of strings containing the full pathnames to all files selected by the user

Example:

The sample dialog shown at the top of this page returns the following results:

accepted: True
paths: ['C:\\pycode\\PythonCard\\setup.py']
 





PythonCard-0.8.2/docs/html/dialogs/finddialog.html0000644000076500007650000001002110110453767022014 0ustar alexalex00000000000000 Find Dialog

Find Dialog

Find Dialog Sample

Creating the Dialog

Create a Find Dialog by calling dialog.findDialog with the one required and any or all of the three optional arguments shown in the table below:


Example:

Above dialog was created with this line of code:

result = dialog.findDialog(self)

Argument

Data type/Notes

self

the window (background) that is the parent for the dialog

OPTIONAL searchText

String defining the text for which to search

OPTIONAL wholeWordsOnly

Boolean value indicating whether to confine the search to strings that contain the search text as a whole word rather than a substring. True = search for whole words only; False = find all occurrences of the search text

OPTIONAL caseSensitive

Boolean value indicating whether to confine the search to strings that contain the search text exactly as provided including upper and lower case letter sensitivity.. True = search for exact capitalization match; False = find all occurrences of the search text

Interacting With the Dialog

The findDialog component returns four values, stored as elements of the Python dictionary called "results" returned by all PythonCard dialogs. These results are as shown in the following table.

Name of value
Description
accepted
True = user clicked OK
False = user clicked Cancel
searchText
String containing the text entered by the user for which the search is to be conducted
wholeWordsOnly
True = user checked "Whole Words Only" checkbox
False = user did not check the checkbox
caseSensitive
True = user checked "Case Sensitive" checkbox
False = user did not check the checkbox

Example:

The sample dialog shown at the top of this page returns the following results:

accepted: True
searchText: PythonCard
wholeWordsOnly: True
caseSensitive: False



 




PythonCard-0.8.2/docs/html/dialogs/fontdialog.html0000644000076500007650000000643210110453767022055 0ustar alexalex00000000000000 Font Dialog

Font Dialog

Find Dialog Sample

Creating the Dialog

Create a Font Dialog by calling dialog.fontDialog with one required argument and one optional argument as shown in the following table:

Argument
Data Type/Notes
self
the window (background) that is the parent for the dialog
OPTIONAL aFont
Python dictionary containing a complete font description to be used as the default starting point for the dialog. See description of return value of "font" in table below for details.


Example:

Above dialog was created with this line of code:

result = dialog.fontDialog(self)

Interacting With the Dialog

The fontDialog component returns three values, stored as elements of the Python dictionary called "results" returned by all PythonCard dialogs. These results are as shown in the following table.

Name of value
Description
accepted
True = user clicked OK
False = user clicked Cancel
color
Tuple of three elements containing the red, blue, and green values representing the color (i.e., RGB format)
font
Python dictionary object with keys style, faceName, family, and size. All elements of dictionary are strings except for size, which is an integer.

Example:

The sample dialog shown at the top of this page returns the following results:

accepted: True
color: (0, 0, 0)
font: {'style': 'bold', 'faceName': 'Arial', 'family': 'sansSerif', 'size': 12}


 





PythonCard-0.8.2/docs/html/dialogs/general.html0000644000076500007650000000313607523020030021325 0ustar alexalex00000000000000 General Notes

General Notes

This document describes the "common dialogs" by which we mean those system-level dialogs that are often used in PythonCard applications. A separate document describes custom dialogs, i.e., those that you create in your own applications that are specific to those programs' needs.

Two notes are important regardless of which of the common dialogs you work with.

First, although every document describing one of these dialogs discusses a variable called "result" in which the results of user interaction with the dialog are stored. You can call this variable anything you like. The samples use the variable "result" and the documentation follows that lead, but it is not necessary that you call this variable anything special.

Second, while the dialog documentation shows you how to create each dialog programmatically, there is an alternative way of creating some of the dialogs. In the PythonCard codeEditor, you can choose the "insertDialog" option from the "Scriptlets" menu, then choose the type of dialog you wish to create. A skeletal text framework of valid Python code will be placed into the code editor at the insertion point. You can then simply edit that starter text to describe your specific needs.

PythonCard-0.8.2/docs/html/dialogs/images/0000755000076500007650000000000010434046770020302 5ustar alexalex00000000000000PythonCard-0.8.2/docs/html/dialogs/images/dialogsfig1.png0000644000076500007650000000344607523020030023172 0ustar alexalex00000000000000‰PNG  IHDRÈÈ­X®žsBIT|dˆÝIDATxœíÝ?—ãVà×9ûRò¦té:ÿXÈ’„@1åaHRÌGHA±¥  Δ.HØ@ CHRO9e¾Í¤˜h°5Ò;–F_ÛÏsvÏZW²¤#éç{¯-Ý|wyqu6ŸÇ³³e,óþïÑåÅÅZÁt6ÛÒ®@y5ÖC‡ª1 gËˈˆ˜Ä$®ÿL®§'µWçoºÜPëiZn¨õŒ¹ß?”½;zl«²¡¼0èÚ`Ï´Ö °ËfO^ìýÞ£é,Î~ÂëÓ—®¿§Wë‹o>‰}ý—ÆyÏ¿ZÄó¯}V ÅÙ¨ùÏ·‹ˆˆ×_úuDD;ÿxmú—?ù Ë&a0ËÅ<ŽON×Br×Ý#jª‰Õ¤©‰õÿþ1""Þ~ü^üâñûñ÷/ÿÐe“0¨Õ@lrkÕƒ4±>;ÿ8>=ÿè!6©¦&VæA¾æ}ûñ{·~ …‡VïsTÍ­¬&yÐNú§_~¤‰ÅV4uÈ›:îuä§/ý*"®;éuo¼ònD\wÒë~þãßEÄzK'mX.æ5E[yeã&VÕAŸL&k¿ƒDD¼ñê»7M¨·^;¹Y.âºyqû†3Øn5ao ñ؆€°—ަÃ<ø' ì¥ênÜûr« $Zk§ÇÓ‡Ü]Õþå¡©A ! H$ „€@B@ ! H$ Dç' ëÃ66 §Ò6´c¶l—÷×çuJºèõÈíê…Y]ˆ«©<+[]ÿ]ë­¿¯iîc”gÒ›âZ½ÈWƒP/k{×íÁF HÛ'xSMÕ$ÕtßíÁ}ÞI_m E¬÷[šÊ†Ú að¤~±×›S]ʲõÞµ=Âd¹˜_]^\ij³e,ó˜ÎfƒŒH76qÂÎ ×ö/Œig"lƒ_Ò!! H$ „€@B@ ! H$ „€@B@ Ñù‰Â]x^ºxzzÚz]÷zäöÙÙò^;¥¸ëQîþϤøaï·Â®Ð„€@B@ ! là¸ïÞz|óúèùùMÙÑóó›yUyÛòPšAR¡iºéu¶<”dô¡GÛ.üÕJµµ±yÕì‚":éjJ5H ²Ú¯¦‡\¶e°&VÓE^/[ vAM,(UïD¿}p×ãjH$ ÈÑt6Äj 8jH ªY­M²×Õ_(Ùpwó^n6˜ÃÑt¶¶l}J2Z«ºðÕì2}H ªÖ¨šMõiØ%Ã<0Õ!õf—àP²Q:éõ‹þ®i(•>$z× nWg,ôb:_ ‰á¿År<{d€ûJ ƒŽ¬Ø4râê qMÓ«eY9lÃ(ƒ6´¬ØT¶:mÄEJ3ÊÀq›\ÔmýýJRÜÈŠj JRD']mB©YqÓOÿ¶‘¸Hi路¦˜²¸I9lCM,(•‘9hFV„{H$ „€@B@ ! H$ „€@B@ ! H$ „€@B@ ! H$ „€@B@ ! H$ „€@B@ ! H$ „€@B@ ! H$ Ä£>oZ.æqyq1ô¾@q:äéééûEê5‡D „€@B@ Ñëwˆˆél6ä~”£é,–‹ù½×ãô·é9è_ùö1ô1sºërÌ4± ! H$÷ú«Ç'ëw¯~uw|ršNs·ìøŽ½ÝÎÕN¤é ¶ØRø.ér|÷ÕA4±í¤ŽéÐŽãN× ›Žñ¬6¿ªc\ïj^½‰[_>+/ÁÞ„ñ´õïš^·õKï'î}@šNèwà+›ë¶¤4{!CÓ'_%Ÿ—ƒè¤GÄZ»˜þ†:†më)íít ÒtÑgŸFj’n²ãÛõ§¾|ÛzJ;7;ˆ»Ñeyn»ïñ]n[WÉçé`šXЇ€@B@ ! H$Œj²ãœƒqõÈÑÔ˜LÛæŒ¯w@Jù!ç9ãÓ„€@B@ ! xÁׄÐnWÕ„ÿÞÖM®"®&W?¼ŠÉ¶÷Šò=™b¨­r<@IEND®B`‚PythonCard-0.8.2/docs/html/dialogs/images/dialogsfig10.png0000644000076500007650000000312107523020030023240 0ustar alexalex00000000000000‰PNG  IHDR~wÅ,ô@sBIT|dˆIDATxœíMoEÆŸ­ú8æ#øè£o^)…Iú"5­ÅK$­rZ¼T‚"êB¡¼aÄ%ê Â}B*­o>ú˜c¿98cÖ›Ùõîfvfìÿó“VÙ×™Ñ>yfþ»3;ö†ƒÑN·‹OwzèmwAdp|8Lí¨7ŽŠBlr\·3ùÏ@­ð°Ó‚ /­#€v¿ZG€Ôkƒ ˜NŸydæ¡ò1Å1£©‘¹!ÕñÄO«Ï”¾¶Vo`çÆ_(ü\R&K^SyUßÛíâçݯ´Ç~øõs|ÿËgUh0îø~8¿rÐZkO‚”Ÿ~ûðòéwLg+–ÖV½ƒIÛ¯`p7ç(a•Ðñõ¬r¹ÿÇ“;SÛ§ŸÛÊ<ÿÞã¯q~õ2z»ãÌ_8ùæäؾÀ…3W]óíÃO¦¶/ÿ oñDÓÛ՞Ö[ØÜŽ_]ÞÄÚ‰‹8ùì%À£¿·3ÏWU½]UÿÝÛ€õ«Ø<÷>àÖ½óOº@Nð%É%üÊò`÷ßÛ3ݾþüëÆÁ]’O½`Ü%yõì»ÆUýû70¸ËCo»«uvÚ~Eî6~uySÛñ ãÜÊ“އøs<¼têíI:Î\™ê€xíì{‡ó •ÀW¶sˆ‰ns ?gÔêfÊPø9Cõ®o£zR-©Ž¥U·YŒ™ÐñB¡ðB¡ðB¡ðB¡ðB¡ðB¡ðB¡ðB¡ðB¡ðB¡ðBqÖ;··ÿÿ° Ú'd°á÷öÛ¸vm¼ÞïGóqXÆzUšÍQ¡µÕÆÞþSÛÅ‹m|³NÖ)¾¬ Ÿt{œ(ŠÐétΣøUã…ãiדê±&|–Ût½=¼q<@×ÛÄŠðyÜ® ëíàÄñý~„ Àdé÷£É1ºÞ• ¯s{†™Ût}õxÕÆ+èúê©Tø"m{º¾Z¼t<@×WMe4Gq»"ŠÆ8N{ûOQ[*?«cQfM$”<®›  -¬s‹\ŸSù¥ál蕪޳ªy…m×› ™F²Z/²/OÙÒòK#èmwGÃÁ`òcDõF£ô+E#ù F9?QWC´”ómFø>“g2CN§BÉ+:ÀçzEÚ£\QŒ _ÔíÊÁÀ¸ Ï#¬Ëçz_05(ÕÙ›»xÇL²“& ºÞF„7ñ–./‹áû€3ÇGQ¤]Ÿ]ogÁ]³Æ‚»°t:RÛú£âmï\ñÑ:¤Ë“òs¼?>–ÎôBÑÍa´¯-uÑÛ¶m³}/G%m¼-1(zy*‹ê)ŠßÌ]TOÌ@á…Bá…Bá…Bá…Bá…Bá…Bá…Bá…Bá…Bá…Bá…Bá…Bá…Bá…Bá…âdxµ©O%PÕ<þî~¡bXî‹\)ÔêJÓwúµlÙϱ÷…m¼P¼>9-ˆÔ¿¶0:#F^Z[mì “|ÊÎê°h¨û ôª î¼p¼mÑ[[í©%y,k»JlÞ/„·ysãóÉ©%-Û5‘Íûà…ð>Vó.š:Þ1®b:^(t¼cLÎ0Y:Þ\ˆOÇ{‚mñmæåô]½ÂæºN̬üu3MW…Íûà…ð¶£èYB9ß$6ïƒU½m¼ ØÆ EdTïºẆ¿6ïEï™ÆFïGàÅ™ðU)#ÙxÑÆû8q<ßÜCÇ … … … … … … … … … å{Èd˜üÞ£úR“,>Á£ƒ5®ËC,ñÛ!ÙÏBIEND®B`‚PythonCard-0.8.2/docs/html/dialogs/images/dialogsfig11.png0000644000076500007650000000427707523020030023256 0ustar alexalex00000000000000‰PNG  IHDRP†‹øÒ_sBIT|dˆvIDATxœíÝËrUÇñŸ(€·ÀK-µ…J2!8±†‰‹@&•*s›¨†™Ì Ì"@ B(1SJ\Û™Äve¨°ÕRK¿gŽÜjŸ¾ýÕWõ÷S•J·Ô—£#éçsN«»;û“ñÁÆ` #†Òy~2Ï<Ðíõ** 4Ëó¾á 8Ê ’´1šÌÌwÔ‘:¡ùg‡ÓžyïzÐ6|ëuÏ彞g;GÖë„^ƒo½ðk¯ÙþS¿gÖõrz¯«Þ?Ÿµö|Ö¯}^Ïåº5h‘È(,ªÞò æu—º=müsO  ¥,ÇzÂëdêÂï<ýZ;O¿Î¼SŸí'_iëÉ0óz÷wïè—Ý/r)C’ï·?Õ÷ÛŸzŸûnë}·ùI)åPO•µ@WN\=2¸\µ~&IzãÌ_%IV>”ôlúÞöMIÒ›««¦p ³¶Þ—¤#¿…zÜIÝÝùí°å™W+êÀ¤ ÌàtÜ F…´@ÿûë¿%I§½­‡¿þK’tæø=üß³é•Wµýä+IÒê‰uoWþÜÉw§Óö¾ŒÜ×/;³Ýù?½úIÒO?—$õš~|tK’´¶Ü×èÑïuº¯(?<üLV>œvßß\9luÞÛº©·Vÿ~do7?ž™ÿó¹Dn@ýŒ†­­÷gB4éìÌT-ÐÝß¾‘$zù²N½|Y’ôøé¬åŒuöïH: M÷ÿk'ßÓk¯¼7³¬ }ýÔzýÔ’ƒs® ïãë»ð¼xöú48ï>øhîr(W00ÓœÚ^èï@]KTÒ´õÇ…gž~||k:íZŸEùvóc‚h0_>N¦.nü3w|DKhß#ߥ°ÚŸÊé&Ýß»£û»wfžûã+ïK’~Þ¹­ŸwnKš Î¬ÜØ§û9S;toëæ‘ç.ž½.i¶ ÏA$ 9F÷¥õ¸Ó “ñxz=Ðn¯§ÉxÌÅD¸ÀCòz9½×UïŸÏZ{>knß½åÌg"ÝØq*'€vËã²(€ÖYêæsáx@ë¸.ø¼j ê*²zi­[f9€$Ìù¢ F( `D€€ F( `D€€ F( `D€€ÑÜšæÎuÁåÒ.Ÿ×~‹Vd9¬Û®KÝdánàÕIJ£½jßúB¥¹gsÑ’îØ7¯47µZ®Ý¿E½Xs¨ïC࡞øl ©*kúºkQÝ8_‹$øX\×/¼\ܾ¢ö›eûi··¼o¸#i½(qeJz¢†]Ҕŷ¬eê®’[z[¤Áé`K$êñ´ÛJ»ÿ´ëE=ï»tšmÆ•!êöª–²G-ë›öm;‰oûQÛISvz+h’\4ø¥‰ú?¼¼¥UÜGÕ_<_ù“ê"¯ýd]6¯ºÊúžÅ-Ox¢ijsS9KëÇÉ3œ¬æ)Vi_gÑeš·Å 4]nc á++ÔÜ—6êè­{fI]ôàóÁ.½›wó}˸é•ÍÝ\^8•޹.ã§ŠV‹.<4Q-nkìºãnš êÃÓ7Æé[>8®Jø(Sij 7·NxÝpÐ&íkikO/fÞ;Ä«¼J×@S• i~‹Yøï5ù=(€œ £á€ +XX…è¥~¿¨M@-pK0â‡ô`D€€ F( `D€€ F( `D€€ÑܧrrÊ&€Er©ßOks( ÐV´@Àˆ1P0"@Àˆ#ŒP0"@Àˆ#ŒP0*ì¶Æ˜µ¶Î)¯i†ƒLËw{½‚J²X–º½Ìu‹xh‰ö'œög©kBN)ŽGýƒ-d?êMÄ( `D€€c -þ@ðhìÚz?v¾Íâê­èýòÔÚ¾/cÔ”/î¡,õ†v¢ )Â!õƒ Z DxZ»÷®î\=ºçÂC#áåãGý €QÔ¸±o:jœ™ñçf#@!IÞ/3âEž›¦£Z hS„hz¾–£õÝ\DÂŒàøŽÊ«n¢¶CÝ7 -Ðð…b\«‡–è3qõ–õMxù¨í´½Î›†m‰¤À̲|›Ì[oÁù¨mQÿÍEŒP0"@Àˆ#"•Œ+¯‹ƒ-Ñ<÷üA<þ0¡ (?L¨ Z~×WêUá  `D€€ F( `D€€ F(=Ç9Ä`Ó‘tàfFÃe€”:ÒAçà÷)uª.4Æÿ}ÄW`JÓIEND®B`‚PythonCard-0.8.2/docs/html/dialogs/images/dialogsfig12.png0000644000076500007650000001464007523020030023252 0ustar alexalex00000000000000‰PNG  IHDRô,5»AÈsBIT|dˆWIDATxœíݹ–äºy`´Ï}?Æ„vªÕÚ%ËÉ„’µådÂÁ ;±ÝZ=a'¶%kßÓ;œ·ïåp Á"ˆú¾sút›@T5ÿúIxóæéñíë»»ðáë‡ðp€óùàéññÏooj °Ös §AhÛl@!„×O³ËoÂM73Ë>~2¿üo{oY¤Ìw¶_(svyáæ&RפÌ÷¶O”Y²úE¿\²_BHìƒ×`¾\ý2_®~™/·v¿Ì´‹¿«Zpˆh†ìïöK¿zÛgÏoÃëûmA@€Ã­»6ÝfÕ)÷_ÿù§á×þéGõçŸ,nóË?ý8üò?^S°`s†þ…Oþst€PæÅËW!„ðÞÜ0±åƒâ !CÀøøqj¸ì ý7ù¯Ùåé÷/~ò[!„~õ§wO¿éSßžÝîüÑ;Ï¿ò™ï~ôøÿþðÃ÷Öÿêg¿Bág¿¿ÿhÙ×>ûr¶ìÿýݾ·ìëŸû~!„ÿþí¿‡Bø§Ïÿkøïß|üZñp^¼|õNP_šÍ5+C‚ùç?ñÍð…OüsrÝ/~ê[ý„ð×kçSC0ÿò§¿¾üéï„>âÃï¯|æ»á«ŸùÞ;Ûýü÷?!|ÈÇÁ}Î×?÷ýùÿüö?’ë@Kƽ5Ý×?÷ýÕeÀž=¿­RNs®Ép·´­N5ʘÍпñâù%ÛœÊÛÂåÀÞdèÐ:  @t耀РÅËÔ˜ž(÷W¯¢qxÕLq¾~ØÔ  Lµ»­M½y’©À¥g»S÷A˜Ëðü6ï¦,¯ïÒ™ù@@€ƒÔ—Ve”ûøÖo±Ç±õkÕ]£®­íª¹_P¢û¯­í}­_ ›ú8C^Ê–€¸œÁo1›ú¿yz|çq̳ç·ý}ø§§ëSϧe×™;í?÷Á#Õ®TY©Ç©¶¦ÚæCÀu‚ùÚ Þä ¸ipÍù 0ýû4اÊ]SVκÃã¹síXª€>Mƒø‹—¯¿w>uÑ€ž°ÆA0¶þšàW³¬Ò:j­@Jƒ÷œf¯¡AX¶ë5ô’ÓÖs×–cA½fF]RÖЧÆhÍ®§Üs®=Ïïéã’úÆeo‘*kü|îùÔôƒ‰äΗ«J@Ÿ¸¥Ç¥Û攵T~¬¼œv-Yª#V^j}úµåëi1MŽroÑš30§tœ›³¬TrÖpsèDs7gŽ% @t耀Р:t@@€èÐ:  @t耀Р›úpŸðñãÜe@2t耀ØÐß<=¾÷8wP‡ :  @t耀Р:t@@€èÐ:pú€Þê^R7£™{>ý©UwÉßöª3µNî>§ú°Õ÷À%}pt¶:Û4²ã»Ï¥¦Ãþ½Dj»Úýµ6ËÇí‰ís¬ÏøØéú™ iúû̆ö§{lœ}ï±ÏBáõÝ]Õò.ÐSYÙø€?]–z¾´ýÆË÷–s3𒶤öm¼Î4èÕê¯V©›ý=xñòUõ2›ÉÐS>ŒR§kcëÖLsÙhN™ã@¹Tfî¾-µ³Ví4S¶R}pVožÃÓãcx~{[ô;åâ=uútéÀ=Þ¦$ÀÔF[Êö¡ôzìCDêTt+ý•[_ìƒJ¬ÏΪv0¡¡ =„²,÷ÈûÚ }º~É~l wtÕÒÓ¾×­4˜çõC¾¶–s`Ž}Åi¼ýQ†Œwü“£V›§×¾—F‡Ý_1[FÈœY×ú4è,]O^Nm´qK³ó5ûV³¿J3ãœõK_sÙ9Ћ=2ô›‡û»·OáÃ×ááþnq£a]Öõ¦rú èÉÚ`žŠÑ›2ôÒÓ¡­nw+ýp&ú èÉú¦€~ÖƒìYÛ @ö¸†~ú¹ÜàlÖdèKw†k£¥´Œ]jßbƒËj-ÿ=5ÓÜ¥Ê(­'&õú•Ö›;È0wR _]riù}½uV·5혫³ÖòuÖ.£ôƒU¬þ’2·¶y\gËïk`Ý|½Ó©icä߯j”ÓòŒt¥j·/÷=ô¯›kèÃ4žsRlùÒ:{Šeß±u–¬ÝÏ£@¬ò™i,³^ÛŽ½ú}ܧˀ¾uq =÷šå4›‰m[#ÀL唹%ÃZ»Ÿ{Ÿº¯YNlB›œúöÈ^×ï¹€›*¿d’àºu ýˆ©@·­á½fµëÌm³W0/-{îÃIêºòÜLvã¿oi{É:k?0æ~Ø\ûžúÒÜ÷ÐkÊÔ´ÇuÍ­uÌ ŠJÕ·Ç~¶’™·Pßô2EjpÚ^mXRòžúÓÍ5ôZjdëéìñOͺ÷º,P»ŽT95®7—dý[^×éëË’—ÖÙƒÓíÀ ‹kè±ëˆKˇðÒuÊK·%w\Àt»¹å©ý\ú Ø´¼X9©~œ+gΚ²·¶;§þT=Këäôû–ýN½g€ë²G†îæ,90SÊ{a]Pïúæ,G·Á™RÞ3@s£Ü[80µÐ(a¦8è€QîÐ=F¹ èpa2tè€ : C€ÈР2tè€ : C€ÈР2tè€ : C€4™¡Ïݼôå5êl±ÌK–¿¥®K¶­V9Û±_15þOŽÜŸ’ºÏ´_p”f3ô5ÿ—ü§m{ÉÉ%ïÛÞú=âŸ=¿½H[ꇡ-‚B£:P¦Ù ýÍÓc2“xöüö£Ÿéò¥ubë·)­«F™±ç9õäìgIYÓÇs¿Kúinß–Çöméõ(Y?§¾¹:bë¥ö3¶ýÖ×$VÏ^ïûœuj-¯±íÖ÷œÅú{7zzzuü||2¶ÎXl¹2SËKʬÙþT»sÚ´Fî>•îGJN¿Œ—/­볜¾Ì郥ý¬Õ/ƒœ÷qÉú9íËéÛ¥å©rrÚ¼´mí~†–í‘¡W èsÿ°%J?m§Þkm)3·Þq?m݇ØrZ_-9õÍmSZÇT¬ÏrÛ0·}Îë°Ô®Øz%}TúúÔzßoýxÔ¶[3Њ5úRP¯š¡/z_Úv«XV±Uísê ´×>¥VÀÚz ŸÛ~ÏÀ{igtÙz?Â¥4{ ½¶–ƒØÖl}øÛÖ?ÓÓ×{f-µê[›­oí³¹í—ÊÌy Ç.ýš¤Ô<£´g9kÎjÍ=‡3:Å5ôérîùxùpÊsn¹rSÿıƒslÛ5e¦Ú–ZgnÝœ²ö°ÔOãç5ëY*oé½²¶MsÛç,‹ý­jI0Úû=𻼤®BQ]¥eÏÕ%¸s6{dè7÷woŸǯÂÃýÝâ†Ãºþ`½5A=£›<å=»škèÐ33Å@šÌÐǃXŽÞò¨øâ3ªÍý>ÚÑíÈíØß·¶m¹{Ž,¿äk²µG¿à,®>C}x8˽¥¾{×™³NI;j¨éW“ZR£=­íÓœ3´zÐd†”i>C>Ý?{þî ÆçÌý}ZÆxùôñÜïTy© ±äïÓuSmµ9µ/¹}2·N¬Kýš³nIÙ9·¶#§¥íYÚX}KíÌY/VÇÒ{?çýRòN½WJßÀ»šžË}jÜçæþ>]/v*viêÔTy©6ÇÚZ²_19ë•öIj»i9ý:W~I¤ÖŸkGjùR¹¹¯m‰Ôk›zžûž(ùŸÈÙ§œ×}nùÚý,yyÍÏ徯tƸÁÚó–ƒK+™DÎì[±íæú²¤ŒÒ6-•½u–·X¹[Å>(…P>/év9¯S‰Ú¯õR­üŸÀ™*C/1w`½ô§þ=2½Úrú$5UèÞû¸×kÖcX:l©½^ë3üŸÀì‘¡>(nœ½å\{<‹½Û»~Â>óÁ—–7¾F;d¢µN‡o1 ¤[ëšö¬}†õ8Í]ºŸG¶Î Ë }î”lì& ÓS•¹‹œg€3Ý—iy[‚G¬ORõOëŒícì In}se/]?_ûÚÍO}¬LJö3§Œ¥×1¶}i;·´q\çš!ÀûöÈЯòæ,²†þõúŸi¿ÎÔV¸´µÁ<£ÏÐ/a.S¦o½½Æ[^Ò™Ú Gér”û%8°pvgzŸ©­p3Å@šŸ)®Dj`ÍÑ#´kk¥þœ JJ–ïÕŽ=ênÙt[Þç–ÛgÒU†¾4 z«=<9e¯ ½¶Ý9#½kž ]ó5¶¹™Êj”½·-íÙÒO-j¹mp&]eèp­šÌЇÉ#¦ÏçN#N×›®?=%;]g®¼¹¿M눵!ÕÞœírö9wÝ’²somGvæ¶c©ìqùkÚ˜»íÒû­Æ¶9æÖO½æ©÷Gª¼Úÿ·©r€wí‘¡Wå¾tƒ‡ñòé:KÓHÎm;WOª]%åLO)ÆÚžÚ‡Ø)îœúÆÛå®?׎Ôò¥rKû·t¿JÛ\ãµËÝvéõÞ²m®ÜõKß±zjýßnm\“SÌ7wðŸÎ(Û®ä€_*UïÒv9m¯Ù¦¥²—fËq¦ ªV¿çΰ¶$çäÙÔú¿=Óû ŽtŠï¡§2®XÐ>ò“|É4š9m¯}@Û«_Î|-¿gΦÖÿm}{hòzÊôšéÜ<Ð-–K]»Ü:7vn}9볦mê!«ÊÙ‡=öóR}7¼Ö¥ÿ/kÚWëÿ¶‡÷ì¥Ùkèƒé?þøbêñÜ6%õ¤ÖYºæ¼T÷\Û§§"—NW®©o®ìœ}YÓsYV饈Ò×0Õæ=^»ñ:¥íݲ¯ãmk|xÍy?Mß³¹¯åR9SÓmÖ¾àí‘¡wqs––²|Ø‹÷9ôeMPïîæ,ÓŒÃAŽžm ´ç£Ü/ÁkâýýÙc”»™âàÂN7Ê}Nl€NéòµõÔ°vtúÑíh­ük¡©®çr¯qZñ’_!:ÊY‚x‹ÄZÑE†×®Ù }˜ðbœ]MŸÇ¶?O•—Z>]'UON9©vÅ~çÖë«¥Ç5ö1ÕÞå§Ê©µß±÷YîòTÛsÞǹïëÒ×®´/€skr”ûô»±ãç9ó?§¶žç¬7ˆ­›Ücëw{së(Ù‡%[ö1Õ÷5ÊŸ+§t¿SÓΕQ²<÷ý:·|©ïrÞËs“è¤þôés¹çX{Ð*ÍVR(rë[šá«æ8§¾ÜúcûXÚÞ­}˜Zi&²­u––³TþtƸÒ:—f[®G“ú%Õ ž×í½µ>äŠõX#XsÊ_;…kΙ Á®‡ï¡ì™­M¾µæáŽÙ»¾½ÅÚl}œíÌJêŸMXÓÞÜí†õœ‚‡~5™¡×¾!Cì —SON ¼Ä $¶ìCnÙ{íc­ò§§§sÛ«? ceÏ-µ%'Ø.]"ØÚ/sëŽ÷Ep‡~ì‘¡wqs®WêÚô™ß£go?¶6˜§bôiO¹Cœj‡ëÐüýÐáÒ.ñíƒK:k»2fŠ€49SÜܬV¹ËàÉРMfè@™&3ôñ ž¹9±SËàÉРMfè@:t@†¡@dèÐ:t@†¡@dèÐ:t@†¡@dèÐ:t@†¡@dèÐ:t@†¡@dèÐ&3ôgÏ—+¹„VÚKšÌÐß<-W²U,X—_¢PC“:Pf ýƒ­zöü6¼yz|/[ž™ó4ËgÔs™öÜösYø¸þœvÄê€KY“¡/õÍ}l.øŽOƒê8O—O×Þ¹å©v¤ê€Kh2C?#è8RóúYÈÈ8R“£ÜÏN¶À¥í1Êý¢úÜ`´¹lSs×¾SËSrê€=5y }iÛÖm¹ÛÖh\Â×Яþ”;\Ú©¯¡ËŠà¯Ìh6Cßk¤ø³ç·ïýѦµmˆ•5WæÙFÛ·ÔÞqŸæ¬×šK´;·€Ëhr”ûÞ3­MËNÕ·G[æÊ¬UÏ–rsÖÝóµ¹ÔMyJ¿ÁÀÇb³.Çk6C¿6ŽlÑd†Âû7h™»!KlÙÜÍSJêL=×—s3˜5íɽ±L‰œ~·9gؼöc%7°iá¦<±6å¶©M±mce”ܨæ-S÷'ˆÝÃ8V“ßCaþ;Þ97]Iâñv±º–ÚRzs–œöäÖ·ôcißÖöcl’ö—ÞÀf©ÿJëXš3 Õ§©ýZzžSn¬ž’÷Z¬žÒ~Ï!ˆC›®r.÷-¤Òm×ÔµeQËÛ³ž:kûÏÚn L³úµZ“ÑEË6–œùu9s¿ùÌ72œº<âÚà™Ä`Kq{°¦ß½Vp§ÊÐçLíUÏ´Î¥ë½%íJ ›û[Îö%bíïkÎ:Ó¿ RÛŶ)µ¶ŽØë¹Ô§¥Ïy=×|*­'§O–úcÚ³G†~óp÷öéñ1|øú!<Üß-n4¬ÛÂAÂÁªÌƒ®Jë<“ÖFˆ·Ò`»µÁ<£Oy ½ô«e×NåI‰iA+í¶»ÊQîsØÊÄúëýx¦×êLmÎÍLqÐ&ï¶fT-”i2C¿ÄiJèI“:P¦É }<õð3~>^oºÎÜߦ˦õÌÕŸ*3wbu¥Úk4{·µA 7阖¹ôÝÝÜu×ܸæ4™¡·h:[VuKÊ€×Ð ”L¹š»îÖi\ z¶¹y­KÖ»‘II™Òü5ô%{ߤc®Ì¥¹ËS§Òçnük#äjònkKØ–¶Å–§‚ëšå©l¹Z  s¹oŒeáìíÔ×ÐÏ ‡û‹À^Œr€4›¡·4ê{:#]IÛöØ–ú€64™¡·8kÚpÚ|øIÕ½®›×0Õl†äk2Cáý´Œ—/-K_ºaJÎÍ[JÊ›¶qnY¬KûpÄÍkj÷u4ù=ôæ¿kžsÓ•½nx2 N9ó¹Ïµ3ç2%ûpé›×Ц«ýz,¸ÅfoÛÜJ·=C -í?öå:tàôs¹—šf•©{眲¿¶Œ´vÿPG³×ÐçäÜtå(s§sï…>ݾ¦Ú7¯ M{\C¿y¸¿{ûôø>|ýîï7Ö=kðh5ðµÚ.ê[ÌS1új®¡OïoG¹ºkè5µÈ[oõåhv¦8 Ÿ : C€ÈР2tè€ :1éœß/^¾Z,ïj¾‡-É9B¯ïî²ÖÐà 9§Òs9åРN¹ÀÁæ½=Üç];ÈÐà`Óà]ÌCР C_ÌCРkƒy:tA@€åÈ.—€–37{©Uýáþ®êtupM¶ ~‹)èßxUÿS°Mq@—™@{Œr€èÐ:  @t耉e ²=&Œ¸&{|?®€;xóä륞=¿=º pj:ìÄœ ùôlç:t@@‡ ®«û=ÿØîæáþîíÓãcøðõCx¸¿ Ïooþ‚ ^¼|Þ<=~ôôâå+½ Ç  Šƒµdè°3*N†õè°³£‚Ö‹—¯ÞùIµé¨6ú°õå;;"hÍæú?ò’€ËP vÖòi壪`õè°³VƒÖÑÁ|hP‡€;´âŽþ@=Ðag­­‡û»Ã?l]?ôD@‡µ´Žê­~Ø3Ðag­­#ƒzËvàl|m vvÄà³¹ jðþíêÐagG­¥^²þ^Zi½pÊvæ´rœ`õè°3A+·¨G@‡ Zq>ì@=:ìl<@Ío÷C‡½¸:T6½:Ëܶ3Êv" —$ Ãž=¿=º À•q : C‡Ê\Ž C€èÐ:  @þÎweàünBo‡'÷w&ÀºyÂÛ›·{nŽn°ÂÿÃbq`åi ;IEND®B`‚PythonCard-0.8.2/docs/html/dialogs/images/dialogsfig2.png0000644000076500007650000001330707523020030023170 0ustar alexalex00000000000000‰PNG  IHDRôšù(± sBIT|dˆ~IDATxœíÝ;—ëHðj`?F‡ófg sxy,˜ÌÎÙ`ÂÎhX:tÆÂî,Ä;œoÓÜ«¾eµ$«ô°KåßïŸn•äRµ{îü»’n¾y<<=ÜÝ…Ïöa€åùöãápT°Z¯/Ô`¨o7ÖCÈ[c ‡ÂÃþq¶“Þ„›ê›—eQùQÙ›òzÙÍëÂæúë !„››†ú‡´µ¡®¦öNÙÖ¦öŽ®«í³ùs7Õõ¢¾?wS]Mí¬­-íús7ÖßÐ^ÿ–æikS{ý[ GåKþ·ÔÔÖ|ëÒ Ækí¡@ÉÖßÿ—Áï½]­Ã7ç§oWëððï_NÒŽªžIý˯޶?|çÕÕÀ¬†¬‹ß3öýSÖs2пüú¡3 ëa—Õß÷—þáű¿ûã£íÿýê?C!|òÝŸt¶ë¿ÿï?B!|ú½ŸusëÈs_EvrýÃw^=ô—_?}_yzóz¹Ñìãïü8|ü×AþÅW¿?Ú÷É»?9æ°4}}³Ý…Ív×»¼r²‡þ—¯ÂGozÚq¸O1¬þñ»?_|õûðÅW¿Ÿ¼+ÄX®W»ö°}¸ëã¶ýýÝsxW7|«‚¼ëp'ý£w^=‡ú_Þ„ùGá8èBøeõ†›p²‡Þ¥>äþ?ÿøÝÑþýÞ¿5¾ïÏÿíÑögïýüùû?ýí7/ŽÿÁÛBü믟Ë~øÁ/´^›ê>.q¨Çe]N¹÷GQ¯<þþ—õ7Mx‰ß÷¿ûÓçWoçÎcU˜úÞϧ~SÿÓß_‡xæ?x~ðþöè}U˜WA‡;\Rà}nÍž<‡^eõñb¸·çOO¯_SùŸüîù5µ8ÈøÁ/ôÐÈFÜ;ïš;¯ôè¡ÿáy¾<ž7?Ç¥iUˆÇ=ô©é›xμ>Þ¦GýGá˯__nöúëSô}åW¡gO¹£^µÂ½~éÚ¹üñ¯¿~îWÛ\§jκþºD;BhrµÊýõu诿ÃýÃw~õË£÷œ õ/þùöRµ®0ÿþwÚk¸ýÓ÷~þü÷ß-Œ«Å}öþÏßþö›ð_»ñ¾~ð‹çP¯¶K½Ç/óJYÉÞ¥m¾üÔ<úÉ@¯æÐßÎ¥?„^Ýp¦iø½é†3}çõM7Ô¯|òîOŽÊ†Ú£öW«Ý«íj1ÜQýo|öþÏŸËêÁnÞ€ú-aÚ×¹†â›Î‡ºp†Ëè\­BhLúö´§ÐÖNCçE.ŠsYÚõš+´ºêúœmõu•ç˜U;ãùó!—×Óʾ‡¾¿¿{àñìïïÂj½n½·p×>ÚÅŸ/o?9ÿg.,úóY]Öãáàÿ­L"û:0­Ô`:ERí|6P¦E.ŠŽ%÷ÐÍóp͆܀à’Ýe(”dŽÐõo¸”¤@·Jº5Ýûà,Š# ©×c§”w­êN}€JÓûr ÐÉBÊÃK†<ìäTyêƒL„9Nú QwÝ1-¥ž1mÈ•@çâ¦|ÈȘž³^7°d®Cg1†<ÔdêsäJ‹k{XHêCMRvRžwʃL,Šr#ÐÉBŸùñ¹ËSÞÛç lçdÈ Ð)žÞ2p ’†ÜWk …†º]­Ýi€Ùx8ËøÌNk[ÌÖuüØž÷\÷roº!ÍTõ¦ì_ÒÏŒgÈ‹‹Wš·­*Ÿò\•¹Âî’Îu¹ÝÜ¿' @';—E€%rÙÙ;Õ«ò—ú°qÛC]âžhÛ}ß›ôy`LSÝmǧž¯ëþómÛS´¸œEúf»{QfY9NÝfÈvßµœª³éû”PK­ûÔÏ×GŸó y(0‡¼-"ÐC˜&À7Û?2Õ§‡Ùf̃]æzߘº§œ›î»Àpîvó[L s½®í®lçþyRï®äiñ‹â6ÛÝó+.‹÷Õ'/)=Á¡½õ¥ö6ÏÝîÒ>?¸&‹é¡ÇA\ ›×‡Ðãí¶ï ¹ç§k½k_×þSå)ç¨K™ON­»Ïñ]çO½F|ȃn€<-&ÐSƒXp/KW`œz8Êвœª£é‡SmíÛŽ¶ºOÕŸ²Â¾oû ¹C?ä¹8ÇÍVr Y«Þ!?&t-!w-?',Éb†Ü›ìïïçÖOo8€Ò,"л¸i_½,Þæ”È;@ @: yýñ`u+ä&)ÐÝþò”èVˆ@žÌ¡@:@ @:@ @:@ @:@ @:@ @:@ @: éñ©«µç¡u»Z{ü,³I ôBx<æhGÑ|fÌÍ;@ @:àb¾Ùî’Ê€vzèP€‹z½7®wÃ$_¶vnqÈÇ×qWå}˺Êã}mÇ@Î.èûû»°Ùî^|­Teõí¸¼«¬:G×û«ò®ó@îÕC¯Ä¡w½¬íý©ç€Ü]<ЛzÌõý}ß×ÕS¯¶û´–fQ«Üã¡ñÂÑ}SÙTç€Ü]¼‡Âé^xý¸¸¼oYW½§Î¹»X ÷bOŠï[V/â,]=ôsk»d –ê*]€PšE-Šš%÷Ї9ڌ跫õ\íFH tsÏ'sèPèPèPèPèP€¤;Å­Öný:ÔíjíN{ÌÆÃYÎÀgÀÜ ¹@:@ @’çÐ/m³Ý½(Ûßß…Ívwô®Éâ=„æç² q®™!w(@1Þ4¿Ùîž_P²E¹ÇÝ6Ô^ŸK7·@Éè}ƒYÏ€k±È@ïK€kQÌú)z딬ØzuMz¼ ¥Z\ ·sUïâ\‹«r€’ t(€@€$Ï¡?s´!)ÐoWë¹ÚŒèV@žÌ¡@:@ @:@ @:@ @:@ @’î·Z»õëP·«µ;í0g9Ÿs3äèPHžCŸÒf»;Ú®/Ûlw’@ï¡ïïïž_§~ˆzP¢‹z¬)Ô€Ó² ôº*Ü7ÛÝQÐWÛõðï*ï:&Þ®—À\t=E5ü^ŸW¯¶ÛÊû¼7>–h1ëÓsÐ\“Eº°€cYÍ¡¹L­­·>tþ»¾wÉKrñz¼}´¾>žï*oº4®ë|€%¹h Ÿ ͶkmïëSÞtŒð`é.ÞCÏIÕ{ð,@r–*«EqÀ0É=ôÇÃaŽv#$úíj=W;€’Ý3äÉ¢8.bgú`B³{µó;€© tÎNÏ`z.[€t(€@€t(€@€t(@Òek«µ[¿u»Z»Ó³ñp–3ð™07CîPèP€³ßË}³}ù`Ž)‹Í]?äèì^…ëf»´]ïO­wl[àÒ ¹@² ôÍv÷üŠËN}ß·îø§ö9œSVÏC¯}Ÿ oÛ‡oý˜¸Îøûø8Ãï,MVBû¢¶ª¼OØù#–,»@¸.»9ôX<—½¿¿;꩟Cu>«àÈ]V=ôz`Ÿ:o ÚzèŸ ã®ºú¼.íbžžm ÖN{j_S]€%ʪ‡ž“”Expi½… `I²^ô“ÜC<æh0BR ß®Ösµ!)ÐÍ+@žÌ¡@:@ @:@ @:@ @:@ @’î·Z»õknWkwíàˆ‡³,ŒÏ€&†Ü  Р 0y o¶»ç×”uÆ_SßwªlHÝ“äUî]6ÛÝÑåTõm`³¹çæõÞ¸Þ9K7iý”88«°¯ÊêÛqYߺêåS·5.ï[vª}©?74™4Ð÷÷wAÖ¶‡ZŸ!û¶ãšÊ»ÚYÿšRWYÛÏÞÖ>SŒ5y½o0 ¬¹‡É›êC9îzÙöö`Œ³¹OiìM=æ>õ7½¯«§^m÷i 5颸”^旵ͥ~Ù\–ð tÙúf» ûû;¡ ²ô>6ÛÝó«^o@©²ôªwBhí¥WÇT¯ø˜ønmîÜ@É’ï—#½o®]öÞ'¬õ¾¸vÙz<ÜÞ§¼ï~(Q¶ÞW×¼yýA@©² ô¶ðÉu[/æ”,ëUî@? Р Рɫ܇9ڌ跫õ\íFH t×r@žÌ¡@:@ @:@ @: é²µÕÚuè}Ü®Ö.ñà¬Ü)nb>.Á;@ @:@ @’ÅÓf»{Q¶¿¿ ›í.iyêñ°4YzÍOxÎpÌ;`‘^ ÅÇ_ëÃóUYÓ°=”&û!÷8›†Úãùñêûúœ¹P tÙú©ùróé°Ð!wà˜@€d?ä>D5×"ë@o›¯Êëûãmsë\CîPèPèP€äUî‡ÃíFH ôÛÕz®v#$ºk» OæÐ  Р Р tÙÚjí:ô¡nWk—ý0wŠ;Ÿs3äèPèP€É}³Ý=¿êåCëzþø½CꀥH^åÞe³Ý]šoŸã’­úùÛÊúp‰K2ë{¡˜C`n“öлT=åøkáE>ÖÔÛnÛ—ÒŽ®óVåqϾí¼S´¦0i ÇA]m7©‡eôñ1mïiÚî£ïyûlOјÊä=ô>!7¶w=ÔÛõG\Êنܧ[8·öp½&]wÎkßsMݦ¶úôÖ¸¤‹Ì¡÷yﺛê8Õ†Sõ¶íó³ÀÔnö÷wO‡Cøüaö÷waµ^·>¬kßÔJZd¾0‡læÐS{ÖÀ[Ùº€á<œ Р <‡~®Uî@I~»ZÏÕ`„¤@·òd Р Р РI—­u=¯œq\ÀÉwŠûæÑâ¦äf=LaÐãSÝþu>G¦b 0:Ыyu_Ó¾À”nö÷wO‡Cøüaö÷waµ^·o¶»ðÍãáyÿf»³˜k€ês«>÷,Š`œQ=ôzµõ>ûôJ›Ž9õ¾ÔÞîf»;z©g á ÀÔFúÃÇqS_Õ+Ž_CÛ?¶]†Ý˜Ú¤=ô^†UÎáu©ž²:S;{½Oà7-$k*¯¿§kß¶5µ¯kˆ¾í¼]íÉù–iÐu蕦žf5”]ÿ:E½•úb¼SÛ}Äï©·?õ¼§ŽÓC`j£=§Uî9,T«‡x›œ>7Ê0y½*?whå]íÉ­­,ßEW¹Ï5—Ü·Þ©Ïß÷²=sèLm–z×¾xN½i~½­wßu9[½ž®¹ý¾íïSoÛþ>ï€)-âNq¥Í9»SS›ü:tNó¹0µìîפ´4‡ÀÔF÷Ð/ýÔ²%~-í.oÔ:ã˜C`*ƒV¹ tÈKr ß®Ös´aÔ:‡¤ºy^È“:@ @:@ @:@ @’.[[­ÝTf ·«µK˜TòâÜöuŸs0äèPèP€I}³Ý,o;¦ïþ!mØlwG¯ÔsŽmÌ-y•ûX§.ךër®¸ÞÍvw´í2–nò!÷zo6ÇÞíþþ.ËvÀPgï¡W½ãøko{Éõòj_ý¸êØø˜±mêSgÛþúzýœÓä^ë®Þp=Hë!Ø´/þ¾k}LûÛêlÛn*€s:{=66€çNa ÀÍèM½Ö©ÍÑ+ÖÓ`©®ò:ô¹ÿØ€s›mÈ}îÀL]©ÞgÝ©:›ë i Líf÷ôx8„ÏöaVëuëÁºöñV×@üYÀT.º(®.YàÒú8—v•‹â 4 РÉsèV¹@~’ývµž«ÀIn57äÉ:@ @¾e‘,ßMá©ÚØßßYÅ tóÂÓÍÓ›ïÂÍ¥Û ðÿ…éWc5aÓIEND®B`‚PythonCard-0.8.2/docs/html/dialogs/images/dialogsfig3.png0000644000076500007650000000374407523020030023175 0ustar alexalex00000000000000‰PNG  IHDRȰJ)!2sBIT|dˆ›IDATxœíݽ’ÛTÆñÇL. %—àÒ¥ê|a $K ØrBX…/‚bK$ŒK$,È’Ô.]únLáh‘Ͻ+ÙGßÿß$cK–eVßs¤cy°Z.ÖóéT'óXñl*ÿ»²\,¶fŒ¢¨¦·4ÏßL74@_y"Ióx)Ih Í¿ÁfzàܦÏ»\¨õø– µž2ß÷Ûù~-ݶɼPÞ º6 c2+ÐfÑí«;?w8Š4ÿöLA‡íÒ—vŸ³Sëùë'úóÕOÞÇN_Îtúr¶ËjÆÉUAþ~ó‹$éÃkŸK’n_¿ÞúãÕ’¤»7¿,ãýAO$é¹¾¬ù :éè…$I Ò÷­ä…ú ½ùY·¯ß×ó×O$IÝøâü±ßÿýAwo]¬"ÏÎoMúþ7E^&žMux<Ù Ée£G U¤‰åãkbýöÏ÷’¤{ã‡údüµ$é×ßyI ¨t ò ­ª¤‰õì챞ž=ªâ¥“¯‰e©ä0ï½ñà gCª¹}ޤ¹eU’J;éO_<¢‰…Zø:侎»+W@>¸ö™¤M'ÝuçÆI›Nºëã÷¾’´ÝÄ¢“Ž:ij©·RdÍOänb%ôÁ`°uD’îÜ|pÞ„:¸u|¾œ´i^IœmÀPtVˆ¯mtÒpæ‹”ŒÆÝCMCf9:Uù>àµvnQ5*` €€` €€` €€` €€† ß(t/åè»ÄJÖå­e‹<ß}¬Èå%,Á¾r›Þ1ÝûîŹ|ó­yéõ_¶^÷y¾i ¯Ê¾“î»8Wz'OÁ—õü¢¯UY@²>Á}•Àª$Éô®¯QK'=Ý’¶û-¾y¡^(ª’ âîìnsªÈã`¬áéÙÖ´¤óyYÓéyÖ|tËj¹ÐòÝ«>Šå^JÔÙÉÓAHîû楧³æ£{†£H«σT^AÒòìÔYýú3ýл Røù!¢bôCݤңX{¯‹jÒ;uŪ´‚øúæsß.Ÿž¶æ£{ê® •÷AÜŽxÞù.BÑu÷A*9’þηܹ­ûCžAã…[UT©‰gÓZ† [âY=ÕC*1 Éá7 ÍJ •]ÀQ,À@@ 0À@@ 0À@@ÃÞCMR‚¶9šLrï·{„A‰è2*` ` €€` €€J»ìOWÃk›¢F+ë·0ºf8Šö¾è\©WV\-†bŽvßÑâc µ}J¿6/H?¶K;Ð 0ÀÐÙßq¢¥fOÌé>³¶[Ù¯ÛÄ¿A'âÛØY€¦þaêPd»õE¯›X}ÿãçÑ÷íÓÉ ’á(.ÝüJ¶]²“Çܦ«»¼5¿‰z—ÕoóÝÏêçµ­ÿ×Û€øþX°e ʳ ³*HÓõ6 !)Â÷É¿«6mï^wÒ%mµŸqQ¨m“µž¦oûNVßNo}jQI6¬íVôƒÄ]>k=Mßæ ˆty Š,ß'ûn·ôtÖºÚ´ý{ßÄ,0À@@ß( ¥dŸï\ÃÆO5:{˜·Ëøà©Niiêqí.`ÛV‡N:` €€` €€`x‡1=@¶¤u2Ϧ ‚Rki=X¿½§AÝïh”ÿ$­1‡IEND®B`‚PythonCard-0.8.2/docs/html/dialogs/images/dialogsfig4.png0000644000076500007650000000410407523020030023165 0ustar alexalex00000000000000‰PNG  IHDRrxïÈyÛsBIT|dˆûIDATxœíÝ»rÛF†áŸ_@.Ã%K¶>e&±£´*•ØqTò"\¸dÉ8'•l£$NfìØ-K–º¦a/—»Àžì¾Ï G,@Xü¼Ú³›ÝvµZÉ««lÖ+èrw·Ý,˜/# Å]×B;Üõr¹ˆÈÕfw0?“Y3q8ÿqÙÁ¼ˆÌfÖüíJƒ”WÓ±•gmÏy-Tžµ=çµPyÖöœ×2åÙÛæºS´4Àà¼5r@¿O¿HÞöÞ|!W/ÿ‚F•Ò'ioäÿ|øÝ¹üɃgò÷û_EDäéÃçQòÇÛŸDDäÛ/ŒÚp(ªFþõýïîŸ/~Á;œ »i¥hÐ/³MÜÕfîB@%\›!a>Ø Ag^Èõ»×tx€‡¯ ¥«i%(È¿ºÿ·MܼŽÜ¾)ȼbED:9íei¸EFTbØp‚Fro^æA>9Œ¤½0W­€rÞùÅù|Èã*³ï˜êA”#È@9‚”#È@9‚”ã:rƒëÍŸJ¹Ùåßš>e1w}äFSbœ‘)Š=/y~ùpÊ.–K¾•!ȽºÚŒ}ÀàBÚk1<‚<m|85ÔÄëÄå‡Ô9¿\½šå±å¤.«IrÜõÁ6ëUПírbÿ\KÙÀ´¸2 T.”ʘ¡²*«i¥ÏYRß'Óu™Ph³Ë½ù¢X}9å–<.ý¢i¥›ÝöàÕv h©§‚ØeÆ0Ev‹Ùìb®ãZnjZÚöc—2Ý—âA^âD†ž˜²SÛÐ4£F) É‘ÍzuÊæ²Ô¿Òí2º2¥ú¦ó¸ÖlÒh¦ífŽÔ`u•m‡kùÐM?f…oº™ç2sy³ký®ãp•åš4èú.ç~×ÛúüÚúKì;Vñ6ò˜÷»øÂ¿­ì±jܱíÓv`»‚ºk{:e]ÿ±§ÌWã®­/pRב—ªí§ÈiƈÝ6e_3ÐW…sè+ëª rû¤¤\ֈϨm·BÚ´»¶qÍwmÛwv ä)'2·lódýBJ{v)\Bˆ©ò}‡}}aæ|J“pHÓ®oUwvöy"c·){¬ÎΆ¨®6p×ú®ÊÐõÍmB.EärE@¯*›V´I©õÚ®²\寮ŸZ=òÕ¤à´ä="À O´Y¯ÒÈÄw¨ ‚<ÁÅòtnóúBçz9yjjB7÷•Å0¶ AÊä AÊä AÊ%ùn»zÍÇþ»žíÉO=?óÅ‚WÀ+ôû6Û¬WûÝv+¯®6²Y¯d¾XtÞðÒ¬"´L§ƒLèfær—¬¦•›Ý¶óåÓUÃ+Uó+QNlc×ZûüÌc6Çzk#ïG¡Ä]„Êð¸#¨O/A2ŽÂv ÐõâߨOvÛ¡:¢YlÍîürùée/ïZÇ|ÏWv×´¯Œ¶}†¾2m—á›o Z_9¾Ïæ:jä@}Š šÕ<2æ“f(¸Žl‡Š ö¶ö2{Þ7ÃUFÛ>Cæc÷kÏ·}ö˜rbÎaŽÚµeGßûë»QlôØI«‘ÇHyе/ cÊp•™»ï¾ÅìGÍ\ߟS¨|dylM¼aŸÜ¶ ©qÖjj¿@§ð¥À´œÂïk‘yæ1ϨìûäÆŽýŸH_5c_Mˆ}§2›¹j9& •Y t5•šË}ë·-K±¦•Ø Ç4_¸ÚÌÍå›õêh!Nn×>KSH¾óSòXrû€Äôùú•Jô}•–|g§ë¶{îâÒ­†_TLK_™ÒYoŠ l_¾rrõ~gçÅr5^€‹yÙ?ëüiþ©i¿hcþõž¸f95Tr’jäcÈyjSIîò\15r¾ `2ÚîA éKj+ËWN 5r‚À¤´«ïbß|Û1ûí–årPŽ årP.©³3ö²¡‹å’K 'ÉW­Ä<³lTîÊɺü0d|•®¬ÐSq{9PŸÐÐ ŒêëÈ i@'¾·eUÑÙißmÅxNM¼m\`søI×:æ{¾š@ì¸Ã1c@ŸªrsÀ{ws†ý {™=ï›v­ë+ß\3v1ô­Š ÛÜ2^Bȶ!´H=F(¡š ïÈ}ŒÀlÛ¯ëx©C}È û®m]\(¹ˆQM\d¼gv†Ž;ìZ¿æ1ŠœžÙ Ê%ÕÈ/–4@-4 ПÉvvÀ© È@9‚”#È@9‚”#È@9‚”#È@9‚”#È@9‚”#È@9‚”#È@9‚”#È@9‚”#È@9‚”#È@9‚”#È@9‚”#È@9‚”#È@¹;»ívìcd˜‰È¾™Ù¬WB°€.³½È~¶ÿ8%³±é>‡á1>IEND®B`‚PythonCard-0.8.2/docs/html/dialogs/images/dialogsfig5.png0000644000076500007650000001626107523020030023175 0ustar alexalex00000000000000‰PNG  IHDRÅDV-%ùsBIT|dˆhIDATxœíÝ¿o4IZÀñše-î²#B̡ٚÿN°'ò 9|¤ '@:‡³‚`VH`!³‹´'±BhÃAB:“íE—!Á+ƒåÙw\ýnM¹žêê®]ÕýýH¯ÞžöL=UÝž~\ÝÕÕ«o§ûíVÝÝïÕ~·U,ÕLJÃÙŠË««‰ªÀ´>v­´%KàLŠJ)u¿xµn¥VÝÂëuÆú³uJ©Õêüõ‡÷¬ë<å¼|ÄQ–U>õ,\O¡¬:½*+°N®òC¶õœ¸žž²ªû½¦ž“ÕsJM]j!öÈíê÷~0ú³o.¯ÔýŸýsÒrHŠ€IÇâúLŠrHŠ€êܼ]Ÿ½.uË ×Uéâ~·ý í$R†ë3ÒúI0;®dj&[ §OU1“VH"ó•c÷ ûÊ¡§¨RLB옟 )‡¤˜-×éS’" Jæ@›1Æ Ø!)ªÔ7R´ï³J¹OŸúÊd  `v¤f_Ï“¤¨ÒÏø%)&•êq…)Ê!)&óæ2̓íS•CRL¦{:E-å0úMì)ÞÞ\–¬€^§ÀuÆ¢§€FR@#) ‘ÐHŠh$E4’"3Ú H57$0…Ûõ:êwxÈgcc‘Füô~ÿ²ð›ÆÊß0–3¯ÿ/cõzÖ¥\?¬’:týÀ2rî:é½ù÷Þwë±÷LDÓOÿúïƒÞ÷‹ÿø·¨8£NŸv~ŒydWN.9ËÌÓ螢ùœ«›·ëQϽšâYYHh€–嚢yêÒîQšë̦ô™!åJŸuýÜU©n€i½{~.gtRô%"שU;úN¿º’ôž¡e™¯¥ä¼ßmIˆ°@Y®)º¹˜ ¬/á„$¤”IkHÝ€©?Ö_×_1V~$,¯„BÌ'M}k,¿7¹—ÍÕÝÛÍ"¤‡X™U‘ªk6éü 4¶±‰jÓר ͹K…Vª4 U*¬±íH~MÑL.®d­£Bk® ŒbmÌkv}É'$9¥L`C꘯ä×¥Äb®ïëAºNaJïéûìвhË5*)޽&èsQJt¡?y ˜ÎãÓS‘8ƒ“¢ïô"‰вÁI‘ÄLãxqñ²`ê3—W²é$,+,ýo‘Š3IÕ’šqqöé±MÜP_‘¦•õ¿RA ͹K…Vª4 µ—¥–´ƒmÐHŠh$E4ž§¨^©¹Oé) Eõ‡TõP·ëµ³šs— ­TiªTXcÛ]ë»û}t%únó 1Z -IRùi³‰úüç!1N‘1>ëÏ&2† ˆ¡ ÄØœ¤{‹Bc|$.†êqÚ|ásõ#®Ÿ´@;¸¦€ÖæI_À¢„Ž>ýÕÈ8ôÐè)8v£O¥ÇÔÇL”iD ˜´[3K¦Yu©I㛸¡¾"M®¹Ošs—†Í}:¶¡ö²ÔØvÐS@#) ‘и¦¨ÞãÓSÐû} @"$E4NŸ8™º/÷½ƒó‹ Ðѧ±’ ´‘.ņ ¹ùÿ$äæÿMlCBnÌ?]ˆÙ›ÿ7_ÇŸ1S Æ)ò·—›ÿyaô)ЈçnîSsPŸ¹¼–M'aù[aùÙÿ©8“T-©ç¥±MÜP_‘¦•õ¿RA ͹K…Vª4 µ—¥–´ƒ6h$E4’"×Õ{|z*‡ž"=E ÇnôiÈcÚC$žû4ÄÀÒ«4Í0÷iŸ ͹Kãæ> ÒØvÐS@#) ‘ÐÚ<é X”à¹O#³=E´èžâ~· šÐ;:FÈDØ‘1‚&Ûn"FÞIª_ž Ñ?Ùv 1˜Ð€)*)ޮשêA bÌ.FjÇ)&?úß2Ÿ Á{ê+ÒTù„àç·d0!¸K5&1æ@{¸¦€FR@ã– @õÂoÉ®¾†¡§€VÍ@›ÛõÚY1ˆÑjŒÔŽ/ æ·Vì'ý¹k&”怔éš\§hV%dÄéÅÙ§Ç66qCí徯lhÎ]6útlC• ilKãP£OŸÞÝï£+ñrO1ˆ1¿Ú’äšâæú:E1^§M\Œ  ¤?ŠB…ܘ¿ÙD p?Æf»±úošß¨ëÈýNjõùÜW(‹kŠhŒ>Tïñé)ìßÿ^TzŠhôF<»æ>ýHX–nÕ’_JCŸÝ«]ójšE›ÌªHÕ ›ûtHc7Ô^îkìÀ†æÜ¥B+Uš†*ÒØ–FŸÒS@#) ‘и¦¨^ðܧŠÑ§$AOhÄÑ5ú4õcÚíåžÒçxF»<útHc7ÔW¤ieý¯TPCsîÒ°¹OÇ6Ô^–ZÒzŠh$E´èÓ§%ž°ßm³O¼¼ßmÃ&ôŽ‘Y¹ýzÇÇÈ«ÄD%ÅÛõ:U=ˆAŒÙÅNøèÓ8Õº—ÍÕï­ÿCIÕýXXNÓØ µ—û lhÎ]*´R¥i¨Ram=E4’"Z5mn×kgyÄ F«1´'ú¤ïÝý>º}÷¤ƒ­ÆÆãÓS‘8I®„nRÒã$è&íÈA6ׂHó† ¹1ÿ>2Æÿô¾cS`‡lŠl+­hsx°@Ç‹‹—…™O~qöéO~Ñÿ&/6h$E4’"×Õ+5!8=E4zŠ@#ž‡Ì}2TQšîÒˆøì^íšû4dœbž¹OûFŸ&h¨½Üר sŸŽÝ¥B+Uš†*ÅܧÌI¤€ÖæI_À¢<¿{W$=E´èžb‰§ìwÛ° ½#cäV.FÞIª_bôOè#¯Û*¥c7úÔœR2ÇèÓ¤O5NÑlÒùAilc7Ô^;úThhÎ]*´R¥i¨RamGTR¼]¯SÕƒĘ] í©æ!ÃÄ ÆÜbh×Ð} ¨ÞÓãc‘8ôÐè)pŽ>5¿Á1i7"<¾[óŒv³êa£O‡46qC}EšVÖÿJ54ç.•𓦡ö²ÔØvT3Ðæv½v–G b´@{¢{Šw÷ûèJôÝ“F b´@[’œ>½NQHM‰ Eb”²)ãº@„16Ùch×ÕcîS #) qúhÄñââeÁüÖJs1‡H‘¢±&ï3°¡9wiÜ„à!B;½›·ë qô³vó6ü$EÀl IˆJÕÖ¿€Â¾úá͇å~õÕ„5AjC¢R$E@†Þ’1&!*ÅéSÀ mŠž"ЈgׄàærÌìÑß ËÏþ·ÄL-5Cž|Hc‡6TÇ~~–ß2vBð€†æÜ¥ÂîTij/K-™Æ~·Üc¤§˜­¡=FzŠí“/ÿV)õý©«Œ†ô£“b‰§ƒ­ÆP‡Ðï{TR¼]ÝC b,!€tž‹Ä©æ!ÃÄ ÆÜb ?ûÑŸ¼Z÷É—Ùÿ¹?úÑëÏýù—Iê„zqMhı}*M”) [4™ƒ ¥é.͈G÷j×ܧ!ãÍ*J³dž”Æ6Vª.õø^5ÔþÜû£¿ø®*šs— ­Tî=j/§Ú«í`ôiã~öó_ù– ÍTŽ>ùÝßÉþÿÏ~þ˯Öüø‹OWß ÿÜß|¡Ôÿ+þ/Y•P1’b㺄5vJ£>ûÝ–„`1ªhs»^;Ë#†?†™°þôöFúȨo.¯”R꬧Øò¶*@:Cç>+º§xw¿®Dßý#Äcا6sİ{Š­n«)b ~ÿð‡üaùÇ_|1aMPƒfNŸn6%b\ˆ±IZžëÔæuâ®kŠ_ýuT™ÿýÍCï{®ÕuTŒ§“”bŸÏ?û´ÿM‰]sŸJ=ª( >ð@ziÆL“Y©ºasŸiìІêØÇ£ü@ú!ØÐœ»TØ*MC• kl;}Ú¸£C¹¦`)HŠ+‘°¸-ÀRGOÒiæš"ÜJõIŒ˜«ŸüÝ_©!÷/b¥FŸÒSl=EH‡¤Ø8®)@:œ>m\‰S›ôëp¼¸xY0GºK3F‡Œß—ÆòÌ“Ý-KÅ™¤jI͸8ûôØÆ&n¨¯HÓÊú_© †æÜ¥a‚m¨½,µ¤ôGOÒ!)6ŽkŠI±qô ®)6ŽkŠ–àéñ±HzŠ£§éD÷K<%€2»§˜#†x÷»mЄÞ1Jí’zÇzî&7¿µÒ\Ì!Þ ËæÅÜ«ß[ÿ‡’ªk6é¼ÌMÐÐ×óØÐœ»Th¥JÓP»T©±íˆªõí:σm‰ÎLX¹b˜‰·åmU:€öTóabŒc&¬î¡À©™‰·åmU:€ö´Ù¿Å]ÂÊyº‘¹O,m× ‚Éù? ÀÔžß½ ú‹¤Ø¸.aåþ–€Ó§@#ŽÝèSsJIó3Q¦4DQ˜´[3K¦4âôü 4¶±‰ê+Òäšû4 ¡9w©ÐJ•¦¡ö²<ޏôÐHŠh$E4®)ª—bdizŠhôF‡Ì}2TQšîÒ”¸r¯vÍ}2N1d–ÌórÆ66qCí徯lhÎ]*´R¥i¨Rs›û”ž"I¤€ÖæI_À¢<=>‰CO¤€ÆéS Ç‹‹—söè·dœÏí\ú– ³IçÆ66qCíå±·d ͹K…Vª4 UjÌ^­=E4’"Imô5Å›·ë³×ûÝ6º2¥Ý¼]7YoXšR‚JŠ®d2&Á”5I6ú”ääõÜM. ð[ ˦“°ü­ýÆ×ïqM¥-g’ª%M<¯úØÆ&n¨¯HÓÊú_© †–Ú¥çÕNÑP{¹Í§¦ä·dؽ?óuwʵïçæ{ìu®2ìøv¾õ¾ŸÛ±\¯ùcæ£Ø}Švòë–¥Ó÷žS¸Ýk_Ù1±Iˆ0/ÅFŸ†ôòrÄLYVéúÊ*zK†™XZÔzý UÏïÞý‹•,)º’…¹Îìe•J,)ãLQ@Y£®)ºƒy Ε@\§Íë}v™cNQJeô•ÛUÚ ¤£kô©4eˆ÷ÂzsÀ¡Q¦kFL©‰TE³çe¦hl‚†úŠqØÐœ»Th¥JÓÐ×¥~G/[·Õ~·==êî~¯ö»­º¼ºR‡ÃÔõ`x8Ô~ý·^^„A¥QòC?; )J‡Ui°Ø!yH…364t½ë^•€ÏåÜ¥r’MÑаÏþÁO~?*¯<ê/þé_ƒÞûïÿòQ±÷}§é5Z68)’øsÅóÕ{z|,‡§d ÑSñaôiÈ„˜!ešÌqÂɾ1CfÉ4™ƒEä’c›±¡¾õ®ª44ç.•Gö¦n¨RrcÛAO¤€ÆéS@õª~Èp'åMþ·ëµ³ÿìÓu!1fùݼ]¿ºžäZ—Û˫W§ß\^}X6&­ŸÚÍÛ×sŠŽÙvC·yßöpmÛ¢’b‰ Z‰AŒVc`¾Ìº½ÞN„ß<Äõµ(ýGEßö¶o Õµ^c%)hžëšXˆ\½Â–¢Rý×sl§k¯S )X¬ƒIj8°§Vr¶³9Ŷ¬f 4g1ˆÑj ÔÇ×ãI1ârŽ Ñ–sdj #t£{Š)æ³ëÛÀÄ F«10½îú—o¹{­TüAß5"µ;5h®k…´ìõíWóöHrúôt:E}>äjb£ÕÈËu¶×™¯¥eß:‰}0÷Ük:ð›†n¿¡Ÿ•ôm©¶×,Žtui=ÿ¾4KÛJ‘,Ðö.l‡×¸yž"Øï¶Œ2ŽÐÊö#)@&ÓÒö#)@z85kiûqMž"ô(ÕÓ™ëìH-m?’"H1’ÏÜoheû‘ PÎYVæØC´µ°ý¸¦€FR@‹>}ºßm³OŠL b´ó%=å¡Ö§?ÔÈõx¨©·kTR,qC&1ˆÑj LÇõ¨£”샹ôäøž¯hOú]ÀûñZæú©·k5&1æÓ°Ÿçò|¿œÎ’«]5´µKh®gONkŠfmêP¶‡·dXéÔj׃jýÉñCtÛ¢k¯oÛØëÍíåZË0×”]ÛÂw*ÔµÝú®ÑÚ†$M{[ù¶]©íJR0;¾ƒrß)¹ݲàhäûYßzé³­o?’"€Ùðlý`=TߩҥmP$E³Áþ;l‹qHŠ`¿Û2=`„V¶IhÀíz­n§®Ä‚1|œ–¶ßà¤xyåžÝ@˜7—WƒOmµðöœ±ýã´´ýFõ[j P¾;@ÝxJ×ú Ù!7XÛ“>‡Æ0?;Õì(©”êá߮׳<›ÐÒö#)+õ Ù1ïí´øúÜÝï³–?‡mäÓÊö#)3Tâ;÷ƒ¸KÎ©ÆæØC´µ°ý—í 7d4íÃá .¯®>ü?e]rZ¯TÛyôò” +½Lé,P›Å%E¥ÎßnƒèÝ¿{o—DzËRW9©Œ­Wìö@}§<}¯]s[ö=µ^zí{P“E&E¥¾ë éù™þ ÀN$]2Zvê„”ª^cHû‚ÞhÆ^SÌiªzH2ªùÑQ6ß­ÛÕõüÄ©·ëb“¢MJx®“}ÕL°©Œ>‡Ã«`¾vÅ2{r®¸ö:W!õ’Êw½Ïß×»~öÏRž¶bÙóîµ´¾fSü¡c?3Ñ\?õvå>EKwà½]¯_ ï½]¯ÏNŸÚï7‡TF(_RêÕW÷n«Œ}í Ùv!ñ¥^)§hÃå8-É©N¤Ò=8ص~jôºÞZÇwÚ´»>iŸŽõ•1–ÝËsÕËuêÓ÷ž¡õò•ß×WzŒý\Ž }@ìÈyx¯ï¹|¥’«tSzè®9¨†Óµð]/–iµ¼ýHŠC'¯uÔsM€ë:mÛš6˜~Ì÷Hë—nèCu}šõ•76N_¼Ò\ðn9¤~Ý)½9:!ƒù9W²LµÍS¤ööæšbF¾¾Ÿ‡–=¤ ×û| ¡To)e¬6ë2;ΘϵNÒš˜kйzý}×s^S\dR¼ß~·ÓíƒìåÕ•÷ç!Bʰßc¾Ï¬£tªÓ~o÷ÚŽ;Th½\å‡Äï;}JBlÏÜ“d9öýÔƒ“—Í|Çu³º4ú³û¹ù¿½^*cH]\?³×»’KhÝ]õS/Wù¾ŸKm°º‘ºG3õ{*¾í˜âZb ÛuQI±ïþ$f÷\\ïs½'¤N}?ë+wìÏ}×ôBê5&þ˜òû>ƒes 4²Ñ„&ƃ»t«äµ¯Tú®)JÛQ\›íSÑÝHÕRÛuµßmO‡ƒº»ß«ýnÛû×xë­÷Rl¹m¨Ÿù]C;ºý–{îÎÖ¯’–¶ß¢zŠJ‘ô€9Yê ŸR–¸}—ÌÇœÎ5XâöeF´Q=ENAXšýn˱/B+ÛopRlù&U#× UKÑÒöœ—xŽÀ²µÐéYKÛkŠh$E´Á§Oy¦Ú é424z¹îÌiö´ø½Òñ£F>maê¢\Bµtþ<µ%·=7¶-¯ï{4úæý%~A—ØfX®) ‘ÐHŠhUOîzFšù3ßëÖùÚž;#Úò;(½'ÕïïTß¿>CëÅ÷y¸j“¢kgæþ"ÔbHÛø ýî¤úþ¥þÎr\(£ùÓ§Kù¥XBîû\Ûýе~ÿj­W˪í)†XJB´™Œ®ýöÁÄ>µl¿ß·¨‘”(C¨y¬ˆù½÷]¶‘¾{¾¸ö:WCêf—ß÷s;^Lü¹h:).•ïKçJ’®÷Ïýš,ÚcþÚ¿£®ßWßz›¯œT× ]1Bâú¾¿câ}"þœ4]÷%èûâû„@ c‹Z=Í¡ )4•Z^b ýË8ÄR¶ÚÑòjs8Í¡ ±šh£Ôù¹ø¹JÕ¾˜ë2@.fÅüWË參æ:óZ\É:§Œ5UjSmOѵc|½Ìé/_Û‡þÂÚï—Ê™ÃvÃ|I¿÷!ßû´`ßï}è÷Ï·<&nŸ!Ç»ü¡í^òñ`µßmO‡ƒº»ß«ýn«.¯®¼_ß¼]«o‹œ»ÛNJùµÄmÓ1—ÎÒ¯€TúŽQÕö,‡¯·ÇX(‰¤`r$>ÔbmH¤€6úô)ýs3*)¾¹¼J]YáäÀïmãäÀïPÆà¤È(1?¶rà÷ (ƒ6h$E4’"I¤€ö÷>ðb¥”:u/ö»-7kuRê´:é%µšº>Læÿi‚ô_«)·IEND®B`‚PythonCard-0.8.2/docs/html/dialogs/images/dialogsfig6.png0000644000076500007650000001462507523020030023200 0ustar alexalex00000000000000‰PNG  IHDRµXÔpbsBIT|dˆLIDATxœíÝ=sÉaà¦JC†ü "„tVÕÙ'Ë"¤-[fˆŸ°ƒ ¢dËfˆðJ¶dVÉ’"dÈŸÀ!³s@o0˜žÝž™îžç©B;;;XîöÎ;ý±ÝOÞ½½ÿáõõuøîõm¸½¹PªŸ¾½¿°áìü|£§§ùi߯nÐ@ zC-„^ß¾}´íIx“Îío<ÞBxòäáí£ŽóäñqûŽýäÇ;ú8ݺÇ~tœžcÏ>Î’¯áÐq–| ç'Åk8÷8'¾†{ù&=ÎenÉÏíÐq–| ‡Ž³Áç¶ïùmé'[?He°¦SÎùìèǾ8;¯ÿíMÒã5NrÌ8Œ¾Ç¤8NT¨ýï_ÿ«wû7?ÿõì'@ý._]=¸½ÖWÆfÕÔþîgÿ4Ü8ÓïÿôÛB¿úÅoŽ>ùi­ ²ËWWáòÕÕ¬`ëcj{Ã@²ÓÄÆT …¨Oíù݃ۿüêŸC!üÏŸÿãѾÿ7ÿòàöïÿôÛð¿ø×O€ ´C'&ˆÆŽÓÔòúŽÝgVMíýÏðÇ¿|úi4öÍW¿ß|õ©m,ÌþûÿþýÁvÍu:%ÐíÇÆç¤>µXÝÚÄè6?&­©@¬Û›ë“jiíš^_[¡À"ºýasBóãØ1O(òÍÏþð—ß…?üùÇÁ"Í@‘1¿úÅoÂïÿô[Exd¨†7Uó‹ µ¿ýÙ?††¿—öÍÏÝ;ç/¿úç“]6}kÍ>Í ‘S¾ï@ž¶X£Ó4Yœ$Õre)Ž#Ô8Ú‹³4 K§:ŽPàhÍìø¹ÇèGª1XS{yy¶æó€û!r0FM €j5ª!Ô¨†P B €j5ª!Ô¨†P B €j5ª!Ô¨†P B €j$[OíòÕÕ£m[,åMÝr,g—¯®6µh¿¿í×ÔkL¬¤‹„¦(t /SÖ.gÊä:º¯sû¶×ŸXš, 2ޱJ¨]¾ºúòÓÞÖ¾¯»û_ˆql9:Nß¾}ÇŽ}¯û>ö½Æ^wBHÜüØ×>Ö¤0ô»&Ƥ.gÝcÇî;öØömå8ÎíÍõ`ŸZß¶vÐyÝilÚ§¦ÐqŒ%ËYsb=ö¤¨vpšØÁ!}A!$5¨A;ØŽy,Ëê{o¼î4 –抿ÛÖh¶Ç„žÚÃ<1¯—×)‹×ÔbÚÉûö?åj™ý9¥œ §ÝŸÖÝw¨¿'¦¿~±ïaw¯;mOno®x{¾{}no®ÃÙùyx{¿õó‚l9YB¾’ÔÔ†ªû>øÔ¤o¸¸2žÆX“¡×˜9’„šBÇ(çËñÚ’Š"T#IMM)¼¼º-KÊY™¦Þ×FïoÌÿÝh͇N­µ'ýøÝëÛT‡b‡b ²rV–¹'¨šÞß9ÿ÷woë ô¹^œ'9NÒ!ýÞŽ5ç*]9+Ç1µ¯ZÞß¹ÿ÷kª±Rþßõ©P ¡@5ÌýH±úÚà—hºzqv^M“X‰ú^ÿö{。M¨Q´¾““\†tßcïù<ÝÑ–c+#”8{ŽP²ÔUªQqô‡ÔPp•h!5*7ÔLÕ=Q¾{{Uè;^³MmZ”h!5 ×Níûún÷m5t|F-J´„…›êSKÝt¥) ò&Ô¨ZÊÔÒ 9(}-KßSc7æ„ÀbφV~/šÕjúÏÚ·û¶÷íß·ÏÐãX×ÐûJZ¥ÖØ„Åê;™u· ð†šÛÛûÄüMÒòš§ÓW ­ƒM¨±;c#&¡vS!6gÿ 5vGˆA½  B €j$k~¼½¹Þõ"w¬C9«›÷—S% µ—We~Ÿ²(guÛûû+ÌÓHj¯¯ËCž¦NjÊY™bêÆ÷7öÿîûé$k~üîõmªC±C±Ã†•³²Ì^Óû[ÚPøZ$Ò3Túý‡áîî.Bwáù³§)Ÿ˜ÛŒ2{:žÃaÞþ”%Ã÷÷öù³YûÏ)ÓÂ/­Õ¾§öþÃÇpqq‡C¸¸¸w!„‹»»Bï¾ýz­§ÁJÎÎãšSjlr¢NÊtV µ&ÐBá²`‡Ï?ï?|œ¬±M-Ù~êý¤·FÇwßÑ‹ïß,òw–8.Óú^ûöû¾æûb0GþV µ&Ðî>×Ì– °ö«ï„'€Ê7Ô‚Ó}K¿ck€{ðâìü俨ÅCí¶U؆jcww£MC+õj‚jÝj€é^ƒÅg9|îô=ôtþ6[î>×äæzqvþe(l{Hl³Ý0Ù¼lµ>Ó»o¿þò3´½¹¯oŸ˜ãõŸú•ºæXÍ­©½ÿðñËï'Ww¬9K¨Ýå¡ùð/±ŒE7LÆš¦šÛ}Ûc ¿ä&0æ[²Ls¼ÕF?v›Û—zX¿Z^ºW³©OS}j©kPjd,]¦9ÞfKÏ4ƒFbšç„T·f&à¶·õ‡=e jéÀ¤ [—i†mjï?|ŒúòõPÓ¡&EŽ5g¤œÀ¢4sVµNýws úECíù³§áp8„Ãáð°íîn±ÙDš~7!|é?kßîÛÞ·ß>Cc=CïéÞõKNa³–Åkj—ß~ýi‘ÖwÔbO Cµ±öÀ‘¾}§°¼µfUè;¡u· ô†šÛÛûÄüMÒÉåõ.q¦½Z+5?>öôÁL"Ô­„aÎc#&¡«„2=¥ýh®©É5÷µC°oÿ±í¹X½OÍ„Æõ›[Ðçž0–hþÓ¤¸Œc¾P›ã{ñöù³pv~ÞÞßGÿ››n0uƒ­ý{·Ùrj{NLhÌ"LþJMæZŽÁ6tñJC5µízBã_Ú62óGk|¨ç¾Þ¦\+O£ k´TÁ”[ͬkñi²BÈ{Bãwoï¿ü5Y¶9ïŸ@ËßÐTw[LwLM-©jUCÇɱÖfBc KÍg}¨EeÍ`+¡¦ÖðÑÞ6tßœc 'ÇZÛâ¡¶ô„Æ!<ž²]ØS„àÐñ¦þŽ^_l9X²¼PŸRúÔÆB¦ï¾î¶öí¡cÅgK»ŸÐ8æ„Öw¼¾é¸L¤¼½¡²Û/ã}£O Æ'»ŸÐ8öÄ—â8{’èÆcš§öþ¾Ñ¯”š&4^äx{ïÿË¡óØÄÖ¤ÔTì¿)Vpæ8&4N¤¯Y4Ç繆ۛëb¯h÷úž1Íw/˰û §úÔ†Ž×Ý>öؽ$·jªi¿Þ±å æ}„FN`ôÛõ„Æc'°©ãÅs'É5mìõ{bÞ_ò0çóW*a™Ž IN§:ÄÓß›– IN A<JÒZeš¬>…Ù‹³ópww÷©9òâ"\ÜÝYò£B¥N)”¯ˆ Ç&>Æ1“à¦úÛS'ö Âk<Ÿc­YS;¦l”4ª–éÉȽg´­j§LhµÜ_Ž3Ô×TÂg€í,Þü;¡ñ[à¥ÿv÷ƒ<Õ‰œã‡YŸ)4_ÍèÛCŠžÐ8„þfˆî¶öÄÇÍý©&³úû}·½ÍÌœF?ÆL: Ô#û ÇŒ5C ØÜIˆ§¾œ;ôø¾ßÇžK÷ïuÿ}>9X;ÐÆVQ˜{›²hz¤«Ê 5g–þöíØcug¼HñõñçÎO¹ÔóYŠï©±$Ƙì'4î €v¿Ù)ýKs&%îÛgn8 Ú÷Øç¼µ\úÔbúCK¸Hà±Ôß]¥YOhüeÿȉ‡û¶õý>w2ÛSþþœ¿;qkîà5ûÔŽ¹80™qYJ+ÿlË„Æ$§O ØÊfE¨—>5`+BäÔÔ€­j/ÎÎü¤:&ËX³¦vLÙ›S0vß©c+_錽–^gºV_Om®%&4Agó’Ö®©­õåë9ÇV¾N7X>EÔÔºœ0ò¦ONy‡}ʾ¦6elBáö>ÝïˆMMj¼‡‰‡—’SŸZê c'ÃN9i6õÍ‹ !jǬ«4Õ”Ù7)2ó¬=÷ãš}ÇmίÊ,§èPKÅÕ^Zµö©uSnÚé\0F¨'šÔrZOm)–­ÙVûõ^+ä^__/þ78]‘¡6§ŸÒgÂqj´S(_§Û¢f~ùêjñ¿AÙ‡Ú1÷ ‰=¾ÎéréSK=¡qw=¼Ø>8å«|·7×.Ô ‘}¨…pú$ÀSÇLJL¼­½΄Æs'§>vÒl†óùOmMêµ(ò{jäÍ÷Ô¨@+Çê¡öþÃÇpûý›ðâû7ÖX£NÔÆ…Z9V µ÷>†gçáîîîÓújáâî.¼øþÍZO•8PjåX%ÔÞø...BŸ }þìé§U±[÷ÉiBã“ÞÖÎ €”†>s)ÏS\¨•c•"M µW¿Ž•ã„Æ†eÓ©N c«)¬=¬_y.Çâ5µÛVóâógO{÷¹˜v%oN¤;¡ñç5µr,j‡ÃáÁ¿îûüïÝçšÜ1úš!ºWxí5®úÖ»:ÆÐ•âÔw”¦žÓØs­µq¡VŽE›Û}e'×'46­Ë[û íšÔ˱ڗ¯»MíÀj–\˱ÓŽÍÌ>ö·Æ['–¦O!›Í(Ò 9¥é1•c?C͵†U,'jãB­›Ì(òþÃÇpŸí˜ZÚœšÕ1§4´0i͵5}jÔF •cÑšÚógOÃáp‡ÃáaÿÚÝ]t å>¡qßã÷>­KÚâ3¦¦VŽÅ›/¿ýúÓ "­aûï¾ýzÖ1ršÐ8fߨÇÖxN¤”ÄãÊs9VéS{þìi¸œd”Ë €Ú¸P+‡YúINŸµhåj$ç@m\¨•#ûPëNfÜ7#È)Ç&='RÊaBcjå(våëZYÔÀ €ršÐXŸZ9²¯©Q55RˆÐx ­ņÚÐÄÄíßûš'¦¶kh?s 6.ÔÊQDóãÜ/Z5Oômïî?Ö”»ßÞiªaI[|ùZy.G¡6õåëöì!9µ©vàÅü­œšEräÀ’ô©1¦ØæÇ)MðÌYh0&c÷Û3M5ÔF •£øPkלÆFKM#„þ9#»MŽÝýxÌ €Ú¸P+GÍsÅLt<´ÿØüŒcûñ#M5,IŸc²µ©ÉçLR|Ìöc÷Û3'RÊá{ª.ÔÊQ|óãºÍŽÌ£©†Ú´r¬jï?| ·ß¿ /¾ó`µœÝxšæû¯þIJ0§\_¾ºÚàŠÍï?| áp8|Z_-|Z,4„ùë«‘¿ØÚ×ëëë…Ÿ ¤¡L—a•Pk-„ð`]µÃçŸ÷>Ž®‚=´òõR4=¦¡ †S Ùjuye:«„ZhíÕ¯cõÌÒ¡#Ð`{sfò™¥±xŸÚí÷o¾ü>T»˜v 0ÔÏçœc,^S;þ}pßçï>×äŽ5§‰¢û=³¾¦Í¾/\wM¼¾NóÛý”K™Î×¢¡ÖÝxqbp…0Rs›(ÆÛ¥™ãt·7×N>üÌ•ÛgO™Î×jCú»MíÀ$Ò64Ô~ÉUp×^a·V͇އŸ¹r ´†2§ÍfiœÚôÂrÍ‚159âùð3W®ÖP¦ó³ÉŒ"ï?| ‡ð)ÐbkiØÉ‰²åhäiÑšÚógOÃáp‡ÃáaÿÚÝ]t õM^:u{lûرçÞ,«o ×SŽÅ›/¿ýúÓ "­aûsg›9¿ïöØö±ÇöÍÀïs³*pª©{צL—a•>µçÏž>˜I$kÏT²æ½£6Êt9’…ÚíÍuqSÈt;yK{þ¹Z²ó¼ÄrF¼\ß_BÊ‘$Ô^^¹ŠayÊYݼ¿¤$Ôr¼²¢>ÊYݼ¿¤`‘Pª!Ô¨†P B €j5ª!Ô¨†P B €j5ª!Ô¨†P B €j5ª!Ô¨†P B €j5ª‘dåëX—¯/×~{sýàþævûw˜«]Ö–,GÊ)äeÕP aø“*Мdè–eöCó#Õh°«×ÔÆ Õֆ𒯶wëÄF£¯Üt·uËM·é¼¯<­Õä Kjoïïï;;?p{ìƒß¾=ÔÙÜkb Ææ÷±çËv^^]¾7±å¬JÍí¶cËÍX“æØmåm¿¦Ê4é%«©½¼z<$„Çèc®`û˜tõ·~íû‡ž+Ûy}W.Ž)g}³„¡ã*oû[¦I+ióãRW$§4åôÕê\9•í”÷oÉ€*§Ê¬§¸"C'¡¾íí~‘¥®ÎÉOïuÏöhõ"1îÝûûúG¦¶7MŽŠìÏXŸÚ)8SýtŠÀöV µ±zß ‘©ÇÅlwr٧زַ-æ÷Øûu×üC„DP ƒ25ª!Ô¨†P B €j5ª!Ô¨†P B €j¬6MÖܙʭCÄ©”Rs^Êߪs?~÷ú6j?³7Jl™ƒ)ÎKeX}–þwo§¯rb®„æÎˆ>´b6õó~Ã~Ù§Ö^Z¦»äÇв"kج£°"C­Ë•8!Tj]MméòÕՃ߇ökßn?fl{ß>C÷°ŽÕûÔR˜Ze8fáÆnßÚÐí©ý†žë+2ÔB³ƒ¦mh5,€²j§©†P¶"ûÔRÔ¨ºM˜§ü 5<€<YSëS›ó]´ö¾CÇŒÙÞ÷»ZÀúV µÛ›ëdSÌŒ…F;xƶ íû·†+ж±Z¨½¼Ú¾‰në/f°¬l'4^‚ð¨[‘E P B €j5ª!Ô¨†P B €jdû=µ—WWY|· €r¬:MÖw¯o£öó%iޱzóã»·÷“?SbV±ŽqÌLüfäÈ—>µ™Ô"ò%Ô¨F‘ë©MiÖ3k¯qÖ¾oè1fÿ¡Ç·×L›újvë©2ÔBêìQ{Ÿî¾ÝÛc¡û7À:ª µ¹ArÌ¡¿a0 À6ª µ¹RÖ¦Ô̶a H”5-µ6€õYSkÐho;æq}ÛO©i¥<ó¬j·7×ɦ¾ ‹î}íÛCëÛÞ÷¸¡$1€e­j/¯Ò4ÃM5ç €ýÊvBã!B €!ŠP5A°/E©š¼r5ªe=>ØÍTC¨P ¡@5„ÕjTcõÑsçl´±V µ¾€Z¤²yó£@ •¬¾|=µdKßýͶfÉ!Y·××Þ_`X6¡Ö ¤9·‡–ƒ¡.¦½¦dj0Å´WÀ”ÍûÔ •ÍCmjÑOˆµjóc3˜£»­ï¾nÿØÔý!øzÀÞ­Þ§6:}÷µ·s?û±Z¨53 #RX-ÔKÛ| ¤"Ô¨Æj;8»/¯®¼×ÀfVýøÝëÛ5ÿ+Óo lmõ!ýïÞºŠ/ÁÜÚ–/Ñ90÷#ƒÎÎÏ£ö3s>‹ÍBíÅYÜ óXj„iäØ?65³ÌÔc5“B½v1úñÅÙùƒŸî}Ç“õ5¡ÔüÌmöœ 4ͨP¶Ý4?¶kn/ÎÎÕä*¡Ö´í¢¦Æ~\¾ºúòÓÝÖüÞݯ[;ëî ”c75µí&ÅnÍ®o{ûþÚk~}'ø-jIc«5ĬŽÞ=ÖØ¾jPžÝ„ÚT0u·7AÕ ¬©ÛµŠYúgÍçÒø!”`vj1A3øcÖh‚MX¹Ò§öYPÍOŒ¦&·'[Úœ~.}b°?»©©¥Ò­õ5Q²œ±fйM¤}û¶k£j¥PžÝ„ÚTŸÚP­«»}챂m©VOŸê‹hPž]„ÚXØtk]±ïnhyÊep °Ž]„ûed$ìËf¡¦f“?¥QS£—‘ƒ@‰V µÛ›ë,g}ç±›ç”Jc%øõ­j/¯\ùs:«§SŠ/ ÷`µPsµB*úcY›•àË¡O ‚•àË Ô"iqÊŸ¹¨†P B €jèS˜)—•àyLM `¦n€ ´|5€#X¢(OB àH-?B €j5ª!Ô¨†P ¾§ÁDÅej,%SŽd¡æ*†5X=-º_Ž$¡fUkÖ œS’„š+gÖ œSŒ~ B €j5ª!Ô¨†P B €j5ª!Ô¨†P B €j5ª!Ô¨†P B €j5ª!Ô¨†P B €j5ª!Ô¨†P B €j5ª!Ô¨†P B €j5ª!Ô¨†P B €j5ª!Ô¨†P B €j5ª!Ô¨†P B €j5ª!Ô¨†P B €j5ªñ“·÷÷[?HâIá‡æÆíÍur”êÉ!üðä‡Ï¿…'[?8ÚÿÑ‹ëØÊ@½]IEND®B`‚PythonCard-0.8.2/docs/html/dialogs/images/dialogsfig7.png0000644000076500007650000004746207523020030023206 0ustar alexalex00000000000000‰PNG  IHDR3X¦‰}ÆsBIT|dˆ IDATxœí½h$ižæ÷äÜÙdÃaTà1Q4ŒT`Z™œ½™¢¹¹‰^ÓS5ëóT vË Õò¹Ùl1] í‘0Ç"í5KÍ"†Nº}V¸ šZk0U;Üm×ÌàQž7J–È8ªª¡!Ø¿J°H{tr0ȼ™‘¡øñFfüz#ŸOQDäoD¦ž÷'¾ïï[{ñôôòÁÁ>|p„£O@!„¢ÿéééDÂj«UÐ¥B!„$çï%ú !„BHYùFÑ@!„2 ‘—GOÓk¨¹+Áéã„àtg[`º»à!5ï‡éÎ  V»šžeÞ£ýgùNÎö©Î›cÞùg¥‰óf™w`º»9+Dœ·ˆr3±Ôo6¥þ²Ì(—¶ËTnBÏ‹t´­rý™ô¼E”›Ñþé ì;Eý?ÁÈ !„BÔ&22C!„â¥õ S»¼Úƒ½_¦š@3C!„„Ló¢PÐ1iå“ÈÌüâß~z%í–þÏ_!„BªÅw·'>ç9vtŸ×ÈÜüÎ;¸õ†[ß&æIïÿÈæÊ!„¢®‘9úä`dbüæF& cÂÒ½°0!„B 'ÈyMR©ö™ù¼g^IûÞÆhý¯Ž'¶ý÷¿ÿ?þͯÿ÷+ÇýÓÿyi„BɯÙ5 aùø#12ùd™ùžnà{º01Ÿ ƒã™?xc ðÆ€`ãœýÿ«,.B!1‹‘qñ+›OîÍLu|x%BãâB!„Ì'AÍLqäþj¶•‰¹B!ê1ëLþÈŽÛä—oa€ÿêׇÍL„BQ™7¢Ž‚›™âò”ŽÌÜüÎ;øÅ¿ýôÊX3AãÌx;ï 5Ôðol]ibb³!„B€ð¨ŽL´'Q3ÓÍï¼ |¢*·ó¯û¨‰ÉÙææã75ÿô÷ÿyhÞ„B)'y”ç…ÓB!$ÓLCe>©š™QD†B!•dyµUª|Ff!„’ïlÕeÈàt„BQœÈÈÌÝ;«y]!„p™0202C!„¥¡™!„BˆÒÐÌB!Dihf!„¢443„BQšB!„( Í !„B”†#+BZóWBÔçîö6ëB<ÐÌ(掊¾BHÁ5+1!e†fF1^<åÓ!U!itåλÛ] !jC3C!²Ú’›9øÁ#2I¸óî6£XsÍLEøâ¯¯Vˆ[[Œä¢UìÿEÊÓ\$=׬Q/§b¡™©_üu ››_£^î¤XÎr Ë«-BH®Üyw——ÀÏþ·üÑÿ¼=ZÖjùEK¦ŠÌü‹1Ýɦ=ޤÆÜš™´B2ùdîüâ¯[h6 <þÞ•mͦÃC30jóú? 78Ë«W÷—5Diš'ÿuÌ’¯{]³|7BªNu•á¨Õ`wÞõ.Ã# i×ÇÞü¤¿M‰²Ì­™É“¬ŸDN‚mƒ~¬éðo‹Ú?‹èOPžig–|eöe4Œ¨Hš‹>™ŒÈÈ,“)ÿµz Œ›)ôå6è!‰ä Í« –ÜÿAa834„dÃw·ËËÔò 2*q†&ɵ^^ ãâ.½æfZ#ãòààË«¿ LŠ×¨Dm#ÅÂÈLþ‚—îÝ•î]zóȼ×ý@÷œoÔ!lÝý 0Í›îoþI! Ê+è³,QÇû¿‡ì>A¿QTóYX~d>(¢Ó¬ßÈDEhd¯ÅodÆù† ÞЄ5a…]÷4ÆæÃË£uŒÚFŠ…fƇ_ða!î³Lþîzæâ¦02Iû«DÝìý7õ°}üëÓœ/Î\Å}·¨ãeÎáß'ÉõGåG惠(C–\‰ÈDEg„ƒÂod&ÎbhÜ>5qÈ6aÕj“òMMßj›KÑoqÍ+lfJ$‘•\E=ð,½†F‚OO'þ'!ëýqˆwš0ï,ß-kfù^¤$½ù–×P¸MAFMBá‘9dûàWÍ¡ ³63ùÿn*ÿU‚f&¦)0¹àÈÌØÄT܈EÍȬ”Ùh‘üÈëxôÉÁdÄ¥V ÿŸ€ c‘VŸÙNÅÞ~ö7%yËaÔ6/U0¤ªÁf¦”˜¶³Y&˜”ŒÌ4ý[ÒBÅf—Y~/¿/Q£Op§V51¥Q‡5!Ýy×ÿšöd““LŸ IdfºæºY›™¦9'™¹63A¯÷…µYË´eOkhR1AQ&ƒˆŒ¿Ÿ‰Ì«ÞI:·Fu” /&îø$„]¯÷»Êìãßæu\Ø1„dÅÈФ„ßX\^ÆÙ>3²‘Ùüü<88À‡–ñâéw¯<ˆ<==Åw/·‘b™[3e¶…Ù}ÂöÕÈ ]gÑKI¦)œa_£nèÓì?m^Ó䶯Ì5&éœä8B²"Íæò$ãËä™IBÔKwÞ½ÝFŠenÍL^ø_ÃN›×ÿÑlˆ$ðI$ü½ˆj¤UO5)Å-eÉ:2“V3Éš™ŒÉ£Ý4¯›%oÊÉ`ô…Ì#y¼N.g’÷Õ…f†B äÁ;ŠÊ’¥Qb‡]µ¡™!„‚(å„(ÍŒB}r€§§l¢ ¤*0@H:ÐÌ(ÂÝm>ÁB!AÐÌ(#2„BH0œÎ€B!JC3C!„¥¡™!„BˆÒÐÌB!Dihf!„¢443„BQš©^ÍækÂÙpw{;ô·åoN!d^‰º?3Œ3óუi%ÈŒÊßœBȼ!sœiмîÞ™åp2Þ—oÞ3¼j`ÛÀ/þ’Ñ’Ôɓ֟üpíp~œþ¯{ÌòωËËKÔj5%–_Þ¾™õÏX dZ&ØgFQ–W[ØØvÐuN_O²ƒz#y²üÃce¨×…æ4M¤ÅáÊ,I:ÐÌ(ÍtØß¿„m}-¤úPo$OÚÐ4 ßßÁÅ…Ü*„ËËË¢/¡Rpn&¥Ù‡m;;5œ9O/ÎÓ²·9Št ÞHžôqq´Ûû……qtæÅŸ79y#3e§V«áEÑQ!hfcyµ]ööÄç7ÄRÓmÐÏÄç›·[¥ïÓ°¼ÚâM°ä”]oa¢¶Ôdù‡?†¦‰fLxå•ñò¢hCñ¹õ'?ìC£Š‘„ñú²è‹¨Ê™™W_£ç½÷êØ¾óý®&t}ÜSÓDš½ôtÀÖì{¯†Qþ ½Ì×Fªê­,×A’¡i"s~.:þÀy]híb@Ð_Û–øã+ši#3/¾ÿ],ÿü—)|y™I¥ÌÌ«¯Á0.˜‘û5›}¬­=¬¤¡±­í¬Ã¹©Ø6í¡HsqŸn™êäÉyXXrÖᘘs€…uÀÛuÆ5×^™™_”13²F6NNPICcÛâ†2ú¼)–úÐÛt–ô~úçö?y{?{ßlñ§E}Ž;þÅÓÓTûeøßÀ »>Ù ÒÖ[Ð煉°4oº?_YmÅ]SPÔDö\œ¶GoÄRÓû‘³ ï̼øþw`"ê⦥/ÿü—W¢4Þt/A‘œ°}¼yºëŒÌ¤‹fF™¯!cd\ªjh^||Šåë-Ø€ Î}ñ$£÷ľy½qerdn q&)íJÔ¹É$iê-èï<:'=NKþôiµ5ñ=©‰RðâGŠåþ&ya€cdpœ_4GgççW÷¿3*@°9ñvlÒ}FfÒ¦ôfæÕ×Ðl Þ›êø““MX–¼ rùê‹òx `÷8ÓÛpÝ ¹Š‹v&n,i›÷)Ú»t‰sÄ{L’o*Å“·Þ’Ž_C=U‹ ½ `x ¸°tE?ÜFæÚP™ ×µ½‘¯y ‹Ì #3éRz3ÆaîÇ×¶j¥áø3§¢ï¿1NÓu w æøÆbšÁ¡ø¬*s™|ƒL)7yë-©I&ÕâçÕ볿§i`oÁØÈ W_Ï^þáü'Ó¢1ywô ƒ‘™tQÂÌ’GWBûOΰ³³ 4&·¡ï½÷óÒ5Q½ýôï8þÍÛ-h€m{ûb»{cqñÞ ‚:Ì%EÆm÷FeÊhhÒî›SŠÖ[Ú$Ñ5‘?ŸþùŸâŸ8o)µþäǸ¶œ7Ç}²\#ãâxa8÷Df¼Q™°æž¸·˜ÒŠâxûܸçcd&]23òt»Ã+iN}dT„‘ÙÁ½{÷pÿþÊx'ר8…eeåj>eàS·’=å¼7@Œ bÛbìwÝ»=m¼•¾û9jÿv™ãgA¶¯Fç®iéÍÿw"jŸi4¦-j¢¼ü?.úÍ`¸Ð& "ƒççb¬wÍNÞ>3AÂߑןî5?AûÔÇ¿OÐgFfÒ¥RfÆ51ÎàÞ½‡¸ÓÙv¸xr122½^ÀÊȼŒ"4 V~×=-:&oÞ'aMcضx½z)·â:P†¥E}žæxYxsJ‡4ôd dÿ>I4’—¶HvhÎ=ýbÜqgÜuwÊ‹ºH³màò¿¼¼bhü„Ebš¢âš¨¢ KŒÌ¤K%ÌŒßÄŽ>u:ìïïcggûûû¸±J3“›¦¶- ¼¹áôðKF7™} ×ï?K_„²TöY\7›ä˜Eo@üëÕe‚š(žó àk¸vÀo3][pvèOšëþ§¨•¤?Œ— ×ÃFfÒFy3ÓíÑé¬áÞ½‡\3#ÚŠîß¿?Úoº®ãÞ½{c#3Þur©nøÜÞ7–ž À ÇÚž}¢ŽW‘Y¯[6ªD&™Uo2Û³:v𼩉byá45]´…`ŸpÆ–¹ðìã'˹™’¾ºw#3颴™q Ü¿¿é4+݇ו ‡Cüä'?®ëxôèѤ‘& Œ×Ð(ÐÌÄ —ä õFò$l2É(jµÚÈШ°dd&=”63~âŒÌóçÏ_ýõø ×ÈxûÍ(ÒÌtó¶…»sç”}bI¢6ÔÉ“iôöâûßÅ—^J,Iz|£è ˜oTF0ÙNddÎÏÏñõ×_ø1„qcˆNh6»ãÃjjZ^macX\ÚmÑßcr¬ ÞHžPo$)Êš™IÆ.d8b8¶m¼õÖ[xÿý÷qrr‚óóó‘‰9Ó8Ó<á—”ŒÌ;Ðu`ÿ2·© Èu Ã1`ë“c4ض‹Á]÷n÷Ö3 oaLBØqQíÏAOZ$_ÒÔpUîß”ú @zz 2 2Ú“©ß¨Õò¡„™ ¶`Yæøuiÿ2,m–tÐ1Y€½O&îX ¶-^w€ž9qxhaòð°ýƒŽMz\ØÓ y9ISoqÚ¨ygV½ÑõTTú¬u`ܹHú”ÞÌ|õÅlm¨4>¸{§óÊbÛ€1 ”fè‰Þþ£B¿ôzãý‹.Xq¯ÝÆWôõÏ;Yëú ^T«ßd V³£ôf(¿©(7Ìi޳8c/Øž}Ê„Ìõ$y’"ù‘‡Þ¨â¢býæ‡ZÍ%Ì †ƒä õFò„z#I ™Q˜›·EÈÒˤL¯‘êA½‘<¡ÞH*1Ñä<²¼ÚÂÆ°¸´Ûb,N¼F²‚z#yB½‘¤ÐÌ(ÍtØß¿äè«$¨7’'Ô‘‡ÍLJ³Ûvvj8;áXö–'ÙA½‘<¡Þˆ1U‹2êTêL ›™Ã^´¶³ §;ÐŽÇ`DÅ@È,Po$O¨72-•03w··GÑ7ãÖm÷îã=Æ¿oTÔ§l[ðÑçM±Ô÷€Þ¦³ ÷åò ›;$(ÝÀµ[{·y÷÷4ËmÐvŒöGšzók*LGÞ}Ü´ ýƒæÁ¡ÆÔ&«úM¦NJRÿ5–/ʘ™æ¢0#fN‚ö);/>>ÅòõŽìÀ§ £/†ûÖ!¾ãÞ»DÝ$ÂÖƒn"aÂÄ÷‰¹‘bISo@tE?5¦ YÕoauUœöd sXž$_”13~³dn¼‘UÌÉ4Ø=Î4À6\wæ+9];s&`Kø:ã´ÃÉ“j“•Þ‚1½¤Ú¤¥7¯‘ÑLê°¼(cfdñ7UÏœ×cœ¦ë@ï0ÌqA7Íøh !qä­7ês¾I[oAÑ•0¨=µ©ÄÛL.þ¾/Óà[VCôöÓSô ž¦ú`{û“Ýeyµ5ú?šm6„²¼àV@4_Å“¥ÞâH¢Ç¤Ú¥ÆÊIšzóö—Iª°ý“äCåK¥"3^ãí ãmz ê–WYùÔ-œÇ€­‹‚ŒÃ®{{býæíÖhÝ»ÝÅ_ȽmÊqÞâ«@¢úÒ=U‘âIKoq$Õ¿S°w¬#jL]²¨ßâô´.¤ÆÊ‡f&ÈXxÓÂÖ§Ù®:& °÷ÉÄ‹Á¶ÅëŽÐ3q…°‚&3}}P‡º°õ°‘;YÐÕaV½Éè$‰îÂÖ©±jUý–¤Î“̓+%ÌL^½Ö]flÐ ”Òl=ÑÛTè÷^o¼ž.îµì¸ãX9”2ë- Ô˜¨¬7j,hf<¨bb€qøÓÞ½gpÆ^°=ûÅ´îXøËIÙõ5¦&Yé-‹¿=5Vhf††ä õFò„z#I ™Qw²5w.“_ü% ?Éêä õF’P©W³ç‰åÕ66€ÅE Ýc1”åÕjR=¨7’'ÔI ÍŒÒì@×ýýËTF_%$êä õFäa3“ÒìöÎÎD8–½èIvPo$O¨7"Í €ùïÿ#àùÏþÓ‚¯$žåÕt] 7nˆ¥¦Ú Ÿ‰Ï7o··1ÇTÉ‘,ç,õ6Ë5Q§Õ¤Œz“…º+–¹ofú—ÿþ?·vÇñ‡¿=*úrbÑõq‡8{QŒÅÐÛÌÅñ€Rlc&³B½‘<ÉZo2ÇPÇj2ב™?|ýµ-àòñc˜0ðZÁƒ½hmg@Ow þ& =ÁˆŠY ÞHžPodZJof>|ýGáû`v‡‰óÕÎßCÃ8Äes µ¦H{ôè#ü7ž}Ö×ßÃwï$Î;Kl[ðÑçM±Ô÷€Þ¦³ ÷åò“™P-n’ yJ¼Û¼Ít´ÝŸ÷ŦÞüÚ‘7ÇŸ•§Ì¹½ûRgå"«úM¦~ ÚG¦nKªß¨ãýûú÷§VÃ)½™€C£þ@¬›–³âˎ†oéÙj6Ñ0ÁÌ®{ O´Lk€F€ieõufâÅǧX¾ÞÂ1€]ØàtôÅpߺ3ÄwÜa“¥Eà°ô$ù_ùN ò$ù’¦Þ€èŠ9LwÓè4êÜ2û’bȪ~ «Ãdê¹ióNšî…ZMŽf&ÚȾ½eŒÌ%0¨Áì[&€C F³1οäØ=Î4À6\wæ+9];s&`›áuF¶—<ô6-ÔiõHKo^#f¦ÕLÞiœ‡È£„™Ò42‡Ffoo·ššN ¦Ñ°ÐÈöëLÍgN¡è¿1NÓu w 渠›fpøRÖáóI€ùémZ¨Ój‘¶Þ‚"{aû'5Qy§y"‡o3¥‘Ùš42·Ñh4a5- +ŒL™yûé)zIÓ}°½ýɂÚýÍ6›$…/­‚êV ±Kz›–i´G•‹4õæí“’F½äÍ#í¼e V£Q&2“IDÆ12ƒ% i¡i41 Ó””OÝt غ(èÀ8캷'ÖoÞnÖ½Û] ¢?=®#›¿3g\AzR z²"Å’–ÞâÓÝ4:¨3UÉ¢~ókÉmŠÒ•Ÿ¨u—$úõB­ÎŽf&ÄÈt»]ÏN'¾¥`­þÞ•>2AF抡)y„tL`;ƒm‹× gâ 2Ðâöõo‹ê`” §̪7$ÑcXzXçJêL-²ªß’êMV«²õã¬y‘`Êof"#2@§ã“iÌÀ¬IEd¼K°L F3³o”¶ hJi6€žèí?*ôû@¯7Þ?ï÷ZvÜq,Ðå¢ìzK uVnª¦·Y Vã)¿™‰lZ gld‚ûÈ„ýýçü$åï’"nèÒÞ½gpÆ^°=û‰Ìù“F€H1¨ ·(¨3µP]o³@­NGéÍÌ£ÝaÄ82'G¦¹ÃÿúµƒŒ‘±íäƒðNò„z#yB½‘$”ÞÌ\%¸“¯Ÿ~¿g¦02——‡¨Õ¶ÄÑFFÓê8 öI¥âæmztç2)ÛÄk¤ZPo$O¨7’%^Íãk)˜­-Ï̵‘‘ÆMT2FF…ÈÌòj Àâ"Ðn‹±8~É êä õF’¢™‰~ýÚqx‰ËK ÂȌۙdŒŒ¦ÕS¾ö¬Ø®ûû—…Œ¾Jæ êä õFäQÄÌ$12\^^B˜†³œì<gdTˆÌöaÛÀÎN šÓËßT‰ô¡ÞHžPoDEúÌÄ™ ³ãFd~‚ŒL™ûÌ,¯¶ ëbà(¸qC,5 Ð6ýL|¾y»•¸9lb¿°ýHõÉRo„øI[o2ƒÊl—Ð.îZâêÕ¨k Ê‹uñEÌL#ã50ÞåÖ•#ÃŒL™#3º>î玷`/=]ŒÁ€]`ï1 Ô´Bgá .yè—4õ5«º» Ê#*-*Ï4ôŸôø4Ï­:Š˜™¨¦%#s52£¢‘DÁÖÚÎ:œBnØ´‡ã1Q12 ÔÉ“,õ6ËÍ>éÈÔ$13Ñ}dâÌddFU#ˆ‚Ýób{S,õ= ·é,è}¹üâæNŠ ©Ê†qƒžt‚¶§ý¤Cf#M½% ÝûÓ¢FA¥žªAÚõ[ÞEpÂ"=.IGF:_к?ÿ°òS•²Sz3³~¾†Ë€ôq'^#3ŽÌÈ™ÞÅJêß% ^||Šåë-Ø€ NAG_„bugˆï¸7d¦¦ ©F}–É7.oRÒÔü7OÚ¦êI}ÒÔ›‚Ç4ô—§Ì9⚪‚òJRWË”§°cƒŽW…Ò›¨™À¥ç…$÷õê““È™qdFÆÈ¬Ÿ¯¡Qâ‰&ìg`›®;íˇ¢ kgÎl)¼ÎÈ7Hžz#$M½eq“N#O™<’ %ÌÌ¡Ñ@ÍàÒ¸:NÌ`Œ#/qËø×°×Ï×`4°úå43Ÿ9… ÿÆ8M×Þ1`˜ã‚nšÁáÄYzßÓØÌyêyÑ›*שJ˜™&¼†f<‚ï½{÷ðøq²¼dŒŒi "Æ.–·Ÿžâ§Ð޼݂¶Ø°·/¶»ÝÅk@F³Í–˜¸¾$_T×õ¤iê-Ms“ôUè$º+« S­ì(af,ý`4' M§ó–tî¾2F¦ì|êŠì°õÉ‚ˆ1l[ûCÿ IDATŒÅà®{·»øÛý$Ýîm—ë¬æ~öö™GZz‚ÿæÓöm žªIVõ›¬‚ê/­™°¾]I_œ­‹_<=•úÞU,;J˜™¾ã/\£QÛ²pyØ 7i¤lÓ’›£¤=åýè˜,ÀÞ'Mc1ضxÝzcÆu¤œf»?=ÌÝ«RHˆ +½…¥‡é,¬3#õT-²Ô[Üö¨ãÒØ§wÙ¼ãʈìù«Pv”03Ðë÷ÏK°q¯eÇW…‚UEʪ·0¨'µQMo.UЊßA 33idƸšy42n(ÑÞ½gp"J¶gŸ¢®mš}T*8óFzËòïK=U‹2×oq”õºÂ¨JÙ)¿™ñ¼U40µ- ï/<¿’îέä_ºô.VЀ«o•¶³o* ލ õFò„z#I(¿™1¯Î©äç'9\F¹y[„ݹL8ÑÉêä õF’Pz3óùçŸzþÿ÷ÿú¬Ð󇱼ÚÂÎŽh3n·E/ë+~D}¨7’'ÔIJéÍLYÍD9Ø®ïcÿº^+úbHå¡ÞHžPoDžÒ›Å>lØÙ©áìlüô°½™dõFò„z#òÐÌ(Æòj º.Ž€7ÄRÓmÐÏÄç›·[‰Û˜“Žr™ ——,õFˆŸ²èu’z|£è âîööÄÿYóªº>îçb/бz{€¹8PjÚ¹”Ò,ÄœÏImòÐ[”ùÚȘ4õ–ôoN¨Mi#3Fëw··'>§Ayæ½hmg@Ow þ& =ÁˆŠY ÞHžPodZJkf¼<88PÖ|¤m‹>ú¼)–úÐÛt–tÉ)âæPò·QGî5ßHÐñA³Þ¥Gן7CÃé’¦Þ’þ ƒ´âÕHÐü2aºõnÒ4µW,YÔoQZ ÒBX½äÝ/l{X^ÔGö(af‚ð6ù£8þ4ï¶°ˆOP~þ&ª2˜©Ÿbùz Çv`€SÐÑÃ}ëÎßAýy‰šl̿ݻv‰K»ùÄü°cIv¤©7@þo¥•¸¿»Œne49Íu“ÙÈRo2ûêC ”43a¦ÄoN⚪döͺ¹kŽìg`›®;ó•Š‚®9°Iö(¼O42…3i›sÜÄh¤䥷(’è#©n§=Ɇ2èÍ ûÒ¨’fîØë54e4!ið™S°úoŒÓtè†9.è¦ÿ”!ƒìÛMqQ¢&yë--Šx+ÌNõF ©²f&Ìœõ¯©RŸ›·Ÿžâ§Ð޼݂¶Ø°·/¶»ÝÅk*F³ÍJâ}ºÍ¢¢H#Ï vo’yèMæo§ïygÑm’ý©½ôÉCo³ÊÍLeŽÊ,0$_¨7’'ÔIÍŒÂܼ-B™î\&œèd õFò„z#I(åD“$žåÕ66€ÅE Ýc1pl’ÔÉê$…fFiv ëÀþþen£a’y†z#yB½yØÌ¤4û°m`g§†³3Že/z’ÔÉêÈÃÈŒb,¯¶ðÇ?ƒE½ò pã†Xj mˆ± cÜÞLÈ,”Aoel^ÈóšÜs•ñwH›¼õ6O¿mÕ¡™Q ]wˆs±ÅX ½=À\(ÅJf¥(½Q»‚$³…W<ô–dr¢•ofúÛ¿÷ûøæï~]ôe¤†½hmg@Ow þ& =ÁˆŠY ÞHžPodZ*mf^}ýGøÃfÝ.*chl[ðÑçM±Ô÷€Þ¦³ ÷åò ›wÄýìo£ŽÛ?,oÿþasœr‘¦Þ’ê!lþ›¸9qÜãd÷Ê'è³,IÏuÍþyƒÂ~Ë sÇ¿^ÒÖ[Ðïè]ú Tý ç•Êš™W_ÿšFÐé•14/>>ÅòõŽìÀ§ £/†ûÖ!¾ãÞˆ*ìAs“Èî?q½!û5HSo@2=$½Å™"Yý¥GM,Dع’^³ÿÚ’\‹Še/m½…žGò·Pñ7œW*if\#Óp>Õ24Çv3 °M×ùJEA×Μ Ø$ ;û&8ÒÔÛ´$½‰ÈìŸÄœÌJÒë™gÊ 7¢Jš™ðêQè¶ÅEkÂÈ@Õ14Ÿ9•nÿqš®½cÀ0ÇÝ4ãŸèV $š´õVF’F]HṽÞH6(gfþÁ«GØÙ9¼’>ôaY #Ót¦„7êš·Ÿžâ§Ð޼݂¶Ø°·/¶»ÝÅ[1f› !¯Ê ¬o)YêÍ¥(=äyó+˶ìe/+½¥iPËþÎ+J™¯‘ Æ=À,Ë`]12h^Ý-‡‡Fe ͧna:l}² ÀÞžX¿y»5Z÷nwñJ÷s2ûG=å2*¤&ié ×C\çLï>aùÉîïO—96ÙsMS®¥*e/‹ú-hõWµPÊ̸$22  lm™èMÛšÈûᄎ“×ט“ØûdâŽÅ`ÛâuG虸BP êü›æþDM²Ò[a`£ô6ÍþÓä#Cç »ö nÕÊ^Úz Z[CÊ’fÆ%ÊÈôô€öÀÙÐ1B#4Ž0GOž˜øð·_âƒ×¾•ÿ—™Û4ˆ¥4@Oôöú} ×ï_†‚Éð¬ºd¡7•õ óQç•=Ÿj¿uë7Õ~ÃyBQ3cÁ²ð—þÀ³À0è—‡Œæ–Õ¸bhnÝ2˜Ø}„Ò7Tj޳!¾,ÆK]àdž@‰¤¡·ªé¡¨kŸöÍ(•~ë2Ôoªÿ†ó†’fÆod\ƒbZ X°µeÂêhB\ZÑ~ŽX‹Ð¨ Éêä õF’ œ™ýe„‘ÁÀ52¢?Œû¹Ó1`4MX‡°e´ ãýšMÀ¨×1ч& áµ¤¸“­¹s™üâ/YøIvPo$O¨7’%ÌÌ«¯Ç•ýdLXÏÑ9€-XÖÕ4–µue?ïz—†èfú}Ò`yµ…ÑfÜn‹_–×?Iõ ÞHžPo$)¥73¯¾~øÌð &L³6ahÌæPò>3‚èú>ö÷/¡ëµ¢/†Têä õFä)½™#Ñüãv„ñ®û—û6›,klh,ëÍf Ü-ûkÚû°m`g§†³³ñÓ Àöf’ÔÉêÈó¢/ Uüs-+¦§Ñh_ÙfY—88úyF:=Ë«-üñÅ`Q¯¼ܸ!–šhbì÷72 eÐ[§(ã5ÍŠûŠünyëmšï,3Éè,×B¦CM33ˆøìßæMs—þèèÏÍh6kؾóýÙ®3t}Ü!ÎÅ^c1ôösq< TÑ…£èó“Ù)JoÔN¾DÍÒ'yè-˜gÙN²A¡f&þe¼ÍHAMKAÑßqnSPî&&{М@’  §;ÐŽÇ`DÅ@È,Po$O¨72-¥73_}q&jN'`_¿™°þ0aæ%hÿ†»h‰f³††ÿ¸aÛ¢€>oŠ¥¾ô6%]rÈœ §” ùI¼ÛÂöjÏz!lSÿyø„Sg!TŸ¬õ¶¯Œ¾¢Î!Óœ“4ÂÎ;m¹’9OÒ<ƒ~ã°õ ·r’\gRÒÖ[T½”äï#ûûL«[Ö•Ó¡ž™ kò›lóçánSÐÈ¢ kJi6€žèí?*ôûb¢6—2аВ”‡,ô¦òß=¯ÎðEuº{-Xö¸Y¯¯ìõÛ´¿OZçU±Ìd‰2ff<ÞÌax“‘»ÄGgŽÈãP¥½# zÏàŒ½`{ö)#³<…’bHCoUû»çuíEýF2çÍêoªBý–Çù«Vf²D33"lêÙ)ü†42.5Éêä õF’ œ™1­­¢/¡4¸“­¹s™üâ/YøIvPo$O¨7’¥ÌÌW_ÜÁ¯~{”ùyÞ|­œó2yY^magG´·Û¢Àó5=’ÔÉê$E)3¨a4òcº¾ýýKèz­è‹!•‡z#yB½y”33ÄË>lØÙ©áìlüô°½™dõFò„z#òÐÌ(Æòj º.Ž€7ÄRÓmÐÏÄç›·[RmÌaƒÚ%=.éhÁiVF ?gGÚz›å:ø7®>yëmÚú/*?7¿°ùïÂöJ'á(1£ëãq.ö¢‹¡·˜‹ã¥âF§LR€ýC²‡ ðÅ‹§§£ÿ²#gVmrÕHSo³Ä(uÉCoYï¢þ‡½ÿãöK'Ñd™¹»½Òéayx‘=®ÊØ‹€ÖvÖôt§àoÚÃñ €¨ÊJšOC$;ª¢7¢Uכ̃ ëÄé(}3“×À$1BE’åuÚ¶(à£Ï›b©ï½Mg @ïËåd(¢BŸÞðh˜!™öÉGö¼aûL“ž$´ÖTô»T…4õæÿÍeþfî¶ i$lþ8ú¯«ªϲ“¶Þ’Ö_2Ê7/¨Ý«djfü7u¤%)”14YñâãS,_oáÀ.lp :úb¸oÝâ;h¢¿+ùÅŒ0ö$VHf)èI϶O\ºl¥–ä·©*Yé-ì÷ŽšdÏ\RmF]OÐ5‘üI[o¡ç‰ø;geZ¢ŽÛu µ;I¡‘¯1™Ö¤x R˜q ;‡ûÙ¿¯ûY6¿°ý½ûù·ÏÂ1€ÝcàLlÀug¾’CQе3g¶) û¬m´i´e§•wXç;o»ô´yÏ Yémšß;ìoGªCÖõ[âê4LÄ4F†\%S3㤇Y‰2'I›§‚ L~aëqÛ§å3§põß§é:Ð; s\ÐMóêÓ‡Láˆ{2–aš(sޤ׵PEÄŠã*YêmÚß›ý­ªKÖõ[RÒÊ/©a¡¾“Sú>3iFD$̄ɘ$×Ĥqo?=Å;ŽÐoÞnAÛlØÛÛÝ‚îâ½f›Í‘2Vï“}×çï«Q%òÒ›ìï-ó·s™öïRå¿gÙÉJoiD]ýÍšY5;Í’ï|p„£O°ÚjáéiôáîÿÁÝÙ'}¬BT¬¶Z‘¿½û›_yjÝݶøÆ^˜WQ“l ÞHžPoÄåééi¬7)¬™)«hÅ<ÁÂLò„z#yB½‘$ffhbfçæmVtç2Ér¢?B¨7’'ÔI'šT”åÕ66€ÅE Ýc1pÐ7’ÔÉê$…fFiv ëÀþþe.£a’y‡z#yB½yæbмê²Ûvvj8;áØyïÑN²„z#yB½yhfcyµ]GÀb©i€¶ègâóÍÛ-©6f›M¢H[o„D‘§ÞÊ8:9™63)†®;Ĺ؋b,†Þ`.Ž”J:wQØ~=¤©7BâÈSoiê¿X”‰ÌüíßûívÀ)Ñïøæï¾•Yþia/ZÛYÐÓ‚¿ hEš‹®p¤RPo$O¨72-J˜™ß|ù7èv-4 À}––žãåË•©—€©„¡±mQÀGŸ7ÅRßz›Î€Þ<ü ÞèLÔÜDAmÕA‘¨¹FÂæ;"å%M½ù57‡WX€ê«Z¤­·(}„Õ}þ<¼Èh—ub1(af\.žÑh pñ|ˆ…•ú•í‹‹ƒ‰%ð‹‹C©¥aͦ]¿†w¿ÿÝ|¾Ð¼øøË×[8° œ‚޾î[w†ø–Xž€/®ÐM3±Q‹¼õ&SÁS_Õ%m½É6c’t։ţŒ™±`؆ö¼…•ú(BÓíË‚…&0°0@7qÞ Ã„Ùù]\\¤xÕÙp `÷8ÓÛpÝ™¯äPtíÌ™€-¥Â΂7ßd¥7™YÒÉü‘¶Þ‚Œò¬°LùPÆÌ,½|ké0l Ñ`k @@Ç@Ð@¿a =ú Œ–Œó±,M8î@_˜¡.Nåæ3§õß§é:Ð; s\ÐMóª áIJ–z‹zŠ¥VçUê7j³|(cf€±¡iz›  1žƒ¬ ñÒMëÃñ/®‘q—mg'Ÿé)+o?=Å;N¡½y»m° `o_lw º‹÷ b4Ûl„õ»!å&/½ùŸž“ꫤ©7¿†²2ÉÓæIͦ‹2ff8´Q¯kXzùXºue{;à×à¸Q73™QOÝBp ØúdAÄ ¶-Æbp×½Ûƒð,÷sÞŠ!¬m9(ZõÈSoA<õ5_d¡·(üZLšd–¨ÙüQÆÌä`‚vóE\šÖV³1ah$³*:& °÷ÉÄ‹Á¶ÅëŽÐó½Ù.S¨¢ö ëôÆÂYMòЛÌ~Ô×|0«Þ¹ú+h¿ t™‡=։šŒ™9?_õk'¨×=Šî“mNÁ¸‘¿‘QÛ4ˆ¥4@Oôöú} ×ï_Tb(µ”UoÔW5)Zoa¯T§™75›ʘ™k×NF†fD{ÜÆ7-,23°Ä†à‘kÊÊ´wDAïÙ}iÛ³O×%“FÔ¢,z£¾æƒ2è-­ü©Ù|PÆÌ¸Fæü|m"ÜØ÷-ýæ&ð&'2ÓÙzþÀAò„z#yB½‘$(47Sójd¼x#/AFÆ™qßf8ÿDî„BQ…ÌŒp ççkž´ú˜4,Þåh¬™«ÙŒ"3 %™!„â¢L3Óä1—“›¼&` çHøÌs£2*Ù™§§ÉB¯wÞÝÆ‹§§xzzŠÕV‹Ë/ !ÓsçÝm}rPx9æ2ÝzÎý»Æ¡™ñÝ;™ê¾t´®÷ˆ#£jŸ™Õ–ÜPÚ„Ê `.ã ¸ìß•2‰[×]޹”_&ù»Ê Œ™9;{‚ÅEáHlû#4kŸX€åëðâ¾­41žLˆ‘ëê‘Äá–A¸\Êš$WBÈ$e(Ç\Æ×sîß*M”13¶½À54¢p³9€e5€îddÅ€þ`´0ºqmÌh½íž#ù$•*Ps)WÀ !ÓSt9沸úN 3óíoýCüÊÚpà ®][tЀeˆ‘ M4`Œb.S,ðu.V‹¨vÅ¢…Ë% !yP†rÌeòzN¶_LJ˜xóµ;C³…Ç?‚¦5Ð4ÐF FîòÉË—^â%0Z¾|é¶6 `õ ß›Njõq¹óîväö2˜KB²¦èrÌeq†¦ôfæ7_þ ºÝXÝ&~À4·œ-ï9ÿ£©×ëWÒ†ÃáĶ••!ž?¯cûÎ|ðZJžqF`WeI™2”c.§¯çf14JŒ3srÒE³c¡ÙlÀ0¡iN¯]Ã8Ä¡Ñ@£´Ûmh¾yà‡Ãáȼ,,,`ee£Ñ€a4ðÑæ 6W†xùr››á7_þMÞ_mfdþðe0—42„dMÑå˜Ëøe•ŽÌÀ`PÐE§cÁê6}°º¸Ð.`š[°@§Ù@ C45›‡Ðê}`i 6..4Øö,k è[裃-s õzm.a¿·}}ü>¾ù»_û…rôÉAd„¦ æ’††¬)C9ærºzn.úÌhÚƒC]lÞïa€mè@¼ôäIæ3ýþ=Z@½^ÇÒR pq!"5®¡ùúë¯1qq±…Fh6?Ú}<êó³¾´]ß›¯Ý)ìûNC”Ê `.idÉš¢Ë1—ÓÕw³@3cÛ‡#C³¹ Øö´zö° }¥ MkC«ß€=lÒµºÓµ×™¼|>Îw輓 c|.òýr9P´p¹¤¡!$ÊP޹,¦žSÂÌý‘¡±mV· ÃàâBÃùù9®]»6±\_×ðìY7n ¥gÏ:ÎÒÄ€®3Ãvgb½ÓàÍwN2*"À®Ârš¿+!d’¢Ë1—rË,êºÒ›™oëâg½t݉ÐÔûXï]`gÇ@³yˆn×Ä­[Cœ?1Å|LíGè÷ FÍf–óºu§càáÃ{èvOÐé¬Á0šè÷ÅKÚmÏt<;1aýQçâ2"óö’Ÿ¢…Ëeüry•S2+E—c.ã—ÓÜÃd¨}rpùôô>8š˜¤+N0>8ÂwóëWò³ßüÐuÎ!ÖׯC×wÐéèvM]Ü¿‹G?é`ý~Ù@ß@³Ó¦­;h6èv›èt,t:kcsè×n5pÿþC ‡ýÜû̬¶Z‘¿½+B!dÞˆó&¥Ì¸üÑ·?ëõððá+XZZ‚emÁ¶‡¸u xò¤ƒG?éˆ&£G6ú}í¶  ^¯ M«£Ù4`YƒÑQ÷îètÖpïÞ¦Õé }ÞG·{èýu¯pw;7K!„¨Ž2f†Qšfó÷ï›èvO4±~¿ÜÓ±¾Þ`b}]ƒm›Ð´4í¶mŽ MÓ™Y[MLm aa ½‡'Ð7×JõFS\´ŒB™W”23."J³v» ËÚB§cáÑ£-15™ÓdwlÁ²:3M6taYÆQ„æü‰‰µ{NNl¬]Ó`ÛØÝýOžÔ•s†B™7”43€ch~Ó‡m/¢Ùƒä­¯õaX_sg¿0`ׯG‚Ÿ/èX9ˆæ©']¯B¯”™ùÕ¾™&º#3,}gǶg—Ö°°°€Á`€F£÷>G»o¡kuQ¯×¯¼òÊh}ïáç¹~¯¢¨‚€«BÒW·“GHÕáà§D3ã52,t]±ÁÄô´-4šº5 Ú@ûpqq áì àÐ@Æè#,ÀêÐ]ÈíkB™y ‚Ä£Œ™¹‡4·jh°ÜÄ #`оD£ žŒMÍ„ciLäÛÇ8c5ÅJÀ|ÄfHŽ>9ÀÓSFB)U‰0³n™ %ÌÌýƒO±Ñ¨CÛ9Agk æ¡ɪ\12FF¦q«áš¶'2#ú˸&Æ]÷ÒÌüÕp'B%„´á`›³£„™q©kmt/alÕ„¡é6# ºƒQæJdf0ib,M 0áݧ&B)3¥73nTÆ}G© Ž¡q›“FœÕÄíKah¸€ƒ:ÖÖDŠÝÐnLDa¬þ€F†BHnT¥™¬hJof¼îÊ@çrd<܈Ì‹—€-V‡7NðìÙ c ¦y‰“VP¯?Çp8t–ÎçÍçÕì\¾!„BR@ 33ò×±ŒƒFMKиu9ng¢óï@«áÖÉ-¬¬­á¢7D³YÃââbì9«>Æ !„R”03` š0X¶¶Sã¾µä14€³¬ Íý‹ÀË—/±²²‚ŽÙDÇ2Ñ1;öûx^¯css :ƒz½àðÐ@· ¼ùÚ(ä»B™V[ìü+Ãòj+²IN 3c šx´ð=³Ñ840Ø2ƒÌè˜.·Ü†) +xøð9ÖÖNÐív¡ÕÅ[MÃk X\ââù:ìaõz+++h60Œ. !„Lá ÑÈü>¥73÷±†“•<¬?¼ò u˜‘iØ—b༎X&ЬnÍfÎ.`ié ×®éдs|ýõ †Ã!®Ù¦6,ì~þKKßËçK’ÒÃʆjqw{›åºB”ÞÌmÿ ‹‹·ÐFhw0šÆÀOÃùvÑïÂjoa°>ÀË„‘ÙÝÝÅÚZÝnŽ;e'']Ôë&?^ÂãÇÞm„>8*ú!)À7ˆª‡f¦>ž­=ÃáɉoKØkG+ÎòÍ&pïÞ_zKß;Ã@ƒhfÒîÃ0ÄÜL?ÆÆÆ...°°``i©Ž^¯‡fÀï²û^D=8!å"it…ÓT“Ò›™7ú-üêê¨c0VVÄëÔ¦ ôû€iá7š°z‡¨×ëhØÀ@6€µç¸wïÞÄ®>œøìú¦ÿá÷^KùBIÙN´œ²º”ÞÌx±à¹è Ûï?8<·3õ@å$ ú@w‡c#§ÍóçøàîÀßþàÿD|õÓ?Ëí»BIö¹Š? •WóÚw·soÊSÂ̼ùÓoá7ø,½|,ÝB½.ÒÛž}úÚ ÇÐ4X@´Ñcç=r&3h`ddÀl6a0,K S&=úä`$ ,…T„H !„$#¨®®rý­„™qYZº…—/Ÿ ÑÐöäd‘Àä\Kî,LMÀí)<°®N#ùÁÝo>TÈÔ 2k‘†„*(‚&‡{ñôË«­‰å¬çH³ŸNÚùBÔ¡Êõ´RfæåË'XZºwæk`ÒÀ´áÌÝ…'*óê~„>hc€>8üÁ`âsû?*µ¡!Åd Ò2 ^ã‘–AJËdBÔÆáwMŽ7ºïMÛ?*=o”23œÈÌ-ñaà4-9ÛÜ>3MküžÓhâHg*oóÒVÓé<ìDbÜÏî Ù&ÆQ +º 0L|QÇEEg¼Ûý#ê:¼éó鉂&„’&aõzX´Xz(gfDd°›bùÞÎxŒŒwl¯‰§©×¼ä"ã†e(Ó®êýv®8')ª™ Óám’ònsÓãLJTdÆßÜåæ„]!U$¬O!™$ìu™ß*ì´H”13Ãa»»ßÃÞÞçh4–Ðl6`u¯Ž3ÓHyùò%ð_ý¡y«hjd g\gᢠyY ´„™ÿ>~ã7&qfÃݶOPþ„Ì#þhpÑu\ zœ–²ü¾Ê˜™7_»ƒ_ýö»»ßÃpø:Z ; д‹Ðcl{¦9f¯]é#ã_V±ÏLT$¥ Í9EŸVdMC\gašBÒ£,õ[ÙHë7)ãË Ê˜™_ýöfçkgõõ÷¼{L½.&Ž|÷ûß|õÓ?ƒùàˉ>1qK•úÌÄáoÞÉ¢À‡uKr}U$*¢ÂH !éSÕºD–¨þŠAÛ’ä–;Kòäl /­Ø'utû]À²ð¬^ÇCÜrfÈ~þüö£GxdÛXYYÁ½{›XZjâ_ÿ«Ÿ¨–9‰CF€a¯x'h)’éˆvž*›àj3SV†ÆÍ×]'„ÌQõ¨ÌðQuz’|ò@)3cÛ‡è>^ƒ®Ÿàþš{x­Þ–Ä\L 6..4à-aZ½{ØF£t:&Þ|í?ü Ò!NTÓ 0n{Ò‚!³½,!K¼¦ÂýìOOj6‚úáøóûL!UC)3Cóþûïãìì  ë èõ.®,wôtÑA Ó)øª«Ë<¿9××»]¦ãî,ç¦a!„Ì3ʘ™7_»ƒŸõö¡ë;8;;ÃÇñÌì`é­=»ØÛ{øüó—0Œ!öööÐé,áåã&ž<9Ãúº†¿ûêßû%*HÒ×øˆ<³4?…E|Ø?‡RE”13ðGßþ=ü¬·èõzxëý‡øÉO6ñÖ[{°, áfs –UÇ[o-áåã]<~¹„½N–ÕÄ_ôzøo#^Ñ&¤lÈ$£ÓÈ*ÂÙ°‰Rf†LÓÄââ4m/_.áìì oáùsw¹€•¶‰¥¾…'OÎ`ÛVL΄BTCõ±ªH:(gf\þèÛ¿‡¯¾ø_9ÍGÞåà«/þ ßðw_ßÄ¿Ã7•!3pôÉžž2²AH™¨B36ë•ÙQÖÌ’'w·ùôGIŸ 5Irhf‘€ON„,¨Bd© |#ÍÌž^“<Õí[ÄS±Ì9ïno_ùO!„|IÕ̤Å4¦ (#ñàà`â? !„’/©›ÿÍœ7wB!„dI¹ 3:qްf÷sØ9üëþ<šŠhÈ!„ò’z`׈ø—iáæôYvà¤$yø÷ ÊË oª&I;ßÝÞf§aBɉҾÍä5C~dÍ‘ßT%Eæ8š—ùáÃGRûñíBÉ—LÌÌ,"(Ÿ ôÐ,“,‘$BæšB$È3bV–›tY®ÃOY¯‹RìL!„¥¡™!„BˆÒÐÌB!Dihf!„¢443„BQš©ßfâ„B)S™™ysƒB!å t*3ÃQj !„R$«­ˆ™ Øg†B!JášB!„(ƒ×ȸÝ^hf!„¢~#ã®ÓÌB!¤ô„€f†B!%'ÌȰ™‰B!¥'ÊȰ™‰B!¥FÆÈ3ŒL!„’%OOO±ÚjE®À78!„BT¦àÒýpôÉG÷%„BˆRÔ.ËÚ¥³†ZÑ×C!„’ˆÿ3r÷ÑÖ-IEND®B`‚PythonCard-0.8.2/docs/html/dialogs/images/dialogsfig8.png0000644000076500007650000000352507523020030023177 0ustar alexalex00000000000000‰PNG  IHDR¹w_Oá˜sBIT|dˆ IDATxœíÝÏrÛDðïvú9æ|ôÑ7{ZJÓð§. ™ÐN Ð8ôBk(Ï@™\h …mÒ†vä[Ž9úr̈ƒYW’W«µ¼+­WßÏ´ãD’åµüÍov%Y“£Ãxo0À½FÈBsúèð05¡ÝéÔÔ"7N«&fƒO´Ê”!€½Ñ@@`ú/ñ@ˆ—ºy©eræÉ×ÑÍ“ë×Í›[FÕöL;ùþü}¶œ²º6"åVr¢ºu.¬•~n«ÝÁÞ—Ï0ää¹2ãÃìsœwW>»ƒßŸ~§œ÷ëÁ7øeÿk×M †³^ÉÿügxûµOÏ]™ \~{ú-àÝóŸÙ~Yj€þöÌÏÉ›.qàI+C†X†:ù³î@¦q%?xq7õûæ+k—ÿãïïqñÜ<|vðÎëŸÎæ=xr—6®Î=çþã[©ßßó ÓæQCŒ†ô·wRA/:Ro\É7Îlaãì.œýðøß´ËËª»2ÚŸ6ôòæ5¼÷Æç€ŸÿúÊ´yÔ ÉP›œŠRº’»’­æDYÙîJQÐBþäÅO€³[ØþãMÔ»¼ym”íƒË®‹.èÞ<ï=ºÉî ¥¨™ªÁh–QÈÏŸùpðünaëÕmÓg–|>xr{n^ÿ´‘÷ß½G7pàIi£á@Y±ó¦KÆ}ò3[Ê“xTä S‘ÚO¼t !piãjj=—7¯¥ÖÍî ÙÀÃúä5§}3ää­VÛÎxrò–<‹pYÞî]!²%·’ÐoWÙŽ†Š3ä+9!§à1ä<†œ‚ÇSðr CNÁcÈ)x 9!§à1ä¼ÊÏBœŸhç·ÖË_ÿŽH¥’'ƒÝëõÐív•ËÇcDQ4û'œ†\†[ì¤n·;[.x†–á,ä“ããp«ÈÀ˰3èT–“OŽOpýúõÜùãñ½^:üQ4VþAȰ !xã.*ÅúÞ•¢€˜ xÞ´¤8޵×Ö Êc5ä&_ƒNeX ¹ìƒ›ˆ¢±Ñ4õs#bµOn:Èìv»ˆç¾Öhþ\`úGÅÁ(™°RÉ©â6DQ„ÝÝÝÂKD€ÅJnZÅuW~›¯î˽Pù+qlf¬æT„'hQðr ¯…˜£èÆKÙùª Äç­C·ì"ÏÏÎ[äfQMb-äã±ú°¼ ã±Ù>õedC•wñ÷ì|ùsö9ªéºiymP­WÕF“{é4…•·Ö×EQe!ïõzØÝÝuú68©Ö‘ j2ÌÙieÚÀƒdjV»+UTó*ªx^µ\T^%UUd]E7m+·šµ§¬æE„ÈßW®›'e«øªõLv+€t?^5ÍÖë‘åJÞZ_ƒ±fGø2ûÈ…λ)€°eבíš,2ͤmy¯G€ ñÑá!nì0Ðît–¾OK{Gô2T_•*î˜ÅœìB BXŒN¿`1?ÐljÀóvR>gûÉGÃÁ줭2a—áÀ€'0Ô‹sz0h4Ì¡¨ |2ØÀ|¸fœÊq~ijµ¾– «.ðEû¿p*£’Ãú2œ“㓹À› PnZF¥ç®$ÃÊ+iQUj; ±µ¾6Û CäRí§Ú2èäZí!trË›óÉåîF"Û¼¨ä›ä‚7•\bÐÉ6¯*9‘ 9!§à1ä<†œ‚ÇSðr CNÁcÈ)x 9!§à1ä<†œ‚ÇSðr CNÁ³ò¥ ^&Ø\ÞeÞÚNÅ-YM­vgáKåYûfÐäh¹+ᆮÕ.ñ²W]ÙícõëoüÔ¸]êÅ>9ÏYȳ· iê#ÕÏÊ&úÛ;˜ΞǻLÉí ·/ x²[£—Ìé"œÝi¢Jº»/ÔyK_þÐëº;…/ÅÎIÈ«|sª×Ê{ýª7ºò"Û'TNúä>nÀ:>X·ào»\qrß]uU.ß¶ƒJ{gö?9-9¯hyÝtÑ'÷Õ*l‡¼ñŠêç¼ñMã+ß'7¡ú ªàÛvPÉ«¼&í¶qkö*4¦’×t·C’ª—åó{mDŸ\²yïz¾n[íÊ[oï{å+¹*¸º×¯²¢ûPÝtÛgÑ?úìòyëñá}'Ñ'/ õ"ËÛäKŸ|Ùí“ü=o]unç"ÙO^n?4ªO^5n?8«äuŸýçÃ#+¹œœ…Hi< Ñ/ÎBä‡D>²r“ï0’‹„ÞÝâ°©X$ܱr°–Çmè¿ÈLÁcÈ)x 9!§à1ä<†œ‚ÇSðr CNÁcÈ)x§xR…Nˆå/ò ¬D!1‹øÿŸ ên‘uÿ³¦™'OOÆÁIEND®B`‚PythonCard-0.8.2/docs/html/dialogs/images/dialogsfig9.png0000644000076500007650000002076107523020030023201 0ustar alexalex00000000000000‰PNG  IHDRDK®¼õsBIT|dˆ IDATxœíÝol÷çñ‹¢PûÀÂ=±p¸(°RÐ"Q`%#œt›•“4’nÜÞÞÅK%MVîÂݤw{gm‘ËJ{¹6ÞÕm¢Ö­ÅÆ·A7jm©ic+Ù]‡÷¤u@@ê€ÛÚ÷ ÐCùÑÉ= ïgèáhþÏÃù~Éáü“m~üùÍ|Y¸³·Ûºººª×®nhãòª`T}zow·kÂôÌLN»ùú´×DwHÀ(ð DIºº±×õº ‚Tpó$Ùfäå#ìW’m.߇¿¿$Ëðof´ÿ͸—ÏÛ§òÞ¾"ôÚÌ£'/;9=£«Ëdº@®’ŒYx-“Åz"âûÿó­cÓΜ®ÄÞx¿mÜh_FôÌcR­çíŸÏsú¿ò?.÷ãë-Iú“§ÿó±÷Ö¶,Izî«™j߀aôÌ ÝŸÙ~]«Bœ;ý'’¤íÚu³VÕ™‡7zã¿KJ†Nÿî+ÿAÒà†‰†v>óÂ=óÂ…X¡è^GØtƒ*†Ž3Lmaa(etñƇëç=üœ$é½[Wºæùò¿!IúÅ?ýP’ôļ wÿñ²$é+_zQ?ÿÇH’ž|äO%I[|¿³ìü.vž_ß~³k½_=ógû¶ñÞj§J|罿ízïkÿ¹$é'¿¸Ô™öo¿üràú¼\Ý|­ëõ¹§þ“ç|Õk+¾ë¸òÓ¿êzýü3ß‘$ýpã¿t¦½pö•Øû˜ÆXQB,h=vuéµn/±*ÄíÚµ]û±$ïsˆî0|ü‹Ïëñ/>/IúÅ?ÿ0òvì0œ¤„›ï¯I’®¿ßç義§ç¾)IúÙÍ¿ \—; Ï>þ­NþÃ/ÿ¦kÞ°0üûŸWÿóïêlý·Î´«[í0|vþ/tn¾„o]ÿ¯Ç–µÃ°òôE-<½ÔõÞ•ŸµÃðù?úŽžÿ£vþhãÕ®yCŒš4ahs.e=¹C|÷Ÿ.wžÛÕ¡íÉGþT[|_›¬uªCçŜ׶ßH¼Ý4z}ñG?}5|&‘¹™ÃBq`/»é„âûk]‡Ì’:Õ¡4\vu(Éó.`”¤YN28Ó÷A•/ÿÁ7:ÏŸøÒ úÊ—^ì¼~òK÷Ïn}ðýc‡Ìn×¶ß=d6Ñ~úê±Cf`Ô¸ÏÿÅ]Vò>dZg¬ Ñ>(Yç} ˜Ç~Nïݺ¢_þó:Ó¾üÅoøÎïæ3ÝÏý,-Ÿç@ïQ!€…@ ,"XD°ˆ`!ÀB €…@ ,"XzˆI¿$&O&î3€ô2 Dû[²Ò|[Ö Éâw†?`TdÖ1;Ê—@›fØ~Á2 İ0tVIÎù²˜î7o”íûÍ㜶qyõØcÒ} Z6h[Î÷ôN_¾SÅëƒí÷:Ýùžßë í‡­Ç͆Q÷1lûAëÐ_F}É”_˜EY.­$ÛM³ j@oˆ~‡ŸaA¥úK³?†G&£ÌvÓQÏUöS¯¶KuôWf¢W(}Ýó;+¾¨ƒ'~ó†íW’y’î»sšûµß>ÈGaãòjkowW¯]ÝÐÆåUMÏÌhow7ïý‚dú[÷ÀB 0ªC ¿D°ˆ`!ÀB €…@ ,"XD°ˆ`!ÀB €…@ ,"XD°ˆ`!ÀB €…@ ,"XD°ˆ`!ÀB €…@ ,"XD°ˆ`!ÀB €…@ ,"XD°ˆ`!Àòé,V²·»›Åj SÏ^¸+Ÿ2 DIzíêFV«€Ô6.¯Æ^&³@”¤;{ùUŠ¿÷êwÕÜßÒ¿z‹j@²#ס8‡øÛf¤¹%5šyï “eZ!fiò£ÏtO¨7´9wtl¾âáy•ÊRu­¬I›¿ùHóóçs­V˜i`Q’*å’ª¦To¨±(•J‹Ö;MI%5«•*ëª.,h¡*i½¡ùíFÏ÷krz†À†POñêjøIÍg/\ð}¯; +ÖÔöqq³ZhW†V–*ë*—KªÖýqrz¦ëu–¡FHæëy…x¡éõµµÎäScç»*ÃÍÍ7õä“e•ª¡ûã -B €Óà2« ¥ÅÅÅc•a; O©Ùl¨º(UÖì2ܽݮPtVîàôšn¿ç^>h}½¬R¤3°¸9wä:gØÖPEµªìbÐÃR©¬­­UJÒùÛsW‹öë *Òý^Põé|M• ¦¾\v39=sìÇÉ>tv?¶u×{ UUÖ[jµÚç aX,Že¶Ÿîé^ódÀpéK…öyFçã¿üæ#yü¶Z­®×¥RYÍfCÅâ˜ö÷_–“v?ý‡ÃªGæ1þÂìf³])îïŮÇüÂÒ«z`¦=‡8xJ­cS½‡Kì0Üß?RµŠ~$îp hq/ç\þÎÞ®ïú¢¬@>zˆQ®EôS¨J-kùüùó:ï1Zâ Ãåíà0 Ÿ Cæ i^ƒ%AÛ#ÁÔÓ@ º1ŠJ¹¤Bµ©VEjµ÷a²†åÅö4$1°‡Ìª7:wTÖ›G;’¤®Ùî&›†T‡ÀàÜ@¬.8ž'»¶âØ@ «¤®®®¦>$·}ïÿ£oóó™¬ €¹Œ½ì&Ë0\\¯pù €Á­Ã$­¯ß¸|ûûëZ\¯¨$©ÑhirºÀ9>`„T…xýÆŒææ*š›«t…a¹*©d‡"•"0ªŒ©ÓöV´ÃP’ÖÖf;aXXÖ×¥’¤fé~¥¸¾Þ^îÁ/ßÉâuÁuÔ*Ó´Î7ܪˆagL J){+ZœaX.7µÞ(©b=o4JP,— j4*:{nFïôð‹«è| c™“ÚÚa¨¦T.Tµ¸XRÙñ¼ÙTçîÀv(_×è¼=Ï«ÝWÜýußîÔ}Ç9Ýo[^ó…­Ë=Íoþ°}LdT…˜Ô¯>šÑÉ“ÒÉ“ jX×7.®KÒ‚îçm-•+÷+Å<$éÏèÅyO¶ûy’žT´fÆ¢»:‘º?¤öè³óñsJ•JK’OÅ×þÎ*©)5UW¥RPµ|¼µ„¿r7}ÔàH[Ù òïÄe\ zU˜tY`˜ˆRº~ˆs:8ØV©tZšµBÐñ~Ý5YÒ?x¬'ë 1M å ÃÆØsˆql[ϬÑ:Dîa³‚Më(Ú¯§ƒ3¼:#­:lîêÉ«š Ã;O<Òùñ›ô¾{ºßþ„mÃ9Ð:ÓU!¦51Ѿì¦aÅ]Ã=Ðl…aÓ7ûwÑ+`í×ö£sš×û^ëñ4¿ß6ìå¨1LŒ D¯K^Âú!Õµ´tFËË7U*M¨\.©±æuÙ³2,éàààøö­sˆÎ×^¡ãuÝž)ü*?÷ï@…ˆac\ †]÷æÕñY]ÐÙs3ZZ:£££7µX,éÄÅ*ïy®cÿ„ªÕ¦g ŽÂ(sÔð¦Bİ1.“8{nFÕÅu:^óóç%œllLcccš˜˜8öž»BìLóVšP=í"†ÍH¢$-V«:hÔ´¿3¦µúšÔhè×cczà£Îדn/Wµ¹¿¯©©)=ðÀúö7Ÿ;¶ž¬+DçÀŒsš{zœÐôZÎk;îéq·K…ˆacT ¦é‡øÀ­mÒéÓ;zýTEûGë*ŽÕ¥‰)íïŸP©Ô>§¸|ê´vvj*õ/¿YÓöv³+í 1¨ê³E­þ¢¬ËkZ”çI¶¶]"†1˜E?Äýýu½ôÒKZ[ÛQq¬®ý£YMÝÖÄÄîÞS±¸¨›7›º{÷¼nß>¯¹¹–jµßí ÄQ8‡"†±×!Æ©ßykWFûëGïÞ½Û ÃâX]S:yòHS*•š*—KZ|rGss­véçÐ5sƒý¾Ë&ÆTˆnq+ÆwÞÚÕ÷ÞxQ’T>óõÄÛ½óÄ#š|å•h½5Tˆ"ƶÿJÒ1»ë’Ú½½<õèÙm@°$í¿F¦Bì׺®¼}MS¯¿îùÞd¡@ÿ@`€Ä9Ä~®Kjû³ûg¡PÈt²gl j…èÖ´~­V϶Už¾“l›Îäè7c™Óœ÷KÛ[1Œ÷]ÒÁ‚¾ôÝëûƒ¾ó9ì~ï~óÛ)x¿îìí†~·5%c1mU—¦·b¨fSGGGÓÁÁÆÇÇuxxè;»ûCï|ínQB‚â36³NR…ø$Kí¯¨Õj]ÓNŸ>í;”*)k^©{;Q¦ûyÔiaë JD?ˆ½<ïæú[¾·¹¹©±±1êÒ¥Kz饗ôúë¯k{{Ûs~§(‡‘v8„ÍëbÎux½Ž;&Æb¢34¼Æ«·âï|îóºxñ¢ï:gggUpŒ(_ºtI—.]:¶n/~US’yûXÎê-«$h‘'c1‹ 1,T¼z+^¿qKõúñ[úœvvv4{ê”ê;;ªÕjj±Wûiû?÷F¦ÿ^ÆbÖw—$åw®°¾³yIa‚$Iuè7âl?ÏûwÂè26³ Ã$@;—––º¦///wž ¤¸·tÙä}ÞÏkzÚíÅu[ICŽ€D?ˆi+Ä´—ÖØa×r]pv8í'îe4a#ÓaÓ£ÌezÚê0ê~ý`l ¦ ôեó0Ù}ÈìåÒ¥K#ýAOZ%R¢ßŒ ļºÝ<õèñ¯ 4åC·: {/É|i—Ò06ó¼—™*0œŒmî0ÈÝn˜ÉØ@4¥Û sˆTˆ²fl R!z%bP;¨2Èýã ëøânè u_\¥uXXw¿uÅ™u¿‚~w÷úÜëqo‡.dÉØ@̻╷¯ÅÞæsütìeœâ„@ÒÖ\½Þ¯0„òdl æÙñÊÛ×"ß–g«Õj=ù°û…QØvü–qw¯ñ»Ï8ìw‰’QB;h~ªDdÍØ@Ìë¼ß•·¯éuŸoÕóS­Vß÷ ¢¬>ðqƒUÆb^ýõ¯ÿnß¾­{÷îù®÷ððPg&ÎHÛÒÍÒM¥ÚÏ0AÁ™ä^ãA<”¶×ôÒH2ßÙÛíêíþÀyõC”ÔéˆíÅž~óà¦n–n¦ÞÇ4‚šÇÆ¥uv×ñêi ƒ‘®ÓˆÒÔAŠßÌÐqª« ó}Q¶ç~Ïo§('|Ã~gõÑkÆbžýŽŽ"ŸGŒò]*QÅívùJ–ç(ãìWÐö½”€D¿ˆyöC $ñ¥XØHqœ×Q«>®Z£¬²¤r¹!©¬íím•J*‹º{÷näýŠÓC°š<8õ«¯¢{[Îi\¾ƒ´Œ ļû!Jíê°X,êåÏÞVíã%•UÜÞÖÒÒ’–——uïÞ=8qBªV«:{®¢wÞúçºLü0çÑWè%c1Ï~ˆNÅbQ’´85¥m+ ?þøc}ö³ŸÕòò²æææRo?JÿCw#†° .êt¯.@^âôUŒÛkÑ=‘5cqP®,—Ë:qâ„îÝ»§R©¤åååN–J%‹EéöíÛ‰ÖÔÁ«[_¥6=JŸÅ´ûî7-Êz²Ø Œ±ƒ*YŒ2ONÏt>lÎçîm¸¯ß¸¥ë7ni||\ÕjU[[[j4ºwŢ–——µyò¤¦¦¦ttt¤±±1U*þ‡Ëýfÿ®ýˆÈbv‹¸÷Sqt…˜¤âõ·tñâÅÎF;á`l æY!NNϨÕjiggG­VKjq 0 Œ=dÎ뢆õz]³³³*¨ å•ei¹}‹ÛÒ҇؀!Œ Ä<+Dû›B¡Ðž°¬®»Wœ–––Rí¢cdiˆy÷Cœ=•hÛ^²þ`õ ë>ã~¯ëõš×ïBu?ôPDŒ Ä<û!ÎΞRA’ZRK­c×"æÍ«ÃŒý˜¦‡a¯Öõ¶¿8áEÈ! cU²eŽ3 rgoWö‘rK- …Îa±}³ý“dýîýrb»×¶î^5nÍj½qCÎë÷ÛC1Ê:1šF¶BLãÎÞ®®¯ÜÒŠ jµ¤z}GRA³³-II÷——¥‹[ZY)è©G“Ÿß²_û5b²Ž°õ;¿8ûæ^GÒõfiоŽf06³eöª¼œ{îG©=Xb‡aû|b˪ w$Õ5{JªïÔ;axñb»šLÚœÁ)í¹/¯NÓ^ïÇ 3w;µ,šÃ&ÕïÎ;Æb^ý»µT«Ý¯ »*Ä–4«Yëõ²õ˜lÿ’ªâÒœ‡cÃÌØ@Ìò:ĤVVÚag?v‡ŸóqI++íǤ¼¾& nè¥ É^¬7Nµ›Eèbl æÝ±­rí1;ìŽ?./‡‡aP/Bç>º3ÂÎçy-ïžçð8ÎòQ×t‰Mœå“ü=p26óî‡Øý!^˜s©3 Ý‹þ„Y÷0 ’dù4‡çIƒ*íï‰Ñel æÕÑÉÅe<<}ú´õlG§NâƒØcIªDªC¸ˆyÝË|ܲ#ü¤ÙÙÙãsx%&27ÜC¸ˆyÞËl›œ¾¥VËûf§‹/ªPXѽ‡m@ˆƒP!ÞÙ{Xÿ÷ÿ¯ÈólÆÞº7"€ábl æÝ1Àð16©ûÃïöÁ~4Dˆº$ûBCxÉsˆYôCôêŽæ©G½Ï#{#‚ ß/í¥/^ËGùó¤"¼ˆyöC¼~ã–J¥R¬ímmmõ¤ïŸ)ÒôKŒcÿìÐ?Æb–£Ìq>D×oÜòýº?iȆu£vÞ5Öz+¨™«ßmra·Ï%éŠãu?vÐzü*Á8ÿ‘xuù!@ádl æ}Þo{{[årQûû÷txx¨ññqßÇ4¢t£ŽÒø!j£… í„íOÔíDù=£¾dÉØ@Ì«âï|î󒤹3g´"i¿RQµZõ\¥RQ¥R‰½/açÄÒð«ÎÒl'«ý‹R&Ù§^žcøˆyõC´SîüZ¥Æ¾.ÎÍùâúúz×W DÝ¿÷z)M8f±îß?JGŸ8ë¢0ö²›¼¯l4öU.µ½½­V«åù5 ¼Za9eñïå¹³(ûupÉ9-Êzûñg‡á6Ò¢-I0”ËE5ûïßááafûãþ•¸ûw¹ 0 ZOÔí¤˜ñ ñ iQpnnÆbÞý«Õ­˜óW÷=Œó~ØrQ×¶Ž¨Û‰ºQ¶¦·bœå1ºŒ ļú!>õèÃ*úûý(ð—ôðŸê^Œ Ä<¿S…Ò`Iò÷Áß!¼;¨’÷uˆ†±˜æàÙf:?`36“Tˆv6*-©Ü¾ùì3:ûÆŒ®ß¸¥ß~ò™®Ÿÿ÷ÛOôêwÿ.ë]0 F梄M5Un–¥FS².lVKª6æ´¶ÖèZ¦Ñ¨k~þ,wÀ36cWˆõ–Êõ‚´X’Öšíi‹-5’ªeIí\l¬K’$•Êñ/¬6ßk ˆizž}ã÷U]—ÊÕ–JkI-i±ý^©.5]ó/Hª4¥†üu—‰~ëˆÓ±¥_†½g# ˆRº†…U4+i]RUZ»ÿ^SÒ믿®ƒƒš–&&tRÒMë½_ÿú´äÓØuÔ {ÏFÀ¨@tŠólVË*7ªªtšº6%•:‹‹ÍÍMhkkKÅ≮e77k¾ëõêcWRQÛb]X֟ЫŸ ßs÷zü:Þík˜8ý“ö^zÉØ@Lꡇ:6íÃ?”$Õj5>}ºëñĉÇæï‡(}Ó®'Ë0tïWœÀ šè'ã1IÃûšª}íC­[- $•š²Ï"nnîks³j=¿ßÒëá¿à»?~ä ¾ƒQ×§;K’P‰†q4„ j$A("/Æb’†¯]}ñØ| ’Ö›ö©Äö¡ô;o='IúÞ'¿¯o*ÚÐ÷R¿ƒ!,Pã ö„…cP3‡¸ƒS@VŒ½0;®íímI%UêM-T%U¥…†ÔœµÏ%ÞW-—õ«O>yÝAµâIÚËϽ´‡žqÚge…l ã*D[œͽèÜ‹ßÒÜÜE­¯—´îTi6KÇæŸœ®¨ÒhäV)úõtNO´q–‰÷gì¤^Û÷Û'T7£1éýË“Ó/ªÑ(knn"p¾_}òÕUÒ¬šª4šUÓ÷ð9Êae”s‡q^'].I¯Á$ûçP;NïE _Œ Ä´Ým~ò“ªÕjšš:Ò½ÛG:15¦{·t i§¿¾¦f³!{8Å~üöÞRm€Œ Ä´jµšŠÅ¢jöe…5ç{÷ŸßÉ0ü¨x³ŒD ¶Ï ¾¨jÕ}“Ü7(e[ùN#sÙ „!ÀB €…@ ,"XD°ˆ`!ÀB €…@ ,"XD°ˆ`ɬcöÆåUííò"Ì•I ¦ýF<™"•!€aÀ9D°ˆ`!ÀB €…@ ,"XD°ˆ`!ÀB €…@ ,"XD°ˆ`!À’Ù·îQ<ó_HÕÆåUÏéÓ33}Þ3MNÏøþú!ÑwwöøR² “ÓáÇ»KúçC "| ½ñçåzñœIDAT’/Î!€…@ @níªU0RœƒÎËWövw_ w@ŽlÅt"F†rvÐ]]]í ½é™ííîvÍ7J£¾Ï¼paäÐ@ÄHð 9û¹WeHßfÏTM†Í?¨ÁK bdø…œ=Ý®G- £p‡ýÚkºW¸º§ j5J „¡·,?mÅ Xž½páØyExWwI bEèÆe7 Ó33ººÚýôIÕ Ñ>Ôí—A­©12Üaçw¾Ðk°ex…âÆåÕØaéžßkƒZ-ˆ)ÎËn$u8{Í7jÕ¢_PyMwOs¾Ž2ÐöòB bäø…œ{ú¨…!8‡"XD°p¹àüˆ¾‹ò!Æ(½A †á?”Þ!ÑWƒvÝ™‰ø3ìUÀB €…@ ,"XD°ˆ`!ÀB €…@ –OÑFÚ ’Zö‹Ë«ôY0² -©UhYÏTÈ{ 7ÿU³ÜVÖÐIEND®B`‚PythonCard-0.8.2/docs/html/dialogs/index.html0000644000076500007650000000120307526645444021041 0ustar alexalex00000000000000 PythonCard Built-in Dialog Documentation <body bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000"> <p>You need a browser that supports frame to veiw this page.</p> </body> PythonCard-0.8.2/docs/html/dialogs/messagedialog.html0000644000076500007650000001613310110453767022532 0ustar alexalex00000000000000 Message Dialog

Message Dialog

Message Dialog Sample

Creating the Dialog

Create a Message Dialog by calling dialog.messageDialog with the three required and two optional arguments shown in the following table.

Argument
Data type/notes
self
the window (background) that is the parent for the dialog
message
quoted string displayed as the message in the dialog
title
quoted string displayed in title bar of dialog
OPTIONAL icon
You may optionally include one of the defined wxPython constants defining an icon to be displayed in the message dialog. By default, PythonCard displays the "info" icon shown in the figure above. See below for details.
OPTIONAL buttons
You may optionally include one of the defined exPython constants defining one or more button names to be displayed in the Message dialog. By default, PythonCard displays the "OK" and "Cancel" buttons shown in the figure above. See below for details.

Note that as of PythonCard 0.8 the fourth and fifth args have been combined, so you should use | (binary or) to join them (e.g. wx.ICON_EXCLAMATION | wx.OK).

Example:

Above dialog was created with this line of code:

result = dialog.messageDialog(self, 'a message', 'a title')

To add an icon other than the default "info" icon to the Message Dialog, provide the fourth argument, which can be any of the values shown in the following table:

Constant
Description of Icon
wx.ICON_EXCLAMATION
Exclamation point
wx.ICON_HAND
Hand, or error, icon
wx.ICON_ERROR
Same as ICON_HAND
wx.ICON_QUESTION
Question mark
wx.ICON_INFORMATION
Small "i" icon, the default icon

Note that there are user interface guidelines for the appropriate use of these icons. It is generally a good idea to use them in the standard ways users expect to encounter them.

You can also cause the Message Dialog to display buttons labeled other than "OK" and "Cancel" by providing one of the constants in the following table as the optional fifth argument to the dialog.messageDialog method:

Constant
Button Labels
wx.OK
OK Button
wx.CANCEL
Cancel Button
wx.YES_NO
Two buttons, one labeled "Yes" and the other labeled "No"
wx.YES_DEFAULT
If you supply BUTTON_YES_NO as the button constant, you can optionally include this constant to cause the "Yes" button to be the default button. Since "Yes" is always the default button unless you change it, this constant is probably not of much use.
wx.NO_DEFAULT
If you supply wx.YES_NO as the button constant, you can optionally include this constant to cause the "No" button to be the default button.

Interacting With the Dialog

The messageDialog component returns two values, stored as elements of the Python dictionary called "results" returned by all PythonCard dialogs. These results are as shown in the following table.

Name of value
Description
accepted
True = user clicked OK
False = user clicked Cancel
returnedString
string containing 'Ok' or 'Cancel' reflecting which button the user clicked to dismiss the Message dialog

Example:

The sample dialog shown at the top of this page returns the following results:

accepted: True
returnedString: Ok


 





PythonCard-0.8.2/docs/html/dialogs/multiplechoicedialog.html0000644000076500007650000000632410110453767024115 0ustar alexalex00000000000000 Multiple Choice Dialog

Multiple Choice Dialog

Multiple Choice Dialog Sample

Creating the Dialog

Create a Multiple Choice Dialog by calling dialog.multipleChoiceDialog with the four arguments shown in the following table.

Argument
Data type/notes
self
the window (background) that is the parent for the dialog
message
string to be displayed inside the dialog as a prompt for the user
title
string to be displayed in the title bar of the dialog
lst
list of strings containing the choices to be presented to the user

Example:

Above dialog was created with this line of code:

result = dialog.multipleChoiceDialog(self, "message", "title", ['one', 'two', 'three'])

Interacting With the Dialog

The multipleChoiceDialog component returns two values, stored as elements of the Python dictionary called "results" returned by all PythonCard dialogs. These results are as shown in the following table.

Name of value
Description
accepted
True = user clicked OK
False = user clicked Cancel
selection
list of strings containing the  options chosen by the user.

Example:

The sample dialog shown at the top of this page returns the following results:

accepted: True
selection: ('one', 'three')




PythonCard-0.8.2/docs/html/dialogs/navigator.html0000644000076500007650000000222107523020030021674 0ustar alexalex00000000000000 dialog navigator

PythonCard Dialogs

Common Dialogs and Their Use

General Notes

Alert
Color
Directory
File
Find
Font
Message
Multiple Choice
Scrolled Message
Single Choice
Text Entry
PythonCard-0.8.2/docs/html/dialogs/scrolledmessagedialog.html0000644000076500007650000001120110110453767024251 0ustar alexalex00000000000000 Scrolled Message Dialog

Scrolled Message Dialog

Scrolled Message Dialog Sample

Creating the Dialog

Create a Scrolled Message Dialog by calling dialog.scrolledMessageDialog with the three arguments shown in the following table.

Argument
Data type/notes
self
the window (background) that is the parent for the dialog
message
quoted string containing the text to be displayed in the scrolling dialog by default
title
quoted string containing the text to appear in the dialog's title bar

Most often, this dialog is used not with an explicit string passed as the second argument but rather with the contents of a file. The source code for this sample shows you how you can evaluate the third argument to the constructor method and, if it contains a valid file name, open that file and read its contents into the message variable for display.

Example:

Above dialog was created with this line of code:

result = dialog.scrolledMessageDialog(self, message, filename)

In the sample code that launches and handles the above dialog, you will find the following lines of code which determine what will be displayed. Here, the name of the file "dialogs.py" is hard coded into the program for simplicity's sake but it is easy to see how you would handle the parsing of the file name in the first line of this fragment if it were supplied as a string in the third argument of the constructor, for example.

            base, ext = os.path.splitext(os.path.split(sys.argv[0])[-1])
            filename = base + ".py"
            if os.path.exists(filename):
                f = open(filename, "r")
                msg = f.read()
            else:
                msg = "Can't find the file dialogs.py"

Interacting With the Dialog

You will not likely have much interaction with the scrolledMessageDialog component because it merely displays information to the user, supplies only an OK button, and returns no value in the result variable. It returns "accepted" but since there is no real difference between the user clicking the OK button (in which case accepted has a value of True) or the window's close button (in which case accepted has a value of False), it is of little value.

Example:

The sample dialog shown at the top of this page returns the following results if the user clicks the "OK" button to dismiss it.

result:
accepted: True

 







PythonCard-0.8.2/docs/html/dialogs/singlechoicedialog.html0000644000076500007650000000654310110453767023546 0ustar alexalex00000000000000 Single Choice Dialog

Single Choice Dialog

Single Choice Dialog Sample

Creating the Dialog

Create a Multiple Choice Dialog by calling dialog.multipleChoiceDialog with the arguments shown in the following table.

Argument
Data type/notes
self
the window (background) that is the parent for the dialog
message
quoted string displayed inside dialog box as prompt for user input
title
quoted string displayed in title bar of dialog
lst
list of values representing contents of dialog choice list

Example:

Above dialog was created with this line of code:

result = dialog.singleChoiceDialog(self, "message", "title", ['one', 'two', 'three'])

Interacting With the Dialog

The singleChoiceDialog component returns two values, stored as elements of the Python dictionary called "results" returned by all PythonCard dialogs. These results are as shown in the following table.

Name of value
Description
accepted
True = user clicked OK
False = user clicked Cancel
selection
string containing the list element selected by the user

Example:

The sample dialog shown at the top of this page returns the following results:

accepted: True
selection: three


 




PythonCard-0.8.2/docs/html/dialogs/textentrydialog.html0000644000076500007650000001345210110453767023155 0ustar alexalex00000000000000 Text Entry Dialog

Text Entry Dialog

Text Entry Dialog Sample

Creating the Dialog

Create a Text Entry Dialog by calling dialog.textEntryDialog with the four required and one optional arguments shown in the following table.

Argument
Data type/notes
self
the window (background) that is the parent for the dialog
message
quoted string to be displayed inside the Text Entry Dialog to prompt the user's reply
title
quoted string to be displayed in the title bar of the Text Entry Dialog
defaultText
quoted string to be displayed in the text field in the Text Entry Dialog containing the response to be used if the user doesn't change it. May be an empty string.
OPTIONAL field type
The optional fifth argument to the constructor for this dialog can contain one of two constants that affect the display of the text field. If this argument is wx.TE_PASSWORD, asterisks or bullets replace the default text (if any) as well as the user's typing in the field. If this argument is wx.TE_MULTILINE, the field expands to accommodate multiple lines of entry data.

Example:

Above dialog was created with this line of code:

        result = dialog.textEntryDialog(self,
                                    'What is your favorite language?',
                                    'A window title',
                                    'Python')

Interacting With the Dialog

The textEntryDialog component returns three values, stored as elements of the Python dictionary called "results" returned by all PythonCard dialogs. These results are as shown in the following table.

Name of value
Description
accepted
True = user clicked OK
False = user clicked Cancel
returnedString
String containing the label of the button the user clicked
text
String containing the text in the text entry field of the dialog at the time the user clicked the button or closed the dialog

Example:

The sample dialog shown at the top of this page returns the following results if the user doesn't change anything and clicks the "OK" button:

accepted: True
returnedString: Ok
text: Python
 









PythonCard-0.8.2/docs/html/documentation.html0000644000076500007650000001147210354135104021146 0ustar alexalex00000000000000 PythonCard Documentation

Installation

The installation guide contains instructions for installing the latest versions of Python, wxPython, and PythonCard on Mac OS X (Jaguar and Panther), Linux, and Windows.

Learning Python

We've put together a set of links to some of the best resources for learning Python. The material is suitable for both beginner and expert programmers, and includes reference material, code, and other links to the most popular Python community resources.

Getting Started

Framework Overview

Migration Guide

If you are upgrading from PythonCardPrototype 0.7.3.1 or earlier to 0.8, then you should check out the Migration Guide and modify your code and resoources accordingly.

Other Articles

Building GUI Applications With PythonCard And PyCrust by Patrick O'Brien

Miscellaneous

codeEditor screenshots and readme.txt

There is additional information available on the PythonCard wiki about using CVS to get the latest version of PythonCard between releases, how to post bug reports, the Big To Do list, etc.

Create widgets and add event handlers at runtime. You can use this feature to create GUIs interactively using the PythonCard shell. You can also define the widgets in your layout dynamically in your program as shown by the dbBrowser sample.

Revision History (Changelog)

The changelog.txt file documents the revision history of PythonCard.

$Revision: 1.24 $ : $Author: kasplat $ : Last updated $Date: 2005/12/27 03:51:32 $

PythonCard-0.8.2/docs/html/donations.html0000644000076500007650000001141610101222303020255 0ustar alexalex00000000000000 Donations for the PythonCard project

PythonCard is free software. There is absolutely no obligation to pay any money to use or redistribute the software. However, the developers of the software consider the Python Software Foundation (PSF) a charity worthy of your support. A donation to the PSF would not only demonstrate your appreciation of this tool, but also help to advance the development of other Python-based open source tools in the future.

About the PSF

The PSF is a non-profit organization devoted to advancing the Python programming language. The PSF is a public charity under US tax law, and all donations made by US residents are tax deductible (see the PSF donations page for details).

For more information on the PSF, please see the PSF web site.

Why donate to the PSF?

PythonCard is written in the Python programming language. The developers of PythonCard believe that if it were not for Python, PythonCard would simply not exist - the productivity gains and ease of use made it possible for a bunch of hackers to experiment freely and somehow end up with this very nice tool.

In addition, the developers are all strong advocates of Open Source Software. It gives us powerful, free tools we can use to develop software, but more importantly, the tools come with the ultimate technical reference - the source code. Therefore, we are able to fully understand and sometimes even fix the tools we rely on.

Yeah yeah, but why donate to the PSF?

Many different people have donated their time to this project, which makes it unreasonable for any individual to collect money. As the PSF is a registered non-profit and devoted to promoting Open Source Software, it seems the logical choice.

What will the PSF do with my money? Will it be spent on PythonCard?

Your PythonCard donation goes into the general PSF fund; it is not earmarked specifically for the PythonCard project. In the future, the PSF may make additional funds available for PythonCard, for some other worthy Open Source project, or for some other purpose within its charter.

Open Source has a great history of producing fine code, but less so when it comes to performing the kinds of research required for these kinds of projects (research on statistical algorithms is time-consuming and tedious, and there's no a priori guarantee of success). One thing the PSF hopes to do in coming years is fund the core research needed to springboard these kinds of projects.

You may like to read the PSF Mission Statement for more details.

OK, OK, where do I pay?

Please make sure you have read this document, so you know exactly why you are giving money ('cos the software is so cool) and to whom (the PSF).

To donate now using PayPal, simply click here

$Revision: 1.2 $ : $Author: kasplat $ : Last updated $Date: 2004/07/26 15:35:31 $

PythonCard-0.8.2/docs/html/faq.html0000644000076500007650000001041410127117055017042 0ustar alexalex00000000000000 PythonCard FAQ

PythonCard FAQ (Frequently Asked Questions)

Q. What is PythonCard?
A. PythonCard is designed to be an application development framework for use by everybody. Its purpose and goal is ease of use and increasing productivity. From the first time developer to the veteran coder who knows a dozen languages, PythonCard is designed to allow you to quickly and easily design and build fully functioning applications with a graphical user interface.

Q. What is the similarity between PythonCard and HyperCard?
A. The PythonCard project is using HyperCard for inspiration. The first goal is to produce a framework. We already have runtime tools (Message Watcher, Property Editor, Shell) and a layout editor (resourceEditor sample), but we don't have an environment yet. You can use the resourceEditor sample to build layouts for your applications.

Q. Have any programs been written with PythonCard?
A. Yes. For a list of the samples that have been built with PythonCard and some screenshots of them in action go to the samples page. A description of each sample is included in the readme.txt file in each sample directory.

Q. Do I need to know Python to use PythonCard?
A. Yes. We've added a Learning Python page to get you started.

Q. What do I need to use PythonCard?
A. Python 2.3 or higher and wxPython 2.5.2.8 or higher.

Q. What Operating Systems are supported?
A. PythonCard runs on every platform that both Python and wxPython are available for. This includes Windows 95/98/ME/NT/2000/XP, Mac OS X, Linux GTK, and Solaris

Q. Does PythonCard run on Macintosh OS X?
A. Yes

Q. Can I build standalone executables?
A. Yes, using py2exe or Gordon McMillan's installer. On Mac OS X, you can use BundleBuilder to make standalones. The minimalStandalone sample includes example scripts for all of them.

Q. How can I make the Return key act like the Tab key in a field, so that pressing Return navigates to the next component?
A. The wxPython 2.5.2.x MigrationGuide.html document has an example using wx.NavigationKeyEvent, which is new in wxPython 2.5.2. Adapting that to cause the Return key to behave the same as the Tab key using PythonCard event attribute names gives us this example:

    def on_keyDown(self, event):
        # wx.WXK_RETURN is 13
        if event.keyCode == wx.WXK_RETURN:
            if event.shiftDown:
                flags = wx.NavigationKeyEvent.IsBackward
            else:
                flags = wx.NavigationKeyEvent.IsForward
            if event.controlDown:
                flags |= wx.NavigationKeyEvent.WinChange
            event.target.Navigate(flags)
        else:
            event.skip()
    

Q. Where is the home page?
A. http://pythoncard.sourceforge.net/

Q. Where can I download PythonCard?
A. http://sourceforge.net/project/showfiles.php?group_id=19015

Q. Where is the mailing list?
A. http://lists.sourceforge.net/lists/listinfo/pythoncard-users

Q. Where is the CVS?
A. http://sourceforge.net/cvs/?group_id=19015

$Revision: 1.13 $ : $Author $ : Last updated $Date: 2004/10/01 00:00:45 $

PythonCard-0.8.2/docs/html/findfiles.html0000644000076500007650000002332410101222303020223 0ustar alexalex00000000000000 Using the Power of findfiles in PythonCard

by Dan Shafer

One of the most powerful tools in the PythonCard scripter's arsenal is also one of the easiest to overlook. Its innocuous name gives the impression that findfiles is a utility similar to what one would expect in a file finding utility at the operating system level. And while it does bear some strong resemblance to such programs, findfiles in PythonCard is much more than a simple file locator utility.

Very often when you are programming in any programming or scripting language, you want to find out how a particular function works or whether a particular property is settable, or any of a number of other questions. In many cases, you can find the answers to your questions by looking at the source code of the application or tool you're using. This is sometimes referred to as "code shopping," particularly when what you really hope to find is a method that does exactly what you want to do.

The PythonCard findfiles tool is designed to support you in these efforts.

Type in a string for which to search, tell findfiles the directories (yes, you can have more than one) in which to search for files containing that string, and send findfiles off to locate Python files with that specific content. Scroll through the list of files, each with a line reproducing part of the located line for each occurrence in the file, find the one you think is what you are looking for, and double-click the line. Voila! Either codeEditor or textEditor -- two other useful PythonCard utilities -- opens and scrolls instantly to the line you've selected.

This document describes how to use findfiles and provides some getting-started tips as well as some ideas you'll find useful as you come to rely more and more on this handy little application, as we have.

Getting Started with findfiles

To start using findfiles, first launch the application (it's in the PythonCard/tools/findfiles directory). You'll be greeted with a window that looks something like Figure 1, though its size will probably be different.

starting findfiles window
Figure 1. Opening Default Window in findfiles

In the File types field, type *.py;*.pyw. The semicolon is important; it separates multiple file types (and search directories) in the application.

Now click on the "Add Dirs" button and navigate to your PythonCard directory. Figure 2 shows approximately what your findfiles window should look like after you've done these steps.

findfiles window set up properly
Figure 2. Initial Setup for findfiles Window

(Since we've left the "Search subdirectories" checkbox checked, this search will look in all of the directories inside the PythonCard directory, including, of course, the samples directory. If you wanted a search that would focus only on the samples directory, you could create another search pointing only at that directory.)

Now go to the File menu and select "Save As..." and save the search configuration you've just created as PythonCard.grep". You'll want to be sure this file is in the same directory as the findfiles.py file you launched.

OK, now you can type in any search term you'd like findfiles to locate in any of the files stored in the PythonCard directory or any of its sub-directories. Let's start with a simple example. Let's say you want to see how a "choice" component is used in PythonCard samples. Type the word "choice" into the "Search for" field and click on "Search." After a very brief pause (findfiles is quite fast), you should be looking at a window something like Figure 3.

findfiles after looking for "choice"
Figure 3. findfiles Window After Searching for "choice"

Notice that the result is an indented list. At the left margin is the complete path to the file in which the "hit" is located. Indented under that file name is a set of one or more rows showing the line number in that file where the targeted string was found, and displaying the line in question.

Select any of these lines. We chose line 82 in the first file above, "SourceForgeTracker.py" but you can choose any line in any file you like. When you either click on the "Open Selected File" button or double-click on the line, the PythonCard codeEditor launches if it isn't running, opens the target file, and scrolls to the line number in question, as you can see in Figure 4.

codeEditor opened to found line
Figure 4. PythonCard codeEditor Open to Selected Line

If you point findfiles at text files rather than Python or PythonCard code files, then double-clicking the line in the results list or selecting a line and clicking on the "Open Selected File" button will launch the PythonCard textEditor rather than codeEditor. Otherwise, the behavior is identical.

Essentially, this is all there is to using findfiles. You point it at one or more directories, tell it what types of files to search for, give it a string to look for in those files, and let it go off and find those files for you. When you identify a file and line that are promising prospects for telling you what you want to know, double-click on the line in findfiles or select the line and click on "Open Selected File" and codeEditor opens on that file, scrolling to the found line.

We have three remaining topics of potential interest to discuss: special character in search strings, saving and using GREP files and using more sophisticated search strings.

Special Character Usage in findfiles

As you've no doubt surmised by now, findfiles uses classic Unix grep (regular expression) searches. If you know grep, that's probably all we need to say here. If, however, you have no clue why you should care about grep, read on.

The grep utility uses a technique called regular expression matching to locate information. In regular expressions, some characters have a special meaning. If you want to search for any of these special characters in the strings you supply in findfiles, you'll have to escape them by preceding them with a backward slash (\) character.

While there are many such characters in regular expressions, the ones with which you will need to be most careful are: question mark (?), asterisk (*), addition/concatenation operator (+), pipe or vertical bar (|), caret (^) and dollar sign ($). To search for a dollar sign in the target directories, for example, put "\$" into the search field. (Putting in a $ by itself will crash findfiles fairly reliably.)

Saving and Using grep Files

As you saw earlier when we walked through how to set up findfiles the first time you use it, you can define search parameters and then save them in a file which you can later load to re-run the same search. These files end with the suffix ".grep" and are saved in the same directory as the findfiles.py file.

We have set up several commonly used search patterns that include various combinations of directories to search and terms for which to search. For example, we quite often want to find stuff in the wxPython files since PythonCard relies heavily on wxPython for its GUI components. So we have defined one file that has nothing in the search field but has a pointer to the wxPython directory in the directories list. Another common use for this capability is to create a directory entry that points to your own source code files for your project(s).

A slightly more complex example is shown in Figure 5. There, I've defined a search that looks only in the directory where I keep my personal projects, and the search term "def." This enables me to obtain quickly a list of all the functions I've defined in my projects.

example grep
Figure 5. Sample findfiles Search Through Personal Projects for Methods

I save this file as "myproject_methods.grep" and load it whenever I need to repeat the search. Using pre-stored search patterns like this, combined with the fast execution of the find process itself, makes using findfiles a very powerful addition to your PythonCard development tool arsenal.

$Revision: 1.5 $ : $Author: kasplat $ : Last updated $Date: 2004/07/26 15:35:31 $

PythonCard-0.8.2/docs/html/framework/0000755000076500007650000000000010434046770017410 5ustar alexalex00000000000000PythonCard-0.8.2/docs/html/framework/components.html0000644000076500007650000001276010415172312022460 0ustar alexalex00000000000000 Framework Overview - Components

Updated: March 31, 2006 for release 0.8.2

I'll try and outline the current state of the framework in order to foster discussion. I'm going to break up the description into several sections. I'm not going to describe every method and attribute since I would just end up repeating what is in the source code. These descriptions can also serve as documentation.

The following component types are currently supported. The are defined in the PythonCard components directory. The wxPython control they are based on is in parenthesis ():

  BitmapCanvas
    Provides a buffered bitmap. There is no direct equivelant in wxPython.
  Button          (wx.Button)
  Calendar        (wx.Calendar)
  CheckBox        (wx.CheckBox)
  Choice          (wx.Choice)
  CodeEditor      (wx.stc.StyledTextCtrl)
  ComboBox        (wx.ComboBox)
  Gauge           (wx.Gauge)
  Grid            (wx.Grid)
  HtmlWindow      (wx.HtmlWindow)
  IEHtmlWindow    (wx.lib.iewin.IEHtmlWindow - Windows-only)
  Image           (wx.StaticBitmap)
  ImageButton     (wx.BitmapButton)
  List            (wx.ListBox)
  MultiColumnList (wx.ListCtrl)
  Notebook (wx.Notebook)
  PasswordField   (wx.TextCtrl)
  RadioGroup      (wx.RadioBox)
  Slider          (wx.Slider)
  Spinner         (wx.Spinner)
  StaticBox       (wx.StaticBox)
  StaticLine      (wx.StaticLine)
  StaticText      (wx.StaticText)
  TextArea        (wx.TextCtrl)
  TextField       (wx.TextCtrl)
  ToggleButton    (wx.ToggleButton)
  Tree            (wx.TreeCtrl)

The following events are automatically bound and available for each component:

  gainFocus
  loseFocus
  mouseContextDoubleClick
  mouseContextDown
  mouseContextUp
  mouseDoubleClick
  mouseDown
  mouseDrag
  mouseEnter
  mouseLeave
  mouseMiddleDoubleClick
  mouseMiddleDown
  mouseMiddleUp
  mouseMove
  mouseUp
  timer

There are additional events such as mouseClick, closeField, keyPress, etc. that are specific to particular components, which you'll find defined in the individual component modules. The following attributes are available for each component.

    backgroundColor
        color: tuple (r, g, b), "named color", or hex color string "#FF00FF"
        color is always returned as an rgb tuple
    command
        string
    enabled
        boolean
    font
        Font
    foregroundColor
        color: tuple (r, g, b), "named color", or hex color string "#FF00FF"
        color is always returned as an rgb tuple
    name    (mandatory, read-only)
        string
    position
        tuple (x, y)
           specifying -1 for either x or y will use the default x or y position
    size
        tuple (width, height)
           specifying -1 for either width or height will use the default
           width or height
    toolTip
        string
    visible
        boolean

Additional attributes such as label are defined for some components. The attributes can be defined in the resource file as well as in user code. PythonCard uses dot notation for components, rather than get/set methods. Here is an example:

  self.components.field1.text = 'bob'
  txt = self.components.field1.text

Helper classes for components:

  Bitmap         (wx.Bitmap) - defined in graphic.py
    supported formats:
    BMP, GIF, JPEG, PCX, PICT, PNG, PNM, TIFF, XBM, and XPM
    also supports translation to/from Python Imaging Library (PIL) format, 
    and NumPy arrays to bitmap.
  Font           (wx.Font)   - defined in font.py

In some case, the helper classes and components provide extra functionality over their wxPython counterparts. Automatic binding of events and simplifed initialization are the most obvious.


| General Concepts and Limitations | Components | Dialogs | Events and Handlers | Menus | Resource Files | Runtime Tools

$Revision: 1.4 $ : $Author: alextweedly $ : Last updated $Date: 2006/04/06 11:00:26 $

PythonCard-0.8.2/docs/html/framework/dialogs.html0000644000076500007650000000562210415172312021714 0ustar alexalex00000000000000 Framework Overview- Dialogs

Updated: March 31, 2006 for release 0.8.2

Dialogs are defined in dialog.py. They are all modal and map directly to a wxPython class, which map to an underlying OS dialog where available. The one exception is the findDialog which I coded from scratch. In PythonCard, dialog use has been simplified by wrapping the underlying classes with a function, so that a modal dialog call only requires a single line of code. The result of a dialog call is always a dictionary.

alertDialog           (variation of wx.MessageDialog)
colorDialog           (wx.ColourDialog)
directoryDialog       (wx.DirDialog)
fileDialog            (wx.FileDialog)
    openFileDialog
    saveFileDialog
findDialog
fontDialog            (wx.FontDialog)
messageDialog         (wx.MessageDialog)
multipleChoiceDialog  (wx.lib.dialogs.MultipleChoiceDialog)
scrolledMessageDialog (wx.lib.dialogs.ScrolledMessageDialog)
singleChoiceDialog    (wx.SingleChoiceDialog)
textEntryDialog       (wx.TextEntryDialog)
    multilineTextEntryDialog
    passwordTextEntryDialog

Creating and Interacting with Common Dialogs in PythonCard describes the use of each of the dialogs above.

Some options are specified via constants, see dialog.py for a full list as well as the dialogs sample which shows the various dialogs in use.

The CustomDialog class allows you to define custom modal dialogs using the same components and layout mechanisms and event handlers as used for backgrounds. See the dbBrowser, dialogs, resourceEditor, textEditor, and textRouter samples for examples of custom modal dialogs. The CustomDialog class is defined in model.py.

There are no modeless dialogs and discussions I've had with Rowland about this topic concluded that there is not much point to the term 'modeless dialog' since in PythonCard there wouldn't be much difference from a regular background.


| General Concepts and Limitations | Components | Dialogs | Events and Handlers | Menus | Resource Files | Runtime Tools

$Revision: 1.4 $ : $Author: alextweedly $ : Last updated $Date: 2006/04/06 11:00:26 $

PythonCard-0.8.2/docs/html/framework/events_and_handlers.html0000644000076500007650000000731410415172312024300 0ustar alexalex00000000000000 Framework Overview - Events and Handlers

Updated: March 31, 2006 for release 0.8.2

I'll cover the main points from a user point of view.

I listed most of the events supported by PythonCard components in an earlier message, but here they are again:

  gainFocus
  loseFocus
  mouseContextDoubleClick
  mouseContextDown
  mouseContextUp
  mouseDoubleClick
  mouseDown
  mouseDrag
  mouseEnter
  mouseLeave
  mouseMiddleDoubleClick
  mouseMiddleDown
  mouseMiddleUp
  mouseMove
  mouseUp
  timer

The most common events you see in the samples are not the ones above, but these:

  command
  mouseClick
  initialize
  select

Every component and menu can have an associated command event. As an example, here's a menu item definition from addresses.rsrc.py that uses 'command' and the associated handler.


    { 'type':"MenuItem",
      'name':"menuEditNewCard",
      'label':"&New Card\tCtrl+N",
      'command':'editNewCard'},


    def on_editNewCard_command(self, event):
        self.newRecord()

All component and menu event handlers take the form

  on_componentName_eventName
or
  on_commandName_command
more examples...
    def on_menuFileExit_select(self, event):

    def on_btnColor_mouseClick(self, event):

    def on_bufOff_mouseDrag(self, event):

The underscores are used by the framework to identify a handler method and they have the added benefit of making the handlers stick out from other methods in the user code. All events go first to the target of the event and if they aren't handled, then the framework searches for a match at the background level. The tictactoe sample shows an example of using a background handler for mouseClick events.

It is common to have an initialize event such as

    def on_initialize(self, event):

which can be used to perform app initialization (in the prototype framework it is more like the HyperCard openStack system message). The other background events are:

  activate
  deactivate
  close
  idle       <- sent when the message queue empties
  minimize
  maximize
  restore
  move
  size

The handler method arguments (self, event) are just names, so like any other Python program you can use what names you want, but for readability it is better to use self and event. The 'target' of the event can be referenced as event.target, which simplifies manipulating the component. In the example below bufOff is a BitmapCanvas and line is one of its methods.

    def on_bufOff_mouseDrag(self, event):
        x, y = event.position
        event.target.line(self.x, self.y, x, y)
        self.x = x
        self.y = y

| General Concepts and Limitations | Components | Dialogs | Events and Handlers | Menus | Resource Files | Runtime Tools

$Revision: 1.4 $ : $Author: alextweedly $ : Last updated $Date: 2006/04/06 11:00:26 $

PythonCard-0.8.2/docs/html/framework/general_concepts_and_limitations.html0000644000076500007650000001600510415172312027040 0ustar alexalex00000000000000 Framework Overview - General Concepts and Limitations

Updated: March 31, 2006 for release 0.8.2

I'll cover the main points of the PythonCard framework from a user point of view.

Environment

PythonCard does not have an Integrated Development Environment (IDE) yet. The stated intent all along was to build a framework and then later build an environment on top of the framework that represents the best aspects of other environments like HyperCard, Visual Basic, Delphi, etc.

PythonCard does have a layout editor (resourceEditor) and source code editor (codeEditor) to help users build applications.

I would also like to support building apps with the framework without using the environment since that will appeal to a large number of Python users that want to use their favorite editors and tools instead of what ships with PythonCard. The complication of working outside an environment is that the user/programmer is responsible for keeping resources, source code, and application data synchronized and there is more room for user/programmer mistakes with names and ids.

I digress...

I will reiterate what Andy Todd stated in an early mailing list post that KISS (Keep It Simple Stupid) should be of primary importance. That goes beyond the current state of the framework topic of this message, but the KISS motto got us to where we are now. Dan Winkler has told me in the past that one of Bill Atkinson's (QuickDraw, MacPaint, HyperCard, etc.) strengths was knowing when to NOT add a feature. If you think keeping things simple is easy, look at the vast majority of complaints normal users have about using Windows or Unix or even the Mac these days. Look at the bloat that has ruined almost every application I can think of.

My own bias is that shorter programs are simpler to write and maintain. I much prefer multiple highly focused apps with short learning curves to one big multi-purpose app.

Ids

All objects in PythonCard have a name that is unique at a given level of the component hierarchy. The name is used as the unique id by the framework internally and almost all references are done via a dictionary lookup, so they are both fast and simple to use. Numerical object ids are not exposed to the user code. The framework does not currently enforce unique names, but we will likely add a runtime exception to warn the programmer when they occur.

Components

The components themselves are kept in a dictionary called 'components' that has some dot notation capabilities. See the Components overview of the sample apps for examples of using the background components dictionary.

Component tab traversal and order

The component tab traversal order is determined by the order the components are defined in the resource file. The first component defined in the list is the first component tabbed to and it will always be in front of the second, third, etc. components even if the components overlap. Look at any resource file and then observe the behavior when you run the app. The resourceEditor is a good way to experiment with how overlapping components look and behave.

Printing

PythonCard supports printing via the wxHtmlEasyPrinting class in wxPython. An unwrapped example of using wxHtmlEasyPrinting is shown in the textEditor sample. If the HtmlWindow component can display the formatted HTML you would like to print, then that is a very easy way to get cross-platform printing in PythonCard.

Windows (Backgrounds)

The app window has only one style and does not support scrolling. Internally, the Background class is the main app window. In wxPython terms it is a wxFrame that contains a wxPanel. The wxPanel provides the automatic tab traversal for components inside the window. The resourceEditor sample shows how you can use multiple windows in your app.

We may add support for scrolling windows and other window styles before release 1.0 of PythonCard.

PythonCard is not HyperCard

PythonCard apps are rough equivalents of single card, single background, HyperCard stacks. There is no transparent persistent storage mechanism in the framework yet. Some of the samples do provide their own storage mechanisms and the intent of the samples is to explore a way to generalize at least a class or set of classes with get/set record and get/set field that can be used by any PythonCard app. By making the access fairly generic we're hoping that a variety of backend solutions could be plugged in rather than requiring one particular solution such as ZODB. See the addresses, companies, flatfileDatabase, and textIndexer samples for examples of some HyperCard-like data apps.

In many ways, PythonCard applications are currently more akin to Visual Basic. Paul Paterson is even working on a project called vb2py that converts Visual Basic projects to Python and one of the targets is PythonCard.

wxPython

In some cases, limitations in PythonCard are caused by limitations in wxWidgets/wxPython. It is also true that PythonCard issues are often really wxWidgets issues and it is necessary to stay abreast of wxWidgets and wxPython if you want to work on the framework itself or use features of wxPython not provided by PythonCard.

The prototype framework attempts to hide wxPython from user code. The only time wxPython is exposed is where a feature is not currently available in the PythonCard framework. If a sample has "from wxPython import wx" then direct access was necessary. This is typically how new features are tested prior to being added to the framework. One interesting aspect of how PythonCard works now is that it in many cases it is easy to intermingle wxPython and PythonCard code, so from that standpoint PythonCard can be seen as a way of simplifying the use of wxPython.


| General Concepts and Limitations | Components | Dialogs | Events and Handlers | Menus | Resource Files | Runtime Tools

$Revision: 1.6 $ : $Author: alextweedly $ : Last updated $Date: 2006/04/06 11:00:26 $

PythonCard-0.8.2/docs/html/framework/menus.html0000644000076500007650000000330210415172312021412 0ustar alexalex00000000000000 Framework Overview - Menus

Updated: March 31, 2006 for release 0.8.2

The Menu classes are defined in menu.py. Menus for an app are defined in the resource file, but they are optional. The worldclock sample shows an app without a menubar.

There is no support for hierarchical menus, graphics or multiple fonts in a menu. You can enable/disable and check/uncheck menu items. In addition, menu items can have an associated command which can then be bound to any number of other menu items or components. See the textIndexer and addresses samples. The simplest way to understand the use of the menus is to look at all the samples resource files and code. When a menu item is selected it generates a 'select' event.


| General Concepts and Limitations | Components | Dialogs | Events and Handlers | Menus | Resource Files | Runtime Tools

$Revision: 1.4 $ : $Author: alextweedly $ : Last updated $Date: 2006/04/06 11:00:26 $

PythonCard-0.8.2/docs/html/framework/resource_files.html0000644000076500007650000001100210415172312023270 0ustar alexalex00000000000000 Framework Overview - Resource Files

Updated: March 31, 2006 for release 0.8.2

Resource files are an old idea, but they are not widely used in the Python community. My own experience with resources is based largely on how Mac applications used the resource fork. PythonCard separates the window, component layout, menu descriptions, and strings from the source code by putting them in a separate .rsrc.py file. This allows the layout to be modified independently of the source code and logic of the application. It also simplifies supporting multiple layouts for different OS platforms or doing international versions of an application. Finally, it means that a non-programmer can handle the layout since they do not need to write any Python code.

The resource file typically shares the same base name as the main application, so the minimal sample has two files:

  minimal.py
  minimal.rsrc.py

The resource file has a .py extension because the resource file is actually a valid Python dictionary and so it is easy to edit and validate the resource file using a Python-aware editor. The files are plain text. They are not in XML format since a separate program would be necessary to validate the XML and I feel that XML is less human-readable than the equivelant nested dictionary/list done using Python syntax.

For the most part, it is no longer necessary to edit resource files in a text editor, instead you can use the resourceEditor sample to change the layout and menus for a PythonCard application.

Note that once the resource file attributes are frozen we will likely switch to XML for the resource format to improve interop with other layout tools. [Since we're approaching a 1.0 release of PythonCard, I think this is unlikely, but I'll leave this comment in for the time being. - Kevin Altis]

Binary data necessary for an application such as images and sound files are stored separately. Images necessary for the application components are referenced via 'image' or 'file' attributes in the resource file.

It is possible to have a fairly short edit/run cycle by keeping the layout of your app open in the resourceEditor (layout editor) and the source code open in the codeEditor or your favorite editor/IDE and then launching the app using the Run command under the File menu or from the command-line or a directory browser (Explorer) as you make changes. If you have an error in your source that prevents the app from running, you can use the "Run with interpreter" command and the interpreter will be left open showing you where the error occurred in your source.

The organization of the resource file is defined by the spec classes in component.py, spec.py, widget.py, and each component module. When a resource is read in (see resource.py) it is validated against the specs, default arguments are initialized and any undefined component types in the resource will cause a runtime error. The resource dictionary is converted to an object that supports dot notation automatically and most places in the framework where a resource argument is used, it is valid to pass in a dictionary instead.

The noresource sample shows an example of a PythonCard application that does not have a resource file. The noresource sample also shows an example of dynamic component creation when the application starts up.


| General Concepts and Limitations | Components | Dialogs | Events and Handlers | Menus | Resource Files | Runtime Tools

$Revision: 1.5 $ : $Author: alextweedly $ : Last updated $Date: 2006/04/06 11:00:26 $

PythonCard-0.8.2/docs/html/framework/runtime_tools.html0000644000076500007650000001173310415172312023175 0ustar alexalex00000000000000 Framework Overview - Runtime Tools

Updated: March 31, 2006 for release 0.8.2

PythonCard supports the following runtime tools (command-line switch in parens).

  Debug            (-d) <- Enable a debug menu, but don't show any windows.
  Log              (-l)
  Message Watcher  (-m)
  Namespace Viewer (-n)
  Property Editor  (-p)
  Shell            (-s)

The Log facility is defined in log.py. The other runtime tools or their wrappers are in debug.py. All of the runtime tool windows are children of the parent app window, so they don't show up on the taskbar under Windows. In addition, if one of the windows is created at startup, then all of the tools are initialized and available via the Debug menu, otherwise they are not initialized or available and apps don't incur any startup or memory overhead from the runtime tools.

All of the runtime windows are done in raw wxPython and their events will not interfere or show up in the main app event loop. It would be preferable for the windows to be defined just like other PythonCard backgrounds/windows, to simplify controlling them from a PythonCard app and to help with their longer-term maintenance.

The runtime tool window positions, sizes, and whether they are shown by default is defined in the pythoncard_config.txt file. You can save your settings to pythoncard_config.txt from the Debug menu.

You can redirect stdout (print statements) to the shell and back to the console at any time while an app is running.

The Namespace Viewer and Shell are provided by PyCrust which is a standard part of the wxPython distribution and not part of the PythonCard framework. The Namespace Viewer shows the local application namespace.

The Message Watcher shows all of the events generated and handled by components in PythonCard. Unused events are shown in parens (). Idle events are not shown.

The Property Editor allows editing of component attributes (properties). Only those attributes that are read-only can't be changed and usually that is because the attribute can only be set during initialization. The Property Editor in the resourceEditor is modeled on the runtime Property Editor, but is actually just another PythonCard background and provides more control than the runtime Property Editor, which is why it has a slightly different name, "resourceEditor Property Editor".

The Shell is the most powerful way that you can interact with a PythonCard application at runtime. The shell uses the Python interpreter, so all the things you can do at the Python interactive prompt at the command-line or in an IDE like IDLE can be done in a PythonCard app at runtime.

The shell automatically loads a series of commands when it starts up:

shell.autoCompleteIncludeMagic = True
shell.autoCompleteIncludeSingle = False
shell.autoCompleteIncludeDouble = False
shell.autoCompleteWxMethods = False

import os
import sys
# workaround for absolute pathnames
# in sys.path (see model.py)
if sys.path[0] not in ('', '.'):
    sys.path.insert(0, '')

import wx
from PythonCard import dialog, util
bg = pcapp.getCurrentBackground()
self = bg
comp = bg.components

These commands are in a pycrustrc.py file in the framework directory. You can also have a pycrustrc.py file in a PythonCard application directory (see the turtle sample). There have been numerous messages on the list showing how to add and interact with components at runtime. You can also define methods at runtime.

The Shell supports command-completion and tool tips, so it is very nice for interactive programming, learning and testing PythonCard. Again, the turtle sample is a good example of using the shell. Since the shell is provided via PyCrust, most of these features aren't limited to just PythonCard, but PythonCard probably makes the most and best use of PyCrust right now.


| General Concepts and Limitations | Components | Dialogs | Events and Handlers | Menus | Resource Files | Runtime Tools

$Revision: 1.4 $ : $Author: alextweedly $ : Last updated $Date: 2006/04/06 11:00:26 $

PythonCard-0.8.2/docs/html/icon/0000755000076500007650000000000010434046770016343 5ustar alexalex00000000000000PythonCard-0.8.2/docs/html/icon/blank.gif0000644000076500007650000000364607337064032020131 0ustar alexalex00000000000000GIF87a ‡ 3f™Ìÿ333f3™3Ì3ÿ3f3fff™fÌfÿf™3™f™™™Ì™ÿ™Ì3ÌfÌ™ÌÌÌÿÌÿ3ÿfÿ™ÿÌÿÿÿ333f3™3Ì3ÿ333333f33™33Ì33ÿ33f33f3ff3™f3Ìf3ÿf3™33™3f™3™™3Ì™3ÿ™3Ì33Ì3fÌ3™Ì3ÌÌ3ÿÌ3ÿ33ÿ3fÿ3™ÿ3Ìÿ3ÿÿ3f3fff™fÌfÿf3f33ff3f™3fÌ3fÿ3fff3fffff™ffÌffÿff™f3™ff™f™™fÌ™fÿ™fÌf3ÌffÌf™ÌfÌÌfÿÌfÿf3ÿffÿf™ÿfÌÿfÿÿf™3™f™™™Ì™ÿ™3™33™f3™™3™Ì3™ÿ3™f™3f™ff™™f™Ìf™ÿf™™™3™™f™™™™™Ì™™ÿ™™Ì™3Ì™fÌ™™Ì™ÌÌ™ÿÌ™ÿ™3ÿ™fÿ™™ÿ™Ìÿ™ÿÿ™Ì3ÌfÌ™ÌÌÌÿÌ3Ì33Ìf3Ì™3ÌÌ3Ìÿ3ÌfÌ3fÌffÌ™fÌÌfÌÿfÌ™Ì3™Ìf™Ì™™ÌÌ™Ìÿ™ÌÌÌ3ÌÌfÌÌ™ÌÌÌÌÌÿÌÌÿÌ3ÿÌfÿÌ™ÿÌÌÿÌÿÿÌÿ3ÿfÿ™ÿÌÿÿÿ3ÿ33ÿf3ÿ™3ÿÌ3ÿÿ3ÿfÿ3fÿffÿ™fÿÌfÿÿfÿ™ÿ3™ÿf™ÿ™™ÿÌ™ÿÿ™ÿÌÿ3ÌÿfÌÿ™ÌÿÌÌÿÿÌÿÿÿ3ÿÿfÿÿ™ÿÿÌÿÿÿÿÿâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ, @ÿ³eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eÿË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[6€Ù²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-ÿ[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË– `¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÿÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²e˜-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²e‹Ë–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙfË–-[¶lÙ²eË–- ;PythonCard-0.8.2/docs/html/icon/contents.gif0000644000076500007650000000066607337064032020676 0ustar alexalex00000000000000GIF89a Äÿÿÿÿ™ÌÿÂõ†¹ì|¯âs¦ÙiœÏ_’ÅV‰¼L²Cv©:m 0c–&YŒPƒFy =p3f, ÿ` Ždižhª®lë¾pì2{(µzDG~Hd‘(ÝŒ‚I€H$¡yh"£@D ¤‚Uäp”C)dAŠ˜E;¥)%¾#=:fÓ#%A| $~Aƒ*nB† ho)—\; %ˆ=^8* rwŸŒ¢¬®'uQ^® ;§"X"°`¯€ Ãz|P‹B®  Ñ$[ Š&%«'å>éêë. ™ ŠŠ   ôöøô}B`€† ¦;:lpàdÊ zˆxXòZ*GÞÌ9 Ö?QÌ((ç$'Í*£øìix znÄ74ªJذÛÚ";PythonCard-0.8.2/docs/html/icon/index.gif0000644000076500007650000000044107337064032020137 0ustar alexalex00000000000000GIF89a Äÿÿÿÿ™ÌÿÂõ†¹ì|¯âs¦ÙiœÏ_’ÅV‰¼L²Cv©:m 0c–&YŒPƒFy =p3f, ¦` Ždižhª®lëžò¾QTÌ­Âxïÿ³!±¸OŽïh‚8˜¦BD-%"†*©¡ÔŠ‘†Wdˆ$Æ…MpðrˆeuqÐF´~?&´ii Y  ˆ.gb ‡ Fm-Œf1”" r+š Œ Tb‹g bªF °µRµ  2™±Äµ¬«ƒ O|Ó%!;PythonCard-0.8.2/docs/html/icon/modules.gif0000644000076500007650000000060107337064032020476 0ustar alexalex00000000000000GIF89a Äÿÿÿÿ™ÌÿÂõ†¹ì|¯âs¦ÙiœÏ_’ÅV‰¼L²Cv©:m 0c–&YŒPƒFy =p3f, ÿ` Ždižhª®lë¾p,Ïtmßv‘$ŠX0 èÐHÈ‘ÞaሠÅ#2ˆ%œ‡CàZPˆ¬YКˆg∠"càí@ø’1Cä! è#Wj/ fP†#M2}S}o 1 #–˜"z‡,H‡Hv"‚A/ T#ªU¦{_8$²µ²F _ U OÂf Y›#˜   ::"”g> ?B””ÙÛrÞ®Ë EÞç:ëÙr Ä %:pÑëæÞmúŠpŽ›>Ö .ÈN¡€l³rà€=tP@~T³ÅRE;PythonCard-0.8.2/docs/html/icon/next.gif0000644000076500007650000000037507337064032020014 0ustar alexalex00000000000000GIF89a Äÿÿÿÿ™ÌÿÂõ†¹ì|¯âs¦ÙiœÏ_’ÅV‰¼L²Cv©:m 0c–&YŒPƒ =p3f, ‚` Ždižhª®lë¾p,—GcßÄl.Pß?Iàðõáhð0BÊÁ QDEêáPPs׆H*RÏh#r”n§¢©{î,²ôü6ÈÏ`:bjABf> IBMFpJ>Q}FQ<™3DNk‡ 76 Œ\ª«¬­®¯%!;PythonCard-0.8.2/docs/html/icon/previous.gif0000644000076500007650000000037407337064032020711 0ustar alexalex00000000000000GIF89a Äÿÿÿÿ™ÌÿÂõ†¹ì|¯âs¦ÙiœÏ_’ÅV‰¼L²Cv©:m 0c–&YŒPƒFy =p3f, ` Ždižhª®lë¾p,GcßÅL.QßCHÀðõAáÀaŒ4ÂÒ\DiT#âŠhBWž0›ètú!"œÕp5# ÈÆïÍ„è€ïû # ~}I"EcWtoGPWv=sŠh Š4h`Š‚c…Q ^Že 76—˜©ª«¬­®+!;PythonCard-0.8.2/docs/html/icon/PythonPowered.gif0000644000076500007650000000206510353523075021642 0ustar alexalex00000000000000GIF89an,³ÿÿÿçççÞÞÞÖÖÖ½½½„„„BBB999111)))ÿÞc¥!ù ,n,ÿ°ÉI«½øºÍ»ÿ\&Ždif`ª®ßé¾/+Ï4lÃt®çwß<À päH#rT}&à  ZÁ)öá°Óªøúн۲µš6sÑ@(©\w‚   ïÛu|uyxx{ €ˆv†|~Š’Erž|›A£¡œŸŸ{¤¦@£¥ˆ®Ÿ¡Uœ¥§¹°\— Œ …w¡Ä}@ ˃®ÓzÊÌAÏÙÑÈ„È×ËÍÃÙå>šÔ¢´ Ô½òbñðcò§ííöüø±ôUJ„9 0x`ÙrÛ :“x°7ÏEÌ–q¤‹èÿRœPÁ•{¡ú1º§+ ¨yýNþ ^-“}‰ÁÂ\µBâh‰KO\Þq…‘âÅŽßBeÔ6PŠžôVuºµ’Ú€û^†ÕºeÍ” ¾[Õ*&>ÚV4*$!H'#ÄtªE‡ë2 )£’·ÈàEyWHVša¿C Ù%e™ž*ë,<ápÞ%Ÿñ:Í‘tS´7©!!â^Dº<†ýfv䳌ýÙd;¹—ŽÖž)Éš¸é¿Ýê†Kv<ÉŠ`®eù^'}µl^»^eŸuÏ–(ì±ÀÃÙ¼cÝ‚DÖ…_40Ò¤÷+Y볞’ô÷Ù—O1¾m&5ièÔßÿ€f±ÆXàvÓí×Å ñ«!„G\„†RXQz;x1g¨1F¾± ‰ŠFŠž8Ä‹Uää`ë2]òÍU|äác DÙ1—3Ò숤‘øbБ4ŠV\½ã.Ú…÷Š•™}—ÖMUv×e\®¥ÙN=q£”]Bc6Tä 8@1W A)W§ Q3Fþý`@|ÕŠI“™•Ïnxšè?eåÊ¢‘"ªc–fÖ ”‘¤¦›âÀ‰ÜiD³œPñUZ1‚Íš}A” ä ªAYQ)JN16“˜¾ª$b¯d]†¤fÐâ¨B~dÚT‰fSíikZcêÐÊ5® áÚì[ æNЍ¸#ì—ìRfh“×X‘“cœdz@¼XJfVz$”ZzúÉ'2³p•ÂÜg!œ·ðRâZb‚0ÕqK,@“mJæÅ¥0P±€]­Ò—¬ø†ŽøYÜccP$ËI.òczKF{T’¤ÑÀå²H¢f¸c‹B“wìÏCËøÄÎG¬ãáÓPû5…P4íôb=u®Y'ñ´Ãñç\×a“ÍIcS Œ³7¶}ãÚ7¸-÷ p¯=÷ÜuçMîÝ,èí÷Hnÿ-B;PythonCard-0.8.2/docs/html/icon/up.gif0000644000076500007650000000047407337064032017462 0ustar alexalex00000000000000GIF89a Äÿÿÿÿ™ÌÿÂõ†¹ì|¯âs¦ÙiœÏ_’ÅV‰¼L²Cv©:m 0c–&YŒPƒFy =p3f, Á` Žd9 fªªìð*8Q¤ÄøH@u}ä1¯€ª‘A!I‹åÒñµ¤ÒÅs@ÃJÀ×kÀ†½ñeeKÈ¡@lº½ÛŠÞ3D h?+j5N D‡b50m N D’"J51˜Z$K%j1†%DT% v2e%|5/%°O‰5‚U* D·¼%xÁ)¢Æ%uÉ%D Í"¹»Ò—™×"D–ÒLÚ²®×€yá ë šáÆ!;PythonCard-0.8.2/docs/html/icon/wxPyButton.png0000644000076500007650000001621407377312007021221 0ustar alexalex00000000000000‰PNG  IHDRd+ŽººtIMEÐ 2 s:ë¦ pHYsttk$³Ö+IDATxÚ[€”Õµ>÷oÓg¶°,»ìAQ‚Ê"Jž…¨-äiÄ` ** ÈP ¤™X_l±½h‚• REˆe]Ø:[¦üí¾sîýçŸÙ…¼÷îþŒ½åÔïœse;>kdŒþ* ýÃlœså=¤ I Y-Oö·óÒa‡ÏîeG=VäÄêHôðŠ î¸ïò7^‰|k 4Œd#Ç„G®±Ö¨š¦âŸ <Š«ØYT5¤&²„‘<¨¤ hXL›[Y0T@Ä6\œ r…¾7ñ& T„ÐKÒ±7„I[A5rp8:j%Š'È|†Ÿ"©]yÎQâÑ #óÂÉ $¡AßdšñÚq?9ùoÍñ#­fS[{3GC _Voyxü}¯:tr­ÐšømOŸ]u¿ízâµ7_A³ú'-f}xø“[gÿ/ ]Õu…äK=¤iº¢«j8 FÃjX#gZèvì9  ŒJ=Rè -¦F¥Ç¬P7{1¯Ð…å/9™4<”©ÉÛ¹^+!ÍñˆFTõÕ—Mâ$š´S.éð9<<4Z|FŸâ¡}`©òkƒÿôùöO{‘IÌ"7„JfíÌÇÞ/I@¢OBò¿îÀUS4MÑu0jŠ®HD•x\54Õt€(h L1CÌL×ÀÅCá¾D­ÄÏTÑz‘æxdB®¨>Ú(Ô¬¼f´ôÜ+¦žqpÔÏ7Î¥yÒ³.¹AáJí[¿‰XüüÉ‘µ[+6>úæóKÇÎM[—­*žN¸à®úþ}{ûîzèŵ1žÈa2¸êÊi£GŽÅy¾”ùÍ{ðTÁ»õEÏÛŠõà+¿"c¬ª)­k½ï?N=RóêÐçè³á°ç©o¶'¶wíep ÝÈ^šêꃕÙÊyuóÆ¶œ§i®®Â.mÿêªÇ7%6gU³*]9¥~òë®Ô@A×xýÈ›˜«Þ²íOÔ<¾·toÈ _¼kÒ¥[¯A½p|L#¤¿|$GáÃd$É:Ë *ÙØTžS¦¯9ù‰iÚ/š» Ù­ì»§hÏœ³f)íZø½HJï~}Äó¿n­õDGvÈQø‡#϶ C@£zà›ôEGE#&°v`xý(ˆÀÆÀú¬eÞÿ3æë<7ùÙÖOvõÝ‘ÑÓðK'S?Û<;t0lžŸSyýËÃþ dUä"T Ƥkƒ»áí»þëþ)·Ý1õ'ueÿ$ ø0”–ö=oÏ8|Øtaã×»w±½Ožá³ìÓò1Χ·CèºPßúrUÞe’òÅi_\R;AkÕ w¾»äPc룕OwkÝÚï´Ž3;N_^3fæ@¾¾à«ï<ˆ+£)0pW»õ5ÏûnâƒbìislÃæm yé´ â@K" ªïˆmU4Žš2²ë¾dáF¸f?Þúê›Ï¿¨ø,º3[ÆÁ¶·UþƒxÁ9£ftÐ ÏÛX‹ókŸØê(Ÿéê_Óo¼Ç—d CêE÷Û­6{K‹€ýU™0nÊy{Ç!‡ËáÓ­¶‡š¿)ß©0à#8ÿ¼‹O:q°ütè)ƒk|h@ÿtÑÎûΓk~ýÈâåÃÃÈ©ö4~±Mtþ¤}ù%—>¾êɥ׬ÖTƒú0°¾®®Î›ÃË0îâɳg.:¿˜8!ؽçK©PsçÿôÎן3¦zÆW.]1cÕš¹…è¯(]Ø,ž MjÖ3†õCóÃGßîtꯥ‰¾-#nl*ª(QÓšó–}ÖOÏ5M³X- òPÒôy¿úÊéÕUó\»à¤üÈ”H$zÂwO˜3eèwkXš ­öÕ ›Vê®Ø^gõ+¯¬9­æÖ(?µžJ9vHàìNHÄgŽ8Ó²y$–&ß23j7Õ?¿4 ñP*õò/ðN¶îØâÍ¡Î9û\ÝjòCÓ2ñrá’[æÌéÄcÇŽ]´ˆ@ i‚ëW,û#øq1:4 ÷ Ïã Í'$Y{Çqè{›NzûXbõ¦Y3vÔzøKfzª1‘ ¾Ò\­æôsЩ­;U&”fÛ>Ü…ß@ìÑD/ì?íú¹ß}1õ©÷ð5ê.Gb¥'§ÖW¼CèåüûçSU åÜ12Ít.ŠDÂÁ€[^Yš7Æ «0+¢ˆF‘†,jðý¡ôè¤ìîœÿ‚h$¦1Mún9‡e+g¡^·®ª²²RÓv?öX©®ë7ßÜx×]éEK¦/Y¸.ï8.Y*6$æPxACšª»Pø ´Ö®£žúa¤;W ÓûÇtͰ‘@pýÐ7vUmÓéüð„“G4Œ!“Ùð6Ü8¹äœ!Ÿ¼2êi„SÖT«¬hÈêÓ•VźÂ|îàýcGµÄB2B°(š{ ax¥]Tÿ#“^¤ŸHל6üÔÁ}KîàŽ䲇ÁŽ|qÁE‚}HSÀ"èÛÜj5µdœ”#ï}fÛ/úý³΂»nºÿ»§\°øä‡Gá7º¡TèÌc0ˆô¾•1Š«ÉKl]]]bÙ<›ÍÊöì„‘Èü¨e¨>Ke°•N6’¡sW£¿ªmøó®MŸíœÙ69úrÞSªƒ¥ø\Ìq¥e<ãÈÙ4£²ÁW\:¾¬DIw)ý“'ÞñÉMðgàïr¸—ß>bñÙŸŸ ËACd(‹;®îû^ø+$Š¢'ôExý Tãûé7ÓÚÍæj¯h3o›ǯùr{„Áa!Y ŽÞwaÕ†h+ÿIÔ>èÙ:;;1†Á0Š©:¢ j.%¿˜¢œ©¦ídMGë•–ÂßÑõk›õMÅLž4o•wöN›XÛðñîˆinwû²//ѪCï,sÖ@Æö Ø_uÛ ‘Ïœº±ÿ€ÒQg²oØGc÷Œ½dÄ—ÛI ¸HH –ÿ><á]숰ðøóÎmnãí) G&+WËþ±‰üðkO»üðe+­>ýªaŽHŒOåÿR_õö™ÃÎPhŸ²Ê¿N|ó…—_ÝðéÆt&Óhÿ ³&–—WÙ6¿ü›k` o›ÐZRÜ×Ó·³böÞÅ/ÚëÎ;~ýWÈ%œN(륵kdœd2yëí“~ýè_0ðó҂¸"³ã +ƶomÅ%m۶ͧšL×@á¿`à³ ¥ÁŠC"éÚ:tWCLˆŒÆ.»á½Ó‡ô]zç$ŽanH@mEÅŸïPSݦËm2Ú oŽ]yá½øU}¼ŽÙŒŸÎ' úÑ}ófwv3yˆ2'¤ÅA7hè” ‘†wMjY™Ajõ’ò¢`´èзû²i;•qºÓf&A9/ º2iǦp—;"áRU4Û=ÿ\Zww·a3ft/YbKŒzÿýž}D爖 …ﯪ}!g!©mݺD€Ù#Ô†câoq?I:¯w€GH ‰vH“ÊK-·Ef*Å4vœ™2ZÕ¬˜r@(T*¥â¢n¸$Yòu×®@[0»$£}«M¼õÊ®.Ųè%Ecaƒ™6ÏZ`Y®®«Žƒ£$Ôºc³’~‰@8a›é¦ƒ)‘Åò)o$mÂ$z J‰ø×s\sæ_‡êyûí­9JKÒä²-XàÈdêó¯Eš.^ø[?"Rð ø›çõð ô‡„Ð4B÷dˆI#ƒj1¾Ï»ÒQ|â¤"™X{¶5˜µÒÙˆa ZIÝl£GCC“[Bf‹J™#ª˜$~¶”¤9¥¾ÛÛQ©œŠ%$;Þ}Íe*"VÄ®6}ŽW+!Y¨ŠxâÌue9Ïþß?ýß‘hdÙ2tÚÂEÄâÕ«‹LÓDt:sf›”#”²å=KÄZØÃØËÖÒÒ"Ó„š¬ëIEߺ4D°š[ Q@$ŽÀ0Ý µµ½À}5ûÏKªQ ᲆ†ŠåÏß[®êŠ$ d8"Ç+ƒr¡Uûº×Ø~‰Ÿ‰¡‘j𠇍6Qñ Üt¸½¼º´_UñÁ}ÍbjhŒHÇD‰ƒª^®ÌpJF  ³]‘HÐã’+õòL&ƒÒ‘ì@œ ÑHÄN§çÏÏ]r2u_íZ| QèÝ‹3½tðé§+W­\»uËfðk­PÃ~鳄9/)á1Œd\#DÆÓi.CPÆ…ŸÓˆd¬…Ò48Yq‹ÃaMUPY5„ –W[QýT/¨“Áç²æDpÉ¥üŸ™M¥“Ê –H3a°È„yõR›À)†¸&ÝêíÍýJ6ŸR8À¼yÝÙLVŠO @q[¹ê%ãÎyWu$;zQ Ù{¯[o€·†@«ÄNh$%Ãc}iÙnùáH…Ñ#y”B I‰¤y»Í„7Œ†Vìˆ(…rYˆ{tr‡ÀeLVMd#£F>Z(Dzì¦#hº0Ú¡<'}“•²âxb¹–#ÅË•õŸå$j¨¤¶+ äh¿|JùÖ¥ $Ó/ùÊìY—=r­Œ{Q qÙòe/x!µÀÜÙ¼Z³yØä]œ Žh:ÓÑÉ÷¡™G0‹1A=F°HzqEd"6t&P§<.£K@éó•ÂCÉqÈå¹d…γðØùIzn™ng[{Õ eûö¡Jˆâ‹0híÜ‚¢¼¬ÚãAzíö؆ƒï\?} Z[ WQ½:”šn2[Ðo£uŠÄÜNò‚é\"ÀnJ2`D€ë¤¬ÈÕÇ¡ªZ@xr÷È]`”²QrØWî²RÐz9)a÷í½Áiµµ¤Á\¾÷«Q‘Âah^UÆ'ê8F^v!·ýJ>EJ­}ì›fL\µŒê’sZô9‘|Ö—-\È1”–«¥žyfÐÊÚG†V@ §!ÓXnƒŽç‹^éÀ-ªŠ”¦ %D4ŒÚDæLÃ<ÇU„‘!õ’G‚YPJ ¥à7 ¡ J:߈øæ]Šq~_ë)‘+7nhŠÜLSÞ/FÉÇijl#e;<çY¥‰ ˆ«!’ÛùâÕg 'w¿}â‰PßÊð­3'ŠÐ—LØÖ¬)^òÀ# +,VDÁ‚mßFlË–-ØÝE'EDš‹ðt:`vBg'ÿ» ^ß±ƒå¶»ä 3ó¶…ì>NüzN_¼B\Zù#‘̽’ßîEt'PÏb‰(ç¡#³½âžHË ‚äG<çRÅmÈ߃|"ÂYäs`;w~&ò0žýêE)Ó4ž}¶#ÔV •î¾ëq±ÉD]¼ô†P(Äv|Þá«oixX±ÐxgBWÁ…>€Vª;¶E ¶¬©Ûf—•ñ}ÿº49mĈ¥aQ©*-!' ÓÔqê©o9omú¶p7¢pŠª\§¿Ñ ±;^iª¢«Ì0ÔÓGT³ó*'aª³S–l±“Íæÿag6…+ެ’ )¹ø~"÷axìP•»î¹®½­þL=ø ê“ÛÃÇj—=7{î5 0Eƒ}5·eÖ·ùZ¤ä§õ¾‹‹ÑýG*t9÷µK"cº³”•ÀGF€œ'{Q]ð‹Þå\ÝG‘ #¹?×¹sÛAŒ¯½­qõ#×M^ZDf2 (= .…*¯KéGrR„§ßvIûß³=õTÅ‚ …wæÌéœw÷Õ’R±xn——Ò~ÉÒPa†+¯kdSYe…pnôŽ7È:žeÊfÀzûT±*7ï9ïµyÌ3h$p‰ä»"N„|‚«S+crIw'·zϺ޾>Wl­’Ź\ÝÔE€rïbË×Á^ÍOc6Äeþy>SZˆS<u¼¦¤(ë£ìHýRÄ®;Jr¢` ů‹Šˆf]ÉC>¡ÕõeÉ—\MŽbò¾ecàMO•™¢ y?F¡™È¾å —‡P¼rzN‚Ð1»ùŒ“!·Au,þŸ ‘„&%¹4=f÷q¡ÜróW†Nyq[äÄY UUæða»È6Sj ü’jªƒ6?ˆ¤èq¶"ú;ž{•5Q»UÊFȪ ¥h¥ ‹M°yP~ì å B <‘dÞ¦fðy »!/)Çøcïȶ|yðº«ækhÿ|ÉåðRä·x)¹Àa«-³O ]y¿~U¨¸"¸£ÍhuQú%QAnzUòÛ}r&ƒÒCÛ"CÅY(Á+61‰^&…Î’òH[á¹ëÛ¹çŒ&Œ³¡ø^µEú9šo@YùÒ‚òDJ>GšA«¨¬ˆ¬ìXÔÕ]H¦p$ŒÎñ†©÷P[>kÁ^Ö®]ëë ¤—ÌV•{i«Ç>)í¢t†oê"„‘/ÕS¤Ì2‡ª(¹LDÖ„k÷J䚢Jðà:AQïBŠäþwîa®¼¹( ž¹Œµð?¡E”³_{ãWMG›¸/¾ôð!C¤@ìÛ·oÊewøŒ¡“7[JóÌøDçùÇëIEND®B`‚PythonCard-0.8.2/docs/html/images/0000755000076500007650000000000010434046770016660 5ustar alexalex00000000000000PythonCard-0.8.2/docs/html/images/findfilesfig1.png0000644000076500007650000001137607476712543022122 0ustar alexalex00000000000000‰PNG  IHDR°¤€ãSsBIT|dˆµIDATxœíÝ=w×ÀáË)·ØÁ’%J­½r¤Økmɒ޳6K|çœ*YÒñfÍ¥o"­lÇ.Y²ä·áäPƒÑ¼ÜyàyÎÑ `^€ŒŸ/.G·7×wWéåÕ*­./ì²n®¯×.8Y,fÚèöAÝ…Õ¨€]ñ›¹wú¨-\­n6¾G鍸¡ùºw4_WºMãuÅr‹®m }_J·iÝÞQǾÔl«v3l«u{AçC½ßkËy~µoÏó«y{ž_íÛóüjÞžçWûö¶ô8·ÝïÈ~û¯·F`ˆ¥u€ØŸþËàeOéöføg£ŽOéêÏo&Ùb=)M°o~½ZûýÙ“³©V ÀC> _^fìòS¯'+`ßüzÕ¤Õx-_V]îõ/ßÕ®ã÷þ!ýãŸÿóøsÿûó§”Rúô£?¾wÝ?}[»ÌgO¿Lûñ/ïýüâéW½¶ p(NÏ—·ÙÆ÷ dì³'g[ÓrØÞ=Üöè½_ê=ÿ·Ïnònòtßpíã?þý¿Þmïa“Ÿ=ýrcÛ YÃÕàmº¼,+`_ÿz•ž?„j5b8ma™3B[^Ïéù2ž/×™¯)eìó'gûú!^Ÿ§õ°ýSJéëb£ôn¶‡ò‚âç²O>úâñçbÚÀå)Uß¿ýfí÷ÿüøüñçWo/ß]þ»ó@åˆ-_Ö%ë4ZoJ¡ú¼4êZþùëêB§{ýËwéõ/ߥüò~¨V}òá}¸þýç¿®ýýéG¬÷Z營¾M?üômúÛOé¼í÷?ÞÇë‹¿J/>¾Ÿ[Dkñw´¯þï²f ä(kîüÙAs`RJÏRõÃ]ï&¾Þ=üØvþÜ÷æÀ6(âu¬º9°]ª£°)݇뫷—éÕÛËÇÑ×®û@½òèky:A›ÌØïCµ<ïußçÀ#°/>þjm ÑW€ñÊs^«ó`Ûdì³'Ÿ§7¿ÞŸþêþï»ÒÏ…?¥bhsß¾¹ìû·ß¬M!xõöRÄ!sN«æØ”ê§tíOóÀÞÿ\ŽÙgO>/Ýêëµe6±Ÿ|ôEúûÏäƒ\u^<ý*}ÿã7kSŠ`-O!HéþC\¦‡bªØmš*3…`ày`¯RJëç­›NP÷ÅÜ×:åóÀþþÃ?¬…á'~±6w5÷Ã[ÅÜ×:å³|öô˵íÞ*”¯{œN [€`Æ|ÑÀ6¾¤ GöWÉ>k9lÓ\Ø}Ÿ# Á¯prù©×“°e †ã“ŬËO½ž”,1\ýùÍÜ»Ršv?²ÎB»¢uöìôd[û@§¶ïèðýÝA  @(€P,¡ >VÝ׈­./Òéùrío˜Ò¨óÀÖªh`“L! ”ɶnjÁéùòñŒ1j A9H›¦Tçš À“Ï­c䀩Œ Ø\F\˜ÊÖ?Äe4€16>[œ¶ü; 58`›B´¸¼|½h`*ƒ¶i€P`Ó¬P`.¾‰ €P,¡XBÙÊLÉyåóíãg—,ÒíÍõÜ»°ÓŽOsïÂÆØ7×þaÓ9[.ýw&æßT½}\l‡—W«¹wØûøÀ\loQcíûhÀ69 ¡X€§çËÇ?ÛØÃdì.P˜Êéù2­./ÿèŒÝ•5¶8 M¿ÏaöØ_:cw ú— šòˆlu`¯zyqYõ÷ê²u·¥Û$g!˜ë€–Ga»¶eÄhS6Ðöîsù÷®ËÛ–mú™vY»«4g=uûP§«qêô+[^§>&{ÖY]›ä6Óšd  D×ç-ü1o÷›*0Þ ³LuÛ)—£mÊdÓu9§Ûj[/ÃŒž» 4g=âèÒÖ M×µ}Ngìm¨7hlîu›< }oãI°|•,¡XB™ä,ûluy‘n®¯çÞ ØgK§þ€]fé0 ØþQÀî:>Y̽ ÌÄXB1 „ãô˜‡Í,¡XB1…çdá\9ŽO{9ÝBÀ!9[P»}~|l‹}>ð°KΖK¯»d°^^­æÞØkûø7›%`3ÜÞø?BØ#¯ôå,„"`€ƒwz¾|›ºËOÏ—k†lfSªpužÊéùrësWæØ&@åV©¶‹Ž'kvuyñø§+h‡èû!:0•".79*ºéõšÞâ*€ˆö]Ÿi}×[ŽÚ¢«ª¿SoôYº@ù²®ËÛ–-¯¿ë¶ÕÛW×ÒzÔ5F][4]>TÝötK»IO£ÕvÀëFn«Oš¶eË·©»®i;ÅÏžÀ.+7Œni·±óÀæüßȦæÏz¹vinª©šy6°Ûzà›¶ã ´iê„MôCÎ:˃o¦]ï€ò€në RBà Õtæ€Ü3 4}N'g{Ú¥]VÀŽ9åeº.¯;UWÛör¶c24P§í]Ü>·s}õvZ%ÏÑêòâîæú:½¼Z¥ÕåE:Y,|'ñƒâq¹½ñxÀ¦Ü\_÷î½Ò­ÜwûÆWÉŠ€ ”…`_¬./¼E°Cl‹³å{¶…‘WØ]^§—€Â9>Y̽ ÌHÀáìã©¡Èç,„"`EÀŠ9°-|º‘èΖKÏcöŽ€íðòj5÷.À >àÀ¾°noŒ`‘Wö•9°„"`eð‚Óóå{—­./Òéùrío˜Ò¨9°u:$ZÅ.¹L! ”ɶnjÁéùòñO×råÛ”/kZG×åmû@<£¦”£°i @uz@Ót®)uëhZwùòâgSöÃäs`ëlrô³ëÃdÂ`¿lå‹ 6‘Mëv&€ý´õquÆá9$>«óh‹u°?6>[Ȧù¯Õ`­Þ®nMë._^ @lƒ¶í­ûêõ9áØçC\C.¯ûa+s`sUGM j§¶ï(+‡g§v­./ÒÍõõÜ»ÀÛâlé »FÀ¶0ò °{¶~XCÀŠ€  @(€P,¡XB°„"`EÀŠ€ ”æÞ€m;Y,æÞZŸ,ÒêòbîÝv˜€ÒÍõõÜ»@ ÇÈa ¡XB°„blƒ¾ó°Î–Ks·fâXÀa°-^^­²nçÓ²ós¬˜Úéùrí÷m/b}—«{ñiZGÎ6û¾ènʘc5$"úÞÏò:s‚´Ïñ˜Â˜»9îï”6µÏ}þÇeêuO!â±v—€Í°©‘×”Ú©.ûeŸåºÖ1Ķ_´6y¬Rjž{¸éhŸêxôÙÞœÛÙöýÝ”>÷aÊÛ6]Ÿ³m<îûplyù&®LEMD¹oVßÒîZÇÐåú®£*'8¶5;æXõÙÇ1÷gÈvšŽÇ¦שFs·3äù7µbÛå?uS ª×U—ëimËv­·éú®Ëû,;ƘÇ ŽØ†ÆkÝ qÝ IÓ2M·m{û¿ïr]ë¨^×g$8w»SšêXÕEDõºœÐóXtÓ꺇îc×¾v]^¼åŸ{?s¶3gè }˾éßåÐes×Ûwc–Í]nÌ»@mŽV—w7××éåÕ*­./ÒÉbák6Óý ïOùŸ`÷¸ÍDZ¢¯±Ï£ˆ›S~=hb¶ÁÙrž·.éϱbÛÄÀ¼l#tq8VpX|ˆ €P,¡˜B$SOâ°ÀÁ)ÙñXàà8‹@læÀŠ€  @(€P,¡tž…À¹˜ÛÙrùØ¥Y§ÑzyµÚè@“êé³Ï{{c$€í«Î0€P,¡XB°„"`EÀŠ€  @(€P,¡XB°„"`EÀŠ€  @(€P,¡XB°„"`EÀŠ€  @(€P,¡XB°„"`EÀŠ€  @(€P,¡XB°„"`EÀŠ€  @(€P,¡XB°„"`EÀŠ€  @(€P,¡XB°„"`EÀŠ€  @(€P,¡XB°„"`EÀŠ€  @(€P,¡XB°„"`EÀŠ€  @(€P,¡XB°„"`EÀŠ€  @(€P,¡XB°„"`EÀŠ€  @(€P,¡XB°„"`EÀŠ€  @(€P,¡XB°„"`EÀŠ€  @(€P,¡XB°„"`EÀŠ€  @(€P,¡XB°„"`EÀŠ€  @(€P,¡XB°„"`EÀŠ€  @(€P,¡XB°„"`EÀŠ€  @(€P,¡XB°„"`EÀŠ€  @(€P,¡XB°„"`EÀŠ€  @(€P,¡XB°„"`EÀŠ€  @(€P,¡XB°„"`EÀŠ€  @(€P,¡XB°„"`EÀŠ€  @(€P,¡XB°„"`EÀŠ€  @(€P,¡XB°„"`EÀŠ€  @(€P,¡XB°„"`EÀŠ€  @(€P,¡XB°„"`EÀŠ€  @(€P,¡XB°„"`EÀŠ€  @(€P,¡XB°„"`EÀŠ€  @(€P,¡XB°„"`EÀŠ€  @(€P,¡|s£ÕåEº¹¾Þô¾@§Î€=[.·±¥3`¼°KÌ ”ßa ’£”Ò]ñ‹k°ëŽîRº;º{ø)ͽ?Ðêÿ?;±¦æ£„9IEND®B`‚PythonCard-0.8.2/docs/html/images/findfilesfig2.png0000644000076500007650000001232207476712543022113 0ustar alexalex00000000000000‰PNG  IHDR°¤€ãSsBIT|dˆ‰IDATxœíÝ?—ÛVzà;>.R¦È‡˜rJ–Š;ÒÚ±RN—ñzcO~ï9[¨œtãu6žt,íuv­•íØ%Ë)õm”b„Ÿ‹_òyÎÑ ÷^”ùóå ðäåíöÕÍÕUzv³I›ë«ûìÝÛíöÁ‚³Õj¡¡@·wëVC-ì‹w–ôQ;[¸ÙÜÎ>€“tR~tqbËÁ´l_½^÷ä­'õžü㧯WyS<Ý7¸öñ/ÿôïoú{Ýå'|>[4+Âp5ð6-/Ë °?üz“ž¼ªÕ Àñh –93´åvÎ/×éür}ßfNxM)3À>ytqbx^Ÿ¤‡Áö÷)¥/‹ NÒ›YØÊ%Åã²ÞÿìþqQ60F¹„ ê»_=xþ¯^Þ?þöÅõ›åÿ|™è¯bË˺dÝFëy)¨>)ͺ–YݨãÖc?üòMúá—oÒ_y;¨V}ôÞ]pýËÏzð÷Çïÿ®¶îµÎ÷?}¾ÿéëôçŸþعîw?Þ…×§~‘ž~xW[„Öâï"Ð~û·ëšÈQ¬¹õ³ƒj`ORJSõâ®7…¯¯^?l»î[5° Šð:V] l—ê,lJwÁõÛ×éÛ×÷³¯]û@½òìk¹œ Mæ ì7÷Aµ\÷zè5°Å ìÓ¿xPB`ö`¼rÍkµ¶MV€}üèÓôü×»Û_Ýýýªô¸ðûTLmÚ/—}÷â«%ß¾¸b€ŠšÓêŸ%Æ‘R} A×xzÜöîq9Ì>~ôii­/l3gˆýèýÏÒ_~þÓ$rÕyúÁ黿zPBPÖr AJwq)!ŽÅTa·©T §„`à}`oRJï[WNP÷Eíkò}`óÞoÃÞûìAíjîÅ[EíkòÝ>ùàóýoʯݗÈ­@0c~h`?R#û§d·Ü¶©öÐkd"ò®Sn?u;Ù¶L0ˆáôlµèöS·“ÒÀ @ 7x¾ôRJÓŽ#ë.°/Zg`/ÎÏv5:µýF÷€ßïÊ ,¡°„"ÀŠ @(ƒo£U÷3b›ë«t~¹~ð7LiÔ}`ëªÐ Àœ”Êä¶®´àür}ÿÆUBP¤M¥ÕZXµ±Œ1y l3¯LeT€ÍeÆ€©ìü".³±Œ1û lqOØòsjp€m ¢ÅòòëB+S`›ÊUæ6(À ª,Å/qŠ @(,¡ìä‡ ¦ä¾òùñÚ%éåívé!ìµÓ³ÕÒC˜Ûâvë0‹õÚW`bþMÕ;ôã"Àvxv³YzÀ8įð–"Àfð0֡φ쒻dzúoÿ±ôH,À½óËõýŸ]ôÅ0ÙvO¨Låür6×W÷äŒý•U[œÐ¦çK؇1‡KÎØ_ƒ.ârB€cSž‘­NìU—˪ϫÛÖ­K·IîB°Ô -ÏÂvõeÆhS-hûö¹ü¼kyÛ¶Mi—`÷õ„æ´S7€:]§NßZÙr›òÉ0Ù3°N(pÌê²In&bZ“”8¡@t}¾Âóu¿RñÝ…`ªu§Ü`Œ¶’ɦ×rn·ÕÖ.ÃŒ®Ý‡šÓŽp tiË M¯µ]§3vê ªÍ}mÎÚwo €Ãà§dE€ÍôÝÿüçÒC Mt‚C¶¹¾J·ÛíÒÃà5¶ÅÅÚ­¿`Ÿ™d:Nl ÿ(`ž­– Q @(f`€pÜó¸™ €P”ᜭ\À•ãôluå,’»µ;äã#À¶8äûäb½ö¹K6¶Ã³›ÍÒC€ƒvˆ_q3/6ÃË[ÿGs1óJ_îB@(,pôÎ/׃ש[~~¹~ðgH4ë,!¨àjÊùåzçµ+KôY¨þîr]yÁéÙjѲƒ®þë^¯û=éÜ}˜rsŽoŸ¶^ÞnGí UÎ*Õì¢îwœ¬عO@ß@ºdx­ ~‡†úìÛû=çñÓnκ‡ô>86E™s‚lîöMœ€‡„–y9¾,©OÙ@ßv‹L•қɹêsê¾ A× (/ëZÞ¶m¹ý®u«ëWÛŸCy®øÚº¾š¾/¯W}\]7wyu\ÕõëÆ—»oMË}u·úÕ~ŸqÔµU÷ºŽïËÛmÖ:Õ× }Î)ókû·Ï:c^¯®'¸æ9Ù\_½ºÝnÓ³›MÚ\_¥³ÕÊo¿V—9f?s_ÛƸO\œïv»í?ä•nå|whf«¥ÛR_Ë÷aŒûÄñ€ù °;Rh"„œcÜ'mõÐÀ4Ø›ë+_Qì¶ÅÅzî À¶…™WØ_>§— „sH?hC,Î!ÞŠ|ï,=èC€ €PÔÀ¶pu#Ñ]¬×ÞǶó›ÍÒC€A\àÀ¡`3øP"2ó À¡R @(,¡ .!8¿\¿µls}•Î/×þ€)ª­ ¨CBk”°{z¶J/o·÷ïk›‡L AsMá ŸÉl]iÁùåúþO×våuÊËšÚèZÞ6®¾Ê³¥u¯•ÿ”—·=žªÍœ>Á¨‚r(l*¨–4• t•ÔµÑÔvyyñxŠ…b–´i¶´¼¼kVµÚÖmƒÉk`ëL1ûÙ§írˆP[;%5µÀ¡ÛÉÌ"›Úv'€Ã´ó‹¸ºfc‹à9$|Vëh‹¶–T̆N9#Z×fuÖÕ,,p¨fŸ­†È¦ú×j`­®W×FSÛååÕZØ)Ubù‚©jp¬>o —cÚ8ƒlÛW÷Õ×s‚cŸ‹¸†,Ÿ£”`h l›R\àì¤6WuÖ4ºbötÊ`ÙÔ&À±Ø«Ûw–uŸÔʱ!sŽ6¢Û«»6×Wév+4ì ¶ÅÅzÙ;ð6¶…™W€ý³óûÀÀ,¡°„"ÀŠ @(,¡°„"ÀŠ @(,¡°„òîÒص³Õjé!Ðâôl•6×WKØc,p”n·Û¥‡@ çÈ¡„€PXB`E lƒ¾uXëµÚ­…8Wp\ØÏn6Yë¹ZvyÎS;¿\?x¾‹÷N¹ÏœþÎ/×;{O×õU=F)Ý»Xw—㎋Ûáåm÷L]ÎlÞ†SjúðÚ§ý˜ã\ͽSÃÜö– ûö¾©³Äû½ÚþœýMÙv];û~~øØNÏVY¡)BøëRŒµ<îHãz®¢§¾¦Ø·¾Çèç”'€fì@§gãn„îÃiwÆœ+ç‰:mߨÔÍà—g¼«ëé³nû¦×Û–—Ç×µmß±¶•øwŒ%Àf¨ÎÞ ¯U]9FuíùP­.«~صչå|0ÎeésU^^w ë¶­[·©ßºóQ}Þ'Œ4½¦CåöûŒuŸƒNÝþw—¦óW´—s|ûŒê– ýPÍù Í±Ô‡Ö˜s54D m»ÖmÛ‡ê¶9adH é³Ÿ]e4¹ï¿}×ôrö£ëý6¤ßœ1 imksÊ>ªØæ¯)u_ÉÛçC¬ïvu>MmäôÙ÷Cw.cÎÕÑw?ËmæÒ>çc cÂÐØ~–Øß)Í5æ>ÿã2uÛSˆx.ý%Àf˜kæ5¥ö€TûÊ>Ûuµ1Ä®?´æÛŽ1æ¸Ô1ÛÃÐðZ÷A\÷AÒ´MÓºm_ÿ÷Ý®«êk}f‚sûÒTçª.DT_Ë ZcŽE×9­¶=tŒ]cíZ^|埻Ÿ9ý,t†~eßôïrè¶¹íöms̶¹Ûù ÍÉæúêÕív›žÝlÒæú*­V~f3ÝÝðþl•»ã¶犾ƾÌ"ΧüyÐÄ lƒ‹õ2_]ÒŸsÅ® WË`˜¡‹Ã¹€ãâ".B`E p””žÄ%ÀG§ücÄ#ÀGÇ]bS @(,¡°„"ÀŠ @(w!p¯D–v±^ßçÒ¬Ûh=»ÙÌ: hR½ýaö}`_Þš‰`÷ªj`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ €PXB`E€ ”wsVÚ\_¥Ûívî±@§Î{±^ïb¥3Àšy`Ÿ¨ ”w̰ÉIJéUñÄÅZ컓W)½:yõúQ:Yz<ÐêÿFú !rIEND®B`‚PythonCard-0.8.2/docs/html/images/findfilesfig3.png0000644000076500007650000004014507476727423022123 0ustar alexalex00000000000000‰PNG  IHDR°¤€ãSsBIT|dˆ IDATxœíÝ=wäÌuàqÐÇÁ†쇘!C­´ÒJ–×ÚpÂñËZò#Èç8˜!e¯W ;”ìµ¥•dKa‡ Ÿoà æÁL±XuëÖÅ­BðÿÃC²ÑU¨7· hàæ›çëËÓÃÃòéé²\`dú|½¾záöîn§¢ešz1j€QüÉÞj$g`WO—çæ¸YnÖ?ò˾¾_¼'»lM—MújrY‚÷ˆë»)”%±®dž;¬K\ß$í|Öz¿JÇø’×ÇøÊ¯ñ%¯ñ•_ãK^_§v–ê=³ÿô_¾asg`0·»?ÿÏæ´ïnï–ožíßzw{·<ýýo\ʱæ³,Žìoþøôêÿ~çƒWÖØÀòý0ÍÖôÞù¨ØßüñI Hãà5|-N÷ë?ü"™ÇŸ}÷¯–ûÿóåïÿ÷ßÿ÷²,Ëòçßû›7Ëþå÷ÿ˜LóßÿÛåŸ÷oþþÉ÷Zµn€³xÿñ¾øžÏP°?ü·/Al˜†íË·ï½yóOÚþë_~û–¯O×®5þÇû__×÷í*ÿâûÛl}È[ƒá8àͽR°¿þãÓò£oÕ8ˆÀyH¥f†6ÌçýÇûåýÇû/yj‚×eQ°?ú·/A쯿 ^´¼lÿnY–Ÿ­ n–¯³°ÂKÖ¿C?þÞ_ù{½l`‹ð‚د~ûóWÿÿÏ|üò÷/ûøõõÿþq@½0ˆ _+QÝFë7A ú£`Ö5üûgq¢Â­Ç~ý‡_,¿þÃ/–ûÃÛ@5öãï~\ÿõßÿéÕï?ÿÞß$¯{Mù—ßÿãò/¿ÿÇåŸÿÅ÷þêwŸƒ×Ÿüà§ËO~ðùšØ5h]¯í/ÿßc"h„«öúYÓ5°7˲üp‰¿ÜõõÂ×—oÿ”îŸûæØŒ5xÝ*u lI< »,Ÿ×_þöqùåo¿Ì¾–ꀴpö5¼œ@¢œýÅ—@5¼îõè×À®3°?ùÁO_]BÀì+Àvá5¯ñu°UûÃïüåò›?~¾ýÕçß/Áß«¿[Ö©Í£=¹ìW¿ýù«K~ùÛG‚X0¥õšÓøgr,Kú‚Ry*îûùï0˜ýáwþ2x×Ï^¥iÄþø{½üë¿ÿ“˹R~òýŸ.¿úÝÏ_]B°¬á%ËòùK\\BÎÂ+ØÍ]* ¹„ÀxاeY^ß6u9Aê뵯)á}`ÿì»õ*0üñwÿúÕµ«Ú/o­×¾¦„wø‹ïÿí«õ­_ÞZ…˾\N@Ü &³åA=R ¡~”ì…ûÀæ®…=ú5²3°<ÂÕ3½w>ê6D` 0‡w·w»¦÷ÎgYŒ,æðô÷¿Ù»˲ø–Cu`â ì‡÷·½Ê(’žÑmx~7LŠXL…S!€ÀT`0óm´R»<>,ï?Þ¿ú xÚtØT€JÐ €–¸„Sq`S—¼ÿxÿåØbÓ%a@š»t ¾–kc°…û5°)̼À˦V‹Wxéþ%.fc°EóØõž°áÿ€•9€Í¢ëëár‚Vx1°¹ËTК)€%PÀ^x¦B €©À`*]dà‰ûÊëñ»K°`Jß<_÷.ÂÐÞÝÞí]„f`ÏW6 ~>Üß³_œ±M¥½]` >=]ö.€8â)<Ø ¬§(luôÙ`ï?Þy„ý™ŸÁÍåñáåùz]>=]–ËãÃr{wÇŽö[k»ÀØêùzeÿ 8zÿñ~ùæùúe›:Sð&YÛaa–å˜g€¸˜žWöþãý—ŸÖZ¬ãˆÁjŠ:€±CG¹…Fí·üŽü­@öଳ—ëÏ(qFËl¡º6ž–aš~„2XqI¾ZÄ3Æ3–ÙÂô%®³4˜C‰­pv3žØ‹___‹ÿÓ¦Þ»µŒgˆÓ\îB°W‡†TZ—W‡†§ÿã™ÔuYøzêýïnï^ýÊOZxÍã_6 }ÿ/½.¥Íý½¥g  `GíPM>©²X…güêoéýÒÿ¥÷€×¼&ªJ1NnÝÖuxœÌÀFfïРÒ#ÀÌÍÀY¸!µmLÔË ñ“—KfèÐÙ0ã €žÇÌcM[Ö×r–”ØÀ:´ïSû¹ü¸„Yëk`sË4·Û’òõ6SµÅæk`GèPM>Áñz}jøÿ–÷ç–×®€³kq ¬v™ô=­ï©5Ûd ’ð(Y^x”,à+~”,^ãQ²ƒã»6Ÿ¥`ÀôÂË Ïüûˆ³­)\B XOù€ö¯€.!ý—ÛhÕ‡ûsLÃ0+Øs"€°Q0.ús^\ €©0 ¦sÄë:¡Ç ,¦B €©p ˜·¹Ôyw{wÈË-`À”¸[ìÈíC+8rÇ0’÷÷w¡F[°>Å´qÄSÜh‹Vá›g>Ð 3¯¨Å]0Xpzï?ޛߓzýýÇûW?–õ!¯x AÜÀñu*ï?Þw¿veu®âç.§./xw{·ëe¥õ§–§ž'­­ƒg}5í[“×7Ï×MuÀ*ŒUâØ…ë~·Q]ÛºjÒ=ƒ×Tàw”`¨¦n-êݲ}·ä«yï‘ÆœÍ‡´œ kÿÙT‰‹x ¥-Ú°§šËjó]cªeù:9ÿ´Íw!(u@øZéu)m˜é½ñûãü[gàÖÓÖað•;5¾/þ;~¯öõ¸\ñûSåÓÖ-÷w¸®RyãSû5åHå•ú_KJ×CûžTI—Fäò´Æ©#[ä^·J­ÉB™ëm´¤OÍÜÆƒFJ¾'µ,·žõïÖƒ@xä¢X*0ÌÅR°œ{Níõ§R€'•WúÛ²¾R@]ª›”^³Žø=5å¯í#Àq…1 Á«¬Ù}`5ŸF¼®ŸMå»÷¨å,åe•›‘L•oËzjÓZÖU;»ºu}½l©`»‘îÀ¥š:ÍØ^ Ÿ[೑·¥K2fv”>€Ùäâ„ñƒ&ÏpòFVÀZ´×‰/!è1¤YVÍ,¬æZP¯™ÜÔŒ«&oËõª^f<¥¾¥½f¬/UøÍë±Ü÷t4ë#x•©Ø-¦)½šõiÖãy1´ôeí­–ât©ÿãõÄ_¾*½^ÊǪ6ø­]¿Ô¾¹:–Ò×(µï7ÏWÕ{âe«š>´'Å­yÏ–åñû\un./Ï×ëòéé²\–Û»;žIü­µ]ZÌ~j—b†2Ž„/g€ÞóõZ¯”…ñÝÑ4»e{–¯1CGB{Ðl'©€f† g†2ŽDºø €-¸<>pŠ` °‚÷ãÜŸÀ ˜y`\§Ï‹LçH´A=X0#Þ z²w€°˜ ,¦Â5°¾ÝˆÙ}¸¿g‡¶àÓÓeï"&|ÁpT° <3bæpT\ €©À`*æKÞ¼óÚåñayÿñþÕoÀÓ¦k`Sª%h%Ø}w{·|ó|ýò{Ô<ŽŒK*´4 ^기©K Þ¼ÿòSJ¾'|-—Géu©\µÂÙÒÔ²ð'|]úÛ+OÍ:Ž`Ó%aP˜» ¾< w¹@é‚T¹¼Ã×׿=.QXgIs³¥áë¥YÕ8/<ÎÀýØÙÏš¼Ã v†kk=qM-8º.2hDæòæNÇÔýK\¥ÙØ5ð´Ÿñu´k^{ZgC=gDSyƳ®Ì€£j>‘¹ë_ã€5~_*\Þáëñµ°žâ1üÂT8Æÿç‚Ë-yœ9€•NÝÇË5cÍ—¸,¯·¸”ÀPJ3£[‚T\p]®ÕŠgMg·Îžz–¹<Îb¨¶v–u$©€rkÙ"O€Ù ÀŽèòø°<_ FA+øp¿ï 𬀙W€ñt¿,°,¦B €©À`*°˜ ,¦B €©À`*°˜ ,¦B €©üéÞ€Þnïîö.ïnï–ËãÃÞÅ00X§ô|½î]$Ð/4¸„S!€ÀT`0®Í¨½ëÃý=×n턾à\`Ÿž.ª÷ñmÙýÑWðöþãý«ÿ{Œpšõ½ÿxßmL§Ö·Ñ²|.÷úÞžåp.°ß<—gê4³y{ =å^#Õ£E_µ®ŸwjóÛ3Àmܤì1Þãü[®Ï3ïT>£÷/€ùÀnðîöN4Íü•¬e Ë=Sù­}5[?Õò¨[m¹==ÑNGkôîvÛÐ98õ³¥¯è'¤HgTR3øáŒwü~Ë:SésË¥×Ãò•ÒÖ–UºÜ€í ÀV° ñìÝÖà5V:xhF©ü¶Tã×âƒt›æÀØÊÞ}¾žjÃTÚÔ{sëMõGüM0’ÞÁP˜MYGtRõ/õK®ÿÖü4í[ó¿ô¾ÒXJ½ž¢Ý'éÌ€ö`•ÖÀ( ˆ4§¤5JÍÁ(õšõ ª9ÐjìuÐÚÒWÖ Â$H—Þ+Õ!N« F,MM=K—ÑhÇßèrž¦¥ñfY¯¦ Ö™V)OÏu@Œ¶B‹àuYÊßä­9ˆÕ¦K|ryhÖY{ÐmeK_Y‚ˆÚz†yjÒšþð°%Úºž=êë©U™k>¸xçíaƾ0.X…V3¯Ë"H©€°6 ¬IWÊâ÷A«e_-KþÚÃÖA»WÔ¬oÏõô®o+5uð|on¹f=Úý} `_<‰Ki „¼"íéÀø”v)kºÚ°N‡»ÀܸS!€ÀT`0XL…S)Þ…€{%`oîï¿Ä¥ªÛh}zº4-ßþP}Øož™‰À6µg÷ß¼ó2@W·wº'">=¤À;oÆDûr,Ë\chÁ4»îtÖ­u‡5¯:¬ù¬íRS×Ô{[íD¬ý§ç¹¥]$Ö|zŽÁÑÆ¼wKõ ÇÙHm‹Ççžïpý­ËÒ*oÆ„Yf€VêËZ9.×Àƃ¾öS\ü‰=]–ËãÃr{w÷êÆ²ë2éÔKÍé‡ð=Ò§ÃÜ©‹Ò) K9Sëµ”GZW©©ô¥ÿsë´¦K•#—O*­&]M”Ê)-·¦[—•ÊY»<•omž%©>ÒôO©<šº­ïKÍÔæöÚ}HêoM´}ä1Æ4Ë-˶¬/\.í¤mT;&âtazÆc"Î;´åØy=_¯U1HŨæv«ÜŽ­&ÍÞ,å­x+Àní·}¿çøblçµmÎZo Úæ³ýØÎ2«Ǩ»]›úd¦™ai ×”cÔ:à«\•ƧVàuý½ÇøbL¿¦9#stg­wcâµYýØ®öK[©ûÃñ%®Ò < =BŽ.×G³ôÝ,å< ú1ÆÄkg8ö#ïöN7 ûôv‡`p.5×ÁÆ\îBôB €©À`*ݯµÞ³¾J÷ê¥/ö£¹²&Ï~ÓÞ vt|“Ž¡ë ìzðXR·ÈH-ƒ?é ÷>ë5&=ÚÜ;x=ÊxÐ|`›ÕêZÓÜ…ÀcVêˆ,OoÑä·%­¶,©'†IO„ÑÌØ·JWjë ¥öi\Ú³5OªM+¥)µ[øzü¾Ò–,Oî‰iÎüÔ´©4v·”ÓÊ»š~€=u `¥ÇÓ¡^êifÒ2M{çÆ-Ê®+þ½þTS§òôN'µ‹Twk›Iå–ú6œhÖ·u¼ä8©­ãìyJÑ«¿¬ùHé¤v±¬ÏëƒYœ®õ˜·Œ—\=½ËšËoÁ–íÈZÎVõ±î ØïÕ4— Mú@ÀÁ'­E»X?˜¤å ½§ÞmíñD[Në lMYহÖz: _íÑÚ~8C_¥®;̽oÄ6¥jÊáÕÖ[×Ó*ýzú>üé]˜ÁÍåñáåùz]>=]–ËãÃr{w÷êÑ^ë2¯OðÚSÞ¹eÌ$|Uú’Hn¹4ËSš’ú¡¶oK§òkê—Ê3w7•¯&¶5c×£¥k-KåÏ¥Õ¤óX_êXM~¥úÀè˜ÀT`0XL…Séþ%.îõ:†R[÷~\'¾òؼotæ{‚î±_:ò-¬Zî{,}彯³Ž—3oc€Eרu§¼þ°ÁîGj븟ðY¯[ öèг‡u.¥#·sË}%hôÛ¥úõ*ptÓÜF‹ÙÙ4ËÓ“4ùmI«-Kê‰Sñ²ø)M¹õµNWjë‡1'KÕô¹ÇxÉ=™Mj·ðõø}¥'rÕ<1Lâ½­”Ò•ž„Wó„5i}š6kaÄ}¶Í4ë«»Ú2jê·÷6Ì kϺ²ÑlŸf Û6µLÓÞq Ù²,áºâßëßqP›ú;•§w:©]¤º[ÛL*·Ô·©@H³¾­ã%õþR[Çyäò+Õ]£EÝ¥tÒú¤±TÛš±[ªC® ¥t#î{¤m(þ¿v›.ÝkýzocÀ,º°ÖÛ²즔>hw¬-xõ—5)Ô.–õy}0‹Óµó–ñ’«§wY¥™)K[·ÚVj‚—Ö¬c׺®÷=©€ÒR–šÀÔÛÞÛ0‹i.!@šô€TZ‹v±~0IËY2O‚½¶•û9dß7ò¾ÇRëL¿‡¶1`ÓÜFk=å¯öhm?œ¡¯Ö:–ê:j›ÒG5å°¶õÞuÕ”{ëéæðGcä}OO[ËÓ«>£µàáæòøðò|½.Ÿž.Ëåña¹½»[ž¯_wbë2¯Oƒ¹Ó#¥™€ðú|·Yé4žt}fY¸Å{Û´–Sê‡-O “¶±FÜ×ÕŒ%ËöÇšrÖÔo¶m:uì(Õc© ^S3°]Xí@;òé,Oq;¥f´sÿçÄd˲„늯ÇAmêïTžÞé¤v‘ênm3©ÜRߦšõYÇK©,5m–«k\¯ÒúRë¬mi}½ÛZZŸÔ–v)m+¥:äÊPJ7â¾NÚfãÿ-ÛC)X“xîËGÛ¦ãrXëŠýXf`ã ¶k«ÙÑ”v´øªô@»£kÁ«¿¬ùHé¤v±¬Ïk tµâ1^j¨1M:Kþ–vË­ÃÚ·­¶Íšà¥5ë¶b]׈ûºÔøì½y›e›&hÛt3°% ÆzÒÚ2­E»Xf€Fc ü,3”Öõµ"•ÅÚ·-¶Í‘ÚÌÂ:¿oä}]ïíÈÛŒÛô¬ûÜ3ó˜æAšÓ©£|BÅí¡í‡3ôÕZÇR]Gm³Ö³€Þi÷`íÛ½ë©)÷ÖÓâáÆÈûºž¶–'—~Ömz¤™kÔñ˜½¹<>¼<_¯Ë§§Ë«Û„+ùôtqût“; Túd_7ƒ·mV:­&]ï¦Y.Ï]¥)‹´®ð=5õKå™;í˜ÊW“N[\9µmV[Ëv$•sk:mZíú¬ù…ËkÊ(¥Óöm‹m³”oéRí6X3Þ½.Ÿ)y_WÊ×Ú·©´a{ç‚7Í~Rz½¶¬{mÓá{ˆ æd bõ{ h±c²0€£ñܦÙ?ÌÉ´†u ,° Oϳs:Ÿ³zúñÞ¦Ãü8NÌgº»ZìŒÎþŽÅ{›f17k`‡ùŽÏãI\°è†XL…XLeÊ'qÕÜ[O{?»ÙXîi;rÝ=îÑëý-ÒÒX:²½î™ì}kœeÉ×aäía+¾Q à覼 AéÉÒë(;õÚ§‡Œ^w§¡x¯£<–q-žNÓ{ Ju}{Ð8BÀjÊX‹ÒÎ~–§tYžbÞ5µ\³¾0Mî‰.ZO&²>=¨6­”&WÿR›IyXŸÊ”ãQw)ÏÚ§•Ò¶ê¿T~-ï)¹õ‰hÚ1–«ÃšNjÏÑ÷u ™r¶¤6šEx@Šê©Ãõé`¦]_øÿš_\Mþ¥™Í\ž¥ú¥ò*­OÊS’ª)ÏTð)5u×hQw)´>Ï1¸µÖ²Ô–3ì÷ܶhÝÆZÔfr¸X逦]6ƒÔéÑÞ§¹=Ú,Σu?”f S¤Y.O¹ür3wšüjfKµ´é¼ÆG‹:´Ð¢=[l³íë å3°gÅ©Þ^3vµ,3¥tÖúôn‡Y>x–>€äÆÑHu€Yê>°[fcÖÓuè«w›ÒÇ5åh=SÚJiýµ³ß=͸?¨¹´d¶º@Ìã>°7—LJ—çëuùôtY.o"Ýu™÷%VÚ/uh–>"Õ¿ôšÔ²šõÕ|1¥Ež¹õx m:õ¥®Õä—Ê3§”Î:^,m¦Yž»¦Ø»šíÁz½®%ÏT:í6VÛžašÑ÷u ±ÎÀ†w `#Úû…QŒÐGðFhGhÍĆ1ê0—3Z&N뎃àÆv¸»`_½¿Q}Öv9b[PîʰÕêîBW8û¡­gu¨»àø<îB@ €n˜ÀT)å'=ÝÊòÄ0+ï³¥öô,KªÍâe©¾Ñäé®fœ¥Ö™£}ú—öI5O'«M[*c.¿½·MMݬOГ´8Cg)§Ô–vÑlcÀÑò>°© ¸gsñ)¬°ýRËÖÿãÀ§”g¸Níµë‹ß—C*Wªœ1m:K›Ijʽµ,áºâß©vÎýÊÓ;]í8ÛÚfR¹Kã3W†ãe†m3No-K.}Jï¶–Ö'õƒ¥]JÛ pD‡»lÍÎ$v “>ÔФ³äŸ;XväÖñPú dm3^c|KÛäHíbYŸ×Ö\ÐÕŠÇx™eÛ´–ÅÚ·­¶MmºÇŽc8“CÎÀ¢=ë,Ȳ췓­ d­3°ñûø ¤Ó¢],3j£±~³m›)RY¬}ÛbÛ©Í€3ñ˜æ6Z[f·ÖÓ/ÈÛÚ¾{±ÎÅ?{ÔS;vÏ0¾×:–ê:j›µžôN»kßî]OM¹èyÌÀÞ\^ž¯×åÓÓe¹<>¼yãºÌã“jifL{Š(·ŒOÓ¯ÕžrÓôEœÎ²¬4Ô*k¾•Ê/-—ê mçÜuš²Hë ßSS¿Tž¹Ó¸©|5é´õ¨ÙÞ=êP3>k¶1k:mÚžÛfM¥tÚ¾m±m–ò-]ê ÝkÆ»×å3À ,Al£v `qžA笧GC;bYög Zÿ¹n¼gÂü8ènžž§χY=#9Ü]07ï#Z?´å¹ÑÿF2哸p^Oâ"€@7ÌÀ`*ÌÀ`*SÎÀ–nB¾.ßs¤‡Xê’k—x”Ë»^a{ØfZ3”}¯6ö\§u¿tG¬€±M9[z¦zîéIGúmm]¤vG™<ëµ¥½F;˜Øß±eìÝÖýÒ,F×ÎÍcv˜Ûhm¹?å,Oâ²à¬ÿKíúÂÿ×üâòhòOå)Õ1—\¿T^¥õIyÖÖAÓÖRºTßjë÷Ū¶]¤õiônki}žc~k¬e©-g¸mæÆ£u›nQØâP3°ËòvÖ@»ÃmÇÏ®,ËX§L­y´î‡Ò ž6k[kÒYò·´[n¹™;MjfKµ´é¼Æc‹:´Ð¢=[l³í[Ìáp3°gÆ¢ž5ð³ÌPZ×׊ö’ ëÁ8µî½Û¬EZÈ•%œ-•fæ`fSÞ… …õôúêÝæ­g½Óîa6òPZ¿¦|{ÕaÆýOÍ¥%³Õ Àø<îBpsy|xy¾^—OO—åòøð&Ò]—yqa¥ù’…6Ýè³R=J_hI-«Y_ÍEZä¹µoSå˵Ym:mZíú¬ù…ËkÊ(¥³Œ•T:ëø´öQiyjv²E4ÛŸõz]Kž©tÚmº¶=Ã4£ï[ÌÅ:þÝ5€΀/Ìô1B;!À¡œ%ˆ cT®X¾8…c ¿ ÎáîB€}õþ†ó‘ŒÞ>GìÛÊ=B¶:BÌ…»À²ã¢o£à.˜ŠÇ]`Ð 3°˜ŠÇ l÷k`K·±ÜèaƒhÏã¶TÞ·…²Þ[÷ö¸M·õŽoÊXiÇ´î¸ÖŸÜë<[XÆàÙõÚæ<ÚÜ;x=óxhQçÒX:c;g3å lŽô©»´C;ÂÍÄ[ÛEówœ.|=~_M~­lyÊ“”ß–´Ú²¤žžTjÛÜúZ§+µKë§iê ½®YŸ¶ÏsOìµµhkëËSò¤±dy2Û^ûÛî>°š)§—trÑúûÝí]öqœ¹ÙïÜ#+SùiûIó¨ÎRýâ|ru(‰I-KYÂuÅ¿KíYÊÓ;Ô.RÝ­m&•[êÛT ¤YßÖñÒk;jÑÖÖºKé¤õIc©¶ÿ4cÀ˜wØÒŽ´´ãCZ|Ð _÷^O4kºš ž¼ÚuKÛäHíbí?ë ž´îÖÛ´e¼äêÙk;²¶u«mE›®Çþ™c0—ÃÍÀJøT}L[kéc%­E»XfðFÓr†Þ“µ­[l+3ö3€1xÌÀNq-ÍéÆ=gÜÎÈ«½×Ó€áOÏõ×ÐŽ³3ŒÅÔµŒ¹÷Øf£ôQM9¬m½w]5åp.3°7—LJ—çëuùôtY.oÞ¸.óø´]šmËæÒ¦cF൸ݤkÌ4ý.K]»—˯…Òú,uß2δ§h¥u…ï©©_*ÏÜiãT¾štÚzHã%æQË~B*gMºÞÛ‘µ­[l+¥|K—:h·‰šñçu9 €>,Al£v `±ŸÖ§>÷>µz4´ç9ÑïÎÀ´†Oq lÖSŠ=‚×ð7¶¡=ω~p‡º,üõšÉaÆÈíyNô;€³˜òI\8/XXtà ,¦Â ,¦2哸¶ÞK“/:`6¥±Ë½+÷ã±_ñ¾ËGï{*dý<·.ú›òI\ÒA<|Ó™wâ8iìÆãŸõº•”G›{¯g-ê\Kglg`oSÎÀ¶ÀììJOŠÿŽÓ…¯Çï«É¯•-O’òÛ’V[–Ô‹Jm›[_ët¥v±~¸õx’•õiSµi¥4=·£mm=ã`y’š4–¶<-¬÷¾8ØaX8·\@´þÎ=P!~-œÊ=&2•Ÿö4`éq•šúÅùäêP’Z–²„늗ڳ”§w:©]¤º[ÛL*·Ô·©@H³¾­ã¥×vÔ¢­­u—ÒIë“ÆRmÿiÆ.CÍÀZwlËB°;šø ¾î½žiÖt53@=yµë–¶É‘ÚÅÚtãt­÷!–ñ’«g¯íÈÚÖ­¶mºÇŽ9À6‡šzØXK°8 ¥µhëÝ‘´œ¡÷ä1©àµ­ÌØÏÒ¸ì·ÖS:8.¯þ]O†?=×_C;®Ï0öS×2æÞ7b›ÒG5å°¶õÞuÕ”À¾<î{sy|xy¾^—OO—åòøð&Ò]—y|ú-Í~åN;iÓñ }_¥/R¤–ÅËs§S×îåòk¡´>KÝ·Œkí)Zi]á{jê—Ê3wÚ8•¯&¶Òx‰yÔÁ²_’ÊY“®÷vdmëÛJ)ßÒ¥Úm¢füy]Μ‘u6ü»k‹óh}êsïS«GC{žý`/– 6ŒQq ưžR켆¿± íyNô;€½ê.˜_¯™fŒ|ÑžçD¿ØË”OâÀyqLÅã.°è†XLÅc¶û—¸<ïm œUéÞÇl/ûñ¸/µ÷ë5Î<ÚÜ;xµŽ‡Ñ¶ÍÆs‹2–úa†vBSÎÀZ”6NžÄ5†-OªyS¼,~º&?é‰D=Ÿ°³åéBR~[ÒjË’j³xYªo4yz§«g©uæx<­ÊúD©Ú´¥2æòÛ{ÛÔÔÍúÔ3‰÷¶i-§Ô[ž@&mc@k‡º¬&h`cW| +5ƒžú?|Jy†;áÔY»¾ø=q9¤r¥ÊÓ¦³´™¤¦Ü[Ë®+þjçÜß©<½ÓÕŽ³­m&•»4>seh1^fØ6ãôÖ²äÒ§ônki}R?XÚ¥´­=xÜv˜V³SÈmllxãI‡št–üsËŽÜ:þJÚ¬mæÁk›ÚÒ69R»XÖ§ùð¬ÍgkY¶¬Ï2^fÙ6­e±öm«mS›®Ç1ã&öt¨X—udYöÛÉÖ²ÖØø}|0ÓiÑ.–µÑX¿Ù¶Í©,Ö¾m±mŽÔfÀžNó$®ÒNu=‚qlé½g-3FñÆõÔn+gØžÖ:zí_z·YëY@ï´{°öíÞõÔ”˜™Ç ìÍåñáåùz]>=]–ËãÛ7®Ë<>9–fª´§lrËøt»¯ÚSnš¾ÓY–•f˜Reí1–¤òKË¥:hÛ9w]£¦,ÒºÂ÷ÔÔ/•gî4n*_M:m=jö/u¨Ÿ5Û˜56mÏm³¦ŒR:mß¶Ø6Kù–.uÐnƒ5ãÝëòÀÂĆ1j×hÅ3èœõòhhG, ãÀ[Ö 5ü›k`1-0?ºÛ„§çiÇóaV€äPw!jy9Ðú¡-Ïþ ™òI\8/'qÀ f`0f`0•)ŸÄåyJÀ¢tß`ÆÚ~<îéì}çƒÒ=Al{lsç àø¦|—4„O2JÝÒ(µ ¨%㱆Ïzmsmy<´¨si,±³™r¶žÄ•¶‹æï8]øzü¾šüZÙòT)¿-iµeI= §Ô¶¹õµNWjë ¥ÇS’¬O2ªM+¥é¹µhkëËSÁ¤±´åIT½÷=¶á>°ÈÊDëïw·wÉSuñká Tî„©ü´§KBÔÔ/Î'W‡’8Ô²”%\Wü»Ôž¥<½ÓIí"ÕÝÚfR¹¥¾MBšõm/½¶£mm­»”NZŸ4–jûO3vŒéP3°ñ޽6-òrmëÝn–ü¬eH!ëXòàÕ®[Ú&GjkÿYgð¤u·Þ¦-ã%WÏ^Û‘µ­[m+Út=öÏ€¹nÖ2»€¹m ¬¥™#hi-ÚÅ2ƒ7š–3ôž¬mÝb[™±ŸŒá°÷­=H¬§ÐW{¯§ߞ믡gg‹©ksï±ÍF飚rXÛzïºjÊ à\<î{sy|xy¾^—OO—åòøð&Ò]—y|Ú–fÛ,ðǢx­ôEŠÔ²x¹ÔÖ©¿s鼕Ög©»¶]¬ã³´®ð=5õËmCšõJ×dÆëÕæ—*§¶ÍjëP:kS;®kÒõÞŽ¬mÝb[)åkÙŸ[ÚS;vŒÅ:þÝ5€Å~ZŸúÜûÔêÑОçD¿8 KƨC^Bë)ÅÁkøÛОçD¿8‹CÝ…þzÍä0cä‹ö<'úÀYLù$.œ×aïB€cò¸ ,ºaSñ˜íþ%®­÷Òä‹Qi|rÊýxì;¼ïäÑû¾É­ÌpÛ¯=Ž3´ °§)g`¥|ø4¦£ìàgÄm|êIã3Ûø¬×8óhsïàÕ:FÛ6gÏ-ÊXê‡ÚØÓ”3°-0;›¶åéB5OcŠ—ÅOÒä'=‘¨çv¶<]HÊoKZmYRm/Kõ&Oït5ã,µÎ§UYŸ(U›¶TÆ\~{o›šºYŸz&ñÞ6­å”úaËȤm 8øV¸ãL-[ÿŸRžáN8µCÖ®/~O\©\©rÆ´é,m&©)÷Ö²„늧Ú9÷w*Oïtµãlk›Iå.Ï\ZŒ—¶Í8½µ,¹ô)½ÛZZŸÔ–v)m+ÀyÜv˜6üôiI Y*8´Ð¤³äŸ;XväÖñ—»4#Ó“×ßÒ69R»XÖWꇚ|¶–eËú,ãe–mÓZkß¶Ú6µézc8ŽáL7kùdŽzÖYeÙo'[ÈZg`ã÷¥f…ñV‹v±Ì¨ÆøÍ¶m¦He±öm‹ms¤6Îä°Oâª=`­§_·¥}öžy´ÌÅ?{ÔS;vÏ0¾×:–ê:j›µžôN»kßî]OM¹èyÌÀÞ\^ž¯×åÓÓe¹<>¼yãºÌ㓪43V{z(5KÁ§é×<ÚTzݺ¬4Ô*k¾•Ê/-׎ëT¾ÒØÕöŸ´®ð=5õËm—šõ¦Þ§é)¿T9µmV[‡šñY³YÓiÓöÜ6kÊ(¥Óöm‹m³”oéRí6X3Þ½.Ÿf` bõk‹óð :g=…<ÚËÂ8°?kÐþ=Ô5°˜›÷ÌA˜ÝmÂÓó´ãù0«`$‡º æç}`ä@뇶<7úÀH¦|ÎËãI\°è†XL…XLe×'q•îË—K3â— jî#+ÕÁÒ&^岿½ò\G\î–ëÝhcÞ{L•ê®o´¶XI=¡ËÒvà7c¢}9–e®1ÑÊ^cxK¾Ë2Oû¶´Û“¸ÖέyÊѲl{ÎwK^uXóYÛ¥¦®šú{±öŸVœç–v‘ìñä£Z£ùwŠÈÕ/g#µA,Ÿ{\Âõ·.K«¼þe™}L´Òr Ï”ïŒv Õ<)'%þD¦µ> (λ¶œž÷M,Õ!¼GgmY¥öHµgŠ&OM¾–O—Ú°kÅãƒqøI=Ü Sï[… ˜Z–Jw¨”nKýruˆÿIåN•SjÏ©î©|seÔÒæ™+Kî X›N3Îjû¡Ä2vÃrÅ¿[õ»TN‰´C+ÕOÊ£f¼hê'ÕËs{Ø:^¬ÛЦÿRÛ…µîš:„ÿ—ÖǘÈ;˜ØÚGÚ<5å,ôý¥5$ÖqmMWSŽÔñ(|¯¦†™I…—*˜KWÓ(5NœHêØRyâ“&M©|^mQ›o.T»hóì¡ÔGR-ãE:˜kúAZŸ…´ÓΕ3\^êWëøÏ•©ö=šqmisËö`íÛÜújÊžk—T¾Ö}c‚1aÕëXP»ž\𺪠-ë•ò±Sk?|æ^·lLJ™­á¹Ã“lYG)m¯:XX>¡iZçËÌ’Å–o¥žaYfêËU«ÀÞëÙ2^¤ƒêŒý\ƒ1‘/ËYÇ„Ä:Áшûäšr sØÔ'IÍŒT mšúei[‡eéWÞëjÉZéô¤ï—ž¬3 ¥ý€×º[¤=2ét±'ÆÄ°7—LJ—çëuùôtY.o"Ýu™tê¥æôCøi0ä¦èKS÷–r¦Ök)OiJ_ªC*}éÿÜ:­éRåÈå“J«IWÓ¥rJË­éÖe¥rÖ.Oå[›gIª4ýS*¦nëûR³¹ýv’ú[SmyŒ1Ír˲-ë —KûiÕŽ‰8]˜ž1Á˜ˆóŽYŽáÖ~¯9îk—¥–×®Ó+>ñØ<Žo%ÖØðos»UnÇV“fo–òŒV¼• `·ö[¾ßs|1¶óÎÚ6g­·mƒY´ŠÏ,Al£îö$®Ô'‚ÜŒS8­í5u³F­¾Êõ‘W¿õ^Ãß½q0~mOgTÎZïÆfÓ*>ö.µJò6ô#Ôáèr}4KßÍRγ ?cL`6­â³ÝžÄX s@Ãã.°è†XLeêØð›kñk|K1˘iYËRúægü ЭunÑf³äiåÝ·¹÷ŽÖ·©18ª#ŒÁã¬Gžµi¥ñÕbüµX_«±"å;Ò6™*Ë´3°Ò}6ן‘ûò¾åÌìc+ÞVVmÄ·¤Ç4ZßæÆ Ú‘ bI7‹ÒƒS¼c†ÞëkÅ:^zñ˜â6ZËRÞȤ§xZ©ûÕ¥ž:“{š‰æI%µ÷®M“*—6_ÍÓiJOÊ©MÛCXßšº§ú}ï¾-=õfľÍ=q)UV©¤'Biû¶TÖV¬c0µ,\®I£Û¹ò¦ÒHu”ÒxNFÌ äö--XÇKîõÚ}dj½)SÞ¶Ô‰ªh)·ƯÇÿÇ7Ïýú¿7K9S;«Ôûâ÷ŒR÷µ¿jëösü[J׊ÔÖRFêÛT_”ò”>DZúvÖ1˜[濯3Õ/µýöƒT¶ÍPÆ^¬ãÅs©áqØ®¬få…Á‰Zµc¦ô)YóÁ«¶,Úí¡Fëm¥ôé»ôþeмn löìÛÔ­–jû6~OË}¶¶o¥`®Wy,yYgú[°ŽÝ=Ê}æàÕ»Þ–}¤uû›v6þÿ¬ƒe{Úõžy ÏP÷-³t3Ô¯•š×=Ûi„³[¡½ÑN¾¬mi»Ó=‰kŽ^Ö×–¥|@YOkà\¶ÌœiåN]öà1®{ožë;òv}ö¾Ý¢¦m¼w½½·©½ôlK͇ÒúVcÏrîµò˜½¹<>¼<_¯Ë§§Ëry|xóÆuYË©êT›;•ŧ­óiñ)»4ÖJ§Rk——ÊQ[?ÍöS³å®—’Ö—K[S¯¾­­»F.}+§óX_XÇÔ‡Ji}–ööÚ¿Ôì'´u(µg._K?hÆ™¤4ækÛZªƒ¶]¼Ö/÷g-Çà²l‡Ò~³´m–X‚Ø0FÝ-€´zŸ&ʰl¾øP ­VÛŸ÷d?QÖ«FÚ¿”‚×e£œ=YƒÖðožÄ…áõ:­žÆ ×—z >ζÓF½ÖÛŸ÷Ìû‰q̲™¥œžuX@Òc雵g@»B£å8ñÌ›ñ¬Ó«Fê©,#•³§iŸÄ€sò˜%€@7ÌÀ`*ÌÀ`*SÏÀJ7îåæÃèÇ2FCÖ²”¶‘øÎ #Þ8–<­¼û6÷ÞÑú65g4Ëøœå¡£Õ½6­&6‘šàYkYJy¶ å›Z6í l¯úâ¼ÇÄÌÛeùÚáí–ÅçÛ¬l{c­oscP›v$Œù´Ò}KkÓÍ¢›¬?ñ­sËz—eD©zxÌÀNs­³Þì¾R÷jL=q&÷4“Ü8´>¡Åc\§ÒÖ–³T~Ë™zÊ=Á)õžpYªß÷î[íÓœFêÛÚ²XÊ*õq)¿š45e‘Ò·fó©eárMͶ”+o*TI)çäÇQbÜ~®iLlyת{Ëì+ö”Ûxã×ãÿ×S5áÿ©¿Sÿ÷f)gê ”z_üžQê¾öWmÝÃ~ŽKéZ‘ÚZªÓH}[*K.)]üw\¯ÒúrÛ|\çÚ²äÒ÷`ó¹ea¾ñkñ:SýgiÏRFÄdšž4&¦›Ý¼2XP«vÌ”>™Jù•b–<5˽ÒlÉßZwÏ2h^·{öm.èj¥¶osy´jkkþ–vË­#^¿Ìy²Ž³\šΜh×ïY÷­f ´{«m‹ig`ãÿsQ:{ÚõžyœÎP÷-³f3Ô¯kàw„¶ÖN¨Ìzœ:B0¯éîB°ž2XÖ×JË–åë)\œË–Ù­x&¢ç8ó×½· Ïõy»>Sßn)çlýïѧ{×Ù{ÞK϶%žO‹ÙÒø+J­]^*GmýJ׬åNæê»ÞMZ_.mM]¼ú¶¶î¹tôm}:mZíú¬ù…ËkÊ(¥³ô¯×þ¬f¿dmgm¾–>׌kIi«mk¯m%µÎžeÑäíÕf¥õÄÖ¼­3°áß»°€VïÓ[¹–mÀJa5ëöè=ægm‡žFh£‘öu¥àuYú”3uI€äýÇû71ê4·ÑÂy­ŸÌ[oTá§ÅÔµÙ#ì†ö„ÖH_:ÚÂ{v‹ýÒf飞åL]òôð|Sè±QôM×3 ]QããųGhFh§ʰÒ~9±—Ú™ØÐn’,`0.!ÀnÞ¼óÚå1}íëŠXì&VKÁë²l˜µÜ oÔoKÖÜ:Bs ŠÕÖº¶¼¥…wYSy{Ý7qf£ùÞ·ñ ×7Z[¬r÷‡í]Vé>µ-÷-î±Ì˜h[Že™kL´dCÞcoƶÍåñáËí²4L3°kLJOÍÒèý”#-¯:¬ù¬íRSWÍÍ£½XûO+ÎsK»HöxjP­ÑƼwKõ ÇÙHm‹Ççž pý­ËÒ*oÆ„Yf-YËÜb_ˆí´Áë²8]›{"…¶CãOäaZËvjŸœ‘{jF.]­RÂûùÕ–UjT{¦hòÔäkùªÍ3÷ºæI3štÒÿ©×µmVR;vSå´ö»T©~µùæÞ_»¥ÿKãEZ&E‰ƒí¡´_“Êd©{mÿY·#ëX˽Ÿ1ñ:ϳŒ Kž¥¾Ë¥ÝR~ϸ@³Î\móµåÐÄ`{âK\k£Äãð“z¸A§Þ· 7µ,•.îl)Ý–úåêÿ“Ê*§Ôž%RÝSùæÊ¨¥Í3W–ÜŽ«6fœÕöC‰eì†åŠ·êw©œ’ÒÁBªŸ”GÍxÑÔOª—çö°u¼X·Mÿ¥¶ kÝ5uÿ/­1‘w„1aÍS:ÞHmKWÚzÇ¥úI}dMWSŽÔ1'|ïÖº{hÀJ“*ŸKWÓ`–FwˆË"wz©<ñ£IS*Ÿ…W[Ôæ›Ë#Õ.Ú<{(õ‘TFËx‘æš~Ög‘[ŸTÎpy©_=wz–}f\[Úܲ=Xû6·¾š²çÚ%•¯u_À˜`LxÚ’gm–Æt šþ³7k?`æ^o´æž°¥5Ä l^‘ÿÖ F2ʧ—˧7­Qëœb™Y²Ø2Câ­ôÁ3,ËL}¹jõØÂ{=[Æ‹t`ž±Ÿk0&òe9ë˜ÈÙ{Ÿ<Ê~׫©ÛfÕº¹<>¼<_¯Ë§§Ëry|Xnïî^=ÚëùzU?¯h!ŒQ‹3°î·GÉ€—bÎÆ{ãI\˜ÊŸ0à €™Ü,Ëò²þsy|à’ íæeY^n^¾ýk¹Ù»<€èÿ在YIDAT¶«™WlLIEND®B`‚PythonCard-0.8.2/docs/html/images/findfilesfig4.png0000644000076500007650000006011107476712543022114 0ustar alexalex00000000000000‰PNG  IHDRÔn|•ãsBIT|dˆ IDATxœíÝ9%Éyày³³G¡„V¡”5KeÍj¥1<@ãF£'« ¨ÆÝËcà€ØÂEf0“¸’H¾Dã @\$AN +ä˜Íš¥°kVŠJXqõ\!Û³üyúñùááñÿ™¥½|/"<<Ž÷òËï}á±yxq~yrp œlÕöè@ûµ‹óóöîÜ™©+ÀòüšëE;Èàö¯æî°dÎ µv²½˜¤µÑ¿ø§=~Á?Íš/4}s5C¸?Žuz×» L¬sgYÉ~®S´¤ë”ìé:%ûAºNÉ~PJm6õ÷ç`|œƒÆlœƒœƒærœƒœƒ9ë\ð9:ÿ–ìßü»‡d¨€Á 5PÓ'ÿmö²·÷ù×úÝÞ»£N>õ‹*ýÐí(U1 þÅÙÉÎó'^òL­¦0œ0ÌeJ—¯ÝŽ( þÅÙI0@¶ƒió5×r?ÿ¯ßÜyþò_§¤“øñ?ý¥óõWÿÖ½IÖÿý_üçëoxÙûª®ç»?ý¢RJ©»¯¸_µÝ©|ûï>wãµ·¿öcÉíüÕ>£”Rê™×=Ÿ´Ü7¿÷¿;_çþÀùú×_øS¥”Rïzê¯÷S”´Î˜¿Üþ‰óõ{OÿoIíüÅß^Íÿ{oþdqŸL_þÎÍí}ß[?UÜîá·þW¥”R÷ßî>&J)uðWWÇ÷¹ßyP¼>¥”úÂ7?ª”RêÃïøÜãßßyóœÌõÙ¯}H)¥ÔÇÞýgÕÚ€=ýìsÑy¦¸ÏŠ( ~â%Ï\Õf lÚ—/λ¹ñd—¦_öëï¸~þ³ÿú®‚j¥”zõoô„5ô¯â÷•Ú(õýŸ_Ö¯Ùï¿Ø…1 ùsè`úm¯¹ dÔF©oÿðsê[?ülVP]Â@‡¼ë©?TJ]Ó¯}÷* |÷ë×f}¼ý¤:Þ~2Týí'”RJ=û¦OTëƒMÓfýåïü‘úòwþH½ÿ­Úl½Søð;>Wüñ¹¯X)¥ÔÇÞu@HÀôtpnà¾×M¢€úçg'êe/ÎvP]êe¿þ‚E{Ûk?Êy´0:¸n}ÜtvZÿ^+K èC(Еd°Ívž~ö9õô³Ï]·) ¦•Ô/{É3×AõÏ_ ¦_¦víO*¥>¡بÇYê ?û—oì<ÅKߥ”Rê§ÿòõ«çÿñêùOþùkJ)¥žüï¾þ]?WJ©¿ÿåWwÚyåo¼çú÷ÿr·´ãU¿ù»¢¾ýèwž¿æ·žUJ)õwÿptýÚkû÷”RJýðþâÆò¯{â½J)¥~ð‹¯8_ùÞÏ¿|ýû^~UòÂϾ´3ÏS/ÿõï/ütwÚ_ñmžþôP)¥ÔÝ'—œþäpgž§Ÿ|ñ„úûÇ'Ô›^ùÁmýíßÿù×Þüª«¯¯ÿæÇWY··¼êÃê¯ô…«ß_ýáó×ð­~vç¹™¹Öe.'ßß ¶žy}Z)ˆé/|Úùº«äãkßýÔu–Zg­µ÷¼ñ•RJ}õô?_¿ö»wÿSrŽ·W%ϾéάôÑß~BýÞ›—yüÅß<Îj›å_ù›Ýu¿÷-W¥&ÿå¯ÿøÆ:ÿ-ÿùÆk>_úöî<ÿÛ®öÓ¿ýø[€¼ýjŸ~ñ[éß ¸üùÉÇo¼öÁg®Î?;¹ùmLJÞñÙ¯Ù%ŸÿÆGv¦䟿þ]g¢µ¾ë ;Ï?ûõ©½ûÏn”||æk»ïµ¿çê}ö™¯Þ|>ÿžö_mÀ¨Ì Ú|-F4lÞ/ŒÀùeFVÚüýöBž¤“Yê¡L:˜~ùKß©^þÒ«2HKè`ú'¿¼ °_ù﹤u€­_õ›¿{HÛµÓ?ú§ãëŸë×^ ¦_ó[Ï>¤ÿñhg9;˜~íoÿÞõkš¦_÷Ä{½vŒYSýÔËßý£Ôã[?¾ñ¸¤uí´ ¦Ÿ~ò¹ÇôO¬¯?^þïͯúÐ@z*:˜~ûk?vHë×t0ý;¯û¸ú×íS'?¸ ¦Ÿyýó×´`Û¾ñ½O_ÿد+uUÞ¡KøÌg®i;ÈþÐ;>{HÿÙ7Ã%E:˜þÈ;?H›öGßõ…ë¥nغääƒë¿ûÏÕÇߤ|UžÜdÐÒúë¬êRê e_¬ø¸púòÅ_}ãwë Z©éj¨Íì´æ»Q©ij¨Sƒh;CíãÊN+õâ…‰Žm´ƒè©|çG3zo}ÍGs¶ ¢M95Ô­¥^„è“{QbJVÚdÐ#0³ÓJÝ  k!+ õ˜Ùi³ü#D8ÊÇ7Õ/¹ú½v õœ¤e­Øe9µ¤ßûÙU ˆNqúÓà µ¦³ÓF'ñÖWAô eÑv™µÙí}é;WÁ´/;]Ê••žšÎTû²Ó€ùÙ5ÓvMµ¨ä㉗¼Cýâìª4ãêñÒø]û¤ÒÑOèÎ’®2?ýgyˆRWevMµöãúË`¶ºµüâ+Õ²Õ!ßýéo”|èaóìšiÓö'U²Õºä¯\¿~ZòQÓÉ÷$e«{§3×SŒê!¡GùhÅ.÷0Ë>þü¯nÖN·ðùo|äFM5`—ZíŸ9ú¡”»ä#ÖŸ„q¨¯~7ƒë'^òc®Oì,*÷°ƒj³Üãå/}§úÙ¿|cçÂD}Qâ+^ú.õÓùº(˜~ò7Þ­~ò˯íѺìã•¿ñõ÷¿üêN-ÉV¿ú·î©ýãñNÝ´®¥¶½ö·OýðþÂ{a¢D¿î‰÷feBßðò÷©ïýìËÎÌôS/¿zág_Ú ¢]ew_q_þôPþä*S}÷Éûêô'‡;AôÓO>çÌë‹í ͺiH›J‚é·½æ£êÛ÷¹cQëzé·¿öcê[?üìN€ýö×~Lm6õ;¯û¸ú«|Æyaâ3¯{^ü`7ˆ~æõÏ‹];­K@Þù†?PßøÞ§¯/@ôy÷ÿH}í»Ÿº¾(Q?7ë¦ßóÆ?®ž©7ƒi}‘¢}Q¢Ë{ßü'ê+óŸv.L|ï[þ$zî¾ï­ŸrÐï{ë§ÔFmÔûßú§êKßùCQfúoÿ´úâ·þ Ú…‰JíÖMð™ÏìlY7ý¡w|6¸­yççoѺìCOse¦?ú®/¨Ï}ýÃ×%šôEŠæ…‰ú¢D@ÚH!¾,´¤äc³=:¸¼8?WN¶j{t öîܹ¾ÌÉöâzÆÐ8Ô¾¿ÄnsÝ ýÊñwêÆ¯M`š5_húæj†pëô®w˜¦_¤Í#i?Ö©ç‰îé:ûAØ® Z)c¤@@½Ón…}=[à«“5œƒJíŽô\ï‚ÏAñ:7i}A¢9]òaìÁ9X¯`?„Ö¹³ìJÎÁhŸ¤ëäÜ™‡sP¸Î‰ÏA}þÝyòßfß¡ðÁÉV=¼8/ZÞ¼õxvþÍ¿{(¿õ¸Œ]5Ô¾ yé5Ö%œ™éß~oðä™™±~Ë«>¼Úý0H+5©9lÍåk·#¨Mk”¥ì¡ò”ŠgFð¦W~Ðù_±™±^Ã~讟Že$ÖÆÎL›>ôÌ‹™iöTu{ïάË×nG©Ì€È¡K%æV³¢Q>¸3ÔÏ<½7U?“»Ìœ0‘¡ P¨€Ô@ì€ÚwÏuû±–”{¼×êƒoùVÛÓÃ}îS•ô5e™–ûÂÕ¶d}K8> \Ñ8Ô®{›Kîw^s}’ùŸ~ö¹&ýj¹­½¬³dßÙ˦¶›7¥½Vç%Û£ƒYF³|ì70¢êwJtœfPÚ*¨ò}-ß2Km·¯¹Ö9E_\ë×Ïíéæ´P­ú+í³ëŸšXߦގÐ:íi®é`ÙŠjI \úµ¿d}®uØZ15·Q².Í ›ÏÍ×cÁ½¤®@ÞÕ¾d}ÒySÛ•ŠÕìÇŽÿTç˜^õj—ZgÍU³lfJCÿ8øH–OéO+-.¢“’5·«õv¸ÖÁˆ¬Wõ’—5dã–¾’,ÿR¬ábQÐÉ/J\b –š]vÕç´³t= {7Çù¶Äsäkž¡ÕѦò]ÜåºpÍÕ‡VlÍmœký¾}X²ïBýJí³k^Wß|í¶<$Û2çùÚÚl./ÎÏÕƒ“­Ú¨½;wÔÅùùÜý®-=«¿ôþ€0Æ¡ P£{KÏî.½ÿ Œ€(@@    P¢ãP3„°ë™çž»Ž“E7vyp²mÚ!`)ì¼ÄwJ<;;«Ý—ªö÷÷çîæôø0i~×¥›ßzèÙÞ;¢ùNÜ÷–  Àê•\7È(رya3w&íCÛ»4®¯ÆN“¿2›B}Â<ÌsA¿ïç|ÿ—®Ûµ ¡ó]¿GSÞ¾e¦x_Õ8F-Ž/Ÿ)ð!C ×ÒåS—3ôd}NÕÝ{÷o¼æcÏ[s½±>ÕZwj¿|ûcŠþ”JÝoö¶¦nãT玫½©ÎŸ¹×?•»÷î·Õõzè¼Ò¿»æYË>¤º ¨=¼Øy~ëöžhÚÙ¼°qϾ×G×ÃsýS÷§‡íwé±O­”ÿ9Ï9­i[•J vKþAÎ ªsŽÅåS—“üÍi¹ÝX®§Ÿ}îÆh>ÝÔJ…e=Í®1=ûƒÍÎb›Óõ¡9Oly[JûzZA¿+#h5±i¾Œ_êºCÁ”ùçÖN²ß\z$iPÝU@íòèáÅN }ëöÞ×POꇑ+pµ_ =÷-_Ò~ŠV¾±ò„XðS’i‘uò-/íçœûCºû¹+ sý.iKº==d¾B}J-CÊY‡kæ2)ÇÁ·?õû^ú9Òãçœk´©²¨-×co«ôSóy«Ïw²Ô㳇œÕ]Ô:ûL°Üû?óõÔvZrµ_k¡‹q–úajþ1áB,cšÂ^®dߴد±:hI09…Òs«æq˜ÊŸsKÐú3´d¿ŒøùŽ:¤e¦nj»fš ºÒŒ@Ks^‰ß²î´åÕâ±¶{ ¦s÷Gj g--Ž_¨LÄõ¼Å1¬µ]¡s¬ÇãPZ²QjÔ‡j}†¶¨¥.½&¡·ÏPÌ«›€ËEf&OËbi FO¦èGÍu´êoËâbj•tL¹ŽšûGRbÑʨŸsÀZt?µ®™ÖÈ^O'7cÒzÜÐZóLI0L•±vÕò¶\_Îté<¥zÌ”–ÐÇsª@\úMÈ”¦Z_Ÿskã+CœËç7Ú998PççÑŸn2ÔfÐì ˜Ýcz’j×<)™×׬¡ç©í×”óu ô¹«}×H9ë.Y¾ÖE-÷‡´†ºt¿Ôn+4’…¯Íš#ZÄú$™žPÔ BbÇ!å¼ }Î,ís.õ"dûµÚëÉi{j=÷ íÙ!æØl./ÎÏÕƒ“­Ú¨½;wv"p=íìì¬xe-íïïÏÝ ¨§òŠ-jÈ—¼?zÕC™HOzï_ µG ÕÂϱo{Õ´Æsl4§Ç‡×ñ¯ôQ)µó{÷%úÀ×›X¢µ·¡àN—¥´å›Ÿ #I ¦÷îܹÑF7%ÀhZ=?‡’Ò÷Go¦r–x{»·•Ð6æl{(0Ÿs_ö”Vjï„¥Ó®Zjj ‘Q?dk-Œú–6RÊ”–ÚïSmãö%Ö%'CmÕ”|`µjd¨ ¨°Z5j¨ ¨±®‹kR/Ò™J}Â<ÌsA­6×X¼®õ‡ÎUýþʹ.t[h¨‰jt)õNhµêñbW·OqÛæ”u»,¡61u¿•^Ä6Õ¹ãjoRÆP®}¡–´ÍØ’[ÛcGûæ™ûxSênjûÆ-¾›»p—ÄeêívÊ=è±O­”ÿ9Ï9-i[S‚Ý’n ª´0\†Ú,s—ÄiÅî<Ê.éi9wø“´í{žºÞ”ùçÜÒu„r·=»­”íÉÍD×úö õ.ƒö<’`mªãÂ.Ã0³Ê¡»ïÙhóy¨MÍPêhX·+Oˆ?¥ã×Î\ù–—ösÎý!]‡ýÜй~—´%Ýž²†¡>¥–!å¬ÃµNs™”ãàÛŸ:°uÝÛz¥¯¹øÚt­_›*{L–@mÃe¨uÀLY\Ì?¤#üAeLSØË•ì›û5V- &§PznÕ<­™Aso·r€) •¡6ƒhj¥ûÖòjûXÛ=Ó¹û£ä¾-Ž_¨LÄõ¼Å1¬µ]¡s¬÷ã`‹B0 f¨± -ƒYi FOAõý¨¹ŽVýííÂÓÚkíuL±b2jàN‰˜€$`˜*cíªåm¹¾œéÒyJ--S£çT¸ô›)M±6ƒhTÀ •¡6/8´Ë=ÌiÔY·åúê>ô\¿æk#%8’´-]¾ÖE-÷‡´†ºt¿Ôn+4’…¯ÍZý—ôI2='`®dÇŽCêykÄ¡ 9% íj3$õbû5©ž¾0†êÍöèàòâü\=8ÙªíÑÁ™ô´³³³‰7/ÍþþþÜ]ÖÒÿ€ÕîÿÒ÷G¯z(éIïý³Õý%TǾ¤ý §Ç‡YÁ´ù;%Þ_ߥ–tÞ†‚\]ʓҖo~‚i-äd¨mÝ”| ­¿žŸCIéLjû£7SJK<޽]€ëê_N¿CyÏûÀr UC~ŒúG«ÖØÂ¨oi#¥L©÷~OÕ¿Þ÷€åb” @ 55V«F 55V‹ 5ê{ž›;€õj”óæ-JíÞ¸%4 È5Ü(¾@ÙuçÄEÕvøÁåî´Øsß²Ò¶Íy\mëGcCV€Õ士€zìÙ÷Zβ’¶CÏu°-é À†«¡~ôðâFy‡kž¡™dIp›üfËd§Àˆ†ª¡¶k¦]%‹/õÐbþ•dй¨@l¸êa‚i¥â²YëB2AtD,Ð MÏ0€áFù¦Tc”j¬jP–P€ 5P€ 5P€ 5fwz|¸Šu€1 5õpf¾«àéñ¡º{ïþlëÏå –ííHÝ®¥î ÐÞPãP›7oQÊ?öô£‡ŒK=8;ø% ­ —¡ŽÊvÐ= iÖw ÔYgÉ]ËØYkó5׺ì×ìu9è,¯~ÔÁ¨L]¯›\mhº=¯9=´¬¯?6=½Òu˜æÀ4T†:Fg¦g ª}Ïí×Ì@¸t]ÒõìÔäz=”vÍ/m[²liö9¶ŽÐ¾n”G/œóìeSÖB»ÖUqý5Ki >U¦hŒ©Æ(Ýd¨Í€Ù  g¦}ì’+5#L3"èÙp5Ô>vÖº‹ {;úJ&R„Ê*È€žÕ¨¡îªäÃåÖí½ýZwr2Ö Írû†¶“â9ëÔr²â@j¨ µ™…î2`6Ù£nè×|óØ+†Ú©D2z†=Ÿtºt4Ž”eM)ËHÖ!Ý`}jd¨7Û£ƒË‹ósõàd«¶G7fÒÓÎÎÎ&Þ¼4ûûûsw sz|˜L›¿w_ò´Rc”j¬ÖpãPS"C  C  C  C ¨‘¡îòÆ.JíÞÜ%4 È5Ô• ÊѨ­Æ)ùÀj WCýèáÅòÉ4 ÇP5ÔvÍ´ù<4 È5\†˜ãP†åì¶K:BÓ€\5Fùè& fÈ<Lj 5Ô@2Ô@2Ô@2Ô@2Ô9žßÌ݃Imnîéña»Æ Ö5e¿z\ æ6Œ°=ø 5õèBíååtý¨åôøPݽwînd±Ä¥nÇTîÞ»¿èã @ÈPãP›7oQÊ=öô’oðbÍ›Í2ƒhm„àÊìÿÛÓA5`TÃe¨CAò£‡ò Ú.ëxˆ^c󆦧¬G@Ú:›­ƒn;»mã±é®uH–õõÇE[:û«/û¹9¿)6ݵ¾Ðò¥RûZ¿ˆº¶ÍÜ_¡ýèZŸ+Ð5_³Û”lA6`é†ÊP‡$Ó® Øì†æ -šVÀ•½vÐf°šz]²¬ý<@ÙAœR7E_’é¡>ÔìrúçZ¿+˜Ž³ÒeR¶7Ô¦¤OJ‘¥Œi¸ µ.éðϱé^ ßVj”‚H‚éý±­ž¯ÚÚI‚é’¶Jµ:=c$†ÊP›A²+#m¾–”±Ž úñàrwº˜‡¦UV:RG(˜n9 HK¥q,ã[Ú>™\–a¸ uH“‹}å!&»fÚªCmUà+ËH¡ë ]AõR/Žl¬JK B(`jd¨×15cOï\\˜ºìÜ$Álhž)ÆQÕ§.×¢/­–gŒjÀÒ •¡ ‰wëöž|È<»C¿&×4á>±@Ø5Ý—u¶3Õ)Ëj52¯®@ÓlÏ5"Eè¹½¼DÊúSûïšWO—lKêúrÚ µï[žŒ;`D52Ô›íÑÁåÅù¹zp²UÛ£ƒ3éigggo^šýýý¹»°Vu-e.¥Ÿ¤8=>Ì ¦Íß×QòªR3 X>‚iÀ¨r2Ô¶nJ>°,\t—oi·>ç8F6T 5–‡ +ÏÒöÛÒú @ Fù ÔÈPP`µjÔPP`µÈP†åüq‹R»7o±§ÙÓ€Ãòá ’í×]6j•£|ýìs7–ïfjóÆ.JÝ{š¿,ߥñÿÄf³û7µ ¦G¥ƒjö …«ŒÃåäàÀùz7µRþ@Ù¾õøä·"•jØÓÍL´ž¦Yj;së @ÍyRÒÒöçìŸdº=¯Ý?›žn÷Ý|Ý·>×?æk9ûSÊΚÁchš« ý˜€Æú`·g¿&YޜǵlJß ²1®R©®ê.ér ûµØtýÚƒK÷<–X€&yÞ²ýÖýSJ Æ¶IÚ;˜•.“²=9ûSó€¡ÀPÈj%™Ü”õä.zë;YjÀÔºª¡~ôðâFé‡RW™k=mòìtGZ—H”¶[¾v µ$˜.i«ÔZKZììrNp[;&¸´ÔM†:TÒa>wܳ[É襰$Ã]b uÙ¡R¥¦é¢t=\<I7µ”ÎVw•¥^Éè-ƒUIYFŒ®Y^CP­ÙÙß©2±¥ë!c IW%‹ ÉF“±žmýö…€ÒåZôeÊå}R3Á¹™c×E†zŒkéEƒ-‘´ÔM†:4,žÎJû¦7¥/*”>ׯ%r‚53­’öCÓkô/µ}{^éúíLµk´X[_N›¡öíç¾ ëB£c¸Æan‘ .]O~šm”\ @ ÝÔ± yÖ;@Ž=-ï P]ÓRÚØü%Ócý“ôµæúcÏ%ÓRûÛÞ’>j±@14ÝžVtJ–MéKlšôµœõPŠ’Øw!䮄c˜úÎ#dvGØÀòPàò2üƒ›ÿd,e¿LT/=%˜Ì¥›’Ìk)f®%oA¢ û 02Ô@j 5P€€(ÐÍE‰æ[”º9îôl7vº ¨•òÊ^ìL³Ÿs¡ä(ÐU@ýèáÅÒ gÝ”’u̼ÔúÃa-êê·oZ¨Oö6ØÛìjSÚŸ”6¥ýð­Ë×O›ô˜ÅÖg÷3¶ÎP{¾ç5újïÓšý/i+ö^ªqºÖú¾IÙ6i›®çskÉúí>„ÖoO'xFº ¨}Á´ýú­Û{ÁÀ»w¡R×4ßü:€”ö|± ±9½V[K]o¨Æ:ÔN,À5Ÿë?ö2¾×cíÅÔh30çôC„û¦»ö—¤ŸÒeRÚLÝÞœmKÙ&ikôÕõ¼Fÿ¥m¥.ã{ïùæIÙ·5Îǘ¥ë”õ×xê'0‡njMg —0÷h®’ 3kl¿nÊÉrÇÚ¬=¿OíïX{Køc!éãÛ1Õ¾ê阘A$ Ìi)jôU¨OÕ»½žuég™ôŠ%“[Wµ™y^r:Ä2cÁåbÙÚ’þRC=Ô,]ì«Ø©¹J1æÐ¢¹m†ŽiHN¦·…ϽÒãËÆ×¶”c  ³€zÄÚ%¥ü¢5_Ù†©§þÖ’[ò1Š’¯¢[˜{ýZ‹~Lý-F(kÙƒ¹Î½XÉDh¿Îqîô~¬[[ã6£_ÝC­k¦µQ3×>©ë¹Ç6×_£/®²‘uÚwïÝ÷þô̤d§§èOå¦ÈXKÖaÏS£_Òõ¦Ôªº–³³ÁS%Àsí?é~m±îåX뾬i½€K7j;p¶ƒæF÷P*œýu5¼Ôu–,+i;§Þ9TvÒ3óëûuûD‹ $´×æÐtÉòÔ6íé9mJ–‘lK:ÒX›¾s!·½ÚÇÁ^N’QMm¿ÖúcçjÊöÛYá¹Î¥ë)> š6Û£ƒË‹ósõàd«¶GjïÎuq~~=ƒžvvv6_/ö÷÷çîP$'«7gvz=î§V}šj[{ܧk3÷1(]ÿÜýÇúœÞˆ}|1s7j4É7K5ò¶kE@ ,Xè+iÜ´„¯‘{ìSŠZý_ú~yÛ€µ" :ÁÙöÖ¼×¼ík3÷±ž{ l`ÝòôŒ€(@@½ ®!èNg{º•¹·Ëµo§÷”1VXj¨¬Æ Næ°„1¥%û¶· Ü|}Žm^:€µë. ŽÝÜeMwI•¾QËY·ðŽÝ˜Ç ë×J§€Îj_À<Ê]µPÆOš ÔóéÇP€º[¡Žìvb}”a©™èX‰Ç3¥±,vJ–ÛÈúŽ˜F7u(û¬_!°e÷R²Ò,¯¯ÍÐ<5²’’6Sú™³~Ÿ’@<õÖ¿®Ú¾°oúÜ%$@¦›€ZÓA3¥Ói‘é;{œ»~IÆß4å…ƒsïSàÖU@mf©G­—Ž•Bðµ½[N Iîz”’gÄcè˜Ö¹½ß¦^€5è* 1€v •B…ôK-!‘´3'_IHm¥ÿ´ñOa]Ô¸©´vÙ5½¶Ûì%h®©Æè¥m0ê7uPߺ½ç2Ï|}é5Ö¡‘*\_¯—*®R‰X°뇤MÉH&f k³×>B£t\>u™<=‡k?ùFޱ÷›äœ[¸áÌi³=:¸¼8?WN¶j{t öîÜQçç×3èigggóõR`î.,FëŒâ˶a*ì+À’Þˆ}|13·tæ–zá0‚i:*ù@;½–KôŽýÇ>€€z¦z²ÀšPò   Pcñ¦¼ý÷ë«ÝþÔûgN£në¨Û£ †Cq)·÷µ“ÓÆÒ¤\¼êÝ#4fµ¤ýšc^/õ\H½}½Iz %ÇÏ·|é1€uP»nîb¾f¾¸¸nç øn >rPrDßP‚¡!ô$í·‚oMç‚t—._rŒ`T]•|ÅvIÏÔe` º ¨5}ö×d§QÂXr¿¾¯àH‚é’¶L9Á³$ƒúº_ßy24ÿÔ彞 Òljk 9F5ëà`)º ¨Í,µ+cM=\PX:*C(¸k9⃆$µÓ¡y]ËÎQ_Ûù`Ó¼ù¼¦Òºô”ãÚbý°D]Ô¡`™`R½M¥Ë§Ôs× ~–z±Yç‚K¬Œg.K9®Ð›®.Jô!˜FM:XõÕªJ.*K•záa¨/©mÛ\´-!*¹˜ÒgŠs¡Å7 ¾cXÚfi‰Hy`‰ºÉPÛ£w¸Ê=ìù\TJ1¶|Jûv¦º´o!¹#GèùB5Ò¥Óç’³¿]%®‘<|í™ó§[É>4§»J;BçÀR!L¡›€Z)Lð ©ÔÀ·Ö´ÔQRÚOi;wDÔÀ'§Ò驿:\¯§Žº’{aiÉ>–»W2Fµˆ’ë¶„’„q ŒŒ€«ÓÓE`iˆq.L‡`ÀȨ±:PÐ85P¨€ÔX¼–wœjSlÜF8FS ³èOWÃæ¥|7HImcIµµ)ãGÛ#-øn´š§ôâ²¥£ognò¦‘2Fµkzjû¡6`4ÝÔ®›»pS¤°œ¥È9$‹4à±oþÑâ¶ãK=F®~öÒ÷Ð]cÇQrœ%w9$€°T'EËwPûn1n¾f×@ŠX@¤³¾;ÕÙwÀóM³§ëu„–7Õ³W· Šz+¸×cä œKÖao“„ï™Áq ­Û€¹<ýìsÅmtPû‚i ¦fvоշÉ~Ýòb™ËÐó–΂äŽQJÿJ×!ýÇ Pn{t öîÜQççâG[7µ¦3Ðvpí{Hac)Si`“²|jlf í¯é¥mõx+µœc4×:z8F>¾óz–L»‚ê®j3Kmg¬}¯¶Þ/«-µöU?Ÿ3àùõ8*‡¤Ü§Æ:L½üƒ1¥Á´RÔʨa¤à¬”4È™:øõÅÊ7æÕÖªF†šq¨±:º¤ —Ñ\¤ÁNAQ‹>ôxŒì µÚs¬½û»ÅE¯5æ€9 •¡¾u{Ï9džRî¡ô€V\£0¤,c¾Öšë«üšRëösÍuŒbmø‚î”6sÚPêæp‡JùÇ·¡ä8‡Úïõ<‰êÍöèàòâü\=8Ùî\å¨éigggo^šýýý¹»€é)ó¹t­ÊE8Fc¡¦@¯N³‚iówJ>d#H‚ç €žåd¨mÔX2Ÿõ´ ’8Fc!˜г5ÔÔXµþqŒS!C  C  C ¨éÇNmÃ÷ûýaCC Ôâ DSjrSëw]ÐMYœ2þ¯k´…”ñ‡cí°45Æ¡î. ŽÝÄåÑà nî/ß裎á }·O]>¥}–h¸j,ë×t ‡LëÛZë{šý{l^{š´\#Ô[É­›}A01`íjÔPw“¡Žežõt‚jØj”h„2Øö4ó¹¾Mtnö;ÔI›’€˜Œ2~CÖPë€Ù ®)ó€”p]¯Ç–Ë™6¥œàYL›Ùo‚oÀš WCmÎfFš`)–TC]k$Kj§]óú‚ð»÷лá2Ô¾ÀÙ.ó ÈÆ|¥'©BYèÆFý`Éjd¨»º(ÑżHQÑÓðÉÍø.aÌgé(¥mÆæ'ÀŒd¨ µ}Á!A3rHj¨]󔔃˜í¥Žw]#w´Ò ÛUÒ ˜©¯Œf¸jIM IP+½Ñ5Ÿä5_%7€©1ì]NÑ€‘ 75€eaH>ÀÒÕ‡š€@6‚iÀÒ‘¡ ¡ ¡ ¡Ô2ÆÖZ÷uIû€ 55ГØXÖÒ6z¼Ý¹É7JGhljß\|í¤¶À”†‡Z)å¼¹‹}ëqÆ¢Æ\·ï=@– ÝÝÐw7Dýš$@.i€) WCýèáÅÛŒk¾×“Y=Í›²_Û›6Þy%Ó|} -o e“k°®`¸fû´T£†º› µ¦T=fõmÅ]}³_7Ÿ»– Ío?ïq_г!k¨uy‡\û^Lf ë{ Í›³¥ÒÊAJƒÞÒÛ•×”Sªq÷Þ}j¨Ý®†ÚÌR›¿›A4™lÔË$Ûó¢5Ô€ž —¡&PÆÔBjè0‚`Àjd¨»º(¨Á}³kžœõô<úGh´ 0X†úÖí=çyJ¹‡Òzgé)õÕS”š˜¶þݯ´Æ¹uûÔR#C½Ù\^œŸ«'[µ=:¸1“žvvv6ñæ¥Ùßߟ» X¡ž³Ó îôø0+˜6§ä«Ucjj Ùi–o¸;%KB0 Àò‘¡ ¡ ¡^tz|È˜Ë jàEwïÝwŽo R#CÝÍ]´ÐM\¸Á jêN‰J]̾@94 ÈQãN‰Ý”|L`jCÖP?zx±SÚ!(¥®ë¨©¥ÃÕP›™h;+šh§Ç‡êî½ûsw,ÄpêPL €Ú‡(0Ô(·nïy‡Å MrÕ壛€Z)J>0­¡2Ô@ =ª$€Ãe¨\Ò Çp£|Sb” j ê•qÝN›Ûl§›{¹ŽÙæ…Íd믱.Î;½âó ©åc妺ÍöRnçm~€öÚ_ɾ´Þ˧.[v)™oì?`ö<¡å\óÆÚ²¥óÜí(]¾tº„/˜ÐmŦÛmI¶Ó·žX›±c™ÒW—Zí×8¿%ëÊíoj;!µÞs½Gbç`r”× \Ì×ìi€v÷Þýa>@Í z󦻠ÚÇþƒž †‚•”ÀÜ×~îºK—/ž"¶Léû¤Æ±öõÅn¯f_sÚŸê¸HÎmÉ~/yH·5¶¹íOù´á2Ô^8eû5W€½$¡ÿ®S²cæcʇ[Êû¡õ”f1bëÕ²ž–ûAûê¯FFpj±,vJ–»§?F¾¾Hú'=7bÙBézÖð•²ù>ìå™Zè<šj¿ÔZGi œºž5¼G0†¡2Ô¾`:w¾^…>€SF釹¤ÍÐô”@V’EHéW?V9ýˆµçSÒ×” ´+cm¿š¾”l7S.C­Ôãì³+h^z0Ý‹¥dš\™ÉWÿSöIJòM‚iÊ‹Së*s¿ê­ÅüæÂ~=ô|mj|ƒûǺIM½îSíKÖï[—ôÜŽ©ñ1—ÕA÷ú^³¿å|†ÊP+µ0ÛÁó(Á´ýA'ù`o-w#|;5×£”üŸ€X:¦E@.Ù†Úµ¾c“[Úš/™jy»­’éSнk|SÕ²ý9Ç%çÜ.m'ômaÉû|Ê÷HŸ X†á2Ô#Ì)T­I³5.£|P¥”™´*ù¨ÉW²DK¬Å,ý'¹‡²§^wíR¯©ÛGš‘Þ#C õ"Æ¡%;#õƒB2«ŸØ•Ý5èìDîÅÒ~ܽwßû³TSMöº\ÿP¦^DZ:_K52ôsz½öONà;æ’ejJmß7¿äÜ­yFŠ’÷H­÷ŸT‹÷ˆdÀ4T†úÖí=çy£ Õ5º>KµX›’?.®:´ÔvcÏíåsèö\µŸ¾õÖîC-¡Q:.ŸºLž>•Øþ””ØÄÎÉÒ:S×ñ—ž×±åíé±íµßò|œªn8§¬J/ú†¢¤¯©íK?¯$ÛÚS µtÙÔ}1Ê{ëQ#C½Ù\^œŸ«'[µ=:¸1“žvvv6ñæ¥Ùßߟ» ˆ¨õUë’¿²]rßµ¶aÉØÿóã,ƒï8qü`;=>Ì ¦Íß»ÉPkàÊö/ÍÛ°T»$ß®µÀ{ o¡cÃ{.Ãò±´(§áÃpéýWjŒmX"öû®9÷Ç¢_±}À6T 5ÆÓª –ÕŒò´P#CM@ €ÕÊÉPÛ¨±jS/×z}µÛ¯Ñž7zÃ產†¨Ê<¦ÜîÛ×NN£ [er3+½B?eÌZß<>©mמnÎ'½ÁK­›\„Æhö­Gz¼}뉵;–¥û¤Vû5Îoɺrû›ÚNÈÜï‘Òé±óë0ä(¾›»¬á¦/˜Ÿë–Ý)±ï¶ßkª}ì?è9Ì|fJV³íšÓõsŸÔÀ5$¶/JÇÚ×»½š}Íi_r\sû"iÓ¾±UÊü©}žû=Rã=(5` µ¾Å¸þñ½n×ÀT\ló5_àìzmóÂæú'4-gz¨Ï¡eõóP»=}5êûÃ(½œÝVN;­Ý½'¿­ýÜ‚^OçÈÔBçäTû¥Ö9°”÷PCên2Ô:h¦4GæØ¼Íç± wJ<´éÌ ¦Íß»ÉPWÎχ@`Wì«ûVûŠ÷@ßBdž÷Ðz 7ÊÐ;²Óéøƒ4öû®žGQÁ|b5úX‡áî”ôŽ`€±Ô¸S"5V‹ 5P€ 5Phª;N­Æv2+€.ñù„š†‡˜›ï)¥í´®»nq¡dh)“ôöá¡Û ‡Ú²å\$”³î”e]mHÚOo9´¼k]’~šmIÇAv­'ÖfÎX¾¾ºÔj¿Æùs~Hû›ÚŽTïÉ8õ¾õ©†åÃwnì‚)Øij°êš´‘AjÜšÙ÷G8%H“®'uݾå´Xà)m¿Fk£t5ûÛ'5ûšÓ¾ä¸åöEÒ¦ùºd¿ü©y,‰áj¨=¼P·nï]ÿø^7ƒk`*±ÛŠûgó5=¿¾}¹¤]s~s9_{.=}5êûÃ(½3›ÝVêz$îÞ»Ÿ”M `z tz:G¦:'§Ú/µÎ‰Þ#ÀÔjÔPw“¡ÖA30¥92Ç5²Þš}{qóõ5ëý8·CÆÜzS²†ZgŸ ®Ñ;xÍ-å˜#ØM­E}eÝš/3è«£4M(Ô* ()‰µZ·]f0Õ¾“ÖÝæö¥uû’õûÖ%=·cFH™ûk¸j3KmþN™¦2õ…:7Ÿ·"¹Ð§vm£ïâ¼’@À4FýƒÛº†º¦ØE˜¥}mÝ~Šœã’ó>õ=’RjC¦5 —¡e¥}(5õ@»Øuؽö3Glt„Üö´VpGùC>Gp‹}׺ý‘,á=’R ”ª‘¡îê¢D j­1'-öÕ-K.0Œi16ö”A“+óegžcýIÉNhŠíÒÇÅþI]·ä˜K–©)µ}ßü’s·Æ¨9ÖôÉ ÌGØnLg¨ µ]ÖÁyX"WPË&»J:\#yøÚ3çŸ"s-Vòõ{lØ­V5¯®¶CÙ°Ô¯ÂcíKÖ_ËTuÃ’cî[&ô EI_SÛ—ɶöTCcî÷ˆÝ>ß6 µêÍöèàòâü\=8ÙªíÑÁ™ô´³³³‰7/ÍþþþÜ]ÀJŒVráÂWæóbÿÏc° µÆãƺfÓæïÝd¨ôƒ+ççC °+öÕ}«}Å{ o¡cÃ{©†åèÝ²ÓæÁ~ß5çþàXô+V£¤îN‰@ïÖL°5î”H@ €Õ"C  C j1æóÔë¨Ñþéñ!ã¶èŸOhm¨q¨¹¹ÓÔšé%^´vÊ$½»šëõ”1g}óÄ”l‡tÝö:|äCóä\0[¤f[Ò±“]뉵ÛŸ)}u©Õ~ó;çøKû›ÚNHé{`î÷HìüJ 5ʇëvâú&.ö4nî‚Vì`x‰rM5nçì °S‚´Xû¹ëÖr× L¥ë—ˆ-ShÔ8Ö¾¾¸î8X¢´ý©Ž‹äÜ–ì÷’÷H­÷ÀÞ#@®¡j¨oÝÞÛùñMæ»­¸þ]ßšÜ5¯dš=Ýn7VâÑÓW£¾?ŒÒ;éÙmùækýÇ7%¸ï9Ðýëé™Z蜜j¿Ô:GZ|Ó“k”÷Ö©F u7jÓ£‡;Ùi3Ö·('¸F 5³Ïúà®6í×Íç®eBóÛÏלAŸÆ{K7d 5Á2zeÌ)å ¥AoÊò©u•±¯¬[óesÊ2r™ëÏ-}hTÔ¨ƒ5Ë ¦ ‚$5õºO=¶/Y¿o]Òs;¦Æ{ÄwŽ—NŸò=bîxÔ4T µRÓ˜Ÿ]N1röWr¡OíÚFßå’êR±m´™¹þ ·®¡®)œ•öµuû)rŽKι]ÚN(N­IŸë=B&­ ™¡æ4r݃Øè½‘þC±”?ôsÔ·Ø7­Û‡Ühï¬S u7%ú²Óºf:60]öÑóèSM®Ì”ÙŠõGÚßÛÕC`?Eôq±R×-9æ’ejJmß7¿äÜM kmwÉ{¤ôý×Ã{$f }DßV•¡v «ôFÜú÷ÔeÌ×z Vòõ{l¬ÝZcìÚ_5»ÚŽM5³h­Û7MU7,9æ¾eBßPÔ¨­•¶/=.’mí©†Zºlʾé=øÔÈPo¶G—ççêÁÉVmn̤§M¼yiö÷÷çîV¢çìt¾Šû~ƒe œ­œfÓæï‹ÉPhƒ+ççC °+öÕ}«}Å{ o¡cÃ{5 7ÊлѲÓæÁ~ß5çþàXô+V£”êN‰ÀŒL°f5î”H@ €Õ"C  C ²‡«[ê:¦bnKí:=>d Y]âói=V55К+@L­™žó¢Å^Dzö e*¹›¤-[êEN±QJ¶SÒ/iû¡6||ÁD쎗)£1ÄÆ(-+{:¥¯.µÚ¯q~KÖ•ÛßÔvB$çphœï¹ß#±óãj”×[ì;"r—D´f¡KÕÃÕÏ¥ôݥƭ¥}vJk?wzNßì×$™³A@¬ÒuÔ8Ö¾¾¸î~X¢´}ÉqÍ틤MóuÉ~/yHÏá” ¸×÷–o¨ê[·÷v~L^p§DÌΕÁv•@è[“»æ•L³§Ûíº¦»gW€-]‡d[O_úþPKï,g·å›/6œWË?Ö­Û¯IžÎ‘©…ÎÉ©öK­ó¥Æ7=Sd}—ôÁ¼jÔPw“¡6Ù™hý;A5j«™ÁÕ·wµi¿n>—d—cÏ¥ý+]‡T/5û  Ür½²†š²ôʘS‚ÚÒàsŠàµt©u•±¯¬[óeí~-ù|¨>5§ W;’Z]³Ì`ªzTIM½îSíKÖï[—ôÜŽ©ñ ƒµÊ_JHÞ#æ~Xòçü†ª¡VŠ`ó[Ú…})zmDr¡Oí?´¾?š%5Ô%¦øšŠZ]Éô)Å‚£Ò¾¶n?EÎqÉ9JÛÉ­‘ïé=ÂE‰ã2C Ìi¤Ú+ß]lt„9HkµG0Gp‹ ¨uûص¦÷æU#CÝÍE‰d§±ºì£§4tŸlµæ^.Jte®\£-”ŒÂ‘3_‰ÚÁ™¤ÏSn—ý“ºnÉ1—,SSjû¾ù%çnêùQk»KÞ#µ÷ýï‘)Ú@V““.„¡èIDAT¡6/FÔ¿|£Gfp›R_]ZjkÃt§´™ÓF®XÝ®t䌞PZgj.몯L™Û>×<¡ö%Ë×2Uݰä˜û– }CQÒ×Ôö¥ÇE²­=ÕPK—MÝ£¼GпêÍöèàòâü\=8ÙªíÑÁ™ô´³³³‰7/ÍþþþÜ]ÀJô”^2¾2Ÿû~ƒe ¶z|§Ç‡YÁ´ùû"2ÔÆÃ•óó!Øûê¾Õ¾â=збá=4–áFùzGvº.þ ̓ý¾kÎýÁ±èW¬FãêN‰ÀL0–wJ$ Àj‘¡ ¡ M=Vsj¾ß§èÇéñ!ã¬èŸO¨i5ãPSq¢)uÓ©5Ö®‹{¨Ó e*¹uoʲ¾ybJ¶CºÞÛ–s“/˜ˆÝ2eÄ‚Ø8Þ±e¥ã3§ôÕ¥Vû5Îoɺrû›ÚNHéûoî÷HìüR 5ʇyóM߼ŞÆM]ЂoFöØUãö˾?°)AZ¬ýšëN 8k¶[¦4Шq¬}}qÝ!°DiûSɹ-Ùï%ïé¶úÚYÒ{ª†úÖí½ŸÐ4Wð ´bÓúÖãúÇžfÿ›×ž&-×õÃÖÓW£¾?ŒÒ»¯ÙmùækýÇ·d;z¢·£§sdj¡c9Õ~©uÞ´ø¦'×(F u7jÓ£‡d¡1‰%¡ ¶=Í|®oå›ýõƒŒz>iœ kÅ{£²†:L“F+:Àu½[.gÚ”Rë*c_Y·æË J¿’®É rÊNZõ³F¬Yf0U$©©Õ}ê±}Éú}ë’žÛ15Þ#±sTzÏù1÷/öÿü8Ëà;N?¤8=>Ì ¦Íß“¡0®œŸÀ®ØW÷­öï¾Å.ˆä˜!Åp£|èæÁ~ß5çþàXô+V£¤êN‰ÀÔjÜ)‘€«E†(@†(´„1¤µÖ}­Ñþéñ!ã¿èŸOðYÕ8ÔÀRÄÆ²–¶ÑãíÎCBÃW™¤wQ“Üð¤æØ¸’1ˆcýõ-ïû#ž2B´!±~´è§o=±6cÇ2¥¯.µÚ¯q~KÖ•ÛßÔvB$ç`hüè¹ß#±óë5Ô(ö[”z|ónê‚¥qÝ|irM5n í °S‚´Ü¶õóÜå%üKÚO[¦4Шq¬}}qݹ°DiûSɹ-ÙïS¼GRþíõ=‚õª†úÖí½ß4 ;³z›7e=¾¶7/l¼óJ¦ùúZÞÔÓW£¾?ŒÒ»ÂÙmå¶Së³k{j¶ßšîOçÈÔBçäTû¥ÖùRã=R;x]ú{ËR£†º› µéÑà ‚gL¢Ç¬±¾­¸«oöëæs×2¡ùíç=î ËQ£, ˜Ã5Ô¾`Z—}h£3õ=†æÍYRiå ¥AoÊò©u•±¯¬[óe}u”.¡úÏZr2y®mËí_iºý5ýT_«KjêuŸzl_²~ߺ¤çvLë÷H­’‹Öïs^‚~(5X µRáÌ´YOMPÄ2Éö¼£’\èS»¶Ñ÷G=·>Ôµ|Oõ—Kª¡®)öNi_[·Ÿ"ç¸äž%íŒðé©ßèÃj`)Bê‘è˜Aü’Œò‡|Žáû®×àpÍ8˜C u7%’yFìÙ0»æÉYOÏ£L4¹®æ·3ϱþHûëšoi¹ËÛ ‹ý“ºnÉ1—,SSjû¾ù%çnjÐXk»×þ|V“¡6‡Í#èÆ˜AzJ}u¯¥&’ña%_¿ÇÆÚ-Á#¥¶Ø®¿¬Qãܺýœ~´\—ä˜û– }CQÒ×Ôö¥ÇE²­=ÕPK—MÙ#½G0žêÍöèàòâü\=8ÙªíÑÁ™ô´³³³‰7/ÍþþþÜ]’ôœÎÁWµóbÿÏc° 'ØN³‚ió÷Ed¨ô+ççC€°+VžÐj_ñèÇ>Ãò¬ÅhÙi?Tó`¿ïšsp,úűÏPwJÖdÄ`€%ªq§Dj¬j j ‚ÓãCÆX`¥ÈPäÞœ,_ u7£|˜7oÑ\7qᎊ¨e¨;%ÚA²+Àv½äª1u—%®,4™iÔ6d 5Á4æ¢ë¨©¥`=†ª¡VŠ`óâöͬÏj—G/®ôs ÔPj_&šŒ5ZYM†ha¨;%J³Îd§PËPãPsÑ£zpA"ëScjj¬4ëE 5P`¨j`jd¨€d¨WÆuKìœ[eçÜZ[¯§Æm¹¹µ÷•Í ›!Ö1s[FÚ.À¼åc妺Uvëõ„Ú·ƒïQ/ tˆ—O]&·‘ºL-vÿçꩆåÃu;q=æ´=±¨×ÁhOõOÄì tÎ9…«ŸKé;Ce¨]·M_²PÖUš‘ÕóIÆPŽ•XHúc¯'¶Œ4µïšßµžš}³Û´—ŸK,hÕbýèšW M³§ëuø–÷Î%ë°· €–†ÊP›=¼*€6Åʤ¨úbÁž¯Mé:}ë©•9–n‡½l¬¶¤M{~ŸÐr53¸: uµi¿nâ±ìrì¹´¥ëýS@®¡2Ôš/˜ÖëQmäi‘=NmsŠ ¶0§µ¥ÁçÁ+2`.Ãe¨}Á´ùÚÒ³×±r‚9FÀÈõcJ½•`´0ò…}”oz5d†z Bås‹©ëŒ•‘´à«îAnɇm¤Ú+ß`NCe¨—žyn¥´þ×5½ö:%í¥*­­–ª OõOë½¹ùj·kòAhe5jsĥݡ(ìr{zW‰Iè¹d®eRÖš?¶?bbÛ#éÛRǾΠ¸í ^ ¾Xbw›tí'ßþ“Ü2´l¨/öD¥}u©Õ~ì<ÌÝVI$ýMmðØpwJ´Ù7qé/ˆóÝâœÀ NrsžZí—“Ø1®Ùלökž‡±»˜Æ‚rÉ~O}Ön¨ u(xÖÏG ¢CÙ.iFVÏçºÃ`l}9ý±×[&%ƒçkß5Jæ0´$Çк%Ûo®w‰ÿ˜ÛÑs?[ ‡Sí—ZëXë1€˜¡2Ô&;x-˜ÉÒ KúÝצt¾õÔÌØ•&9}½VºÏ|ó¤’~½ò •¡ÖBÁ³ÎZ\c\®@bA{¬52ð±LZˆý3£åö¥uû’õûÖe~«QÒ—ZíÀZ —¡ŽÓzÚ’3Öö;É÷ÖrGýèAn?zé+­k¨k ½|¯õÔ~Šœã’óÏ 5Ô 7d†Úg©´K¨4`Ž?x5FΘëÜ~,!°˜»äcªcZ»TfêöËV#CÝÍ8ÔKÎ:·T{ŒiI{µ©œö|_[· òBíÖZ§Þ&iPw÷Þ}ïOKºöOê~p-Ûöœõ”ö)g~×?©Ûêj³†Ñ¿}€ÚV“¡¾u{o˜!óBµ­®?Ê¥Á“«Ä$ô\²ÎXP"Y‡oþ”ý! Ž\m§¶[cŸõfªÛX‰Sh³ÞÜ5OiŸ¤íK·d[©¡€þÔÈPo¶G—ççêÁÉVmn̤§M¼yiö÷÷çîV«T€’ƒåãÀXN³‚ió÷Ed¨À&ùv¢ß7*€en” -J:ÈlÖ5ç¾ä8À8VSC L­U=1èËP£|S«‘¡& Àjåd¨mÔX-2Ô@ên.J4oܢ鸄¦¹†åÃCwFtØ@ªaGùxôð›MR YCM0 €© 7ÊÁ4¦4d†˜ÊPj²Ó˜j ÀPêPšì4Z C *C L 5P€ 5P€ 5P€ 5íôøÐùšëõ”lWûÄìCý 2Ô E0âvz|¨îÞ»¯îÞ»?wW’èF>®úØhwïÝz{ë1T†úÑË?¾é@Ot ¹´¤ì`Z#¨Œ F†ú×fè·“}ó3p¶o=¾ä[‘ëD?šŠœØÓÌFOóµc;-ƒ½X¿}Ó\m¸¶'¶>sþØ~òõÑ^ŸùZîþŒ›Ò}ã[6õÜÉ]€‘åd¨í º›€Ú´ä€9Ff±ÇõšäéöbóúÚ·×êsh¹P,ÙN½ŽXCm†æIé‡t½’ýêgêúSû’Ò~ê14I½*C­¹‚é[·÷v2Ö£Û1vÐ tJÚ^²ÛÒËþÉ ^í —€Ç†ËPû2Óæë#×P/±5V ±ÄmšBn I¬dfª¾0Š!3Ô1:[=b–zÎ@&·äÞî n)%$zþPÉÌ”}`Ce¨G ’KLØLµžÒÚe×ôÚzh³v­¹ëBM°¢ õh5Ô®àÆ5YIà3Õ¨ ¡õÔÞ&W›’¡Ûbý´)ÉÄ bcm–ì;¨.ÝÏ’}“{Ñ"½«‘¡Þl./ÎÏÕƒ“­ÚܘIO;;;›xóÒìïïÏÝ…n¬-Èi½½£ìÏÜí  Œìôø0+˜6ïæÆ.úäû€`0‚wJ\DÉ`â&$éJƒ_†ÞŒj55ÔH3z 3õö°?kl£·FT£†š’¬V 55V«F 55fF` d¨j-Ách;C7˜ÊP£|˜7nÑ̸Œtc—µ+½ @-CòaÉfmß–|É·)7盛”ûŽ{š=Íu‡E_;®;õIûæ[JßBÛ Ð‹£|tP›–0Çø²°’×ìq€u{±y}íÇÖŸÛ·Ôí4‘¥S²†zä`º”dÆÓ)€%ª†Z)0}ëöž³Æz4s^”—S"°tCÕPÇø.PÉÜAlJ‰À†ºS¢´ÔcM%!-3Ö Q°¢ õhCæ¹FëpÃ\’!Nm+4nßBÛ™r$@+Cò ”G¢m¾q˜¥ó§>Om¯¤o)íÌiÈQ>0>ß]ÉN€©Õ僀³°ƒj‚i02ÔpZJ`j×iL 5P€ 5P€ õÊø.äcLé¾”ŽçMì@+d¨WN_ÈGý±Ü³ÇSÿãµÔÀì}²Ämði[`‰jd¨»‡Z)ÿ \ì[8.5ЊkFUàÊPwJ´o)n?׿ÛÁõ…î:(½#¡žÏ¾aêú$ýqÝñе^{ÞÒuÕ^>´ÏjÞYÒ5OÎvHוÒVhß1–¶k¾Vz,mvÛæ£t_¥œË©ýË5ŶHެÙPwJôqÖökK’zÛíP@$É2JŸÐ2®`Æ·|lÙ”uÕ^Þ·ÏR³µSl‡t]µ²Ï±þç´›º¤RŽc³­¡þι-’ç°fCe¨u l>G©HSnS^úGzîåk­·e?Z´½”6Kµ:Nslë”ïKÙPj3ë `Ce¨MK/ëˆ }õº´`nj­öÏ’¿O髯>z-öyÍã–Ò¿Ü’éúíÔÈPw?lž] 2r í’øHæï!˜ªeŠmémŸÆÖegV{ÙGs´7Õq¹{ï¾÷§–‘޷Г¡2Ô±êQÊ@BWŸ5ÅS®³åºjô542‚´Í)·£ÆñË ªS×ëš?6JE¨Ï)ý³/:-i·VÿR´Þ¥¦ÝXšêÍöèàòâü\=8ÙªíÑÁ™ô´³³³‰7/ÍþþþÜ]X½¥•J Î…~p, ìôø0+˜6ï¾äh¥Æ ¨°Z5j¨ ¨Q _+Cã\èÇÂÈPÈPÈP¯Œkè³ÓãCƧíLéñàxÖµÄq¸{Pëó&gßèõÔØ¯#u 55Ò1Vº%ì³ýcâz\çÐöçTïÖë µÏûX§ãPwP‡n좧¯é.‰@ ®b ÿXSâ}¬×Pj;X6Ÿr—D­Æäô|öÖR×'éOèî‚¡yK×U{ùÐ>KÍLIæ/ÝéºRÚ Í“rÉXðQz,]jÝy±tšööJۈ훚æþ¼ÉéOÍsQ²=¿O´7\†Úg¤À:öu£ôƒþ–!’ôÐ2öüzý±yK×U{yß>KÍBM±ÒuÕʪÅúŸÓnê>Hi+6­Õþ”¼ïJÏ_›>©}I駹ޒÏé:}ë©•9–n‡ÏÔïÓ*C}ëö^´äu¤~XÇþ¸•´ÝÛòµÖÛ²-Ú^J›sèaߌ²/—®‡s@}Ce¨G.ñ0¥~ Ž]-öÏÒ¿rMÙ'½lgê>¯ù¾YÓ{¬ÇÏ›œuNÝÏ^Þ'¦1T†Ú¤³Õ£f©C_ïñáÖjÿ,ù+×”¾úê>çºÏk½o–tlµÜ’{zŸ7¥åHúµ–zzŸh¯F†šq¨;—ú.™¤?SlKoû4å¢/;CÙJíu”¶W3cÝÃûåî½ûÞŸšjÞÌñÞÉio©ïu •¡ÕP›¯ëß—š½]îúP¯QS<å:[®«F_Í6|Y¨ÔòƒÔ~¤,_ãøå ©ëuÍZ>uÿÕ:¯jïÏÐ|’þ´6÷çä<Éy¿¥¬34lÄ´~Ÿ˜F õf{tpyq~®œlÕöèàÆLzÚÙÙÙÄ›—fî.¬ÞÒJ%ÐçÇûèÃéñaV0mþNÉV+'Cm# ÀjÕ¨¡& F5|u sˆã}ô 5P€ 5P€ õʸ†t:=>dlÓÎL9†òÚôºoÃ8O­Ï´Ü»/ÖúüñØk2Ô8ÔHÇKé–°ÏZô¯t¬Û^ö[}˜‚k¯aÛ§:ÏZ¯'Ôþ(ïE`$5Æ¡î* –ÜØÅž Ìwëfþ(Óâ½ôi¨ õ£‡7‚hýÜ íy—¦Æäô|¡;¶IÛŒõ'twÁм¥ëª½|hŸÕ¼sŸkžœí®+¥­Ü6ÌÇ’¾¥,ï:÷jî—Zww,=fæ£ùžËÝw±þ–šû3-§?)wLM „¥ÇϵžÜ¾Ç–sMOY^ò^4ç–¦F†Zm.ŸæéK¥ÔåöèàòáÅùåöèàúGO;;;kú³=:>M[ŠíÑAÒ4ó5{z¨­Ü6]ÓcÏ}ÓJ×U{yISlGμÒé¹û­vßkíG‰ZïÍÒí®Ñ†ä½àZÞ÷[.eÚÜŸi9멱#¿C¯K`Æ¿ÒGû÷n2Ô·nïyK>LvùÒ¥fRj9K³s/_k½-û±¦ ÐZ¶µÅv–¾Ï“ë3ÎÌH“Æ’ UCm–qø‚楗z(¥v¾6ÓÏM\-ÖbÿLùÕx sŽR0÷ùZêq­ùÞœ{¿L©ÇÏ´ÜQ?z°Ô÷"°dCÕP›t¶ÚWS½t¡Ú¼¥sSkµ$uǽ*í«¯rŠu—’Éšä¸Özoν_rÄþ9 éí3­ÆÈsý#°Ô÷"°d52Ô‹‡z¤`:U‹ñXGÊdL±-½íÓ” ²ìì¡´\¡v{9V9ó¶^WïÉ»÷î{jªý™6Çû3§½ß‹z›––„lCe¨c5Ô£ º’Úõ[£¦xÊu¶\W¾ÚWªÇúÜ¢)Ë×8~9m„ú¡—Mm7öÜÕwiŸ\Ë×ácÎcæ¢ögE®¹?ÓjœW±÷€d¾ùSöÇRß‹Àt,y|úÙçÔöè`gùÍöèàòâü\=8ÙªíÑÁÈ[O;;;k½-Eö÷÷çîÂê‘¥@ çЇZïEÞÓÁéñ¡óvâ.'Θ¹› 50W)‡5€føèC‹÷"Ùià1jTÃ+lœ@Z¼yP/zúÙçn¼f_„h[İyÀìà9L+E@ ìÐA´$˜VŠ€¸AL+ÕY µïÆ.£ÜÔãé& ¶o/n>×Àœº ¨€9œÈË;\º ¨oÝÞó–|(õ83M¹jq “—êxÓO|âѯ~¥þ‹ÿK½áÉ'Ô­ÿïÕ£_ýêz=í‰;{êÿû‰ž|ÃÓÎeôëÿá?üêÿ¹øï;~õ+µwçŽzô«_ݘî{]?þë½Qÿü£ïóÈ#<òÈ#<ò¸ÒÇÿûÿüoI?ÿÓÿü¿¨íÑzÓO$ý(¥vbæ¤ õÞ;¢ùÌ´¹¹Œ~}ïÎuq~Î#<òÈ#<òÈ#ÕSãÕRÉ%ççÉ+±—™{'óÈ#<òÈ#<ò8ÞcI¼Zb–q¨çÞÙ<òÈ#<òÈ#<Ž÷8—â€:§{îÍ#<òÈ#<òÈãxµbÕTEunçÞÙ<òÈ#<òÈ#<Ž÷X;f•ʨK:6÷Îæ‘Gyä‘Gyäq¼ÇV±kLv@rsÛÜ;›Gyä‘Gyä‘Çñ[Å®1E%¹›{góÈ#<òÈ#<ò8Þcí˜Uªø¢Äœν³yä‘Gyä‘Gyï±V¬šj–aóæÞÙ<òÈ#<òÈ#<Ž÷8—¤»äÜQƵÌÜ;›Gyä‘Gyä‘Ç1kÞQJPç\é[¦‡Í#<òÈ#<òÈãXSŒ9í²Ù\^œŸ«'[µ=:¸îü¸bÆÌÑ õ3ÏÍéK ¨Íl5€]³ŒòŒ‚€(,ù Üp{æ¹çÔÅùy¼†š>?J>€Ô@¤[ÛwŸÙݼµãÓÏ>ç|}*±õ»¦»îª#݆šÛ+Ù¿)mmжm.sC9ëõ-cî÷¹ö÷”ǾպJÎŽMÛuÍýY=Iºõ¸+å5eÛZlwËý[Ò®dޑ΃ìý1çþ™j½z=½Ÿ ›~ ,yaQÉÎm±ÇÀqìÇcïÎurp ¿õ¸„™ùÐevÈäʘؿÛóJ_·ûeÏïêŸtÛ|¿›ëŠõ×.ÅH釫-×s©Ðò¾,^l×> •²¤£”}l¾ÛO)ev[©çS¨Ï¾ýÚ¶XSûà[—¤±u•nCèsŵ ›~«®ùɮ葦MUjÉôkÖÐ/éë¡v|Rë—Cg¨¿¡ßsÖ ðcÛ RçIéÊ1òí³”>K– =—7ûŸˆ”uùÚ“ö˵ÍÒvbóäößl×þ]z.¤<õ‡cãßû÷)MN¿`f0m–|T ¨m9™¡P[¹ì@ÒlÓî_ÉzR—ÍY—o[Z­o*Òcd>÷ýãк_¾>ÄΧV‚d?´Xoé>—,/ÙÒv86u—¯ul`iì`zïκ%½ê9LÊ>/]Ê1Še‰kî—Xö¹·skÊþ”þ“›zÌ|û¼·càñ€åsÓ'×YꢋC¸öW«¡yb_õ×à*{Hùƒ1GµÄÀ¹d…Ž‘~”·š$}põµt}¹óM¹¦ú† vÜ¥ŸE›úí–›9?{Àä ¦Mâ µ/ˆPJöµ©¯nÑ~î«q”¾k'Wì+þÒõ‡öoÊ?'¹bûW—9Äæ±§i)Ç4Ö¿”ýâ;cýÍ=öÒ¶SÎéÒsÍ5«÷UI»’s1uý›:í¦›P6œl7€ž„‚i³†z³=:¸¼8?WN¶j{t°Srq~¾3s®Xº÷Ì%ô±'®?–=í¿Þú³ì³~-ýØ,ýï€qÅ‚é.j¨%™¾¹-¡=aÃ÷m æ·†cÃg €¹I‚i³†z’ 5°Ò`Z?Wªð¢D`9Á´R‘’gž›îŠt`nf lWkøª7‚µ.ýàö¯š€|¥Ô¥~²=: + $Ø\*u¹¹|ñ7µ™»?À¢üÿzŒÃ.ánIEND®B`‚PythonCard-0.8.2/docs/html/images/findfilesfig5.png0000644000076500007650000003266307476712543022130 0ustar alexalex00000000000000‰PNG  IHDR°¤€ãSsBIT|dˆ IDATxœíÝ¿v,»uàᢗ‡ÌCœ!C4’¯,4á ,Ä ¯å€a‡-k°7Ó4}1Åw}Óñõåë?¥ñsßô͘ƒ×¥R}`KâVØiú¸þö«óôۯΟ[_Ke@ZØúv'([`ó9P û½î½ìÜû“ïÿâUZ_– û¼Æý`%ªö‹oÿtúò¯Ÿ†¿úôû%ø{öOÓÜ´¹·™Ë~÷Õ¯^u!øíWg‚XàÒÜç4þÙ"Ó”îBPÊOÅ8°ŸþƒÙ/¾ýÓ`­_¾ÚfÍ ö‡ßýÙôïþ×&r¥üä{¿˜~÷Ç_½êB0¬a‚iúô]ÀQ´ vs]4]ŒãÀ>MÓôzØTw‚Ôsß×”pØ¿ÿÎ?¼ øŸ½ê»ª}xkîûšŽ>ðãïýüUzóÃ[³pÙçîÄ­À™% ô˜¤@C=•ìÂ8°¹¾°{ï# àe ×–Û·Þ:€ ˜øðîönÓí[ïgšŒ,|xúç/·ÎÂ4Mmó¡……Øûáým¯|Ф9º ów€S´ÀÀX¸B W`àŠy­Ô4b—óizÿðê7ÐÒ¢q`S*A+ÖD¸Ò<€Mu-xÿðùXbQ‚0 ÍuˆûÂÒ7K4ï›BË+ZYÀjÑâ €Vº?ÄEk,–X½v6| X™Ø\ :¿.'h@+¦6× €@k3°ªØ 3qÀX¸B WºLdÐãÊëíñÙ%XàÒÇçëÖYÚ»Û»­³°XÁó•€v><<ð½4Æg*mïÇ…¶àñé²uìÀoáÀV`¸E`©½·†#xÿðy û#ÿ>‚›Ëùôò|½NO—ér>M·ww|Ñ~m>.°–z¾^ù~zÿ0}|¾~þL)x“ÌÇaŽa¦iŸw€F ¸×*H{ÿðùgmk¤±Ç`5EÀŽX¡[¡¡yºoÏO0Š1ÁÜz9ÿlgXx̳…ªlÜ,?B3ýy(yw{G÷:X#&=ÎHñ˜g ÓC\G98À‡ [aëfܰ¿?¿¿Ž·M­»4GˆÓšŒB°U…†•TJ«U…溄®´Â°¾×ø¸Û€t÷9|]z_Ú6÷÷’2*€µB5ûIåÅ*Fç 5õþüšà€õµj¨*Å8¹´­i´8ix¯Ðµñ°Ûé7¤ÒÐÆD½x‹Ÿ¬št!ðP¡k£¥€í´hy¬ÙÇ’ôÖl%¥6°‡ í‰~¯ôµvØÜ2Íp[Ò~[ÛC¥±¸ìªÙO‹àøãó5ÙU ~Ÿà€¾Öè«]&=§³tZ{i ,a*YSÉh…©d¶â©dñSÉ nïÏÚhå8À÷Âî„Gþ½ÇÖÖºæ[~Ð߯@;t!í½ A“a´öêÃÃ1šáðŠö˜`|(“}`à -°À=öë„-°p…®Ð…¸Ã0—:ïnïvÙÝ‚¸ÄhA²=XÁž+€‘|xxຠ5Ø‚y °Ž=ÞâÆº`>>ó!k¡åµ…®À€Ã{ÿ`^'õþûû‡W?–ôWìBฟÊûû‡î}W¶HsÏ»œê^ðîönÓn¥ôSËSóIkËв¼šã[³¯Ï×EeÛŠæ˜n}žda¬Ç.ôû]FÕví ¨ H· ^Sß^‚ˆš²­Qî5ï’ýLÀ¾ÍqÈš dkïÿhªâ¢^#hYǰ¥šnµûcªiú¦q.~´Å£”* |¯ô¾´m¸ÿÒºñúñþ×¶ÀÍ·­Ãà+wk<\/þ;^Wû~œ¯xýTþ´eËý¦UÊo|k¿&©}¥^kIÛÇåЮ“:FR׈š:ª©gëq€# ãƒTŒ‘Š-rï[¥Ò£±PÖt-©ÂS-·ñI#m®“Z–Kgþ{í“@ä¢X*0ÌÅR°œ[?§¶ÿ©àIù•þ¶¤W ¨Ke“¶×¤¯S“ÿš:’Ê×ò8¶Æ0¯²ÕÆÕü7Òªÿlj¿[Ÿµ­œ¥}YåZìRù[’Ní¶–´j[W—¦×KMYö4"]5uV `{ø\:œŸì%€)uÉðliíùØÀšrqÂñƒfŸaã1Œ¬zXË]«tnqÙ5IÁBn§Ô:¥[Ç-¤n£kö­ÉãZ<cKŽ—µŽíÍqD<–kîýX¸Ž&v ÷Kð*SµÀæ”ʉǸstîýð¿MzštZv†–ÆÑµo—z§?ØSz¿´«T¥}Ö¦/ßš¬JÇ÷ãóUµN¼lVS§šü•ÞȤ»¸5ë,Y¯Gàªss9Ÿ^ž¯×éñé2]ΧéöîŽ9‰¿6—­Ž½ÇTmÍCGRûÙóõZ¯”…ñÝÞ¬Öe†7òÇ‘p¼Xl'©€ÆCã!#É/Ž#íÀ\Î'nQ „Vðáaœqá𠬀–WÆÅuú¸`€; xl°À= ½ê™¸€-ÀÀX¸BXO7»œÇ€Ý!€-x|ºlÀ„{E«À4 ðˆ–WÀ^Ñ®ÀÀs‚÷÷oÞ»œOÓûû‡W¿€–õM¨– ÕK°ûîönúø|ýü{Ô}ì]*¬h¼ÔiÀ¦º¼¿øüSÚ.\'|/·ÒûR¾j…­¥©eáOø¾ôw«}jÒ؃E] 0× îë.PêBÚGnßáûóß-º(Ì­¤¹ÖÒðýR«j¼¯û8‚æ}`SZ´~Öì; b=ô­m‰>µ`ïºLd°f™Û7#!ìS÷‡¸J­±sài >ã~´ó¾¶4·†¶lMí3nu¥ìÕê-°q™ëÿ¬ñz©}äö¾÷…m)æâÀ1~ .—ìà̬të>^® kâ²¼¿FWk@)µŒ. R pÀté«·šz7·ž¶ ,sû8Š¡ØÚVÖ‘¤Ê¥Aæûðn¨vD—óiz¾4Œ‚VðáaÛ ð¬€–W€ñtX‚®ÀÀX¸B W`à ,\!€€+°p…®ÀÀ•omèíöînë,@ðîönºœO[gÀÀ`Òóõºu@½Ð  \!€€+°p…>°µý°><<Ðwk#ÔÇB+x|º¨ÖãiÙíQWhíýýë×=Î0MMzïïºÓ©´âc4MŸò=¯Û3Ž…¶àãs¹¥NÓš·ÅŰ¥ÜÅk¤r¬QWk—¯õ1ÔîoËc´ó&e‹ó=ÞÿšéµÜwj?£×/ÿ`xw{§ š<%s^Ã|{Ê¿µ®¼ÕS­e«=F{>ž-qœ ÖèÝí²Ð¹8õ³¤®¨'¤HwTR-øa‹w¼¾%ÍÔö¹åÒûaþJÛÖæUênÀç ÀR° qëÝÒà5Vºxh.F©ý-¹¨ÆïÅ;©Ÿ›æÂ¸–­ë*|?u SÛ¦ÖÍ¥›ªøuM0’;ZCáþkò:r “*©^rõ7ïOs|k^Kë•Î¥Ôû)Úï¤#ÝÙ°>X¥90 "Í-iÒÅCs1J½g½¨j.´[]´–Ô•5ˆ° Òߥu¥2ÄÛj‚K@SSÎR7íù7º\ §)Gé|³¤«Éƒµ¥UÚgË4 F[aàušÊOòÖ\Äj·K]|rûФY{Ñ]Ë’º²µå ÷© Hkꣅ%ÁÐÒt¶(oKk广—ÖûnÁc]¬ÂZ-¯Ó$H©€°6 ¬Ù®´‹Þ­5ëjšò}×Ú[ÕGMz[¦Ó»¼k©)CËusË5iô8î{¨[Ûb&.¥9jioÆ·´Kû°nW»˜&àèÕ»¤®jò¸¤<–trõ±öqmÕê¬MÇrþµ6§þ¤º@ÄËâíj‚4iÛÒ~sËKï×l»Ä’ã)´ÀV°¯© qêB’Û&·®tû¿v»Ò>âe5-ÁÚt[jUW© "^¦ ´–‹RÆû¶æ±”×Òûó-m95élèXoÙç>—Ömµû­Ýç’mµÛ-¹ ’›Ëùôò|½NO—ér>M·wwL³9}ðþöNÿ;Çm;Ôj-=hE\Ox=€Z`3>¿\v8S ì|¡˜´>>_Å‹ÉVZ•aÞÏ|\jÊšZw­‹›µþ´â}.9.ë~zžƒÚò¶ª‡Òù×…6_–º+mÛúÜ;rÙ`Rkå4é»´u!\_j½‹/š¾Ôúš|JÛÕ*•a~mÉ«t¤Ã.š¥:’ò¸ä| ×ɽ®ÉËhˆ¥e>§ÔRxä²—¶•ö9ÊñpLšר-°5z}Ù.mI‘Œ|ÁX£…k6j™Sjë¨uÙÖ¬‡ÞZ›–­žkóTöÑ%„𠣕j½Ô´HÕÐnÓëB¿f¦©oÀâ98 YËQÓòiµÖ~{§×;È©¹32;jÙKß»9½ÏMháær>½<_¯ÓãÓeºœOÓíÝÝ«eçe©þ‰³Ü²Ò-W©…IÓ·±&/¥eñ:–ühnïiºÌÛ—^çÒ´n—ÊGn?©m5ÛÕÔA)ŸÒrëvó²R>k—k÷n«éʱ¤šeÚr¥–·¨÷°Œ©s°æs¶÷²ç¾w—|·Àž¯×ªI R1ª9€]ÊòÄh_²–üŒV¼• ~–ÖÛ-xG=׎\ö˜ÇïVûf¹ëǨ›õMµ8hZXGú¢­ÉǨeÀ7ruT:?µz×ù‘ϱ#—=äõ»À¾Õ>´•vˆ‡¸J_š{øRÝCöNzRðèß­|º½ÓµÂ>ÒÁî,Ž¥¦l¬É(@/°p…®tïk qD–i"—”_ç±õŒ<©t–ì+4J½KålyLKÇsOŸ‰œÜx¦¥±l-ûo§ó`<][`ç Áüã}öë°óO«ôZ_\[îoÞ׈õÞ+(ÑLèa='¼Ë—3j—Y–kþ©ÍkíC9­ÊPÊ£´¼¦Žrû­ù<Ô–}‹c¯›úÜÇý^-ZÔQ¸­çï,Éóõú&Þ”ÖMŨ]XŒa͇Uöò Ìå 8ÃçìI‹–™¸fŠZßö o¥rKµ'Þb­ƒY+ Ú[ 5ByFȨ-°p…®ÀÀX¸Òý!®ÒÐ@¥±b½° ´uÙGž%K:ž-‡9²žŸ µ@?›L%[3©Wµ°Pö9Ï#fK´o•Î(Ç€£f­RpàeP÷RKá,5ëPM lj¦"ÍìIñ{µ­¾ÚÙšâ奲kfdÊå§t¬µy‘”ê(üÇÛŽ~îàÅ0ì4m })izT©eS ~ræmâ4S‡¯ã´jÒ–Ê M!«){núViºÏš|jò"±ÔXÇP¬Xx R·¢×¸®iµ––×´kö©É—eýš.¥–åÞ3…y;wÝPìÞõd¬éI­ž^‚±=ý3^s3ŒÖ|›ý,ypj˺í<áÜ ­®-°q_ÄišÞô…œyl%ËuûžÆëÏë„¿Ãe9á6á¾5é…ý9SýLs}d5ûLå_Z&•]:ž%Ú¼„Ë¥óÓRG`]XM?Gë¶£°”ÁR¶x›Ô>4yÑÜZ×Þ~_£ìÚ¾±5],yÑüCѲ~@ž›.À4ÀbFhá!,\!€€+°p…®tŸ‰K;ŧ÷‡bâqDk¶©ÝÎ’ž%#Ïæ%íx³KÓ —Çë´Ì{Òµ6?P^Zæ‘% Ë¿vzÖÀ¨¶^ÂñfG«Û^Á¡”ÎÒzàˆ†™È@;óÔèùR«ÞL;Õéi÷Y›ÏÖéÅË´é…Ç$u|4-¢¥ã©Í‹¤t´´ÉC\G½øö.·5½5¶“Z=½œR+«—20‚§ÓiÑö]ØšÛÅ©m§‰@a4µÿ,¹m¾å??£ýãÅçàÕûû‡ÅûØt­Pé­¹Ûø¹§ïãVÉÚò/M/ü;î?šÚ.µ¼´]X¶T_Z)=霖IÇS:f%Ú¼„Ë¥c½äá=¼úø|ž¯×éöî®êwèær>½<_¯ÓãÓeºœOoVš—qaÅ‘ŒÐâ:Bhͼ†3º© ^oïÞÞ½'€Fhù!´¶´ûÀ4À #Z`à -°p…X¸Ò¢vÓq`sÓqîááKYFtä´¤cÝr(ªRŽ\­„Ç .o‹ò¯ùÀ°d0K lÄvm ¯/ ˜ï]mYâc3šp"€\ým¥×ñ*Í7rýµ"MŸž#-öØ'w-°K.N^ZgK­3íÌQÚô¤ý†ïkZͬ-išÖum>Ã÷Ã|æ–çòSªm^$k̨¥-{*­-޵”ÿÜþÃ×R=Iå«)ƒ%-@{-Z`»w!˜¦ý^,‹ciºÒÜÔªÖôâ4séÅiů¥|ÖæEÚ§f»9o©±±aŒÊL\@N|â®,ÐÛãyõ£hÑ–ÝÐ Wh€+´ÀÀ•-°ÝgⲎCéeè$iüÎQôJ3´fšÑÖÇ­¡˜Zî·TGš1}X‹»Øù9ÿ¤‚ùÇ»Ú2ÄÇfTÖ¼Y±…ö¸Äëפn[Z§FïžJ¾‡ó °_îZ`—^ƒ—òYj}®iMÍp¤™uIÚ®ôºÄZ¾Ôû¹4µ3N…ïÇ-‹––îÒ6¥Ù¡J³cÕìS“Ÿ”R^RÇ*ÞvôÏ`|-Z`»w!˜&Ý-NJiZÕTkµež·‰ÓLý¾–¶KM«m=´–OÚΚÞÛIÓ•–dËù,ísI¼~¶û±d®Ù&l.ÈÒlãE*ø[ãV²õ¸´>žKæºï}‹½µTà¿ö>Gê–@ ·-°Gµç @j1,õ¸XÿÁjÕÊ)ísÔc@I‹ØîqiÖÉÝjöÞRç͚ǻW]ö¸e^[íç`$|þ­¸k]ãVëHrݤQæuÂßá²’Ò9¹ýi¶‹ûËÆý0Ãm¥²Kù‘ŽK˜NªRzH-×ÏZ:.©zˆ—åö-këy¯­Ûp¹”Ï%ç­´h½¹œO/Ï×ëôøt™.çÓ›•æe\èÆcm]äAžñŒP'#ä°Öà5ü›™¸œ’Z ר wãÀ¢QF@#ÔËy쟻™¸pl-Z` `Ð -°p…X¸ânØizûô»v,Morãj¶©ÝΫÔHKËm9î#òÝrx«ÒñÙó9È0a0†ãÀn2 æ"íýb“l^â½¼ó1jYïµÇ}½ò-¥³‡spe€½sÙkå¥e­Ô’6+͵d¶¦x&­šý-Ùg¯¼¤–ió#å©”×Rù´ûNåQj-Kš|–¬5K—tÌæ÷4ë„ï•ê§4ƒ™ti»R`oɗ柤Üþ[·šR»¿š–é-Yób=—¬¼}¿€gn[`jïÉÖåÓ´²Jy)kMúGp¤ó,——°µ4õìHe´ånØ%Å|ëH‘ºliäÒõöÔæ×cÙÀ«ãÀÞ\Χ—çëuz|ºL—óéM¤;/kÕ"¢½õi¹%<é–tîÁ›%·±­ÉÔî3•OÍCUR^R4·ÃkôÑ30„^IDAT–£TÚóSLפ©9Κå5çfn¿–~Ú–}ÖžK5õ$¥7ú÷ ìµ6ü»{ ¿öø€Œ‡2Ç=x#GÀ'– 6ŒQé •9€ÙCPÛ"O8V€\ŽB€mµ)À;oe!¿#äa©=”ö€QP‹8Ø’»Qpl-F! €@7´ÀÀ•-°ÝûÀ®1êˆ,ÃôtüF(©­£ÒúŽÙVÃaµ<6šz˜^)Î#XÂm ìÇçëçÍûY|©ü#ä¡déÌIµe,­o9f½gZ£^G*ÃhŸ£fýpd.[`sJ/©Kù,Ídi9ÒÎFµd©å©§¤ôJeÏmk=fÖYÝZÕAny¸N«z·³¶@jgÉ —kÊP3Û–&/¥ü·þÍïiÖ ß+Ó¹|ÎÛ1c€½r;ìnŦ„ùŽ/Îq™Â×ÒK›^øzÞ_œÍþ¥.©ò…¯séiÊž›2Õr̤í¬u$ѳx–õ¾´ Úc6rÖúåÎ9ëçÏšOØ —ãÀZ.Lñv¤Z(GºÕÚbßR še)k³TÖN£E”öi-“v»‘Ë`µÆ1[ãóçí{RܶÀŸz{8fÖÚ¬û´î¿÷±^£ -ò¿?ç-Uw{8? ·-°]âÒ´rH·…yð’ÏÚ’Rßɵ>Ñì/µMª Ö‡]¬éåò«}H[GÚ|Zê\S†œšc¢Ígi¿šÏ­”m—”Aó9*}¿´ØNûù«=fá6£@‰%ˆ cÔî,öƒQ 5¹â%øáXÀš¬Akø7}`Q¥õI@Oœ³°=—£`[KŸš&X_ï'Û{!ß#äAÃK>ÀŠQP‹ãø¨#Àž¹…ÇÖ¢–ÝXZ`c°èfÓ>°–iDG¦fx© -§V­Í—uß³–iÄù^3­ÑiÏùVu­¯4$¥¹¤î´c½¶cºfœãÔ˜¬­ÏÍc½öþ|yŽ À¸6ë;ñÎ?Z=æž·hU†y?óq©)ë’É jYëO+7ݦå¸HÖ˜¿¾5my[ÕCéüŒëB›/KÝ•¶m}î•ò'÷Ö¼XÓ“Ò¬ÍËÒÏWíú®–f‚¥-+áúRëf–§8]ÍŒL-fG’”Ê0¿¶äU:©ã™¢Ù§f¿––í>sï×Îr”ÛNzz_{ÌJjÏÁÚº-åIûY ß[×ø¬¤Ê›JO›¦æ3VÚ6—©žJßWµÇ«uY?GñòšÏÃ’ߤô-×ÛØÍ8°ó—Kø¥¶^„ïǯ¥/êÔ²Ôvñª´Ý’òåʺàäòS*{x̤us¤²§ö›Ë£–vŸ¹¼ä.ªµÛiγÚz(±œƒKêV›kZä¥ôÏ„ôy×ì×0ZÎÁÒ²š¼kò²FJéY>Öïëœ%×Û¦6&}Ah¾Øk¶©I»”§tqÑœq^–|yZ¿p[‹Úýæö!µŽpQ)Õ‘”Ç%çK¸NîuM^F»PKõ^«Ô’ÖºìšÏCO–¼XË`=¥íJõg=Ö-®úÙM l^_FK[‘$#¡Z[¸4F-sJmµ.ÛšõÐ[ëcӲŷd´z°”ÕZ†µ¶“ê¯g]ØÎ0ãÀ¦Z/5-R5´ÛôºÀ¬Y†iê{¡Üú¢Üе5-ŸV½[òÖJ¯wPsgd¶e«éŸ¥¥u´f–ì»t]É­@›q`o.çÓËóõ:=>]¦Ëùô&Ò—I·zrËJ·\µÿ¥ç¶©ÉKiY¼Ž%?RZ¥2¤¶/½Î¥iÝ.•Ü~RÛj¶«©ƒR>¥åÖíæe¥|Ö.×î7ÜVÓ•cI94Ë´åJ-oQïaSç ösV{œµÛÆË5ûl™í1±~δŸõ;¤æs”»®,¹v؆µ6üÛÀ.•ºÀx»õnÉÏheÀ[¹Àoi½mÑzyÔsíÈe?×¶ 6ŒQ7›‰+õŸuî¿ýðÖÑH·‚j¾G-¾‘«£VõÖûzä ö‘Ë~$^¯ÀÑ ; A­ÒÅf£=”aï¤'™Œç×`6›‰ °f@£Å(°è†X¸â²v~*Tz"Ô:`õH,eЛ–Z üßKË4µçßèõ°©ìš'½½‰ËÛ«î½/hÁ] ì<ßü“»HîáÉQëø°óOÖt41ŒL3Á†‡zh­Tö=ŽÒç}~í¹L0º-°]‡Ñj1½áè)Ÿ¥Ùn43yµPÊG<ûQi»pÙeÈýS£™µ§&­Ëï§ôº´½fŸKóªIÓ²ßÔþrç™6µ3Yµ,Cøºt^þ]VnÇ•¾ð=i‡ùƒ+iæ1éb¶išÐùöi¸NÜ*%MÙ« ©ã)-Óä«uâý¥^ÇyÏå9l]ãÜ‘ö#åSR*Cî<Ó”=þ-m—Ë{¸®·, Í8°›°š/üÜ6^¤ºHìáû(J­^޵¤TA‘T©KBëþÙk§Rw”Öû€=pÛ›SjµônOeÔÂ5ʱεj·õÎR©uÝš^©v {¨?Xƒ»X鮹u—ZãZó­þ¹ñrzÉg/5]H¶FÝØ»-°7—óéåùzŸ.Óå|z³â¼lÍ"4ëxùR—Zzrõn’ú°j_‡ïçöÝòœ)uÐ.¯©ŸÜ~[´*jÒ+=¤Vz¨&ŸÖãb)ƒæA´Ú@²ôËÉå%W†T:Ú2hÏ%/ßu°„%ˆ cÔî,`1Bw/…—|Ùç3lÅ´†3PÁKÐá%Ÿ€ãq7,Úñò„s«|Ž /ù<2êÀ‘ínèy¹zÉ'è£Å(t!@7-Z` `ÐM‹>°°èÆmØÜX¡kŒ!ºËPF#”_3§e Íñ×ÑŒ³¹•–C •Ž‹ôYÙú8`á²ì|árï0#Ζ/u\ÖR T¥¼Xò§ )·~˜¯=)ô=Ï zp×»¤ÕÈËàìR>K-Ï–VÆT«en¶ ÚôÂJ»~mþã2ÔÐÎT3[ØÒÙ“RÛ-©×ܶ¥Y¸jÒ §-°Ý»Œt+¸µ0 ˆš8Ø_KÁHmzáë%éÕN*¥W[†8Í\škÁ§YÓÈå3µLCÚÎz\¬ç£s×;Mù~|¥nÞ.ä©ò¬Ù-¢uz–nKËW“æ’n&R÷ Ë?X¥ízw‡ñöY‹ËX‰¥õË“ÞÅÒôj·ïY>kké4Éù´>(%mG@ À7v;lî–ñƒÚQŒ|l{=Ô׺Ew+|V#k1l×XéVëúÆænãçFVˆû~Ö)°“ÒK-OåEº÷¹Õ”O»Ô‡T*_*¸<¥ã²ôA´x;ëqYò`#kÑ{s9Ÿ^ž¯×éñé2]Χ7+Î˸xއ~úá8¬,Al£Õõh¡ž¸…m´ö7Â1!X¸œ‰ ǵÛQ°O-F! €@7´ÀÀwãÀN“üÔ|<¦g–²Œ2¢@˜÷­†k²ž ší–ÖMÈ:sWM^–‹VuWʃ4¾ó>Ï€vܵÀ†ƒÉ—”÷ÎlÌ?kËdÒ€ÿ=Yvë~¥:Z²ß¥ë¬­`÷KyÑœKÒvÖ|nÙÍàS‹q`»°Ö‹ä4ù vS·à×¼%ß2½R`¨M_Ú¯vÜ6¥ô¬ç‹¦ µÇui½§þ©°ü#XÚ®w—oŸi@îZ`®÷{ôJ·ÕÃ×kZ+½5ú¤®]Öãí(=j&®ù4ÖöeÜò8SÇeÖc4Ú±Ýú\l£E ìÍå|zy¾^§Ç§Ët9ŸÞ¬8/kÕ:SzÐ'”{hd5}$¥¾“µѤ¶Ó>ç%÷°UmzórmÝÆùÈíC:n)–󬔟P‹}ÖäµT¯ó¶5ugͧæÜå!.@ÌĆ1j÷ëáa„F8FÈ`,Ö 5ü›>°ÎíyT°?îF!@{­ÈáÜ!€±¸›‰ ÇÖb&.XtC ,\¡®¸œ‰K;ž¦÷‡?,c\¶.¯q6µÓœ¶RIšÒvIzšc&­³F¥ÙÏf?/ ±Çän&®ù‚5ÿ„`i™G–À),ÿyXšNî÷ù ÓÈ3KzkL%kU ¢[Ÿ/ôà²ÖÊˬ=¥Ö¹YjÆ%K‹šfV¦ÒvÚ–ð°l5õQ*—u&®pû0³¤§¡i-¥o¿¤Î[µÀjêU[G5wUrÛÄyì‹»q`KˆwáÅ8Zâ uøZºkÓK¥Y³]<•¬”ÏT^Ã2ÄË¥iGséÅûÑHKÒ+‘êV»]¼­5/Öó¥´¿Üy ©£TÝ[ËØ7w-°šà(ÇÛ…/Užµ»EXûÛÆû(å³u]”Ò“Kw“¥õP“¦¦õx-ñ̺·Ï;@Ï] l‰¥5Ñ“‘.ÊÚÛà=êaéq©Ý¾w=H­#9KÎ åôµÛq`s·Š÷Ô¶´õñi}k{¶ªïŸïùäµöær>½<_¯ÓãÓeºœOo"ÝyY« ¤ô€Pü~¼|ôਦO¦Ô§réÃX¥}j, —kòYÛOU“—T`\{[^“^ív¹¼JyÑ.¯íÛ«©‡ÍsµÁdéœ/åÓËçPÏÚþÝ=€öl„h/ÁßÇ ° KƨCv!° !`T»í x5Bà8B4¼äÐV‹>°°è†X¸B ,\¡®´hí>—4ÄOÍØžž± sT'·G–¦+¡ªÝ¯´µœ-‡x*åAË×óy@ŠËØÒ¦óOn°öùÇ3k0Õ²ì=᜖TK~4ÛŒp®”콜×h¸l]ƒ§Û§©®õy~ßÒkmµÖ¶„§òþó‘+g¬ig`«ÉœiŸ©uJ³C¥¶[R?¹m¥©y½œóÄZ´Àº `=_´Ã@$„RÓ¤†­–ÖÛë¥iPµÛ…ù.åSÊkíô¨RzÚ2h޵†´5ŸÖºÀ³%3pÍܰR€à-Hu‘¨kÞ’¦–Ôgµ”O)ÍöÚ¼hÅi¦^[÷Ó2Ÿµ¼óÌ×»g#$¥~ÊáëVûnµ~í>kZ@÷ôO[iÑëb­R 4ߺFÇçëqíøqμr×÷œ¦×O¨—fI-ó"×m 7êB܇³¶üÒ1«©‡Ò²¹ R>ÃeÒ­÷š¼Ôn—ëÛb(3k>—< €W-Z`o.çÓËóõ:=>]¦Ëùôf¥yVÉWZ³¯áß.º`ZŒK $ŒÐò9BhÍåL\8.Z`à -°p…X¸ânØiz;fjYjùžÆÊ”ŽAi›ÚíZÑNÇÚrè'iJÛ%éiŽé·€6Õ›káÚ‹ÞsoéÕn¿eùr­Ó#“Z‘K<”0ŽCŽ›»Å¼Ç vš~G¶Õ¹çý¼÷ž€M‹q`o.çÓËóõ:=>]¦Ëùô&Ò—µX¤¾Œñòš‡`¼< RÓ—Sê‹Yû Pj;iY¼<÷@•”VMz¹~µµ·å5éÕn—Ë«”íòÚ¾½šzÈÑ<0WL–ÎÝR>½|nmY[`ÿ»°Ø­¦íŒp,½#+ÀXR]$ïïÞĨnúÀ¢^«!˜0&êàUª[@ÊÓé”|ŸvÇpÖ1Âq!^ò 诶%6äî!.,\¡ 6óþþáÍ{—sºïëŒXl&VKÁë4mÐ+ ÿ£ï5·Ü ËH[—]3Žè¼^«üåÆ%]šžæø—ÎÓÖeÌíoëz÷fáÅ Öw9Ÿ>—¥Ñ½VºP|¾~þ‰ƒ—x¹g–€«gÙ¥Aôs¿ãõZÓȕݒžf›^çX)ˆÞË9ß Ç üÒ¯Ó4PXÍ…\Z^ÚÇ,­Ïóû––8íL\-Ò³´žk[uçuÃ@n­ÖzM‹h)½xû%uת6,W®ŒÚ:ª™µÍšÏ8¯Rž´ûŒ·×Ö‘4}²—ïØ›aØÐÚÉ-„eʵ.§^KOmzqšÖôÂeñ:Òt¤¹ôâýh¤%é•Hu¤Ý.ÞÖšk½—ö—1õwø:Uçší–æ3wNXÒKÂ-ê°áX)xÊ­ãíb“ë"±fš pM¥ô¤ !u¼–¦WR“æhÇZÒòÏz–oI>%Ö}zûî€QäfØÒ*€=rËÇå)è_š^íö[–oëcm!µ"—´.ŸÔÒ¿$Ÿ¥4}¤†Íªus9Ÿ^ž¯×éñé2]ΧéöîîÕÔ^Ï׫z¾Z` aŒZlýð°tcÔuº(óßÄzù…QW#O|䉘››»5Ub½|v”õ2¨T*£®B®¦šŸ˜®^ˆÃËóæcýæzœÿ‡éØ(,w.¥V‰âb9JÿP¸÷X^u"¢üòê@ó9\Œ KI”ѸÞÐ<ÑÆþ•¨¾Q|o1NþúÉ8z("jRÚf-޽½××kQÛx  ÂÝjvñ¸aÆ 6lØp×áFgŸ?×÷_je4Ú·}èÆÎS¼j•8¶\•_ZŽ™©™øÒ×ÎÆÕ›G"¦ » 8¸5ÌoĹ˳QØ¿Ør!©)ód,¾çÔ¨«1“ôZîvÕë—bæÀŠaÆ 6lØpÛáêÎÆÕ ÏFùåÕ8ûü¹xú3OG/.\,mÏ×8<Ê2êGPžùì3ñÌŸ>Ó& DDÜ\c‡6bvf6""Î}«ë…âŽIf7W£øÎˆÓß\½GºVäå¿ù͈ˆ¸ÿÝ϶×êùcks8eÌÝ7×q’¯uùåßÛõ˜»on×´­žkg×5(;̉‹ß¿ÕU£ü£r,î_¸¹±¹+o.Ç…ËåXßßýÈI³[·nÅËó›Û·nu¿ Ëâ{NÅâ{NÅÁÿí\œ«ÎÇW>ÓåÂýšž]ŒÿS1ª/Ç»>‹¿v:NþùjÌÿóÞÛjPãÔn­œÝ\ŒO.ï<µpvùp7¯Ž¨FùHáœVÆ 6lØpúíÔ6k™ÿ:•ÑM–2ê!gî¾¹íé[=×IûS¼¶—´³q. ³Q‹Z”«î‰ÙBÄ…ëËQØ?¿k–ßÜ7.lß¾xé‹ÛWü7þß|T¥¹¼ß”OÍDù¿‹Åcgâ‰/Œ~:ž¸ÜðB âÒ.ÆìôôŽrêe”¿y2N|ñj|ò_ŒÅ7FTÊ•øä'Jq˘*Ä£¿[Œ“ÿb>fc#J»}îrl4Ô§ÓüÇ>ópœ8.N|£ÚºM#búâÉß;Çß1ÓqõËñÑ—¶n”¿y2N~©O½1·âÑß/Æ£ÿb>¢¶çž¿ýF±íQ„NíÖv^{c™'~«þÊbÌ".ý׫ñا/Fe;Åâä‡ÄÉw/ÆüÔF|ýË¥xâk×w}>:Õå#Wã¥Fü‹ÛÏ?õ—'£ðÙÓqâs'¶çÍÒžÞ³nóÇT!žøýb<ò¿¶oûNmÑúýÜiÔç´6lذaÆÓnuŠWå‡å¨[xËR4Z{åÚŽÇåWË-OϪü°¼=oó<ÍÏw*£UZÕ¥±Œì× 4º¹‹…KQ­E¬×"Ž,ÏGiµÐöº“ÓÔúbù_>ò®!”‡bñØ©˜ý¹ÃñÒ§¦wœt쎓ß?}­ÚòT¢ò7OFå[—âÄŸ¯Fùõˆ#¿z$žýWqðá­à#¿{<ž~S9NüÑj\ÿ©B<úÇâØ«¥(þÙõLó—þËÉxì_Ÿêx*Õ¥/‹§þôBœ_­ÆÆT!Ž}°O½½G>²º½ŒòùKqâÏV£rs« •Ï¿©}úrTc&ýÃcñè;§{ ([íÖnY^{½Ìƒÿöx<»\‰|9Ê'>|,-\Ž#Ÿ.o×÷Ù·Vâßüñå¸úzĉGŠqú‹çZ×­CýO=—þ÷Óñ…Öbö͇â¥ÿ8ŸÛQF–öìôžu›ÿÈï§ï-ÇCŸiÝöÝÚ¢U[ôªU@)—¥áàÚµa£r½u¸(—ËÛó6ÏÓü|§2ú©Gs@é|Š×mÓSëSëÕˆâÛ£0UˆÙÂî_ôªûå#ïjùWwáb)~ùÈ»vüŸÕôþ™8ù»ÅXÿÁ…ˆˆXÿþÅ8[[Œ§ßY¸=~1žþ¥Züæóí^DDœøÌå(¯×"6kqáù 1ýƃÛãž|÷l<õG—£|³ëÕøÂ]ŒÅwÉ<ÿâtt½Îcå‘sq±µZœûr)æ8´cšÇ>wyÇÎì“¿2O}úrTnFlܬÆ>}1²jn·¶ËÈðÚë>ñþÙxê.nµC­§¿XŠù_ºóžü•Ùxêããêêã[ÿ”\7Oýi%NþÁÖ©iÇÿ`9.þé…]ÓdiÏNïY·ùŸ|÷l<õ™ömß­-"v·5ÀPlnÜùë4®ÕøÆéºÍ“¥ŒAëÝ®A‰ˆ¨•c±p=Ê?žÙ™é¨®W£úz5ì_m{”ûßýlË¿ºzXiþ¿“ò7OFù›'ãꙇâØL%þÍïß¹9Í3|5Ž}tk'úØŽËÿG)Ö»\,TÞ±Ÿ¸s§ñàtDéæÇ7ËÓ³™ç/oDlŸß""bvy9NýÙñ¸znëu•¿q"â§vž’ÖrVZÕ«‹NíÖjY^{c}N=r{å¿zhÇ´+Óço¶œµ'•o•¢ü¦•8±¼O½©}kwøÌÒžÞ³nó·l—ÝÚ"¢shMáœVÆ 6lØpúíllÞùë4®ÕøÆéºÍ“¥ŒÍˆ¥·=¸kÜÒÛÌTˆnes=V£\ˆ™b¬OŽÊÍZ¬ß\Ù˜ù¸‘ႚFõ0Ò*¸tR¿Ø{ñ×NÅCßùKTë«ãÜæbœzï¡øÄÕøÍ×~dqu#¢¸ÿÎãéý‹Ù6íélÄ“Gg:Nó쟉K_½¿|üöëzïé®å^jU¯.:µ[+½¼öKýê©;˸ý×8þðþ–³ö¨OüE%>ùÌ‘¸ô¥h•¹ûiÏ^æoÙ. ºµE7ëå³Q½~ɰaÆ 6l¸ãpK›µí¿+ÿãÛ;þÇuÜoo÷àÁwüíZN‡2§ß®CC¹]ˈŽ¥‹…˱±Y‹õÂá­›4æ£R;ÓSÓQ+Ôbq~&æ§vŸnÓMs(ÆýOžùl9ŠY‰ÒŸ_ر[ù§ˆ#oìr8£É§þv=>ù‡‡b~ÿÖ©Q~üp”ÿ&ûë<ÿ‰‹±øÛÇâ‰÷.Æl!"¦ ±øsâ©7$ᩈZ­뵈é7ÎÄ£9ÖµÜgþ¦©^x¸§×•E/¯ýc_[ÏüpœßjßùÅñÄÞyŸúÖãéŽÅÙBD¡ýÖרëûR~þ\,;µ9u¯ŸöìeþOýíz|ò÷ï´Ë#Mmß­-²¨_gذaÆ 6Üi¸YJ¿âõíK/EDÄ·/½´=}«ç:i{”ÅB9ßXˆÒjÓ/uí_ŒòÍõ8þέ_õZ¼¿ç.¯ÆztÿùÚNAdÐR«El¼^‰žß¹ûÄ×ÊñùÿûDÌþTö{f\ø³sqö#ÅxáÌJÌÆF\ø»Õxè‹Ùï_²±^Žw=ñ‰Š»³S•W+qú«wvôO|âR<û{Çâ©ùéXÿÑzœýÚ…ˆ÷¼¯s½¾x.Îþ~1^üÏ+[¿$õµ‹ïÌ~š,zyíW¿|6>ùÁÃñùgNlÿ2Vãk¼ôÅsñ…ãô©1?µ§¿\Нß×ÏûÒI?íÙËüþ¬©íŸßÙöÝÚ /µ!\âZ«E¼tᥖSÿÒ…—vMÛê¹vZA™ry{!.~?"öï…•¸üêz,ß¿3fâá~ ¦7»_ѯ,;°Çû@œûãݧÿ\ø‹R¬ÛyºM«òv<·Y‹§?s.V~íT,þÚ™8ñ™Ë;®ié:Dlü°O|üìVÇNÅ‘ß:_h¸Icåâåxßoœ‰Å÷œŠ•‡ÏÆ'Ÿ¿ÞµŽ±Y‹§?}.;Ÿ‰'¾ZîØ6ÝÚ­í2:¼öfç¾z1ŠoµoókŒ¨Å©/ž‹#Ç·ÊzêkwƵz_©?íÙËüÍmÿ±ç#âõ×`uj‹n¯%…sZ 6lذaÃé·Ô|W§¿Ôˈ–÷AY‡Ucuu=®Þ<¸ujW› œ|ÏF9´•U¢òj5¾ð͈©ÖTçéà{Šñ܇¢åÇžéùŸúŸÅâ¯í>ñ:ý[ËñÄ_®Fuz&ýè±8öãR?—ýÈZ7ÕëéüƺaÆ 6l8ÍáæŸ>þþÞNkˆ]?<ê2ºÞeº¶3û×£|s9 …Îac:ÖcùÍÕ¨ÕjW…½½Syù›'cc}=>öø¹øú;§1S>w2^øò ñØW‡·S>N޼ÿp<ýëÛÜ” Í¥_ábÔeôw£F`äêe~~¾ûÄc¢9 l_$_»Y‰‡ûy^ Go_Žg>ų̂k1tôñíá]¿âõôçžÞÓÊw¯'>òÄŽÇ-f¸~˜ /¥ó»äªóäö€$C@’! ÉP€dôPZþ5Žo5œ§nuj5}·á¼ê6©Rk»Q|ûÑ®n©Ö?K}û™ ®åÏ w³¶¶Ö׸<õ»Ü<ë»°°°«üVϱÛ0ÛnÜÛ{ÜëЋ¡ŸâÕíÈŨŽ$´[ný¹æÿ‡±¼V;–­vº[Õ­U}:MÓîµu+{óíeÛµ[n§ú´zƒ´Ë05¿¦úr_–ú·{-íç­—#™“~tèM_GPúÑj§k¯¾n\V»¡úŽâ^~[Ý­MêëunUÇæ×Öj¸ÛãAçEÛõ[Ÿa´Ë(‚r=ʪ—:¦Ò®@:ú (Í;ù)ìT´ Y¾…OYcýÛµñ^ŸÚ–Â{ÝhØõÉR^jmÑ9`{ǘëOŠm ŒÖЯAé$Ï``GgxÆ%Àí¥æ#Yy”õHԨߟv!¨Óc€¬öì¯!b\xŸZKåT¤,f”§ÝEø ýÙ}PFõ ë^-·Ý©dÃ^~Þ¯gïS§¶kõ#{!ïåô(ëÕ\ƨCJ]– åêöìJóNç°wš:]ƒÒêBóNå «n­–Õ|]É mÒîÔ£~ˤN{Ùv­¦Ëò³ÄÃh—Q=És=†^ê˜J»éØ·}èFTþá qâp5žþÜÓQ©TF]/2HáÛñQºÛ_ÿ¸óþ¥ó¥¸ü÷—ãñ>Ï|ö™xæOŸÝ)^Íz:Åkõ»«Ç/?°|¸ã´ä Å¾×¾ŸÞ·½_×ÊìÌL>|8Êår ¾ߣýº¡AÙhñ\a*¢R«Åìí\(bþÓÛçþz!¥ƒÿn_Ì<[×Á¼±Z{9*÷¿«³gó )Íuˆƒ±q`#®o^«ß½}õ…X^>•oœŠão]ŒéÂtÜÿæûãàc1ãj\å·.GùÕ×öä`ßOï‹+ÿãÛqð•í òÒÿûbD­Õêz<ùÑÇ;~ÈËår”_.ÇŽ ãŠÀÞ©ï×µ3»¿³o_ŽÅ7-ÆË?xyo*ÕF~§x5ªmFT¼³3bõû•Xý~e×äOõB<ñÁ#C¯ÆÕÿÔf'ùvÌ5œlÆv;|ýù¯o'Òë?ºó/—c5"ME”_.Çüù˜Ù?•ë•Xü¹Åeì±Ë—/G­V‹oÿ·—bñþÅ(fââß‹ˆˆâÑÃñ©ÏîžgßOï‹7nÄÜÜ\D„pÿáÃ1÷ï¿×\íx”dqq1ÎÿÝùÝ#öpŸ´ï€²±ÙêXÉm›·KÞŒ(DD"*?,ÇòËqìèòö4åëÕíóÜ.þ÷KËì±.O<þDDDœüÐɶó-?°Ü×òz­KDÄCïèÎ4qýÕ­#)×q%¼ñ@|à`xÓ˜žžÞž®vûš~Û¥Ÿ:ÿä'?‰{î¹'¾rêó±¸x”_ŽˆÍZ,¾uyë={y5>û©'cßOüä'qÏ=÷l_«R.ï:°[Û#%µZ¬ýÞñXXZŠ+W¯ÄôÔt¦jÑê ãÂTDLí 1µ›µ=Û¿þ”zàøûKqøwÂÈêV£øžc1›×_-GLÍÆöKßÞÅàO<þD,Þ¿Óû·vöWí<}ìÒåK±rh%.]¾”KH‰Ø õ¿ˆ­_D˜Ù?µÍZ¬W×#6#¦÷OÇba16jqé/Åbu1fgfcñç·æÛ¼RöR=¤4»ñÚZ¾ÿXöÏÆg?ÛÓ|ûÒ·w„Fç'ÿå+Q»XÚùä½³Qû«sqãcÄÜÁãÛÿíÛÑö@ÊT!bêvP¹­v3·êî^|^þÅå8÷×ç¢ø+Ç¢¶¹uSlFlÔ"Î>&޽÷xD­v§CªÉþõâè??³3³QØßºÕëá$b+Ì<ýÌÓÃYxÅ£ÅÞf،بmŒì"óVaãž{ܸ‡~ñp¦ ñ©xîìsñ +¿ œ$¢¶^êÅs-ÇU¿unëHÊÿò ñbéÅíÓ½N}ùLœüõ‡#âöïZÝ) ¥æ[éoè{Îͦ¿ˆ];ÓÅ_9O<þXÔnVãìWÏÄz­û÷Åñ÷?|;•¶vt§ ­Ëë§.±øs‹1óÆ™(üTû£2õ£*8¸u:Xóò­K“¯íëqáâ…¸pñB¼ðW/Ä õÂÇßx!^øÆ qá[¢üýÅ÷[—^ëÜåï'ÿó'qÏÜ\Ôjµø…#¿Ï}.>püÝË µËbí÷ŽÇ»ŠïÚ:³ç¶÷Õ÷ë¦ Q(ÜÞW¿ýë»±gûu¹A©mFÔjµxü÷>.EDÄ/ü³…¸zu-66·^pln÷–Û>öä./ím°ˆxè_=ÔeêÝOKÅOþçO➟½g;œ<ò¡G¢ú£ëqÏÏÞ?ùŸŽ¢ŒZùÕõ¸ü·]n¶ø·gãñ{gâ_û—ñ•Ó_‰³ÏŸÎ>§¿zvû”ˆö¥‡¾ØêÍõ(ÿ`5VWËQú»RœýꙈغ0|úgfcåŸ-ű÷™{gcþþÅX|óÖ=6†Y“ÚÆíú͈³ÏŸ³ÏŸí8ýì½³ñ©Ï~jûñ“}rà: [‡ÅÎ>6Î|õÌö5%w. ¯ÕîÔ3"v\w233sgüˆÝó³;¯G©‡“Ç?úx¦ ±ø¦ùXþ¹û…€1q6"Îý¸Ï}.f÷â…³ÏÝY?j21ݶ„ü = ÌìŸCï8Ë?$Ž¿ÿD<ý'Ÿ¥¥¹˜þ™Ù(LE\ºzçŽäë7wÀwÿôpßnïð—_.ÇÌþ™8ñÁQØ»¡7#ª7«ÛªWoV£V«ÅÆÍ¸þ£ëQþÁî;Òp¬P(Äúõõ;GCêävi’òì©gcqq1¢¶…ý³B @âJq."þúÜ_ß¾«üúŽñ…©ˆéBDL"ž P2z4ñÄãŵWnÄÁ¥…¸ú½µxâñÇâ“òù†Ÿ"nØ9ïót¦]óÝþ‰ãò«åxüwßšæfíÎNÿͨV«±~s}ëùªÅêwWãÉ?xr ÓªêóÖ6kÛd½º‹oݺ·Éybçµ:?µõ߯ÆFÔj[óœø1]¸ý؃_òjWþÜÜ\<þŸ‹G~µ—¿s9 ³3ñÈ|>¾ôÇEm³¶}ß“µWÖ¢°¿33óQ˜Ú 57nÜȵδvö›¥Xozn:"–c+œœ‰ˆK/Æ{g¢z³Å~àíK¶Nõºóô^]zß™eSg¾|*>ÿÌ©¨ÅF,ÿü¡ˆˆxúO>§¾ü¥8ñÁGîÔ`ØÜÜ'óæczÿôÎÆ¬5i:šQ­V·¯ÉC=ElÙyì#Eaª_9ó•ízÔnÖ’9­knn.>qê¯ãø{ŽÄ¹oœ‹Õ—«qäèÑ]ïU=¤Ü¸qãö{\‹Ï~*¶Ÿ`o}êowßhññ¸N^ºðRÌß;µæ³¥V«m]ƒ1’kQúÿ¯..ÿý¥xøƒ[7I,DÄü›ç·FLEœøõGâ·Îݾ8>ŸP°úÝÕ8öÞcÛª×ÃÇFmcû'|7j·ZlÔbýÇëñøGn%nÿŠU­VÛ>‚;îÞY?jR¿ ¾^¿íyGp‘üÜÜ\<{ö¥8ñÞbœ}¾—ÿ±GŽÕÕÕ¨µ¸AOãä8ó÷/Çã¿óᘛ›Û~€üݸqc×_DD9¶ÂÉ·/};ï_ì\H㥠-nÚ˜·áþÌpƒCïXŽZm#j›Q­ÕbùåGŽ=¶û×”‡ô3Ãå—˱ø¦Å˜?0¿ó†‰GO¦¯_‡2ÔŸÞ¼>bsëÂøí»oÞN¡õ¨ÕjwÓíáæ°²?3<77_9÷í8þîCqúkç¢üj9Š¿z†r¥›Æ#*ÍGWÚmé4]»qkkk§Ò–9 ¬~wuÇãå–·‡›X4‡‚¼CB»òŸo®?0ţŨT*C)«§#(Å£ÅíáÆ ä@†yªVcÝ€á(/ µ¼žOñV2Êb˜Ág/ë ôglîƒÒéhŠ‹â`2ìÉEòê²7>îuºneÔ/Žw‘<Œ—J·Ðj|ÖÐÐiº,Æ '0^Ææ/`ò%PœŽ$P„ ™€  ÉP€d(@2  H†€$C@’! É˜užÊõʨ«ähåÐJT*ÖóIf;“Ív<e¬®®Žº @NV­Œº ìÛq˜\¶ãÙ(èÄÃ'F]`ÈÖ__uØC¶ã0yzÙŽ—ΗúZFñh±¯ùR# @"JçK}IqúÌé‰) $ Nú=j^É$P !µ¨º #•Ë)^ ==팪ï¨/·yùg©«¾èjÀS¼Æ]n× Ø0®bmm­çù²Ì³¶¶¦:Pò‘e¼°°°ý×ü|ãÿÍÃÝæ`ruÚögéWòì3Zõ[ú)€ÞŒì”æo§Ú=®oÔëÃõiºÍÀäé´íÏÚ¯´×iÍýO§i;oîT&@m³¿kP S…!×d4rý™áNGQºm”›;hÖKÿ0Œ¾¤ù˳½X&ÀÝ&÷#(ݾy„CæLœ ºž¤IâÕ+ßL°š¿lsЧÍ<ø`\¹z¥ãpDD!œâ•Ù^üb‰£)wÛ~ànÐBÚ O’=;‚ÒRÚ=ÎúmT«ù˜l¶ýú`b8ÅkøÚu ÍÏ·{Üîùnó0yzÙö÷Ûÿ4kõ…Y–2²öYN:é÷W¼&ÅÈ®Aî(-Æé3§£x´Ø×ü¥ó¥˜ŸŸ™™™!×lo (Ð$Ï‹à=:)-Fé|©¯yëádþÀükµ·” ´þúú¨«0öò Yʵ‡»ÛòòrT«Õžç›„p! L”•C+±rheÔÕ O¶ã@DÄüù‰ýP&H¥Ru€í8ÀÝ H†€$C@’! ÉP€d(@2  H†€$C@’15ê 0<•ë•QWÈÑÊ¡•¨T¬ç ߨúqüLk«ô¥¼?ä}ÌF@™0«««£®“•C+£®lýǸ~¦µUúRÝò>f# L Ÿu€![}=ó´¥ó¥¾–Q&ǰúÓgNDZ÷ë8͹oœʲFE[¥/µý¡^¶ãw;`‚”Ηúî”OŸ9-¤04µÍÚöðÂ} ±öÚÚk“6m; (¢Núý–®x´¥ó¥X^^ŽùóC®wÍ­ÿ¶þ¿o!ÖÖìx·¤­`¿â0i6ûü»­Z­îiuI×¾}û¶ÿzU«Õ¶w¸ë¢V«E­Vk3×xë§"îζ‚NA˜4›Ý'nöíÛ·nÝjû¸«Íˆkß»ÖòùIÓo0Ùvµd! L˜ZøÆ•ÑÛØÜuöL=¸õT‚,r9Åkaaa×ß(5.?ºŒúõì0à)^©i·ö¶wÛònËÌZ§$û¡!Þzi«$Û£“1]7³dŸ0ë{:vï7]åv¥ùâ®……4.øJ¡¹êw‡æ.?¦>ªþ¡]ÿØËNWŠ}[ã/S KÖ¶J±=:É£­RÒï>ḽ ÏȺ£ÆI«n§ç[kW~§•¢>Üü\·z5ŽÛþÅ e4/¯yM%Ĥ$ëö2ë¶·qÚNef)¯y\ÞºÕ)ët{ÑߌòFyíúúˆìûwK[Z§u»SÛbýcïŒ$ dý0vúvûж Y¦Íº’Ô·êôºuV& Oý~[˜* ¹&{§—mo– ~ËëG§Ö|ŠK–þ$•~èØ¯v¹ùà_õ~óÁ¬mÕ¬ß}‹qn«IÖË~ã)·€ÒépkÖ•}…n­~—±×óпvÛÞqÚ–k™{V÷„ÎZJþ}N¨­òç)xÝöóO#»¥Ý‡)ëaؼŒêCîÈ 04c~Qm+N­ËºýÕéYdy}{ÛGݺukǯRõôñu$¯U}mó¬m5Nòj«Tô{ w¯dNñjÔîÐë^|˜÷r…™¤+ŽæŸ,}ðàƒqåꕎÃ…ßS¼"zÛ~ëô¬½”õ‹¾aê5”ì°±öÊZ,¼¥áWÖ&2@×õÝ^wa[A'ÉÝI>ëwØÓõ:¯Ã‰À¸h !í†ÇA/_êŒãö{Ò¾´ªmÖ¢¶Y‹k×¶n@xíÚµíçýÕ*m5™úY7S]ŸÌÈ®AiþÕŒæ‹Î³ÌÓNsýöïuù­êß­žåNÊFHÀ]ø­ë }Ä åí•N}g·éF¡ñHÞ•ï]Iòf„ÚjodÝ'̺ÏÖï~ã#—€’eoµAí6?‡ï³gYFÖz ûbL€^Lò7®ÃØFg}nÐm~ÝÊêõq¿ÏçbÈA¹—¶èÔ×'ÙgOð— ½îöó>Ú¿šÉàî# ÉP€d(@2 C¹Qc£Êõʰ‹ +‡V¢R¿m±þ`´Ré?†P""VWWó(€ V­Œº }ÓŒN*ýG.%"âÄÃ'ò*€6Ö__u¦ÿØ{)õ®A’! ÉP€d(@2  H†€$C@’! ÉP€d(@2  H†€$C@’! ÉP€d(@2  H†€$C@’! ÉP€d(@2  H†€$C@’! ÉP€d(@2  H†€$C@’! ÉP€d(@2  H†€$C@’! ÉP€d(@2  H†€$C@’! ÉP€d(@2  H†€$C@’! ÉP€d(@2  H†€$C@’! ÉP€d(@2  H†€$C@’! ÉP€d(@2  H†€$C@’! ÉP€d(@2  HÆT^¯¿¾žWÑL0ýÀÝmèeåÐJ¬Zv±L8ý9”J¥2ì"¸ è?ˆp H†€$C@’! ÉP€däv£ÆºÒùRÞ‹kţŎãµ_gÝÚÉfýèlÜ×ïogúÁŒûúÁ`¬zýÈ5 ”ΗâÄÃ'ò\ÄØ;}ætÛöë®Sû1Ù¬ÝóúáýíNÿ1˜q^?Œõ£»Q¯¹”ú›¿þúz^‹˜Å£Å(/Åòòr̘ß~^ûeÓ®ý˜lÖlÆuýðþf£ÿ̸® Æú‘ͨ×ÜOñŠÍÜ—0ªÕjë€öˤmû1Ù¬™ŒíúáýÍDÿ1˜±]?Œõ#“Q­cPæî›‹¯Ýhº¬eŒÄí7wßÜ®ç’}з/ÍëHãú1êíBãòG]—‘Ù£ˆ‰íGôОþ#i¹”ZÔr+{á¾…X{m-æî›‹µ×ÖªKžõÄ õjn—¬mã`õ£¾ýhÔ¼~Œz»Ð¸üQ×eöâ5Or?¢ÿ€öôiû#(Ûå·XÎÂÂBDD¬­­íš¦Ó¸¤ Z¯Vó·h‡ˆ†¶¸ýüÚÚÚöÿÏ5ê6§Ç­æƒžô¹~l›æßõ\†u¥Ó¸VëQ«º´+·]]î{õš'µÑ@{ú¤m@YxËB¬½²õaX{åöøÊÚîñÑðnv·çº½9v0í»ÛðöãíN¸©»Í¿kÙ—Û“ü?Á¤lõ#˼>³Y×£–;¿½¬Cý¼Öq_?rÞ.}?¢ÿÐÐ?ýGg#^?îŠÕs핵XxËBÏã&AókëeCÞ8mßL¸nëF§ñÖ«ñq7ö#úÈ—þ£½ü¯AÙÌñ”¦gó²:=î6í^)L:Ž´^×®]Û^ZZÚU^§6ìu¸ññµk×bá- qíÚµXZZŠk׮혶Û{—U·öc² ²~d™7ëgvii©í¸nËÉ:o?¯uÜ×½Ø.s?¢ÿh]NVã¾~0ýGg£^?ÆòJ}ƒ•õy¶4nìŸU]`œ´ûÌ6¯SÍF'ƒÌË`ô#½Ñ@ÿô½ÛkPÚ–Û✻¥·-õ6.%9_äØ8¼ô¶¥¸ö½k]§ëx^cÃãk߻ݡ}ïZÇév-²êsýØñÙluè8]‡ùZÊ:oªÛ¨<íÕ¬tz~œûý´§ÿHZîecscOË­?åê•íNãÊÕ+ñàÁ3{ðàƒqåꕎÃÃTˆÎ‡Ðm¿Vó·j‡úãÆé» w›¿]²Î—E·öc² ²~4ëÏõúYo5némKÛÛ‹NuìeÞ~^븯yõÝÊÏ«6ý‡þƒþé?:õú1–§xµÛØ7?ßø8ë¸,Ãã¢U;µC»ç³¶cÖ:d™öB§Ïa/ŸõvÓfùœg™×ú2|£èGƉþ:Óäk|Oñº[h?hÏú1Ù¼¿ƒÑ~Оõ#icý+^wííY?&›÷w0ÚÚ³~¤-·€R§]¹Ý¦ËúzõuÀÝb(GP²¨w:í3××7†Y§oõ¸Ý7GÍe¶“µì½8Dp7ëe[ßËv8>'kú"}@eõ»«;/?°¼=Üü K»WsgÐnžvÜNF±ÁlWçæ¶ţŨT*C-³Sÿ1L½ôÝúœa,+~I_¤j˜ýGOGPŠG‹ÛÃØ« æ^jn·¬N!«®±ÆEé|)·²Ûõ)FŸ“ú)Rú:`†Ýô|Š× Ë ‡‰[ŠÎS§ºu{ ãÒùì¥qÛ6úåÛ^÷[ýÐ×)Ú³û 4oàZ]9hùyév!%Ã1È5í¶ÏwÑaÐשس‹äÕhš/Ìr8zeµ—úý^R×íƬÛãNãúùB¬SÙÝ4_ ß\f§#ƒ,·Wú: U”¬¯wºð½Ýx.¤Ïò¸[}{YV·q6ؽɺÝìu{Üj\¯ÃÊîåG^Ú=ör;M«¯ÆÍžâЀ$c"ŠCÎ0&" “A@’! ÉP€d(@2†~'ùÊõʰ‹ +‡V¢R¿m±þ`´Ré?†P""VWWó(€ V­Œº }ÓŒN*ýG.%"âÄÃ'ò*€6Ö__u¦ÿØ{)õ®A’! ÉP€d(@2  H†€$C@’! ÉP€d(@2  H†€$C@’! ÉP€d(@2  H†€$C@’! ÉP€d(@2  H†€$C@’! ÉP€d(@2  H†€$C@’! ÉP€d(@2  H†€$C@’! ÉP€d(@2  H†€$C@’! ÉP€d(@2  H†€$C@’! ÉP€d(@2  H†€$C@’! ÉP€d(@2  H†€$C@’! ÉP€d(@2  H†€$C@’! ÉP€d(@2  HÆT^¯¿¾žWÑL0ýÀÝmèeåÐJ¬Zv±L8ý9”J¥2ì"¸ è?ˆp H†€$C@’! ÉP€däv£ÆºÒùRÞ‹kţŎãµ_gÝÚÉfýèlÜ×ïogúÁŒûúÁ`¬zýÈ5 ”ΗâÄÃ'ò\ÄØ;}ætÛöë®Sû1Ù¬ÝóúáýíNÿ1˜q^?Œõ£»Q¯¹”ú›¿þúz^‹˜Å£Å(/Åòòr̘ß~^ûeÓ®ý˜lÖlÆuýðþf£ÿ̸® Æú‘ͨ×ÜOñŠÍÜ—0ªÕjë€öˤmû1Ù¬™ŒíúáýÍDÿ1˜±]?Œõ#“Q­cPæî›‹¯Ýhº¬eŒÄí7wßÜ®ç’}з/ÍëHãú1êíBãòG]—‘Ñ Fÿíé?’–{@©E-·²î[ˆµ×Öbî¾¹X{mm ºäYÏA Z¯ævÉÚV0Y?êÛFÍëǨ· Ëu]FAÿ1ý´§ÿHÛØAÙ.¿År""bmmm×4Æ%eÐzµš¿E;D4´Åíç×ÖÖ¶ÿo|®Q·ù;=n5ô¤ÏõcûóØ4ÿ®ç2¬+ƵZZÕ¥]¹íêr×Ð Fÿíé?’6¶eá- ±öÊÖ‡aí•Ûoà+k»ÇGøÙ}ÜžëöäØÁ4¶CDìnÃÛ·;ã¦vî6ÿ®eg\nOòÿ“²AÖ,óføÌf]Zî÷²õóZÇ}ýÐt¦ÿÐÐ?ýGg#^?îŠÕs핵XxËBÏã&AókëeCÞ8mßL¸nëF§ñÖ«ôé?îÐÀpé?ÚËÿ”ÍÏ!nÚx6/«ÓãnÓî•ÂT¡ãøAëuíÚµíᥥ¥]åujÃ^‡_»v-Þ²×®]‹¥¥¥¸víÚŽi»½wYuk?&Û ëG–y³~f—––ÚŽë¶œ¬óöóZÇ}ýÐt¦ÿh]NVã¾~0ýGg£^?ÆòJ}ƒ•õy¶4nìŸU]`œ´ûÌ6¯SÍF'ƒÌKôýÑ@ÿô½ÛkPÚ–Û✻¥·-õ6.%9_äØ8¼ô¶¥¸ö½k]§ëx^cÃãk߻ݡ}ïZÇév-²êsýØñÙluè8]‡ùZÊ:oªÛ¨<é?£ÿ€öôIË= llnìi¹õç¯\½²Ýy\¹z%<ø`¦q|0®\½Òqx˜ ÑùÚ í×jþVíPÜ8}·ánó·«CÖù²èÖ~L¶AÖæÏaý¹^?ë­Æ-½mi{{Ñ©Ž½ÌÛÏk÷õCÿÑ™þCÿAÿôzýËS¼Úm蛟o|œu\–áqѪÎÚ¡ÝóYÛ1k²Ì{¡Óç°—Ïz»i³|γÌk}ýG6úèLÿ‘¯ñ=Åën¡ý =ëÇdóþFûA{Ö¤õ¯xÝ ´´gý˜lÞßÁh?hÏú‘¶ÜJñh1NŸ9ţż1JçK1??333;ž×~Ù´k?&›õ#›q]?¼¿Ùè?3®ëƒ±~d3êõ#×#(Å£Å(/幈±WóçÌï§ýºëÔ~L6ëGwã¼~x»Ó fœ×cýènÔëGî§x-//GµZÍ{1c«Û›¯ý:Ó¹ÜݬûúáýíLÿ1˜q_?Œõ£³Q¯¹”ùó6Ð~Оõc²y£ý =ëGÚÞ0ê Ô (@2  H†€$C@’! ÉP€d(@2 S½L\:_Ê«L0ýYe(Å£Å<ëÀ„ÒЋÌ¥R©äY&”þ€^¸H†€$C@’! ÉP€d(@2zºQc?ÜœîÑîm ÇIDAT«3÷€;r (¥ó¥8ñð‰<1öNŸ9-¤Àm¹”z8Y}=¯EL„âÑb”Ηbyy9æ̺:0R¹Ÿâ›¹/a"T«U€»ÞØ”¹ûæZ>ãµm§¯k7 ŒVÜÊ^{m­§åÕÇ­½¶¶cº<ëd7¶GP²”½°°kkk;¦_XXˆµµµíñ ÷-Ü™™‰ ( oYˆµW¶BG=ˆì˜~3b핵;ÓêZ™üßc½{¼ð–…]ÏÕCIós­¦Ò’ÿ5(›ù]ßqíÚµŽËk^v»qyÖ±›ÂTadË€Ô¼aÔ¨›ØkPÇ/½mi÷ô톀‘É= llnäVövðhpåê•íÿëã¯\½|pG]‡—Þ¶´=M}þvÃÃV§x@ÝØ^$Ÿ%04N3¬a ?ã}Š0QÆúW¼€É’[@)-Æé3§£x´˜×"&Bé|)æççcfffÔU€‘ËõJñh1JçKy.bìÕÃÉüùQWF.÷S¼–——£Z­æ½˜±%œÀ¹”ùóvÀ€LÜIH†€$C@’! ÉP€däþ+^îƒÒY·Yj¿ÎÜ`²äPJçKqâáy.bì>sºíN¶öë®Sû0~r (õëõ××óZÄD(-Fé|)–——wÜ/FûeÓ®ýO¹Ÿâ›¹/a"T«ÕÖ;ØÚ/“¶íÀXI> ÌÝ7·ë¹¯ÝÈs:ŠG‹y-bb´j#í—Mé|)æççcfffÔU`r=‚R‘ç"Æ^§»Åk¿î:µã'·€Rß¹^}=¯EL„úÝâ———wÜïDûeÓ®ýOù_$¿™û&BµZm½ƒ­ý2ùÿÛ»cݶ0À' ƒGGƒrè !ˆš§°¡oÒ&oѸ}‚ŽÉc8Cçt³ÓIC ðxKêàJ¥(’:Ú¤u’¾LÝï~þ\øC$]›?öJÊðl¸öýËÍ—ž‚‰‹a¹þðl¸“XÖ”ò—DL-ÅÆ¼Ç@·z/P¾‡ïýùYf7³µ¶áÙp£­OåŠ1o‹¿oUëï:¦¶f7³è˜÷íØèVÿ¯¾Ûò©3›ÍVÛùY¾ú»Ü.~–ímûÖæëëÔÅ3_ëO¸Žbüj—¿B[Sn“·º±±s”sY쯋«|Úä€Ã±ó[¼fÿÌBžç«í*yž¯úÖ¶È×ö‰íÛX9¶X”â/J›¬Wå¯ÐV—›¦¾6ÇRÛfŽÕ÷ŠœVÅUybøW£%‰Ë»âEoñ{¹¿‹5R’çl´µýèMÇÕõ1·Yë)ãªÒEnxzý?ƒrÿLÁt: !Ü*Ëíª9Šß—EMU_›µëö‹]«“g'Š«ª­)7í+šN§«ã.ž“¦}ºŒk›6¹ };ÿe4m\ø¶ñ˜}S^+%Ëã~ì¹€m’|H~­-Ü_×õ÷«WîÛ²^ëµð`|´ØX»ê+}ºÈ}y¿Ø9=$p|zÿåÛÝ·Æþ«ë«0z9Úh+îWSì+ïÛ·-Ϊí¦ù^ÿø:\]_5n„øÛ’ªb®‹5¶¯Mn’ûmqÕÍB£—£pu}Ó6¹ };¿Å+„Py;¦iߘyËãê¶cchÚéëí×ÿú ÏOŸ‡Ë—!˲úW G¬Õ6öØÜ4m¯·­­mNË<°Ÿvþšá'›c_â±â1Љ¤ÞâUåÓ_Ÿ=Ç>;´c?öó @³Þ ”Éù$¼ÿð>LÎ'}-q–·wžž®µË_œºü°Ÿzýer> —/û\bï-/®³ÙFŸüm×”?öOï·xÇãp{{Û÷2{kÛŵü5Sœ–Þ ”ìEæòä€cÒÿ?jˆ¤@’¡@’Qû Êç¿??eÀ™œOÂ|>ßho|H~üjÜ[@enñ’¡@’¡@’¡@’¡@’¡@’¡@’¡@’¡@’¡@’¡@’¡@’¡@’¡@’¡@’¡@’¡@’¡@’¡@’ñ¬©3˲§Š ¾@¿‡ù|þ”±Gn£@¹øõbqü_ dYÞýöîѾýåm'óéêëºU \þyÙéÄn€Ã×uá-^@2(@2(@2!„Å›Ÿßì:àÈ]ü~‹Å" ƒÅ®ƒŽÛb±ü Ï€àoó*?WIEND®B`‚PythonCard-0.8.2/docs/html/images/resEditorFig1.png0000644000076500007650000001001410277403055022027 0ustar alexalex00000000000000‰PNG  IHDR,í·åÂsBIT|dˆÃIDATxœíÝyœÜu}Çñ÷B­ öamkûðèà PP1Qƒ‚œ"U£€‚ŠrGîK$ÜA$Ü‚œj‘€‚'J$‚Áƒ¢Dû¨Zë£ÚÚjÈìoóû}gòÛyåwÌlcÙCKûc0çȳa’lúÒ“=¦ˆ¹sç&I3 IòÝo?0iƒ`ê™6Ù`jÚpø„W¾å†Þ®¡‘4šÿôg’F£ÃŸ…ùæªþl~£ýŸ«ç+­»Ã²ÆºîÑæo>®Þ,««ù ÏEyݱ ›èºl¶¿5»ý ü¯c^²Ñ÷‡|m€’–=o>4OúÓ?Éï—÷eE_Ò—dú´fѧ¯ü¿üቾ¬ìKþðÇ•Ùhú´üñ‰•éû³³á²{²Ñ÷œOØ{«§–ï»ýöÛçž{î×ý<ï¶žŒ£9Ãu Èïÿ}~÷øŠdƒ¾¤¯‘ ¦7²¢¯/ËW$é[™4¦%•™õÂgdñÃÿ•f¾ _\:3<÷úLøî46ü‹ò€Ö• ”n¹íŽžÝ¿×ˬc@ææq/ ¦’Ͷ˜9ê<ËZºF²ZÇ€lùìç%Y>ÆÅMÏßîËw†M}ü—´Ìù”ž_oa’äi/>bŒëY;üà˧¶þ¢ÏZÃ#Ù}7ÍI’l³÷¥²ü;¯Þ?I²Ó׿Ž¿;I²ËA×y9·/ܧeÚ›Ž¼)Ÿ¼p¯$É›þD}]º~îZ¦í?÷s#ÞçÃ'í”$9èœ;såû_Ÿ$9øÜ»z?8è‘þ N§ét>’dÕ®Fí~ û^ÿô noзbÈ\¿ýAóEëÉ/˜ÓrEÃT÷üמžF£‘G¿tJ’ä…;œ¹ú*–õÈëß{MO÷žG||ÈU-o:ꦞm3;kÏ$É;N¾}ÄùÞuÚg‡n¯#8ðì/¦9¼õëï5o¤önöP/g³-ff³-f,s¬ñHF HÒŒC_VǤßà–þhLÏO<ÑõÊûýï#ÍC0oÚ<$óËeùþ_¾äè$É/¾}AË}ÿêeÇ ÜþÙ7çu\ÇO8{È×ÿª$Iþíþ3“$ÏÞú”üø«gä9Û4÷*~¸dü‡«¹ó¤!_o¶ó9I’‡¿pb˼[ì~^úìêDzåç'I¼ý˜–y·zÓ…-Ó’d颡{r¯~ÛÅC¾þê?–$ÙvŸË’$÷~ìÐ!ߟµï-Ëüòu&I^÷î«r÷µ$IvÜÿêÜõ‘÷$iÆcðH¿/\ù®$É®_?0ís—ï7pû ‡ÝØö1´3ÒÈÍçÏòõ^Çß:â²ÞþÛÒHòÑU!Ù÷”Ow5†kNÝ5Iòž3¾$¹úä“$œuÇ=~Wœ¸c’äywYΥǽ®eÙ8 ž5ðõ}eàö…Gl7dÞc.ùj’äüönYÎñ—-I2ïàæ Á‰W6yŸsà+“$']õõÎõÎàˆ ž6]\Æ»rÕÝXži+ÛäñG/Éc^œÇ¾qË÷žöâ#ò´UñH’M6;*›l~Tž¾y3ÿýùCæÆÇæ[6_lÿóÁ%I~þ­ó’$ýŠò7[вŽgÍ8)7³ù_’üäkC3ýø¾3nÿhÉéI’çn÷Áæ%»ÎËKwkFï¡ÏŸ-vÿP¶|Cóñüó§2ïË÷œŸWücóyøÆ'j»Î™³dæì…yÕ[›‡ïÿÄû†|›½/8ŒµäãÍxl÷öËóšw\ž$Y|ãÁ…GÚÞ.]—]º~ȴݹ!»Ú Çg.Ý·ã}o[°O>µ`ï|ꢽG\Ç¢Uñxëq‹ò¶ãnI’ÜtÞ›»ß;N¾=ûž|{nÕö¾ûžòé4’ÜpÆy穟˜>üÖþ§>לºk>rÊ.ópækähå…‡o;ñ+a½4xïcðá¬nuîM[¹<}}+†ü\=ùùs^ {´ud°_-»(I²ÉæG¥‘Fþçáù#Îߟ>ÐÜèßûø÷¥#Ǥ—6Ýéì´}r=pK33g/L£‘|íæÎl»·_ÞòNàv¾´êðU’ÜuÍ{Ç9ÚÞzëq‹ZÞ ¼× ·¶¼½Wí}ìwêgÖÚ3WG-\ÒòNt¯áç<†ŸéÆ(™–æÆÚí!¬dÃc?ÂÚëµïúðÀyÞ}UÒhäîUÙñ=™²'Ž?z擬Þíýàs $WŸ²K®:yçpÖÈ×ÉÃ`Nt¯éËoÛ0owb}4£dlñH-ç@†¾J’§¼ð}I£‘§®º”wðIô7;2¿ZvQ~ùðØc=óåÇççß:¯í‰ôgÍx~úÀ9]ïyÌn ó]—í¯ºýõbYëãö׿¾½·zjùà‹/Î=÷Ü3®ûþ(“^,§ÿÃû§w,Â3·9'O<±|õÛ=Ý­°ñ‡Ÿw?3À:n´™èû÷z9ƒu Èo~ö£dØ›‡ê|hkÚF›ŒgL ò²7^°ú_…À”²ýöÛOêý{½œá:¤1mz’é²R€õA§O±]Ó&j~%-{ _¿e¿vóSV_‡Û0>ö@(J€ ¤géÕ[ì§Êza¢Ù¶YÛuþÙü_ÿô‰Ði}#ÍßËñŒeÝk«‰x.*ëÌç¯ÓXÖô˜Ú­oªnWÐoLçÞ&òS$Dzì^Ž£ò¹øëªáÏEå¹YŸËµqL0ÕŒû÷´{AϯHìv#£ò»}Û-g´u__ÿ´vŸ³?Øð䑖׫ù{õ\ô?¾Ás´õ¶û»ëø«¡“nÆ4Úí^éqŽôüÀdS@ºÙ{ñ/ÖvëëôÜ.&õ6ÒcíŦÝýºYÞxæ>}"Œe½ã}¼Õñ´¼^n¯£étȪ›1¬©1ÂXŒûV;ý™õë³õí¸ùšx±é9íuÌ:­w}û{eÝÐó_i›xáŸHëÓsÛ‹C’cYÏdZÆc5áï™jÿ²jwlm5Ñãl÷\LÆá“^ÆM§s7½Ú éÆTÙþ ç{ Ã_tÆó×îœËh/ðíNbU§Äãylíî7Öågþ^=Ý\0Ñi½cÿD_ŒQÓda²Çí´üJ[zo]=é¹®>®µç™µÍ¨¿Òv¸Nÿê_ÓW¬Læ Õõí‡x]8”2YÛQ·ãHÖ¿íŠu‡=Ƥć)P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%@‰€P" ”%&Éܹs'{L1Y³fõMö ˜zþ'D›yÛ(IEND®B`‚PythonCard-0.8.2/docs/html/images/resEditorFig10.png0000644000076500007650000001336510277403055022123 0ustar alexalex00000000000000‰PNG  IHDR•AúŠ»sBIT|dˆ¬IDATxœíÝy˜ÅyÇñ_ I9°CûÉcÇŽ£-ø!ZÀáÑÚ&C qæ0‡00Þ,— Ù8æ0÷%p³k³"¯`e “›<>pœpÈ&Ö1ùc¶g{z«{ª»k¦ù~žGÚ™šêîêÝ™~ç­ê®öÆFGj £¹óhª$͘9+ï¶JlppP’êAE’V¯Z™[cÕ05øä¯çÜêvížäÕÿ ü”äy¡Ÿ¶õmŠ~¿~£j´¹¦Ž iúéF€8‡í²Yêeûûû544”iù._î¤þz‚ŒAå·oÿN¿}{ƒ´IMªyÚdš§ µšÖmTÛ(yS$o£fo·•†_ü•>Õ·­éÓ&¾EÓ^|LÞÔw§n(tƒ4ãØK—¯p¶¼ëõøŒAåùù›ëõ·6Ô;kï0”¤ñ´Ež¤š6lxKçìöÇÚ°ñ§º¿÷!Ízô ½PëÞ3”×<öeIÒG÷¼8ç–T×ýW*I:ðŒ{rn P qxßœý÷ê@KêŒAe§}DÒº„«š¦«jz!{› ç?¾ÿ“ʶé¿0v™=z¾$iûO_¢Õœ'IêÙëR'íynÙé“Êf͹ÆÉº³xä†/H’ö:þæÄË~gñ‘“Êö?íÎØe–^u°$é ù÷ê¾+’$|ÖÒÄÛªnÆÌYVIOoŸ$iltĪÜÄ<¦"i<%Q M ½æ—oÒx¼ImCË –Ù_Íl>«#Æö{^Ü8ë§]v9àjyž§g•KO+D`Éj¿SïámΙ÷J’*zB `m`` ò5ÿúc£#êéíSOo_#€$ (RlP‘꣦‰ã ~Šý@2M›¬_ßTkíO–H’Þµí\½õÒuz÷v§J’ÞüñµMõþtÆiÇ¿»ºéµ÷ìx†$éõUW5•oµÓY’¤_>¹$é};[’ôóç.“$ýù. ô_Ï.”$½Ö¹zmå%ú@_=cøé3ÍÝSÜýIÒ«O]ÔTþá=¢ÿP¾—¿ÀXÌT|c+Ε$í°w½]/<|NÓ2½ûÖ÷å‡ÿTß·?{¥žðL}l¿æ}3r_ýw¹ëÁ×ê™{OÕn‡\'Izúî¹Mõþæð¯K’ž¸ãäIë˜}ÔõÇC·œÐôÚ'ù–$鱛ޓ$íyìú—ÕßwS£ÎŠo#IÚû„oë»ßü{IÒgN¼E’ôÐ7Ž–$í{òmÖû´lÑaÆò`¦â»÷Š9’¤Cήg,w_v`Ó2‡Ÿ»L’tÇ%ûK’Ž<ÿAÝöÕýtÔ—´nPD®®5 –`™­Ae£Bƒ*1ÖiÊÆõÆWÞ~iqãñ›kê¹Í>ú%ÉóôÆ®Ñÿ®¾F›Ï˜§ÿ[$IÚb‡Ó›Î÷þõx@ù³Þù’¤×G¯Ô¯~x…Þ»óYí’^[9Ñíô³‘úAþ/v=¿éº„WŸ®”¿üøW$OzåÉ õŸO ê#Àòï÷é¿P?yü+’¤m?y‘'ßùûKÒýå‘ç?H÷ÌR‚]a6,‚н)שVÛ`u,ð3•àAzóž‰lE’þû…¯5º¿:ÅÏTš®”-(LEj~¦Òtu0€J g(á1–Vb‚ÊÕ©­3uƒ¹û+‰-zN—¼‰lå·÷‰·è»ã™Ê>'ÝZìH ä ˜%ízrÕŽàvMƒ÷qb‚J²€"y‘c*A²Ý©zsÍu“º¿‚c*¾-w}ÜMzä†/4 Ô'SùÜiwiÙ5‡éEñc)Í¿O÷]yPÓ@ý¡çܯ»/;Pw-< Qïðs—ÑÝ…ÊIr†Wœ¨ ‘$¸yc£#5ÿfBɵ// TY§z€iÕS¶Qó¯NK.ýš¦Lßr|íÙ'Š ÿœøÁ„’YöÙÿùäõ³¿üúv´·qØI·¤^J2¡¤ýû!Ý>‡ëµ¥½ã+?l—ÍR_É><<¬¡¡¡¦åmn_²zÕÊÆòÁiZ²´Ã_ÏŽÓ×4ÊŒ‘â}¿Tëׯ›8ñË3ÕšÌ{çö• ‹Ù\ o»|–uemG˜1¨¼ùóW¤Ø £»Å¦Lß"k›ÐA{ñuM|Õj½O¼%ðí@®Ë»^O1¨xS¦Išæ|cg÷ÍC;ÚÁýTÎ4e*Ï.=:¯vè˜ZÄc ;2€3€3€3€3€3V³›&K:r'…'g ζYÔ6&¦‰óxóÙ-ë©ïËò¦*[ZÉëýÜŸØêŠî/>ÐÖ™Š?§~ÔÚt?ãp™i®þ$÷Avù -j»qm$8¡HL7Sò™Ê‚å­ê‡»ŒƒŸ½$Ÿtgw~ ¿¹ÂisøMi R­‚†Ë7«i»­ÚH7ò¢Þ›Q]W6Ÿ=ÓúMõ¢ÖÇ礻% *qÙJÔËZI»\VQ þþ?`á2 “Úõ¾sù™ås_âL%Øå3}{I²¾N‹k¯)p¶êúÊ(íû9îî€|NP¨úve-¶ë ö ûMe@ÕdÍZøœÀ—jL%üÆIûF2­'ŽÍ· S[ÂËDµ×t2AÔ @‘Ä}–Lå6Ÿ½¸¬=n}|Nº[Ó=êT ÝQèÿõ…êþ”A¨0²tAà Aà AàLËSŠ—._щv¥300àü¬I>o(’4ïq«ëT†‡‡Ó´¨¬Å‹¶mÝ|ÞPißãÖ?>ûÚö©6 ¹¡¡¡¼›€’Ë’EÏ· õ²Îf)ËŒ™³/388˜i›©‚ÊÚ——4=ßtëS25"m\m·ûT…çyªÕjy7ã:=[J곿6Ýú”Æ¿ðAÙ$XǦ~Üz²,%¯ý€*)Ý)ÅþP<΃Jø[{Ô7úðãpâ?Κ™dÍ"ж?èNžç5þµ*—%}=n½Iê£;¥¨m3‡`=ÿqxl$ø<êq¶Ë”eÐ}Âcþó¨rIŸÁ²4¯ÇÕ‰kŠ­³W§*QN—:yЭÚþ º:1€/¿àÕÚXJ7¦ ½üÌÃÿ‡ê0Ý Þµ¶•ªTmPNt/!¨â:°8S ž’kzÔ‘©hÉfBɨ:áò$ëÆ']O\yTûLó™%™L³Û‘©02\ýIê¸Z6¸L«‰,£¶—¶}6íG™ €¶ŠÊPMd*Ú*.C@õä•©T ‚ÈTµOzög[u2€3d*g8û @K6EÚ”£úÈT´<{+0Âåþ„‹¦ú¨>2-1([d*b…3\›Ò½8û @[‘µt2±üqÓ}R‚åá Ãå茩0j5yb\°HZÕA¦p†L@æ[Ÿ’wPrk_^B¦pƒ³¿NùGÒŸýýý©·I÷TTšŒcpp0Ó6 *PaYÆGÒ ¨·öå%ÚtëS´öå%’šñý²`y¸Ìv9À‚ P~` ?Šp¹i¹`Y¸A(¨ƒ~0ãH"ír@+ ¤L‡-2“îÓÓÛùÚØèˆ³ípJ1ÐåÈZºCTàpP$2 ´‚ƒðY–#kéc£#M‹ë€"T€Â ôƒÏM!êõVË¡;ø¥E¢û ºN»ŠD¦ãȪÓ=úÈTÎT€.`º•0·F;ÐýtÿnáÛ £Ú²N™A*hî¼¹l×*¨,^´0·A Û´óó66:Âg¹K,^´0—í¶ *hñyCùµ *|«:‡ÏÊŽ³¿ÎTÎTÎTÎTÎTÎTÎTÎTÎ0¡$&Yº|EÞMœ`–‚#¨Àhxx8ï&™ä5¡b·#¨ ÒÐÐPÞMR#CÉc*ˆÅÝ$AP8C÷Z g+y܆6x\ÅE¦+µZ­ñϦK,X'KšçytÁ%BPA¡ù @9TI8‹ˆÊPÂÈÿ˜Ì(7ÆT`%x ·Í‚õüÇ᱑àó¨Çʃ R0=½}QOoŸ$ilt¤é5Ÿ_.K²\°N+QÀ%‚P~• ðƒÃ"\nZ.<üçI Ø"¨PÔ?˜q$‘v¹¤ @P) SÆaËEV5¦<ÅØô8x²é”dº¼€jáì¯.“&k ^£b ÁrÓà¼éqx]áõ¶z ˜ÈTJ"8Ÿe¹´õ`ƒ R0á}ð¹)D½žd¹8d’ û à Aà Ý_0Z¼h!79A“ äÝ%EPÁ$d(ÒbLà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà AàÌÔ¼EÐÓÛ—wJclt$ò5‚ Œ«Õjy7¡Ðúûû5<<[‡ «W­Ì» …´tù «zŒ©œ!¨œ!¨œ!¨@›˜Î(Ks–Y™ÎL#¨@É)èTÎpJ1ä$œa/*ŒÊ>‚åáúþó¨:@P€™C0@øåqõƒå¦e;X*P"6ã'yޱT $â2˜ Nwy1PÖ鬅LÚÄ —™ÆKLËÙ”ŽLªÃ@=TH«ƒzÔëYÊéþTAr’gFÑ.€3€3 Ô@€íaFP€qýýýy7¡ô*0nxx8ï&”ATÍ3±òÀ@=À‚ À‚ À‚ À‚ À‚ À‚ À‚ À™¦‹™óÄÀÀ€V¯ZÙx>éŠú9ûïÕѪƒî/€3€3´ÔÓÛ—w Ñ“"´«m|±³‡ß¬eœÅ³§·ÏºÝI÷7¼î$ÛJ²Þ¸zAíøû˜ÚU–¦¶ëÉô{qõ· oÇ_§éÀîo×Tn³nSý¬¿ Ý"ƒJ·¾IÛ$’Hú­³Óí5µ/mpu¹®VõÛý{qdýeM¿ƒv}‰\2•VoVÓ&\æ?ú&×êÛW;êëf9P™¾¡¶znÛÖ¨o·I%ù¦õû0•»j_šueùF<0‡×é¿. .µ¾¸m¥µlÜ:ÉVP‰oÒw€5¤L¯ËmÖ—¥~¸Üfÿ|6Ë™º¦6ضÕÛoºU­þ>þÏvÿ=¢Úc³lTTõ¿%Ê©”w~ÌúM¹Õ7¾àvŠþÁMzÀŠÊ>ª$M¦õžÊlÆ£l×^gÞŸè>¥ *|&$ù]DuÑu›2VÊÊxJ±Ë~óvKÓβì[»Ä *»V´ßµÍÁ:Øæ$íou&[ÜvlÚX´ß%`™©D j¶ê³Žw:¤íú²ÔOzFRT£Ö÷<éö³|SÚnšñ¢¨n¢ðøPš÷DÒu% Qm ¯?MûmǨ²þnlÛIfƒ¢ðÆFGj3fÎÒêU+µtùжÍýÅ›¾œ²þÝ\þÝ‹öâwHÁø1<<Ìõˆ—¥+´êM~7Àd *¼éË+K7\Þmh7~7@32€3MõyµPMA%x÷.’š*Iƒƒƒy·PÞìÙ³ky7P ÿJ¿MÒL$‹þIEND®B`‚PythonCard-0.8.2/docs/html/images/resEditorFig11.png0000644000076500007650000001434510277403055022123 0ustar alexalex00000000000000‰PNG  IHDR•AúŠ»sBIT|dˆœIDATxœíÝ}”$U}Æñ§–]’ˆÆ ¢žÆ7”ÙÙQŒgG%²jyS1Š"Â"«."NF–7]dW1 * ìb.Q™ñ}vcpfÄD’ã ÆDtÕ¸/?zª§ºæÞª[U·»^úû9g·»oߺu«§ª~uï­¾ÌÎL·@A«V¯ÑbIZºlyÙuÔØøø¸$µƒŠ$mß¶¥´ÊšaqôÅß}­ßÒ)hÿy”±G×|æ‚Ø£tÞÏ–/{=2Ô×Cñü>¶9žßç6/¨¯‡2âù}l³-Oê롌x>ŸÛœ}ÈQ_e¸íù¶9ž¯'õíÞ,î}oçù¢ëh˜ÅÆÔ£NÑ>ú'úýΖv·¤–¤%‹Ú|ÉžÿÓvµ´§%ýá{´÷’Eúã®=jýÙ¾Z<;©½¿G7$9îàGæ^vttT“““…–?é¢M^ê–e *¿ûíïõ»ßî–öjI­@{- ´»ÕÒÎÝ’Z{¤`‘ìÑŠg>VS÷üB/Ù_wLh¯§\£%÷|IÁâGä®( ‚<ãØ›6{[Þw9!cP¹ëŒ}õàov·;[šë0”¤¹f‹I-íÞý½ûùÓî=?ÖÍ÷iù­»[ƒ{‡ò½_z¯$éY‡~°äš4×Í~$é¨w~®äšÕt‚}Äa}¨I›1¨<çÉO•´3cQK´y[Kw¯SåüÇWþqAÚ3Fߟ¸Ìw¿xŽ$逗ž¯íw¼G’4tØ^êóíïX¶üè˼”]ÄŸ|“$é°·\yÙϯ?~AÚ§_—¸ÌÄ¥ÇJ’Ž9ãFÝtÉ1’¤cϜȼn é–.[îÔ"‘$ÍÎL;¥›˜ÇT$Í5Ii¦ÄÞ Ó÷ê<ß«µ;u…uö´ãÝwu$8àÐvîú镃ü°‚ ÐÖ›WkËÄé•,E~Úgcw8Ùý®%I ½¡p666f}/üþˆ‹Ù™i hhx¤@²)1¨Hí€ÑÒ|€ Eâ0,Ñ^»vuåÚñý ’¤‡ï¿J¿¹ïr=â™§I’úÞGºòýÅÒÓ;Ï5ûá®÷sà;%In»´+ý±Ï9S’ôó».’$=þ¹gI’~úí %Iyðý×Öµ’¤',?[l9_Oi·~ü­îî©'r®$éG_?¯+ý)/´ÿ¡B÷Ýy®1=ÚR Ín>[’ôì•ízÝ}û»»–~E{[¾óÏím;è•—è®[ߥçÞ½íI¦oj–Ï;ö#úÖ§éù¯¾\’ôVuåûÛ×~T’ôÕÏž² Œ¯¿¢ó|òš“ºÞ{ñ?!IúÒUo–$zâ•ú×+OÔß½ùªNžÍŸx£$iåIŸÒ>þ’¤—|$é¶ IzÅ)ŸvÞ¦ëŽ3¦G[*¡/>Z’ôê³Ú-–.<ªk™×ž½Q’ôÙó$έúô×ëß{«s}€*òõ]Ãh`‰¦¹J *{TI°S‹öì2¾óÛûÖwž?toû$÷Èg½] ýú»—é·_¦}—®ÖÿÌ®“$=êÙïèºßû—se¿á3$IÎ\¢_|çb=î 3ê%=°e¾Ûé'Óí“ü_=ï%üèí€ò×/xŸH?üÚûõŸ_×S#åSóÏŸ1ú~}ÿÎ÷I’öñy $Ýûes€ vAg›î¹}$éÀ—_¨@¶Ýv–fþå, ÿýÅüw}þ §í3ùÖoï<ÿæçÚÁü׬Wúúõ§êk×Ò ,’ôÂã?¦@¾ò™“5õ铵â„kòÚ·J’^ô†’éÎO¤/_ý½äŸì,÷Å+O\°îÃÞrµSkÎäÖË_×y~Äé×iãeí€räê¤@ºenLÅæØ3':-—0 ·æIÒõkÔu¼J¯{ÏÆNþÏ|ððÌuš. ,áó,R‚ŠäÞ(h…A¨ÛÃ÷_ÕùòOè×±ÖJÔ¯îi·V=×J)ê ËÏV×—šüðëö±’,Ý_>ôÊK滂 þí–ù±•x××óŽýˆ\·9ͱÖJÔ¡'^Ùõ´¸•om·Vn¿â ´—Ÿr­õóËÒýåÃñçÜJ÷m¥D»Â\8w‹öìT«µÛé\¶T¢'é}‡æ[+’ôßw¨ÓýÕ/aK¥ë›²Ž©H½ý¦nØRéúv0€FŠ·Pâc,i‚Ê"µO©{œ+³x·¹û+‹G ½C æ[+¨¿•'_£/̵T^þ¶k«©D[QY»ž|Õ#º^Óà}’„ ’- HuL%êÏŸyšº÷òÝ_Ñ1•У|§IYö.ýrÛ¥zpæ’Î{}Ι éq¥Ÿßu‘~öï9Õò‰#ïÑO¦Ïï¬Ò!çêɇœ«}ã¼Ý_Ic*ÏxQ{\å¾”±”¥s·GêŸý²µºçö5ºû¶ùÁúáW\Ô“[™žÿêËõÍÏÖ5XO‘¤¯~æmç+^…W‰wEÇT¢^úæ«tÇ'ßÔ5PŸU|LåU§_¯—§[Ö%¥sÆMºé’cºê_óî›uÃ…GéúµGvò½öìtw¡q²Üá•Ä4²·`vfºÞÃN(¹ãþ ‘,;Õ0i=e{tÆßÖ† >¤E{?z®ôâÅÅç˜P²È6‡_»®}÷W8Pß‹úvî{Û5¹Ë`BI&”tßòms<_Oê;Wøq?2÷7Ù§¦¦499Ùµ¼ËÏ—lß¶¥³|tš–"õË9pï{;iÆHñø\ ]»vÎßø˜r-üágî™`€¹|Þuù"e­Gœ1¨<ôÓJ‰_d´w‹-ÚûQEë„>záë>ªùK­ÞXyò5‘«k£££¥.ﻜ(cP -‘´ÄûÊ2Îî[†^ÔƒßSxÓÕRÙ:qBYõÐ7-Ës 8Z*o*o*o*o*oœf)6M$–u:ä~ŠOÎm³ªuLL –±sìÀ•óÔ÷uÙ©ê4eíÏÑõpüÀÕ@tq@@8·TÂ9õm'hÓïÇÓLsõgùdŸWh¶õ&Õ‘à„*1ý˜RÈ”MOËï2Ž{YŽ o¿üß¹âÍæøNi RiAÃçÎjZoZéFC’ƒmß´u]¹{¦òMùlåqœ ¶LA%©µbûå²4y—+Ê6n_ô‹§ýÔ«ýÎç1Ëq‚Pæ–J´+dºzÉR^¿%Õ×8Óºþ€:Ê»?'ý: Ç *5Pß«V‹k¹Ñ>áð¹) hš¢­Ž„r©Äwœ¼;’©œ$.WA¦ºÄ—±Õ×t3í J’Ž%SºË±—ÔjO*ãd°uýF=€f¡; ýþF}¥º¿õFPŒV ú ð† ð† ð&õ–â‰M›ûQ vÆÆÆ¼ß5Éñ†*ɳ;}Oejj*O}€ÆZ¿nmÏÊæxCäÝÇ¿ü¸õr­@v“““eW5W¤½jõšÜËz›¥P-K—-Ï¼Ìøøx¡uæ *;îßÐõzŸ§ŸZ¨yëàk½UØ )‚ P«Õ*»˜ÓïÙRrßýµÏÓOíü‹Ÿ”M¢y\ò'•Sdy›²¶š¤v·‡'~@õx*ñ«vÛ}üy¼>/Ú2)ÚŠ¨Úö`0AÐù—–OËú~R¹Yòc0娞][Ñ|áóøØHôµíy®ËÔe{0xâcák[º¤Îc4-ÏûIy’êjëåìÕ¹ƒŠíÄéS?OºMÛ4W?Ámøú‹þ°Z/KíÆTôVØòÿ¡9L?ï[OƒJÓÆš¶=¨'º—‡-€ø,ÞÇT¢·äšžGoÛ5ÝÂ뻋ȵ+«.ÛƒÁŽ[D_'¥û^Ÿïü(G¿~['WPI;Qš°]ŸÛÒÒ^ç­«Kž~lÄ0LéÑ4Óó´÷]ÊuÉÁĘ Àç– ã À¼~O}ÔJ@C2‚ P3.6æÔ‘É ›£ÈôõET€†ñ.õ799©íÛ¶hé²å¹ób ¨H@Éó;,!‚ PY&” Ó“ò$åOJC} (´T€³M›O·}Ò–' Ý_õVVK…1 Æ\‚-ŽÁDK@fÑVˆ©eÁ䃋1…äm‘Ð’i&Z*ŒÂ±ø`{<Ý6_WÚ²IË¡¾S`•wBI×eÓ&›DýÐRx†¸~ÝÚLˇËÑýTPûJsÞŽû7”TÔQ|ÿé'‚ PAû­ÜÞy¾ãþ Úçé§æ*‡`4˜¢ûO¿T€ *óJõGK@—ø•f´Å±ãþ ñ÷ãéñe1h©è¿Ò »¿Â®°ð_<°˜Òóv¡¾h©è’çJ“à-]SA´Tt)óJõGK@Û•f8^þKëòН`0”ÙRaš ‚¢WšñÀa $Iyk<û­Ü®­åLÓBK¨ ðJ“G‹<–– PA{Ú)Úqû9<æy”çyé\ÑRxCPj î¿¼­]ÿ²,‹ê£û ¨¸ óË‹¦miÒöUÍøøxß×IPP*Jo¬Z½¦”õT€ˆ^ÍG»ƒâiIyâéá{.ËÆ[áëècÚº\·ÓTï¤÷M놺~d+ïc ÒNî.yLéYÊ·‰¼´u¹”“õ5e¡2ŠÄ@=ÐHY‹â„^MEÊÒeËs¯—– Ð@œèAK@Oøn­T½<´ÑR*:(¾vÍOÏR~|0>k9Ié¶úÅ·ÍeÛ1– #ÓÉ5ü—%¯e£Ë˜ò˜ÊqIw©ŸKýÑFK@OÙZh&Z*z*©…€æ)«¥BP€¢¥À(mP<ëÝSÜm5h©¼¡¥ð†»¿¤r™(Ò%ÍGK@ªèÝ[ñ€O'\4åGóÑRŠAy¸¢¥ Q¼åá‚ï¦ .îþÐS´Z -‰ÂqÓï¤DÓã4ÆÓ1S`”6ybR°ÈšÍAKà c*oh©¼¡¥ð*lqd}ͽNê ¡ò´8ÆÇÇ ­“  Vd|$‚ PqáwLÂ捻MOs]ð Ô@ôË‹ñ/8šò˜òFƒ“m9 (‚ P¶“~Þ©W˜²½BPjÊÔâpEËdð Xß›™ö¶n)­–Á` >ŠDPj+i‚É,ËÑjñâ; H òâ'ýø“ñßK±M@i[ƒ% $½(AN¯ŠDPxDPxCP€i Ÿ»¾Ð |Oi߯G32‚ 4ЪÕkJY¯SPY¿nmßgºU/·Ù™iŽå±~ÝÚRÖ›TÆÆÆúQâxCý¥®j€þáxCÝq÷À‚ À‚ À‚ À‚ À‚ À‚ À‚ À‚ À&”Ä›6—]À‹±±1çY –.[ÞãÚ4Ãèèhâ¼bMMM•] <*2MN2— N‚ ¬&''Ë®¢Œ©¼!¨À?? AN¢?C .¾M¿K=­ìð}[¾xziåšòeÝÖ¤úEבçsÍò~Ñ¿QÚ眵>(c*È-hêPn¯ÅëmÛ×|>ôc=>Ê­ãß;‹¡á‘i³3Ó%Ô¤÷*544<ÒØ²ÊLÁ ‰ë‰²_'ÔV«UÛ€Ý>ŽÙ:ûtÕL‘Êtµ”‡íÄšÔ¥“%=<ùÙ˜–‹§¹®ÏÔ¥gÛÖ~Êòyù\_´ü´mϲ¤ý}’ºãõ©Úß Ý*H•tuMoµZÑ“G–t¶å¢iY×çrB2•gz?íÄŸ–/Oý‹ˆ—GÚ~M7m_Þu5ÁÐðHç_4-ú^<•Tj(¾óåÙ!³ì˜®¿ë Õ%Ò:ó^±÷òJ?äzâÏàúQêRÏ~³«³3Ó¶÷¢éUïþbL¥†Â*Þ}m{ô%ëxƒäÖ½bêɺ×õ¹–QÖ¸D®Ð‹ü}š.ë1WõàaCK¥¡ªºC&µ>ªP~”écÝyÊ¨Ó }´‹°.uF-xaëî1õ«'¥»,Ÿ·>i}YN^YêZ$_Ñe$媭œ<õ,Êå–lT -8qéûŽØnmùmeº®ÇV†K=lëuyße›lËÙ>Ûë¤Ï˶M®Ûœ”/í$îãï“´i뫳p¼$ü—ÖÃ_1£ÆŸ—–JeÀ óG³hÒÁŒy. ýäzKs$k¦÷âiÑצqQÛó2Tj&igsÉÓ«zÔWÕNÞU«²¡û à Aà Ý_0Z¿n-?r 3‚ +» jŠ ‚h¡`P¹ü;’T@ÒèèhÙUh‚ ¨=Žˆâ¸û à Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà Aà AàÍâ²+U04¢éñüák[ž~ ¨@‰L! Âô¤üÑtÓ²ý ,¨—ñ“2ÇX*PI-˜¨~wyE1P ÖïV -è‘p|$že/1-ç’>;3½ õÐ i'uÛûEÒéþ4AJRf‹¢W*o*o¨€×_8„AæŒŽŽ–]…Ú#¨Àœ©©©²«P{P3ïÄ*õo*o*o*o*o*o*o*oº¾üÈœ7€,ÆÆÆ´}Û–Îëߨ?úˆÃúZ!@sÐýð† ð† ‚TCÃ#eW¡u0©B½ªP ”8Kq|g­ã,žCÃ#Îõκ½ñ²³¬+K¹Iù¢zñ÷1ÕÅ––§®eÍÎLú\|ýmâë Ë4ØÃõšÒ]Ê6å/úÙ½f *ƒº“ö"Hd‘õª³ßõ5Õ/opõYVZþ^.¾‚l¸¬é3èÕE à“1¨¤í¬¦&ž¾¶]É¥]}õ"4o‘•é 5íµk]mW·Ye¹Òµ}¦t_õËSV‘+òè‰9^fø~<-ºœ­¼¤uåe[6©LZ+¨ŠÌ?Ò•t‚5¤LïGÓ]Ê+’?žî²}!—åL']S\ëêƒë•nÅGÚß'|ìõßÃV—em­ ¦ÿ-QOµüåÇ¢WÊiW|ÑõTýÀÍz²µ>š$OKöO .ãQ®eÅˬÃþ‰ÁSË Â4/Ëgaë¢4u¬ Ô•ñ–bŸýæ½–§žuÙ¶^ITö­jŸµËÉ:Zç,õO»“-i=.u¬Úg ˜X[*¶AÍ´>ë$I·Cº–W$Ö;’lu´•ô:ëú‹\©ÚÖ›g¼ÈÖMʳOd-+k@°Õ%^~žú»ŽQýl\ëIËUÌÎL·–.[®íÛ¶hbÓæžÍýÅN_OEÿn>ÿîUÛ‡øl)?¦¦¦øF=’é múI“ÏX¨oA…¾¾ŠtÕ]‡^㳺ÑRxÓ5P?66VV= ÐT¢¿Þ@V‹%i||¼ìz X±bE«ìJšáÿÊÄc䕹¿IEND®B`‚PythonCard-0.8.2/docs/html/images/resEditorFig12.png0000644000076500007650000001354107474507554022137 0ustar alexalex00000000000000‰PNG  IHDRà,þ`ZsBIT|dˆIDATxœíÝM“äH}àl‚Àǘcû ³»`lÞ}lƒõ!|˜cG¦÷±"ƒ1»Ë‹kû8ßf|XkV­MI)•”©T=OÄÄT©T*•ª«ýO¥2/^==¾~¸» /Žáx€õ}òéññÙ‚Ë««B»ç㓱…ÝP– àBx8>E—_„‹."Ë>ºóñeÍC‘e‰Û‹nóbâëÌÜ^ïëÌ=¶—´ïsŽùÌíÍ:s>ácqn?'îû®Ž…ïâ¬}÷]Œüê÷?z¶¼¹ÿ•·¾¾òÖwF·ó&|?ø0|¿þÎ÷> Þ÷¿ÿl]á @Ÿvঠí¼Ê9ànÜÖ„ï©æœ€µt› ­€Û½ ßùÌ7z×k*àæìYûœoìœp̪#aýöO?‰6AiÎ@ b®RBxrô;ŸþFt\Ð>¼ø½?ÿôYtJü¥Ï}+üæ?ž¾Ýë›ë€¿üùo‡_ýþG½±_}ûÝðË~ø¦Ö×ÞþnøÅ?xvÞ·9 }úššÇš /Ž÷w¯ŸßÌ|yužMÆò:€ÜwÀGž;ççïÄ}ßÕ±ð]œµï¾‹‘çž°½«/~jöHX/ކ¢€¹–˜¶WÀ/.¯ÙŽ€ š&äS™ è­€o®/sîPÜëÄeÀTÀPÀà9à%zyÁÖÜ~¶âF;a½|8æØÈ"e€t€’zA¿zR-°=S«Ø±qYrrU»¼J»ïáNå lËäŽ]€üêé1¼¸¼zö?äâ|.P£Yp,`….ì›?tØ»Ü45AÉtÊd¯JtÐ\,€cMÏíæj2¹\ßôv^‘ï2{T¢…gÖ@/.¯ÞüZçÕÓã›K ^ CšžÎz<[·Ø9à¡KNÝÐU [¶ê9`MUä$lšd Z5ÌÞÄš¹5}©V àæ¼oóO5Ì \`®ÉMÐ}AÚ,o?.tY›®€Z¹˜jm¡ú<Þß vöjïc³NwYs¿½¾ç9Ï û!€©ÖÔ0*ØÝPmîÇBµ¹Ý Úæ¾ð…}ÀTm “1 UÁsC Õ=°®,Ü7JVÊ2³…1ŠÛMÉX%;e{À¾­~R{–¤ØcÀ0Õ0ì“&hXH· ŽUÅs·‚NX°7«ðÐÁcóÇ&sh¯ßwrˆ…awÙØ:)·‡–õÚlÜ T Àž¬ÀísÀ±Šw¨ N™mI0C>Çû»Mtzƒ=ÈV§4EÇ–ÛpsÐ –´Ù&è®öüÂí WC*_XÖäËÚ•jÊíö¤ }•n³^÷¾ÉØ«“&cH¹Ý÷X_SôÐý©ëÀVe›øˆ€0í:à±e§¾FÛÔ×ÓÉ ÆéÍÞÝY΋͆´´¡Q³„+,ãåñô.À*J õZÍuÀS¸6Öã{Å•háÉrxèúß³ë}ÛËÆn§ê>¿ûZcûÒ]nENU¼Î=éÂÐkõÝ-€Slb,蜓.O¶ ëeHC“.´ÿ­¥=ž´óXœêúvÚäk¯Ôes×7}ʤ :`°u“› Ûá–r»«[ÇîÏ‘²±Î`}û2ö<˜jõÉrLº0ÚSö'å5„1cÚÍÇíë §.o+q"°®â½ k06Òtuõ¹[Þ Øî}á û$€\¦Òá #€aa±ŠvŒ*ÎO–^Ð)£N9¯ R ÃyÈ6RʈW.¢6ݰ<Þß½9¯;¶~û¼°NXp~4ASµ‡»rÁ4Š±Çæ®/|aŸVà¹ÃHõ<Ž]«Û®´»ë³OšjšmºNaê` ìë§Çðôø.¯®&ýÏ|Çû;Ç’ýðÁØ×aKàžá›×ÍA‹,i³!ÍÙL _!|Ç–µ¹É¦rùÒù¾@Í&p;ðRn7•o¬“T÷:àØeIÝǺÏ«†Sö‘:Í©€¶bõɦ¬7ôZcËû^sîk³}*` fÕ7As¾TÀ@Í6À*Tƨ€šmú:`¢t^Ž{ws8dý9ÏÀ±‘«àTÂ7¿—ÇÒ»«(1äk¶8úîÃ\*à2|Ù£¿²Ÿöåe)¨YñNX±ù€»×èv30!è Ô-ÛlHíûÝÇcÍÓš³iS5ËÒ k(4c•ìÐä *_[8Üž±Ý‰ãúö`_`PÑËæ„«Š—ÆÂwÐ=e;‚ê±ú9à¹kÊìIªáó¶µsÀ‚˜"ëd Ý@í>6fêD ì[é 8ÅõíáY3u{Y{yìþØúÝmvow×¶%ûd CÛKyLèÒ(}øx×{8„çÍÁÍí¡fëöòîóbëíWl€m1%ÕÚB<Žk P…ý(~0̵µsÀS`ªUº.qŽ5öšÎõBv9ÃP-·öcëç€ç>§}®¸oýöòØíØùf`[v7CßìOé 8„þÐí.;7/%PÛë ßzß¼?XÖn'c˜Þ:nÕG Ôì,&chW·íÍóÛçuЪ‡ðj¶»ÉÚë¤j÷9©ï²ô‚j¶ËɆö%u½Ô÷F9*` f†¢¤Z*` fů†¹TÀy9~ìÝÍáõç\S-½ ó{ùp,½ °ŠC·f ºËyT– |ËðýeJü~Èr¸ïòŸµè©|œj¦ÕR5ÛDÇ®îV±ÝÇbë»^÷¼¨€šeé„Õ Ã±±¡çNÈàzÝó²… øúöù[Ÿƒ÷úö°ù}„s‘}2†ÖŸóPºt,Ìj—!M­VU·„° ¸Kø©6ÀmCóöŽ­Ïy)]i7O7ÁÜ]ÖÜO}|h»)ë·—ùcÊšÀ)ÙO ÅîeI©s÷­ojÁó°õðí†`s¿šsZ§ȱ0¾PÞê“1¤L¨°Ä„ S¶É>l½^K¬¢ A¨Bm6× ©Î5|Çš—:lâ:`˜c‹× D • ˜j•®€ÛžÚËb-Õ<{Í9ëë„å]ïï^?=>†—Çp¼¿{ö‹ªYî|*[5'„÷Ò›ßìY‰ß š ©–Ðj¦ šj©|ó;Þß9†°Lµ„o^7Ì`I˜j©€órì`Y«ŸîNK¾@ÍVàWOzM²Š-^ J/hª¥j69€ÛÍÉ)·a-*` f«OÆkQç3õØÝŽ7ŒÐ šjéסcÒz†¸„4˜j ßüRZ·ÆŽsll깡Ý7¦õÔ±®M ˜j©€·åÅåUòé'a™8öÅŒuÔrî˜)„ïvèx Ó­ÀMøÆB8ÊB˜T*à2ºßÓ%÷i nš©Û•rßôŽcÓ>¦<JÐMµ„o9í?¬Sþx ÍöùØöínxŽ-º[¹­À}Õï˜Ø_Ùím5_|óùR—57|C>Ü÷ØÜ®lUÑ ¸Ût•ú%n‡³fëó%|Ë8¥ò딊U‡/¶*Ëd í/l÷‹Ûþ—z.Ià‚‘°Jj¾ƒµ}UÃlI¶ xnS4ôQ—uÊw¹„cUj»cÖжºÛé>¯}ÞXSZ°\â@ŒsÀyïï9~SÎÿ¶ïÇž×·­±çíä09€ûοöÝîv˜J­‚cσ6á›ÏÍAµKË2Cì±XÏyž&íó¥ÎÇqƒå™˜j _ f˜jé ÔLS-0P³,×wÿå{­Ô×?å¹ä¡j–¥ž;àÆ¯ÂôàŒsÛÞÞÐórñÇ€ ¨›&hª¥jV<€»•\wÈÊ¡fëöòØí¾ÇǶÛw½rʾu_³»Nû~_Ó|ßýS^kTÀ@ͲŒ„µ…Ib3+²Ý¡GbÛ­3´_S¶“úZ{ã:` fY8VI¦Ž†•¢;Uá©ÛM}8g¥ªÏ”íì¹Òí#|šU1t)§N ±Tõ¹ä+{¢jVüpÛÔ*®[žqI5¼<á ÔlõÉÆä˜taj0Ÿ:Dìr«¾ç­Ó·9¯µ7*à|¦·›ÃÁ±†Çû»×OáåÃ1ïïžý’j–ŸË/ôܶZ­×bnø âéšß)º¿G€8瀩– 8¿”?SŽñõíóé ›¹y¯o‹ÌÓ;u;}ë/µ?#€ RýžFøÖ)j‚Žs´©NX0…‘°öCørŽV¯€cª–¬üæòÑ~¾J´N*àýjš¨ÛÁÜn¶NYÞ~|©í =Smz Ž1}ÃE¦´Û7êáð>µ³¹ Ñ¡å}÷Cøxè6÷§lG“9Kp˜j ß}ê ¶nÇ­±çu¬šcîó OñîǸ;%àÜñšÛ†^§»~÷šæØ~œ²oœN|^¦Vœ©òZ¯c²tÂêÎú3uŒçSè蛇¸¯é:¶nl?–Ø7N#|÷cjuÙ·~ìò¦5*WÕ0KØô9à­T–C#T5!L~*à:ÅBq¬ºì>§}Þv¬sT» ä¡í¤¼LU¼ ºf[{úß¼Ž÷w‹þê0•úœ9ÛIÙ¶Ðei› àššr»MÐB8?p>7M®°´ª'cˆ­kîî> Í©Ä:f-q§»|ìyCÛKÝÏ¡×ê®{¼;6§S5ËÒ=t޵o°ŠÔfê¹Ï›kèµÆfvj/çtÎ5+r¸O_‡­¾ z^û±%‡‹žÛ!|šmj,è¹™«“”Jv[TÀ@Í6Àmí°›RÁöM’0gl›ðÍgê±»9oQ|2†ÆÔÉN}^WÊ6ÆzG÷í‹^ÕëPçõòᘴžiû Íäî»>6åöжNYw(0S¶Ÿ2óÑкS÷E/Cøæ—ònÊqnOnÂG¡}}{X$ÀOÝÎRûC6Û½'c#m1 ¸N±pxœ#œÀ]‡ðÝáË9ÀTK¼_Mu;˜ÛÍÖ)ËÛOÝä €©–ðݧv`6·c!:´|êý¡†µ`ª¥Þ§¾æè”P Û)Û0Õ¾çeêyâXe;g;°³!Q-³!íÇÔª´oýØåMCÛV S’ ˜j©€ë űª´ûœfý¾å±çïï’·9\ïï^?=>†—Çp¼¿{ö‹ªY~Êe4Í5°.Åa sBXO7µÁ1†q«WÀ‚—µÝ|nªCXš&hª¥òÍÇqƒåMî„ÕV1å6¬¥}ª$å?—À–¬>¬)õ¼äÃKO€mÑMõ45r0 € €Õ› c_º“Ó§œ3N]óHÁ°ƒÀVe©€_==>û×hB5¥wjó<=YécÌ_ &š Ù•öЂ[V4€›ê·Û´»¦ØuƤ¾@ ²\†ÔÌ%Îã: @í²p_`¶Ï·ÿoŸ¶ìÑ&âèkІ1F¸jµ‰îj‡±`¦ù[šÎ VÀ±¿V»?üíÇk £F¬¹Æ÷sÊûì{¼ýKpOÇ*&öþ–|¿CUÚ”×i¯_Co÷=×sú>œ«‹ãýÝë§ÇÇðòáŽ÷wáòêªw¶Œ¡Ç–¶FØ~Ÿ)r¾ß5x¿ë©ýXå°Äçá8//ç÷„aš  €Í°¿ÎسÍ0와00ù2¤së‘èýÒDZÊÃqf¯&ð‹Ë«µöc“¼_ú8Vy8Îì٤뀀e8 `(@@ ÀP€€0 €  `(@@ ÀP€€0 €  `(@@ ÀP€€0 €  `(à“§nàúö°Ä~œ…ãý]‘×½¼º*òºµyqyUì3ÎÏÉB¯ž—ØÌn½¸,€O>£!ŽÛ"‚_`}bœ€0 € €ÅΗÒí…ÝîÅz}{¼Ï醎ÿÚ¯ë³jVuÇ~ ÷ýbö {ySŽ?ÏE´PÈÇqHSuœBø–Ónžn>ƒæóhëž"è®?´ f»`Êé;ÿ»Ýw¾Þy|`¯vÀ±_âäÑ7LiÊgÑWìÅî8!\B¬rËçìÑYt !<;ïÈz–:Æ}Ûñ{Qu Õ¡jI%¼¬¡ã?õžîú}ÛñÙ{Qu‡0¸SÖgºSû~ß¶|ŽÀM4l‰€0 € €Å:a==>.µ)ؽEøÅåÕ›aEþ@Ø–ê/Cbœ?¶çäv=æöùŒ¶G',(@@ ÀP€€0 €  `(@@ ø„Yr ¿‹ÂëæÎñþδuÁÅë^_¼þÿ[á¢ôþÀYø?ªX,éç4càIEND®B`‚PythonCard-0.8.2/docs/html/images/resEditorFig13.png0000644000076500007650000001370207474507554022137 0ustar alexalex00000000000000‰PNG  IHDRà,þ`ZsBIT|dˆyIDATxœíÝÉ’$I}`/l€£¡ŽuÌ+ DπаÉú8 5 Èê!tècš¢„@ªcš Ä1 àšÇ:öÛ´­è‰ŠŽÅcu÷Èï3+«ÌÈÈØrùå?Â#üêÅÃùåýñžßŸÂéî€õ½õp>?ps8$Z¸oµ l†2°¬Ö!„ûÓCëð«pÂU˰Oï¼9¬zèªeXäôZ§y5r>§×9Ÿ©ÛbÄô¢–}Ê6Ÿ8½IÛbÊkØ·-.íý7sÙwµ-|'-»ÏbËsšÞŸYtj@”Î xÓá+ŸüÜë›C¸ÿçOBF›ÒVªùœ¨þøÏÿBáíÏýÝ£áýéßC!|ùóß½ S}ðû»Öá_ûÒ÷Z‡ÿ×'ÿBáOÞ¿úä'¯n¿ýþ: ‘Š­€ßý«g½VÚ|ãÉû¯¼ÿêãWaüÍ·°Æâp!ž>» !„7®¥Ñ5¼2ªVU ‡ðiõ —¬ Ø*pë·û.pµxüáñèþW¾ð÷!„~ûÇŸ¿1î_ÿå?„BøÍ~Bá«_ün!„ÿþÿ†Bø›/þã¤e¨v;7µí‚þåÇ?~]ÿò£?ÿ[ïü0„Â~ø£×ÃþöËÿ4i™Ø¯ÓÝ1<}vû(„‡®.9ú4¤þüïÕï‡z¾_þÂw¢‚÷þ÷߯Îþµ~>øÝ]øõï~úhxuÿëO¾¾þäûƒÓy¾¿ ßo½óÃOƒ÷£=WøÐ¥¸1—v^åp³ ®«Âw®)Ç€`-Í]ЋVÀõVÐï|þÛãUpõ{V?æÛvL¸ÍªWÂúíÞº ºOu<JÐÖà*&„Gï‚~çsßn½.h¯ÎþðO¿x´ :¦þê¿~ó‡Ÿ ßæùÀÕyÀ_ûÒ÷¯÷ÓΆX•o¼ý~øÕÇ?yÝë›oÿ üòã?:î[ €.]»š‡vA_îŽ/Îç×ýßáá|ÖCÌ|\¾wÙ]¾å¹SÞ3—}WÛÂgqÒ²û,¶]·û¦Ñ‡í<}v«µóŠìYbRìáÙ$€ë¡Vÿ_é Ú6±ã õ1_,CÓPõ§QµtÂ@€Û´w%&ÐæþRïšwìüÙVó4#! äl³î ²9ÓKEu›'a»O]?€—ú;––ýµ c‚{élÎséìCÛ…=\ìc~ä²G£+àØJmaÕ`ÍcÂCA7vü¥žÛ5©ãP>»¹Ëfo)àú›uìí®éô×õXLHÏ™ÞØû±ã°,W¸J§ùC¶y@Û8Õ°¶ñ‡Höí…jpS Ä®çÔu€¦¬aAŸv÷žî޽Up}«qšÃªûõit=/·j»/à†N#œˆMsBoÎK®—IS¬çðp>‡›ÃaÔÿ-5CµºßªÕífÐV÷s ß]»tçú:å°í±9í8–\¨À+—ðí«‚§Vé9T÷KX:¤ºÚVÌ™ÏP8 ZÖ²Ig u}Çp¶~£çÖa㌠ß-B¸®­’3½½óŸÓªšÏg3lµ\†Í®„UÛBzŒ)®¥×± íä¾kËñØoŒ9g7ôEÐ6Ý%Îlˆ×ÐtbÖB° š‚åT‡ðfÜVONùñÔ³ úÎh»=猃ØyöØu€6I¸­„®æýõñ+]1ê-ûÆY®®é -§ÞúR‡o[6‡ s»oP®Íº#¬ÄüºŒ=¥¡ÍØóñº–-f:]·…ï6r«€ÆÈæp×øk›Ûz’t„ïöNwGÛâ0ÅRoë½Û}œ¹ÀKønËöƒemÒÃÜSªçÅv€P?péùÆž†`÷ôúTÀ@É®NwÇ—çsx~ §»ã£/©jxŽa"䘾‚ÈA1» c¯¨ÅåP%+&€.MÂ(ÙgR/L5¥ÈŤ xîî`ÇoY‚ x[¶{÷Þíí¦ïóY­ û†õ=Oø²Ç€·÷üþ”z`).õZÌ1`h¾iøÍ¥ø~XüðõÍáÑ_ó±úÿæømãµMC_„à0P¶U*à®k?íºº°GßÅ>¸<*` dÙ¶‚îꃳ­û?.“ 8­¶=QKïêšž½`ìA¶Ü%æ’”\†ÔðÓgã:'X{ü|aº¢¸^ýúࣾ ]mI t£·…_Û±ÝæcmLíè f\ö/uÌpç#mŸïØN\Æè›Oó;£¯í liR#¬˜ ìÞ á¡çÏeÊù<àúîãúù…c‡W¥8Gq®¥‚®òÍPš†›äÌyÀ+×ð áÍp­î· oló~îáÛW÷í.n;»aª®ù\r¶x{ó•R*à5ÆÏMW»Œ¥¾†‚Ú÷%RS¬œÃ·k÷r—Ü«Ü%TÚ Ó¥ªàæ|bÇ…T6iÝwu¬æxc‡÷]q‹}Ûk+èR«á¶¶õÏèÜ€í«~Ç̧>¾Ê™”V¯€ÇtÞ0æÃÐ×ð‡ê2äP7Ãòtw|}\whüúqáam@¹ÄxcžÛ˜Ó÷©$Ù½ÆÞ‡èò¤>ÜŠmM?ÇðæK~ ¸yqú)s¦Ùw¾ò˜sÉW0ÀT›pWðÅtÒÐs¶i8 ?RWÀ—ètw´ a!›ðÕmÛôªiö]g(Ð)ðÝÖ{·e6ƒ\%ß½¶¶`Vñîƒ x[¶,kóΖª>c¦³{Y5\.á ”lt7¯Á:t{ʹ€ÍçČӷû¹>®çŬ yÙëyÀÀe˜ÔÒ˜ÛC÷眛7¦Ó‡¡ç9G°<*` dEõ u*` d˜b©€’ `Š¥J¶Y·5fª_c©yÄtúpéÖêck*` dYœ¼DC§1>änlwjs:±è›FîÛÎyÀ@É6뎰«Ãî5å ¹(u; _ dYTÀ}0Ô;i¨ŸË;eõi¶ kN¿«3‡¾éu-ç”ñ›Ës©Í¹M¬Ñ9ÆZTÀ@É6í¸ù¥Þ7nu¿í±¹»]Ûúîš~Ûóú¦×v{ìø1ËU×õøÐvZ²sŒ„/P²bZA—²›4öŠ\CãןSùM»”íÚF+h d›ì‚Î¥bJiNÐ í9¸T*` d«VÀUh4ÿ¶ ä\ƒÌr5ɦ\–ܨ€’®€cŽ_N­Öæ„LÛs›Çž›Ãc´=oìô¦ŽßüÁÒuü·mÜ¡ñ»îÇ,.TÀ@É®NwÇ—çsx~ §»ã£/ªjxª]Ÿ©w»¦ž?æ„°0rÅiH•± ”¸lB(YVœ[àæ¶<<¦òJVÌiHÐ$|’ à¡‹óçØP‡ýÒ (Ù¢°]¶lI ”lT·Ž¢¥0©¨€’-Z7¯ÝܼôbÌmˆ¥J¶J#¬æ°,kP%Àõ@êÙ¨­óúó3s¨€’­v°ã¬ÍyÀ@É&í‚Û;OW'ïzùaá ”l• xNçK ”lrwõ´Ó÷xÛpáÌTÂ(™KQR,­ ’ `Š¥J&€)– (Ù&ݶµtn;Øñ`ÆP%[½î»èFýjY.ÌÁX*` dvAS,0P²ÕwAϹØF×¹Äõ {ôÛœo³¯×7Ÿæpòà<` d›îÒÜåÜ–ÍûõámÃÚžÛ&&¤ÇN“m _ d«p3К—¢l·~¿©>5qhþäC ”l³ xʮ辫imQ‘ªxó&|’Ó«Þbo^o:öùSÇS çG+h d£+à¶c°}·›žb+×®ÚQÅŽÛ·K»ï¹õá1ëÌ6TÀ@É®NwÇ—çsx~ §»ã£/ªj¸`!WSBX9(f44 ] d˜b9 ”LS,0P2L±TÀ@É0ÅR%ÀK ”LS,0P2L±TÀ@ÉVà뛃Ë8² 0P²Õx­^‹@ ”Ì.hŠ¥J6:€ë»“cnÃZTÀ@ÉFp}wrÌmX‹ (™]ÐK ”LS,0P2L±TÀ@É6;¸þ7u:1öֵ ]ë›Ã2ï… (Ù[[̤Ù(ëúæ0º¡V5~ý¹¹6öj®_ Ë\¢)°raô„î:„/P²M*à>õ]²Íª±>¬^EV·›ÃšÓ©×œþÐ2ô=wÎnäætÛæÛF;0P²M¸/lÚvÕ¶…mÛó›Ïk»?4­æô†žÛ6¯¶é iÛ4úÖƒ7 _ dIŽÇŒ_…ÏÜŠy~WE;gÞ±Aè´S%K¾ ºK[µ¹†”SÝÓMø%˲Vý¸k‰aÌ2Çü¸(qÝ·ä<` d£+à˜ã«±•k×±Ò¾†Sm•qÌ1רeXbüØåiŽ3g=.‘ (ÙÕéîøòá|ÏïOátw|ôEU äjJ c YB(™¦XŽ%ÀK ”lõÓº.T‘›1ËÙuQ¶åØ/P²b:c˜bì|–è ‚í_ dvAS,Ç€’%½V[‡ •¶aõáCãuÜ0¶bíê¸ë<è¡åb>0P²¤1ÔoÇö¡Û×)BÛøc¯¯g¦˜Ƭó9 ”,ËÎb-}©FYá ”,ÛÎbÌ˦J¶›FX±×gÖby?„/P²¤1ÔõuD0ÔaCsüæ4c w«ꀡÙ±¶¡J6:€»Â,ævß´úÆ3|jÿºCã Íkhñò„/P²Ýì‚îc×ó>9(Yö°–MÁ»O*` dQ³O*` d£¸ëŠPSžs¨€’©€)– (™¦XUEûß^ '«4Âê;¶ïºÐ0VlU{<®¼$ãL à¾J¢¯3‚ÊÐã0†c»@‰&ðPUkWô[e´Šú­ÞK5 oZ¼ŽéŒ@g\ºY1t Óq\"ç@›°êTÀÄ&?z¿ÛöHÅ¥( ¨]Ð×|²örÀh§¿ølêE˜L Œàï>‰6G×ô–ž¤2©„0O¶» ›!/ôØ“I|ýÁ'½øâÝ'¯ÿêÆnÕ7Ÿ¾ùÏ/̵xüâÝ'áúƒO^ÿM ºús«iÆÎ§þ˜  G“¯]…[Û)JCÕqßsÇèšÓ¦Èݬκ*Ì¥p(¨-÷ÇcêE˜dõÞš»ƒ«Ð\ª nÎ'v\Ê÷ôÙmêE˜lv7«à¶ûs§;ߨåtlxNwãª_ äd|oH-A×»Ëxì®å˜ç÷Óu›rÝâzײ«ÈÍê» amz6JÀv×’#Á ”,Û+aÀžÙÍn´5²ÛP `+*`v£¶ÂÈ™fWªÐ¾@î0»#|`H@@ZAS4W¸J%€)–k;% àÓÝчȒÆV@Ézø½[¬¡7€U¾°­   `H@@u!Ž›Ãa­åØÌõÍ!úüQë[ž1ë;‡‹€Ä›ózìá=™£­>'ô}%¬’OMš²ìÖ·[/û‹‡r·Õ®o– Ï’ß“9²=óáR”0ƒ/³v¶ s À°ê¸ð¥ÿâ\îŽ/ÎçðüþNwÇps8tî>ê{¬õõŒa}Ë2v}çxúì6¼x8¿Þ^OŸÝjÔ>ÝÕkÂüFX%¿'s´åç„~É*à¶_Ë¥ÿ‚~úìöÑß^M]Ï=o“¡/³-Þï]ÓÛr»oý¥¾·íºçÏo² za§»ãë¿=˜ÖXÏ’·W̲—¼~±R¬ã^·ë^׋O àí=„+—²ž}rÙ×|¶~]rÙKK½]Ù§lx¯»sÛÖièvý)Ûbèµëz¼¹þ¥¬sÌ2ýP™òÞ˜¢o>}ó™oŠ×jÏÛuèóÐVÊç…W²>¸þkz\šë0fêãæ¾-†Ö³ï~×:æ¾Îs—m©õ­Â¨ù?f>K¼Çr{Jß®1Ÿ‡%_?¶•u_šæ¼®´Ó•RI¿äc¿ðº^ßjCÓ_⋵k>K¼ÇR}ñï}»öMŸr `V1ô¥V¥[Õ´}™.µ¾C²ævMùšíy»n1}¶—í1à=˜Z-õ‹|+CËz ÕðÒËWMoí÷ƘåÞÓëTÚv]â9ä'YÜökµùæ¯?^RUÚv#—¸Nmæ¬g×ãõ/ÁÒ¶ÕØåk[¿%×·¯J3Ÿúø1­ÝS¿N{Ú®%ˆ“í•°Ö¨]ªß¥­ïOŸ¹V›j;¸V¾\ +vAÃ|™½b;@¼lØ™’8&÷Šíñ² `(IýÝ%ÿ÷Ãâe{ x މö»´õ£y ˜ÇΗcÀùp0Ì €©Fð¥}áX_º\ßR/ÂEðžd¯Fð¥}áX_HË{’=u X†VЀ€0$ €  `H@@À€€0$ €  `H@@À€€0$ €  `H@@À€€Þš;›Ãa‰åؽë›C8Ý“ÌÛk'åk\žÙBçó“Ù­¶OË3ÛØš]Ѐ€0$ € Ea¥ôôÙí£ûõV¬OŸÝöÞg¾¾í¿ö|½–@ÉŠà¶/á®/f_ØË³ýxì"vA …íØÎqŠ®€cßtê»§«× z=ªÇš‡šã÷ (Ùî˜tºŽ¿·Ýî:^ï8>°W»à¶/q¶Ñl U‰y-º*`€½Ø}‡ „Sh«\§òº{t°BŽ;²ž¥¶q×t¼†À^]·…j_µ¤^Vßöûƒ§9~×t¼vÀ^À! î˜ñoîö¯ßïš–×Ø£‹Ù 9À€€0$ € EZA?œÏKL†yò2;€¯oK,+òägv;3^#€ü8 `H@@À€€0$ €  `H@@ŸÑKlï*„ð²ºsº;ê¶6põ2„—W/ÿÿV¸J½<pþ_GP8Jf?¼IEND®B`‚PythonCard-0.8.2/docs/html/images/resEditorFig14.png0000644000076500007650000001556107474507554022145 0ustar alexalex00000000000000‰PNG  IHDRà,þ`ZsBIT|dˆ(IDATxœíÝË“$GaÇñ…þùæØÇ¾–Ù•d,8æ8ŒŽþ8ø0ÇŽ@˜6ÜÇŠ°dŒ´+d‰kç¸ÿÍø°ÎÙìœ|V廾Ÿˆ‰é®®Îzôã×™•UyñòîtÜïÅíqÓa/@~oÞNg6Ûm¥U`=Þ4MÔC¤e `!„8NwÆéâBˆ ô×wO“]¦–g,ó"r93˳.g(/hÝçìó™åÍÚs^C×¾XÛûoẵ/ø,ÎZw>‹†ç&*o‰7’–‚XkÀà±í{oÍ~îåf+ŽÿúBAmN_)ý9Aüü¯ÿ)„âé×ÿñlúg_ý^!Ļ߸aôŠÌõì/ãôï|ë'Æéÿýâß„B|ðäCñÉ‹_½ºýôÃ<+@ nkÀïÿí³ÓŠÉO>|8ðþÉóWaü½§?˱z€•¸ºÙ !Ä£kiئKQ°dMXˆ×µ_ÖL¬ \õ¶ëWÉkÀŸ~ù»³ûï}óGB!þüåoÍûwóOB!þôÅo„B|ûí !„øãÿ.„âïßþçYë ›u¦&èŸôP þø³Îæÿþ;?Bñ_ŸþòaÚ?¼û/³Ö 0®é°W7»³ö]]2ú4¤Ïþú{kí÷Ó¯^…ï»ßüaPðþÏÿþGìâ<ûËA<ûü þðù¯Ï¦Ëûß}òSñÝ'?õ–ó¾Ï_…ï÷ßùùëàýì—gó¾5pC.íœå°^ VÉð]jÎ1`rÑ› “Ö€Õ^Ðï|ãÖùd Xþ02õ˜¯é˜°IÖ+aýùËß› ]äñ`z`êpÂÑMÐï|ýÆë‚ ñê|àO¿úÝYtH øÛoÿXüé‹ßD…¯~>°<ø;ßú‰øÃç¿¶vÄ’>xú¡øäù¯:a}ïéÏÄÇÏ?:;î+`ckjö5A_L‡ýýÝéô0ðf»w§ƒ1„,‡ À;× Àž;çý·p݇Ú|g­;ŸEÃs”·}ï­ÙWº=N\Š€¹R ÛKár³MR @Ù„¼ãPµ|}µ)¹ª»œ jÀTà<œ¢—КëÝŽ÷6€ê¼°nS‰õй@:”Ô úåµ´'¶ë».+”ÄiHèÚfv>ÞqOÍ@[²ðåfk¬AÛ¦§\®®fM>÷ö®Çsôhè0¤ÃŒ®tÍ"¬×þR]Æ @YtÊĨjtÐl¦¬†² kSp«éó/]–¼¯/ÇvÛU†>ʹºÙÑÛ9#Z–0¢-ÊÒO3"„´¬XÛ‚lIyµP»ma;&ÛàT?°C§çXÖ­ùkA‡wêÔ—™úÇÆ`º°ûÈc¤¹#m –‰®‡vP2…•-Àôc¾ ‹?ÕsmeÌý£™»o´f¡¦èV߬±·m叿³=ÒKÊ‹½:Òâ Wõè?dõ³LóÈi¦ù}$]­P¾—!„Ð휻 z™!gTÈi¦}‹þ5Ý pi¡¹w:ìµ`uå<ú4y_-Ãö¼ÖjÛ®€óF87u±gQèë?÷ %ÛsVFÊ}…¶ÀèÖË»“¸;Äf»ú_’ªò¾)Tåm=håýÖÂ7„­IwÉ¡ß)‡¦Ç–ôãH¹ 1åc|0ºÕJøºjÁské-ÔîSH][³õ­X²_8ç®qR£]¯"ƒ1¨\ÇpJ¿[°qb÷D«L5Ù˜òFó_R+”ËÉq6Cîm ‰y]Š] KŠí!cΛ—óýúÕJøæÖâ±ßKÎnpE`*7Å™ ¡Ëò•ãÛõ‡@ŠuG¿h‚F·Zª ñ¸lªÏ-Gˆö‚xîY®³L·—œqº¬Ø²—nCÌ> Ygô©j›@°uïWç—ætï]/[9¾õ䃒_íð5…¡>Í7OÈm×4ý*6¡òë2ô”“9çã™Ö%¤Ûm·ŒÖjÀ£™cÀ¶ùs[Ú{õ¾åM‡=ûH„cÀè5ಮwcœ´‚F·ß²Ø@ZEcHÑÍÞuZ‚>OÊîýsOC y:?jÀzv1ö÷w§“¸=Nb:ìϾ¤äôÄÃÜð%ˆ´ ›&èÐ+ja=¨èY7LàBGøèÙµW˜kN Z1«¼´9˜ã·HpYì?Œîz·+ú>_Ô Ú5Íõ<Â)p ¸¼ÛãT{€,j\êµ›cÀ€Žð­ƒÐQï‡äÇ€/7Û³?ý1õ¿>¿i>SKÆ Å88  gYjÀ¶k?ûš®}öp]ìëC @Ïším#Ó4üÖ‰p]¦–¨Ô­S¶òr´‚Ѳ†Òš `›KRbj×€¯nâ'È= £~GÝ.´¥«Vk¿|@@ xl}I€ÞE6…ŸéØ®þ˜i‚¹„Ì‹ñÕ®Ã?øˆéó:ˆK ×rôï Wß½Lõ9¦òÕi|7!Ö¬NX!Aéš®‡°ïù¾ù±N-Ÿ¬6«çÆN—Õ8Gq©Ð óQC^Ußr–|H`§þ!uá<`t«Õðâq¸Êû¦ézÀê÷[_W-ØÕ\l:»a.ÛrR!ÍÞÈ!yóË¥ôRÎ1klý2R}ø‚:÷÷ßkÈ0ºÕrøÚš—mZ¯å¦ TÓTµ`}9¡óæ,p)À¡ƒ7„t†°•›âXúÒr x‰^ùš:UÆt² )?t¹¡ë骹ë?BËBeà˜ÁbÞØ!#0¶ÂW¯ÝN‡ýÃq]ßüêqá;aÅv L1_ÌóC;sÚ¾7b:‹ÒQsTi‚ÎñåM¿>µkÀ®P4=6wþÃÀrÕëMA¦sìæ”é:_™æ¤1´P€¹Š°-øBiÐ…—1•‘êÜDÔW»¼FÓaÏ>)À)j·¦òd™¡»8§o „oY×»¾O•ZS½ :7S0Sã5à²Øw@ZÅcHUû )'¤y™Úp¿_=‹`ý¬¾ÛòX­ü ©}êÏ ™ÇÕü¬–c{^ȶ -Œ† g³FCŠ¹í»¿ä\º˜A|Ï㜾þPг®ÆTÔ€ôŒF·¨èÙð½ 1.zA—žÃè®w»¢ïóbìº&tª‹a„ú°v¹Ç(ð-ïö8Õ^ ‹—|m¢œ*|C}h]ìpjK±p•Ñú¾£\Gëï `Žß EŽۮ͜_azÝO„/€ž5Qv  6Q«çòÎY†Z¦iš^¾«©ÖVžm=ç̯¯GHSñÒ&r Ž‘ 5`=+:°ïx¯ëšÍz¤;ØV¾éy®òL·cçY/•íqß~J98F „/€žusR/ͤ¡Wäòͯ>¾¤æï+»—ýjÒÂyÀW7»‡?}:¸i‚n¥ÆTÓ’ KÙS|$µkÀW7»³ž“úýTå–z.€²²Ö€eh襹ÕàY/ý˜lÍuiM 5`Á Ft 8äøåÜÚÚ’1=W?ö¬Oaz^lysç×°ØŽÿšæõÍo»²þ­¨]!›¢õš²$§ëó©5YÛü¶Ú·¼Mmh[ÖÁBK°•c ž˜A\ÅlKly!å„ÎØ¡óÎ]n‹Íßµ{AËSï«BBQ½¯N Z×z™Ö@[š8 IâJVˆÑB ØŽ9PÆÑT·¸­­ÎÕ®ÀÝœ†èj‡oSLËä”' OQ5`ßÅù9U%Õ®ûŽÏ}Žz¬Ø6¿:Ýt›NX@û’6A¾(©v X{èêÓ}džcçwÍC', QMЦÓQ¨õ¢–Ö΀IkÀ¾ARŸ7Œuk¡¼6ÓaÏ~ÉÒ :vP`ŽÚÇ€×æzGg/ ¥Yâétåºr¶á[ûH+ÛyÀ+r£  g³ÎŽ­½Úy§Œ%_=ËR^2øŠ0€žÍà˜Á \Ï#œ1á  g\ŠÝâ<`=kj0 5à²ØÝõnWô}N£[.ïö8Õ^ ‹—n-À¦žÎ¦ó„9Œ„o|N1¢ßÙ«Ýн¼;ý¹.Þè8  gtÂB·¨èYö&è%Û°K¬^ØÃ5¯íšÔúó}Ëѧ£ гª°ô&gצëGÛ®)ø!!Í€mk!|¯nÎ(h} Þ«›]óë¬EöÖM¿¥i^õ¾N-#G ú–vÔ®›ÂŒ€ªX xNS´ëjZ%j¤ÔxÛÖB XGøÕÍyÀz zî€¡Ë Žzj×€}ÔæiÌú4y?ôqW¹!ó«Óø±ÔÀ¦c°®Ûz§§Ð ³ è`êD:¯«IÛõ\uzÈ6£ŒÖÃWAy_͹»æQÙÆ„/P_tÛ\p Ä`zÌ7˜ƒmžÐçÆ,{îrBŸ@>­×€s1Õh… TÞtÓ èÖ¾¾æe}àBèV‹WÂ"„¢ŒnÕ®«žÔi¦ÇR5›–9g~:aõ]L‡ýýÝé$n“˜û³/*9ã›hÕœ¥9º4¾0²ß 4A£[„.€žÑnQó-o:ìÙ‡@"0ºEø–u½£ƒŒnQ.‹}¤•ýðåfË È‚ðгìœkÔ" Åó€ ½ Ñ-jÀzÀjsrÈm jÀzVd0 jÀåÄî»ëÝŽý xРݢtY·Ç)h>.q „!€Ñ-·¼Ö-ß~6]›znhÛ®i{­k®`t‹p[.7ÛàÃO„Pð<`õon9!ÓJ³­ƒm{[XçQ¾íà} Ä+RÖÇüRÖËPŸÛjg/}ûzXçQ®ÃôþNE6Ëfjµ¦lÞÑ7ìcÈó€h‚.€Ð̓ð­G†°¾1ïsWhªÇcÕÛzxú¦»î›¦¥U`ÛXN7Õ|Õ¿:M/Gÿ’°}AÄ>wÉ/~Ó—¾\}̨×µä½ê:l{lnH®hU‘v…©©Ö¶¦çëÏ3Ý÷•¥—ç{nHó[HÍÀT†k;ðá[Ç’šï\Kj¬tøB«ª™_†ÏÒwÈóm5Ú%Ë ÒœÇÓFG ¸ÓÑpºZR½ Ú¦Ô¼f†ÔîaGøÖµä½ª×`}¡¨vÌr•¥—£?O=nLÓ4jk2€ÕÚo¿²CÖ9ÕOck=#|˹ÞQ[R»˜ûû»ÓIÜ'1ög_Tr:A€VÍ aÂ@ Ý"tôŒF·@Ï`t‹0€žeïm»PEkbÖÓvQ”ű_=ëf0†9b—“b€”CøèMÐèÇ€ô¬ê…8L.H¦iêtßü¾bk¬¶ñˆmçAûÖ ËQгªƒ1¨·CÇÐu Š`š?&ð\#3… À³XŽcÀzÖä` ¡R_·™€ì á  gM^ :¹nÔ€ôl˜NX¡×g¦Çò8_=«:ƒÊ5oÀ}~½ÌÐc¶cÕ¾ôñ‹P¡ jÀåÄî·ëÝŽ} xD°-ÌBn»ÊrÍ3}îøº¾ù|Ëòm3Aœá[Öíq šaþ€0]Å)@c¢\^Èg(d_Ýœo(Cûêf—$Àc˱͟j}“æ8Eh¼c"|ûd 5‚k4L',¬WÂá‹5ZÔ Ë5-äyÀÔ€Ç%›¨Õ`V›­C¦«§*Çõ8«ù&hÀ†cÀcRSÞ6…¨kºí¾CWÞ)‡&s¤@£[2LCÿ_n¶|ivÀöé·|Ïuu¬šcîó›,ì:Öu]h VèqÝãžàí]ì§Ðr®å>³ØuQ ×`’ïq ÍÊýËuÚ)„S  )Ì `_­6õ Æ!CQŸóõ¸­¯s”¦eK®rB–ÄÊÒMÏtØ'km°˜«ÃTèsæ”R6¡‹Ô²w¢‰èßõŽH@jÉ8d0+úÂqv ½Eƒ1ئŠ\Àq)J*(ÀÔ~  @EØw᎘ù×âr³}ôçšWýh_ö–§!Õ‡ÞéåÝéì/d~!úßnXƒªMÐ5Àš²_ˆCllç+۹¦é®ëOÛÆ/ÖŸïZÖÜåÇ.GŸîbkº7­“mc–H«Úp„j@˜BÚh±9Ø O}ž%ËYŽ>Ÿ+°mº\½L@YÅ.Ei œØL®kŽõõ¨>`,ÅjÀ¶Ú^ \µä?ZXŸ*MжPKvKC]¯©Ç†pèòsî µØkA_ïv\?ðˆ`WGÓm½3RL@I¦²lÓM·]ZæœåÇ.G®ï×slËR@˜ÊW—ã{Ûã4Ãöa ÆrÛ÷˜i¾yæ¬WÈúù¦Ç,?ÇrBŸ³bž‡u yO„Ô|ÕÁí…xÚW7»$¾´œTë¸Të `LáFàa‚øòÙ‹ÜëD›¾öVíU@"„/Öˆ0€æÈ&j5˜Õfëéêã±å%ä¿ÖûOÕ MÓR/#Çrr• à550åmSˆº¦ÇÞw…4K‘ð¨¡5êv5Ùš£CBѶ1å% Ó­‡áË÷ŸT\©Å'6Õlç”äRf<àg/œøòý'ê4ßíX®å¸–ïZ®þS9ê4ýqñµRÛü¦Ó›\eSFMÕkÀ¦šëœf]òúÿåØn‡.×W~Šå£0…¢¯Vª?GÎo›nzîtØ—”P,€Õ`ÔùjÇ®çÆ°-'UR³ÅȦÃ>Ùå%mëj.}NÊr€œŠÖ€mMÑ©ÐÔ¹kœÔhË;îùÒ,ázGíH­z´N¨¦©jÁúrBçÍY>æ¡É°VÒ‹¿tÀ±S_-T 4Óý%b–ë+GÎ調ë?BËÇr±M†6€–\L‡ýýÝé$n“˜{±Ùn~íÊé⿨»–€Áôµ·Äf6ºÖq¿7¾Ç –æš X„)€0½{Ñ"‚@ÏŠ\ˆœ£ Ã0u²âÜN­¢ŒapÍ_=!€1õÒ‚Ð2Ã!|ô€ € è®1€^Àè×vÐ3o§H‰ÎVzæ `Æ gSó zAP @0ÀT@PAÔ…86Ûm®õ(ær³ >”ííOÌö.1¾*aéëÁÅVòá<úú¢¯„Õó©IsÖííGéuïy_•jÿ¼¼c?§t¹áÇc+¸%€æñc' öc[8 @0€®ÈãÂüûö\L‡ýýÝé$n“˜{±Ùn­Í®Çz ng¶·/±Û»Dïûª„¯ÇÕÍN¼¼;=ìë«›‡fûM¾&BÐ «ÕjÀ¦_e½ÿR»ºÙýjîv޼O|J¼ßmå´ßõÐm¿æz­Û6ÑØtØ?üôŧ˱#ï/!Æß¾Füán“r»FÝG½#€3=„¥µlgô×a´×¥VM®÷ýJ ¸MÍð¨Í¹¦mòÝVÿ÷²/|¯íq}û{Úfß•9ï9\Ëq-érS0-äýêû<èÓlŸ—گ̚>XýÕ6Bç }b¶I·õ}áÛN×}Û6¶¾ÍK¥Ú^Fúÿåôð‹]§Þ÷kÈç!d9-¾–h<€×Fÿ€«zûù~q‡ü"ñW»íõ½½®÷F,ÛrzxÙ¶ ûuií¼‡×wm`dáû°‡|Œú…ak2Mµ½¾@éy¿ºÖ}ôýº¤üž_ó‘5{ x¡¿:õvª_䥸֕Úp<¹½¹ß1ûµ…×`é:Œ²_cŸÓÂk‡ÇªÕ€M¿V]çøõF’©¹Çm2Y²¶ÇÕ/Á‘ö•‰iûRn¯«–³uþz»Ç¬¯í~ŽåçØ¯)?£}~FÑì•°rÔ¹2”ÛÚ¶w‰Þ÷U \ «r¿q%¬¶Ð  „Æ<ì·65À¼aèj7÷ŠýÖ¦ftê±Pþ‡ÿ§BÓ¦fçÀ1Q·µmï½ï«rÆ2n çhŒEðÚ>l/lØWe\n¶µWÈ"*€×öA`{aþ°TÔ1`½ ¨€ € `* €¨€ € `* €¨€ € `* €¨€ € `* €¨€ € `* €¨€ € `* €¨€ ‚7—°ÙnS¬Çð.7[1öU–Ík¦æk`}°BÜN)ŠV û§…uhû@i4AP @0ÀT¤VMW7»³ûj/Ö«›ó>–síÿÜËåµг®Øô%lûbæ ;½˜ý8·Š&hB¡ö3„麂ð­Gmž–¯|=äcú!}~×tèÙðŒzlÇßM·mÇë9Ž`TðéKeè´¤×ÂV€Q ÀBÂ5˜j®sñºÑ*:a !ÎŽ;"ŸTûØV¯!€Qt]6…ª«¶DM8-×þýÁ£Ïo+‡×À(º`!ü3?â-Ýÿê}[Y¼ŽF´š&hZBP @0ÀT¤ôÝ锢dÄkmYÀ—›mŠõ@F¼FОÅÌù˜íã5€öp € `* €¨€ € `* €¨€ € `* €¨à FÉ ¼ !Ľ¼3ö [@÷BÜ_Üÿÿ-qQ{}X…ÿ±N=¿¢ùOIEND®B`‚PythonCard-0.8.2/docs/html/images/resEditorFig15.png0000644000076500007650000001462007474507554022141 0ustar alexalex00000000000000‰PNG  IHDRà,þ`ZsBIT|dˆGIDATxœíÝÏ’äHaàl‚Ø#0Ç>ö0fvÁ˜¿Ž>ŽÁÆ Žz„=ø0ÇŽLîcE̳×:öqÞf|XkF­II)•¤TJßÑÑU*•¤R•êW™Je^¼x8½¼¿½ Ïïáxw€ù}úátz4áòê*Ó¦À~|:6±ÊÀ´¢B÷LJèô‹pÂEdÚë;oN«ºˆLK\^t™×3ry­ë»/,/iÛÇìó‘˵/Ƽ‡]ûboŸ¿3·}Sû±8jÛ‹‘çN´¼s|jÒ¥IZKÀÀ›®¾üÖèç>¹¼ ÷ÿòqAÀ`cÚJ5Ÿ“Àýå?B!¼ýÙ¿4ýÃ?ÿ2„—>÷Á2Öû¸‹NÿÚ¿þ_ÿk!„o<}7üúãŸ|rûíwçÙ8HTl ø«}ÓÙh%æOß}uâý×}Æß|ûsl;q}s!„7úÒh›^Ô«* ‡ðºô {Vl¸õÛ]\M^þàO¿xtÿËŸÿ‡B¿ûÓÏߘ÷oþêC!üö? !„ð•/|7„ÂÿñßB!üíþiÔ6TÕÎM±*è_}ôãW¥à_}øãGóë†BøÏ~ôjÚß}éŸGmÛu¼» ×7‡G!Ü×»äàË>üË/[K¿üù“ðýÒç¿“¼ÿó¿ÿ>tõ¯¼ÿ‡»ðþïïÂo~ÿÓGÓ«û_úýðõ§ßï]Ϋðýè“ðýÖ;?|¼þèѼ€6õÀMéÚy–sÀÍRp]¾çsæÒ¬‚ž´\oýÎç¾Ý:_U®þ`Ëêç|cç„cfí ëwúy´ ºKu>Jkp•ƒ« ßùì·£ý‚†ðÉõÀüùª SJÀ_ùÂwÃoÿø³AáÛ¼¸ºøk_ü^øÍïÚÚ«ò·ß ¿þè'¯a}óí„_}ôãGç}«sÁЦ­ª¹¯ úâxwûòátz5ðåÕUx8 ƲÀwn»à#Ïóù;sÛ7µ/‹£¶Ý±yîË»úò[£{Âz~Ô%Œ5Ű½xry5Ér0 PU!ŸËxÀAk øÙõå’Ûd÷2q0%`È óð­¼`mž>Û@v½°žß—ØXDJéKHjýâAiõZŠíë—`I.C¢h—Wi×ãÝß*ùë28€c ¿x8…'—WþÃRœÏJ4ª X¡ Ûæ‡[·tMUÐ@22Ùª 4' àXÕs½ºZ ™¥\ß´vž‘c™-ÊQÃ3ª#Ž'—W¯þºæyñpzõ7UçÕÐ¥jé¬Å3°v“Žº,©ºJÂÀšÍzXUK¶Û4Å•Íeønb ë Zi˜­‰Us«úžGýtVžCjâšÏ÷}ÄÌÀÕ‡¼úó‹“-¸ÀXƒ« Û‚4ö«Tè27=\åӼʡº_?îcWBÔ«ŽcÓëÏíú™êÊ‹®êé!ÛC¹˜b­¡ôy¼»ílìU߯jžæ´ê~}mÏ[ÛyîXx¶›ÍÓ¼Ý&%X‡xìu̵ý#€)ÖÐ0ÊØÍP­îÇBµºÝ ÚêþÚÂ7EÛ¹Ö¡•ëÊ‹©¶b0E[Ã` ]¥à±¡¿†Òý–ª©×'h™Ó"Üv®&eôYCÅõªäJ¬$;dy[3äøž¢$;õ÷‰ï'¦6{w]«ç ýÖxî7EórŸ¾c½Ù°ih·­/¶¬”Æ[C·†R i–‚c¥â±Ë a}AÜvÅCß•Íi}ÏâÊ‹”ðOÞµý0ÄìÜÕSM_/6]—t݆%İ9­ož”Û]Ó€r­¶|Î%©|¯Ëâ瀛AÚU NmI0ÃrŽw·«hô[°X 8¥*:6X‡g‡m\k±Ú*è¦z‡êõ W †e(ù´ÆP/©¦Ü®ÊÐuiA¬e¡Áت³cH½ô õÒ‚Ôæý. t‹ ¼&€  ,vpß´s×Q7t}yA?­ Ùºg‡Ã¢Ÿól£!M­«×,á Óx~̽ 0‹]½sð® †ù8®Ø¢5<‹œîZ¬~½o}ZßíTÍç7×Õ·-ÍéSŒU À¾e//=èB׺ÚîǦÀ9VÑô’ƒ.O˜Nê1­ÚÞ´èeH]ƒ.ÔÿæRïOÚ纾68ÁÜó/­­{ÙæqÖw öju×Wê9ƒ.h€ÀÚ ®‚®‡[Êí¦æ¯áØý1R–Ñ÷K¼m[ü‚‡7=5ÔU=;þš%m?®ÙŠÙcXbÐ…¾rÈö¤¬CÓ§^}\¿¾pèôê±×(Î)µ±ãÐøP’ì­ K A C5õº›Þ Øæýµ†o38§ÆÔáJa Òø½÷Z¶]üÿêÓÇÕ`{ß+ùüÌ[3ãm­ÁU—©Â·ZìÅÅñîöåÃéžßÃñî6\^]½ê¤šÞ{/ïVBˇSxxúôÑçµKÛgümUÃm%ÚÔé}ËÏ¥Ú‡cÚ€t=ÞWÝU5 Sy8&ûnH•T>·Ò‹¯> OÞÿ8:½.6Ä<¹¼ [í•xmÁÛ¦Ù0ª ÆØ÷E,›5Ÿ×²ÎSº¤ž"|›! å¶ †¦ªœ[³êøxwûªTÛ7ý¼p©°Ú0iÙ7½9­ØcÖ k±H ¦V•€ïoóSW(Æ;ÿZÃ8Ïì%àXé7EWõtý±jz½¤ÝœŸíyñpòJ >±êp¬Êº«*»í6Ûóäò*¼xï½G 'Rÿ3ÞñîÖ>„‰,~xŠ`l–Ž+w?^<œÂÃgÞ¾ zv(÷R)X£ÅJÀS…oµ,öíÉåUx10|…ðyì;˜VÒ` kn€ÕVfÛ^<œ„/P´¤~ÔÄ¿x)·«’o¬‘T5½þø£õFk>¯¯4œ²”çÉåÕàð½¼ZïI`Ÿ®^Êí!ó½±Þ–ÇcÓÛÖ9vݬ›sÀ@é•€ý÷-ÿ•€Ò%õíº=Öhì9`¥a` GH±Æ”€ïxö[÷ìpXß` çÒÁ:¤¾Ë{~̽ 0‹]¾ÎÀ†c.JÀy8~Ù¢ß I°¦äàe*Â(ÙâÜôäòêÕ_}Zsž®ùÙ'­ ’Í^Ý7ÈöêiÕÙÔ)ç×ü!Üw<¦³C— ¥Z¤VWhÆJ²Uh×ÿwÍÏ>­áðõÍë ê8®o›Ç7¦mÇíË„­ÉzÒ˜pu RYCøÎºç,'wð;>!Ýìç€Ç–XS~E+ ïÛÚÎo½Ä;Tu|vµÙp ³gƒ¸­±TÛí*H«¿G;4ëÓµ,ö'w 8ÅõÍáQ5u}Z}zì~ßüÍe6o7çYZóX\ÝvPul]ßÐÇÈTrŸ>Þݶžáqupu»«Úº>½ù¼Øü]ÛÛž5‰ý`wl³7º¢¤Xk(w…ã¸æP¢ [5YìYöë€a¬µÆ9]B ˜bå.çhq[g®s½Íkü«iõÇúJ·±ÓU®f/69CׯÊk;Ö~xìsêçŠÛæ¯OÝŽožCJŽ¡±ŸìÅæc8·#Ê‘»B{è6§÷:×<%4Âv6C=œ)ŸsÀ@ɲŸŽUOw•šûª³Ç–~] Qž5”€÷æxwk?ÂDv3C}ÞfH·ÝfÝrŸÞ›g‡¼{ÀÖln0†æóR[bVó ßrßeÙ0­ÍÆ04¼5Ü*0P²] ÆP/ÝÖÿêÅ××I„/P²Í ÆPŸ'5P›ÏI}mä¥4P²MÆzáê6Õe”€’é šb)%Ë~0Œ¥¼,û­{v8,ú9ÀK+èå=¿?æÞ˜EŽ®[é ºÉyT¦ |ópü²E9¾9ÜvùÏ\´TÞ瀒i„E±”€’­"€c×7K±ÍÇbó»^w_”€’-Ò«†}}CÁõºû²†ðõÍã Ö>ïõÍaõÛ{±ø` !Ì? û»t,Ìj—! -­*ÝÂ:JÀMÂHµŠ®ë··o~ö%w ¸O½zº ææ´ê~êã]ËM™¿>ÍÈkp§ d?$›—%¥ŽÝÛ5¿¡÷aíáÛ Áê~34Ç>Þ5O=ca,|!¿ÙcHPaІ,“mX{ x.±mBJ³º*hHµ×ðí«^ʰŠë€aŒ5^,TJÀ+w ¸Þè©>-öØTÕñuŽ™_#,Èïâxwûòát Ïïáxwû苪šî|*k5&„·R½4ßlYŽïUÐKè%SM±”|—w¼»µa"˜b ße=;h`SÀK xYöLkösÀÍaa*Â(Ùìüâá¤Õ$³XãuÀ©´‚¦XJÀ@Ép½:9å6ÌE (Ùìƒ1À\”€—3tß=;ìoè¡4ÅÒ zYÏïIóéâÒ`Š%|——R»Õ·Ÿc}S í¶>­‡öu­olrÀK x]ž\^%Ÿ~v°PÇÌXC-çŽBø®‡†—0Üì\…o,„c¡,„I¥œGó82|«ªàªšº^RnÞ±oØÇ”çAª )–ðͧþú2äÇsWhÖÏÇÖo7óoz×ýØtXÚìÜVúíû•]_Vuà+1ï—p^cÃ7„îsÀm IáÊZe-7«®Râz8«¶Þ/á›Ç9%ß±Î)±jðÅZ-2Cý€m¸õ¿ÔsI—ô„•Su –v,* ³&‹•€ÇVEC%à¼Î9–›AØWJ­7ÌêZVs9ÍçÕÏ cr+¢–KˆqxYÇ»ÛIößó¿õû±çµ-«ïy}ÛKÀmç_Ûn7L¥–‚cσ:Ờg¥E˜Ú"ƒ1Ä‹…ð˜ç©ÒÞ/%àåØo0=ãS,á ”LS,­ ’ `Š¥ ”l‘뀛K‰­+uýç<—e(%[¤<¶Ã)ÖÂðàŒõs[_^×ó–âÇ€0P6UÐK (Yön–äš]VvU[×§Çn·=޷ܶë•S¶­¹Îæ<õûmUóm÷ÏY×)%[¤'¬5 ºYéœåvu<[nlž®í²œÔum뀒-À±’djoX)šCž»ÜØÐ‡c:™ªô™²œ-—tÛ_ dEô˹HLUúœòÇÊ–(%Ë~¸nh)®kqIixzÂ(Ùìƒ1ôYbÐ…¡Á|î±Ë­Úžß7OÛrƬkk”€—3t¿=;ìkèqq¼»}ùp:…ç÷Çp¼»}ô%UMßËúÒÖZZ/ÅØðÄÃUß)šß#@œsÀK xy)?SöñõÍãá «±y¯o“ŒÓ;t9móOµ=#€3Rú=ð-S,Ô{´ªFX0„ž°¶Cø²G³—€cª¦,ùíä£þ|%Ñ2)oWUE]æzµuÊôúãS-§ëqjÕqôië.2µ£Ø¶Q瀷©˜ÕíXˆvMo»›¡[ݲUæLÁ9`Š%|·©-Øš ·úžÛÕ°jŒ±Ïƒ6Ù¸­ãæ€cûk®ëZOsþæ5ͱí8gÛ8Ÿð¾ -q¦–çZ?ôY¤VsÔŸ¡}<ŸÓAGÛ8ÄmU×±ycÛ1Ŷqá»CK—móÇ.oš£äª4ÌV}x-%Ë®ªªfyJÀeŠ…b_é²ùœúyÛ¾ÆQõ’pW w-'e=0Tö*è’­¹ïé=¾Ë:ÞÝN¶Û¬«ÁTêsÆ,'eÙB—©­*€KªÊmVA áå)/çÙA•+L­èÁbóǪ»›ÅBs耱†YSìÒ ßåØw0½MÆ ø¶oL c` tEI±„.P²M°Òï¶é (Ù¦˜mSJVì` SžßMiÈÕµ.çšópî(Ùª;â²Ìsź©œk]LCø%S¡{É28 ”,kW}C7ï7§5ŸÓœÞ÷¼®å¥ng׺šóÆoö‡Íù”€’-RÝu޵­³ŠÔjê±Ï«k]}#;Õ§s>瀒e9ܦ­ÁV[u=¯þØ”ÝE Ïõ¾@ÉVÕôØ€\ª‘”’ìº(%[U×ÕÃnH ¶m„1Ë`Ý„ïr†î»g‡ƒý =²ÆP:¹ÏkJYF_ëè¶mѪzJÀËz~LšÏ°}fp·]›r»kYçÌÛ˜)ËOù¨kÞ¡Û"Œ§!|——ò7e?×·áuh_ß& ðs—3Õv@—ÕVAoI_O[Œ£\¦X¸ <öH/@àÎCøn‡ðe0ÅRÞ®ªŠºÌõjë”éõLJ.– €)–ðݦz`V·c!Ú5}èý®†¹`Š¥¼MmÕÑ)¡Ø¶C–KÀKøîËÐóı’í˜åÀ\Œ†D±Œ†´CK¥móÇ.oêZ¶Ò09)S,%à2ÅB±¯TÚ|N5ÛôØsw·ÉË%\ïn_>œNáùý1ïn}QUÓϹŒ¦ºÖ¥8ÌaL ãá†Ö ØÇÐoö°àe.Bw9ÏJ‡05UÐKÉw9öLop#¬z·Š)·a.õS%)ÿ}.5™}0˜SêyÉû[—žë¢ šâ©Jä:`È@@³WAǾ4§O9gœ:ûëHA·ƒÀZ-R~ñpzôW©B5¥ujõ<-Yi£Ï_ $ª Ù”zׂk–5€«Òo³j9vM±ëŒI%|,rR=0§8ë\0¥[$€Û³~¸þ¿~^XذE«èˆ£­*úèá (Õ*¸©Æ‚™6ÆoJÖ;ð1@¡FEÖ ³l P˜Gg+%ÀI3w®®5?ݹóàÒîN½Q]_—kÕšÔ6ÖŠèÀN½îx¢\©¤TˆÏՓ{-í @”=;Kµ¶£}…%)‰”<¦E¤T*íÏkŸÞ›·´¿Àþ´m^U™öyUe¦R¾Ç{U®?ÉòÃþ}â.?ì߇ÏW{ùîõ{”_$¿øÕ.=;fðíÙ0Såí_†^¶§\‘Ýðãþ=åŠT?ÝÒR«a·µ]u<îïÕU4€„9Pi_&êòºË v[ÛUßðrý9÷r›ÿûºmÞ¡ƒóŽÇ?ý綈ˆ ÷-øÖëÉ¿oŠˆÈá·ÎøÎׇ?ýMùüÌÈïµ­ÃËWß~*""§Ž]Š}]@R&—;ΓÄ9¾Æìú{g[áµµ]uL[{?íÔ_Ÿ“¡×›!÷üÕÇk‡Þ8%‡Þ8¤jÚM:/S‡Î·O¿/ÓÃï§R/WeãájÚÕ7¹¸¬ O¯çíõì^lWe`¯‡f>»ªCçåù«;ò¯W_ÉÛß\€ìñë¹éùÙ˱‚Í*ÓZ¾Sï0PØ ôζïÅ^Ð ˆ3×DdÕZ ${v~Ü»±?¾¼åx}ôÍEår?lÝp<8ךþnómóO ý.Týî=ýÜñøÄáDDäŸOþê¹Ìɱ?ŠˆÈ×ÿÜöÚüÑ•ËÜztÅñøôäeÇã›/Ë™é5¹ñ`ÅñÚÙ™«žuòÌxöç: ´»e µ[oÎ>½ê^Hãé:Ã} 2ÒwZFÞ<-""OÞh›Ç º±þ³26pVDD¿ø¢ù{³ùûèàoåØÐ{‘êrïY3èŽ^£ÍûæÉgŽyÞ9òakzvì#¹ûý_óÌ_l…Üïþ¤\×ÂÄJóg²d_ÖÖ¯Ÿ™j>¾ù ‚K3WZ!wý>ã~(.{¸ï Ô³³v]­ß%é÷ «+W’ÆÞ¤®óÝ=»,p÷îâàîÙurãþJ癀°÷êì»´~½+ý½ÍiÝcvXA7ÒwZ¤$òìç/c_gÇG/xž ¯ÃíGÍÚÂÄŠHIäV­sð-Í\ñ<ƒ( ÷{ ÏKÀ£±'ekû®ˆÈÞï†mÚ²&Òºä$xÅ­#±y=8ñÍÓÏÚvcÓvýþ%vc¡•(îŸ4ê!¢ÞÕr4¶¹»Úœ¶_ïIÛ\«Že:Þæ÷Ï·:8ïÙ3î[_Þ’g/ý{tGú—䇭òýÖõÖsÖŠñÁsòxó åAŠn¹ ÷ž}îØ=qøƒ®{vöóG?në…š¸$·]UîÊ.N5O=±Pœ™^“›.;vcÏÎ\¥g‡ÌÐŒ^½7m»±î1;‘ªˆÌ:ÆìT»´ª“=§¼PÛÎ:ÇÎÚX‡û”R»O&>Ò¿¤¾Zš'¬2¿}þ÷Žïyjø¼g€½à,ï×oÿ¡UçwŽ|تËìØGmïunüb[½{ìÇ:&VZå»/Ô^œZu”¹4}%–Ýi@$ÚI¿Y¹)pàËÅú}γó»ËÊ%cÖÑX»cCï €¨÷µÔu_L]儺66+!Ôøà¹ÌÜÂfnübªë‚è)G»cyÔåu—#Â]O(Øï’&õà~vŒàÛ³›,'U£á1 Ä‹ž#vŒ@Ø0aÀ¡ÃÎë:9÷o]º¹.OwÒ¾0+¢¶CZmçµÞ¸>«xÝi7Ìr.ÒyvªË@â¼4¤Û²í‡­—jÙ(å¥)v°Ï“Õ6Ëj½ »±!°qä‹ug[»¼~a!<íWPxõ,q}À¼v tôî‚®Wu«û†æu+{½¼ÊS•vþ¸ÛÁkªÿÐM½ÝÏé¬{zùMÇQ'w=T¯©^‡Z¤° bîDÔ])ÕúTëp‹{#q?î´qt ¿eÃÎï^¯nÚBõZz'0I|1XeG©GRõ,ícv*qßËÊ~_&ÝÌŸu^ãÀÖö}ÙËð ‡ !¤#\:õÖ8¡_"7È놗¦´­® ²ž,ÈJ=Š$ñEøÆÊê{Èj½¢²×Eyݦ{½öÝò$w‹úwMZì=;÷4ÊÄk`¶ÓFåé*Ûk½Ý”¯Z®ÛòÂί»,~ïÉ>o”÷÷˜cÓtÔ# õÌ›Rmc½±S¯ËµjMjëR®T´ÝjEP.â{Ê*Ú:γ`Â.EüV.â{Ê*Ú:€;F ì°`€;F ì°`€;F ì°`€;F ì°`€;F ì°`€;F ì°`€;F ì°`€;F ì°`€;F ì°`€;F8 £ÉÅeÅ¡¶±zÙr¥¢±&ÅÕS®Djg“–°ÙÝ©ë*ªzÊz‚j§N;û¡}àE[؉ðAóB»écÌ€b ;kÏôß²¡TÛXoìÔër­Z“ÚÆº”+•®w»&—ew§ÞZnrq™bÙo«}E¢ `—ØŸý³ Øi³³$ýAs÷¢ìëwo’Aœ§ ί ã^ožÚ ùKØ%ùV­ËkýIoXyÙ»iC ¯b³ËâF’ÆÆ›Åv*ÏuTb »¬ ΧÕKÉZ;„5¹¸Üú±?g­Óü~ÏI(Ę]V¥¼Æc¨<·x+½úÆæêÉÆŠ&NJÒD·Ež¤Š6o~CçîñÇÚ<þSÝßýæ>úšž¯tîÊû’$é#{_Òæ–”×ýW&I:èÌ{ÚÜ âð¾ÌoAKªŒ¡²Ë>$icÂUÍԚъžÏÞ¦ÜùïýÔ²íz/Š]æ‡^ IÚñS—jý#çK’ºæ_æ¤=Ï®:cJÙÜ×8YwÜøyIÒünI¼ì·W5¥ì€ÓïŒ]fàªC$I/¾W÷-;X’tÈÙ‰· ”Ýì9s­z$]Ý=’¤±‘a«r󘊤‰.‰Ý”Ðs~ùôÚãé•Í 7Xd5¯¿þªŽ;î}IíªŸfÙíÀ«åyžÖÝ¿HkNÏE°dµÿiw„®pжà¬{%I%½ °Ö××ùœÿˆ±‘auu÷¨«»§ IEŠ ©MŒ/ø.öƒd¦¦oÚTWë­_/IzÇö õÆ‹×é;œ&IzýG×ÖÕûÓÙ§×ÿfìêºçÞµó™’¤WG¯ª+ßv—³%I¿|î IÒ{>zŽ$éçÏ^.IúóÝ–è¿Ö-•$½wîyzeí¥z_OµÇðÓgêOO½Ï %I/?uq]ù÷Šþ‡ò½øø…Æò`OÅ7¶æóæ‹+j_ßP=Èmù‘/Jž§×~xþwý5Újö"ýÏØrIÒÖ;Qw½÷¯'åϺK’^Y¦_ýàJ½{׳-Ú%½²vò´Óφ«ù¿Øý‚ºû^~º(ù±/KžôÒ“é?ŸèׇÁòïC“·ë½H?~üË’¤í?q±þ¹”<éño¨ïÞr‚>yìµå½é¸)ÛžÂ-V½9“¯;²öø€ÓïÔªkªrࢻ%Oz`bL%Ê!gÔz.~ ¾äIÒ]KÔ—}VGž¿ªVÿöKöOÜF ìü`ñ'Ñ T$ûó7ž¼ŠBõÞ±ýÂÚÍ?¾×B½• ß¼Pí­l3ÑKÉê½sÏSÝMM1^z*z¬$Éé/vý̲ÉSAÿúÀäØJøÔ×î‡\+Û×ÜÈã¡ÞJÐÞÇÝTwZØ>_¨öV¾ásµ²}O¹5òï—äô— G]ð §Ï€`/%x*̆E¨Ø›6¾Q•Êf«cßS ¤·êšì­HÒ?ÿÕÚé¯Vñ{*uwÊæ”?¦"5÷N]¿§Rww0€R ÷PÂc,Ä„Ê4U©ãÖ™±Ù|ú+‰­»Î¼ÉÞ ŠoŸ“Vê;=•}O¾5ßI ´A°g”ôÔ“«v·k¼*ÉEò"ÇT‚þd‡Óôú†ë¦œþ Ž©ø¶ÙùLy’Þ5ç,ýzô*½:²¬öܶ»œ-ϓ޽ë9úåsWèÿv…U+ß×s¾~6|iÝ`ýû÷¼PØóB½üôÅSNÅ©l÷ñê¸Ê‹ ÆRfO\V¨ßéÓKõÂÃKôüC“ƒõÝû]Ñ”K™ö8ô:}ÿžÓêëƒã)’ôÄí'×Ï;úÉóÔ;1®>ýS úÔñ7ë‘?_7PŸTxL峧ߥU×®–Ç¥¼ø>Ý·ìàºúÃν_w_~îZz`­Þç­âtJ'É^q¢B#I¸yc#ÃÿfBÉ·~r} ÊFU¦Ñ™²q-¾áY]ÙW5mÖ6kÏ>Q\øçä&”ÌòšýŸOÞY½ú˨oF{kW€¼2õ:˜P’ %í÷‡t¯9\¯)íXùá»m™úNö¡¡! Ö-oóõ%ëG×Ö–NÓ’¥þzvžµ¡VfLŠ÷|ì2mÚ´qòÂ/ÏTk*ïí_ØW€fs'¼íòYÖ•µaÆPyýç/I±72FŸ›6kë¬mB íuä×4ùQ«9ö9ieàÓ5€ÞÞÞ¶.ïz=AÆPñ¦Í”4ÓùÆ2ÎîÛÍhß§p¦®§²nà˜vµ@ËT"ÙÑS8C¨œ!TÎ*g€3V³›&K:r+…'g ζ™×6&¦‰Û±óÞ-ë©ï‹²S-FÚµ?·Ãû¶:âôoh 랊?§~ÔÚô}Æá2Ó\ýI¾Ùå'´¨íƵ‘pBž˜¾LÉg* –7ª>e|ï%yï ó8ûæÇðÎî6‡wJSH5 —;«i»ÚÈi4´C\0Dí›Q§®lÞ{¦õ›êE­÷IgK*q½•¨o.k$írYE €ú¯/ø —­Ô¬ýÎå{–÷ |‰{*ÁÓX>Ó§—$ëkµ¸öš‚³Ñ©? ˆÒîÏqßÈû¹¨oV¯Åv½ÁsÂþcSP6Y{-¼OàK5¦ÞqÒîH¦õıùdjKx™¨öš.&ˆºÀÈ“¸÷’©Üæ½×k[ï“ÎV÷õÊ…ÓQhÿ;êsuú Pl„ PbôRÐj„ ÀBà ¡p¦á%ū״¢@áôõõ9¿j’÷ò$Í>nuŸÊÐÐPšö¥µbùÒ¦­›÷ò í>n}óãºWvLµÉñ~CVëŽI½ìÂEKR/ël–b@¾Ìž37ñ2ýýý™¶™*TÞúÉõu¿oñáS35"m\m7¯( —ïMd×êÙRR_ýµÅ‡O­ý>(›ëØÔ[O–壴ëõ@™î’bÿÀÈç¡þÔõ‰>ü8Üñgí™díEäíõ 3™ö©¨òpYÒçãÖ›¤>:SêúàÎcÛsÖó‡Ï¿zœ„í2Ey=è®N\;oÍœ½:u¨Dít.µò [¶×ƒòjÅ~ ìÃÅübµf —¨CÏ£¼}¼ M¨/ÛÎX¶×ƒbb?DQßÎëú럩/É5=^¶kº„×u÷ÚöTVQ^:OÔ>Õ¬}Íö²ú´õÑ­ún†_'ìE$ÓF“Ö £f| 7ï7¸’võ÷ÁË—&Zž¯8g}ú‹î-0©ÙS_ð~CV­žžÅÇÕ_PRY'‡LƒP ÆóÓ|fI&ÓìtôT™®þIê¸Z6¸L£‰,£¶—¶}6íG=MÕC@9ÑSÐTq=”O»z*„ ”=FÅ“^=ÅÕVž Àz*g¸ú @C6EÚ”£üè©h(xõV80Âåþ„‹¦ú(?z*bP¶è©ˆîyØàÞ”ÎÅÕ_šŠ^Kg¡§ –?.búž”`yx‚Æp9:c*ŒMžIë£<詜aLà =€3ôTNù=ޤ?{{{So“z(©4=ŽþþþLÛ$T Ä²Œ¤A¨9çßcâß›ÒhÂÈp™ír€ „ PÁ›Ã78šê˜êÃ)j9 +B(€¨ƒ~Ú©W˜²ÍB¨eêqØ¢gÒyºº{"Ÿv¶.):½–Î.E"T€ÂŠ›`2ÉrôZ:G8@\ŠD¨¹>è‡'˜ _JÔ”QË¡³øAÒŒ@‘è8Í ‰P8D¨œ!T€`Èçª/4÷© ÑÝø(§¬“C¦A¨@ -\´¤-Ûµ •Ë—¶|¦K S5óý662Ì{¹C¬X¾´-Ûm*}}}­hñ~Cñ5 >Õ­Ãû EÇÕ_g€3„ ÀBà ¡p†P8C¨œ!TÎ*g˜PS ¬^Óî&Nôõõ1KA‹*0jw€LÚ5¡b§#Tipp°ÝMR£‡ÒŒ© ðøC ?€3„ œñ{ Q=Ïóêþ / øSs¦ïC>ö™Ê=•ÓÕÝÓî&Ô(@ùÐS•à)ª`˜N]5ê¡dÝNpÝò…PACá`ð7•‡% ÓvÂë —.@~*O) Ç–‡ËüßmŸ[¯Mý`Y°N#­:pÇ òÈ?B%£ðÁ9xp7•KSƒ íóquâÚ^‡V˜¶cÓ#„ŠcIÖiD ¶·bÛ’»«¶­‡«Ã€â!T &ªçÑLáq ÛñŒà¸‹©n80Òn@~pI±cyºd×%?LA~.X'üØ´ž¨:I¶ è©d÷+w½½´õ“Ô€ old¸2{Î\fôDÍÀê5b–bÚúѵâØÖ:þqƒÓ_g€3Œ©ÀhÅò¥œ6¡‚)úúúÚÝE¨` z(ÒbLà ¡p†P8C¨œ!TÎ*g€3„ ÀBà ¡p†P8C¨œ!TÎ*g€3„ ÀBà ¡p†P8C¨œ!TÎ*g€3„ ÀBà ¡p†P8C¨œ!TÎ*g€3„ ÀBà ¡p†P8C¨œ!TÎ*g€3„ ÀBà ¡p†P83£Ý €<èêîiw cld8ò9B&T*•v7!×z{{544[‡P€€õ£kÛÝ„\X½Æªc*g€3„ ÀBšÄtEYš«ÌŠte¡—§Ð!TÎpI1´I¸‡¼©0ª÷,×÷ªÓ „ ´‘)‚á—ÇÕ–›–me°*P 6ã'íc!T  âz0A­>åÄ@=”X«{-ôT Iüñ‘pYi¼Ä´œMùØÈð”: Ô@‰4:¨G=Ÿ¥œÓ_€R T MÚÙ£hBà ¡p†z°ý†C˜*0¡···ÝM(ŸÍr¦ƒ®© ¶muÁö“n…ƒ£Ñ¿ÿ³ÙÿQí±Y6ªTöKS!¿ù1ë'åFŸø‚ÛÉû7é+ª÷Q&izQûTÖ°²]WxEØ?Ñy *¼‘&%ù[D¢ë4EVEe¼¤ØåyófKÓ΢¼¶f‰Tv-ok›ƒu°ÍIÚßèJ¶¸íØ´1oKÀ$²§5¨Ùèœuœ¸Ë!m×—¥~Ò+’¢Úµî¸ß“n?Ë'Õ¨í¦/Š:MJ³O$]WÒ@ˆjKxýiÚo;F•õocÛNz6È old¸2{Î\­]«Õkš6÷;}1eýwsùïž·}ˆ¿ óchhˆ;ê/˩в4ùÛSµ,TØé‹+Ëi¸v·¡ÙøÛõ詜©¨ïëëkW;%P*Áoï ©’ÔßßßîvJÀ›7o^¥Ý”Ãÿ“ºëi.p¹IEND®B`‚PythonCard-0.8.2/docs/html/images/resEditorFig18.png0000644000076500007650000001100507474507554022136 0ustar alexalex00000000000000‰PNG  IHDRhð-§þOsBIT|dˆ¼IDATxœíÝ]—ÛÄÇñ¿{x\ötïê»ú2§´eC OeiÙ4„,§Ï t”HÁy 8ˆCiB¡@Ë¥/÷rßÍö‘2šÕH#Y¶ÿ#?çìYyV’åµôÛٙѸ±¶:Xïu:²ÒëK¿Û€·­‰‚f«5¥C˜nK+´C0y©-"Ò믎å ÒiËÃ…[Ë"Òh4’Û½¶7Ö)󜥶w¬Sæ9½·÷8®2Ï™¹ýÞ¿2ÛpÎÌö9co_¿˜öÒ9kКÖÖÛKo;×lÉÚjùæÝ¹fKzoܨä8¢ýTÐ7~î%ÏoZ¬b·PX™>4s›Q·¯r?¹}ãç^fàÚál–Õ1¨/\;‘Z¾ãž§SËÏýŽˆˆìÜþŒ|vùmyôÞg+=¦³_¾‘ZþøC¯Tú<“ðÎ?ÿšZþìc練¯œi‹ˆÈó¿';}(^Få°ãõ–Ðó›ã6ƒ× îõ›ë66<¨¯‡ï9¼±#$ÇÎ{Ÿ‰×ûôò[""²ë¾ç*;¦½|9î<9}ñu9}ñuy|a:!Ý9wDDDÚ»VJmÿÌž¿ÇËvœ‹ÌÇN‘ö½_êùÍVË+È–† û^Wy$7 ¿û¹'›o±ÒPg‹í¶óg½Žÿ}ýnG–Ú²°ÔŽÃ8/œE<zó¦Å8¤¿»Λ%ܯ‰Èr´ACnÕ¢-ßýï“xù®ßþYDD®ÿ÷ãÄ:[ïx,^¾öã™xùžß?/_ùÏ©Ä6Ûï\‘Ëß$""÷Ýù¤ˆˆ\ºñ¡ˆˆÜ?ÿ”üû»Äë?°y¿ˆˆüëÛûùã–ƒñòÅo’ÿ&/Üí~£l篼“ZžÖÄqîÒñ¸Ýûw²¶¹ûçEDäŸ_‹Ëö<ø¢÷qDNõ_‹——^‘î…åÄ:Oþéuùðó5îýÜjBùà|òùîÛ{Ÿ>—™µæÎ¹#rxñ¸œè _ã_ß’w?¾þ§w¿]ô¥ˆˆÈñ³‡SËÓš8Ž:(/î¾Ïov$Öù‰á9qô£§â²Wžü°Ô1¡¾ªº/Ä i³,Kî0»Fo6jÍæò²½Qο£v8o¹cOÌßütVDn…óÝ¿Û+""W8-""W~†ó¶?ì“íó×ßwó^F, 篾=)""Þu@¼kxá~y}øïðÅëà ü¡­‡ä¡­Ã‹¾-ù‹¼põ„|qõ]ùâj²môó+ÃÍÙöWyd{z{ª)çKÃP[¼ÿˆì¾vŸ|õ·Äº~ð…Ì}ùò¨œ¹xTN_†­Ý½oáU¹ÎO<üš<ñ§axøErݧv•§v‘“ç_J|?°óM9°óMyÿ³ä1z4yÌe›8ÞþøéøË…ós{OÈ‘½ù5˜¨‰# ç—–NÊKKÃ÷Þ fÂãg²ÏÔ…Û "2/vçá­†çõ›‹EÆ_ÿéã ewÿn¯\ûñŒ\ûñL¢ö<.fí9b×¢Mv´fô8}ðYñZ|QÚ 0kÏfs‡‹Ç(ŽOd~Ópy\mÐ[îØ“zWPÒW8=‘¶EµgßNªYÕží»×¸ÙmÎv›tšÜ&ŽùM»åÆÏöãá÷uc9òšDWé(w\~óÓÙDǵÏlhâðµ?ûúòúûq‡­ÿMgC†Ív‡ËáÅã""ònoØþü—Ýoí¸€H‚ö×4ŽC$½‰#ëx<ÇA—Ͱžß´ÛXk9±oHoùí¹þßM[ïxLF¢‰CäV'á¶ßï“+?œJtn¿sIÒ{ï|B.ÿ‘\ú>?œ¸k¿|õíÉDGaÔÌñЖCrñú{‰&»“ðÂÕäxèhôŽmOËçWþîì(Œ7»äîþx¨“p)2R#‹«–œ×ÄÑèw;뫃A<t4®Ïœ,)k´ëFW9ßèžø&ê,Œ:Ë<§ëý‹GrÜ h&KªÇ9“»ý$Þ¿›ë·¶Þ^ú¾•^_ÖV‰í}nDY âíÍ[½G9ŽB·zÏgŒƒvµE3N‘(˜E†Ãì¬,*5ê°¸Qoû®ê8DJÌÅAðÖÛ“;^ßP›•ÙÄÁˆ ŒÓ\s´[¯Gݾêý0›€Úˆš¦­ªã`>hPÊYƒ^\hNò8€Š­;–pPƒ¥hPŠ€¥hPŠ€¥¼ÇA§Íºä3]޴ؘ“h=f KÚ¤:Ó8—¹†&§Ð*¡¼1¡ý1|Më¼6Ÿ‡ëhrf¦‰ƒ“ @h Õ £ÏÔr…]ÚgmÙeió¢ùŒ®*k ®çÍ:F‚¥MqÍ;œw ¦íÓ΀"׊«t.û ²ÿ%²ßØ´ÀÏ à*ßð´çÍ;FšJ0MY!ë:G]Í>×`Ögè¹¶ãz©Ná€ÎªE—ý¤‚i|ÂëyÍ×gž¤v0 ã:ÿª¼v¹^ªSªm6UDÒþšÙߤeoÚ¡¼æ deÏë¬O ázºNÂqÕ¦}÷k¶EËie@]Z›æz©Né6hû—_öÍHÛOŸ¿ÊiÇboã:Þ´ŽLWç& QÖ5•Vîs fýW™µ?®—Ñ8?“@½ÐäuM€!˜ÔžÃC@€R4(E@€R4(•9šáv@Òb»=Ñë‚kp6¸Î«ÜUVzý±ši‚ଷ¬óÊïNÂååŠ@)\ƒAèÿòöBëçÝ}]ét£0ëš­–×z½Nþd…zmû|âñÜ×7ŠîbdkÛç+{^ ¯¨³*¯×PTÕwPjÇÜ×7â/;àÒ˜ëø¬ŸµŸQ¶w™Öë€,A ³‹BfA¥m×&]5M{Ù®GË£Ö˜G­Ýj{=@$íÜ2?“0*ç6S`xï¤?³“k0,ý_Þ^èüÈû,XÚ  "e‡Ó¹x4ÿ®Óú“k0Ûçeu0ˆkľß]‚º“4«2œEh xsÍüÙÓ|Ö©r»YU4œóf¾# š›k¶dmu´æ‚Ú5hPŠ4™k¶â/ßò¬u²ÖÏ*CRÕ5h†Ù±›,¢àL+›å®uòŒÚL2+ÌûHò¾çÍÍA@52ÎCø™êG^Ð+¯–ëª}£ZSýÈ+ú1´.|Ô À¬­RCÔ.O«Mûl›¶NTF;ôdÐ@€\Aé å¢Ûæu.b2hâ¥hPŠ€¥h`F¹FkÅÁ¨ñ! @)”b˜ ´ñÎÑ8es“%ù†©Y^dÿ.i“4e=—Ï~Š>žV8/,µ+Ý Ì€Iv¬ÍrÅÚê@Vi¶Z…¾»ÐÀ ˜åМ¤*ÃY„NB`æT]›Ö¾¿I*ÎÍVök¥ Ìg²$×:vy‘ýÛE÷“Uî:¾´ùEŠL5 U×  h 0£N–ä*w~ðÙÖÕ9ç3ISV°æ½6Ÿ×>IejдAØÀUsEyÔ T‚@®^Õ5h:  "Œâf\^‡\ÑQ!šÐ¦êQ4T„4(Å8h1ŸI|ÊQ FqˆùL”5a!]-ÆAˆÑ!¨ 5h"’>ÝfjÌãÅ8h• 6]=jÐD${’"ŸÉ‘¨MW6h`Æ2Y¶É…ê†qРw€RÔ @)jР5hP, ]Ÿï KíÌ}1Š*”×léu:¹ëÐ@`̹5Dò'C²Ë|·CyyM¾h @æmÞy“$™åiÛ1‰’^4 W€–½}›Û¾u" š(3yR„óx¤uö»ùmÏFqH 6];Œ‹„³5h 6²&O*²µéjõ»YXjgŽ E&OòYFõÊ„³M  JÑÄò¹CÐ Ì ´›Q¸Aetysk•Ðýn§²Û7Žk0mŸ\ë£+Ûè’Ћíjÿ(†kp¶e4MéâœmŒâ¥hPŠ€¥hPŠ€¥hPŠ€¥hPŠ€¥hPŠ€¥˜n4 ÌË€Ð-¶ÛœÇÐYéõ§}@)UOÅ9 è1©:BD͹8Ú 16Ûvšö!A# @)zÌ5[‰ïi?7¿ìíL=EUÀdž¨íÚáµÕAâ‹`t  ±€ŒâœYÛ5ƒ5­Õ–í媞Ǯ¡ÿê׿ñÞ?€jÐf³9î2­Ü.‹ûþë›eeƈÚ!=N+· ç´ç±÷c—3ŠM­Ú:3(ÓÊE6†jÙŸg­“uö>ŠšT{qV#€ñ¨U@Û&qç’«£oRwMMª½8íy|jêÊ£“pQ8úš¶ª2o?10µ®A—mÛ …=$ÎlÿÍ Q³:m]»¶\öyŒ¦VmvÌE³Ê«~¾²ëò‡ÄÕÄ‘Vn–¹–}Ö/ò<Êkô»õÕÁ@Vz}éw;Òlµ˜ÔD©è} %·í:$Wν7íÀ«ƒùRmÐÂM­š8fA¿Û¡Ì: ‹íÉÎÝ`ºè€Psf mР JР JР JР JР JР JР JР JР JР JР JР JР JР JР JР JР JÝ6í¦f«5íCÂ\³%ýn§Ô¶4€ÒVƒi‚j£þ~hâ¥hPŠ€¥hPŠ€ ÆÂRÛ«¬Ì~BD@˜9¡8 J1@0욯yˆ«Vl–ÛëG]ëL (i!k†mTžµ¾Yž¶­–& ÔšO{³Ö6i@meÕ¬MZjÌ6: À ©6M €Q{²]fJk_NÛΧ¼ßílXGSmš€ J^@º~>J¹¦P6ÑÄJЂ¡µ¦;.4(E@€R4(Å(¥ñ™„ãE@(e®É§z  ”YQ1 ´A€R4(E@€R4(E@€R4(õ š€N Yô»î %ë"ëõ›KÒ˜öñnú?'œÎ£‹wIEND®B`‚PythonCard-0.8.2/docs/html/images/resEditorFig19.png0000644000076500007650000000562307474507554022150 0ustar alexalex00000000000000‰PNG  IHDRÈÜ5îsBIT|dˆ JIDATxœíÝ_sÜÔÆñg^/#—¾Ük RL!!Ó„64!uC:ãNK[ I „ÖþóL›à”„ºÓ˜n›6Æeh!\ï¥/ónÌ…‘#k~:G:Ú=’¾Ÿ‰­ÕÉÒ>+]ŸF÷w§{[Zßšh²¹!<¼;š°4/hU€ô<ìšX 0T΀HÒÖdW’4ÒHûÿöþÍ?î;_¬v\óÅj§ÍõþrzÒëØÑm›M‹å¡¨­=Szºl¼üHíçYkëò'’z¬N_ºø¯€|üùûÎéO=þrð ø˜Üý¸ùäÓ?¬ÕÖûÿú¥$é̉×­†)èòä£g:A;÷®ëîgï韋ºB“ýp¼ðÔ$íwÄ>øÏïµ}çw^!Ùº½.IzéÙ×$Iß9þ³ƒv0\+«k’4ó]_Ùô t B€,ùŸ­/È£õAî|zM’ôÌWW%Iþï]IÒ±¯×íO®ÎÌâë߯½¬›ývfÚ·ýäÐïù÷¯ôÒñ×fN±®ÿóò¡ùÎ=I’tmòæL›ßûæƒiW¶/ü|áÔå™y‘¾Éæ†VV×…¤êê‘ #È?¿¡{×µsﺤz}ãO\$ÝúøÁÏ-zñè«úÖÑK’þzûׇËN±ònÜzG’tö¹7ôòsû/ø?ÿã­™ùV_ø…$éÝ~.Iºº½¢WN¾-IúÓÍ7¯;#ŸK«‚òä£g´üØY-?vV’t÷³÷‚VîÙ'^ š²pä?¹¢+ÛuáÔeŽ æ:ŲÐñÄÑ£ûò}WŸÄ¥•€|ôÿÍ6š]˜«Û—teû"!é0W‡Ü'$Ñ:éO建ó鵯áXY^ÓdgC¿û‡CÓ]ñþíÃßüœuÒOû©¶n¯tÒóΜx]7n½s¨£~îùKRÅ'ÀçO¾ui¿“ÎÇÆÝRÖߨꇌ&›{»ÓéÁx¥ñX»ÓiÒ+Þ¼³ÿ)Ö‹G_íäuÙô¤×±ã+Ž—©ýMúúÖ„KMÐ1†mt2 §žùÑÁ»àrd)ÎÀ¿N¨’"5ÅǼ€¡ôrzeižë§½Â¿˜7Ž €€` €€¢$ÊXÒ˜*×:fÓ½þ‹^>ˆr©ÉÊêš³ZDW«Å/b½óÛ««Û­Z;Åb'£ær±¢«ŠDqZqÄWÕãV»>óW­oÖFȲ]í¸Ö/¯Øf~¹MþÆâ¼¨§õ€wëT¢ø‚}ÜšÇõ¢Ë¦‡®¿ÕVÕ)¦Ïz‡´Qµ^ÙÏ„£™N_î^ö"ù¢ð9:,‚k½ò!!qt6 u±¤útáP_kôE¿ÃÎS*k¾ÿ‘Ê:u]”#ˆk‡äÏ«CJ=6YfÌùCÚ²Nw\󸦻ÞùC·]Ù‡Mê+­j‚vð‚í.5 dÎ8zt  0À@@ 04þ&=ôKÅÓkk|‰Îˆr©ÉúÖÄk>¾@×D;ź¿;­ü¿JÛØÅj?åñìˆkP}G°ªk©¸’¶_ TgLù\:žÌ5=t¬yñ1 O'R66»lT¡ÏhØãÖÑ_ƒ=ÅŠÕ!DýÖ‰#Hª8ýê¿ÁAÉA\ä²±Ùe©Öý¨•hQ­hCŒËGª¾_¨š^õIWY¶b¡W{U8Ýê§Æ9½¶¸wÜx›´Wœf}YHQ†~¡ª ` “` €€` €€` €Âq€Âq€¡…ãRÄä»n1þ†˜Û¡N[)ÐIÄ<_|uǬ qÄer)î€ÔwˆëEãúÓËnJnLºß¡µUÓ¬éùÇbßçÝZ¾Ï2}ÿ&×|!ëúü>J. VDɯˆœ5-[†õülºµ¼¦£«=׺÷-xW6þÞwÝÊ–94ÉćUÉ$«‚R6­ìù¡Ë+[vÙ¿!í¹ÚwýܤÍâó†€*I¤ª0‚5½ø<ëH’ýî³>±´UÞ´î: [rôPÅûräOÉ\Ób-¯¨ĪÇXf¬ùQ.É#ˆT}”(ÎçêTVM³Ú­Z^]U˱ åù¶ÉQ!žÆev§S-ÇÞów¥¬PŸ;¦Mþ¶>o—NŽ‹iH÷©{ú7´pH ¸X1UCÛñu¿IšÎwÒ6À@@ 0À@@ 0À@@…ã…ãCò…ãú::®ªHÞ"þîeöu¿%×ʆ¯2ï£mèX¡‘K. CQVpŽÓд$7&½j´›U -ÿüüãeÏËOwµÚ†ïtUEäªjeYÏ YŸbm²¡8¹€T )ºVUX-¤°\ÙtŸ¶‹í„¨ÛNÌbrC."—d@¬£HÓieËñ}ÑU ©yUU`Χ˜êŠÏ«¨>I2 ’ß9zÈ ¤ØœË" ÎÍ»(ÜQ4ÈNú" Ëùœóm?´PÝ>qjC²GÉ]­ÎŽ)6'¹;·¡…åbs«ÛÅäâ p\ÁÐ:¡êd¹Q8’êêõ=…ãf a§— ý&}ÙI|À@@ 0À@@ 0À@@…ã…ãC´S>…᪎e’R²ž>cÎC—Í%éó“܈BWáyìä:…ÓBĨ R·¸!©N:`HîRÆ*ðV·è›«M«^V躧µYÜ-#F<ÉÄÚÙe/ÚºÅÝÊÚ]O«°›Õ_‰YÜ-F‘:ÌJ. míØØeoýj)ÐyK. méÛ ©oOªÙI÷- Ê© :y±Š¢Õ-âæê«Xá(ë+U·+ÖŽUÜ"qíˆÉæF”ËG¬[|̪µë;Ý·Mßeø.«*„u^à„¢Ž+H¹óKq·ùk\zè³AvÒ_0À@@ 00&00&0D;ź¿;­üßGv‘ ëÐ!Šw²-{Ü· SR}üE|1oÍ\¶m®Ò—T@Š8%âuîrwßûšÇlÕT@ªÆG¸ XãºC5-Ö€þI* ’]|À*ÎVWþˆQÌ$:š¼˜]ƒ¦8z “T'=ƧE±Ž&|r)±#H1Ú1ÇuçÛâ)±1éY[>Ó}Çu7)À rLzH?ƒþȰÍýbÅTĪ`‚~Kª“¤†€` €€` €€` €€` €€†ÚCn)‹ã¯­a»Kãq+íöÍ‘¥qí}ÐhLºï- †êÈRû/à®Ö˜—¦Ûg°EÚÆvéú €€’ªÍ¢ø)šuÛª#†³¶oÛËMi_u2 ®X¶aSÛà]²}û®×§XCÝ©mêvìäÄáhëvù[âå§—ÍoMOIo‚ö”õïBî!Ù•~bo­ÔÚSv™‘ï ªÚIIo"’6¸ÞùëêÂ~éu']â~ƒ±ÄÚ†eí¤º:yq½è­w#Ž$a¬íú†Svɘ÷–lS'"U"d~Ìjº}}îoß…ýÔûS,  ` €…€¡Q@æ1æ6Þ ÚÕÙyÁÔ<ÔHjŸWû }tÒ 0À@@ 0À@@ 0À@@ 0À@@ 0¢1âC‰b}• j¹)ŠZE)* ˆ¸ˆ$*VQA„@À UÙxO¬Å‚‚½è£öñ‚µ¯’í›ÙÌLfwgv¿{Íëõ‡;9{ÎÙßàœ}ï4¶lÚ0˜¤N>= “d¯'ì7Óc`[±bE’ G%Inß¼qÆÀü°°õqøeµ{o$áÿiùš¤ÑèøÚëzìøÒèøš4F¾ßßzý£ñì£sýŠûܹ~å}Þi¼ûè\¿â>¶þ”Œ·`ëUÞçþoÁ>z{w®7%ãÙùü²÷îwŒÜ^0ƒã`žYØuéaÇç~÷wòë{†²u(J²hÁpÁmû¿üæÞ¡lJ~óÛmÙ}Ñ‚üöÞmú½=²pË`vÿ¦Óhc9jßûMxÛåË—gpppRÛ{þu%ãhî§Uרüê¿Î¯~±5Ùm(jd·ElÊ=[“ mK ’ƶ,{̃²þ¶ç™K÷ÌM–f·G^šE·}&…÷ð@v¹Ž½æºueÛWï§©kTn9eÜõó­Ã'‡²ý„a’lŸ¶¤‘d([·þwµ(ë6åÖÉiÖùÏýÝN˽ü­cnóOŸ™$yܳÎÉí7½)I²øÀsKÆóµµ¯ÛiÙ~‡_X²ïɸ郯H’øª÷½í'W½Ó²CNº|ÌmÖ¼ãÈ$ɧ\•«/8"Irä©kúþÙ0ßíõ„ýzš‘,^²4I²eÓ†ž–wÓýšJ’íS’´LS:¾×\¾ÛÈí݆¶Žûç²?_¶¢ýYcxÜg<ëgªì{è»Òh4òÕkNÎÆ5'ÍŠ°LÖÁ'~¼ãN£;ü W%Iæéj g£~¯ùú‘^lÙ´!‹—,Íâ%KGÒOP’1£’ c(;ÓÔz7C²(»Ý{oÛZ¿üÖ{’$÷Ùó„üü΋rßÇœ˜$¹û›ïn[ïö:iäöO·¼«í{ÜûõI’»6¿£mùƒžxj’äG·œŸ$yÈ“NK’üàkç%IþdßÓó__]™$yè~gäûÏÉÖϾû•öÓSßÿ¬$Éw¾ø¶¶å|ÚèÿG5ÝyóY]—·ÎTš¶¬;#Iòøƒ†ÇuëolÛfÉs‡ïË×ÿqø¾íó¼ rËõoÈ“n¿ïcÙpõðË'ùî|åªó”\”$ùÒ•'´­÷—/zo’äó?~§},{ÉÅ#·/=¶í{Ïxù’$ŸùÐ+“$sIþù’còW¯üÐÈ:ë>ðò$ÉAÇ~$Ÿzÿß$Iž}Ü¥I’Þ÷Ò$ÉsÿhÏ÷iíª£º.o©4]õöÓ$/8mxÆråy‡µmó¢3Ö&I>~Î!I’£Ï¼>ýûƒó’7_ßóx`6ªz­akXZ—õjœ¨lKÇE•1Ü“Ûîíú_ܹzäöÝw ÿ’»ßc_›4ùÙ7.ÌÿÞ~aöØëäüÏ–UI’û?þumÏ÷þÉö üñ’S’$wmº ?þúÛóà}Nía\É÷7î8íô½ ÿäÿôÉg¶½.á;_ÊŸ=õ-I#ùöÞšÿüüŠ<ª%,ÿ¾~ÇíG/k¾uó[’${>ãmi$¹ã³ÝÓ´øÀsGîÓm7žž$Ùû9祑F6ßpZ6ýÓiYò×oYÿ–OžÒÓýëæ+W½väö—?1óý_¸:F#_¼âoó…Ë K’<íè÷¥‘F>÷±ã²þ£ÇeÙKߟÁË^$yúËþ!i$7äØ|öïÊ3_þÁ‘í>}É1;ýì_õážfsÝ\Ñ‹GnrÒåY{ápP=ùʤ‘\»ýšÊhŽSyÎk.›Ý¥†Ð:3hÕï©§ªq´þÜnïÇ2FTú JÒõšJ«?|̉¹ûŽ‹v:ýÕzM¥é{¿>$|Âò“ÍïÈ]›.ùÞƒžxjäÁûœ–Ýr~~ø¯ç÷4ʇ-}S¾·áœ¶‹õßÿ¬ƒƒƒmÛ÷òñ%·oÞ8²}ëÛ´LfÍýì½û#˺–â!O=7÷Þ{ÏŽ'~5º­µ³Æo~ØûÊ»°^^ ßëö“Ù×dÇÑ©kTîþÁ·“1_È8úi±»ß²cb=íÅïÍŽ?µ¦ÆAÇ]Úò×5°|ùòݾz?­ºF¥±`Q’Eå? €t}wß™0ãðy*”i›©|uÍKgjÀ´å6Lž™ eD€2¢@Q Œ¨P¦§w)îöFbý¾òtê|s¶ÖwÛœ­c†nº½ÑàL<†;ôªç·¾Ÿ+ª¹@ÏL=ž[Žã‡^í§¿Ó£ç™Jó=õGûÝíóŒ;—u{¯þ~>¹ò/´Ñ~îXc'f“n¦ÔÔmYëòñÖï¥xÍuë¦c0ç ”?kÒñÆl2‘ÇxO¯SY¿~ýDÆóÖêU+§lߎ7fƒ‰>Æ{~ñãààà„~ÌGSýº.Ç3m¢q×T(#*”ʈ eD€2¢@Q Œ¨PFT(#*”ʈ eD€2¢@Q Œ¨PFT(#*”ʈ eD€2¢@Q Œ¨PFT(#*”ʈ eD€2¢@Q Œ¨PFT(#*”ʈ eD€2¢@Q Œ¨PFT(#*”ʈ eD€2¢@Q Œ¨PFT(#*”ʈ eD€2¢@Q Œ¨PFT(#*”ʈ eD€2¢@Q Œ¨PFT(#*”ʈ eD€2¢@Q Œ¨PFT(#*”ʈ eD€2¢@Q Œ¨PFT(#*”ʈ eD€2¢@Q Œ¨PFT(#*”ʈ eD€2¢@Q ÌÂ^VZ½jenß¼qªÇÄñÆÜ6nT¦c@oÌ}ãFÅ_L0}oÌu®©PFT(#*”ʈ eD€2¢@Q Œ¨P¦§÷þbײæºu3=(100à] ¦™¨ÐÕúõëgz0)«W­œé!ì’D…Q Îô`ÂÌPf†k*”ʈ eD€2¢@Q Œ¨PÆëTf™ÅK–f˦ Y¼di’d˦ mßkj.ï\ÖÏv­ëT•Y¨õ~ëíÎPt.ï¶]g<šÿ`*ˆÊ,4Ú/üÖG?&º@¿DeŽè6ãè•Y 0]\¨ßصSÉLeŽh½?™í\¨¦’¨Ì2¿è[ÿÝ-£}¿Ÿíª8ý@Q ŒÓ_tµzÕJrôMTØÉÀÀÀL˜£D…˜¡åš eD€2¢@Q Œ¨PFT(#*”ʈ eD€2¢@Q Œ¨PFT(#*”ʈ eD€2¢@Q Œ¨PFT(#*”ʈ eD€2¢@Q Œ¨PFT(#*”ʈ eD€2¢@Q Œ¨PFT(#*”ʈ eD€2¢@Q Œ¨PFT(#*”ʈ eD€2¢@Q Œ¨PFT(#*”ʈ eD€2¢@Q Œ¨PFT(#*”ʈ eD€2¢@Q Œ¨PFT(#*”ʈ eD€2¢@™…­ÿXsݺ™sÐÀÀ@nß¼qäß ;W8ü§u@ÌNPFT(#*”ʈ eD€2¢@Q Œ¨PFT(#*”ʈ eD€2¢@™¶ÏS˜©q0´E¥õÓ» _ “dÅŠ3=æÆ²eˆfzÌÿ{lÎnIEND®B`‚PythonCard-0.8.2/docs/html/images/resEditorFig20.png0000644000076500007650000003423207474507554022136 0ustar alexalex00000000000000‰PNG  IHDRúEwEsBIT|dˆ IDATxœíOŒgÇqßkȃ-°…\e0 öÀà “ÜJ–)‘\’K…r(QThÙ¢GRVÖŸ:1H ;–´ãŒäÈX¶üC,[¤HQ”dÙ‹œ~/4^(¢à“t%2dr˜íÙþ½íîªîªþóÞû~€Á̼~ÝÕ]ý¯^u÷{{7O¶§Ç‡‡tíxC›£C ÅOœl·;.tÊ ˜?º85*p\è0/‚HÇñæ¤zöhÏý›„ï…n¾uO,lï,0‰œ½D˜TWV¶¬93Ñ)ÑÞÞ:ÊŠöS í'OÚÏ2’y ´Ÿ8h?wÈHå!ÖvæÎÝ?w3m@¦xõ¾7±÷¼ãúß”&¥È€|õ¾7Ñ3—/Óå¿ý[zó›ßL¯¿þ:ÝsÏ=ç¿¿ýíoÓÞðº®ÃˆÀª9¸ü3Åq/^: ›'ågS.^: ãÿüªI>\:D…$Ñ3ûûtï½÷ÑßøÆó߯Ýuýèÿü½|á»DDôêõczÇ}Og`î”Pöãhã[§“m@:ïã½ÿø;×_»ë.ºADûß'úá…Ÿ>»øÜsÙ™”ðò·þ;]þ…_­’¾%öêïÑ;ßñkw„ýé×þ+ý«þ]³ül^>{×ç—¯Þ¾öÒÙµw?üÑfùÈá¾üDDôoÞù:çèËÏ^eïiñ^ï¢SØÏß{/}äµ×èî»ï>ÿù{{´ÿ}¢ï|ïtƒnÐç^~™®_¿n’ɯþÅçé«ßú¼IZà gHæòů|š¾ø•Oç­yâÙ«Aƒ4vÝ'Ë鼯Ýu=óWµþïý€®ßZº¦çž#22 À)£ÄCé§ãŒE—¦‹Ïy1ó÷@îïÓ?ûû¿§gÞ´¿sùÆßÜp7Ðç^þQïã×þòÜqíÁ·¼Ÿˆˆ^ù‹ß?ûÿ­ï?ÿû¡·þÊù}_ýÖçé¡_¸ý¿[Ê&Ú]Î~éÏo'ý‡ßö""úÊ7?w‡ìG~ñ™ó¿_üægw®Üÿìùß/|ãh'ì±·ÿ[""úò×ÿÛ×ܲu._úÚïìüÿøƒ:ÿûO^ùí;îÿ¥‡>R$DZyéžx8ÜÐþø¥ÏìüÿžG~}çÿ/~åÓôä##"¢?zñ·vž|ôìú¾ø_îH÷©+Ÿ8ÿû /üæNØûûäùßnÙõðHÿ‡x ûÕûÞDû—/Ó>ýïÿû""ºñ³tþû§þß?¥^ø.Ý zî9ºçž{’é=ð–_¦ÞòËDDôÊ_þ¾(¾ñèp†£3&ñøðÛ>pn8N J¢Û†£3*ñøèý¤Gïÿ íWîöìçígF¥o8yÆã×oïy í{ŒáŒÇÇø=þÀ™áø¥Wή9ãñ]~˜Þõà‡Åi–âŒÇw?üQz÷#gû"§ËÖΠtÆã“~ìÜpœ”ï½òqzï•Ñ®ÑøÔ•OœýúËÙ)D¤Ûû¸Ož×ñÆ Úßß§^ø.ݸµz}ã–÷ñŸüõ_Óó?ÿó´]È7µñxåþg‰öˆ^øú¸Æä/=ô‘ä›ü}žxøª™鼎ÔWˆnO]ùÑѾ chÍtÏãtOd ±òsûûôYg)Ñþþ>ݸAt{'ä>ݸå}üÌ?üÑk¯e{ ÝÞÇÐþÇÖ¼ø³%m$àqžÈ÷>úñÎ9Æ$vÐ¥ÅëwBù˜.aKŒH±¹ãÝ ¢ÞÿDDîXÊþ-ï#]¿NÏßzÁxÊé¦yð-ï¿Ã[öà[ßîÅzè­¿rþ*ŸÐ>HŸ‡ßözéÏogßãÃoûë{ô?H/~ó³ç†#ÑmãñÊýÏÒ ß8-c¿óí¿Föõß ¤ùÓWãï}|üÑ—¾ö;;iðC´G{ô®?LòÊoÒh y!ßýðGé_úÌÎA·çñ=üúù«|ž|älßã½ø[;KØO>ú±}ÿá ·Ó¸C4O]ù}á…ß .c¿ï±OÒ|ù7psÒ:EÌ@”²{›£ÃÓ“í–®ohstH—Îß8~¼99¿ñÕëÇçß}÷ÝôãÿøŽÿ¯_¿N_üÉŸ<¿þžýˆî»ï¾/Ñ8ÃÑ ™.·ú'±gùáô£w†dìö(£w§°Ýš¨F§DñÒRV±œÚ OæA"g&:%BûÙ‰ƒös‡Œdíg'ÚÏ2RypmçàòÏæÚñ†nžlUñýOZ¤s÷ÏÝ”{ §Ÿ#ü—÷ÿszê©§î¸ïù[Ÿ5$J{ §8ÑèÌx· yßõЇ“Æ¡Äp³ŒoNñ·°‰ˆ^ýuÑ5çyœ£1NðÕ=3°Ï÷AÎ ¯@-.^:èß:"…ù¿¾ñúÔ§>ÅÞ7õ\¬ ·ôÛË|¨<0ÖGÒ€|ú‰K­ò æ´0 ÆDü)Cˆ`@€L`@€,`@€,ŠOa‡>£ã¾Ÿèÿ¶"&/v¯UräŽ@¨Ì=X×–‹ê5>!ƒ£¦’›¶»_kõø¸9Œ9Œ –°@*dˆØª£–g-´Ôì祆W/T.wÍ-¡ûá~X*ZùådNÃBá*RbN !a$5¶¬÷-Æ ÅXüë¡ûc÷Æ®kò ã꣕! €yb¾2DÊ ©!Ïššr­tãÃykÈÀz0_ÂV‰ç´¨hh~ˆÞ¯±@} —êÈÐa’Rb<¦2by°ô¼Y”+–ïùÉ Éhqè óeostxz²ÝÒµã mŽéÒÁl·½ó:C3à(ò@Ƽ}-_ÑS[fŠÖå—Â-G÷Ζ< |‰ddd‘"Õeí±†K?ÕÆbúé=>úHu<¸æj »e#œScç¼<1ÃMò´žÂ¯˜¡“2¶æ¢÷Úp—kÝ«$mÿ¡6,­éCS.-—µé§t ñº/®¼-ô³ÖþÆád»íl¾²Å>*Ë6'NÎò`Nšs$w nI‰7sV’¾¤ÌV“Smý¦Ò·4ʦž½%Lª½ÊÛþ¬©éÝ´ ¥~$Ë×£¯ eâöCJŒHs’3­<\#D)z„)ùV¶‘G ±ü…¼9Kœ­ÊÜÓx¬¶ÿôî½é]þ5{7Úr¯Uo >ÓÃ4œin@¶jØ¡½O#Àíqk±¼•cY³Tã1D®‡xzo­å¯¥DºþÓ¢ýÎH}oûð`<‚‘¹tp4c§´UdËÆœ3Øh÷XìA±X~.o•ïÜtzRj¬|Vù ¥ßbo©dÿ_J?\x«þ7M§µä[ŒOk5"jî”Ì1=·•¬¹ÞA;r^é“m@rKÇ¡A7õÔšÀrÂG¢4ÿîžÐ!Ëò†Ò³”¸- ¥{`Cù–ÊÈAÓ>-ÐnÍäÓO*¼fù¹öÏõŸÜô‰ÂÉ8y¹e°D3&hõW’>çñÍ ÊÃc+a±63>Jú.B@Oö6G‡§'Û-];ÞÐæè.ìl¢¼v¼AC[\›Ö}”3Z[ç¥Çø´”qq)åzN¶Û,ãÔNÄ—hÀ#{xgh¶š”Ê?å´l/`L¿m H@Dó=ÕÀZYc?]c™­€îÀß›(ýís¡S¾VÁ›'Ûó»`lK#×xœžÐ†˜QëM( î¤dIú%P¬7±kÒ—Æåô“:¥^š7c‘kW—’°VHë=ôʘŽk•)•¾ËOÃJœ~¤ú“ÈqñKòèj£µúˆU;Ïy•MÎJªüþµœW\YëwÎõ'ÉŸEùJ=ù\ý<~ƒ1iêœR:Á”0§NÀyyb“†äi:…_1C%&;elÍEïµá .+Ö~Z2eTI¼Â=ÉÈsó+N›”ê³ô!g)õ7-¿$¯œþ¬ŒÜéÿ¿A Í=ZZì£Ò¦Y_b\”,©öðTYÀ•µçÀVâÍœ†•¤¯Üs¨­ßTú5ó\³LÞ·ÚmÚÒøàÒ¯Qþ‘ëo'µ‚Pߢ}À–tõ@†à D«NU{©·½ ”|+ÛÈÆ£„XþBOÿ9Û*Z•¹§ñh‘vOFöŽYP[¿K®¿©gq´¶Ñj…,‡á<­¬v™¥Ü·ŠÈš¥!r=Ä%Kb¹ÌÙx$kRn¹E§#{H­©U0ÐÀRÐz UïlÙr&kç*EŸÈfùÙbRIÜÏšOoãqªó”!]cR*}·OÉ߯ÖÚxäôÃ…çx[G{°kõ–“u8÷ºí™Iûàò'Ù>S:~ƒõÑü=ÜÒq¨§¼^© L>¥ù÷ Š©~-ËJÏz á¶0”î å[*#Mû´@»5C’?É$¦I¿®ÔHŸóÈçÊNÉÈJúj`ýÖNߺþRX´}íb±Ï‡Ö¹·9:<=ÙnïøH¶KüÚñteàéЉgm팸ßÌŸ#ÒýÆ—hÀ#{xË ¿AÃÂóË"0O0~ƒ†;… æ t=… æ‡ööì Hìñ5Aû°ºìÌy•÷¹Ð›óCû9¦ï§ ¥/•¯Ù/R3}I| ùšWé¤ê'–Nî©Àµ¶/Ô?€V4ß™;Q”¡IQ2Q9RFÅÔ (Aš¾4¿>©üIÒâʧÌSõS£þ¹°¥µ¯µ×?€64ÝÙb2°œÜ¸ôK¼9é—Àå/ç}i5&óšõ¿öö%‰¿äúÐŽæ_¢Ú{Øzî‘›z–F›Ì§^¨%zŸPÿqÖPÿ°ðÈ #{°¬ó€ º=#èõ@‹vdÖöt½–O¼^¼”þ˜ýèé§Ô—?ɪK#׸AûªËèõ Í=¡IÈM©°Px‰Á:eKÏj"«>GééÙiM:šSÆ%éû2–Þ¾8ÖPÿÚ õ@îmŽOO¶[ºv¼¡ÍÑáÎ î:& @$_2…÷i™ þ`9”îïÙ½HŒÍˆËÆ ¨˜8… †ËšëõóßÂ^8#ytR†{™4Œ‡åÒªþ{4jMN9×¢@àÃÀΰ8"ybé{%ù³(ƒKÇ:}i\N?±p«²èOÓSعÂô>î«äSh=OÁ¦Èý_ ùDáïF·ÒWwš/£øeá^3SúžDIÛ³øºKÎ×dräÓO*¼Æ—mBŒÐŸcÌý€—ÿ¹— §ù·°¹ •|´F„ô¨$/µâKÒv¤ŒðÚò¹º”„µ¢äôïôË(þ}Ò4KH¥ïòÓc9’ÓT9.~I<_þ4iþS}(GÆ4íP¹^Z‹þÓ‡CeªU>‰þãÐõK4¥L #1R8/OlЗx[Søõ3Tb²SÆÖ\ô^Îಢµçx¸¶ï·éXûNy¥+!£*§Îkõo.¿’<Åî—”/W9ù´§¹RK‹}TÚ4KâKŒ‹’%Õž* F^*+ñfNÃJÒ×¹ÔÖo*ýZrSËéV²%2b´èߣc£çp›á¾…͈V®¹.“ô6Sò­-ÐnÍäÓO*¼Åf ¡> ›†×H߿ǢçÈ•7ÕÆjë0ZäÞæèðôd»¥kÇÚîÜä®cXX¦síò(1"Ýo|Êì0²‡6à[ØÀß¼8À²Á·°N«e9`JdæØ†ç¸ì.Ýç\r/•n,ÎÜôÀ( ÷H°^j  ¥Áö.I¿äŠõ‹¾5éKãrú‰…ã¨i°Õ~Å`—¦ïÌ5¦÷INhs/çÒèEj`mñ”šô[/IsuÇ…§ðËÂöÛ[NÙ%mOS?NN>¤HòÆé'nQv #ôç½=^sxÏçÈõ¸Ms$7¡rƒ‡Öˆ.kHòR+¾$mGʯ-_úŽ¿Þ“&QÙr–36­–ؤ¤Òwùéáaáô#ÕŸDŽ‹_Ï—?Í{èAbšÿœW<¥dLÓ¥‘ë¥-íßòS \ú±ðØ=¡¼IïIQ{|`MtýMéSÂFŒÎËÔ%ÞÖ~}Ä •˜ì”±5½×†3¸¬Xëa&®íûm:Ö¾S^cé GÈ Ê©óýÛB~ªýréKäKË&}p¢»Ìnd‹}T=–`$ÆEÉ’ê\I®¬= Óoæ4¬$}ÍäŸKÏ¥ÎZrSËéV²%2bôîßÒöÕëźMÎy|`†û6g Zy¸æº”Ñ{Àã<¶‘G ±ü…< 9Û*Z•yûä–ÊÈý{FÏkb8d«‰%¶ï¦7Ü·ÚúIm+h±´Tã1D®„[nµÆc_z릷|ŽÑóÀšÐz U/o9™äLÖÎ3TŠ6>‘ÍòJi|ML÷˜åÐÛx ˆÒ©=vZBéß<Ùîü¸k–pùçôÃ…çx[{=Øö@™¢G^].aùwîù 7Í=ÜÒq¨S§¼^© L>¥ùŸnrçî·ÌŸµQÇma(ÝÊ·TFšöivk†$œ~Rá-ö0kõ¡XØ4¼Fúþ=ý[#?öÀJ£ÅžÅRÿèó££õ@îmŽOO¶[ºv¼¡ÍÑáÎ îúh“¨ –)ÁA»9¥Æ£ûßÂ;à‰X>ø60a®§Úv$<ƒÓÊ#8=àÀÜð÷úõ8DçâqñG8ä7"(m C­4¡4¸ÓÞ%é—@)5¸S'ÄKÓ—Æåô ýMoj¿" ,iz ;×@˜Þ'9¡Í½h\sН&© ü-6÷‡&ýRCª®î¸ð~Y8ïNìÔ)‡¤íiÊàÇÉɇIÞ8ý¤Â-ʞªok_%U»¿hÓï5Þ:öÊhþ%nBÍœsé{è$y©_’¶#e„×–/}Çß§[¥õν¦ÄÝ'M³„Tú.?=ßè˜êGª?‰?Îðé.õp +‰ÏÅ•`ýK¥¯¸*©ßœ|ÎÃ-¹/'ÿ¹åŸ†K¨rô ÀÈtýMéSÂFŒÎË´$ÞÖ~}Ä •˜ì”±5½×†3¸¬hí9ž)¯°ÄLÕ™¤ïIºJÒÏ1XcùKéG;¾H°òØ—®FMË››fn¾ZëK†û6G‹}T=–ˆ$ÆEÉ„3×Aˆ+kOôtóÃJÒÏ]>Õ訶~¥†˜5k2ªKê°öø¢¿5Æcî¹÷Ü2çñ¬ƒá¾…Í 0V®¹.ôPRò­‘ÍòEi|M¸|—Ômoãqªó”!ÍíŸÒJÿæÉvçÇ]³„Ë?§.<ÇÛ:ÚƒÝ\hí©n‰tL”ÞW;ÿ5Æo®ohÃÈ¡ù{ ¹¥cns8·g%7|$JóïSýZ–7”žõ„Åma(ÝCÊ·TFšöivk†$œ~¸ ŒK¿”©ñj¾K¯TǵûK»–Ž-Æ—ÜþÁ=¤LÓ˜Þ—Š››ÿÜñY›þèóZäÞæèðôd»¥kÇÚîÜä®c9a]` €u0÷¾>÷üЛ#ÒýƧ Áxb–Ïp§°Á<™ë©v€œÚ[0j3÷ü0ö´Z¢Á@ –Hïƒ]¾üÆÑÜûùÜó¿f¤í»tÿsï¾—' ù\¦ò,É-o,ŽT·¢º_"+_Û§¥ñ5úñÇô˜áÚÂA3Šµã•¤oä8‘0~òÌn¤ôéAƒeCΉ“³<˜“æÉH[¢€¸:Ñ<[=Ñ×Öo*ýQn®ÿ„µý­fÿÎm?=êÇrì-?k¯¤hç/|IÝjy% Æ£=ÃÂæ:˜•‡K»Ô‹Þ¡dBÕ>lØÅáËﹿP—û7<`j  ¥Á%é—@)R'ÄKÓ—Æåô q\½_¨Çˆý»©2×@˜Þ'9¡J“SüYÊ“ÑÂËšôK ©R¸ºãÂSøeáN ûí-§ì’¶§)ƒ''R$yãô“ ·(ûÈXÕ/˜/µê{„ñ€ËïϹåkîä&T.óZ#Br¯¶cÖìØ9Fxmù\]JÂZ!­÷Ðk+b:®U¦Tú.?=ž@9ýHõ'‘ãâ[Ãõm¸F~¨n­ûwjüÈ÷Óè%_+ƒ“?MkÚ¾Cù‹½Î&Ç oQ~Mú’ Éý1ùÜ=¹í?wú·$õËQ{•­Tÿ¥å뺲t‚)a#F çå‰ub‰·5…_1C%&;elÍEïµá .+Z{&æDjäú¶qò¹Ñ¼–—ˆÅêÖÈÞû‘=Àñ-H9XæV>­ò‚FxËÉ$g²vž¡R´ñ‰l–Ÿ-öH•ÄÍñ¬ùô6§:OÒ!ÝZå/”¾Û‡ãïÇimBëÜÛžžl·tíxC›£Ã›ÜõÜÆ £/3ƒåÁMôhóõ FfÍí³Äˆt¿ñ%°ÃÈ^°\–<@Ô/›µ¶Ï®{ Árð÷E­µ3kA»äà´òNx°ætÆ=ÄzÈ¥ÐÃ|¶ßÒö¶`Ïpïë¥ÖšPÜiï’ôK ”Ü©â¥éKãrú‰…÷<@³R‡ ´ßùÑô=¹Âô>É íPš\Ãa"Kb†JLvÊØš‹ÞkÃ\V´öωԄÆõmÿâäsy²Ïåa*Ï’ÜòÆâHÓçV´Jä•êGÚç-ÊñÒÁÎß©´j8`bF±v<’ÔmŽ“㣞Ùí”>]h°lè9qr–sÒœ#¹mK´W'š'f«'þÚúM¥?ÊÀÎõŸP¸¶¿Õìß¹í§GýX¦-1 |,ô£Ÿ4å—Ô–‘Wš`<¶g¸oasÐÊÃ¥] êEoƒP2¡j=l#bù yFôzµ©Ý¸%½‘ûïèQÿ#U9L=¯z4–T#0œ²UåÖZ¦Ñ[:vÔÖOj¹Áj -ÅRÇ%¤RY92–l<Ön¿#Ë'š×Ãr Ö^~ R‚ÑõkµœÎÐz UïlY‘9“µó •¢Od³ül±Gª$nŽgͧ·ñ(]òŠÕ¯UþBéß<Ùîü¸k–pùçôÃ…çx[Gx°ãòÐ;½äR?¹yœó–ŸXꢅn¥2PÏv4÷@rKÇ¡ŠM=µ§&0IøH”æß7(¦ú­=Xu܆Ò=F©¥DNFšöivk†$êvùSpí—ë?Úþ¥í?5ä»ë-¨ÝþKë˲J¶`õÚ>•;¿„cqcéû÷µhÒúƒ'Ò­rostxz²ÝÒµã mŽwnp×QIë´†3¤ÐçÍÚëwíåcRj<º¿ñ%°ÃÈ^°\0.›µ×ïÚËÆd¸SØ`žôZ–@{´{ U‡h@}Zy§<Xs:Hã·ÌåK-Ö^þ¹"m¿¥õ‹6aO‰ÒH`F­4¡4¸ÓÞ%é—@)5¸S'ÄKÓ—Æåô ïy€f ô~EÐ~çGÓSعÂô>É íPš\Ãa"K—‡©½GÉž!w=¤[«ü…Ò¿y²Ýùq×,áòÏé‡ Ïñ¶Žð`Çå¡w{É¥~¬™ó–ŸXꢅn¥2PÏv4$·tªØÔS{j“„Diþ}ƒbªßÚƒ€µQÇma(Ýc”ZJädä iŸh·fHò§1¬ZìaŽÁµ_®ÿhû—¶ÿÔï®· Eûעͣd V¯íS¹óKè07–¾_‹ö'­?x"mÐz ÷6G‡§'Û-];ÞÐæèpç&w•´.Ð1Ak8C íqÞ¬½~×^~0.%F¤û/Ñ€Föð‚å‚ tÙ¬½~×^~0&ø60Áß…ÁX6øöÂiµœ £,‘Þ»8|ù£ï/l…tµÕþê¥1ª#õ3ý¬—ZhBipFAIú%PJÁÔ ñÒô¥q9ý`‚îCïW€Æ ‡þÆõ3Mß™k LÐ¥É5¼&²ÔÀ×ÂËšô[?‰ruÇ…§ðËÂöÛ[NÙ%mOS?NN>¤HòÆé'nQö‘±ª_P—õ1ÂøÉÍŸRFö¸×fé峦¹’›P¹ÊÓ’{µ¿æÀ‘c„×–ÏÕ¥$¬Òz½ÖBºfE*}—ŸOàœ~¤ú“Èqñ­áú‡6\#?T·Öý;5~Häûiô’Ï¥“a¹‚Qš†¦ü’”\ãOº"¦_ëUššúMÝcU¾µÑõK4¥L #1R8/OlP‘x[Søõ3Tb²SÆÖ\ô^Îà²bÔ=L#š¹þ£í_œ|.Oò¹<¤ -¹åÅ !éSº ¥Sz¹mЪKø|¹¡Äòz––¥e™{µ©Ý¸%¹‘û/àÑ꯶þ[8XJ™z¶%Ë˹ }·e8d«_k™FKj部ݪԲf©ÆcˆR©¬K6k·ß‘åeP̉±§w}õ›r0ôXýåh=ª‰·œLr&kç*EŸÈfùÙbTIÜÏšOoãqªó”!Ò­UþBéß<Ùîü¸k–pùçôÃ…çx[Gx°ãòÐ;½äR?£Òr¥ $ŽCÖV‡k,smš{ ¹¥cɦãXX¨pá#Qšß ˜êײ¼±=_–&·SºD“ZJädä iŸh·fHò§1¬z.±qí—ë?Úþ¥í?5ä»ë-hÑþk¢ÕŸuüX{Š¥{àË©ƒP¤H¶§ÕÖoî;§öÙ­rostxz²ÝÒµã mŽwnp×Q ëbôef°<8C íqÞ ~Çõ³NJG÷7¾DvÙà – &¨eƒúÔÏ:î6˜'pûëa¸SØÀ–VËÉ0Áé}°‹Ã—?çý…Œú×À †¡ÖšPœQP’~É”ÒA(uB¼4}i\N?±p ÀuéýŠ – ú×4õ@æÓû$'´Cir?ÂD–òd´ðr„&ýRCª®î¸ð~Y¸S±S‹’¶§)ƒ''R$yãô“ ·(ûÈXÕ/˜/µê{„ñy„À¥÷§¹•¯¹’›P9åiɽڎY³cçáµåsu) k…´Þ%¯¹¨=p§ÒwùéñÌéÇâ5!.ß®hÃ5òCukÝ¿Sã‡D¾ŸF/ùZœüiZÓöÊŸMZ1ùšòkÒ—<IîÉׄKõËQ{•«tʪ|­éº²t‚)a#F çå‰ub‰·5…_1C%&;elÍEïµá .+Z{&æDjäú¶qò¹ ?Pkã‘ÓžãmáÁŽËCï<ö’?JýL±Þ²3b‰úºžæaTýŒÊuVâôÉö@–¸ÀSOí© L>¥ù÷ Š©~-ËÛóe9 q[J÷À¦–99hÚ§Ú­’üi «ÚåOÁµ_®ÿhû—¶ÿÔï®· EûOÉÈ_KÆÏP\zV:ЦŸ[þ©7”“ÏÕ½$ÿ)ýrXÈOQ’.|t¦Ö¹·9:<=ÙnéÚñ†6G‡;7¹ë£+Ø2ú23XÜDö8oP¿ ÚG?JŒH÷_¢;ŒìáËIJAý‚h}èº,_:3°lšïmiµœ £,‘Þ»8|ù=÷—ê2bÿî=`½Ô:@Jƒ3 JÒ/9€R:¤Nˆ—¦/Ëé'>â¸$R‡ ófÄþÝô=¹Âô>É íPšœâG˜ÈRžŒ^ŽÐ¤ßzIš«;.<…_î”°ßÞrÊ.i{š2øqrò!E’7N?©p‹²ŒUý‚ùR«¾GŸG;[²ôþœ[¾æHnBå2¯5"$÷j;fÍŽc„×–ÏÕ¥$¬Òz½R!¦ãZeJ¥ïòÓã ”ÓT9.¾5\ÿІkä‡êÖº§Æ‰|?^òµ28ùÓ´¦í;”?ÿš´þbò5åפϕŸ{°Îm?Ó{rÛ*îôo.>'_Z¿µWÙJWÁJË×õK4¥L #1R8/O¬ÓK¼­)üúˆ*1Ù)ck.z¯ gpYÑÚ31'R&×´ý‹“ÏåÉB>—‡©]ªÉøœ“¾4¿9håIÚ×?.^:0×Ř-«­Ÿý—–ov{ µºmš%ñ%ÆEnåÆ:ÐÈhZ#‘ËMd%ék'§jë7•þ(†/×BáÚþV³ç¶Ÿõ£I»Å˜P;ý[¥_í˜*?ŸÓÝúÉ}À±JÛ"ýÃ} ›3­<\7tOz„’ Uû´6²ñ([âñÿ—–¥e™{µ©ÝBãSKù½å¯Úú_zýjË×S?SÏjlŽÐк|Ãy [M,µ–i´¤\ïDmž s k–j<†(ñ •ÊÊ‘±dã±vûY>Ѽ–—ˆÅêÖ¼÷µè±:hMÊÁ2·òi=ª‰·œLr&kç*EŸÈfùÙbTIÜÏšOoãqªó”!Ò­UþBé»}8þ~œÖÆ#§.<ÇÛ:ƒ—‡Þyì%”ú™b½egÄ2õ=u­aÎ[ª–@ ý7÷@rKÇ’M¯±°‚¸ð‘(Í¿oPLõkYÞØž/ËÛÂPº6µ”ÈÉÈAÓ>-ÐnÍäOcXÕ. ®ýrýGÛ¿´ý§†|w½-ÚJFîøZ2~†ÒàÒ³Ò6}®ü¡¿só®iÖåËJ#'.Wîå+é)´ȽÍÑáéÉvK׎7´9:ܹÁ]Ám Ú1ú23XÜDö8oP¿`dÖÚ>KG÷7¾DvÙà –ËRhpêŒÌZÛçp§°Á<Ñ.`> w ØÒj9F#X"½vqøò{î/rbûG©¿ÒýµE?à6ð@‚a¨u€&”g”¤_r¥tL/M_—ÓÏèäRI6ãƒúKýŒGSd®0½OrB;”&×ðF˜ÈRžŒ^ŽÐ¤ßúI”«;.<…_î”°ßÞrOè¥ò'iŸjmØ–äÓO*Ü¢ì#cU¿`žpóWìÿÖò9Fö¸×fé峦¹’›P¹ÊÓ’{µ†SMÃ+ǯ-Ÿ«KIX+¤õz¥ALǵ'‚˜‡±äõ"pú‘êO"ÇÅ·†ëÚpüPÝZ÷ïÔø!‘ï§ÑK~,]?îôo ù’ÉʆäÞÒ4r?éˆØë|¬Wi´:*]²*ßÚ躲t‚)a#F çå‰ jok ¿>b†JLvÊØš‹ÞkÃ\VŒº‡iR×´ý‹“ÏåÉB>—‡”A¡%·¼±8\ú/DÇ/¢ü6`Õ,ê.”Ž4’¾Xþ,Æ,i\­þKê³ö˜¼Tf·Òâ)ŽC›fI|‰qQ²¤ÚÃSeWÖž½Ä›9 +I_Rf«É¯¶~Sé2€sý'®ío5ûwnûéQ?š´¹¼ç–4,údÌ3ÛŠš+U#ÏKe¸Sع.úÒF1W7uoƒP2¡jŸææ>Äòz––¥e™{µ©Ý¸%¹‘ûï¨]þÚ.ÿ-,¥L=Û’åå\ÖÞ¾[3œ²Uƒ¯µL£%µôBT_?©mVKh)–j<†(ñ •ÊÊ‘±dã±vûY>ÑXEZŒŸ=ÓŸCý¦ =Vÿ@9Zäð–“IÎdí-ÐnÍäOcXõ\bãÚ/×´ýKÛjÈw×[ТýçÊÏÉCíñ5W¾Ý‘ =ðåÔAHR$ÛÓ,ë'?wŽ…G3Ö¹·9:<=ÙnéÚñ†6G‡;7¹ë¨„u1ú23XÜDŽö8oP¿cƒúY/%F¤û/Ñ€Föð‚å‚ jÙ ~Çõ³NºîËÁß…ÁX6Í÷@‚e£Xð@€,´H+H< ÿ•’ßÓ·´à À ™zcÞq $ÀJ™îm”‚%l H–°VNh);µGH€•35Ÿ¾z$Hã Æ§¯^%¢ô€ˆn‘ÜélàÉ«}`@€,p `…„¾0#$ÀÊxâÙ«ªø¬¹9:,þÌ ÍQ¹÷‘ˆ1 Ý1nIžG0åŒDú°ßpìîÞú‹özç ÎÿfÖÐSãê¨kIEND®B`‚PythonCard-0.8.2/docs/html/images/resEditorFig21.png0000644000076500007650000001046707474513013022126 0ustar alexalex00000000000000‰PNG  IHDRÈ,†úü¾sBIT|dˆîIDATxœíÝI—UÆñ7=.\öÂá’e­Ž2ˆ(ƒ ŠL*‚`ÑN Πˆ6j("pP±l‘FÐÖf]K–|›êEuQQ7Þ;Ĉ›ÿß‘“•‘÷ÆoÞž*GwnÏΛš’ÃçfdfzJÜuïíÙÙ–LLt´(@zî5M, 0T÷t½@ÊŒ#HæÜÌíüçÑh4ÿ(#™ÿ¯ðèóºé}¶×é‡~jöâ¾ûï0‚uÆÝÄŠ¿y½ÿ%rî£ßóçÎrãÖYöàÖEÓÿý×·òøÃ/x-D[Îý|X¶¬Þg}ß·Ê‹O¿W«¯cßï—=›ÕjÍp½èdz‡XN\x¿ëE@G¼ 䯭3 ž_ÿëtÔ…‰móêÈÙŸ?Y0í»Ë/xþí¥ƒòÂÓï¶¹XèÈú“²~Çdås“èç ¿þy2ÿyÕ£;òŸÿõû7""²zé®|Ú•ÇEDdí²Ýù´‹×æ?¯üîÂ_¸öÅ‚~ž}âuùþê?ói›ž|³Ö²‹ˆœœù0ÿydžòŸ¿¹ðžìÜx@DD¾þñnAí~naÁ=?H7ùüá|Ú—çÞÊ~mËüò93¿üolû¼ö2ÃÍÌôÔ¢¢°¥G¼ dÙƒ[寭3²ü¡mrý¿§eÅÃÛŒ"×þ<%O<òR~¹íê¦åÉG_–_þ8!O=¶SDæ eõÒ]råæqY³ìÉH.ßøJÖ-ß#""O¯xUDæçŸ¹>%ß+?]ûRžYù÷ù飑üøëü‡ê‡«Gä¹Uoäýÿå3yþ©·¤Ž—Ö¿Ÿ÷3ýÓòò†ù‚ÙùÌ‘Ñ|qìÚx0¿|xü‡wò"9v~¿¼ºi~Ä:z~ŸL>X¾<÷–ìÝüi~ò‹³oÊk[ç‹äõ­Gj]†„¿¬H²ŸmA2Å"ÉF5K_‘+7ËÚe»eí²Ýù¥8‚¸(Ž &[V?"[×ì—3WɶµoËw—?–íëÞ‘Ó—>’Ö½+RøŒGÅdϦCùuø¢â‚n•±¢Ž ""ËÜ&¿ÝúNV<´] Ÿ…#HñÆÍSíÌGÌše¯È•ÇóC¬K¿[4‚ØG‘z7†NÍX4‚ÄPA²G´¯È’‰‰¼ÁT³X?þúùüU¬„²>ô“f?[Þ]*¾²;é÷Ýg<¢&åÑcã¯åÐc#!Æ¢@6¬Ü»è›hƒZ ›×/ik9`5WzD¼¯bÝžõúgúÞìr[ßSc ™z’n’½×…K{}árÓ© ì¯z‚ïƒÜ¹=kýWEûæ-ßéÔæ÷Õä7}ŠÅQTgeÚÞ_]).o'qw×SŒO0-V?ãæ%q«Rÿ’ÑIŒó‡©Ê¸~8bG_ur™×õÃT<®w¾«ÚÍÚ)>ç1¥;Míš²<Å6R/’–L,8”Š]1öWy;Ví»b?¦÷û²íWmy;)— Yõþâ<ÚÆ)Ò¦•—Åôa/>׿Y‘‹Ãåü#ÓÆþri×6¯Ï~­Z^‘FòJú~5u¸fk·¸aÇeÉ„‡H·ûËgû–÷Ohÿ u5õ¡ti·j'¤ªÎÈK›ÛÉôÅåÛÒW±|µ9š”Ï?ÆåÂCV]G™m›ÕÊû'´ý±AªVÒtÂ]õž:ýiíV½ž²¦‹#ÆþÒÚqy¿iÿTõ¯õt'Ý'Ž0”;³©žƒ°¿êñ>ÄÚ<9)K&&œÿ™t™jâ1Å≳¿†Ì{†„¿¬((@A PP €Âz£+ZšÍ““ùçÞéNºë¯lã®|?Ë9j27Ç_Ó@ÿ]<¹ð§s((@ÑËFù?Ók¦Ÿµ¶ê,GLÅõ2­u2¾±øÓ£>F£Ñ‚ó¥òó¢¦Ï«šh¿Ü¦¶~¨Ï{)þõíò·qÕ7¶Ë·éyH›åËÜÜ\å7kUŸÛ¨T5½j»i}—ÿÒ¹Ër™Y Åb¶ñ‹ÏM?›ž»´£Mß>«Ú¬šîú ^ÕGŒm–}¸n7¸ *Ó·t“ÚÞ±>ÅQ·]Û{L‡T1ûƒ.ÉsòaQI )¢t½-†&Éõ0Ã÷›±î·?‡)Õäe^ŸoÅòHãrâ³ÿØÒÒè¢*iW—|æ³]µr-Žâ|ÚeaSÁÅ¡l}û*ÏsY°wØN"}Nà›xÍg^—e yOH_¡}‡ö7Ib© @((@AŠ^qwÄ’ìôPÄÝqwC»âîÃBÜÝ¡[_ÄÝû‹¸»cÄ݇)ÉsâîÕºÞC“dˆwG’¼ÌKÜ© în˜¸;2ÄÝ-ów¶$±€TP €‚  @E/ $•¸{“meíoV²wÒC¥wo÷AšEÜÝЮÆ'înkÓeMýoqw‡>l}UµoÚNUmOqwÇþbÆIê, ñ÷v%y2”¸{Œv»Þ6}—dˆ #îÎ7zú’¼Ì;ĸ»ë…´‹¸»a¾Xq÷ëHü½[ÄÝ-óÕ‰»Ç~ø{û’<ÄRA PP €‚½,âîÍô7DÉÞIEÜû1w7´«!î>,ÄÝú°õEܽ¿ˆ»;öGÜ}˜’<!îî®ëmÓwIˆqw¤!É˼ÄÝíÓÑâî†ùˆ»#CÜÝ2q÷aKò H((@A Pô²@ˆ»7Óß%{'=qwî{ÄDÜÝЮ†¸û°wwèÃÖq÷þ"îîØq÷aJò„¸»»®·Mß%Y "ÄÝ‘†$/ów·OG;ˆ»æ#îŽ qwË|Ä݇-ÉC,   @((@ÑËI5îÞS`”ø{<ÉÞI5´¸{÷Aâ"înhWãw7ÅÓCÖ«ê5âïÍ#îîЇ­/­}×ey­êξ ñ÷0ÄÝû ý….{è|ÄßãJò¤Ïq÷l–Ï2t½­ú&ÉéoÜÝ5UwG’—y‡w÷½äò^ÔCÜÝ0_¬¸»ÖG¹Ÿ:ëlºhâò^Øw·ÌW'îÞF4Þç0Œø»¿$±€TP €‚  @EkR÷Ú}Ê×þC—Í5D›-ß1Ö+Ù;éCa ¶û#n‚FÐȶoÅçÅÇò{m}¸ö­=¯Š‡ûDÚ}âé>Ëë».&U)×}T^žÐeÝg>ŸÞ#Hhd;¤ —XwÕ·ž­MÛ2º¶Y^6[û¦ŒU6­øè:¿Öw¾ûÈeylï ûµ ßÏŒÚç M˱ÚN©ØÛ«ëâ:wäcÝÍorEMl¹ }=1‰¿n]m«ýÆZö®¶Aí_˜22ø¶Ñ7}%R1»ÚÁ¿“ó½M_îìr´réÛçx¹©u±õcãþŒzˆå5wmÃåR¤vònjÇgù}”OMí‡m϶.å×Lç!û(ƲÇl§î‰z”ßIwy­n Þ'RÞÆ\ÚóY×6lmû®³éýUýù´£­_]ÄÝ=î´º,›­}Sv-›V|t_ëە˶ª³ßËïÍÖ»n;¶ÏF ÄÝ[n'Å £K>Iˆ˜óƘ¯âî ˆ½nã°­b-cjëJܽ)ŽMKi”މ¸{Ã\úö9Žîj]šØïmµSqwå5å“FSû!BÛ«³.¦6lÉÞë\§¦NÔ‰»Î;ž»=×ùBÚ¨³b,sùy“‡eÜ(  @((@AÜ=‚:—†c¶çÓ¯é_ÓRÞ‡Uøëî3òÚ`º4Údèo\wWÚªZÛ²¹D¶}¸´ç³.uû y-tÝ»FÜÝã[ÓeÙ|"ÛÙògÓŠ®ók}׺Ÿ«^k:–Þ”Ú‡XÄÝÛo#F{¦oòqŠ¡·…¸{b¯[ÛÊu¤¯š7Æg`wo@*£„Oû¦"qͬ…~Æq÷†¹ôís|ÞÕº˜N¸}çGÄÝ•×|”OFMí‡mÏw]ÊEºŸ]¿Æi„!î8Oìxzìö|æó?ôµq*Œ Q@A PP €‚½,[Îô³ÖVÌ助¸ž.Eøë]ÜÝ'Œ8Ž—ËÆý>Cê‚亂âÌ>±h—ç!mš®å»Þ©¯êO›§jšK›.ëhêÇgä3=2²¸ AÊñfYð¼n´<4j]Å·O-¼çsÓ´ªÚªê?tšâ+MEãû,Êô6Âtmò)Ÿ6C¾¹mÛÚ7N?Ižƒ¤§nª¿ív½mú.ɉ§Žñí£ªv‘®$/󆯩M‡1!ê.¾…›Žü#L£#Hh´¼Nœ:F<ÜÓ‰ÜÛ^sü—•Ûç²o\A¿RçyÓ¯ùÌ벬!ïiê5ß‹#!z,”ä! PP €‚ èewo¦¿!JöNz(âîÜ÷ˆ‰¸»¡] q÷a!îîЇ­/âîýEÜݱ?âîÔä9qww]o›¾K²@Dˆ»# I^æ%înŸŽvw7ÌGÜâî–ùˆ»[’‡X@*(@A PP €¢—Bܽ™þ†(Ù;顈»sß#&âî†v5Ä݇…¸»C¶¾ˆ»÷qwÇþˆ»S’ç ÄÝÝu½mú.É!îŽ4$y™—¸»}:ÚAÜÝ0qwdˆ»[æ#î>lIb© @((@AŠ^q÷fú¢d龜"îÎ}˜ˆ»ÚÕwâî}Øú"îÞ_ÄÝû#î>LIžƒww×õ¶é»$ D„¸;Òäe^âîöéhqwÃ|ÄÝ‘!în™¸û°%yˆ¤‚  @(zY ÄÝ›éoˆ’½“Џ;÷=b"înhWCÜ}Xˆ»;ôa닸{wwì¸û0%yBÜÝ]×Û¦ï’,âîHC’—y‰»Û§£ÄÝ ówG†¸»e>âîÖä! PP €‚ èewo¦¿!JöNz(âîÜ÷ˆ‰¸»¡] q÷a!îîЇ­/âîýEÜݱ?âîÔä9qww]o›¾K²@Dˆ»# I^æ%înŸŽvw7ÌGÜâî–ùˆ»[’‡X@*(@A PP €‚  @((@A PP €‚  @((@A PP €‚  @((@A PP €Â鯻ÏLOÉÅ“G›^ 9ÖÙ<9ÙÆrI²ÈíÙÙ6–Hç €âF ÚHDòÿ×Ìô‡T@ÁhNdn4÷ÿŸ„ÿ£*Pô?t=Ô@I½IEND®B`‚PythonCard-0.8.2/docs/html/images/resEditorFig22.png0000644000076500007650000004620307474507554022141 0ustar alexalex00000000000000‰PNG  IHDRìÆ/ÿÞ1sBIT|dˆ IDATxœíݽ’-ËUàñÚ20Ç B¯Ðf›í"„ ŒqM¾¹ÃŒ¡˜ˆ6ÆÙŠàÄpÌCÄH£‹Àmó˜çxŠ=ƹÙ7wv®Ì•Ÿµ²êÿ‹è¨½ëceVí½»×^UuùðþùúöéiûîÛwÛ»7O;¾ôþùùfÆýÃÃN]úRlf˜ÄØÇÚ»dÑ »óöÝûl€ËvqÒËog¦—{ë%—û1’a.áŒ|½õT}¸¤×¹Üîtzyd½lǪøµÒ'o]U´¯•ö8ëfû }­F¼§?_·ëq ÚÏöAûZxOë¶~þ[_«dF¼§#í‹mŒxOW¶ŸíÄß?É>Lúý#¶1ñ÷O´¯Uö×XÛçô{ZlcâïŸh“ÿ¼Š±Ãƒòî¹âïé”_úåTØË’vm~ó?­wÿ°½ý_Ÿ½ùô;âó˜¢1ìßø•ßqþß¿ýŸ—Ç¿ñ•Ce~òoó2ï›_ù×çßüÕ?|™ÿã_üàåñoþê}1ÿççÿÖWÿxÛ¶mûçŸÿõM{nþ¶mÛ?ýë_½<þí_û“èüoýÚŸ¾<þÑϾÿò86ü%ÅOÞÿñ_þòeþï|ý϶mÛ¶øì/¢ÿþ³?ß~÷ëÿýããŸþùËv¿ûóþïOÿ÷¶mÛö_¿ñ?Šú€5¼{óô*I÷æ)¹MדN]’¾m“w÷ü›_ù˜œÿäßþæãã˶ýä³}óWÿpûñ/~p›¤þüÇ¿øÁö›_ý£í²]¶þù_¿$ç~’îÏ“ôßþµ?y™ºKíüè_¿¿}ë×þtûÑϾ¿}ëk·É{iÒ¾m·‰ûår¹IÎSþþ§þ’¤»ç.I'Y86—´»Ç9Å {ªÊîWØKøvÇ%í¿õÕ?¾IÒ%~%]"UØcܰ˜oÿú§Éá0~…=äøøì/^*ëŽ_aÀy„Cb†TØ]Òîó+êî¹–_a¿™ÿÕ?Ú~üódöúù_‰Ã`$~…]sÁ}‰_a/áWØ[û€5„•u7<&•´›;éÔUÛÝô·¾úǯƮ×úѿƫêá ¦Î·ýÓí‡ÿòF}²é?|öÛ¶m/Uu7<æw¾þg7ã×CTÛÎáÝ›§›ä<|S=†=¬²ÿÆWþ jHŒúâ?ç‡ãÖ—ñë_ý“íŸ~þºªîƱ;nHÌ·¾ö§M':îšìŽfüú¶}¬®‡'Ra8.íuØc.ïÞ<]ß??oß}ûn{÷æi»xx øöÝû|—h ùf4½d–{ëùËý“L_µ‘ s gäûè­§I¦sCb.·;^Y/Û‡K~â×J{œ¼uU}оVÚ㬛íƒöµñžþ|Ý®Ç)h?Ûík5â=¬[òùOö¡òµJöaÄ{:Ò¾ØÆˆ÷teûÙ>Løý“ìäß?bÿDÛñZeµ}þG¿§Å6&þþ‰¶1ù÷Ï«;üþ¹‰1(ÿPåiŸÿÖ×ê÷ÿç72=|ÍÝéô—~ùC߫ĸå’ïZæÆ°§h®I²Âþ{ŸÜÏêàЮË༒ {Ëàxà ~ï;ß¹ùœð™½¸<#;†ý»oßÍè°éL|f@+?ÏPtª¹e*€/𙽨¯ÿúÂa0>3 T,Ï(º¬#ÿêÇÙ•VÎùÌ-)Ï(¾û‡÷s«†oŸž¶ßûÎwò+>>nw?ülûðí¯ï;||P¯´þɧŠ÷aÄõÊÕ/8›¿ûþ÷ŠÖOåæoœ¤JÖ·m»ûág“ömÛ¶û‡]¦ZwÓÝ?<¨Ö{ûĘtP¦Wža>a×VØ?|ûë“çÝýð³íÃããν@)Æš€QzäæïtZTaßÙ‡o}ï.à`ÌUØ5CbI<v‘¹„}ÛÒUu)¡¿ûágÛv¯'4 öcøäÓïpu0DMža2a¯áWØÃÄÙ.ã/ËÍ—âH󩰯ϡ="i¿\.Û¶}¼jŒÿ8¶Ž¿ž¿Ž¿<Ü>_Ó>§6Ï8LÂVØÃdÜ¿ôb8_Z¿t>öµ…—Sê´»DÙOÂ¥Çî¹/\ÎËÅÏ-ã´äfö»Èðÿçîê1nZ3†]ª°×¢Â¾¶YÃ`´ r¸ž_o‰O‚À|-y†Ù„=w"7ÎÝM[ưÇ*ïµq€Q¤ ;86ó—uÔªI–{'Ø.-‰cI%ä$뜃٠{©°Â;‰4g.Í÷µœ¤ ûö¸ƒixb©ÿ8uRi¸<6&=_»ôÑ+Ï0™°×ì\8†]ªvœÏöµ„'Ì’J’KÇŸÇÖg ;ûë™g˜Kصw6 qv”z÷æi»xØÞ??«§-\e{Ô•YrñG·¾Pz’i*Á7—°‡ÜU`rü {¯±ä5Uw*ìë(MÖ[“öÑI2•ul¹Ð“s£KÌ'ìÚŠûÝ?Û>l_ŒGßkŠuÌLÖÀ9õÈÌ'ìê ûç—tîØôíÓ“j½–)Ö1»ÂPÃüekÇ´Ž…õ‘¬€˜OØ{^voKøÁ®š ;Àlæö£TØïv¾‚ ^£ÂVp˜1ìÒ¶9 “9/ư€˜OØ[êÔö ‘97’u°óCbz&Õ³†¥ÜÝ?¼ü”,×ÎCŒa+8|…}¶»û‡—KGÆžoÛ]š‡~¨°€œ¢ÂîW©ckׯˆ!2±$;Vaw º¿Mlú¡ÂV`>aïQaÿðþù& “_ׯŒj¾«”Çúá'è©yèƒ ;Xù„}õCµÉ¶_I÷ÿÎC?TØÀ N5†}ư’0¹ÖTÑÃù ‰™ƒ ;Xù„½å:ìnûÙbɵ?OJ¾sÛ¡/®ÃV`>aoIÖ[«ó¥ÃPF'×Öú³:’u°ó {k…½%–µ„×ZVG…¬ÀüI§=ǰ¯vMwŒE²V`>aï9}õ+Π/®V`>a§ÂŽQ¨°€˜OØ©°c*ì`æöÕ+ì¹+»pC¤ýPa+0Ÿ°SaÇ(³+ì—ËEüÁ<—Ç.ëÕ™÷¬2Ÿ°¯^a‡]{Tد×ëv½^_=^Uøeã(_>¯câ.œ åµ€qö¤a.þ|®©¾¿Ù×a—’s7ßOˆ®×«ø<|ì “ªX›Ò¶%b1ܼ°ß±¾Ü¿~B&ínÙãõñæ±´}çeE±å¥í»õb1¤öSR¯ `,ó ûjö»û‡›dÜ%é±ù$íû²6†Ý%D~>öÜŸ'=vbóZI1Ãþæ–[Ü¿0¹—=^n“`éñË6™:\7¶ýKüÂö_%ç™ø©×0Žù„}D…=7…LmYõN§©DI3l¡6ÑšU]mÝ¿œÖá.bÂíU¾kÚŠm_Ò¾f½^ñ©¶À\æööÜt*ê¶XLÖýªsMsdòÔ£ºjyÿzh©`ç*ô=ô›O…æ2ÒéQ¯Cµ}g½{ë•iü¡+š¶Î¢&¹NmÓ#Yïð‡C–sœ²Â>Ò‡÷ÏÑd<œOµ}{UØý“3kÆ‚K'u†'rÆÖéEª¶ÇN&mkuÿnÆœ'vú'ÞœøŒ#¿‰Ṽa/7cÎ#Ëü1ë¹ösCr¤!7Úª;‰:ìÇ|¾âUb¤d<6ŸÄ}?{aoMzRÛkb÷Lº¤„¼wÌ^±sRÉk,ùÖnÛ£ M{¹>´ ‰!Y€ý˜OØ÷¬°—[©M¾gµƒ[ǰ§†ä*ó+8úþ0‚ù„}Ï û¬Ä˜|¯³guy†£ï#˜?étµ1ìX‡µd Æ|Â~Ô«Ä`g½J X‹ù„ ;F¡ÂV`>a§ÂŽ‘\®™~ò)_øÀ|æO:]½Â~wÿðr vN.µG;Ì…/{`/æö–«Äh’¬YI|.Y'¡ßC]€eæöÖ„:µ=USXwª1ì¥7(jiÇýÄÚŽ-ŸÙ?¬ãðöÙ¡-±¤<\îž3$¡STØýjv¬²íÚØcˆ I:RNQawI±tb§kcµj>ŽïvË·€”STØÃOÜ5×µËýñë\Ú!ó {ËuØÝö³Å’nž””“¬ d>aoIÖ[«ó¥ÃUz$Ü{´ »Ì'ì­ö–X{$Ã$àð™?é´çv®€Õ˜OØ{ŽA?úgp<æv*ì83ó ;vœ™ù„}õ ;7F@ ó ;vÁåryùIÍ+‰µ*¿gîGØnmÛŽÿÞí#-÷“–kߟ¥qKãp¤Ï°ó—u\½ÂlÛ¶]¯×ír¹l×ë59¯$Ö Âý‹=Ÿ%v¼W=þ¥}Öª9+™±¹6¤å±ù%ŸÍg-¤#}þbŽþÙÁþÌ'ì{^‡½–4 ÆŸï_o]šó ÿ•üpÛºmÂçÚø±íJIm‡1köÏm'=OíK|=)ùú¢Y^ÓÇØ²TüX¢/M±å¥í§Ž¡Ô~ަ©ýkþ÷,l#·\#«&N³þrÛ·|® ó ûjö»û‡h2›ÿáý³8Çþ‘é]Kýí_kT¥)<~Òóp›^ñµÛK¯qn¹¶ ·]iûÒë/í(÷þ)m?܇Ö÷§¶£’©ÜkZûš—•4žýó§Ù~ÖkŒs:åöÜtO$ëçåÿAp?½iâ_¯×ª?6᳑R}ÏõÃßÿQ_,Z–j?öþªI¨4ïm¼X‚]ûþŸñùY;®#÷ÿÌŸ?Íöþqz9e…=7ö«€ö02Y\¥º”ê›_ÕË%+QÁî©å}3£hw†ÏŸõßX“ù„}Å1ì-sl%ã[ÿ(Õnßú/õÜÏÜ0 -ÃMJãjc”š¾ŽNšF?MÿVzýr,ìËÙ?£†#am½Fo˜OØWÃîÆ¥çæ»¤\šó ÿ-™tRIql{éßä#ÿ-ãîci\©۷رËý‘—ª{áöR¼Üþµìêõ×ô/7Æ8õúäÞŸ¹öscœ[ߟšÏOëû/%öÚømä–çŽC»ošø9gÿü¥¶·öå6|òi¿¼Ó|¾b…]JºKçã˜r¬Jžçb´nß*«×ÒÒcÕ{ìªoäÚÑï–64í<6½úЫíšv[cŒ>¾~Œ3~þZÚÅ9½{ó´Ý?£ ÌUSa—’vó ûÛ§§nI{i¬É1 8Àñ0†Ý@,@Âv± v± v± v±FË]=†k¸ØE…Ý@, Öår¹ù‘–[“ëwm,iykü=·€ »X@Ëå²]¯×—ŸiþÞ\¿\ßk“ÚÇ@Ú^Ûg«¯`TØ Ä’ÜÝ?¼üøÏSë¤æÇÖɵ ›\¢ê+M µÕyiÜò±¤]Óv¸ž´½´oáã’íµm¤*ÿ%û—Š86îtj VŠ»ÒÝýëÇþ¼Ü| )Ž'–ðûó¤å¹ígõ/ÕOÇ_'¶Ì%»R,Íö©/I©í5û—ëà¢Ân Ö4tªìvIc¾k•Æê]ñ>Âp=Æ’3†Î »XµÜxuÿyl~lýØ:R<Ø&í¹1çþ:±mcc¦Ãö¤ø±å)þ •±m¥+ÇÄú&ƒÔþûíûmIûëgÏã/õ=Õ?Àyô¬°›OØß>=uK´{Æ’ø ³æ±´m.¦&lÒœô¨]žîR;G³}˾•n[wt[û§ip TØ'Å*^b%q^µßGA…}R¬UÙUû pÜéÔ@,@ÂN Ä$TØ Ä$TØ Ä$TØ Ä$TØ Ä$TØ Ä$TØ Ä’ÜÝ?ÜܸÈ=—æÅæ`mÜéÔ@¬w㢻û‡››ùÏ5󰦞w:=e…=7í)VIÀ±QaoŒ•›öDÅà|¨°ˆUƒ*;À9Pa7KãÃûç›$=·›€õQa7K&ßÞ?¿üäæ“¸öI±J‡°ôJ¸÷j}ô¬°›OØß>=uKÚKcJ„sqIÀÖÆN Ä$ÜéÔ@,@B…Ý@,@B…Ý@,@B…Ý@¬PîÊ.½nš$Åá¦Lvô¬°ú*1šŠ:Ãd`Ååòxóüz}Œ®·‡Ë%>ÿz­‹nçÇ/Y*Ü—íÅögF»·}¸l×Ñ pùü@èûªÇÀš¸{§íW"swÿ Þ5ër z˜¸[p½¾N¶/—?=ò?þH±}!¶?³öqu×ëõ%i€•qöJa¢Û#^n¾”X»ù±äÛ_æ+é{ª-·LÓôKÆK*é¹*|.~kûr¿Â˜¯«Ìþs©ÒÆJUâýåšÿ¤ÚÌÅõ+O³_n[ÿËN.¶¦íÛ¶^W’ý$8LŠýçn»ÒJw¯ø®ïá>øëǶÍ-÷—¥öid…À¹Pa7@ªr§’ß’¤8UEwIw8MmKÎIÌçrÉr.N ·½\_Uæ¥J}ny‹TéžkM™”ÔÆ–×þ@êkl{¿ 7_úRZ –bÇö/¶\ׯm²*=·ÑïÜø~ÌX|i9ÌF…½P˜ÌnÛmòìÚèUÍ·0DEê úÚ4Ivì‹AÉò|ü/ËÞôr«´‰¶ŸÄKËkGuäŽYc*%²©ê´•ø¹íZt|½Pa/”«(»6zUóg$Å~u}¯> ]Íp©BÎ×Ï-ב¤Z0r|{¬ï“¾ÆvGгÂnþ²Ž«žê”TÛGUæ-ôq=‡¥øCdbIxny¿~|œjÑ™yY,Õ~jL½û)ÝV»¼…«Œ§NütÃNFÄ÷—ïuòiËþ€ {¥žUçpܸ4?wÒixhìqªš¾åö»´]Ô¹^_’fÞ¶Å÷p½Øön=i\¼”¸§–ÇhOÍUÙý±×~ŒÔ6á8nÍ%cÛ§Ú- ·Ïƒp\¹?æ<+'Œ¯]žâ+—Nêô•Žo‰ï–ûÛÇúžÌ‹™Z³0†½pûQJ†£¤’f™ô86ö>_ÓM»èKJµ‰sj½\Œ–ªº6ï)9©´×¼ë¶.‹­Ó«}¹|5ÿ$ÍØ|éyn~küÞíÇh¾€äè… û„m·mß7[.éÌ&U¥¡“«ÞkÿÃqdRÅ]»f£Â>)ÖžI2 :VB~ÔfÄ•aŽ–´ö¨Œ혰­g…ÝüI§=ǰ[½¦;Ž¥¦Â.¡ÂœÂìÜþ—wn€¹¨°ˆHzVØÍ'ì=¯ò²ú5ݰ®c V‹Ü`RË¥k¿ûË5'¬j×@9®c V ?9Ž%Ê%Ë·-žà—$ß$ëçu¹|sÛ¶m»^ró¸×rðcØ Ä$Œa7kÛ>VªÃ!*n^lþl®Í\¤>ã˜üŠx¬:Þº0†ÝD¬Ø0–p¨‰ÿ¼ç”’» JÃm¤!8 —h×s û)+칩†KÐÝcgFµúÃû盟T[$ßðQ]`*ì±rS­XUTØ Äò«ëR…›1áçD…Ý@¬Ø˜0yçKCX }ÉõVRŸPë°ˆµmñäVJxK†Í¤–çÚLµ#K’ÐöI±¤!-$¸H¡Â>)‰9jp§S±IÏ;Ra¦ø½;°³³ï?Œòå½;v±IÏ »ù„ÝêuØ v±bzß(éîþáægv?¸!@ưˆ5‹¥wó% ÆåòMqÙõú“—å×ëOfui7—Ë7½ŸGß¿VþgaÖqŠ}þz¶=ëóîǨöjö'|]g~ÎôûzTØ ÄÚCì.¨£…íQ]_Ûõú“—?(þc÷|u©/%¾#ìkÊQ÷Oûúæb¸÷þÌã~îü/ÉZ¹/ݣ͵±ö¥y±ý“â÷î_Ëñëñú¦¤ÞǵûßS¸¹ç’ÚÏoîøç´¿Ü—»œð÷…›.O}ÉIõ¿¤±¶¤ø86îtÚ+7ÕðX?­IJ¥Ä^»íÞ¤>XLÐ}Ÿ|ºö©QR {üé]9ë)–üúZ÷_³½´¹êµÖÈãßãøY¯8¶öoDuÞ·×ç+–0·ÄׯKÅ®)(Ô¶å·[žûBc¢ÂÞ+7ÕªM²{šÑvn?­'æ’wožº}Îâì`,ÙXÁÙ÷Ûò_xRÿ‘°lõ r¯þ§ÿ–/XSÏ »ù“N­^‡Ý›][åá\b¬Ú¢5ª2o¡Z=OA=þد”0hŒ–±š£½¾¥fî,Mµ?ã¿Qáú5Û´´ŸJÌKŽU¸ÞÙß×GB…Ý@¬Ø •šu5ëûRÛ¥âÆæ‡}.ùÒ‘ª®—ì[i»#õü ­Ä?ù*6&3‡ŽS•Œqõ§±mc㟥þÄö#ìcªb¶Æ’ÆŒ×în{ÍþåHûÆõ=÷/ûTÿüuj_×7%vlü%ûßÒ~îõLU×Sû_óù-Ù>×~l™ôù­Ù^#÷þhé¿öøù¤Ï Ô?OÏ ûåÝ›§ëûççí»oßÝ ض ›ïÏþ`ù*1Gµ÷0Ÿ™j>Hþg$üpÅ>3×ëuÛ¶ÿØi¬†ÿ  Ì—÷î÷ýï5çî1ö„UO¦,ÕrIÇ•µÂÀ&†BÇÂUb&Å:Kâz–ý õü @+ªêÀ±p§S±°>’u0 w:5 ë£ÂÞc(ðQa7 ë#Y£ô¬°›OØ­^‡ëã:ì`*ìbÅô¾¦¸oïv0 v±°¾3VØý»èÅî¨×º|D…Ý@¬YÂj:Õõ~¨°€Q¨°ˆµm“çX›ïæùó5Kú!µYÓ·p~Ø?mlËÎXaß¶×·ãî½ô- š¿¬£Õ ûÝýÃË ‡rýyá:9þöþTŠk35ϵ‘ÚÞÍ/mÏ:*ì`”ž—>e…=7Õðg?9­ITc‰xéöau;Ö?©ÏRżµ=ëÎXa§ºÀTØcå¦Z±Jô¹vRóÃírÕpMÒ^ÒžeTØÀ(TØ Äò«Éµ•ñ0Áí‘ðúCWÂþõèsI{Ö±Âæ Ân VÉ0‰­IÈsUíp=í)ÁÖÎÏ ·±Œ ;¥g…Ý|Âþöé©[¢Ý3Ö¶½NLSϵÃYZ·ÉÍ×Î çk¾p¬’¨;=?H>*ì“bIC;VKLk„û~Ä}&Y£PaŸëˆIªÖö ;¥gŽaþ¤S«cر>’u0JÏ‹[PaÇiÍ­°¹k߀mTØ ÄÂú¨°€QzVØÍ'ìV¯ÃŽõqv0 v±bzß0(o•›­€ ;… »X³ C…ŒB…Ý@,¬ ;… »XÛö±ú- [ ç»yþ|ÍãUv)®?O۟غþz¥1´ó÷B…ŒÒ³0hþ²ŽV+ìw÷/7Ê=öç…ë´’âÖôGÚ\¥±{ƒZTØÀ(=/}Ê {nªáW¾#z Ì IDATýij& õ“Ú\[±mkªÖ±í¤}*‰ë{k_G¡ÂF¡ÂÞ+7ÕŠUŽG‰%í±ªuI¼T;¹}ªi{ïŠzˆ ;… »X~%º¶b&Ç3¿øü±î~?zÆÖΟ‰ ;… »X%ÃG¸6!Å©I|¥þHû”[·4v/TØÀ(=+ìæö·OOÝíž±¶íuÒ™zž‚R²M®ÍTŒšþ”®[3/=?H>*ì“b¥NÅúHÖÀ(ŒaŸëÃûçèÏ™yÃFéY4Ÿ°[ÃŽõQa£ô, šOØ­^%ë£ÂF¡Ân ÖG…ŒB…Ý@,¬ ;… »X1½otwÿðêgnr4v0 v±f ¯P3+y¶v“£Î\a¿\_~Z¶­Ù¾Õåñq»<Ö·›Ú¾5vQ?.—aqs±Ý:£û0*~ ¿o±þYíw«p¿Sû™ÚÿšãkÏÒ{ÄzÿVgåøîñZrv±°¾3Wد×údÝm¿—kcBݺ½u×ë5›p]¯×aíŽß"ì[ì8åŽßªÜ~åöß­›‹SÓv®?{±Þ¿Õùøö¼»ù„ÝòN]:¬@ÇæÇ*Öw÷ÙÇÚ¶¥ø>Mbý û–Š·R5¾çi¹„;LâÝzá|ÿù¬ä=¬|û‰·TO­&î—Ⱥ£’{é•”@JËKþØ…Õ­š-ñݼð·fÿÂmýùÚã;æ¥ûž;þ¥¯_MR´ïw,Rý¯éW®ý\’6úõñשí_¬áòÜö­j>_þòÒíc¯EŒ¥ã«ù’ Å®E…Ý@,M²KxÃu4íøüí¤ß›¯]?öE$¯dßövæd=V]“y7äåz}|•¸ïQawÉs,9¿zCYüõ./ÏSÛK1fŠý! “àØrí)Éé%ßý±L}Y‘ö/Ü6–ÀµŸœ\üÚׯíþ§ÚÌ%_=Ú¯Ù¾Çëßú>ÐÄßßš÷G¯÷gíç«vûÞ_>¬ßZ= ƒ§Þ›jøãÉSI®†ŸøÆÚq—ÕÚYcÛIǺ3aO%Ü{M?;ÿ’ô‡3\¾"éhlÿSÛJIŨã“ë_îõÓ¼¾#ûç¯7ж}éµùú‡ËRm´¼wrÕÛÑŸß’Ï—ôÅZÛN˜ÀáøÆþóÔ‚ {c¬ÜT+V­^EmŸ¥íV<g«°kí9>ýìr¢½«E#õ¨@NFKÿŸ{ýfü fÔqj‰;úõ·ðÙÙ»£+ü{³Ð‡v±üŠrí•[Â$w¯¤·¶ÿn»Çbg®°k+èg¯´Ïºb̶õÑÂJõ~T…¼W¥±´mõ:þ^C‰¦Êºgÿ[«À-F}þ,ÅÜóøæô>þTØ Ä*&²½òTüØ|Mb_¤íVs¶ »»îÆ¥»dܧ‡±|Ò©?Þ<•X»qì©í·Þ^cÙSÛÔP‚Øöîql\r8v5S+ßÍ“Ú÷Ïÿ¾W³ª9>±6rûŽ¡õOû]Z‘ÏÍOÉõÏ?þRüÔþç–熺äÚžñúKjúÆc„ÏKú×òùÓ¾¿Sý-Ïí¿¶oŽïL\%Æ@¬m{œ¦ž§†’”n£i»f¾³f?VpÆ«ÄøÉu,Ñ–’o ÃdRÉslY8O›|ÏHÒÝ—Òá.¹uZ‡Œ[ªm?\G“Ðö<†¥ûPÒöèãkcæû+µ\›”Îxý{ö/µ¬&ßóó×ãýQ²Ý^Ç·Çq(A…}R,ixÇŠÉ)^;[²hì]‘:;Žÿ¹ñú cØ'Å ¯ÐÒûJ-£­Ô×=œy ;ögñ³Å> ÇÿÜxýÇÚãøRa7 ë£Â>G7÷¼;éêýìƒ1ìba}gþ‡Õ“ÕÕûØGÏÃü*ì…dŒÒsè­ù„Ýêuر>ư€Q¨°ˆ3â¦Aw÷/?-m…79v0v±fp7.r?$Û}Qa?.wÃéºÆVï²§5rÿr±{°püc}°Ð/ÇA…Ý@¬=p™Æ¾¨°“绞w’´bäþ…±KXíú+ТÂn Ö¶mÑ¡*ÒüØÐÍãš>HÃhp‹ û|aõ6LðüåÒ²ðqjy*¾¶%IëÊû» `x ð\ÿr}(é_éñ‰mŸjGºS"Uv½pv±ÜpÍc^¸NJ8 &ܦg[gD…}®0IŠ%daåÏsÉ”?/\.Åqüu´ýÓVƒ¾šþåný]Ò?)¾Ô¾´=ì¥çå£OYaÏM5üdÚOˆk’c?ÙŽµ#a—ڢ®C…}_©!¹ífhmç¨û·÷p–Ô—•°º¾w_œöÆX¹©V¬¢mµþXE…8–T…f£Ân –_]¯­d‡ ø¼G…œ*»Œ ûþ,Yȳn‰aAØ·ØøíÖ„wæþ[>ÖΉ »XҘܺšõ[¶«m댨°ÏKýd0·<<9Rzî¯+Åð‡c¤Sý9úþÅÖ ¥–ç¶/韴oÒñ ãKý€YzVØÍ'ìoŸžº%Ú=cmÛëd8õ\JœKb´´åWññQÏtr ”æ„EíóÞíkÖ9úþµ.ßûøøëæNr€VTØ'Å’†“ôÉ:BG¯Ð¶ì_êò€×Ã>)–…ÿÇÀv„ü›1)mÙ¿£é:ìÐKÏ ù„Ýêv¬ ;¥gaÐ|Ânõ*1Xv0 v±°>*ì`*ìba}TØÀ(TØ ÄêÍG…ŒÒ³0hþ²Ž-×N×TÔ{&ñþ]Ja×a·%¼‘Ψø¾£^„K/¦inµêñËí[¯6F©ÇËãöx},Ž÷xù¸MͶ%ñoæ jË¢Øþo›| R¯GíkÜCªíš÷=×aï´=CdÎdÝ–Ò;‹ÖÆïž¹Rb¦íïJû4›æZ=~¹¾·¾¿üþz¼>ŠIeÏø~²·gâY£¥¿ÒþçÖ—–õîß^zÍ'ì=ïNÚ»ø1ý6üa.á:±ù£ú‰8*ìói«ÜRµ]sëz7¿´Òè·)m«ißß¾¦ÿRûþ‹¤ýÒTŽ¥öcË¥81Ò—­š›3¹íb ¨;wüým5¯oîø¥^gIn{Íþ¥ú»û«›¯=>£Þ_šÏGj_4´Un©ºn/%Ÿa²©I"ý6¥m5íûÛ×ô_jÿe¹¢o¹ýw‰uª©×EŠ©]'Õÿš×ΑîœB…Ý€01wýD;–ȇÉxî9Æ!YŸKº|j=éqlÝð—ié/W·¾´¶ýÖþKíköGJü4ík_Ÿ\ÛµrÉyëñOíg¸šãW“¬§¶/}—ÒŸ‘ï¯\û­bÕ×hï­'=Ž®TcådÿÜúÂ6êö[û/µŸÙíþ‹UsEõ=üòPÔ¿Æý… {!¿¢«Š»6JÚò“o)ÁÖœHJ²¾*ìsņ¼ŒºÛd*ÈU [ÛÏ YhÙ¾Uª}íëS»%Áœ¹]M;-C¸bÛæ·»§Öös enÝÉZ.qÙ~j{ÍŸÑɪvèÑè!J©v[–—¢Â^(V µQÚV¬bîÄ*ç-ñÐÉú|© Ü^}8KÛšö[^Ÿ½÷í8†mRÖ½úp¤¶ý*w®zÍ_ÖÑꉡ~¥¾å’Œá¶­ñ ÇuØçšQ=<›žÇÔâëc±OŽÔ77ì£vûÚ>Hû–/–hjíѵÓäI§^¯^s*ì•zV®ýÄڿ%ÞáüXŸ¨´ÏA…}>íIu~òážk†l„'Ù¥âK}“†Ìh‡Œ”lﯣ9é/Œ‘sŽ‘Îµn‹?Rîøæ–çÞ?¥'æŽ_é˜Üöš×'÷úç–ûûU³}éû«äõéAuÒ¡W!¾y®R“ª0‡ñ¤¾‰'uj‡ôlﯣ:iSqBfnìzêÊ/±WÃqø¯â%ö±äøiöưn?Š”l§–k¶Km‹~Ã>WépŒÚñåáI†µíX§vY¯=Ú©gÿK_ÿÖö5ëÌxŽ\>òõ —•&ò¥c“kÇ—û'1¶´?bÚe5ëÕl—;fö?¥æË%ö Ûn›<îœdúHÖÑÓˆŠ!liýÄžÿÁàý¹¶\f G…}R,óc£ÂŽžH‚Žoä„F[íý¹ZG³p"§…>ì©æ=Ù3Ç0ÒiÏ1ìV¯éŽ}¬€Qz^ÜÂ|ÂÞs ºÕ+Î`\%ŒB…Ý@,¬ ;… »XXv0 öbinf$­ãæßÝ?¼úéÅo£vûQ}³Š ;¥ga«ÄL^y¦÷ ’Zb¾*޵›Aq•[±ŒŠïÚÈÝ`vin´êk:ã}9ãøHmÔ^–0v#žb7õñŸ¯nïýýúùíHmìñ{ ûäX.ÑkãÎB²>Wìe,IôדÇÖ K¿œcI&~®ÿµË¥ø±d°¥9­Ärɹöõ“ö)µŸá>äÞWþ:%ÉzËëÓš,hŽO.~Éñ‘âçÞsµbÉ]4ÁõÖ“G× H)¡ôçß$†¹ø™þ×.—âÇ’õÔö¹ù¥Ç/SªÆ7¿~;ÞéµFÏ ù„}D…=7)•°JUùÚ$·t;iý°bŸû¢PÓö¨°Ïûì} 6‘H%¸¹þ×,O‰­ßÒ¿œö=·«i§tÈInû–x%íýÔÐM…¸G²Ö:Ž>º,ÓÿšåɾÄâ5YiÙ>¯dþ¶éúŸ{ݬ%óTØc妡Yc×WHrC+öÙ!YŸ/UÁÛ³¹ùÒò°ÿ#+à=ú×yÃ6Ú ñì~äæKË_U*ô-ǪGû­¬%Û=ô, š?étÏë°»jrø3#·v‚k¬º²Öç®Ã>׌êãHš-ÇÛƒÅ>9RßܰÚíkû Uì[¾X>þ¡ÙÉao¹þ'ßã•RU»wîã ¨°ˆµm›˜¼×$õá6¹Êuí‡Ôv¥'£ÖöÙJUž û|Ú“òüäÅ=× ùǧ·Æ—ú(µ_2$&,-—ž×ôo¤Ö!C¹×'< ÃŽÁNõ§dÿj^ŸØ6¹6B-Û—ŸpûÜëÓƒö¤Ç›.ÝsÅšp|zk|©bûCbÂ1ÛÒréyªèþgÚ—ÖIµßóøjNzµ¨g…ýòîÍÓõýóóöÝ·ï¶wožnVöç»Ç³“-ëW‰Y¥z5$ÿ3~¸bŸþMŽZ{ :‹왯ÏJúºªÕNÀÜÛïÉ¿ûþ÷šs ÷˜ ûÉ”VÑŒ ;¬Ù³B~­ÇwÏ×gDEki½l#æã*1b­êÌ zˆ«ÄÀ±±ZÏjïÕú»ô6{¼'{ææO:¥ÂŽQHÖÀ(=/na>aßó*186®F¡Ân ÖG…ŒB…Ý@,¬ ;… »X¥ÜÕYzÜ\¨6ÆÝýÃÍO¯¸«¢ÂF¡Ân V­Ú«´”Ü (×¾tÇÖWY)é§Â~Ú»S–®ÛÎÂÝ#-ôÁ²Ükµòñ›ñ>œq|¤6ö¸;¦»APïucÛY¸ûçÈ>¤b¯ü¹«E…Ý@¬#¨½[êQPa?Ž’ËuÕ^ÚË¿#äÞ,ôÁ*ÿαÒq²zür M¸o¥ v}«Çg”’Ë%Ö^ZÑ¿[èÞ,ôá,z¹»B¬º-U§sUkÿ΢RÕ<5ß%Ù©þz±>¤ö3¶]m?SýsÏÃug^'žë°Ï§¹õ¹Ÿˆ¤n­[®3ûÆ8¹í¥[Ù»õJ—Çbk_j=;IýÐÆpíÇޱعýó·•ŽSî½Ñr|4Ûkö/Õ÷°þ1ÔÍ{(¶LÛÍq«½ùSêÆA/·®÷o{$¦šùë”&¶­76Êmö-ÜÏÒ屨Úã—ZOûÌ]ÏÃ|Ân¡Â.%£¥ó}áüÒ¸¹­‰°´mìKƒÔOí>î…d}®Ø/jžûeîÏ“K1sÏ[ú׺½”œj—‡ë†J_i2ÚúG6—œ·¾?Rï“pbǯõø”¾¾Òþµü(w|rñKŽ?÷™­õxyŒ&~åúe؉— ÆK1sÏ[ú׺}¬oÛ¶©—‡ë¾j¿ðø•&ëgÕ³0h>aQaÏMC3†H•ëñZiúc!/E…}>Í¿äSÉVnûIå,¹ý©òà¶ëÑ~¨G…}ÏíjÚiy?ĶŸñþÚ»zÙÚ~*ÔŒ½–¶÷+Â5mkÌŸžÛÍþJÛµ´O‹ {c¬ÜÔ«4»=“q ’õùZþ˜K¾žj†Àì Ír–ý‰cئ%”*Ø=Õ !Á=¶ž…Aó'í*1’=óš¡2R?kûï†×Ì¿¾m\%fuÒ¿íW¡9ÁpÏög°ÐIê 3š~÷Ø7iL¼¿¼õKðYE«Ã®à¢•ýoÁà}YéXí‰ ûÄX©+©”žŒ™Šë펵7.ÅH)]_ÛÏp~ìÒ‘©öö¨âSaŸKbŽ› O¢ó¯ŒK`RIMª"Ž1.éŸvÿÂñç¹¾j4©ÿµÇo–Òã.Ïí_ìØH1üÇÒë_z|j^ϰ¹÷on¹¿_5Û—~>J^ŸV¹!/cª?¯Z¿zlïÙ–ÚHžtŽ!/èŸvÿÂñç¹¾¦žgû_yüÆöɱRI·v~ìdËÚ¸¹á<퉞Òz-û¯éß^Ã>Ÿæ„·Ôº5ëh—µnÛ¿uyë±™aäþÍx}r댎?zùè÷Ÿ¿¬&‘OŽo“ëØ`*ÖÑ.kݶ5~ëòÖc£q¦!„v±Ð®ô²“½‘¬c¶T…R³|tûg×z|ö<¾½+Ú°§ä²±å£ÛÇkTØ Ä*­:ãµ½vÌÖ£;²ý³k=>{ßÕ^ÛÕúkAk…}tû9g|Í{ææO:¥ÂŽQHÖÀ(=/na>a?ËUb0W‰£Pa7 ë£ÂF¡Ân ÖG…ŒÂUb&Ç ¯‹¾÷É’èƒ ;¥çÅ-¨°gø7ŠÝ h{·TØmÑÞA²G±› õj?gÆ~î-<αå«Êí[¯6F“Ú¨½Nx¢\±›õj?G³\²òûuþs,*ìÇ@…Ý–Ñ—üòïø™»kc‹½/ݸ·ð8ÇX=¹„*÷jïX=>)Ã/)èßq3sWЦvv¾t"Ž¥gaÐü«×awüj·Kä]U>¼14_Š“›Ï‡6\‡}¾Ü­ÙÃõJn,”»-¼¦Ý–öG“’½’>ÄŽ‘t ÃØþ1‰ŸØmíSë¤^÷T;)¹í5û—ê{ìnžn¾öø¤ŽAÉñ‘âkŽ[íÍ•bÕãè1ƒÛÞKÛûËS·½/¾#iEû3ÔÞáëb »XÛö:iöŸ—<–â¤â“¬·#YŸ+ö‡*–„úëIcë† ¥ç>))ªi´ÖvrɹöøJÇ$uœÂ}Ƚîþ:%ÉzjûÒ÷O)ÍñÉÅ/9>RüÜ{¶–«p‡óRëI£ë~ž¤çžßl/|Y¨i¡gaÐ|Â>¢Âž›öPz'T͸t’ô¾¨°Ï¥M˜{$R¢¢I¸5•÷=ô¨°ï¹]M;-Ç;¶ýŒ×oïêikûR«N˜;$ÀR"­I¸5•÷‘øöÆX¹éHÆç#YŸoÏ uÜz~mÃ6«W¨Wê+Ž«ÄìkôUZ¤ø\¦/®3×ÞWH8ÃÕYJY>©+ÌhúÝëŠ?ŽT±où`ùø‡fT§síïÝ ö‰±b—qôÇ‘K'…¶´‘‹ߎrTØçÓžôç'Gþ•9rCj“¥å½Ú—bøK–”;~¹å¹ãSzÒi¸ÿ±×¦$¡Ím¯yýr'+ç–ûûU³}Éñ ·Ï½>=hN}¹šKø\1¤Æ·. w‘NF­i_Šq¯`9b ûäX©Ä8¶,œ'(ê?/óN²ÞŽ1ìså’ÍXrMâž™›ß³ýÖ壵ô/w|J^›Úå¹uFǽ|äë.+MäK/wX;¾Ý?ÉT3¿gû£/é¸Ú@´ã:ìba}$ë€-n¸Kxµ“YÛ·ˆ]¶À¹õzk>a·8†ÇÀvÀ7ôÈýÌÞ¾Å^íÖZ¥ŸGÂ1?*ìba}TØÀ(TØ ÄÂú¨°€Q¨°ˆ…õQa£Pa7 ë£ÂF¡Â¾c¬ÜÍ‹¸¹Ñ:¨°€Q¨°ˆ…õQa·eäHýKý¥æár¯íʯùŒ÷íŒã#µQ{7Ó‘wBu±Ã'q÷Õ×RÇcåÏ]-*ìba}TØmyɳÔM¸ÔÚ±øw¦ÕÞ$ËŠ\Bî[i¤]ßêñIyÇÑÔM˜¸Ó)Rz¹Ó©‚4ÌÅŸïßy46ÿîþáÕ:þ2w1£æƒDÒÞ&wkøp½Ô­ÛÃå¹ÛÒûó¥„DŠï÷Çß>Œ•ê_lyª Íö©å±}ÍmŸ"%{µ1Jû—;>áOR1¤~Kï!í>æ¶×ì_ªï±»™ºùÚã“:%ÇGН9nµ7µŠUo£Éôç뽺ûi°½¿ü¦z~}|õÜŸ/ÞmUˆï÷Çß>Œ•ê_lyª Íö©å±}ÍmŸSs‡ÝÕõÌ1Ì'ì{WØc‰¶4ß=—æ—ÄÇx$ësÅ~QÇ’@)!–¶—’ñÒ?©ø.–”Imiúï„m”î.ùÍmŸÓúG¶µ¹ã“:Ná>äÞwþ:µïŸX²^òþ-¥9>¹ø%ÇGŠŸ{ÏÖŠ%ÊÑVHˆ¥í¥d<—œkû÷x}ü"ÖåñUBíÏKö/³ÿaÅûŸKÎ3Û#®gaÐ|Â>¢Âž›j‘\¯ û\±ᧆª´È%m©jeŠ¿¦™‹_²ÿ¥C Jû—ӣ¾çv5í´¯Øö3Æðî]½lm_¬^UoiÝ d²Š.%בþ¥ú–úÏ@ª])^jž¶ÙØŠíIàoQaoŒ•›j1tem$ëóµTxGÓþ %·/-û?££¶ÅGÃ6–+¼Úÿ$cdö¥eÿgô¯õ, š?ét•«Ä”TÛ©ÌÛÀUbæ²t…Mõ´w÷ˆgé˜ÇXîŸÔ77ì£vûÚ>Hû–/–ÈÒÕXTÕôÎýÝ#ž¥c¾**ìc}xÿM°Ãù¹“Nýõ¥Ç˜‹ û|Ú“îüä$G.mïžÇÆ”‡±bÂøþ˜\¿Òø\éK€ö¤ÊØ:©øá˜áÜñÑôo¤šþ•¼?Â×)ÃŽÁNõ§dÿ´ñr¯q®PËö%Ç'Ü>÷úô 9iôÕ8ñ`¹´½{SÆŠö-r¢jôRÒ˜qáK@éIŸ±“esýÓMÿðcØ'Ç’†¾Äæ§†ÉøË¤Ç$ïó0†}®Òá"µãÛÓKbiúŠ­9¡/§$†¶¿¥}¥¥­ûÞÚ¾fÑñG/ùú„ËJùâá"•ãÛc—kÔÆÒô!;Õ?õЗ‚Úþ–öAbiä,TØ Äê…K:î‡d–Œ¨H¢Œæ? #·oÁûçÜ4ÿÀ|TØ Äê…}?TØa IÖþZ_ƒ=_ÃÕÞ?«õ׺’ô3¾æ=s ó'½ÂŽý¬€Qz^ÜÂ|¾ÊUb°®F¡Ân ÖG…ŒB…Ý@,¬ ;…«ÄLŒÅU\Ž‹ ;¥çÅ-¨°+|xÿüòÓrt®±n v0 cØwŒÅIƒ ;…1ìbùîî^~bóÃy±e±ÒcôA…ŒÂv±œ»û‡›qíî¹?ßì¯[{Ž1¨°€QÃÞ+7-«ŽûCgH¾m¢ÂF¡ÂÞ+7-%%äa¥¶Pa£Paß1V.÷Ǩo[ÛIªn[’þ1¨°€Q¨°OŽuñ… ¹?V=#UÜ¥ÒsôA…ŒÒ³Ân>aûôÔ-i¯‰¥I–SCb¤y$åûëùAðqv±Fc(Ìx$ë`®Ãn ÖhîΪ‡1ì`*ìba}TØÀ(TØ ÄÂú¨°€Q¨°ˆ…õQa£Pa7 ë£ÂF¡Â>1–»Z‹û‰-Çš¨°€Q¨°OŽå®Ø»kéJWráËÅ-*ìû¸\·Ëå1»<·ÞL—Ëe»\.Ý×mW³moú«ëY4㤽+ì!én¥Xö}\¯â2— §ÖÙÃõzU'±%ëÆ¶»^¯ÅÛöf¡°ºž7h¤ÂÞȯZdžÍHÃibóÝcíüÒøaÏŽ û\©Êy8¯¶ÂîW©Ã¤ÙŸ'U²SÛÇÖ)¥‰ß²}¸,\¯ty,vl;müÔ¶p4TØ Ä ùUw÷8¬Äçæ—>®‰Ï¾@…}.W5%áᲚ {¬:íÏslžôXŠ™{ÞÒ¿Öíc}Û¶M½<\7TzübñàL¨°7ÆÊMkøãÛ¥¤X“,—n›:!¶¤ C? "IDATÝ3¢Â~<š ¶”@ú ©´}kòÙZa/‘ëkí¾h·Kg’xg@…½1VnZkñí$ãõ¨°OK"(U°{*ퟕ1í€rTØwŒ%%ä~u]ªv?¾W»«¢ÂŽiŒö*r}½/¹sà訰OŽå'¼©!+á˜0yÏÍ/UŸ+ÜÜ¢Â>WìDÓmû8^]Zæ–kHWg Çe»ªuø<ÜÞ"#µ‘ªÈ‡c¸Kú§Ý¿püy®¯©ç¹þ×?8«žvó ûÛ§§nI{M¬\rë/­[2&=œ'(šk³fþõü !/•x÷ºŒcjøH¸,¶nÍ:Úe­Û¶Æo]ÞzlJÖ€#è™c˜c¡ÂŽc"YÇÑ„'µÆþZ>º}8“žCoÍ'ìÖÆ°ã8ÃŽ£qCS¤+±ä–n΄ »XXv0 v±°>*ì`*ìba}TØÀ(TØ ÄÂú¨°€Q¨°OŒuwÿpó[>7Aê‡ ;… ûäXÞ?¿ü„ sÏëš“ŒÏE…ýœŽx§Í’}êµÿ«ß F£Â¾c¬XÒŽ5Qa?§#^n°dŸŽ¸ÿ`v±?y‡Í¤†Ó¤æçÖ‰µ…rTØ oü“Zî?ï_7׿XKhâ»õ¤ë¼Se€z¿4±ßU¬UØ%w÷/ÃcüÇþ™’ùþ¼Tüp=èQa‡Oº3¨›.w‰©¶b‹ï’]©ÍÜöšç-ý”©) J¹Æ)+ì¹i ¨Œ&NUÏ¥ø±Ç¨G…-jYM[Šë'ôÒö­Éµ¶ÂÈc {c¬Ü´–v|»«Š»ìƒ ;f»^¯¯~´\µ»fÛýÜb ûޱ¤!(~u}ÄØrÆ«÷G…-rcÈ÷hŸª8ØÁöɱüdYªˆKCbbÛJI½›»„$•øþ¨°ŸŸÐ†cÐc'Lúæpyé –Òúþu7õ×õ+ë±öS}ŠI§ö? Ós »ù„ýíÓS·¤½&V.QÎ-O%ø=â‘È×ëùAÂrÉgëòÜ:%ˤ«°”®£]¦Yî¯ÇIªÆv±°>’u” OÊ$9HÃn –ÕoÛÃŽRœù…Òê>œ v±°>*ì`*ìba}TØÀ(TØ ÄÂú¨°€Q¨°ˆ…õQa£Pa7 ë£ÂF¡Ân ÖG…ŒB…Ý@,¬ ;… ûäXw÷/?á¼ð±f}Ø@…ŒÒ³0ø¥‰ý®²w…ýîþáæHþs¾{¬]û£ÂF©) J¹Æ)+ì¹i(V1Çú¨°€Q¨°7ÆÊMCTƉ ;… ûޱ¨²v0 ö‰±>¼¾IÒsÕöÒõ±*ì`*ì“c}xÿüòãÏ‹=Ö¬¨°€Q¸»XXv0 ×a7 ë£ÂF¡Ân ÖG…ŒB…Ý@,¬ ;… »XXv0 v±°>*ì`*ìcÝÝ?¼úÉ­¯™—š_²7rªG…}—ÇKô1GB…}r,ÿºêš'm[¿Dšë·C…}-—ÇËËOîy¸,çlκß{Io^‡4ëÇÇzÿ`v±J… <•ñýQaŸïòxÙ®×W5ܺš©ûIÅ9¢T"qäýî¥g"–:Þ{½«$š£ŽO¯ýç³­ž…Á/Mìw•·OOÝíž±¶ícÒíWÔ?¼ŽÎ+‰çHqÝ:š¸±x©v|g¨ì×|HÚëù•p^í¿Ô¶nYl¹[VÓvì¾#\î9)ÆÖö-WZ7\ÞÒ~¬íð š3õ¤hÛ=m[Ôë›{ÕÄG•¼þ±uZ?ß(×3Ç0Ÿ°[¨°K‰oŽ¿n˜tûÉwlýX²_òe \ûB®—kÿhHÖçŠ%£’õbmæ¾|ø_ÂåšãQrŒ´_B¤6[Û×$¹¤Î #‰µ™[žëlûØò^ïIMòØsÿ´Ç?÷%Wš§}}ZŽgËû'÷ùl}}ýþi_¿žŸŸÒ×?ŒÑúùFž…Aó ûˆ {n’×ÒŠwNn˜ÌÑèÙ¨°¯)—‡È{‰Å%à¹íµ`GIýîÙ~m"Û®µÿ³”Ú÷a¯×gÔ~ZMðrŸÏ™ýGûû%cÆïÜ¢ÂÞ+7%Vávb•oŒE²>Wì_Ò5MõJSe®ÑR᪉?ÛÞí·Z½ÿ9Ö÷ÏÿRºGõöÈdÍï—ÜþåX¬¤gaÐüI§®#qIvlx ìã*1sùÿ*÷·ÄË%ÄÒ¿•ýa*Z¥ÉwͰ‡Þö®¨¥Úß»o-}´°¥Ÿ•Ä>Û­1¬)ùüXß—³rÉ·všÊ%OYa/UsB¦TM× ¯éÑ¿0ž?N½ädÔ#£Â>Wëøu¿BŽõô“oéW¸½OÓ'5$¦49—¾@”Žûö]ÚÿÖö5ÿ’÷× Oìõ“ú[žë¿æõO¿ÍëþwIê_Íþ•Mü’ãÆñ…4õþ ûë_ËëÆO½~5¿_J‡Ü•îß/¨£-öåŠÊ—wož®ïŸŸ·ï¾}·½{ót“˜øóÝãÙ‰œå«ÄÉN2©IÚýÏH˜ÈÇ>3×+¿·­=a°†Ÿo~GàþîûßSü¤\Ü=¦ÂŽÓ¢Â>c)cë9„ˆßÀ-ưcÛ¶s 1†úñÏiÙ–dx ;N‹ ;˜å“O_ç¡ïÞèŠÉTØqZTØÀ,ar®MÖ·m„ ;F¡ÂfrIzI²¾m $ìTØ1 v0[i²¾m $ì*ìÜ阨°€˜OØ÷®°Ÿõúäg@…}M—Ëe»\2wpü|Üz«±_þ1Ó_`¤Üû0¶Œ÷%ŽŒ«Äà´¨°¯éz½fÿºYÕÈØ%ñGôÁW;Õ—½n6úø#mæñÏ}ÎUô*<›OØ-ÜéÔUÙÝÐWq÷‡ÊHóÂm¤í0_ËNQ'öØOÂå%É¿­ÿ¸6F¸½[–Šê¿[&"µñ¥e~üÜöÒzþréõÑ´®—{}cý›}üsû ‘’Ë–÷_nÿZâÇ^Íñ+yÆ^¿°m©ýÔ~I_bïY`O±Ë8Öº¼{ót•n‡»ÍúÙLHLjxŒŸÔÇÖ-ÏÅÄX¥É÷'Ÿ~G¼e°3üÌ”ž\âÚɵϔ)S¦L™27íñ·\ÃoÏ=>e…=7Õª=•“Xí¸н­ÿÒªiÇ߯Íßû—S¦L™2ezÆiíßò^Ì'ì#ư禱J¹u[ÜÑb;á6~i1eÊ”)S¦gœÖþ-ï«ÄìŒj;JìýËŠ)S¦L™2=ãtoæv«W‰qãÑÝOívTÛÏ«æd ¿´˜2eÊ”)Ó³M{ýO‘ÚÙ¶†Äì}•?¡“ëX²-­ŸŠb¼ÚFjÚÒ°ðK‹)S¦L™2=Û4õ÷¼G®pÿð°½}úxa‰*ìÀ眵d}Û¨°3eÊ”)S¦{LGý]ß¶/’õó ûÑǰפJÖ[c[ø¥Å”)S¦L™žm:òïºËOS…eó ;vÌ62YomÃÂ/-¦L™2eÊôlÓÞÏ·íu²ž*,›OØ©°ã¨j>ä~i1eÊ”)S¦g›öú;îÿ=×&ëÛ¶@ÂN…ø‚…_ZL™2eÊ”éÙ¦=Ý?Ä“õTžÊUbpj³þëRÓNl ¿´˜2eÊ”)Ó³Mkÿ–ÇþŽKÉzê*1æv öY×K¯çîÚäzícô¾~jÏv¤m,üÒbÊ”)S¦LÏ6íq£Ëû‡t²žry÷æéúþùyûîÛwÛ»7O/sÉ›ï: œÿñoŸÐ&–g¨+ì %Êð™=¨v¿Š Ï è!{•˜פŽ„Ï è)Yaç_ú@>3 ·dÂοô2|f@oÿ‰°ë²mÛÕ=q—¢`Ãåºm×ËõóGÛeïþðüµQlÜ™rIEND®B`‚PythonCard-0.8.2/docs/html/images/resEditorFig23.png0000644000076500007650000001137407474507554022143 0ustar alexalex00000000000000‰PNG  IHDRôÈèsBIT|dˆ³IDATxœíÝ+Œ$ÇÀñÇ–  ŽDi‚V>øqa¶î ‰lv α=Å…s²¢ø³L¤DZH †oÀ¹Ö½5õ~LUýÿI§Úî®®®™›o«ººjõäby¶Ýªûg;µ;Ý*Пç/öûk/¬7›™Šr=o{Ñ ò@¶çæ.(gm¡kg» ëë+µÒ?¾öà öוR«ÕákWûdsí$Î<Ÿj9—%ÏkyT¼[žÇWº[žÖ|y*ÕæJß[k¾®Ïçq?Ÿ®óñùœÿóé:ŸO¹ŸÏ?þéZèŒÀÛBDZ¹õ“¤ýo¬7êì÷¹ú=) ýígW?¿ñÊ{W?õͧêÍ›ïGçóç¿þAýúW¿½J@ü tÛ~Ñýëo?S¯¿ò®RêYßÿWß~ªÞ¸ù^à(p Ù÷Ч-tPÏï©;ÞsþnSõú—ß|¢”R׺߿xüñÕÏ·^ýMÍÓ0¤Ýéö ˆ‡fs诿ò®óºRÏ‚¹ä_~ó‰zóÕ÷Õ—?¹Ä¿xü1A€:¨ëŸC’Zè¾{è®AqÓ:ˆcv¹Wk¡ç¢E@³e®»ß}A=k”{.ºÜ3wÕ.wë=ôÀ,uú>ºF0À­dq´ì{èSoÜ|ïÚkoÞ|ÿ*ØÛ‚¸žL†IexæÆºlùr¦~@€é4®9Xœ€x[èïÜY«ºu™ø:€h¡0€à=ô’w wîÝ»ŠÓQƒâîŸíš¤1ŸMå~~~^»,UœœÌ]² ̇ @ôÚî {ö–?0`ºèrúäâàµo0é `l1ë k]t3xÛ¼¦G Þþànó}¬>ZýÐJ×?ëVòôõéï¶}ÍíÓãlÛmçÒ?ÛÎga޲4¯=´PÉÔ»èSOŸ\x[ç:Èør­}¢˜^©Ã€oÛ×v¬-ÀûŽ×A=â6À£‡¬|Zp8ó±´˜ ÞU@ó)1Ý ¦¾àZzÿ]Úý{@–Ønö©nzJ0ŸŠiaÖÚgd·?¸{­Ë}‰u’uÐsÍ~O} Ók_ê6 U=§uN ôÄ5\¬.zŠ®¹o»9ÞÜîbeoav©ë×4F¸@;¶¹ÙSuÐSZç1¦Ö>Vfvm‹ùÝ—w­m¾k&€@;»Ó­Zo6êb¿NMÌÀÌRƒ¹m!:3K æ´Ð%ãrX,Zè €: ….Ë•ÑB—HÚ½pþÀñj´Ð»x]©ëK¦²:`$5Zè]tsêWßT°³Ï7àzè¡¥U}ÇÂrZèfPï" §³lªÖñzè±X¨Ê,¦…þâur—»˜À>Àzèzž÷¥/! ­,¦…>íbŸö¬‡§d½sÖJ€2‹i¡OéÖzìÀ¸Ùï©w¤d½sÖJ€|‹i¡ç ×5m…/½. ¶Å´ÐSî¡wÈg\½d”:#ܠ̢Zè±]쬇ž¸í{±×ë8ÈÃLq €¹Üq4 t€vh¡DÚð‚9´C €ÐB`´Ð2áz1Âg×u Ó×G¸NŒg1Ï¡)|øzyfÞµÂݔԲKcÖ¥¹6 Á¢žCg=t”ŠYV:¦ØMãª#‚:¤YL ½«õÐãmyغüZ|±è/¬”²¤lås~W¹M±k¯ëmæûçûb7Ëk–ÅÌcš·íµ˜2†êÍv 1JÞO[^¾zŸ_R®sæ|~^-ª…K²©¶/B_` })ù¶‡Ê•S³{26¿œßCåÕ¯…¶ë×Z·¼bê,gŸZ× CדrM9ÇëÿRè\´Ò!ÉbZè9æ 쵿 JòK=¶öþ£}YÖšú¶FÏO 1Á¼$¯R£}~—Å´ÐÍÅYR„º\kî3"‰]šËdjUƘ–‰¥}¾)ÕB7ï¡Ç’rO½DI—{éy%Þ³ì!àÌõ9)}¿è†汘ú”o@ÜT/<æ ÷˜_®Çþ2¹§^š‡Rî@•òˆ[ ©AÒV®˜ Þ⻽ @¯ÓBOydMB ÷ìµÚmùE”R–˜í)ùÇl7…ê'TfsŸ’ëÍ}obʘ’‡¯K=åýJ)—Ôsê¦u}Ç~V|°Iü# ËT£…¾Ún//ö{uÿl§v§Ûƒô¶óóó#_^š“““¹‹­ÕKë/¬œë-΃yôð¾ÐÑ‹GdóéÏLý `X®V?ÁÒԘ˽‹.÷Ñ”vÇŽŽú‘©×÷Åìz'˜C¢ÅÜCͱ¾LZŸ§Õ3è|ÙÊÔóûbÞ»¤©q.wfÆzè €õÐq4<ã íÐBÂMÀr 9ÊÝ6œ9Õ+ë¡F2Ô(÷Ðüì:ˆ‡ö“>S\h»~¤Æ<¿kÖ0ÛìX-ùÎeka†Ê#©®RÎUûxýzêìpÆ0Ô\m¶ØõÊk®VºïK½ö>6¡ùÂcæ7÷7ËãÚו¿y.—˜àë+gL€÷å›g‹ºJ=Wíã]Ó”òÌ4° CµÐk›;°ÛòÈÝßw|iÞÇ:¶Õ9ZÖ•´ãŒk¨z+1³CÕÚËÖbPÛ±o©˜‡αéõFíN·×ò> K¸§.II—;üZÕ_Ê-ý²\·9Ûn­¯‹èæ=ó×C—ô%|¬rä.ˆ!©®Jt-ŽÃvo<–˜€> §žîÐèvmî@n[ÝÉœGºæ¨åcŽ€®½¶µ¤º*=W²úFìçæ `9X½cÒ[€’Ê'©,`š®‡âŠÙÌÀÄt¹£tÀ|è“0¥•gJrÙ ºÜ€Ð+c LÀè @\@÷M ;¹ K#f”{­@>÷Lqæñ¶%€úʧƒrÌ9|ùè¼ãêîzjÀ¯Ȥç×:_€LbZè1R»ÚGÆ`9ÀT7`~-pÀT]îÇ æ1­Þ’–qËV5-vX61-ôК繮ùFƒÛF˜û~Ÿš ÛhõÐyË#& ×Z}*&È…ö©½=4ò¼äµØ2ÆÓE—;ðÓBŸ ]×€,> À# Ë€Ð½²GÌ]ÀÐÑþh€Câű:éÄôØõÐC«­éÖÛíî6ß'¦¶ƒœ|æüpìÁŸ5êË•oîû'ñ;ÈtÌ2«N\Ì}­­>£š¸€š«=u.w‰¦Ák Á ùz]Un®ñz­/Ô'õ}oùÐc–M-]ZÕ&µ Þ ¾¾í:Xë}b·Þ×<ÆÌ+”ßÜ_dæ*®zr]¯ï˜iþ¾úÈyobzP”jS¿©³Æ,«ëË·åšõ¾• sÎáš0Elžf9¦©m[Êq±K!ç¾7.¾z³-WlË¿´l¹uiÛ§ôÿ^ì2ή2Åü˜¦-W·œÐCë¡ë–yiPµŽÍûÀ¶ífumwí*Ÿë_Þ­Zù5òõÕëzsê¶ô½ •³•Vë¸ÖŽ×çtáÒ5ëSÊWzŽÔ›§~ÍU‡¹Ç•–1§ç#¥ÞRó2oQ—1¿×VZ¦’÷¿„˜€î“ÒÍÞêË1–ùÅï Ì5òöIiå¥ì/Ii-9¾Ö½Ù’¼Ì/”/ÒòãóÒâsÎcÞ³¹Ëès¬²Õ¨ßýê’ÿ;%ejM|@o±þyŠ£µcZ£ÇR»¾lRnL•Ö}êñ¹åÌ[ß#Ï*ØbôòÈõ¥µõêR‘4"½F·|oÄt¥»á90Žkuä܆˜£~¬‹¶{¹®ýFT£ûÜfÔúšj}¹]Û­ÞÓ¹ôøYÿú‹7Ö×þé×ZˆiÑõò{Ïÿ‘\ŽÝb÷©|t`ÏÍoz¼”/ ³•§ÕþLöú¯ýž™õª—ê-glDªÔ÷¡U½ÕÌWL Ý·z+¶.VßïúµØí.¡cRGÆK—s½¹ukË3öø’ó•0G[× Ì±=®cÌ2æœ×–‡+è§ä™“Gj9Í}Ì{°©ÇÅH­·PÞ)õÊ»ô=ͭ˾{è!µÿ˜½%ùú »º¤K¨¯væ‘ ÙbŸ>DrÙFðèaùzèbZèµåþu¼T¡ú uWГПE­ ЕâË3•¯¾ØùhcŠ÷ ­ˆדÕJÆ€8,¡?½>Õ ¹lx†€Àè €€Àè @Ü(wÛ´®æÔ¯½¯‡@mbzhYÔš«­ÕÚ)ÄôÐzè±b¦Ñ¬µRˆ è!©ó»ØKÒE@Ÿñë£×Ú€¹tÐKpO°Ãt9`IÄtßzèÓm¡îv9`‰Ät_ Î¹g~Œ}BL@`Éζۢã èÌì·÷Šó  Wtyy9wÚ¦µÎmÐ`½ÙDíçêš'  ÄÅ~Ÿ},˧0: ËalƒÞBçh¡ Œ¼cFÁÐHñØGÚè•ò|:€Ð£Ü€ÅYè\ÅY~ôÖ­×~÷ô»ïÔß.þ¥Þºõšzñ¥—ÔÓï¾»ÚAo{m³VÿûïÓè·Þºc=F¿þòË?Sÿ¹øGµô…VêñŸþHJJJJJ:kúïþ=éßÏñKµ;ݪ·n½–ôO)u-f'µÐs&ŽŸ£__o6êb¿'%%%%%6M—¥’»Ü/öéÇ›ÇÌ]ɤ¤¤¤¤¤­Ò’xYb–QîsW6)))))i«t.Å=çFþÜ•MJJJJJÚ*­+}Ö›Ã?Šznç®lRRRRRÒVií˜i‹¡¶{ïÙ½¤`sW6)))))i«´UìTÊÌ•*è)óËÚ $¡ÒIIIIIIk§-c§æïÜ;üà¨Ë=·`sW6)))))i«´vÌTê0˜Wír×r 8we“’’’’’¶JkÅÊiÌ s¥fzlmîÊ&%%%%%m•Ö´ÞØƒ¹­Ë=ib™œmlÇÌ]Ù¤¤¤¤¤¤-Ó3À­7î`~¶Ýªõæzo@t@Ï™ç:FBe“’’’’’¶Hk<ž¶Þøƒ¹Íjwº½¼ØïÕý³Ún¯ d_ Ë4f[è¶~z K0 O[ë@¦YF¹€ºž£@ÿVJ©KýËîtK;Z]*u¹ºüþ'µš»< Ãÿž^)H!óIEND®B`‚PythonCard-0.8.2/docs/html/images/resEditorFig24.png0000644000076500007650000001106007474507554022134 0ustar alexalex00000000000000‰PNG  IHDRòã¿âIšsBIT|dˆçIDATxœíË“EÇ¿½áÁ£ÿˆ9ÎqŽ¡k »¸"*; ƒ  ÃÃVAy  :À€¢Œ êàk1P$\wƒãçÈÚꩮÎÌÊWUef}?ÁDwgW>ªÈoÿòùËÎøÈøCB¢æ/M€âÎcùÓÝ M•ƒ¨˜œîb|d¼ébôy¬0:6ÖD9‰†¥ùù¦‹0Ä`ue¥îrB ––W½fÔétÐA½t:i¸ê»|øÀgUz²4Té)âèÞ‡MœTî=û.5òAÓEÂÁ.B@j‘ ñÁØú'¬ãŽŒŽáÁª}7odt K'ïy)G–N¨xò½ûKŸ'Ƨ|$KÁfÌ%Ç5¾ïtB¤TÈ÷î/)…Yq>¬ï·ÿ})L㹿î,+Æ·~=Øüì[Fñʸ²|b(lfËœsº_{ðÞëŸ ¿?µ¸w(ìøîÏóM QµuÖ¥´<1>Õæ½ûKï3>úþ fýS;ðìÓ¯ãÙ§_üòŸ+Êë¼»€î^,+ªWoõ»sò8¦7Ïb׿ž¨/{¬Ò|O]鉸èôÞßu Çf.N\ÚUYžo}´Ý3“•¥ß$ºBžœîbrº«:¥ù÷ûKX÷ȲæE݆æó®-'FgëâØÌ嵑`2ÀTW.2“ùÝåÅù¾h—{ñ2gŸc¢TÈëÆ§úbþý‘ˆ×aPà'Ìf:(µÈ2nÿ±Ø81ƒŸïõ,Ó‹ëöô¿ÿþ· Øô÷}ýÏßÝYkª¾üÜ;ý÷7n2îÔÆƒ€ë?ÊsǦ£Úå[¸9x훯öÒ›ÿú`?ìímÎ~µ_;Ý2Ž/ v=Nî»8r~;àô[×?|ôÎ×x÷Ü«Cé|úî·Ÿ»g&qþÐ-ÀÞ_øîÒÑŸÜ ^¾ú­y1çÃb¤´i}/'Øu9+œ?[ŒTbH~ýï5Üùó Üùó ú}伈3²~ò7¿œܼ}°õùxõùwK?ŸŠ·ý¥#€kߟÔÊö¼r{·žÂ¾­ÎÿëÐÀ÷oOõD|îúÀþ×ÎâÀösÚ鋘]˜Ìí½Š¹½WG/ì0Jã웽ò}¼e |þà2`ßéM€‹‡À‘»O¾`_èˆÈ 7V9kNg¯(‚e&¸ƒ‡ÞªZ£ëŸÚ1¼˜ÀÛÁ®×^‹ÿ^ðšÚx°´yùÆ?áê­¹¡¹ä™-sèt:Øýò¸ôÍû¸xãHiÙßÙö Î]? 5àudçEœº²'÷ „ßý9:è`vÏ"f¦qìâýïNN§ƒSo~‰#ç·‹ø³÷¾ëOA?t }}§7 4­/ý t°ëƒç‹ÇnÞ8ñÀ³w;ޝ|5wר ¶øÚy$³º1Zcèä=„Lw7`tl «++›&ò}d`¸ß,jfÃuÜçG®cß8`'µMc런^QufiVWâë̯®¬ôãç—hº”#Kçñ'ôÂÞ,bB1,ë+›ö¡ùcmQÈÆ‰£¸$l\§‹\—kú*Gȯµ®jë¹gv&¿®ŒŒº-™tï;Páî'R)¡ì ¥UÁýÈ„$€Ô"OMŽÖYŽ–¢±Ã„ Ø´öHLƒ)SÝnTå%j(dÏ´u?,iö‘ I ™°jZ‹Ö¢f{;ó¯>)æëR:BªÀº,RUâý0øþ±¨c׋íQ¬;rH}D;ØkÅΗ›%¾ðÚGV93«rk˜(b~Ùçü«ìUš>ï#ë†⊵EÖñsT´8UõMó(:\ËÞ‹Âd×T…칊ÂUåä˜B»ðÚG¢ÅÑ){S›Ýu~@Ê~¬Dé´©¼«%hªÜ±¡ÖydŸ•Ô$-×|ë×òâüÀ!:Tj‘‹ƒ9¶S4(”orŠòȇë *åç¿}•» Ó&rYZ¤½H]ýsVWV”k­u dƒZ²xÅ+ÝÁ.þ?Û­«âëjºÐFæ`ƒ]í‚BNN=µ 9A(ÜöA!{DuR !UB!{„ƒGí`tl Ë8˜œîb|dœBö =„ºÈŸºA!W-3©z!$(dB€B&$(äÀ‘­Ê yµ–nÙ|ÜCÈÏ¡N(d,©>r¨\…ˆh·™è3W ùÃËôçN{49íTæ"H7LžÿÎ÷6OUþ:yêÞ“èºð6̹Óêù /:U~‘o²2e²k³pU~®÷(JO×?™ê>U÷š \’e‡.=˜6×M5È^MÒ¥/zï’fÌPÈ‘Pv‚‡*¼Oe™³Ï:åñEUÎS´¼28Ø• EÞù¦¸‰û#ÓüŠ0Ê~Œ|äéëúØ EŽˆ2«[¼®è·L'L•nY~¶”åcãG­.¿k¡àÅg—‹ÿ§Ô¦!Rö…•ÚÿUìä}‡Ñ"Ò¦ÊL—Añ@!)n<%äâ©éä~™+YÓ´U׳’“JÈ€ýä¾é5:ië,ž $‚²­ïgÀ~ŠA5}BH 'dl…GÁ’؉rAˆŽåõm ™(„œõe³?‘Õ¹Æ6mÑõu!Ê+Õ›2' ©Þ·_’¾ŸE›FÍe÷•êýº’_…E&í@ÔÚ¡ˆõHj°+UÊ6øœ?χ‹Ò2MC7\‡2':S‡:ëb„BNŸóç&Ždá:iÓ1Á6” PÈ‘ ²Ê>Gè‹;ŽlÒ¥©{}>ÝVˆè;YüTÌ(äˆÐéCšTÔ²m‘eBnÒ!× BŸ]‰Ù aÑŠéŠÙ$mÝpÓ¼eeÖ±ê©Û‹GFã­À>©ã¨Mцy›æ¢lã½ÉÀ˜,o´‹éû({UñbÀË<2Y#Åç—’åJ Î#’2)…Ö8|(dB€B&$(dB€‡¸y$µÑj\BHp‰fàÈ\„†I9uÖR3(ä-ü¯C¦ù˜–I´ËŠØÁÁ.B€9bLôçÃË®Wí_¶± 2ßcmÚü_%YU¹È0ªç%—íæYú¦åTmüWõ§SÞü_%Ydž"š¤Î2W•ïMö±ý¦DMkŽ`6Ÿw:!d&ÎÛLûŠ&{nóMQÑõ©ˆ¡ì^dÏ€„AB¶qÞfÒÇ2qF§zR…Vmš·Ýä/z.ª{–õåËœˆ<“èäGÖRÈ€›ÿ'ŸÎèTùÔA™•Ô¹Ö$\7Mݲl@,æ®êZBb' ‹l›§éAÝ„ÄJ}dQþyÏ’.DzÑ[d#XËŽe ùˆT_óè²q‚& ¡,2O*¦ekúùßG–\vnܲðð9îã>Mò¯¢bËÒ´Ÿmüà<2!ˆ¹îo‘I9ªæ¡èZQ·C' ë%;õB”OÙ=¨,¦ŽUöá€0–S<*±ÈMïBJm÷S~‹¬rgù2åÃEEQ–FYÎ_¯¦hJP– Û{*^+[ $»›²ÖA%îp‹‹,ÚòZe}d•ÉE<ùïEs÷!£jeÈî!ñ桇Ôq£¢ñ%¼ÐFÆ« Ä{ãiŒiê4Æ<>Dd;*\lŠú¬ðUXÁ*ŸUÝð¤‰È‘õGMúoºiËX4ˆVln«úªªüEïeùëöéu®ñ§xÒ„gøüH]ð¤ BƒB&$(dB€B&$(dB€B&$(dB€BŽÕÂþªósͳ®%ÅüÚWvNÝ›ßEéÛæ™WW™CYiU7´È‘ÑDEm«8b‚BŽQ¸Ø¼,~çÒdVå'JWÔ´5ÝUñtÊ_–NYc†MëÀ)[¤oÒìvm¦«âËÞûØK-Û#lšOYYc†BŽ•øT»‰D»„ª²Bu‰ÁGùSn 9b\­[lÔõ£#ì#ŽmeÕÙܯ›vÝ‚¡@Í¡EUÙÔù›Ífûüu>6Õë8Ðu@P W=›˜[":б€gøüÌHe°© òŽh‘I­È¬=qƒB&µBáV»I ™  I ™  IŽZWç“IˆÎòÒ<§l)>à©.—ÿˆ Ä€¹ÆÕâ!n´È¤.„<>2ÞP1!.p°‹  I ™  I ™à‚À‘yÄÐëkÛ Ï}ĺNðër:àòŒCBŽ“ ^EåoRduûý±iM¬ˆ©’·ZäˆÑuºžwjW ˇç}a¯/+‡(-ÑgTùdaº÷êšo1\U¦: #À´Zv‚ïSÊNÐõG­»ªÌª²ëž®¡zÆ¢ø²{r=Íà 9\*‚i\W‹å‚¨ŸêWÇý¦åhbÏ…LœˆáôŸ#졞æÁÁ®ˆÉšxMŒ°†(XR=5ƒ9D',¨„mz ƒÉéºñM±=9ÂõÄ ÛS/ló³eठâF'uÄ6ß™*Mü?ð¤‰0""~ íÄ 9Rš®8m'´çÏÁ.B€B&$(dB€B&$(dB€£Ö`3Õ![Ü_Wþ1óœ<…8®›ú}UÌ&vô¸¢SNÑ.ªaÓšãcÉ%ñ …9ù}°"qå¿—]—…¹ˆS–†(\tèZÓôd×ë”QçÚ²gÝ$lZ'€®3—÷ºù»¦më$@ö¾ÌA@1\u?ª÷MC!'€k¹.ëâ£ÒËʪ;èJ(Â-B!“`+§Û²ÆàÁö‘É:ܶI©êÃÛš] EÕ¦þ*Ò×i~¯‘¥¡n2nëayq¾Ô€È9ƒn>!@Çi±i/yÇlZ’2! @!’2! @!’2! @!’\R!œO&U0:66F!WÈT—K‰D‚B®ZdRì#’2! @!’2! @!’2! Àé§HpuTo›gÝü|–ͧ‡”<_ú„B&ÊÊmòãQ…Hšø‹6­# ï×™ÄáC«n(äÈñqƒè;|uÒñqZDY9Diéœ0‘lZNñD‘ÇÇâµ.'<ˆò×¹NUݲٜâPvzDêþ¬3(d¢Ä¥k×—¯ì6B!G+«˜¶X[(䀑5/}ŒÚºVú¢“ù:á¨õ0räø8áAÔwÕEtBƒ*ÛÓ"DyêŒäË®‰á„ExÒ„GÚvÒD¬•>ò'MÐ"cšjR921†.!$(dB€B&$ØGöÌÒ<û¤~þ_ÕóÓ#ÿüIEND®B`‚PythonCard-0.8.2/docs/html/images/resEditorFig25.png0000644000076500007650000001313507474507554022142 0ustar alexalex00000000000000‰PNG  IHDRô,5»AÈsBIT|dˆIDATxœíݹr$Ç™à„B°1&L¸¼DJ<–¤œ1)‘Ô)gb1áHФ4&ݤDJ<\˜còmf ²†…BfUVUÖ•ý}tWב݈ÀßfVþgß>¹yúøò2„¿ô?!„þöïÿ !„ðæO„¿þûêÙþo¾ü „Â_¾øÝ­ó¼õòÏÿùóßÞzíç¯ü:çíÀ&®¯.ïdäC«¹ŽÊÐÿõÍÃ?¿ùó®öözÌ_}áÝðê ï†~âÍï×^ü.À7A¼ùýÆ‹¿ºÈs¼ù“ï‚ù_¿ø.À¿õòÏyà›`þö+†·_ù0„Ÿ>ÿMö5` íž³4û¨ ý§ÏýâÙÍõÿüú»ÀÞ÷ÙWŸÜ9îµÞ Ÿ~õqøôËoeçKi‚zû¦ýn–{Öír êÅo[k²ón¯ŒÓõ|ùÑ*A½«ÉÎS«À^tÇÌ›î÷¾ ¾Ø¤¸Ï¾úäV—û§_}|§Ë=W3~žë/_üîΘzãOŸÿF—;»››(×U,CõùwÃg_r«Ë½™×îrá‡Iq¯¿ø~øÇ—…¿ùøy3–þÆK¿ ÿÏïÃßþ3Ìß|ùAøëW·‚ø[/ÎÎÎÂÛ¯|þüùoou¹ÿü•_ËÐØ¥T^¤Ëý§Ïýâζآ2¯>ÿnrú×^x/º@ýë/¾Ÿ\¸¿™áÞ=g3®­=«½«énï¶ jaéWØX‰²å:lèÞùE‘óè°¡¦ZÚ\–~€ $3ôwÙàPžŽÜ,M†Ð :T@@€ èP*0za™ËÓã½óða2OZ)îÑãëY Æ)Rm-æÛ'2u˜blow_ô†µÜ`çyEY_ögæbýÞùÅî²ö=¶ %祙åÞœ¥ÊÀÅ®1vûmjo»w~ñìgÉkömà4¬zÛÚÖAgÍë7_(šŸn €’܇¾]ÿ É™ü–R< ·W¬»9§Kz¨«º½=§[½Û¦X;º×ÍiSìÚ¹{©Ï€cj‚ùÔ >{R\jâYw »yÜÞ·h›®éØö¡ëåìÓÝoèõÜ6¥ÚÓp—ú8žn¿ÿàáà}ç]³z,øt·§OÎXò” –jÓSƽsÛ¾ÔçÀ1Œ Þ1‹Þ‡ÞXcçœó-m©kís`Ÿ›×¦n×óÔó4枯{ž)1çú¥g²/õ9P‡Å2ôvÀiŸ·»ácihì¹{žFN`Ž×=&ví¡6õ 9ÄŽYòsHµ€}É].W‘€Þ7ŽÛ·ïõœãrŸç¶)çõ¾ãæSòsÌöoÎíi)Å2ô=‘¡Ih{ló\5¾'€ÚŒ§8KÂÔ[Ú ”ÝgÆÙ]q–-¬=Ã{L!–=Ì>ßCX ½€5fš›ì@ŸÃfè{'ø°¦Ãôna”Üâ&Ýmkb‰µ£»OÎûÉyocÚ@ªèrÏ)Û;nJ!–ܶŞOy?}çÈNS}NÑ“’Ç•’”·n#ûRE@™Rô¤q„,÷m`=‡C_ËYþÜl[¶@µúÔjd% ±´K¯[¼f¨­}]ÆŒÉP§Ãô¾b%cŠÃäN|[ªxKjRÛ˜6ƶ æ§A—{ås€Ó  @t¨Àê½»"Z©óíI_›†Ú»—â.‹ }‡Œ{0–€Xý¶µÔêms¶·_ï[®{ïwꜩµÒÛ¿ûÚÖmS{ßÔ5`ŽMïCÏ)0’[4%çy÷º¥ §¤®•*²Ò}0×.–É™66—2æ:ÝÕÝ`)»CoÀÜ 8u™×5ì¹mÔcw=Wßøø’×™r¬ ÀÒ6ír*ZÒ–S¤¯€ILéÂ)}ÛsмÀT›ôRPr‹™¤ë…SÆžæÚ夸RåL@öÀXÕô£Ä£¶€mm6)Î$1(g“€Þ]pe©k¤¶5PJBÙã“ÒpØ¿Ýܶ¶vðißë.ðpt» èÀt›OŠZ·½[%u\w{l õÜ gµ‡1Áàt¬ÐûnÉ @Sж¤ÎÙœk)À騤|jéû¬§°Üà;åø%ɺˆÙ¼Ë½„Ò_¦w‹Á°¥]NŠkä” ¹VwóŠÃp:v“¡Ç²ÜXA“îkCE[R_ RÇÔT¦M@Ý6 è©.ê1“ârË)è2ç:{/Ó\[0¨Û¥ßÑì©8ÌÑ?K†í¦Ë½QK¹Ñ£µ€cÛå¤8`œÃôµg{9²£·€tÒh€Ó³»1t8//‹žï°=U¼%gýôö¶Üㆊ½ätékÇP›§k*Ó<7`]÷<,~ÎÃô¶XÁ’Ò.¶ïÜb/¹]bç̽ö”÷ÞwN`×W—áüâ"<¹¹Éþ=¤Š€žSQmŒµÇ çÖœc©ìËØ`žÔ«è1sJŠÖ–¹Öö~Ž®t0Á,÷Akd·c®1·=²u€íMÉЇT›¡O­~V²ØËØB/¥‹µÄŠÄŒ“`Kdèg×W—OŸÜÜ„G¯o Ò÷5âÑãkÿô'Ø{°Ü{ûj2%¨÷Åèj3ô=ØS–{o@-–ÈÐô Ä,1Ëݤ8X™Yî-}ÅR†¶åsïüâÎÏœöM5µ ©s-}ÒæüÆ\#çõ½}6À1™å‘³:Ú¹³ÜK_·ïœ¥¯³Õ5rMù»Ž½žá`M2tBë`9Kdè‡ è©5Ò»ÛÚb]¶CÅRRR×ê^7ÖEkG·›?Wê\±çs–ÂMµ7ÖþÔûjÓ”6]#÷z¹Ÿ—/:@ f¹'ÄþÉu!ç]{ëY_ų¡,©ÇS®×WœeŒ¡Ïmè˜Ü6-Q0fêõƾ_€±¬å>ÓÔ•ã¦{ì”kíq’ÖÑ Æì¹m@dè3Õ–iÍ;·´×¿Å‘?Sà8܇^ÐÜÔM÷ù]²k™5oÑ+õ~_à(dè±qé¾míçmSóÐuSíMµchÿö1c µ”ºÆcrÛ{<özcŠú_¦Z"CWœeÿÐO—¿=0ÇÔ`Þ£O¶Ë}Ž­ºÚÙ{`+Åí„æÌa¥8¨€•âZJÎhN­*Wê\ÝíC+·¥ö³’ZîJy©ífŒ,Ç,÷…ô­jVBß p9÷=iKß—„ØuSÛsfì0ûÐ+°t€l‚ñÚ× Ÿ1ô–vÆ;¦+¹½½ý¼û8§°Gì\±b/¹RñØîvöÍ,÷„1]ÉCPÆué;WN“œýRïoŽîÐB©E^È#C/ »šØÜsÍ9¶Ý–T .`ûÆÌǬ’Àtf¹²×ÀÕîV_¢}&¹ìƒ ½€1ë/yý®v–Ü<ïÛÊus€}0†ž0T<$µ=6~>¶¨K_›R]èsгÌO`Ém/å¸=!hr·Ç&³ MpšL7TÑ«Oιrªº•j`P–ûÐj‰îý¥ìR‹ì` =ê(Áæ(íl­½Gb–;T@†ÞÒ×…=u•¶¡ícW¤›Òž1EUbûïñv<n3Ë=S©î✢*SŠ­¤®5Ô†îucUØ?ú†¶*ª’jGîþì1ô–nÖÚW8%özÉ¢*)2eb܇‘[ %µfúØ¢*±c–¦x @]–¸ýð½=fœ»ÊÙœ,<7˜— ú¥«­°-zBßD°œ©¹æ,µ*аR\D_±•œ :fú˜€œ*¶2ôˆ¡úæÝñç¡b$}{Nq“ÜktM-3åZ¬ÃzBªK}lÑ–ÒÇÄ^[Teεs€}rúÊU` îCßÀÑ‚âÑÚ pŠdèP:T@†¡@dèP:T@†¡@dèP:T@†¡@dèPz%J—dàXN2C_;øÍ¹^αízåK½·Øy›m©k.Ñ–{ç·~¦P#z¥j\ß>¹yöSóûã$3tÊëV`]'™¡·»§Û]·±nÜX÷njÿ¾ –ê&N¿y>¶+½Ù¿ÛÎTÛsÛkGûZ9J}–S®Ñý<j³D†þãÚ]L;Pu··¥öé>ºNwÿœí±ç±cú®™Û¦¾÷ÜwÎö±íß©óÌù,û¾Tä~žµ™’¡õCô!©Ì°T€˜Û5 Âs­9±.„ñŸeß]ýÀ©:ù }È’™Ý^ƒÑÔ÷<ôåbé,y¯Ÿ'À–ÈÐw?†>Õ˜±§`ÒÚ)™üÚÙúšm¨‰ ½Gw8gLº=ù*5É«=®;f²×˜`Ë–»Çç´)vL_;†ÆØ‡ö‹íŸóYÆöRz¨`KKdèg×W—OŸÜÜ„G¯ÃõÕåàA;þ¹N7œ†&»šSÿ@}¦ó¾]m—ûžõÍ‚¼îòyµYâ>ôjºÜk°Õ5Öe¥8¨ÀI®×¶‡ÔCm˜Zˆ€Ó!C?]äô9ù jpòú–…Zbm€)ÌroY£PKß¾ºÕ˜êä3ô1RåF§¬à6ö8è#C¡T^¢B§M†>ÑÔâ"©õÉ`z¦RÅEúºÜeíL¥ÚÚ÷R“Ó†&­u·M=Oßv¢úAèž 1ôøöÉì€^VŠ›HÆ ÀžÈÐ'è.³Ô5RÛR×\¢-¾¸ƒ ½€-ÉЪo­xN }¦îúîíßÝm©¥ccÛc]úc'Æ•(&c2À1ÈÐGê[ü%g±™æ§XcÛ‡Î;G¬±ó¶_“ÙÔÁJq#-±ûšëBuÔÈJq;05À}¹¸N‡•âÐÚ)™üÚÙúšm`92ôBbÙrl\»ûÚPÑ—¡/9cì}ûÅöO­+°_KdèÕôTWwNг=õZîyJ“ A0Ø;³Ü'J·©]í{WÛû¨Yî…™ ÀdèP+Å´ö ð¾"-k¶!¶ÒÝP±˜öñ,Ë,w²Œ™œÀú܇0†>R·hJn±•XwõÜ"-SÏ9¶@KJj8 õXŽYî3´oOk?îV`ën×½Õmh‘šîö±çL=î{¯Cmz,Çú }mŠ%&•*Ð’»¿ pÛ°R\a±,5×ÙìÚ²Œ`ÆÐwjÍl}©ëËÖÖc ½°Ta“±Ç•XK}‰-s¯g\`Kdèg×W—OŸÜÜ„G¯ÃõÕåà;þÑ×M0XÖ” Þ£u¹%˜,Ç:TÀZîPúHK$é;owe7ERè2Ëý`I F†¡”º·:öúØíí穵ácb·ƒÅ®!“¨—µÜ *ÆÒÞž[À$gxERhX˽€©à¦P$€úLSᬑ-ËÈN˺Iq#¬‘IËÖê'CŸ©¯ˆIjbÚ”qð9mR$ ~ÆÐ'jñ÷†çì?朱Ix}×Ìêã>ô$˜ÔÇZîP:T@†>Rn!”R×é{Ýìu2ô‰ÚK´nÝ¡@dè#Å2óîãnwx¬~y7³ïnÛCÇ¡ÚZ± iÝç±}b[ºçЭ@za± }H{e7€)dè…Í]®U@` ú‚r³ôvvnÌ€)dè3µ3ëÜÂ+©sÄŽ‘µCµµ‰R×†ŠªŒ9®o;´©‡~`ºçhC?¨¦‹B°RÜ&dÖ”&C_Yw™¥®‘Ú–ºæm)}N_„Òdè;p êÞ#À–dè'(¶Ž<Ç&CßPwÝ÷öïî¶Ô’²±í±.ý±èREfÚ¯u·§žÇ¶O)bc @šûÐWÔ·HÌP°Š}é+ÓwÎö±íß©ó¤ŠÇŒ]ôfnÒ–¸]@OXb½ö5'Ö…P.KÖÍP– ýà–*³tF,ã(ËJq;ÓÚ)™üÚÙz©6ÈÖæ“¡ï@,[Žié¾6T fèKÁÐûÐ~±ýSãJ±i3®p›1ô•¥ººÇLŠË=n¨PLßöœc‡ ÍäîŸ{¾†`p—ûÐ7 FS»ÚOÏà.õÐwD U¦’¡@¬·‘µgv÷li?*âÒw¾œã¦è®”7¥mfÒµ3ËèJm{SbE:€š¹ÉyØcèéPÉ-¼2TÀ$uÜPÁ–¾®öÜ®î˜%м¤öé+p#Sjg–û¤ ‘L)`2§`ËPÛbíX«ÈËÔ…hràTCß¾`:Eé®ï9ç+Uä%gU;Á8uMÎù}ÿÁÃp}uÙ{>½€Xv›«t`ZnË"/ü §=„_öò†€¾#K”kz¾1Çæ~Q7à¶œ®ô\z©"'c›»zN!•5мt?‹œ÷ê=øòè#,QÀdNÁ–Ø„¼½y™ÓvÁ Ÿ€În æÀ©¸ÿàámC“àºÜ‡ëï±Á<v¡ âS‚y:ìÆÔ`‚€UРf¹ÀrW€Ë% ÀÊb·©Í5) __]]®NÉœÉo)£ú;Ë«æÐeæ°?f¹@t¨€€Ð :TÀÂ2PØùÅÅÖM8¬{ç‹ÜŸ §@@‡¸½s<ŸÌ£Ë*  @t¨€€Ð :Têþƒ‡·~º¯õ=ŽÇmkP¡ûÞ¹Ÿ;¶­o;p,2t8a‚9ÔC@‡%˜C]t¨€€'êúêÒd8¨ˆ€'LP‡zèpâu¨ƒÛÖ B± Ý7®Ùß$98.*5ÀÇììŸ.w¨€€Ð :T@@€ èP·­ÁžÜÜlÝàÄèPؽ󋭛œ  ³@ °cèP*  @t¨ÀÜ^ÇwBxÚ<¹¾ºtÿ,ÐÙÓžž=ýþQ8Ûº=ÀÿÀlAOĆ8IEND®B`‚PythonCard-0.8.2/docs/html/images/resEditorFig3.png0000644000076500007650000001457210277403055022046 0ustar alexalex00000000000000‰PNG  IHDRr|Ò.0ysBIT|dˆ1IDATxœíÝï“,W]ÇñïX)ž€DRˆZHØKv“pÝë¯2ã2^«ò„'>ô 0ò#Q±¹Aqƒ™ü>Þ*W´t­§l$²Á„”¨ˆ…" ‚y<>˜Û{{»Ï¯î>=§¿ÝïWÕÞ;ÓÓsúÌìÎgÏ~OÏœÙÙéÉZ*Ýÿ®å&‘ÝýÔ}4tíÚ5‘M‹ˆ<ûôãÉ:hï¦ò•¼ïÎ/Ïf³ëÿ‹ˆÌ*ÿon˜]ø_d¶ù§ôÿyÖvª÷¹xlÓ}ol9¶±AýõôûÆ;vàsÖìØžÇÒéûå~î­ßÑïÖß/Ûã7ô‡ŸWÏsÆÏk²Ÿ×òÏm w¼ä¹óËßµeÀÖÝäßËÛ.ßÜú¾óù\~éÃGµí9lY›9Éãcëm[ ò¯>ýQùνwoãp=÷¿!""·ÿôownë©OÜxÌwýüG;·UÆ ñ…ÇjÛ^~Û/÷Þ™¡{öϺpýM?{àÜÿ©?~ˆˆÜùÖ\˜€Â¥½+""rvz´ÝÄ9Ùù²×ß/ßú†ûEDäÏ}¼U'Çdçg~çü²/Ä DÔEp—/‡„¸HËÒÊÿþãï_¸þí;ï:¿üõg~ïÂm¯ÜýÕÚý¿òÔÈwݵ±þÇ®ísËååß?½ Î×î?$_züCòÝW~MDD¾ø÷Kßó#›RÈ¿üÍEDäû~ì7EDä }MDD¾ÿÇ? ÿôW¨ãõó‡Ï/?ÿÉ÷×nñÌŸ>XÛ¶÷sÏSŸx·ÜõÖˆˆÈtñù¸ü Ÿ/Ósvz"—ö®\óÐñŒÈÿïóKùæóK¹XZ¹ùöwÈÍo|§|Ûß)""ÿýìBDD¾~¶ ¥W¼éyÅÈ+ïx ÖæWžÚÚyˆ?¹ ½×Üý>yÍ›ßgìÇ—¿1þ·“‰ˆÈë~è×åu?¼ ðýÛßr>Ȳ¸çšÜzÏ&à?¿Úþó¹ ñÛ~òƒrÛO…·UvÇ[‘Ý·lË韼÷Âmw^ñ'¯‡øÝW•7_}TDDþá¥ÕñŒK9¸›„¸ˆgDþ²×ß/³™È7Ÿ_Ê7žû¸¼ü¶wˆH}Dê¿N7öª;ßÓ¨\üÚý‡ä‰ú02ÕÒJ´¹Iâå9 ½rMÜT3÷Ùê;;‹Ó‹9Lib³i˜7®‘ß|ûõòÊç>&ÿó¹]Øÿ;.mê½_{æQùÚg•¯~öÑZ›¯ºsæÿùä&Ì_}צžüå'‘/æo‡Ëž_ü»M=»˜ìüÞÝÔºÿùSË>õ°¹ƒ7üÄf’ô¹O¾ÿür“òé‡ÏüY}’Ó§8ü‰£ä3G›ù&;i+ÂC¶›ÌÎNOÖ;»ûòìÓâC³Š0¿åòƒ|Bä~ü†þð¡YžçŒŸ×d?¯Åÿo»|sëwvæy~þý;^òÜù¶A¼E¿zúá-—›v@ ×ÛíÛD¿úî÷ÃÀØÌçóèm"È`*LŸ^ØŸGÊ]‘úðSõ@tkËeŒ #rPŽ årPŽ årPŽóÈQû]gh/˲VoçÆ´ä0Êóx3‚5Y–¥î€rÔ0t¡FÊä AÊQ#GÍáÑqê.¨•es Ø:‚Fyž§î‚:ËÅAê.`¢rX­V«Ô]P…‘8R¡FÊä AŽ ®áËÛBW8oz¼¦í}Õt Œ9¼ªËsùö)_oºb|¬öS/lSë 7-Ñæ3Å«‹1Û¶al+0}¿0lûSÖiD#€Ë+™¡¸QZATÅHººúû¶ŽÍSÔÛdgy]NÓöòõêåê6Û}\m! Û*ñ¾…†»"Ä1eF䦅•‹íåòHq½ºØrµ„â+ÕØî_\¦$3M„8¦.jÅuÛöÐcùÚ±mïã3Ô¡êTZ1­p_lÚ xæZÈ]+ܳÀø•GÃÒ‹VZ!¼SñK‚:à×K¼WK,EØ›Öád½M¶UwfÒ×iÍNßÂÈÕÒKñ¿©$CˆëQ.©´@zFä¶y•)¼¡S“3PÚàÐ\ï§šžÑ÷øT'?‹0¶m1‡vÓv\íSÑúôÃQuHݛѹ^¦.¾|Û]#ï&í¸¶SÑk\¤>±i»“ÃÕÇ›kú]J4˜’h5rÓvßí!ma´…¢¶þ]ð¡Y AÊñ¡Y0Z.X(P‚ GM–e©» ‚5ŒÄ]¨‘€r9(G€r9(G€r9(G€r9(Ç‚Psxtœº ¸.˲èoÐÚÙÝÚÞXÍçsY.Rw#A£<ÏSwaòú Þ½ë¦m0Ó:ÈM+ûhþLñ [ŒmqŒÕj•º “FØ"T/ K¶‡ÉNP®—¹mMNÓõò¶êöâ¶ûVËÅõòÿ¾c…>×v×íå>Œ­  NAÞ$PCö1moÒ¾«ŸÕû»ŽekÛußÐë¾õLÍL1ßþ¼ºKV# Çë…8ÀÎÊõv$;ýo.0~¼Î·c“±Gç}ö·ùW06—ö®œ…ÞîÚ7D‘—'‹ë¡ûT·7i¿:¡Ù´¶Ç*o÷ݯŒ?91%1æ•`×:È]O®-¼Cîoš€ls_Ûi—c…¶ÝôØbPoÑo:ã XÜÀ¸PBÜŽA9½LóN}Í+Ù.OA š.sgMng¾é¢Aœ~h årPŽ9Œ–‹6” ÈQ“eYê.h€ G #ññÓ¶&%Ür`bæóyê. 2‚˜˜åâ ug­€rŒÈQCýt8²,‹>g±³»µ½±šÏçjþz!Èa”çyê.L^Ÿ!„¶›¶ÁLë ù‘³CüЛ}âãjbµZ¥î¤¶mñeí¡Z1Ù ÊõV#·}¶pÓµ,M%œêp¦6mk–ÿwõ­Çeêcù1ñ €6:¹ïƒâËû™ÂªÍõjû¾ûØú]½¿ïˆëX1–%Ä1MçÎÀÄÑ[k”#È@9‚”£F£å  %rÔdY–º  ÈQÃH|ü´­I 7‚˜˜ù|žº ˆŒ &f¹8HÝDÆY+ #rÔP?Ž,Ë¢ÏYììîGmo¬æó¹š¿^råyžº “×gˆ0¡í¦m0Ó:Èù šñ[­V©»0i„-BQ#årP.J¼ú9¦%ÙlŸ5lûübÓþ”s .Úd§ïßM «š\­Þ¯|ôp-Ànzý£½­µâ[¡¾ëþ†'d±ut·• ·¼]øf@“ŒÎñ0½ž/í]9ÿBs[‘›em²ÉN@'ß‚ÊÅ>¦91„käMEµ}cBÎlñµ`˜B_³ŒÄ»Iú}Û©‡¦…×~7Iƒœo€*J+Í©˜ì0^ÅœXñezS í26øôC½ðÍ‹ùæÐšÎ·M#rPŽ årPŽ9Œ–‹6” ÈQ“eYê.h€ G #ññÓ¶&%Ür`bæóyê. 2‚˜˜åâ ug­€rŒÈQÓ´~šeuu !‚FyžíÇŸé@z9¬V«•wßHܶpHq[ÓExùd< Ž G¯\«;µ dB¨c²”cDŽdL£tßrårLy¿âzÈÒ¶•©BÖ—†ˆ Ç`4]„×T¶)_6µe:F›cCBcPb®þÒ´-VžV9%Ö(Ø6òÞÆ±mc²ƒ•r„Ìèš0"Ç`˜&1cµÕt;£sh2;;=Yïìîókœ;<:–û®Þ¼¿æŸ&5¡ÙáѱäyΈuc^XÂvê! AŽ­£ë7ƈÉNPŽ årPŽ årPŽ årPŽ årPŽ årPŽÏZAÍáÑqê.àº,Ë¢öÍÎî~ÔöÆj>ŸËrqºAråyžº “×gˆŒùƒÑbÐ6˜iä|Žóø­V«Ô]˜4¡¨‘€r9(-È/í]9ÿòm/.Û¶ÂE™ì¬ÖË‹ë¶í¶ËÔÜñp-rmÊ´×ËY+!ß¾Àø™^ç¼öã£FÊõäÔºؘòÁ6dž0QJ+E½«|ݵ݆š0.!¯×\´òêm{âCjdåà0¡¯iFâÝð}É1ˆë†ÉNƒÂè¼9‚@RÅ\ZñU~I7ºQZÐ ß¼Yùvß\šoß©cDÊä AÊQ#‡ÑrqÀ€9j²,KÝ ä¨a$>~ÚÖ¤„ALÌ|>OÝDF³\¤î"ã¬PŽ9jšÖO³,£®$DÃ(Ïó ýø3H ‡Õjµòî2o²¸H4,T䶇9zUNñÕôSì¦òIw„2º ȱUAޤª#tÓ¼ÅuÛöò}]DZµ]Ýîj˶Èý\—Mÿ‡ôÕ×'×eŒ5rôÊ··ís¦Ë5à&‹vÛjÇ!mûŽéZ$8¤¡Lm™Ží릃 GïBƒ¦íh±tMC,ÖµÉ"æ`nÓV¬ãA?‚ƒ`q†jV] 5rôª¯p4Õ}«eœ!©þ¢é{”¼íã!-Fäè•«F^-‰˜Bض벉©MƒßWïï“ïùIÑ' Çììôd½³»Ï[¬qîðèXî»zoðþüüiKžçŒÈQÇ€.9j]º0Ù Êä AÊä AÊä AÊä AÊä AÊñY+¨9<:n´–e|> A£<σö[.úí/‚V«ÕÊ»k$n[‘&dIß>¬vÜ@­Ìf³Îm¸‚x!Ýdu ¦KÈ uÉ9ŒAŽÆBCÜ´<#i >‚NÕÐŽ1/TP6-¨\¾Í6ÊõÝîÚÇצ¯¿!ÁÖN¹ Fðè‚9¼f³™¬×ë !¾^¯£µ_¥›FìåëÕÛ}×}møêï¶}CÚ ùË#¤ï€AŽ mC¼Gâe¾³X|÷u1Ú»ô§M{@Ÿ¨‘ëï¶!rªay¿.b„jÌþØÚbbDŽ }ÄE.¦m\Þ×v_ÛýmlûcêOµÜâ dÛþÕûúú„˜ž¬wv÷y‹5ÎË}Wï ÞŸŸŸv˜ÜDW‡GÇ’ç9#rÔeY–º  ÈQÃèz;#&;@9‚”#È@9‚”#È@9‚”#È@9‚”#È@9‚”#È@9>k5‡GÇöϲŒÏg"Èa”çyÐ~ËÅA¿àEÃjµZy÷ñÄm :´óó»C—q4 ÈÑÊl6 ^5¨Œ}­Í L“h¬¼3€ô‘é:òî#ÄmëVV×Í,FòÕrMùvW;¡ÛCo†‚ ‡Wæåo²³-x‹ÛL×ËÛ«û˜ÂØÖŽëx!ý°]†„ G¶!.⯑ûV¸·hH;®í>mïlA§.#ñP¶ ®ŽÌËLÛCökÎŒÀ¡“ð*»¯*—JDn„yu_ÈÆM3:Ç1"G¾B¼Ôåúuu²³¬zŸv|m„ô ¢ÙÙéÉzgwŸ·XãÜáѱÜwõÞàýùùÒ8<:–<Ï‘£.˲Ô]ÐAŽF×€.Lv€r9(G€r9(G€r9(G€r9(G€r9(G€r9(G€r9(G€r9(G€r9(G€r9(G€r7µ¹Ó¥½+±û1Zg§'IŽ»³»Ÿä¸ÚÌçsY.Rwè¤U‹ˆ¬×ë˜ýù|.yž'íóO?žôøCwxtœº @­ƒ\„ °! l5rPŽ årP®S<•êY3å3C.í]q^Gw®ç¿ïãò½êÔ¹éÅl{ó¯Éó`;F[Z!\¶‡çHK݈<!žN¹ìR|ŠïGq[µôUÝßµ@Ý(ƒ騿'L—móÌsÍŒ2ÈMa€í°}|CÈ÷Â6"à6Ê !ÌS0¤Ûâû„íd§ˆ\¨Ë¢?±žc[;|7u#rS8»FoŒÌãr=ÿMqV÷·µÃ÷pSä"þàn²?šëúü—¯ÛÚâû„ui¦€ årPŽ å:Mv²¤×:ÈçóyÌ~ ü¢¦¡u§^Xnü¢¦£Us>ïð-©»`K˜ìårPŽ årPŽ årPŽ årPŽ årPŽ årPî&‘k×®¥î ¥Ù=÷ܳNÝ @{ÿ·Îæ&镟©IEND®B`‚PythonCard-0.8.2/docs/html/images/resEditorFig4.png0000644000076500007650000001105510277403055022040 0ustar alexalex00000000000000‰PNG  IHDRà,þ`ZsBIT|dˆäIDATxœíÝKs,ç]à¿(œ8qBCì8Tá[‰U¹Yqp•õذaÉ&ÆŽÍÅÁq2uJ(\"_€µZž¦*@'¸ä “[„@.¸ÀĬÅâœÑiµú:Ó=oO÷óTéœîžîžwºgôÓ{™î­ó³Ó‹Öæ©O}:xäÑÇR—&áÆ·8"âµW¿‘¬005weg>öÛs9½µ±U2}kb+ê¦#¶nýs{6;}ggW¦·.×,Ù.3]YƭȬZ_ÞÜþ/KV´ke¬(ïå«+ãÕ纺݃v}Ý’éÊ2æÊ[ð\¥ÛeNnf³\–·â¹®í£è½R¶Â2f¦¯íÿzyëßçû¨{og§ëÊ™sQù>¯*£Ï¢ÏbÃòú,––1{NºðÁ_üîåô/tºg ‘»êW€iûÞ³ô¶{{{ñ{_>¾¶\@ËŒ•::¾YúØ(š òÍýøñËû©‹Ö€ÿïw?ôÔµÇþ÷»_ˆˆ·¾ÿé‹u˼ò×–Ý÷áç+·ùñËï~ì…ø÷Ó?‹ˆˆûw_è¾pLÖöÎnDDœŸ6Z^¤² úÍï^ áŸï«­ Ù…_ýÐ_ÕXá×>ö'WF8@×ÎÏNc{g7¶wv/öMøF4è~óû‡ñ–÷=U¾o|ç+Wæßöȧ""â¿_;¸¶î;>ð\DD¼þí—""âþADDüç«¿¼ó‡ ñÓo}©py¶¼ðo·kÂ|ü3ñ£¿ÿÓ+Û<ø‰ÏFDÄÿö ñÞ'>ÿüµÏǯ?1k\¦%ÂÙeM•ößýÐ'/§þ½ÃˆˆxËû~ÿÊ:‹ð½çágâm?ÿ“ Þ{·Ÿ{?ðlDD¼þ/5.XÖÏ^ùrüìnýDÜ ßw}ôùx×G?]»ýý»/Äý‹ðýú#"â=¿ïyüňˆøáß}áÊúÿòµÏ/UN¦%¸mÂ7¢¦|÷COÅ›ß/߬7þé¯Z=i[mš »ðÞ'>™¯k@¡lí7ÛÝDmôÝ=UÛ§zÏÃÏ_¡F*ßç›ï®3Н!À: ¸Êƪ³Ò…8îyÿÓñÆw¾r­ úí·b•yÇŸ‹×¿ýRü×íÁWu~öÊ—/§ïûðóqßGžŸ~ëKñ“oÄZx÷î­¯"ea=ðñÏľþÅø×Ì@¬?ñY­Í4VVË]¹ ú—~ã“Qvýé·þæí¾àÛ+Üóþ§ /’ýöG>uå"Ù÷~àÙ+É~çŸ+¼0vÖ¯|èn?¾u­ø¾<_xAõü×.¿œ)ã¿XØdþào}öÊs@_\Ѝº¬ä20ÔØÛÛë|ŸjÝÍhUFA@WjÀ/ýnªr ÄEÍ»²íÊžØl:–ÕÅ|Q¨.¦óA»˜¾0^pÑ ­e.ÄaÀCVU ^¶Xß2LK/5ຫb5 ×Å゘¡Ê6%/ÕdÛ옃°`€Ô†aüÖÚ\VûÍ.+ª%«3TùZpQ­xÙýD„cÖKw}÷#áËP…a~YÝ:M¦«–ã´xñö [€)HÒ¼Ê` ñ=`ý½0>‡û+ß°Ƭñý€›N/泲ׇÎ657ý:’P†Í2›ÍR¯6€ó7Uh3ÝtM—›AÍêù0$ €  b40.GÇ7SÖb6›-=æA½˜Ïç©‹½:<Ø_i{ ôæää$u 7«Žö× `H@@ÀÐÂöÎî Ö6—€0$à{ÀБlóñùÙéÒËå—ã"€¡#ùp]Ì-Ïl~^øÂø `èˆW@:PT£­£– Óf €Ú0L0´”Ëó³ÓË~ݺõ³ýÂaÁ´ `h¡*‹[v}á ã§ À€&h ‡û+ß°ÆL›Íf©‹ƒ'€Î©ùB=}À€€0$ èÜÑñÍÔE€µ˜ÍfKyÀ@/æóyê"@¯öWÚ^½999I]èͪ£ýõ@À€€0´´½³{ù“_Д†¶wvãüìôò§«Ð]e?‚6“†œŸ¦.°¡0t¬¬y:¿¼h¾nýü>óÓjð9\ˆZÈ7;çkÀ‹&êìtvY~ìòüvEëW•«¨<Àp `h©*û@¡ 㤠ÀÐBŠ>Ö¢çÔ× ›O4´P×¼ì6Ù¾â²õ³Ë‹¦‹ú›áÀÐRYÀå—×õ ·]¿jƒ°`óh‚€0$  èÅáÁþÊ7,‡1À@çf³Yê"Àà ` sj¾PO0$ €  è:wt|3u`-f³ÙÒc0Ћù|žºЫÃý•¶À@oNNNRz³êh}À€€0$ € ƒ° ¥íÝ+óC¿ïöÎîàËS$€¡…¢0pÀ24AÊ„/° 5`èP¶yzÌùe‹ù¦Wí·ÉúÙeþX€áÀБ|Àeçó¡¹ìãUëd¹(Œ…/ ‹† PT£ª°É0 \YØlaÁŠ"° 5`h!;è)»¬è±®š‡‹žs™õ ‚aÀÐRUˆ=–]V4]÷x“ý.³>–&hH@@š ^ì¯|Ãr3 tn6›¥. ž:§æ õô@À€€0$ €  `HÀ…8€Îßlµþl6sñ&G½˜ÏçÖ;<Øï· 0PèÍÉÉIí:u5ßíÝkË–½·ñöÎná¶eËÛîÚÀ@[[[qqqÑh]aÇ„¬ÝÖÖVê"@rjÀ@¯ò5Ý.ÃwѼh¦ÎÖ”³M×M–·Ùº €Þ-B8¾M›Ÿ#ªC3ۛ·gÝòªù¢å°* ¬Å²áQÝ\öز!)\Y ôj•šï²V©±ðź„ônºëß.© Ó'5``-V ß|ÖÕR³³ªö•ßO~»l¿±0¦kèÅáÁ~'——lÓÿ›/Ú®l_uÛÕ•–!€ÎÍf³ÔE€ÁÀ@çÜXê„ `H@@À€€0$ €  `H@@® tîèøf«õg³™ëG39èÅ|>o´ÞáÁ~¿À@oNNNj×iRóÝÞÙ½2¿¸7ïöÎn'÷ém»Ÿ²õ»*Ó €A+ 5AÇ„lá˨oÑD æl³u“åÙÇ»ÚOÕã €– ÌÅtQˆV-/›¸º‹ù6ûÑdN l´²`Ëܪ۶j`Õ2–ÝŽéÀÀ(µ­q6­!÷õüLAXÀÆi[»,[¿èëM}Ô\Õ†)¢ ZQ(ÖÕ.óÛdûmëGekÂU\µŸ&ÏèÅáÁ~g——, °ªSM·Yf?Mö-t©#€ÎÍf³ÔE€ÁÀ@çÜXê„ `H@@À€€0$ €  `H@@® tîèøf«õg³™ëG39èÅ|>o´ÞáÁ~¿À@oNNNj×iRóÍÞÜ>âνv·wv;¹ïîªûéªL‹­(Üc`°q„/c  l¼Eu6˜³ÍÖM–go»X†6Z60ÓE!Zµ¼í|UHCSØheÍÑMB±*lÛì–!€QjÛO\T³]f?ДAXÀÆi[+-[¿èëMUûV¦KjÀÀ …b]­4¿Íbý²åEÛžŸ6Þ,C½8<Øïìò’e[Õ\Üt›.÷m` s³Ù,u`ð0Ð97V€za@À€€0$ €  `H@@×®„Õåõ[€bWØõ[`=®°š/¬‡>`H@@ÀÀµ¯!å=òècë(G¯öööâð`ÿÚò1¼¶¦ƒòcÊ”Žý*ÖuÞœ~ ís7$µ±Ù££ŽoV>¾É¯­)Ç þ¤2…c¿ŠuŸ7ç£[CýÜ …&hH@@ÀÀZx{g·Ñ²M²½³{ågJ–}íS;N]YÇç§lÎÙøŽ¿sšžpÎÏN/¦ö¦îãµOí¶áؤ5Öã?Ö×5t¸cS á…)¿ö1ÉŸCçt½ÿéTµ9·è5ÕMgÿßäcQw>ËÏ“M?]©û#g™÷Ú2ªž§êùW}ÞÔÆ|üë>sùe>“«kt!Žu:?;½œÞÞÙ½2¿‰ò¯¡ÍkÊ®»‰Ç¢îµWÍ—½îM<ëÒÕ±Z„Lþÿ&ϳéïÙUlúñoò™sž»5¸žšü-k o꺿›üí¯ì«ÊÞ/ÕǪê½ÖVÙóŒá=[g Çßgn=0½ªû…ÐäÆ~©·UÖÚÕ±ª Š©Ÿ“±ÿ©ŸßuTð4ýë6ÿëê/ã”êʯ6¼^‹cÕ÷{­Í9™ÒùËñŸÒ9[·µÖ€‹þjÌ¿ ³oJU•9ÿš7å55µÊk/{<û jìÇoEǦËcUUûjó<ÙõÇ4R~LÇßg.­ó³Ó‹G}¬ô. Uu­àÑñ͘Ï祷â›ÂÝOƒêcÊTŽý*ÖyÞœî ñs7‹ã¢ Tkê`*À0À@£¯!ßì»ÉŒùµ5å¤ãØ‹óÁ:ÕðÞÞÞ:ʑĘ_[SŽA:Žý°8¬[í÷€€îø0$$€  `H@@À€€0$ €  `H@@À€€0$ €  `H@@À€€0$ € »–Ùh{g·ërŒÖùÙi’ç}äÑÇ’<ï¦ÙÛۋÃýÔÅ&h©Žˆ¸¸¸è²£³··óù`H@@X©8•ü(ììHãíÝÊyVWuüû~^ç‹ à¢_Âe¿˜ýÂî^›ã@¹Ñ6A …õqœÚÛ¸pÂ7lóôâ,ÎÇâ±|A~ýªåc1Ê&²þ÷¢é²þzýøÀŒ2€‹~‰³e—)mr.ÊjÀc4ÊŽÂ)Õ\—å¼c7ÚAXq¥ß‘þtuŒËöãc´q5à¢P­ª-© w«êø·ýƒ'¿~Ù~œ;`Œ6.€#ê·Íú´·êñÏΗíËyÆnÔMÐ0TÀ€€V„ut|³«rÀ¤,À{{{]–ƒø `¸–àù|Þa1èš?†m©ö}Ìá;<ØO]*„ `H@@À€€0$ €  `H@@¸+"âÆ©Ë“²õä“O^¤.LÍÿòòÍöb`IEND®B`‚PythonCard-0.8.2/docs/html/images/resEditorFig5.png0000644000076500007650000000675610277403055022055 0ustar alexalex00000000000000‰PNG  IHDRà,þ`ZsBIT|dˆ ¥IDATxœíÝÍ$wyðg¢U.€Í;‰p숽ƒwZ<æÅrß|ôÁ—\rÌÅÆÞ˜¯0¸5¼„ JÈ$Lþœ÷°Ç½íˆ!É:¢L"ñþvÞÖݮ鮪~«ž§ªúó‘Ö®~«þ©{·¿ý­úUõ֓㛜™Ç/]Žsç/ÜŸ=Ø{{{·8"âÅžK lšsÅ ïô_ÇË[[[Ë·¶bÖrÄÖ­ÿ¼r±¸üêÊN-oïYñ¸Ârí·¢p×ÙãXÿxdeë˜cÍxÇ/ج1ž~®Ó{õE›¾oÅrí'Æ[ò\•+¼¹…‡MŒqÎñÖ<×Ô:Êþ®T­£tŒ…å©õOwößó’uÌú»]\ž5Æ(¼µÏëÆèߢ‹sŽ×¿ÅÊ1ß“&Ü÷‡ß/ÿA£kærnö]`³ýåÅÛ—~ì`0ˆ¿þâÕ©ë0Ìa™¹RW®^«¼­w› _~þ ñãç¾= ¨UÙ€÷Ý™ºîuïþHüæÛ_ŽˆˆÛîy¢vÅ¿|ñ ""Þ¸ý7«Œoìÿ¾ùÅ©ëî¸øtíc~|ü·ñöÝOƾþùˆˆxÇÏ426×öÎnDDÜ89žëú2¥üûÿ¾¾¯}×ãqzÆà¼ÞpþÒéÙi ùã÷==1ó²ÚŸî~²ág€[»½³Û;»ã°]$|#VØü›ÿú爈¸ýž'â×ÿùOñú{ŸŒ_½xo8éTþÅüãÔãß|ßSã埾ðS·¿í½Ÿ{,?ùÆ~éõÅ<òÃWšðøTDD¼ôïŸ=õ˜»>ôlDD|ïß>w?8ŒÿùÊ^üùƒÃ¹Ç@ÿC¸xݼjøwß=/¿îÝ9uÛm÷<1Õ.õJWyÓ{žŠØŠøù·¾?ûÖ—âÍ>?{%|߲󱈈øéÉß×®ã¿ùwãå;.>=ß?yÿåˆØŠ—Ÿ¯ßÿûŽžCöÒ×>öÁOGlEü૟ïõ3qׇŸßÿ{_Ù«]›k£åE”ðkÞùØx3ôÈo¿ó婞ôú{Ÿ<}€ô,² º w?8´€RÅö[Ü=ÊüÚw=£¤+6a`zŸïä>áYzw¬[ÙfçÉÉX³Ô΂.m~¾í/nŠTœ„µŠÑ~àYû~G&÷ßqñrüäûñòóå±FÞþÀ3ñ£¯þÔ$¬;?ð©xékŸ‹&bÝõ¡gð À†©j¹+o‚~Í;«<¹zÄ­.îë½ýÞ'§2«xÒßsëXàÑ#ÞtßS§N†ý– /Wñ½ï¯®cbð/—Žwò0¤ñ1À…±ßùÁOOŸ¼="îþð³qêŒìРVœŠrò0¤·¾÷ãr€V©;­ä2ZÀżÌI?`ƒAãëlE@›•ýšÑªÌ‚€§ðóWþ*k-qsÆehÆ©nz3´Ép8\ê÷<ÖajðÑÑQÂ0`½ê8k¥“°®_¿~Ö〵Ò|¶1 `Hà8` ”I™lЬ š¨dR&}—9ASµLʤÏ2'hÚ 0$À@@ ØÞÙë:€Y0,HàMÀÀqÀ° 'DZ½³7NŽKo/6äÑ}&¯].®£êqUÏt›††M†êèrY¨Ž–'ƒvtYøB `XB] ^v±}˰Y0,©¸)y¤¬É.²>`s˜„-¤ CÿiÀ°‚É\ÖŠ—]O„IXÐgP†“×ͺÏ<Ëu×ý`4$ÀÀ&h ÒáÁ~ê–CŸ ` Ôp8ÌôšJi¾°^ö@ 0$À@@ 0$ÀÀ‰8€RW®^Ëœ‰áp˜râ T:::ʬÕáÁ~Ús `˜ÓöÎnéïóV]?ïímwýúõì!@¥Ušëã—.78’Å `:íü…û~ÌÞÞÞF² sºqr<Õf»Þn¡/ºøã!fACƒ¶wvÇÊn«º\ö¸²uý¡Cƒ–iÇU­Z³†~À°€âfè²€]¶µj»°y04¤¬ÉÎKÛ…æ]¹z-}äáìaT²TÕ~QÎÚ0¬nt"™6ŸPF††Œ‚yžÛ«–G—#̰†eM†n[›°†%TcÙõÅëæYžõ@µªÆÛÆÀôÆ£<\{bŽ6/,€è•6…l“° €6AÐimøa…e`:+û'W!€è¬Ãƒý8áþxñ…ç–þû€謮†o„ ÃV ߺã…Ï‚ ³4`H @ hÀ@€0$Ѐ  4`H @ hÀ@€0$Ѐ  4`H @ hÀ@€0$Ѐ  4`H @ hÀ@€0$Ѐ  4`H @ hÀ@€0$Ѐ  4`H @ hÀ@€0$Ѐ  4`H @ hÀ@€0$Ѐ  4`H @ hÀ@€0$Ѐ  4`H @ hÀ@€0$Ѐ  4`H @ hÀ@€0$Ѐ  4`H @ hÀ@€0$Ѐ  4`H @ hÀ@€0$Ѐ  4`H @ hÀ@€0$Ѐ  4`H @ hÀ@€0$Ѐ  4`H @ hÀ@€0$Ѐ  4`H @ hÀ@€0$èr>7yÅáÁ~ú `«6à̼;ÀÃá0k°°®†oÄDgÑål0ÕÕðÀt˜YÐ@€]nÀS‡!MÊ`W ƒ8<ØÏÀFéržÀfGÏråêµ”çõåh>¾Auyô\L{ùrT/ëËp6º¾öÐa]Þ,€è, hÀ ÙÞÙë:ˆÐ€%pÛa{g÷ÔŸEpV4`zéÆÉñøOSÁ* &iÀ šõa_ÖÊæYf5M†0@SºÜ€;uðöÎnÜ89®¼ÌÙ*rÙûPu{ñ}›µ€:]nÀ­ àQÛšõ¡^v[Ýciά/Cu—‹áë ° gÂZƒªMž> ÛcÖ&éy6YÛ¬ ¬¢«áÑâžÇ¨1M¶^-ølÌz}çyý½GÀ*ºÜ€[7 «hòÃy¬£?>¼Ïά×[2t5|#ZÖ€Ë>àËBxžÇ çÕÕMšÜE0ïíÅ­³Ö0K—p«˜öXvóqñºy¾, ]`] ߈–o‚€:]>XÐY0$Ѐ A—ð\“°®\½¶îqÀÂz= z0œÅ8X’/GÀ&ëjøFÌÀ‡ûg1–à˰ézÝ€i/_Žb¢‹þ0¤~Ž `:m™ÙÌ{{{kÉb0—½?wC€`H`0½Qwn„Gyø G2› @oT…ìp8L?÷ó$ @¯L†ðp8ŒˆöÍ”ÀôÎ(„Û¾€ž…pÃ7BÐcm ß )0$p0Ö†VX† ³¿t9{KÀ@¥ÃƒýVOb.ÿ.ºJŽŸÖC¥4_X/³  €`H € €,uðöÎnÓãè­'Ç)Ï{þÂý)ÏÛ5ƒÁ ÓgÒºkéqܼy³ÉqôÎ`0ˆ£££Ô18‘B½+W¯eØ`+ Ë|9ìÌb0$À@@‚NþÒä,ìâLãíÝÚˬ®îõ_÷óz/¾è\—}W}0ûÀnÞ"¯?Õz» Z(œ¯3Àâ:×€ç!|ó7OÞƒÑû1ºmrÁäýë®è‹^0yªö¿—-Wí¯·Ø½ à²qÎFÕiJçy/ª0@õ2€#„p†²æº,ïÐw½„§ö;²>M½ÆUëñ}Ô¹\ªumInVÝë¿èžÉûW­Ç{ôQç8bvà.r·êë_¼\µ.ï#Ðw½Þ m%€ €¬4 ëÊÕkM6ÊÒ< škà @{-ÀGGG ƒ¦ù‚ÐnK°ã1Ûïð`?{Ô0 `H € €`H € €`H € €ç""ööö²Çe롇º™=Ø4ÿ^Cñó$À©IEND®B`‚PythonCard-0.8.2/docs/html/images/resEditorFig6.png0000644000076500007650000000723710277403055022051 0ustar alexalex00000000000000‰PNG  IHDRퟲuÔsBIT|dˆVIDATxœíßÏEÇŸco€‰(%B‘¶ôE(mÔ Œµ±`o¼áÒª´*P8«XAlMê?àõ©Qb1 ¯&š¶}Þ@bŒ¿.4Ê^¿^öíž9ó{gwgÞý|è9;³ÏóÌì~Ï33;ç¼£µÕ3ëEpðÐÙ""²mçî¾cÓéTDd&Z‘ çÏö ø³¥þæÖ?‘Ñh$£‘ˆŒF2’ÙëÑì³×R+¯Û(ã<]´5š`°U«+Jù‚­7|×lÍl×^×λ§Á–(íPl©ýÒÖF;7Úì²UosÕz[jŸZ¯Õ\œ[¢´£[j?,ôŸzݵ¶4}ª¹gûOc+öþ#öTÜøæ—7^¿)©eh-î*Ëçv]}îx<–Ï?yjá8¢h™˜õ¢åS§eY_ûåãòÚʤï0²D›iÿûêImåË·j5˜P.<÷°ˆˆì¸ëXÏ‘ø±}iˆˆ¬­žñ:®C›ißrÝA¹tëÁ÷—}à‹rù ÷G 3*QV"­¿ö¬Häœö?kÇçÞ¿}éË""òÏß?µP÷»ŽÈßÏ]Ì„ïÞ3ËŽùÍ7ê^s›~HüÊóν¿áãßœ{ÿÒOˆˆÈŸü¶ˆˆœÿɃsåüÌÓ¯_|æð\ÙžßÓúh‹µÕ3²}iÏœp}+1§}}턈ˆ\±ã°\qã—DDä_«OÏÕyÇÍÊU7?$""ÿxñ˜¼ëÖ#rõˆÈ_Ï<1W÷½~TÞ÷‘ÇDDäO¿šj}n½ã¨l½ó¨\ÿ±™Ðÿð³¯Í•ï¸ëØÆùü³3Á.í{JnÚ÷ùÝf*¿}fï®{ŽË­Ÿ=!»,ôD]¤!‚i°züï—Ž»+%BÍ´>¬þøcÙ‹?œe[D }¡C„-Ú+v^ÜÒ¯>?ËÂ[ï<*£ÑH^þù#^ç-í{jaÓ-ww#ÛŠˆœ]¾Ÿá1tŽ:‡­†Ê¾ÂÍò‘O›ìºû¸ìº§»Q@Ý¢“nqÊFp¦}ëöCòúÚ‰…áñ•K_ 5%""þõÑ××Ü6YÈ××ÝñuyõùÇä•_,‘·}â ¹ðÜÃs Q;?õ¤œöÁ…áñÍûŸžË²"³áq;ã=¦lšlx|éõ_¸8Ĭñ¶í‡µ¦¯¼é¹òWÝòPms¶ÈÕ»ž+™-DÕ7v‹ˆ¼ÿ£o iEf Qº/ ˆˆlßû­¹å"";?ý¤f“ølx¬nò( ¶1´ŒmKb ½‰ö=z¤Õ,€ÇÉm’iZD÷-¦ nõ tæ2í¹å{ûŠ65ëÊ¿Ð2-@a Z€Â@´…h Ñ¢( D Pˆ 0-@a Z€Â@´…h £‘h«¤RÃÕ÷·n ¸^e-Úê×ãêÿqñÛ£Ï¾åºæEÒáqè.@8­þr…îç"M Áuܧ®Î·©Žî·g›øW·¶zêÇÕ&›õ˜Í·É->W Z­z‘«›Ètc»Ž»êª„ÔiìŸ&ñšêèÊM~Bìú¶ÒÒšhS\Èú mÊJ&Bçaºú&ÿ©mS¶æ™mô-¤%ûvÓe"—€tÙÀǯÿ6µßF<¾ýFfí—¤ Q©?ës2“í6>õ+›>þ›Ä”ªM¬,‹èL«»‘}ævºE Ÿã®º®ØšÆ«m¸m;×Õ&ÝãµÌg;ÏwS߆ÑÚê™õm;wË…ógûŽZ†E£²Y>uZVVVØÆPˆv@e7ˆ 0-@a Z€Â@´…h Ñ¢( D Pˆ 0’}5oùÔéT¦6“É$Ùþþ¤ß§]YYIi`Spòı¤ö’ þÜßnHm WÎ-ß}îÁCGF2#û_®Èm;wŸ3N[ˆ¤eÑþïߟ{ɵ÷-”«ÇBÊcbÐÅ‘ŠñB¾äòóÖ3mý&Voê.nðÊG‚Ê!(ŸNù\rí}ÚÌþô:§­gžº˜uÙÈTî‚ûÄ ž««ÞëÊcâõm3€Žl¢lÃhÓ{Ýñl~tÃj]¹ÎŽ­Ü4\gè\&˧NËý{;õ™hû6·å×Ç.S…²©6u-Ü,DÛ4c6¡ìæÛ2k¹¨;»n§ Q¹ûÌ|dÝr0mÙíj+oë™Ög±Åµª¬–×ç‡Mnv“]lç™âªÏÛø†~9°¯u³EÛÏs[­ëFt=³õy¦ë;¬ö9ßå7u¼µ\úÜh‘Åœ6–¦{J$¹h‡2/d:rÙ¾XQt¦芶6ÿÇкhG£ÑÆëõõõÖ|ÄÚÖ[¹"ÇØSùó‰ÁÔ'Õ¹)ÚÚï]õ]_¯kB«¢U;µþ¾ë›5„œbLC“¶éê§îŸ{]]§^xA.œ?+Õ_— ý75>§í[ºŒš3Mó=\½ÎiÕÌ[¡~‚VejÖ6ÙÔÙѽo·ÉGuÌåS÷fšJ¸úIµ¡Ë@ºa¬n$d²kÂ5½0eçÐìÚ]®ûÈvß &ÓV ¯þÓ•×_WÿÕëVX?^?¦^(“õ‚èÎõA=_õQ¿™LåêñØØ›~øè>lvm×RgÇfËTæãÃÕõ¸éšØb­— .Óš2†Šíâ†ÐÅЫ->v}}‡.¥ªSù6S?¨Õølâ‹ ÄĪúh"Øâ2­/M³_j;.ê>Rùñ½ ß©ÑŨ‹7‡…>ŸþÌ-Ó¶*ÚÒbè³®Ç0º÷]cjÇÌiSL l>t *ÓªsZÝÐHW/Ô®ë¸Ï¹)ÚäÂvž«MM}›Ú‘Ÿ]Ó¤ÐëÛßþÌ-Óv:§µ•éêénl—ÝP;6b}ø¼ö-÷­c‹ÏOÿ¸b ‰1¤_ue¾>S\‘eZ€Í@n™ÑvDß .™ 0—i›,ú„øHy®º’kì©ü…<ûõ)ßlO •i];NrÅõ|±KR÷SÕ–P»9]±û¶#”Ü2m«ÏiÕ!±ïóÃúPL÷Zª™|Ôëéì©çú ;ßæCW®³{Ó :[&»MGJ¡×ÔÕŸ:Bêú2¸LkšÓª˜2Hh§wµxÔ†»¾¾ëbð!‡©KŠ{@ÝA–‚AeZ_šf¿Ôv\´qƒûÆžƒ¸Ú"UÛt™» ƒÊ´9¯§¢Ï6ê|«7lêØ'†®íêæº)÷V*ÓÚæ´õ›)´ƒMõ}ì4½˜®yº ×üÞ%Â&¾mvcϵÅÝÄfõ>&†6†ÇƒÊ´"ósZ]™®žÏFv]ý;¶¸tþ\mò}í:/¤ŽoÜ®Ølõm6ÕóMö|b¨Û4•›êÛŽ§ ·LË6FƒË´0c3/ mvÈ´…1¸LÛÕsӔ窻—r=•¿!¬ò7aP™¶¾ê©®æ|£¨ }mS÷S}·ø1¸L[‡y”Hn™–¿0·ÉGuÌåS÷泇Úõ,3dß¶i–Í®ëZø´Ë׆ɧkŸ²)ŽX•i«7Í MÏèÔa´z\v«6uvÔ ;ìµ ùëÇlåêñØØ›~øèn|›]ŸkaÛ~iê×4Ê·½±›u\ .Óš>URíµíb®ÖçÖ=_ߺÌj#UXR\õC!ƒÊ´¾4Í~©í¸¨ûHåÇ7ö6|ç@ªv¥Î²"ùeZ¾0Сa  rú²€ÈÀ2­:§Uç°j'û>5Õ÷±ê+¤M.lç¹ÚÔÔ·©MIS¨z}Ý=•úC*·LË_°ëÃçµo¹o[|®x|ú'æZøúoê3´BT¦Ø ä–imG”4§„yÈ´…A¦( 2-@ai ƒL PdZ€Â Ó™ 0È´…A¦( 2-@ai ¤Ê˜¡ÿŽÇãä±dñ§.r'&cN§Ó"A´Þ´1?á1@a Z€Â@´…Áœ åS§eöïmÝ?™ “0'“I+ÏeU-@ªp'“‰ˆt³ÂŒh"©„Û¥`E-@#*ávù Ñ4¤ëMˆ 0-@aðœÀƒ¶6ÿÇ€h4eÚ¡‚h#A¸þè2d,ô7 Q¨ÏÇ`‘T}c²3Ô¾'Ó*è„hût'ãΰõ[臛Zßdg¨}Žh5¸DRH4í·ú{“-úÑÎáÊC»9|±õ}–D[ƒ,ú­[Xˆ( D Pˆ 0²Óæþ;=%Cß–M–¢Ç}‡°i¡oË'KÑæúÓ•›ú¶|˜Ó¢( D Pˆ 0-@a Z€Â@´…h Ñ¢(Œ-""Óé´ï8À“Ñí·ß¾ÞwàÏÿ>ûlï‘WvIEND®B`‚PythonCard-0.8.2/docs/html/images/resEditorFig7.png0000644000076500007650000003653510277403055022055 0ustar alexalex00000000000000‰PNG  IHDRéz7°  pHYs  šœgAMAœ@ äË cHRMz%€ƒóŽ„divð?EaYWŒàû<ÓIDATxÚb¼ráĆQ0 FÁ(£€@, B[ß|4$FÁ(£`ˆƹzñähˆŒ‚Q0 FÁ( ÓhŒ‚Q0 FÁ(  º€YÈ"êÚÀBŒh4HœM†zFFˆUp"F¨#Ënf‘j7!õQÇ,¢Ô“dÛM‹4€¦Õ®Ñô7šþè›þàq<Ì€Û 8 €F{£`Œ‚Q0 HÄ‚S&8‹›ƒáûïÿ ÿ30€–d±2AjrÖ?~üùÏð(øã×?6V&†_þ1üçd`¹²ŸíúèüÉ(£`Dšò“­×ÑÑ‘aÿþýéOëÚ@wÀÌA„³òøöå;ÿe``ÕŒ ̬ŒÀJä?Ão ÃÿÀ~°ÓÂøÁACŒáÀåW .ê ;OX00+-d`½¼‡‘…w4匂Q0 F< g1Òš ;¨¦ŸÚæÀ@á¬<Ε2¼þü2˜êvÀ‡ð Ý°°Wò÷3C¹ÃßÖle0ßý‘áÒÿß:òìt˜–6«¤Ø¬»À´ŠCã J”§Ö€ió‰ƒ:ól›¦½3)ŸO[Ó¦C‹W–J£`D ‚j®\8A7÷ÎÊÃPAHþ&Ñ8V†ÿ3\Býrk †J>Í<†×'ÙZùC22oí«Ã*®éÚ:¨ÜytE˜¶‰œJówÍIÓî©óvÌJ³=ÓlÎÆIQbA+ÖõG€ÙÁE+iV }1Ä’·âÕ3«ÊL§·ïb˜Yéfgtì-íFÁ ¯ˆÐ+\âØ@±à—†õ qÈÁÄ™álæÿQT}½)°xÔs0V. u æÔ^Uqso-˜¯áÒ‚X­2‚€[Ê<ªú; Êê• ÂTK3K[ÀtLÍF¼ê¶ ¦W< ­m'$—02Ž–J£€¦_¡NLÏÙz†™IJÅÄBX 3´¢@ŠBÎ(á=æ?H× Ã.‚Úa˜wWúQäEôŠÀô닽zÅJáìçg:qÚñäd _βL?<Ö¦¬kifP´ô&î¦|ˆêÚ®*ÔÈõhÓ—·W`¨5ðéb¸°áC¿0}nc1†ZÓ ~¬öXÚƒ³ ŸŒÂ?²<LÛFMÓ‡–f¡È;ÄÎÀ0sß‚40íœ8›aÏüT0Û5iÃî¹ÉðйçÛg&€i¯Œ…p±­ÓãàlßìÅD‡#¾žÇªžP~DÙZ¼fEWo§Ü%ÐJ$¶vQn˜W禓›·ƒé95`:µuJÏfT¸‚éÌÎ=(æL-uÆ0;·ïä"8?ÂA8»?ßEmñ”#`º'ÛܲéÇÁtg¤¨˜ ãnO3ÓU³O–¾£kBL儈ˆ¥ºÿ ˜ð›éöÊãËÍ) ŸoNfø|c2†hØJZq€€N!ƒn!ƒ°.¤Òxs©E½˜A ƒ˜!¤ }y®L¿8Û¦%MʤLË1ì1¯bµ€`xtuhéÁÑf8ûþá&0­dWÏ  ÄäUÊIÛ½ ˆ!•Æ•¨ó/z^ úÞ ï–2`ÒÍ`è ñÏùM%(júL!ápz]!V;-B'ñ$Ë0Èpౕ¹(ò a+ØÐÕáeŠÃ.z:ƒ}Ìt0ûÀâ ª%Lа•gúB1М‡O¤ÒØ<5§Þ £ÖOŒdX?!¯«¡GXéj†ðÒ5`öŠ®`¢ÜêyÄñâf?†E@Œ4ø0Ìoðf˜_ïM–ÿAÃV™¸‡®rzö1äôBVÒLVyÀ $¯ÿ˜?±ÀLO€V…“31ôæØ ˜S:íƒ@W¦åh‰8 ÈîÉ:_@,Ä)#¶;ìèƒVb!õR¸Õ²áCW0ð X€æTWwVÑ-! ÷<ˆ‡–fº>lE¬êÅ[щZ‰DU­ÇªÔóÙª@âë6ã¶JjÚî}Ì­õ„«ImÙA—Êþ<ÛÑRnÐ ÷:‡°ˆÄBmÇ0ýûÍðÿÿ_”<Å£–/@½|àý• Þ°çRÿör*HËÖëx|¢n‘êy`Ý]LeprM>´÷1 l×ñUyDéõ<Ðwøb{¡CV °{^Ê Ê žú߈òµ;̱ÅÐ^G°â¬3 žúóQ0 ¨Uq ÏyR áQ-F†­Xþþ•aœfÁç=\gƒ °=ÐÊÃ5yî$^ÒâÒó 4<çR9Ø™]ãžó£€œ–>2 ç[lŒMJ@*Ò*zô9ô!+àÓÈgV~èr]ä sApïãÝeÒ†®$ŒËÀóØ&ÍeÌ+Á½b{жuày{‡ÈŸ4×rkÏ{ [ézveÞÙ Ep6¶ sÐ^PïãÄj̇uÄðr]ä sÍ{ [9Äͤ(Qz¤A–ëb›0§6-Y ž÷@¶õ:päÕVø* М Zª‹ `ËuqM˜“ &Ï{ [O9ŠW_ùŒàIóŽôÑ«FJåC*ÀU9R‰#è2(Ð}°Ý‡°ƒ¿ÞF.ôC+B£\ÿJfœa˜ÚÞÇÀÄ& ¯F¦#ÿ`ºs!ç  óуéFF=qhŒ:„ÜÝOB‰~äãI¨aì`D8@ᬠ$lÚþüùØÎAäèã£c²£`Œ‚Q€T¤~j›„³òøôü>°âø‹·— 0± ¦*#ÿÞÑIÒQ0 †(*8ú©m2 œ•#+hÓß(£`Œò¶Óh‡‹;hô>Q0 FÁ($€ÂèyœZ7*£` +ð{Œò@±ŒTS{òh¨‚úúz²VaŒ‚Q0 F6 –‘ìùÑ0 FÁ(d€ó£`Œ‚Q@2 ÑÊcŒ‚Q0 FÉ €¨VyPkÛüP±wŒ‚Ñ´= F2 &R2:¦eÇe¡Œ6šáhäz'¸ÜBo7a³o4­Ž‚¡ ˆ¤ sl‡fÑò4HR̦…;Ð37½O¾¤–(q7º~rÌŒá6ãrŒ‚ÁˆâÕVØ r¯5¤´Gî]¼´(t‡K= `Ç6Ãh\2r`‹dõĘCí´DŒ›±i•¦ñå§ÑŠo @,ä&p\‰˜-U| ›ùÔnUr3¡¹`%·€¤…zZ:¸âšÔ´Mœ5ze‡­`¦Vz%§ÑC¬èåÆQ0 ˆDñ°)™d8 -Sâj©S@R[ýPo©Ò£ Ä—^©]‘á²wtþc 5@4Ù$8Ú*¢}:5‡!{zÍ3£`¨€¢ù>Ñm dLK{°­V¢wAGÍ¡+bÓ+ºjõ>FóÌ(. €Xh‘Ñ©5ɉm[†Ë~rí¦gAA‚†ž1‹#pÅ©iƒÖ /¨^ié†vã(è €0®¡)t0"¡³­pMB“³:‡œ p\säªÇVèP÷£·Ã£0 F9å'@±ŒéÃ%„ö»Ã&Åqz‚ïß¿3üüù‹áïß¿ ÿpŒ‚Q@;@£••+ |(®“oI¹¶Ÿ8©½"rÌ¢Õ]ãÔÿþÿcøÿÿ?‚Q0 h h´ò " §P'¶2¢fÅFŒ?ðÝ™N¨‡5 FÁ(þ €F+AÜ‹!¦Ð¦§Y¸Ì¡×]ã£`Œ‚Áht©î0êõP³§BÎpÔh¥1 FÁÈ4Úó roWAJêÝêø*\öàºî–Z .sFï×£`䀭<¨ØR'$N ›Ø>µ®º%VÏh…1 FÁÈ4:l5 FÁ(£€d@£•Ç0éጂQ0 F=@V£`Œ‚Q0 H4ZyŒ‚Q0 FÁ( Ðhå1 FÁ(£€d@£•Ç(£`Œ’@V£`Œ‚Q0 H4ZyŒ‚Q0 FÁ( ÐhåA%ÚeŒ‰Q? FÁ(ƒÐès*jŸª; FÁ(ƒÐhåA‡ ¡‹•ñq‰¡WX£`Œ‚Q@/@£••+ R u|gIá«tF{8£`Œ‚4ZyPŒê£`Œ‚‘htÂ|Œ‚Q0 FÉ €F+Q0 FÁ($€¶¢"À6çë%ôË¡ðñ‘Í£`Œ‚Áh´ò  ÆMä\Æ4Z©Œ‚Q0 Ðè°Õ(£`Œ’@V£`Œ‚Q0 H4ZyŒ‚Q0 FÁ( Ðhå1 FÁ(£€d@£•Ç(£`Œ’@V£`Œ‚Q0 H4ZyŒ‚Q0 FÁ( Ðhå1€€ZwxŒÞ2 FÁ( 7 ÑM‚4®F7ñ‚Q0 †# ÑʃÊÇhe1 FÁ( €F+:U„Ω"õâ'\CU¸Ì•5Z¹‚Q0 ¨h´ò  ö¢'t>6qlê Ù3ZqŒ‚Q0 ¨ h´ò cÏ„yJí­8FÁ(Ô4ZyЩâ 4äDÂ{FÁ(£€ €F—êR ືƒ½”Q0 FÁ(h@£=W Ø.v"¤P/„˜ ¦FÁ(£€– €F+T ÄŠ#‹‘zñ¹öŒ‚Q0 F5@[‚Q0 FÁ( Ðhå1 FÁ(£€d@£•Ç(£`Œ’@V£`Œ‚Q0 H4ZyŒ‚Q0 FÁ( Ðhå1 FÁ(£€d@£•Ç(£`Œ’@VtÔØ¸7ºùoŒ‚Q0˜@n¤qEAË z£O‚Q0  ÐhåAåœÞ8¾£ÝGÁ(£€V €F+:UøîÜ EœØJߥP£•Í(£€R@£•Çöpæø ub.‚Âe.²Ù£Ç(£€@£•Ç è±PÒ»!µ'1ZqŒ‚Q0 ¨h´òD=bÔŽü£`Œ‚Áht©.+J—Ó£ŸR{‡­FÁ(£€\@£=W øz ¸."t9²<)ú‘{-£½˜Q0 F% €F+T „ÄȹԉŸRwŒ‚Q0 F) €F‡­FÁ(£` h´ò£`Œ‚Q@2 ÑÊcŒ‚Q0 FÉ €F+Q0 FÁ($€­õ„ }| ±—NV£`Œb@Vƒ¸ÂÁÓ°Ø(£`䀭<)-ÄGÁ(ƒÐèR]*ö´Z";ºôvŒ‚Q0Ø@ö¤5Z‰Œ‚Q0 ht©îêÕPsÙ/9ÃQ£•Æ(£h´ç1@…?®‹š°©Ç§ÛeSÔ® F'ËGÁ(è €F+*V„ÄI¹( —8%j‰¹ü‰ÔK¦FÁ(#Ðè°Õ(£`Œ’@V£`Œ‚Q0 H4ZyŒ‚Q0 FÁ( Ðhå1 FÁ(£€d@£•Ç(£`Œ’@V£`Œ‚Q0 H4ZyŒ‚Q0 FÁ( Ðhå1 FÁ(£€d@£›© F/k£`Œ@£••+ŽÑÊbŒ‚Q0@Vtª8p]ÖDÌ¥LèzF{5£`Œ‚4ZyÐ r)®£ÑñU6£`Œ‚Q@O@£•z!øz Ô2{Œ‚Q0  ÐhåAÃ^¾5z0£`Œ‚Q0P €F—êR±Â w¯`´2 FÁ((@£=:T ´í…Œ‚Q0  ÐhåAƒ „Úâ£Æ(£`°€­<)­0FÁ(ƒÐhå1Äz0£`Œ‚Q0@N˜‚Q0 FÁ( Ðhå1 FÁ(£€d@£•Ç(£`Œ’@V£`Œ‚Q0 H4ZyŒ‚Q0 FÁ( Ðhå1­wŽîL£`P h´ò aŒ|¶5ÌÄÅ­ FÁ(ô4Zy 0º'dŒ‚Q@o@£›éÜ3Áv>²¹fc;‹˜“| ]R…‹= FÁ(Ù €F+TÄôˆ)œa>Ÿ=¸ÔŽ^.5 FÁ( ÐhåAE€^ðõ¹BÕ(£`ä€ó£`Œ‚Q@2 ÑÊcôf[þôè „£`Œ‚¡htØŠŽŒ=öã­FÁ(Ä€bÿµõÍ®^<9â—Aa'ÆôZØVlövFÁ(Ø@VTu¾Âó‰á«fŒ‚Q0r@Vƒ¸3ZH‚Q0 + ÑÊcôbFÁ(£`°€0£`Œ‚Q@2 ÑÊcŒ‚Q0 FÉ €F+Q0 FÁ($€­Fb¡9Úã`ä€íyŒªöšF™£`d€íyа ¥fOf$ú}Œ‚Q0x@ö<èX¨â«ð]…M/H ]œ}”‚Ñ ¯FÁ( @ŒÀLý_[ßœáêÅ“#Îó#Õßà ¬Ù°ƒáÀ f&ú ââ JJ â \œœ LL£ëQ0 h‘çh4g‚Q0 FÁ( Ðhå1 FÁ(£€d@£•Ç(£`Œ’@V£`Œ‚Q0 H4ZyŒ‚Q0 FÁ( Ðhå1 FÁ(£€d@£•Ç(£`Œ’@VCPk£ßèÙS£`Œj€­<¨XÀsìúha> FÁ( €F+Q0 FÁ($€=ÛŠŠßqì„΄B?•—:JÅ‘åGÏ›£` h´ò Àwi¾K—©Ã¥žÐ%Q£Ç(£€R@£•{ÄV4ô¬ÈFÁ(£€@£•Ç ¬|så6 FÁ( @£æ4, ©ÑKÌî£`Œ\@£=¨Lp]–„ïr'Bú‰팂Q0 ¨h´ò bA Ÿuø xbÍ%ÅM£`Œ‚Q@Ðè°Õ(£`Œ’@V£`Œ‚Q0 H4ZyŒ‚Q0 FÁ( xΣ±±qÄy<$Àc4ö‡¸xùÃGÏîÜÂÀÏÏÏÀÊÊÊÀÄ4Ú>£€ €Xr *¼›£öïß¿Öv\½xòÿhô/p÷î]vvv5..®@ú333###)éîù`ñ‹£££ähŒŽ‚Á ˆåÀ(õÿÿ˜e*)pŒ‚$-˜y…ïžÞ6ñ)ú°¥ùAЀ¢¸"#&ßF¿‚¡ˆ…ÒÌ5Z±Œ‚Q0 FÁÈDñ€0¨báQ0t¥;Ìqéݹ> FÁÈDÕM‚#¹‡‚^h• xØ ûÑÝçÃŒ6èF-@±Ð;!ªD†r‚ªÇž“º«}Œ‚Q0 ˆ¨Ê¹À§´pÇW‰Ð¹â-ð¢wëžÐyUèbÈ•>66s°é'ÅÍ„.¨Â×{£` o@DO˜Ã {jU$è•Èpîbsa¹½|=áb£øø†ÜH½Xj´"£`d€"zØ ¹ÁÖ#!·1œ* bz„* |ר’:A-u£Â(£FåªpèØ*\€†=ŠûPZ‘Bs¨>dEÌ]á¸î,‡ÉŽMÍ`ê9‚Q0 FÍÏnU"Ô\i4K‘ l @h²½·1Ð+¡F{!£`Œ \>5z´è‰£ŸÈy™E t˜0Çuk1“åä˜ï~r ~BæÞJ8 FÁÈÄHNAMž­ç:U W/ž ×Ö7_¤GSÁk6ì`8pàÿ2 ì¼ÂÌ7‡Áñ$£` v@LÄÀÔÎlƒ`Ó òhô‚Q0 Fy €Èžó VB«JÙ}0{ñ(£`Œò@¬<¨±w ÀèpÄ(£`ÐQ=ÁZÓ“­@FÁ(£€ú €¨²Tw  hbOó­@F u²|Œ‚Q@ ¢+Áv“RðSr|±Ç Õ ¨FÁ(C µ br/Á–q45z7ôÔº ŠØŠc´² ;¨¦c¯µ•7ö¬FÝ@Ñý&AÕG—€&å¸vb/zÂW©j²¾ÑÞ Å:=+³ÑŠc  šT£ÒÄõJ]¤Dèâ%bz%ä˜1T¯Ó­ÌFÁ(  –Ñ  }ïWƒVvŽö£`ŒZ€ÂXm…í¨Áx.š{–¢ÑÖ»Àw!.yZØ9 FÁ(´„Qy{_¥ ¥úÑölDÃÜ ¤A“ì0ŒÐl=­ï¸½C7P÷Êgk«‘ÒÓèþŒQ0"@±à*˜iuÝ,®{Щ4O2h&Ø‘ç4pö„*|1[à2Ÿ~r.¥á {Œ‚a ˆ_Ë[aOjCiâ˜ëd©©½äØ=ZaŒ‚Q0 ˆD°‹On‚…ÿè½£`Œ‚Q08@1S@¦Àè…NôïA‚Q0 F: XL¨‚ Æ0-*bÁèÞ“Q@l:M+£`Ąޢ-„GÁ(£`ÄDNkW2˜‡’Fï0£`Œê€bÂWЪ@F{!£`Œ‚Q02@1j­“Û ¡­°FÁ(£`à@\ªKl2Z¨c„6òî£` E@DŒHìL#½Áwœùèé´£`Œ‚áˆèSu©|ŒÈ°¬8HÝ > FÁ(CUï0§.+£{% 6 £«A‡±G‡·FÁ(ƒ Ùw˜Û ¡òµ´ƒà;Ä_¹rÀ5Ì5:ä5 FÁ(l €(º Š”¹jV ƒµB¢tŽWïb´â£` 6@ß$Hl/d¤ô@¨UùŒ‚Q0 FÁ`Dµ‹sF6¡.ã£` f@T½Ãœ˜^Èpíà[¦‹.NÌÅP£½Q0 FÁ`Ä2–’Z`›[l•¡‹•¨q1Ô(£` @LeñèÖ(£` ]@4©<ˆíŒV £`Œ‚Q04@ÑlØ ¹¡Õº¹£«¹F=?ÃŒ6àF¹ €˜†Jf­FÁ(£`ð€¢Ûœ¾Â´õ3 FÁ(C ]'ÌG+Q0 FÁ( €è¾ÚŠ–Èh4 FÁ(ôÄ4Ø„­½ljŒ‚Q0  Ù$Hè@Å¡º Ø]æ0µ£GÁ(CË@YL쉼C©â ¥2­8FÁ(CM+«¼¥(üc“¢QäðU qëüeâRÁViÀ*|ò¸*lg`!›7Z1‚Q0 h ˆj•¬¢€Uè61TAE5!WFôúÂw°!¡{>pÉc½4jŒ‚Q0@Q¥ò@®°U„® $6”z”^Eno›ý£€þÀÈȈ‘‡‡‡ùСCFCc w@$Uø†¡(Ôî g0ZI Npîܹÿyyy¢ÀÊã91=ãè!‚Q@-@DWÄ C 602êèPÕ KkÏ'Nœˆ5­.7à ÁÊc°WädrZT ¤NpSÒë½4jð7RÐhH ¤t4´FÁpÄ8Ø* z ]*`¡[¥­oÞzõâÉÑžÁk6ì`8pàÿ2 ì¼ÂÌ7·MüG«Š”Þ±'Kdox´74 ÈÄ4\{£`Т`E#¶à- GÁpÄ4+zfæÑ^ÇÈ®|¥µÑÉòQ0T@1àGëhô‚l€ŒV£`(€¢ëñ$¸–ö"o0dâÑnþ(í¹Ž‚Q0¸@Ñ¥ò ´„šûEFÁ(£`ÐÓ`tÔhw~ w0šÆGÁPÄ4£``z M………ñŒ†ô(ª €må1Ú2ý×acc£5£`¨€bì™l(MNbÛeNì&A|§åcÏ(šÔûxñâÅÑÃGÁPDlåj* ñ;r,­¦î“âÔÞINÈ,zà; h×£Vo¾|ùò{´âC±ÃVÿÉ­8+J3ÛP®X{ 0>zYŒõøìBׯç2 ¨_A“nïܹójÛ¶m?GCl E@Ô¶"xðÛpî{¾^¶Þ®^¾ÛÑõ"ŸöRˆh)Q0TНÒÈÏÏgR¿`üU«V} íQ0T@ѵò ¡BŸZ-R‡­F+Ú÷6U@“&Mú5R£`¸€¢fåñn»y±õFÁЯ8ÂÂÂÄ¿|ùò~Û¶m£Ä( €XFƒ`d€Ña+â@cc#(O4 mà¼]^> F ÑÊƒŠ…32@žÇ€É!Ï? tuØÄ‘å°‰áS‹®f´Á XI­<ˆí€€——»ŠŠŠÐ¤I“žõ(Ê €Uå1”‡¨ðÆø&Ìq‰;áNŒ;HÑ? (aaaXçÿ’’’˜=<<~L™2…u4”FÁPD÷棇 Ž‚Á êêê¾SjƪU«0*Ð5´Æ/^¼0ÿòåËßÑC¨ço•#TÍïÑŠcŒò„„[^^Þ)ÛÎÎŽäy•Q0  b†­$€øñhP‚Q€+6P¯âÎ;Œè•òfÀÑå£`8€baÀ¿7$÷d4˜FÁ(Àòóó%UTTdß½{÷X< nÃ1=ªÍbÚ ˆ¼Ôqô¶¶Q0Rš}nddô‚‡‡‡Ô³X¹råhàŒ‚a ˆ`åqtb†˜uþ2šU tÕ £÷˜äV‘ \û9Î;2`tHjŒ@L¤Vƒ)““Á‰=´nŒRÒÕ(# Ó`«8F3ø(MW£` ~@LäTƒµbAîU Äœ òqèØŽV'¤ŸÜèY£Ç(ôÄBïŠÚóØ25®Šƒ–½/ƒ¢Tý(­8FÁ( Ë`ͬÃiµú™U¸îý@V‡\áR­òÂwE-1æŒÚT ô?Tç¬v⺯œœùR&À‡ÂP×@^5ÚÓ£`P Á9è†À¯Äl V&;€Ê@´¨Fw¤SV‰êRæí€êªê[ILï$룀š €XpTèà‰ ›ä®9PÏR Úh<Ý{Pw†*Kµ@v]½xò*µ cl­|z^E¨×1&ÌolL«ðöbIIÇ´l!¥óÖÑ õQ0Ô@1âb" ¥„èXxVië›·+‘ÑT0ÄÁš ;8Àð௠ÃýC‹ÉMØz ”è¤ö†I±‹Z=Ñû( E—AQrÆÕ(ƒ€ PPaŒG®F.Ì‘1nÁj>³)±oŒr@Q¼ÏT å£LFÁ(  7ÛŠÜ@î @ ôVrÌD®´ÐÅiÕ£€T@TÙ$ˆÜ­HFÁ® HÆ!¤–œÍ®¸*ls"£Ç(H@TßaNÄP/'+™‰£Á?  r öQüT3 Vp4|ëh2  1sŒPL-Ú/ra4èG½´Pn¥‘¹b¬ÝQ@o@LDª¡ö’Œ§\ˆ,úQ@eÐJ…J¤•PÅ‚­¢­@FÁ@€"¦ò Å¹W?ÒÓ°ý$£`ø ï&r–×âúA:濚saÝH“èÔN»­ØÜ;:t5 è ˆæ§êâ¸Æ–c4èGTN‚µè‘+j·6 FÁP4 G²+”;Ã10±í2'öRN½ÅµC÷ç#J¨q1¶ýp»2`Œr@Ñ´òIËvéyò%£çSQ§!µ§07VŽ‚Q0@1}*äÞúUµØÔ£Ÿ]èúqõ\ˆ5w8U"ø*rÌž#µ{ \ô¤õ:`½¾ ×ÐòðºšÑž å€ÐÞ‘Ña®Q0@Q»òõdþŽÔÀ —Aá2›”ù—Q0p½¢ÑJf @Ô¬<@©ÿß`ïuÀöxPûHvR wZ^5Z9à{²zègV‘s÷á=°}£KnGÁDÍ9ÿ ÔßLH‹^ôHÙç>·ë.‘Q€7½À7àÑòÒ&šÑ½£`(€b)ÅÒêl£f+Þ—Aáêuàº8 Ý=èní±àM7­ÈÿÈé½HkÔ>okŒš€b êb–ÖR‹k"›õ¤ˆN˜“_‘àXYÕJ¨W£ƒm2}´"CÐèRÝQ0 (ëÁ ÐŽ9©]â; †2 ÁÒóåHFR3âèÊ”Q@-@nz"âN”C Gç5FÁpÄÄ@ÝãÖÉÖùËH®8()$@øêÅ“U£Ñ? (IW¤Ü»>!N {Œ‚Á TypÑ;¡Y3zí(Ê­Í£`°€U øŽGgDêüN™{ŒìŠ_¯Xu£é~Œd@ Ê㾞9´Ò`†V"ÿˆíM€1= zö:F3à(M3£`P1æ  ä/à ܈-cN¢‚Ñ kŒÚ€"vµÕ€—ȰތUÞR†c“¢ñf¼Ñ dŒò£`ÐРÜ$«(† õM£;ÁGÁ(ƒ Р«<†bÅ\¨ž\; FÁ( €Õó¡ZqÓ› ä‚&lgQ!ë!墩уGÁ(Ô4äζÂ7ß1X+Z^Є¬ß=èÄÞ52 FÁ(Ä€¢iåAÊ@jö:ÛÅ:´¼  ]/.»F{£`Œj€"¶ò€_/K«J†X@hµÕ`”T¸†¦H9i—ÖP 7€Þè]U5 F& b϶Çpä\Ðæ‚aJ{<£`Œ‚Q@) †!pûßPô¼  —]£7Ž‚Q0 ¨ h@'̇c¯ƒÚ4áÓK¬]äTD#Œn0£€8@Vy[q µùŽQ0Z¡FçWFÁPDó}Ø*‰‘6Ï1 FÁ(à ]zÐÊBˆù€øæYÚ÷\Ò{õìã«þ8Û£Q; FÁ(´»è‰ýòÏ@ü’R»°-£D»"úbÿ3d/=*d¾âQ@lº2£€x@L ô[mõÈû@(©L``j´5FÅ!™8Ÿi4ÊG©W¥»Ò˜< FÁPD¯Â”[þRj¥G=›—ðo4ÊG© RÅɵgŒ‚¡hĵÄAw4óŽZW8ƒÅ¼Q0 hˆ^•Ç`Ì­Ã9bGϸ"ЦòаÐgDÇ£•Ã(Î €†Ì©ºô¼ëœZ…55.ƒÂeîèɸƒ®÷ñ›øèüÆ(® €XFƒ€:€–—A‘²“| ÊŠe´Ã=+²—OœÂËYê;$¡³­ÐùÄœm…M=.=£CUƒ«"£`8€bâ?´(ôÑó¹ß}ùíÃÀö|¨V”^…^øã»Ø‰þ(­8FÁ( ¨â0âó8*F¤Ê…’Ô3ç7é½FîåC9)½ Šüh…@f¢DÝ`: FÁ( l‡ù_<½…ßT²‹¬\ZRÂüÿ@ÏÐdZÏOŒÎ ¿^ÊèÉ(ì €@Ku/3Ð~)íüCc8Afm8ÿp pr.ƒ¢F/gŒ‚Q0 ¨ Ôóø>˜8¥eõÇðîP¢Ôž[ÕX`V?a°õ:hy.óqÉ‚Q0 F5@ ú¥ºGÞþõŽˆ:VD@Fmñ`¨,È#å2(bÔcÆ(÷£€\@ƒþx’ÿó¢ˆ>JÙ:êíh”Ž‚Q0 Fí@1 '{F[£`Œ‚Q@@Lt*Ø™‡B/gŒL0º²iŒÒ@±@ v‚CCègK‘x•,¥ûDFÁ(£` "@ Êã/)•™`0VÙ@5Z™Œ‚áçÙVäìØôa«P¨UqÓ“ê‰É>"`ô(öAY™´’#GŠ:JåGÁ(h@8ç< |J zrõªÈ†âÎ\b/‡­8FÁ(ƒQæè=Z7šÌ•z¡­¶T½ŒÑ@£€ @,ȱ«¨¨Ù+!¥Ò ¶=hnŒV£`ÐÅ#Rs>¦otgû(£` n@49U—Òa.BêI¹KaŒ‚Q0 Fõ@ÑåHvZ sM‚Q0 FÁÀ€biÝå1í£`Œ‚Q@ –‘æaÐØeP£)`Œ‚Q0 È4â*ÿÐñ®œ‚ŠÑØ£`Œ2@€ñB0°éÓIEND®B`‚PythonCard-0.8.2/docs/html/images/resEditorFig8.png0000644000076500007650000000457410277403055022054 0ustar alexalex00000000000000‰PNG  IHDR,ªãrsBIT|dˆ 3IDATxœíÝÝoWÆñgÅMúh«RQDC&µÛ¤@ˆ‘êm)*÷ÜpÃ%7éK B#²Ù”¤†òâRçà:¹#Q»¢‡"p¨¦IEEEPD"B¯ÍÅfÖ3³gfÎìÛ™ßî÷#Y;ož9»³yrÎÏ;;ÑúÚꦠæž8tXS’4³gè¶@®V«%IíÀ’¤óç‚5|L%g>÷•ŸK’¢H’¢öc)ÒÖcER$EÊ÷A=—Ôñ*>ÏA=—>Σóyòá=â8Þ <ðá‹é tÏ0DSå›@u_ÝwsÏ¿Ûh4ôõžéZN`š^jã§ÏœÍ]Ç€ÎÖÿ.’$Ýxïeÿ}ógºy÷S}ðøAײïÿnéï½óÚqIÒŽÍβ·_=&IšžoõÝ.Ã5»wN’´¾¶êµÜ¥°‡uí­¥^ÛVêÎ}‡uç¾Ã’¤¿Ÿ{ahÇPq Å•œö +É£†uíâ˺iד©eW7^JÍäþoH’þýçŸH’nÛóŒÞ_û‘$éö¿¥þñEIÒŸùvá±Þ]=)IúÄçH’þúÛïK’>ùÐ÷:Ûüå7íÞÔ§>ÖYvy¥ÝëÚùH»öÖ¯·¶—¤Ý$]øås]ǼÿË …m08ëk«šÝ;— -ß°’ zX7ìL /¾Ü™¾z¡VÛgiûì!IÒÞø©‹¯{ïõ½÷z;,|†„±šÚñ…fjÙô|KÓv]zå¨$i×£Ïk×Û÷毎¤¶Ÿ}üÍ>ÞîÕ½ñ‹Ã•Û wÉ€ªVRÉ0YÃʺ²±¨+ë‹•–ĘL®!¡¯Ò!ỞԵD+¶}æP×§_cïŸÿqgú_z±RƒŒ¯lÍ*úö´¼>Ö­aå¹õov¦oÛû¬nðÙÎüŸ.®_o®»«_¤òGo¹ïi]½ð’®l¤‡ƒM„•¸~%Å5¬HwÍ=§wWOêo¿;ѵýÝÕ;¯OÝïyø˜Þ~õXªè¾ó‘ãºôÊQ]LÞw?vB¾¼ @Ey½¨*u,g`ݰó ®_vÙqÓî§:Kn™yÚyA¤$ݺç™Î‘Rû¯„‹A%}ì³ßQ{uöbж»æŽ8/l•¤»í:Þ=ó­® [ï}ôù®‹2%é¾/L]œÿ…pÐk.Í04E—Ùô‚À0Fcàû$° …ëÛúÅÅÏÌHõ°~úk¡ÚÔÌfæu@ €3,fXÌ °˜A`0ƒÀ`À  €}-á ¯$Пf³YxóÕ‰,IZYY Ý’–Ëï`5ñ%IËËË¡›L<ŸÛÚ<°\_8_åKè‡eÛôÁ Çwùàò©ÐMj%Hѽê­}@bH˜’íÑ„èu}pùT-{{@ ¬øvÕyÃ@×m¬³Ë\· Êû½*ÃÍdXø„Gr›~†áP®–=¬lÅó®Ч³Áχ®ùJ†·`Mö’²â»ÁV­uõú{>²A’œ/šŽ²ë³Ë” ÚÃr…–«§TeýJ†ˆïð.¹]Þð0oèHÍ ðWË!á ôúQ‰ª5¬^P@o‚V¶—U4T¬º©Ÿñ0#,Wxd—•mã3]´¬_Ôž€0‚÷°ê&¯†µmú`gkzÛôAç´k_zC`%”…Š«¸î;·¬lÀ¾ €ô°®£.Ô=,fX̘ø!áÒâ‚ׇo¢«Ùl†n€ &:°èY¶PÃ`À  €3,fXÌ °˜A`0ƒÀ`ÆDÒýô™³¡› ¡Ùl^2Ñ%I+++¡›@í/"(,°ªÞÍf˜Û///{ïÀpø\ÛK €3jYÃrݵ—åñ:ß¡aE©ùÍÍM¿PEAŽ XPËÀʆQ<ïZž ¤ì|Õ©&ÃÂ'<’Ûô6Ù°Э–UõVõ½ÜÚ¾n’¡À­våê1•Æíè³²½§¼žUv:–]¯cøø»¢{¿½­(Š:?¾a’Ü.LñO2¼’ëèQþ‚ö°²á²¾¶Ú©K•mŸ¬k ªè.U¯aõ‚^Л`U"®u½n?Šá"€Ñ»!á(0Œ¨]Ñ=4W¡<žNʳÓÉš”«>Å0è•P*®âºïtÞ²²y[0ƒÀ`À  €_t_Z\ðúâ0áMt`5›ÍÐMPÁD=+ÀjXÌ °˜A`0ƒÀ`À  €3,fXÌ °˜A`0ƒÀ`À  €3,fXÌ °˜A`0ƒÀ`À  €3,fXÌ °˜A`0ƒÀ`À  €3,fXÌ °˜A`0ƒÀ`À  €3,fXÌ °˜A`0ƒÀ`À  €3,fL…n€$ÍìÙº &4 --. ý8œ?£:ØR‹À’¤óçB7¡ÖNŸ9;Òãq>Šú| !!3,fXÌ °˜Q›¢{H³{çRóëk«©uEó¨¦èµöq9oöM|`¹ÞÈyonÞôý©òZ. =ñk8xMQÅÄ÷°|V£‘.ƯwüÚÇë²ÃóìöEËa…ÚÈ«º¦ój‹ÔÇåÁõƒ—-ÈÇ|^÷¼Æ å‰Ð.WϨWœ£ñEѽ‚d-ƒ1¨×3o?œ¯ñ2ñ=,WýMO«wE¯uÕÿ ²Ûçí‡ó4^&>°¤ò€ª²=ŠõûZ'çóöÅ9_ ˜A`0ƒÀ`À  €µù+!ß‘]/œÔQ-«Ñh„n8¨«Z·JªÎêŠ3,fXÌ °˜A`0ƒÀ`À  €3,fXÌ °˜1%I­V+t; T4??¿ºàãÿ ëY…о±2IEND®B`‚PythonCard-0.8.2/docs/html/images/resEditorFig9.png0000644000076500007650000001044510277403055022047 0ustar alexalex00000000000000‰PNG  IHDR,í·åÂsBIT|dˆÜIDATxœíÝy´œuyÀñg¡‹V{¬mmK[‚e1QU¤jPPQöH@$@X„„° ²ªE\# ‰D0¸Ð(Åžªµžjk«Up©!™þ1™›Ù—çνwæÞÏçÈ,ï¼ïo&sç›w™÷6nX_ 蜓όí#"¦ì2}¬ÇÀ€X¸paDD) ßýöCc6Ϥ±ƒiûÚ^õÖ[{»„BD¡ô¿Š?#¢PhògbúB¡´¨¡?Kw4þsÛt©e7™W·Ën7}éyõf^MŸx-Òˉ÷@ÍôÕËòþóþÝ÷ßÐßñ8ó²¾_uÝ)uk CÞrB<åOÿ$~¿©›‹ň˜<©TôÉ[þ/þðd1¶#þðÇ-±ÃäIñÇ'·DñÏvŒí7®‰¾g Àa»==ýØY³fÅš5k†õøc.½«'ã(ϧVÓ€üî‰ßÇïžØ±]1¢Xˆí&bs±›6GDqKDaRDaKÌ|ñ³bí#ÿ{ÏxQ|qýŒØîù·ÄäGî‹Âö‘0Àx‘9@iÕ]«{öø^ϧRÓ€<|ÚŽñ‹Ç7—6.ch»rÄÖÕ‘(DD16o~<ÎxÍŸÇæ-?‰;§}.¦ßûëøNqì¿ZòßXûª {^ÿú•ó""âf.ö¼zéëwžÓߺlŒGÒÚç¯}WDDxüð÷¯­Zòöˆˆ˜}êÞ ’©Óf´fã†õ£0’mšd×ç¾ "6u9»É±úÛÅøNÍ­Oü`EÝ”O{ÉIñëï-ˆˆg¼tn—Ëé?øò9 oÉ>òHZ{àö9±ÇaWÈüï¹á¨ˆˆØ÷è›bõ‡ßû{s×ó¹{ùáu·½ùäÛã“Wo9åùAvè–…o¬»í¨…Ÿkù˜ŸµoDD{É=qÝÞÇ-º·÷ƒƒ)Ǩ68Íno¦ù>ˆØºª«5÷•oßnèòvÅÍUSýö¥­§¾hNÝ ƒî…¯;? …B<ö¥ñâ½/ÜvËò†÷ÝØÓç}ÈÜWÕòæy·÷ì=󱋉ˆˆwž}wËéÞ}Þg«ß¯-sñ£4¼‰õ÷ÎèkõÁÞÉJå|¦N›S§Íšg·ñˆhˆRб-&e•?,åhLŽíž|²ã…—ýM0;N)m’ùåÆ+ªîÿË—¿øöåuý«—Ϻü³o.nºŒŸ>tqÕõ¿õ#"âß¼0""ž»û‚øñW/ˆçíQZ«øáºáo®zôž³ª®OÝï’ˆˆxä gÖM;í KcÃg·=—]¾,""¾ûÔºiw{óu·ED¬_Y½&÷š·_Yuý«ÿtbDDìyøÕqÿÇN¨ºæ×ÖÍóË7¯ÏõqßMGGDÄ>GÝ÷~ä½QŠGåHÙ®{wDDpÜ-C·}îš#‡.¿ñÄÛ>‡FZ­ÜqÙìªë‡ž~gËy½ãƒwE!">º5$G,øtGc¸ñœ""â½|!""n8{¿ˆˆ8ú¢ÕUk eמ¹ODD¿ø¾ªù\5ÿõuó~ÿ’µ±ü”™C×ç.ýÊÐå+æîU5í©+¾—¸{Ý|N¿æk±ø¸ÒÁ™×•¶y_rÌ«""â¬ë¿Þü 2áTF¤ò¶ntpï–­ÿubSLÚÒ8 O<¶"ìÊxüûWÖÝ÷Œ—ÎglGDÄNSçÅN;Ï‹gî\ ÇgIÕôÏšvZü¡ˆˆøù·.ˆˆ¿~åñ7»Q·ŒçL?+þnF鿈ˆŸ|­z3Ó¸`èòÖÏßëÜxÁ^ç¶x¾Í=zO)PSö½8¦ì[ ÇÆÕÕûc^vÀâØåÀRô6|öô˜vЇb×7–žÏ?ú´ªi_qÈ’xå?–^‡o|r^ÃeΘ½,fÌ^¯~[iÓàƒŸxÕý{vÕÐf¬u/Åc¯w\¯}ç5±ö¶ãÏ´±ý½9ö?ö–ªÛ<þÖ8è„R8>sÕM{ײÃãSË‹O-=¬å2VnÇÛæ¯Œ·Ï_·_ú–ŽÆ÷γïŽ#ξ;n»àà¸õ‚ƒëî¿ù¼ƒâ¦óŒ›Î=°£ùÕ:nѽqüâæ›±æ\öå˜syé›+O™'-Y']±6""–üÚˆˆXº5󖯋S–¯‹ˆˆËçìQ5ŸùW?ó¯~0"".=þÕ©±2qU#³ÿ¤ƒ5ˆÎ7M¢PÜ•k+Oyá‰C›±Ê~óý+ãi/9©é\j×@z¡v ¤Ösw_°í‹@=ôÝ/žÕ~¢©]éÄý;~F2<µ›°Ú¹ãC³ën»}quH?ëS {Ä‚OG!"n½ààx×9Ÿº½vÖQç>n<ç€øÈ‚ý‡¦9úÂÕ£²µòŠ“öù…0!U®}TnÎêT‡éܤ-›¢XÜ\õsõÔÎú0xü±ú5J¿Ú¸4""vÚy^¢ÿóÈ’–Ówâ§•ÖÊkÿ¾¾uLziʾGÃo!÷ØC«Jñ˜1{y _»£y +íõŽkê¾ ÜÈ—¶n¾Šˆ¸÷Æ÷ s´½õ¶ù+ë¾ |èwÖ}½‘Û¶®}yÎgúvÏÕ¼åë꾉ÃU»Ï£vŸH'ÚdR”Þ¬nŠØ~s÷û@è_¯{÷‡‡öƒìýžë# …¸ok@öyïGvÇñG/|SDl[i·ƒ¾rH!"nX°\ö~qôE­“‡JÍvtöá·v˜7Ú±ÞN›€tˆBÝ>ÚÍWO{ñû# …xúÖCy+w¢ï8õäøÕÆ¥ñËGºÛŒõìWœ?ÿÖ¥ w¤?gúâ§]ÒñšÇóö<'~´îüøáýùé/}ÃEñè=¬Û„µóþ‹RóûÖ]§ ]n´}ú[—ÅC«æÆú•õk»º"¸}NÕNô=¿:Ö}ü„ºMX3¼.5¾²ýŽ)ÊÛh'z¯Í>me¬¼lvÝ&¬CÏh¾#½ò(¬Vá¸ù¼ƒ†.·;Œ·RùPÞf;Ñ»qò²ûcéܽê6aºâ–;ãÚõ±ø¸±èX¿¦a¼éæH«Vš¢Û6nX_œ²Ëô¡o)–O¦øÛ©üàߥ˜´Ûâµ%N»ö›qÕ%KbÒÏܺ„œ˜¬Ýôãødvß]Ú™þŠC–8™]ÓW/Ëû/ûþëż&âû¯¼¼Ãv{zúàk×®5kÖ ëñ•§2éÅ|Ê'S,ßÞ´ÏÞã’xòÉMÛ¾îQèl…?ü¼ó‰ƹv§éÇ÷z>•šä7?ûQDÍ—«5ß´5i‡†3&*¼üM—oûW!0PfÍš5¦ïõ|j5 HaÒ䈘<" ˜šÅv´Ô8ü>RêÖ@¾¾êÈFÓ«Øä2 5R€ E@HéY@zõûAY.Œ4ïmú]Ç)Ÿd«ò¿òí#¡ÙòZMßËñt³ì~5¯Ef¹cùú5Ëh©Ñòõ}e]νщ¶Fò,’ÝÌ»—ãÈœ¼ª}-2¯M?¾–ý8&4Ãþ} >P†ó+;]f«qd~·o£ù´[víòÊ·5:Ï~¥ÚäVóëÕô½z-Êϯòy¶[n£¿›nÇŸ}Ít2¦v—{©ÕólõúÀXê* ¼‘{ñ/ÖFËköÜ(&#õÖê¹µû°iô¸Næ7œéko Ý,w¸Ï7;¾Vóëåûµf›¬:Ãhº1ìMXŒô9ë'²‰¶Ý|4>,[½¦½ŽY³åN´¿WƇžÿJÛü#i"½¶½Ø$ÙÍrÆR?Œº5âß´Y5ڶ߯Fzœ^‹±Ø|ÒËÍXí4ÛwÓ«µN Êûz¾Rû¡3œ¸Fû\Ú}À7ډݭf;ˆ‡óÜ=®Ûù gú^½0Ñl¹ÝޤÆÈŒi¬Æ0Öc„Fê~¥-½7^wzŽ×çÕo¼Îô›¶¿Ò¶V³õö+c¹Cu¢ý‡M)cõ>êtï}Åøa €®”×@œL€ E@HR€ ¥å÷@¦ì2½é}ýrد1Œ¶_$,ÖÝV,ž;"ƒÉ2F€Ñg)@Š€" ¤´Ý‰>;z`ôµ H«CL[šÚ/úaŒ³fÍŠKõ0znX¿‘ÐwZ[u×ê±Àˆ±€ E@HR†µ½—¦N›Qu}ã†õc2†±X.À ê«5ÖýW”F*§édúVóÎã&¢ôéÜÇ“òZÇHEÄéÜñh Nç^»i©òz«Ëeµ÷—ïÍÍUýð:ôRßì‰hü¡ßNåtBR{½ÙeºÓWiö¡?RË ¯¯v¢08. Ž–è}u:÷fû@jw|×^®<ô·ÑaÀý°ÙÊs`¼é›Ó¹·ûo´³¼ÓËÍnkw½Wª ŒG· €þ ¤)@Š€2¬o¢ûßW: ³fÍêå80éÓ¹¯Xº¨çƒÉ„S¥Âº5§soÇFŸè¤)@Š€ÒW§sÏ2F€Ñ—>{¿0F€±a)@Š€" ¤)@Š€" ¤)@Š€" ¤)@Š€" ¤)@Š€" ¤)@Š€" ¤)@Š€" ¤)@Š€" ¤)@Š€" ¤)@Š€" ¤)@Š€" ¤)@Š€" ¤)@Š€" ¤)@Š€" ¤)@Š€" ¤)@Š€" ¤)@Š€" ¤)@Š€" ¤)@Š€" ¤)@Š€" ¤)@Š€" ¤)@Š€" ¤)@Š€" ¤)@Š€" ¤)@Š€" ¤)@Š€" ¤)@Š€" ¤)@Š€" ¤)@Š€" ¤)@Š€" ¤)@Š€" ¤)@Š€" ¤)@Š€" ¤)@Š€" ¤)@Š€" ¤)@Š€" ¤)@Š€" ¤)@Š€" ¤)@Š€" ¤)@Š€" ¤)@Š€" ¤)@Š€" ¤)@Š€" ¤)@Š€" ¤)@Š€" ¤)@Š€" ¤)@Š€" ¤)@Š€" ¤)@Š€" ¤)@Š€" ¤)@Š€" ¤)@Š€" ¤)@Š€" ¤)@Š€²}DÄÂ… Çz ˜ÂÌ™3‹c=ÏÿÅYiô¦ÝðIIEND®B`‚PythonCard-0.8.2/docs/html/images/shellfig1.png0000644000076500007650000001235707462042505021253 0ustar alexalex00000000000000‰PNG  IHDRôå¥+sBIT|dˆ¦IDATxœíÝ+Œ-ÉyàÇ–  L"]éíì:À [°ÐDZxaà€€…×ìZñãÂ1ˆâÈÚn¤Dº ‘ †Ÿ€ë÷ô©®®~®ªó}Ò¨æœêGuõ™þ§ªûTÝüöí›Óë—/ç¯ïÃý«—¨Ïß¾yóägÏŸT`©/ÆÞy l_8ºÀzÑzçõýÛèû7á¦ûåü½?¼?„pssþÞã²g›y²“Ñm¾[5²¯È6ŸlcÃcˆmólýŽ!¶ÍèvG¶Â>ǰöÜF·»Á1ø|^öó9¶?ŸÏã?Ÿcûóù,÷ó™ãÿô·ZèЂd ¸Œçþɬå¿úìyxý¿z|=+ ÿò7?yüý›ï÷ñ÷_üúÇá[|/{;ÿò¯ÿþæ¯ÿî1òJ-—Ðù›Ÿ„o¼ÿ»¾ÿ_üæÇá›|wb-àßCï·Ð€í|üÉ‹ðñ'/F_Çlzýç¿þQ!<é~ÿÙg?|üýïýí–»€&Ý¿zyħFsÍèßxÿ;£÷ÐCxÌ»@þó_ÿ(|ëkß ?ÿìGO‚øÏ>û¡ º Þý>eV =u}졸~ È3ìr߬…¾”9Ì3l™wÝï© ¾è)÷¥t¹À´aàÞ´Ë=z}b”ºî>zG0€qk&G[|½ï›|÷É{ßúà{Á>Ä»Ád *ï|õÙºéË ý è㺄ÉY Éú·?~v©rÕ:Í|؃:4`òúš'î€ý|ûÅ‹Ç8õPܧ¯ïw-0Ïð»éÙO¹?<Õå{]š#”©iûGÓ2ßF eˆ)¥~jäkkŽ|n(öPÛØr±¼Üõ—êw Åî›oÕeÝuK­µÅÅcíCA[ºôl©rì±ïÜãÛÿÞŸ¿©í—r~ÆL·X—üÜÏÿTþÚúÙãoªU´ÐûO·O}}­ÿP[n+},¯ÿzlûÃ×±§à笟cmÞó”œûçs/cwéýµ~šs¿¿Ü÷s.jÃßçìcMýæ_nùÖÜŽHmíöÈúÏÉßÓð¡ªØCV±ûê}Sù)9ë®ù'+gSçwÍñÍ)glÿsÎO´îî_½<½}ó&|úú>Ü¿zž=þd†µ.¯Å±Ükìn/ÍY‹?ó¸Uû\p‘årœŸu¶ê5RÿÇÛû<üôß³«h¡o­¤.ôÖÄž&Ý{?”Çù9ž¬®ÏUt­òíQ—.Pes~ÖÙ¢þœƒ2\ú¿-èøét÷øÃ¹-æË¸tü©â{èsF©«¼þT¥ý÷Æ^§æ+O íš«1^Xúä»Ó»ÿÀŸ,?¸`ÇòºõÆò‡ËÄÖæmc(µÍØrÑòOí#Q[Xz~æÖ_ÎöÏÊ–ÈÏ©¿h‹v¸ÌŠú¶øú£Ÿw:Ý= .s¬)ß’ÏïV±õǶ‘,ã‚ãž—á¹[n«ó7¼¶ŽM3tvÎðܱ¼©™:§âCÝ%åKßXýõUÐûºÖúR¹ó¡/ï|­É‹Ç øÞãhdÎò§^Göó¸¿AðÊ)²Ì‰ò”&ç➪¿Éó7±ýn©¼ä¹ÙÿV†ø®K·{ÝÝû—îò]òù˾7ù÷7QÿSÛ_£Nú¯ûö<Ãkk,@M]_c×ç±eSïM•³[oêbåKísÍñM{•ôµÁ|ŽÔ`í=‘9ÿ]/ýC^{Ø* [ª[lÿÈÖyjÙœ÷C˜@Çêo©Øö¶lÏÑs\ª|cÛÏ9©ÏÅœš©mùïÒó׿¶.míy}^»ÿ½·ŸÊ«& oÌ×·^û=ù~+®äÖp«Ž®ï½Z€×bë–Ïzœ‹Uj¿>¯QÕCqý×פ懜¶(û²§x/÷téžçgëú«ù³t”M{HÔ?;ªbúÔX–g8}jêÁ†þ2c÷9ú¦ŠKíc‰¹]rsóûË-z`jÆC=cõór¶1מSãæ<5–Ÿ³ÌÔC…s÷1·|kå>TËßÂ܇Φò眿܇N—nÔ½î%ÅÅòÓûÏ{È+硱±üÜerË9\?÷¡êÔþ—_,¦ §O­" çØr>ôÚçIÏíB½TW륻tǾÐó¡‡ôC]^­A½ÿµ¥TËüex|}À=ÁÏÀWЗ>AXƒ¬–ùO_Ríç`‰*ŠÒth€€ Р:4 š§ÜûƒË”þx¸´*zlè×± >õýñµùP¢*ºÜç·žÇ{m>”¨Šz§ëvŸ ðSsҮ̀ÒTÑBï<<<„‡‡‡ìÙÖ´Ö¸UµÐçr?€kQE }îüç]«:5mêš|(M-ôa7{êºV9׍ЀBþ“îSÁxm>”¨Š.w M@€èÐ  @th€€ ¨. ßÞÞÎ9ZWU@O̓ޙšHem>”¨ª€žÃ k\£jzNë¼s:óùPš*úœ`Þ§µÀµ¨fr–áƒp¹÷ÓͼÀ5¨" ÷T0ïZÔ©ùÎ×ä@iªèrïëZêc_]ëZÕ©`½&JTE ½oª›Ý|è\£êZèÀ9  @th€€ Р:4 šï¡’Y2¶;´ªš€B^7~;ר¹.w3¬pª è···£c¸÷™€kSM—{¿»=w~ô~PŽu£¯Í€RTЗp?€kQE—{N7{_w<5Eêš|(M-ô‡‡‡'A=ÕÝ®UÀ5ª" ‡ÿ½só¡pªèrÒth€€ Р:4@@€èЀj¾‡BÈ\®M5=wB#ÅpªèrÏ æ!˜€ëTU ½3Ü»öXk{m>”¦š€n>tWM@_Âýt®E“}ªU½6JSE@7:¤UÐC0:¤Tñµ5 M@€èÐ  @th€€ ¨â{èýAe:¥Ï‡~ssBátº;´1%— €eªè!œOÎ2¦”‘âK.©Š€>§5~ô k]ë÷Û»‹¾¾ß»'Ëô_ÿ9ÛÇ0/¶~þÒ–úp®øa=Åæ’7À¾ª»‡ž3uêétz˜·ÎOïû. ûïÅ~¿¹¹; ÌSA8–?¶±}/ æ]ýÄê)–Àþªh¡/utk}-ºì»m\²û?ö °¿¦z)÷Ó¯M¬ ^=쫪.÷œîöÞTY› S÷ÜKÝ×’Û¬×\ ýèVù08Î –9Åuï§î›ÝGïocN—|N—º.w€Ë«* ç´Îž=78Ž=$7¨s÷±dÿs¥êHð8FU]î­¶®/Ùí@ݪj¡·Î`4,¥… Р:4@@€èЀjžrïO™Zú\è!”=çxÉe`™*úpÈ×Ô°G×,¸¤*úGϰvó¡¿ÛÆé,o8Lll™aËTqýáá!ÜÞÞ>þ˜½¬ùПnÿ”LÍ—°*ZèsºÜûŽn­¯Qê|èkç;7_:À>ªèK•r?½5SówA»ŸÎY€ùªèrŸË|èûíkí|çæKØG-ôîzÿõ˜£[å­Ï‡þn»Ó]æc­óÜõ˜§Š€BþwÏ͇>ÿs¬¯Á`Õôk°ÅWÊJ [àòô‚Ô¼c´Â.¯É‡âàÚèÐ  @th@5O¹×0úQã¾³½V¿Ù{¦»Öþ¦Ž'6xÒÑ£Lr½ªèµÌ‡¾t†6.kîg ¶sš:¾Ø~[ ÖþZ;ÚVE@Ÿ£”Öbó€åÍÙ_jÊ×9åJí7V¾T€‹åm?gÿ¹Ç0¶œòŸ©ÉdÆö{š ~,?·üSõ›úüM™ê˜ú|Lm'uþ¶¬Ÿ©×¹Ÿÿ1cǪØSs=„󹷷Ο’jÇÜýl1ôêpò™œòõ_§º§¶?•?eªþrË·U/ÌØë©‹}*nQ¿SÇ7çš9ŸØ±¦¶?<[Õϰ Ã×K?ÿP²*úpr–\GµÖç.;碱¶…>wùXk5§¼SÛß³‹·„‹ðšãߢ~笟 ˆKË‘ûw3¶¿½[·s>ÿ%|ž G=„pv=ÇÜ{¥sóptyÆZH%9ºŽÖ:²ü[_.¯º¯­¥ˆë¤ºì¶ÈŸ²E‹»$©2îUþîä,·Å¾:s[üµŸ¿-ÖMõM­¿wý­Ý~ ç:U´Ðç|eíÈVyÎ=S÷ø.%·|Sùc÷<§,Ê}ðh(÷il½Ô:SûË÷~êu*ªüýõ‡ûKÝG^ºÿáñM}>beï×ÕÔùZR?KÏOìõÜg" $Uô9ß;_{ïvÍíð³Ç>¶²¦|± èÚmÌÉßânY¾Üó¾EÙrê~Éûsö±¶|kÿ6æ.“:?9åKÕåÔCzpIUôÖLµ0.±ï½.:SÛßbÿGÖë9°ýG^ÀŽ~zx‹ý ukéü-邽T÷PpN@€èÐ  @Šzʽ@&ö½óæCoÝ’qí¸Œ¢ZècºîµûIå¾v¨IC=ŽÈ/ÃgX¢¨ú†Ã>nŸ#6tdjxÌá°žÃu†¿¯)çV³µ¥†FÚ3wG×_ÎЦ{­?5ôilû±e€ëÓ\@!D/ä[æ§LŸÔP‘cãN÷Tllé9åÜâÂ;Ʊ², æGÖßÔPž{¯?6œèÔñ4Ð;%´Ö—¬—36øVæ.ÙÞÜeלÒê/gýœã]óy2t*Ót@Ÿj¹®Í¯QkÇS¢K¯Ûâ瘯¨‡â¶25ÝáÚü%åiÉœã[¶«ã­÷×¢Øô¢CÅ´ÐûO®¿¾6|²=õµµ£[åS]¢©üØLdS³– ·¿§Ø]ÃýÇòæ¡£ëojÿÃ} _ïXceNÕï°ì±|à:Ч¾[žûÝó©‹ÛÚü=Ë0|?u/øˆ‹xν驼-Öß»þæä¥ª\ºþ’÷Š è䉵èJSr ²†úXB@¯L A¨ä2–\6€5š|(®€ Р:4@@€ÐoooG§FMåÀµ+* §ÉXfjT²µùP¢¢úúÓSî‘%j. ‡’cjo‘¥i2 w´Ö¸MýzôÌkp)Môþ4Ÿ{ä@iŠ è©ùÐSyCZå\£bú_Y ¡ŒùÐàÒš~(®…€ Р:4@@€èÐ  @th€€ Р:4@@€üÑG~ýîwŸþíí…>üzø³/9üîóÏèò¾þüYø¿ÿý]öχ}]çÃ>ÿâ“ð?oÿ#|å+¾YúÙ?ÿSøÒ—n¤R©T*­.ýïÿü÷Y?ñ—u³gMŸúìùó¬å^¿|]§{ÿí›7áÙóçR©T*•J{éÜÛ7{>ô·oÞÌ]ål*M*•J¥ÒRÒ51¶sÈ=ô*O*•J¥ÒRÒ-¬èòbö:%TžT*•J¥¥¤[Ä×U}I0A ]*•J¥Ò~ºEœ]Зó´Ð¥R©T*í§[ÄÛÅýþUü)»%TžT*•J¥¥¤[ÄÛU]îKƒz •'•J¥Ri)éqvõCqK‚z •'•J¥Ri)éñõ¯­•PyR©T*•–’naÖÀ2c£ÓÌ]§„Ê“J¥R©´¤tIŒíËèKžj[çèJ“J¥R©´¤tÍ7Ç:7÷¯^žÞ¾y>}}î_½|Üx§Û!P–~Ìžl¡ûÅúÿ€}Mô~k(Ó!O¹Ûú‚8Ôï&„pê^Ü¿z©‹*ts átsúýoáæèò ü?§¢’C³¾IEND®B`‚PythonCard-0.8.2/docs/html/images/shellfig2.png0000644000076500007650000001102307462042505021241 0ustar alexalex00000000000000‰PNG  IHDRôÈèsBIT|dˆÊIDATxœíݯ,G~ðšËp à€I¤%‘6è­}>û…úìD2|€Ã=öN9ß-ÜQîG@l/ØH‰´ ‘†O€Ýóz{ª»ªMw×|>ÒSÍLMW×ôÎÛï~«»«vxz<ÜÝÞ†ÏîîÃýëÛlÏ÷ŸŸ½pu}½PW€¡¾{±ä€uûÞÒÆ‹fè•»û§èë»°«œ¾öæ…øë!„Ýîôµã{Ošy¶“Ö6¿Ý4²¯H›ÏÚ˜ð3ÄÚ<Ù~¢Ïk3ÚnK›!ÌóÆþl£íNð|?ÏûýlÛŸïçòß϶ýù~®÷û™ãÿô2t(Ag†œÇõË?éõþ·®®ÃÝßÿËñy¯€þû¯~u|üÞÛÿîË_†÷ßù$»þ×ó×w,€ü‹ÒcïËè¿ÿêWá'oÿ4„ðíØÿï¾úexï[ç0øz=C¦ó᧯‡Ÿ¾j}3é9ôß~ùy!<~ÿÍ¿8>~ùã¿rwP¤û×·'A<5›kv@ÿÉÛ?m=‡·Á¼ ä¿ýòóðþ? ¿ýâógAü7_üBP€ UP¯§ôÊлΡ·]WÏЀ<Í!÷É2ô¡däÐO33¯†ß»‚ú «Ü‡2äiÍÀ=é{ôzb–ºê~öÚûï|r ö± ^M&cRøÖ[Wã–/7õ+¬@}×!,ÎèÌÐ?úðê\ý6ëÐóu`2t(@òú˜+î€ù|ôêÕ1Ng]÷ÙÝý¬úiÞ›ž}•ûÃÃÃÔ}™Ô‹/–î òëŸÿ¬×ûc+¯¹m Vàê:ï>ô»Ûø¬q:¬Ä˜ëÖ\åØL†~sss|¼Öóù»Ý·óÝî¿ÝºêgY)ågÚü\!LûÙJû?ú<»Ýî¤.öœÃ&2ô›››ðððpüWîM±_XSÖwñŸxr¾‡Ãáøokº>_õyêŸoÌw¾­ýR”öyØžØÅom6Ðû¨~Aµý’[Ÿ«j#ÖN³®ÏþêÛví#µ}×~cýëêCŸö‡~îTÿêí¤úk£^ßü%^Þ¶¯®Ï×§>§ÿ©ãÛÕvŽÔw+õýHµÓõó›òø¤žç~¾6m™øÔ$q¹ª`žÔ‹ è!„dæ1¶>¥™á5¡Äêr3ú¶C²Èê½õ~äô¯­¾ùžTû©ú”ÔñËíßÐ ¼+Øwõ#·~ªã›ú|õ Õgÿ©ïGìXÔû‘úùMu|Rχ~ÿá\šA<'¨oâzj˜½M*`Ž­ïÚï>æèú#¤>@4Ÿçô7ÕþTC™mt,mÌçŸâøöÙ¾Ôû~»þ`誯oÛßTß®ýæ¾o ß'.OsÒ˜›è!<¿.7¸· ‰MU¿„¥û;&kû…·ô1kÉþOõóáü67ä^] ×%6”8e}Ê÷štõq®þçžÿbÿÍ!Û>ÿÖ~SlÛ5j”szNcÛßÂÏ*›ÈÐûܲ¶dV^fl;¯«[â—FnÿRõÕ󨹨Øö¹õmRÇ/g7ç¼kn}óó×/¸ŠmŸªOõ¿¾}smÃæcößü|©ïG¬ïõc•úy 9>C>±ç¹ßo˜CÛ p¹6ÐûÜw>öÜí˜ÿ´Í_9ýë:–m§(Öðœmés{Z›MôÒ¤2Œsì{®_:©ö§Øÿ’ÇñüüàÔýëÛpu}ž³Ë¦ÍC/A5´Wý[jßK´?Åþ—<~ŒWÒÏoÈèÄô æ±…\tXXß`.C€’¡@dèP:`Š }U·­UÈÄî;ßÂzè¥2¯=iC2ôfP_U†Þ¨·²zéòóð„ËãzD}ªÆ9êsTÛǦ±lÖ7§½ŒmÓõž¾ýlî{ègíÚ6öùûÎo¿äñë:6so߬Ëiß°}SœC_ÕûTêó^wMü0´¾Ks›Ø/ì¶©"Ûæ®O1›[ºO?§È²cŸ±­/}‡é—>~©©<çÞ¾m:ÑÔç¶M†ž°†l}ÈlX9sƒ™6ul†×gßcÿ€XÛñËÙ>çØÝý;ÙüÃØ.zBê—ÝØú-*íó¬ÑÜÇØb Pz‹Tæ2¶~HJÒ÷|xÛë¹í”vüúj»(GQzýÊõæíkÍ+Û»n[[:+¯Ÿ»­¿–S_¿ *u~¼Þƹ²³æ9éØþcu}‚ÐÒÇ/µÿæ>šÏÛ>o[c}î:¾Í¾Çêí)ê>ôÔ½å¹÷ž§~¹­Ÿ³Í×»Î/ñK<çÜtªnŠíç>~}êº.ªºý×m›â>ôÕtòÄ2ºµYs¹…ã\çÐ/P5¬»æ`TïãÚú¹Ö~—Í\îP:@†¡@dèP€â2ô›››Ö¥Q»êJ´ÛíÃn·?û¶!„°ßíÃþ»íëcϧØÇúܶ§ê/ÀœŠËл&ÉX&5+ÙØús9öápØ/Ýû‰ú”jgªýlAQ3ÅM¥¹læÔõ]êYñáð&K®æÔ{š™uÛ¶9ï‰í?W= ¶×cܨofÄSçœösú°fŠk‘šÇ{l}û~ßèÝn|^=îzO½ª®«ýúûÚÚŸ3ÃßïöÇ@Ùö8öÞ)÷;GûK¡',™­çÓz^“¬ì¼£ÏKŸ³–[#COXzåµK%ˆôSÜUîSYÃzèc®2ŸÚšúÀ©‹Y½«®i-YyÎEq©úæ{ºsì<úçÒŸÝvØŸ>¯½öl»ú0øîôqn}¬}#ÀÖu}Š[ÖBXÇzèoÚÚg½–[ß§½¹ÎËŸ\–¸Â<§©ë¶fŠsèE¹/¥™}ê GQz Övµ:Û C€¸Ê PÜ\îp‰dèP: ¸«Ü»&©O.Óu_úй×û¶3Õ~ ¸«ÜÛõÍÍMxxx8þ«÷¦©ì9' à²]Ì9ô>3ÅÕUs²·½ÞV?ÖÜíP–¢ærÏUeë)õ9ÙÛÇÞ;ÖÜíPž‹ÉÐ+¹Á<„î!q4krQzŸ`ž"[`M.&Coó®‹â`kŠÊÐSkžçñj½:oÝ|^­®žµ×ëc·§uÕÇÚ7"@—¢îCŸk=ôX0{Ít€>Š».ÑÅœC€’™Ë C€ÈР2t(€  Peܹå[W+žX&„iÖC_ƒÔÄ5}¶wO;ÀeˆeÝ1w··Ñ×WÐÛÖ:MýÚÔS+›­Ï•ÓFÎÊlVj¸±sã¹61äÞw¦¸®UÔÆÖÏMð`ˆUeè)]Còu]kŸOQŸcŠasÙ9¹6Ы@ž»”j}¡”¶À=¦¾k¿uõÀÜÌüÛ¿`@› è}­å|z]NÐÌèkçÐû®^o ŠcëSû#vQ¤¬&CïZ½yõ{×pûÒYùë¡ âôµš€ž:'ž{¥ûÖ2ÏmcÈZí³‰!w ›€Ð :@@€èP °šûÐCÈ[|%õž®UÔ T«ÊÐS“ÇôY”¥þJ·ª€>€K´™€ž›7Y¹ €K°‰€>4˜À¥XÕEq]šK¨æyÙ9—b½¸eìðÜj†ÜonnŽYxýqì}õXQ†ž›q÷ÉÌ ·p)V“¡à èP  @t(€€Ð «¹=„îµÎ›É”>SÜn·!„p8ìϺm!ì¿Û~Ø?{{ÏñùÀ}åôaè¶ÕöûÝþØÎ˜vûô/g?õ~µm;Uò­* ?<…Ãáv»ÝññÔõ]vµ_à‡Ã>š)§Þ³k¶msÞ3&Sò$[ÏÝç¶½ÔèC޶ãÐfS½kH¾® ÄmÙöØúöý¾ лÝþø¼zÜõžzU]Wûõ÷µµ¿D– ø!ï®úÑûdÆmÃÚ±>ÍÝ?€¹l& ×ƒxîjkKfë9Á´„×dëÙaN@ÎÉÜ—²õã,c3}ˆRΧs^ç ¢‚50¥MܶÖw©ÔÝn׌ÇÖçõa?xÛ©MÙ—èöŠ>ë~çb4à2­&C¯íæ¹òæÕï]ÃíkÉÊs.ŠKÕ7ßÓ˜cçÑç:—Þ êÍ!â®sØ9縟µ=à¶­ÎþUí}7 ò¼åêô¶+çcýËí¿sóÀ”v÷¯oOá³»ûpÿú6\]_‡§ÇÇ㪺µß÷ýâÅ‹¥»B8—ç×?ÿÙIümÓ³71ä¾Íì{MÃî”m5Cî%•°:@@€èP  @Vu•{jñ•ÜÉeBÇ9Ø+SOá:tŽ÷ú¶ÕöõÉlÆ´Û§9û1õ-Àv¬* w­‡ž» K§¨ܧP_¸¥T߆¶Û·Sí€uXU@o3&˜‡pš…¦²÷¹³ûܶ۲èsö€mØD@¡ßp{—XÀoywÕËŒcm·õiîþ°M› èCÖC_«œ€œ“¹@e37ΕËú¶£¸ÛÖbCÚkÊh«µÖ`J«ÉЧZ=„Ó ^Ï4Sç°sÎq×ë‡ÜfÖÕ¿êõj¾ù¼íêô¶+çcýËí¿sóÛ±š€ž Ò}Ï™w¢T[Ÿ³m[9çÒÏÕÁ`;Šr€K$ @t(€€Ð :@@€¬æ>ôÚ×C-©ºæ¹ÜS¿ôÙÞ½àäXU†Þ¤Žÿº¤¦U[Ÿ«šÕ­ú—»¯úŒpÖ, תz›>ÙxÛáØú¹ÉÈbUCî9r–NíZ;|ŠúS ››K€\› è}Ô‡¬Û÷˜ú®ýÖÕs×JpÍTsrÐSAqlý9A[0 ¯MôœáöÒKšŽ­Oí{L0nn/¸c5½k=ô>–ÎÊsÖSOqe;}­& çïœ÷,¹Öyß6†¬u1›¸m è¶š .ÙÝíí¨ítX؇Ÿ¾݆€ »Ý/;ý  À \]_g½¯mh^@€•xz|¼­«Ü :À;¬L좷ԅs2tX™fðι ^@€ª‚xî-m:¬TŸûÓt(€€p•;¬€ÅY`ã¦Xœå>xùîþ›¯¿ÿöô_თï†?ûáÃ7_}|CU÷îõUø¿ÿý&ûßË>ŒnS½þ£ýyøŸ§ÿ˜¬üÁvá‹úG¥R©T*-ÿû?ÿ½×¿¿øË¿ ÷¯oÃ/ßíõ/„ð,f÷ÊЇL_ߦzýêú:<=>*•J¥RYlÙ7^ŽÕ{Èýé±ÿÄñÍm–>ÈJ¥R©TÎUމ—c,r•ûÒ[©T*•ʹʥŒèCNä/}°•J¥R©œ«œ*Vv¹º>ýÃaT@ÚÁ¥¶R©T*•s•SÇÌX {ÐÇtl郭T*•Jå\å\±3„ö`ˆ€Þg~ÙX‡ÖpЕJ¥R©œºœ3vVÁü£W§ŒrÚ±¥¶R©T*•s•SÇÌNƒù¤Cî•!\ú`+•J¥R9W9U¬¬ÇÌT0a¡ÛÖ–>ØJ¥R©TÎUNéê:ÌcCî½&–2£Ml›¥¶R©T*•s–SÌwuÝÌïnoÃÕõóÑ€ì€>äʼ¶mÖp°•J¥R©œ£œâö´«ëî`³»}{xz| ŸÝ݇û×·Ç5ƒ/°.õ˜ÌÐcãôÀº$z=[Öi‘«Ü€i}OÛ· !ª'÷¯o ±Àí!v‡ï…ÝÒýø¿›QÅý\²kIEND®B`‚PythonCard-0.8.2/docs/html/images/shellfig3.png0000644000076500007650000003527110354120422021242 0ustar alexalex00000000000000‰PNG  IHDRƒ·@ÈÿsBITÛáOà IDATxœí±²5¹q˜q\,¤LQò+°d‰\™Ll2Ô¾ƒ'æF¨µrÄlœˆ’VßR¬@¡3*‰eR&Uû -SLÇÁÑÅâF˜0s¾¯–?ÏÅÐÌô4fNãö“¿û[3øð£ïÁ9÷õo|k¶&OÇ»wïœs_¸ÿñÓÿhª2OÊ¿š­ÀSó…ðÿøŸþ²¹£ÛíööÉÝÜí­P(º¥mnRÝÛÃ7aâÿ*}®KÐñíóNoÉ—Ÿkª+#þŸÐ£¤ñ£ I^2М½L'tzK…Ǧ‹-/h(˜NîB7hùGÓIÚæ*=~“Õ0kºüD}48iuÓ}þY›¨’Ö‘†a©  tZɦË÷"MZu¢>˜D20QÚ(§UiÒê§•ØT~£OTÉt*.Ì¿ÿ×?󟉉fò…r€òŸÿïÛ+¿ÿþû?üá«êÿ×ÿþ× Rî­Bê<ñ¯>ûÔþâW¿[Õ`0Æ÷‘ÿê¯ÿG[ýžVÁÿê³OE/ºaÿ§îÿégîœûòo¯¨ß?þäOœs¿ùÞýŸÿõ'ιû»ÿ­ØàÞûæ·s_‘„CðÄ_üêwïÎØûZï›7çÜýùçŸ>ç—ÿðIøç¿ùw°»ºËrwá¡·NKROüÏŸ}ú¥¯~×½ù`g[ˆ¾»á_û­^”8!¢ïTbeßê½o~û½o~ûÞÜâ†è‰¿ôÕïÞñ?ö©sîKo~çÜ˽Òí-,6ðO?û³û‡_ÿY¦þÅßÿ©ÿö7¾þ‘µ#€µñÎØÿYl"üŠéWo~÷Ko¡°ÿðÖ“âÞ_þÃ'¿üù'ÿïç~ù·¿÷åßùžsîÿþï?sonø+_ûï|ý#çÜ?þôE-΂÷¾Æ‡Ê‚'ö‹Ò¿úìÓ»· ÞÕÚî±ð¶¹í1&þµßú0ü3rÆ)¿øû?ý>.‡ˆ‹«ÙwÄw§ÿâ‹_u®ò9±óÎøæ~ùóOJuÝW¾ö‡Y`NOøl8|f¬ ÆÄ¿ÿ«ÏþÂ9÷«ÏþâßÿtÎ9÷î1À ¸;Å𿃤¸duº(+÷{bç—üůþþÛ—/¾Ú­õ'L_ùÚþâïÿôᥭ÷xi ¢ÍU§á¯åQqñ÷ÄŸ:÷ùeê0×Ççωƒ_1}ù·ÿà_Šü‹Ó·›»/M»‡å¿ñÞÝ?ÿæïþ?‚€}©ÊÈqDú9Ûå¥ß§O‹Ix +“K0¹WýžVžBÞi|-œ”÷ßÿÐú=­BØ‹ ®IºëÑšRØŸ`&1ñÿü«ÿ2K€#Ù2Ÿæóà‰;Ÿ9@‘?þ8ÜÒ8~Nü7ó7CÕx&>ùÁG%Â[|ðÁ]¾óïL‘ ÐLÝùð£ï§…¼; ÐÅ׿ñ-KµwïÞ‰åxb€^ª"ã~Å0“'õÄ·ÛíV³Ÿ”XßÒÉ.‚ôúÊŸ°>®Nû7¿^__õBÏÝ‘lÛÖVhgÛ¶*§%Ö·t²‹ ¸0zbïk?øàÿY,ôÜ=ëív ]¬½P!toa“Ô£ûšÍn^Q Vo•»‰Jî5÷Õjyï›ß¶oè´âêôÝD¡¡½0åîœîˆåŸoÏÔÜ16mÞp.œ‚ûÞÆöŽ÷Äbì+†ˆŽÇ^˜öv{# ¬#|M¥ÃZ:㜅Ðñ±ž¸Í »7/•†°ÆÂ{¤»è5;&ƺ^‹3>ö­f7œ:'{¡±Ãƒè|• ΋ýÙpȱ™=j_Ÿ>îÝéèõ¨ûŸw~Ž‚æ°r$T,ÌÉí”*WbÄ»ÓÅBèiì…ön•§Åzå¢Jom‚ôò(ÜçÅi€Ó±â»ÓàñaôlEà(È;½4–7ѪêÀîä¶v0‚'hGÜè° <1@;?üáúã}ýß2þ›öÀsb€vªÜ°¸“1ž *7LL °3ÄÄ3鉧íOìJY>Ö§6&NñÌý‰ 0ž̤ÿ9ñá¿'N7_ºGÃ,MÀX=&÷@|}}}}}eu.ÀÒïN[¶"85K¿;í¤×§•͉NÇ9Þ.œ”ÕŸ\›¥Ÿ\bb€™Ì„˜`&ÄÄ3!&˜ÉecâÛíV¬p'úÜ)T餪ÿ´«~õ`A–މ?x#÷­Xù×\çÛ¶‰ÿö ÷PÕZ¹_=X¥÷b÷'ö%¹Vwu»Ýì®+ªìý·ïÊÿ}¥tÖI[ù QÍ´msóð«ðŽ$íDÍÒ1qŽâÎwÏj\ÎMÝðöFè«ìѳï!ô Q“ðv!¬™–ô4ªátdé˜øNäw÷Ý IôÖiáÝ·=™Ýá)5-wÆæ¹PÇ °«ÇÄ¢ßõskÔöç¾iê Å ²jÑ{¢(Öaé˜XtÃÊÃãf,!ïyÝXnh<'XóíO¼þýêð &ñmØÊò¢Vî+—¼N>Ï¥G¼k›GŠõ€ñÔÆÄ©3½?±ñÛ"Š‹mvW¹†i¹"N¯lo^ô¾xe€Xý9ñ"„¿Qž­KŸ¥G p –~N¼'òj'R11À\.›wàÌ„˜`&ÄÄ3¹Ú»Ó û&ÁŽ(IQÆÓ™Dl¯d¿(öƒ´¶óå2™Ú $'‚ßÂÒ9¶Ä[a®é4¹G˜·²jÛè'JXÖÙCóÎ¥{å7íœÃܰQоF^‡ɉàçȱ¥˜nË®¥ï:ž Óý4س˜+´­¹“b‘ªCllžî mÜX:·Ûtÿ¾ÔÊpÒn-69ÈÈÊþÙN=aíg±Åt%%_%_Â’m{¹¾—Ûi8ÄUát\ó9±Ï3–DûEqs˜Û9ª =ØíéÈ]š‡=´bcó¨Z¨Lª¤X9dlžëPΖÜ(¤¦K9ÂÈaMEÏM:aÅB¥yÑty%_œsÛöú`ïwo·—Z|§áU…3r‚çÄéžK÷j%2Þ’Ûê*˜è,uó.ê`?ĵÍ-J±O»­”š³.ÓFÖûi g‡ƒLwwÃmÎ8§LZÈuéÂ,ýœØInøˆ]#Vð§ÆÇ(³ÉÒ©ÛÊC[‡‰VêeaA˜u¦ÿ9ñ«ÓÇùZXŸÎ èe®¿+³»‘9jµDáज &¾Cá¨$Ä¿QâךÄÇoaͨU´HÅ}¨ÔȹB{=Í-“Aé6÷v’Ø\\Û ò)*ù:b…bóªg‡¢=s#µôÐiäœJÆ6Õ_”®9­™yvðr»½„¯h¹à-ËëZéÑ ûí gäïN =á_…Èýiü t:Ÿ€Š•››Û'ƒQý«t9TKÑVUÍ틱VÔh0²R³¹·bý¶žSG[õ`ØxjÔÚ“‹Õ5¸æ»Óã¹½1åâ8W:ôp‚w§NÁ\ˆ8/ÄÄ3a/&€™Ì„˜`&ÄÄ3¹fLìóÎø•YŠ_ùß„4È …>[ú›Èò–šç¢Sí½FÝÙÉ0Ë÷œG©4’ɉ¸†Ÿ‡¥sl)é´”¯üO*ÓL@"éÏ?Äeæ~©–oϽ;rjy{Z(]ÖŽ5-Í;Õîlö3±¹‘æc´—•¦3` 9Ouå¹çȱ% 6棽iX.æBŠBº4ÓžØs±C'9ì)‹in‘rDÂrûáÈÕ4ª¤Šæ’½Ïªæ¾Zô!KX'W(JÉÕÔ¿‡“vÛsŒìVÒUJµrVr§¡ýÜ´˜®¤äK äKXžÇOÅùžÝð}Â¥‹67Ãþ¯îmFno(…9Ré^tt2øSÝWNkžÑòö‰5ÃÂP³±¦]¥œ t.U8có¨Z¨Lª¤XÙ2çs5ÅõálÉBó1²[©¨’¢ç&†b¡Ò¼hº¼’/Î9ö<wŠ[¢ëÕ·(Þ¯¹Qá.DÎ&Jïìùtˆ–·ÈâW@ÔÄ>ÌÚæ– ¥Ø§ÝbJÍY—éN#ëý4³ÃA¦cÏã§bõ˜8ç†______ýÓâñ„wÜ–ÿ†ž×q<ØGtê±w*ê±c¢•Ä8ûì0ëaéw§s Ñúêtº.½;ÜHŠmù\ç{ÅÜG7 »™£VË€K(D,ýî´“Þ‘Caeu:zãÞniÓϾBTÙwõéòëQ9AiÛPJ®¦"hY¶ä±¢8"ÑòbÍœÙ-‡#WÓÞ6­l9ÄJ·–Ù%êõàÓ‰*ù:Å9o‘ÝDúH-=t9§’ñ4Lõ¥+FNkŠª²ç1xÎñî´±üŽ¿ŠE%úg½ÐX_é\ÿÓøÕ⤖Ëõ¥¼ª²±f•‘Û±Qý«È±‰Õª¦tUóTzŽN +j4Y©ÙÜ[±~[Ïìy wVN ðÌÜÞ˜rqœ+ày8Á»ÓOË\ˆ11ÀL–~wàòÌ„˜`&ÄÄ3¹æ»ÓáOÚý¯×•d éWöÌb+¥¹®Þ¹ˆ,o©9H³˜¢vО™Ü9Ì\'ü, bé[b.­(×ô²û;C>‹z'"µ¼Bç¨íWóÎë~Ô|ÊÁjÚl¥]†™ë7 qŽ[aêܦÅ)¹HWÏ[$fé«JÝç‚drî1Le]ï¨ÊniÍ4!ŸýpäjURåŽf±Ï´æ.3¤'ßäAô+©Œ½MÀ¹¸àsâmý‰ÓSébê×S#ZÞ³8R±fX r¶Ã!Ö´«”¤͆aöÏQz§•:‡™iR{› €sq‚çÄÊÆˆ¹&Ñ57*Ü…ÈÙ„"Äk‡"ýJ×ÑòöÑYüâ ˆštsÁÒ9̬Éê1qƒC@¤ÁÄ:>c¶€½j.Ã<© €é,ý{â6›®Kÿg»©?Úò¹Î÷йn~V怳`éƒÏ\¡½‡žæý{ߦ5ûç’8"û 3|âëk¦…ý‚@äïNËÝÓï<¢ýzhn¾ËqWîÕgU[]6•ŒG­V'€‘¿; pÈ; 0bb€™Ì„˜`&ÄÄ3!&˜É òN7Йg aS6A×cAƒ Þn‹Ý½BÈ–`aé[ û»ü.¹ö‹B.‰ÔCNÐÓ²¦A:·d¨õ%qþéDîí,z¦œÈÈpΑc«aâ;z6Ae¿ÕZ8i#¢[–°P4{š¾Ñ©Vƒo{^L±fÚg. ¥ÒÜ(ºØgj]%#¹9/J÷5‹GÓ%.7@ñt³œ‰ºæm#ÒÛ*Ç(§$@Ïòœx“vuõgcXûrK6¯Ì¦ÿûTÙUÊõ)N½y1 6ö ?š´©ªFÄ9Ÿ“î–h%ýÀ¥ê‰Ç=-É *×¼gDzŸÊ1ª5;€Î ž7ìO\Eñ¼Š–¸­@'5à–„_JÛbP«£×¬šŠnU¤­ŠÎ©™´ÃaO”±ØïcªºíQ)ªÆé±ôsb—YW§•~'º) ñɱØY<(ö£Óy˜s§V§'óæµO.pýω§íOlÙ½8w‹½{°Î J‹Ðfc@y´µ‡M½OËŠw´`Ã<<‚è±qú-f‡NNß?¤qpÎ ç‘ÄgK.Yp_9ób7È.câJ²¸L]”¥ rêÑkÚ§M±¹+ÅL–>£‹{úç¬g\W7Jþ¦†MÄã½>¦µ?\O» ÃS}DéÉJû{ÈÕèçïN #Œ“ÄjúÔ^ù9±›ôˆ{öT¥’±ÛªûŒ¼B±¹Ñ™õœ=(#J]]úÄ{0ò,ïNÃ:äÖúü*k}mœ×%ÜÞP†pÄÜ`¾Á"œàÝi¸ÄGpjëY”¿Þ[rbb€™°ÀLˆ‰frw®Æ?üèûi<'èB\sNy÷îXŽ'èE\v6²¢'N/44·ç—³ý) Åiôä èæ,«Ò0e‹[{HREìΈý‰ÝcBÕö'½©¾7€Þ¡®gNº[æ‘ ªä:¶d¸Së6,â:]Ñ0OV%舚«Á=,Ë ý‰}á‚ûç"]=Iž¢Rm ¼àÕAL|¨˜]¼›)æyˆªÙí¦'àt¥Ã¡47Š.ö™§g†¤J§¨}ì¹»ñ´œžº ¢ѬÓ/ Eƒä”ÀŠ«Ó)[’×6ßçæ|FxJooYp]&**]é|ŽåmÛ"³‡…Þ\ÅtKéu0dW)×§¨‰Þ¼ûŒbkÿmç ç¼8"ûØÓ‹‡¸ªfê-É”/Ó1üWïS7HÑþ1bK®éfìñ“{¼F»ÇûâðZ¹£zŠôS“Áîc”{ £t½fÕ”Pt«"m¥‡ƒ=¤u®]m¥¦E¢â§ 4·ÍME€Áë‰ï>زâq#­KJŸ‚e¤÷@–<â@Ì=¸Fé„€)Ox†Â‚,Ù#w±Øå"r_ÂêïG±cµ‘´©d ¹f™ý¹JŸâ2µÒüÐ ¹à›ËMÝ=bÀÅ dÄ»Óa@üúúª¿;[/JË£s)zˆeYŒÖ}‡¾<üõ)JWô7s"¢JÅ•dq™º(KäÔ£)Ö´O›bsW ,}F×ñ(ôÏYϸ®n‘EÏÜô¶Ÿ¹šUËà©5ŠÃLÏÁPºØ§ØC®&À`FïO¬”{ŒÏÄjú4ý3:Q‹Ÿå <óí#=âžÝDU*»­Q±O}þô<èí,¯-±$g†çÄ=W€]zXðÜ„k³ôê4,HnYÏ/è±¬×ÆÅ®þ·7”q1a˜„pFÎñ+&Xˆ#¸žõ,#:bÔ׳$<ÄÄ3ÁÌO 0<1ÀLðÄ3YñÝi1MAms½aTç üÀ§£Óò»H&—ƒ‹0mâ\~\j\{VØ\~Ÿ\ž#_béüÂä,_¬¼U‰™RjU²ˆëæV€ë1gâ°DAÏ~¥Ü«½äm›©Uµ½<‘…ÅÏÆ4bœmO1¨çÚ,ª¤4oK-™–ìb%xfF¯N·mÊ$úË­oâ\·à‰òôFŸ-vãì¨PÏÁ”ÖûUÒ›[²0ZúÜÔ´ÏÌ.(òÔûÃÑl™Ý¶Èõßܼy1EXŸ¥Å” YvIïîCç‹B—DÜàÁ^ÙòÕ.:Cì}ŠËÔ¹æ~« €;£÷'ö…¹…ëÜzfZ®¼Æå?äÂÑÓ\w ŸÊçSŠÒgX.8±¦}†›»y[xFïOlY¦Î]³Ò7¶ìm]rÕ6¶z*t“6Íx(«jöw[u¸‹}*óÊ®<3K¯N\<1ÀLðÄ3ÁÌO 0<1ÀLðÄ3yêý‰¹:;“/o ¼ -O›bÊ—£3N“ÑàòŒÞŸXL¼"î´ãjr`咦ɬI\éB;´¤ÓŒw7<ÞßÉM›âˆŽÎ–J6V€Ë3zâ°°˜o+rɹ}a 刂%)/á‡m{ ããÐIûò¨ZˆîÎÑn,¹)—ê¦+vËÄxÎñœØ¯wÂBŸ|¿¡Oï<¸Øåðæ #³°ÐבØ\ÄûÎm{¹ö%·ÛKø9¬~¶ݳ¢|F¥¸N4åÒ5›œ•ôBq&[v•€k0gâ÷I,^OÙŸ¸Š(=AêEŠö9æi›b«ÎG'J8c€Ë3aâÁÛGAÆ0¹'%]qM×™]U±yHΞðÌŒ^®rÃGï>»ñ®VûŸÂÍœBɶ7¸£÷'VÊïäV>Åçj.Yp6îO )âSsñi¨Ë¬ó§ÇhKvóÍK ?„¯b…¯kÝËÓ—¹ÄÅmq‚‰Ó&7—,ó0'H´§ØCÎòp=žtbKýgÃhv¥fmåÇj/ű<üÓøDÙ¨dÏ<¬êÖny]œ”s¼; °Qð ° +æØXâQ8bb€™à‰f‚'˜ ž`&xb€™¬øîô€ý‰£ša‚…\C1µB["ë5wG^ab;w2¶S•^Ƙ»ã)kz†ÀÖãû‡LÛŸØe²|ŒÙŸ8üSô‹b·z‡ºžay˜esŒ›¡&m*ˆ’]kÄ•³Rÿg¡yì`=¥ÀÌý‰‹=D.YÌ2XŒeíRÞ o}ûß Ëoɾ°bÿŠJQ¡"Ý‹«U~Þ¡AÂB_S»Ø\ä¾åpx%6¾¦WaµÏx†¤ §ÕŠë"[þqFñPæ¦MÔЮ’«1²xàÒæÊ0£B¥yª¼8Q¥Œé^üv°ÎI“2aâܦÅmÏ–èd[EsÚØaŠô5‰¼‹xž§×ˆb‡¹/UzÚW§Ö^ð ØUj¸ï5Þœ'PúæOÿyÁÖ8ã³3ab±ð8Dw;Œ¹Òˆ” ÕÎ-lê㲌:·´F&N­Ü ±sºsäPúí gdéÕéÜDÜe‚¦ëÒ»SZ]å]­Z,v;Þ¶/Ý=ì¯amŸ/µ‹\åQ#Çâê‰ ¸²ÁîŒÞŸXßœØåW«Ä§&.Yò ·¸R¬>Ùro÷¤éç¨OQº¢ÿúˆÏ­Åg]N¸“Æ5Ï/¯½„»»Œ£½?ó»×ô«Ó¹}ˆ]æ…=¼f¥Ç]ï0¬™ö™›6¢•r5S#‹5FE+ú¤ÿêcO5ŒìY5—RØÁZ?¹Nz[wžwâèQ±ñsƒ ¶NÆc4»R³¶òcµã·Ñ 8j«Âˆjµµ \é<×O¿åíÉ2k§eÏHk4)–ˆåì` ë³ôê4ÀsÅ@p8pÐÆŠ9¶žš“ƒ6ˆ‰f‚'˜ ž`&xb€™à‰f²â»ÓÆ4zóR–€ÒÞZ…èwûj@ÎÎ9£÷|¨òúT\0]Â*œÑû‡ßNÜŸxÛc‡àœ 3¡h*‹ ¸p‡úïë*ŽV^ŸŠFé#½c*ß ÐÉèý‰s%"‘KsÈmA¢ÁN…k;ô‰è"=£rÝæRö„éGËüg9¹ØÇÞcŠNËW)Ÿ~v·’m+.ŠôH¨’ Q™ŸU³N¬`” Zab¬Ã„çÄ »0ùˆáNXèSÚö+uØïŠ*‰…þÏÈO¤ÿÎ%ÕÓÕñÐØÇ.J·Óiù*åC‰iÍ¢ª·7®té‘Ш\9p¡Aªf¨’Qº¯&R€;£÷'Þ}3Äâe.Zâ.¶²\7T²w;1bP‚#FÍí}VI3Dfï³™Ôê•ïtݪú,Ê ûÜ}ÊákìLØŸØ/MÙ¢8ºOß«ÛpQî2«m>fJ •¤«ýµÒ•íÒ;9bî4ŸwïðgÀF¿;><.ºáÜ¥aÏgŒcNG­CZäp¬@´sD iYª•»ãrqƒô½Þó8/£÷'.’[w¹dAÕÿY<½s‚,«a(,~.ê)J?(2³÷^‡è©Ú‡Þgî ;óI ÃævéEåSklÁþÄ©è¢æég—ÌdãÙ!ê)$5…®jª’.=üó’+IýŒÞŸØòmîü´\8ª7?ÐÍ-ŸVu¨T…RŒsÄá°—7/8÷Ko8pâ]æ’øU³1í"첪Ú<äØúœ(bxü;ÛÌ|€Y¬˜ckܛô¸Äå!eIDAT˜11ÀLðÄ3ÁÌO 0<1ÀLV|wZLÊÑ“ˆÇ˜â™94Ãå€Ç⣕sbˆ¹8V›± ªpvFïO¬oZ|G̽'Óa†é“¸ŽˆD¦ŠVª2ãƒwˆV>Ô\Ì2fédä¬NqNt2abcºi‹3pùÔ}°Ƥ‰aºÇ¨ÐeV8ÄjÊWmšG*Ù¥W)Ÿ~v}‘zQz$4w˜Ò’(7gq¼ºJFé‘ ÎV€W§pJ@ ”EËo)—}¡K–¾Ó>sqaU˜ž"ªd—^¥|(Q¬©«*.¥‡BS‡;páWzDnQÉ(ÝW3Þg<£÷'ÎîBxP‚Ýå^%è1b_M­UÉ^9½Eèé³K”V¾Ðu«ê³(+ìs÷óbŒ‘®Áèý‰‹»"†‹]µ=~ÂÉ= ŠJÄh©mì%½“ž€~dŸGtÈé`gÅ_1moTµâ|/ÂÀË–÷ˆ«2õßS'¢öˆï+ý¾`¾‹t€“2zb}Óâ0N?»dùѸX×a?‘‰|t]£Ë‹oîˆNï3 ˆ/=‰‡XTÉ.½¨|jèAlíä´Ìy±ÏT+QOÑ ©)tUS•téáŸ=+^fôþÄúãáܲdñ-½¾ˆ²˜Ÿ³žÅÈÆ¶5tŽ^Õ<5WƒæÅ9_u"ìþ€¦Gzí) ðT¬¸: Ãð‹Ã,ÌâÄ¿b€~I¦CL 0<1ÀLðÄ3ÁÌO 0“ß6&sЛë ;E¡Ò\Ípyt‡h/ÿy° SU,¨¤ŒÞŸ8ú*Môíâ"–ëäR÷å¶ pµÚ1›àAD¦Š6©2ÚH󦩲ŒXZ…‹Áö´© |3À‚LØŸ8·÷CŠž¥/Ì/è:.÷©J¥8É›ÚE§» ˆÊçFdQé¸Ë«1i¢2¢T=ûˆ:˜SRüÜ,«8Ì¢ \Éö˜GÓ×)ª*V0Jï¿­€*F¯NÛÝpˆxEؤÝg;IãÂ\¥®ÕAT^,´«tb l?Ñ•½vDUazªUNP¤^nDŠMRÑÅa*‚#çrŠ ‹*¥ûjé$Á„ý‰•ò,ñhú¹áÊ"úžÚN"ÄìÝî~‰T)#Íά¿¦±ù.‹(ÝvY±owv÷‹F€NFïOþÙ×bª"\\<¼ÈR ŠJĬSú\k7÷öípå9 ð Lø“ÝûænÕ÷½…à·7•²Ñn‘u"*‹æâ2uZ§_K' ‚jξÒï æ»HÏèý‰___õ-Šskzi¹øú‰ÿS_ ÛêRœ®…®ìæj*ÊG…F•:‰Fá{Ö¬•‡ýam®¦®¼Ò\y”kYLÖ¦Kf”q&‹¢E{M©šª¤Kÿ<ÑZÀÙ½?±RîÉó–‹Qñ–ªjQax9³t¥Ô¬RÞ¢R'ârq•Vý#ÒÕPP «üÙ k—£i}ܲ|QVíÙc à4øÅa–ˆ®ÄŠ9¶@„à’ÌO 0<1ÀLðÄ3ÁÌdÅw§Å¤͹‚£äûþs¯–×âÐ —Gç…vˆuA ¦¿XP%H½?q´Cb1Í–^¨d¶Ê%âÚ$Y¦h¥*3mð]±¥Uع˜l/A{‘ bþ,Èèý‰ÃÂ\²-cG= ì…1£_´W/rG'—3—D3í¡MùT7%Ug³”´¼((WÚ³*ô+¥sç 0˜W§T]&¸¦´!Ê¢17ö'fbhbÚþÄGì‡^wˆ•P)#Íά¿¦±yµ7ú×\µþI(Þîì>¥É 0—™û‹ôì³ò»3§ H$(*#°Nés§Áqrß9Yæ²â¯˜¶7ªZï룕IÈQk¨u¬jÑ\\¦Nëô+cé¤AÐŽÓ¸¡Ÿû‚ù.ÒÀ3zbc@ì/7ág_!zræ?ûìÍʼn¬äcSýÁjX¨¼Æåœýam®¦®¼Ò\y”[;—,óSì0$ŠÎ½]¥k©šª¤KÿìY€*FïO¬?Î-KßLéïçÉ—‹s_‰åÅÑVn9dÊ!VþlU5¯ª&mÛÀz¤×žnÐÉŠ«Ó â‡Y"¸'þÀ³AH pIˆ‰f‚'˜ ž`&xb€™à‰f²â»Ó>A˜6AI¶~Õ–ï7JÓßЃK)œˆI.k±¤õhîùÐêsiÁD ªð<ŒÞŸØeroyüA¼–¥ˆnØXè¤,KQ’©œ\EŸ“þÖÓ›}ÀÙ(%< çÊ´¬Ï%£ô‘ÞÑ~Ê@Ê»wïzšÞŸ8Ìv©g¾ÌEºz*A%çbO \ ÍÃúÑ•Wì!×m.[dO˜ÞŒ2v1ZÍ¥lÇÞ¿êÐfºœ\±yú97ö*åé®d%‹‘«¦ýüèû=L[ιáܵ#¢kAØ<ÍÞ×|™Ø·‰mè'êA)Œü÷¶m»„éÍäÆžÞgˆÊ§=„Ý6¤Ótâ´É5%Š5uUÓ é¡ÐÔa[Œ\5mìç‘bäôàyøäüõo|ë§?þ‘ýߨ‡Ñû¿¾¾†!²Hz­qù;ú6ÂëŽ%8ë—.ö`ïvâ5.•«Ü-{¨B\Hû,úÅ]¨Zœ0úì]S­D=sF.*©¤(Ý=Η9XÏ@LÐÏêω/³?±ÒOÎ 4#ö`ïv÷pG¼ô+Á™¥‡NRA9¯l'œuzµþ%‡tΤâkưôsb'íOì2«ÖƒýHÂÅ3.¸[²HŸÂq“gßO7©NJÿsâi«Ó¹‡ÄéºôîXúóÆ–eÕtAö=@ÅÞ,K©–‡»¨mœ<µÝî¸\ÜÐÏ€“àÂ,‹ïH7'vù||yô Ëò’ŽeQ1l=Ìu®+æôT‰#_´‰ *U‘ÚS‘na]ùœþŠ•ÂòTø ¹MPq‚‰Ã‰¢sÑ5ŒTMUÒ¥»Ç£éò¶€Îñît±0$}iÅòY/4Öok+®Íê¸]FdQ© ñy°]Ïbö¯Š•?«tЛ÷O°etz¤÷ P¸à»Óφ_f‰àŒ¬þî4!$85ÄÄ3a/&€™Ì„˜`&ÄÄ3¹à»ÓbJa—O†;’¦æ˜¥Ãxéýr‡%Ê0æ*qùì"«D ª`ç1q”_úƒ7ÄÊ>7E˜ 2ÝXv'4òD5fI·Ë¶ÑENzñ0… ^ôT9º ^]ͤ*qšÃ‰8ALœºaãþÄþŠs r!4»˜}Ó=î $*Í·Ç„¦aMËcw»ž¢t]ž®2¤ÚÇÞ#ÝNQÏHÕœiI8(="·¨d”®Ì:€‘¬ë¾V!º#Þ‚M‹9ßF’®Fø+LÎ,*Í}yZ³ ‰Aa•žFYâJŒï6T@¼e´½SºÒƒÏÞeÔ3¬™ RT ï›sÿŠˆ*¥‹‡`ê—æhŸ¥UÛL°·:ââ>lö†§Œ^­ÿ%Œ¨ávLН…59AL|_nØŠw{:Ÿ=oì®^•ã¥#t÷b_ü$‡NÇÒ1±ñy0,ÈY¦ë9]~,ChæŽ~½Aú¬7ðá9Yzb‘××W}‹bÿ²FôÔª tD#‹OÅÓÂ4ÌŠž ë5sºGÏð+'­ß¦ C¹º,¥y¤R4vû0olå‰zæ:LhPÉâãE•téáŸâ!ImLœ:ãž8ò¸z|¬\˜öÓdD#×^[-}vöÜ©gúUí¬3ÊRªYk×S©VÚi¨Î³GzU[€ãXý91ÀRD„gSÃ3°ôsb€Õ Tv†§‚˜`&ìÅ0bb€™Ì„˜`&¼; û“fÀY䵨£3½<[’¦³dÎyžÜ»ÏÀÛíåþaÛ^öês_Ò N.ÒÔéqŽ˜XÜŸx€\èÇçø]*Ùog:k ƒ;÷w·ì¹ëk¸»tYì /5a7_²ìÏÓO‹û㉗%¼©“…÷§é^Ié|Õý¬¥f.½b.¥˜£Q‘.ê¯È×±d‘LGd¤Qé³Êøz5]É¢•r.'Zlž~vMV²ë©êzæ&˜á|y ”|‰J|¡//zâΊ5-ãr›lV‘š} «ÇÄéÞlqvü}kø¯¿¸D·®öûY{M㳨§EºX®(¾RSd‘Eb7½OKÆc”› F+在^®y(±ÇJEAÛ¼º·íåþŸK|mX迊ü´Ôa׳˜NWÀ×´º½aìaALܼ?1¬åÄØŠ]Ùoœ›uÒZUaQAÿˆDÒaúì{åc%‘ÝMç#݉OÅù)¹Öòkº[…¥cbö'¾0S.gcvßT«À²Âtr¡UU—±mm Ý$B0×A64>MÃùö'öÁñýz}”è$*ѦÒúQWÆë¦×'ìS´ëô3v“žŠy5ÂÏ¢ž•rßr ˆ#‰%Æa*}êÍ]é k”›!éQ FŠÍÓY·½=b ­§±Ø§“ŽE4´¨Pœ6þƒe‚IJ¾Ün«Í¢£½Ý^|M¿:}ÿœ~çl´¼x©É2KQ§ÎxôþĸÞÅI¯€öÙŸ¹dìüL.WM‘né9ª£X xGbQÉRnTuy²+olÞ/ÈXÞfäôƒ‹k½‚~‹Óг¾.~½ÉUê¶ýÀt°w;k cõçÄpIîq†Ëðä0N ®™¥ŸÃI)ÞTvÆUpm˜ 'ånÖˆ‰fÂ^L3!&˜ 11ÀLˆ‰frÍw§¹ ôæ–Ÿ‡\à½ÁN"›\Ø ¹rÄWKÒT•™(U~¤é¦³T'X™sÄÄaÒéÞÈUÎ%hµÿÊ-wæˆ9˜RAŶWÅ›Âh“æÚ³6ÅIJ"†$—ÁXy¤é¦sÉAÁœ &ŽœnU2j=ÝZ˜Ðεž6Þñ+ÚS î¢Ò:(Ã1&º{0¦W´H; ++Ý*²Ššç*wöÙ“Ã2{4“£ÏJŠI•1V ³­Û´gQI1¥e._fñró†±zL¼×ÞbëO§æN\M³¿ŠÒÃØ==Ä•ÈD\·°D´g›ôðŠ™þ[5Ò¨‰]zŸö &Jq×I]HÑ¢tû>ÂtÆ ¦Œ=*Tš+z>ÃJìÂÒ1±â†wÜ©x½O§ôÚ×óÀؾ¦wjÒá¤^äÎÛæíþ´²JzOŸ×c/Óíe®œgUúǃ‘ÄÄéþă7I o®ÓíN'‘vø$ˆÁÍ0ƒÌµü3÷N&š.÷ @?KÇÄâ#á*7œ qv}ª:¼äk¢Uìkì±»y'Jïg}xx 9η?± âcÑ%çV>ÓrýMý´‰ÚF…^–¿ ¤ÒÓp0§ÒYHM§$c•ArG9Õ'•. ÚÌ[‹3Ä>vQºQPó+J‰þ õÜ‚=zsgGîä*Zé Ó‰cׯÑLS V°è¹Î­,KmLœ:ã÷'ÎÍû¨\¬¦ŸÞö¶i…¶’¡§h½bö¯Š•ÃWÕ­RX+½³Oc‰EJúUú¡Øýä:ÂtFYµ§ÛÃpë?'¸6ä˜ 11ÀLˆ‰fBL 0bb€™Ìdé[Íþ¯7·4Ê…s‰-ÓÊbœª›çTM+çLUšÒÜØ•á4ŒÎÂêωߟt" G©z#³‹‡#¬)6×ûk*ªF=¤Ís#›‹äÆ.¶òåºAàÔ,ýœ8ç†ïÑð ûƒÝVÑ·iåÔ߈N(õ‹¹æýôýœž9)é¢7àbœ &N÷'~}}}}}µ¬NïBÁX‚Ø—-à^"†•aÍhùwµ£fjÅgÏ ŽzX:&nÛ“8$÷Íyß*º{‹¥Ž©¢Œ]ÏèÝÃ⢷c©àœœãÝé}sb—_ýK˕׸—¶zÚ6š KGঅÞKé[Ò:õh¥Gs&‘X¹h¨hì.™uÅ•yæ'À8Á»ÓnÉý‰!E\GÍ}«W.–w6·WSÔ¶ëP¬S5kç-,Îêωçv»ñú ô°ôsâõ!€Nˆ‰fÂ^L3!&˜ 11ÀLˆ‰frÍw§ÙŸx<×H7ÁþÄ0žsÄÄbŠé\Þé\Rbû•<…be®žîq3¢“þÆ:7sìÍ;`"<''ˆ‰«Üp„žI‘ý‰ânÒ4echaö'N»U†Ó0"8 «ÇÄâÞ B„[˜”ر?ñÁØ÷ûûžkGgaé˜x/7¬SôÁìO܉Åæþ›‹N(õ‹émôýœž9)ìO pyN§û‹…ÇF0– "¶€]š³?ñj#€–މÅý‰«6-fâ)T™—ý‰-°?1À…Y=&nàj܉ÅEåþ-›pK%ÿ™}–ª–3{¸*›#ñp›»`µ6íSl^Ô_Ñ3”IÏMaââê´øô×^0ñ°‘Ñû¿¾¾*[ À³1zâôÏþaΙ=f2zu઼÷Ío§…?ù»¿Õ[ìCêt‹nØá‰v$t½7ìðÄûrwÀF7ìðÄ»cwÃO 0<1ÀLðÄ3á÷Ä]ä¶v0‚'hçþßÙCì‰?ùÁwöØLÏFSè÷›žøã?îìªxðÄD¥ƒáÝi€™|Áu¿ôÍÜ~ï÷~o¶ÏËÿ:é2çIEND®B`‚PythonCard-0.8.2/docs/html/images/shellfig4.png0000644000076500007650000001753007462042505021254 0ustar alexalex00000000000000‰PNG  IHDRúƒÃ8Ò@sBIT|dˆIDATxœíÝ1ŒåHz`¶,8¸à 6IŒ×wr°º[l°áéÎ6œÐa\8ÊF°NÚp!tï®-À&° n°Cçí`Ä6»Èª"«^±Øß4ØïYä#_¿¿ÿb½ª«÷ïîî¿~ýzøù×o‡·o^Àyüî»»»GO¼xù²Ñ¡¥ýnèÉyðúô;­¨'˜Ñ¾~û.øüÕp5þòô¹O„Ÿ†áêêésë>©æÑNV÷Ú×ÒþB¯ai­wáu„ÎÍÒþš_‹Zõ^ú׸µêͼÆÍÎM­zôþßú>­Uï‘Þÿ[¯E­z;ù,Zz )þå¿z/£€3[Í耶^~öûYëòâåðõW¿zxœèÿñ·ýðû¿ÿÓ‡ßÿá75üè?K®çïþÛþý¿ûK`Yj'ùÐzÉþû×ß~ÿφaøpá~ûWÃðÓÈV@K›ïÑO3z ¾/¾|5|ñå«ÅÇ!EïÑÿò7¿†axÔŒÿ÷¿þˇß?û“ÿPrwð¬¼}óúIpj›èÿôû¶x~>ù1Àÿò7¿~ô'?~ùë_< îÿë¿ì`‡1Ø¿Çdeôk÷è—:ãM3z`ŸyÓ}±Œ~+<”1ÏäÇfüµ`¿©×ýVšî`»y@/Út¼G•o¼O?ä ßžÉæ6ߣŸúá~úè¹ýàgÿ„‚û8HŽÁr`Ý'/öMo\8°ép¶[˜ÔNl5£ÿÉ/.uÀ)Üg>Ô&£€‹Þ£ßÓÓ¸¼Ÿ¼zõ¿“:ãýüë·U(cþÝúä^÷···¥¥¨ï}ï{­šû›¿øóGÝ£€èàÄzª¸º¹ þÀeu32Þõõõ0 ñ¾WWOƒÊý}¹ïðŽõ—¬së1l=޽ÛÏëÊ­cøïožn;ÿÇ ´ÎV5ëÞr kû¿º¹Út|{Ïoê9Úz|©–êO=kõ¦l‰ó¿T¾÷¼.ícþ|h½Ð:[ß#9Ç–Z«7u›Úïߥ}„ŸÚÇÑM ¿½½}ökîïÜ`´¶þX+¥_Û–@ÝÇäÍ=£ç>^zn«ù×%þاR_o­úcç7åü×n¡Y«?åõÄê>Òù¯ùþ Õ;îóuS®õž÷CÍó³ôÚÖÖO9ÆÒö~ölÙ®›@_Ê<›]zœ’õ.e÷óæu¾¯œ@»7(—nÝxòÚÿùmÞt?¾1[dÐkBKNÆ»”ñ¬í/u-ççwÏñí­?'[ ­_êüo­?uÿ—þtíX¦BÇ•sœ%ÎOеV”²½­Fc¹ÛNßW¡÷ØÖã{v~žñÇ/™®³ô{hݱþØ6)öfã5²ùœŒyéC£eóznÆ[2û+í(Á¢–½¯¯õùoy}¦§kÍùãs¥¥4³—ÊxçcÿHáº,}æÄŽo©ì´¾ä}èÖ™õƒ|ÖþWî¿ÖlºOQ¢ù/e‚üv±×{í{ÏÏÞú|}.ñ÷Köìó¨ç5Gé×pÚ@¿ĦY{뀷őƒ|¬é>ôøhj› ¿L¾Œ#CÈQÎÏ™øz]‚–ïæBé–Ö •¥n¿Õ´‰)t_¾TÓ÷ؼµW‰•½‘Jºtǹµã¨±ïÔ×·´ÿÚï¿XýG¹>Kb×-Ô´Ÿûþ•ï=?5þ¦Ž,åøºÈè§½íc_³›v¦KÍê—ʦ—êŸ?õÊÏÙ>ÅÞà\ó—”ûó¹$Kxëý»é2¥Àt½÷0S>ìæ¿çìcÏùMy}©Ç·ç¶ÆZý{?x[žÿ”òš¦ïÿéµÝÅþFr;ãŶÝóÏWÊ>b×wÏëË9ÎÐþ÷^ŸÅ{÷oß¼¾ww7üüë·ÃÛ7¯‡/_>š±n,;ãX÷=6ÛÍ“‚„@¿{Ÿ>|¹×gŸR­LÎ{­®ÃßüÅŸ?Šå]dô¥©)þlRþ»,½ŽÇõiÏ?\Œže —Å—Óâ\úà:6×gŸçÏ58†£\ñàÄz81NL €èàĺ ô×××?kÆáB?Gqsu3Ü\Ý<ù½7[Ž»Äë­}þŽt}Öö_븎ôúCRŽ/å¸öºR•¸>WW7~xªÄÀdG‰=]úëëëáöööá'ìÇêæ¿SÖÍýM•mzý®aí|-•9‰ï³ ïß3ûýýÍÃO•˜Oä(ñ§‹ïÑçŒÊ·tR§SÂNŸ[z¼6_üÚ·©¦2óœéõÍý‡ÿØ­?û •Û-•Ï× m3/[ªcn­ÎÐzÁãícåü•°õúäž¿”úŸÛJyÊù fÀóuvœßy†8 $Ó²ûû›GA'ÇžãÛòþ-õ÷Ú~©ŽÕcÜðúç×e~-–Ö+uý柭KÓt§ !ž2Ly¨,ÅÚ̧±ø0ÝvËñ­½¾ÔóÒE Ÿ³û­Rç£ß:ßü^Ñ•Yùü¹‡¦YðyR{ØÏÃþfA-åøWyåxŽ&åCíüE¯_¤þqke«×naÿ¥Ì?øÇ¦áññ48ŒÏ_ºéxËûw©|þ\ôï/rþcõï1½&ÓÇS5¯ßü³5¸bŸ¯¡Ïç¥uמ‹ç¸]ì5„ŽomŸ{^ßÖó7 ú½A>ÇÚcï=—œÿÆ·þïý`(hç™m‰ú[fókë¦ÊT¬3ÞÚ>¶ÈmÚË-Ÿ®·©£VFg¢¥ÎjÓ²”:rÕœ‚8¥3ÖRyÊ:±ÎŒ¹ûÈ=¾½R;s…ÊKÈíì+Ϲ~©]·Ö¿ÇÚ½ô-ñBåëûOï\ö¸þåŽlóòÔuRs¾}jgîµýo}}©çožNSÛE OQr>úÞç©OmнT“í¥›†—¾-ð˜~Xï¬1–õì§_¯ZËä/q ÜsìñÚÔð,}jÆ%eò z*_Rï× ¤.:ãÛôpb=œ˜@'&ÐÀ‰uÓë~:hÎÑ¿ÓGÑE  »ìcßß[=é¢é>w>úµqÎ÷–@OºÈèGcó},ðÇæÞ[½è"£ÝÞÞ···É³×ÉîxîºÊès¹_Às×EFŸ;ÿü˜…¯MO»§zÑEF?o®_»G/‹€ºôÃÞó>¤÷–@Oºhº¶èàÄz81NL €èàÄz8±îýõõuöHyð\uè׿¡Å& Ù[=é*Ч0c|ÔM OÉæG÷÷÷»F9ô¢‹@Ÿä§d÷u~úi°5Çï-€£ë&Ðoá~=Ï]M÷)ÍõSã=öµ©h÷”@/ºÈèoooûµf{Y<|ÔE †ôïÍ›>ê¢éØF €èàÄz81NL €èàĺùý0 ɃætèS'²12|ÔEÓ}jóÑÀTWý(ôÇŒ|);ß[½è&Лòuè·p¿€çî”>–…ï-€^tèÍGÛtè‡Á|ô°E_¯¶èàÄz81NL €èàÄz8±.¾G?,gtôù诮n†a†ûû›¦Çräc ¬.ý0<ÔfÉQFÆD8‚.}NöÞzƺ1[þXßMðù§û½y´ÎôñüŸ†¥}ÌËBuLË·föãùù¸ŸûÕòÐ:\Fw÷èS¦¨½¿¿°K—¯ïû&8§Ï…~¿ººy°cÁ9T¾TÇÒ¾·ùñü„ÎS¨€vºÈè·jÝïQ¢é¬ã’·Bÿ öíœ:Ðå~ýsjÊwÚèªé>¥Ù~>–µà²·üb÷ôº¯-·;¨çt}ë,~4s‚hJg¼ñùµûòóßC÷é§uä4í§4Íkº8Ž®}J6ßz>úÔ ¹Ô9o)€§îcËþs­#AàXºjº?»y6~Éæ{Ω«Œþì ²@i2z81NL €èàÄz8±nzÝO§¦=ú\ôÃpì9ß|l”ÕE Ÿ}»6në‘ñF‚(GÐE ÏÑzƺç8ý‡:îŸ”Í‡Ë ­3/ ¬.îÑßÞÞ×××?æ£?Ö|ôë¿_]š¯಺Èèsšî§Zg÷{u>ú½óÍ›¯಺ô[å~ýÙÄæ›ƒùt™³=åtÑtŸË|ôõöµw¾yóÕ\Výx~úxIë,þìóѨ7Þô¾”ͧn@]úaHÿî¼ùèó÷ŸcÿùÔ.©›@ÿ”øêÛhž8þ@z ê!²v€ã8eg<àNL €èàÄz8±nzÝ÷0}«qñ)ffiúÔž9ðl±×ªõ¨š0×E ïe>ú­3ÞqY¹ïÞ®éÚë XX20íoàl¯‡ç©‹@Ÿã(3Ö…æa_*ËÙßÚÔº9ǵ¶ßÐñ­¾PÙRý)ûO} Kõ¤ßÒõ‰M³´¯ÐãÐ>bå©Ç;¿k￘XkFìý«gíú•©MªVÙ}îº9&{3úÜõCÙmÊñÆê¯ÙT|„ç=¯¿ÄùÍÙ~-Pn=ŽÔ¿›¥ýÕΆsÞÿGx?Á]úažÜ£O‘{/6·¼…Ödz”QIës´WËã/u}H8Žî¾^·Öo´ÖôW¢<¦D†~$kÇXëøÇk²^‰}r[z¿~%¶]keŠm_ûüí­¿‡ë 1]dô9_­k™Å§t$ŠÝC¼”Ôã‹•/ÝSuhJíð4—z6´ÝÚ6±},•Ï_ÿøüÚ=ðµòØñO·Ÿïoí>õÖýÏ__ìý:ö鹊]¯-çgëõ =Îís=è"Ðç|o~ï½á=Ìó¤û(eÏñ…>X÷Ö‘S^â–<¾Ôë^âØRÎý–çsö±÷øöþm䮳v}RŽoí\Æ:ÂtèÏ&–‘\bßµ>Œbõ—ØËóÇ~®\–@ß@˶ֽ™Kì_`èÛ™®ß–Ö,¸´î:ãéz81NL €èàÄÕë~'ô½ùæ£?»-ãþÐÖ¡2ú¥>{;þ¬u¿wÈMC^.à/Ã{(éP} óá/K—§ ¡¹6Lè|xÓù6óß÷g©ÙïÖ†ˆ]â4u­Ï_ʯµ¶ ª?´Àèt~†à|Éò5± ´6dæÒ¸ÜÓÀ{;ç8K„Ðk\:–-A¾åù‹ iZ{û¥aUc¯`É)ýèÙý–íRÆN/5|ì–úr×݈ŽvþR¶Oy½{ÞO†rœ:ÐÇ2ݽå=:Ûë9¢K3|Æ÷)PΡ:ã•›Vroù–ã9“œ×³´îxŽKïïŒBÓ¸¤:LF?íI?ÿšÝ¼§ýÚ×ëZgñ±¦ÕµòÐÌn±Yàæõ×êH6ߨ,'8µ>±ýÏ÷1¼ôz—Ž1tÌkçw~ì¡r€©ÃúØwãS¿;ûÐÛ[^óæÏ¯Ýknñážrï;VVbûÚç/§l­3çÖí·<°ä0ž4¡ ðhŽœqöpþJè;ÓCp:ò1ùØj8eg<àNL €èàÄz8±CúëëëÅ)h×ÊŽèêêf¸ººi}AG>6Ê:T _'uÀœØ(l{ËSÝßß ÷÷7EꀭN÷=úÖ3ÖÍ3å1ØÇ2èûûÇYöôñü†¥}ÌËBuLË—ê‰ ˆc¾t€ã8TF_ÊÚ˜ã%Ê×÷Îä§Ï…~¿ººy°cÁ9T¾TÇÒ¾·ùñü„ÎS¨€vN—ÑOµÎî÷(Ñì?ÖqÉ[æK8–SúÖ3Ù=WæK8ŽS6Ým>ú-.Ù+¾ä¾Ì—p,‡Éè׿£_+›kÅσfNMéŒ7>¿v_~þ{è>ý´Žœ¦ý”¦yM÷Çq˜@_â«uÃÐ~>úÔ ¹Ô9o)€§îcËþsí‹€Ë9eÓ}¯æÙ¸AmØë0=—íÀó £€è;¢G;¹z81NL €;T¯ûµÁp¦ƒæä|¯ž³CeôKüúúz¸½½}ø™ý¹£ÌGGp¨Œ~IîÈx­g¬3_;GÑE Ÿ³û5cÐ\·~oùšÐ6Óç–Ê †®}JŸ:Bv¿Vçô9¨¡›@Ÿ䇡ýLvKÌ×À¥ª3Þ’y_ëŒ7 Çž>µ™~<Øã0}lÎùXpµÎâÍ×À‘&Пe>úX©õ þ”ÐEÓ=°@'&ÐÀ‰æ=-õ¸×ŸaЇH'ÐÙÍMë# ²·ßùý¬õ¿øòU¥#ÎJ ‡Æ^¼|™´Þׯ_W>àŒz8€www­8)ñàÄúxÿãO‡÷?þ´õap@ý |ò·¿ºÈ~ü3q9:Ý¥¸Gß‘y  øé:óòµíDzOþöWÁ:ÆçÖê§Œ1Èñå«áíð€}úN¼ÿñ§ÁÀ=ÖKcÛ>´Þ´\p¯kžÉ öÀ^}'æ™öÒ:%öC;‚:Pš@߉¥ŒÖèŒ×©P¿tà÷ÀñÉè;ê$7ÿZÝRGºPÙ¼<¥³ÝZýlgÄ; &¾#¡À[§DÙ–õHãkt@m=4”ÛùÎ?@.3© P“@`R þÀôj??¨Í×ëàÄz81NL €èàÄôºïÈ'/ßúý»»Åò÷ïî†O^¼|´NNy¬þÐ:±r.O ïÄ<(ÏŸ‹íÜòXýó:bå´!ÐwbÌÀsÖÏ-_«?´ÿi±r–ñ¨I ïÄ%2æÜæÇ+ç)c×µ ôJ ò±@›ˆKÖÅGïßÝ ïîî†/_&/Ýrô˜7Ç»·i}éÖÀžÎz\n7d.K ïÈu¦;€‘ïÑCC2z 6’ѵ ôÐŒ¨M ‡†dô@m=4$£jè¡!=P›@ ÉèÚú“Ñ¡2z 6þdbÃÔr,2z 6#ãudϳã¶óat×꟯³¶ÿ±l:”®Ñòâdô@m}'bóÅÇŒxiý­óÍÏÍÇÞÏ=¾çJFÔ&Ðw"w>úõo™W`Ï#£jè;Ñb>úØ|óì'£jÓ¯S%‚ü¼ižË“ѵÉè;›~Â{mÎùœùäS櫟ס NFÔ&Ðwdï|ôkëìÙ6w>’ѵiº§ˆÐ×÷ˆ“ѵÉè)B&¿Œ¨MF ÉèÚzhHFÔ&ÐCC2z 6’ѵ ôÐŒ¨M ?‰Üyè×Ö÷¹Ë‘ѵ ô'‘ûõ¶µõ}Uîrdô@m¾Gߑи¡ ¼4|lxÚ”áqcÃè’GFÔ&ÐwbÔךÝCóÁ§l3Z6[Ÿýdô@mšî;õþÝ]0à¦á­ÁZ/KFÔ&ÐCC2z 6¾c{zÇëY 2z 6÷è;š>tÏ}¼‡>¼w>ûÐìtšñ÷“ѵ ôÉùJ\Êýûœùìõ:dô@mšî¡!=P›@ ÉèÚzhHFÔ&ÐCC2z 6’ѵ ôÐŒ¨M ‡†dô@mýIäÎGßÛþÎJFÔ&Пĥ´1€N2z 6#ãudë|ôó¹äS§®ÍÏž|2z 6¾{棟k ü¡rç³'ŸŒ¨MÓ}§¶ÌG?-Û›‘ËèËѵ ôÐŒ¨M ïXËæsM÷eÈèÚÜ£ïÄžùè§ë,ÝsÕŸ2Ÿ=ùdô@m}GöÎG*˹oŸ³ÒÈèÚ4ÝCC2z 6’ѵ ôÐŒ¨M ‡†dô@m=4$£jè¡!=P›@ ÉèÚú“1O|_dô@mýÉĦ/2z 6#ãu$u>ú”íÇ:ÖÊçëĶ'ŸŒ¨M ïÄÞùàs盟ï#¶=ÛÈèÚúN•°±Im†ÁŒu5ÈèÚzÄ2vÙ{y2z 6ñ:V2Ö­·!£j“Ñw"·i}ü}\gKÓ|l¾úPä‘ѵ ôÉ/>§<%` êåÉèÚ4ÝCC2z 6’ѵ ôÐŒ¨M ‡†dô@m=4$£jè¡!=P›@ ÉèÚz‚Öæµ7Š^92z 6ž ½ƒëFFÔfd¼Ž¬ÍG?òvíñ¼ž¥úcû•­ÕÏS2z 6¾±ùèC6ôxiù”ùîçÿ4„öoŽú<2z 6M÷zÿînS@MÝfk°äóÈèÚzhHFÔ&Ðwl­÷ûÞžñzÖ_†Œ¨Í=úN¤Ì'?]g~Ï||~©£\Ê=ýµùîcõ&£jè;’;güÒï©õÇçOÉèÚ4ÝCC2z 6’ѵ ôÐŒ¨M ‡†dô@m=4$£jè¡!=P›@ ÉèÚ|¾Sók¶l»uû-öï™ÉèÚdôÚ0Ç‘î¶NŠ«{‰&£j“Ñw$g¾øù:¡ák§ë„æ“_šs~­þ”ÖÙýG2z 6¾±ùâCóÀOŸ›ôP€]Û~m»yý)sÑÇê|ndô@m}§B“Ü”˜qn)ð†öW²þçJFÔ&ПHÍ º”ѳŒ¨Mg¼Nµ²)ûo}Œ=ѵÉè;›/~©i}m.ùiy¬,e¾úÐ:ózÇõçŸ+=P›@ß‘KÌŸSÇR§¾­Û>G2z 6M÷ ÃþzõÉèÚdô à ÃnEFÔ&£‡†dô@m=4$£jè¡!=P›@ ÉèÚzhHFÔ&Ðwj¬†¾ÉèÚúNù:Ü9ÈèÚ|¾#)C׆旟?6üqÈèÚdô˜Ži×>uxÜØØø\–Œ¨M ïÔÖl\,2z 6’ѵ ôŠ5»k–¨Mg¼NäÎ*†õ}\žŒ¨M ïHî|ð9óÅÓ†Œ¨MÓý3a¾ùc’ѵÉèŸ ™ü1ÉèÚdôÐŒ¨M ‡†dô@m=44fè©K},€\îÑCc©Yúׯ_W>àŒz8÷ÞZúNÕ˜Î`:çã}§JâØìxôIFß‘šóÑËàá‹/_=yîí÷æíþÅçŸ}zóí7ß ÿýÝÿ>ÿìÓá;ßýîðí7ß<¬0–}úòÅðÿþï·É?Ÿ}þEp›Ï>ÿbøO¯¾þÏ»ÿ1üÁüëbË_ÿ×ÿ2üÞï]fùÇ/þpøÎw¿;¼»»{X~õÕÍðÇ/þpøê«›‡ÇcùôùØã±žyýÓe¬Ü²ÌòÛo¾yX¾xùòá:M—/^¾¾ýæ›áÓÏ?x¾õûÓÒÒò2Ëÿý?ÿ)ëçßüÑ¿}˳2ú-½ƒ§ÛŒÏo$ÄÒÒÒÒÒò¹.scïTvÓý»»ü&Þù6G8i––––––G_£&ñŽpò,-----¾,aw uŠ9Âɳ´´´´´<ú²DÜÝè·ùaÑ[ZZZZZ¦,KÄßÍ~k½¥¥¥¥¥eʲDÞè÷|·÷'ÏÒÒÒÒÒòèËqxWÓýÖ`„“giiiiiyôe‰ø»»3Þ–`„“giiiiiyôe‰¸ÛäëuG8y––––––G_–5`Ζù°CÛáäYZZZZZö°Ü{§’ý–^öKÛ´>i––––––=,÷|ÃmtõöÍëûwwwÃÏ¿~;¼}óú¡òѸC ÓXÍèòjÿ@Ñ@?Í4éu\ÆïÈØ༮†a¸¼}óZS=œÈÕý0Ü_ÝÿóoÃUëã úÿr-òøDIEND®B`‚PythonCard-0.8.2/docs/html/images/shellfig5.png0000644000076500007650000002010107462042505021241 0ustar alexalex00000000000000‰PNG  IHDRXpdqsBIT|dˆøIDATxœíÝ1ŒíÊy`[R¦páÂE jÜ&ÀMuWr#[¯TñJÙNñÊW¦Ó> Å+¯ºË·\)ÄrÉû€7@Ü"T¤T¡Â¥û“â™+.wÈr~rÎù>`1{vÈ™á‡çßáòô›OÏÞ¿ï¾þðØ=>¼ï¨óO?¾øÃ›·owj ÀuøNêã  €r°w®Mr«÷áñÓdÞ©;õ¿LçòO©…ÿe™©¼Ó·™óm(©ç4“×/ršièŽÉºrõä¶µ¤žÊ>íº‚mM´cñ¶–Ô³qŸ>¯· O'ë:xŸ>¯· O'ë:xŸ·aÔŽ¦·µ¤ž‚sÑûôEy…}:™×»O_•Wùvä>}U^ågØÅútf[sþÕÿÆ@´Ù,€[ôö³½hùï¾yÛ}øOÿýùõ¢ëþñïžÿËïýõóï¿üõÏ»¿üþ_§VIúo¿úÏÝgþžS€£)ýÒ_j¹âëþñﺿøÞ_½x= ²øÖê9X‚+à|þÅ—Ýç_|9ù:%tÖ/ýó®ëºî‡ßÿ›ç¿ýý¯þöùw—€Ö<>¼Tåž~S`ýÅ÷þjrV×½œ‡õË_ÿ¼ûá÷ÿ¦ûû_ÿm÷Ã?l ²€ÖôAVÿ{΢¬¹9XS“܇#X-_" ÁZk8‚5wã9€#\õ— 炬Õß"\Ãm€ÖŒ©ÐK„¹9X)ý<¬žà hEé}°RVÏÁ^îÏ¿~‹0u‰°´\À}÷ÍÛªõ=*`døØ›5<ì ØìÖ?s©vÔyáߌ`„ËÎÁª™Ap+~üå—ÏqSÑ$÷¯?܆©üþõ’úJ–YÛO—èßšöÕ–¿dtbíHAÉö­-¿´þ£\V÷EêÃ}ɱÑ?%–¼Çy¹e–´aéöŒÏ+©sS®}¹óWÎ%Î!sçΚé%ãmÎõáÒº—öM3#XQÆ#\¹×S†ËLýžZ¶/?·N‰Úѧ-F¯–ŒM¬k.?ÔZ:Âséð‘Êß[íöíÝÿ{îŸáû4uIp¼l´’K,Q#<ãשK¡Ã¼#ì—©sN®}[_¨5ÊmÇÒýQ{<§ú|n”ûj..9Ï(e#W‹êŸxÓá="5U‡àj½Üö•Œ@ÕôOmùGÞ?—xÿåþ«©ó¨ýºDí?­‹Ø‡[C¥å^m€5< G©ö4Ö8rp•~½ä¼“[·MpUÇÈUŒ#´!å(ýÓ*}w77k='µ¥&©O-75?¬dýµ†C¿©aà¨Klµó#¦Ú³¶ŒµõEÿ·¹uùKÚ±EÝ¥Û77?eËã/WþQöÏ”Ü~›š³¸¤ü\~mÿlñž:²£·ïš,íë&F°†ßÌÝ®a8¼tk*oøzªüñëÔ· —¬_¢6(Ú2`,™µô^;á9U÷Ô5ô© Æã95í(ùÿ¾¤Žšþ-Ù¾ÒöÕ\>+¿öeÏþ/ÉßÒðøîëÔ<Ÿ^î=²t’{nÝš ·¤ŽÜþ­Ù¾%íLÕ_»rç¯\ý[6ä.¯9róÕÆŸQ%íÏ+í·ÓãÃû󧻯?? ºëº®Ï»Æg¶xyðh^ˆXÕu^ø¤À2öO¨QUý¿¿÷CI›[Ü®KøÅÏ~ú"†ºÉK„kn@™ñS—¨‡ã±ö·ÕeZn—ãi™&.F3jg¾ôá}löOˆþ³Ž¡ÅýPòíÜ·k79‚°%@0@0@0@°f¬»»»çŸ9ý-R?GqºïîO÷¯~oÍšvGlïÖýw¤ý3WÿVí:Òö§”´¯¤ÝGÛ®RûçtºñÃk7t>ÚgÏ­¶ûHš°îî§§çŸ\ÕßQ}ü;±îÏ÷›¬Óêßæúk*Oÿg+ŽßkÐTçóýó¯E<ïõˆŸ?¥ÓÑÚÝ¢&ä.òSEÿ÷ñ#p¦^š{N©áÉ}|¢~@ÞŸ¿ýõÅò£ÐT^¿ÞTþx™Ô:㼩2ÆæÊL-—l®Ž™þ‹°vÿ,í¿’ò_µm&¿¤ÿ’#>ãe*úw<"2üæÏ÷/>ì—¨ißšã7êý—ZªŒÙ6®Øþñ~ï‹©å¢ößøÜ:<'Ï=5•Wò8³T^‰©r§êŸª{Mûæ¶/²ÿrÛ8÷(¹q;Sy¹õoEÖP?šµÖxÇO½ž:€SMä”=™òÇ{þ@}è¿ÊϽNÔó\ß(˜(iÿl›gÚs4%¶sý—Ý™òû:æòf÷ÝDýQƸý%¨þõðC¹ÿû¥/Q­9~§òÇ˾ÿ2ýŸ+¿ÆpŸ _m¹ÿÆçÖTÀ;¿¦ÎÏSËÎý-×Î~½Ü6¤Ú7WgÍöEö_î9½S†#s¥ÛtËVSVmpµDî «±ä¿Ïµ'ÖÚrT€3ɉ(ÏÑ«¹eKþÞuËš©þ[+U^äèÕÃí%.Õ¾©òKöÇÜq±d3Wöžÿˆ¬ÝÃsëÚÞ-Ïϵõo]þ\ÿG¾ör«ÕX3Vdp•‹øKÖoÙp”ãÈ£E×jïþÞj„äVDÿóòjÔ̾¨Òúù¹ÆÔhûhj’ûðõ-iyÒrDÛ×}KêrßÞÙrÿD÷_ËÇÒ^BGõ?TrÜ#»• ïôøðþüéãÇîëÝãÃûîÍ۷ݧŸèó.ui.%PÛóîÝ»¯ç&ñ —™ºN>TòAäMK/!,Í.·jô‚IºS“À‡y%e,µåuÿ’IÎSù%Ëä¾$°´Ž¥í«U:I:•aé$ò\þ’ýWú%’µåט›+µf’{*¾þòIÛ/ËŸžÀ=Î/]¦´ãõK¿$5WÿÚí[Ó%“ñç&¹§ò‡ë—äMÕ#¿øÙO_ÄPMX%ÆV‰%[RzÉçR—†.} jîÍ[XÍÌÁŠ47<9ük‹ÐïéÏ\]¢ ϯw˜SÒâ¾àzÜd€µö+ª-(¹Úá›W—Ôú> }MLrh‰ ˜ ˜ ˜ X3ß"Þlôè÷än[VêQ9SAVîþUµù9M\"\2bÕßâî‘5ù9MŒ`õúË„¹€kø ¤ÔhTm>Àœ&F°zOOOÝÓÓSòáÏ)F³€=45‚µ”ùXÀšÁ*±êõ£NSÁQm>Àœ&F°Æ—çæ`µöÖD€Õuåß$ÌGµù9M\"h‰ ˜ ˜ ˜ ˜ ˜ XsÖÝÝÝâ;»\RSÖÝÝ]ö†£¹3׿ä4`•8ŸÏÏÏÜ" §™«dôªw>ŸŸ¥-òæ4`- ®†Œf{hæaÏã‰í¥ó±æÞ\›ÒD€5¤rÁU?â4ÕæÌiâáP?’5u«†~Ôi.xªÉÈibk(wY0Õæä47‚pt,€`,€`,€`,€`,€`,€`ÍÜk|cÑ5Ï&¸„f¬®+ ª<ØÛÕ]"<ŸÏÝétz~ž`t>@NSÖÝÝÝä3‡úg ÎQ5ùsš¹D8¼°‡&.–\êçPMGµùsšÁzzzzdÍ]4jì­‰«ëÊï{• Žjórš¸DÐ@0@0@0@0@0@°fîƒÕu]ñÍFöÔL€Uú€gwröÖÄ%ÂÒàªë¾½{ÿ,Á-òršÁêå‚­~jj4ª6`N3Ö0¨*ÑêG£úߣóRš °Ö0 ØÃUX¹Q§Ú|€9MXOOOÅs°ŒZ{k"Àêºòû^å‚£Ú|€œ&nÓÐ@0@0@0@0@0@°&îƒ5¼Éh¯ô¾X{9î»®ëºóù~×v¤¹mp š°ºîõÞ§åN]MXKF«Îçóì³kósúѡߗwŸüûëzï_,3|=Ö¦êç¥Êæ¯Éêûç÷õœgóSËÀ5knÖÝÝ]6à:ŸÏ/¥èüùºï“Ëðo©ßO§ûWR.(JåO•1U÷šàªïŸT?¥òàÖ41‚µÖÞ£Y5".1öe\òre*0dpk®:À:Ê|¬[“ºd¨¸%M]",¹<Øuß~ Ï}¨×æ_BnÎÖQëZsY®ÍÕ`í=j5V–/%“Üû¿ÏÍ»ÿžš‡5,cÉ%Ä’K€.pëš °JF¯ræµùùúï/7÷-À¥u¬©©¹>L@c—¯Ýxôé’— €8M`];7'€ë` ˜ ˜ ˜ ˜ X3ß"¼»»{þ½ä~X{[sÏK9rÛà4`‘3÷Èœ½ïäÞ¼Àíj"ÀZbø(—T T›Ÿ3¾9hhån:|4Îøõ8X›ªcœ—*£äQ:9©ç ö}5Ì?V'µÌ8®As°žžžº»»»çŸÜ%Âóùœ|f^Tþ|Ý÷É€eêÑ8ÃÀg(å‚¢TþTSu¯ ®úþé^–žMsëÀ5hbkÉ%¡½G³jD\bìˈ¼\Yò°ç-×€4`­u”ùX×fÜ'ã~ꃨaºd}h]——:N³Úµù—pÉ=/©kÍeÓÈõ MŒ`õs°†¯§ì=j5V–/¿_vj’{ÿ÷¹yWãßSó°†eÔNrŸ»¼šÊs‰€k×D€Õuå÷¾Ê}X׿çë¿_¼ÜÜ·—Ö±¦þ%êûG0Àõk&Àº·P8—¸u¬i1˜J1JÀ­»ÊIî{````kæ[„¥7ÝÓ^Ï-$ÞµÞ 5u Èm»¶÷@n{R7ÓÝû)À14`-yØóžwrO=ȘãYz ´¶Oç¶/u‡ýÈ€àÚÞ×¶=Àå4`-1k¶?¢—¬? ¬mGéûfª¾­G–ÿG8ž€ö4`u]÷jV‰¥sm–æïaïöL ÉÞ}TkÏöGí_ pëš»MÃÜ÷ÞÜ%†ˆüœˆ©#™kãVíï÷AÉruõ–Žˆµ¾ÿ"ÖUÍ­¿uÿÕ–ßÂþŽ©‰¬%·hØsÔªd‚nnŽÈ¥”¶/—?5g&7Q¸t"ñXé›Ôzsëäê˜Êoÿ÷¹9Nsù¹ö××77imýãíË©¶û*·¿ÖôÏÚý“z½tNÀ”&¬%÷½ªûSslQG”šö¥>ÐjËX’±#ÛWºß#ÚVÒ÷kþ¾¤ŽÚöÕ¾7–.3·JÚ7×—¹I÷Àíj"Àº6¹ÿÀ/Q÷V¹ò#êß³ÿ¨gÿ·@€µƒ=?PöþvVDý>ÛvMûoÍè-pš›äpt,€`,€`,€`,€`‡úaCÑÔ}¯–Ül”m¬y.#Ü¢C`MNýãqúŸ¹gÖ>šÃ£1¦ ¬.Ã1оC`E?&#:¿DêQs?e¼Îø÷švÎ=7n‰¹GÉL= ¥´Ž½û¯äQ0[­Ÿ{TLªüÔ2ìëꬮ뒬‘ùsrÁÀÜ£5¦ž›6 RÏF[ÒΈâÔ6NµeMpµgÿå}²õúS_Ém?Çr•Vï£YkÖ+y¶]ÔcfÖ”·tÙšàhýW²~ÉöÖO5p|W`åFvjó[tmÛsD—~Ñ5§­;Ô$÷(ãK0ÑùkÚsM–lÏÔ²}G×w†Ûë}ЊÌ` ¿8¾]Ãø›ƒs·iØ{Ô*w g.8Á97¿jnôVR´Çõ§ò–{÷_®þqã×SÛ;ÕÆT›çúwÜöT>û;L€•»·U齯r6µù[¶aü÷¹¹D{|¨–ÌmÊåE¬¿uÿ-É›û’ÄÚõ×ü€c9L€E™ÔˆÇÑy„¥…þ }¬Æ´¹Gn×ã*'¹ìI€L€L€L€ìPÖÝÝÝ‹Š–æÝªþnès7ò\rÇô=¹m°Ö¡¬¹›‰–Þh4÷]›Ã;‡×Þôˆuu÷Á>fdê.Û5ù%r7Úœ{”Ê’²§§’{ŒNÉ£`æú¡výá²@®ÑÕX]÷ò¹os2Y›?'µNîÙxKŸÕ7×¶ñßÇeçÚ×FSm®]nÁUX½#ŒfÍ•9üÛV–>ly¸Þ”’òTܲ«°r#'µùk͵ ¥¶À®2À*™ûS“_Û¶’r£ÚÐʤ}¸&‡ °†·`èï¿98—7¶÷¨UÉ%ÀšK„¹IîãúÇs¢J/QNM”Ÿºä8œoÕ§Ãe[¥€‡ °"nÑÐuù`¥6¿¶ ¥åO-W²þx™Üë¥õ,ÉË-+ðàê>Xìo8â¬s˜,ŽáÒ£IF¯¸FF°‚ °‚¹DxPß|óÍÞM€«õîÝ»MË`Ø»wßÝ» puN§?Ù|°K„ÁXÁXÁXÁLroØW_=<ÿþ“Ÿ|1»ÌTþÞ¾úê!Ûö®»üö•Ô}[nM™ë÷¢¶-º¯jÛXÛGSeöRe—¾§Ž|Ì÷J¶õHçÅ¥u¶²˜&ÀjTé›ï'?ùâʼn¨GؾNn­îßÑýÙW~[_}™SÛ™ËßZTÐPRÎ\þunuþ¸]Ž«1Ã7èÔpKþ‹Zwx2—Q»þpÙ¹²×nßQûføa7µ}ýò©rRy¹õs¼9©ý»dý£È[ã@$˜”Ÿ¹ü’ý—+«@t«°fôèç‡Úþ-Y®KÞÿ¹üÔ¹&W?qX™úPîå>¬§‚šþoýr*¨]ëí;²qߤ®\ÿFìßÈmhQªÇÇoo*,=>û¿ •Œ"Ííï¹ýÛ‚5ç…%ëÖŒÒÕöoÉú¹×5ïï’ÖZ;^Z&Àºrk‡ÂçÞ€%å]ê Üâ%²©“éÚ²R'á)¥#X5—_Jò÷´eÛRû#:ˆ8òñ¾d„´v4k+[÷oí¶á2#eX,æM{l¹¹'l+b„©d„或´í¨#)GlÓÐÑÛÇï¹MÕ;ò»¦¶¯¿Œµe½GèÛ#´a5ý¿d½¥uDì–/ƒ—hýs­KïÏ\}×v|‰¬Æä&yNÍ!éOh¥—0¦&AN]’KM¢.[zB­Ý¾ÜvEZ;ùunÎDnÿ¬Ù¿kÚZ² Ñe/µ¶ÿ§æU _—ÏÃòÆe,™„}üø¼@Ÿ÷ôô´_+ lýTìKûæ›ov{Øó%ÿ»Ü¢®ˆysí:⼑k£ÿëäÞW¹þÕ·Ç`_lg‹‡=ÿâg?}CÁâ…¥#NGÑö¹ò–û¦ú9—ƒÚVû ŽÅÖAí9‚×Ì@nôÏhc,È@±”Û4``3«1-ßder7<Ú½¢–ÖÙú­@nÁ5ßs¬…÷בûßû7ÏVc†wì»s÷÷Â9¾áÙ×<“nßÚ‡G»õã;rû×ì£ú¿•÷ב˜µmkáøˆbë Íݬ.÷¨“ñLs¯Se¤ò×>Ò$×¾½Êß²}KñÙ©e–ôßÒü¾ŸSjškßœ¹òsíËíÿÚã+×¾’í_Zþõ—Ö±fýÖÞ_¹÷Vj™ÜUŽ’ãgîq:%û6wü¯=>"7tQïÏÿñÇŸŸ»®;?>¼?ÿæÓÇóãÃûçŸ>ïéééÐ?׿Ûmú]òçþþ~òõ8/·üÒòû×seŒósõåÚ–«ÿ’åoݾ%ë,ÝKþ¶¶ÌÔ±‘;V––?××kû»f_.]§æøªÝþˆòkŽË­¿ˆ6–.s‰÷×Òã/êø©éŸ’ã¿¦Oד©Ÿ®ëÎÑÆ1”¬F-ù` ¹ÿÖþGQzÉsëÿXrÏq«Yo[µÛ¾¤}{5ëÕ_¥õD”¤K:GkOJô%Úqyså§–_s©³ö}uÔ÷å¥ °5ÒMåµ(5qòh'Ô–û·ëŽßþ£·ok>œ¦9?,ÞMFßIî‹ønný½O^{×Ïr—Þg[?àøèÇà–Û±í[ößÑ÷M­K|iï>Ü¢þ¯¾zØ}»ºÎÞkêaÏs—Œj•N¤OV\3r®ž”©2RåÕ–ŸZ¯fimû¦N s“¬£ó—¶qÉÙTY5“t§ÊšäžZ¿dnÿ÷¥¯SåÏÕ‘j_ªsí/݆µÇÈ–“Ü—¶¯µ÷WjûJÏ?Su—¿¥ëçʨ=>×ômÉ1q‰‡= °j*Àb{†Ô/G_Ãuiå=}‰Ë,~¸…“DkjG/€ãrþ|I€N ÛÒ¿p½¼¿_2É ˜ ˜K„uww·w€•Xýíàr\"&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&À&Àö‡?úì÷¿ûío»ÿñéÿt?úìÝŸüéŸv¿ûíoŸèó~ðöM÷Ïÿô»âŸÏ~ôyrþïögÿ¦ûŸþWXúGtê~õ_ÿ‹T*•J¥Riuúÿ÷ÿ,þù·ÿîß¿Š¡¾³${óömÑrÞ¿O®ÓÿýÍ۷ݧ¥R©T*•J—®y†X]×=W\³Î:O*•J¥R©t*]óôv™ƒµw§I¥R©T*•N¥ª¬Ï¿ørñ:Gè<©T*•J¥ÒTïTXk‚«®3‚%•J¥R©ô¸iDܳ:ÀZ\u,©T*•J¥ÇM#âŸÕÖãCzÖ|‰#tžT*•J¥Ri*ˆª.® ²ŽÐyR©T*•J¥©4"ä¾&È:BçI¥R©T*•¦Òˆxg—Û4¡ó¤R©T*•JSi„E7º[éÒuŽÐyR©T*•J¥©tmÌ3T`­ùÖàÔ:Gè<©T*•J¥ÒTúÝ7õ£X§Ç‡÷çO?v_xìÞ?W0†˜6Œ¡²#X?þrýý®nQ6ÀŽf·Ë·®Ù¡ˆuêºîÜ¿x|xï’ @¥Ó¹ëΧó¿üÖön@óþ?¦ÙùZeôIEND®B`‚PythonCard-0.8.2/docs/html/images/wt1fig1.png0000644000076500007650000003156510302146137020652 0ustar alexalex00000000000000‰PNG  IHDRZ÷c1ñGsBIT|dˆ IDATxœíÝ´%I]ðºË.I4¨¨‡ˆÑ„ ²£» °aŒQ̉H"Æ 9ù3çDXeÅàsPaÔQ““s4ÆŒÉc2þHÞ‹`˜õìÊ.ˆDñ¨‰¿bŒ"j„Ý—?ÞÞ™~=]ÝUÕ]·ûÞûùœ3»÷õ­®ªî¾÷ÝïûvݪՃ÷_;Lêî{î ·†ÂíwÜ5w_vÆùóçCá$Ð !„‡¸o¶Îì¢[æîÀ®ºµ½áÙ/ýWUZ­VÇ!„ðèÏ«õ£UãñI¡OþÓüyÙÿFñUs×û7Ú^5*<Ý¥fGâ}_îPwß[û÷õ=õ8âÇ5AßÃêôy9} å× cÿ¾¾7÷ïî{ä¼Dúžz NÕœòz̽NNÚ÷ÖþÙï«Ø5Èz_ ô½}.üNì{êqÄk‚¾¿òßK~'„„¾·?ìŠÏ|ì/úYF  ’›2Z×}ÉW†ü‹!ü野ÃÃÇ!‡n»å$2½í‘ÿþìÃÇá‘ãþìÏ ½í–ðç~$ÿ¥Ç‡[< }ñ^À°—=룋÷=wî\8<<µÿ?ùö+“ôc]O[4Ðú“?þÓð'üp9áxsÛ*<||>ôpáø‘V·„°z$¼ðiOGïúÝðygŸ~üÚÙð˜'ÿËpÛ»~*¬n}\q‡€ýQò…¼ËW®N¶ÿÔõ4E­w¼úñá÷>ððÉý×ãиßúhz+¬BÇáá‡?^óÜ?òëá‡ïü±p×OþaøÅã:SsýÁCC!<þÌ=UêŸÚ¯¿ý[C!üõçþ³™{rÚ{~òB!<ýó¿uæžLãí?ôŠBÏùß;sO˜Ó™;Ï–yðþkèÉ Ñ@ëOú”‡2«»-\}à8übcËß÷–›J=î©wÖô‡ïþîBóôWfö!ßï¼ãÛoÚöÄÏ~MÕ6íg¾ù¦mO~þ7Vm³†~ìëB!Üùwo>‡°­ÖA[;0‹m‰Ñ !<šº §¾.qê¹õöÇ\ü˜ã‡;kúËŸv\ýñ/_ xï¥ð¸§¾<©ƒµýÎ;ÞBážùuÑoˆLmd=éy¯ëþP¤/JÉx5ë9sçÙpæÎ³×ëÌ ²B ´B8 ¢ŽÃ k­¬ƒ«ÛÂc>üáäÆ?ðÞ“[=õ´“ ëÞó=!„>úÓ_q½Ìÿ]g¶n¿q»ð¼xýñÇ~ÆW_üû¿ø§êÿø;¾&„ÂïÝÿ7µý„g|mRëç¿íÔÏõÙ÷†BøŸ?ûÆBŸt×ׇ߼ï á“ξ6„Âo\{CR½}~õ§ÏŸúùSþæ7…BøGßtSÙ§œ{}øåÙ°§~îI÷Þÿòº›Ê~úßþ–ÎöÞýã¯=õó™½ñúãwýç{O=÷™çôùèóÎÿðêS??ó‹O®Ã/üÈÉuù¬—œ\¯Ÿÿ÷¯ !„ð¬¿÷]áçþÝW‡¶gÉë}ßåÓÎç|é÷\üöº¼?÷Ë.]ü3?x:ƒú¼/?ɲ¾õ¾2„ ¾âûÂOÿ? /øGÿ<å°ØÍ`«¹-GÂô<ú/ŇÂ-¤Z)>æé¯ sûé×ÇŸ¹'|왓äÿó®ï !„ðûï:ùÐþ¸Ï|UøøÏ<ùàþßœ°žpç«Ãžqòáÿ»ï|SRûOüìׄO|ֽ៵°.œzþ7ï»”¬ƒ¬O~Î7„¿öœo¬û×ÞöÍáýoûæðþ·½þÔö'¿à <ùáS^pBáWþÛ7zþS_x><å…'ÁØû¿1|ڹׇOûÜ“:Þû_OXOû¼o Oû¼“ë=?yóX±wÿÄIuû¼!Üþ'ýðê×?úÿ“cþŒ/¼pò/#È !„g¼øÍá/~sxæ‹ßBáX)žý÷¿ëz€õ³?|d¯ƒ¬³_úÝáì—~O8Û²B8£õÜ/; Þÿû¿9 ®ÖAÖó^ö–ð¼—Xoû¯:µßOÿWfû£X•ŒïJÈh…~SkVÇ„›³_'· ×NÆh­Âãžúòð÷~oø£_º1ˆ¹™ÍZ‚vF«í“îúú{ßïIŸóº›Æh½ÿ­¯¿>F«ÑÚ„‡ZY­¦uV+7Ðjg´æô¶ýUÑç^ðßÜ» K3›Õ¼˜*1ÐJwË# ÇÇßô™µ£BÛ2ì:ÈZg³þ×Ï]è+žåIŸóºëŸíïÛ ëWßzd=ùaBø• ]ëlVsß3/ºp=«BïúO¯I¾uøÎ=¹5ûŒ¿9¬Bï˜9èZg³B§gR€ˆö˜¬ö˜­Ö-á$H½u­çÝ:|ÜÓ^>ðhFë£>ý>þæ3¾ð$¸lÕ€bÖ7=-C×À÷®òC­¼ +„Õdc´>úé¯ øîïî ßåã>ãUá÷ßõ§Äü_3¸ý•g~møw¼)üvkЇ'~ökÂ?û5á·~þÛ’3YŸ|öµá7®½!üÆÛûç§êšÚáo<ÿÃ*„ðäç„_}ëùÉnþÒOÝ—u2þôyúç¿!¼û'^{Ó­Ã3/zã©lV'·cçóþÿøu×ßùEo Ïø¢7…wþè×vÞ>ü¬/þŽð ?ò5ᮼ*ëXîzéw‡û.¿2\û·7Æì=§5N«ísþá¥ð3?x÷M·Ÿÿåß—Õ6Û!ç›…}bTnÀ·zðþkÇ·ßq×õÙP׋JŸžÿêCáäzèNã#áÕÿâçÃ[Þøá–Ç~Üé†"‹Þøæá+Òº|ôg Èv×¾¯¿u¸ŸÜ÷S €Z@6­ï )}oŸ ‹Jö=õ8âÇ5Aßƒß ùï%¿BBß×_ö¬.ž‘ýèè(ŽÚ¿¹Ïõ¬•^oFNŸð¼7†øC7¦ËZÅJž¶ú³ßN/ 콡eljï?u=MÑ@ë~ëý!D&=¿¥xËc?6¹{ÚËOEàLã©ëäöd;£KrîܹY÷Ÿºž¶h µºå¶ÂmU!\¿å6·ZýH˜°€7e´~öò?ž£,Òqä1BF  @%-€JZ•LhM5åý¶÷`-9ÐZ/¢Øü·Þ^CW½)`› -^xJ×BŠ›^M`[dZ]ÎÜyö¦`«™yªˆõµÑÎ| €9dZ)L;ðê ÄJÛËicª>”}ë°ËTc©ú2UÆkK7úÖa—Mdd¨€¥«>Ö&2O²[ÀMžÑzðþkÕç´±‰ù}VÞíøö;î =pßÜ}™ŒÁïÀœ._¹ŽŽŽÒ3Z±Ûs›˜¾aSmL)9ÐÚtp3¦=°•¨D P‰@  ’›Æh]¾ruŽ~°Ãvê[­ªs0üÑÑц»Á®ºtñÂÜ]€ÙD¿uxxx¸É~°Pc2Qwßsoñ¾) ˜/I×ÜmëmsÏë6wûû¬ÊZ‡ì–Ûï¸+{ŸóçÏ·×´l£9úÝ<_ÛzÞvÁ¨@kµZ…ããã©ú‚Í=ÆJ°À6ÚhFK`ƺֱlo[ÿœú|_½)å‡úÛ¼…˜ÚvW=]ýkj×Ù¾uYzŒ]€2n²UÚ·»n‘µ‹ÜçûÊÄÆ]å]Cu Ý:MéwNCýÚæ[·sJ´V«ÕõÇí¬Ôú¹æöXyY-–jëy¦d«æÐÕ¯f°%È(“hµƒ£æÏ±Ç±ò‚¬Ý±KYŽÒ ÕT–z—ð­I€mV43|3XŠN«Õêú?vÏ:ÙT@2wÆg“–r¬ÍñYKéÀ¶©2F«+ÆîhèNñèú`oŽ;J8>E›S–Ï©«ï6^W™®í]™¨Üs @ºÕƒ÷_;¾ýŽ»®}ÿò•«áèèèÔ„¥±[‡c·³|=p_h¾>ú‚‹æ‡ñúutéâ…Sû3-·õ–iý9˜”ÑZIÍŸsÊ·· ¶¶—uH—|ë°+8joK»%È‚é|–­h0<ÃZ•˜žAcˆ€}¶Õ–õõÝ}Ͻsw¶ÖVZ‚¬úšÓ3”þö•1Zôd@¹ä@+¶¤N×öö¶¾çSë‹Õ“Ú?ÊŒ ²n¿ã®¹»³µ¨tßbÓS,:²xujÿŒç*#£åF/*=µXfj¨Í®ýš3Ô ²ÊÈh@¹E †³ußLô²Yå6Ѻ|åjVùƒƒ™3«(ÐZzàÒ¾u(Ø*76£U%•»tñBvݰI£•Î]lº)¥¾T)ýd•[K¹ÿ?wî\q0txx˜Ü¯˜3wž=õs꺀gî<;ù‚±:k´UÒÆºÌ&ú°OF-*Û[\ºtÑéØâÕ±ÞŒ’±VK™M¾4ìc‘{Ì‚-€i-jŒ˵ ã æ"Úm·3nìžY-Y&–¢ìÄ‚ õö®@©ù\Si0××îú¹”þä¶@2Zì­¾@%'€IÍT53jíài¨?±Ç¥d×6c«-ß$d¬¥}AÚTu°9[h ²kÓAÇÐ8±šý`lžE¥Ù)·sêªmiý _rF+6_V×öæ„¡]Û›û6Ÿëªgèç¡ýcsi™_k?Ä»¯Î ßÞõ8E_6«¯¿}åKú 8¨¯Ú¢Ò9 :Yœzèç®Ç›^¶K/L2DÊ­²®2}û5Ÿ‹=î `Ro¦ô'¥)ÜJ¨¯hŒVJ`›x´/Hª¯¹¤Î˜¾–ÖE}sw!ÛTS;Ô;w˜ÉJ¦µ˜Áð©ÁÛT(ë.Ó6NŒºôÀ$wfx¦S4¾d=µ”§«þ昪1íO]@Ìl‹J§Ô+ÓµöaN?,6 lBõE¥S~ž¢žÜýX@mæÑ¨d1ƒá!„._¹šUþàà`+аZ,ÎÑÑQR¹K/Ô팴ˆ@+6·ûëððp°ÌP&«öœPSÕßUÏz›y­¶ÛÆÆh™F]S+Èj·a©€íe0<@%£•NY$:eé¡v`j)‹I7ŸëÚÞ¾½×\ày¨>öèE¥SÊ-½þy-§(Ѿ]µ’bÛcuÕÀþ(ºuhæu8mªñZ‚1€ÝRí[‡¾EyÜVØ=“-*ÝÜfÑf€ •î{ÜÜv||Ü€ Ï”º£·§LXg’bS)”N±`j&]T:g‘çÔ…¥Ù?—.^˜dY¡ù©†¶}3± Åê( ï6"ÀnXÄÌð°vpp0[Û9S;Œ©¯½­oÒR3Ãl7‹2çÑ)Y®)êË)'ÈØnf†¨dÔ·û´7ÿ죪óh­™O ØGnTR´¨tl{JÖª=¿ÖÐbÕ}ÛmÆêJíó»|åjVùƒƒƒYÐ@ŸâE¥×b·û°¾Å¥Sƒµv}u ²¶ËÑÑQR¹K/Ô팴è1Z± ª=Ë|³<»áððp°ÌP&+6Õ’ç¦JíÛÇ0åy(©kÉ×`*[;F«kŸuàÕÀ`ßlréŸÒ€ÉEÀ>Xd ÕÎbµNY´Zv‹n8–þÁÞ|tý,°Š•nê¯Õµ½¯ÞÔ,TߢչuAꚆCÛú¶7Ÿ‹•/Õ×~J›©ÇÔU.§_¹ûì‚Q‹J§,4=ô\j)ûY¨š¶æZ‚Íÿ¯µ³Cí²CÛÖmôí¿ÞÞ×ÞØc쪯«¯íŸ‡Ž³ïXsúk`×Yë½×u;±p4ƒŒö¶Øþ¹íÅÚŽý?§¾®ú»©³½Ÿ@ à„@‹ PšÏ§î×—ÙZÿœÒŸ©”´Ÿ¢öBÚûb‘ƒáa.Í[|!œ[ÔµmªöÚÚÝP°8E›S•à†¢ŒVl~«X9˜ÛPÖª]®kðöж¾z‡Ú+5ÔÎú6gN›S÷`Ÿºu(ˆ¢†K/L²¬Nê­Âœ[Š©ÛÚÛK—1ýloOéwnù!±únÀ>1F‹E988˜» “ˆMí°‹Jokúö!°F-*º¶aßó]³»7·Ëší—]Y z߈ҙávÝèE¥×úÖ6Œý«·kÑh€m3Ù­Ã)—¼‰- °M&™Þ¡Mõ-û° 9VÊ¢ÑK7zQé’çc Aw•wëp¿\¾r5«üÁÁÁÎ  `÷L¶¨tÉóííCß\d?%•»tñBÝŽÀH³Î£›Úe9þüÆÛ<<<,3”ÉŠ-À¼‹Ó ÄŽ«o1ê¹ú4¶,À6™5ÐX-ßÝ÷Ü;wFñ~bÉAVÓ®å°$f†§×ááaxèûÂíwÜUô6£+P¸ÌoÔ¢Òc¥.NÍ|ÆYK¶†2%]k¶·µ’Ží×ÜÞUWn©ÛS4ÏAì˜Swí—ÓŸæ­Ì’ãØ62ZôÚæ +E,ÔtÄ2G±e¨ÜºÛõä(­§o¿±AŸ` Øe-zm{F+„þ¬V;㔪k¿f;©ÁËXF+V6eð{_=}û=W¥À6µ¨t{{ÊT CšâaY¶=ÈZkÞ®ZëÊÒäÔ××ÎP0QÒöTJi=›Þ`$Í [b§½½½(ôÐö¡vÌ ?¿±­}°’š™›ÒìO¬îÔí¹ßÞk÷¹™u*ÍŠpÃân ®–eW2Z!Ü•D]õ´· bµRw»þ)ú^k?€}·zðþkÇÍÅËW®†£££SF¶¿û¶àØí¾}¸Í’n޵ŽŽ’Ê]ºx!»nؤEÏ£B0‘éÌæ£Õœ07f¨þØÌëK“ÓÏ”E£sÛ6×@=Ù·ÛÛÖbY¨¾[†¥sf¥¶+S²=¥ì.š#£5¥v`°©`!·Ü>­Ë9ž’> ¶òŒšG+ä¤Ì‹[Ž'·/)íÆÊ mO w=Û¶ÍAÌmԭñ @—_nÝ}3ßG3Z»nÛ3Z1íÅŸ»LnßÒZ(º«Îv¨t À®m]u¦ô+·=,€rÅVWf'WI&(¥Ýܾõ•ïÊbír«mÛƒ¬¾ !ü4îÚžZ>'@é b}kË=Ž}} ÝbÃÇnÁÍyk®™ÍZbÿ6aÛ3Zµ„®€gŒ¹™Ü¬iŠ­¡…¦‡‚¾¤û›§´Û·xuÎb×ÍíC fïªm²jÚµ€d׎`)’f†Ý6[5í1L}ƒÓcûÕÙîO_»±2}u÷ÕÙWv×™~ØPvk}»Ñ-8€ý³˜[‡,Ó>d´ÖPóçµ®í}åÛu¦ŽÙŠ%k·Õ×NJ¿RMUÀ¾hÑkŽ1Z—.^˜$Hë ÚÏÅÊælO­3µÔ¶†‚¹’@Ip0 ½6dT8Šù,yyî¤n}䫾¨t{¶Ë¦3ZKºÝ8EP±ôÀ$'¶ôcX¢¤Áð‚¤ýµc´ –¤@‹ýå[‡P.9ЊÍÀ¾þ—²½¯.–IF Ê%Zí[‡ÍÉA›“xƶ·÷c;Èh@¹êß:lÏø.ÈÚ.›Îh]¾r5«üÁÁÌ‹µÑéÆ|k‘yÌ1ÖÑÑQR¹K/d× ›T=ÐjV‚­í2×­ÃÃÃÁ2)õ÷Íøž3]Áº|l¿ÔúÌE°_Š¿u¸˜ÖÿÚ‹.··wíËòmó­æÒ4CKÙLÑNŠšý`y’2Z} 7•m“ÑÚ»ô­C™$6Í<ôšcŒÖ&u-‘3å‚ÊK^‚€úZôÚæ «}›®ì4oùÅÆ`SÕU?ûE E¯mÏhõM±Àg̪f«¸ ²öÓF­æ ø”Å©Ûå§Ïåy¶9È*5&(jïÛ÷MEvßF×:Ì rúf—﫟imû·笣™ÝòMC€ý´·ͽ5ŸmÎh ÑšjŸ”ºd´öSr »×ÜÞ^n'VOlYžœ`ª¯Ýœ¾ålO)»kæ£uéâ…É‚´X€Óu‹¯oŸõ¶Ü€I€°ß’­®àh­+ÈI-?F,¸ŠÍó+3´=e|Ù.gÛ6dT8ŠºrÆa¯°_Fß:œk\TJ»¹}ë*ß ¬R2v»fÓ­¹o7–Ê™€ý1*ÐêË\Õ”Ònn߆²p]k6îƒm£sÛè·»4×Fì›îa®À¦9>«oÜÙ®ÚæoÀÜ’×:ì»­–º}¨¦¾q]CíM ÑUwʱÄÊîrvKF Ê%g´šóZŶ·o­µ·§Þz‹Õ™ÚîPJ%å|ì-(—ü­Ã¦©‚‹®iX-(—”ÑJÉ0•؇ŒÐ¶“Ñ€r³†gÙd´ ÜlÖ.So—Èh@¹Ù­®erX-(çÖ!½d´ \r µžTtý¯¹­«Ls[»žöö¾mÌKF Ê%ZÍI@»æ“j>š,´‹o.—Œ”½¨tÓÐlís.¥C-(7Ù­¾¬ÛKF ÊMšÑŠIÍfu­+ȼd´ \òÌð]ÝsËôí×ÞÆ2Èh@¹äŒV3ø‰e†ŠŽý,°Z.-(—ü­Ãæ¿Qͺ)'£å’2Z›~XË$£åÌ O/-(—|ë°&³À/—Œ”“Ñ¢—Œ”hÑKF ÊeZ]sdÅ’ŽÍ©54×VßÂÔCõ¹9=-(—Ó’Ñ€rÉ­©¦_(Í>™þa2ZPn#k®É@m-(g0<½d´ Ü¨ŒV{AèX¶ª9>«/‹ÕW_Jy¦'£å’2ZC B¯ÿµË mï ßµ_IûLCF ÊmtŒÖÔÚÙ,ÁÖôd´ \•1Z› xº²cLKF Ê O/-(7É¢Ò}³¼›õÝøÍ‘Ñ€rIc´æ¸-מs+¶­´.ÒÈh@¹­ºu(XÚ<-(—”Ñj¯3¸64oVîöõ¶Ô€ª«|_{µ|2ZP.;£Õü–_;¨IݾzbåS4ëHíùd´ \öR—´k;¥?±k«£«ï±ãܦë>Ç5Ì}ï ÷¾íÛ`›ßGí2]ûïÚ5[Ô­vK°Å’ä¦ó›eÖûn Äo‹õñ5nÊ=S‰µ‘ÛŸ®~¥–Ý–ë>×5ìk·¤þØùÜäë®Ôœï£v“r¦êÏ6_³!‹ ´X¾¾¿$¶åE_*÷¯¨”óÑ,³ ç¯ïaé/þ)nv]»f½±º7qM–vÝ纆›øm·±TK¸]m—¾ÆØ–kÖgQV{À<ËÓþk«¹}—¥üÂa¹ú©múË˜é¸æùæ~më5K£Õ¼×õ¸k ûÐó}›ÿºêe^íû¶¾ø§V:ödWLç"lN IDATy,í_Ü9¿È‡Ê5Ç…4ëî+»/溆cÛMÝ®óRÞGCrÞG}û—–[Ò5²¨ŒÛc—3]ãú2y9¿h†Æ_l³’c›ê|ôÕk£}íJúÓWoûvÏ6\÷¹®a_©×oèýÛ·´ÏµÌù>*i#ç}´«×lÈêÁû¯7—K¹|åj8:: ‡‡‡3w%(]Ngý:ºtñBÖþ–î™W󺵹6§mú ×f¹\›åê»6›jÛ¢Ò•Lh­V«QϧÖ«glý¹¶éÖ0ŸI­ãããQÏ×l_ÌÅ`xmëÑ0·¤@«™:>>¾þó:“´Z­®oz¾¯ž®¶Rû×l««ÎÚYµ]u÷=÷ÎÝØZß:|éK^4s·Ø%¹ß:”A›Wß·§\›y¹6ËåÚ,×Üß:¼)£upp°ñÎÀÚ¹sçæî®Ír¹6ËåÚpSF €qÌ£P™@  @%-€JZ•´*hT"ШD P‰@  @%ÉÖ™;ÏžúW[N›èON{cû³Þ¿öqmú¼À¾ÉÊh=xÿµëÿjH?xÿµÞç›í•ÚP{›îÏÔ>`ß:ÜD°°Ín²²X–i½½k[s{³Ü™;Ïvsí:šeûêmÖÕÞ>t±ý†êª§ïœµÏC»|ßñ¦nO=Þ¡~6Ët]¡ó »j²@«+ ˆ}èÆÊ†Ðý!žZ¶¯Þ®Ç}ú©ÂÐóCõÄúÛ'ÖÞP½± m¨Ÿ}ítõk¨ß°/ªe´ÖšÔ±ÚM|×jcl½C·_»”ý§¾­›S_,+ûfÒ@«/rÛèf}¦T±[ŸcëMièW<~(pjOQÐ7xÞ ú~©_<ØÔyLù†á¦¾ K–•ÑJ¸Ý~¾ë6R¬lN»]Y²’zçÌÔŒ DRÎùíÅÚi ë;Ÿ²šì£Õƒ÷_;¾ýŽ»ÂCÜ7w_:ùp¶Íå+WÃÑÑ‘%xjY| %›l«ÅZÛJ P‰@  @%7Í£uùÊÕ9ú°Õnš.«sÂÒ£££Mô`'\ºx¡s{tføÃÃÃjX’1·ß}ϽÑç&]T`[Ý~Ç]Ùûœ?¾÷yÀ£¦^’pô·W«Õ¨çKê¯Qç&ÌÕnÛºSögµZÝô/·?5ú1¶.nzÝ”ž¯¥¼vjÑ:>>õ|6ç°Z­:ûÛ¾­úާ½½¯lóÒUç®ÿ9Õ<%×m̵õº6Å©ýÏ9¶¾ýcÛ†ú›ÛNß~SŸÓ±ÇÙW÷Ðãœþ÷ïP?bç°¯L¬Ž’zºöOÙ7åZõ1¥_}ÛJÏÓúúÝWf¨µú ì–1sŒ&e´ŽÃññqX­V§· =?TÏz[lÿÜöRêìëSs[l{»ÿ±>ôõ9ÖNʱNqN§:Îö|ÎmåÜó’rí»Úë;žv{SÕ;žØ¹è«?å}«#ç:§¾—»žOy=·õ½vúê:çísÛ>†Òþûcd•[“Þ:{›&÷¯Êæ/Å”ÿ©¤´Û·o—¡~–¶™zü]årÛl~XMu^¦*Âöd-6ÝÏ®ë<æ5BÙ{y(xªo[®/°=ÚÁUI°µ˜1Z©Ù„¶œLÍ”¦þË7%HÉm3çøcíïÊ_ø5_ Sš«Ÿ]×y̵t—Ö7u›À~‹U¹ÁÖVÏ£Õ¾½±©_®µÛíªs“Ǻ®ª6ÇfGÆØäëb[u]ç)_oS_ƒ”ú\w`¬—¾äE½˜¦Î·µ˜@«ä¯ç¡ð±Ù˜ØX¾[-í~¤|P¥Œ)) VRŠãLíO»Í±ç¥¯|W¿s÷ï’s­jõ¡¤%×¹¹m¨þØ1¬Ÿóº)=çCuvݪ kSL^:hµ?ÛÛÿOy>åqê¶”_¨±m¥}Êék¬½Ôvúê{N§<Î1Wîy)=¹uÕ¨§¹=È伿s®[îö¡÷tj§l{l™Øs‚+ –Åd´ØMsÝ2\¢X¶ €Ý%Тª] &ÆϦÎÅ®s€MZ º„@ Ø{wßso•zg ´†ÅÎñ-¥]2Õñnú¼-á:ÕìCû}Címâ|Ô~/.ᚤ¸tñB¸ýŽ»ÂCÜWüÿ.IKðLQ¦©äoÊ„›±í~Ñç›ã¼íËuJýÞ&ÎGÉ—IvQ +„MX 0—1AVß|[IÖ:[Ôµ,Fìq{)ŒæÏCesú{Ü×Ͼ¾uíÛU~h¿¡}súk¯ù|NÿSËäÖ9t Cç¡ëÿ}mLuÍrëË©#÷ا>)¯¡¾6ÚÛǜǡ>§¾—ûÚŽí{ÜׇæÏ)Çl·Y3Z9s ­Vy‹»ÆÊ–ôchžžÜ¾õõ¯YWì.÷ØbýjŽë‰=ßÕFJrÏI¬üP=©ç¡«X19×,·Î”:rêN½5W«ïCmäÔ3Åë}ÈÐy.y}¥îç6*ì¶Z­Ù¿uXòWbóã& ÇúP²o¬ïµþZ®ýWx­ó?vöÔuÎm 㵆l"ãÓ÷ž 8úìä­Ô¿Èç2¶Í}ûö¯yRû°+–þšÚU›8ï}mäfÆÚf£ÕeÎ_j%· æ6æ6ÇÔ}XBëã_Ÿ}ç|”Ÿƒf†¸/ãUZ/°fËhµouuýŠ•úÅÖ.ÛÖÿÑ÷‹/u\HjßRú7U[cÚék#¥cÏɺ|_=C}L•ržrÏå˜s«#vNRë*mwN9ïåõϹ¯‰X©T×מּk¶¯/ì«YÇhµAå<S6ö ¸´ÝÔ2¹åû>ú¶MqÎrö‹™âœ”l•ë;¿í.µ½Ô:‡ê˹C}ImwÌùêoê{mìkqL€²_I})u¥^+`ûíä-öSiÆ ™Ø¥ŒƒóQ~æªØ=;û­CÊmÇGn¶,·®]°oçcÊ×DI[]d´*™5£µN½MÁ!IéÃÚý{Lþj€í6[F«ýœCßlþë+[k:‚œ>»oqóhí)Øo³ŽÑjN¶¹þ3 Ô5wNÉ|PCûÚêêS¬üP?†Žohî¢ö·ÁrëéÚ?eß¡}€n‹™G«½­yk1å6cîø¨öð×ûϰ T`¿-6£ÕuëpL†«=)e¡ØØ8¦”ò]ýÎÝ¿ËPŸbýž²]}Úö¬#Ô0[F+eÕ®ñVS-³‘º°n»©åcÇÒ|.¥LW¿Sú4Ô‡”}»ú™rÝ€‹ÍhM!g0ý®›rÖz ÍbÇhM¡äˆK6æXÆ|+(cfx€Jv:£0'-€Jd´*‘ѨDF  -€Jd´*‘ѨDF  -€Jd´*‘ѨDF  ’Y3Z«Õêú¿jÕ›R÷ض›û×>OíöJž_ºÜþ—oÊ~›>—s_»ÒsÛoèù%Ùõ÷0l¶ŒÖjµ ÇÇÇ×ÿMõ gS¿¸ŽG=Ÿªï<ù%]Çúœ—ÚoLÝ9š¯M´7¥ÔþÖ:.ï+`J‹£µmsqž`{,vŒVìvYÊm´Ø>9õ´Ÿo—mß¾è{¾¯žÔcJ9Ö®zJÚÍ=7¥ít•Iig躔ô¿«LJ?bû ԺǼ~ºn±å^»¡v¦Ø·¯¿©mÇúózèêKJÛK~_ó«•Ѻu¨áöm°f¦fµZuþÛÞUwW™Òzºêhz~¨ž¾¾ô§öÏCÇ=t†êú¹ô\çž—1çs̵ïk§ËPÿRë.=Þ¾óÜWßÐ5ÊÝ·¯)ú^«}ý)ݯÝßm}_Ë0kF«oŒVé_…]mt™ò¯Á±¿à†ú’:–-VOnÿJÏMé¹nWûãÆ_ì›ÊlêƒoŠãÓ×%|ÀS×õÚkÚÖ÷° ³e´†Ä~¹LõK} !¤ýµ¾õ4¥œëö_é5ú‘ÓŸmQó<í‹® ÑÚ¶¿¯€ùÍú­ÃT±²S}¨,ùÃiÉ}+»}ÂÍ·Içê›7×u˜óµ7¥mî;ìºEŽÑŠ=74^©Y¦ï¯½”z6eè|ÊyJ¹­˜Úî˜þ”–ïº}3惯¯½ý/5EÝC×1å}µ‰¾½Ÿû®wék!e¿¾×Þ¶¿¯€e¨•ÑJºu8 åîÓ.Óõ!›ZO¬l»îXCƒj‡ú’ÚלzRë-éϘsZg_½SÏ®çSûÖÜ>ôº(ékÎñÆÚ̽v9}M-{.õ½+ßWgñ¬Ï¦^ïs¼¯€ùÍhÅ‚­Ñc´Æ;x` ‹G Jø0em}ëoý`‹™`×ÈhµÔþ†c©)Û[×Üç"ÕÜßJ­1ÿ×TõnË5Ò>'S|›9V¶ý¯–]¹6À‰ÅΣUÃз÷…sn‰¯™¥õg.ÍkSúÍšåBѨfÖŒV×<0±ÙÁcsÆ Õ1UCýnnýåÛ×ר4CRæÒi×Ýnsý\W¹¦œs1T&çšÌÙÏvÿrëL©;g{³?±ãN©³¯©õ”¾sÛioo÷y]g×yêÛ¿½ïÐû7Öþб¤¾Çcý—Iƒí6ëÌðÍoõ}ÄÊæÔ±Öž‡¦kß¾:SúÒ7_OW™®}ÛíôO_»Cýj>7Õ¹È-“rƔǑ³ʱ¤”óo–©qnyÌ:F«ù×ÜÐ/–œ²)RÿÂÏéËÐ_ÃSö?§Îš§\—ÔkWãåö!U;æÔÝuËlªc-yOiìqL}Í—Ú&°l‹™G+ç\ÎöÚÍ~‡°¹¡T›ìWNvkÎ[#Kº>M¹ýê ²ÆÖ9TOéë)µlî{~êö§Tr=Ý3ÛZ‡í_Ô9™uÙ”í]s¹®lAJ›CÇ0$¥|n™’¿°KÎEn™XÙ¥ö3·¯c^¿CbãØÆÔ™Ú·Ò÷an;Íícû_ÓØ×PIöX¾Y×:Œ}à =ª#µž¡öSêKÙ7§½”vrÚìkcŠsTÚÇ)ÚÛt?sžKm?g{ûºMQgßó%}ëÛë÷ýzM÷íŸÒŸÔ>NñOy¿ÛÃ/ÐxTßx«nT"ШD P‰1Z-—¯\>÷Ò—¼(¹-€–X0uppõíD@‡v°uppBÈûf¢@ bl•Y!´z­ƒ­’9¶ZJ'2hT"Ð¨Ä £Ì§á“‘0ôOBé@eoq¨VlæOº$åºÕÕÕiÕ¿ûÑ.WÚaìÇJ>ü}Jt@(ñ „tÃ!z ¨úÆì?é•cðjO%JF? _ÿo J?›rC)?¥r »¯ëkõÝÞAãkGáý3!@ˆH÷!ŒWÎw't„BgPÃg ¿‹ý~‰)¯ý'ôüºkxönÀôÅOgìÏøg–4ÌØ1 …êd5Ì®¹% -‰äÚ+¿`Øá®|8Ô§ã„eË™“;Ÿ¿zE\éÓo>øÒÄzüýOM€+*7(pòõ€±7ovØ6çþdQÜ¶šºŽ¤õžßRX¸ñe·›çÇ?š·­±£?ãÇ͵òñSlõ*½=¶¶ËȯAœï*`é>b^3¶—˜Ë%zHº§†Z1ª|¥¹þ~_sÔë_ž´Þ¼S¢2æÆ‡Í;(ÙòÝe?‡Ýíw¢ë‰øþвvl•ÆÅ×ü?;w+ßùýþ„¯Ï'ìèíAÅ„JTL¨4Ãà$€2 @ää×q!,ë/Á…%## ÷ôïÁí¸ôšUøç‰mq¯Y{wÄ÷WUm݃ ½ßÛ\{ëc8þÒs}ò¬íæò÷ÜUö;wîJØÖd´Ôæ¬Ù ØóèlÀ‚û_4Ë<÷ð÷‹6½bn{úÁæòÒ¦×Ìå¶µ7FíUëa@óò©qÇÞðÔ1[m¼¿¶2N>=ÏžjûI§©Jµ ‰öEùÃõ碌-vXwöT{¡žêµTÉö™‰ã7qˆ•†£xd¤±#T'“Ýr‰êu-[!ÛfÝnÔ“•OÖÙ¾dë”R ˆê.;Ae'›“rVÉNÜDû´ YU{ì/Y`)?¤Ù˜\µžŽt†3Në¦r,žð…-#C¬b£³w(|¿HÏÔIc —rqG‰A(®÷ Ö ]c=rvŽ»OÕ¾œ7¶¼µŽì5;õ)ˆÞ½|ü”„sdöuB0D ðÜÐ)_ŸGs`ûŽBu¾y…qÞ{þA¡ŒÓ[±D©r¯}òy­=Txø$H!R°5ÄjÛÞäù‹*¢LH¿ßŸvyRÒ€°ç bÆk"„H!R`@ˆ"„H!R`@ˆ"„H!R`@ˆ"„H!R`@ˆ"„H!R`@ˆ"„H!R`@ˆ"„H!R`@ˆ"„H¡rÝ"OUUUz®AäUÿŽèÑQÝÀIEND®B`‚PythonCard-0.8.2/docs/html/images/wt1fig3.png0000644000076500007650000001125110302146137020642 0ustar alexalex00000000000000‰PNG  IHDR“X–3sBIT|dˆ`IDATxœíÝË%×]ð߇y„ØØË€HÄfLrÓämÏœ9.\ÈÚþ·¿ðìJΣÚO]²˜|ÿÄ÷ß¹qt±\ÄÑ㋸²\Æ¥+±¼±8±¸÷Þqk<ÿÊñ§?ûÂé8ú‹Ç_ùûX{ïä8̦ôO?óìs+Û~Õû©$‹ÉW½9þëí+;—±{½:âZL‰ED,ãÊ•·ã3ÿñ¸rõ[ñ×'ÿ&NýÝ÷âëËÕßiüß/ÿIDDüôÉGW¾o€9êú`¯Ó4“É:|û…ÏEDÄ>öÄÚ0'õTR¿ä5ÄJ-¹z)–-ý&}Þ|u§Ür×§â–_ýÔ*O+""n?õøž÷ßú‡Ï­üsUO$Í~“!:’É‘ØI%W‡ïìJ÷e®·_{*""n¼óáô¹¿ÿôã±ØM'›Ôöa=öӪΣ~ÜT§|—Žb2®D,ZûLÞùæÓ»¯o¼ã¡ˆD_ÅÍ'‰7_=ß½øåΣÜzòÑxã¥/Å_ûâþg~í3ñúW>¿§¯¤Rõ™T>ð±'ô™³6掭.mÅbEðG¯}]ŠÂÒ×½r5âèÎ`ÆÊ{~ùwÓ£]Ó¼5¸Þ_oÿ¾»Ïv·Þóh$'…‹‚R‰zQ¹ýÔãÉö›’“@¸ÿ¾¢’¬·ýúÇåË—®ßÈ5ðÃwñîw†7^“æ­Á?÷ÑÏ*@1†Œ\º}ξrÏ£)YLÞzýß":;ÒÛ/¹á–ÜsÊRO&.c%9sæÌF·_õ~ê’ÅdqäxD_ùÁ¶Yj¶ÝMXÇyxž Ùö$“|æ›:à@,ßa5$²)&dSLȦ˜m%ÅdÌd`>¦ O‹j°ƒž €ò *&é9d"2/s¥K5e±K_Ûcp2i‡T*i^ör `;d]æJ‘H¶Ïàb2”$°}Ö:ÎDJØ+M&ÕíÂõ÷~ƒŠIßó›¡`»˜N€lŠ Ù²)&dSLȦ˜M1 ›b@6Å€lŠ Ùz§SyæÙçâ<8¤Îž=¯¾üâ¾å~¯`žÚþMš›ëùçŸ_õù°ž>ÿdçz¿W0/]ÿ¦Ï|áÂ…•œ Û#õ×K“ß+88CþM¶yð‘Ç:ׯüáX”ëÄݧFosîܹÞ6+-&‹Å"–Ëå*w ÀŠå$”6»›k±XlêЬ˜[ƒÈ6ù2W=Y¤.m¥ÖWËêï]˜¿ÉÉd¹\î~5/YUE"µ¾^<€2äŽýš\L‹Åî×”õ”¡*$9eR1i&”úz  LÍ2µ H¼tPž¶Â1¥ Lê€Oõ“t­O%“ªÔ°Ü_ç Æ1ãQ&ßÍÕV †®okÀÁYÕFãLȦ˜ÍD[dȤSH1ÑѰy}ÓÈçL¶ÄÓ矌wŸŠW_~qò÷6úL¶Äº IĦS™2ÍŠiWÖ/§ô=TkÒe®fHõ¾mù÷úTÖ«ÈdR§”oÉDŸ À–(>™èï(_q}&m9öMð8dHÖ£ÈdÒö¬’Ôòæë®õ¬‡>²™L˜É€lÅ'“ªSÝ]]åšM2YEGº‚°Å'ÊWÜ8“ˆt‚¨ÏÑq=©´-éZÞµm}ÿͶn3H+.™TÚ©q&•æ|õUï_I-²m½ ÙLÆÒ¢8¬WqÉd¬zºP46c6ws ÑõЬ)ªË_úKº—Lêà}E Ù¶9)dÛò®6mÇ ]‘}&©ï¶§&öuÒw-ï:×LJáòÀpE&“("ÃI&d+òn®æäŽæÔ([qɤy÷å+2™0/Å%“ˆîË[CÇ ppм›«íòVóV]·î”¡ÈdÒE2(O‘ɤ‹$PžÙ%“:é  ³J&bP¦â’Ij"Ææ2Ï.(‹q&d+.™0?’ ÙŠL&S'xtwÀf—LLô0?E&楸dÑþ<“Ô4*¦Wؼ"“IêòVuù«>p±¾Ì%1€Í)2™¤(å*2™0/³I&”kÖɤê?ѰYÅÍÜ7Ñc[6gÖÉ€2è3 ›d@¶"“‰Ît€y).™Ô'zœ²-¯ÈdÀ¼—L"ö&ŒÔ8’¾‰8XÅ3‰¸>v¤yÉ«þ¾íµq'¯Èd2„¢P}&d›m2 Eö™TêªÞiïÀÁ*.™¤&ul>IÑÄeÑg@¶â’ ó#™M2 ›d@6É€lÅ3iŽ+©Þ7ç誷i.º¬ky}ݘ±.Û¨ÈdR+© Ö‹J}YÛò®eõýwí·Òv<®+.™ ‘ú@oŸ¶emÛ=×™LúÔ“Bsô{êRUóY(©m§€³¿›«~™*"ö]ºj.[Õñ¸nvɤ* ÕWó’Ö˜e©Îþ¾å’ À~Åõ™´MÚ8d2ÇÔò¡ËšËÝÁ0Üì’ɺÔÓ‡0NqÉdS€é$²Íþn®Jê.«¾;¯Vqg–1+‡0™”Þq^â9ä:4É€Í).™4Çz4Ç}4/u]Þj¯®ãŽm“Zžjß|=t;€’y7W}¶ÞÔë¡Û·-kî«ï}_›Ôë±Çº@‰ŠK&›26 D9F³€H&Àœ™L6¡¤¿þK:€!fLÖõ—ûý®úØ]}9¥›]2i>}±mÊùTŸG½MÛ>S뇶Ó¾mýØã” ¸d2t¢Çú‡o[ÛÔ6}ûìúðîÛǪŽéÙ)ÀÜg@¶â’É:ø `½$²mE2é’-À8[Lšó`š­O&ä+rœIjœEj) \’ Ùf“LÖÁ$«±µÉÄ$«³ÕÉ€Õ(2™Tc;RËšso5ÛtµO'µŸ¡Û°£¸q&õËOm—¢ú¦;‹2v{v—LÚ¦O%…ÔìÁ]íÇL†+.™D\/©„R½²’ÀpÅ%“z*Z4†\öÊ!t+.™¤.s}8Uê¡ZSÏaÊöÛ¦¸dqý9"©emëÚö1drȶI=Ç`ãLÈVd2`^$²Í"™äŒ9èc»ó ØF³H&sêŸÓ¹¬Ê,’ e+nœIDìgR J¬¯¯¯oSi&„!ãFºÚô35Z¿mư‡Mqɤú0n¨˜Z__–úpn®ïÛo³Íc¦f0N­r.sS\2©'13ýöû¡Ô˜cìÜbsR\2‰?}ÊÐ}–2ª½¤sX…âîæ;ÑcÎ1rÛ¬â˜R p—Lª"2æTõmRÎÍõm—ÏúÚŒiß¶~ìqæ ¸>“ˆý}©‰›ïS}cû=†ôÑôísÈ1à°).™LQÿKß_û¯Èd2–â°Y‡"™°YÅÝ͵jõÁ‚S¶ Ÿd@¶CŸLX¿"“Ij¼HjIÛû¾KTmíú¶o®³±Ëº–Où™Ö©¸»¹š³îÖçêJµIÍÖ›zß¶¼ë)m³wg_ÛÔÏ3ä܆þÌëV\2i›b¾Ù&Ç:ÿšOí;õ3uM¥?æÜ$ Å%“ˆHþ5¾Jëü뽫6¦®„R½Ÿz<€ƒT\22Ñã*ÿ _ç_ôÍÛ’›Ï5i.[ÕñZqɤï’P}yÛvmmºÚ­âC}Ⱦ‡.ëÚoßñZqÉ$âúó>R˺&RìjÓ\ÖwŒ1“8ŽÙ÷˜Ÿsì9lJqÉ„ýš©DáJSd2a¯¾Ä°iFÀM2 [qÉdêUn¯ØÉ€lÅ%“ˆ½é mrþ×Íýµí£mRÅæº!ÇØVE&“æô"ÕW߇x×ÄŽ©}Ô×µ þs÷@¿âÇ™ôüòaß70yŠL&u«caœÀzÙgÒ¦ù)óiMí﨎å™!û—Lš—°êç]â}“!-}J!دÈ>“¾ð!.¶µo[Ö79$íŠK&%ry  [‘ɤ4Š@7É€l³º›+¢ÿn¬ÜÑéF·Œ7»d2än,Öì’ å).™4'eìš ±o}×~Rm˜¦È»¹š=6_WúÖ÷í§ÞÞ­¿Ó—LÆÈýð—LV£ÈdršIDA˜nÖÉ€2lm2™2ã0iÅ%“¾IÛ&aìZßõºùœðãg@¶â’ ó#™M2 ›d@6É€l’ Ù$²I&d“LÈ&™M2 ›d@6É€l’ Ù$²I&d“LÈ&™M2 ›d@6É€l’ Ù$²I&d“LÈ&™M2 ›d@6É€l’ Ù$²I&d“LÈ&™M2 ›d@6É€l’ Ù$²I&d“LÈ&™M2 ›d@6É€l’ Ù$²I&d“LÈ&™M2 ›d@6É€l’ Ù$²I&d“LÈ&™M2 ›d@6É€l’ Ù$²I&d“LÈ&™M2 ›d@6É€l’ Ù$²I&d“LÈ&™M2 ›d@6É€l’ Ù$²I&d“LÈ&™M2 ›d@6É€l’ Ù$²I&d“LÈV„)ß|ä±Î}[ýéPª¾ËU)çÎëm£˜l™¾KVS¸Ì@6Å€lŠ Ùô™l©gž}®uÝ÷ß7j_’ À–j+gÏž}×—b°ÅšåìÙ³1þŽ/Å`ËUej!‰PLˆëeêÅ€ˆĘ̀˜M1 ›q&[dȤS(&[¢oùƒŠÉÓçŸ\Ë,“l7¿Wp°ž>ÿäÚöÝ[LªûŽa•ü^ÁáÒ[LüåÈ:ø½‚ÃÅÝ\dSLȦ˜M1 ›b@¶cë ÀvXÜ{ï½ËMŸóöÿ2¡…9ÐrIEND®B`‚PythonCard-0.8.2/docs/html/images/wt2fig1.png0000644000076500007650000000667010302203336020645 0ustar alexalex00000000000000‰PNG  IHDRÌ @ƒÓsBIT|dˆ oIDATxœíÝpÕðï ý5Æê€m•VG(D´” g¬(5 EPâX[L áÄ bA!h )U CŠÑ¦9Q2%äP+ÑV'A%:u&ŽS{NÛIµj Éöc—½»½»}{»w»›ïg&ÃÝÞþx û½÷Þî»wRoO· "J«âîÕÈ€‰S¦åº,D޶~ýzˆއ_ËYaˆÜ"Oûä²»,Û±$I§||šÇ’tê¹ïô:>Ÿv}_Âúé·ÑÃgh}u„rù C¿LÑm|BÛxåw÷ù|–?N2yô;êcoþ†D6ÉÓ]zÃ2|ã«_Áçƒ2†d@ï“ I@þðÿðÅIÃ2ðÅ—Ãï×'‡!í äõvaôÛlÚt¥?cz[¿ß®®®Œ¶/¯m³¤Ê~´tóÙ§Ÿã³O‡€Q2 K•/aH–18@$ cÖ…c:ÁÕEÐÑ]„Qç?üc!å}ÓtAÉÌô‰[ÛX¶½ÕûQèæÍÊ3ðñ'C€$E«IyåTu €Œ¡¡O°êò¯ch¸ÏîÇ´? à¨lÏUê÷BÀ„â[öoµß=4ðóêö—ÄÝR¼Šó®ÍBI¢tsñ÷/0(¸«|Ë8ªYòɉm k9yeÚ=õ¿ºpÞŒu‚eÚ½$aÙ5e;m=fsõu Ë–Õ´åXkJ'6î{Ë–ý;ÁÄ)Ó Õ$“ ‹½=݆–ëÑïÃ8U•@S½Ä½¦,¥>%éîiÌEwÁ'Iø÷ñGñÏ£õ8kÊ=i – /íY ðßúd•"»ì\7°øÁ W£H_ HúšrĈޞnL*,¤Â"5"aRˆ†AÆéð(´ÿ¹JHò1êäIC€HOàìKî|øúFÀ¹E¿V×yÿ•̼_]v¢³Z}qðpyôfóšæ¿`Ãí—&ì§fÏјç«o¼PÛ½DZù³‚˜×{þo€Šë¾x¼ã,ùÉ9xòà‡æ YuŸPí2£Ò¼•Ÿú1b¾aã1â¼ëpþ•±ï.ŠkpáÕÑ&ÛñŽh¸Ž½¸Px}-..Ùx£-¶éW´p+.¿)ÚD|emùS˜³äiütiôþT°á–˜×ŸÛ²H}¼oÓBÀ¢UÏâæûþ`hÿñ¶Wî¬á®-‡[îü±áíO½‰ûwõªo™óÚÆ}oá‘gÞTÍŸ¨o{[þøà®ëÏYÙìsMüî  ˆHX€´5  ß$Ó_O’‡‘Xo=¦>>sòJH’„±…•ˆôÔá£7jÕ×ΙvŸ£š&ñ5L¼ù+ZÔ›wn´rÞ’¾öxÇžm*jkmóÌ1Î7<YJˆ˜Ò‡‘\truì¸ 0gÉÓ$ ûŸ¸5Ç%²^}Û» wî½.¾Ïß§I'E`|ˆÖ.F›d@ÞX“lÜÔ*üãÍhê»—­öä»™”ð›ÐG¸}æ8ÀS¯|Œ[¯8 °§û_)·×¾£k‰6‡2¥×Á×»JŠÀˆ…,ëÃŒ¿|-ú_Ý Ûé×óÃë6âØ‹«Ñóü½ê²KæÕ§}Ǽò–'ðÒž¥èÚõ«˜å×”íÄìÅ¿EÇŽÛðBã/ •ùƪg°oÓB´èDÎeéG”wŸ\n.;e‡­÷aÌÖ6ʸ\ÊõñÉ™,­aâOôLÞ±õBÓÛÓô¢!Ó®Ÿj¿DZ1Q&"}ÊG”94†HC$€!ÀÀ ``ˆ00D" ‘†HC$€!ÀÀ ``ˆ˜Þoä n(úu nÌu1ÈB¦?äfõù3°IF$€!ÀÀ ``ˆd=0œ…ÜŒ5L 8i10D,ŸùR„2g±v~0ík íÇzÏS-Ùwªõ9O9  ?éwª‰Á“Mžn#ûNö˜a!EÎcädL¶ŽÙþ'OäÕ‘ @ÀÒQ)9L&Ìžà#9©„B¡\ÁRvŒãsE`Œô!Ìö3Ø?‰ÕÕÕ•ë"XÆŽñŽŽ Œ‘‰ÁÍN.º]6¾Ë“Ü#ëÑžxñ'aª×Ò­Ÿn™ì›a!ïà ``ˆ00D" e$C’$H’”vÝH$‚`0ˆêêjuI’P]]––ô÷÷g¡Ä™1}•Ì«w†É¸H$‚êêjCëƒAÌ;W÷µ 6¨ÛÛÛQRRbIùì`*0~¿ßêr mÛ¶ Á`0íz---(--5´Ï¹sçbïÞ½X´hQ¦Å³…©Àpê ƒ15C2ýýý1aijjÂÌ™3QPP .ëëëÃîÝ»Õý•––bêÔ©1ë8…#ïô“³õõõ%m^ÅëèèPwvv⪫®JX§  555N7Ï>ìÈÀ°ÓOBPYY †úÚ&›^X´/^¬>.//7YB{10$¤¹¹Y ACCCÚõÛÛÛ!Ë2dYN»îøñã3.ŸÝ2ìСCjíÒÙÙië îÔ+e ÒßßââbÀÚµkÓ6¯ÌèëëS30äj¢'²RËXMÛß™={¶-ÇÈgï·‘Wfïß±c‡z2×ÕÕa̘1–#«Aljjrl†³÷ÛÄ+#!º»»Õ+Vííí¶\êD"(,,mîi¯–9 ›d”T$ÁôéÓDOd;ú‘Heee¢Í½åË—[~ +10”T `߉¬„% ¢¤¤ÍÍÍ;v¬åDZïô“®––466jjj,?‘ÃápL3lùòåŽ ÀÀPÚñ_ʉŽvˆª•‡йD­ ‹qƒ¬&~â ‘Ë£ôkFú¿ämRoO·Þ‡±ÿÞç‰>ŒSðïà}–Õ0¹%ì„YÃxŸ%£•)G+{%£•ùÉBiL†’ÓHd:0œàF"Sa»œF*N‚A$€!ÀÀ ``ˆ00D" ‘†HC$€!ÀÀ ``ˆ00D" ‘†HC$€!ÀÀ ``ˆ00D" ‘†HC$ Ö¯_Ÿër¹‚4kÖ,9×… r‹ÿù“KARF"IEND®B`‚PythonCard-0.8.2/docs/html/images/wt2fig10.png0000644000076500007650000005236210302203336020724 0ustar alexalex00000000000000‰PNG  IHDRëI-yØsBIT|dˆ IDATxœíÝÜ%Ù]ÐùS“™¨‹ˆ„qWH 'éIBÒ“_0CB ¢q¥oH  ÈðCæ6D™D~Œ0‘@HrAŗظí I"ó`é ÝLÂ.‹òZYØ…PY“™Ú?ž>Ïsî¹ßó³NÕ9Uõy¿^ýªçÞªó£NÕíçûœû­ªîƵ+½Д{î½Oݪ”RgΞ«Ý7]¸pA)¥Žƒu¥”zôúÕjpè–Ú »Õ~ãÙ/ýþÑëºÎz­”RõÚx¯Û[k½>.°ÿZ©½wNªé¬×û•Ÿ6Ûííö¶67´^ß|g÷’÷·;Ü™Iöw¿yûÛîÀ$û»·3Û_«xáýÿ íõúæ>~ýmžÿ Y›+iLBŸ!iLZÝ_»ëSí¯}Nåì¯ýÚß¿ñö·Äï„I÷×Ó¦4&­þ¿bñþnÄ}†rö×ãýÕmï¯}N¼7òþÚŸ¡œýµ?C{=qíϵ¹ŠÙ߃ý_ˆ§=ñ={¯™Yu0³~⳿X}ÀþC꿽¯WõJõJ©Ûn9þ+ç¶Çÿ?õïïÕã½RðßWO¼íõßßÿ¸êÿÈ«[o<¬žø‹ä¿`|Ÿû¬Ê.{÷Ýw«‡~xPùW¾îR‘~èzlÎ`ý¿þþSÿõ÷Sê ½R}§žp[§ë{õ¾Ç”RýãJu·(Õ=®îzʇ©£G~S½èÎ'«»r§zÂGŸºí‘·«îÖÌî0+çF)/].V¾t=&g°þîW}°ú­ß{ì8¨WF^ÑÍivÕ)¥zõØc¿§^ýÜÿA=öøP?tÇ«soûÏêç{nÝ>µÿã'¿I)¥ÔG>ÿï¯û½ƒRJ©û”o,^÷X®ý›¯RJ)uÇŸÿû•{ç§þÙ—*¥”zÞÿòÐ$í=üý_¤”Rêîóß3I{ÌÁíwÜÜæÆµ+ôä”3XúGþY¥Ôû«»M]¾Þ«ŸÖ§l¿sãA¥”ROºý+*õ ϯ_ý{ï}Ä_7z»ÿÛOlÞû˜».xËüòîOþ”oR¿ôoÿ0xò ¿©H½ü5ï=õÓ–»þÃ_­”RêìŸ{]‘~øüÌ¿8<·žýÙŽÞî;ÿé—œüü‚¿ö‹Öýð÷½R)¥Ô§dîo{ÓË•RJ½øåo:yï­ßûJ)¥>í ß<°wÌ“üíàÞõ¾‹;g])us ]Y× ëôûO8ùù ýcQ ãØ¯_ýf¥”RêÜ×Þe"óÉ[£I»zv½±·¿äxLn\þõÈÞ°OAêÏúËß.Þµa®î>ÿ=Åæ‹_ñæ˜Ó €æø‚蘙w³žÛï¸SÝ~Ç'u¦êJƒu¥Žñ^îšù[Xè·©'¼ÿý5ü—÷¾~ïõý¸{”RJýÞ/íåÿÇžrœ ð»ïùŽã×ÿeJ)¥þó/¿þ OørõÿþÂ?8¨ÿƒÏÜ»÷ú·o|»RJ©'=õ8¸úù¶½õÿãÓ¾R)¥Ôÿ}ý[•RJ}èÙ¿­~ëú·ª½ãU{ÛýæÏ}ËA[âÇé¿ñîãYÜæñ¬îúÙ×*¥”ú“Ÿøêƒ2Cü‡wýݽ׿¹_òó¯ýäkœå~õû)+ý‚û“Ú}½9³®éö§¼è¸?ïyû×ï•ùøO=Þ‡_xëñ·Ÿðâ¿§~á­_«Î|Úá7 .üè}J)¥žöÇãüó?r<Îg?óµ'Û\ÿ7ÇÇâc†ýÚ¿þª“ŸŸþNç»ÿÕþ±~ægŸ ?{éo´ý‰éÛÞ“\½¸ÞùWŽÏÕ+ÿüø<~Îç|‡z×~™zÎçŸÏ:õ%DϪ?ÿ¯½^½ó¾D½ã¾ødvýÿä‹¶ÿä¿þ]J)¥~âÿ̓uw}þw¼gϬÿøî ÷Ö¿ðeoTJ)õö·¼bïýOý‚7í½~«žaÅ›fÖì/ÛÛö%¯Ü)¥”úÑïÞôç3þæ÷¼À™»ù^Šˆ[7>~ó_Œ÷©[ßÖu þû%ê~Ü='úïÿòq þOþRõOÖAúwF¶£Ôÿ„/Wüfþ;î§!<éö¯8I…ùíGŽ÷yêWªÑAúÏï_¿u3hwù°§•úO?úþ¯wO—ýoêú9_§þôsŽÝ_û©×ì-?òyG}äóöóÔu þQ/øõQ/8®ÿ÷w¸Ó[~å'¶ÇÿŽ¶Ç¯oê{÷õ±wûÓb”:NƒyÊÍT¨?åE¯Qÿ©Ç}üÅ·í§ôüÂ[¿6Xg޳îu©0wüù¿¯ž~3oýçnè:PÆg}‹z†Òÿå~þ‰ñÛN‚ôÿ¿~eTûç^ú :÷ҠνTé_¾·þ]?øeÆÏÇçüsÿêwªçþÕøóÞå“>ï»Ô'ékoÝ]ã ꮿñ¥”RG7sÕ]~|w¸¿póÆã7u¥”zÑ˾W½è Žÿ)¥ÔÛÞüò½²/~ù›Ô‹_q˜ö¢õ—|á[ÔK^ù¥”R—¿g³·Í§ÑN}úé?ò†óÞ>0'fpž“ï1³®TüwÙêúÇÕá,|}öìºéCÏÞ ÔÒ>ü_­~ãݯS¿ñ³§Á¡4«þþÌ~ Çÿüìüì±üê;â.MIƒ)á^|<£îîFîºNyê§? ùÑûNfÔ•RêiŸùÚ¦²,ì™u›žQŸ+{f„™³êfJL¬È`=Þ-¿OõýcMQJϬï?pkšþOϺïä烧ŽLϪŸìokÅAç¬<‰®a?ýCǺžU¿zñË}›G3/,}çœþüŽøbõ‚Ï+{¡©Ôõ¬úÛßLà@ˆ£nç°Çë·¨ã/6 F©[;ÌYŸ“ߺvœ×üaVþºäßùÕ'3ëò™¯žM0â9_§þã»þîÞE¦úÓ?óܯW¿öS¯9¹¿ºé£žÿ êWßùi0ýIòE£¿bÜÂñc>æ® êWŽîWï}ØQê“_x|ûFóÓ§¼è5ê=oÿú½‹Lõ¦c9û™¯S×ø«Å L%Ïø ߢÞý¯^¥Þý/Oÿ {æg}kð°>ë/»ú™ñ·o|ög?¨žýÙªŸþ¡{£gÔŸó9ß©Þõƒ_}‘iÈ¿û'§yêǘžîÌÑ?:½Ðô®Ïÿnïn~Êæ{Ôï^©þ­q‘é _öFõ¢—}¯zû[^!ΨêËߤÞö¦—ï]`jú´/|‹ú±7¾L]6.2Õ˜К”;¾ø¸‚ñÔ?º×®ôgΞ;yâÒ³_úýJ)û.ïSÇ¿üCY3«W½áß«×ó·©[žø!‡YIÊvZÈéêÓ|cía&‡&ÑY·<©¦³^ïW~Úì^kê7õ,ûÓ¿ÊJç>®Ñ¼#L'¤™¤îïÁ­'Úßýntö§5î5Õ©ƒ¦GÞ_ûŽ0§ÛÏsrö#ޝ½¿ún0Ÿôyßu°ÿún0úâR×ïõº;Ù[³²à9uZ´³^ïmm7“ÐgH“Ðÿ‡Ý˜fí®Oµ¿ö9•³¿öghÿÆÛß¿&Ý_O›Ò˜´úÿŠ=Æû»÷ÊÙ_{Œ÷W·½¿ö9uòÞÈûk†rö×þ íõhÄýµ?CÖæ*fõëÏ}Öe?9ôèèH=üðÃʿòu—ŠôC×ó´'¾gï}gôýáÏÿfõþ÷¿ïôvêö¡ûƒßˆßèâ¥ËUË—®Çä Ö÷?ýªRÞ¹ÓcnyⓆô©öôW)ßúë˜ÆS?ãÕñ‡àž|Þ?TÖ<ȉOþëo8œ5`aî¾ûîªåK×csëÝ-·)¥n¥Q >RÛXýˆx(€fÖúâç×èˆ&=|°½Ž™u Që@£Ö€F¬*¬—z4ë\ÚEšÔ㤷Ÿòør.€Ö8ï³n“™×®¨Ûï¸Sݸv¥h§|íù¶/Ñ»|©zsúa›¢ýûi÷}Êq3û`·;õ1*:XWJºÆ ~Rê;«äÍ1°$ (')X—¸f0µ©fÝÍ~èõ%Û–ê7Û°×K?—ì‹«}sin#‰ë81~1íÑfj_ìuSö À–¬Ç1®4’¡ Xê“«_±ì€7”J1æL²4Þ¾öíu¡?\õ”?»®öÆOWzL›ScŸÁi0’Rêµ ùö¯dŽ{jùÔíǺ 25Тv;\L æ`pŒ¤Õ »”%ì_Ì7SázÙè÷YŸã fÊ̸™ßm§’>‘®Æù2Çs¬Cñ™u_Îr*)gÛ®ß×þrÉý«Ù¾k‡Ž_êÅ™5Æ3¦ÍšÇ@ën\»ÒŸ9{N=zýjí¾MàPÛÅK—ÕÑÑÑøi0ò¬fÕ@+Ö€F¬"XupëÆ‹—.×è°j÷ßÿÁÅû¬MÑJ©‡|@|ßùP¤Íf3V_Š8þ|í.J)5è™E÷Ü{Ÿs]ñ'˜ktæì¹ä2.\ð®'X 2Ã.án0@£Ö€F5™#]ܺÛí&ïPS“Áº˜o6uÌÖíwÜ©n\»’U–4`$·ßqçÞ2UÓÁ:³ê˜+;@Ï Ø› Ö Ô0W®À<5`o2g˜³Üu[“3ë̪ëê@£Á:rÖ€".\¸P¼N‚u` {î½o”z Ö€~øaõèõ«êÌÙsYKrÖ€†êgΞsÖK° 4$PgfÑX3ë‹ÉYïºíÉÏ}¿un7nº½×}ß©oh=¾ºµ’m¤ö[»ZÇ­…~¤ÙxçH7ÖÌz³Áúf³9ù9ô¤V‚½¾ïU×u'”ùsˆ´­®¯4»­Òm¤ö»öqkAú˜sn€®:]õ†úè—ý17ß·–¶3™>>®ck×á:Þ¾~ÉûpzìôÄ#{=f¾r =«ÊYßív{i0Cù¾1H³¥®Y×¹³ª¹m…ÃP½S—CŽçÔçDˆ+`󰪜õ”4˜…‚ÙÜ } cç³#^«ç84VÎzói0K’šŽ2•¹äCR“Z¨,ǪfÖí4߬z̦vβ^ïºàÐ×–/m¼P4å‚NýžïÂSéµ/§<§œÔW=vY_9{¼SƒcéS×±µë—òØí²)˜JË!c-­³¯ù3³ðÔµª»Á(¾]£æ ¨BVèÂFóuêņ¹¤[7†êy/¶\h]L®zŠøqÝî-C÷ÔÏ='Rútº}xŸsÆÚ·ŽÀ€ö¬ön0KÑu834öì8©* «ºÌ1ZF+wo01³4j¬™u‚u` fÖ€F1³4Š™u Q̬ZÕL•RÑO0j[ÕL7›Í^€n¿ZBÎ:ШU=Át·Ûí¥Á-[]κ´j¬œõæÓ`ÈW@ëV5³Î`0'«º :æ„»Áâ ¦@£˜YÅÌ:Ð(fÖ€F1³4Š™u Qcͬ7yŸõºn»÷ºï·âvSêºý×}?~[cµÑuê WÞÝìtl½¹Û›†îCjZ!õ{Œc ÀZ,ò ¦úI¥ÒC†>ÅTçvÐ^‹< qãêõ}/Ô¥·/ ¦ö¡sí7­ZÜL7›Úív{A¹½ÎõÚ$ã1³è¾™w_9í…f¹]3îæû}¿_gI夶sÚÛïïaÀ{Zî0 –¶‘ÖIA³¯Übú³^3@öýì«ÏÞ.¥>©¼½?®?^æú SY\ÎzÎl¹MÎ}¿=ùË.£ë²ëôµ7„ ÷½ü^¨¼«.s¨‡ÚëºøÀ™Ážhê÷ô?×:;ö•¢ëº“Ò,{¨Ÿ®€ÕßþÙÛ™Û„úb·m¾–ê‹k0 9ë‘bƒèPzŒ˜§¬›‹P¬¦cÀ)'R]ûí˜õÛl¤Ö¡ë‘Þ·ËŒ‘7ŸS_N p[ÜÌzM¾rû½®Û:·7×ÍžY·gÞ[cÎ.0ÆÌž»Ì°n̬Gêºa)*ö¬¹ŒûÖùèüo3µ$%ͤ_{S÷e cçXK¹Ý¾œï±L•ÎBÎ:~‹»Œya©}WûÂSW~{ßof·]´=;.ÍŠK¹YgÌ:3`ׯ¥÷Íu®õ¾øLÞ9í….Lu·Ù9—RŽ´gíËUw]ÔiçbÛõÆôsH_|ýˆM­ñõ'vÌôÏRnzè8Ø}ùw7˜Ð¦± º‚åP3û^ê¢ÒØ÷c×»¶Im/å‚R; )Sr]¨M×ÝNBRû"]àéÛ&åî6±}I#_¾À€?rÖ™rÝ},9ëh Ag¼¹ŒÕ\ú @‹˜Y5ÖÌ:Á:03ë@£˜YÅÌ:Ð(fÖ€F-rf}³Ùì=©4vÐ’Åͬo6çSJ}ë€Ö,nfÝŒ¨`N7³,ÅâfÖ€¥`fhÔX3ë·N¸{Ì;½èŸu®ºoК¡3뮀½Z°Î¦X rÖ€F‘³4Š™u Q̬bfh3ë@£˜Y5ÖÌzµû¬Ï]×mO~îû­s»RåJë¶Çm÷ÛñúÐ9ê6Ûœ¢µÙãÐo·â{®r±ccÖ*Óuêû>ªÞ`»]wܦ£>½Þ·Í\•GÀüéòÔåÝwß­zð±ÎªÁºë餿L[}@Rßo÷ïzûšAº6Epl¥º½îæ{KÎMÒþK¯%©c$ý0…¾ï÷rÓ‚Ù%ì`¾r— .x×W Ö7›Úív{¹fèz»Vøn;x7·1×¥í®X)(‹ î|3º¡:]ëíÝØáN¨{Èþž1ãéú##·ÎÔ ;4ë;6®ö]Á§p›ÛäÌŽë2¥gÖ¥úì÷b¶1ß3ËHûíÚ]Î7žú°.¾üóÕrÖ[ Àc™A¶˜›ëtîJy1·ñ¶g[¾0f–ÖÜÖ<úê´û"m«·sŽvßí:\uÆîŸTƞѷۊ ¨¥r¾uCgË}ÇÈw\ÛÅЧþç[çšE·éz\õæpõÅlKZ†Ê™ë¥À¼ä>¢éœõÖfÕM®4˜ÔÔ˜9“A)7_Ï9 Æ×H?Ñbþø ÖáRµØ} ¹}ñ•#'°”Ðl°Þr îÓB>:Êò}Ë`oÓ’Ô?Šìô;Ý£®¾˜))RjJKû@¬&oÝ8‡@=f}é³ìcÌ&ל¡v1¿ H¹.@J‹™jÌRR£”ª7sÞu]S³ö1bû;Ç}´§»qíJoÞŒýâ¥ËêèèH¼ð³$ß…¥ö:)p?þ|ùNEpå­Ki1® L¥õÎö/ˆ4·‰©ÏW‡ïµ«/¾í]ý“úž³R™ÐRb.Þ •K¹ 4DÇŒ[ì9a¾·×_aÖÙwq©o½ŒÆ¬óõ%$¦¯±ÐÆ\˜j—Mm}X‡˜ItìýЃ()&¯¬U+X– …Û.!˜mam+Xo2 À:èàG°¬P Ar }j ûh[³wƒAž”{‘ÏÑÒ÷ÀD°¾0KV—¾&Ò`€F¬"XE°Ž(úiŒúÞØöëØòs0V?KÖÏÔãƒ|¾±Îÿ˜ã&m3—ã=‡>@Kª^`ª¼d?¡4æ ¦86ÆCY¤:õÓõûöëûé-ËÏ©ŽãOÔ#›ê³bÊi/æ³"m“û«1.€xÕ‚õÍf£v»ø¤T38oýIªS=ê=õéæ“#í§H†êŒígLWÛ±y/-g¼ÌõCIïkWª/´C_L_ì÷Ì} Y¨ÎÒåR>+R›_¡ñÏ=¯K?õ5çÿÐç6Tgêú°vÕ‚ufËãØ¿Ô|R¨œ=+3ƒîZç«_z-±gí×9uêí¤¶B¤@Ëì—Œæ~Ë`öÓuls÷}ʾH烽Î5f¡:K—Ký¬Ä}V\u 9¯}õæÈù?Ä5«S' ]³÷Yw¥È¬Ðæ”smSÊXi.9uŽ$”®7tlk¦ •Ú×Üz|å|ãR"ídŠ sè±ëófsµáûæPV³ÁºÒuºÌš …Ó¯Ç4V{9@îÌz ¾cÛjŸkc\r>c¥ÚkÙ\ú KÆÝ`—ôŽ=»=æWÜ%|ûßÔbö¥ÆÌ¹N‰Ùné¤Üj×vs”}ˆ=?\)1¹udU/0µ6gÓµµÏª+å¿Íõ¾ôKÔÌ+öÕ›“ÓžÙ¦ÔO;ï8”[š«ŸæxI¯ííRú{ Ìõ¾ñ [_ÿ]ë춤qR§4Ö®qzŒ†;ß~˜?û>›¹åb>c!)ÿ‡¸‚sé[¡©S‹`©š¼À”ýTl UâýØmJ·çKý˜ò—|lÿsöSúF"e\RÚÉ©3gÝçQÌXç–K©/·®1ë£\N½C?\| iHƒP\lŠ ðköS`iÖ4›¸¦}EÎ HÃÌ:Ð(‚u Që@£Ö€F¬ân0+ =àÇõ:¥.ø­e¬»íV)¥Ts Ê©:³¾ÙlöžVêÚÃHâq-Sêš«1îý-Õ9DZ΂tÆS-Xßl6Á'•¨ëºîäŸýžý³T®D{1ÛûÚM­s(³=éQì®þ„Þ·Ž©3¶Ÿ)Û»^çö´©Z°¨‡¶YýhnýÏN0×ÛAœô¾.k˜æ ®«=ŸÐãÇsêÔå\Aw¨œÙžÔ7i½¯ŸÒxÇÔ9—±mj2g@}Ÿ/àŠI•H ÚÆ ð²Ò+2Ó@ròÃ¥r%û”Û^ŽÔ:¥™ym iOÌY“ÁºRû)0kÞ§ ˜¤ÙßröÁ—žÒž½O¾öÆØ÷©ÛK뜱Óh2X7óµêcѳºcf5|Ý~JÙ1ÆÁ¬sc ÚT-X·gΕ 籯QlιýZ*0úÊIUÚ©ùs(o~L¾TWšL̾»êÍI½YÂXwÆ`¸…#åU Öcsx9Ø ]hèz/f}êûÒú˜þ%6P.ñ~ì6sëäsFÅL€F¬"XE°4Š`hÁ:Ð(‚u QM>ÁeØÓq­÷mƒ2|cótÓбumSéÆz ®Rò·R?»c÷±žÊ ØW5Xw=¹Ô|º©´q¤§Yjü¢•tå<0ÉÇwl}ÛÄ”“Ô—)µÔMzR­ýÛØ>çw@}Õ‚õÍf£v»ÝA`® Ÿò=>>gv\—R6¶/ÒŒ ½ÎJ\í].4.¾}wñÕÿÜo>JÏ¢¦Œ‹4Ö¾×S~»ã:~1Ç(t®Å¿”s7÷ۖز¡cª3õ@žjÁ:Áxû—¡ùËSZó‹3÷—lN_̶ì¥þÙय़¥:K—ó‹oß}|uJA»¯½ØÌWoŽÔq1ÇÚ®'¦NiŸRÇÅ®'tŒìs&¶ŸCÏ]×·"RsΗPzMî9(«ÙœuWŠÌÚ„òSk~µ]êwn=¾r¾q)‘v2EÐ2ôØN•úàjÃ7{œkȹ2äøå´;ôL9~ckRg ¾&ƒu3@×é2kæ›Ýb¦K6ƸL=Ë8—c;e?sgÖíí–vür¿ù ™Ë9KÆ­WcfKM³ÝÒIùÌ®íæ>)û{~¸RbrëÔõ™ÿJõwÈöS3O¼Õ}€µ«z©ý³žA7×­}V])÷E^¾¼`;÷TZ—šàK%p­³Û2—R_Së4· åK‡Ê…ö1'Â7Ö¾c”{l¥röþJåB\ãk©¡:Çâk+öü•ÊJrÏAßñKm/æ¸Û©Jf>}èºÀ4š¼À”ýTÌ/éÔr¹u欋 l†ÔÛnL¹”úrô+. IDATë³Î1ÊåÔ;d¬Ç{¦æ9çåçZJ}±ÇM).8€©ƒjbSLÖªÉ L±ÌÊa)Öx.¯qŸ fÖ€F¬"XE°4Š`hÁ:Шª·n´Ÿ\êZïÛXªjÁúf³Q»Ýn/ —ÖkU- ƈ¨ç¬o6çÌ;°tÍëzvÝ—*,Y³Á:i0X»ª˜Ú?ëÝžM'pÀU ÖC8:Ö®Ù4`íÖ€F¬"XE°4Š`hÁ:Шj÷YŸ»®ÛžüÜ÷[çv¥Ê¡Ûž¶ß?Q¿ÉlKo3Fû­°Ç¡ßnÅ÷\åbÇ&åxv]§ú¾ª7Øn×·é¨O¯÷m3W%ÇIÕ`Ý~r©ý¾©µ‡$õýv/ðŽ¡·¯¤kRÐ8Vý:xìn¾·äàÜ$í¿ôZ’:FcOg»}¿›–Ì.aóU-Xßl6j·Ûs½]+|·¼›Û˜ëR‚v× ¬”¥ÎÀúfs¥:]mÚ3º±3ÂP÷ý‹ |cÆÓõGFn©AwhÖ=vl\í»‚O;à6·É™×eJϬKõÙïÅlc¾g–‘öÛµºœo< ôCTËYo)eÙv`n®ÓA¸+åÅÜÆÛžlùÀ˜YZ©N{{_{ö:©}½+p´ûn×áª3vÿ¤2öŒ¾kÿ|µTηnèl¹ÔŽ«½˜íbè€Sÿó­sÍ¢Ût=®zs¸úb¶%-CåÌõR`^rHÑtÎzk³ê&WLjjLM®´‰ØT )”qóõœÓ`R¾‘˜’k,SÆØ¤j±úrûâ+7FN`(¡Ù`½å@ݧ•|ô!æHÉ÷-ƒ½MKRÿ(²Ó?ìtV¸úb¦¤H©)-í±¸uc¦˜ôÖgÙSÒfr˧ª9Cíb~üúòݧ³”Ô(¥êÍœw]×Ô¬}ŒØþÎqßíén\»ÒŸ9{N=zýªRJ©‹—.«££#ñÂÏ’|–ÆÌªŸ?¾|§"¸òÖ¥´×¦Òzg{‰DšÛ„êô]*Õ•z±kÌ­íòCöO*ºCJÌÅ›¡r)„†‚è˜q‹='Ì÷öú+Ì:û..õ­—‚јu¾¾„Äô5öÚ˜ Sí²©í1£ëðèõ«ÊŒ©céØû¡PRL^-XªV°,A ·#\B0ÛÂ8Ú0V°N €jtð#XV¨… ¹…> µ„}´­Ù»Á OʽÈçhéû`"X_˜¥«Kß?i0@£Ö€F¬"XGý4F}olûulù9«Ÿ%ë gêñA>ßXçŒÌq“¶™ËñžC %U/0Õ^’žVj>”)ô4Ó5ã¡,RúéŽú}ûuˆýtÈ–åŒçÔÇñ'ê‘MõY1å´óY‘¶ÉýŒÕ@¼jÁúf³Q»ÝN|Rª^çz½6¡G½§>"Ý|r¤ýÉP±ýŒ)ãj;ö1ï¥åŒ—¹~È#é}íJõ…öaèñ‹é‹ýž¹¡1 ÕYº\ÊgEjSâ«34þ¹çué§¾æüú܆êLýCÖ®Z°|¨wÞ_ž¾ Ð.gÏŠÇÌ »Öùê—^Kì™@ûuNz;©­)Ð2ûe£¹ß2˜ýtÛÜ}Ÿ²/Òù`¯sY¨ÎÒåR?+1BŸW]CÎk_½9rþqÍêÇÔ H×ä}Ö]3îk$´9å\Û”2VšKNc ¥ë ÛšiC¥ö5·_9߸”H;™"ÈzlÇú¼Ù\mø¾ù”Õd°N̾¡³púõ˜Æj/'ÈY¯Áwl[ísmcŒKÎg¬T{-›K?`ɸLãRƒÞ±g·ÇüŠ»d€oÿ›Z̾Ԙ9ש"1Û-”[íÚnî㑲±ç‡+%&·N€¬ê¦öÏzöÜNƒYó¬ºRþ‹Ñ\_áK¿Dͼb_½9i1í™mJý´óŽC¹±¥¹úiŽ—ôÚÞ.¥Ÿ±ÇÀ\ïÏбuñõßµÎnK—!uJcí—¡Çhȱóí‡ù³ï³™[.æ3’òˆ+8—¾š:µ–ªÙ L× k±V‰÷c·)Ýž/õcÊ_ò±ýÏÙO鉔qIi'§ÎœucœG1c[.¥¾ÜºÆ¬sŒr9õýípŽÆx(‹TçZƺßnOvPVµ`}³Ù¨Ýn·”Ûë\¯×Æ÷8s;—Ê¥¦Cg€¥v§~ôxèqî©÷w¨ÎØ~Îu¬Àxªëk¾SØ3±úµÍõ¾ŸMæ ¯«~×kI(½&§N©ßºî˜r¾àÕÕ¾¯ŸÒxÇÔ9—±mj2gÝ5ã¾V¾Tˆ˜@,%b¬Ô‹œ:sƒÌœüp©\É>å¶—#§ÎÜ?ŒÀ¸š Ö•Ri0k6eÐ䛕"g†¹3ùcìûÔíåŒ59mj6X×Öž¯>–Ô‹SÔ :uû)eǾàtc ÚTõSûg”s'˜SRª„ùž™m¾–ÊåäDKmè÷ôöv9;¿Ûµcò¥Á¸ÒdböÝUoNêÍÆÚ¼ ·p ¼&/0]{€ns]¸˜ºMìúÔ÷¥õ1ýKl \âýØm;Ö挊'˜"XE°4Š`hÁ:Ð(‚u Që@£š‚)òÙÓq­÷mƒ2|cótÓбumSéÆz ®Rò·R?»c÷±žÊ Ø×ÄL¥‡ ñÓᤧYjü¢•tå<0ÉÇwl}ÛÄ”“Ô—)µÔMzR­ýÛØ>çw@}M<Át³Ù$½^ßããsfÇu™!ecû"ÍÚëì ÄÕÞØåBãâÛw_¡ñÏýæ£ô,jʸHcí{=å·;®ãsŒBçZìñK9ws¿m‰-:F¡:Sÿ`ä! ¦qö/Có—§´.ægî/Ùœ¾˜mÙKý³ÀK?Ku–.çß¾ûøê”‚v_{±˜¯Þ©ãb޵]OL>Ò>¥Ž‹]OèÙçLl?‡ž»®oE¤þæœ/¡ôšÜsPVõ`}í³æ!¡üÔš_m—úÅ[¯œo\J¤L´ =¶S¥>¸ÚðÍçr® 9~9í=SŽßXÇšÔ¨¯j°N Ç7»ÅL—lŒq™z–q.ÇvÊ~æÎ¬ÛÛ-íøå~ó2—s–¬Ú­ ÔãÔ˜ÙÒ_ÓÇl·tR>³k»¹GÊ>Äž®”˜Ü:u}æ¿Rý²ýTÆÌouŸ`íªÏ¬kfà¾Ûí¸ŒÁõõ½//ØÎ=•Ö¥¦øR \ëì¶Ì¥Ô×Ô:ÍmBùÒ¡r¡}ÌI£ðµïå[©œ½¿R¹׸„ÆZêG¨Î±øÚŠ=¥²’ÜsÐwüRÛ‹9îvª’™Oºî0&~-b~I§–Ë­3g]l`3¤ÎØvcÊ¥Ô—[טuŽQ.§Þ!c=†Üó0%0Ï9/§8×Rê‹=nJqÁ)L…'˜¢šØ€µª~7¬³rXŠ5žËkÜg¨™u Që@£Ö€F¬"XE°4ªÚ­CO(Õëy8ÖªÚÌún·;ùgîJêéX»&Ó`Ô€‚ufÑYÕ`@p«¬¨~ÕûŽ0æûÜkU-X÷ßæ@˜¬"XE°4Š`hÁ:Ð(‚u QUŠ4g]·=ù¹ï·ÎíJ•›³n»UJ)Õß\šïÙ¤mzǶK`C¿ÝŠï¹ÊÅŽYg¨L×uªïû¨zƒívÝq›Žúôzß6sUrëU-Xw=½4´®}¿Ý ¼cèíפû˜A©»›ï-987Iû/½–¤Ž‘ôGÀú¾ß ÈMKf—°€¶5ñÓÍf³÷Ú·®6_Àmïæ6溔 Ý5Ë*^1œ=à C³á¡rP>µŸ1Alp¶8"ðÙ‡˜1K©35èͺǎ«}WðiÜæ69³ãºLé™u©>û½˜mÌ÷Ì2Ò~»öA—ó'> „œõfmææ:„»R^Ìm¼í•/È‹™‰µ·ÕÛ»ÒNì:¥u9ýtŽöö¾r9û.•±gôcöAê»ÔG׺¡³å®1”Ú‹Ù.†8õ?ß:×,ºM×ãª7‡«/f[Ò2TÎ\/æ%÷[µ™uÍ7sÞÚ¬ºÉ•“šS“+å(}^nšÅÒ`Æ—\c™2Æ® U‹ ЧÛ_¹1‚p{@¬ªÁú\uŸ%ä£Kœo¦ÝWnéæ:.©ÙévºG+\}1SR¤Ô”–öSµ4˜¹ê13èsšewé„YïÔœó”u¹uÖ’;.¾œþÒý³¥¤M)Uoæ¼ëº¦fícÄöwŽû¨£»qíJæì9õèõ«J)¥.^º¬ŽŽŽöîÈ2»~û¢R×:íüùóå;Á•·.¥Å¸.0•Ö;ÛK¼èÑÜ&¦>{ûÜ ZS.|ôÝ™$T.TW(OÛ,ºCJJz«\ê¸øÚ‰·ØóÅ|o¯¿Â¬³ïâRßz)YçëKHL_c/ ¹0Õ.›Ú3ú°^¿ªÌ˜:–޽zð%ÅäÕ‚õ¡jëÀÒµp;Â%³-Œ#`:cëÜ @“tàÖ,-É-ôa¨%ì ¾ê·nDY)÷_š5ï;X&‚õ…Ys@ºæ}ËD Ð(‚u Që@£ÈY_°Ð½ª}sAY9Ή©ÏWNÚf ÷/ϱ½ùP²m¿ÝûÙ^ïzßU€±U Ö͇.ÙO(y‚)Âì§.šx`‹lŒq Õ™ÓžïØú¶‰)'©1.¥íáV@î}íø€)T ÖÍ|³Ùì½¶×­ïê9³ãºÌ²±}‘Ùn¯3HߣìÇ.—Уì%¾:CãŸûÍGéÙó”q‘ÆÚ÷šowð# ¦qöì£ÜHëb;h³/f[öRÿlðÒÏR¥ËùÆÅ·ï>¾:¥ Ý×^ì¾zs¤Ž‹9Öv=1uúHûSGîì8³ê€Úªëö¬ºù¾R¤ÀØAoyj¥fBsë‰É×.Õ^è8Œaè±ÍMyIåjÃ÷ÍG.fßkS5XwêJé¾mÖÂ7ÃJð"c\rfºKµ×²)û™;³À\U»u#Axœ3ç:U$f»¥“r«]ÛÍ}¹´.5­Ã— âZg·e.CZÆÔinÊ—• ícé‹y}Ç(÷ØJåìý•Ê…¸Æ%4ÖR?BuNͼ-£~ @+š¸Lʺµ 0®õ¾r¹u欋ý#`H±íÆ”K©/·®1ë£\N½Cƺt@«x‚)ª‰M1X«êwƒÁzµ2« Ð*fÖ€F¬"XE°4Š`hÁ:ШjÁúf³9ùÚX£&ž`ºÙlħ–¨`ÍšMƒqðÀZTÖ¥ œ@¨¬û‚r3Ÿt¬Qµœu_ “Ï,]µ`]©ýsr`_wƒ)±°4Õ/0 #XE°4ªê¦C½ö'k÷07¯~^í@V¼³ßs•‹Ýÿ”Ïñ}ÏïŠk¨ŸKþÿ¥ä8ÀœT Ö}O/5×Ië[ !K ˆj2Ç]ÿò{\u½¿¶ÙÇÇõZ’zLs>ÿ%øÚ]B0»„}€Òšx‚éf³9È[ Еòl¾–®}4×ÅÎÞ›Ç ö¦öÓÞO×2TÎ\/ýYr` ªç¬K³êú}¥Úawý"­ñÕøPµ)†ÆÌÌ÷íT˜Ø:k‘ÆÚµ¹ûÐê¾§HùkJ®ÏJÊgȤj-¿1ÎÁ1þ¿©ýŒ©j°î ÔC)2-ã—F:~yËJÌöÏïÛ {›–¤æZû¾Yiiÿ|œ˜(KHʨ–3· Ü–’rÒº©ûék/µ/)éD-˜z¶|n³ó:…&'UÌ|mÿ\²¶”4´”íJ3Ó“æ"eLç¶o«»qíJæì9õèõ«J)¥.^º¬ŽŽŽîÈRšïŽ/¾;ÅhçÏŸW¯ýÉòý qå­K©R²k}¨=»LÌE^©u†ÖIëm®¾¸ú—zA¤´}ìqH½0.$Ôvl_ìuÒzWÝ¡¼æÜ}O9‡Rû"Õá“{~†Ž©¯¿®²¾±Š½Þ"õ3sÎÄüÿ’:ûÛטT¥˜ÏŠT6µ½Øý{õó¢6€$^¿ªÌ˜:–޽zð%ÅäÕ‚õ¡jë"'H£JÍ;=¥ä8¬ÃXÁ:wƒ€˜s kF°#j!Hn¡C-a Gõ[7¢¬ØÛ !œKÔ7ë`¼ÃC¯î  Pçõ‘4Š`hÁ:Ð(‚uDéºîäŸô:¶üŒÕÏ’õ†Æ3õø Ÿo¬sÆ?æ¸IÛÌåxϡВj˜Æ<¥4f›µëºNõ…/”êìû~ï}ûuˆÞ~rÆsŒãàãÏ©û2S}VL9íÅ|V¤mr?c5ƯZ°nß›Íæ —Þ[+é—²ù¾¹Þüzßüå[gl?cʸڎه1䌗¹Þ×WWðâ:¶¡úBû0ôøÅôÅ~ÏÜÇИ…ê,].å³"µ)ñÕÿÜóÚ5&¹rþ }nCu¦þ¡k×ä­ ÔOÙ¿Ô|R¨œ=+3ƒîZç«_z-±gí×9uêí¤¶B¤@Ëì—Œæ~Ë`öÓuls÷}ʾH烽Î5f¡:K—Ký¬Ä}V\u 9¯}õæÈù?Ä5«S' ]õ`ݘë4˜5îR@›SεM)c¥¹äÔ9VPºÞб­™6Tj_sëñ•óK‰´“)‚Ì¡Çv¬Ï›ÍÕ†ï›@YUƒõP ®×­}¦}è,œ~=¦±ÚË rgÖkðÛVû\Ûã’ó+Õ^ËæÒOX²jwƒ àkÎM©AïØ³Ûc~Å]2À·ÿM-f_jÌœëT‘˜í–NÊ­vm7÷ñHÙ‡ØóÕ“['@V}f]3ƒóÝnÇ` ¾¯è]_áK¿Dͼb_½9i1í™mJý´óŽC¹±¥¹úiŽ—ôÚÞ.¥Ÿ±ÇÀ\ïÏбuñõßµÎnK—!uJcí—¡Çhȱóí‡ù³ï³™[.æ3’òˆ+8—¾š:µ–ª‰»Áä¬_‹Ø@«Äû±Û”nÏ—ú1å/ùØþçì§ôDʸ¤´“Sgκ1Σ˜±Î-—R_n]cÖ9F¹œz‡~¸øÒðP$ÅŦ˜¿êwƒÖbM³‰kÚW¤áÜ€4̬"XE°4Š`hÁ:Ð(î³Ò~\¯Sê‚ßZƺÛn•RJõ7— œjÁºï ¥æ:×6ˆ'=%Ô~JaîÓçhŒ‡²HuÎq¬sƦßnOvPVO0Ýl6{¯}ëÖÈ÷8s;—Ê¥_Cg€¥v§~ôxèqî©÷w¨ÎØ~Îu¬ÀxHƒiœ=Ó©_ë Ñ\ïûÙdÎðºêw½–„Òkrê”ú­ëŽ)ç ^]íûú)wLskЦêÁºoæœYõc¾Tˆ˜@,%b¬Ô‹œ:sƒÌœüp©\É>å¶—#µN{{fæhGÕ`@=Δ“oVzˆœ}ÈY··K™Écß§n/9眙xšUõS‚ñzR/vLQ3À×í§”û‚Ó9Œ5hSõ™u‹JeRª„ùž™m¾–ÊåäDKmè÷ôöv9;¿Ûµcò¥r¸ÒdböÝUoNêÍÆÚ¼ ·p ¼&n\.¦n»>õ}i}LÿÆ(—x?v›¹Œur 9£â ¦@£Ö€F¬"XE°4Š`hÁ:ШªE¸ì‡é¸Öû¶A¾±ÎyºièØº¶‰)‡tc=W)ù[©ŸÝ1ŽûXOå쫬»ž^»aÒÓ,5~ÑÊÆ ºr˜äã;¶¾mbÊIjŒË”Zê‹&=©Ö~ŠmlŸs; ¾&ž`ºÙl’^¯ïññ9³ãºÌ²±}‘fíuvPâjoìr¡qñí»‹¯ÎÐøç~óQz5e\¤±ö½žòÛ×ñ‹9F¡s-öø¥œ»¹ß¶Ä– £P©0ò4ŸC Þ9yJëb~qæþ’Íé‹Ù–½Ô?Û¼ô³Tgér¾qñí»¯N)h÷µ€ùêÍ‘:.æXÛõÄÔé#íSê¸Øõ„Ž‘}ÎÄösè¹ëúVDêoÎùJ¯É=eUÖ¥`|·Ûí¥Á¬Y(?µæWÛ¥~qçÖã+ç—i'S-CíT©®6|³Ç¹†œ+CŽ_N»CÏÁ”ã7Ö±&uꫬ»fÍIƒÙç›Ýb¦K6ƸL=Ë8—c;e?sgÖíí–vür¿ù ™Ë9KVíÖkÀcÕ˜ÙÒ_ÓÇl·tR>³k»¹GÊ>Äž®”˜Ü:u}æ¿Rý²ýTÆÌouŸ`íªÏ¬kfàn§Á¬=¨w}}ïË ¶sO¥u©i¾T×:»-s)õ5µNs›P¾t¨\hsÒ(|cí;F¹ÇV*gï¯T.Ä5.¡±–úªs,¾¶bÏ_©¬$÷ô¿ÔöbŽ»ªdæÓ‡®;L£‰»Áä¬_‹˜_Ò©årëÌYØ ©3¶Ý˜r)õåÖ5fc”Ë©wÈX!÷^ýv+¾ç*»ÿ®óPܶëTß÷QõÛíºã6õéõ¾mæªä8ÀœT›Yßl6{ÿ|ë[”hë@½ï·« ÔK“ô1Í^ʤõ™ç}ÜBçFÌ6öö5ø‚UÌêsdþ±8ÖÄLí€|³Ù¬o婦fÀíZ§™Û˜ë|uÔé˜2ãë+Óž9[)Í\ºÊIAuN{!9cÛž^×ÁoæÖÕf¨½˜âÐ~øÞw­‹çR}‰Ù÷”:SƒèЬ{ìçÌÕ¾k6ØJÍmrfÇu™Ò3ëR}ö{1Û˜ï™e¤ývíƒ.çϹþ‘>ä¬'0ƒl;0—fÍ])/±3ëÒL¡¤ÌøÚuºRIR‚ __|3œ±íuV9ŸÜ1Ë)õµçkßþ¹ê”Ê›ëKì{ì s©¾Ø\³ã®u14øøö×wü\ÛÅðÍ€Ûëbgšu=%gÖ]}1Û’–¡ræz)0Ÿû·PÚ­5×3ê­Ìš§v¥g×ç vžrè ;4ß×A¬]ÇÔ©*±íIcíÚ¿Ü}XBšŽ/®¹®ÏJR #HÕZJÉ틯ÜA8=€%«¬ë ½¥4—¡ÈEO7v®ùZÚ‡Ú| áûvÂÞ¦%)ßþ(u˜þa§{´ÂÕ3%EJMii`îHƒÉ3ƒ>—Yö–f¡Sû’“Ã>DJ*Gɾ̥ÜPæõ)ÇÖ—_º¶”44¥êÍœw]×Ô¬}ŒØþÎqß VwãÚ•þÌÙsêÑëW•RJ]¼tY~³~iV=´þüùóå;Á•·.¥Å¸.0•Ö;ÛR?ì÷¥ sê ­“ÖÛ\} ÝrÑ·½«nW{CÆ,&à Éýó•“úŸsáiê1’ é‹T‡Oîù:¦¾þÆ^Ð*½·×_aÖÙwq©o½T㵑IDATŒÆ¬óõ%$¦¯±ÐÆ\˜j—Mm}5=zýª2cêX:ö~èÁ”“W Ö‡ª¬@Šî¾„`¶…qŸ±‚uÒ``t`žÖ`D-É-ôa¨%ìä¨z7”{D „s €úÖ† ¥p.Pi0@£Ö€F¬"XGý„@}¿fûulù9«Ÿ%ë gêñA>ßXçŒÌq“¶™ËñžC %Õ.0µºd?¥T¯—ž^ŠSc<(DªS?qP¿o¿±ŸXزœñœú-¾ñäá1²©>+¦œöb>+Ò6¹Ÿ±ãˆW-X7ƒp;pßl6j·Û5ÿÕ©„?žúØnói†ö“ CuÆö3¦Œ«íØG—–3^æú!I÷µ+ÕÚ‡¡Ç/¦/Òãã¥cézz¦¯ÎÒåR>+R›_¡ñÏ=¯K?‰4çÿÐç6Tgêú°vMÞº‘ÙôSö/5_€*gÏŠÇÌ »Öùê—^Kì™@ûuNz;©­)Ð2ûe£¹ß2˜ýtÛÜ}Ÿ²/Òù`¯sY¨ÎÒåR?+1BŸW]CÎk_½9rþqÍêÇÔ HW5X'Õ%L hsʹ¶)e¬4—œ:Ç J×:¶5Ó†Jíkn=¾r¾q)‘v2E9ôØŽõy³¹Úð}ó(«j°®ƒtöÙÐY8ýzLcµ—äά×à;¶­ö¹¶1Æ%ç3Vª½–Í¥Ÿ°dÜ ¦q©AïØ³Ûc~Å]2À·ÿM-f_jÌœëT‘˜í–NÊ­vm7÷ñHÙ‡ØóÕ“['@ÖÄÝ`\w‚1^óÌ»ï+z×WøÒ/Q3¯ØWoNZ@L{f›R?í¼ãPnli®~šã%½¶·Kégì10×ûÆ3tl]|ýw­³Û’ÆeHÒX»Æeè1rì|ûaþìûlæ–‹ùŒ…¤üâ Î¥o…¦N-€¥jân0)ëÖ&6Ð*ñ~ì6¥Ûó¥~LùK>¶ÿ9û)}#‘2.)íäÔ™³nŒó(f¬sË¥Ô—[טuŽQ.§Þ¡Ÿ.>€4¤Á(.6Åø5yëF`‰Ö4›¸¦}EÎ HÃÌ:Ð(‚u Që@£Ö€F¬ân0+ =àÇõ:¥.ø­e¬»íV)¥Ts Êiâ ¦Jí?É÷tS¤“žj?¥0÷i‡s4ÆCY¤:×2Öýv{°€²šx‚i(p_{Àî{œ¹ˆKåRÓ¡3ÀR»S?z<ô8÷ÔÇÎûÆ;Tgl?ç:Ö`<¤Á4Ξ‰Õ¯uÐh®÷ýl2gx]õ»^KBé59uJýÖuÇ”ó¯®ö}ý”Æ;¦Î¹Œ5hSÕ`]Ϩ»fΙU?æK…ˆ ÄRÒ)ÆJ½È©37ÈÌÉ—Ê•ìSn{9rêÌýÃŒ«j°®q)('P?5eÐ䛕"g†¹3ùcìûÔíåŒ59mj2 †@}|©;¦¨têöSÊŽ}Á鯴©‰»ÁH9w„9&¥J˜ï™ùÐæk©\NN´Ô†~Ooo—³ó»]û0&_Œ+M&fß]õæ¤Þ,a¬Í»Àp GÊkân0)ëÖÈuábê6±ëSß—ÖÇôo,±r‰÷c·YìX˜0*ž` 4Š`hÁ:Ð(‚u Që@£Ö€F¬jò ¦(Ã~˜Žk½o”á뜧›†Ž­k›˜rH7ÖSp•’¸•úÙã¸õT^À¾&ž`ªÔþƒ|ëOzš¥Æ/ZÙXAWΓ||ÇÖ·ML9Iq™RK}Ѥ'ÕÚO±ísîqÔ×ÄLS÷5ò=>>gv\—R6¶/ÒŒ ½ÎJ\í].4.¾}wñÕÿÜo>JÏ¢¦Œ‹4Ö¾×S~»ã:~1Ç(t®Å¿”s7÷ۖز¡cª3õ@Ò`gÿ24yJëb~qæþ’Íé‹Ù–½Ô?Û¼ô³Tgér¾qñí»¯N)h÷µ€ùêÍ‘:.æXÛõÄÔé#íSê¸Øõ„Ž‘}ÎÄösè¹ëúVDêoÎùJ¯É=eU Öõ¬¹”æâ[·&¡üÔš_m—úÅ[¯œo\J¤L´ =¶S¥>¸ÚðÍçr® 9~9í=SŽßXÇšÔ¨¯j°®ñÍfs”ûÖ­ov‹™.Ùã2õ,ã\Ží”ýÌY··[ÚñËýæ'd.ç ,·nl\™-ý5}ÌvK'å3»¶›ûx¤ìCìùáJ‰É­S×gþ+Õß!ÛOeÌ<ñV÷Ö®‰»ÁØ3ç¾ukäúúÞ—lçžJëRÓ|©®uv[æRêkjæ6¡|éP¹Ð>æ¤QøÆÚwŒr­TÎÞ_©\ˆk\Bc-õ#TçX|mÅž¿RYIî9è;~©íÅw;UȨ́]w˜FwƒIY·61¿¤SËåÖ™³.6°Rgl»1åRêË­kÌ:Ç(—Sï±Cîy˜˜çœ—Sœk)õÅ7¥¸à¦B ª‰M1X+n݈j˜•ÃR¬ñ\^ã>@ ̬"XE°4Š`h˜\¸p¡xëÀ@÷Ü{ß(õ6ñS¥ÜBÚl6<$ M{èÁÔ™³çԣׯf/%M<ÁÔÜCï-#PWªá L™QÀ\ ÔÏœ=笷jκž9·ƒruÌÉ"gÖw»ÚívbºËf³9yŸt´l‘3ë.v>;³ìhÙX3ëMÜ †`s6tf½é»Á”بe‘9ëÀŒ•³N° ÄÌ:Ð(fÖ€F1³4Š™u Q̬ZÕLç ë¶'?÷ýÖ¹]©rsÖm·J)¥ú›ËuÙõ•lÃÕž©t;®vÇnglöøõÛ­øž«\ìþ»Î qÛ®S}ßGÕl·ëŽÛtÔ§×û¶™«’ãK°¸™õÍf³÷/v]+rm¨÷ýv5ziR€>f`Û[A`oµ 7󏏯Ñ%f{û|Áªfõ¿92ÿØø-nfÝ|2©·úäR3àv­ÓÌmÌu¾:êtÌBJÁbÎ,d¨^é}svTš)u•“‚êœöBrÆlŒöRÚt½ÛßCŽ­«îØ:SƒèЬ{ìyïjß5l¥æ69³ãºLé™u©>û½˜mÌ÷Ì2Ò~»öA—óç\ÿH€‹›YŸ#3ȶsiÖÜ•ò;³.ÍLJAHÊl¯]§+•$%èòõÅ7£Û^—0Ëš;f¹3³¾ö\3Ë©ýŒé›´of½¹Ç6wB}ômãÚÎw‹á›·×ÅÎ4ëzJά»úb¶%-CåÌõR`>÷o`*‹›YWêtF]šE÷­k°+u8»>µó¢CdØÁ§ù¾äí:ÆHSñåEûÚósI§iu\çnR #HÕZJÉ틯ÜA8=€5kf½j°®ñÍf³”Û)2­ìrÑÓk^²Î” N}3í¾r-™ë>¤|£Ôaú‡îÑ W_Ì”)5¥¥}€¥:³î ØIƒÉ3ƒ>—Yö©gFcf¡cå䔓îa¶:hÚÏZ³×¹ûàË¿/Ý?[êEÀµfλ®kjÖ>Flç¸o0ÔX3ëÝkWzs£‹—.«£££ÑïÂbÖoÏœûÖiçÏŸ/ß©®¼u)-Æu©´ÞÙžúa¿oÏø¦^ŒsÁ§k½ÍÕ—Ð-}Û»êvµ7dÌbSr|ØÆ^œ2Ö)ÇÔ—ÛžÏÐ}ð};úæ"öØšïíõW˜uö]\ê[/£1ë|} ‰ékì´1¦ÚeSÛcFÀš”˜Y—bòjÁúPµ‚uóÖÂýÁ—̶0ŽÐš¡º““èÀ²Œu7‚u«ÒBÜB†ZÂ>@I‹¼ ʋ͹Æüplh×Xwƒ!X_¶åâØÐ.ž` 4Šœu Q̬kfœõ ÝËÙ÷°”•ó`™˜ú|å¤m–pïÛ›%ÛöÛ½Ÿíõ®÷]åÐw7û¡KÒ“Jcžd 7û©„&h"c\Buæ´ç;¶¾mbÊIjŒKi{A¸{_;~À´¸»Á˜Á·ô´ÔÍfC€~“ïã9³ãºÌ²±}‘in¯3HߣÞÇ.—УÞ%¾:CãŸûÍGéÙó”q‘ÆÚ÷šowK±ªœuõS:¸Õÿ|ëbgLu=®zKöÅlKo#nÒ>„ê,]Î7.¾}÷ñÕé«+÷غömˆ”qñý¡`ﻫNŸ®ëþÅÈgVk‘9ëzFݘ‡Ö¯+ ÔJd9JÍ„æÖ“¯]ª½ÐqÃÐc[2`÷qµ Þs0ûhÕ"gÖw»ÚívÞ4×ú5ñͰšëdN1.93Ý¥ÚkùØNÙÏÜ™uƶºû¬¯y6ÝT#‰ ‚Ö(I¹Õ®íæ>)û{~¤üq³ý‡AËÄÖeÑwƒ±s{6}í»+ýÂ5Ón—)uqŸ/ĵÎnË\†.´Œ©ÓÜÆJÛI}ñícé‹y}Ç(÷ØJåìý•Ê…øòû}c-õ#TçÔÌÛ2êפZôÝ`rÖ¯E(€q­÷•Ë­3g]ìCêŒm7¦\J}¹uYçårê2Ö5 †ZdÎ:Ö-6Å u‹¼ Ö­•YU€¡˜Yµº»ÁsÁÌ:Ð(fÖ€F1³4JÜ9Ë{î½ÏY/wƒ 𥳸\¸pÁ»¾‰'˜*µÿ${½h‘/¥%GO0 îêX#rÖ€FUÍY×3ê®™sfÕ°fUƒuˆKA9:æêö;ît®»qíJt=¤Á…¹ò”@]©Fîì:–æÆµ+{3쩺RÜ &e0:`Ï Ô•" Un ®Á:Ð,‚u Që@£ªÞgXŠ .¯“`èž{ï¥^g°þ‰w<%»Ò{î½O=ôàÙåc´<€ñ´ð#K–,Y²dÙÒ²ÅØÕ¬ßsï}ƒ*ZÀ¸jÿ‡È’%K–,Y¶´l5vín\»ÒëN*¥ÔÅK—ÕKÿâK*w X;&?:::œY¿ÿþû'ï€CÁºŽæÔÅÝ`€F̬_¼t¹F?€U»ÿþû²\Ä»Áp)Pi0@£Ö€Feë·ßqgÉ~LÖN©úZí×tßjô1§Í5›),uÿÇÚ¯¥Ž çL¥_87®]Q·ßq§ºqíJ‘Æí6JÕk·1F½R;¦P›c÷kб]ª©Î™ÖÚBê÷XûbžÛR›Òû%Û£þRæzþöˆdrëJÉ¿JêKû¥bîÖnŠ?¾Í×cþq0‡Ï3ú0_gΞS.\oòâ Ö%®4-&` ýò3×Û³ù®®Ð/q{[W¥z¥öb¿e˜º_1cë*ãg½½´?¾¾¹Þóí»ù~¨ïÒû±ýôµköoè~KÇß·¿1ç…tÌL9Ÿ“ÒRöUz?e² V šåûÔÏ‚¯?ÒXÚ§uo°@M=£œÚž½Þõ ÔUïXûW£_1³’¾ÀÔPIýuµåÛ_à“»ß±½-&å#õ¼Ì‡P­|ÓãêËÐÿ;r_)Cú?ä³X3PwÝ:=9 Fâ ærÁä”3ù×úå& -ôËTúX…¾i))õ†˜²sPò˜-å|”ú¾†w‰ûkeêY9ë±ør¬õqˆ1%¥Œ”nCj/ÔÛ˜}šBëçÕ9û¶Ô@°R îÊY/~Ÿu3òÍšù¦Ü`ª•ÙBÛ”ýª‘·Zû[ŒZ}¨¡Äç¦ÕÏIÌÿS÷»µ<ð–úÈã Ô]ϬKLå”󕵃‹”ö¤ ¸bú›1º+g}63ëÀÜÄêúµ¦gÖ‹_` ?P7̬Ÿ9{n‚®Ë&Ý7=–3g}H¥Ê! hÔ­J)ïØÔÑÝu×]}íN8ôÿž^8èR|PIEND®B`‚PythonCard-0.8.2/docs/html/images/wt2fig11.png0000644000076500007650000000470107440612044020730 0ustar alexalex00000000000000‰PNG  IHDRÈžøíÒ# ˆIDATxœíÝSÇÆŸ=ÅŹÌÅù#¼är/©J*gIˆ_„ˆ1<åS@£aAÁøÅ " 6’”›£&z²'•sŠK.¹ô¿á\4vfgfçkçÝéYŸÔVÏLwoOí3o¿ÓÓýN¦´V!±ÒÙ;Ò 9›Mº%¤q( šÔÆîÎN’m! Çß’niLš¬ÅÒnäŠ2™Lû¥3™ýkÇNëk%ûX³®Òlþþ×:M‹EDhòÏBL"ÛöNðÌš³¯wCxÏš³Å«åߢJY '¬òvQ§s-]¡Ê’¸x§¥³…Í_K)‹°ÊÛEWÑXU¥7­9_ýoÃVäÐûg}[VzYpüà¨oÎj¬=™±n~v5l ×ޏ|fɶö~ÅæÐƒ°5›CgïHµCc™.>V®¥K‰¦¼]Ô uhس§ì´½ÛýÑ{=ß;àÅë®y~ú÷ò¯ì¿b4ÖKy}Çó}ŸæûO̸÷Ýd,5Ï­˜î_X\peùLíÕÍw ÍwÔ^OÝè챉ҹlj‹Åú}»ØÚÒ‹ÂRÔë œ˜º{Ê®›_æ«eò•Hi­ ”¤Š«ü¾FÎEX­-]J[¿o´Z¤–fT¦LU‹åäÙVÍõ?-¯øøƒAµÿÇWKÇÚ†Uúɯ‹*ñÙ¡/Uâñ³º†Óíã¾ùyÞZí™cW¼¿wië²Nv} àÎæ%µùå¿n¸ñè|Ðs¨dr©[§F7|u§ À \¼uÀí‹ß_¸qÂZêîø:=xí㕉§úçŽêëÓ/ôÌ|¤67f_Ek^ìhméMß".]aùŒZß*˜±æ«rõ¾üï£ßþ|øëŸàçc}òá9ëæ§ÏøîÅ-[Ïo8uäÒçGÇl>]°æìþdÀƒf=*pîäüð©…áÏ,Çô~¥ª›Œu/Žõ,z×ccj©Àµák#ÆOû)Œ• /Ó{îMü `àj;€Õ©gkWž8›?¤3<Ê¿ Õ*i´˜:d.Kõ€ê3ä*Üye¦2{{àÚ3´½Ûmã ØîãG3Õ¤ZIwÇd°Œ+AÇžxŸZßÜ‘º5&2Ú\é>Ñ×»ÂÍ\ NK³¼5`øÔ2¸ûíxÒÍñbuêYÅp¼yXý*«¿åë]áéòö&€òö¦2QjW]`(/öÈ?ûüR¾ ½u DÉð¬|?×]¡é{gƒÜ^º}*Zý½³‡­]aÔolýöÕ¾ßGWå®°¼]|c±ö–kÑnÄŒÎá©=7 .ÈŽ†ÔˆƒvÞmœ<|qëùMí¿Ÿn¯v%Ÿíœ^/åWŸLë=jkèäµå­‰»«Úª‹_ܾ¹qáëGUÇϦúVæVò÷ûô5Ž5wîáÔRÏÄÝ/ÔÎ…ÑÍ 2×Ï¿ºÓDUË—šïPÎûÊäÓ«íº+\Ÿ~!j±¢)Ïiœ‚t…™ÒZ¡9›Uã§ú!´ö±PérÙúDëïÇ®êÆP Ë„ºi¬Yåɶ½|Lüz±ôzw'T~ýH'B)õZíq¤“sÇrzZA|¯ç¬©ÄÑ\¿™Dê;y.Úd»§èù<+¬Ým?ü~¯¾k¬Š8ÐnºoØüµ”²ÂÙ )Ã9ÀÌoá|,"B…ÅêêlN¨†°gù$5A‹ED °ˆÂ""ø7Øž¨©9ú3ò[«å2ÿÆ#Ð8–퇯]6QÖ¢ÑõM„0¢+¤2(ÂrZËœ [UÖ:UZ:¹šIB| ÔzLv¶öDµ{]Aª²ÎêW Û¦ó©?Q|,u¶ ¡}2‡B›cÌi ‰Óyl0| †­™¦+qjµXj@K§#”ÒUé=¶üΪJk…h-!BTLM&¤vÔÔd#ƱHãAa(,"…ED °ˆÂ""PXD ‹ˆ@a(,"BЇР?_€Ï­ã%Äì†P/ÏHµGV!NÂM›i¼IwF†@‹ˆQX¶53)ý$rè×Ù;¢£Y6ÆQujVè¼ÇGô‰~¾¿A*ì•$J”9ï©°X¾Lü,R}ßÐ52âÝþ(Â2_UA0á,T/œ:"¾òÄ—à׺ŽKcmm-íuÎC¨\®S­×<Þ«[MÐVGƒØZq‹e[ï±>È!Jª-½å,HXÄ},œ®‘ ‚·!øU«Ú’Ã,+½Ö­âA aŒ"ãQO-¦Kº B½-–ÇBøàkäƒäô fI‹% GÞy×oçBøÉÞKîîìxhFpä=4ÆYK’>V²4ÆYKD‹eÂÜ„?²X¯ww|ÿ“nc8¢øX„!>–/V',q‘ñ±Þö¤©À(U$„°87Óœ{³i÷ 'º½Í¨oÜ‹?>¾(Þ8eSþøÙs ò6ß¼ÕÓÖbì阘vÇnÀÎu“7Ý5°ØÛ¾rà»íOæÓ~þ£ëóÇ·­{*ÜÙÚRPkç!À†9W»Ú¾{ÛóZ6.™zeÁyÇÞW & ɵ¹ÿUÌýÚ'qÿÁ³Zõ¥ »Hìi~ÐxÔd/üèÐ#ëȇ®üaþøŸÇï|¬a‘+Ÿ“O]Ž!×´þÔÛæ™oÄøuùõõ€ŸXŒÏO܈ѓr"|®{Àk}é†.Œ±×Üx? ÷áµ! 3Wììÿ² möêƒøþš_~ºäZ@×âq€ù÷õbÁ¦ß:æ-(·ô#Xö³Ü"tÕ­£µÚ_·ûe¬ï> {ÎZ¿ùÙ‚ëóÆ_îãnÒ‰]AÖ/O±äù„™…ÛÛäÖ ožÚ øèˆVˆN‘,œD—}[nÎOš¿Â˜Üú(ötLÇ® Só×n\ö„(ý}yáô N:÷¿Zòéj©±{ûtKMècdû`š©¤×/È¿-5‡wÍŒ±Büîs´ËZkrÙ„eÓ‡ÖwŸ†wLZf‹JsÍá\“èPD rÞCwŠÔf¼× •ÆÔE»°{ã4À Kö¤:üâ¶ë.<ðô_0{Ü¥€m¿ù¾óåKÛŸ}C«¯…t©·ge rÙ½EâO€®A’À§uâð®y8´ãöØÛúöÝã‘U¥‹tsï}]‹ÇaóÂæ|Zkç¡¢SŸ¾€•³®BÛ- é÷ì<‰5žÂ²éÃpç”+‚ÝD™ð³S¥ÂK~…*N=bÖlÌ¿…´‚ÿûÊ[¶>äÄRlF–Åâ­ÏcËšƒ>RñÁŠÖNÖô;»«6XqƘ‹¿ÁîííEOOO¨òöP“(걂­tÏÿñ±kÐßß7ðºCsê-Îÿ]?3©Š…kÄ]>êzìx ä?û3àñÒ/‡÷ÔËtq›RÃÔE»òOÔj¥¥¥¥x¦ËG]O£@],’ÊÁ+ ¶ÔÄeGz·]).òûî[ÊaÑÆÏ®" =! (BP „( @Q™@¢ HK»¤:ÐŽæ• D+ø+Ž@4¯öTù£´ÇÙ~©ƒí¢ Ž¾Ð©ÏÙn\c¤ø w—Ýdœ7î§î(íHó/4j¢ìiîËÐ߃È:,Ì'Žºmªìòí±¬žbm;Û³Òdß!Øq8U}Qåª/ì^Z·]ÙïÆ¯ýAï!,¾¢3íˆÒ½zu¦WªìŠÕ½Éì“]·§ëÔ&¿3=ü´ö~ËAè)–Œ¸cú«™jÛ”(·H"ÿäàÀŽ“jêÛ(¦Ìa‰ý=HÚžx²¹uR‰ÛNY_”ã‰^QÄÙ©anN¶æ)6€e‹d¿x-@ÃÜ›¬œßúÂäª/t6d¼Úõk¹è€ä“[=åžGÇE¥Þ0ðÉ-CMQ@”€J}ÊVê}Ù¡@Q@¢€!DBˆ „! ªB i !ÉC[ ²˜YzÜx} BH„ö Õð²ˆT/¡âüWΚ¨s%2d×èuˆÚѼÎO-eQ¥úPßkpëØP)L€”†HÃÝUOå(?£T…\Ó3(‰T Ix'ÁR9øZƒøñ^Õ¢”ãÓ›°DæA¢ü’0NÊm#IUõE!åD~QHˆU%zâ—ª!~¡@Q@¢ÀµÍ;¼á@Á¹i¶UÅWêG6BˆvW:ûNMú„! (B¸Ö ¦ÙV;Rû-Iï7—@d‹£î½\idöÚÚ’³W¡¬ØÛÛ£¤šèÚ´¶Ü&hã+š·§§'.;H‘ÏaÁE:! (BˆB+Í+N^{çO;ƒÔ¯ºH:ˆå¿ÜFišçBWšÎµ Èꌣ’<\©ÙèÊÄmL7GxdcÍ") y—@œÁcA_䨧ªÁ¤›Ï«¬UÆëØÞ†,Ížn•“å/f‡¬.Ù9)Ä+X1)žb©~á²*l~òÙ)6p½ê´  X•=ºí,I>"›“«ÎÃf:ã·l¶8à+—ØéÕ2G§w¨lJò$®AcM—ʱ£D!T±DóÚºÖy˜|:í9ëTÕå·]g~{Ù5ò$G’ä2´¢yÈ”3M•Ç9 ý¶¥kŸÊ&¿÷PLp~ê"9’²•«"/ eøÝŠ%$©…AJƒ Q@¢@{ŠÕµim*U„D‰–@ÚÚ’½GH\hEóÒs¨ICTjIC¿ÅÍ[m$=*5©$½ß¸H'DBˆ „! ø·y#‚ýŒ¤÷[ h^Rû,iè7N±Q@¢€!DBˆ‚Zhow¿î'„¢¹¹™ŸæâÁÿª¯à÷dÊI¢IEND®B`‚PythonCard-0.8.2/docs/html/images/wt2fig3.png0000644000076500007650000000547507440612044020662 0ustar alexalex00000000000000‰PNG  IHDRÈžøíÒ# IDATxœíÏSÇÇߦ8äèCþªrÙƒ{¤*NʲÿŠ8ZIˆ€-)‹@ $,³’E X¬FH‚•câUIvŲcS±“â¨Té@©" 9´h5Ó==Ý3Ó;=³ßTÔLoOwÏîwß{Óó¦·ÔZm©Ò?\ë"¢r¥’õH@qh6DÔÅvvž=Ër, pü,ë€bÒ%î4[;±*•J%zñïåv©ôâXA*_yQ-ó&ýæç¿ØåÛ°XÀ ]ÑU€OT¿b^¹»\Ùݱˆž»Ë•æÇ[1zaG‰Ø kk»É·{{ªVÇ‚´0¼ÒâÕlë'9Š£ÖÖvS)QU|W¬ù÷= ¢Ã¿ä%ßüã.½ñ›"úzë½Õ÷r_>]&¢ßŽ…Ÿ‚š»­:«‹…·¾˜T­ÎG65»vŽˆ.ß´gbñâîâÄfì¦R§¸ö’‹¹L…°z{ªL[\:\j{DDT:°eÊ›½ï³@Tɱ#£<†M‹sïͲðwåáÔrsò|uA®3”ˆ.žn$ïnré8-Œ}ÎíñO~?¶0°4ñ×ä-g S¤(>¹DF!¬¶›}=UÚ—Yz½ïþyÿõWOÑÓ×Ì*‹6IóMÊ¥4–ŒÕ?\ë®±ÃMTEJaõõT™¶~ØnQŸ µ:Ñ «TÚ7ZÆpWøäû[byÿá ®ð‹onÈÇžxkŠm ¢ú"š9³Z?s—ˆ®ÜkÎÖÖ‰èârU?’Æd«q±µ2õˆˆÎÎåå·§¿Òè\L†YDŒU"ê=οˆ­ööˆˆ’DDLU¶ˆ+cYEo—‡oú¯ëµ†5E‹•S¸¹â>QÒbmôîÇX¬Ä*ÆâW…G~=¤¯iËú“Y"â+/ŒÎ#"n±ò«Ä0KBX½='¶¶7ˆhk{ƒ™(¶KDDu潿» æü‰"bÖ…S‹Nûûd`laÀi,îÿ;ê…$WÙWØ<‘ °Þžû/Îðjm½þêi×C'ß¾´þdöþã“75~òsŽ“ƒËó÷GÅà=ÀGïV¿32sk˜í^=»æUçÏ?œ\:.Ne-Nl–¨´<ùåèü±Ú\¨7¹ö­^ù Õѽú·DtêÊkD´~íû8g¨"žòdÇgâ K­ÕF¹Raó§ü&´rKž8KòrC—_æô&tåð+æsâsÍÖîÎ3«úü–NŒ£ØMhV¢¾¥Ó«šÇ’#­|ÝÕYjN°ñ“Ša›</Ù.aŠ^ĽÂ|IGÏùê‚í¢‡t—íÒ}më'9JÙ 9CÎ#ð³äc'°XÕþrFÃð„=á/H,p„œa'@XÀ ÑÓ û,5‡ÿ׫ܦ\!vbãù]@Àö,’|.0šÇ Œ8•0i„ßï4ï1PÙŸ·ÛÑYð—<9MNÁ]¡oowçgæ]þ>±äŸbÀEŠyÖ  RÜÓB”H>6p”y´ÎBn6“n2Z§ß:#ai¤#¾Y¶Ö>Ðf )±ròÏCî% YÙ§Èqž\Ù¼Nò³`„ˆæLÃFë4NˆcH+Ë'G(¿`‘u²B‘™¤²·Xzüy=‰L”š\b؈¼«iÖ¤_e;.H3»ÁŸK0NÛ†ôßçX`ìI…ÅC²4]r*6%waØx ¹åÈv5cŸ`‡s 5Äž’…Å Pðy¬ö3p¨V"¿¤/7ìbàPCüo;<óN »` ƒôNÝæóšUy¼–5ä•…æ7i +}Äïtl á3&…°Úÿp‘¢£ x+$¶©Üˆl_9†°^òm¸ÂôÙ|^c΂ÿ Tà®$àS…|ƒ× óAb‘7оئܵÞëÉò£ ¬ ° w"-‡Uƒ&• Ô ÂrBÀ$!`Q’7˜ú!Æ*&LÙi‰;€‰¾#,–¯E̼‡ K}Éȯ°üœywd® ‰p…[o¾}¢@‰;'hNÌà]Ÿ¯¨ÜH‚ò6p1špA¶’b$º*Œ>ªiЪ—t{OÂ/á7-¬–öy/b|ØaÉuVZB`/Et ¯™Óž÷Ÿ\î0šÇ21?üÁ1É?uå¹éœD«=Ù•š^Ûé-9Î Í<`JXŒ…[:À 9Ì•ÏäXXÀg ,à 8ÂN€°€ ,à 8ÂN€°€LoB—+ENdë.W0Ÿ.Ù y¼QmBQÏ+[à  ,à 8ÂNp",d¦ƒÂ®6S¤Äe¯[«µš~T…VÁ˜k¶²ÂKL¾±n…eø{Fmån&?Šä»;¾Ø- êÜb™üž‘¼Êƒþ§”Úù£H Î…¥ùt ØWâó"ò-Æ2dä9YÎciìSÓ| ÝKó¼¼ùû&5­g 1}Ä>§á›À ÷Y‚l„^]jôÎ2FÀºË/sæ"UhU9VA…b[“•¤+/Ü„î,4ú3—¦ °XEÀPaî—w—+iÙ-X¬ÜÃÒÔ“qŒUԫ°»óÌÄÓ)eÄMËh™ +] ÒÂÛÏÅTX>Oót,VSmžCŒUü™;å@Xy%]'¨Àbaå’tçÍ]j˜ÇÊ7 UTŠ.ÂÊ©¹‘t5+ÇÄ–‚;CŰrFrså:¯aå˜óìíQY Kdå¶©Šl-VQoõ¼ÂhÄ*\aÎÐkB3Ï™ú¨L'Àbubter]™ÜªÁb'¤l±ÄÇG ‘4¤ï }[ìÅ“a´‡0Öþ¼‡®P|^tí Þå‡â±PVi“°ä­°PV±ÉÀbÉ`¡¬âÑ>aY}ÞX(+ï8 ÞÃ"ÙÆ`¡¬â‘¾ÅR®\%¯h……²ŠéúX„%²²ëcW´VùúVCX9 Z«e=k ¬/[Å@vp„œ€œwà ay»ð ay;ÍåO籘eâ–ÕÊGÀòþæ‡ÖZ}e6¿Šíu^Ý4ÿ;­RǤë;”:&¥îoÜô]íoü™²¿ñwh}ÿ¦Ûß1~&ìt[êL“Rÿ_‰ñúnä}‡†ìo|Œ×—½¿ñgê|ÞÄû‡†ìoüZkÑ„û‡¢ÕCÎþnìÿxң߽ö^Ï:j£gýÜgqx¿ÿá…ÿöÞUxxÂ*„pÝ5g¿å\÷Èÿþè}«ðÈ*„?úï„G_wMøïï{$¬þÇ ×^¾/<ú—Œ`zŸû´¼ím·Ýî»ï¾­¶É«ï¥U9±Æ°þ_ÿð¿…ÿú‡‡ð¨U«ExÔu‹ððjÞûpaõH‹kBX<n}‡„ þvxî-?qñ–ð¨øp݃o ‹kßpƒ ×¥Ü}Ͻ£m?v9uaý]/ÿÀð;ððÙ¢U¨+ºÒÍ!„Uxøá?_óÌÿ)<üÈ¿?zÓ›ÃÍoýÏáVnݾkÿ׿ù¦Bö¬¿5zÙï¹ïC!|ô'ýíÑ˞ʥõU!„nú oæ–äùéü¥!„>þ/÷Nê»ï¿(„Âmw|ßNê€}pÃM·t®sùÒÅ´äªÆ°þäû_CïíYÜuáÞVá¶kÓ`¿wù5!„sÃWÌÔ‚a~ãþ¿»1ïCoùúÉëýw?u²1ï#o½«u›_ùɳàþøOú¦ðËÿúìƒÇ?ç›FiÏC÷~íÆ¼'~ê«:·{àÍ_BáÆ?ÿêQÚÑægÿéægëéŸýšÉë}Çÿþ%篟ýWþÁ¨eß÷/ !„ðIƒû[ßð¢BÏ{ÑÎç½åû¿ „§|á·lì§*øÇá¾i~“æ1ë!„+]è!ºV¸¶¬šÿ¨ó×Z=œU1g~ãþo!„ðgnþºÍ»£ìÈG~âI­Êöz«ÞõÅ„í»áùgÇäò½_üñWdö]¨‚úÓ>ë;’wmØW·Ýñ}£ŸÍç½ø9'(N[ˆÎéy¯—sÃM·„nºå¼Ì¾A=„ΰÂY_…«Á½Rÿ)\ôë£Þ÷¾þË{^»öþôKC!üÁ/¯ÿÉÿO<ál(Àï¿û;ÏÞÌ—…BøÏ¿töþ>öËÃÿû‹£ü¼þekï÷òw„BxÌÏÂÕÿóà·¯-ÿŸŸô•!„þÓßBáƒoü›áwø¶ðÁ7½|m½ßþùoݨë±O9^ñ›ï:ëÅ}ÜSÏzuÿãÏ}K!„?õq_³±Í6þý;ÿÎÚû?÷Ìo8ýëÿæ•ÛýÚ;Ö‡¬|ijïìUï{.¤×¯÷¬Wªö'<÷¬=ï~Û7¬mó1Ÿ|¶¿ø–³¿|ìóþnøÅ·|]¸þS6ÿ¢ÐäÁE!„'}ÚÙqþ…;;Î7Þþ-çë<ð¯ÎÎÅMµöKÿò«Î_?ùÓ¯žÏwý‹õsýÔÏ8û,üÜ=s£îûß¾}c^Êýw¯où‹gŸÕ‹ÿäìsüŒÏùÎðÎù²ðŒÏ9ûï]û}ñÆúŸøW¿'„ÂOý£¿¾±ìÖÏÿÞyqÏúOž~áÚòç¼ðõ!„Þö¦¯Íÿä/xÃÚû·T=ì/~ãFÏúO¼þ…kë>ÿ%§!„~ü{—íù´¿þó`Õ{}^·n|äÊ¿ï ×<²Ö« þ~õ%áôKσúþÊYPÿÇixÿÇW!ý»2ë áO~ì—‡?y%¤ÿÞCëÃsÃWœ…ùÝÏ‚û=ñ+ÃU!ýÖÃ×ï\ íM>äÉ_ûä³Ð÷[ïÚÝèÿp%¨ÿÙg|}ø³Ï8 º¿þÓ¯\›~ØÇÿ­ða¿>N½ êþìo þì³pý¾½yx˯þÔÉÙ¿ 'gï¯õºí®ðQ·µ‹ álÌ® …©‚úžûÊð1Ÿ|ÖÆ_zëúž_|Ë×u–9ÄþÕCanú /<ùʸõŸ¿Ы þ”ÏøÖð”*¤ÿóõþqŸùíç!ýßþ³¯Ìªÿæ¼&Üü‚¿n~AÒ¿|mù;äËj¯Ï>óÏüKßžù—ò?÷M>áó¾'|ÂyHÿkËnýk¯ ·þµ×…B¸pe¬z“Ÿ<= îÏY¾þìß• BÏ}á÷‡ç~ÁÙ¿Bxë_´¶íó^ô†ð¼o{©‚úó¿ðMáù/yS!„{¿o¹¶Î§~ÑiøÔ/: é?öº;ZÛû¤·ŒwÏèY!ÿoÙ‹°X=6{áç÷®×}ðW‚Za {ÊW‡ß|׫ÃoþÜÕp˜êUÿ¿v}ÇŸ~úæ¸ì©üÚÛó.í3 f û¼³õ¦Ã}¹6v½óÄO}UxðÇ_qÞ£BOºý[Še÷¬Çªõ}÷¬Ýê½êõ!1¹2Ãz¾kyoX­.*D…pÖ³¾þÀ­Ý´ðyÚ+Î_o¼9f}ŸüÎ¥³qÍ_OyÜS¿ú¼gýO=õkö& ï«'~ګƒ?V»~DÇûYŸûÚóß·Þ^ íÀº¦‹@w}ËÅÔŤ©‹N»t„õ~A=„ÅÆ˜õ÷û¨/ ÿå=¯]»È´»þ‡¿òÝá~ùêxÝêÓ?ñ„/ ¿ÿîï ¿ÿKý† |à / ¿wù5k˜>æ‰_~÷ÁïH\dºy!a“ßþù«ãÔÏ.0/%þ™›¿6üÆýß¼qûƽåëÇ>ãëÃxçßY»È´ºÀôÏ=ó¯ÿô+Ïï¯^÷áÏúÆðkïøÛÃ`>âÒþjíŽyë]á#o½+üê…;Ã{îk¿(õñÏ9»}cýÓ'<÷•áÝoû†µ‹L« L§rãí¯¼ù«“˜¦<åÓ¿5¼ë_¼<¼ëŸ_ý…쩟ñm§õiŸõágÿéWlܾñéŸýšðôÏ~Mø™}Yvú3>ç»Â;äK³/2íòüÐÕqêg˜^Ý™ ÿðê…¦·~þ÷¶îæ'-¿/üäéK¿®]dúœ¾><÷…ßÞö¦'{Ô?ùEoo}ËÖ.0­û”/|Sø‰×¿0Ü[»È´ºÀJÓçŽ/mšÂxß_—/]\]ãÍçO\zú ~0„ßÁå½áì‡ר™GÂË_÷oÃk¿ùÛÃ5þ ÍÊ¢AÊñ°«‹¯ŽW©-ÝÉ“XD·í?9ôÂ… á¾ûîÛjû—¼úžQÚQ•ó¤G¿{m~cú~ܳ¾9¼ï}ï½z;õø Ñ`ñG¿™¿2léî{îuû±Ë©k ë¿ÿ-„Ö5¹æÑÙ¦MÅø'¿<´ýâQÝcÝxâ§½*,ü"¸æÙŸ÷BÔrîÿêë6{MàÀÜvÛm³n?v9±Æ°¾¸æºÂu“T c¨†Ìmªvd< ˜ÃFÏúÏÜýùs´È–zø`y$¶§g %¬@¡„u(”°…-¬õhÖ}©—~úž§jý]ž_Ÿ% 4÷Y¥‚ÌåKà 7Ý._º8j£Úêk[ŒöÄÛUîvÄvQÿû·}—Ç­Þ†¸Þ]ŸC€me‡õÒ¡kÊðÓ§ì©CØ!oƒ¥@ 0ž^a=¥©³²«^÷z;ªåcÖ*¿^G¼<õz̶4Õ_ŸÖ×I“¦ó4ÅñË©oŠ:û¶%^¶Ë6Äz…õœÓ4Œdˆ®PœjSS»rÅ·k(Å”=É©ãÝV¼¬ë—‡¦rÆ8~qšê›òx6AÏ©sWç ÍÖÃ`RƺP¯Ô€Ô¶cŽqï»}ßõ§º ²oÐÝE;âz\L 샭‡Á¤”²Çrû—óŠ]q=@Úä÷YßÇÌ>=ãõñÝñPÃ'ú›ãó²ŸQà8ŒÞ³Þ6f¹¯Ô˜í¸ü¶ú§Êcîßœõ7Çm_ß‹3ç8ž9uÎyŽ*‹Ë—.®®¿ñæðÐ÷ÏÝ(‚¿ˆs»ûž{Ã… ¦ #¬CD¯:P a %¬@¡„u(ÔÆ­ï¾çÞ9ÚGíÎ;ïܸCcò>ë.\ØE{€Âw¿æUÉùEZ.—SµewÜqÇÜM€Q4=óȘu(”°…Ö÷Èâd1wØ¡ƒ ëõ ÛjsÂî®ñâdqþ¯Ëêd5J}S”‘»ä+6¬/—Ë_äº8YŒˆûÖ·«:§Ü¿]7€cÑx7˜9-—ËpzzšÖë!th Ë!4¾¯Ïkš¿:Y%·KÕÏ»®¶ýkÚ×xyü¾kßRËRûÑgŽM‘=ë§§§ÙëÖÃcêu}½Ü¯— M=âÛüÒP/7¶9uÅÛ5iÛ®Z–3mû%$nK}~Ó/ }öàÖûH…ǾCK†ëzýmíÊ­¯­ mmìjûúš¶í:V}ö·o[ŽM‘Ã`r5]TÚ'|§Öí ¨]Ãcú†î1†îô);'p÷mSßP¿ívÇ`¯{Ö›zÓs{‘s‚aj8M[™]e °Cµ•“óËMÎ/c· €«ŠìY¯_XZ½nÇžsqé¶Ã\ª1ðMaÆóú\(_°o×Tn}»Ôû.9t6ýÒÓtQjS[Rcðs¶8vE†õ>˜æèàÛ.0Ýõ¸ñ!ml«¯OݹÛu½Ï' ¬Ûëa0!äé®ív¡”úR=ùñrwc(C‘=ëLÇ]YöÇÞ÷¬À¡Ö PÂ:JX€B ëP(a Uä­ëO0ûI°/Š ëõ€¾\.vŽ’a0P¨¢Ãº^uŽY±a]PàØÖu(ôÓÜŠ ëÂ9: Ö XÂ:ªÈ1ëù~kÇõ=vÇõpÌô¬@¡„u(”°…Úû°¾XÜ‹Û7^o³ JPä¦õ§—†Ðý¤ÕêÍÉ×Û,€¹Öëá<îp,ö~Œ^uU‘=ë!\íQ؞õÓÓÓpzzj G«Ø°Ç®Èa0õÞtÃ`8VE†u ƒ€b ëP(a Uä˜õrýÖÜ €ðع{CÏ:JX€B ëP(a}Ç‹ÛçnÂ$‹ÛÏ÷­þ:^'µMýߨmÚåvczLÚ¶ÛæX7Ó®ó W|X¯?Íô¬Vož» “©ï[¼Ÿõ@¯³Z½ùüߘaoè±.åÝþÅâöÁÇ:uþRõ•rìàP}7˜©‚zS25¯>¿¾]jynyMmÊ©k_T!qè¶•¦c™s>›Êl+·O[ÚÎÑ>Ÿ»¶;ÀvŠíY_.—áôôt’²ë=º©i[djJ¼]\gßÏT]S3:4eŠÞÕ®ãÒ6Í=Öñ>ìÃ9*‰^u˜V‘=ëSõ\]+Lrzu‡Øeš¢®®ã’»lmÙ¦Ü!ËöÁTÇ èVdXa}Ìá½ õi¼|h¹•}>Ð5&yh™©¡&qù}êî:möýíZ×ù¦SdX¯ózÙsBð›ªý9㶇ï!íØõ9šbÌú®ÇÁïû¸{ØWE†õ]iëUﺱëÔ¶ù©±×m/Ö{ëï÷ES¯ljêç¤í<Äë¦Ê­¿Þ·sÔµC¶:œE¯:̧ø°>u¯zÛ0‹>ó·YÖ´|¬¡9¥Ê9Æc·1–åÖÕ·=c¶e›í€2{7 ¸ßœ?ؽâ{ÖÛ ý³ü!„ŽcÞw€c±×aý˜ƒç1ï;À±Øë°ì£ßš»{ìÜ à€³…Ö PÂ:ʘõp|Og¬ïoÓ¾Çõi{8Q‰Úþ3tY¼NÛòœ‡0Í]fÓú©m†é€±ÖC˜> ‡0¬×¯þC½myS¹¥Ë Mqx¯¶­/ç9fCz3ç<îSüR’ ¤c󾃨Sœ£¦2§Ø÷Cøå€ÃUlXŸZÜsØ´,~Ÿ ©9ÛM!Õƒ˜´û¬ŸÛ–Ù˜åí"ˆ±ýeŽUvª¼úw5$E¯:s+6¬WCavÑÃÿé|èŸÒCþdÑ!¦êaòשŽÙT¡sв¦Ô78ÏÔ·©¯i¨MW™C‡c5•µïàpÖë}¹\î$°×u]\Ùf—?è‡ö¬w•Ùô‡Üíún»/Cºþ³Ë2»Bõejˆú™€](2¬ï›¹‚ÌTuæ 1˜²·o[ºÊ«÷uì:†–Ù5ä¨mÝ&Û\`:Æ9J-O•9ÕwmWÃj ¯"Ãzýn0Sõª§†mTA mYjÛ¦ùõeû¢m}šºð¯¤cÖÔCÚ6ä!w8DÛCúÔ7´Ìúú9ëŒQæ6wX©¿îúÁU‘a}¹\®ôø=Ã` PEö¬Ÿžž® ƒ€cTdX!l ƒ€cSü0ãÕ8VEö¬» Öt؃a0p¬„u(”°…Ö PÂ:JX€B ëP¨"ï³>†Åâdíýju’\o—‹õ÷«ÕôuMUÇb±«‘ _\itn¹CׯÛvú¶¡©vOqN€íÌÖ«'•¦‚´íSL«p‡ö¹Äá9‘ÞjµJê±×3 ömC)öµÝplf ëËå2œžž®…òxYÓûºTÏéEoëyo+sH}]½ÜM=îõù«Õz9©œ•Ú.U÷úÖÛ»x¯n·ˆS뤖¥BsÛvSÈigÎòÔñ©ä¶×måÅëõ)/µ}¼?M¿¼ìë_`ßÍÖ‡ô–ǪàÜ´Sâm‹“°Zl”Y/¯mY_q@®¿_,ÎÞ7…òjý8¼§¶Û ÚyõUór:_ë!/žž•ÕÜ›¿^o븽àõrêmÏ©¯í”zY]eÔë¬Öoúå&UNÜ#ž émÇ·éXe:¸1ë¹cÓ»‚vêœeû¢+«U9q—©©¡S„ʦ0ÝghHŸëú6SŒ›RÞ!DÀî\XÏÑÖCÏ«¯Û¶lßìKöÚeHÌé=ob 80…ƒ ëÕp–m¶aÜa0ñ0•³mw˜ÛêÛu[vaê1Ö©¡+mc¾§²«_ŒY€yÌziüºÇ_xÚ4¾½cÞÖ3^‰{ÈãíâmReæ,kRìÕûÔüú²¦åmù,Þ§¾® S›ë\4N›ÆY×_7UO-K¹Î ’qû¶iK[;r‡Ö´µ'÷˜ÕÇ©Çmî:q[€ò{iî¨Ma¹+Dé}ßv¸KS&êÊJ9Y*µNßúr3[܃œ;FzÌe]u6Ýí¤Kß¶Ä!ºk»>w·ÉmKŸcÔVf[pè`7 J³ëÛO‡CXg¡3ß¾«}i'“kæn&¬@¡„u(”°…Ö PÂ:jÖ°¾\.מTš» ŽÁla}¹\6>¥´m‹ÙÂz[ÔÀ˜u(–°…Ö P×ÎUqýN/Õëj¬zÛ28³…u˜@;Ã` PÂ:JX€B ëP(a %¬@¡„u(Ôl÷Yßw‹ÅÉùëÕê¤q½±¶Ûâä¬îÕÉtmX4”]¯sí˜[|V''ÉyMÛå›z™]Û,‹°Z­²Êí¬w±8«³¡¼jyÛ:ûjÌã)³†õ¦§“ÖŸ`Zê’V«“µà£ZÎ^ÙE8®‡Òª¾Å•y‡ÎëRûŸzŸÒ÷¥~ Ø…ÕjµÈë!ÌÂ>°¿f ëËå2œžž®óJ= Wë•¢-pÇá½¾N}YŸÐÞÔ› e9á®­G·«Ì¦åqnnð"Qö6û—|sŽgÓ/CË캻zÝsMSýMá3Üõu†ôŽWیݳž*/ž—³N}^}›Ô~7íCµ]ÛñôØÆlcÖK à¹ê!;æõeUoòR_§µ¾ZØj €9½´õu›Âc[™q[RëVë5ǸíqMeæî_j›¸G?®+'P§¶k[¶moyÛ9j;Mëå¨gõ¯mYS/z¬*§©Ü!šÚR¯+5íÚ®¾<ÌÇÜè£è1ë¥õª×5 ƒé;4fŸ¥‚`*ˆ×ßïó0˜¶<Çð“JÎ/_e4„ÔJn@ß…¡miÛnŠ.Ø0†bÃzÉA½M ãÑWÛ_âuJÒ÷—¢xøG<Ü£Mm©II M)i W‘·n܇ žÓƒ~è½ìSô&ÏÙCݤþ×€>פ†Åìê˜õÂ|=ç‹Å¢¨^û¹íÝÇ} <‹Ë—.®®¿ñæðÐ÷‡B¸ûž{Ã… ’~Ž©íÂÒxY*¸ßqÇã7*CÓ¸õÔ°˜¦ LSËëëyAd}œòÚÊh{ßÔ–¶õ›Ú—jûýKmÓu‡”œ‹7»¶ësAhWˆÎ9n¹Ÿ‰ú¼%ßQåIDATµö&zÛ..m[ž £9ËÚÚÒ%§­¹Ðæ\˜oÛ·>=úäxèûC*“ÏÖ·5WX‡CPÂí!Ì–p8 Ma½Èa0Àqt °G¨„\B¶uû@ÙŠ½ Ãô¹ù>:ôý¨ÖÌ¡‡ÕCß?€:Ã` PÂ:JX€B ëd©žÆXÝ;~Ÿ»ý>˜ªc–Ûu<ûž†k;ÖCŽÎyK­³/ç{ÚP’Y/0­¼?¡4ç ¦œ™â¡,©2«§;Vóã÷]â§C–lÈñÜõÃqÚŽ§õ¤íê»R7¤¾œïJj¡ß±9Ž ùf ëËå2œžž&Ÿ”Zç¥?IuºõÞ÷éõ'GÆO‘ì*3·9Û4Õû˜÷± 9^õåÛ<’¾­ÞTy]û°íùËiK<¯¾]Ǭ«Ì±·ëó]IÕ™ÒVf×ñú¹û©¯CþéúÞv•Ù÷}€c7[X×[ž'þ¡Öº¶‹{ÅszЛ–µ•ŸzŸ÷Æï‡”Y­—ª«K*hÕۇѡe¨·³éÜÝ÷]¶%õyˆ—5³®2ÇÞ®ïw%G×w¥©¬m>×må1äÿ¦^ýœ2è¯Øû¬7 ‘96©@;d»¦uÆ2Õ0—!eNÆ.·ëÜÎ9lh¬}ZNÛvmÇeŒa'»™ÛžÛ©¾o±¦:ÚþòÀ¸Š ëUH¯†Ë³m{áª÷Sšª¾!A`hÏúÚÎm©mžÛÇeÈwl¬úJ¶/í8dîS¸¾¡wêÞí)ÿÄ=fÀÿíZξÌÑs^ ÉYïÐ¥ÆV7­·ïÇ£Ï>ä~>š†Ä -€´Y/0_×{Ó+ÇÞ«BûÅhMÂOý­+n+wȰ€œúêu¦Ú;î;¶¦vÖWê}¼^Ÿv枃úò¶ãÙun›´µ¿iY\Wê¸lSfêX7—mÏÑ6ç®m?ê¯Û¾›C·ËùŽuéóHS8OýUh×C‹U‘˜ èWå­1æç®3v}mC?vùC>·ýCö3õ‰>Ç¥O=CʲlŠÏQαº]Ÿò†–5e™Sl7¤Üm¿.>èÇ0`t¹CL€vÅ^` ‡æ˜zi_éÇg =ëP(a %¬@¡„u(”°…r7˜#zÀOÓû>eÑîXŽõâä$„ÂêÊϬ=ëËåríi¥Më°Ôƒxš¦}ÊÚWSÜû;Uæ>ë!ÇFH€éÌÖ—Ëeç“Jõ3‹Åâü_µÕ7žﺾ¾Çzȱv£È°^æÇÔ§RõêNÌæ øUý}¶â8ÔË܇c ”i¶°÷œ‡Ð=ŽýåŽ9ß§¶Ë ŒmÛ¥.ªŒiýu׸ù)µ åh&“³ïMåzsÇzQ»Œ[8Àøf ë¹Á\€O‡­® ›æå,ï;?µ<§}SÉ ÊcÌÏ]g_Žuï!4‚9LÊL PÂ:JX€B ëP(a %¬@¡„u(T‘O0eñÃtš–·­Ã8ÚŽõ§›vÛ¦ur¶£¿©ž‚Bú[}¿»Sœ÷©žÊ ÀºYÃzÓ“KëO7M-'Oêi–?hÓ¦ ]C˜Ô¦íܶ­“³]ÊÇe—JjK%õ¤Úø)¶¹mzÞ˜ßla}¹\†ÓÓÓ`^Яj{|üÞñj›m¶ÍmKªG0^‡’¦ú¦Þ®ë¸´í{“¶2»Žÿп|ŒÝ‹Ú縤ŽuÛû]þu§éü圣®ÏZîùëóÙú×–Üm»ÎQW™}a`˜Ùº0ž'þaXÿá™Z–óƒsèÙ!m©×O«×q€O½N•9övmÇ¥mßÛ´•™ ímõå°¶r‡è{\êÇ:.'§Ì6©}ê{\ârºÎQü™Ém綟ݦ¿Š¤Ú;äóÒ5¼fèg€q;f½iˆÌ±éŸ:矶ÇúÁ=´œ¶íÚŽËÃNvZ¶=·»úÐTG[ïñPÛ|V¶9CêÝö3ØçüMu® ˜_‘a½Ыá2Ǭ­wKOWÚÇe×½ŒûrnwÙΡ=ëñz‡vþ†þå§Ë¾|™[7nŽž­êÏô9ëºÔxæ¦õöýxôÙ‡ÜÏGÓ˜¡eVåÕÿÕÞmÖß•)lj—ºÏÇnÖ Lã×Uz}Ù±÷ª‡Ð|‘WÛ¸àxìijYßamC š–ÅuÕ§©¶ö-³¾N×xé®íºöqÈ0жcÝvކžÛÔvñþ¦¶ëÒt\ºŽuª]eN¥­®ÜÏojÛ”¡ŸÁ¶ó×·¾œóUª§ïºî€Ý(òSýªœÒ}·Zæe¹Áf›2sëÍÙ®OyCËš²Ì)¶Rî6Çz C?‡}‚ùÏå.>k}ÊË=o!¸à`W ƒa6¹CLŽU‘˜rôÊq(Žñ³|Œû 0=ëP(a %¬@¡„u(”°…Ö P³Þº1~riÓò¶uàPÍÖ—Ëe8==] ä©åp¬fÓÄu(|Ìúr¹lìy€CWlX¯z×Û†ÊÀ!+6¬À±›õÓøuÐãÞtÁ€c4[Xï à:Ç®Øa0pì„u(”°…Ö PÂ:JX€B ëP¨ƒë‹ÅIX,N:—·­ÃôN :þ»nKIûìÙŠÂæ“KãùumIZ­N—U½mŽÏ‰Ï°f ëËå2œžžvój½”¸§<äõåS‡öÅbq¥üÕÚëÔ:õeñ¼Åb‘µÝ1«÷RŸ¬NÂÉâd#|Çëäίʋ—O¥é³ÂŒÃ`ÚzÊs­V'­á»¾¬kÝíÛr5|¯V«µÐÏOúzPÏÙn*‹Åbã_β]ªBt=¨¯…ðjÞ*±lµì×Ê\¤·˜Ã¬Ã`º´õª—ª©‡t› ½ËPÜÖûmïﮆžl´§jcS¹zÔ€6ņõ} êmâá-}ø.]ª]©!;ñ²’ÄÃbôûªØ°Î<¦ìYg“1ë@›ÅåKW×ßxsxèûC!Ü}ϽáÂ… É ?ÇÔvaiN¯úwÜÑx+ÆjlzjùÔ˜žÕ±J^Úw8KÓvÇìÚzÊëcÏSËræ§ÞOEXBá¡î©L>[Ïz[ÏþÒ¼wy»Æ8l¥Â×Ð@&È­Ë ÏMëäÎßÕøzçhsE€CdÌzdèWvÝCº/ílSÚ[ëÛ“v‡GX”fÛìK;ÛìK˜Ý—v‡Ç0(”°…Ö PÂ:JX§Ñb±èu×™¾ëo»Ý6eŽ]_—©êK•[íûÇuWöµÝ0¶YïS=Å4õ¤úNs’ĸâ'±Ž½þ¶ÛmSæØwÓY,­eîêî=q;vz»ön¶°¾\.ÃéééZ(—5½Ÿ[=U!¥þØøøòmËvѾT˜JíC¼,ÕÆ¶í¶ioÜΩŽgWûãpÛ|SóÛ>9õõÝ¿œœsÞsoª-mûž3¿©Ü¦Ï-›ÙÂznø.1¨Ç¡cµZ‡‹8pv-Ë©/–ÐâÜVwÓ²¸î¶íÆ6ÕñlÚ·TõuÚö½-Xö­oÛýkÓU_½Íq˜njKÛ¾ç3ÚùP¤¦÷l3¼bH(™3Ȥöu×c‰çZ’êéÝ¥’Bìжt³’öJTdX/yÌ®ÇéYŸÒc½ãi‰nŽ±à‡ Äs û¤È°ÎU‡vÚÆ^—‚·ùÅ¡”_:†´cÛsPʾÀ!˜õÓøuÕ{ƒ)¥W=„æ¡!9NqqfJª·ºÞÎÔåúë¦ýK-KíwîEŸq»R½ëCŽg[[Ú– =.mÛ©/ç¸4é³MËêãÉã}Mµ¥©ÜœÏË®¾°¯Š½À´¤€:ŽzWa¤Ï…–c-Ë ‘]órÖÙ¶-CڹͶS—j~*ÀqnûÛ±æWôÎÀEIª§0giŽ'€1ë£)¡Gý8žyõXê~@_zÖ PÂ:JX€B ëP(a %¬¬z0MýV…ñÃjrÊØ¦Î]j»M#À1šõÖñ“KSËš–ƒÔ «ù}ÊR§[çÌo¶°¾\.ÃéééZ(—5½Ÿ[Û#âãǶw-›¢-9󇶥íñð}K¼mÓÓ<ýò«Ù†Á”¾û¨‚cõ/Ìû,ËÑX›ÚRmÓö(û!mi«oÈq ]‘O0mêq/AWØÜå“7· ¾»î©Ö3Ð_‘a=„°1 ¦q÷®z‰s†ŽLÑCPæSüÝ`J¯>•¹îÀ@¹f½À4~]…ò’ï“zRï}î{f›ú-ëõ¶ÿŽ×­—“*£í}×¾×÷¡mÙ}`ưÞÂK 象ãÒû.‹çå¬Ów~N¹Ë·¯ßu-À1*~̾hë‘n[vèŽyß¶Uì¦ûf—wÙ'Û>À阀žu(”°…Ö PÂ:JX€B ëP¨"ž`šzRÉO1€](â ¦Ëå²×{8†Á@¡fëzÍ mÖ°.¨@³Ùº íf»À4„æ;¾œžžº G¯ˆ»Á Y‡nö L€4a %¬@¡„u(”°…Ö PÂ:JX€B ëP(a %¬@¡„u(”°…Ö PÂ:JX€B ëP(a %¬@¡„u(”°…Ö PÂ:JX€B ëP(a %¬@¡„u(”°…Ö PÂ:JX€B ëP(a %¬@¡„u(”°…Ö PÂ:JX€B ëP(a %¬@¡„u(”°…Ö PÂ:JX€B ëP(a %¬@¡„u(”°…Ö PÂ:JX€B ëP(a %¬@¡„u(”°…Ö PÂ:JX€B ëP(a %¬@¡„u(”°…Ö PÂ:JX€B ëP(a %¬@¡„u(”°…Ö PÂ:JX€B ëP(a %¬@¡„u(”°…Ö PÂ:JX€B ëP(a %¬@¡„u(”°…Ö PÂ:JX€B ëP(a %¬@¡„u(”°…Ö PÂ:JX€B ëP(a %¬@¡„u(”°…Ö PÂ:JX€B ëP(a %¬@¡„u(”°…Ö PÂ:JX€B ëP(a %¬@¡„u(”°…Ö PÂ:JX€B ëP(a %¬@¡„u(”°…Ö PÂ:JX€B ëP(a %¬@¡„u(”°…Ö PÂ:JX€B ëP(a %¬@¡„u(”°…Ö PÂ:JX€B ëP(a %¬@¡„u(”°…Ö PÂ:JX€B ëP(a %¬@¡„u(”°…Ö PÂ:JX€B ëP(a %¬@¡„u(”°…Ö PÂ:JX€B ëP(a %¬@¡„u(”°…Ö P×6-ø¸›ž0¸Ð—¾ìá»_óªÁÛçxèû'-8óÒ—½"Üwß}á¡î×ßx³©©©©©©iÃt›ŸµÙùò¥‹«Õjµº|éâêò¥‹«“““Õ­·Þºªæ÷µíö@9âﳩ©©©©©izZ½î+õ³öò¥«™¼±g½²Ío clÌoîž SSSSSÓ}˜†0~ö5fèT€¦¦¦¦¦¦%O§28¬ßpÓ-c¶(ØÜÿšššššš–>m²mfÖu8.sÿhjjjjjZú´Í6Ù¹wXÔáøÌý ©©©©©iéÓ.C3t¯°.¨Ãqšû?@SSSSSÓÒ§9†dé^aýò¥‹½+ößÜÿšššššš–>Í1$K÷#°Ãñ™û?@SSSSSÓÒ§]†fèA˜ ìp\æþÐÔÔÔÔÔ´ôi›m²óà[7 ìp<æþÐÔÔÔÔÔ´ôi“m3³‡"æþÐÔÔÔÔÔ´ôéT„u ÓÜÿšššššš–>ʵm ïºë®­ ßv{  sÿhjjjjjºÓ)²ocXéË^±UÁÛn”£„ÿMMMMMMKžN•}—/]\U•„ÂÝ÷Ü^ð™ÏŸ¤2 -Îä.\ØìY¿óÎ;wÞ0`ÓFX¯Ò<0/wƒ€Bmô¬ß}Ͻs´ŽÚwÞ¹1Ê%y7˜Àü ƒ€B ëP¨Áaý†›n³;«g¬òJmת¶ÍÑÆ!uÓ¹Ù…}ßÿ©Ú¿ïÇ€ýÐøÓԢ˗.†nº%\¾tq”Êã:Æ*7®cŠrSõÔuÕ9u»vqlÕ®>3¥Õ½T»§Ü—êó=vùûô½Ù×Ï iõ"Õ5†õÒ?¨Æ ê‡öƒ¦¾?ÇnÊ ¾Ï¿ØA¯>Àa¹þÆ›Ã]wÝ•¼ÉKkXOiêA«äÖ®Šõåqo~SÏW\fj›Tñ6©rSõåþ•a×íÊ9¶MÛ´çjýÔþ´µ­i^Û¾×çwµ=5?·mõÖÛ·í~§ÎÛþæ|.Rç¬nÈ÷dl}ö55ÈÿÛ¶µmy¥ë/©ýîû™okOÓq`?UA½IkXÏ P»îQî[_¼¼ékS¹SíßíjûÅ¡-Ð¥4ÕÙÕÞ¦ºÚö§- ÝïÜ@ËòÑ÷s9ä8tÕQÊ_zšÚ2ôÿŽÜó4–mþÛæ3ŸÓö[=¨7Ý:½÷0˜”¦07ô‡Êíê?üçú– %´«nìsÕõ—–1õý¥!gÛ}0æ9;„ÏcI¿„L%·—ÿP÷àÄA}Иõ\~Xœ)ý8äö˜çJ »ŽT}]mˆMÙ¦](ýsµCÞ·)Ã/*Ç ԛƬ~Ÿõ¸×'¥k¼åÐ0UJoal—íšc,ëÜŘ« sã{Sê÷$çÿŽ©”6¼¤¶0®¦ ÞdëžõÔ…TC¶kÛ6}êK]ؕӞÜqÐCCÏ.ÚÏË $mëÅÃ(âvmzÚö³©¾¦mêíljSÎüÔp¦T[Æ:qÝC¿_!Ì3¶»O}c|¶ÇܯÜïM×gš´õ¦1ë‹Ë—.®êcdî¾çÞÆ•ç”3ÎvŽÞÂc¼(lŠý)¡Ì®õ÷é<Žù=Ù§ýNÙ÷öpº‚zÇ''¨7Yß›žuØ7¹A½z_©zÖG¿ÀÔë6zÖ¯¿ñæ4[ê¾é¹ǬoS(0Ã` P׆ZoÄÌcqë­·®æn°éÿD5ò{CLIEND®B`‚PythonCard-0.8.2/docs/html/images/wt2fig5.png0000644000076500007650000004310610302203336020644 0ustar alexalex00000000000000‰PNG  IHDRëI-yØsBIT|dˆ IDATxœíÝ{¼,ÉAöšÕÃI0Æ@@816@‚]±+Ú XÙÆ1 ÆfG„æ!fÏl„ÌCdÄCp 1ù„,ÎÚ±`™½DvÁˆ»è.ˆGB°ùÄ<ˆÛÄÒîäsûÞž:ÕÕÕ=ÝÓ53ßïçs?}fº»ªºzÎ=¿S§º{uíêÛTåe/Exr!ÜzûK·¸î¾ûî !„‹°B=úÈb.»eéiOŽßxö‹¾o¶ÊV«Uô:„VÑëÖ{«­µÑë‹¶_‡°õÎbVÑëíÂoV»ÚÞuµµu{Ãèõõw¶oðñ®.Ì^Žw»ãŽwuùör¼[Gp`Çí>ññ–mµúú1\þVÌ×ys×òï¡hó꓾ï¡TŸÔz¼qÓ÷u¼ñgjÌñÆßCÛÇ7ßñNñ3a¯Ç›©3Õ'µþ¿÷ñöa”}9Þ¸·W×}¼ñgêÆ{3oü=4æxãï¡­Íx¼ñ÷P´y(9ÞKÇ$>à©oÙzmd*uidý†OúìðvÿÉŸÿá­›ðø&„Má)·\ü–ó”'þ¿ðÇoÛ„'6!üñ|"<õ)·„ÿø¶'Âæ?}Çðäk…§þ’ùïÌïS>äFïû¼ç=/<ôÐC;íÿÒW=0I;šrbaýßÿÑÿþáI›6«ð¤§¬Âã›Mxëã!„Í!¬n aõD¸û﮼ùwÂóïzzø‘‡ï Oz¯ï OyóÂêÉo?ºÁPjÌRîàÁÉöŸºœ¶Î°þ¦/zÇð»øøÅ¢MhÍ+º>ÌV!„Mxüñ? _ú¡ÿYxü‰~ðŽ×‡;ì߆_ظuû¾ýŸÿâ«C!¼Ç‡ÿíÉËþÕ‡¾*„Âû~Ôß™¼ì¹\ýg_BᎿø÷nI™ŸúŸ>7„‡ý·ßº—úú¾Ï !„ð¼{¾c/õÀ!¸íŽ»z·¹võá=´ä¦Î°þ¬÷ø¯BoXÜSƒnÂ/ìÖ¦Ñ~ÿÚ«C!¼Óm_°P ÆùÍGþÞ¥÷Þý®¯˜½Þÿý'Î.½÷Þwß—ÝçW~ü"¸?ý£¾:üò?¿øÅàéýÕ“´ç±¿ìÒ{ÏüøWöî÷èë¿$„ÂíáU“´#çgÿñåÏÖ³?éÕ³×û“ÿãçÜøú¹íNZöCßûÒB52¸ÿØë^Bá/yÝ÷~ô»>=„ÂÇ~æwïØ:8LMðÃ}×û]ºç¬‡®¡‡èZáÖºæý'ÝøúI›Ç‹*æÂo>òµ!„þì_~ùî({òÞyÖª2_o3º¾š±}·}ÜEŸ\{ðË›øE}š þ!å›’wm8TÏ»ç;&?›/øŒï.ù8@ur!ºdä½]ÎmwÜn»ã®e ê!ô†õ.‚ø&Ü îöOá& ?%<émo»T¿ûÕ×l½þ“ïû²BøËÛòÿSϸ˜ ðoùæ‹×ï÷y!„þí/]¼~‡÷ÿüðÿþâ?¸Tþ;Þúò­×¿wí›B!¼Ó3/ÂÕÿóæoÜZÿŸÀ†Bø¿ý†Bïrûß ¿ûè7„w¹ã‹¶¶ûŸÿúKu=í/¦WüÖ›.Fqßíƒ.FuÿÍÏ}]!„?óÁ_ziŸ]ü«Ÿþ»[¯ÿü‡~å¯ã_|Mç~¿þ“ÛSVÞë¹÷ª÷W¯¤·o¬7šög<ÿ¢=oyÃWníó~sq ¿ø£-xÿü½ð‹?úåáÖ½ü….oþáW„Bø€O¸èç_ø¡‹~¾ý…_wc›GÿÙŹ¸£5Â~õýâ_?ë/Ý<Ÿoú§Ûçúƒ>ñâ³ðsü­Kuðý—ÞKyäþíÏá]ÿÍÅgõáÿùâsüœOþæðÓ?ðyá9Ÿ|ñyn¦¾ôiFÕ?ü¯½&üä÷Nxã÷öÑõ7þ£Ï¾´ýGþõo !„ðÿÃß¼´îîOûöKïÅ#ë?~þ™[ë?úÅßBá ßó[ï̧¿nëõ6#ìŸñÝ—FÖä;_¼µíǽô<„ÂûúR{>áo~ï¥÷àµ{û½! nÝøÄõ%Þnyb;¬7AýíÞçsŸ|ß—Ýêô+AýíŸþ¹áíŸÞ„ôo)¬'„?ýþŸþôõþûmOCx§Û¾àÆT˜ß{óEpçg~axç&¤ÿÂvøúÝ롽˻>ë‹ÃÓžuú~ûMû›ý¯¯õ?÷œ¯î9A÷7~êk¶–ïña;¼Ç‡mÏSo‚ú{>÷«Â{>÷"\ÿoìžÞòk?qvñïÊÙÅëëAý}žw_xŸçå§Å„p1 æ×§Â4AýÏÿšð~sÑÆ_ú±í)=¿ø£_Þ[æ·ÿ…W]š sÇ_üûáY×ç­ÿüõ€Þõüᨄô²Ò?ø/ãþ/ÿ—/,ªÿν:Üù¢î|QÒ?kýOÿÀçµ¾¾øÌè_ý–ð¡µüsßå#>õÛÂGÜéÿÝÖº»ÿÆkÃÝãµ!„®\Ÿ«ÞåÇÏ/‚ûG¯¿óâßõ BÏñw…çúÅ¿Bø±ï~ÉÖ¾/xÉë >ãò´—&¨Üg~Oø¸—~O!„¿c½µÍÇÖyøøÏºé?ôÚ{²m€CÒçc滌¬‡Pþ·ìUXmž—Gá—®·½Ëí׃ڀi ïö_~ëM¯ ¿õs7ÃajTýÿúÙí)ÿå³/Ï˞˯¿±ì‚Ð!Ó`¦ðþ/¸Qïêîk­¹ë͘g~ü+Ûø7FÔCá^øuUͲˆGÖc͈ú¡ŠGÖ€~íQõö”˜R…a½Ü-O¼5l6W¢B¸Yß~àÖ~Zø_|È+n|}éi„3kFÕoom'¥C3gýÒ“è*ö3?xÔ›QõGîÿüÜæÅÚ–þä÷ßüúßÿÙṟ:í…¦9MPoFÕßðÝ‚;ô‰ç¨ÇsØKô„õ[ÂEÂ+“¿=a}XPauiÎúÛ½Ïç„÷«¯ÙºÈ´™»þG¿ò­áùæ|ÝæÓ?õŒÏ ð–oðKæ ¼ãm/¿íÕ[˜¾Ó3¿ üÞ›¿)q‘éå »üÎÏßœ§~qét)ñÏÞùeá7ùÚK·o|÷»¾"¼ûs¾"üëŸþ»[™6˜þùýÊð?õ57î¯ÞöžþUá×òï\šó^‘¾hô×Z·p|ï»ï ï}÷}á×®Ü~õ¡üE©Oÿè‹Û7¶/0}Æó¿&¼å _¹u‘isé\ná«Â£¯ÿ’ä¦)ø—¾>¼éŸ~QxÓ?¹ù Ù}â7ôžÖù+ß~öÁ¥Û7>û“^žýI¯?óƒ//QÎ'KøéøÜâ‹Lûüoÿèæ<õ‹ LoÌ•ÿþæ…¦wÚ·gó£Öß~üü¥áŸ·.2ýègxþ‹¿+¼á{>#9¢þ1/y]ø±×½dëÓ¶ýÌï ?ò/¶.2m.0€Ú ¹ãKNWúKÃêÚÕ‡7·Þ~ç'.=ûEßBˆïàòÖpñÿoÖÌá‹^û/Ãk¾öÃ-O}çË•E“”ãi!7Wßœ¯ÒZ{y&GéûJõIßÿ—›±Ÿã›¾¯ã?ScŽ7þÚ>¾ùŽwŠŸ {=ÞL©>©õÿ•¸·£ì{hÌñÆ}¼½ºîã?S7Þ›ùxãï¡1ÇmµhÆã¿‡¢ÍCÉñ6¯?åCÞaô“C¯\¹zè¡ö高¤M9ðÔ·l½ß™¾ßíÿ6¼ímo½y;õø¢Ãê«|cØÑý<¸èþS—ÓÖÖÿàßüzÙuO¹å©ï´K›ªñ®Ïú¢ûÅ£¹Ç:ûñÌOxeXùEpËs?õ†hä†ü믽K@m:ï³K™kW·ÝqW¸võáI•«/·ýí‰÷ŸªÜ1íˆí£þ)Ž3nû>û­Ý†¸Þ}ŸC€]‡õÒ¡kÎð3¤ì¹CØ!@ 0Aa=¥k³±¯Q÷v;šõSÖ*¿]G¼>õõ”m骿½lo“ê“®ó4Gÿ•Ô7GCÛ¯Ûg›bƒÂzIˆéšF2F_(Nµ©«]¥âÀÛ7•bΑäTçê×õýòÐUÎý·¡«¾9û³kzIû:Ç9;OƒI™êB½ZRîø¦œã>tÿ¡ÛÏuAåР»vÄõ¸˜8;OƒI©5dOåޝä/ûâz€´Ùï³~ˆ#˜CFÆÛó»ã©$¦O ·Äçå?£Ài˜|d=7gy¨Ôœí¸ü\ýså)oÉú»úq×þzqæýYRç’ç ±ºvõáÍ­·ß{ô‘¥ÛUð`i÷?ð`¸råÊüÓ`€q„uˆUj!¬@¥„u¨”°•ºtëÆûxp‰vÀI»÷Þ{/Ý¡1yŸõ+W®ì£=@á[_ýÊäûEZ¯×sµe÷ÜsÏÒM€It=óÈœu¨”°•ÖÈêlµtØ££ ëí ÛjKÂî¾ñêluã_ŸÍÙf’úæ(£ô(WmX_¯×{¿Èuu¶š$­o_uÎy|ûì7€SÑy7˜%­×ëp~~^ÖÛ!tl Ë!t¾n¿×õþæl“Ü/U_üþÔu厯ëXãõñë¾cK­KÇc85UެŸŸŸoÛ©¯ÛÛ•†Àx»Tèìßå—†v¹q°-©+Þ¯Kn¿f]É2÷KHÜ–öû]¿$ 9€SPeX"‡N-¬ÛõçÚUZ_® ¹6öµ}L}]ûöõÕãÚ€SSå4˜R]• ß©mûjßô˜¡¡{Š©;CÊ. ÜCÛ44ÔïºÀ)8è‘õ®ÑôÒQä’`˜šN“+³¯¬1v¬\9%¿Ü”üâ1u»¸©Ê‘õö…¥Í×]óØK..ÝušK3¾ë"Ìø½!JÆlÆûu•ÛÞ/õºOÉ]¿ôt]”ÚÕ–Ôü’ýN]•a}Ȧ%†øÜ¦ûž7>¦¹ú†Ô]º_ßëÒ÷t€m= &„² Ý·ß>ÔR_j$?^ïn,u¨rdù¸+ Àá8ø‘u8VÂ:TJX€J ëP)a*%¬@¥ª¼ucû ¦S? E•a½Ð×ëµÀÀI2 *UuX7ªÀ)«6¬ Ꜻ*ú •^`‚;Â@•a]8€J§ÁÂ:TKX€JU9g½Üoï¹¾§í¹>N™‘u¨”°•Ö RÖW«†Õê…—¾ÞeÔ Ê LÛO/ ¡ÿ!I›Íë“_ï²–VeXo‡ó8¸À©8øi0FÕ8VUެ‡psD½o «jGÖÏÏÏÃùù¹i0œ¬jÃ:œº*§Á´GÓMƒàTUÖt0 ª%¬@¥„u¨T•sÖëõÛK7ŽÀÓ–n #ëP)a*%¬@¥„õ=[­^¸tf±Z½ðƱµ¿Ž·IíÓþ7u›ö¹ßÔÆöIn¿]úºëœöw`¼êÃzûi¦Ç`³yýÒM˜MûØâãlºx›Íæõ7þMöÆöu-çhêö¯V/Ýש󗪯–¾€cQõÝ`æ êq`LÈÔ{í÷Ûû¥Ö—–×Õ¦’ºEÇîÛèêË’óÙUf®Ü!mÉ£C>w!ìvþ€ÝT;²¾^¯Ãùùù,e·GtSËÜdj›F¼_\çÐÏT]sO3;5eŽÑÕ¾~É-Kû:>†C8G51ªóªrd}Π^ª/p¥‚Iɨîû AsÔÕ×/¥ëöÑ–]ʳîÌÕg@¿*ÃzÛS`æïMi/ãõcËmâô¾9ÉcËLM5‰ËRwßùË9ôs´o}ç˜O•a½Ìke/u Áo®ö—ÌۼǴcßçhŽ9ëûžèóîàPUÖ÷%7ªÞwbߨ¹÷Ss¯s/¶GÛ¯EרlêxÚç$wâmSå¶¿>´sÔw cö;Ũ:,§ú°>÷¨znšÅ÷wY×µ~ª©9µ*éã)úmŠu¥u mÏ”mÙe? NÕÞ †ã#(6çö¯ú‘õœ±–?†ÐqÊÇp*:¬Ÿrð<åc8ÖCôÛK7`fO[ºsÖ RÂ:TJX€J™³NïéŒíãí:öø¡>¹‡Õ(÷ðŸ±ëâmrëK´t™]Û§öó0¥¾6ìZf®c>Ÿ¹lå¾W`NU†õõz½õzFr+ÄC{‚hJîÁC}OוØgŸ¥‚mW»K×Åï•~^Ž¡Ì’úºtµal™}û ý^n—ÓÕŽ!逩UÖC˜? ‡0nÔ¯ýC=·¾«ÜÚ•†¦8¼7û¶×Çïé³1£™Köû¿”¤éÔvy²ë稫Ì9Žý~ùàxUÖçv­‹_§BjÉ~sH –í!Û—¶¥Æ>›²¼}ñ)öŸ£Ì©ÊN•ÂðÏᾦ¤U`iÕ†õf*Ì>FØã?ýSzãŸ,:Æ\#¬cþ:0WŸÍ:ç(kŽ©ACƒóA}—úº¦Úô•9v:VWY‡þ1ŽW•a½Ð×ëõ^{[ßÅ•9ûüA?vd½¯Ì®¿8”î7tßC™ÚÐ÷˜}–Ùªç(óXCìØÏ<ìC•aýÐ,d檳dŠÁœ#¸CÛÒWöT£¯S×1¶Ì¾)G¹m»ìréç(µ>Uæ\ßkûšVCUÖÛwƒ™kT=5m£ ¹u©}»Þo¯;¹yüíe꿚ú¬k„47å¡t:DîÎ!Cê{û’m¦(s—;¬´¿îû<ôÉí—«¯¯Ìx¨E•a}_Ó^r?ÈKçÌÝïP ½puÈú]ÎÔí(­oèhïÔe ¶¥–ø^[ç©}ïpÚ<Á”$Á§Ü\ú²_ú€U9²^j쟭÷ýCùPÚ @]:¬J˜=”vP—ƒëóxÚÒ €‚9ëP-a*%¬@¥>¬¯V/ÜzøKü`”1ë U_`Zú$Óø)”S¬€¥UÖ×ëõÞžd 5ªrÌ nT€cUeXo¬×ë­©0pJª ëÍèúùù¹ÀÀIª6¬›¯À©«òÓx4]pàUÖCРÚi0pê„u¨”°•ªvÎz™§-ݘ‘u¨”°•Ö RÂ:TªÊ LÛO/mxH§¦Ê°ÞæëõZPà$™•ª:¬Uà”UÖuN]µaN]•aݨ:TÖu¨4¬Â:TKX€JtX_­VK7fsÐaŽ™°•Ö RO^ºSY­În|½Ùœun7o¶çÐo6›IÊÛµœ\Ù)ëÚîæÜ-uÞjhÇð>›ï³Ô£Ú°¾^¯o|Ý÷¤ZÂÞf³ «ÕêF€jÝ'µmSÞÔ⺦®ch»—>o5Þgó|6€ºTÖ×ëõV@_·µGÔÛ¡=i}{}jŸØ.²ªâÕ~¿Ÿ*£ëýöºö¶%#°%e–”;vDýf]gÉ÷»Û}ù¼––ïÛõ9ê“:—¥ýÙ^—ê³Ü~Ài¨~Îz.¨‡°¨6›³¯ãð– sííãmârJdº›âeó¯­ €qÐo¿Ÿ Ð]ûåt•ÙUn_óý²Ýçí÷ã¯SÛµÏYs~ºÎm\F×ùε+} 7Ï]Ó%ç(^÷Yn?àtT9²~~~¾5 fW¹À7‡Ôhiרk‰±£ªcëê †}åî+\îr>÷ý™èÓØ€ÓVeX2 ¦F}avlh߇¹ç³S®Öϰ?ÕOƒ9&C§£ìË¡ò]¦&ÕP>@Ÿ*GÖãi0¹Qõ’ Lã9ËÍú® suå¦M´/rAgó^îÂÓÔëÜœò1û¥ÚÑUN¼on¿.q Ç© L»Îm\~j{¼ï LSË]ú:µ.>¿í¯ÂÀqª2¬‡Ð»ÆFW ê Z}6¶_½Øp¬Ô­ûÊ/y¯t¿¾u%sÕ‡(ï׳­eß=õÇ~&†´éæöýÇ<¦¯sës8¦ÁìÉjµJŽL3L<:nª p̪Y?6FC§QËÝ[öÁÈ:Tê ÃºÑjŽÙA‡u8fÂ:TJX€J ëP©joÝXúS8VU†õõz½Ðã×p Lƒ€JU9²~~~¾5 NQ•a=„pi œšê§Á˜¯À©ªrdÝ` Ò°. ÀLƒ€S%¬@¥„u¨”°•Ö RÂ:TJX€JUyŸõ)¬Vg[¯7›³ävû´Zm¿Þlæ¯k®:V«UØL\øêz£KË»}Û®Ç0´ µHµ{Žs ìfѰÞ<©4õ¤]ŸbÚ„ó8´/%ωÜxò6›M2PO½ý”uhjq¨í€S³XX_¯×áüü|+”Çëº^·¥ÂxÉ(znä=Wæ˜úúF¹»FÜÛïo6Ûå¤rVj¿TÝcêÛnïåÀ{s¿Ë8µMj]*4çö›CI;KÖ§ú§s_çÊ‹·R^jÿøxº~y9Ô¿ À¡[,¬-5Á¹/h§Äû¬Vga³9»Tf»¼Üº¡â€Ü~½Z]¼î åÍöqxOíw9h—Õ×¼W2øÚyñò¢¬îÑìøëí¶N; Þ.§Ýö’úr¿ ´Ëê+£]g³}×/7©râñTHÏõoW_u:º9ë¥sÓû‚vê’u‡¢/«59qŸ©©©s„Ê®0=djÈëö>sÌ›SÞ˜)DÀþ]X/‘!ßko›[wh%{í3$–Œžw1˜ÃÑ…õf:Ë.û‡0í4˜xšÊžû ̹úöÝ–}˜{ŽujêJnÎ÷\öõ ‚9ë°ŒE/0¿næ±ÇžvÍooæ˜çFÆñy¼_¼OªÌ’u]Ú½yz¿½®k}.ŸÅóχÔ×wajw«Îe×<ëö×]sÕSëRs®Kƒdܾ]Ú’kGéÔš\{Jû¬=O=nsßyˆÛ Ô§Ú LK/@í Ë}!zÌèû®Ó]º2Q_V*ÉR©m†ÖWšÙâäÒ9ÒS®ë«³ën'}†¶%Ñ}û ¹»Mi[†ôQ®Ì\pè`G7 j³ïÛOÇCXg¡³Ü¡ôÕ¡´NÉ-K7HÖ RÂ:TJX€J ëP)a*µhX_¯×[O*-]§`±°¾^¯;ŸRš[§b±°ž ã‚:˜³ÕÖ RÂ:TêÉKUܾÓKóu3W=·NÅbaݦg TJX€J ëP)a*%¬@¥„u¨”°•Zì>ë‡nµ:»ñõfsÖ¹ÝTûMmuvQ÷æl¾6¬:Ên×¹v,-î‡ÍÙYò½®ýJû¦]fß>«Õ*l6›¢r{ë]­.êì(¯YŸÛæPMÙ²hXïz:iû ¦µ> i³9Û Þ%ší— é}„ãv(mê[]ï˜Ãy[êøS¯S†öQê—€}Øl6[¼íÂì1‡k±°¾^¯ÃùùùV0o´z³]-r;ïímÚ놄ö®ØT(+ w¹ݾ2»ÖÇ#º¥#«DÙ»_Ið-éÏ®_2Æ–94t÷º—öMWý]á3ÜímÆŒŽ7ûL=²ž*/~¯d›ö{í}RÇÝu Í~¹þôØÅbsÖk à¥Ú!;æíuMïšòÒÞ&[_+lå`É(m{Û®ð˜+3nKjÛf»®à·=.£«ÌÒãKíèÇu•êÔ~¹u»Ž–çÎQîäi0¹¼Äô“FÉ/_½et„ÔFi@߇±mÉí7Gì˜Bµa½æ žSÃ|t¦•û+C¼MM†þROÿˆ§{Ô¢«-í))©©)5”ªòÖ‡ÔKFÐ}”}ŽÑä%G¨»´ÿ0亀Դ˜}õÙ©Q!,7r¾Z­ªµ/QÚÞC<6곺võáÍ­·ß{ô‘B÷?ð`¸råJòÂÏ)å.,×¥‚û=÷Ü3}£ tÍ[OM‹éºÀ4µ¾³¾D¶·))/WFîuW[rÛwµ/ÕöU<„ IDAT1Ç—Ú§ï)%oöí7ä‚о]Òo¥Ÿ‰ö{[íMŒ:ç..Í­O…Ñ’u¹¶ô)iké´%¦Æû­Ïˆ>%{ô‘Êä‹…õ]-ÖáÔp;Âc³5ô#Ç¡+¬W9 8 ‚.ä ëp‚jÉ5´aWÇp Ô­Ú»Á0Î{‘¢c?>€6aýÈ{X=öãh3 *%¬@¥„u¨”°N‘æiŒÍ½±ã×¥û‚¹Ú9e¹}ý9ôü0^®¯ÇôÉyKms(çûÚP“E/0m¼?¡´ä ¦\˜ã¡,©2›§;6ïǯûÄO‡¬Ù˜þÜ÷ÃqrýéA=iûú^iS_É÷Jj›±ßcKô å ëëõ:œŸŸ'Ÿ”Úçµ?Iuúõ>ôéí'GÆO‘ì+³´%ûtÕ]ú˜÷©é¯öú]IŸ«7U^ß1ìzþJÚ¿×>ƾ>ë+sêý†|¯¤êLÉ•Ù×ÿc?×S?õuÌÿ!}ß·}eýEàÔ-Ö–—‰¨åRß~ñ¨xÉz׺\ù©×)ñH`üzL™Ív©ºú¤‚V»]qûW†v;»ÎíØcßg[RŸ‡x]WŸõ•9õ~C¿WJô}¯t•µËç:WîcþéÕ/)€áª½Ïz×™S“ ´cöëÚf*sMsSæ\!aêrûÎí’Ó†¦:Ö±åäöËõËÓNö2w=·s}¿ÅºêÈýå€iUÖ›ÞL—9e»ŽÂ5¯ç4W}c‚ÀØ‘õ%äÎm­m^Úý2æ{lªújv(í8fîS¹¡¡wîÑí9ÿÄ=eÀÿí[ɱ,1rÞL)ÙîØ¥æVwmwèý1äJ?]SbÆ– @Ú¢˜Æ_·GÓ§>ªBþb´®?á§~ˆ¶ççÊ3- ¤¾v©vÆóŽûæÆN­«íþJ½Ž·ÒÎÒsÐ^ŸëϾsÛ%×þ®uq]©~Ù¥ÌT_wõË®çh—s—;Žö×¹ïͱû•|õòHW8OýUhßS‹ŽU•˜ è7•­)Þ/ÝfêúrS?öùC¾´ýcŽ3õ‰!ý2¤ž1eŽY7Ç稤¯Çî7¤¼±eÍYæû)w×ïŸ c 0¹Ò)&@^µ˜Â±9¥ÑÄS:V†ñÙÆÈ:TJX€J ëP)a*%¬@¥Ü æ¤ðÓõzHYäJ_¯ÎÎB!l®/€é,:²¾^¯·žVÚµ »I=ˆ§k9¤¬C5ǽ¿Seb_é!æ³XX_¯×½O*Ô/¬V«ÿâ÷â¯SûMQ_Éö¹z‡–¹«v}©G±wµ§ïýøë’2KÛ9dû®×cÛÔi±°^Ôû¶9Í£¹›ñÔˆöú8Ä¥ÞoömÌönW}9}Sf³_WèîÛ¯]_ªm©õ¹v¦ú»¤ÌCék NUÎYÔ·åWÉT‰!¡m®€7jzÅÈi c懧ö›²Mcëch™©‘ùÆ1L{€CVeXa{ Ì©‡÷}¦ÔèïÆCnøúâcÊÕ7DZ﻾¡}=¦¯€ý¨2¬·ƒù©õ¹4£ºs³%~Sÿ}çè‡v™‡Ð×@ ëñÈyýóØOQéœóøuj¿’À˜Û/uQeHÛ_÷Í›ŸSn*G×4™’cï*wÌÔ›cèëUëN0náÓ[,¬—s>¶ú.4ìz¯dýÐ÷SëKÚ7—Ò <Åû¥ÛJ_žB#˜À¬<Á*%¬@¥„u¨”°•Ö RÂ:TJX€JUùS¦?L§k}n¦‘ëë1O7í;·]Û”ìÇps=7„ô·†~ïÎqÞçz*/Û ë]O.m?Ý4µž2©§Y6ü M›+ty`RNîÜæ¶)Ù/e‰~Ù§šÚÒH=©6~Šmi›Çžw–·XX_¯×áüüüR0oè7å?ft¼Ùg—}KÛ’Œ×Å¡¤«¾¹÷ëë—ܱwÉ•Ù×ÿcÿò1õ(ê~Iõuîõ>ÿºÓuþJÎQßg­ôü ùìŽýkKé¾}稯̡¿00Îba]/ÿ0lÿðL­+ùÁ9ö‡ì˜¶´ëŠ—Í×q€O}*sêýrý’;öœ\™©Ðž«¯4€åÊch¿´û:.§¤ÌœÔ1 í—¸œ¾sfJÛ¹ëg·ë¯"©öŽù¼ôM¯û`ZÕÎYïš"sjúæ§.ù§í©~p-'·_®_¦˜v²Ð²ë¹Ý×Ô‡®:r£ÇcíòYÙåü©w×Ïàó7×¹6u`yU†õv@o¦Ëœ²Üè–‘®´9úeߣŒ‡rn÷Ùα#ëñvÇvþÆþå§Ï¡|Ž™[7Vn‰‘­æÏô%Û»Ô|æ®í½?†Céç£kJÌØ2›òÚÿ¦jï.ÛïËœóÄk=f€S·è¦ñ×Íz{Ý©ª‡Ð}‘Wn^p<÷4µnè´€ÜT‚®uq]íeª­CËloÓ7_ºo¿¾c3"××¹s4öܦö‹7µ_Ÿ®~éëëT;úÊœK®®ÒÏojß”±ŸÁÜùZ_Éy§*µçÓ÷]wÀ~Ty©€~SÉé¡û-s̺Ò`³K™¥õ–ì7¤¼±eÍYæû)w—¾žÃØÏá`>æs¹ÏÚòJÏ[.8ØÓ`XLé€SU妜£r‹Sü,Ÿâ1,ÁÈ:TJX€J ëP)a*%¬@¥„u¨Ô¢·nŒŸ\Úµ>· «ÅÂúz½ççç[<µNÕbÓ`rA\P€Ê笯×ëΑw8vÕ†õft=7UŽYµaÝ4NÝ¢˜Æ_7=MÜ8E‹…õ¾. pꪧNX€J ëP)a*%¬@¥„u¨”°•Zì>ë‡nµ:»ñõfsÖ¹ÝTûÍauv³þMëë9Êok×Õl3Gýµˆûasv–|¯k¿Ò¾r>W«UØl6EåöÖ»Z]ÔÙQ^³>·Í¡š² eѰ?¹4~¿­¶‡$m6g[Á»D³ýÒ!½‘ s•ß„ÇÕõ÷Ž9œ·¥Ž?õ:ehÍ}>;ëÝl¶yÛ1„Ùc8×ba}½^‡óóóÞ`ÞlW‹\àŽÃ{{›öº!¡½k6ʆŽÀæFsSevÕè–Ž¯eïr|%Á·¤?»~É[æÐÐÝ7ê^Ú7]õw…Ï8p··3:Þì3õÈzª¼ø½’mÚïµ÷Iw×14ûåúSÐ`‹ÍY¯)€—j‡ì8˜·×5!¼kÊK{›l}­°• €%£´©2ãísõÅëRõ7ÛuǸíq]e–_jŸxD¿ëør:µ_nÝ®£å©zºê+Ù®D8›¹u]£è±¦œ®rÇèjK»®Ô²o¿öúT0Ÿò`ˆªç¬×6ªÞÖ5 fèÔ˜%uM›(J‘ ‚© Þ~}ÈÓ`†üEbŸºúrHw…ÔFi@߇±mÉí7Gì˜Bµa½æ žSË|ô]bžSî¯ ñ65úKQ<ý#žîQ‹®¶´§¤¤¦¦Ôt PÊ­G*A¯}”}È´™±ûµäu—ö_JÂon¾û¾úlÈÔ¨–9_­VUÚ—(mï!õY]»úðæÖÛï =úH!„ûx0\¹r%yáç”r––ŒªßsÏ=Ó7ª@×¼õÔ´˜® LSë;ëxAd{›¾2s‡¦Êz±kÉ­ãýw9¾Ô>}wH)¹x³o¿!„ö…è’~+ýL´ßÛjobÔ9wqin}*Œ–¬Ëµ¥OI[K/ -¹05Þwh}Fô(ñØ£„T&_,¬ïj©°Ç †ÛC˜­¡8]aÝ4`1‚.ä ëp‚jÉ5´aWÇp Ô­Ú»Á0Î{‘¢c?>€6aýÈ{X=öãh3 *%¬@¥„u¨”°N‘æiŒÍ½±ã×¥û‚¹Ú9e¹}ý9ôü0^®¯ÇôÉyKms(çûÚP“E/0m¼”zZiû¡L}O3=es<”%UfótÇæýøuŸøé5ÓŸû~8N®?=¨'m_ß+mcê+ù^Im3ö{l‰~ Üba}½^‡óóóä“R›u]¯OMߣއ>"½ýäÈø)’}e–¶³dŸ®ºKó>µ1ýÕ^¿Ë#ésõ¦Êë;†]Ï_I[â÷ÚÇØ×g}eN½ßï•T)¹2ûúìçzê§¾Žù?¤ïû¶¯Ì¡¿èœºÅÂziøÔWÙž¹ïŠ—Œ w­Ë•ŸzƯǔÙl—ª«O*hµÛ‡Ñ±eh·³ëÜŽ=ö}¶%õyˆ×uõY_™Sï7ô{¥Dß÷JWY»|®såŽ1æÿ®Qý’2®Êû¬w¸Ÿ¢T ³_×6S™kšË˜2ç S—Ûwn—œ64Õ±Ž-'·_®_¦˜v²¹ë¹ëû-ÖUGî/L«Ê°n̶]Gáš×sš«¾1A`ìÈúrç¶Ö6/mŽ~ó=6U}5;”v3wƒ©ÜÐÐ;÷èöœâž2àÇÿö­äX–9o¦Š”lwìRs«»¶;ôþr ¥Ÿ®)1cË mÑ L㯛ÑóxÌ)ª‡¿­ëOø©¢íyŹrÇL (©¯]gªñ¼ã¾¹±Sëjg»¿R¯ã톴³ô´×çú³ïÜvɵ¿k]\Wª_v)3Õ×]ý²ë9ÚåÜ厣ýuî{sì~%ßc}†üÒÎSÚ÷Ô"€cUí¦§Ð¥AkŠ÷K·™º¾ÜÔ}þ/mÿ˜ãLýEbH¿ ©gL™cÖÍñ9*éë±û )olYs–9Ç~cÊÝõûÁŧØL®tŠ Wå¦pŒNi4ñ”Ž•a|6†1²•Ö RÂ:TJX€J ëP)wƒ9©üt½Ry§Ò׫³³B›ëK`:‹†õøÉ¥©u]ë)—zJhü”±O;jÞ§o~ê’Úžê÷ØrrûåúeŠi'û-»žÛ}M}èª#7z<Ö.Ÿ•]Îߘzwý 9skSg–·hXÔËäF·Œt¥ÍÑ/ûe<”s»ÏvŽY·;¶ó7ö/?}å3pÌ»u£ ^f‰‘­æÏô%Û»Ô|æ®í½?†Céç£kJÌØ2›òÚÿ¦jï.ÛïËœóÄk=f€S·øÈz£ÜÏÏÏÝ ¦¥ëÏ÷¹yÁñÜÓÔº¡ÓrS ºÖÅuµ—©¶-³½Mß|é¾ýúŽqÌ4Š\_çÎÑØs›Ú/>ÞÔ~}ºú¥¯¯Síè+s.¹ºJ?¿©}SÆ~sçoh}%ç=žªÔžOßwÝûQÅÝ`Ƭ?%?¤‡î7¶Ì1ëJƒÍ.e–Ö[²ßòÆ–5g™sì7¦Ü]úzc?‡C‚ù˜Ïå>>kCÊ+=o!¸à`_<Á”Å”N18U‹ß †ÓeTŽcqŠŸåSé­Vg7¾ÞlÎ:·›j¿C¶:; !„°¹¾l¿Km³éØöÄý°9;K¾×µ_iß´ËìÛgµZ…ÍfSTno½«ÕEå5ësÛª)û€ÓµXXïzziߺZl6g[Á»D³ý©„ôœv(mÂãêú{ÇÎÛRÇŸz2´R¿ìÃf³Ù ämÇfá¨[O0]¯×[¯së–– ÜqxooÓ^7$´w²¦‚WI€‹GXûbßhxß~«ÄþCÛYb{G‹ ‚oÉ1”ôÙ2‡†î¾Q÷Ҿ骿+|Æ»½Í˜ÑñfŸ©GÖSåÅï•lÓ~¯½Oê¸»Ž¡Ù/ן‚>}ÌY ²ã`Þ^ׄð®)/ím²õµU.ä•ŒÄÆÛ6ÛwM;‰ËL­ÓήàoŸÛo̱§ö‰GôKŽ!ÕöT»Öí:ZÞÕ‡©úJ¶+ÑÎæ_n]×(z¬)§«Ü1ºÚÒ®+µìÛ¯½>̧<ˆ-6²ÞÈœ×6ªÞÖ5 fèÔ˜%¥‚qù@™ zc§YÃ4˜9úe ]}9¤»Bj£4 ïÃØ¶äö›#„ ö”Z4¬jPÏ9†ùè© —iÏíwìµ_†þROÿˆ§{Ô¢«-í))©©)5´-6 æÐƒzÉú!²wY%F½‡Î9²nl™KÛ/¹9ýS·/6dÚTËœ¯V«ªFíK”¶÷ €e¬®]}xsëíw†Ç}$„Âý<®\¹²uG–9ÄåÇ•v­kÜsÏ=Ó7ª@×¼õÔ´˜® LSë;ëxÑc{›’òâíÇ^Ð:äÂÇÜIúöë+«ožv{Ÿ¾;¤ ™ÔµßÐ~ÉÕSÒo¥Ÿ—ö{[íMŒ:ç..Í­O…Ñ’u¹¶ô)iké´%¦Æû­Ïˆ>Ç}$¤2ùba}WK…u8v5ÜŽðÂl ýÀáè ëîTIзn"5„äÚ°«c8–·ø­™Öû›S>và8 ëGæ”é);pœLƒ€J ëP)a*eÎúë»Wuîa.Lk̃sJÊËí—Úæî_>ÆÙõ‡’mζ¾Ž×w½ßµÌm±°Þ~èRü„Ò’'˜Ò/~êb›¶¤ÍÑ/}eŽ©/wns۔엲D¿Lm+„G<ûºãk؇ÅÂz;€¯×ë­×ñºS—{„ú˜ÑñfŸ]ö-mKê‘íñºv€Ì=Ê~îýúú¥ïQö)¹2ûúì_>¦=Ò/©¾Î½ö×È3 ¦rñèc;ܤ֕ž84ÏÙ–v]ñ²ù:ð©¯SeN½_®_rÇž“+3Úsõ•þr+wŒ¡ýÒî븜’2sRÇTRÆØÑq£ê,mñ°ª·ßÁ˜8ôäF÷mª‘бå”Ìמª¾¾ó0‡]ÏíØ)/CuÕ‘ûËÇXFß85‹†õ® ÂÍžÛæTäFX…—´9úeÌH÷TõÕlŸí;²‡j±[7 áe–9o¦Š”lwìRs«»¶;ôþr ¥Ÿ®)1cËlÊkÿ€c¶øÈz£ë¢R¾û"¼Ü¼àx>yjÝÐi¹© ]ëâºÚ˾ -KÊloÓ7_ºo¿¾cœúbÞÜ9{nSûÅǛگOW¿ôõuª}eî[û¶ŒÍk¨Ewƒ²îÔô˜®õ¹ýÆ–9f]é/»”YZoÉ~CÊ[Öœeαߘrwéë%èÔÊLYLé€SµøÝ`8]µŒªÔÊÈ:TJX€J ëP)a*%¬@¥„u¨Ôba}½^ßø×·œ¢*ž`º^¯“O-Ô8eÕNƒé ðp*ë©P.¨ÀÂa=ÊÛóÙM‡à-6g=ÔKæ³À±[,¬‡°=b.À¶*î3Åvpl¿ÀHÖ RÂ:TJX€J ëP)a*%¬@¥Ž"¬¯Vgaµ:ë]ŸÛ†ùUÔÿûnKMÇŽÅŠ”{zi{]j}l³9ë\×ôÜ6œž3ŸàTñÓõz})—<¹4)y{ýÜ¡}µZ]/³õuj›öºø½ÕjU´ß)kRŸmÎÂÙêìRøŽ·)}¿)/^?—®Ï @> f³9ˆïöº¾mwoËÍð½Ùl¶B{ü~*зƒzÉ~sY­V—þ•¬Û§&D·ƒúVoÞÛ$Öm.û­2Wéý–°ØÈz#5ªÞ¼BÙ{MºFHw Úû ŹÞ]G÷5õd— =W»Ê5¢ä,Ö»‚zß™COoÀ÷èRíJMÙ‰×Õ$žc„8T‹^`z !üØÌ9²Îeæ¬9«kWÞÜzûá±G !„pÿ†+W®\º#ËÔrw|ÉÝ)¦qÏ=÷tÞŠ±™›žZ?÷¦ul’…Îҵߩ»ÜHy{îyj]Éû©×sÖ€BxìÑGB*“Wq7˜!ëÚú‚÷>oׇ­TøÈ¹m%á¹k›Ò÷÷5¿Þ¹rún0pÌ¿LmÆÞyeß#¤‡ÒΜÚîØÒYß´8>Âz¤¦0›s(íÌ9”0{(íŽi0P)a*%¬@¥„u¨”°N§Õj5è®3C·ßu¿]Êœº¾>sÕ—*·9ö9úu_µÝ0µÅîSò”Ò’m˜Oü$Ö©·ßu¿]Êœún:«Õ*[æ¾îÞ·c¡·ïØ€ñªx‚éz½¾ÆSïÕ¢€šÒ~l|üùܺ}´/¦RǯKµ1·ß.íÛ9Wöµ?·]Á7õ~îsQRßÐã+ É%ç½´SmÉ{Éû]åv}nàÔTyŸõÚƒz:6›Ípξu%õÅJZ€suw­‹ëÎí7µ¹ú³ëØRe´·É{.X­o×ãËé«¯Ýæ8Lwµ%wì%}&@Þâa=Ì›i05÷]¦WŒ %K™Ô±î{.ñ’SKR#½ûTSˆÛ–¾>«é F‹†õ¾ Þ¬«i¤}ßs‚ÇŒ¬Ïi޹Þñ²Æ·Ä\ðcPã¹€C²è¦¹^K8_Ú±„ÜÜëZCð.¿8ÔòKǘvìzj9v8‹¬7Úáüüü¼Ú;ÁtM )¹ pŽ‹3SR£Õív¦æ(·¿î:¾ÔºÔq—^ô·+5º>¦?smÉ­Û/¹}ÇÔWÒ/]†C׺ö|òøXSmé*·äó²¯ï 8TUÜ fÌú%G½¯02äB˩֕„Ⱦ÷J¶Ùµ-cڹ˾sõKó~*ÀOqn‡öíTï7ŒÎÀEšHj¤°diú ‚»Á‹FÔ‰þ,s¬}q¬ÇCY€J ëP)a*%¬@¥„u¨”°^±æÁ4í[Æ«))c—:÷)w›F€S´Ø­sO(m¯ëÚæ¤žÙ¼?¤Œ1uºuÀòªx‚éz½Þz[WƒÜ#âãǶ÷­›£-%ïmKîñðCû%Þ·ëiž~yN•i05Á±ù— æCÖ•è ¬]miöÉ=Ê~L[rõéò‚in伯Qõ¾°¹Ï'oî|÷=Rmd`¸EÃú¡õ.Oר×(qÉÔ‘9Úb Àr›Sk_ÊRw` ^‹¬7j¿¨´‘šzÒ}zfNû–ízsó¿ãmÛå¤ÊȽî;öö1äÖ9v*¹Ìu5;/}èºø½’m†¾_RGéú]æë÷]D pŠÜ f"¹éܺcwÊǰ«Åïs,öy˜C²ëœN¹ïŒ¬@¥„u¨”°•Ö RÂ:TJX€J-vëÆ®§—–®€cWÅL×ëõ ×p ªŸ#¨pª‚i*ŒŸŸŸoMƒ€S´hXï57 œ#€@Þâ#ëvp§Áõœ¢*î3f=»êï§JX€J ëP)a*%¬@¥„u¨”°•Ö RÂ:TJX€J ëP)a*%¬@¥„u¨”°•Ö RÂ:TJX€J ëP)a*%¬@¥„u¨”°•Ö RÂ:TJX®ÿNåIDAT€J ëP)a*%¬@¥„u¨”°•Ö RÂ:TJX€J ëP)a*%¬@¥„u¨”°•Ö RÂ:TJX€J ëP)a*%¬@¥„u¨”°•Ö RÂ:TJX€J ëP)a*%¬@¥„u¨Ô“»V|ðÏ]èË^þŠð­¯~åèýK<öè#³–\xÙË_zè¡ðØ£„[o¿ÓÒÒÒÒÒÒ²c¹ËÏÚÎì|íêÛÍf³¹võá͵«oÎÎÎ6wß}÷¦y¨]÷ê?[ZZZZZZ¦—Í×C¥~Ö^»z3“wެ7vù-aŠýå-=Raiiiiiy˦Ͼ欽jøÐÒÒÒÒÒ²æå\F‡õÛî¸kÊv[ú?@KKKKKËÚ—]vỊ́º §eéÿ------k_æì’‡uANÏÒÿZZZZZZÖ¾ì36C ë‚:œ¦¥ÿ´´´´´´¬}YbL–Ö¯]}xpÀá[ú?@KKKKKËÚ—%ÆdéÁÓ`v8=KÿhiiiiiYû²ÏØ =êSNËÒÿZZZZZZÖ¾ÌÙ%;¾u£À§céÿ------k_vÙ53{(Ðkéÿ------k_ÎEXz-ý ¥¥¥¥¥eí˹<9·ò¾ûîÛ©ð]÷ê°ô€––––––‡°œ#ûv†õ—½ü;¼ëþ@=jøÐÒÒÒÒÒ²æå\ÙwuíêÛ¦’B¸ÿËþòÇÍRgò+W®\Y¿÷Þ{÷Þ0à²Ka½IóÀ²Ü *uidýþ\¢pÒî½÷ÞK³\’wƒq),Ï4¨”°•Öo»ã®)Û±·z¦*¯ÖvÍ¡iÛmSç)›}8ô㟫ý‡Þ/†Î'˜¦~]»úp¸íŽ»Âµ«ORy\ÇTåÆuÌQnªž¶¾:çn×>úöXíë3S[Ý»Hµ{®ci¶§.ÿP¾oõs@·ö‘Ú:ÃzéTSõcûaÓ>S·_¾§<8„ï#úÇçÖÛï ÷Ýw_ò&/Ù°žÒ5‚Ö(ùAÚ÷C±½>ÍïùÊýoöI•ï“*7U_é_öÝ®’¾íÚ'×ÏÍö©ãɵ­ë½Ü±·ßïk{êýÒvæêm·o×ãNÿÜñ–|.Rç¬mÌ÷ÉÔ†kêý}ç1ß7]û¦Ž{èg>מTŸp¸š Þ%ÖKԾȭ/^ßõƒµ«Ü¹Žo‰vå~qȺ”®:ûÚÛUWîxrhìq—úXÉ”¡ŸË1ýÐWG-ééjËØ>›sLÊ.ÿÇíò™àøµƒz×­ÓOƒIé scðŒÙ¯ýéz©QC»Ú¦>W}i™ÒÐ_Jö=Sž³Cÿ<.18°„c<&¶ÅA}ÔœõR~°\¨½JGÌK¥¦ŒL]Gª¾¾6ÄælÓ>Ôþ¹ÚÅ1tIõ®9ë“ßg½„r£f¹À46LÕ2ZÛg»–˜Ïºô_1–jæø¾©õû¤äÿ޹Ô6¼¦¶0­® Þeç‘õ±sHû.k\šðvÞ%IEND®B`‚PythonCard-0.8.2/docs/html/images/wt2fig6.png0000644000076500007650000001430610302203336020645 0ustar alexalex00000000000000‰PNG  IHDRœK{˜\¯sBIT|dˆ}IDATxœíÝK´$w]ð_gB8>A>„Gq†ÌˆÂ¼ƒr˜6xtáÆ¥#HdrIQp­G—f‘…8*sP™ÄIAPQDyzŽÛź·ººžÝýëî{ïçsNÏLwuUýÿUÕÝ¿ùþ«ºG/œ$¸ñ¦›ãòˆˆÃG¯º-ì3›››ÛgDÄ÷Ý»²Æ°]¶ê°¿]^}à%?ù{)+""Fõ÷GS&ïF¥i•û;³¦ïO>T¬0F“´Ü¿´¤ÒÊG“ íÙ§Qyõ=û4y¿¼œ‰û3ô±Òäš>M´l¢O£ÉFNÞŸ\ÌTG“²gŸ*÷k¶ÍtŸjúXZ÷h²áÓÛª¥•MSÓ§†>Öô©vŸõìSý¶iécã¶©ö©r¿¶O=^³=úXûš­ö±¡OÍÇw>Eåx¨,Þ—Úúä}©þµWêCcŸ¼/MÝoÜ6ï}©z|ï×_ñÐÄ} '©¦Î]ãˆÑ¡Ê;Œ#büX › à`ûé?iæyOœ8çΛkþŸ}Ï= iG±œªÆ‚ståÓâêÃ/ŠC£C17sÒã.?ãqÄe‡Fqù7¿ÿð‰ûãÿúùÅ37à ™åî»ï9»°ù½œ²Æ‚óñÇ__¼êêˆÿ{¬qæñ8âUß÷„øÚÿŒâ;®x,Žêâ÷¿qM|ìчãŠËž:¨¡_yè}ñÄüü y†úâ}¿Wû¥ÔõôñÈ_ÿJ<ó¥·¦®ã¶NGDÄ5›©ëÖÇ‘c7t>çâ…óKhɮƂóúñÇâË÷»qÙ¡ö¤ò3n¤!"#¾üµïŠC•3C¿þ©ßžšï ×ÞØ«_~ð7§{òá›:çûû=""žzý/öZÏ<þåcwNÜÿޗܲóïÏÝû®‰iϸá-)møôŸo•Ïý‘ÛS–ñ?)å|}ír¿ãû~!""þëÁߌ/=pW¯¢sŠbó{^|sŒF~ôÎxô£wÄ÷¿%>wïqÕñ·ÄhñÙóïŠÏžW<㥷Æ3_zëRRNàài+û$ åå9vC9vÃÎ2‡›-çcãíŠðäÉ“qæÌ™ˆˆ8uêTœ=»;F?§.ço9ÝsÊW?ù¾ˆˆxÂŒCé_ºxWDD<åÈ""â?ÿþ7""â;_¸›j~±H:î£ÿû…_Ûù÷ÓŽýòο¿ðñ÷N,ÿé/zSDD|þoß3µîïþÁ7GÄv¡Ùäªã·ÄÐ ¨þù/ß9õسømññöˆˆxÎËo‹ˆˆÏ©æ+Nï<÷Óv{DDµµ;ýù'Þ¾óï‡?|ÛÄz®ýÑwDDÄCòÖ©6\÷ª_©mïœLlœÜ.²/žÙÞ./<µ]ßÿGÛÛëúwDDÜ÷7OÌwìµÓÛX½rÑY~lˆÆ¯Ezì±oFDÄ™3gâÔ©Sqêԩ³|ÑÉ“'­°ÍvÊù[ [^ÄözuXýÊc¿W^*4¿páW·ÿ¾Tl>ýûßOÑ#"âßþn²úîxóN¡ù¯óî©u=úÑíâª<¤±=¬þÙóÛCëå!õ"å¬sõËÞW¿¬(4ßÑÕÍÏý‘Ûãy•aõk66ãšÛÅéÃ綋̢ؼö•ïØ)4?ù§o›˜ï?öθîUÛð'þx:‰-ŠÍï¾#…æÙ[¦žWuÿ¥bóèkÞG_³½/ü᛺;¬D¹ÀœåüÏ–¯EÚU¤šEšYü]¡³~i鮽”lö˜ý¿JçrÃéO>rS|éâ]ñŸcgÚS^ø†­àk™Š¡õj±Q?¤>‹gÿðmññöøÌGvSÊç¼âôÊ¿„êN÷ùÈ©;ãâ™›ãïÏì&ÀEºY¸ïŠLØ Êéfyx½¯Æ‚óСÝIEŠY—ÅPzQˆž¾ò‰þÃêO>²{ñÐS^ø†™Ú1òECUŸ»÷Ž©«Ô«žùÒ[ã‘¿š>o³É³_¾{ÞåsJçn.˃º5üP÷•öås8«çq튢®z[E;"ê‡Ô‡´§sHýìÙ³­Cæ]ӿ횟‹¯ê·ãkO~5R߯EšÕw^ÿ‹ñ÷ÿzíECužöýoŒ/|ü½ño¥ ‡žþ¢7M]Mßdê«‘ŽßW]ºR½\t>ㆷL_¢_ãŸþr÷¼Í틆Úçyî+Nǧÿ|³ö¢¡:ÏåÛãáߟüðîy›×þè;qøÕïŠ>ø–©!õâ¡&׿æÝqÿÞ<5¤~ìµïm˜bQÅiSŠ9tH}tñÂùñá£Çw¾Uþ%?¹ýUH?ð¼ÿŽœýÁ »òºŸˆoŒ¿%Æßœüi¤Ñä/ÙOÞŸŽÝ¾ó•OüV<éº×O¡—ï*Wªï,nT^ty…1šü£åþ¥%•V>ªŒ÷ëÓ¨4­¦—î?òWïŒgýÐ[ãŸ/¥ÅCÕåì^©~z¦>Vš\Ó§É‚³Ü§Qi»Lݯ©Wú8šÜ“Cèåû}ªÜ/÷¡±O5},­{4ÙðémÕÒÇj->ݧ†>Öô©vŸõìSý¶iécã¶©ö©r¿¶OÍ¯ÙÆû5}Mv¦æ~sŸ†¼f»öÛÐ÷¥rŸ÷Æ>U…>}êîcæûRíqY³œæã½_§^³S}šÜ‰Þ—JËm9¾ë_ÃÍ}j{Ívõ©~Û´ô±qÛ¼÷¥bŸýô‹Ÿ4ó/ülmmŹsçæš¿üÓ–‹XÎõW<4ñxcÂù•CWÅÕ/þ©8tèq½W6Šÿ‹ÿ½âªøúçÜP€ƒ¬ëç!³ç_ôrÊ ·þl\ÊÿÛ/‹ˆGc<þ–ÞCÑMžt]ýÀW=ùÈM1ÒÆ5õ¬ÚþîËg½ì­-=zöËo‹ÊÿË€=îĉ+ÑË©j,8Gãoßá>9¯Z ·b(zÕ²ÚÑy•:Ìc*áüèÝ?³ŠvÀÕÑÍ:nÌkªàÌ8Q€ƒáôéÓSWº×žÃ¹µµµŒö°¼ÿ®;ko¼hHÑ p° ýB÷²ošþÕÅBç/ ͪ­`ÝØØ¨}nÓãMóÍ«ºÞºvd·!K¹Ý«hsÓþ_T[–Õ¿eìÿUï«YíÕ×Dô{ÿ_Äò MË]ôz‡ÚÚÚª]wÝ{¸×øÁqøèñÁólnn¶NO»J½|`nllÌt Î:ߢ”ߪoJ}çÍ–]Ø ]oÝúgÙ~]ëYÆq1Ïþ¢ï›ýºÉ|}î…þGäµó ÷?XõçWMû¯úÞ—ùþÇúzà¾{ݺ,õk‘š^|ëøÂìû¿Î­­­[Ó2²¬úÅ¿Ÿû·êԡ܆ƒjÝû¿Ÿÿ>Ö½}{Å*>ÿš>³ÚžóJR¯Sîç’›wþA˲übÙ]ÃÕ6ÔmŸº!Ÿò<}†d‡ž.Ð5œÒÕ¿>Ö¹uªÓû.¿ÜŸ®6TçiÛ¾]ÇîÐþ—ŸÓçøì2Oû–ÕÿºþÖÍÛ4õß³uÇÇAï—yß?ëæ²þE˜÷ýiž¶·íçª>Ï>–’poœUsüÏ®üæ1äÅS׆º™¿©}Þ¼‹”¡}¨¶»m[–?´Šå÷Ý~mÓû¶¹¼ÿûnãuè_Ÿ66ÍßU$Ôµ¯nùMíêÓ¿¶öU×ÑVx̲ºÚ×·ýMë\Äòûè³ëŽÏ®õwåçÔþwµ«xþ¼¯á®6ei{í×='cÿöµìmÃþ´”‚³Ï kVMÅìºXÆ›Aß6d.»­uHmX¶âØëSpÏÚÆ¾ÅXÝöíÛ¾LMëïÓþºç5É<¾æ1ïñqÐûO»ì×÷:¶²GŽÝ0ó¼KRÏxSYæU5ý)?ÖÖ–îá±½l¿÷¯PÞÿuI`“â9óuÛ·®h«kkWû2µõ¹­ýÕçíÕã«O{»ŽƒÞš-c›Ù/Šbóȱfúꤥ$œË°èÿé-úƒz–å•çéúP^u’µßú·êB­ªÚžºm¶.m­SÝCÛßõœUÿ]럷}µÿÅ|³Ì;äý%cýË”ÕFÅ&…j²9KÒ9ºxáüøðÑã;—´ß}ÏÙ…¼Õùëܦut½¹6MÏxq,z唢®mWÝôò2º’×®ø> YWÿ‹þ ÝnëÚ¿>Ë(//cèñ_¿IÛñÓµíêÚ×g›4­cÞ×ç,¯­Yûß5½kû =>»Ö?ëûÊAëÿå÷YÎ,gײûÌ[Öçó­ÏöŸç³©«mMϺ Ø›.^8庰­¸,'Eýøþ»îŒºº2­à¤Û"®ÏóöªýÞ¿½Ê~ae¿:þ9¨ªg_]çRÏádW¹ /§uÓ#öß›Þ~ïß^×u|Â*-ãýÓ1‹¥à\‘®7³ýþf·ßû·×Ù?¬³ƒþþ {Ñž.8÷CJ¶úÐGæðÔ¬çYeŸ5yÎ[7M}1d ppì邳ëäëuWwbø²‡/—±¾ì¢|’ýÐù"f;~šNì_ÔöœµO먩/Åã†ìÖËæææÂ—¹§ νlÒe4ëÐOÖWWѹŸ’^€½àÆ›nNYîZœó7wÍ¿¨ém_]1Äõw­»ë+-ª'Ýw=§mZ]ÚWצ²>CÒC÷O×:–]°Ì{|5-¯nW÷ÁýS·þy¯¦çÔ‘t¬÷ßuçÌó¶«—ͼÔdå¸Y‡>‹yëæïZþ"Ö?E­¿iþò{u;õYSa0Ë>*ÿ]Ì?Ëþ©kÇ2ö_Q,ë+ÌsüÕ­£¼üêüÕé]û'ûøêÚ?C—¯XžÃG¾Ý}ÏÙÖe®uÂY6ËNÛh5U©.¿kúAѧ)¶Ñ2 ò¾–ѦrÁUN醬»íøjKŠûXçýÀzú=œ]öLÁ9Ô!À¦ô®é‹¶¬õ ѧ-M©Zµh_…U­·Ïñ××¼Û±+õ\µ¶ã¾OªÀú[Û!õªò°å¢—×4$ØU4T“­òc]²‡y‡êÚ¾³nÿuéç¬í/æËn×:šþ󳌶eZÇÿd°xkýÓ–M^ÓôêóªéHß²ïúëž;ôƒ³mCÚWí_S_»–±¨¶UõiÏ<ûgû·îyMÛg–y‡´¯n½}’À¾}ïóœy¯¾ýWl¬¬Ÿ¶\ë‚s¯ðÁɲ)ÞÈà·Ô×ÌЄ©|^gù1XG ÎùpßµµÂ‹‚2Û€½bÏ\4Äz*6§`MœÌ¬ëB€'3ª›ŠN ‰s8™IÝùƒÎ)êH8H¥à •‚€T NR)8H¥à •‚€T¾‡€››› _fkÁYýÕ˜½ôÅÞm¿x³—úÑGõW–½ÞBÓú»ÚW^Î~Û7°—ÜxÓÍ)Ëm,8ë~'{kkkáAÆ2#¶Û]WèøéÅÅYÔÏY–÷ÕºÉ:>`;w.¸ïÞ8|ôøL7Yéú*ŠŒu+‘î­[ŸªÖ½}MÖµ€,ó›mEg®h¨KA‹ûuÖMIcSÑÕ6dÛ–^¶ ÝÖ¥ruih×ô¾ík›^}×ß6½nßõYþ¼íkjcÆò÷Êñ «–QlF´\¥^JŸÕÆÆFcW}Nõƒ¸úxÝüÅcmæu}˜÷|ÃòóºúW7ùyu}ï£Ï|Mí²üyç¯S·ý†èÚþ³´qUÇ'¬‹yÎ&­_‹4ï‡ù¼ŠB±iÝmé\õymô]çéÍ{ß¼ó¯J×ö_¥º}¿ìm¼¨ãÖEVÂÙ뢡KCË,œÚ†¸gÕVÎ3½ïz›Ò×®ö­BÆö_´Ut{aûÀPYçpÎõÅïåÛy?ôgIÒfùÐWl[ä¾[…ºv76±—ŽOX¥¬„stñÂùqùIwßs¶q¨°kعüœ®ûÕùúL+/£nyuÓëÔMo[wÝô®ç Ùv³jʺýû¤¯} ¨Y¦7íÓ6{ùø€utñÂù¹‹Îºº2.^8?Çã‹Î/^8?¾ýöÛÇãˆè}ÛÚÚomm šÇÍmY7ǧ›››››[¿[QÎúwS]9ó÷p.#ÁƒY9>`¸•g•pÖ™ã†[ú÷pFt_(1ïtÖÇʾ‡3b±‡°žV’pF(:Š•$œE'Àþ·²„³ èØßVšpFtiõ¼ÓX­•&œŠM€ýoe §bà`XÙ÷pF(6‚¬„³õ—†º Åy§°>V~•:ûÛʯR`“pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤’pJ @* '©$œ¤+’Ê¡Ÿ8q¢q™—ç4€½¨-©l²¹¹Ù:]Á À„¶ó1gaH€T NR)8HåNj9vCã´‹Î÷^Ž„€ZMEåb3BÁ @‹jq9´ØŒPpС(2g)6#œô0k±¡à ™‚€T NRùNvlnn.|™ N""âÆ›nNYnmÁùþ»îLYÏTÁyúôéU´€}jªà|à¾{WÑö)W©êòˆœ«‘ "b´±±1^u#Ø¿þÄ3OAઉIEND®B`‚PythonCard-0.8.2/docs/html/images/wt2fig7.png0000644000076500007650000000764207440612044020664 0ustar alexalex00000000000000‰PNG  IHDRà,”œ÷ iIDATxœíݽ’äÖyà3® *ÐEl8a§¢L‹KÒ²%J® Ç¢-DÉÕá`®iµeQž°«LZÔ¹¤hRi‡îÝØD  Ñ§ÐøùÓ¯›åóÇ_¾ŸRzã[owDóïÿ÷?ó[üÑ×}¶þÍg¿(×Ëß{í'ß{í'»öús:?7¥ôƒ×öçhþäçåÒ¨ åœi6Žƒ®Ñ¥"•9 0Õ!Žã+èò.Ž×_ùaóo‹ ºø:®•sSŽ;ׯ£w9é“„øâWµ!ŽVÅ`4ÀœÕ® ædt×ÇëßüasàáWÞþøË÷Ë!ŽŽ ú;¯þèwŸÿro:Wï†.îƒþî·ü›Ï~ѼNXxëÙ;>¯¸Høýg?ýàù»åÐs1 Ps@cïÇÕf½º^,·[“%åìÛÕsÐä7ÆdI­Gs¢NèD-ö]¼ùõüOÞ?lŠzí/Š—ÃP`ÂN™ÌY@ôåéõICÐ}©ÍNw(óAõ— úöæz¸fÀPþ¯ó% I ÔKcÐK·ÛåÒIS¿Hxÿ°¤Ä—3· pF-wq¼xT"ÑBí f  ¨®û k·X¿xÜ>½^”öÜ0€¹ÛóA•ZËefÂx™z½rî“„ÐÎsöêûÊùa]Ü(Ç@TÖL’›n}ÿ¦µ' ;"¸ÖF¥Îî°1èš'j ÃIcЪf€þœç>h¥4jO]Ûû L p|@7D_Jiº e8B×G3v‹5åz¹ Ð÷As ›õêænÙ¼i´¬¬k /¶O•ûL›[š¼‰ÉÐ ©š¿År-‹…jËÒ™9Ð\Hk?6m›:5 ›*•ë;F¨]Wœ§rà¢P«‹÷îÛS« ¬3Üf÷âq[~kÊIï:vInÎã(JiæÃU-¢kuþ^ÉEBæ¡—€nÎ]¾¬Í(m¬cjIZ}¹ë¯:Z_Â$! O™ÓN:ìr†€Þ5Ñ]õÏrHZ"3›õÊ´ý «Ç1hÇb¼n—Ë¡›—ºHhЙqQ;A×mvåàrÇB±\~kÊy”öÞlçN;€]²&KÊYèÞ·û%M癀³ÐA h€ |ÔZ¸‹ƒL·Ëeg‹€†v÷›¡›@t}O9  a'wÑ­ïß´ŒA% ‚ÐA hz—3+ÿ¹¶)ÐA h€ ÜfÇ0jÏÌ\“<9Ð £šÂÅrmM5ˆ«ËÒ™ùÐ ÃUAØK@3€Zu¼k3Å23ç"!# ”fžTÐ\B5a7ëU1ļk›rHÚEBfN@Ó»Ö<­­ÌßF:3†8‚RAC»ÍzeÚ~†% ¡Åír9t@@Cµ3ƒJ@% ‚ÐA h€ ÜÅ-ÜÅA¦Û岿³E@C»û‡ÍÐM º¾'аӋGu4]úþMË4@P ( ”€ænî–ÅWuÍ`­‘Ðô®xÊ®©d¡§!2ÍEy äÐ ©9îQ]S[ÞµMu÷ê‚Rš±s4½Ûûø×b¡ú4Ør¹\Sݲ¶M뿘T댟€æZSõÄ•¿Lž!€ 4½ëi,¸vX#ÎL!z·k :³r„º¹M¹¦¶PÔ†1ºÚ¬W׋E1åÇãv{ÿ°1A ­·ÛòT™7¶ÜŸ€fÄjÕq’¿L‹€f¬šÕ1LŒ‹„\š0…L*hzW^¸+_ÖV7.Q;læ6.2"W›õêz±(¦üxÜnï6&ˆ¡Õãv[ž*“çgýýPg !€  q@»Íz5“_K@C‹Ûårè&€€†6jg"0 ”€J@% ‚r‘êr®Þ.—.$Ò7 -î6ëÃâ\†€†vŸóÞU;׿ýÈÏñæ !9s†˜Wdò4àéõ¢{‚‰É¹H¹ž^/†n󢂆ªõòÑéÜý¤ÄŽ5{·dò4t)2ºLç½¶ælÎÓ›kZ—=GfV4쑟ÎiÇtse~¶Já9аÓAµs¾ƒª`WçÌEBèRär„G«(¥gH {”Îͧ/6µ>M±uðºùäÆœ'12žIH®ù<“°x§ÝṲ̂+J‘Æ*h¨ó8‚ÐP§4& ‚ÐA h€ 4@P ( ”€J@% ‚ÐA h€ ÌÅu9sqÜ.—¦ì oZÜ?l:þÖSN¸  í:&F福öWp•/g¯æ6Çý[„% áljù(.9‘‹„Ðé̉TÐp ÅÐGóaÞkÊõÇíÕºžqÐл2d‹…Zæ¶®i.§—s¹|†l÷^†YFM@CïšÙñdîŽlÍž·'Oƒ€†äTµÝ•õéÇ'> ¡/9els›Úz'ÖÂJéQSAÃÙÔòtW[ݬJÞuY¯¬£[úu¯Ž£1.W›õêz±(n¼Ünï6÷ç3gÛmyªL[ñN»·™IW0”"UÐPw»\ÝHÉ4) ÂEB€ 4@P ( ”€J@% ‚ÐA h€ 4@P (sq@]Î\·Ë¥);蛀†÷›Ž¿5É2—! ¡]ÇÄèµssÂþãÛzè^;IΦ–’B“¹H}‘ΜH —P }4Ëݱ¦\Ÿ³“$ ¡weÈ µÌm]“³ÜšÝL‰€†Þ5Ç::ò´5‘÷îÅ$ h@Îðt­FÎÜ‹)q‘ú’Sð6·©Ý¨×z¥ôL¨ áljyº«à­nVlÓ\SÛx³^uïÅ$]mÖ«ëÅ¢¸ñþq»½ØtÜŸÏœ=n·å©2mÅ;íÞf&]ÁPŠ4VACÝír9t %CФ4& ‚ÐA h€ 4@P ( ”€J@% ‚ÐA h€ 4@P ¨úlv›õÊT^¼ЦÁˆã¥€V;Äa  ( ”€J@% ‚ÚùTïëÅâ’íÈñôz±Y¯:6Ðæ³ØÛæƒ|ƒgth_M»7rœ÷ìš¼‚Ýu—Ùm>Q õÏè¸÷5ÕÞÈ1ç÷~CA h€ 4@P ¨óôÍݲãåànî–å×ÐmÙ/¿µ£x;»œñœiî;Šž‰Ü£èÀ©šc½Y¯Š¯Qœy'¶vï1§ý‰ßñ[8=s èÒX2º0®Ö¨ÚKóì1=0— èøc µæíZ(ÿöìêÌæújûoö.»þûÉü¦dj=Zëñ=òéFѻΥê˰çØu}PåìÊOÝÜ-£}š¨Ú¤½Í+7êìjmër³©û¿Õqm.’®úgÇÑÿVv‹ÖçÒ(úst.ÐcT=ÑË•μ]EJGñ¼®iösÚÑæÖoJŽæÑ"|+K#êàçÒdè±ÚõsÕñó*ŒZ5Í?®Í»ÂKœ«â÷ä4Ìú"awR=Å«VÎkW¦WJ·*Ú|®oÊÞØE1{ `GMÉù+èZ P={Êõƒ']³Õf‡ªjms}ù3ö ÖÔÚyt›[‹Ç½G+·ðž™°=0ºsi®6ëÕõbÑœeªuå)N¬@·Ûû‡M÷ÎÞæMµÍ‰öÏ舾špoä8ûÙ5aE_Ízˆ ²Ë´ÿ6¢‚J@% ‚Í3 3is@“ƒÑäÛÐO¯Ç÷øamhòoð zƒƒì¼€¡¸ 4 ”€J@% ‚ÐA h€ 4@P ( ”€J@% ‚ÐA h€ 4@P ( ”€J@% ‚ÐA h€ 4@P ( Ô“Ìínî–}6cx›õª§#_/=9‚§×‹þºf.7 SJ/·ýµc@O¯{ÐÇí4»nªï ‚8  Ó §÷Ž€É0 ”€J@uØtªw‰”wÜÜ-[—g¨µÎuä9w,D" kÑŒŒ™‡ÈÞþ&iCò¨FoÀL„¨ ;Hçå¸GÑEE_+«CCÕmZ×1Eh:4èk ÍA|Ãú0"Ѻ–)T5?ßÑQÍ .z@'½C­ÎßQOÂXŒà"aú*£‡nEÇuEs/] Á…¨ kùÛZâ͹Žnퟜÿ´ªÛ4÷šggˆ„è´;”÷n3‡öO¹ÜÜQ¯ÂXŒcˆ`†4@P ( ÔÜŸ¨Ö}g÷M•ÿØ€#D¹ÍnÂüÇ'7 Ý-{4]ÇEB€ 4@P ( ”€J@% ‚ÐA h€ 4@P ( Ô“”ÒÃj5t3`$þ¡ç›•}:FðIEND®B`‚PythonCard-0.8.2/docs/html/images/wt2fig8.png0000644000076500007650000000717207440612044020663 0ustar alexalex00000000000000‰PNG  IHDRà,”œ÷ AIDATxœíÝK“$Wyà3ŽY°Ô‚…B/{Ù[„3’ŒG/ÇÈÆ ¢~„Zv’ic„gYHfŒ‘f„,±íe/ûߘE¢$'ou*+/_V=OtLdegfu*ûÓ'o¶7× €`.¯6SJçKWÀ_=½¾N)=,^ÜÝÞ.Y Ë©§Û»Ú÷¤éÁË/¿šzée1ïÁË/{×­¯þ ckÙë¶l-ÿìZ·¯˜ÌfÉ^7÷d6é®Í¯æóݳ˜¸oÄŽšÿFVøùÖÖÝË×¾~_LüÍàM0©‡»`‹7_É_øìüâ鿽¨ÎÐÊ<Â׺XK@?ÿÓ¥”ãŸÊ9Ÿ~ù›”Ò¯¾3°ÀÏþxS›óÝoÿ¸6ç¿_ü{JéíGï~ü⃔ÒÛß·€°–ïA¿õ­«ÖA5o?z·Xäã礔¾ÿø§3Ô0–Ë«MJ©zéIsNMçA¢¾ê>pˆ"ˆ‹PN霆õ ?ùâÃrúÍoþsJé_üººÀßÿÝ¿¤”~ÿù¯RJßyíG)¥ÿùü?RJÿðÚ¿fþˆbd£ª6ÄñÑó÷‹NôGŸ¾_.óƒ×–Rúí'¿(^þã?Ï}KÓÛÞ\_^mÊŒÞy!wßivŸþé7Íîó'_~˜Rzã›ïôDóÿþßæWüì7Ï>»ùÝg¿,çÓß{ô“ï=úI×ZIççï§”~ðúÏþÍŸþ¢\@:•¡œs›cÐÕNt©Hç}eŽAêÇðtyÇë¯þ°ùÝ¢]| «àÔ”ãεñè.]Iø‡/~]âhU Fœ²ÚQÁœŒîâxý?l<¼ñê;Ÿ|ùa9ÄÑÓƒþÎk?úýç¿Ú™ÎÕ³¡‹ó ¿ûíÿî³_6Þ~üîÇÏ?(~ÿñO?zþ~9ô\ŒDÔÐØ9Äñ`{s}~qqw{ëfI9ëöã4ùŸYRëÖì¨G´£ë^¼ùJþ•„ï=Ý—zíë÷ÅËå/T8b‡ÜÌY@Låìü Ç¡h€©ÔîN·/÷ƒê¯=è'—çË•KùÿÞ—°$=h€ ^ƒöèXú=Ùlì$0›úAÂ÷žn©ƒørî패å,Žû;]$Zè;ÃÌŒAÕwtíëû»Û³ó‹ò߉ 8u;.T©±\æDÏ!Ó¤GÎ]Ií0g§©œïеÁr DÏš£dǦßÔiíèž®†µQi€Ñí7]sàšèqÐiv÷w·å×XÁq«ukôrš«è*«q΃¶УöÔµÊX¡â`VÕNt­C¿Vš7¦«§-uM4_v-œ³Jæs6’SaMÐÍîs×áoèSPKÒêË®oõL´¾„£4B@rO;é Ðeò1èêáŽÖ…!¦í͵Ûö³¬ Ç =‹õz²Ù,]ÌuР3ë¢ïL}÷âȼ'@yíí„¡ÚE¨MÎòèÑ׃Î9»¨ÿLçÔ8µ¨õ%Mã܀ѵô Ïž½˜¿âÛþí+K—§E ¨Þ1è·U{Óµ—{i®{ÈÖ`jÎâ Ó“Ífº½e×S½Å(§ê½§Û¥K º©o90ßÍ’ªYÿÖ£Ù~. æ,#úMý—ÖŽ1è³g/ZÃôþ­GÅWù²k"GëÖZ·¿ï–ÖkÈA¢/\|åÇe¹pëÐvmkåLq œ¬ÝÝš’µ>o9sX¤6·fà›8j×»rùks]ÓÒ#k º»Ã´ØNs]q|Ürn®?Ö2qqèyÐEpW“·+…ó·vÈ\í>6 VB|¹] Ü"‚‹¯}ƒ¸µû¼skå2úÚ,¢ëÆ^µÛ„õßVl§Ö­µnß-³R}Cµ4¬etÏÂ9ƒ=Ë·~«9ÁªÕž1˜9'EzhluÜ# ¤ö,‹jø6·æ>½'ÎCcYF5…‹éÚœjW§—JçÖPtu«‡=­¢õ±ßûÖÉ1i hã¼´÷œüœçyg>ó{6ÍŽaÚßâ˜=hPëw-d(#GõÙ›åMÏKì\Ñô‰Ь@œqçj'º6½ïvú·ÜÿÓ=èDhæPí&oo®‹!æ®eÊ!é  kqY}Ù?L‘3ˆÑ³|ë·<è¤h&ך§µ™ùËéJà ܰ (=hh·½¹vÛ~–% ¡Å“Ífé@@C}g"0 ”€J@% ‚ÐA h€ 4@P ( ”€J@% ‚ÐA h€ 4@P ( ”€J@% ‚ÐA h€ 4@P ( ”€J@% ‚ÐA h€ 4@P ( ”€J@% ‚ÐA h€ 4@P ( ”€J@% ‚ÐA h€ 4@P ( ”€J@% ‚ÐA h€ 4@P ( ”€J@% ‚ÐA h€ 4@P ( ”€J@% ‚ÐA h€ 4@P ( ”€J@% ‚ÐA h€ 4@P ( ”€J@% ‚ÐA h€ 4@P ( ”€J@% ‚ÐA h€ 4@P ( ”€J@% ‚ÐA h€ 4@P ( ”€J@% ‚ÐA h€ 4@P ( ”€J@% ‚ÐA h€ 4@P ( ”€J@% ‚ÐA h€ 4@P ( ”€J@õ°öz{s}w{»H)T½ÐO6›…ʠÖwˆÃ4@P ( ”€J@U?ºt~q1g9ÎÎ/¶7×= ¨y;kÞËåÕf¬MÅ´W[ü¸g6îÞuô::;ë.³5hŠbîï½ÁIÛP÷ÌNù½ÓÐ0–ãûÍ<¾wD@Æ ‚Ð̪’^û¿0Û›ëó‹‹æßk­3tw{ûÞÓíÎnj>PNÍ{¹¼ÚÜßÝïñòjsˆŠwQ4TÚÿ a¨{f£ï]G¬h«ñ{е.F´ÇåÕ¦üZº–Ýò«]ÅÛéúÍqŸi®;zËL‘/‘[`»Ö±:Å!ŽíÍuñµŠ=ïÀjC½ÇžbBÕÙo¢Rã·@ü Ï)ti-]XWµ­æùÛ¶ÚJS´Xü¿Ð§nf3_@Ç[¨•×5Qþ»ìéjÌæüjýË–Ýó£»þûÉüPò hn­uû=[ž¨WÑ]ûRõåâ¿ÇdÖó Ë®GÀƒEÕ’v–W.°Ô骶uºYêReïûC‡Õ\$]õßž­ ø(çlºh-г/ nOz¸Pe‡êŽ^ÎŒ°ç èß-Þ¯éÿ¥m¶s꨹õCÉ, ùC÷ÚBš2zÖÒ]U1:½V]¿Wý 8M-¹r:hµßüa5w…×(-0i3®¢FÜýNú a~‡nXoe\]¬¨+}ÈÏ-ÖëCÙYIØÖ‹Ðc˜ñ{е.@uï)ç/žtÍ2ªe‡êìUms~ù;á æüÜZƒkní<îÜZ¹LÏ93S·^ص/ˆù®$<°z¬Wå­±æ½\º’°"ÚÇ=3Wæ›êJBèr¿™Çñ.X…ùÚnÍqŒWÇ»`ô ™O9v¹êu5˜»ÙMèXkÞKu ú˜ƒÀt¾¢­œÍN9•`°Õ<“0“šöì¾cuô7#ê è5þR©™à|Üì¥s €¥8 4 ”€J@% ‚ÐA h€ 4@P ( ”€J@% ‚ÐA h€ 4@P ( ”€J@% ‚ÐA h€ 4@P ( ÔÃÌåÎ/.&­cYgçÛ›ë‰6®é€ar:¥tw{;] šá}i:`CA h€ 4@P ¨=NêòjSN—g\^mZ§OPkûŒµåSnXˆ,D@×2¢'";Û8J+âG5ZNDˆtéÜ£÷(š¨h«bfuh¨ºLë ¦èMæ}m¢9ˆoXV$z@×2…ªê‘ÃBOC5{Ð@pÑ:Éèµ¾pþŠZÖb ÓW½tQ kŠæZš‚ у®åokï”ûÑ­í“óŸVu™æZ§Ù˜°"!:u‡òÎeNľíSN7WÔª°ëâ8A ( ”€J@噄sÐtÀ¹}v~̦ž”¦†É hg˦é€aŒA% ‚ÐA h€ 4@P ( ”€J@% ‚ÐA h€ ¦”ž^_/]¬ÄŸðÖYþ€·àgIEND®B`‚PythonCard-0.8.2/docs/html/images/wt2fig9.png0000644000076500007650000001042407440612044020656 0ustar alexalex00000000000000‰PNG  IHDRà,”œ÷ ÛIDATxœíÝM“ìVypMê.X²àCÜå,{‹‰ƒßB†Ô,'8! ©þY̲«°Ã„™eWÅÁ¾6ŽÍ¶—³¼ß&Y ]½œ>ý¢Ö#é÷«©[jµÔ÷ôÍž9R]mï7ÁÜ<[?)Šâzµ»%üÙÃfSÅ“òÁãn7f[hyR-=lÏ]WÅÕË¿Zzéa¹îêå‡É}›»_e¼Zö¾¯–ÿFöí›jLf·dï›ûF2»tßËOæû{`câ¾jþ™à÷·±ïA¾öåÂ_ý êÉþM8Êê­¯çoüôzõð/ŸÖ×h€ežáëܬ# Ÿÿñ?Š¢xý›_­ùäËßEñæ+ïÙÀýá¾±æ»ßþqcÍ}ú¯EQ¼ýÚ»~ú~Qo¿þîyÛÖøôßþÕ³ÎA o¿ön¹É‡Ïß/Šâû¯ÿôm8—›gë¢(ê=i¯iè=IXÖÑÅWå3§(ƒ¸ å"#‹ã*è¿øuµüÖ·þ¡(Šßñ«úý—ÿXÅï>ÿeQßyõGEQü÷çÿVÅß¼úO™ÿE9²Q×âøàù{eýÁ'ïUÛüàŸEñŸÿ¼|øwoþsî[Þö~sól]eôÞr§.³ûä¿i—Ïùë¢(ÞüÖ;‰hþŸÿý÷üô‡û>»ÿíg¿¨Ö”Ëß{í'ß{í'}{ý)Ÿ¿WÅÞøÙŸ¢ù“ŸWHg  *”s¦Ù8r º^DWÊt>Tæ4À Ô‡8ޝ ««8Þxå‡ígË ºü:®•KS;7Æ£ûœôIÂßñ«ÆG§r0`Égs2:5ÄñÆ7Øxxó•w>þò×ÕG¢‚þΫ?úÝç¿Ü›Îõ«¡Ëë ¿ûíÿö³_´Ï–Þ~ýÝŸ¿_ž$üþë?ýàù{ÕÐs9 P{@cïÇÕö~s½Z=îv&KÊÙ7ÕsÐä7ÆdI¯æ@ÑZî»zëëùŸ$¼{Ø–õþÚ7^”Çÿ  ÀŒ2™³€ÊÓë“n‡" †Ò˜îPæƒêÏôíÍõxÍ€±ü_ò!ŒI ÔKcÐnKÚízí ‹iž$¼{ØŽÒâË™Û8£Ž«8^<*‘è v† 3 Tê:èÆ%Ö/wO¯WÕ¿7 `éö|P¥Är™…0žC¦AÏœû$!tsœ½†>s~X@77ª1•5³äÀ&mè¿´öt"‚ëamTàìƒn8q¢&NƒV5 ç<×A+¥IhÜumï2Òñ]^]~)¥IÊp„ÔG;vË5Õz¹ 0×As ÛûÍͳuû¢Ñª²nÜ‚¾Ü¾¨]gÚÞÒäMÌž€fLõü-—ù[.Ôã¸\–Î,€æB:‹èü±i£Ø,ЩÝžP©ZŸ¡v^q™ª‹R£.Þ»ï@­‚°Îp™Ý‹Ç]õU®©&½KìR¸8£(¥YC\T½ˆnÔù{N² ƒt{ÎèêacFicKÐHÒúþ§ a–ÎЧÌi'úœ! û&º«ÿ[ IKd¦b{¿1m?ãp Úͱ˜®Ûõzì&À¥NtfZÔÎDºÌ®\N,”ËÕW¹¦šGiïÅv®´è“5YRÎBzßôCÚÎ34g' ‚ÐAåÞÕ»0^Ì’¸ŠƒL·ëõpGK* û>®}W×19wÛ±›@tCO9pÀuЖ¥qÌ“6ô_ZÇŒA7®zn\]ÿ·ýTçh;ø“„õÁŠÄÀEû£ƒíO6ž n¨z§o§2Ð 0'#\f×¾ ó–3+ÿ¹¶99  ÷V¾‡–ÆJi€„=sq´¯ƒ®¯l¬IL~Ôžº0ô ´g º3CÛ+ûæBj?ÕÞ]L/Sベk w#dIÜ4–qÔS¸\n¬©q}Y:³šq8+{ hFШŽû6S,³p§^fçJ .@)Í2Í¡‚6S|õ„ÝÞoÊ!æ¾mª!i' Y¸94Áuæiceþ6Ò™å8[@×o[Ÿm£\¨&âh,w>Üû"Û(¢™9gݘ )1/RÎS‰雉 Îh{¿1m?ã:g@'R²ýTþÙÅö–☡ݮ×c7ƃÎYqÌ婉àB³Ù%êåSJi€˺'ab!!1/Rþ”I9[6†ªæáj{¿¹^­Ê?èw»»‡­¤£ÓãnW*À Ê4aÂ~rh€ |’:É!Óíz=ÜÑrj@·o¹óp÷°» D7ôÄg¨ £}Þ:H3˜iCÿ¥uÎ1èÄ= 8Ô€cÐíë—Ío¨€nOrdî$€ƒ\¢‚n3wÒÒtÞ±ÛÌÎ6`@”›æNš±¾ûs÷ çÝ";çI¾‘ßvÍkî¤Å/ÐU&Êåò«žÎåxq}}{Mbã>9[º˜dBnž­ë7',VkË}ÛÔw¯/¸Õ,S—â¨0g!±{ßšF ú_'^Ä0H({oÿZ.tŽ„Tkê[6¶éü Õ:Óç£Þ\Bgªž ò—Ù3Y@PšÁ 4ÜxY#ÎÌÏ9'K* þÒ¥o :³j„º½Mµ¦±ÐÔ†):çdIÅiŸ±öùìke}MߨtÎ6O9IÈ<âj„É’ú¦=*ÑD²½ß˜¶Ÿq! ;çìOL–´wî$Ýíz=v`È1èöùÃòÙ¾ µ3\t²¤Fá¬^H¸ÄI²R® š; `±Î0YR§ÄdI}s'™ä îÌ“%%æ?JoÜ·`±\ ”Ùì ƒ«8Èt»^w´hèv÷°» D7ôtz9)BÚÐiƒJ@% ‚2Í%Ôow2Ö4Íæïgr4ƒk$£ „L†8¸4é ™TÐŒ¦qwÁúÃêõ¯Ø¦zè7S! G=(«åzÎæ¯ï|ª}ߨFpC|š kTÇ…üe^4SÕ®Žafœ$äÒ„)dRA3¸êÄ]õ°±ò¸q‰ÆËfnã$!rµ½ß\¯Vå”»ÝÝÃÖ1tzÜíªCeöü,c¸Šò4Ä”!è¶½ß,äÏÂÐÐáv½»  ¡‹Ú™ŒA% ‚ÐA h€ œ$„¦œ3„·ëµ‰ M@C‡»‡mâYç24tK|λ¯vnÌû‘ŸãíBræ 1¯Èì h8ÀÓëUz‚‰É9I¹ž^¯ÆnË¢‚†^õzùètNß)1±fï–Ìž€†”2£«tÞ;igÎæÜM±½¦sÙ}dE@Ãùé\ôŒA·Wæg«^2 ½ªóT;ë¸dNBJ™Ën­¢”^ 4ìqP:·ï¾ØÖy7ÅÎÁëösîÄÈl¸'!¹–sOÂò¦·YHW0–2UÐÐäv*! ¡IiLN% ‚ÐA h€ 4@P ( ”€J@% ‚ÐA™‹šræâ¸]¯MÙÁÐ4t¸{Ø&žu—.C@C·ÄÄè‰Ú¹=aýWùröjosÜÿEXΦ‘â’9IC‘ΜH —P}´oæXS­?n¯ÎõL‹€†ÁU![.42·sM{¹x9—«{Ȧ÷2Ì2i׎ÈĹÙš?owþž #È©jÓ•õé¯O|NÂPrÊØö6 õN¬…•Ò“¦‚†³iäi_[߬Jî;­WÕÑaݹWâÕ˜–«íýæzµ*/¼ÜíëóY²ÇÝ®:Tæ­|§émÒŒ¥Lc44Ý®×c7ŠÂ´) ÂIB€ 4@P ( ”€J@% ‚ÐA h€ 4@P (sq@SÎ\·ëµ);š€†wÛij&Yæ24tKLŒž¨ÛöwÛÖC÷rsØYÐp6”šœÈIBŠtæD*h¸„rè£}[îÄšj}Î^Ì’€†ÁU![.42·sMÎrgv3'×ëHäig"ïÝ‹YÐ0‚œáéFœ¹sâ$! %§àmoÓ¸P¯óE”Ò ¡‚†³iäi_Á[߬ܦ½¦±ñö~“Þ‹YºÚÞo®W«òÂûÇÝîîa›¸>Ÿ%{ÜíªCeÞÊwšÞf!]ÁXÊ4VACÓíz=v ( q@›Ò˜ œ$J@% ‚ÐA h€ 4@P ( ”€J@% ‚ÐA h€ š³Ùmï7¦òˆà¥€6 .@/´Ú cÐA h€ 4@P ( Tï]½¯W«K¶#ÇÓëÕö~“Ø@›Ïbo›ð žÑ¡}5ïÞÈqÞ£közºvÕ]fc´ùDC4&Ô<£ãÞ×\{#Ç’ßûq q% ‚ÐA h€ ÎÐ7ÏÖ‰‡£»y¶®¾ÆnË~ù­ÄÛésÆc¦½ï$z&rL¢çj‰ôö~S~MâÈ;±µ“xÅtÚ9œø=¿…ó³Ä€®L%£KÓjíˆê½´ÌÓ³q¹€Ž?¶Ðh^ßBõï¸o¤¯3Ûëëí½Ù}ú~ýd~S2u¾Zçëúʧ›DôKõ‡a±)J}PåìªOÝ<[Gû4Q½I{›Wm0Öékmçr»©û¿Óqm.“®þoâÕFÿV¦Eëı4‰þœœ‹ôÕôje„#¯¯HI/Áëšv?=mîü¦äh¿Z„oeeB=üXš =U}?W‰Ÿ·PaÔ©ýgþqmî /=p®ˆß“ó°è“„é¤~ˆW­œW_æWJw*Û|®oÊÞØE1{ `GÍÉù+èF P?zªõ£']»õf‡ªjm{}õ3ö 64Úyt›;‹Ç½¯Vm3â53a{`rÇÒ \mï7׫U{–©Î•§8±}Üíî¶éW8{›O4×6$Ú<£#újƽ‘ãìG׌•}µè!€È.Ð~mD ”€J@5™{fÒæ€fÿ¢7È×ÐO¯§wûamhöoð zƒƒô^ ÀX\ š€J@% ‚ÐA h€ 4@P ( ”€J@% ‚ÐA h€ 4@P ( ”€J@% ‚ÐA h€ 4@P ( ”€êIæv7ÏÖC6c|ÛûÍ@¯|½Z ôÊ<½^ ×u°p¹]Å‹ÇÝpíÑÓëÁôq7Ï®›ëû‚ èbŽ?ó{GÀlƒJ@% ‚:l z8õ«Dª«nž­;—¨³ÎõÊKîXˆ,D@72¢ ‘½ýÌÒ†8äQƒÞ€…QA'Hç„jܣ좲¯Ê•õ¡¡ú6k€˜¢4 íúÆB{ß°>LHô€nd uíÏß':ª]AÁEèBF÷hÔÂù;êI˜Š œ$,¾Êè±[Åq]ÑÞK—Bp!*èFþv–xK®£;û'ç—V}›ö^ËìL˜]ô‡òÞmâÐþ©–Û;êU˜Ši q,€J@% ‚ZúUÂ:  /pï¾¹ò‹ 8B”ËìfÌ/6à8¹íjÙ£é:à8N% ‚ÐA h€ 4@P ( ”€J@% ‚ÐA h€ žEñ°ÙŒÝ ˜ˆÿ9$ÇK, ¹qIEND®B`‚PythonCard-0.8.2/docs/html/images/wt3fig1.png0000644000076500007650000000476607474727433020703 0ustar alexalex00000000000000‰PNG  IHDRÈdÆ sBIT|dˆ ­IDATxœíËsEÇ¿CqàÈ?ÂGutÕ²µvÂ3àT–“8Á†䨱qb‚•¯mây༅% Tµ\»ìVŽ:êèÿF{gÒju÷ôô<4#}?•”G=ýøÍ¨¿Óýë‡ÆÛkÔ›ÕÍM,Wk¨mo‚òœõz[À`©Ô%SÉ/ªeÑÒ¯¼ÐmÉ3ÊħZk$Z˜çyðà¡õÏkÿ¼ìy^g\Í9ÏÓä%Çe¹©–ëÇï5^ze-!&Œ-!Q(xÙ9íÀ` { wßw`°„ê—»‰Øáç$(ÝgÕ¶ÏÃCcIeM „˘&nú¤ó±È±ÂËâÃätÿúß=À?·…ÿüï[€·þ2 øi÷&à‘¶ýðtpäic<nÕ*€ÉÕŽs׿[P¦™[‰TÆÒíO&®E´ÎÌìÚß:ÂÖf&ZF–ŒN”Cãd1og%ᡱ@$bÅ…ÓÜëu|pãíágÐÄáƒSmŽeÚ|òÁRà´n=˜ÇFugÇVµñWîN>;™Þ—9·~°:ýmà4Ï|õWL¯Áúì÷©•[|±É‚Ò…‹X ä÷gUŒì A‰+¿þ÷.^õ$àén;çCÔ¬{Œ4SŵiaÄ|F'Ê(yÚˆ°ÈÈÐX ’ß÷Å1‚váT,ú <ˆ8ŠuðÏOÉ´Øy²m-H¯3µrÚZ~Cô9d?Ä„•@†‡Ža÷Ù}ØÿÛŽ}*ðûU=ºòÀÈÙc­‘,ßÿ8wb­›æ`ú«#˜^=ÒUü>¿ü¿vê.V˜=æAZÇ¢X†‡Ž ±ÛÒØˆäõWOZ å&ÉñwÏcçÉî>þ2µ2fŽ_ º^sãX¹;Õᤫøâ£oP¹9‰ÅëAØ¥3·C»q+g`nýhÇ\ÈÚìCxð°1÷¦V£¼ÞÍš¼ü`ûâ?§*w*¿N\| °sù·Ð¼â’”˜t])›.–WÛÞl6êõ`ÃÔ`©Ì(Š‹Mó º‰D9¼×ï‰#Yý¸X±tàeçìåj {z¬ôâR“$òyé•=û¥&Æy/Ò/ËMÖ«³ÁñÌqýPs?w/QR{‘’ÊÇi-V¿T|[ÎŽ­ÆÕêãíF›>é|®æ% "®‚í&IÚÁý „0¶ c£ƒYÙÑG4¥¿$ϰ!ÄBˆ „!œ‡yUËü5÷âߤЕ§‹›¤ rÙýú­qïCÒu" b̓¨.6Í5oqAš«]ª´Eü¢îÜ1Nï»Xñ‹&n$>“®{Òø¤U¹T]0yre«®M“—[›º*ºüTù¸ÆOû>èÊTí b·–±bSñå/$n3¯*OU†LZ•Bg‡J˜ºî†ÎgÒ¥u/—›4a÷BuÎÆî,t:÷AT¤½®¿0=€¢ÄÏ;:¿ÖF¡Z[Šúe~¹·iŒŒÚ¹“Þ-—I“×kÈ«]qý¬¯1õD¾¨8O#vãâ<}TyëÊ’¿*]Ôü\ã'}|L×$ïw½Î¬[ã–[’EG1Ñ‹×8¶ ½æ¢ÃI Býåa¦M5iÂÖ„Ø’j ’än´íȃ$pG!è”=\jBˆ ìR=!(B P „à{Ò{Î󨿆 ¤ß†|óÈX¹ù{Økð{310X²ŠgÕ‚,Wk±Œ!îÄaãÃMM”ûbÝÅâ©;°’w:é}‚¼º_ÿF%t©‰Ž-HwhÔë‘—ÿŒN”±×¨i¸”¦…ü: $à¤Ë –:Ä¢ Ó¥³‰+¦‘‰’6)QËvÄÉ7I»l1½ž.ÍW›…½.!k\ÊÏý0o1¦Qù\y´1-­Ö%‹²¢æçR~î’Gò Ž÷?üT{.Ê“;˧z[Ó}|tk+ˆ]Se²§Kë§Ñ‹e¨ÂÄp± Å]^ªÏIãy•ްfó‹Ž0—'­®{&vÍäx®eè~;@ü«²I¶EgŸî>˜î£“@L_¸ª‚ª*[”x"aW—§Î²ZÔò›%qº!òÎϰð¸eؤQ•mcwf>ˆªOnú‡8Ý™¨i]ÊêF…JœÄ&< lì³/7>HúèY‡ÖÁ†¨•B·%Ù4–l^•Ô' Óª4~w©#Jy‚ްŸ^rM›¤I—ëú{Í2‰· ¢£ëŽϦ<9OS^QË•ã‹iTçlÒ'…Ê!Waz]¶êôTÎnØ«¶Ueêʲ)æ<Ññ¶ùa] bº…žI/Ú|„ œIOŽLfÒó@Ô¡Ø~‡âh‘K$ öuŠ#yt¨»Aj>ˆß,‘b¢úå~ý•Pd°T¬›^%ŽBÚIÔáM..üîâSH'„S´¹š¼RH'¬` RPLË´óBØRò<Еåî$l—»w“¢ÛÈ.!(B P „ @1@'½ÀäÍÙUQt)‚’—aR½`#»X„ @1@b€!ÄBˆ „/pS !z<Mÿ÷žÒŽ×š^sÿ^·í!$Wü.³wò§Œk IEND®B`‚PythonCard-0.8.2/docs/html/index.html0000644000076500007650000001075010353523456017414 0ustar alexalex00000000000000 PythonCard Home Page

Welcome to the home page for the PythonCard project. Please note that items in italics are still under development. If you have any questions, suggestions or a burning desire to contribute, see the project structure section below.

Introduction

PythonCard is a GUI construction kit for building cross-platform desktop applications on Windows, Mac OS X, and Linux, using the Python language.

The PythonCard motto is "Simple things should be simple and complex things should be possible."

PythonCard is for you if you want to develop graphical applications quickly and easily with a minimum of effort and coding. Apple's HyperCard is one of our inspirations; simple, yet powerful.

PythonCard uses wxPython. If you are already familiar with wxPython, just think of PythonCard as a simpler way of doing wxPython programs with a whole lot of samples and tools already in place for you to copy and subclass and tools to help you build cross-platform applications.

PythonCard is an open source project and is being developed under the terms of a BSD-style license. This basically means you are free to download and use the executables, source code, web pages or any other item produced by the project and use it as you wish, as long as you acknowledge the source of that item and replicate the license associated with it.

Status

To see how the project is progressing;

Project Structure

PythonCard is being developed by a group of volunteers who co-ordinate their efforts through the internet. For more details of how you can contribute, please post a message on the mailing list. It is open to anyone, so feel free to contribute whatever you can. The project is co-ordinated via two main sources;

Interesting Stuff

For some further reading, try the project plan and to do list.

View the project documentation.

Python Powered wxPython Powered

$Revision: 1.66 $ : $Author: kasplat $ : Last updated $Date: 2005/12/25 14:05:34 $

PythonCard-0.8.2/docs/html/installation.html0000644000076500007650000000202510101222303020754 0ustar alexalex00000000000000 Installing PythonCard

Installation instructions for PythonCard are available for the following platforms;

$Revision: 1.17 $ : $Author: kasplat $ : Last updated $Date: 2004/07/26 15:35:31 $

PythonCard-0.8.2/docs/html/layouteditor.html0000644000076500007650000000331610101222303021003 0ustar alexalex00000000000000 PythonCard Layout Editor and Runtime Tools

Screenshot of PythonCard tools
The resourceEditor sample is used to create and modify layouts and menus of PythonCard apps. In the screenshot above, the layout of Addresses sample is being edited.

Runtime tools

Screenshot of message watcher
Message Watcher

Screenshot of namespace viewer
Namespace Viewer

Screenshot of property editor
Property Editor

Screenshot of the shell
Shell

$Revision: 1.3 $ : $Author: kasplat $ : Last updated $Date: 2004/07/26 15:35:31 $

PythonCard-0.8.2/docs/html/learning_python.html0000644000076500007650000000730410356541120021475 0ustar alexalex00000000000000 Python Learning Resources for PythonCard

Learn Python

Python Reference

Python Community

Python Code

$Revision: 1.13 $ : $Author: kasplat $ : Last updated $Date: 2006/01/03 18:28:32 $

PythonCard-0.8.2/docs/html/macosx_panther_installation.html0000644000076500007650000001625310415172311024072 0ustar alexalex00000000000000 Installing PythonCard on Mac OS X (Panther)

The instructions below are for installing PythonCard on Mac OS 10.3 (Panther). If you are using Mac OS 10.2 (Jaguar), then please use these instructions instead.

Installing PythonCard on your system requires the following steps:

  1. Download MacPython add-ons from MacPython site.
  2. Download wxPython from the wxPython.org site.
  3. Download PythonCard from the PythonCard site.
  4. Install MacPython add-ons
  5. Install wxPython
  6. Install PythonCard
  7. Confirm the installation works

Downloading MacPython add-ons

If you're running Panther then you already have Python 2.3 installed on your system, but we want to get the MacPython add-ons to get the PackageManager and PythonLauncher.

Click on this MacPython-Panther-2.3-2.dmg link to begin the download. Most Mac OS X browsers will save the file to your desktop.

Downloading wxPython

PythonCard relies on the wxPython package. Click on this wxPythonOSX-2.5.2.8-panther-Py2.3.dmg link to begin the download. Again, most Mac OS X browsers will save the file to your desktop.

Downloading PythonCard

The latest version of PythonCard is always available via the PythonCard download page. Click on this PythonCard-0.8.2.tar.gz link to begin the download. Again, most Mac OS X browsers will save the file to your desktop.

Installing MacPython add-ons

The MacPython add-ons arrive at your system as an installable disk image. All you have to do is double-click on the file you downloaded (it's called MacPython-Panther-2.3-2.dmg), then double-click the MacPython-Panther.pkg icon and follow the instructions in the installation wizard. The installer will create a MacPython-2.3 directory in your Applications folder.

Installing wxPython

wxPython also comes as an installable disk image. Just double-click on the file you downloaded (it's called wxPythonOSX-2.5.2.8-panther-Py2.3.dmg), then double-click the wxPythonOSX-panther.pkg icon and follow the instructions. wxPython will be installed into /Library/Python/2.3/. Note that this is the same directory as /System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/site-packages/ since the two directories are connected by a symbolic link in the file system.

I recommend creating a wxPython folder in your Applications folder and copying the Apps, Docs, Samples, and README 1st.txt files to the wxPython folder.

Installing PythonCard

The PythonCard-0.8.2.tar.gz file you downloaded should automatically be decompressed by Stuffit; if the file isn't already decompressed, then double-click the PythonCard-0.8.2.tar.gz file. You should now have a PythonCard-0.8 directory on your desktop. Open the Terminal application and do a cd to that directory and then run the setup.py script using the 2.3 Python you just installed. The sudo command will prompt you for your password.

[mymachine:~] bob% cd ~/Desktop/PythonCard-0.8
[mymachine:~/Desktop/PythonCard-0.8] bob% sudo python setup.py install

By default, the PythonCard framework will be installed into /Library/Python/2.3/PythonCard/. You'll probably want to make an alias to this directory to keep on your desktop or home folder to make it easier to get to the PythonCard tools and samples.

Confirming Installation

To run GUI scripts on Mac OS X (i.e. wxPython and PythonCard scripts) from the Terminal you must start them with pythonw rather than the plain python interpreter.

Configuring PythonLauncher

The default install leaves .py and .pyw files associated with the Python IDE rather than PythonLauncher which is the app used to run Python scripts from the Finder. PythonLauncher is located in your Applications/MacPython-2.3 folder

If you select a .py file you can choose Get Info from the File menu and then change the files to open with PythonLauncher instead of the IDE if you want to be able to double-click a file and have it run. Repeat the process for .pyw files. Alternatively, you can hold down the control key and when you click on a .py file then you can select PythonLauncher from the Open With menu item.

Mac Preferences Dialog
Figure 1. PythonLauncher Preferences

Acid Test

OK, now comes the acid test. Open the folder called "minimal" in /Library/Python/2.3/PythonCard/samples. Find the icon labeled minimal.py and double-click it. In a few moments (after an operating system console window has appeared), a small window like the one shown in Figure 2 will appear. This indicates that your installation was successful and everything is working. Close the minimal application in the usual way and proceed with the Walk-Through.

Minimal Sample
Figure 2. PythonCard minimal application window open to confirm installation is correct

If for some reason this test fails, go back over these instructions carefully. In particular, make sure that wxPython and PythonCard both appear in the site-packages folder in Python's Lib folder.

If everything seems OK and you still can't get minimal.py to launch, post a message to the PythonCard Users Mailing List. (If you aren't yet a member, visit the list management page and join.)

Back to Walk-Through

$Revision: 1.2 $ : $Author: alextweedly $ : Last updated $Date: 2006/04/06 11:00:25 $

PythonCard-0.8.2/docs/html/macosx_tiger_installation.html0000644000076500007650000001625310415172311023543 0ustar alexalex00000000000000 Installing PythonCard on Mac OS X (Panther)

The instructions below are for installing PythonCard on Mac OS 10.3 (Panther). If you are using Mac OS 10.2 (Jaguar), then please use these instructions instead.

Installing PythonCard on your system requires the following steps:

  1. Download MacPython add-ons from MacPython site.
  2. Download wxPython from the wxPython.org site.
  3. Download PythonCard from the PythonCard site.
  4. Install MacPython add-ons
  5. Install wxPython
  6. Install PythonCard
  7. Confirm the installation works

Downloading MacPython add-ons

If you're running Panther then you already have Python 2.3 installed on your system, but we want to get the MacPython add-ons to get the PackageManager and PythonLauncher.

Click on this MacPython-Panther-2.3-2.dmg link to begin the download. Most Mac OS X browsers will save the file to your desktop.

Downloading wxPython

PythonCard relies on the wxPython package. Click on this wxPythonOSX-2.5.2.8-panther-Py2.3.dmg link to begin the download. Again, most Mac OS X browsers will save the file to your desktop.

Downloading PythonCard

The latest version of PythonCard is always available via the PythonCard download page. Click on this PythonCard-0.8.2.tar.gz link to begin the download. Again, most Mac OS X browsers will save the file to your desktop.

Installing MacPython add-ons

The MacPython add-ons arrive at your system as an installable disk image. All you have to do is double-click on the file you downloaded (it's called MacPython-Panther-2.3-2.dmg), then double-click the MacPython-Panther.pkg icon and follow the instructions in the installation wizard. The installer will create a MacPython-2.3 directory in your Applications folder.

Installing wxPython

wxPython also comes as an installable disk image. Just double-click on the file you downloaded (it's called wxPythonOSX-2.5.2.8-panther-Py2.3.dmg), then double-click the wxPythonOSX-panther.pkg icon and follow the instructions. wxPython will be installed into /Library/Python/2.3/. Note that this is the same directory as /System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/site-packages/ since the two directories are connected by a symbolic link in the file system.

I recommend creating a wxPython folder in your Applications folder and copying the Apps, Docs, Samples, and README 1st.txt files to the wxPython folder.

Installing PythonCard

The PythonCard-0.8.2.tar.gz file you downloaded should automatically be decompressed by Stuffit; if the file isn't already decompressed, then double-click the PythonCard-0.8.2.tar.gz file. You should now have a PythonCard-0.8 directory on your desktop. Open the Terminal application and do a cd to that directory and then run the setup.py script using the 2.3 Python you just installed. The sudo command will prompt you for your password.

[mymachine:~] bob% cd ~/Desktop/PythonCard-0.8
[mymachine:~/Desktop/PythonCard-0.8] bob% sudo python setup.py install

By default, the PythonCard framework will be installed into /Library/Python/2.3/PythonCard/. You'll probably want to make an alias to this directory to keep on your desktop or home folder to make it easier to get to the PythonCard tools and samples.

Confirming Installation

To run GUI scripts on Mac OS X (i.e. wxPython and PythonCard scripts) from the Terminal you must start them with pythonw rather than the plain python interpreter.

Configuring PythonLauncher

The default install leaves .py and .pyw files associated with the Python IDE rather than PythonLauncher which is the app used to run Python scripts from the Finder. PythonLauncher is located in your Applications/MacPython-2.3 folder

If you select a .py file you can choose Get Info from the File menu and then change the files to open with PythonLauncher instead of the IDE if you want to be able to double-click a file and have it run. Repeat the process for .pyw files. Alternatively, you can hold down the control key and when you click on a .py file then you can select PythonLauncher from the Open With menu item.

Mac Preferences Dialog
Figure 1. PythonLauncher Preferences

Acid Test

OK, now comes the acid test. Open the folder called "minimal" in /Library/Python/2.3/PythonCard/samples. Find the icon labeled minimal.py and double-click it. In a few moments (after an operating system console window has appeared), a small window like the one shown in Figure 2 will appear. This indicates that your installation was successful and everything is working. Close the minimal application in the usual way and proceed with the Walk-Through.

Minimal Sample
Figure 2. PythonCard minimal application window open to confirm installation is correct

If for some reason this test fails, go back over these instructions carefully. In particular, make sure that wxPython and PythonCard both appear in the site-packages folder in Python's Lib folder.

If everything seems OK and you still can't get minimal.py to launch, post a message to the PythonCard Users Mailing List. (If you aren't yet a member, visit the list management page and join.)

Back to Walk-Through

$Revision: 1.2 $ : $Author: alextweedly $ : Last updated $Date: 2006/04/06 11:00:25 $

PythonCard-0.8.2/docs/html/moreapplications.html0000644000076500007650000000706410144465155021661 0ustar alexalex00000000000000 More Applications Built With PythonCard

This page showcases applications built with PythonCard that are not included in each release as part of the samples or tools.


Name:
PIMP: Photographic Image Management Package
Description:
PIMP is software to allow digicam images to be stored in a simple database for easy management.
URL:
http://www.linux2000.com/pimp.html

Screenshot of PIMP


Name:
McPC
Description:
McPC is a PythonCard front end for the McMillan Installer.
URL:
http://members.iinet.net.au/~lawrieabbott/distractions.html#mcpc

Screenshot of McPC


Name:
RanchBiz - A PythonCard/PySQLite application
Description:
RanchBiz was created to manage some parts of guest registration for a guest ranch.
URL:
http://members.shaw.ca/wexsessa/RanchBiz/

Screenshot of Ranchbiz


Name:
SUMR (pronounced "summer") stands for Simple Use case Markup - Restructured
Description:
SUMR is an application that provides a browser and editor for use cases. It has the following features:
  • Understands your use case model to some extent
  • Syntax hilighting based on your model - actor names, use case names, the keyword None, inline tags :inc: and :ext:
  • Performs some basic validation
  • If you reference an actor that has not been defined, the actor name will not be hilighted
  • If you reference a use case that has not been defined, the use case name will not be hilighted
  • Autonumbers the appropriate sections based on tag multiplicity and line indents
  • Renders the SUMR use cases to XML
URL:
http://www.clearviewtraining.com/CVTPlone/SUMR/

Screenshot of SUMR

$Revision: 1.7 $ : $Author: kasplat $ : Last updated $Date: 2004/11/10 19:22:21 $

PythonCard-0.8.2/docs/html/PythonCard.css0000644000076500007650000000725710107717277020217 0ustar alexalex00000000000000/* Implement both fixed-size and relative sizes: */ small.xtiny { font-size : xx-small } small.tiny { font-size : x-small } small.scriptsize { font-size : smaller } small.footnotesize { font-size : small } big.xlarge { font-size : large } big.xxlarge { font-size : x-large } big.huge { font-size : larger } big.xhuge { font-size : xx-large } /* * Document-specific styles come next; * these are added for the Python documentation. * * Note that the size specifications for the H* elements are because * Netscape on Solaris otherwise doesn't get it right; they all end up * the normal text size. */ body { color: #000000; background-color: #ffffff; } a:active { color: #ff0000; } a:visited { color: #551a8b; } a:link { color: #0000bb; } h1, h2, h3, h4, h5, h6 { font-family: avantgarde, sans-serif; font-weight: bold; } h1 { font-size: 180%; } h2 { font-size: 150%; } h3 { font-size: 120%; } h4 { font-size: 100%; } img { border: 0; } code, tt { font-family: Courier, monospace } var { font-family: times, serif; font-style: italic; font-weight: normal } dt { font-weight: bold; } .navigation td { background-color: #99ccff; font-weight: bold; font-family: avantgarde, sans-serif; font-size: 110% } .release-info { font-style: italic; } .titlegraphic { vertical-align: top; } .verbatim { color: #00008b } .email { font-family: avantgarde, sans-serif } .mimetype { font-family: avantgarde, sans-serif } .newsgroup { font-family: avantgarde, sans-serif } .url { font-family: avantgarde, sans-serif } .file { font-family: avantgarde, sans-serif } .tableheader { background-color: #99ccff; font-family: avantgarde, sans-serif; } .refcount-info { font-style: italic } .refcount-info .value { font-weight: bold; color: #006600 } /* * Some decoration for the "See also:" blocks, in part inspired by some of * the styling on Lars Marius Garshol's XSA pages. * (The blue in the navigation bars is #99CCFF.) */ .seealso { background-color: #fffaf0; border: thin solid black; padding: 4pt } .seealso .heading { font-size: 110% } /* * Class 'availability' is used for module availability statements at * the top of modules. */ .availability .platform { font-weight: bold } /* * Styles for the front page */ #banner { background-color: #003366; } #banner h1 { font-family: Tahoma, Arial, Helvetica, sans-serif; font-weight: normal; font-size: 150%; text-align: center; color: #FFFFFF; margin: 0px; padding: 5px; } #sidebar { background-color: #eeeeee; float: left; width: 20%; } #sidebar h4 { background-color: #003366; text-align: center; color: #ffffff; font-weight: normal; margin: 0px; padding: 0px; } #sidebar ul { list-style-type: none; margin-left: 0px; padding-left: 5px; } #content { float: right; width: 78%; } .imageCaption { text-align: center; font-weight: bold; line-height: 150%; } .code { font-family: Courier, monospace; font-size: 90%; } PythonCard-0.8.2/docs/html/requirements.html0000644000076500007650000001141710101222303021003 0ustar alexalex00000000000000 Pythoncard Statement of Requirements

Statement of Requirements

Items in italics are still to be decided. The first version of Pythoncard will support;

Static Text

Sometimes known as labels or boilerplate.

Fields

  • Single and multi-line fields for text entry. They will support tab-order between fields (TabOrder, TabIndex properties).
  • Can styled text be supported without complicating the interface and code?
  • Can we get scrolling text fields with scrollbars "for free "?

Buttons

  • Standard
  • Radio
  • Radio button groups - Optional for first release
  • Bitmap Buttons - Optional for first release

Data Entry widgets

  • Checkbox. Support for tab-order integrated with field tab order if possible
  • Listbox. Scrolling text list. Optional for first release
  • Combobox. Drop-down menu list. Optional for first release

Static bitmap

Which formats should be supported(GIF, JPG, BMP, PNG)?

Menus

  • File. Exit, Open, Save.
  • Edit. Cut, Copy, Paste for fields.
  • About. User-defined menus/menu items that are bound to commands. Could be a sub-menu from help.
  • Help. Links to help (in HTML format) and version information.

Common dialogs

  • File Open/Save
  • Message (About)
  • Choice (Yes/No, Ok/Cancel)
  • Text entry choice (single field plus Ok/Cancel)

Miscellaneous

The following items are notes and placeholders for future consideration that don't fit easily into any of the earlier categories.

  • Clipboard support for textual data (Cut/Copy/Paste).
  • Overlapping buttons, fields, bitmaps will probably look messy at best until layering is available, so avoid rect of objects overlapping.
  • All the widgets should receive and be able to respond to events like: click(mouseDown), double-click, mouseOver, keyPress, closeField [need to complete this list for each widget type)
  • All widget descriptions to be stored in an external resource file.
  • Initially, the layout might be handled by a variety of programs such as Boa, wxDesigner, Glade, and then scripts in Python can translate the resulting output files to our own description format. The format should be text to allow easy editing of widget properties.
  • Fixed pixel-based widget positions.
  • Single layer, unless multi-layer doesn't complicate framework too much
  • Single card/stack, so no multi-stack issues, messaging between stacks, etc.
  • Some kind of idle event so object scripts don't have to block. The simple example would be that the card object catches the idle event once a second and calls a method to update a label/field/button with the current time.
  • Don't monopolize the CPU.
  • No printing.
  • Minimum of one resizable window with initial size defined in the resource file.
  • Offscreen buffering of window contents if necessary to preserve contents when window is obscured, minimized, etc.
  • Support scrolling of window contents if possible
  • openCard, closeCard, nextCard, previousCard events can be generated, but no persistent data store, so the card class will need to be overridden to support record-level read/write. Those routines will also need to call methods to clear all fields, reset buttons, and load fields with data.
  • Objects should be able to call existing Python modules.

$Revision: 1.4 $ : $Author: kasplat $ : Last updated $Date: 2004/07/26 15:35:31 $

PythonCard-0.8.2/docs/html/resource_editor_overview.html0000644000076500007650000011663210415172311023423 0ustar alexalex00000000000000 PythonCard's resourceEditor: An Overview

Scope and Purpose

This document describes the resourceEditor which is used to design, lay out, and manipulate PythonCard applications' graphical components. It is current as of Version 0.8.2 of the PythonCard release; you should expect only minor changes in the behavior of the resourceEditor to change between now and release 1.0 of the product.

This document is not so much about how to use the resourceEditor as it is an operational reference overview of the functionality it contains. The walkthroughs that constitute the primary tutorials for PythonCard developers provide step-by-step instructions for using the resourceEditor to construct applications and are therefore closer to what you would consider a tutorial.

For the most part, this discussion confines itself to the use of the resourceEditor in building applications on Windows platforms. But PythonCard can also be used on *nix systems and Macintosh OS X.

Overview of resourceEditor

The resourceEditor is located in the tools directory of the PythonCard distribution. There is also an experimental version of the resourceEditor which presents the component properties in a very different format and allows a variety of operations on multiple components; this is in the same directory, but called multiresourceEditor.

The resourceEditor is the most common starting point for constructing a PythonCard application. Using this tool, you can create, position, size, describe and connect not only your application's windows and all of the components they contain (buttons, fields, and other controls), but also its menus and supporting dialogs. A direct-manipulation interface enables you to create, drag, and size window components in the grand tradition of Integrated Development Environments (IDEs). The resourceEditor also incorporates a menu editor and a background editor for managing the non-component portions of your PythonCard's application.

Scripting is not integrated into the resourceEditor. Instead, we allow you to choose your favorite Python script editor to write the code that gives your application its intelligence and behavior. (We would recommend you look at the codeEditor application that comes with PythonCard. It is a very capable Python-aware editor and its source is available so you can change it to suit your tastes.)

The 10,000-Foot View of PythonCard Application Development

Most PythonCard applications have at least two basic files. It is possible to build a PythonCard application in a single file, see the "noresource" sample in the samples directory.

One file, which has a double file extension of ".rsrc.py" and is referred to as the "resource file", describes the user interface elements. It is a text file containing a Python dictionary object, which PythonCard parses and uses to create the user interface for your application at both design time and runtime. This file, being a standard Python code file, can be edited in any text editor to modify the user interface. As a rule, you will only do this if you need to add a component to the interface which is not directly supported by PythonCard. For most purposes, it is best to allow the resourceEditor to manage the contents of the resource file.

The second file is a standard Python script file ending with the extension .py (or .pyw depending on how you want it executed). It contains the code your application executes. This code consists of event-triggered methods and commands that will be executed as the user interacts with your PythonCard application.

Of course, any PythonCard application may contain multiple script files and, if it contains multiple windows or if it uses dialogs, may also have more than one resource file. In addition, data and configuration files may also be part of the application. This document, however, focuses on the resource file, only describing the script file where necessary to explain the resourceEditor's functionality.

It may not be entirely obvious why we would divide a PythonCard application into two files. This approach was popularized by Apple's Macintosh system, which actually used only one file for a typical application but divided that file into two parts which were managed separately. One contained the application code itself and the other contained information about the resources the application used for its user interface. PythonCard, which has some roots in a famous Apple Computer product called HyperCard, adopted this strategy of separating layout from executable source code. Doing so allows PythonCard developers, e.g., to change the layout of an application without even examining, let alone understanding and editing, source code for the application. This design also facilitates internationalization and other stylistic changes that a designer or other non-programming user can make without touching the rather more complicated source code that gives the application its behavior.

Basic Development Process

The typical process for developing a PythonCard application involves the following steps.

  1. Decide whether to start with an existing application or sample or to begin with a built-in application template.
  2. Make a copy of the starting point if you're using one.
  3. Launch resourceEditor and open the resource file for the starting point if you're using one.
  4. Add, delete, rename, reposition, and otherwise manipulate the visible components of the interface.
  5. Edit the background properties that describe the window itself.
  6. Edit the menu(s) to be included in the application, if any.
  7. Connect menus and components to their behavioral code to be stored in the Python script file for the application.

This is not a strict sequence of steps. Once you get past Step 3, you can and will freely intermix the other steps in an iterative style of application development as has become standard in using modern IDEs.

The first three steps are described in each of the walkthroughs that make up the primary tutorials for PythonCard, so we won't repeat them here except to say that you launch resourceEditor the same way you launch any other Python application on your system.

Before we look into the remaining steps and how they are carried out in the resourceEditor, let's look at all of the windows that comprise the resourceEditor.

The resourceEditor's User Interface

In its default configuration "out of the box," the resourceEditor, when you launch it, will open two windows plus a console window. The two windows are:

  • the Standard Template with File->Exit Resource window (see Figure 1), which is the default window in which you will begin constructing your UI unless you elect to open an existing resource file
  • the Property Editor window (Figure 2), where you will manipulate such things as fonts, colors, sizes, positions, labels, names, and other details describing each component you add to the application's window

The Property Editor window always reflects information about the currently selected component in the resource window, including showing the size and position of the selected component in its status bar.

resourceEditor default resource window
Figure 1. Default Resource Window in resourceEditor

Property Editor Window
Figure 2. Blank Property Editor Window (No Component Selected)

When you wish to edit elements of the user interface for which the resourceEditor does not automatically open a window, you will encounter two other windows: the menu editor and the background editor, shown, respectively, in Figures 3 and 4.

background editor window
Figure 3. Background Info Editor Window
menu editor window
Figure 4. Menu Editor Window

There is also a String Editor which can be used to improve the flexibility and ease of internationalization of your application; this window is shown in Figure 5.

string editor window
Figure 5. String Editor Window

We will look at each of these windows in greater detail in subsequent sections of this document.

Using a Built-In PythonCard Template

The File menu in the resourceEditor's resource window contains a "New..." item that, when selected, produces a dialog box like the one shown in Figure 6. From this list, which will likely grow before the official release of PythonCard 1.0, you can choose one of four basic templates for creating a PythonCard application.

dialog for using built-in templates
Figure 6. Dialog for Selecting Built-In Templates as Starting Point for New Application

The names of the templates describe the various options for creating a new application. You can select one of these, but it is oftne more productive to begin by copying an existing application and renaming files as outlined in walkthrough1 of the PythonCard documentation suite.

Managing User Interface Components

Once you have a window open in the resourceEditor, you can add components to it, select existing components and manipulate or edit them, and otherwise use components to build a PythonCard application's GUI.

To add a component to the window, select it from the Component menu in the resourceEditor. Figure 7 shows the menu open so that you can see the components supported in this release. All of these components are inherited from wxPython.

component menu
Figure 7. Component Menu in Resource Window

When you select a component type, you are presented with a dialog to allow you to specify the name and, if appropriate, the label or text content for the new component. Figure 8 shows this name dialog; since it's a button component, it has a field for the Label as well as the one for the Name.

component name dialog
Figure 8. Name and Label/Text dialog

Once specified, the new instance of that component gets placed in the window in the upper left corner. Figure 9 shows a button placed in the top left of the Resource Editor Window

new button placed in resource window
Figure 9. New Button Placed in Resource Editor Window

It is selected so that its properties are immediately available for editing in the Property Editor window. Figure 10 shows the Property Editor window's contents immediately after the initial placement of the button, with the size and position shown in the window's status bar.

property editor window on new button
Figure 10. Property Editor Window on Newly Placed Button

The top left area of the Property Editor Window (Figure 10 above) shows the name of the currently selected object ("Button1") and the name of its class ("Button"). The top right area lists all of the properties associated with the object. The bottom portion of the window changes depending on which property is being edited. At the very bottom of the window, the status bar shows the component's position and size. Figure 11, for example, shows what the bottom area looks like if you select the button's "font" property. Notice the "Font..." button which, if clicked, will display the system's standard font dialog from which you can choose new settings.

setting font on newly placed button
Figure 11. Property Editor Window Preparing to Edit Font of Selected Button

To modify any built-in property of a component in the resourceEditor, you first select the object, which you can do either by clicking on the component in the Resource Editor Window or by selecting it from the list of objects in the Property Editor Window. Then you select the property you wish to change from the scrolling list of properties, make the appropriate adjustment to the setting, and either click the "Update" button or simply leave the edit field to instruct the resourceEditor to apply the new setting.

Each component has a set of properties, some of which are shared with all or some other components and some of which may be unique to the specific component. These properties are delineated in the soon-to-be-published PythonCard Component Description document.

The status bar of the Property Editor Window displays the size and position for the selected window in your application or for the selected component in the window, but its contents are not editable. To change those properties, you must either directly manipulate the component or edit the appropriate property.

Managing Background Properties

Every window in a PythonCard application automatically includes a background. This background describes the characteristics of the window as a whole, and acts as the backdrop against which components are placed and which is the container of those components.

As we saw in Figure 3, above, you can modify the properties of the application window's background using the Background Info Editor, which is displayed by selecting "Background Info..." from the resourceEditor's "Edit" menu.

You will want to change the background's name to something that reflects your application's name if for no other reason than it will be easier to remember its name when you refer to it in your Python scripts. The Title field should contain the text you want to display as the window's title in its title bar.

The position and size settings are the default values. When the window opens, it will open at that location on the screen and at the indicated size. You'll find that if you resize the window and move it around on the screen, then reopen the Background Info Editor, it will update to reflect your changes.

You can alter the foreground and background colors of the window using standard color selector dialogs for your system. In this release, we recommend you not alter those properties if you intend to run your PythonCard application on other platforms because cross-platform color compatibility is still a bit shaky in wxPython. It is possible to give your window a graphic image as a background. If you check the "Tile" checkbox, the image will appear in its original size, tiled as needed to fill the background. If you do not check "Tile," the image will be stretched or collapsed to the size of the window.

If you wish to select an icon to represent your application when it is collapsed or in the launch area for the system on which it runs, identify the image file for the icon in the space provided. If you do not supply an icon, PythonCard uses the standard Python icon, a cute green snake.

The last two items you can control about a background are whether it displays a status bar (default is off) and whether it is visible when your application starts (default is on).

Once you make changes to the background, you should save your application's resource file.

Managing Menus

The PythonCard resourceEditor incorporates a full-featured menu editor that uses industry-standard terminology and allows you to define shortcuts and accelerator keys for all menu options. Figure 12 shows you what the Menu Editor looks like when it has a complex set of menus defined. (It actually depicts the menus in the resourceEditor itself.)

menu editor with full set of menus
Figure 12. Menu Editor Showing Menus in resourceEditor's Resource File

You can add a new menu by clicking on the New Menu button. The result looks like Figure 13. Notice that the new menu is called "New Menu" and appears at the bottom of the current list of menus in the application.

menu editor with new menu defined
Figure 13. Menu Editor Showing New Menu Being Defined

By convention, you should name your menus starting with the word "menu" (in lower case), followed by the name of the menu itself (e.g., the File menu). The File menu should be named menuFile. Following this convention makes it easy to remember their names when you are writing the Python scripts to respond to the user's selection of your menus.

Similarly, you create new items to appear on menus by clicking the "New MenuItem" button in the Menu Editor. This creates a new menu item at the bottom of the current list of menus and menu items, as shown in Figure 14.

menu editor showing new menu item
Figure 14. Menu Editor Showing New Menu Item Being Edited

Again, naming conventions are useful. We recommend you name new menu items beginning with the tag "menu", followed by the name of the menu on which the item appears (e.g., File), and then by the name of the item itself (e.g. Exit): menuFileExit.

In providing a label for a menu item (but not, of course, for a menu, which is not executable), you may select an accelerator key by preceding any letter in the label with an ampersand ("&"). Figure 15 shows an example of this using the menuFileOpen menu item. Notice the ampersand preceding the letter "O" in the menu item's label. This means the user can select the File Open option by typing Alt-F (to select the File menu) followed by Alt-O. Notice, too, that the Ctrl+O shortcut is also defined, allowing the user to open a resource file by typing Control-O. To enter a shortcut key combination, just press the keys you wish to use. PythonCard places a text represetation of the key combination in the field.

menu editor showing menu item
Figure 15. Menu Editor Showing Menu Item With Accelerator Key and Shortcut Defined

You can also connect the menu to a command object defined in your Python script (see "Connecting Components and Menus to Scripts," below). Since many UIs have alternate ways to do the same operations available from the menu (e.g. command buttons, toolbars, etc.), a convenient way to do this is to use the command object, and connect to it from both the menu and the alternate button.

In addition, you can determine whether the menu item is enabled when the application launches, whether it is checkable and whether its default condition is to be checked if it is checkable. PythonCard handles the checking and un-checking of menu items that are defined as "Checkable" as the user interacts with the application.

The final feature of the Menu Editor to note is the "Up" and "Down" buttons. Since new menus and menu items are always created at the bottom of the list of menus and menu items, we need some way to move them around to associate them with the appropriate menu and to arrange menus in the desired order. Selecting any menu or menu item and then clicking the "Up" and "Down" buttons moves the selected object in the list.

Note that if you wish to create a menu separator within a menu, simply create a new menu item and make its label a single hyphen. Leave all other characteristics of the menu item unchanged.

Creating and Editing Dialogs

You can also use the PythonCard resourceEditor to create dialogs to be used in your application. You create a new dialog by selecting the "New Dialog" option from the File menu. The resulting editor looks like Figure 16.

new dialog dialog
Figure 16. Editing Window for New Dialog

Notice that a new dialog template includes two buttons by default, one labeled "OK" and set as the default button, the other labeled "Cancel." Editing a dialog is similar to editing a window, with the following exceptions:

  • Dialogs have no menus, so there is no menu editor.
  • Dialogs have no backgrounds, so there is no background editor. (There is instead a Dialog Info... Window, shown in Figure 17, which presents a subset of a Background Editor containing only information pertinent to dialogs).

dialog info editor
Figure 17. Dialog Information Editor Window

A discussion of how to incorporate dialogs into your PythonCard applications is beyond the scope of this document. See walkthrough3 for a tutorial and example.

Connecting Components and Menus to Scripts

There are two ways to create a connection between an active component or menu item in your PythonCard application and the application's behavior as defined in your Python script file: events and commands. (Remember that not all components need to have actions associated with them). The resourceEditor creates and manages the visual components of your application. Actions for these components are created in the associated Python script ... For details and examples, see the tutorial walk-throughs, particularly walkthrough2 and walkthrough3

Events

When the user activates a component in your PythonCard application, that action triggers an event. Your Python script consists principally of methods defining how to respond to user-triggered events. There is a one-to-one correspondence between the event that is triggered and the name of the method or handler your program calls in response to the action.

For example, when the user clicks on a button, PythonCard generates a mouseClick event on that button. The full name of the event passed to your Python script in the case of a button-press looks like this: buttonSave_mouseClick (assuming the user has clicked on a button whose name is "buttonSave".)

Note that it is the button's name, not its label that is used here. In your Python script, the handler that will be run when the user clicks on the Save button would begin with the following line of Python code:

on_buttonSave_mouseClick(self, event):

Your Python code would then go on to define what you wanted the application to do when the user clicks on the Save button. If there is no handler called on_buttonSave_mouseClick, then if the user clicks on the button named buttonSave, nothing will happen.

Similarly, if the user selects a menu item, the event triggered is called something like menuFileSave_selected and your handler for this event would start with a line of Python code like this:

on_menuFileSave_selected(self, event):

The events each component can trigger is defined in the soon-to-be-published Component Reference Documentation.

Commands

In situations where you want the same behavior to be carried out by more than one component and each of those components can trigger only one action, you can use a single PythonCard command in your script file and connect each component to it. This requires two steps: definition of the command in your Python script, and pointing the component to the command it is to execute when it is activated.

Defining a command in your Python script simply requires following the definition convention of naming the command handler something like this:

on_editClear_command(self, event):

Next, you need to tell all of the components whose activation you wish to result in executing that command that they are connected to it. You do this in the Property Editor as shown in Figure 18. Notice that the name of the command is the middle portion of the handler name, which in Figure 17 results in the object being told it is to execute the command editClear.

connecting a button to a command
Figure 18. Connecting a Button to the editClear Command

Additional Features

This section describes three additional features of the resourceEditor:

  • testing your application from within the resourceEditor
  • using a grid to align objects
  • viewing the contents of the resource file itself

Testing Your Application

You can run your PythonCard application directly from resourceEditor. This results in a highly interactive, seamless development environment which will further accelerate the rapidity with which you can create Python applications using PythonCard as the GUI tool.

Setting Up Runtime Options

Before you run your PythonCard application, you can set up some parameters that determine the level of detail with which you can examine and interact with the running application. From the File menu, choose "Run options..." The dialog box shown in Figure 19 appears.

run options dialog
Figure 19. Run Options Dialog

You can check any or all of the options in this dialog to affect the way your PythonCard application works when you are testing in resourceEditor. (The lower-case letter preceded by a hyphen in parentheses after each option tells you what switch you would use to invoke this same setting if you were to launch your application from the PythonCard shell or some other interpreter environment.)

None of these options "sticks" automatically. You can set up a configuration in which all of your options are remembered for all PythonCard applications you launch in the resourceEditor. We cover this option below. When you run the application outside the resourceEditor environment, these settings are ignored.

If you turn on logging, then run your application, PythonCard logs debugging information directly to the system console (referred to as "stdout" in programmer terminology). Optionally, you can instruct PythonCard to create a text file and route logging information to it. This file tracks debugging information about your application. A sample of this log file is shown in Figure 20 as it would appear if routed to a file called pythoncard.log. An explanation of the log is beyond the scope of this document.

sample debugging log file
Figure 20. Sample Debugging Log File

The Message Watcher runtime option opens a window (see Figure 21) that monitors messages as they are triggered inside your application.

message watcher window
Figure 21. Message Watcher Window Showing Sample Message Information

The checkboxes at the top of the window allow you to restrict the messages that appear. If your application uses any timer-based events and you want to monitor their firing, e.g., you will want to uncheck the "Hide timers" checkbox so those events will be displayed as they are triggered. Leaving the "Hide unused" checkbox in its default checked state means you will only see messages for which you have defined a handler. Unchecking that checkbox will result in you being able to see all messages generated by the user interacting with your application.

If you turn on the Namespace Viewer, you'll see a window like the one in Figure 22 when you run your PythonCard application. This window shows in its left pane a complete tree of all of the objects and methods in the namespace in which your application is running. Selecting objects in that list -- which is a tree outline and therefore can expand and collapse as desired -- displays appropriate information about them in the right text pane.

namespace viewer
Figure 22. Namespace Viewer Window With Representative Content

If you check the "Property Editor" checkbox in the Run Options dialog and then run your PythonCard application, a duplicate Property Editor window opens in the context of your application. You can use this window to change aspects of your program's interface (e.g., font settings) while the application is running. You have to be careful, obviously. Changing something on which the program's success depends can produce unexpected results.

Changes you make in the runtime Property Editor are not preserved when you quit the application and return to the resourceEditor.

One of the most powerful things you can do when running a PythonCard application from inside the resourceEditor is to open the shell by selecting that option from the Run Options dialog. When you do this, the standard PythonCard shell window opens. As you can see in Figure 23, you can interact with your program from this shell, inspect settings and properties, etc. In the window shown in Figure 23, we've asked the background of our application for its name and for a list of the components it contains. The component list is a dictionary which can be quite revealing when you are trying to debug a difficult-to-locate error. You can also use the Shell to send messages to your application manually.

shell window open in application
Figure 23. Shell Window Showing Interaction With Running Application

Debugging a Running PythonCard Application

You may have noticed if you've been running the resourceEditor and selecting the run options outlined above that you will often see a "Debug" menu in your application's menu bar (see Figure 24). Choosing any of the run options except logging will produce this menu when you run your application in the resourceEditor.

While the options on this menu are largely self-explanatory, let's run through them so you'll be sure you know how to use this powerful feature of PythonCard's resourceEditor.

debug menu in running application
Figure 24. Debug Menu in Running PythonCard Application

The first four items are toggles. If you wish to open the Message Watcher window when it isn't or to close it when it's open, choose that option. The same is true for the other menu items in the first group.

"Redirect stdout to Shell" is a useful debugging tool. If your application generates errors, the only way to see and capture them is by examining the results sent by Python to a terminal window called stdout. But since that window isn't open when you are running in PythonCard, you need a way to handle this output. This menu option allows you to have these messages displayed in the PythonCard Shell. This implies, of course, that you'll want to be sure the Shell is open before you choose this option.

The "Save Configuration" option allows you to set up a standard configuration for running PythonCard applications. You use this feature as follows:

  1. Before running your PythonCard application, choose the debugging options you'd like to set up. For example, if you always want to run your PythonCard applications with the Message Watcher and the Shell available, choose those options in the Run Options dialog.
  2. Run your application. Position the debugging windows where you'd like them on the screen.
  3. From the Debug menu, choose "Save Configuration."

Now any time you launch any PythonCard application from the resourceEditor, these debugging windows will appear in the same positions as they were when you saved the configuration.

Note, however, that if you add new debugging windows to your running application by opening, say, the Namespace Viewer, and then save the configuration again, that window will not appear next time you launch a PythonCard application. You must set up the options before you run the application.

You may, of course, change this configuration any time simply by changing your Run Options, running your application, and then saving the configuration.

The next two menu items in the Debug menu launch your Web browser and take you to the PythonCard home and documentation pages, respectively.

The final option displays a dialog box which tells you the version of PythonCard you are running, the versions of all supporting programs that are installed with it, and pointers to other useful information.

Using the Grid

Like most IDEs, PythonCard's resourceEditor includes a grid capability. The grid can be turned on or off, its size altered, and objects made to adhere to it using choices on the Options menu. There are only two choices on this menu. The first allows you to set the size of the grid in pixels. The default setting is 5. A value of zero effectively turns off the grid. The second menu option makes the grid active or inactive. It is a toggle for which you can use Ctrl-G as the shortcut. If the grid is active, then when you move components around on the background of your PythonCard application, they move in increments the size of the grid. If it is off, you can place components anywhere you like.

There is no way in the resourceEditor to cause existing objects to snap to a grid or to align with one another other than manually. If you have one or more components selected and choose to turn the grid on, the objects do not move, or "snap", to the grid. The grid only controls the parameters for your direct movement of components.

Viewing the Resource File

The View menu in the resourceEditor has toggle options to show and hide the Property Editor and the Position & Size Window. Its third item allows you to open and inspect but not edit the resource file for the open application. Selecting that menu option produces a window something like the one shown in Figure 25.

viewing the resource file
Figure 25. Resource Viewer

Examining the resource file, which as you can see stores a single Python dictionary object that describes all the elements of the PythonCard application's user interface, can often be helpful in understanding how things work together in your program.

Note that although you cannot edit the resource file here, the resource file can be edited by any text editor (preferably a Python-aware editor). However, we strongly discourage direct editing of the resource file until you've had considerable experience with PythonCard and with editing Python dictionaries. If this file becomes disorganized, your PythonCard application may have to be built again from scratch.

Concluding Thoughts

There is obviously a lot of power and capability in the PythonCard resourceEditor. While we have tried to be thorough here, we have not been exhaustive. For example, each of the components you can place on the background has its set of properties. Dealing with multiple-window applications in the resourceEditor has also not been addressed here. You'll find that in walkthrough3 of our tutorial series.

That concludes our tour of Pythoncard's resourceEditor. We hope it gets you on the way to being productive quickly.

The resourceEditor's UI is built in resourceEditor. You are free to examine it and, of course, in the grand tradition of Open Source, you are free to modify it, add to its functionality. If you do this please feed changes back into the Pythoncard community and consider joining the development list: pythoncard-devel@lists.sourceforge.net. User questions are dealt with helpfully and promptly on the user list: pythoncard-users@lists.sourceforge.net.}

$Revision: 1.5 $ : $Author: alextweedly $ : Last updated $Date: 2006/04/06 11:00:25 $

PythonCard-0.8.2/docs/html/samples/0000755000076500007650000000000010434046770017057 5ustar alexalex00000000000000PythonCard-0.8.2/docs/html/samples/builddocs.py0000644000076500007650000001014310035336230021366 0ustar alexalex00000000000000 import os import imageList from PythonCard import util # this is just a copy and paste of the list in samples.rsrc.py # and should be updated as new samples are added SAMPLES = ['addresses', 'chat', 'companies', 'conversions', 'custdb', 'dbBrowser', \ 'dialogs', 'doodle', 'flatfileDatabase', 'gadflyDatabase', \ 'hopalong', 'jabberChat', 'life', 'minimal', 'minimalStandalone', 'noresource', \ 'pictureViewer', 'proof', 'pysshed', 'radioclient', 'redemo', 'rpn', \ 'samples', 'saveClipboardBitmap', 'searchexplorer', \ 'simpleBrowser', 'simpleIEBrowser', 'slideshow', 'sounds', 'SourceForgeTracker', \ 'spirograph', 'stockprice', 'textIndexer', 'textRouter', \ 'tictactoe', 'turtle', 'webgrabber', 'webserver', 'widgets', 'worldclock'] # used to auto-generate a batch file that can be # run to upload all the newly generated files UPLOAD_COMMAND = 'c:\cvshome\pscp %s.html kasplat@pythoncard.sourceforge.net:/home/groups/p/py/pythoncard/htdocs/samples/%s.html\n' # this could be done easier # with a regular expression # suggestions welcome def expandUrls(text): newtext = '' for s in text.splitlines(): stripped = s.strip() if stripped.startswith('http://'): url = ' %s' % (stripped, stripped) newtext += url + "\n" else: newtext += s + "\n" return newtext def readFile(path): fp = open(path) data = fp.read() fp.close() return data def writeFile(path, data): fp = open(path, 'w') fp.write(data) fp.close() def main(): html_template = readFile(os.path.join('templates', 'sample_template.html')) contents_template = readFile(os.path.join('templates', 'contents_template.html')) samplesDir = os.path.join('..', '..', '..', 'samples') batch = '' contents = 'Samples
\n' max = len(SAMPLES) - 1 for i in range(len(SAMPLES)): name = SAMPLES[i] contents += '%s
\n' % (name, name) for i in range(len(SAMPLES)): name = SAMPLES[i] if name == 'samples': path = os.path.join(samplesDir, 'readme.txt') else: path = os.path.join(samplesDir, name, 'readme.txt') readme = readFile(path) html = html_template html = html.replace('[title]', name) if i == 0: previousSample = SAMPLES[-1] nextSample = SAMPLES[i + 1] elif i == max: previousSample = SAMPLES[i - 1] nextSample = SAMPLES[0] else: previousSample = SAMPLES[i - 1] nextSample = SAMPLES[i + 1] data = '' template = '' try: images = imageList.images[name] for i in range(len(images)): figure, url = images[i] if figure == '': figure = "Figure %d" % (i + 1) else: figure = "Figure %d: %s" % (i + 1, figure) if not url.startswith('http:'): url = imageList.BASE_IMAGE_URL + url template += '

\n%s
\n' % (url, figure) except: pass html = html.replace('[contents]', contents) html = html.replace('[images]', template) html = html.replace('[previous_sample]', previousSample) html = html.replace('[next_sample]', nextSample) # using a slightly longer wrap hopefully # avoids problems when the readme.txt has its # own line feeds readme = expandUrls(util.wordwrap(readme, 86)) html = html.replace('[readme.txt]', readme) writeFile(name + '.html', html) #contents += '%s
\n' % (name, name) batch += UPLOAD_COMMAND % (name, name) i += 1 contents_template = contents_template.replace('[contents]', contents) writeFile('index.html', contents_template) batch += UPLOAD_COMMAND % ('index', 'index') writeFile('upload.bat', batch) if __name__ == '__main__': main() PythonCard-0.8.2/docs/html/samples/imageList.py0000644000076500007650000000735007606756217021367 0ustar alexalex00000000000000 BASE_IMAGE_URL = 'http://pythoncard.sourceforge.net' # may need to expand the logic to support # a conditional smaller image for the main page # with a link to a larger image # perhaps just having an extra item in the list will work #['description', 'imageURL', 'optionalSmallImageURL'], # tools will probably have their own dir # but the images might be in the same list """ 'textEditor':[ ['A simple text editor', '/images/textEditor01.jpg'], ], """ images = { 'addresses':[ ['A direct port of the layout and data from the HyperCard Addresses stack', '/images/addresses_01.png'], ], 'chat':[ ['', '/images/chat_01.png'], ], 'codeEditor':[ ['Editing the minimal.py sample', '/images/codeEditor_01.png'], ['File Menu', '/images/codeEditorFileMenu.png'], ['Edit Menu', '/images/codeEditorEditMenu.png'], ['View Menu', '/images/codeEditorViewMenu.png',], ], 'companies':[ ['', '/images/companies_01.png'], ], 'conversions':[ ['', '/images/conversions_01.jpg'], ], 'custdb':[ ['', '/images/custdb_01.png'], ], 'dbBrowser':[ ['The initial login dialog', '/images/dbBrowser01.jpg'], ['A record from a MySQL database', '/images/dbBrowser02.jpg'], ], 'dialogs':[ ['', '/images/dialogs_01.png'], ['', '/images/test_dialogs_02.jpg'], ['', '/images/test_dialogs_03.jpg'], ], 'doodle':[ ['A simple bitmap drawing program', '/images/doodle01.jpg'], ], 'flatfileDatabase':[ ['', '/images/flatfileDatabase_01.png'], ], 'hopalong':[ ['', '/images/hopalong_02.jpg'], ], 'life':[ ['Main window', '/images/life_01.png'], ['Lexicon window', '/images/life_02.png'], ['Patterns window', '/images/life_03.png'], ], 'minimal':[ ['Windows', '/images/large/Minimal.gif'], ['Linux', '/images/snapminimal_01.png'], ], 'pictureViewer':[ ['', '/images/pictureViewer_01.png'], ], 'proof':[ ['Windows', '/images/large/Proof.gif'], ['Linux', '/images/snapproof_01.png'], ], 'pysshed':[ ['Session Manager', '/images/pysshed_01.jpg'], ['Session Defaults', '/images/pysshed_02.jpg'], ], 'radioclient':[ ['', '/images/radioclient_01.png'], ], 'redemo':[ ['', '/images/redemo_01.png'], ], 'rpn':[ ['', '/images/rpn_01.png'], ], 'samples':[ ['', '/images/large/SamplesLauncher.gif'], ], 'searchexplorer':[ ['', '/images/large/SearchExplorer.gif'], ], 'simpleBrowser':[ ['', '/images/simpleBrowser_01.png'], ], 'slideshow':[ ['', '/images/slideshow_01.png'], ], 'sounds':[ ['', '/images/large/Sounds.gif'], ], 'SourceForgeTracker':[ ['', '/images/SourceForgeTracker_01.jpg'], ], 'spirograph':[ ['', '/images/spirograph_01.png'], ], 'stockprice':[ ['', '/images/stockprice_01.png'], ], 'textIndexer':[ ["Dan Winkler's original test converted from tkinter", '/images/textIndexer01.jpg'], ], 'textRouter':[ ['', '/images/textRouter01.jpg'], ], 'tictactoe':[ ['Noughts and Crosses', '/images/tictactoe_01.jpg'], ], 'turtle':[ ['4bugs', '/images/turtle_4bugs_01.jpg'], ['3turtles', '/images/turtle_3turtles_01.jpg'], ['bytedesign', '/images/turtle_bytedesign_01.jpg'], ['pentest', '/images/turtle_pentest_01.jpg'], ['Manipulating the turtle from the shell', '/images/turtle_shell_01.jpg'], ], 'webgrabber':[ ['', '/images/webgrabber_01.png'], ], 'widgets':[ ['Windows', '/images/widgets_01.png'], ['Linux', '/images/snapwidgets_01.png'], ], 'worldclock':[ ['', '/images/large/WorldClock.jpg'], ], } PythonCard-0.8.2/docs/html/samples/templates/0000755000076500007650000000000010434046771021056 5ustar alexalex00000000000000PythonCard-0.8.2/docs/html/samples/templates/contents_template.html0000644000076500007650000000122307600267503025471 0ustar alexalex00000000000000 PythonCard Samples Table of Contents
PythonCard Samples Table of Contents
[contents]
SourceForge Logo PythonCard-0.8.2/docs/html/samples/templates/sample_template.html0000644000076500007650000000172307600271026025115 0ustar alexalex00000000000000 [title] sample
[title] sample
[contents]
[images]

readme.txt

[readme.txt]

SourceForge Logo PythonCard-0.8.2/docs/html/samples.html0000644000076500007650000001164210351023461017737 0ustar alexalex00000000000000 PythonCard Prototype Samples

Page 1 | Page 2 | Page 3

Samples Screen Shots

Here are some pictures of the samples shipped with PythonCard. Click on any of the pictures to see a full size version.

You might also want to look at some screenshots of the Layout editor and runtime tools.

Note that the color of the windows below vary because they were captured on different machines using different color schemes. This shows that PythonCard which relies on wxPython/wxWindows is using native controls. There are some Linux screen shots on the next samples page.

To download the framework and these applications go to the downloads section of the project site on Sourceforge

addresses

Full size

A direct port of the layout and data from the HyperCard Addresses stack.

conversions

Full size

The sample handles conversion from fahrenheit to celsius and english to morse code which is shown above. You can add your own conversion classes.

dbBrowser

Full size

The initial login dialog.

Full size

A record from a MySQL database.

dialogs

Full size

This application showcases all of the different dialogs that you can invoke easily and simply in PythonCard.

Full size

When you press the 'Color' button the standard color dialog pops up. You can use this in your applications to enable users to customise the look and feel of the applications you develop - surprisingly enough.

Full size

The 'Text Entry' button pops up a dialog which allows you to enter text in a seperate window. I will leave you to decide when and where this will be useful.

doodle

Full size

A simple bitmap drawing program.

findfiles

Full size

The application when we have performed a search

Full size

The 'Browse for Folder' dialogue appears when you press the 'Add Dirs' button

The next page of screenshots are here.

$Revision: 1.13 $ : $Author: alextweedly $ : Last updated $Date: 2005/12/17 14:56:49 $

PythonCard-0.8.2/docs/html/samples2.html0000644000076500007650000001734010101222303020007 0ustar alexalex00000000000000 PythonCard Prototype Samples 2

Page 1 | Page 2 | Page 3

Samples Screen Shots 2

hopalong

Full size

This sample plots points using the hopalong algorithm by Barry Martin presented in the September 1986 Scientific American.

minimal

Minimal on windows Minimal om Linux

This is about as basic as you can make your application. For those of us who like to 're-use' code this is a good base to build on. Add items one by one to this minimal PythonCard app to make it easier to understand what is going on.

proof

Full size proof on Windows Full size proof on Linux

This application implements the proof of concept statement of requirements as specified here. It is pretty basic but it does show all of the different widget types you can use. This example also demonstrates the use of an image as a canvas background.

samples

Full size samples launcher

The samples launcher provides a convenient way to try each sample, browse the readme, source code and layout description for each sample.

searchExplorer

Full size search explorer

This sample demonstrates just how easy it is to develop quite useful applications using the PythonCard framework. To use this application, just enter a search string in the first text item, select where you would like to perform the search from the 'Sites' list and then press the 'Search' button. As you perform searches they are saved in the 'Past Searches' list, a bit like web page URLs in your browser. To re-run a search select it from the list and press the 'Search' button.

sounds

Sounds sample

Another really simple but powerful application is this example which will play a sound file.

SourceForgeTracker

Full size sourceforge tracker

SourceForgeTracker downloads XML from SourceForge in order to display Bug Reports and Feature Requests for a variety of Python SF projects.

textEditor

Full size text editor

A basic text editor.

textIndexer

Full size text indexer

Dan Winkler's original PythonCard test converted from tkinter to PythonCard.

textRouter

Full size text indexer

TextRouter is a generic weblogging and text "routing" client. It's main use is for posting to Blogger and/or Manila maintained weblogs. More screen shots are available at http://simon.kittle.info/stories/storyReader$116. Simon Kittle maintains a page for TextRouter that includes a standalone binary installer for Windows.

Noughts and Crosses (tictactoe)

Full size tic tac toe

When I was young we used to call this game noughts and crosses. Some of you may know it as Tic Tac Toe. The best way to see what this sample application does is to run it. If anyone would like to write a more advanced algorithm for the computer player then please go ahead. When you have finished you can post it to the mailing list.

widgets

Full size widgets sample on Windows Full size widgets sample on Linux

This sample application is designed to demonstrate some of the events that are associated with particular widgets. The buttons and check boxes on the right hand side of the screen are active and have code associated with them. Again, the best way to find out what the various controls do is to try them out.

worldclock

World clock sample

Last, but certainly not least, is the world clock. A rather natty application that shows you where in the world currently has daylight and where is dark. You will need to be connected to the internet for this to function properly as the different map images are downloaded from http://www.time.gov/. Can you tell when this screen shot was taken?

The next page of screenshots are here.

$Revision: 1.12 $ : $Author: kasplat $ : Last updated $Date: 2004/07/26 15:35:31 $

PythonCard-0.8.2/docs/html/samples3.html0000644000076500007650000000755510101222303020017 0ustar alexalex00000000000000 PythonCard Samples 3

Page 1 | Page 2 | Page 3

Samples Screen Shots Page 3

Here are some pictures of the turtle sample application shipped with PythonCard as it appears on a machine running Windows. Click on any of the pictures to see a full size version.

This page is dedicated to screen shots from the 'turtle' application. This is a PythonCard alternative to turtle.py from the Python Standard Library.

To download the framework and this application go to the downloads section of the project site on Sourceforge

turtle

Full size

This is the result of the default script '4bugs'. Just start the application and select the option "Draw Turtle" from the "File" menu.

Full size 4bugs

Select the "Open File..." option on the "File" menu to see the list of available scripts you can run to generate output. The rest of the screen shots on this page are produced by running some of these scripts.

Full size 3turtles

3turtles.txt produces this lovely fractal output. At least I think it is fractal.

Full size bytedesign

bytedesign.txt produces this output.

Full size pentest

pentest.txt produces this output. This shows the use of colour in 'turtle', as it runs you can see the multiple pens in operation.

Full size interactive

If you read the FAQ included with this sample application (PythonCard/samples/turtle/docs/FAQ.txt) it gives an interactive example. Start the application with the '-s' flag and the shell prompt window will open as well. Type in the example commands and this is the result. Its not complicated, but it is a start. Good luck.

$Revision: 1.4 $ : $Author: kasplat $ : Last updated $Date: 2004/07/26 15:35:31 $

PythonCard-0.8.2/docs/html/shell.html0000644000076500007650000003313110415172311017377 0ustar alexalex00000000000000 PythonCard Documentation: The Shell

Using the Shell in PythonCard

PythonCard integrates a rich, high-level interactive Python shell. This document describes how to launch and use this shell as you create PythonCard applications. It is based on Version 0.8.2 of PythonCard.

The PythonCard shell utilizes the PyCrust package created by Patrick O'Brien of Orbtech which is included with wxPython.

Overview of Basic Shell Functionality

In many ways, the PythonCard shell resembles the shell in IDLE, the Python editor that is included in Python distributions. IDLE is Python's default editor. But the PythonCard shell is more extensive and more robust both in its editing capabilities and in its programming support than IDLE.

As you can see from Figure 1, the shell allows you to do interactive programming at the standard Python prompt of three angle brackets (">>>"). It behaves like IDLE, so there's nothing new to learn in this respect.

PythonCard Shell
Figure 1. Using PythonCard Shell as Interactive Programming Environment

Figure 1 also illustrates the shell's inclusion of syntax highlighting and coloring, which can be customized via the codeEditor Styles dialog.

Pressing Enter anywhere on a line in the shell always processes the command on that line if that line is the last one in the current editing window. Pressing Enter on any other line copies that line's contents and places them on the last line in the window, enabling you to execute the command again or modify it slightly. This feature is quite valuable during testing when you often type the same commands repeatedly. In Figure 2, we positioned the cursor at the end of the line containing the simple statement "5+2" and pressed Enter. Notice that 5+2 now appears as the last line in the editor. Pressing Enter now produces the expected output of "7" on the next line in the editor.

Copying commands in the shell
Figure 2. Copying a Previous Command Line With Enter Key

You can use the ESCape key to change your mind about a line of Python code you are entering that has not yet been executed bypressing Enter. This will simply erase all the characters on the current line and return your cursor to the Python prompt.

You can always obtain some basic help in the use of the shell by typing "shell.help()" in the interactive editor area and pressing Enter. The result will look something like Figure 3.

Help in the shell
Figure 3. Result of Typing "shell.help()" in PythonCard Shell

The arrow keys navigate up, down, left and right in text displayed in the shell, as you'd expect. Holding down the Ctrl key with the right or left arrow moves the cursor by the rough equivalent of a "word" in the direction of the arrow, with movement continuing across line boundaries.

By default, lines typed into the shell wrap. If you don't wish to see the lines in your shell window wrap at the right border of the shell window, type in the shell: shell.SetWrapMode(0). To turn it back on, type shell.SetWrapMode(1).

Key Bindings in the Shell

Table 1 shows all of the key bindings defined in the PythonCard shell and describes their usage.

Table 1. Key Bindings in PythonCard Shell

Key Combination Usage
Home Go to the beginning of the line
Shift + Home Select from current cursor position to the beginning of the line
Shift + End Select from the current cursor position to the end of the line
End Go to the end of the line
Ctrl + Right Arrow Move cursor to the right roughly by a word
Ctrl + Left Arrow Move cursor to the left roughly by a word
Ctrl + C Copy the selection to the clipboard, removing prompts, if any
Ctrl + Shift + C Copy the selection including the prompts, if any, to the clipboard
Ctrl + X Cut the selection to the clipboard
Ctrl + V Paste the clipboard contents at the cursor location
Ctrl + Shift + V Paste and run the current multi-line clipboard contents
Ctrl + Enter Inserts a blank line between existing lines in a multiline command.
Ctrl + Up Arrow Retrieve previous History item
Alt + P Retrieve previous History item
Ctrl + Down Arrow Retrieve next History item
Alt + N Retrieve next History item
Shift + Up Arrow Insert previous History item at cursor position
Shift + Down Arrow Insert next History item at cursor position
F8 Retrieve a specific History item by typing its first few characters and then pressing F8
Ctrl+] Increase font size
Ctrl+[ Decrease font size
Ctrl+= Default font size

Auto-Completion in the Shell

One of the biggest time-saving features built into the PythonCard shell is auto-completion. Whenever you type a period in identifying a Python or PythonCard object, method, or property, the shell displays a popup menu with all of the legal completions to that statement that the shell knows about. For example, in Figure 4, we imported the standard "os" module and then typed "os" followed by a period. The popup menu shown in the figure appears.

Shell with pop-up
Figure 4. Auto-CompletionPopup Menu

There are three ways to find the text you wish to type to complete this portion of the descriptor:

  1. You can keep typing. The popup menu uses incremental search to keep scrolling to the next string that matches what you are typing.
  2. You can scroll the popup menu with the mouse in the usual way and select the proper completion string.
  3. You can use the arrow keys to move around inside the popup menu and select the proper completion string.

Once you have selected the completion string you want, you can press Enter or the Tab key to insert it into the text at the insertion point.

If the auto-completion menu gets in your way, you can click anywhere outside its boundaries or simply press the ESCape key to close it.

You can turn this auto-completion feature on and off by typing appropriate commands in the shell. To turn the feature on, type in the shell:

shell.autoComplete = True

To turn the feature off, substitute a False for True in the above command.

Special Python attributes are prefixed with underscore characters. Some of these attributes use only a single underscore while others use two. You can include or exclude each of these types of attributes in the auto-completion list that appears in the shell by setting two different variables: autoCompleteIncludeSingle and autoCompleteIncludeDouble. For example, to exclude attributes preceded by single underscores from the list, type:

shell.autoCompleteIncludeSingle = False

Similarly, setting autoCompleteIncludeSingle to a value of True will include those attributes. The same is true for the autoCompleteIncludeDouble setting. If you want to see all of the underlying wxPython methods for a component, background, etc. then type:

shell.autoCompleteWxMethods = True

The defaults for these attributes are defined in your pycrustrc.py along with the commands that are automatically run when your shell first starts up. They are defined as:

shell.autoCompleteIncludeMagic = True
shell.autoCompleteIncludeSingle = False
shell.autoCompleteIncludeDouble = False
shell.autoCompleteWxMethods = False

Python objects include another type of attribute, often referred to as "magic attributes." These attributes' values can only be obtained by calling the object's _getAttributeNames() method, if it has one. You can determine whether these attributes are included in the auto-completion popup by setting the variable autoCompleteIncludeMagic to True to include them, False to exclude them:

shell.autoCompleteIncludeMagic = True

Documentation Auto-Display in the Shell

Similarly to the auto-completion popup described in the preceding section, the PythonCard shell also includes the ability to automatically display important documentation for any function or method. Simply type the method or function name and the opening (left) parenthesis and the shell displays helpful information describing the function. These "call tips" attempt to display on their first line all of the arguments expected by a callable object. Where the object involved is the class name, the arguments expected by the class constructor are displayed. The second line of the call tip displays the docstring for the object if it has one.

Figure 5 demonstrates this feature. We have typed "os.fdopen(" and the resulting tool tip tells us the required and optional parameters and what the function does as well as what it returns.

Tool tips in the shell
Figure 5. Tool Tip Shows Documentation String While Typing Functions and Methods

Virtually all of PythonCard's built-in functions and methods have docstrings associated with them or will have prior to the final release of the product.

Editing and Retrieving Functions and Compound Statements in the Shell

You can copy, paste, edit, and execute multi-line functions and compound statements in the PythonCard shell. This can be a huge time-saver when you want to re-execute a method you've defined in the interactive editor. To do so, simply use any of the history retrieval methods outlined in Table 1 to copy any group of multiple lines and then edit them in place. If you, e.g., define a function or class in the shell and you make a mistake, you can avoid the usually mandatory complete re-typing of the code by copying the whole thing and then editing the mistakes. You can also use the PythonCard shell in conjunction with another Python-aware editor. You could, e.g., create a class in another editor, then copy its definition and paste it into the shell to experiment with it. Each time you need a new copy of the class definition, simply paste it again.

You may find yourself occasionally wanting to re-execute multiple commands , each of which may be a single line or a multi-line command. In that situation, pasting those lines into the shell using Shift+Ctrl+V will paste all the lines and run all of the commands contained in the selection.

If you want to copy multi-line commands from the shell into another file (e.g., for documentation purposes), you can select and then use Ctrl+C to copy those lines. This will strip the Python shell prompts out of the copied material. If, however, you wish to retain those prompts, use Shift+Ctrl+C to perform the copy and the prompts will be preserved when you paste the selection into another window or file.

$Revision: 1.7 $ : $Author: alextweedly $ : Last updated $Date: 2006/04/06 11:00:25 $

PythonCard-0.8.2/docs/html/sidebar.html0000644000076500007650000000323107337115741017714 0ustar alexalex00000000000000
General
Home page
Downloads
Mailing list
Screenshots
 
Development
Project page
CVS access
Bug Reports
Feature Requests
 
Exits
PyCrust
wxPython
 
PythonCard-0.8.2/docs/html/standalone.html0000644000076500007650000007143010101222304020412 0ustar alexalex00000000000000 Building 'standalone' PythonCard Applications

Introduction

This document is targeted at developers who have successfully completed a project based on PythonCard and now wish to distribute their work to a wider audience. The information given here was gathered with reference to PythonCard Version 0.7.2. It is inevitable that some (or all!) of this document will go out of date. If so, please either post a message to the PythonCard users mailing list or send email to phil at linux2000 dot com, and I'll update it.

My motivation in writing this document is fairly straightforward. Having got my PIMP application working pretty much the way I wanted it, I needed to look into how to turn it into a single executable, with an easy-to-use install and un-install routine. My ultimate goal was to produce something so straightforward that my mum could install it on her Windows XP computer without any problems. :-)

Tools Required - Hardware

As a PythonCard developer, you will already have a computer with Python, wxPython and PythonCard itself already installed. This will be the machine you use for coding and testing your PythonCard applications. This machine will be of no use whatsoever to you in testing your application as a standalone piece of software.

The reason for this is precisely because it already has everything installed that is required to run your application. In order to be able to properly test a standalone PythonCard application, you will need access to a machine which explicitly does not have the above installed - you need to be confident that the behaviour you are seeing from your app is because you have packaged it correctly, rather than just being as a result of it being run on a machine with all the necessary components already installed.

The only 100% reliable way of doing this is to have a separate machine for testing your application and its installer. I achieved this by using VMWare workstation (http://www.vmware.com) on my Linux PC and setting up 2 'guest' machines, both running Windows XP - one with Python and the other bits installed for doing the development and debugging work, the other set aside purely for testing the results of my work.

In the remainder of this document, where I talk about the development machine, I'll be referring to the PC where you do your coding and the building of your standalone application. If you see me talking about the testing machine, I'm referring to the machine that doesn't have Python, etc installed.

Tools Required - Software

In addition to the software you already have on your development machine, you will also need to install these packages:

At the time of writing (March 18 2004) the McMillan website has been down for some time. It may or may not come back up again, in the meantime, you can download a copy of McMillan Installer version 5b5 from http://www.linux2000.com/downloads/installer_5b5_5.zip

Configuring McMillan Installer

Before you can do anything useful with the McMillan Installer, it needs to be configured. To do this, click Start --> run and type cmd to open a command line session on your development machine. Type the following commands:

cd C:\Python23\Installer

Configure.py

In the rest of this document, I'll be using my PIMP application as my example of building a standalone. The directory names will therefore reflect the way I personally like to work, your mileage may vary. Specifically, I have a directory C:\Python23\projects\pimp where I do all my coding, and everything else will be relative to this 'root' directory.

Generating A 'Spec' File For Your Application

The specification, or 'spec', file is the information used by McMillan Installer to compile and build the standalone version of your application. It's basically a list of the Python source files, Pythoncard resource files and any other stuff that your Pythoncard app needs in order to run properly. To generate the initial spec file, type these commands in a Command Prompt window:

cd C:\Python23\Installer

Makespec.py --icon ..\projects\pimp\pixmaps\pimp.ico --out ..\projects\pimp ..\projects\pimp\pimp.py

You should replace pimp.py with the name of the Python script that corresponds to the main part of your application. The icon file isn't compulsory, but taking the time to select an icon makes your app look a little more polished.

You may find at this point that you wind up with an error message saying TypeError: unpack non-sequence. At the time of writing, the jury is still out on whether this is a bug in the Installer or in wxPython. The recommended solution is to comment out the call to RegistryImportDirector() on line 225 of the iu.py file in c:\python23\installer. Do the same on line 251 of the mf.py file and then re-run the Makespec.py command from above. This issue has been reported to Gordon as a bug, you can check the status of this item on the McMillan web site, the URL is http://mcmillan-inc.com/cgi-bin/BTSCGI.py/BTS/editbugs?bugid=73. Thanks to Brent Fentem <bfentem (at) sbcglobal.net> for the fix.

At this point, you'll have a basic spec file in your app's root directory, that probably looks something like this:

a = Analysis([os.path.join(HOMEPATH,'support\\_mountzlib.py'),
             os.path.join(HOMEPATH,'support\\useUnicode.py'),
             '..\\projects\\pimp\\pimp.py'],
             pathex=['C:\\Python23\\Installer'])
pyz = PYZ(a.pure)
exe = EXE(pyz,
          a.scripts,
          exclude_binaries=1,
          name='buildpimp/pimp.exe',
          debug=0,
          strip=0,
          upx=0,
          console=1 , icon='..\\projects\\pimp\\pixmaps\\pimp.ico')
coll = COLLECT( exe,
               a.binaries,
               strip=0,
               upx=0,
               name='distpimp')
    

The observant reader will have noticed (quite correctly) that this file seems to consist of Python source code! This helps us immensely in simplifying the file contents for ease of maintenance. Firstly add a line at the top of the file to define the root directory for your application, then modify the remainder of the spec file so it looks like this:

p = 'c:/python23/projects/pimp/' # defines project 'root' directory
a = Analysis([os.path.join(HOMEPATH,'support\\_mountzlib.py'),
             os.path.join(HOMEPATH,'support\\useUnicode.py'),
             p + 'pimp.py'],
             pathex=['C:/Python23/Installer'])
pyz = PYZ(a.pure)
exe = EXE(pyz,
          a.scripts,
          exclude_binaries=1,
          name='buildpimp/pimp.exe',
          debug=0,
          strip=0,
          upx=0,
          console=1 , icon = p + 'pixmaps/pimp.ico')
coll = COLLECT( exe,
               a.binaries + \
               [('pimp.rsrc.py', p + 'pimp.rsrc.py', 'DATA')],
               strip=0,
               upx=0,
               name='distpimp')
    

Go back to your command prompt window, and issue this command:

Build.py ..\projects\pimp\pimp.spec

The build process should now run to completion with no fatal error messages. You will find 2 new folders have been created in your application root directory. buildpimp is used purely as a temporary work area when (re-)building the app. distpimp is the directory containing the standalone version of your program. It is the contents of this directory which need to be packaged up using Inno Setup and distributed, more on that part of the process later.

You should note the line in the spec file containing console=1. This causes your app to be run from a command-prompt style window, allowing you to see any unexpected error messages. When you're happy that the app builds and runs the way you want, you can change this to read console=0.

Resolving import errors

The Installer does its best to analyse your source code to see what modules you've used via Python import statements. For the most part, it does an excellent job, but it needs a little help where the Pythoncard part is concerned. Open a new Command Prompt window and type the following:

cd c:\python23\projects\pimp\distpimp

pimp

The program will now abort with an error message, complaining that it was unable to import some module or other. The precise one will depend on the Pythoncard components that your app uses, the first one mine complained about was statictext. This is where the first bit of tedious source code editing comes in. You need to explicitly import all of the Pythoncard components that your application uses. I did this the lazy way, by adding in each component in turn, rebuilding the standalone and re-running it, until I had no more import errors. The lines I ended up with at the top of my code looked like this:

# imports required by mcmillan installer

from PythonCard.components import statictext, imagebutton, textfield, \ textarea, list, staticbox, checkbox, passwordfield, radiogroup, spinner, \ combobox, choice, htmlwindow, bitmapcanvas

Finalizing the spec file

Having resolved all the issues with the components, you now need to add all the other parts of your application to the spec file, i.e. the Pythoncard resource files for any child windows, any images used for buttons, documentation files, etc. This is an extremely tedious task, and has already got me thinking about writing a Pythoncard project manager app to do all this stuff automatically...the final version of my spec file looks like this:

p = 'c:/python23/projects/pimp/' # defines project 'root' directory
a = Analysis([os.path.join(HOMEPATH,'support\\_mountzlib.py'),
             os.path.join(HOMEPATH,'support\\useUnicode.py'),
             p + 'pimp.py'],
             pathex=['C:/Python23/Installer'])
pyz = PYZ(a.pure)
exe = EXE(pyz,
          a.scripts,
          exclude_binaries=1,
          name='buildpimp/pimp.exe',
          debug=0,
          strip=0,
          upx=0,
          console=1 , icon = p + 'pixmaps/pimp.ico')
coll = COLLECT( exe,
               a.binaries + \
               [('pimp.rsrc.py', p + 'pimp.rsrc.py', 'DATA')] + \
               [('advancedPrefsDialog.rsrc.py', p + 'advancedPrefsDialog.rsrc.py', 'DATA')] + \
               [('albumDialog.rsrc.py', p + 'albumDialog.rsrc.py', 'DATA')] + \
               [('albumEdit.rsrc.py', p + 'albumEdit.rsrc.py', 'DATA')] + \
               [('filterBatch.rsrc.py', p + 'filterBatch.rsrc.py', 'DATA')] + \
               [('filterInfo.rsrc.py', p + 'filterInfo.rsrc.py', 'DATA')] + \
               [('editFilter.rsrc.py', p + 'editFilter.rsrc.py', 'DATA')] + \
               [('helpAbout.rsrc.py', p + 'helpAbout.rsrc.py', 'DATA')] + \
               [('imageExportDialog.rsrc.py', p + 'imageExportDialog.rsrc.py', 'DATA')] + \
               [('pandlDialog.rsrc.py', p + 'pandlDialog.rsrc.py', 'DATA')] + \
               [('passwdDialog.rsrc.py', p + 'passwdDialog.rsrc.py', 'DATA')] + \
               [('picPreview.rsrc.py', p + 'picPreview.rsrc.py', 'DATA')] + \
               [('prefsDialog.rsrc.py', p + 'prefsDialog.rsrc.py', 'DATA')] + \
               [('slideShow.rsrc.py', p + 'slideShow.rsrc.py', 'DATA')] + \
               [('changelog.txt', p + 'changelog.txt', 'DATA')] + \
               [('readme.txt', p + 'readme.txt', 'DATA')] + \
               [('doc/gpl.txt', p + 'doc/gpl.txt', 'DATA')] + \
               [('doc/about.html', p + 'doc/about.html', 'DATA')] + \
               [('doc/author.html', p + 'doc/author.html', 'DATA')] + \
               [('doc/license.html', p + 'doc/license.html', 'DATA')] + \
               [('doc/recursion.txt', p + 'doc/recursion.txt', 'DATA')] + \
               [('pixmaps/album.png', p + 'pixmaps/album.png', 'DATA')] + \
               [('pixmaps/blank.png', p + 'pixmaps/blank.png', 'DATA')] + \
               [('pixmaps/camera.png', p + 'pixmaps/camera.png', 'DATA')] + \
               [('pixmaps/delete.png', p + 'pixmaps/delete.png', 'DATA')] + \
               [('pixmaps/down.png', p + 'pixmaps/down.png', 'DATA')] + \
               [('pixmaps/exit.png', p + 'pixmaps/exit.png', 'DATA')] + \
               [('pixmaps/export.png', p + 'pixmaps/export.png', 'DATA')] + \
               [('pixmaps/filter.png', p + 'pixmaps/filter.png', 'DATA')] + \
               [('pixmaps/finepix2800.png', p + 'pixmaps/finepix2800.png', 'DATA')] + \
               [('pixmaps/forward.png', p + 'pixmaps/forward.png', 'DATA')] + \
               [('pixmaps/fullscreen.png', p + 'pixmaps/fullscreen.png', 'DATA')] + \
               [('pixmaps/import.png', p + 'pixmaps/import.png', 'DATA')] + \
               [('pixmaps/info.png', p + 'pixmaps/info.png', 'DATA')] + \
               [('pixmaps/ledgreen.png', p + 'pixmaps/ledgreen.png', 'DATA')] + \
               [('pixmaps/ledred.png', p + 'pixmaps/ledred.png', 'DATA')] + \
               [('pixmaps/left.png', p + 'pixmaps/left.png', 'DATA')] + \
               [('pixmaps/locations.png', p + 'pixmaps/locations.png', 'DATA')] + \
               [('pixmaps/mkalbum.png', p + 'pixmaps/mkalbum.png', 'DATA')] + \
               [('pixmaps/new.png', p + 'pixmaps/new.png', 'DATA')] + \
               [('pixmaps/nofullscreen.png', p + 'pixmaps/nofullscreen.png', 'DATA')] + \
               [('pixmaps/open.png', p + 'pixmaps/open.png', 'DATA')] + \
               [('pixmaps/options.png', p + 'pixmaps/options.png', 'DATA')] + \
               [('pixmaps/padlock.png', p + 'pixmaps/padlock.png', 'DATA')] + \
               [('pixmaps/password-big.png', p + 'pixmaps/password-big.png', 'DATA')] + \
               [('pixmaps/password.png', p + 'pixmaps/password.png', 'DATA')] + \
               [('pixmaps/pause.png', p + 'pixmaps/pause.png', 'DATA')] + \
               [('pixmaps/people.png', p + 'pixmaps/people.png', 'DATA')] + \
               [('pixmaps/play.png', p + 'pixmaps/play.png', 'DATA')] + \
               [('pixmaps/reverse.png', p + 'pixmaps/reverse.png', 'DATA')] + \
               [('pixmaps/right.png', p + 'pixmaps/right.png', 'DATA')] + \
               [('pixmaps/rotatecw.png', p + 'pixmaps/rotatecw.png', 'DATA')] + \
               [('pixmaps/rotateccw.png', p + 'pixmaps/rotateccw.png', 'DATA')] + \
               [('pixmaps/save.png', p + 'pixmaps/save.png', 'DATA')] + \
               [('pixmaps/slideshow.png', p + 'pixmaps/slideshow.png', 'DATA')] + \
               [('pixmaps/stop.png', p + 'pixmaps/stop.png', 'DATA')] + \
               [('pixmaps/up.png', p + 'pixmaps/up.png', 'DATA')] + \
               [('pixmaps/view.png', p + 'pixmaps/view.png', 'DATA')] + \
               [('themes/default/caption.gif', p + 'themes/default/caption.gif', 'DATA')] + \
               [('themes/default/hide.gif', p + 'themes/default/hide.gif', 'DATA')] + \
               [('themes/default/notescript.js', p + 'themes/default/notescript.js', 'DATA')] + \
               [('themes/default/tech.gif', p + 'themes/default/tech.gif', 'DATA')],
               strip=0,
               upx=0,
               name='distpimp')
    

You can now rebuild your standalone and check that it runs without any error messages in the console window. The installer generated the standalone version of my app in the ./projects/distpimp on my machine. The folder name will be whatever you called your app with 'dist' on the front. I also found a ./projects/buildpimp directory had been created - according to the installers docs, this is used to store transient files during the build process and can be ignored.

Using Inno Setup

Inno Setup is a lovely piece of software that allows you to package up the contents of a directory into a single .EXE file that can easily be distributed. When someone downloads this and double-clicks, it launches the familiar series of dialogs through which a new program can be installed. It also takes care of adding an item in Control Panel --> Add and remove programs which allows your application to be removed just as easily.

Launch Inno Setup, and select the option to Create a new script file using the Script Wizard. Click OK, then Next to launch the wizard. I set the options on the application information section as follows:

  • Application name: PIMP
  • Application name including version:PIMP 0.7
  • Appplication publisher: Phil Edwards
  • Application website: http://www.linux2000.com

Click Next to get to the Application directory section. For most people, the defaults that Inno offers should be okay, but feel free to make amendments if required.

Click Next. You'll now see the Application files section. This is probably the most important part of the process, as this is where you tell Inno which specific files to include in the executable. Luckily, if you've done the part with McMillan Installer correctly, everything you need should already be there. Make sure you only include the files that your app really needs - for example, whilst putting this document together, I couldn't work out why PIMP kept having problems after I had installed it on the test machine. It took me a while to figure out that I'd included a pimp.ini file from my development machine in the SETUP.EXE produced by Inno. Taking this out cured the problem!

Click Next to get to the Application icons section. You should select whichever options you want the user to have.

Click Next. On the Application documentation section, I included a copy of the GPL in text format as the license file, and a copy of the PIMP changelog as the file to display before installation. This leads to the interesting situation of the end user having to agree to the terms of the GPL before being allowed to install the software! Irony is such a wonderful thing...

Click Next a couple more times and your SETUP.EXE file will be generated. Inno will put it in a ./Output directory off your main project root folder. You can now copy this file over to your test machine and check that it does actually install and run the way you expect it to.

The final task in this section is to ensure you save the Inno Setup script file that you just generated. For the record, my PIMP application generated the following:

; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

[Setup]
AppName=PIMP
AppVerName=PIMP 0.7
AppPublisher=Phil Edwards
AppPublisherURL=http://www.linux2000.com/pimp.html
AppSupportURL=http://www.linux2000.com/pimp.html
AppUpdatesURL=http://www.linux2000.com/pimp.html
DefaultDirName={pf}\PIMP
DefaultGroupName=PIMP
AllowNoIcons=yes
LicenseFile=C:\Python23\projects\pimp\distpimp\doc\gpl.txt
InfoBeforeFile=C:\Python23\projects\pimp\distpimp\changelog.txt

[Tasks]
; NOTE: The following entry contains English phrases ("Create a desktop icon"
; and "Additional icons"). You are free to translate them into another language
; if required.
Name: "desktopicon"; Description: "Create a &desktop icon"; GroupDescription: "Additional icons:";
	Flags: unchecked

[Files]
Source: "C:\Python23\projects\pimp\distpimp\pimp.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Python23\projects\pimp\distpimp\_socket.pyd"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Python23\projects\pimp\distpimp\_sre.pyd"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Python23\projects\pimp\distpimp\_ssl.pyd"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Python23\projects\pimp\distpimp\_winreg.pyd"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Python23\projects\pimp\distpimp\advancedPrefsDialog.rsrc.py"; DestDir: "{app}";
	Flags: ignoreversion
Source: "C:\Python23\projects\pimp\distpimp\albumDialog.rsrc.py"; DestDir: "{app}";
	Flags: ignoreversion
Source: "C:\Python23\projects\pimp\distpimp\albumEdit.rsrc.py"; DestDir: "{app}";
	Flags: ignoreversion
Source: "C:\Python23\projects\pimp\distpimp\changelog.txt"; DestDir: "{app}";
	Flags: ignoreversion
Source: "C:\Python23\projects\pimp\distpimp\editFilter.rsrc.py"; DestDir: "{app}";
	Flags: ignoreversion
Source: "C:\Python23\projects\pimp\distpimp\filterBatch.rsrc.py"; DestDir: "{app}";
	Flags: ignoreversion
Source: "C:\Python23\projects\pimp\distpimp\filterInfo.rsrc.py"; DestDir: "{app}";
	Flags: ignoreversion
Source: "C:\Python23\projects\pimp\distpimp\helpAbout.rsrc.py"; DestDir: "{app}";
	Flags: ignoreversion
Source: "C:\Python23\projects\pimp\distpimp\imageExportDialog.rsrc.py"; DestDir: "{app}";
	Flags: ignoreversion
Source: "C:\Python23\projects\pimp\distpimp\pandlDialog.rsrc.py"; DestDir: "{app}";
	Flags: ignoreversion
Source: "C:\Python23\projects\pimp\distpimp\passwdDialog.rsrc.py"; DestDir: "{app}";
	Flags: ignoreversion
Source: "C:\Python23\projects\pimp\distpimp\picPreview.rsrc.py"; DestDir: "{app}";
	Flags: ignoreversion
Source: "C:\Python23\projects\pimp\distpimp\pimp.exe"; DestDir: "{app}";
	Flags: ignoreversion
Source: "C:\Python23\projects\pimp\distpimp\pimp.rsrc.py"; DestDir: "{app}";
	Flags: ignoreversion
Source: "C:\Python23\projects\pimp\distpimp\prefsDialog.rsrc.py"; DestDir: "{app}";
	Flags: ignoreversion
Source: "C:\Python23\projects\pimp\distpimp\pyexpat.pyd"; DestDir: "{app}";
	Flags: ignoreversion
Source: "C:\Python23\projects\pimp\distpimp\python23.dll"; DestDir: "{app}";
	Flags: ignoreversion
Source: "C:\Python23\projects\pimp\distpimp\pywintypes23.dll"; DestDir: "{app}";
	Flags: ignoreversion
Source: "C:\Python23\projects\pimp\distpimp\readme.txt"; DestDir: "{app}";
	Flags: ignoreversion
Source: "C:\Python23\projects\pimp\distpimp\slideShow.rsrc.py"; DestDir: "{app}";
	Flags: ignoreversion
Source: "C:\Python23\projects\pimp\distpimp\win32api.pyd"; DestDir: "{app}";
	Flags: ignoreversion
Source: "C:\Python23\projects\pimp\distpimp\wxmsw24h.dll"; DestDir: "{app}";
	Flags: ignoreversion
Source: "C:\Python23\projects\pimp\distpimp\wxPython.helpc.pyd"; DestDir: "{app}";
	Flags: ignoreversion
Source: "C:\Python23\projects\pimp\distpimp\wxPython.htmlc.pyd"; DestDir: "{app}";
	Flags: ignoreversion
Source: "C:\Python23\projects\pimp\distpimp\wxPython.stc_c.pyd"; DestDir: "{app}";
	Flags: ignoreversion
Source: "C:\Python23\projects\pimp\distpimp\wxPython.wxc.pyd"; DestDir: "{app}";
	Flags: ignoreversion
Source: "C:\Python23\projects\pimp\distpimp\zlib.pyd"; DestDir: "{app}";
	Flags: ignoreversion
Source: "C:\Python23\projects\pimp\distpimp\doc\*"; DestDir: "{app}\doc";
	Flags: ignoreversion recursesubdirs
Source: "C:\Python23\projects\pimp\distpimp\pixmaps\*"; DestDir: "{app}\pixmaps";
	Flags: ignoreversion recursesubdirs
Source: "C:\Python23\projects\pimp\distpimp\themes\*"; DestDir: "{app}\themes";
	Flags: ignoreversion recursesubdirs
; NOTE: Don't use "Flags: ignoreversion" on any shared system files

[Icons]
Name: "{group}\PIMP"; Filename: "{app}\pimp.exe"
Name: "{userdesktop}\PIMP"; Filename: "{app}\pimp.exe"; Tasks: desktopicon
    

Preparing to distribute the finished app

We're almost ready to send the finished Windows version of PIMP out into the big bad world, but there are still a couple of sharp edges that need rubbing down.

Firstly, you will recall that when we built the standalone using McMillan Installer, we set the following options in the pimp.spec file:

exe = EXE(pyz,
          a.scripts,
          exclude_binaries=1,
          name='buildpimp/pimp.exe',
          debug=0,
          strip=0,
          upx=0,
          console=1 , icon = p + 'pixmaps/pimp.ico')
          ^^^^^^^^^
    

This causes the program to run in a command prompt style window, so we can see any run-time error messages produced. Obviously, the program will look pretty lame if we allow it to run this way on the end-users systems. You need to remember to change the console=1 to read console=0 before doing a final build of your program.

Secondly, the output executable will always be called SETUP.EXE, which i think is too generic. I prefer the file to include the name, version number and preferably the build number of the program in question. Open up the pimp.iss file that Inno saved and add the following line to the end of the [Setup] section:

OutputBaseFilename=pimp-0.7-1

There doesn't appear to be any way at present to force Inno to take this information from an external file, so you just have to remember to update it manually each time you release a new build of the program. Another job for the vapor-ware Pythoncard project manager, I think!

As a final check immediately before releasing a new version of PIMP, I try to remember to go also through the following checklist:

  • Go through all of the .rsrc.py files and reset the position parameter to '-1, -1' - the Pythoncard resource editor will almost always set this to wherever the panel happened to be on our screen when you saved it, which isn't always what you want.
  • If (like me!) you like to show off with screen shots of your app, ensure that the ones on your web site reflect the latest version.
  • Check that the version and build numbers are correct in the various files.
  • If you distribute a changelog and/or READMEfile with your app, check that you've updated it so that the release date is correct and it's up to date with the latest changes.

Vaporware alert! PythonCard project manager

In the process of preparing these notes, it's become painfully obvious to me that there's a need for a project manager of some sort to assist with the whole process of managing a PythonCard project from initial coding all the way through to the finished Inno-based installer binary. I've made a start on coding this, see the screenshot below for what the user interface will (maybe) look like:

Project Manager Screenshot

I'm grateful for the code that Lawrie Abott originally wrote, which has proven to be the inspiration for this project. It's probably about time I left PIMP alone to fester for a bit, anyway. :-)

Page last updated: March 3rd 2004 03:00 UTC
That's all for today, folks!

$Revision: 1.5 $ : $Author: kasplat $ : Last updated $Date: 2004/07/26 15:35:32 $

PythonCard-0.8.2/docs/html/template.html0000644000076500007650000000111210101222304020063 0ustar alexalex00000000000000

$Revision: 1.2 $ : $Author: kasplat $ : Last updated $Date: 2004/07/26 15:35:32 $

PythonCard-0.8.2/docs/html/timers-threads.html0000644000076500007650000004277510415172311021241 0ustar alexalex00000000000000 Increasing Usefulness with Timers and Threads

Increasing Usefulness:Talking to program back-ends with Timers and Threads

by David McNab and Alex Tweedly.

This walkthrough supplements the excellent existing PythonCard 'Getting Started' walkthroughs by Dan Shafer and David Primmer, and follows on from the How to Add a child window lesson. It's based on techniques taken from the various PythonCard sample programs.

This walkthrough was originally written by David McNab (david at rebirthing dot co dot nz), and was revised by, and is currently maintained by, Alex Tweedly (alex at tweedly dot net)


Overview, Scope and Purpose

This walkthrough is targeted at PythonCard Version 0.8.2. As PythonCard grows, some of this walkthrough may go out of date, even fail - if this happens, please contact me and I'll update it.

The purpose of this walkthrough is to empower you to make your PythonCard programs capable of much more meaningful work, by acquainting you with two mechanisms - timers and threads, which can be used for communication between your programs' graphical front-ends and back-ends.

Most of the top-level code you add to the front ends - your PythonCard user interfaces - is event handlers. As with programming with any GUI, event handlers should always complete their job fast, and return promptly, so they don't 'clog up the works'. PythonCard is no exception.

But there will be many cases where you need some real-time functionality - back-end code which runs autonomously of user interface events.

An example of this is programs which communicate in real-time on the Internet, or need to interact in real time with other software on your system (eg monitoring system load).

Timers and Threads are two good mechanisms that allow you to separate your program into:

  • Front-End - logic which processes user interaction events
  • Back-End - logic which manages non-user-interface aspects of your program, talks to other programs on your system or across the internet, and possibly communicates relevant updates to the user interface.

By using timers and/or threads, you can guarantee that your PythonCard event handlers will terminate promptly, and that your user interface can communicate as needed with your back-end logic.

Timers

You can set up your window class so that an event handler gets triggered at regular intervals - the 'tick of the clock'.

This is useful for things like a time display on your window, or polling for some external event (for instance, incoming mail), and dozens of other situations.

Let us now add a timer to the example code you've been writing. This timer will automatically add 10 to the number in the counter field, doing this every 5 seconds.

Firstly, you will need to add an on_initialize event handler to your main window. You may have already done this, while experimenting in your learning process during the earlier walkthroughs. But if you haven't yet done so, add the following method code to your Counter class:

    def on_initialize(self, event):
        print "Window opened"

Not very significant - but do save your file, and run counter.py. You'll see a message on stdout when the window opens.

So far, so good. Nice to know that we can receive an event when the window gets opened. But not very useful yet.

Now, we need to use this initialize event handler as an opportunity to set up a timer.

So change the event handler to the following:

    def on_initialize(self, event):
        self.myTimer = timer.Timer(self.components.field1, -1) # create a timer
        self.myTimer.Start(5000) # launch timer, to fire every 5000ms (5 seconds)

You'll also notice from the self.components.field1 that the timer is being created in respect of the field1 widget. More on this later.

Don't try to run this program yet - it will barf since timer is an unknown symbol - we need to grab it into our namespace. To do this, find the line at the top of your counter.py program which currently says

from PythonCard import model

and change it to say

from PythonCard import model, timer

Now, we have to make sure we can receive an event every time the clock 'ticks'.

You'll see in the on_initialize event handler above that we've linked the timer to field1 While conceptually the timer applies to the window as a whole, there's a weird quirk in timers which requires them to be associated with specific window widgets.

To receive the clock tick events, we only have to add another handler.

As per the event handler naming convention, (where widgets' handlers are called on_componentName_event, we'll call this handler on_field1_timer, since timer events get directed to the widget field1, and the event is called timer.

Now, add the following method code into class Counter:

    def on_field1_timer(self, event):
        print "Got a timer event"
        startValue = int(self.components.field1.text)
        endValue = startValue + 10
        print "Got a timer event, value is now %d" % endValue
        self.components.field1.text = str(endValue)
        # uncomment the line below if you've already followed the 'child window' walkthrough
        #self.minimalWindow.components.field1.text = str(endValue)

Note - this is ugly, because there's a lot of duplicated functionality. We'll leave it to you to factorise your code appropriately, creating a generic increment method which accepts an optional amount argument (default 1). But if you're impatient, don't worry about any factorisation, just use the above code and all will be ok

Now, save your counter.py program and run it. You should see the number increasing by 10, every 5 seconds. I don't think I need to say any more here - you've got the basic structure - the rest is now up to your imagination.

You could use timer events to poll for external conditions, but this can get real ugly real fast. So in the next section, we'll explore a nicer and more general way to tie your front end code to back end functionality, using threads.

Threads

Python is beautiful in its support of threads - the ability to split up code into multiple threads of control, just like an operating system does when it gives lots of separate programs a share of the CPU.

You can ignore the objections of " Python prudes" who insist that threads are not good programming practice. Sure, threads have their pitfalls, such as deadlocks, race conditions etc, but if you use a bit of common sense, and design intelligently, you can avoid these pitfalls. Also, programming to get around the need for threads can pervert your program logic, kind of like pushing your head down through your body and out your back orifice. Not always a pretty sight :p

Note - one actual risk of threading in Python is a syndrome called Global Interpreter Lock or GIL for short. GIL can strike in strange places, and cause one or more threads in your program to freeze up for no apparent reason. If you ever have reason to suspect GIL is occurring, simply sprinkle a few print statements in each of your threads until you either calm your suspicions, or nail the culprit. For example, I suffered a GIL once because a thread was building regular expression objects with re.compile(). I fixed this by building the re objects in advance, in the main thread. I suspect this is a Python bug (I'm using 2.2), but that's another topic.

What we'll be doing here is adding a background thread to your counter program, which (surprise, surprise) writes values (in this case, counting from 0 in steps of 20) to your counter value.

The first thing you could do is disable the timer you set up in the previous section, by commenting out the self.myTimer.Start(5000) statement in your on_initialize handler (see above). This will avoid confusion for now, since there won't be a running timer to complicate things.

Now, add to the top of counter.py the following statement:

import thread, Queue
import wx

This will give us access to Python's thread creation/dispatch functions, as well as message queues and wxPython.

A Little Theory

I'll keep this short and sweet. Simply, the safest way for threads to communicate with each other is via some kind of synchronised objects. We'll use Python's standard message queues (standard Python module Queue ), since it's easy and safe and well supported within Python. When your thread wants to send an event to your user interface code, it will send a message to it, then 'wake up' your user interface so that it receives an idle event. The idle event will check the message queue, and react accordingly.

Note - when your window classes have an idle event handler, this handler can get triggered by all sorts of things, particularly when your user interface falls idle - mouse stops moving, button click is finished etc. Within the idle event handler, we need to check our message queue so we know when we need to react to something in the back end.

Hint - run any PythonCard program with a '-m' argument. You'll see the program come up with a 'Message Watcher' window. Unclick the Ignore Unused checkbox. Interact with your program with the mouse, and you'll see a flood of events being generated. This is a great way of "cheating" to find out what name you'll need to give your event handlers. Another cheat is to run the widgets sample program, which allows you to generate HTML documentation for the various PythonCard widgets.

Threads Walkthrough - Summary of Steps Involved:

  1. Add a message queue to our Counter class.
  2. Add your thread code to counter.py, but as a global function, not a class method. This thread will periodically sends messages to our window
  3. In your on_initialize handler, launch your thread and pass it a handle to the message queue.
  4. Add an idle event handler, which picks up these messages
  5. Within the idle event handler method, check the message queue and react accordingly

1. Add the message queue

Refer back to the on_initialize(self, event) handler above, and add the following statement:

        # Add a message queue
        self.msgQueue = Queue.Queue()

This sticks a message queue into our Counter window class, that will be used for communication from the thread backend to the foreground window class.

2. Add a Thread Function

Add the following global function to your counter.py:

    def myThread(*argtuple):
        """
        A little thread we've added
        """
        print "myThread: entered"
        q = argtuple[0]
        print "myThread: starting loop"
        x = 10
        while True:
            time.sleep(10) # time unit is seconds
            print "myThread x=%d" % x
            q.put(str(x)) # stick something on message queue
            wx.WakeUpIdle() # triggers 'idle' handlers
            x += 10

3. Launch the Thread

Add the following lines at the end of your on_initialize handler:

        # Now launch the thread
        thread.start_new_thread(myThread, (self.msgQueue,))

Notice that we have to pass the queue object to the thread in a tuple - refer to the Python Library Reference doco for module

4. Add an idle event handler

In the thread function above, the operative line is wx.WakeUpIdle() . Upon calling that method, wxWindows tells all open windows, Hey, wake up - something's happened you might need to react to! So we need to add a handler to our Counter class to handle idle events, and thus get triggered when we get 'woken up'. So add the following method into your Counter class

    def on_idle(self, event):
        print "on_idle entered"

5. Check the message queue and react accordingly

Presently, our 'idle' handler isn't very useful - but if you run counter.py, you'll see it gets triggered every time the program falls idle. So now, we'll make it do what it needs to do - reacting to events from our background thread. Replace the idle handler above with the following:

    def on_idle(self, event):
        print "on_idle entered"
        while not self.msgQueue.empty():
            # Handle messages from our thread
            msg = self.msgQueue.get()
            print "on_idle: msg='%s'" % msg
            self.components.field1.text = msg
            # uncomment the following if you've followed the 'child window' walkthrough
            #self.minimalWindow.components.field1.text = msg

Now, we're all done. Launch your counter.py, and watch as the background thread launches, and periodically sends its messages to the user interface, which displays these on the window.

Conclusion

During this walkthrough, you have explored timers and threads, two easy and powerful ways to interface your user interface classes with the back-end of a program (where the 'real work' happens)

Having got a handle on front-end/back-end interactions, via threads and timers, you are now empowered to add some serious functionality to your PythonCard programs.

There is now nothing stopping you from writing any kind of application in PythonCard.

A common situation in programming is where you want a program to be always running (as a Unix daemon or a Windows NT/2k/XP 'service'), but you don't always want its window showing. A typical approach is:

  • Create the back-end code as a standalone 'daemon' program (or Windows NT/2k/XP 'service'), which talks via socket connection to the front end.
  • Create the front-end code, which operates the user interface
  • Put a thread into your front end code which does the socket communication to the daemon, and relays commands/responses/status info between the daemon and the user interface.

With this approach, you can launch and terminate the user interface program as you like, without disrupting the backend in any way

So, it's over to you now. Play around with your walkthrough programs and the PythonCard sample programs, raid the Vaults of Parnassus for useful bits of code, and hack to your heart's content.

The only limit is your imagination and (rapidly growing) level of Python skill.

Happy programming!

Copyright (c) 2003 by David McNab, david at rebirthing dot co dot nz
Copyright (c) 2005 by Alex Tweedly, alex at tweedly dot net
Please feel free to mirror, copy, translate, upgrade and restribute this page, as long as you keep up to date with Python and PythonCard, and credit the original author.

$Revision: 1.7 $ : $Author: alextweedly $ : Last updated $Date: 2006/04/06 11:00:25 $

PythonCard-0.8.2/docs/html/tools/0000755000076500007650000000000010434046771016554 5ustar alexalex00000000000000PythonCard-0.8.2/docs/html/tools/codeEditor.html0000644000076500007650000001201010107504554021510 0ustar alexalex00000000000000 codeEditor tool

Figure 1: Editing the minimal.py sample

Figure 2: File Menu

Figure 3: Edit Menu

Figure 4: View Menu

readme.txt

Python Source Code Editor

The codeEditor sample in PythonCard is focused on being a simple to use Python source
code editor. It is not intended to be a generic editor or replace vi(m), Emacs, etc.
If you are already happy with your existing editing environment for Python source
code, there is no particular reason you have to switch. codeEditor and the
resourceEditor and shell will be more tightly integrated as the project progresses so
that the user has a simple Integrated Development Environment (IDE) for building
desktop applications without needing to use an external program for editing.

Based on textEditor sample, but using wxStyledTextCtrl (wxSTC)

For more information, see:

PythonCard Editor (codeEditor) wiki page
  http://wiki.wxpython.org/index.cgi/PythonCardEditor

wxStyledTextCtrl documentation
  http://wiki.wxpython.org/index.cgi/wxStyledTextCtrl

If you use this sample as a real text editor then you should be careful to always work
on backup copies of documents in case there are bugs that might corrupt your text.

You can change the style used to display the source code; the style is also used by
the PythonCard shell.

The last position and size of the window will be saved in a user.config.txt file.

The About dialog displays the current filename, character, word, and line count.

Scriptlets
See the following message in the archive for more info.
  http://aspn.activestate.com/ASPN/Mail/Message/PythonCard/1181106



Associating Python files with codeEditor on Windows

These instructions are for Windows 2000. They may be slightly different on other
versions of Windows.

1. Open the Explorer and choose "Folder Options..." under the "Tools" menu
2. Click on the "File Types" tab
3. Scroll down in the "Registered file types" list and select extension "PY  Python
File"
4. Click on the "Advanced" button
4a. You should be looking at an "Edit File Type" dialog with a list of Actions such as
Edit and Open. Open is probably in bold since it is the default action usually
associated with .py files.
5. Click on the "New..." button
5a. You should be looking at a "New Action" dialog
6. In the "Action:" field type in a label such as "Edit with PythonCard". This is the
label that will show up in the context menu when you right-click on a .py file in the
Explorer
7. in the "Application used to perform action:" field you need to specify the path to
the Python executable as well as the location of the codeEditor.py file. On a Python
2.2.1 installation using the default installer this will look like:

C:\Python22\pythonw.exe
C:\Python22\Lib\site-packages\PythonCardPrototype\tools\codeEditor\codeEditor.py "%1"

Substitute your own paths for the ones above and put quotes (") around the paths with
spaces in them, if any. If you want a console when codeEditor.py runs, then use
python.exe instead of pythonw.exe

8. Click "OK"
8a. You should now have an "Edit with PythonCard" item in your "Edit File Type" dialog
8b. The item in bold is the default action; Open will be the default if nothing is
showing up in bold. Whether you want to "Edit with PythonCard" or "Open" (run) a
script when you double-click a file in the Explorer is of course a personal
preference. If you want "Edit with PythonCard" as the default action, then select
"Edit with PythonCard" in the list, and click the "Set Default" button.
9. Click "OK"
10. Click "Close" in the "Folder Options" dialog
11. Open a directory in the explorer that contains a .py file, then right-click on the
file and choose "Edit with PythonCard" and the file should be opened with
codeEditor.py
11a. If it doesn't work, double-check the steps above
12. Repeat the process for .pyw files, using the same name and path.

$Revision: 1.2 $ : $Author: kasplat $ : Last updated $Date: 2004/08/14 21:51:40 $

PythonCard-0.8.2/docs/html/walkthrough1.html0000644000076500007650000004111110356541120020707 0ustar alexalex00000000000000 PythonCard Walk-through No. 1

Getting Started in PythonCard

This document is designed to help people who are interested in learning and using PythonCard but who are not professional programmers and who do not have deep Python scripting skills to learn their way around the environment and to understand how PythonCard applications get built.

Before You Read This Document

It will be helpful if, before you attempt to follow along with this document, you are sure you've done the following:

  1. Downloaded and installed the latest version of PythonCard for your system
  2. Confirmed that your installation works by successfully launching and running the application called minimal in the PythonCard samples directory

While it is not necessary for the purposes of this document that you understand how to program in Python, you should know that all of the real heavy lifting in PythonCard is done using Python programming. So if you haven't yet learned Python, you can still follow the basics of this walk-through. But you won't be able to do much in the way of PythonCard development without at least a basic understanding of and comfort level with Python programming.

Some Basic Preparation

This document assumes you are running PythonCard on a Windows machine. If you're on a Macintosh or Linux system, you'll have to adjust some of the instructions to match the directory structure and other differences on your machine.

You will also have to have access to a Python-aware editor. The good news is that PythonCard comes with a robust editor called codeEditor. When you install PythonCard, codeEditor appears in the tools sub-directory. We recommend that you make it easy to open your Python source files (all of them, not just the PythonCard source) with this codeEditor. You can set up your Windows system so that it allows you to choose PythonCard's codeEditor as one (or the only) editor with which Python source files can be opened and edited by following these steps:

  1. Open the Explorer and choose "Folder Options...quot; under the "Tools" menu
  2. Click on the "File Types" tab
  3. Scroll down in the "Registered file types" list and select extension "PY Python File"
  4. Click on the "Advanced" button. You should be looking at an "Edit File Type" dialog with a list of actions such as Edit and Open. Open is probably in bold since it is the default action usually associated with .py files.
  5. Click on the "New..." button. You should be looking at a "New Action" dialog
  6. In the "Action:" field type in a label such as "Edit with PythonCard". This is the label that will show up in the context menu when you right-click on a .py file in the Explorer
  7. In the "Application used to perform action:" field you need to specify the path to the Python executable as well as the location of the codeEditor.py file. On a Python 2.3.5 installation using the default installer this will look like:

C:\Python23\python.exe C:\Python23\Lib\site-packages\PythonCard\tools\codeEditor\codeEditor.py "%1"

(Note that the text above is entered on one line; it may appear as two lines in your browser because of wrapping of text.)

Substitute your own paths for the ones above and put quotes (") around the paths with spaces in them, if any. If you don't want a console when codeEditor.py runs, then use pythonw.exe instead of python.exe

  1. Click "OK." You should now have an "Edit with PythonCard" item in your "Edit File Type" dialog
  2. Click "OK"
  3. Click "Close" in the "Folder Options" dialog
  4. Open a directory in the explorer that contains a .py file, then right-click on the file and choose "Edit with PythonCard" and the file should be opened with codeEditor.py. (If it doesn't work, double-check the steps above.)
  5. Repeat the process for .pyw files, using the same name and path.

As you learn Python, you'll want a good tutorial. We've gathered together list of some of the best resources on the Net and in your favorite real or digital bookstore.

If you're not quite sure what PythonCard is or what kinds of problems it's designed to solve, read this document.

A User's Eye View of PythonCard

Now that you've taken all the necessary preparation steps, let's dig into the PythonCard universe and see what's going on just under the hood.

PythonCard is a development environment. It needs an application as a starting point, so you generally start by finding an application that has a lot of what you're looking for and cloning it, renaming some files, and then launching the copied application. We've done that for you for this walk-through; the details of how to start your own application come in a subsequent document in this series. (There is another way to begin your PythonCard project development that involves choosing from a pre-defined template. We won't cover that approach here but it is discussed in the next walkthrough in this series.)

Exploring Some Sample Applications

We'll begin our walk-through of PythonCard by looking at the kinds of things it is designed to do. (Understand, however, that these are pretty skeletal applications designed as samples and starting points, not as commercial applications. You can do far more robust things with PythonCard than might be evident from these simple demonstrations.)

In the directory Python23\Lib\site-packages\PythonCard\samples you'll find a file called samples.pyw. Double-click this application icon (or launch it in whatever way you're accustomed to on your system).

In a few moments, you'll see a window open called "PythonCard Samples Launcher." (See Figure 1) This PythonCard application lets you browse through the sample applications included with PythonCard, examine them and run them. It's a sort of nerve center for the sample applications. (On some systems, you may also see an operating system console window when the application launches. You can just minimize this window.)

Screen shot of PythonCard Samples Launcher
Figure 1. Screen Shot of PythonCard's Samples Launcher

In the scrolling list of applications, select "minimal." Read the description. Click on the buttons labeled "Show Source" and "Show Resource." None of this means anything to you yet, but you need to know that you can always examine the Python source code for the scripts that run your PythonCard applications as well as the resource file that contains descriptions of the elements that make up its interface. You should also know that every PythonCard application has at least two Python source files. One of them ends in "rsrc.py." This is where PythonCard stores information about the layout of your application's window, while the logic of the program is stored in the other Python file which does not have the "rsrc" extension before the "py" extension. Note that you cannot edit in the Samples Launcher.

OK, click the "Launch" button. In a few moments, you'll see a small window like the one in Figure 2. Now you see why this sample is called "minimal." It's about as small a PythonCard application as you can think of! You can change the text in the editing field and you can drag the window around. Eventually, you'll get tired of all this dazzling functionality and want to close the application. You can either click the close box or choose Exit from the File Menu.

Screen shot of minimal PythonCard application open window
Figure 2. Screen shot of minimal PythonCard application window

Back in the Samples Launcher, select the sample called "dialogs." Again, you can examine source and the resource file if you're so inclined. When you're ready, click the "Launch" button. A window like the one in Figure 3 will appear.

Screen shot of Dialogs launcher application in PythonCard
Figure 3. Screen Shot of Dialogs Launcher Application in PythonCard

All of the dialog boxes you can see by clicking on the text lines to the left of this window are built into PythonCard. Causing them to appear, and determining what the user selected or did with them, is, as you'll learn in a later walk-through, pretty straight-forward. Click on the "alert" line. A small dialog appears. Click the "OK" button. Notice that in the Sample Dialogs window, you can see the name of the dialog (alertDialog), and whether the user accepted or canceled the dialog. You can also see what information the program returned to PythonCard as a result of the user's action. In this case, the user accepted the dialog (i.e., clicked "OK " and the dialog returned "Ok." Unless you have some programming or scripting background, that may not be meaningful, but trust us, it's useful data.

Now try the "Message" dialog. Run it three times, clicking "Yes " once, "No" once and "Cancel" the other time. Notice the differences in the information displayed in the Samples Launcher as a result.

One more and then we'll go have some fun with this stuff. Click on the "File" dialog button. You'll see a standard file-open dialog for your system. You can navigate around, choose from the list at the bottom of the window the file type(s) you want to see listed, and select a file (or cancel). Notice what appears in the Sample Dialogs window when you do these various things.

Changing a PythonCard Application

OK, let's go see what's going on under the hood here. In your PythonCard\docs directory, locate the folder called " GettingStarted". In that directory is a file called starter1.py. Launch it in the usual way. It is a bare-bones PythonCard application. In fact, it's a copy of the minimal application you ran in the last section.

Open the file starter1.py in your Python-aware editor of choice. The Python script is, as you'd expect, brief and to the point. Here's the important part to focus on:

    def on_menuFileAbout_select(self, event):
        pass

Even without understanding Python you can probably tell what this code snippet does. (That's one of the beauties of Python. It is eminently readable.) It's what we call an "event handler." It gets activated, or triggered, by the user causing some event. In this case, the user selects the File Menu's "About" option and we do nothing (in Python, the "pass" statement does nothing; it's simply used as a placeholder where the syntax requires a statement but no action is needed).

We're going to change what this menu choice does. You'd never handle an assignment the way we're going to show you here, but our purpose is just to show you how easy it is to fiddle with PythonCard's Python scripts to make things happen the way you want them to happen.

First, select the word "pass". Type in its place the following line:

        result = dialog.alertDialog(self, 'It works!', 'Showing Off')

Again, this new line of Python code is readable even if you're not a Python guru yet. Now when the user selects the Exit menu, rather than doing nothing, we'll display an alert dialog titled "Showing Off" that says "It works!"

One more change. We have to make sure our Python script knows how to work with dialogs. Near the top of the file above the comments that explain what's going on is a line that says:

from PythonCard import model

Change that so it says:

from PythonCard import dialog, model

Save the code.

IT IS IMPORTANT, if you choose to use a Python editor other than PythonCard's codeEditor, that you not try to run the program from within those editors. Doing so in programs like the IDLE editor that ships with the Python distribution or PythonWin, for example, will have nasty consequences because these editors use a different graphics library from what PythonCard uses.

Double-click the "starter1" application. When the window appears, select the Exit option from the File menu. You'll see a small dialog appear as described above.

Close the application by selecting its window's close box.

Making A Slightly More Interesting Change

Go back to codeEditor. If you didn't close it, starter1.py should still be open for editing. Replace the string 'It works!' in the line we edited earlier so that the line reads:

        result = dialog.alertDialog(self, self.components.field1.text, 'Showing Off')

This line is almost identical to the one we just had here, but this one takes its text from the text in a component called "field1." That happens, of course, to be the only field in our little application.

Save the code. Then double-click the "starter1" application to try out the change.

Now when you change the text in the field and select File->Exit, you'll see a dialog box that contains the text you put into the field.

What We've Learned

Not a bad start, right? We've learned how to launch a PythonCard application, something about the kinds of dialog support PythonCard has built in, looked at a couple of sample applications, and then edited some source code not once but twice. In the process we also learned that PythonCard has components (user interface elements) that have programs (or scripts) associated with them. We've learned that there are events in PythonCard and that you can write Python code that tells your application what to do when those events are triggered.

What's Next?

In the next installment of this PythonCard walk-through, we'll dig a little more deeply into development. We'll see how we can set up our development environment to provide helpful supporting windows that tell us what's going on in our application. We'll also see how to start and build our own application, using the built-in PythonCard layout editor, the Resource Editor.

We'll be producing more of these walk-through documents on other aspects of PythonCard's use. If you want to stay current with PythonCard and the documentation, you should subscribe to the user mailing list.

Continue on to Walk-Through 2

$Revision: 1.23 $ : $Author: kasplat $ : Last updated $Date: 2006/01/03 18:28:32 $

PythonCard-0.8.2/docs/html/walkthrough2.html0000644000076500007650000004605310415172311020720 0ustar alexalex00000000000000 PythonCard Walk-Through No. 2

Creating a Complete PythonCard Application from Scratch

by Dan Shafer (pydan@danshafer.com)

Background

This is the second in a series of PythonCard walk-through documents. It assumes you have either read and worked your way through PythonCard Walk-Through No. 1 which teaches you the basics of working in the PythonCard environment or that you already understand those basics.

Purpose and Scope

The purpose of this walk-through is to walk you, step by step, through the process of creating a PythonCard application. By the time you have finished this walk-through, you will:

  • understand how PythonCard's GUI building facilities work
  • know how to create a starting point for a new PythonCard application
  • have a grasp of the basic event-handling architecture that gives PythonCard applications life
  • know how to create menus and menu items in PythonCard and to hook those items up to actions

Over the years as I've played with various GUI tools and development environments, I have traditionally created a simple counter application as a way of getting familiar with the tool's basic operation and gaining some nodding acquaintance with its language and architecture/API. When PythonCard appeared in my life courtesy of my old colleague Kevin Altis, I decided that I should do the same. Kevin encouraged me to document my efforts and this is the result.

This document walks you step by step through the process of creating an intentionally simplistic PythonCard application. I don't claim that this is the best way to accomplish this objective, let alone the only one. It just happens to be the way I approached it. At the end of this tutorial, I will make a few observations about other things that I could have done that would make the example more instructive or interesting. Note that this tutorial describes how this process is handled in PythonCard 0.8.2. Continuing enhancements to the UI, especially in the resourceEditor, will make the process more and more streamlined over time.

The Application

This simple application, the finished result of which is shown in Figure 1, consists of three buttons and a text field. The text field holds a numeric value (represented as a string) which is manipulated by the three buttons. The buttons add 1 to the current value displayed in the field, subtract 1 from that field's value, and reset the field's value to 0.

Finished Counter Application
Figure 1. Finished Counter Walk-Through Application

The Application Creation Process

Creating an application in PythonCard begins with the creation of a basic structure. There are two ways to do this. One is to use the PythonCard Resource Editor (called resourceEditor.py), start with the basic empty window, and code from scratch. The other is to copy an existing application's folder, rename a few basic things, and begin with a somewhat more complete starting point. I'm taking the latter course here.

The process in summary

  1. Run resourceEditor to create or modify an existing application.
  2. Lay out the application's window in Resource Editor.
  3. Script the components that will trigger actions (buttons and/or menus)
  4. Cleaning up artifacts of the copied program.

Let's go through those steps with my simple Counter tutorial.

A. Run resourceEditor to modify an existing application.

  1. Make a copy of the "minimal" project folder in the samples folder of the PythonCard distribution. Put into its own folder called "counter." (The folder name isn't important to PythonCard.)
  2. Rename "minimal.py" to "counter.py" and " minimal.rsrc.py" to "counter.rsrc.py."
  3. Launch resourceEditor, which is found in the PythonCard distribution's tools folder
  4. Open the file counter.rsrc.py in the folder you just created. The window looks identical to the minimal application when it is running, except for the menu bar which remains the resourceEditor's menu bar since we are running resourceEditor at the moment) rather than the Counter application's menu bar. Figure 2 depicts this start-up situation. resourceEditor is a "live" editor; the GUI components of the application are running while you edit the window layout.

Startup Screen for Walk-Through
Figure 2. Startup Screen for Walk-Through Counter Application

B. Laying out the window for the counter tutorial application.

  1. Select the text field containing the words "Hello PythonCard" by clicking anywhere in it.
  2. In the Property Editor window, select the "text" property in the right-hand list of properties for the field1 Text Field object. Select the words in the field and delete them with the Backspace key.
  3. Type the number "42" (or some other number; I just happen to be a Douglas Adams fan) into the box.
  4. Click Update.
  5. In the Property Editor window, select the "font" property in the right-hand list of properties for the field1 Text Field object. Click on the "Font" button and set the font size to 24. [Note that there is a bug in the GTK version of wxPython 2.3.2.1 that prevents the font from being changed. This will be fixed in the next release of wxPython.]
  6. Click Update.
  7. Use the resize handles to shape the field so that the entire value "42" shows. Then position the field near the right edge of the window and approximately centered vertically. (You will probably need to resize the window itself; use the same technique for doing so on your system as you'd use for any window.)
  8. Select the "editable" property of the Text Field object called field1 and uncheck the checkbox. (By making the field read-only, we avoid the necessity of error-checking that would be required if we let the user enter a value directly into the field.)
  9. Click Update.
  10. Select Save from the File menu to save the counter.rsrc.py resource file.
  11. From the "Components" menu, select "Button"
  12. In the Property Editor window, select the "name" property in the right-hand list of properties for the Button1 Button object. Change the default name to incrBtn (for "increment button")
  13. Click Update.
  14. In the Property Editor window, select the "label" property in the right-hand list of properties for the incrBtn Button object. Change the label from Button1 to Increment.
  15. Click Update.
  16. Position this button in the upper left portion of the window.
  17. Repeat steps 11-15, but this time change the default name to decrBtn (for "decrement button" and the label from Button1 to Decrement. Remember to click the "Update" button in the Property Editor after setting each property.
  18. Position the Decrement button below the Increment button, approximately in the middle of the window.
  19. Repeat steps 11-15 one more time. Change the default 'name' to 'resetBtn' and the 'label' to 'Reset'.
  20. Position the Reset button to the bottom of the vertical row of three buttons.
  21. Save your work.

Your project should now look like Figure 3.

Project With Buttons Added
Figure 3. Project With Buttons Added

C. Scripting the Buttons

Application scripts are stored in the Python (.py) file that represents the application. In this case, that means they are in the file counter.py.

  1. Using PythonCard's built-in codeEditor or your favorite Python code editor, open the file counter.py. It is a small file with a self-explanatory comment and only one event-handling script right now (which responds to the user selecting Exit from the File menu). codeEditor is found in the tools directory of your PythonCard distribution.
  2. Delete the last line of the class definition, which currently says pass.
  3. Enter the following script, remembering that Python is white-space aware so that indentations of lines are significant. Since this is a definition of a method of the class, the first line will be indented, and subsequent lines will be indented twice.
    def on_incrBtn_mouseClick(self, event):
        startValue = int(self.components.field1.text)
        endValue = startValue + 1
        self.components.field1.text = str(endValue)

Let's examine this script because the others we will write are all but identical.

The opening line of a PythonCard event handler always starts with the keyword "def" which is standard Python for function and method definition. The next expression in the line starts with the PythonCard keyword "on_" and is followed by the name of the component we are scripting. In this case, it's the Increment Button, whose name is " incrBtn". After another connecting underscore, the last portion of the handler definition line defines the event for which this handler is to be called. All events take the same basic set of parameters as shown above.

The next lines are simple Python for the most part. The first line defines a variable called "startValue" to which we assign the current contents of the field, coerced to an integer so we can perform arithmetic on it. The second line adds one to the value we just retrieved. The third line assigns this new result to the field's text property after coercing it to a string.

  1. As long as we're in the application's main code file, let's also make our program a little more internally consistent. Change the name of the class we're creating from Minimal to Counter. At the end of the file, replace "Minimal" with "Counter" in the line that begins "app = ". The result should look like Figure 4.

Code Changes in counter.py
Figure 4. Code Changes in counter.py

  1. Save your work.
  2. From the resourceEditor's File menu, select "Run."
  3. When the Counter application appears, click on the Increment button and watch the displayed value in the text field to confirm that it is incrementing as expected.
  4. Exit the application.
  5. Back in your Python Editor, copy the function we just created for the Increment button and paste it under that function, being sure indentation remains correct.
  6. Edit the new handler to change the name of the button from incrBtn to decrBtn and the '+' sign to a minus (' - ') sign.
  7. Create a final handler for the Reset button that looks like this:
    def on_resetBtn_mouseClick(self, event):
        self.components.field1.text = "0"

Figure 5 shows you what your editor window should look like now.

Editor Showing Final Code Changes
Figure 5. Editor Showing Final Code Changes

  1. Save your work and test the application again to be sure it still works.

What if the application doesn't run? In that case, you can use the " Run with interpreter" command under the "File" menu to get a look at what errors, if any, are occurring. To see this in action, let's introduce a typographical error into counter.py. (You can skip this discussion if you either already know how to do this or are confident that you'll never create a PythonCard bug that will cause the programs to fail.)

  1. Open counter.py in your Python editor if it isn't already open.
  2. Change the word "class" to "classy" and save the program.
  3. Run the application as you have been doing. You will probably see a brief console window appear and then disappear. Nothing else happens.
  4. From the File menu in resourceEditor, choose "Run With Interpreter. " This launches your PythonCard application with the Python interpreter in a command console for your system so that you can see what error is being generated.
  5. You should see a syntax error indicated in the new window. It should be displaying the line where we created the intentional typo. (See Figure 6)

Error Shown in Console Window
Figure 6. Error Shown in Console Window

  1. Press Ctrl-Z and Enter to terminate the Python interpreter and close the console window.
  2. Go back to the counter.py file and fix the line. Save the file and then re-run the application either from the resourceEditor's File menu or from the command line.

D. Cleaning up artifacts of the original program

We already took care of changing the class name and the runtime invocation name of the application from Minimal to Counter. Now let's change the resource file to reflect the program's new name.

In resourceEditor, go to the Edit menu and select "Background Info... " Change the name of the application to "PythonCard Counter" and click OK.

That ends the basic aspect of this second PythonCard walk-through. You now have a finished and working PythonCard application.

Optional Step: Adding a Menu

We'll add one optional step for a program like Counter, one which you may well need to take in any application of even a little greater complexity than this one. We'll add a menu to the application.

  1. In the resourceEditor, go to the Edit menu and choose "Menu Editor ..."
  2. A dialog box appears (see Figure 7) with the current menu structure displayed on the left. As you can see, the Counter application, which was started from the sample application called minimal., has a single menu with a single menu choice.

Opening Screen of Menu Editor
Figure 7. Opening Screen of Menu Editor

  1. Click on the "New Menu" button. You should see a dialog box like the one in Figure 8.

New Menu Dialog Box
Figure 8. New Menu Item Dialog Box

  1. In the editing area to the right of the display showing the menu, change the name of the menu to menuCounterMenu and its label to Counter.
  2. Now click on "New Menu Item" and add a new menu item named "counterMenuIncrement". Make its label "Increment".
  3. Click on "New Menu Item" again and do the same for new menu items "Decrement" and "Reset". When you're done your work should look something like Figure 9.

Menu Editor With All Menu Items Defined
Figure 9. Menu Editor With All Menu Items Defined

  1. Save your application in resourceEditor.
  2. Open the counter.py Python code file in your Python editor. Add the handler name shown here:
    def on_counterMenuIncrement_select(self, event):
  1. Copy the three lines of the function in on_incrBtn_mouseClick and paste them into the definition of this menu function. (Be sure levels of indentation are consistent.)
  2. Follow the same procedure for hooking up the Decrement and Reset menu options. When you're finished, your code window should look something like Figure 10.

All Menu Items Programmed and Ready to Go
Figure 10. All Menu Items Programmed and Ready to Go

  1. Save your work.

(You'll notice that the new menu doesn't appear in your application in resourceEditor. Rest assured it will be there when you run the application outside resourceEditor.)

  1. Run the application (see Figure 11) and confirm everything works as expected.

Finished C ounter Application With Counter Menu
Figure 11. Finished Counter Application With Counter Menu

(NOTE that it would obviously be better design to factor out the duplicated code into methods that handle the increment, decrement and reset buttons and menus as processes and then to call those methods from within the event handlers. We leave that you as an exercise for the reader. Don't you hate when we do that to you?)

Continue on to Walk-Through 3

$Revision: 1.15 $ : $Author: alextweedly $ : Last update $Date: 2006/04/06 11:00:25 $

PythonCard-0.8.2/docs/html/walkthrough3.html0000644000076500007650000003515110355151720020722 0ustar alexalex00000000000000 How to Add a Child Window to a PythonCard Application

How to add a child window (or non-modal dialog)

by David Primmer

This is the third walkthrough in a series of tutorial-style walkthroughs to help newcomers get started using PythonCard.

Overview, Scope and Purpose

This walkthrough covers PythonCard Version 0.8.

The first two PythonCard walkthrough tutorials (which can be found, like this one, in the docs/html directory of your PythonCard installation) have created single-window applications. It is, of course, often necessary to create applications with multiple windows. Adding another background as a child window will allow you to modularize your application. You can allow users to hide and show windows (by using the visible attribute), and you can clean up your user interface and split widgets off into logical groups.

In this walkthrough, we will extend our simple Counter application (the subject of walkthrough2) to add a child window which launches when the application opens, interacts with it, and exhibits some demonstrative behavior when the child window is closed. This walkthrough will make more sense if you've worked through walkthrough2.

Modal vs. Non-modal

There are two types of child windows: those that require the user to stop any other activity and pay attention only to the current window (modal) and windows that allow simultaneous interaction with the main window (non-modal or modeless). The first thing to decide when creating a child window is whether you require the window to be dismissed before the user can continue to work with the main application window. With a modal window, users can choose to cancel, they can respond to a message, or they can set parameters and assign values to content in the active application. An example of a simple modal window is a message box or alert.

You may want your window to stick around while the user is working in another window. The radioclient sample, for example, has a child window that displays a view of the current document as it would be rendered in a Web browser. It's important to decide between modal and non-modal before you begin creating your child window because the standard window type in PythonCard, the background, cannot be modal.

model.Background

This is the standard class definition for a PythonCard app:

class Minimal(model.Background):

One of the most important concepts when dealing with child windows in PythonCard is the background. The background is unique to PythonCard and it basically encapsulates a wxFrame and a wxPanel. Each PythonCard application is a class that derives from model.Background. You can't make a class derived from model.Background modal. That is a wxWidgets limitation, not PythonCard. If you want a modal dialog then your class has to be derived from model.CustomDialog. They are similar, but different and the resource format is slightly different as well. dbBrowser, resourceEditor, textEditor, and textRouter all use custom modal dialogs.

Overview of Designing a Child Window

Making a non-modal child window using resourceEditor is simple, following these steps:

  1. Create a window with resourceEditor. In this walkthrough, we'll do so by starting with the minimal sample and adding features.
  2. In your main application, import the module you created at step 1 and add code to the main application's startup routine to create an instance of your imported child window class.
  3. Modify the attributes of the new object, calling its methods and using its components. It is now part of the main application.

Create a stand-alone PythonCard application

Each PythonCard .py file contains a class definition derived from PythonCard's model.Background as well as a stub to instantiate that class. A child window is simply an instantiation of a class from within another application. Tutorials in walkthrough1 and walkthrough2 cover how to create a stand-alone PythonCard application so we won't cover that here.

It is possible that your child window will be interacting with the data in your main application, so there may be limits to how much design can be done independently of your main application. But it is still a good idea to try to separate their functions as much as possible to allow code re-use and to simplify debugging. In the current example, we will use the minimal sample as the basis of our child window while using the counter sample as our main application.

Minimal.py has one control, a text field called 'field1'. We will add a button to minimal.py to reset the value of the field in the main counter application to 0 when it is pressed. We will also connect the buttons in the main counter application to update field1's contents in the child window (minimal.py) to match those of the field in counter's window.

Even though these are relatively trivial interactions, they serve to demonstrate the techniques involved in getting two (or more) windows communicating with one another in a PythonCard application.

Start by creating a new folder to hold your two resource files and your two PythonCard script files. Copy minimal.py, minimal.rsrc.py, counter.py, and counter.rsrc.py from their respective folders in the samples directory into this new folder. You can leave their names the same, though in practice you will generally change the names of files to match the application you are constructing.

Open minimal.rsrc.py in the PythonCard resourceEditor and add a button to it as shown in Figure 1.

button added to minimal application
Figure 1. Button Added to minimal Sample Window

Label the button "Clear Counter" and name it btnReset. Save the resource file.

We'll get back to scripting this button shortly.

Launching the Child Window From the Parent Application

Opening the child window in our main application's code is simply a matter of importing the class and creating an object of that class, attached to the current background.

In addition to the standard imports for Counter, we'll import minimal:

from PythonCard import model
import minimal

Next we'll add an event handler to be executed when the Counter application is started. This handler acts something like autoexec.bat on a PC or .login in a Unix shell. Place an on_initialize handler right below the class definition. (Placement isn't important but following this convention will make it easier for you to work through and maintain multi-window applications.) Here is the class declaration of our Counter application with on_initialize added:

class Counter(model.Background):
    def on_initialize(self, event):

and here is the code that we will add to the on_initialize method:

        self.minimalWindow = model.childWindow(self, minimal.Minimal)

We create a minimal window object uisng the childWindow function and give it the name minimalWindow by passing two parameters to the function: the parent window (self), and the background class (minimal.Minimal) we want to use.

That is all is needed to create a minimal window object, but at this point, it is still hidden and not much good to us.

Communicating With Your Child Window

Continuing in the on_initialize handler, we make calls to set the position and visibility of the new window:

        # override resource position
        self.minimalWindow.position = (200, 5)
        self.minimalWindow.visible = True

We now have a window that is an attribute of our main background, just like any of the menus or buttons that are already a part of Counter.

As constructed before we began this project, the increment and decrement buttons in Counter modify the value of the text field in Counter. To cause the Counter application's buttons to update the text value in the minimal child window minimalWindow, we simply add one more call to update the control in that window as well (the new lines are in bold type):

 
    def on_incrBtn_mouseClick(self, event):
        startValue = int(self.components.field1.text)
        endValue = startValue + 1
        self.components.field1.text = str(endValue)
        self.minimalWindow.components.field1.text = str(endValue)

    def on_decrBtn_mouseClick(self, event):
        startValue = int(self.components.field1.text)
        endValue = startValue - 1
        self.components.field1.text = str(endValue)
        self.minimalWindow.components.field1.text = str(endValue)

Notice that we reference components in the child window by a collection of objects starting with the main application (self) and then pointing first to the child window, then to its components property, then to the specific component, then to the property of that component we wish to change. If we wanted to execute a method of that component or the background, we would use a similar construct.

This is obviously very simplistic, (not to mention somewhat redundant coding). Many times, you will be using a child window to modify components or data associated with the parent window. PythonCard is not passing events between windows in this release, but in many cases you can simply call the event handler directly. If you are interested in passing an arbitrary event such as a mouseClick, that will require creating the event and then posting it using wx.PostEvent. Custom events are beyond the scope of this tutorial. However, the child window is able to access the parent window directly by traversing up the stack of windows.

For example we can place a control on our child window that updates a control on our main background. Let's connect the Reset Counter button we added to the minimal application above. Add the following code to minimal.py

    def on_initialize(self, event):
        self.parent = self.getParent()

    def on_btnReset_mouseClick(self, event):
        self.parent.components.field1.text = "0"

When our child window it initialized, it calls getParent() to get a reference to its parent window, and then stores that reference. We place the code that handles this task in the on_initialize handler so that the reference is available to all handlers in the application.

You'll notice that the text field on the Counter background is reset to zero but the text field on the Minimal background is not. (This might be a little confusing because both fields are called 'field1'. In a real application, the fields should be named something more descriptive.) At this point, our minimal sample is no longer a stand-alone. If you run Minimal by itself, self.parent is set to None. If you were using the child window in other roles or wanted to make it multi-purpose, you could place the self.getParent() call in a try...except block.

Closing the Child Window

Your main application window will clean up the child window when your app is closed. If the user has the ability to close the child window before the main window closes (by using the the child's File->Exit menu or by clicking the close box on the window) it's a good idea to just hide the window instead of destroying it. This will allow you to unhide the window without re-initializing it and also permits you to communicate with the window while it is hidden. In the process, you avoid runtime errors that could result from the child window being non-existent as far as the application is concerned.

We do this by overriding the on_close event handler. on_close would normally destroy the window but we change it so it hides the window by setting the visible attribute to False, hiding the window. Just to make things a little more interesting, we've also added a custom doExit function that sets the counter's field1 to an arbitrary value just to confirm the connection between the two windows visibly:

    def doExit(self):
        self.parent.components.field1.text = "99"

    def on_close(self, event):
        self.doExit()
        self.visible = False

    def on_exit_command(self, event):
        self.close()

The resource file (minimal.rsrc.py) defines an exit command for the File->Exit menu so we use a command handler to override the default behavior. As the above code shows, the File->Exit menu item just calls the close() method to close the window. That is the same as clicking the close box on the window and triggers the close window event, so that on_close is called. We placed the work to be done when the document is closing in the doExit method. In this case it just sets the counter field in the parent to "99".

In addition, in doExit() you could modify some properties of the parent window to keep track of the state of your child window. For example, assuming you have a View menu with an item that hides or unhides your child window, you could use doExit() to check or uncheck the 'View Minimal Window' menu item on the parent. The code would look something like this:

        self.parent.menuBar.setChecked('menuViewMinimalWindow', False)

$Revision: 1.11 $ : $Author: kasplat $ : Last update $Date: 2005/12/30 06:29:36 $

PythonCard-0.8.2/docs/migration_guide.txt0000644000076500007650000001574010127117054020356 0ustar alexalex00000000000000=============== Migration Guide =============== Last changed 2004-08-25. Introduction ------------ The purpose of this guide is to help people migrate their programs written for PythonCardPrototype release 0.7.3.1 to release 0.8. For a complete list of changes, please refer to the changelog.txt file. All the samples and tools included with PythonCard have already been updated to the new API, so you can also look at that code for examples. Some of the documentation included with PythonCard may still refer to the older APIs. If you spot a mistake, please email me at altis@semi-retired.com and I will update the documentation for the next release. Version 0.8 is the first release on the way to finalizing the PythonCard API for a 1.0 release later this year or early 2005, whenever wxPython 2.6 is released. Like previous releases of the prototype package (PythonCardPrototype) you can expect changes from release to release until vesion 1.0 is done. One of the biggest changes to be aware of is that PythonCard is now keeping pace with each new wxPython release with the intent of basing the PythonCard 1.0 API on wxPython 2.6, thus the minimum requirements have been changed. wxPython 2.4.x will not be supported by PythonCard, there are simply too many changes and no effective way to maintain a code base that supports older wxPython releases. In addition, Python 2.2.x will not be supported. Minimum Requirements -------------------- Python 2.3 or later and wxPython 2.5.2.8 or later. Package Name Change ------------------- The main package name has changed from PythonCardPrototype to PythonCard. Since the package name has been changed it is possible to run older PythonCardPrototype programs even with the new package installed. Resource File Changes --------------------- The Stack class was removed, so the first line of your .rsrc.py file needs to have the 'stack' and 'Stack' strings replaced with 'application' and 'Application' as shown below. :: { 'stack':{ 'type':'Stack', to :: { 'application':{ 'type':'Application', In addition, in your source, self.stack.app references are now just self.application. PythonCardApp Class Renamed --------------------------- PythonCardApp was renamed to Application. The application initialization and startup code for your module will need to be updated to use the Application class. For example, here's the new code for the minimal sample. :: if __name__ == '__main__': app = model.Application(Minimal) app.MainLoop() Events ------ openBackground was renamed to initialize, so rename your on_openBackground event handlers to on_initialize. restore (inverse of minimize) and deactivate (inverse of activate) background window events were added. The event binding and dispatch system was completely rewritten and simplified for release 0.8. If you were using any of the internal event classes or relying on how events were bound and dispatched, you should double-check your code to make sure it still works. A complete discussion of the changes is not appropriate for this document, so please bring up any issues you have on the pythoncard-users mailing list. New-style Classes and Attributes (Properties) --------------------------------------------- wxPython now uses new-style classes. This allowed the PythonCard components to be changed to use the property() function for attributes instead of __getattr__ and __setattr__ methods. Once again, this dramatically simplified the framework sources for components. In addition, we were able to remove get/set methods for position, size, foregroundColor, backgroundColor, etc. in the Background and CustomDialog classes and replace those get/set methods with attributes. selection and stringSelection Attributes ---------------------------------------- The Choice, ComboBox, List, RadioGroup components were updated to use 'selection' and 'stringSelection' attributes instead of mixed-capability 'selected' and 'selection' attributes. If you were using these attributes previously, you will have to update both your source and resource files. The correct way to get the result of a selection now is to use either the attribute 'selection' to retrieve the integer index, or 'stringSelection' for the text value; if you previously used functions such as getSelection() or getSelectionIndex() or getStringSelection() these need to be changed to use the attributes directly. mixedCase Method Names ---------------------- All methods in PythonCard exposed to user code now use the mixedCase naming style to distinguish PythonCard methods from wxPython, which uses the CamelCase style for method names. In the PythonCard shell, the wxPython method names are suppressed in the auto-complete popup window. wx Import Change ---------------- All imports from the wxPython.wx package have been changed to use the new wx package. For example: :: from wxPython import wx has been changed to :: import wx The biggest impact is that the wx prefix is no longer used (e.g. wx.wxFrame is now wx.Frame) in the framework or samples except for wxPython constants. Module Names Changes -------------------- :: Old New ----------------------------- config.py configuration.py pom.py component.py res.py resource.py Added Modules ------------- timer.py contains a simple wx.Timer class wrapper. Deleted Modules --------------- dispatch.py Dialogs ------- The dialog module is now a thin wrapper around the wx.lib.dialogs module. The biggest change to your code is that the result of dialogs is now a DialogResults class instead of a dictionary. See the dialogs sample for examples of usage, but in general if you had something like result['accepted'] it will now be result.accepted. The order of the message and title args for any dialogs that take both has been reversed from previous versions of PythonCard. The message arg comes before title now. For example, :: dialog.singleChoiceDialog(self, "message", "title", ['one', 'two', 'three']) Any optional style args now use wx constants rather the old dialog module aliases. For example, you'll need to use wx.TE_PASSWORD or wx.TE_MULTILINE for the textEntryDialog if you want one of those styles. Calendar Component ------------------ The Calendar component was changed to use the CAL_SEQUENTIAL_MONTH_SELECTION style. A style attribute may need to be added to the Calendar component in future releases to allow different calendar styles to be used. Image Component --------------- PythonCard now uses wx.lib.statbmp.GenStaticBitmap on GTK for the Image component so that the Image component can get mouse events on all platforms. If you want to use a bitmap with transparency, then you'll also want to use the Image component to get the same appearance on all platforms. StatusBar --------- statusbar.StatusBar a direct subclass of wx.StatusBar so it is now possible to provide your own StatusBar subclass to use instead of the default. See the createStatusBar method in model.py Miscellaneous ------------- Renamed stc-styles.rc.cfg to stc-styles.cfg, but this shouldn't impact any user programs. PythonCard-0.8.2/docs/readme.txt0000644000076500007650000000233010110512154016424 0ustar alexalex00000000000000Readme for PythonCard PythonCard is a GUI construction kit for building cross-platform desktop applications on Windows, Mac OS X, and Linux, using the Python language. Place the "PythonCard" directory in your python directory or another directory on your PYTHONPATH. If you're running on a Unix/Linux system, you must unzip the release distribution with the -a option to convert the CR/LF line endings of each file to LF. For more information see the docs directory included with this distribution. Try the sample applications in the "samples" directory. Additional documentation may be available on the main web site between releases, so be sure to check the web site documentation page as well: http://pythoncard.sourceforge.net/documentation.html Latest release files: http://sourceforge.net/project/showfiles.php?group_id=19015 PythonCard home page http://pythoncard.sourceforge.net/ SourceForge summary page http://sourceforge.net/projects/pythoncard/ Mailing list http://lists.sourceforge.net/lists/listinfo/pythoncard-users PythonCard requires Python 2.3 or later and wxPython 2.5.2 or later. wxPython is available at http://www.wxpython.org/ Revision: $Revision: 1.15 $ Date: $Date: 2004/08/17 23:27:40 $ PythonCard-0.8.2/docs/samples.txt0000644000076500007650000000501210221714520016637 0ustar alexalex00000000000000This document is now supplemented by the online Sample Apps wiki page: http://wiki.wxpython.org/index.cgi/PythonCardSampleApps Descriptions of each of the samples included with the PythonCard are in the readme.txt file of each sample directory. Run samples.pyw in the samples directory and then you can easily launch each sample with or without runtime tools, view the description (readme.txt), source, and resource file of each sample. The main purpose of the samples is to "stress" the PythonCard framework and make sure that the framework is robust and full-featured, yet still simple for the beginner to use. "We learn by doing". As users (programmers) write more samples, we are able to identify which portions of the framework are missing, too simplistic or too complex or just plain broken. The PythonCard API changes as we identify these issues and fix the framework and the samples always represent the latest version of the API. We don't have a complete API yet, that is why we refer to the code as a PythonCard prototype. The ongoing list of things that needs to be added to PythonCard is on the PythonCard wiki To Do List page: http://wiki.wxpython.org/index.cgi/PythonCardToDoList There are some older Feature Requests here: http://sourceforge.net/tracker/?atid=369015&group_id=19015&func=browse You can also view this list using the SourceForgeTracker sample. It is essential that we create lots of samples to identify framework issues in order to avoid creating a framework only suitable for simplistic "toy" programs that are only one step beyond "hello world". Equally bad would be a framework that is too general and requires the user to do a lot of work just to write a basic program; simple programs should be simple to write; That is the reason we aren't forcing a model-view-controller (MVC) paradigm on the user, MVC is not easy to grasp or use correctly. The samples also serve as a learning tool. Since there is little documentation for PythonCard right now, the best way to learn to use PythonCard is to copy and modify the samples. Note that due to the current limitations of the framework, some samples use wxPython method calls directly. The wxPython calls can usually be identified via the method name which will start with a capital letter (e.g. GetSize instead of getSize). Please help the PythonCard project, by submitting your own samples and asking questions about PythonCard on the mailing list: http://lists.sourceforge.net/lists/listinfo/pythoncard-users Revision: $Revision: 1.8 $ Date: $Date: 2005/03/28 05:42:40 $ PythonCard-0.8.2/docs/tutorial.txt0000644000076500007650000000566107442054000017051 0ustar alexalex00000000000000Dan Shafer has provided a much better set of tutorials. See the documentation.html file in the docs\html directory. ka 2002-01-16 ---------- Here's a brief guide to writing a PythonCard app using the current prototype. What I do when starting a new app is copy the minimal directory (one of the samples), rename the directory, then rename minimal.py and minimal.rsrc.py. Open up the renamed minimal.rsrc.py which I'm including in whole here to simplify the discussion. Change the 'background' attributes 'name', 'title', 'size'; add 'position' if you want it. The if __name__ == '__main__': section of minimal.py is the same for all PythonCard samples, so there is no need to change that. You need to add import statements depending on what your app will do and whether you want to always use qualified module names such as model.Background. See the other samples, for examples of additional import statements. If you don't want a menubar, then that block can be removed from the .rsrc.py file. If you want additional menus and menu items such as an Edit menu like the one used in searchexplorer you can copy from some of the other samples, or just add your own. It is a good idea to run the app as you make changes to the .rsrc.py file so that you can see how the UI is progressing. If you're editing with a Python-aware editor like IDLE or PythonWin, then you can do a syntax check on the dictionary (the whole .rsrc.py file is one big dictionary) as you make changes, to make sure you didn't miss a comma or quote character and most editors will also match the blocks for you delimited by (), [], and {}. Once you start adding components and replace the 'TextField' component with your own, make sure to use meaningful names for each component; the component names must be unique. If you add a 'Button' you might give it a name like 'buttonRun' or 'btnRun' then in your code you can have a method handler like (assuming 'field1' still exists): def on_buttonRun_mouseClick(self, event): self.components.field1.text = 'My first PythonCard application' ka --- fragment of minimal.py class Minimal(model.Background): def on_menuFileExit_select(self, event): self.Close() --- minimal.rsrc.py { 'stack':{ 'type':'Stack', 'name':'Minimal', 'backgrounds': [ { 'type':'Background', 'name':'bgMin', 'title':'Minimal PythonCard Application', 'size':( 200, 100 ), 'menubar': { 'type':'MenuBar', 'menus': [ { 'type':'Menu', 'name':'menuFile', 'label':'File', 'items': [ { 'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt-X' } ] } ] }, 'components': [ { 'type':'TextField', 'name':'field1', 'position':(0, 0), 'text':'Hello PythonCard' }, ] } ] } } Revision: $Revision: 1.11 $ Date: $Date: 2002/03/08 06:19:44 $ PythonCard-0.8.2/documentation.py0000644000076500007650000002132010355045653016741 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.2 $" __date__ = "$Date: 2005/12/29 20:48:43 $" """ # the start of some functions to help generate documentation for PythonCard import inspect, os, time, inspect import wx from PythonCard import dialog # KEA 2002-05-07 # some methods to build up component documentation # using the built-in component specs def getAttributesList(attributes): names = [a for a in attributes] names.sort() listX = [] for n in names: if attributes[n].hasDefaultValueList(): listX.append([n, attributes[n].getDefaultValueList()]) else: value = attributes[n].getDefaultValue() if value == '': value = "''" listX.append([n, value]) return listX def getEventsList(objspec): events = [e.name for e in objspec.getEvents()] events.sort() return events def getMethodsList(obj): listX = [] methods = inspect.getmembers(obj, inspect.ismethod) for m in methods: if m[0][0] in "abcdefghijklmnopqrstuvwxyz": listX.append(m[0]) return listX def dumpDocs(self): result = dialog.directoryDialog(None, 'Create documention in:', '') if result.accepted: widgetsDir = result.path dumpBackgroundDocs(self, widgetsDir) # self.dumpComponentDocs(widgetsDir) def dumpBackgroundDocs(self, widgetsDir): w = self name = w.__class__.__name__ objspec = w._spec doc = '' doc += '\n%s\n' % (name + ': PythonCard Background') doc += '

Background: %s

' % name doc += '\n
\n' % ('images/' + name + '.png') doc += '\n

Required Attributes

\n' doc += '\n' doc += '\n' for a in getAttributesList(objspec.getRequiredAttributes()): doc += "\n" % (a[0], a[1]) doc += '
NameDefault value
%s%s
' doc += '\n\n

Optional Attributes

\n' doc += '\n' doc += '\n' for a in getAttributesList(objspec.getOptionalAttributes()): doc += "\n" % (a[0], a[1]) doc += '
NameDefault value
%s%s
' # KEA 2005-12-29 # Background spec still using default in spec.py so doesn't have # events defined like it should ## doc += '\n\n

Events:

\n' ## doc += '\n' ## for e in getEventsList(objspec): ## doc += "\n" % e ## doc += '
%s
' doc += '\n\n

Methods:

\n' doc += '\n' td = '' * 4 tr = '' + td + '\n' doc += tr % ('method', 'args', 'doc string', 'comments') for e in getMethodsList(w): method = getattr(w, e) docstring = inspect.getdoc(method) if docstring is None: docstring = " " comments = inspect.getcomments(method) if comments is None: comments = " " #source = inspect.getcomments(method) argspec = inspect.getargspec(method) formattedargs = inspect.formatargspec(argspec[0], argspec[1], argspec[2], argspec[3]) doc += "\n" % \ (e, formattedargs, docstring, comments) doc += '
%s
%s%s%s%s
' # write out the documentation for the component doc += '\n
SourceForge Logo' doc += '\n

Last updated: %s

' % time.strftime("%B %d, %Y") doc += '\n\n' filename = name + '.html' path = os.path.join(widgetsDir, filename) f = open(path, 'w') f.write(doc) f.close() def dumpComponentDocs(self, widgetsDir): widgetsDir = os.path.join(widgetsDir, 'components') if not os.path.exists(widgetsDir): os.mkdir(widgetsDir) imagesDir = os.path.join(widgetsDir, 'images') if not os.path.exists(imagesDir): os.mkdir(imagesDir) toc = '' toc += '\n%s\n' % 'PythonCard Components' toc += '

PythonCard Components

\n' componentsList = [] for w in self.components.itervalues(): if w.__class__.__name__.startswith(w.name[3:]): # document each widget name = w.__class__.__name__ objspec = w._spec doc = '' doc += '\n%s\n' % (name + ': PythonCard component') doc += '

Component: %s

' % name doc += '\n
\n' % ('images/' + name + '.png') doc += '\n

Required Attributes

\n' doc += '\n' doc += '\n' for a in getAttributesList(objspec.getRequiredAttributes()): doc += "\n" % (a[0], a[1]) doc += '
NameDefault value
%s%s
' doc += '\n\n

Optional Attributes

\n' doc += '\n' doc += '\n' for a in getAttributesList(objspec.getOptionalAttributes()): doc += "\n" % (a[0], a[1]) doc += '
NameDefault value
%s%s
' doc += '\n\n

Events:

\n' doc += '\n' for e in getEventsList(objspec): doc += "\n" % e doc += '
%s
' doc += '\n\n

Methods:

\n' doc += '\n' td = '' * 4 tr = '' + td + '\n' doc += tr % ('method', 'args', 'doc string', 'comments') for e in getMethodsList(w): method = getattr(w, e) docstring = inspect.getdoc(method) if docstring is None: docstring = " " comments = inspect.getcomments(method) if comments is None: comments = " " #source = inspect.getcomments(method) argspec = inspect.getargspec(method) formattedargs = inspect.formatargspec(argspec[0], argspec[1], argspec[2], argspec[3]) doc += "\n" % \ (e, formattedargs, docstring, comments) doc += '
%s
%s%s%s%s
' # need to decide what we want to dump from the methods # we probably don't want to dump everything including # wxPython methods, so this is where we need to decide # on the case of the first letter of the method # whatever is done here should be the same thing used # to display methods in the shell # arg lists and tooltips (docstrings) will be used here too # write out the documentation for the component doc += '\n
SourceForge Logo' doc += '\n

Last updated: %s

' % time.strftime("%B %d, %Y") doc += '\n\n' filename = name + '.html' path = os.path.join(widgetsDir, filename) f = open(path, 'w') f.write(doc) f.close() # create an image using the actual component # on screen # comment this out once you have created the images # you want bmp = wx.EmptyBitmap(w.size[0], w.size[1]) memdc = wx.MemoryDC() memdc.SelectObject(bmp) dc = wx.WindowDC(w) memdc.BlitPointSize((0, 0), w.size, dc, (0, 0)) imgfilename = os.path.join(imagesDir, name + '.png') bmp.SaveFile(imgfilename, wx.BITMAP_TYPE_PNG) dc = None memdc.SelectObject(wx.NullBitmap) memdc = None bmp = None componentsList.append('%s
\n' % (filename, name)) # now create the table of contents, index.html componentsList.sort() for c in componentsList: toc += c toc += '\n
SourceForge Logo' toc += '\n\n' filename = os.path.join(widgetsDir, 'index.html') f = open(filename, 'w') f.write(toc) f.close() PythonCard-0.8.2/error.py0000644000076500007650000000171010046062331015207 0ustar alexalex00000000000000""" __version__ = "$Revision: 1.2 $" __date__ = "$Date: 2004/05/05 03:51:53 $" """ class PythonCardException : def __init__( self, aValue ) : self._value = aValue def __str__(self) : return `self._value` class AbstractMethodException( PythonCardException ) : def __init__( self, aValue ) : PythonCardException.__init__( self, aValue ) ##class EventBindingException( PythonCardException ) : ## ## def __init__( self, aValue ) : ## PythonCardException.__init__( self, aValue ) ## ##class EventQueueException( PythonCardException ) : ## ## def __init__( self, aValue ) : ## PythonCardException.__init__( self, aValue ) class ResourceException( PythonCardException ) : def __init__( self, aValue ) : PythonCardException.__init__( self, aValue ) ##class HandlerException( PythonCardException ) : ## ## def __init__( self, aValue ) : ## PythonCardException.__init__( self, aValue ) PythonCard-0.8.2/event.py0000644000076500007650000003227710130367074015221 0ustar alexalex00000000000000""" __version__ = "$Revision: 1.70 $" __date__ = "$Date: 2004/10/05 00:43:40 $" """ import error import singleton import sys import wx callAfter = wx.CallAfter futureCall = wx.FutureCall class EventHandler: """ RDS - 2004-05-02 Future replacement for Handler. Maps a function name to an instance method. """ def __init__( self, method ) : # Grab the method object. self._method = method # Hold on to the full name. self._name = method.__name__ # Parse the function/method name. parts = self._name.split('_') # The 'on' prefix, i.e. on_button1_click self._prefix = parts[ 0 ] if len( parts ) == 3 : # The name of the Widget instance that is the target. self._sourceName = parts[ 1 ] # The Event class identifier. self._eventName = parts[ 2 ] else: # KEA 2001-09-06 # need to pass in the name of the Background subclass instance ? # RDS 2004-05-02 # What? self._sourceName = '' self._eventName = parts[ 1 ] def getName( self ) : return self._name def getSourceName( self ) : return self._sourceName def getEventName( self ) : return self._eventName def execute( self, event ) : """ RDS - 2004-05-02 Added to support new Scriptable design in component.Scriptable. Ask the Handler to execute itself instead of getting it's function and calling it. """ self._method( event ) def __repr__( self ) : return str( self.__dict__ ) # KEA 2004-05-04 # I don't think this is needed, but I'm leaving it in for now # with the previous code in model.py, widget.py, menu.py, and iehtmlwindow.py # that use Handler and getFunction() commented with the replacement # code in use ##class Handler: ## """ ## Maps a function name to a function, parsing the ## PythonCard-specific name into meaningful parts. ## """ ## def __init__(self, aFunctionObject): ## ## # Hold on to the full name. ## self._name = aFunctionObject.__name__ ## # Parse the function/method name. ## parts = self._name.split('_') ## # The 'on' prefix, i.e. on_button1_click ## self._prefix = parts[ 0 ] ## ## if len(parts) == 3: ## # The name of the Widget instance that is the target. ## self._sourceName = parts[ 1 ] ## # The Event class identifier. ## self._eventName = parts[ 2 ] ## else: ## # KEA 2001-09-06 ## # need to pass in the name of the Background subclass instance ? ## self._sourceName = '' ## self._eventName = parts[ 1 ] ## ## # Grab the function/method object. ## self._function = aFunctionObject ## ## def getName( self ) : ## return self._name ## ## def getSourceName( self ) : ## return self._sourceName ## ## def getEventName( self ) : ## return self._eventName ## ## def getFunction( self ) : ## """ ## RDS - 2004-05-02 ## Once we've switched to the new component.Scriptable ## design, remove this method and all references to it. ## """ ## return self._function ## ## def execute( self, target, event ) : ## """ ## RDS - 2004-05-02 ## Added to support new Scriptable design in ## component.Scriptable. Ask the Handler to ## execute itself instead of getting it's ## function and calling it. ## """ ## self._function( target, event ) ## ## def __repr__( self ) : ## return str( self.__dict__ ) class ChangeEvent : """ A ChangeEvent indicates that some attribute of and object has changed. The event carries a reference to the object, and the attribute value that changed. """ def __init__( self, aObject, aOldValue ) : """ Initialize this instance. """ self._object = aObject self._oldValue = aOldValue def getChangedObject( self ) : """ Get a reference to the object that was modified. """ return self._object def getOldValue( self ) : """ Get the old attribute value that changed. NOTE: We'll probably need to provide a getAttributeName() method to identify the actual value that changed within the object. """ return self._oldValue class ChangeListener : """ Defines an interface that must be implemented by classes that want to listen for ChangeEvents. """ def changed( self, aChangeEvent ) : """ Called by a Changeable object when it's contents are modified. """ raise error.AbstractMethodException( self.changed ) class Changeable : """ Defines an interface that must be implemented by classes that want to generate a notification when their contents change. """ def __init__( self ) : """ Initialize this instance. """ self._listeners = [] def addChangeEventListener( self, aChangeListener ) : """ Add a ChangeListener to this Changeable object's list of interested listeners. """ self._listeners.append( aChangeListener ) def fireChanged( self, oldValue ) : """ Broadcast a ChangeEvent to all registered ChangeListeners. """ evt = ChangeEvent( self, oldValue ) for listener in self._listeners : listener.changed( evt ) class EventSource( object ) : """ Provides support for adding event listeners and notifying listeners when an event occurs. """ def __init__( self ) : self._listeners = [] def addEventListener(self, listener): """ Add an EventListener as an observer of this object. """ if listener.__class__.__name__ == 'MessageWatcher': self._listeners.insert(0, listener) else: self._listeners.append(listener) # KEA 2004-04-24 # need this to disconnect the Message Watcher def removeEventListener(self, listener): self._listeners.remove(listener) def notifyEventListeners( self, event ) : """ Notify all of our EventListeners that an event has occured. """ for listener in self._listeners : listener.eventOccurred( event ) class EventListener : """ ABSTRACT INTERFACE Define an interface that clients can implement in order to act as observers of the EventQueue. """ # I don't know if it's possible to make a method # 'abstract' in python, i.e. specify that it MUST # be overridden? def eventOccurred( self, event ) : raise error.AbstractMethodException( self.eventOccurred ) # base event classes class Event : """ Superclass of all event classes. """ def decorate(self, aWxEvent, source): aWxEvent.target = aWxEvent.eventObject = source return aWxEvent # mixin for MouseClickEvent, SelectEvent # the classname can be changed, I just didn't want # to conflict with CommandEvent above class CommandTypeEvent: pass # mixin for RestoreEvent, DeactivateEvent, MouseDragEvent # CloseFieldEvent isn't virtual because # LoseFocus is still sent # probably need a better descriptor than "virtual" or "instead of" class InsteadOfTypeEvent: pass class MouseClickEvent(Event, CommandTypeEvent): name = 'mouseClick' class SelectEvent(Event, CommandTypeEvent): name = 'select' def decorate(self, aWxEvent, source): aWxEvent = Event.decorate(self, aWxEvent, source) try: aWxEvent.selection = aWxEvent.GetSelection() except: pass try: aWxEvent.stringSelection = aWxEvent.GetString() except: pass return aWxEvent # KEA 2004-05-09 # this is referenced in debug.py # and I don't want to create a circular import # with model.py, so I'm going to go ahead # and leave this in event.py # this might actually be better as an app level # event anyway, since I'm not sure every Background # should receive a separate idle event?! # need to test/experiment class IdleEvent(Event): name = 'idle' binding = wx.EVT_IDLE id = wx.wxEVT_IDLE # focus events class GainFocusEvent(Event): name = 'gainFocus' binding = wx.EVT_SET_FOCUS id = wx.wxEVT_SET_FOCUS class LoseFocusEvent(Event): name = 'loseFocus' binding = wx.EVT_KILL_FOCUS id = wx.wxEVT_KILL_FOCUS # timer event class TimerEvent(Event): name = 'timer' binding = wx.EVT_TIMER id = wx.wxEVT_TIMER def decorate(self, aWxEvent, source): aWxEvent = Event.decorate(self, aWxEvent, source) aWxEvent.interval = aWxEvent.GetInterval() return aWxEvent # key events and text update class KeyEvent(Event): def decorate(self, aWxEvent, source): aWxEvent = Event.decorate(self, aWxEvent, source) # this is basically the same block as MouseEvent.decorate # but it seems wrong to have KeyEvent be a subclass of MouseEvent aWxEvent.position = tuple(aWxEvent.GetPosition()) aWxEvent.x = aWxEvent.GetX() aWxEvent.y = aWxEvent.GetY() aWxEvent.altDown = aWxEvent.AltDown() aWxEvent.controlDown = aWxEvent.ControlDown() aWxEvent.shiftDown = aWxEvent.ShiftDown() aWxEvent.keyCode = aWxEvent.GetKeyCode() return aWxEvent class KeyDownEvent(KeyEvent): name = 'keyDown' binding = wx.EVT_KEY_DOWN id = wx.wxEVT_KEY_DOWN class KeyPressEvent(KeyEvent): name = 'keyPress' binding = wx.EVT_CHAR id = wx.wxEVT_CHAR class KeyUpEvent(KeyEvent): name = 'keyUp' binding = wx.EVT_KEY_UP id = wx.wxEVT_KEY_UP class TextEnterEvent( Event ) : name = 'textEnter' binding = wx.EVT_TEXT_ENTER id = wx.wxEVT_COMMAND_TEXT_ENTER class TextUpdateEvent( Event ) : name = 'textUpdate' binding = wx.EVT_TEXT id = wx.wxEVT_COMMAND_TEXT_UPDATED # mouse events class MouseEvent(Event): def decorate(self, aWxEvent, source): aWxEvent = Event.decorate(self, aWxEvent, source) aWxEvent.position = tuple(aWxEvent.GetPosition()) aWxEvent.x = aWxEvent.GetX() aWxEvent.y = aWxEvent.GetY() aWxEvent.altDown = aWxEvent.AltDown() aWxEvent.controlDown = aWxEvent.ControlDown() aWxEvent.shiftDown = aWxEvent.ShiftDown() return aWxEvent class MouseContextDoubleClickEvent(MouseEvent): name = 'mouseContextDoubleClick' binding = wx.EVT_RIGHT_DCLICK id = wx.wxEVT_RIGHT_DCLICK class MouseContextDownEvent(MouseEvent): name = 'mouseContextDown' binding = wx.EVT_RIGHT_DOWN id = wx.wxEVT_RIGHT_DOWN class MouseContextUpEvent(MouseEvent): name = 'mouseContextUp' binding = wx.EVT_RIGHT_UP id = wx.wxEVT_RIGHT_UP class MouseDoubleClickEvent(MouseEvent): name = 'mouseDoubleClick' binding = wx.EVT_LEFT_DCLICK id = wx.wxEVT_LEFT_DCLICK class MouseDownEvent(MouseEvent): name = 'mouseDown' binding = wx.EVT_LEFT_DOWN id = wx.wxEVT_LEFT_DOWN class MouseEnterEvent(MouseEvent): name = 'mouseEnter' binding = wx.EVT_ENTER_WINDOW id = wx.wxEVT_ENTER_WINDOW class MouseLeaveEvent(MouseEvent): name = 'mouseLeave' binding = wx.EVT_LEAVE_WINDOW id = wx.wxEVT_LEAVE_WINDOW class MouseMiddleDoubleClickEvent(MouseEvent): name = 'mouseMiddleDoubleClick' binding = wx.EVT_MIDDLE_DCLICK id = wx.wxEVT_MIDDLE_DCLICK class MouseMiddleDownEvent(MouseEvent): name = 'mouseMiddleDown' binding = wx.EVT_MIDDLE_DOWN id = wx.wxEVT_MIDDLE_DOWN class MouseMiddleUpEvent(MouseEvent): name = 'mouseMiddleUp' binding = wx.EVT_MIDDLE_UP id = wx.wxEVT_MIDDLE_UP class MouseMoveEvent(MouseEvent, InsteadOfTypeEvent): name = 'mouseMove' binding = wx.EVT_MOTION id = wx.wxEVT_MOTION def translateEventType(self, aWxEvent): if aWxEvent.Dragging(): return MouseDragEvent.id else: return self.id class MouseDragEvent(MouseMoveEvent): name = 'mouseDrag' id = wx.NewEventType() class MouseUpEvent(MouseEvent): name = 'mouseUp' binding = wx.EVT_LEFT_UP id = wx.wxEVT_LEFT_UP FOCUS_EVENTS = ( GainFocusEvent, LoseFocusEvent, ) MOUSE_EVENTS = ( MouseContextDoubleClickEvent, MouseContextDownEvent, MouseContextUpEvent, MouseDoubleClickEvent, MouseDownEvent, MouseDragEvent, MouseEnterEvent, MouseLeaveEvent, MouseMiddleDownEvent, MouseMiddleDoubleClickEvent, MouseMiddleUpEvent, MouseMoveEvent, MouseUpEvent, ) WIDGET_EVENTS = MOUSE_EVENTS + FOCUS_EVENTS + (TimerEvent,) class EventLog( singleton.Singleton, EventSource ) : """ All events are reported to the EventLog. Any interested parties may register as listeners. """ def __init__( self ) : singleton.Singleton.__init__( self ) EventSource.__init__( self ) def log( self, eventName, sourceName, used ) : """ Broadcast the event to all listeners. """ self.notifyEventListeners( ( eventName, sourceName, used ) ) PythonCard-0.8.2/EXIF.py0000644000076500007650000012173710223214467014633 0ustar alexalex00000000000000# Library to extract EXIF information in digital camera image files # # To use this library call with: # f=open(path_name, 'rb') # tags=EXIF.process_file(f) # tags will now be a dictionary mapping names of EXIF tags to their # values in the file named by path_name. You can process the tags # as you wish. In particular, you can iterate through all the tags with: # for tag in tags.keys(): # if tag not in ('JPEGThumbnail', 'TIFFThumbnail', 'Filename', # 'EXIF MakerNote'): # print "Key: %s, value %s" % (tag, tags[tag]) # (This code uses the if statement to avoid printing out a few of the # tags that tend to be long or boring.) # # The tags dictionary will include keys for all of the usual EXIF # tags, and will also include keys for Makernotes used by some # cameras, for which we have a good specification. # # Contains code from "exifdump.py" originally written by Thierry Bousch # and released into the public domain. # # Updated and turned into general-purpose library by Gene Cash # # # This copyright license is intended to be similar to the FreeBSD license. # # Copyright 2002 Gene Cash All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. 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. # # THIS SOFTWARE IS PROVIDED BY GENE CASH ``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 REGENTS 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. # # This means you may do anything you want with this code, except claim you # wrote it. Also, if it breaks you get to keep both pieces. # # Patch Contributors: # * Simon J. Gerraty # s2n fix & orientation decode # * John T. Riedl # Added support for newer Nikon type 3 Makernote format for D70 and some # other Nikon cameras. # * Joerg Schaefer # Fixed subtle bug when faking an EXIF header, which affected maker notes # using relative offsets, and a fix for Nikon D100. # # 21-AUG-99 TB Last update by Thierry Bousch to his code. # 17-JAN-02 CEC Discovered code on web. # Commented everything. # Made small code improvements. # Reformatted for readability. # 19-JAN-02 CEC Added ability to read TIFFs and JFIF-format JPEGs. # Added ability to extract JPEG formatted thumbnail. # Added ability to read GPS IFD (not tested). # Converted IFD data structure to dictionaries indexed by # tag name. # Factored into library returning dictionary of IFDs plus # thumbnail, if any. # 20-JAN-02 CEC Added MakerNote processing logic. # Added Olympus MakerNote. # Converted data structure to single-level dictionary, avoiding # tag name collisions by prefixing with IFD name. This makes # it much easier to use. # 23-JAN-02 CEC Trimmed nulls from end of string values. # 25-JAN-02 CEC Discovered JPEG thumbnail in Olympus TIFF MakerNote. # 26-JAN-02 CEC Added ability to extract TIFF thumbnails. # Added Nikon, Fujifilm, Casio MakerNotes. # 30-NOV-03 CEC Fixed problem with canon_decode_tag() not creating an # IFD_Tag() object. # 15-FEB-04 CEC Finally fixed bit shift warning by converting Y to 0L. # # field type descriptions as (length, abbreviation, full name) tuples FIELD_TYPES=( (0, 'X', 'Proprietary'), # no such type (1, 'B', 'Byte'), (1, 'A', 'ASCII'), (2, 'S', 'Short'), (4, 'L', 'Long'), (8, 'R', 'Ratio'), (1, 'SB', 'Signed Byte'), (1, 'U', 'Undefined'), (2, 'SS', 'Signed Short'), (4, 'SL', 'Signed Long'), (8, 'SR', 'Signed Ratio') ) # dictionary of main EXIF tag names # first element of tuple is tag name, optional second element is # another dictionary giving names to values EXIF_TAGS={ 0x0100: ('ImageWidth', ), 0x0101: ('ImageLength', ), 0x0102: ('BitsPerSample', ), 0x0103: ('Compression', {1: 'Uncompressed TIFF', 6: 'JPEG Compressed'}), 0x0106: ('PhotometricInterpretation', ), 0x010A: ('FillOrder', ), 0x010D: ('DocumentName', ), 0x010E: ('ImageDescription', ), 0x010F: ('Make', ), 0x0110: ('Model', ), 0x0111: ('StripOffsets', ), 0x0112: ('Orientation', {1: 'Horizontal (normal)', 2: 'Mirrored horizontal', 3: 'Rotated 180', 4: 'Mirrored vertical', 5: 'Mirrored horizontal then rotated 90 CCW', 6: 'Rotated 90 CW', 7: 'Mirrored horizontal then rotated 90 CW', 8: 'Rotated 90 CCW'}), 0x0115: ('SamplesPerPixel', ), 0x0116: ('RowsPerStrip', ), 0x0117: ('StripByteCounts', ), 0x011A: ('XResolution', ), 0x011B: ('YResolution', ), 0x011C: ('PlanarConfiguration', ), 0x0128: ('ResolutionUnit', {1: 'Not Absolute', 2: 'Pixels/Inch', 3: 'Pixels/Centimeter'}), 0x012D: ('TransferFunction', ), 0x0131: ('Software', ), 0x0132: ('DateTime', ), 0x013B: ('Artist', ), 0x013E: ('WhitePoint', ), 0x013F: ('PrimaryChromaticities', ), 0x0156: ('TransferRange', ), 0x0200: ('JPEGProc', ), 0x0201: ('JPEGInterchangeFormat', ), 0x0202: ('JPEGInterchangeFormatLength', ), 0x0211: ('YCbCrCoefficients', ), 0x0212: ('YCbCrSubSampling', ), 0x0213: ('YCbCrPositioning', ), 0x0214: ('ReferenceBlackWhite', ), 0x828D: ('CFARepeatPatternDim', ), 0x828E: ('CFAPattern', ), 0x828F: ('BatteryLevel', ), 0x8298: ('Copyright', ), 0x829A: ('ExposureTime', ), 0x829D: ('FNumber', ), 0x83BB: ('IPTC/NAA', ), 0x8769: ('ExifOffset', ), 0x8773: ('InterColorProfile', ), 0x8822: ('ExposureProgram', {0: 'Unidentified', 1: 'Manual', 2: 'Program Normal', 3: 'Aperture Priority', 4: 'Shutter Priority', 5: 'Program Creative', 6: 'Program Action', 7: 'Portrait Mode', 8: 'Landscape Mode'}), 0x8824: ('SpectralSensitivity', ), 0x8825: ('GPSInfo', ), 0x8827: ('ISOSpeedRatings', ), 0x8828: ('OECF', ), # print as string 0x9000: ('ExifVersion', lambda x: ''.join(map(chr, x))), 0x9003: ('DateTimeOriginal', ), 0x9004: ('DateTimeDigitized', ), 0x9101: ('ComponentsConfiguration', {0: '', 1: 'Y', 2: 'Cb', 3: 'Cr', 4: 'Red', 5: 'Green', 6: 'Blue'}), 0x9102: ('CompressedBitsPerPixel', ), 0x9201: ('ShutterSpeedValue', ), 0x9202: ('ApertureValue', ), 0x9203: ('BrightnessValue', ), 0x9204: ('ExposureBiasValue', ), 0x9205: ('MaxApertureValue', ), 0x9206: ('SubjectDistance', ), 0x9207: ('MeteringMode', {0: 'Unidentified', 1: 'Average', 2: 'CenterWeightedAverage', 3: 'Spot', 4: 'MultiSpot'}), 0x9208: ('LightSource', {0: 'Unknown', 1: 'Daylight', 2: 'Fluorescent', 3: 'Tungsten', 10: 'Flash', 17: 'Standard Light A', 18: 'Standard Light B', 19: 'Standard Light C', 20: 'D55', 21: 'D65', 22: 'D75', 255: 'Other'}), 0x9209: ('Flash', {0: 'No', 1: 'Fired', 5: 'Fired (?)', # no return sensed 7: 'Fired (!)', # return sensed 9: 'Fill Fired', 13: 'Fill Fired (?)', 15: 'Fill Fired (!)', 16: 'Off', 24: 'Auto Off', 25: 'Auto Fired', 29: 'Auto Fired (?)', 31: 'Auto Fired (!)', 32: 'Not Available'}), 0x920A: ('FocalLength', ), 0x927C: ('MakerNote', ), # print as string 0x9286: ('UserComment', lambda x: ''.join(map(chr, x))), 0x9290: ('SubSecTime', ), 0x9291: ('SubSecTimeOriginal', ), 0x9292: ('SubSecTimeDigitized', ), # print as string 0xA000: ('FlashPixVersion', lambda x: ''.join(map(chr, x))), 0xA001: ('ColorSpace', ), 0xA002: ('ExifImageWidth', ), 0xA003: ('ExifImageLength', ), 0xA005: ('InteroperabilityOffset', ), 0xA20B: ('FlashEnergy', ), # 0x920B in TIFF/EP 0xA20C: ('SpatialFrequencyResponse', ), # 0x920C - - 0xA20E: ('FocalPlaneXResolution', ), # 0x920E - - 0xA20F: ('FocalPlaneYResolution', ), # 0x920F - - 0xA210: ('FocalPlaneResolutionUnit', ), # 0x9210 - - 0xA214: ('SubjectLocation', ), # 0x9214 - - 0xA215: ('ExposureIndex', ), # 0x9215 - - 0xA217: ('SensingMethod', ), # 0x9217 - - 0xA300: ('FileSource', {3: 'Digital Camera'}), 0xA301: ('SceneType', {1: 'Directly Photographed'}), 0xA302: ('CVAPattern',), } # interoperability tags INTR_TAGS={ 0x0001: ('InteroperabilityIndex', ), 0x0002: ('InteroperabilityVersion', ), 0x1000: ('RelatedImageFileFormat', ), 0x1001: ('RelatedImageWidth', ), 0x1002: ('RelatedImageLength', ), } # GPS tags (not used yet, haven't seen camera with GPS) GPS_TAGS={ 0x0000: ('GPSVersionID', ), 0x0001: ('GPSLatitudeRef', ), 0x0002: ('GPSLatitude', ), 0x0003: ('GPSLongitudeRef', ), 0x0004: ('GPSLongitude', ), 0x0005: ('GPSAltitudeRef', ), 0x0006: ('GPSAltitude', ), 0x0007: ('GPSTimeStamp', ), 0x0008: ('GPSSatellites', ), 0x0009: ('GPSStatus', ), 0x000A: ('GPSMeasureMode', ), 0x000B: ('GPSDOP', ), 0x000C: ('GPSSpeedRef', ), 0x000D: ('GPSSpeed', ), 0x000E: ('GPSTrackRef', ), 0x000F: ('GPSTrack', ), 0x0010: ('GPSImgDirectionRef', ), 0x0011: ('GPSImgDirection', ), 0x0012: ('GPSMapDatum', ), 0x0013: ('GPSDestLatitudeRef', ), 0x0014: ('GPSDestLatitude', ), 0x0015: ('GPSDestLongitudeRef', ), 0x0016: ('GPSDestLongitude', ), 0x0017: ('GPSDestBearingRef', ), 0x0018: ('GPSDestBearing', ), 0x0019: ('GPSDestDistanceRef', ), 0x001A: ('GPSDestDistance', ) } # Nikon E99x MakerNote Tags # http://members.tripod.com/~tawba/990exif.htm MAKERNOTE_NIKON_NEWER_TAGS={ 0x0002: ('ISOSetting', ), 0x0003: ('ColorMode', ), 0x0004: ('Quality', ), 0x0005: ('Whitebalance', ), 0x0006: ('ImageSharpening', ), 0x0007: ('FocusMode', ), 0x0008: ('FlashSetting', ), 0x0009: ('AutoFlashMode', ), 0x000B: ('WhiteBalanceBias', ), 0x000C: ('WhiteBalanceRBCoeff', ), 0x000F: ('ISOSelection', ), 0x0012: ('FlashCompensation', ), 0x0013: ('ISOSpeedRequested', ), 0x0016: ('PhotoCornerCoordinates', ), 0x0018: ('FlashBracketCompensationApplied', ), 0x0019: ('AEBracketCompensationApplied', ), 0x0080: ('ImageAdjustment', ), 0x0081: ('ToneCompensation', ), 0x0082: ('AuxiliaryLens', ), 0x0083: ('LensType', ), 0x0084: ('LensMinMaxFocalMaxAperture', ), 0x0085: ('ManualFocusDistance', ), 0x0086: ('DigitalZoomFactor', ), 0x0088: ('AFFocusPosition', {0x0000: 'Center', 0x0100: 'Top', 0x0200: 'Bottom', 0x0300: 'Left', 0x0400: 'Right'}), 0x0089: ('BracketingMode', {0x00: 'Single frame, no bracketing', 0x01: 'Continuous, no bracketing', 0x02: 'Timer, no bracketing', 0x10: 'Single frame, exposure bracketing', 0x11: 'Continuous, exposure bracketing', 0x12: 'Timer, exposure bracketing', 0x40: 'Single frame, white balance bracketing', 0x41: 'Continuous, white balance bracketing', 0x42: 'Timer, white balance bracketing'}), 0x008D: ('ColorMode', ), 0x008F: ('SceneMode?', ), 0x0090: ('LightingType', ), 0x0092: ('HueAdjustment', ), 0x0094: ('Saturation', {-3: 'B&W', -2: '-2', -1: '-1', 0: '0', 1: '1', 2: '2'}), 0x0095: ('NoiseReduction', ), 0x00A7: ('TotalShutterReleases', ), 0x00A9: ('ImageOptimization', ), 0x00AA: ('Saturation', ), 0x00AB: ('DigitalVariProgram', ), 0x0010: ('DataDump', ) } MAKERNOTE_NIKON_OLDER_TAGS={ 0x0003: ('Quality', {1: 'VGA Basic', 2: 'VGA Normal', 3: 'VGA Fine', 4: 'SXGA Basic', 5: 'SXGA Normal', 6: 'SXGA Fine'}), 0x0004: ('ColorMode', {1: 'Color', 2: 'Monochrome'}), 0x0005: ('ImageAdjustment', {0: 'Normal', 1: 'Bright+', 2: 'Bright-', 3: 'Contrast+', 4: 'Contrast-'}), 0x0006: ('CCDSpeed', {0: 'ISO 80', 2: 'ISO 160', 4: 'ISO 320', 5: 'ISO 100'}), 0x0007: ('WhiteBalance', {0: 'Auto', 1: 'Preset', 2: 'Daylight', 3: 'Incandescent', 4: 'Fluorescent', 5: 'Cloudy', 6: 'Speed Light'}) } # decode Olympus SpecialMode tag in MakerNote def olympus_special_mode(v): a={ 0: 'Normal', 1: 'Unknown', 2: 'Fast', 3: 'Panorama'} b={ 0: 'Non-panoramic', 1: 'Left to right', 2: 'Right to left', 3: 'Bottom to top', 4: 'Top to bottom'} return '%s - sequence %d - %s' % (a[v[0]], v[1], b[v[2]]) MAKERNOTE_OLYMPUS_TAGS={ # ah HAH! those sneeeeeaky bastids! this is how they get past the fact # that a JPEG thumbnail is not allowed in an uncompressed TIFF file 0x0100: ('JPEGThumbnail', ), 0x0200: ('SpecialMode', olympus_special_mode), 0x0201: ('JPEGQual', {1: 'SQ', 2: 'HQ', 3: 'SHQ'}), 0x0202: ('Macro', {0: 'Normal', 1: 'Macro'}), 0x0204: ('DigitalZoom', ), 0x0207: ('SoftwareRelease', ), 0x0208: ('PictureInfo', ), # print as string 0x0209: ('CameraID', lambda x: ''.join(map(chr, x))), 0x0F00: ('DataDump', ) } MAKERNOTE_CASIO_TAGS={ 0x0001: ('RecordingMode', {1: 'Single Shutter', 2: 'Panorama', 3: 'Night Scene', 4: 'Portrait', 5: 'Landscape'}), 0x0002: ('Quality', {1: 'Economy', 2: 'Normal', 3: 'Fine'}), 0x0003: ('FocusingMode', {2: 'Macro', 3: 'Auto Focus', 4: 'Manual Focus', 5: 'Infinity'}), 0x0004: ('FlashMode', {1: 'Auto', 2: 'On', 3: 'Off', 4: 'Red Eye Reduction'}), 0x0005: ('FlashIntensity', {11: 'Weak', 13: 'Normal', 15: 'Strong'}), 0x0006: ('Object Distance', ), 0x0007: ('WhiteBalance', {1: 'Auto', 2: 'Tungsten', 3: 'Daylight', 4: 'Fluorescent', 5: 'Shade', 129: 'Manual'}), 0x000B: ('Sharpness', {0: 'Normal', 1: 'Soft', 2: 'Hard'}), 0x000C: ('Contrast', {0: 'Normal', 1: 'Low', 2: 'High'}), 0x000D: ('Saturation', {0: 'Normal', 1: 'Low', 2: 'High'}), 0x0014: ('CCDSpeed', {64: 'Normal', 80: 'Normal', 100: 'High', 125: '+1.0', 244: '+3.0', 250: '+2.0',}) } MAKERNOTE_FUJIFILM_TAGS={ 0x0000: ('NoteVersion', lambda x: ''.join(map(chr, x))), 0x1000: ('Quality', ), 0x1001: ('Sharpness', {1: 'Soft', 2: 'Soft', 3: 'Normal', 4: 'Hard', 5: 'Hard'}), 0x1002: ('WhiteBalance', {0: 'Auto', 256: 'Daylight', 512: 'Cloudy', 768: 'DaylightColor-Fluorescent', 769: 'DaywhiteColor-Fluorescent', 770: 'White-Fluorescent', 1024: 'Incandescent', 3840: 'Custom'}), 0x1003: ('Color', {0: 'Normal', 256: 'High', 512: 'Low'}), 0x1004: ('Tone', {0: 'Normal', 256: 'High', 512: 'Low'}), 0x1010: ('FlashMode', {0: 'Auto', 1: 'On', 2: 'Off', 3: 'Red Eye Reduction'}), 0x1011: ('FlashStrength', ), 0x1020: ('Macro', {0: 'Off', 1: 'On'}), 0x1021: ('FocusMode', {0: 'Auto', 1: 'Manual'}), 0x1030: ('SlowSync', {0: 'Off', 1: 'On'}), 0x1031: ('PictureMode', {0: 'Auto', 1: 'Portrait', 2: 'Landscape', 4: 'Sports', 5: 'Night', 6: 'Program AE', 256: 'Aperture Priority AE', 512: 'Shutter Priority AE', 768: 'Manual Exposure'}), 0x1100: ('MotorOrBracket', {0: 'Off', 1: 'On'}), 0x1300: ('BlurWarning', {0: 'Off', 1: 'On'}), 0x1301: ('FocusWarning', {0: 'Off', 1: 'On'}), 0x1302: ('AEWarning', {0: 'Off', 1: 'On'}) } MAKERNOTE_CANON_TAGS={ 0x0006: ('ImageType', ), 0x0007: ('FirmwareVersion', ), 0x0008: ('ImageNumber', ), 0x0009: ('OwnerName', ) } # see http://www.burren.cx/david/canon.html by David Burren # this is in element offset, name, optional value dictionary format MAKERNOTE_CANON_TAG_0x001={ 1: ('Macromode', {1: 'Macro', 2: 'Normal'}), 2: ('SelfTimer', ), 3: ('Quality', {2: 'Normal', 3: 'Fine', 5: 'Superfine'}), 4: ('FlashMode', {0: 'Flash Not Fired', 1: 'Auto', 2: 'On', 3: 'Red-Eye Reduction', 4: 'Slow Synchro', 5: 'Auto + Red-Eye Reduction', 6: 'On + Red-Eye Reduction', 16: 'external flash'}), 5: ('ContinuousDriveMode', {0: 'Single Or Timer', 1: 'Continuous'}), 7: ('FocusMode', {0: 'One-Shot', 1: 'AI Servo', 2: 'AI Focus', 3: 'MF', 4: 'Single', 5: 'Continuous', 6: 'MF'}), 10: ('ImageSize', {0: 'Large', 1: 'Medium', 2: 'Small'}), 11: ('EasyShootingMode', {0: 'Full Auto', 1: 'Manual', 2: 'Landscape', 3: 'Fast Shutter', 4: 'Slow Shutter', 5: 'Night', 6: 'B&W', 7: 'Sepia', 8: 'Portrait', 9: 'Sports', 10: 'Macro/Close-Up', 11: 'Pan Focus'}), 12: ('DigitalZoom', {0: 'None', 1: '2x', 2: '4x'}), 13: ('Contrast', {0xFFFF: 'Low', 0: 'Normal', 1: 'High'}), 14: ('Saturation', {0xFFFF: 'Low', 0: 'Normal', 1: 'High'}), 15: ('Sharpness', {0xFFFF: 'Low', 0: 'Normal', 1: 'High'}), 16: ('ISO', {0: 'See ISOSpeedRatings Tag', 15: 'Auto', 16: '50', 17: '100', 18: '200', 19: '400'}), 17: ('MeteringMode', {3: 'Evaluative', 4: 'Partial', 5: 'Center-weighted'}), 18: ('FocusType', {0: 'Manual', 1: 'Auto', 3: 'Close-Up (Macro)', 8: 'Locked (Pan Mode)'}), 19: ('AFPointSelected', {0x3000: 'None (MF)', 0x3001: 'Auto-Selected', 0x3002: 'Right', 0x3003: 'Center', 0x3004: 'Left'}), 20: ('ExposureMode', {0: 'Easy Shooting', 1: 'Program', 2: 'Tv-priority', 3: 'Av-priority', 4: 'Manual', 5: 'A-DEP'}), 23: ('LongFocalLengthOfLensInFocalUnits', ), 24: ('ShortFocalLengthOfLensInFocalUnits', ), 25: ('FocalUnitsPerMM', ), 28: ('FlashActivity', {0: 'Did Not Fire', 1: 'Fired'}), 29: ('FlashDetails', {14: 'External E-TTL', 13: 'Internal Flash', 11: 'FP Sync Used', 7: '2nd("Rear")-Curtain Sync Used', 4: 'FP Sync Enabled'}), 32: ('FocusMode', {0: 'Single', 1: 'Continuous'}) } MAKERNOTE_CANON_TAG_0x004={ 7: ('WhiteBalance', {0: 'Auto', 1: 'Sunny', 2: 'Cloudy', 3: 'Tungsten', 4: 'Fluorescent', 5: 'Flash', 6: 'Custom'}), 9: ('SequenceNumber', ), 14: ('AFPointUsed', ), 15: ('FlashBias', {0XFFC0: '-2 EV', 0XFFCC: '-1.67 EV', 0XFFD0: '-1.50 EV', 0XFFD4: '-1.33 EV', 0XFFE0: '-1 EV', 0XFFEC: '-0.67 EV', 0XFFF0: '-0.50 EV', 0XFFF4: '-0.33 EV', 0X0000: '0 EV', 0X000C: '0.33 EV', 0X0010: '0.50 EV', 0X0014: '0.67 EV', 0X0020: '1 EV', 0X002C: '1.33 EV', 0X0030: '1.50 EV', 0X0034: '1.67 EV', 0X0040: '2 EV'}), 19: ('SubjectDistance', ) } # extract multibyte integer in Motorola format (little endian) def s2n_motorola(str): x=0 for c in str: x=(x << 8) | ord(c) return x # extract multibyte integer in Intel format (big endian) def s2n_intel(str): x=0 y=0L for c in str: x=x | (ord(c) << y) y=y+8 return x # ratio object that eventually will be able to reduce itself to lowest # common denominator for printing def gcd(a, b): if b == 0: return a else: return gcd(b, a % b) class Ratio: def __init__(self, num, den): self.num=num self.den=den def __repr__(self): self.reduce() if self.den == 1: return str(self.num) return '%d/%d' % (self.num, self.den) def reduce(self): div=gcd(self.num, self.den) if div > 1: self.num=self.num/div self.den=self.den/div # for ease of dealing with tags class IFD_Tag: def __init__(self, printable, tag, field_type, values, field_offset, field_length): # printable version of data self.printable=printable # tag ID number self.tag=tag # field type as index into FIELD_TYPES self.field_type=field_type # offset of start of field in bytes from beginning of IFD self.field_offset=field_offset # length of data field in bytes self.field_length=field_length # either a string or array of data items self.values=values def __str__(self): return self.printable def __repr__(self): return '(0x%04X) %s=%s @ %d' % (self.tag, FIELD_TYPES[self.field_type][2], self.printable, self.field_offset) # class that handles an EXIF header class EXIF_header: def __init__(self, file, endian, offset, fake_exif, debug=0): self.file=file self.endian=endian self.offset=offset self.fake_exif=fake_exif self.debug=debug self.tags={} # convert slice to integer, based on sign and endian flags # usually this offset is assumed to be relative to the beginning of the # start of the EXIF information. For some cameras that use relative tags, # this offset may be relative to some other starting point. def s2n(self, offset, length, signed=0): self.file.seek(self.offset+offset) slice=self.file.read(length) if self.endian == 'I': val=s2n_intel(slice) else: val=s2n_motorola(slice) # Sign extension ? if signed: msb=1L << (8*length-1) if val & msb: val=val-(msb << 1) return val # convert offset to string def n2s(self, offset, length): s='' for i in range(length): if self.endian == 'I': s=s+chr(offset & 0xFF) else: s=chr(offset & 0xFF)+s offset=offset >> 8 return s # return first IFD def first_IFD(self): return self.s2n(4, 4) # return pointer to next IFD def next_IFD(self, ifd): entries=self.s2n(ifd, 2) return self.s2n(ifd+2+12*entries, 4) # return list of IFDs in header def list_IFDs(self): i=self.first_IFD() a=[] while i: a.append(i) i=self.next_IFD(i) return a # return list of entries in this IFD def dump_IFD(self, ifd, ifd_name, dict=EXIF_TAGS, relative=0): entries=self.s2n(ifd, 2) for i in range(entries): # entry is index of start of this IFD in the file entry=ifd+2+12*i tag=self.s2n(entry, 2) # get tag name. We do it early to make debugging easier tag_entry=dict.get(tag) if tag_entry: tag_name=tag_entry[0] else: tag_name='Tag 0x%04X' % tag field_type=self.s2n(entry+2, 2) if not 0 < field_type < len(FIELD_TYPES): # unknown field type raise ValueError, \ 'unknown type %d in tag 0x%04X' % (field_type, tag) typelen=FIELD_TYPES[field_type][0] count=self.s2n(entry+4, 4) offset=entry+8 if count*typelen > 4: # offset is not the value; it's a pointer to the value # if relative we set things up so s2n will seek to the right # place when it adds self.offset. Note that this 'relative' # is for the Nikon type 3 makernote. Other cameras may use # other relative offsets, which would have to be computed here # slightly differently. if relative: tmp_offset=self.s2n(offset, 4) offset=tmp_offset+ifd-self.offset+4 if self.fake_exif: offset=offset+18 else: offset=self.s2n(offset, 4) field_offset=offset if field_type == 2: # special case: null-terminated ASCII string if count != 0: self.file.seek(self.offset+offset) values=self.file.read(count) values=values.strip().replace('\x00','') else: values='' else: values=[] signed=(field_type in [6, 8, 9, 10]) for j in range(count): if field_type in (5, 10): # a ratio value_j=Ratio(self.s2n(offset, 4, signed), self.s2n(offset+4, 4, signed)) else: value_j=self.s2n(offset, typelen, signed) values.append(value_j) offset=offset+typelen # now "values" is either a string or an array if count == 1 and field_type != 2: printable=str(values[0]) else: printable=str(values) # compute printable version of values if tag_entry: if len(tag_entry) != 1: # optional 2nd tag element is present if callable(tag_entry[1]): # call mapping function printable=tag_entry[1](values) else: printable='' for i in values: # use lookup table for this tag printable+=tag_entry[1].get(i, repr(i)) self.tags[ifd_name+' '+tag_name]=IFD_Tag(printable, tag, field_type, values, field_offset, count*typelen) if self.debug: print ' debug: %s: %s' % (tag_name, repr(self.tags[ifd_name+' '+tag_name])) # extract uncompressed TIFF thumbnail (like pulling teeth) # we take advantage of the pre-existing layout in the thumbnail IFD as # much as possible def extract_TIFF_thumbnail(self, thumb_ifd): entries=self.s2n(thumb_ifd, 2) # this is header plus offset to IFD ... if self.endian == 'M': tiff='MM\x00*\x00\x00\x00\x08' else: tiff='II*\x00\x08\x00\x00\x00' # ... plus thumbnail IFD data plus a null "next IFD" pointer self.file.seek(self.offset+thumb_ifd) tiff+=self.file.read(entries*12+2)+'\x00\x00\x00\x00' # fix up large value offset pointers into data area for i in range(entries): entry=thumb_ifd+2+12*i tag=self.s2n(entry, 2) field_type=self.s2n(entry+2, 2) typelen=FIELD_TYPES[field_type][0] count=self.s2n(entry+4, 4) oldoff=self.s2n(entry+8, 4) # start of the 4-byte pointer area in entry ptr=i*12+18 # remember strip offsets location if tag == 0x0111: strip_off=ptr strip_len=count*typelen # is it in the data area? if count*typelen > 4: # update offset pointer (nasty "strings are immutable" crap) # should be able to say "tiff[ptr:ptr+4]=newoff" newoff=len(tiff) tiff=tiff[:ptr]+self.n2s(newoff, 4)+tiff[ptr+4:] # remember strip offsets location if tag == 0x0111: strip_off=newoff strip_len=4 # get original data and store it self.file.seek(self.offset+oldoff) tiff+=self.file.read(count*typelen) # add pixel strips and update strip offset info old_offsets=self.tags['Thumbnail StripOffsets'].values old_counts=self.tags['Thumbnail StripByteCounts'].values for i in range(len(old_offsets)): # update offset pointer (more nasty "strings are immutable" crap) offset=self.n2s(len(tiff), strip_len) tiff=tiff[:strip_off]+offset+tiff[strip_off+strip_len:] strip_off+=strip_len # add pixel strip to end self.file.seek(self.offset+old_offsets[i]) tiff+=self.file.read(old_counts[i]) self.tags['TIFFThumbnail']=tiff # decode all the camera-specific MakerNote formats # Note is the data that comprises this MakerNote. The MakerNote will # likely have pointers in it that point to other parts of the file. We'll # use self.offset as the starting point for most of those pointers, since # they are relative to the beginning of the file. # # If the MakerNote is in a newer format, it may use relative addressing # within the MakerNote. In that case we'll use relative addresses for the # pointers. # # As an aside: it's not just to be annoying that the manufacturers use # relative offsets. It's so that if the makernote has to be moved by the # picture software all of the offsets don't have to be adjusted. Overall, # this is probably the right strategy for makernotes, though the spec is # ambiguous. (The spec does not appear to imagine that makernotes would # follow EXIF format internally. Once they did, it's ambiguous whether # the offsets should be from the header at the start of all the EXIF info, # or from the header at the start of the makernote.) def decode_maker_note(self): note=self.tags['EXIF MakerNote'] make=self.tags['Image Make'].printable model=self.tags['Image Model'].printable # Nikon # The maker note usually starts with the word Nikon, followed by the # type of the makernote (1 or 2, as a short). If the word Nikon is # not at the start of the makernote, it's probably type 2, since some # cameras work that way. if make in ('NIKON', 'NIKON CORPORATION'): if note.values[0:7] == [78, 105, 107, 111, 110, 00, 01]: if self.debug: print "Looks like a type 1 Nikon MakerNote." self.dump_IFD(note.field_offset+8, 'MakerNote', dict=MAKERNOTE_NIKON_OLDER_TAGS) elif note.values[0:7] == [78, 105, 107, 111, 110, 00, 02]: if self.debug: print "Looks like a labeled type 2 Nikon MakerNote" if note.values[12:14] != [0, 42] and note.values[12:14] != [42L, 0L]: raise ValueError, "Missing marker tag '42' in MakerNote." # skip the Makernote label and the TIFF header self.dump_IFD(note.field_offset+10+8, 'MakerNote', dict=MAKERNOTE_NIKON_NEWER_TAGS, relative=1) else: # E99x or D1 if self.debug: print "Looks like an unlabeled type 2 Nikon MakerNote" self.dump_IFD(note.field_offset, 'MakerNote', dict=MAKERNOTE_NIKON_NEWER_TAGS) return # Olympus if make[:7] == 'OLYMPUS': self.dump_IFD(note.field_offset+8, 'MakerNote', dict=MAKERNOTE_OLYMPUS_TAGS) return # Casio if make == 'Casio': self.dump_IFD(note.field_offset, 'MakerNote', dict=MAKERNOTE_CASIO_TAGS) return # Fujifilm if make == 'FUJIFILM': # bug: everything else is "Motorola" endian, but the MakerNote # is "Intel" endian endian=self.endian self.endian='I' # bug: IFD offsets are from beginning of MakerNote, not # beginning of file header offset=self.offset self.offset+=note.field_offset # process note with bogus values (note is actually at offset 12) self.dump_IFD(12, 'MakerNote', dict=MAKERNOTE_FUJIFILM_TAGS) # reset to correct values self.endian=endian self.offset=offset return # Canon if make == 'Canon': self.dump_IFD(note.field_offset, 'MakerNote', dict=MAKERNOTE_CANON_TAGS) for i in (('MakerNote Tag 0x0001', MAKERNOTE_CANON_TAG_0x001), ('MakerNote Tag 0x0004', MAKERNOTE_CANON_TAG_0x004)): self.canon_decode_tag(self.tags[i[0]].values, i[1]) return # decode Canon MakerNote tag based on offset within tag # see http://www.burren.cx/david/canon.html by David Burren def canon_decode_tag(self, value, dict): for i in range(1, len(value)): x=dict.get(i, ('Unknown', )) if self.debug: print i, x name=x[0] if len(x) > 1: val=x[1].get(value[i], 'Unknown') else: val=value[i] # it's not a real IFD Tag but we fake one to make everybody # happy. this will have a "proprietary" type self.tags['MakerNote '+name]=IFD_Tag(str(val), None, 0, None, None, None) # process an image file (expects an open file object) # this is the function that has to deal with all the arbitrary nasty bits # of the EXIF standard def process_file(file, debug=0): # determine whether it's a JPEG or TIFF data=file.read(12) if data[0:4] in ['II*\x00', 'MM\x00*']: # it's a TIFF file file.seek(0) endian=file.read(1) file.read(1) offset=0 elif data[0:2] == '\xFF\xD8': # it's a JPEG file # skip JFIF style header(s) fake_exif=0 while data[2] == '\xFF' and data[6:10] in ('JFIF', 'JFXX', 'OLYM'): length=ord(data[4])*256+ord(data[5]) file.read(length-8) # fake an EXIF beginning of file data='\xFF\x00'+file.read(10) fake_exif=1 if data[2] == '\xFF' and data[6:10] == 'Exif': # detected EXIF header offset=file.tell() endian=file.read(1) else: # no EXIF information return {} else: # file format not recognized return {} # deal with the EXIF info we found if debug: print {'I': 'Intel', 'M': 'Motorola'}[endian], 'format' hdr=EXIF_header(file, endian, offset, fake_exif, debug) ifd_list=hdr.list_IFDs() ctr=0 for i in ifd_list: if ctr == 0: IFD_name='Image' elif ctr == 1: IFD_name='Thumbnail' thumb_ifd=i else: IFD_name='IFD %d' % ctr if debug: print ' IFD %d (%s) at offset %d:' % (ctr, IFD_name, i) hdr.dump_IFD(i, IFD_name) # EXIF IFD exif_off=hdr.tags.get(IFD_name+' ExifOffset') if exif_off: if debug: print ' EXIF SubIFD at offset %d:' % exif_off.values[0] hdr.dump_IFD(exif_off.values[0], 'EXIF') # Interoperability IFD contained in EXIF IFD intr_off=hdr.tags.get('EXIF SubIFD InteroperabilityOffset') if intr_off: if debug: print ' EXIF Interoperability SubSubIFD at offset %d:' \ % intr_off.values[0] hdr.dump_IFD(intr_off.values[0], 'EXIF Interoperability', dict=INTR_TAGS) # GPS IFD gps_off=hdr.tags.get(IFD_name+' GPSInfo') if gps_off: if debug: print ' GPS SubIFD at offset %d:' % gps_off.values[0] hdr.dump_IFD(gps_off.values[0], 'GPS', dict=GPS_TAGS) ctr+=1 # extract uncompressed TIFF thumbnail thumb=hdr.tags.get('Thumbnail Compression') if thumb and thumb.printable == 'Uncompressed TIFF': hdr.extract_TIFF_thumbnail(thumb_ifd) # JPEG thumbnail (thankfully the JPEG data is stored as a unit) thumb_off=hdr.tags.get('Thumbnail JPEGInterchangeFormat') if thumb_off: file.seek(offset+thumb_off.values[0]) size=hdr.tags['Thumbnail JPEGInterchangeFormatLength'].values[0] hdr.tags['JPEGThumbnail']=file.read(size) # deal with MakerNote contained in EXIF IFD if hdr.tags.has_key('EXIF MakerNote'): hdr.decode_maker_note() # Sometimes in a TIFF file, a JPEG thumbnail is hidden in the MakerNote # since it's not allowed in a uncompressed TIFF IFD if not hdr.tags.has_key('JPEGThumbnail'): thumb_off=hdr.tags.get('MakerNote JPEGThumbnail') if thumb_off: file.seek(offset+thumb_off.values[0]) hdr.tags['JPEGThumbnail']=file.read(thumb_off.field_length) return hdr.tags # library test/debug function (dump given files) if __name__ == '__main__': import sys if len(sys.argv) < 2: print 'Usage: %s files...\n' % sys.argv[0] sys.exit(0) for filename in sys.argv[1:]: try: file=open(filename, 'rb') except: print filename, 'unreadable' print continue print filename+':' # data=process_file(file, 1) # with debug info data=process_file(file) if not data: print 'No EXIF information found' continue x=data.keys() x.sort() for i in x: if i in ('JPEGThumbnail', 'TIFFThumbnail'): continue try: print ' %s (%s): %s' % \ (i, FIELD_TYPES[data[i].field_type][2], data[i].printable) except: print 'error', i, '"', data[i], '"' if data.has_key('JPEGThumbnail'): print 'File has JPEG thumbnail' print PythonCard-0.8.2/flatfileDatabase.py0000644000076500007650000010733310175146704017313 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.26 $" __date__ = "$Date: 2005/01/24 10:28:20 $" flatfileDatabase was derived from the addresses sample. """ import wx from PythonCard import dialog, log, model, util import os, sys import ConfigParser import pprint import cPickle import time from templates.dialogs import findDialog CONFIG_FILE = 'flatfileDatabase.ini' IGNORE_PREFIX = 'ignore' """ The Document class below has a reference to the view, so it is responsible for updating the fields in the view. There should be an abstract Document class, an abstract RecordsDocument subclass and finally a DictionaryRecordsDocument or a name that reflects that the actual records are stored as a list of dictionaries. If the Document was stored as a DBM or dictionary of dictionaries then an additional field would be needed to keep track of record order and goPrevRecord, goNextRecord, goFirstRecord, and goLastRecord would have to be modified to use that ordering. """ # KEA 2002-06-24 # adapted from the "A sorted list" topic at: # http://www.faqts.com/knowledge_base/index.phtml/fid/540 # KEA 2002-07-18 # no longer using SortableList # but I won't remove it until we're sure it isn't needed from UserList import UserList class SortableList(UserList): def __init__(self, listX=None): self.fieldName = None self.fieldType = None self.data = [] if listX is not None: for item in listX: self.append(item) def sort(self, *args): """ Sort according to *our* rules. """ self.data.sort(self.cmp) # need to decide on what types of sort to support # besides a case-insensitive alphabetical sort def cmp(self, a, b): """ Define your own sorting routine here. """ if self.fieldName is None: return 0 try: if self.fieldType == 'string': a = a[self.fieldName].lower() b = b[self.fieldName].lower() elif self.fieldType == 'numeric': a = float(a[self.fieldName]) b = float(b[self.fieldName]) except: # if for some reason the fields don't exist # then use dummy values a = None b = None # print "a:", a, "b:", b return cmp(a,b) class Document: def __init__(self, view, filename=None): self.view = view self.documentChanged = 0 # KEA 2002-07-02 # there could be a flag to autosave every time # a record changes, so saveRecord would call saveFile # that should be more like HyperCard and since data # probably doesn't change that often # the delay introduced shouldn't be that bad # maybe saves could be done in a separate thread?! self.saveDocumentOnRecordChange = 1 self.current = -1 self.fieldTypes = {'date':['Calendar'], 'boolean':['CheckBox'], 'integer':['Slider', 'Spinner'], 'list':['Choice', 'List', 'RadioGroup'], 'string':['CodeEditor', 'PasswordField', 'TextField', 'TextArea'] } self.allFieldTypes = [] for value in self.fieldTypes.itervalues(): self.allFieldTypes += value self.fieldNames = self.getFieldNames() self.searchableFields = self.getSearchableFields() self.sortableFields = self.getSortableFields() if filename is None: #self.records = SortableList() self.records = [] else: self.filename = filename self.openFile(filename) def getFieldType(self, name): fieldType = None fieldName = self.view.components[name].__class__.__name__ for key, value in self.fieldTypes.iteritems(): if fieldName in value: fieldType = key break return fieldType """ This should probably be a list supplied as part of initialization. There might also be a list for field order and fields to search. There isn't any meta-data at this point, so there isn't field type info either. """ def getFieldNames(self): fields = [] for wName in self.view.components.order: if not wName.startswith(IGNORE_PREFIX): widget = self.view.components[wName] wClass = widget.__class__.__name__ if wClass in self.allFieldTypes: fields.append(wName) return fields def getSearchableFields(self): fields = [] for name in self.fieldNames: if self.getFieldType(name) == 'string' and self.view.components[name].visible: fields.append(name) return fields def getSortableFields(self): # this could be different than searchable, but for now # just sort on strings until we figure out how to deal with # numeric and date fields ... sortable = self.searchableFields[:] sortable.sort() return sortable # KEA 2004-04-22 # clearViewField, getViewField, and setViewField # must be updated for selected -> selection, stringSelection # change as well as having the right logic for empty lists and choice def clearViewField(self, name): # based on widget.__class__.__name__ # set the field correctly comp = self.view.components[name] fieldType = self.getFieldType(name) if fieldType == 'string': comp.text = '' elif fieldType == 'list': comp.selection = 0 elif fieldType == 'integer': comp.value = 0 elif fieldType == 'date': comp.SetNow() elif fieldType == 'boolean': comp.checked = 0 def clearViewFields(self): for name in self.fieldNames: self.clearViewField(name) self.updateStatusBar() def getViewField(self, name): comp = self.view.components[name] fieldType = self.getFieldType(name) if fieldType == 'string': return comp.text elif fieldType == 'list': return comp.stringSelection elif fieldType == 'integer': return comp.value elif fieldType == 'date': return comp.GetDate().Format('%m/%d/%Y %I:%M:%S %p') elif fieldType == 'boolean': return comp.checked def setViewField(self, name, value): # based on widget.__class__.__name__ # set the field correctly comp = self.view.components[name] fieldType = self.getFieldType(name) if fieldType == 'string': comp.text = value elif fieldType == 'list': comp.stringSelection = value elif fieldType == 'integer': comp.value = value elif fieldType == 'date': d = wx.DateTime() d.ParseFormat(value, '%m/%d/%Y %I:%M:%S %p') comp.SetDate(d) elif fieldType == 'boolean': comp.checked = value def displayRecord(self, recordNumber): #self.clearViewFields() self.current = recordNumber if self.current != -1: record = self.records[recordNumber] #for fld in record: for name in self.fieldNames: #self.view.components[fld].text = record[fld] try: self.setViewField(name, record[name]) except: # what should we do if there is no data? self.clearViewField(name) self.updateStatusBar() def goRecord(self, recordNumber): n = len(self.records) - 1 if n > 0 and recordNumber >= 0: if recordNumber > n: recordNumber = n if self.current != recordNumber: self.saveRecord(self.current) self.displayRecord(recordNumber) def goPrevRecord(self): if len(self.records) > 1: prevRec = self.current - 1 if prevRec == -1: prevRec = len(self.records) - 1 self.saveRecord(self.current) self.displayRecord(prevRec) def goNextRecord(self): if len(self.records) > 1: nextRec = self.current + 1 if nextRec == len(self.records): nextRec = 0 self.saveRecord(self.current) self.displayRecord(nextRec) def goFirstRecord(self): if len(self.records) > 1: if self.current != 0: self.saveRecord(self.current) self.displayRecord(0) def goLastRecord(self): n = len(self.records) - 1 if n > 0: if self.current != n: self.saveRecord(self.current) self.displayRecord(n) def getRecordField(self, num, name): return self.records[num][name] # KEA 2002-05-28 # to make the find work like searching one big field, the initial search # needs to keep track of the field and selection offset # find can probably be refactored to be more efficient, but I want # to get it working correctly first and then simplify def findTextOnCard(self, searchText, caseSensitive, wholeWordsOnly, field, offset, searchField): # we can't search unless there is at least one record if len(self.records) > 0: current = self.current numRecords = len(self.records) ##if not caseSensitive: ## searchText = searchText.lower() if field in self.searchableFields: # only search forward searchableFields = self.searchableFields[self.searchableFields.index(field) + 1:] if searchField is not None: if not searchField in searchableFields: # the current selection is past the # field we want to search #print "searching field on card not found" return 0 else: searchableFields = [searchField] #print searchableFields, field, offset ##if caseSensitive: ## fieldText = self.records[current][field][offset:] ##else: ## fieldText = self.records[current][field][offset:].lower() #print fieldText ##found = fieldText.find(searchText) found = util.findString(searchText, self.getRecordField(current, field)[offset:], caseSensitive, wholeWordsOnly) if found != -1: self.view.components[field].setSelection(offset + found, offset + found + len(searchText)) self.view.components[field].setFocus() return 1 else: #print "not found" # now search the remaining fields on the card for name in searchableFields: try: # if the dictionary is missing a field # name this will avoid throwing an exception ##if caseSensitive: ## fieldText = self.records[current][name] ##else: ## fieldText = self.records[current][name].lower() ##found = fieldText.find(searchText) found = util.findString(searchText, self.getRecordField(current, name), caseSensitive, wholeWordsOnly) if found != -1: # found a match self.displayRecord(current) # KEA 2002-05-28 # need to special case for CodeEditor field # this will only work for wxTextCtrl derived fields self.view.components[name].setSelection(found, found + len(searchText)) self.view.components[name].setFocus() return 1 except: pass else: #print "what are we searching?" #searchableFields = self.searchableFields[:] # this should mean that no field has focus pass return 0 # KEA 2002-05-28 # changed logic to only search data rather than displaying # each record and then searching def findRecord(self, searchText, caseSensitive, wholeWordsOnly, field, offset, searchField): # we can't search unless there is at least one record if len(self.records) > 0: found = self.findTextOnCard(searchText, caseSensitive, wholeWordsOnly, field, offset, searchField) #print found if found: return self.saveRecord(self.current) current = self.current numRecords = len(self.records) ##if not caseSensitive: ## searchText = searchText.lower() # KEA 2002-04-21 # changed the logic so only visible fields are searched if searchField is None: searchableFields = self.searchableFields else: searchableFields = [searchField] while 1: # we already searched the current card # so move onto the next one current = current + 1 if current == numRecords: current = 0 if current == self.current: # didn't find a match return for name in searchableFields: try: # if the dictionary is missing a field # name this will avoid throwing an exception ##if caseSensitive: ## fieldText = self.records[current][name] ##else: ## fieldText = self.records[current][name].lower() ##offset = fieldText.find(searchText) offset = util.findString(searchText, self.getRecordField(current, name), caseSensitive, wholeWordsOnly) if offset != -1: # found a match self.displayRecord(current) # KEA 2002-05-28 # need to special case for CodeEditor field # this will only work for wxTextCtrl derived fields self.view.components[name].setSelection(offset, offset + len(searchText)) self.view.components[name].setFocus() return except: pass def newRecord(self): self.saveRecord(self.current) if self.current == -1: self.current = 0 #self.records.append({}) else: self.current += 1 self.records.insert(self.current, {}) self.clearViewFields() self.updateStatusBar() def deleteRecord(self): # should probably do a dialog here to give the user # a chance to cancel if self.current != -1: del self.records[self.current] self.documentChanged = 1 if len(self.records) == 0: self.current = -1 elif self.current == len(self.records): # the last record was deleted, # so display the next to last record self.current = self.current - 1 if self.current == -1: self.clearViewFields() self.updateStatusBar() else: self.displayRecord(self.current) def saveRecord(self, recordNumber): """ it would be more efficient to set a 'dirty' flag per field or at least per record if any fields change but this still works """ # in HyperCard there is always at least one record # which is not always what you want, so if we're going to # support 0 records our logic will be different for creating # an empty record initially # the boundary condition of no records will break the code right now # instead we always have at least one record, but it can appear empty if recordNumber == -1: recordNumber = 0 self.current = 0 #self.records = [{}] #self.records = SortableList() self.records = [] self.records.append({}) n = 1 else: n = len(self.records) if n > 0 and recordNumber > -1 and recordNumber < n: record = self.records[recordNumber] changed = 0 for name in self.fieldNames: try: #self.records[recordNumber][wName] = self.view.components[wName].text ##self.records[recordNumber][name] = self.getViewField(name) field = self.getViewField(name) if (name not in record) or (field != record[name]): record[name] = field changed = 1 print recordNumber, record[name] except: # missing a field pass if changed: # should log something here #print "changed: ", changed self.documentChanged = changed #record != self.records[recordNumber] # KEA 2002-07-09 # this is destructive, so if a field doesn't exist # in the replacement record that information would be lost # it might be better to iterate over the fields in record # and simply replace the values that we have keys for #self.records[recordNumber] = record for field in record: self.records[recordNumber][field] = record[field] if self.saveDocumentOnRecordChange: self.saveFile() def commonOpenFileInit(self, filename): #self.records = SortableList() self.records = [] self.clearViewFields() self.documentChanged = 0 self.filename = filename log.info("filename: %s" % (filename)) def openFile(self, filename): self.commonOpenFileInit(filename) try: if os.path.exists(filename): data = util.readAndEvalFile(filename) for c in data: self.records.append(c) if self.current == -1 and len(self.records) > 0: self.displayRecord(0) except: pass # KEA 2002-07-02 # to be safe, this should # rename the old file with a .bak extension # then write a new file def saveFile(self): # always save the records list # for transparent saves self.saveRecord(self.current) if self.documentChanged: print "document changed, saving..." try: fp = open(self.filename, "w") pprint.pprint(self.records, fp) fp.close() self.documentChanged = 0 except: print "something went wrong" pass def sortByFieldName(self, name, ascending=1): comp = self.view.components[name] fieldType = self.getFieldType(name) if fieldType == 'string': if self.view.statusBar is not None: self.view.statusBar.text = 'Sorting...' current = self.current currentRecord = self.records[self.current] #print current, currentRecord[name] startTime = time.time() try: # the 'integer' checks below will never happen since the # outer if above prevents sorting on anything but # strings, but eventually this will need to be expanded to cover # dates and other field types if fieldType == 'string': # to see how we got to this function # check out the source and extensive comments in an older version # of the sortByFieldName method, join the url below # http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/pythoncard/PythonCard # /flatfileDatabase.py?rev=1.5&content-type=text/vnd.viewcvs-markup self.records = util.caseinsensitive_listKeySort(self.records, name) elif fieldType == 'integer': # need to figure out how to generalize the code above to work # with different field types, or just put the test for fieldType # in the initial offsets building loop # one of th problems here is that trying to convert a non-existant # field to a float will throw an exception, so instead of '' or None # what value should be used? 0? self.records.sort(lambda a, b: cmp(float(a[name]), float(b[name]))) if fieldType in ['string', 'integer']: # don't reverse if we didn't sort above if not ascending: self.records.reverse() except: print "sort failed" log.info("sort took %f seconds" % (time.time() - startTime)) index = self.records.index(currentRecord) #print "index", index self.current = index #print self.current, self.records[self.current][name] self.updateStatusBar() def sortRecords(self, name=None): result = dialog.singleChoiceDialog(self.view, "Sort cards by field:", "Sort", self.sortableFields) if result.accepted: self.sortByFieldName(result.selection) def updateStatusBar(self): if self.view.statusBar is not None: self.view.statusBar.text = '%d of %d' % (self.current + 1, len(self.records)) class PickleDocument(Document): def openFile(self, filename): self.commonOpenFileInit(filename) try: if os.path.exists(filename): fp = open(filename, 'rb') # avoid having SortableList referenced in the pickle #self.records.data = cPickle.load(fp) self.records = cPickle.load(fp) fp.close() if self.current == -1 and len(self.records) > 0: self.displayRecord(0) except: pass def saveFile(self): self.saveRecord(self.current) if self.documentChanged: print "document changed, saving..." try: fp = open(self.filename, "wb") # dump binary # avoid having SortableList referenced in the pickle #cPickle.dump(self.records.data, fp, 1) cPickle.dump(self.records, fp, 1) fp.close() self.documentChanged = 0 except: print "something went wrong in saving the pickle" pass class XmlDocument(Document): def openFile(self, filename): self.commonOpenFileInit(filename) #try: if os.path.exists(filename): self.records = util.XmlToListOfDictionaries(filename) if self.current == -1 and len(self.records) > 0: self.displayRecord(0) #except: # print "failed to load XML", filename # pass def saveFile(self): return self.saveRecord(self.current) if self.documentChanged: print "document changed, saving..." try: fp = open(self.filename, "wb") #cPickle.dump(self.records, fp, 1) fp.close() self.documentChanged = 0 except: print "something went wrong in saving the XML file" pass class MetakitDocument(Document): def openFile(self, filename): import metakit self.commonOpenFileInit(filename) #print filename if os.path.exists(filename): # need to keep a reference to the storage # or it will be garbage collected self._db = metakit.storage(filename, 0) # there should only be one view, but this # needs to be made more robust, perhaps only # grabbing the first view? viewName = self._db.description().split('[')[0] # *** the view is hard-code below but shouldn't be # I just want the default view # self.records = self._db.view('companies') self.records = self._db.view(viewName) #print "len(self.records)", len(self.records) if self.current == -1 and len(self.records) > 0: self.displayRecord(0) def displayRecord(self, recordNumber): #self.clearViewFields() self.current = recordNumber if self.current != -1: record = self.records[recordNumber] #print recordNumber, record for name in self.fieldNames: try: self.setViewField(name, getattr(record, name)) except: # what should we do if there is no data? self.clearViewField(name) self.updateStatusBar() def getRecordField(self, num, name): return getattr(self.records[num], name) def saveRecord(self, recordNumber): return # not implemented yet def saveFile(self): return # not implemented yet def sortByFieldName(self, name, ascending=1): comp = self.view.components[name] fieldType = self.getFieldType(name) if fieldType == 'string': if self.view.statusBar is not None: self.view.statusBar.text = 'Sorting...' current = self.current currentRecord = {} for field in self.fieldNames: value = getattr(self.records[current], field) if value: currentRecord[field] = value #print currentRecord #print current, currentRecord[name] startTime = time.time() if fieldType == 'string': ##self.records = util.caseinsensitive_listKeySort(self.records, name) ##self.records.sort(self.records.Company) self.records = self.records.sort(getattr(self.records, name)) if fieldType in ['string', 'integer']: pass # don't reverse if we didn't sort above ##if not ascending: ## self.records.reverse() ## this needs to use the metakit reverse sort operation log.info("sort took %f seconds" % (time.time() - startTime)) index = self.records.find(currentRecord) ##index = self.records.index(currentRecord) #print "index", index self.current = index #print self.current, self.records[self.current][name] self.updateStatusBar() class FlatfileDatabase(model.Background): def on_initialize(self, event): startTime = time.time() # allow a subclass to change provide # its own dataFile item so it doesn't need # to have a config file # see companies sample if not hasattr(self, 'dataFile'): # KEA 2002-07-04 # allow a subclass to change the config file if not hasattr(self, 'configFilename'): self.configFilename = CONFIG_FILE self.dataFile = self.getDataFile(self.configFilename) if self.dataFile.endswith('.pickle'): self.document = PickleDocument(self, self.dataFile) elif self.dataFile.endswith('.xml'): self.document = XmlDocument(self, self.dataFile) elif self.dataFile.endswith('.mk'): self.document = MetakitDocument(self, self.dataFile) else: self.document = Document(self, self.dataFile) self.document.filename = self.dataFile self.lastFind = {'searchText':'', 'replaceText':'', 'wholeWordsOnly':0, 'caseSensitive':0, 'field':'', 'offset':0, 'searchField':None } # KEA 2002-06-24 # workaround for loseFocus event occuring before openBackground # probably need to rework how openBackground gets posted to make # sure it comes before a window can be deactivated... self._initComplete = 1 log.info("startup took %f seconds" % (time.time() - startTime)) def getDataFile(self, filename): # KEA 2004-08-03 # this should probably be made more flexible by passing in a full path # so that we can switch to using the config directory... # assume the ini file is in the same directory as the script path = os.path.join(self.application.applicationDirectory, filename) parser = ConfigParser.ConfigParser() parser.read(path) return parser.get('ConfigData', 'dataFile') def doSave(self): self.document.saveFile() def on_close(self, event): self.doSave() event.Skip() def on_save_command(self, event): self.doSave() def on_exit_command(self, event): self.close() def on_goPrev_command(self, event): self.document.goPrevRecord() def on_goNext_command(self, event): self.document.goNextRecord() def on_goFirst_command(self, event): self.document.goFirstRecord() def on_goLast_command(self, event): self.document.goLastRecord() def on_goToRecord_command(self, event): result = dialog.textEntryDialog(self, 'Go to card number:', 'Go to Card', '') # this version doesn't alert the user if the line number is out-of-range # it just fails quietly if result.accepted: try: i = int(result.text) if i > 0: self.document.goRecord(i - 1) except: pass def on_goRecordNumber_command(self, event): self.document.goLastRecord() # this probably needs to be more sophisticated to # allow for the sort to be remembered def on_sort_command(self, event): startTime = time.time() self.document.sortRecords() log.info("sort_command took %f seconds" % (time.time() - startTime)) def saveFocus(self, widget=None): if widget is None: widget = self.findFocus() if hasattr(widget, 'editable'): self.lastFind['field'] = widget.name self.lastFind['offset'] = widget.getSelection()[1] # clicking on the Find button wipes out # the focus in the text fields, so save it here def on_loseFocus(self, event): # KEA 2002-06-24 # workaround for openBackground when debug runtime # windows are used, see openBackground if not hasattr(self, '_initComplete'): return self.saveFocus(event.target) event.skip() def on_findRecord_command(self, event): self.saveFocus() searchableFields = self.document.searchableFields[:] searchableFields.sort() result = findDialog.findDialog(self, self.lastFind['searchText'], self.lastFind['wholeWordsOnly'], self.lastFind['caseSensitive'], self.lastFind['searchField'], searchableFields ) if result.accepted: startTime = time.time() self.lastFind['searchText'] = result.searchText self.lastFind['wholeWordsOnly'] = result.wholeWordsOnly self.lastFind['caseSensitive'] = result.caseSensitive self.lastFind['searchField'] = result.searchField self.document.findRecord(self.lastFind['searchText'], self.lastFind['caseSensitive'], self.lastFind['wholeWordsOnly'], self.lastFind['field'], self.lastFind['offset'], self.lastFind['searchField']) log.info("findRecord_command took %f seconds" % (time.time() - startTime)) def on_findNextRecord_command(self, event): startTime = time.time() self.saveFocus() self.document.findRecord(self.lastFind['searchText'], self.lastFind['caseSensitive'], self.lastFind['wholeWordsOnly'], self.lastFind['field'], self.lastFind['offset'], self.lastFind['searchField']) log.info("findNextRecord took %f seconds" % (time.time() - startTime)) def on_editUndo_command(self, event): widget = self.findFocus() if hasattr(widget, 'editable') and widget.canUndo(): widget.undo() def on_editRedo_command(self, event): widget = self.findFocus() if hasattr(widget, 'editable') and widget.canRedo(): widget.redo() def on_editCut_command(self, event): widget = self.findFocus() if hasattr(widget, 'editable') and widget.canCut(): widget.cut() def on_editCopy_command(self, event): widget = self.findFocus() if hasattr(widget, 'editable') and widget.canCopy(): widget.copy() def on_editPaste_command(self, event): widget = self.findFocus() if hasattr(widget, 'editable') and widget.canPaste(): widget.paste() def on_editClear_command(self, event): widget = self.findFocus() if hasattr(widget, 'editable'): if widget.canCut(): # delete the current selection, # if we can't do a Cut we shouldn't be able to delete either # which is why i used the test above sel = widget.replaceSelection('') else: ins = widget.getInsertionPoint() try: widget.replace(ins, ins + 1, '') except: pass def on_editSelectAll_command(self, event): widget = self.findFocus() if hasattr(widget, 'editable'): widget.setSelection(0, widget.getLastPosition()) def on_editNewCard_command(self, event): self.document.newRecord() def on_editDeleteCard_command(self, event): self.document.deleteRecord() if __name__ == '__main__': # assume the ini file is in the same directory as the script path = os.path.join(os.path.dirname(sys.argv[0]), CONFIG_FILE) parser = ConfigParser.ConfigParser() parser.read(path) # the resourceFile is settable via the ini file resourceFile = parser.get('ConfigData', 'resourceFile') app = model.Application(FlatfileDatabase, resourceFile) app.MainLoop() PythonCard-0.8.2/font.py0000644000076500007650000001377410037603550015045 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.20 $" __date__ = "$Date: 2004/04/15 22:06:32 $" """ import inspect import wx import resource # Construct a Python list from a CSS style font-family list which # is comma delimited and uses quotes for multi-word items. # Unquoted multi-word items have starting and ending whitespace stripped # and all whitespace reduced to single space characters. def FixWhiteSpace(s): s = s.strip() s = s.replace('\t', ' ') s = s.replace('\n', ' ') s = s.replace('\r', ' ') while s.find(' ') >= 0: s = s.replace(' ', ' ') return s def ListFromCSSFonts(s): l = [] # The starting position of the current item start = 0 # The character that started the current item, empty if outside item startChar = "" for i in range(len(s)): if startChar: if startChar in "\'\"": if s[i] == startChar: l.append(s[start+1:i]) startChar = "" elif s[i] in ",": l.append(FixWhiteSpace(s[start:i])) startChar = "" elif s[i] not in " \t,": start = i startChar = s[i] if startChar: l.append(FixWhiteSpace(s[start:])) return l def fontDescription(font): desc = {} family = font.GetFamily() faceName = font.GetFaceName() size = font.GetPointSize() style = font.GetStyle() weight = font.GetWeight() #print "wx.DEFAULT, wx.MODERN", wx.DEFAULT, wx.MODERN #print family, faceName, size, style, weight #print font.GetNativeFontInfo() if family >= wx.DEFAULT and family <= wx.MODERN: # ['wxDEFAULT', 'wxDECORATIVE', 'wxROMAN', 'wxSCRIPT', 'wxSWISS', 'wxMODERN'] names = ['default', 'decorative', 'serif', 'script', 'sansSerif', 'monospace'] desc['family'] = names[family - wx.DEFAULT] if faceName != '': desc['faceName'] = faceName if size != 0: desc['size'] = size if style == wx.ITALIC and weight == wx.BOLD: desc['style'] = 'boldItalic' elif style == wx.ITALIC: desc['style'] = 'italic' elif weight == wx.BOLD: desc['style'] = 'bold' else: desc['style'] = 'regular' return desc def familyId(name): if name == 'serif': return wx.ROMAN elif name == 'sansSerif': return wx.SWISS elif name == 'monospace': return wx.MODERN else: return wx.DEFAULT def styleId(name): if name.endswith('italic'): return wx.ITALIC else: return wx.NORMAL def weightId(name): if name.startswith('bold'): return wx.BOLD else: return wx.NORMAL def fontFromDescription(fontDescription): return wx.Font(fontDescription.get('size', wx.NORMAL_FONT.GetPointSize()), familyId(fontDescription.get('family', '')), styleId(fontDescription.get('style', 'regular')), weightId(fontDescription.get('style', 'regular')), 0, fontDescription.get('faceName', '')) # KEA 2004-04-15 # have to subclass Python object base class so that property() works below class Font(object): def __init__( self, fontDescription, aParent=None ) : self._parent = aParent self._family = '' self._faceName = '' self._size = wx.NORMAL_FONT.GetPointSize() self._style = 'regular' self._underline = 0 if fontDescription is not None: if isinstance(fontDescription, dict): fontDescription = resource.Resource(fontDescription) try: self._family = fontDescription.family except: pass try: self._faceName = fontDescription.faceName except: pass try: self._size = fontDescription.size except: pass try: self._style = fontDescription.style except: pass def _familyId(self, name): if name == 'serif': return wx.ROMAN elif name == 'sansSerif': return wx.SWISS elif name == 'monospace': return wx.MODERN else: return wx.DEFAULT def _styleId(self, name): if name.endswith('italic'): return wx.ITALIC else: return wx.NORMAL def _weightId(self, name): if name.startswith('bold'): return wx.BOLD else: return wx.NORMAL def _getFont(self): return wx.Font(self._size, self._familyId(self._family), self._styleId(self._style), self._weightId(self._style), self._underline, self._faceName) def _setFont(self, aFont): raise AttributeError, "font attribute is read-only" def _getSize(self): return self._size def _setSize(self, size): #self._font = self._newFont() #self._font.SetPointSize(size) self._size = size def _getStyle(self): return self._style def _setStyle(self, style): self._style = style def _getFaceName(self): return self._faceName def _setFaceName(self, faceName): self._faceName = faceName def _getFamily(self): return self._family def _setFamily(self, family): self._family = family def description(self): desc = {} if self._family != '': desc['family'] = self._family if self._faceName != '': desc['faceName'] = self._faceName desc['size'] = self._size if self._style != 'regular': desc['style'] = self._style return desc def __repr__(self): return str(self.description()) faceName = property(_getFaceName, _setFaceName) family = property(_getFamily, _setFamily) font = property(_getFont, _setFont) size = property(_getSize, _setSize) style = property(_getStyle, _setStyle) PythonCard-0.8.2/gadflyDatabase.py0000644000076500007650000002261710106743667017001 0ustar alexalex00000000000000#!/usr/bin/python __version__ = "$Revision: 1.11 $" __date__ = "$Date: 2004/08/12 19:40:39 $" """ flatfileDatabase was derived from the addresses sample. gadflyDatabase was derived from the flatfileDatabase """ from PythonCard import log, model from PythonCard import flatfileDatabase import os, sys import ConfigParser import time import gadfly from gadfly.store import StorageError CONFIG_FILE = 'gadflyDatabase.ini' IGNORE_PREFIX = 'ignore' class Document(flatfileDatabase.Document): def __init__(self, view, db=None, tableName=None): self.view = view self.documentChanged = 0 self.saveDocumentOnRecordChange = 1 self.current = -1 self.fieldTypes = {'date':['Calendar'], 'boolean':['CheckBox'], 'integer':['Slider', 'Spinner'], 'list':['Choice', 'List', 'RadioGroup'], 'string':['CodeEditor', 'PasswordField', 'TextField', 'TextArea'] } self.allFieldTypes = [] for value in self.fieldTypes.itervalues(): self.allFieldTypes += value self.fieldNames = self.getFieldNames() self.searchableFields = self.getSearchableFields() self.sortableFields = self.getSortableFields() if db is None: self.records = [] else: self.tableName = tableName self.openFile(db, tableName) self._db = db def newRecord(self): self.saveRecord(self.current) if self.current == -1: self.current = 0 else: stmt = "UPDATE %s SET ID=ID+1 WHERE ID > %d" % (self.tableName, self.current) cursor = self._db.cursor() cursor.execute(stmt) self._db.commit() self.current += 1 self.records.insert(self.current, {}) self.clearViewFields() self.displayRecord(self.current) # Needed to sync the model & the view self.updateStatusBar() def deleteRecord(self): if self.current != -1: del self.records[self.current] stmt = "DELETE FROM %s WHERE id = %d" % (self.tableName, self.current) cursor = self._db.cursor() cursor.execute(stmt) self._db.commit() # Re-sequence the remaining records if len(self.records) > 0: stmt = "UPDATE %s SET ID=ID-1 WHERE ID > %d" % (self.tableName, self.current) cursor = self._db.cursor() cursor.execute(stmt) self._db.commit() if len(self.records) == 0: self.current = -1 elif self.current == len(self.records): # the last record was deleted, # so display the next to last record self.current = self.current - 1 if self.current == -1: self.clearViewFields() self.updateStatusBar() else: self.displayRecord(self.current) def saveRecord(self, recordNumber): "Save the record to the database" if recordNumber == -1: recordNumber = 0 self.current = 0 self.records = [] self.records.append({}) n = 1 else: n = len(self.records) if n > 0 and recordNumber > -1 and recordNumber < n: record = self.records[recordNumber] if recordNumber == self.current: changed = 0 for name in self.fieldNames: try: field = self.getViewField(name) if (name not in record) or (field != record[name]): record[name] = field changed = 1 except: # missing a field pass else: # Just use the value in self.records changed = 1 if changed: self.documentChanged = changed for field in record: self.records[recordNumber][field] = record[field] cursor = self._db.cursor() stmt = "INSERT INTO %s ( ID, " % self.tableName values = [] for field in self.fieldNames: stmt += "%s, " % field stmt = stmt[:-2] + ") VALUES ( %d, " % recordNumber for field in self.fieldNames: stmt += "?, " values.append(self.getViewField(field)) stmt = stmt[:-2] + ")" try: cursor.execute(stmt, tuple(values)) except StorageError: # Update failed, try an insert self._db.rollback() stmt = "UPDATE %s SET " % self.tableName values = [] for field in self.fieldNames: stmt += "%s = ?, " % field values.append(self.getViewField(field) ) stmt = stmt[:-2] + "WHERE ID = %d" % recordNumber cursor.execute(stmt, tuple(values)) self._db.commit() self.displayRecord(recordNumber) def sortRecords(self): "Sort the records in memory, and in the database" flatfileDatabase.Document.sortRecords(self) index = 0 for record in self.records: self.saveRecord(index) index += 1 def openFile(self, db, tableName): self.commonOpenFileInit(tableName) cursor = db.cursor() # Check to see if our table exists, if it doesn't create it stmt = "SELECT count(*) FROM __table_names__ WHERE table_name = ?" cursor.execute(stmt, (tableName.upper(), )) result = cursor.fetchall()[0][0] if result == 0: self.createTable(db, tableName) else: stmt = "SELECT " for column in self.fieldNames: stmt += "%s, " % column stmt = stmt[:-2] + ", ID FROM " + tableName stmt += " ORDER BY ID" cursor.execute(stmt) for data in cursor.fetchall(): record = {} index = 0 for column in self.fieldNames: record[column]=data[index] index += 1 self.records.append(record) if self.current == -1 and len(self.records) > 0: self.displayRecord(0) def createTable(self, db, tableName): "Create our actual application table" cursor = db.cursor() stmt = "CREATE TABLE %s ( ID integer, " % tableName for column in self.fieldNames: stmt += "%s varchar, " % column stmt = stmt[:-2] + ")" cursor.execute(stmt) # And a unique index on the primary key stmt = "CREATE UNIQUE INDEX %s ON %s (ID)" % ( tableName+'_pk', tableName) cursor.execute(stmt) db.commit() def saveFile(self): # always save the records list # for transparent saves self.saveRecord(self.current) class GadflyDatabase(flatfileDatabase.FlatfileDatabase): def on_initialize(self, event): startTime = time.time() # allow a subclass to provide its own configuration so it doesn't need # to have a config file. See companies sample if not hasattr(self, 'configFilename'): self.configFilename = CONFIG_FILE db, tableName = self.getDatabase(self.configFilename) self.document = Document(self, db, tableName) self.lastFind = {'searchText':'', 'replaceText':'', 'wholeWordsOnly':0, 'caseSensitive':0, 'field':'', 'offset':0, 'searchField':None } self._initComplete = 1 log.info("startup took %f seconds" % (time.time() - startTime)) def on_findRecord_command(self, event): "Save the current record and find a new one" self.doSave() flatfileDatabase.FlatfileDatabase.on_findRecord_command(self, event) def getDatabase(self, filename): "Return the db and table name from " # assume the ini file is in the same directory as the script path = os.path.join(os.path.dirname(sys.argv[0]), filename) parser = ConfigParser.ConfigParser() parser.read(path) dbDir = parser.get('ConfigData', 'dbDir') dbName = parser.get('ConfigData', 'dbName') tableName = parser.get('ConfigData', 'tableName') try: db = gadfly.gadfly(dbName, dbDir) except IOError: db = gadfly.gadfly() db.startup(dbName, dbDir) return db, tableName def doSave(self): self.document.saveFile() if __name__ == '__main__': # assume the ini file is in the same directory as the script path = os.path.join(os.path.dirname(sys.argv[0]), CONFIG_FILE) parser = ConfigParser.ConfigParser() parser.read(path) # the resourceFile is settable via the ini file resourceFile = parser.get('ConfigData', 'resourceFile') app = model.Application(GadflyDatabase, resourceFile) app.MainLoop() PythonCard-0.8.2/graphic.py0000644000076500007650000001402010276567630015512 0ustar alexalex00000000000000""" __version__ = "$Revision: 1.18 $" __date__ = "$Date: 2005/08/11 06:26:32 $" """ import os import wx try: import Image # necessary to avoid name collision with Image class from Image import fromstring PIL_FOUND = 1 except ImportError: PIL_FOUND = 0 def PILToImage(pilImage): if (pilImage.mode != 'RGB'): pilImage = pilImage.convert('RGB') imageData = pilImage.tostring('raw', 'RGB') img = wx.EmptyImage(pilImage.size[0], pilImage.size[1]) img.SetData(imageData) return img def PILToBitmap(image): return wx.BitmapFromImage(PILToImage(image)) def BitmapToPIL(bmp): imageData = wx.ImageFromBitmap(bmp).GetData() imagePIL = fromstring('RGB', (bmp.GetWidth(), bmp.GetHeight()), imageData) imagePIL = imagePIL.convert('RGB') return imagePIL def numericArrayToImage(array): height, width = array.shape[:2] img = wx.EmptyImage(width, height) img.SetData(array.tostring()) return img def bitmapType(filename): """ Get the type of an image from the file's extension ( .jpg, etc. ) """ if filename == '': return None name, ext = os.path.splitext(filename) ext = ext[1:].upper() if ext == 'BMP': return wx.BITMAP_TYPE_BMP elif ext == 'GIF': return wx.BITMAP_TYPE_GIF elif ext == 'JPG' or ext == 'JPEG': return wx.BITMAP_TYPE_JPEG elif ext == 'PCX': return wx.BITMAP_TYPE_PCX elif ext == 'PICT': return wx.BITMAP_TYPE_PICT elif ext == 'PNG': return wx.BITMAP_TYPE_PNG elif ext == 'PNM': return wx.BITMAP_TYPE_PNM elif ext == 'TIF' or ext == 'TIFF': return wx.BITMAP_TYPE_TIF elif ext == 'XBM': return wx.BITMAP_TYPE_XBM elif ext == 'XPM': return wx.BITMAP_TYPE_XPM else: # KEA 2001-10-10 # rather than throw an exception, we could try and have wxPython figure out the image # type by returning wxBITMAP_TYPE_ANY raise 'invalid graphics format' # should throw an exception here def saveWindowScreenshot(w, path): bmp = wx.EmptyBitmap(w.size[0], w.size[1]) memdc = wx.MemoryDC() memdc.SelectObject(bmp) dc = wx.WindowDC(w) memdc.BlitPointSize((0, 0), w.size, dc, (0, 0)) bmp.SaveFile(path, bitmapType(path)) dc = None memdc.SelectObject(wx.NullBitmap) memdc = None bmp = None class Bitmap : def __init__(self, filename=None, size=(-1, -1)): if filename is None or filename == '': self._filename = None else: self._filename = filename # KEA 2004-07-27 # Mac checks that the bitmap is Ok() so need # to use a valid size if (self._filename is None) and (tuple(size) == (-1, -1)): self._size = (10, 10) else: self._size = size self._type = None self.loadFile(self._filename, self._size) def getBits( self ) : return self._bits def setBits( self, aWxBitmap ) : self._bits = aWxBitmap def setPILBits(self, image): self._bits = PILToBitmap(image) def getPILBits(self): return BitmapToPIL(self._bits) def setImageBits(self, image): self._bits = wx.BitmapFromImage(image) def getImageBits(self): return wx.ImageFromBitmap(self._bits) def getHeight( self ) : return self._bits.GetHeight() def getWidth( self ) : return self._bits.GetWidth() def getSize( self ) : return (self._bits.GetWidth(), self._bits.GetHeight()) # KEA special handling for -2 size option def setSize( self, aSize ): raise NotImplementedError def getType( self ) : return self._type def _getBitmapType( self, filename ) : """ Get the type of an image from the file's extension ( .jpg, etc. ) """ # KEA 2001-07-27 # was #name, ext = filename.split( '.' ) #ext = ext.upper() if filename is None or filename == '': return None name, ext = os.path.splitext(filename) ext = ext[1:].upper() if ext == 'BMP': return wx.BITMAP_TYPE_BMP elif ext == 'GIF': return wx.BITMAP_TYPE_GIF elif ext == 'JPG' or ext == 'JPEG': return wx.BITMAP_TYPE_JPEG elif ext == 'PCX': return wx.BITMAP_TYPE_PCX #elif ext == 'PICT': # return wx.BITMAP_TYPE_PICT elif ext == 'PNG': return wx.BITMAP_TYPE_PNG elif ext == 'PNM': return wx.BITMAP_TYPE_PNM elif ext == 'TIF' or ext == 'TIFF': return wx.BITMAP_TYPE_TIF elif ext == 'XBM': return wx.BITMAP_TYPE_XBM elif ext == 'XPM': return wx.BITMAP_TYPE_XPM else: # KEA 2001-10-10 # rather than throw an exception, we could try and have wxPython figure out the image # type by returning wxBITMAP_TYPE_ANY raise 'invalid graphics format' # should throw an exception here # xbm format doesn't seem to work on Windows def loadFile(self, filename=None, size=(-1, -1)): if filename is None or filename == '': self._filename = None else: self._filename = filename if (self._filename is None) and (tuple(size) == (-1, -1)): self._size = (10, 10) else: self._size = size self._type = self._getBitmapType(self._filename) if self._type is None: self._bits = wx.EmptyBitmap(self._size[0], self._size[1]) else: self._bits = wx.Bitmap(self._filename, self._type) # attempting to save a GIF image will result in a zero length file def saveFile(self, filename=None): if filename is None: filename = self._filename try: self._bits.SaveFile(filename, self._getBitmapType(filename)) except: pass def rotate90(self, clockwise=1): image = wx.ImageFromBitmap(self._bits) self._bits = wx.BitmapFromImage(image.Rotate90(clockwise)) PythonCard-0.8.2/helpful.py0000644000076500007650000002163210362165205015527 0ustar alexalex00000000000000""" __version__ = "$Revision: 1.5 $" __date__ = "$Date: 2006/01/14 12:11:49 $" """ # Assorted helpful wrappers. from PythonCard import model import wx import string, copy import types # AGT This could probably be generalized some more - but it handles current # needs within this wrapper collection of cloning buttons and checkboxes. # utility functions to manipulate controls at run time class copyControl: def __init__(self, aBg, Name, newname, Text=""): Flds = ['position', 'size', 'backgroundColor', 'foregroundColor', 'command', 'font'] aWidget = aBg.components[Name] d = {} d['type'] = aWidget.__class__.__name__ for key in Flds: # attributes # I'm not exactly sure why I have to special-case these tuples if key == 'bitmap': # this should get recreated from the file attribute pass elif key in ['position', 'size']: d[key] = getattr(aWidget, key) elif getattr(aWidget, key) is not None: d[key] = getattr(aWidget, key) if Text == "": Text = newname d['label'] = Text d['name'] = newname aBg.components[newname] = d self.name = newname # dialog to present a block of text and a number of alternative buttons class MultiButtonDialog(model.CustomDialog): def __init__(self, parent, txt, buttons, rsrc): model.CustomDialog.__init__(self, parent, rsrc) self.components.Text.text = txt self.components.Button.visible = False self.components.Button.enabled = False if len(buttons) == 0: buttons = ["OK"] bx, by = self.components.Button.size for b in buttons: if isinstance(b, types.StringTypes): self.components.Button.label = b else: self.components.Button.label = b[0] newx, newy = self.components.Button.GetBestSize() bx = max(bx, newx) by = max(by, newy) self.components.Button.size = (bx, newy) dx = bx + 20 # check if all buttons will fit in window owx, owy = self.size startx, starty = self.components.Button.position if len(buttons)*dx + bx + 40 > owx: wx = len(buttons)*dx + bx + 40 self.size = (wx, owy) startx, starty = (wx-bx-20, owy-by-30) # AGT - why 30 ?? tsx, tsy = self.components.Text.size self.components.Text.size = (wx-20, tsy) localbuttons = buttons localbuttons.reverse() count = 0 for b in localbuttons: if isinstance(b, types.StringTypes): theName = b theToolTip = '' else: theName = b[0] theToolTip = b[1] n = copyControl(self, "Button", "Button"+str(count), theName) self.components[n.name].position = startx-count*dx, starty self.components[n.name].visible = True self.components[n.name].enabled = True self.components[n.name].toolTip = theToolTip count += 1 self.accepted = False self.text = "" def on_mouseClick(self, event): self.text = event.target.label if self.text == "Cancel": self.accepted = False else: self.accepted = True self.Close() def multiButtonDialog(parent, txt, buttons, title=""): rsrc = {'type':'CustomDialog', 'name':'Template', 'title':'Template', 'position':(176, 176), 'size':(367, 230), 'components': [ {'type':'StaticText', 'name':'Text', 'position':(10, 10), 'size':(341, 123), 'actionBindings':{}, }, {'type':'Button', 'name':'Button', 'position':(269, 145), 'actionBindings':{}, 'label':'template', }, ] # end components } # end CustomDialog rsrc["title"] = title dlg = MultiButtonDialog(parent, txt, buttons, rsrc) result = dlg.showModal() result.accepted = dlg.accepted result.text = dlg.text dlg.destroy() return result # dialog to present a number of on/off checkboxes class MultiCheckBoxDialog(model.CustomDialog): # boxes is a list of (name, value) pairs, not a dictionary # because a dictionary didn't allow the caller to control the order of presentation def __init__(self, parent, boxes, rsrc): model.CustomDialog.__init__(self, parent, rsrc) self.components.box.visible = False self.components.box.enabled = False self.components.box.checked = False # check if all buttons will fit in window owx, owy = self.size startx, starty = self.components.box.position sx,sy = self.components.box.GetBestSize() #rint starty, len(boxes), sy, (len(boxes)-1) * (sy+20), owy wy = (len(boxes)+1) * (sy+20) + 30 self.size = (owx, wy) count = 0 self.boxes = {} for b in boxes: val = False toolTip = '' if isinstance(b, types.StringTypes): key = b else: key = b[0] if len(b) > 1: val = b[1] if len(b) > 2: toolTip = b[2] n = copyControl(self, "box", "Box"+str(count), key) self.components[n.name].position = startx, starty+count*(sy+20) self.components[n.name].visible = True self.components[n.name].enabled = True self.components[n.name].checked = val self.components[n.name].toolTip = toolTip self.boxes[key] = val count += 1 self.components.btnOK.position = (150, starty+count*(sy+20)) self.components.btnCancel.position = (250, starty+count*(sy+20)) self.accepted = False def on_btnOK_mouseClick(self, event): self.accepted = True for count in range(len(self.boxes)): name = "Box"+str(count) self.boxes[self.components[name].label] = self.components[name].checked self.Close() def on_btnCancel_mouseClick(self, event): self.accepted = False self.Close() def multiCheckBoxDialog(parent, boxes, title=""): rsrc = {'type':'CustomDialog', 'name':'Template', 'title':'Template', 'position':(176, 176), 'size':(340, 230), 'components': [ {'type':'CheckBox', 'name':'box', 'position':(50, 15), 'size':(250,20), 'actionBindings':{}, 'label':'template', }, {'type':'Button', 'name':'btnOK', 'position':(250, 0), 'actionBindings':{}, 'label':'OK', }, {'type':'Button', 'name':'btnCancel', 'position':(320, 0), 'actionBindings':{}, 'label':'Cancel', }, ] # end components } # end CustomDialog rsrc["title"] = title dlg = MultiCheckBoxDialog(parent, boxes, rsrc) result = dlg.showModal() result.accepted = dlg.accepted result.boxes = dlg.boxes dlg.destroy() return result # wrapper to help with pop up menus class PopUpMenu: def __init__(self, aBg, items, pos): # Yet another alternate way to do IDs. Some prefer them up top to # avoid clutter, some prefer them close to the object of interest # for clarity. self.popup = {} self.reverse = {} self.selected = None # make a menu self.menu = wx.Menu() # add the items for it in items: if isinstance(it, types.StringTypes): Id = wx.NewId() self.popup[it] = Id self.reverse[Id] = it aBg.Bind(wx.EVT_MENU, self.OnPopup, id=self.popup[it]) self.menu.Append(self.popup[it], it) else: # make a menu submenu = wx.Menu() Id = wx.NewId() aBg.Bind(wx.EVT_MENU, self.OnPopup, id=Id) for that in it: if isinstance(that, types.StringTypes): Id = wx.NewId() self.popup[that] = Id self.reverse[Id] = that aBg.Bind(wx.EVT_MENU, self.OnPopup, id=self.popup[that]) submenu.Append(self.popup[that], that) self.menu.AppendMenu(Id, "Test Submenu", submenu) # Popup the menu. If an item is selected then its handler # will be called before PopupMenu returns. aBg.PopupMenu(self.menu, pos) self.menu.Destroy() def OnPopup(self, event): self.selected = self.reverse[event.GetId()] def popUpMenu(aBg, items, pos): menu = PopUpMenu(aBg, items, pos) return menu.selected PythonCard-0.8.2/install-pythoncard.py0000644000076500007650000000736310362021471017710 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.9 $" __date__ = "$Date: 2006/01/13 22:01:29 $" """ # THIS FILE IS ONLY FOR USE WITH MS WINDOWS # It is run as parts of the bdist_wininst installer # Be sure to build the installer with # 'python setup.py --install-script=install-pythoncard.py' # or insert this into setup.cfg: # [bdist_wininst] # install-script=install-pythoncard.py import sys, os from distutils.sysconfig import get_python_lib if not sys.platform.startswith('win'): sys.exit() try: prg = get_special_folder_path("CSIDL_COMMON_PROGRAMS") except OSError: try: prg = get_special_folder_path("CSIDL_PROGRAMS") except OSError, reason: # give up - cannot install shortcuts print "cannot install shortcuts: %s" % reason sys.exit() lib_dir = get_python_lib(plat_specific=1) dest_dir = os.path.join(prg, "PythonCard") pythonw = os.path.join(sys.prefix, "pythonw.exe") if __name__ == '__main__': if "-install" == sys.argv[1]: try: os.mkdir(dest_dir) directory_created(dest_dir) except OSError: pass # create_shortcut(target, description, filename[, arguments[, \ # workdir[, iconpath[, iconindex]]]]) # file_created(path) # - register 'path' so that the uninstaller removes it # directory_created(path) # - register 'path' so that the uninstaller removes it # get_special_folder_location(csidl_string) target = os.path.join(lib_dir, "PythonCard\\samples\\samples.pyw") path = os.path.join(dest_dir, "Sample Launcher.lnk") create_shortcut(target, "Sample Launcher", path) file_created(path) path = os.path.join(dest_dir, "Layout Editor.lnk") arguments = os.path.join(lib_dir, "PythonCard\\tools\\resourceEditor\\layoutEditor.py") create_shortcut(pythonw, "Layout Editor", path, arguments) file_created(path) path = os.path.join(dest_dir, "Resource Editor.lnk") arguments = os.path.join(lib_dir, "PythonCard\\tools\\resourceEditor\\resourceEditor.py") create_shortcut(pythonw, "Resource Editor", path, arguments) file_created(path) path = os.path.join(dest_dir, "Code Editor.lnk") arguments = os.path.join(lib_dir, "PythonCard\\tools\\codeEditor\\codeEditor.py") create_shortcut(pythonw, "Code Editor", path, arguments) file_created(path) path = os.path.join(dest_dir, "Tabbed Code Editor.lnk") arguments = os.path.join(lib_dir, "PythonCard\\tools\\oneEditor\\tabcodeEditor.py") create_shortcut(pythonw, "Tabbed Code Editor", path, arguments) file_created(path) path = os.path.join(dest_dir, "Find Files.lnk") arguments = os.path.join(lib_dir, "PythonCard\\tools\\findfiles\\findfiles.py") create_shortcut(pythonw, "Find Files", path, arguments) file_created(path) target = os.path.join(lib_dir, "PythonCard\\docs\\html\\index.html") path = os.path.join(dest_dir, "Documentation.lnk") create_shortcut(target, "Documentation", path) file_created(path) target = os.path.join(sys.prefix, "RemovePythonCard.exe") path = os.path.join(dest_dir, "Uninstall PythonCard.lnk") arguments = "-u " + os.path.join(sys.prefix, "PythonCard-wininst.log") create_shortcut(target, "Uninstall PythonCard", path, arguments) file_created(path) print "See the shortcuts installed in the PythonCard Programs Group" elif "-remove" == sys.argv[1]: pass PythonCard-0.8.2/LICENSE.txt0000644000076500007650000000572310354140347015345 0ustar alexalex00000000000000Copyright (c) 2001-2005 PythonCard developers All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. 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. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. The PythonCard developers and contributors are; Kevin Altis - developer, project lead, Rowland Smith - developer Patrick K O'Brien - developer, PyCrust, Neil Hodgson - developer, wxStyledTextCtrl (Scintilla), Robin Dunn - developer, wxPython, Andy Todd - developer, dbBrowser sample, gadflyDatabase.py, documentation, Alex Tweedly - developer, codeEditor & resourceEditor additions, documentation Arlo Belshee - developer, lsystem sample Kim Wallmark - developer, lsystem sample Phil Edwards - developer, documentation, pysshed sample, Linux RPMs, Dan Winkler - developer, textIndexer sample, co-Godfather ;-) Kenneth Pronovici - Debian builds Dan Shafer - documentation, counter sample Thomas Heller - py2exe scripts, Windows distutils script Simon Kittle - textRouter sample Juergen Rauch - custdb sample Richard Wolff Randy Lea - rpn sample Riaan Booysen - STCStyleEditor.py David McNab - documentation David Primmer - documentation Fred Pacquier - fpop sample Gene Cash - EXIF.py Jon Dyte Roman Suzi William Volkman - multicolumnexample sample Bruce Eckel - moderator sample Tom Jacobs - montyhall sample Stephen Waterbury - twistedEchoClient sample Ward Cunningham - lsystem sample PythonCard-0.8.2/log.py0000644000076500007650000001677610051213216014655 0ustar alexalex00000000000000""" __version__ = "$Revision: 1.11 $" __date__ = "$Date: 2004/05/14 18:57:18 $" """ import time import configuration import sys class Log : """ A simple file logging class. In the future we should use this class to wrap up log4p. The name of the log file is specified in PythonCard's configuration file, 'pythoncard.rsrc.py' The log file will be created in the current working directory. Each time PythonCard runs, it deletes the old log contents. Log has four levels: DEBUG, ERROR, INFO and WARNING. Using Log: Call Log.getInstance() to get a reference to the single Log instance: log = Log.getInstance() Logging is initially disabled. To turn logging on: log.enable() To turn logging off: log.disable() To selectively enable one or more logging levels: log.enableLevels( [ Log.ERROR, Log.WARNING ] ) To selectively disable one or more logging levels: log.disableLevels( [ Log.DEBUG, Log.INFO ] ) To write to the Log: log.debug( 'a debug message' ) log.error( 'an error message' ) log.info( 'an info message' ) log.warning( 'a warning message' ) NOTE: The debug(), error(), info(), and warning() methods can be called with any number of parameters, and the parameters can be of any type. For example, if you want to print a debug message that is a string, and a list of items you can call: items = [ 'one', 'two', 3 ] log.debug( 'the items are: ', items ) """ # PUBLIC CLASS VARIABLES DEBUG = 'debug' ERROR = 'error' INFO = 'info' WARNING = 'warning' # PRIVATE CLASS VARIABLES instance = None legalLevels = { DEBUG:DEBUG, ERROR:ERROR, INFO:INFO, WARNING:WARNING } # PRIVATE INNER CLASSES class LogSingletonHelper : """ A helper class used to implement the Singleton Desing Pattern. """ def __call__( self, *args, **kw ) : # If an instance of Log does not exist, # create one and assign it to Log.instance. if Log.instance is None : Log.instance = Log() # Return TestSingleton.instance, which should contain # a reference to the only instance of Log in the system. return Log.instance # Create a class level method that must be called to # get the single instance of TestSingleton. # PUBLIC CLASS METHODS getInstance = LogSingletonHelper() # PUBLIC METHODS def __init__( self ) : """ Initialize a Log instance. """ if Log.instance is not None: raise RuntimeError, 'Only one instance of Log is allowed! use Log.getInstance() to get a reference to a Log' # The Log is initially disabled. self.enabled = 0 self.created = 0 #self.fileName = configuration.Configuration().getLogFileName() self.fileName = configuration.getLogFileName() self.logToStdout = configuration.getOption('logToStdout') # Enable all logging levels. self.errorEnabled = 1 self.warningEnabled = 1 self.debugEnabled = 1 self.infoEnabled = 1 def isEnabled( self ) : """ Return true if logging is enabled. """ return self.enabled def enable( self ) : """ Enable all logging - levels remain at their current settings. """ self.enabled = 1 # If this is the first time logging has been enabled, # create a new, empty log file. if not self.created: if not self.logToStdout: file = open(self.fileName, 'w') file.close() self.created = 1 def disable( self ) : """ Disable all logging - levels remain at their current settings. """ self.enabled = 0 def enableLevels( self, levels ) : """ Enable each logging level listed in 'levels'. """ for level in levels : if self.levelIsLegal( level ) : exec( 'self.' + level + 'Enabled = 1' ) def disableLevels( self, levels ) : """ Disable each logging level listed in 'levels'. """ for level in levels : if self.levelIsLegal( level ) : exec( 'self.' + level + 'Enabled = 0' ) def error( self, *args ) : """ Write an error message to the log. """ if self.errorEnabled : self.write( 'ERROR: ', args ) def warning( self, *args ) : """ Write a warning message to the log. """ if self.warningEnabled : self.write( 'WARNING: ', args ) def debug( self, *args ) : """ Write a debug message to the log. """ if self.debugEnabled : self.write( 'DEBUG: ', args ) def info( self, *args ) : """ Write an info message to the log. """ if self.infoEnabled : self.write( 'INFO: ', args ) # PRIVATE METHODS def levelIsLegal( self, level ) : if level not in Log.legalLevels: print '"', level, '" is not a legal logging level!' return 0 else : return 1 def write( self, prefix, argList ) : """ This method should wait for the file to come available in the event that multiple threads are accessing the log file. """ if self.enabled : now = time.localtime( time.time() ) try: if self.logToStdout: f = sys.stdout else: f = open( self.fileName, 'a' ) f.write( prefix + ': ' + "%s" % time.asctime( now ) + ': ' ) for arg in argList : f.write( str( arg ) ) f.write( '\n' ) if self.logToStdout: f = None else: f.close() except: pass log = Log() def isEnabled(): return log.isEnabled() def enable(): log.enable() def disable(): log.disable() def enablelevels(levels): log.enablelevels(levels) def disablelevels(levels): log.disablelevels(levels) def error(*args): log.error(*args) def warning(*args): log.warning(*args) def debug(*args): log.debug(*args) def info(*args): log.info(*args) # Unit Test if __name__ == '__main__' : #log = Log.getInstance() log.info( 'All logging enabled' ) log.enable() log.debug( 's1', [ 'a', 'list' ] ) log.error( 's2', { 'a':'dictionary' } ) log.info( 's3', 1, 2, 3, 4 ) log.warning( 's4', ' this ', 'is', ' a ', 'string ' ) log.info( 'Disabling error and warning levels' ) log.disableLevels( [ Log.ERROR, Log.WARNING ] ) log.debug( 's1' ) log.error( 's2' ) log.info( 's3' ) log.warning( 's4' ) log.info( 'Enabling error and warning levels' ) log.enableLevels( [ Log.ERROR, Log.WARNING ] ) log.debug( 's1' ) log.error( 's2' ) log.info( 's3' ) log.warning( 's4' ) log.info( 'All logging disabled' ) log.disable() log.debug( 's1' ) log.error( 's2' ) log.info( 's3' ) log.warning( 's4' ) log.enable() log.info( 'Attempt to enable an unknown level' ) log.enableLevels( [ 'bogus-level' ] ) PythonCard-0.8.2/menu.py0000644000076500007650000003563510165335031015041 0ustar alexalex00000000000000""" __version__ = "$Revision: 1.40 $" __date__ = "$Date: 2004/12/31 20:44:09 $" """ import wx import event import component """ KEA 2003-08-02 Need to test adding, renaming, deleting, a menuitem or menu once the application is running. In particular, I'm curious about doing dynamic menus for adding Scriptlets or allowing the user to override accelerator key bindings. Also, probably need to refactor so that we just use wxPython methods when possible and get rid of the extra lists and duplicate method calls. The exception are any name related utility routines that make it simpler to modify menu items and menus based on name rather than a fixed id. Also need to make sure a wxMenu can be created for use as a popup menu and then have it be destroyed correctly. See fpop sample. Can debug.py have its menu handled via the new menu classes? That is can we add the Debug menu dynamically. Maybe not because of the event binding. """ class MenuSelectEvent(event.SelectEvent): binding = wx.EVT_MENU id = wx.wxEVT_COMMAND_MENU_SELECTED def decorate(self, aWxEvent, source): aWxEvent = event.Event.decorate(self, aWxEvent, source) aWxEvent.checked = aWxEvent.IsChecked() return aWxEvent class MenuItem(wx.MenuItem, component.Component): """ A MenuItem represents one selectable item in a Menu. A MenuItem with the name '-' is interpreted as a separator. """ def __init__(self, aScriptable, aParent, aResource): self.label = aResource.label self.command = aResource.command self.checkable = aResource.checkable self.enabled = aResource.enabled self.checked = aResource.checked id = wx.NewId() if aResource.label == '-': wx.MenuItem.__init__(self, aParent, wx.ID_SEPARATOR, kind=wx.ITEM_SEPARATOR) elif aResource.checkable: #print aResource.label, aResource.checked, aResource.checked==True wx.MenuItem.__init__(self, aParent, id, aResource.label, "", kind=wx.ITEM_CHECK) # must use wxCallAfter to avoid init problems # if this ends up causing another conflict with openBackground... # then I guess we could drop the wxMenuItem sub-class and # just use wxMenu.Append like we used to if aResource.checked: wx.CallAfter(self.Check, aResource.checked) if not aResource.enabled: wx.CallAfter(self.Enable, aResource.enabled) else: #print aResource.label wx.MenuItem.__init__(self, aParent, id, aResource.label, "") if not aResource.enabled: wx.CallAfter(self.Enable, aResource.enabled) component.Component.__init__(self, aResource) self._bindEvents((MenuSelectEvent,), aScriptable, id) # KEA 2004-05-06 # since the only use of id2itemMap # is enableCommand and disableCommand # it might make more sense to just store # a mapping of command names to ids aParent.parent.id2itemMap[id] = self def _bindEvents(self, eventList, aScriptable, menuId): ## background = wx.GetTopLevelParent(self) background = aScriptable if wx.GetApp()._showDebugMenu: bindUnusedEvents = True else: bindUnusedEvents = False # helper variable to simplify test for whether to bind InsteadOfTypeEvents # there is a good chance we will need to know # which events are bound, if we want to dynamically add or remove # events later, so go ahead and keep a reference to the list self.boundEvents = {} self.eventIdToHandler = {} self.wxEventIdMap = {} if 0: print "\nBINDING...", self.name for eventClass in eventList: self.wxEventIdMap[eventClass.id] = eventClass if issubclass(eventClass, event.CommandTypeEvent) and self.command: handler = background.findHandler('on_' + self.command + '_command') if not handler: handler = background.findHandler('on_' + self.name + '_' + eventClass.name) else: handler = background.findHandler('on_' + self.name + '_' + eventClass.name) if not handler: handler = background.findHandler('on_' + eventClass.name) if handler or bindUnusedEvents: if not self.boundEvents.get(eventClass.binding, None): ## self.Bind(eventClass.binding, self._dispatch) # KEA 2004-05-04 # not sure yet if there is a different way to handle the bind # apparently we have to bind the event to the parent frame # and I think we also need the id, need to check with Robin background.Bind(eventClass.binding, self._dispatch, id=menuId) self.boundEvents[eventClass.binding] = eventClass.name if handler: if 0: print " binding", self.name, eventClass.name, handler.__name__, eventClass.id #self.eventIdToHandler[eventClass.id] = handler.getFunction() self.eventIdToHandler[eventClass.id] = handler if 0: print "\n boundEvents:" for name in self.boundEvents.values(): print " ", name print "\n\n" print "\n self.eventIdToHandler:" for id in self.eventIdToHandler: # KEA 2004-05-02 # change to just using the method directly, Handler class not needed #print " ", id, self.eventIdToHandler[id]._function print " ", id, self.eventIdToHandler[id] print "\n\n" def _dispatch(self, aWxEvent): eventType = aWxEvent.GetEventType() # KEA 2004-05-04 # for a menu item this event will always be the same # so this is redundant unless there is some binding other than # EVT_MENU that we're going to support?! eventClass = self.wxEventIdMap[eventType] eventClassInstance = eventClass() # decorate will add the relevant event attributes aWxEvent = eventClassInstance.decorate(aWxEvent, self) if self.command and isinstance(eventClassInstance, event.CommandTypeEvent): # need to report the name for the handler if it exists eventName = 'command ' + self.command else: if isinstance(eventClassInstance, event.InsteadOfTypeEvent): # changes eventType if needed # e.g. mouseDrag instead of mouseMove eventType = eventClassInstance.translateEventType(aWxEvent) eventName = self.wxEventIdMap[eventType].name # cleanup eventClass = None eventClassInstance = None handler = self.eventIdToHandler.get(eventType, None) if handler: event.EventLog.getInstance().log(eventName, self.name, True) if 0: print "dispatching", handler.__name__ # make a lowercase alias aWxEvent.skip = aWxEvent.Skip # KEA 2004-05-04 # the menu events are always bound to the parent frame # so the target of the event will be the "background" # KEA 2004-05-05 # it looks like WXMAC might be broken since GetEventObject # is returning the menu item, not the frame the event was # bound to if wx.Platform in ('__WXGTK__', '__WXMAC__'): background = aWxEvent.GetEventObject().parent.parent else: # KEA 2004-05-05 # it looks like Windows is actually the busted platform # this time # if we end up caching the handlers as bound methods # then I guess this kind of problem would go away because # we won't have to supply the first arg "self" background = aWxEvent.GetEventObject() ## background = wx.GetTopLevelParent(self) handler(background, aWxEvent) # do we have to clean up this alias? aWxEvent.skip = None # how about this local reference to handler? handler = None background = None else: event.EventLog.getInstance().log(eventName, self.name, False) # hopefully this is all we need to do for "unused events" aWxEvent.Skip() # cleanup aWxEvent.target = aWxEvent.eventObject = None def _getName( self ) : return self.name def getLabel( self ) : return self.label def getCommand( self ) : return self.command def getCheckable( self ) : return self.checkable def getEnabled( self ) : return self.enabled def getChecked( self ) : return self.checked def setName( self, aString ) : self.name = aString def setLabel( self, aString ) : self.label = aString def setCommand( self, aString ) : self.command = aString def __repr__( self ) : return 'MenuItem=' + str( self.__dict__ ) class Menu(wx.Menu): """ A Menu contains 0..n MenuItem objects. """ def __init__(self, aParent, aResource): wx.Menu.__init__(self) self.parent = aParent self.name = aResource.name self.label = aResource.label self.enabled = aResource.enabled self.items = [] for itemRsrc in aResource.items: menuItem = MenuItem(aParent.parent, self, itemRsrc) self.appendMenuItem(menuItem) def _getName( self ) : return self.name def getLabel( self ) : return self.label def getEnabled( self ) : return self.enabled def appendMenuItem(self, aMenuItem): # self.items is for backwards compatability self.items.append(aMenuItem) self.AppendItem(aMenuItem) def insertMenuItem( self, aMenuItem, aIndex ) : pass def deleteMenuItem( self, aName ) : pass def getMenuItem( self, aName ) : pass def getMenuItemByIndex( self, aIndex ) : pass def enable( self ) : pass def disable( self ) : pass def getMenuItems( self ) : return self.items def __repr__( self ) : return 'Menu=' + str( self.__dict__ ) class MenuBar(wx.MenuBar): def __init__(self, aParent, aMenuBarRsrc): wx.MenuBar.__init__(self) self.parent = aParent self.menus = [] #self.parseMenus(aParent, aMenuBarRsrc.menus) self.id2itemMap = {} enabledMenus = [] #menus = self.getMenus() # KEA 2003-08-02 # menus probably needs to be a UserList subclass # so that menus can be treated as a Python list, but # automatically do wxMenuBar.Append... as needed # alternatively, the helper methods # would just get ids and such dynamically from the menubar # using wxPython methods for menuRsrc in aMenuBarRsrc.menus: menu = Menu(self, menuRsrc) self.menus.append(menu) self.Append(menu, menu.getLabel()) enabledMenus.append(menu.getEnabled()) aParent.SetMenuBar(self) # this is a complete hack because we don't have the id of the Menu for i in range(0, len(enabledMenus)): if not enabledMenus[i]: self.EnableTop(i, 0) def __repr__(self): return 'MenuBar=' + str(self.__dict__) def appendMenu( self, aMenu ) : pass def insertMenu( self, aMenu, aIndex ) : pass def deleteMenu( self, aName ) : pass def getMenu( self, aName ) : pass def getMenuByIndex( self, aIndex ) : pass def getMenuId(self, aString): id = -1 for m in self.menus: menuLabel = m.label.replace('&', '') if m.name == aString: id = self.FindMenu(menuLabel) break for mi in m.items: if mi.name == aString: menuItemLabel = mi.label.split('\t')[0].replace('&', '') if menuItemLabel == 'Exit' and wx.Platform == '__WXMAC__': # KEA 2004-09-14 # I think this is the only label WXMAC changes # but I wonder if this won't work for other languages?! # maybe the Quit menu item would always have the same id? menuItemLabel = 'Quit' id = self.FindMenuItem(menuLabel, menuItemLabel) break return id # KEA 2004-04-07 # Rowland suggests that the methods below be separated for release 0.8 # so that separate methods are used for menus and menu items def getChecked( self, aString): id = self.getMenuId(aString) if id == -1: # KEA 2004-04-07 # should we throw an exception here to indicate the menu/menu item wasn't found? return -1 else: return self.IsChecked(id) def getEnabled( self, aString): id = self.getMenuId(aString) if id == -1: # KEA 2004-04-07 # should we throw an exception here to indicate the menu/menu item wasn't found? return -1 else: return self.IsEnabled(id) def setChecked( self, aString, aBoolean=True): # KEA 2004-04-07 # if aString is a menu name instead of a menuItem name # and there is a match then an exception will be thrown below # when Check is called id = self.getMenuId(aString) if id == -1: # KEA 2004-04-07 # should we throw an exception here to indicate the # menu/menu item wasn't found instead of failing silently? pass else: self.Check(id, aBoolean) def setEnabled( self, aString, aBoolean=1) : i = 0 for m in self.menus: menuLabel = m.label.strip('&') if m.name == aString: self.EnableTop(i, aBoolean) break for mi in m.items: if mi.name == aString: menuItemLabel = mi.label.split('\t')[0].strip('&') id = self.FindMenuItem(menuLabel, menuItemLabel) self.Enable(id, aBoolean) break i += 1 def getMenus( self ) : return self.menus def enableCommand(self, aString, aBoolean=True): for item in self.id2itemMap.itervalues(): if item.command == aString : self.Enable(item.GetId(), aBoolean) def disableCommand(self, aString): self.enableCommand(aString, False) # Unit Test if __name__ == '__main__' : import sys import resource r = resource.ResourceFile(sys.argv[1]).getResource() PythonCard-0.8.2/model.py0000644000076500007650000022131310362034321015160 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.197 $" __date__ = "$Date: 2006/01/13 23:33:37 $" """ import os, sys # KEA 2004-08-09 # assert some minimum requirements and attempt to exit cleanly # if they aren't met try: # some things might work with lesser # versions, but this is a reasonable base assert sys.version_info >= (2, 3) # sys.modules relative path fix sys.path[0] = os.path.abspath(sys.path[0]) #sys.path = [os.path.abspath(p) for p in sys.path] import wx assert wx.VERSION >= (2, 5, 2, 8) except AssertionError: from wxPython.wx import wxPySimpleApp, wxFrame, wxMessageDialog, wxICON_EXCLAMATION, wxOK, wxVERSION_STRING app = wxPySimpleApp() frame = wxFrame(None, -1, "Minimum Requirements Not Met") #frame.Show(1) message = "PythonCard minimum requirements:\nPython 2.3 and wxPython 2.5.2.8\n\n" + \ "You are using Python %s\nand wxPython %s.\n\nClick OK to exit." % (sys.version, wxVERSION_STRING) dialog = wxMessageDialog(frame, message, "Minimum Requirements Not Met", wxICON_EXCLAMATION | wxOK) dialog.ShowModal() dialog.Destroy() #app.MainLoop() sys.exit(0) import configuration import log import event import resource import widget import menu import statusbar import debug import component import util import dialog import types import UserDict import new import locale import inspect # KEA 2001-07-27 from wx.lib import colourdb class WidgetDict(UserDict.UserDict, event.Changeable): def __init__(self, parent, d=None): self.__dict__['parent'] = parent self.__dict__['data'] = {} self.__dict__['order'] = [] if d is not None: self.update(d) event.Changeable.__init__(self) # __getattr__ and __setattr__ need to be cleaned up # to support more attributes def __getattr__(self, key): if key == '_listeners': return self.__dict__[key] elif key == 'order': pass else: return self.data[key] def __setattr__(self, key, item): if key == '_listeners': self.__dict__[key] = item elif key == 'order': pass else: self.__setitem__(key, item) """ def __delattr__(self, key): if key == '_listeners': pass else: self.__delitem__(key) """ def __setitem__(self, key, item): if isinstance(item, dict): item = resource.Resource(item) control = component.ComponentFactory().createComponent(self.parent, self.parent.panel, item) if key in self.data: self.order.remove(key) self.order.append(key) self.data[key] = control # notify listeners self.fireChanged(key + "," + control.__class__.__name__) def __delitem__(self, key): control = self.data[key] # KEA 2002-05-20 # hack for 2.3.3 focus problem? visible = control.visible control.Show(0) wClass = control.__class__.__name__ focusWin = wx.Window_FindFocus() if focusWin is not None and focusWin == control: #print "disconnecting wx.wxEVT_KILL_FOCUS", control.name focusWin.Disconnect(-1, -1, wx.wxEVT_KILL_FOCUS) if self.data[key].Destroy(): self.order.remove(key) del self.data[key] self.fireChanged(key + "," + wClass) else: # why would Destroy fail? # if it does fail we have # a problem since we disconnected wx.wxEVT_KILL_FOCUS print "destroy failed", control control.Show(visible) def clear(self): for key in self.data.keys(): self.__delitem__(key) def _getAttributeNames(self): return self.data.keys() # KEA 2005-03-30 # revised to support platform-specific resource files def internationalResourceName(base): postfix = ".rsrc.py" # build up a list of possible filenames # in order of preference and use the first one that exists filenames = [base + postfix] if wx.Platform == '__WXMSW__': platform = 'win' elif wx.Platform == '__WXGTK__': platform = 'gtk' elif wx.Platform == '__WXMAC__': platform = 'mac' else: platform = None if platform: filenames.insert(0, base + '.' + platform + postfix) try: default = locale.getdefaultlocale() except: default = None log.debug('default: ' + str(default)) if default and default[0] is not None: language, country = default[0].split('_') log.debug(language + ' ' + country) # languageOnlyName filenames.insert(0, base + '.' + language + postfix) # languageCountryName filenames.insert(0, base + '.' + language + '_' + country + postfix) # now with platform specified as well if platform: filenames.insert(0, base + '.' + platform + '.' + language + postfix) filenames.insert(0, base + '.' + platform + '.' + language + '_' + country + postfix) log.debug(filenames) # AGT 2005-05-17 Detect missing resource file, give some warning; no clean recovery possible. filename = None for f in filenames: if os.path.exists(f): filename = f break if not filename: print "no resource file for", base return filename # KEA 2002-09-09 # this is derived from the frame loading in # Application below def childWindow(parent, frameClass, filename=None, rsrc=None): if filename is None: if rsrc is None: if util.main_is_frozen(): # KEA 2004-05-20 # running standalone # need to support py2exe differently than bundlebuilder and mcmillan probably # but this is the py2exe 0.5 way # figure out the .rsrc.py filename based on the module name stored in library.zip filename = os.path.split(sys.modules[frameClass.__module__].__file__)[1] # KEA 2004-09-14 # it seems sort of dumb to duplicate this function # just to handle the parent differently # so I'm adding this check if isinstance(parent, wx.Notebook): parentFrame = parent.GetParent().GetParent() filename = os.path.join(parentFrame.application.applicationDirectory, filename) else: filename = os.path.join(parent.application.applicationDirectory, filename) else: # figure out the .rsrc.py filename based on the module name filename = sys.modules[frameClass.__module__].__file__ # chop the .pyc or .pyo from the end base, ext = os.path.splitext(filename) filename = internationalResourceName(base) rsrc = resource.ResourceFile(filename).getResource() elif isinstance(rsrc, dict): rsrc = resource.Resource(rsrc) else: rsrc = resource.ResourceFile(filename).getResource() return frameClass(parent, rsrc.application.backgrounds[0]) # KEA 2002-02-25 # custom event for running a pycrustrc.py file # after openBackground event wxEVT_RUN_PYCRUSTRC = wx.NewEventType() def EVT_RUN_PYCRUSTRC(win, func): win.Connect(-1, -1, wxEVT_RUN_PYCRUSTRC, func) class wxRunPycrustrcEvent(wx.PyEvent): def __init__(self): wx.PyEvent.__init__(self) self.SetEventType(wxEVT_RUN_PYCRUSTRC) # KEA 2004-04-08 # custom event for hooking up the background events # after openBackground event # this means the initial idle, move, size, and activate events # will not be available to PythonCard user code wxEVT_LATENT_BACKGROUNDBIND = wx.NewEventType() def EVT_LATENT_BACKGROUNDBIND(win, func): win.Connect(-1, -1, wxEVT_LATENT_BACKGROUNDBIND, func) class wxLatentBackgroundBindEvent(wx.PyEvent): def __init__(self): wx.PyEvent.__init__(self) self.SetEventType(wxEVT_LATENT_BACKGROUNDBIND) # background events class ActivateEvent(event.Event, event.InsteadOfTypeEvent): name = 'activate' binding = wx.EVT_ACTIVATE id = wx.wxEVT_ACTIVATE def translateEventType(self, aWxEvent): if aWxEvent.GetActive(): return self.id else: return DeactivateEvent.id class DeactivateEvent(ActivateEvent): name = 'deactivate' id = wx.NewEventType() class CloseEvent(event.Event): name = 'close' binding = wx.EVT_CLOSE id = wx.wxEVT_CLOSE_WINDOW class MaximizeEvent(event.Event): name = 'maximize' binding = wx.EVT_MAXIMIZE id = wx.wxEVT_MAXIMIZE def decorate(self, aWxEvent, source): aWxEvent = event.Event.decorate(self, aWxEvent, source) aWxEvent.maximized = aWxEvent.target.IsMaximized() return aWxEvent class MinimizeEvent(event.Event, event.InsteadOfTypeEvent): name = 'minimize' binding = wx.EVT_ICONIZE id = wx.wxEVT_ICONIZE def translateEventType(self, aWxEvent): if aWxEvent.Iconized(): return self.id else: return RestoreEvent.id class RestoreEvent(MinimizeEvent): name = 'restore' id = wx.NewEventType() class MoveEvent(event.Event): name = 'move' binding = wx.EVT_MOVE id = wx.wxEVT_MOVE def decorate(self, aWxEvent, source): aWxEvent = event.Event.decorate(self, aWxEvent, source) aWxEvent.position = tuple(aWxEvent.GetPosition()) return aWxEvent class SizeEvent(event.Event): name = 'size' binding = wx.EVT_SIZE id = wx.wxEVT_SIZE def decorate(self, aWxEvent, source): aWxEvent = event.Event.decorate(self, aWxEvent, source) aWxEvent.size = tuple(aWxEvent.GetSize()) return aWxEvent BackgroundEvents = ( ActivateEvent, CloseEvent, DeactivateEvent, event.IdleEvent, MaximizeEvent, MinimizeEvent, MoveEvent, RestoreEvent, SizeEvent, ) class Application(wx.App): """ The runtime environment for PythonCard Stacks. """ def __init__(self, frameClass, aFileName=None, rsrc=None): configuration.configOptions() showProperties = configuration.getOption('showPropertyEditor') showMessages = configuration.getOption('showMessageWatcher') enableLogging = configuration.getOption('enableLogging') showShell = configuration.getOption('showShell') showNamespace = configuration.getOption('showNamespace') showDebugMenu = configuration.getOption('showDebugMenu') if enableLogging: log.enable() # KEA save the current directory just in case self.startingDirectory = os.getcwd() # KEA 2004-04-13 # was this just for debugging? # print os.getcwd() # RDS - Need to get the absolute pathname of aFileName before # getting the directory name . # keep track of the path to prefix with self.applicationDirectory = util.dirname(os.path.abspath(sys.argv[0])) # always run in the app's directory os.chdir(self.applicationDirectory) if aFileName is None: if rsrc is None: filename = os.path.split(sys.argv[0])[-1] base, ext = os.path.splitext(filename) aFileName = internationalResourceName(base) # Load the user-defined resource file, # validating it against spec.py self.resource = resource.ResourceFile(aFileName).getResource() else: if isinstance(rsrc, dict): rsrc = resource.Resource(rsrc) self.resource = rsrc else: # Load the user-defined resource file, # validating it against spec.py self.resource = resource.ResourceFile(aFileName).getResource() self.frameClass = frameClass self.pw = None self.mw = None self.shellFrame = None self.shell = None self.namespaceFrame = None self.namespace = None # KEA 2001-08-11 # if any of the debug windows are going to be used then # we will have a debug menu and all the windows will be available # but only the ones requested at startup will be visible initially # this seems like a nice compromise, but we can change the behavior # if it seems strange self._showDebugMenu = showProperties or showMessages or showShell or showNamespace or showDebugMenu # KEA 2004-01-02 # moved colourdb initialization to work with wxPython 2.5 # which requires a wxApp instance to exist before using colourdb wx.InitAllImageHandlers() wx.App.__init__(self, 0) colourdb.updateColourDB() def showPropertyEditor(self): bg = self.getCurrentBackground() position = configuration.getOption('propertyEditorPosition') size = configuration.getOption('propertyEditorSize') self.pw = debug.PropertyEditor(bg, -1, "Property Editor", position, size, parentApp=self) self.pw.displayComponents(bg.components) self.pw.Show(configuration.getOption('showPropertyEditor')) def showMessageWatcher(self): bg = self.getCurrentBackground() position = configuration.getOption('messageWatcherPosition') size = configuration.getOption('messageWatcherSize') self.mw = debug.MessageWatcher(bg, -1, "Message Watcher", position, size, parentApp=self) self.mw.Show(configuration.getOption('showMessageWatcher')) def showShell(self): bg = self.getCurrentBackground() position = configuration.getOption('shellPosition') size = configuration.getOption('shellSize') self.shellFrame = debug.PyCrustFrame(bg, -1, 'Shell', position, size, parentApp=self) self.shellFrame.Show(configuration.getOption('showShell')) EVT_RUN_PYCRUSTRC(self, self.OnRunPycrustrc) wx.PostEvent(self, wxRunPycrustrcEvent()) def showNamespace(self): bg = self.getCurrentBackground() position = configuration.getOption('namespacePosition') size = configuration.getOption('namespaceSize') self.namespaceFrame = debug.PyCrustNamespaceFrame(bg, -1, 'Namespace Viewer', position, size, parentApp=self) self.namespaceFrame.Show(configuration.getOption('showNamespace')) def _initBackgrounds(self, aResource): for bgRsrc in aResource.application.backgrounds: bg = self.frameClass(None, bgRsrc) self.backgrounds.append(bg) # wxWindows calls this method to initialize the application def OnInit(self): log.debug('Initializing Background...') self.backgrounds = [] self._initBackgrounds(self.resource) if self._showDebugMenu: self.showPropertyEditor() self.showMessageWatcher() self.showShell() # KEA pyCrust support self.showNamespace() # KEA pyCrust support return True def getCurrentBackground(self): return self.backgrounds[0] # RDS - new API def getWindows( self ) : return [ self.getCurrentBackground() ] def OnRunPycrustrc(self, evt): #print "OnRunPycrustrc", self.shell if self.shell is not None: path = os.path.dirname(__file__) filename = os.path.join(path, 'pycrustrc.py') if os.path.exists(filename): try: self.shell.runfile(filename) except: pass # we will have already changed into the running module # directory, so this should be okay filename = os.path.join(self.applicationDirectory, 'pycrustrc.py') if os.path.exists(filename): try: self.shell.runfile(filename) except: pass class Scriptable: """ All classes that may contain PythonCard Handler definitions must implement Scriptable. A Scriptable object may be specified as the parent of this object. The parent will be searched for Handlers if a Handler can't be found in this object. """ def __init__(self, aScriptableParent): self._parentScript = aScriptableParent self._handlers = {} self._parseHandlers() if False: print "Scriptable init", self._handlers.keys() def _parseHandlers(self): """ Find all of the methods in this object that are PythonCard handlers, and register them. """ # KEA 2004-03-05 # an even slicker way of finding event handlers # using the inspect module pythoncardMethods = [] # KEA 2004-05-09 # if we use bound methods then we'll have to change the # initialization order so that Scriptable.__init__ # is done after the object is actually created # all _dispatch methods have to be updated to use bound # methods if this is changed methods = inspect.getmembers(self.__class__, inspect.ismethod) ## # use bound methods instead of the class unbound methods ## methods = inspect.getmembers(self, inspect.ismethod) for m in methods: if m[0].split('_')[0] == 'on': pythoncardMethods.append(m[1]) map(self._addHandler, pythoncardMethods) def isPythonCardHandler(self, aObject): """ Return true if the object is a PythonCard handler. """ return isinstance(aObject, types.FunctionType) and aObject.__name__.split('_')[0] == 'on' def _addHandler(self, aMethod): # Add the Handler to our Handler list. if aMethod.__name__ not in self._handlers: log.debug("_addHandler: " + aMethod.__name__) #self._handlers[aMethod.__name__] = event.Handler(aMethod) self._handlers[aMethod.__name__] = aMethod def addMethod(self, aFunction): if isinstance(aFunction, types.FunctionType): if self.isPythonCardHandler(aFunction) : #aMethod = new.instancemethod(aFunction, self, self.__class__) aMethod = new.instancemethod(aFunction, None, self.__class__) #print aFunction #print self.__class__ #print aMethod.__name__ #print aMethod setattr(self.__class__, aMethod.__name__, aMethod) # now add the method info to our handler lookup dictionary # KEA 2001-11-29 simplified _addHandler #handler = event.Handler(aMethod.__name__, aMethod) #self._addHandler(aMethod.__name__, handler) self._addHandler(aMethod) # KEA 2004-05-13 # will need to call _bindEvents here to make sure the event handler # is bound to the right component instances # trying to figure out all the components as well as the reverse mapping # from an event name like mouseDown to event.MouseDownEvent is tricky # at best so we'll probably need to have user-code make explicit calls # to _bindEvents for each component they want to bind # the name to event class mapping can be found by iterativing over the # events defined in the spec for a given component to find a name match # maybe just calling _bindEvents with a full list of relevant events # would work, since the boundEvents list will prevent double-binding def findHandler(self, aString): """ Look for a Handler that matches aString in our list of Handlers. If a Handler is not found, ask our parent script to look for the Handler, continuing up the Scriptable hierarchy until either a Handler is found, or None is returned. """ # KEA 2004-04-26 # findHandler is actually called for each event dispatch # depending on the level of dynamic code we think we're going # to have it might be simpler to just statically bind when # the component is created if False: print "findHandler", aString, self handler = self._handlers.get(aString, None) if handler: return handler # We couldn't find a handler, so look in our parent. if self._parentScript: handler = self._parentScript.findHandler( aString ) # have we found a Handler yet? if handler: return handler # Change the handler name to target this Scriptable object # and look in our list of Handlers. words = aString.split('_') #print words, self._getName() #if len(words) == 2: # print words # aString = words[ 0 ] + '_' + words[ 1 ] #else: aString = words[0] + '_' + self.getName() + '_' + words[len(words) - 1] temp = self._handlers.get(aString, None) if temp: return temp else: # search for Background and Stack handlers like # on_mouseClick, on_initialize aString = words[0] + '_' + words[len(words) - 1] return self._handlers.get(aString, None) class Background(Scriptable, wx.Frame, event.EventSource): """ A window that contains Widgets. """ def __init__(self, aParent, aBgRsrc): """ Initialize this instance. """ Scriptable.__init__(self, None) event.EventSource.__init__(self) self.id = wx.NewId() self.resource = aBgRsrc # KEA 2005-12-29 # this is a hack to make sure the background has a defined spec # attribute for documentation purposes, but the spec should be defined # just like we do for components # Also need to verify that the currently defined component specs are # being used to enforce the attributes when loading a resource and not # just using the default defined in spec.py self._spec = aBgRsrc._spec.getEntry('Background') self.application = wx.GetApp() self.setName(aBgRsrc.name) self.setImage(aBgRsrc.image) self.setTiled(aBgRsrc.tiled) self.components = WidgetDict(self) self.menuBar = None self.statusBar = None # override for application defined position position = configuration.getOption('defaultBackgroundPosition') if position is None: position = aBgRsrc.position # KEA 2004-01-18 # have to explicitly declare the close box in wxPython 2.5 if aBgRsrc.style == []: style = wx.MINIMIZE_BOX | wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX elif aBgRsrc.style == ['resizeable']: style = wx.DEFAULT_FRAME_STYLE else: style = 0 for i in aBgRsrc.style: try: # intended to catch all errors ! style |= eval(i) except: pass # First, call the base class' __init__ method to create the frame wx.Frame.__init__(self, aParent, self.id, #self.name, aBgRsrc.title, position, aBgRsrc.size, style | wx.NO_FULL_REPAINT_ON_RESIZE, aBgRsrc.name) # KEA 2004-09-24 # experiment to see if initialize event will # fire before all other events # also see change to wx.CallAfter in textfield, passwordfield, and textarea evt = wx.PyEvent() # this is sort of pointless, the target is always self # do any samples or tool refer to the target? evt.target = self wx.CallAfter(self.on_initialize, evt) # also changing how other background events are hooked up wx.CallAfter(self.OnLatentBackgroundBind, None) self._initLayout(aBgRsrc.components) # KEA 2001-08-13 # can't set the colors until after the panel # has been created. this initialization should probably work differently self._setForegroundColor(aBgRsrc.foregroundColor) self._setBackgroundColor(aBgRsrc.backgroundColor) self._createMenus(aBgRsrc) self._createStatusBar(aBgRsrc) # AJT 20.11.2001 # Add icon creation self._setIcon(aBgRsrc) # 2001-11-08 # hack to preserve the statusbar text if self.statusBar is not None and self.menuBar is not None: wx.EVT_MENU_HIGHLIGHT_ALL(self, self.menuHighlight) if aParent is None: self.application.SetTopWindow(self) # KEA 2002-04-26 # allow background window to remain hidden if aBgRsrc.visible: self.Show(True) # RDS 2004-04-14 # Post the Background initialization event. ## self.EVT_OPEN_BACKGROUND_TYPE = wx.NewEventType() ## self.id = wx.NewId() ## self.Connect(self.GetId(), -1, ## self.EVT_OPEN_BACKGROUND_TYPE, ## self.on_initialize) ## #self._dispatchOpenBackground ) ## evt = wx.PyCommandEvent(self.EVT_OPEN_BACKGROUND_TYPE, self.GetId()) ## evt.target = self ## wx.PostEvent(self, evt) ## EVT_LATENT_BACKGROUNDBIND(self, self.OnLatentBackgroundBind) ## wx.PostEvent(self, wxLatentBackgroundBindEvent()) ## # for some reason the Message Watcher isn't a listener yet ## # so calling EventLog doesn't do anything ## #event.EventLog.getInstance().log('initialize', self.name, True) self._bindWindowEvents() def on_initialize(self, evt): # override in subclass pass def on_close(self, evt): # override in subclass evt.Skip() def singleItemExpandingSizerLayout(self): """Convenience method for backgrounds with only a single component on the background where the component should expand with the background as in an editor. Call from within the on_initialize event handler.""" self.sizer = wx.BoxSizer(wx.VERTICAL) name = self.components.order[0] self.sizer.Add(self.components[name], True, wx.EXPAND) self.sizer.Fit(self) self.sizer.SetSizeHints(self) self.panel.SetSizer(self.sizer) self.panel.Layout() # KEA 2004-09-24 # experiment to see if we could fit the panel # to the boundaries of the components with a little # padding to get around the problem of a static layout # having too much vertical space on GTK and Mac or not # enough vertical space on Windows if the layout was designed # for GTK or Mac... # the idea is that this would become an option in the resource # that could be called automatically # but I'm just testing now to see if it actually produces good results def fitToComponents(self, widthPadding=None, heightPadding=5): print "self.size:", self.size print "self.panel.size:", self.panel.size width = 0 height = 0 # height = self.panel.size for c in self.components.itervalues(): print " ", c.name, c.position, c.size x, y = c.position w, h = c.size width = max(x + w, width) height = max(y + h, height) print "width, height", width, height newWidth, newHeight = self.panel.size if widthPadding is not None: newWidth = width + widthPadding if heightPadding is not None: newHeight = height + heightPadding print "newWidth, newHeight", newWidth, newHeight self.panel.SetSize((newWidth, newHeight)) self.SetClientSize((newWidth, newHeight)) # KEA 2004-05-09 # this is _bindEvents taken from widget.Widget # so we can see how moving this to Scriptable will impact binding # comments have been removed def _bindEvents(self, eventList): background = wx.GetTopLevelParent(self) if wx.GetApp()._showDebugMenu: bindUnusedEvents = True else: bindUnusedEvents = False self.boundEvents = {} self.eventIdToHandler = {} self.wxEventIdMap = {} if 0: print "\nBINDING...", self.name for eventClass in eventList: self.wxEventIdMap[eventClass.id] = eventClass if issubclass(eventClass, event.CommandTypeEvent) and self.command: handler = background.findHandler('on_' + self.command + '_command') if not handler: handler = background.findHandler('on_' + self.name + '_' + eventClass.name) else: handler = background.findHandler('on_' + self.name + '_' + eventClass.name) if not handler: handler = background.findHandler('on_' + eventClass.name) if handler or bindUnusedEvents: if not self.boundEvents.get(eventClass.binding, None): self.Bind(eventClass.binding, self._dispatch) self.boundEvents[eventClass.binding] = eventClass.name if handler: if 0: print " binding", self.name, eventClass.name, handler.__name__, eventClass.id self.eventIdToHandler[eventClass.id] = handler if 0: print "\n boundEvents:" for name in self.boundEvents.values(): print " ", name print "\n\n" print "\n self.eventIdToHandler:" for id in self.eventIdToHandler: print " ", id, self.eventIdToHandler[id] print "\n\n" # KEA 2004-05-09 # this is _dispatch taken from widget.Widget # so we can see how moving this to Scriptable will impact dispatch # comments have been removed # the only line I added was self.command = None # since I'm not sure what we should do about that attribute # I suspect that the if test should just be changed so that instead of # if self.command ... # we use # if hasattr(self, 'command') and self.command ... # OOPS one other change # we're still using unbound methods and after a close event # additional events will be sent as the frame is closed and destroyed # in particular the last event appears to be a deactivate event # to work around this I went ahead and added code def _dispatch(self, aWxEvent): # this is a temporary workaround, see comment above self.command = None eventType = aWxEvent.GetEventType() eventClass = self.wxEventIdMap[eventType] eventClassInstance = eventClass() aWxEvent = eventClassInstance.decorate(aWxEvent, self) if self.command and isinstance(eventClassInstance, event.CommandTypeEvent): eventName = 'command ' + self.command else: if isinstance(eventClassInstance, event.InsteadOfTypeEvent): eventType = eventClassInstance.translateEventType(aWxEvent) eventName = self.wxEventIdMap[eventType].name eventClass = None eventClassInstance = None handler = self.eventIdToHandler.get(eventType, None) if handler: event.EventLog.getInstance().log(eventName, self.name, True) if 0: print "dispatching", handler.__name__ aWxEvent.skip = aWxEvent.Skip background = wx.GetTopLevelParent(self) handler(background, aWxEvent) aWxEvent.skip = None handler = None background = None else: event.EventLog.getInstance().log(eventName, self.name, False) aWxEvent.Skip() aWxEvent.target = aWxEvent.eventObject = None def OnLatentBackgroundBind(self, evt): self._bindEvents(BackgroundEvents) # KEA 2002-06-27 # this is a way of loading the shell manually in an app # if the shell wasn't loaded at startup, so program # startup is quicker and take up less memory # if the shell isn't needed def loadShell(self): if self.application.shell is None: self.application.showShell() def loadNamespace(self): self.loadShell() if self.application.shell is None: # must have been a problem loading the shell return if self.application.namespace is None: self.application.showNamespace() def setName( self, aString ) : self.name = aString def getName( self ) : return self.name def setImage(self, aPath): self.image = aPath # Call wxPython #raise NotImplementedError def setTiled(self, aBoolean): if isinstance(aBoolean, str): if aBoolean == 'false': aBoolean = False else: aBoolean = True self.tiled = aBoolean # Call wxPython #raise NotImplementedError def _getName(self): return self.name def getImage(self): return self.image def getTiled(self): return self.tiled # KEA 2004-03-17 # the get/set methods above will go away before PythonCard-1.0 # so that we can just use new-style class properties def _getPosition(self): return self.GetPositionTuple() def _setPosition(self, aPosition): self.SetPosition(aPosition) def _getSize(self): return self.GetSizeTuple() def _setSize(self, aSize): self.SetSize(aSize) def _getBackgroundColor(self): return self.panel.getBackgroundColor() def _setBackgroundColor(self, aColor): self.panel.setBackgroundColor(aColor) def _getForegroundColor(self): return self.panel.getForegroundColor() def _setForegroundColor(self, aColor): self.panel.setForegroundColor(aColor) def enableCommand(self, aString, aBoolean=True): """ Fined every component with a 'command' attribute that matches aString, and enable the component. """ self.menuBar.enableCommand(aString, aBoolean) for component in self.components.itervalues(): if component.command == aString: component.enabled = aBoolean def disableCommand(self, aString): """ Fined every component with a 'command' attribute that matches aString, and disable the component. """ self.enableCommand(aString, False) def _initLayout(self, aResourceList): """ Create the gui Widgets for this Background and lay them out in a Frame. """ self.panel = widget.Panel(self, self.image, self.tiled) for rsrc in aResourceList: self.components[rsrc.name] = rsrc # KEA 2002-05-02 # always create at least a File menu with Quit on the Mac # so we automatically get the Apple menu... def _createMacMenu(self): mnu = wx.Menu() id = wx.NewId() mnu.Append(id, 'E&xit\tAlt+X') menubar = self.GetMenuBar() if menubar is None: menubar = wx.MenuBar() self.SetMenuBar(menubar) menubar.Append(mnu, 'File') wx.EVT_MENU(self, id, self.on_exit_command) def exit(self): """Exit the application by calling close() on the main application window.""" # regardless of whether this is a child window # or primary window of the application, this should # give us the right window to close to quit the application appWindow = self.application.getCurrentBackground() appWindow.close() def on_exit_command(self, evt): self.exit() def _createMenus(self, aResource): # RDS - Only create a menubar if one is defined # in the stack's resource file. # This is a hack, I shouldn't be accessing # the stack resource's __dict)__ directly. if ('menubar' in aResource.__dict__) and (aResource.menubar is not None): self.menuBar = menu.MenuBar(self, aResource.menubar) elif wx.Platform == '__WXMAC__' and self.GetParent() is None: # always create at least a File menu with Quit on the Mac # so we automatically get the Apple menu... # KEA 2004-03-01 # the elif was updated to make sure we only create a menubar # if the background has no parent, aka is the primary app window self._createMacMenu() # KEA and as a further hack, I now add a Debug menu # to the menubar. createMenu will create a menubar # if one doesn't already exist if self.application._showDebugMenu and self.GetParent() == None: self.application._debugMenu = debug.DebugMenu(self.application) self.application._debugMenu.createMenu(self) self.application._debugMenu.bindMenuEvents(self) # 2001-11-08 # hack to keep the statusbar text from being wiped out def menuHighlight(self, event): self.statusBar.text = self.statusBar.text # KEA 2004-04-14 # subclasses of Background can override this method # if they want to have a different style of statusBar # OnCreateStatusBar is defined for wxFrame # in wxWidgets, but not wxPython, so ignore OnCreateStatusBar # in the wxWidgets docs # need to verify that we don't need a more complex arg list # since that will impact the call in _createStatusBar below # this method is also defined for CustomDialog def createStatusBar(self): return statusbar.StatusBar(self) # KEA 2001-12-25 # method now removes any existing statusbar if the resource # doesn't specify one # this is mostly for the resourceEditor and should have a clearer API def _createStatusBar( self, aResource ) : bar = self.GetStatusBar() if ('statusBar' in aResource.__dict__) and aResource.statusBar: if bar is None: self.statusBar = self.createStatusBar() self.SetStatusBar(self.statusBar) if wx.Platform == '__WXMAC__': #self.statusBar.PositionStatusBar() pass else: if bar is not None: self.SetStatusBar(None) bar.Destroy() # the statusbar changes the window size # so this will for it back #self.SetSize(self.GetSizeTuple()) self.Fit() self.statusBar = None def _setIcon( self, aResource ) : """Set icon based on resource values""" if ('icon' in aResource.__dict__) and (aResource.icon is not None): try: icon = wx.Icon(aResource.icon, wx.BITMAP_TYPE_ICO) self.SetIcon(icon) except: pass def _bindWindowEvents(self): wx.EVT_CLOSE(self, self.OnClose) wx.EVT_WINDOW_DESTROY(self, self.OnDestroy) # KEA 2004-05-09 # this is necessary so that we don't try and dispatch # the activate event which is sent after close # this might not be needed if we start using bound # events, but that will require more testing def OnClose(self, evt): # this will be found when the on_close method above # or override calls close so that we can still # disconnect the deactivateevent during close # otherwise trying to dispatch to self.Disconnect(-1, -1, ActivateEvent.id) evt.Skip() # KEA 2002-07-09 # make sure wxSTC text, bitmaps, etc. aren't lost # when the app exits def OnDestroy(self, evt): # KEA 2004-04-16 # stopLogging prevents the OleFlushClipboard message # from being displayed at the console when the app quits if self == evt.GetEventObject(): stopLogging = wx.LogNull() wx.TheClipboard.Flush() del stopLogging evt.Skip() def GetRestoredPosition(self): if self.IsIconized(): return self._restoredPosition else: return self.GetPositionTuple() def GetRestoredSize(self): if self.IsIconized(): return self._restoredSize else: return self.GetSizeTuple() def on_minimize(self, evt): #print "minimize", evt.Iconized() #print evt #print evt.GetTimestamp() #print "iconized", evt.Iconized() #print self.GetPositionTuple() #print self.GetSizeTuple() if evt.Iconized() and self.GetPositionTuple() != (-32000, -32000): self._restoredPosition = self.GetPositionTuple() self._restoredSize = self.GetSizeTuple() #print self.restoredPosition, self.restoredSize evt.Skip() # KEA 2004-04-24 # this doesn't appear to be hooked to an event # did the binding get deleted or did we just # never decide whether we wanted to have a separate # event to denote exiting the app versus calling close # on the main background to quit the app?! def OnExit(self, evt): self.close(True) # KEA 2004-04-26 # why do we need the methods below?! # what is the use case for them? # findComponentsByClass has some value # but any app that needs it can easily do the method itself # I blew away the same methods in CustomDialog # getComponent, getComponents, findAllComponents, findComponentsByClass # RDS = new API def getComponent( self, path ) : return eval( 'self.components.' + path ) # RDS - new API def getComponents( self ) : return self.findAllComponents() # RDS - deprecated def findAllComponents( self ) : """ Return a copy of the list of Components in this Background. We're not just returning self.components.values because we don't want someone to inadvertently whack the internal list of Components. """ components = [] for component in self.components.itervalues() : components.append( component ) return components def findComponentsByClass( self, aComponentClass ) : """ Return a list of Component's that are instances of the specified Component class. """ components = [] for component in self.components.itervalues() : if isinstance( component, aComponentClass ) : components.append( component ) return components # KEA 2001-07-31 # we may want to put this someplace else, but we do need access # to the componenet list def findFocus(self): # the wxPython widget that has focus widgetWX = wx.Window_FindFocus() if widgetWX is None: return None else: for widget in self.components.itervalues(): if widgetWX == widget: return widget # is this even possible? focus in another window maybe? return None # KEA 2004-03-17 # mixedCase aliases close = wx.Frame.Close getParent = wx.Frame.GetParent # KEA 2004-03-17 # define Python 2.2 new-style class properties backgroundColor = property(_getBackgroundColor, _setBackgroundColor, doc="backgroundColor of the background") foregroundColor = property(_getForegroundColor, _setForegroundColor, doc="foregroundColor of the background") position = property(_getPosition, _setPosition, doc="position of the background") size = property(_getSize, _setSize, doc="size of the background") title = property(wx.Frame.GetTitle, wx.Frame.SetTitle) visible = property(wx.Frame.IsShown, wx.Frame.Show, doc="whether the background window is visible") maximized = property(wx.Frame.IsMaximized, wx.Frame.Maximize, doc="whether the background window is maximized") minimized = property(wx.Frame.IsIconized, wx.Frame.Iconize, doc="whether the background window is minimized") # KEA 2004-09-28 # it appears that if you are going to use splitters # you can't just put them a wx.Panel within a wx.Frame # so the SplitterBackground has no self.panel # and the question becomes how are the various splitter # combinations specified? # when the PageBackground children are created, they # will need to use the correct splitters as parents class SplitterBackground(Background): def _initLayout(self, aResourceList): # should we just set self.panel = self instead?! self.panel = None # KEA 2001-07-31 # we may want to put this someplace else, but we do need access # to the componenet list def findFocus(self): # the wxPython widget that has focus widgetWX = wx.Window_FindFocus() if widgetWX is None: return None else: # KEA 2004-09-28 # this needs to iterate through the splitters # children correctly and my brain hurts # too much from getting splitters working # to fix this ;-) for widget in self.components.itervalues(): if widgetWX == widget: return widget # is this even possible? focus in another window maybe? return None # these really don't have any purpose within the # context of a SplitterBackground # but I'll leave them here for now # there are probably additional references in Background to self.panel # that also need overriding methods here def _getBackgroundColor(self): return self.GetBackgroundColour() def _setBackgroundColor(self, aColor): self.SetBackgroundColour(aColor) def _getForegroundColor(self): return self.GetForegroundColour() def _setForegroundColor(self, aColor): self.SetForegroundColour(aColor) backgroundColor = property(_getBackgroundColor, _setBackgroundColor, doc="backgroundColor of the background") foregroundColor = property(_getForegroundColor, _setForegroundColor, doc="foregroundColor of the background") PageBackgroundEvents = ( ## ActivateEvent, ## CloseEvent, ## DeactivateEvent, event.IdleEvent, ## MaximizeEvent, ## MinimizeEvent, ## MoveEvent, ## RestoreEvent, ## SizeEvent, ) class PageBackground(Scriptable, wx.Panel, event.EventSource): """ A window that contains Widgets. """ def __init__(self, aParent, aBgRsrc): """ Initialize this instance. """ Scriptable.__init__(self, None) event.EventSource.__init__(self) self.id = wx.NewId() self.resource = aBgRsrc self.application = wx.GetApp() self.setName(aBgRsrc.name) self.setImage(aBgRsrc.image) self.setTiled(aBgRsrc.tiled) self.components = WidgetDict(self) ## # override for application defined position ## position = configuration.getOption('defaultBackgroundPosition') ## if position is None: ## position = aBgRsrc.position ## # KEA 2004-01-18 ## # have to explicitly declare the close box in wxPython 2.5 ## style = wx.MINIMIZE_BOX | wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX ## if aBgRsrc.style == ['resizeable']: ## style = wx.DEFAULT_FRAME_STYLE # First, call the base class' __init__ method to create the frame wx.Panel.__init__(self, aParent, self.id, ## aBgRsrc.title, ## position, size=aBgRsrc.size, ## wx.NO_FULL_REPAINT_ON_RESIZE, name=aBgRsrc.name) self.topLevelParent = wx.GetTopLevelParent(self) self.menuBar = self.topLevelParent.menuBar self.statusBar = self.topLevelParent.statusBar self._initLayout(aBgRsrc.components) # KEA 2004-09-14 # force PageBackground to fit # space provided by Notebook self._sizer = wx.BoxSizer(wx.VERTICAL) self._sizer.Add(self.panel, True, wx.EXPAND) self._sizer.Fit(self) self._sizer.SetSizeHints(self) self.SetSizer(self._sizer) self.Layout() # KEA 2001-08-13 # can't set the colors until after the panel # has been created. this initialization should probably work differently self._setForegroundColor(aBgRsrc.foregroundColor) self._setBackgroundColor(aBgRsrc.backgroundColor) ## self._createMenus(aBgRsrc) ## self._createStatusBar(aBgRsrc) ## # AJT 20.11.2001 ## # Add icon creation ## self._setIcon(aBgRsrc) ## # 2001-11-08 ## # hack to preserve the statusbar text ## if self.statusBar is not None and self.menuBar is not None: ## wx.EVT_MENU_HIGHLIGHT_ALL(self, self.menuHighlight) ## if aParent is None: ## self.application.SetTopWindow(self) ## ## # KEA 2002-04-26 ## # allow background window to remain hidden ## if aBgRsrc.visible: ## self.Show(True) # RDS 2004-04-14 # Post the Background initialization event. self.EVT_OPEN_BACKGROUND_TYPE = wx.NewEventType() self.id = wx.NewId() self.Connect(self.GetId(), -1, self.EVT_OPEN_BACKGROUND_TYPE, self.on_initialize) #self._dispatchOpenBackground ) evt = wx.PyCommandEvent(self.EVT_OPEN_BACKGROUND_TYPE, self.GetId()) evt.target = self wx.PostEvent(self, evt) EVT_LATENT_BACKGROUNDBIND(self, self.OnLatentBackgroundBind) wx.PostEvent(self, wxLatentBackgroundBindEvent()) # for some reason the Message Watcher isn't a listener yet # so calling EventLog doesn't do anything #event.EventLog.getInstance().log('initialize', self.name, True) ## self._bindWindowEvents() def on_initialize(self, evt): # override in subclass pass ## def on_close(self, evt): ## # override in subclass ## evt.Skip() # KEA 2004-09-14 # this probably doesn't work, but need to test # since PageBackground is a wx.Panel # that contains a wx.Panel # and it contains a sizer to force it to expand to # the size of the Notebook set in __init__ above # I'm not sure if this method makes any sense for PageBackground def singleItemExpandingSizerLayout(self): """Convenience method for backgrounds with only a single component on the background where the component should expand with the background as in an editor. Call from within the on_initialize event handler.""" self.sizer = wx.BoxSizer(wx.VERTICAL) name = self.components.order[0] self.sizer.Add(self.components[name], True, wx.EXPAND) self.sizer.Fit(self) self.sizer.SetSizeHints(self) self.panel.SetSizer(self.sizer) self.panel.Layout() # KEA 2004-05-09 # this is _bindEvents taken from widget.Widget # so we can see how moving this to Scriptable will impact binding # comments have been removed def _bindEvents(self, eventList): ## background = wx.GetTopLevelParent(self) background = self if wx.GetApp()._showDebugMenu: bindUnusedEvents = True else: bindUnusedEvents = False self.boundEvents = {} self.eventIdToHandler = {} self.wxEventIdMap = {} if 0: print "\nBINDING...", self.name for eventClass in eventList: self.wxEventIdMap[eventClass.id] = eventClass if issubclass(eventClass, event.CommandTypeEvent) and self.command: handler = background.findHandler('on_' + self.command + '_command') if not handler: handler = background.findHandler('on_' + self.name + '_' + eventClass.name) else: handler = background.findHandler('on_' + self.name + '_' + eventClass.name) if not handler: handler = background.findHandler('on_' + eventClass.name) if handler or bindUnusedEvents: if not self.boundEvents.get(eventClass.binding, None): self.Bind(eventClass.binding, self._dispatch) self.boundEvents[eventClass.binding] = eventClass.name if handler: if 0: print " binding", self.name, eventClass.name, handler.__name__, eventClass.id self.eventIdToHandler[eventClass.id] = handler if 0: print "\n boundEvents:" for name in self.boundEvents.values(): print " ", name print "\n\n" print "\n self.eventIdToHandler:" for id in self.eventIdToHandler: print " ", id, self.eventIdToHandler[id] print "\n\n" # KEA 2004-05-09 # this is _dispatch taken from widget.Widget # so we can see how moving this to Scriptable will impact dispatch # comments have been removed # the only line I added was self.command = None # since I'm not sure what we should do about that attribute # I suspect that the if test should just be changed so that instead of # if self.command ... # we use # if hasattr(self, 'command') and self.command ... # OOPS one other change # we're still using unbound methods and after a close event # additional events will be sent as the frame is closed and destroyed # in particular the last event appears to be a deactivate event # to work around this I went ahead and added code def _dispatch(self, aWxEvent): # this is a temporary workaround, see comment above self.command = None eventType = aWxEvent.GetEventType() eventClass = self.wxEventIdMap[eventType] eventClassInstance = eventClass() aWxEvent = eventClassInstance.decorate(aWxEvent, self) if self.command and isinstance(eventClassInstance, event.CommandTypeEvent): eventName = 'command ' + self.command else: if isinstance(eventClassInstance, event.InsteadOfTypeEvent): eventType = eventClassInstance.translateEventType(aWxEvent) eventName = self.wxEventIdMap[eventType].name eventClass = None eventClassInstance = None handler = self.eventIdToHandler.get(eventType, None) if handler: event.EventLog.getInstance().log(eventName, self.name, True) if 0: print "dispatching", handler.__name__ aWxEvent.skip = aWxEvent.Skip ## background = wx.GetTopLevelParent(self) background = self handler(background, aWxEvent) aWxEvent.skip = None handler = None background = None else: event.EventLog.getInstance().log(eventName, self.name, False) aWxEvent.Skip() aWxEvent.target = aWxEvent.eventObject = None def OnLatentBackgroundBind(self, evt): self._bindEvents(PageBackgroundEvents) # KEA 2002-06-27 # this is a way of loading the shell manually in an app # if the shell wasn't loaded at startup, so program # startup is quicker and take up less memory # if the shell isn't needed def loadShell(self): if self.application.shell is None: self.application.showShell() def loadNamespace(self): self.loadShell() if self.application.shell is None: # must have been a problem loading the shell return if self.application.namespace is None: self.application.showNamespace() def setName( self, aString ) : self.name = aString def getName( self ) : return self.name def setImage(self, aPath): self.image = aPath # Call wxPython #raise NotImplementedError def setTiled(self, aBoolean): if isinstance(aBoolean, str): if aBoolean == 'false': aBoolean = False else: aBoolean = True self.tiled = aBoolean # Call wxPython #raise NotImplementedError def _getName(self): return self.name def getImage(self): return self.image def getTiled(self): return self.tiled # KEA 2004-03-17 # the get/set methods above will go away before PythonCard-1.0 # so that we can just use new-style class properties def _getPosition(self): return self.GetPositionTuple() def _setPosition(self, aPosition): self.SetPosition(aPosition) def _getSize(self): return self.GetSizeTuple() def _setSize(self, aSize): self.SetSize(aSize) def _getBackgroundColor(self): return self.panel.getBackgroundColor() def _setBackgroundColor(self, aColor): self.panel.setBackgroundColor(aColor) def _getForegroundColor(self): return self.panel.getForegroundColor() def _setForegroundColor(self, aColor): self.panel.setForegroundColor(aColor) def enableCommand(self, aString, aBoolean=True): """ Fined every component with a 'command' attribute that matches aString, and enable the component. """ self.menuBar.enableCommand(aString, aBoolean) for component in self.components.itervalues(): if component.command == aString: component.enabled = aBoolean def disableCommand(self, aString): """ Fined every component with a 'command' attribute that matches aString, and disable the component. """ self.enableCommand(aString, False) def _initLayout(self, aResourceList): """ Create the gui Widgets for this Background and lay them out in a Frame. """ self.panel = widget.Panel(self, self.image, self.tiled) for rsrc in aResourceList: self.components[rsrc.name] = rsrc ## # KEA 2002-05-02 ## # always create at least a File menu with Quit on the Mac ## # so we automatically get the Apple menu... ## def _createMacMenu(self): ## mnu = wx.Menu() ## id = wx.NewId() ## mnu.Append(id, 'E&xit\tAlt+X') ## ## menubar = self.GetMenuBar() ## if menubar is None: ## menubar = wx.MenuBar() ## self.SetMenuBar(menubar) ## menubar.Append(mnu, 'File') ## wx.EVT_MENU(self, id, self.on_exit_command) ## def exit(self): ## """Exit the application by calling close() ## on the main application window.""" ## ## # regardless of whether this is a child window ## # or primary window of the application, this should ## # give us the right window to close to quit the application ## appWindow = self.application.getCurrentBackground() ## appWindow.close() ## def on_exit_command(self, evt): ## self.exit() ## def _createMenus(self, aResource): ## # RDS - Only create a menubar if one is defined ## # in the stack's resource file. ## # This is a hack, I shouldn't be accessing ## # the stack resource's __dict)__ directly. ## if ('menubar' in aResource.__dict__) and (aResource.menubar is not None): ## self.menuBar = menu.MenuBar(self, aResource.menubar) ## elif wx.Platform == '__WXMAC__' and self.GetParent() is None: ## # always create at least a File menu with Quit on the Mac ## # so we automatically get the Apple menu... ## # KEA 2004-03-01 ## # the elif was updated to make sure we only create a menubar ## # if the background has no parent, aka is the primary app window ## self._createMacMenu() ## ## # KEA and as a further hack, I now add a Debug menu ## # to the menubar. createMenu will create a menubar ## # if one doesn't already exist ## if self.application._showDebugMenu and self.GetParent() == None: ## self.application._debugMenu = debug.DebugMenu(self.application) ## self.application._debugMenu.createMenu(self) ## self.application._debugMenu.bindMenuEvents(self) ## # 2001-11-08 ## # hack to keep the statusbar text from being wiped out ## def menuHighlight(self, event): ## self.statusBar.text = self.statusBar.text ## ## # KEA 2004-04-14 ## # subclasses of Background can override this method ## # if they want to have a different style of statusBar ## # OnCreateStatusBar is defined for wxFrame ## # in wxWidgets, but not wxPython, so ignore OnCreateStatusBar ## # in the wxWidgets docs ## # need to verify that we don't need a more complex arg list ## # since that will impact the call in _createStatusBar below ## # this method is also defined for CustomDialog ## def createStatusBar(self): ## return statusbar.StatusBar(self) ## ## # KEA 2001-12-25 ## # method now removes any existing statusbar if the resource ## # doesn't specify one ## # this is mostly for the resourceEditor and should have a clearer API ## def _createStatusBar( self, aResource ) : ## bar = self.GetStatusBar() ## if ('statusBar' in aResource.__dict__) and aResource.statusBar: ## if bar is None: ## self.statusBar = self.createStatusBar() ## self.SetStatusBar(self.statusBar) ## if wx.Platform == '__WXMAC__': ## #self.statusBar.PositionStatusBar() ## pass ## else: ## if bar is not None: ## self.SetStatusBar(None) ## bar.Destroy() ## # the statusbar changes the window size ## # so this will for it back ## #self.SetSize(self.GetSizeTuple()) ## self.Fit() ## self.statusBar = None ## ## ## def _setIcon( self, aResource ) : ## """Set icon based on resource values""" ## if ('icon' in aResource.__dict__) and (aResource.icon is not None): ## try: ## icon = wx.Icon(aResource.icon, wx.BITMAP_TYPE_ICO) ## self.SetIcon(icon) ## except: ## pass ## def _bindWindowEvents(self): ## wx.EVT_CLOSE(self, self.OnClose) ## wx.EVT_WINDOW_DESTROY(self, self.OnDestroy) ## # KEA 2004-05-09 ## # this is necessary so that we don't try and dispatch ## # the activate event which is sent after close ## # this might not be needed if we start using bound ## # events, but that will require more testing ## def OnClose(self, evt): ## # this will be found when the on_close method above ## # or override calls close so that we can still ## # disconnect the deactivateevent during close ## # otherwise trying to dispatch to ## self.Disconnect(-1, -1, ActivateEvent.id) ## evt.Skip() ## # KEA 2002-07-09 ## # make sure wxSTC text, bitmaps, etc. aren't lost ## # when the app exits ## def OnDestroy(self, evt): ## # KEA 2004-04-16 ## # stopLogging prevents the OleFlushClipboard message ## # from being displayed at the console when the app quits ## if self == evt.GetEventObject(): ## stopLogging = wx.LogNull() ## wx.TheClipboard.Flush() ## del stopLogging ## evt.Skip() ## def GetRestoredPosition(self): ## if self.IsIconized(): ## return self._restoredPosition ## else: ## return self.GetPositionTuple() ## def GetRestoredSize(self): ## if self.IsIconized(): ## return self._restoredSize ## else: ## return self.GetSizeTuple() ## def on_minimize(self, evt): ## #print "minimize", evt.Iconized() ## #print evt ## #print evt.GetTimestamp() ## #print "iconized", evt.Iconized() ## #print self.GetPositionTuple() ## #print self.GetSizeTuple() ## if evt.Iconized() and self.GetPositionTuple() != (-32000, -32000): ## self._restoredPosition = self.GetPositionTuple() ## self._restoredSize = self.GetSizeTuple() ## #print self.restoredPosition, self.restoredSize ## evt.Skip() ## # KEA 2004-04-24 ## # this doesn't appear to be hooked to an event ## # did the binding get deleted or did we just ## # never decide whether we wanted to have a separate ## # event to denote exiting the app versus calling close ## # on the main background to quit the app?! ## def OnExit(self, evt): ## self.close(True) # KEA 2004-04-26 # why do we need the methods below?! # what is the use case for them? # findComponentsByClass has some value # but any app that needs it can easily do the method itself # I blew away the same methods in CustomDialog # getComponent, getComponents, findAllComponents, findComponentsByClass # RDS = new API def getComponent( self, path ) : return eval( 'self.components.' + path ) # RDS - new API def getComponents( self ) : return self.findAllComponents() # RDS - deprecated def findAllComponents( self ) : """ Return a copy of the list of Components in this Background. We're not just returning self.components.values because we don't want someone to inadvertently whack the internal list of Components. """ components = [] for component in self.components.itervalues() : components.append( component ) return components def findComponentsByClass( self, aComponentClass ) : """ Return a list of Component's that are instances of the specified Component class. """ components = [] for component in self.components.itervalues() : if isinstance( component, aComponentClass ) : components.append( component ) return components # KEA 2001-07-31 # we may want to put this someplace else, but we do need access # to the componenet list def findFocus(self): # the wxPython widget that has focus widgetWX = wx.Window_FindFocus() if widgetWX is None: return None else: for widget in self.components.itervalues(): if widgetWX == widget: return widget # is this even possible? focus in another window maybe? return None ## # KEA 2004-03-17 ## # mixedCase aliases ## close = wx.Frame.Close ## getParent = wx.Frame.GetParent def _getTitle(self): return wx.GetTopLevelParent(self).GetTitle() def _setTitle(self, aString): wx.GetTopLevelParent(self).SetTitle(aString) # KEA 2004-03-17 # define Python 2.2 new-style class properties backgroundColor = property(_getBackgroundColor, _setBackgroundColor, doc="backgroundColor of the background") foregroundColor = property(_getForegroundColor, _setForegroundColor, doc="foregroundColor of the background") position = property(_getPosition, _setPosition, doc="position of the background") size = property(_getSize, _setSize, doc="size of the background") title = property(_getTitle, _setTitle, doc="title of the background") visible = property(wx.Frame.IsShown, wx.Frame.Show, doc="whether the background window is visible") class CustomDialog( Scriptable, wx.Dialog, event.EventSource): """The dialog class used by all custom dialogs.""" def __init__(self, aBg, aDialogRsrc=None): """ Initialize this instance. """ Scriptable.__init__( self, None) self.parent = aBg self.application = wx.GetApp() # KEA 2002-09-13 # if a resource isn't provided, try and load # a default based on the name if aDialogRsrc is None: if util.main_is_frozen(): # KEA 2004-05-20 # running standalone # need to support py2exe differently than bundlebuilder and mcmillan probably # but this is the py2exe 0.5 way # figure out the .rsrc.py filename based on the module name stored in library.zip filename = os.path.split(sys.modules[self.__class__.__module__].__file__)[1] filename = os.path.join(self.parent.application.applicationDirectory, filename) else: # figure out the .rsrc.py filename based on the module name filename = sys.modules[self.__class__.__module__].__file__ # chop the .pyc or .pyo from the end base, ext = os.path.splitext(filename) filename = internationalResourceName(base) aDialogRsrc = resource.ResourceFile(filename).getResource() else: if isinstance(aDialogRsrc, dict): aDialogRsrc = resource.Resource(aDialogRsrc) self.resource = aDialogRsrc self.id = wx.NewId() self.setName( aDialogRsrc.name ) self.components = WidgetDict(self) # First, call the base class' __init__ method to create the dialog wx.Dialog.__init__( self, self.parent, -1, aDialogRsrc.title, aDialogRsrc.position, aDialogRsrc.size ) self._initLayout( aDialogRsrc.components ) # this allows the labels to be something other than Ok, Cancel, No, etc. def _returnedString(self, returned): for w in self.components.itervalues(): if returned == w.GetId(): return w.label def showModal(self): result = dialog.DialogResults(self.ShowModal()) result.returnedString = self._returnedString(result.returned) return result def destroy(self): self.Destroy() def setName( self, aString ) : self.name = aString def getName( self ) : return self.name # KEA 2004-03-17 # the get/set methods above will go away before PythonCard-1.0 # so that we can just use new-style class properties def _getPosition(self): return self.GetPositionTuple() def _setPosition(self, aPosition): self.SetPosition(aPosition) def _getSize(self): return self.GetSizeTuple() def _setSize(self, aSize): self.SetSize(aSize) def enableCommand(self, aString, aBoolean=True): """ Fined every component with a 'command' attribute that matches aString, and enable the component. """ for component in self.components.itervalues(): if component.command == aString: component.enabled = aBoolean def disableCommand(self, aString): """ Fined every component with a 'command' attribute that matches aString, and disable the component. """ self.enableCommand(aString, False) def _initLayout( self, aResourceList ) : """ Create the gui Widgets for this Dialog and lay them out in the panel. """ self.panel = self for rsrc in aResourceList: self.components[rsrc.name] = rsrc def createStatusBar(self): return statusbar.StatusBar(self) def _createStatusBar( self, aResource ) : if ('statusBar' in aResource.application.__dict__) and aResource.application.statusBar: self.statusBar = self.createStatusBar(self) self.SetStatusBar(self.statusBar) def _bindWindowEvents( self ) : # Associate some events with methods of this class # KEA 2002-06-10 # this shouldn't be bound, should it?! #EVT_CLOSE(self, self.OnCloseWindow) # KEA 2001-08-06 pass # KEA 2001-07-31 # we may want to put this someplace else, but we do need access # to the componenet list def findFocus(self): # the wxPython widget that has focus widgetWX = wx.Window_FindFocus() for widget in self.components.itervalues(): if widgetWx == widget: return widget # is this even possible? focus in another window maybe? return None # these shouldn't be necessary # but I haven't taken the time to figure out what is messed up in # the event dispatch that keeps event.Skip from being called automatically # there might be a problem specific to wxDialog def on_mouseClick(self, event): event.Skip() # KEA 2004-03-17 # mixedCase aliases getParent = wx.Dialog.GetParent # KEA 2004-03-17 # define Python 2.2 new-style class properties position = property(_getPosition, _setPosition, doc="position of the dialog") size = property(_getSize, _setSize, doc="size of the dialog") title = property(wx.Dialog.GetTitle, wx.Dialog.SetTitle) visible = property(wx.Dialog.IsShown, wx.Dialog.Show, doc="whether the dialog is visible") PythonCard-0.8.2/PKG-INFO0000644000076500007650000000267310434046773014627 0ustar alexalex00000000000000Metadata-Version: 1.0 Name: PythonCard Version: 0.8.2 Summary: PythonCard GUI-builder Home-page: http://pythoncard.sourceforge.net/ Author: PythonCard Developers Author-email: pythoncard-users@lists.sourceforge.net License: BSD Download-URL: http://sourceforge.net/project/showfiles.php?group_id=19015 Description: PythonCard is a GUI construction kit for building cross-platform desktop applications on Windows, Mac OS X, and Linux, using the Python language. Platform: Mac OS X Platform: Windows Platform: Linux Classifier: Development Status :: 4 - Beta Classifier: Environment :: MacOS X Classifier: Environment :: MacOS X :: Carbon Classifier: Environment :: Win32 (MS Windows) Classifier: Environment :: X11 Applications :: GTK Classifier: Intended Audience :: Developers Classifier: Intended Audience :: Education Classifier: Intended Audience :: End Users/Desktop Classifier: Intended Audience :: Information Technology Classifier: Intended Audience :: Other Audience Classifier: Intended Audience :: Science/Research Classifier: Intended Audience :: System Administrators Classifier: License :: OSI Approved :: BSD License Classifier: Natural Language :: English Classifier: Operating System :: MacOS :: MacOS X Classifier: Operating System :: Microsoft :: Windows Classifier: Operating System :: POSIX :: Linux Classifier: Programming Language :: Python Classifier: Topic :: Software Development Classifier: Topic :: Software Development :: User Interfaces PythonCard-0.8.2/pycrustrc.py0000644000076500007650000000063510037024570016124 0ustar alexalex00000000000000shell.autoCompleteIncludeMagic = True shell.autoCompleteIncludeSingle = False shell.autoCompleteIncludeDouble = False shell.autoCompleteWxMethods = False import os import sys # workaround for absolute pathnames # in sys.path (see model.py) if sys.path[0] not in ('', '.'): sys.path.insert(0, '') import wx from PythonCard import dialog, util bg = pcapp.getCurrentBackground() self = bg comp = bg.components PythonCard-0.8.2/pythoncard_config.txt0000644000076500007650000000102610051216237017747 0ustar alexalex00000000000000# __version__ = "$Revision: 1.2 $" # __date__ = "$Date: 2004/05/14 19:23:11 $" { 'enableLogging':False, 'logfile':'pythoncard.log', 'logToStdout':True, 'showMessageWatcher':False, 'messageWatcherPosition':(0, 0), 'messageWatcherSize':(200, 300), 'showPropertyEditor':False, 'propertyEditorPosition':(0, 0), 'propertyEditorSize':(360, 240), 'showShell':False, 'shellPosition':(0, 0), 'shellSize':(500, 200), 'showNamespace':False, 'namespacePosition':(0, 0), 'namespaceSize':(600, 300), } PythonCard-0.8.2/README.txt0000644000076500007650000000253510110012203015171 0ustar alexalex00000000000000Readme for PythonCard PythonCard is a GUI construction kit for building cross-platform desktop applications on Windows, Mac OS X, and Linux, using the Python language. Place the "PythonCard" directory in your python directory or another directory on your PYTHONPATH. By default, the Windows installer and distutils installer will place PythonCard in your Python22\Lib\site-packages directory; the actual path will be different depending on your OS and version of Python. If you're running on a Unix/Linux system, you must unzip the release distribution with the -a option to convert the CR/LF line endings of each file to LF. For more information see the docs directory included with this distribution. Try the sample applications in the "samples" directory. Latest release files: http://sourceforge.net/project/showfiles.php?group_id=19015 PythonCard home page http://pythoncard.sourceforge.net/ SourceForge summary page http://sourceforge.net/projects/pythoncard/ Mailing list http://lists.sourceforge.net/lists/listinfo/pythoncard-users PythonCard requires Python 2.3 or later and wxPython 2.5.2.x or later. wxPython is available at http://www.wxpython.org/ License This software is released under the terms of the BSD license. For more information see the LICENSE.txt file in this directory. Revision: $Revision: 1.9 $ Date: $Date: 2004/08/16 01:57:23 $ PythonCard-0.8.2/README_StyleEditor.txt0000644000076500007650000000061207465602165017551 0ustar alexalex00000000000000I've written a style editor for the wxStyledTextCrl. It's not depedent on Boa at all and could be useful to anyone with a wxSTC app. The code is a bit rough, freshly written and have not had any refactoring, but it works (only tested on windows so far), has some comments and even a doc string here and there ;) Please give it a go and tell me what you think. -- Riaan Booysen 24-August-2001PythonCard-0.8.2/registry.py0000644000076500007650000000512010050517327015732 0ustar alexalex00000000000000""" __version__ = "$Revision: 1.8 $" __date__ = "$Date: 2004/05/12 22:01:59 $" """ from PythonCard import singleton import PythonCard.components import copy, glob, os class Registry( singleton.Singleton ) : """ Maintains a regstry of the PythonCard Components that have been loaded into the system. """ def __init__( self ) : self.components = {} #self._moduleNames = self.findBuiltInComponents() def findBuiltInComponents(self): """ Return a list of the built-in module names that is suitable for subsequent calls to resource.loadComponentModule. """ path = PythonCard.components.__path__[0] paths = glob.glob(os.path.join(path, '*.py')) names = [] for path in paths: filename = os.path.split(path)[1] # don't return package file if filename != '__init__.py': names.append(os.path.splitext(filename)[0]) #for name in names : # print 'found component: ', name return names def register( self, componentClass ) : """ Register a Component. """ spec = componentClass._spec self.components[ spec.getName() ] = componentClass def hasComponent( self, name ) : """ Return true if a Component matching 'name' exists in the registry. """ return name in self.components def getComponents( self ) : """ Get a dictionary that contains all of the registered Components. """ return copy.copy( self.components ) def getComponentClass( self, name ) : """ Get the class object for a named Component. """ if not self.components.has_key( name ) : self.importClass( name ) return self.components[ name ] def getComponentSpec( self, name ) : """ Get the Spec object for a named Component. """ return self.getComponentClass( name )._spec def importClass( self, fqn ) : print 'fqn=', fqn """ The path is of the form [Package.[sub-Package].]Module.Class """ name = fqn modules = name.split('.') className = modules.pop() # remove last item. moduleName = '.'.join(modules) module = __import__( moduleName , globals(), locals(), [] ) for name in modules[ 1:] : module = vars( module )[ name ] klass = vars( module )[ className ] self.components[ fqn ] = klass return klass PythonCard-0.8.2/resource.py0000644000076500007650000001706010123060611015705 0ustar alexalex00000000000000""" __version__ = "$Revision: 1.20 $" __date__ = "$Date: 2004/04/14 02:38:47 $" """ import util import error import spec import component import log import registry import singleton APP_COMPONENTS_PACKAGE = 'appcomponents' COMPONENTS_PACKAGE = 'components' # the components sub-package and an appcomponents package # are used rather than a components path def loadComponentModule(moduleName): try: #exec("from appcomponents import " + moduleName) __import__(APP_COMPONENTS_PACKAGE + '.' + moduleName, globals(), globals(), [APP_COMPONENTS_PACKAGE]) except ImportError, e: try: #exec("from components import " + moduleName) __import__(COMPONENTS_PACKAGE + '.' + moduleName, globals(), globals(), [COMPONENTS_PACKAGE]) except ImportError, e: log.error(e) message = 'cannot import module \'' + moduleName raise ImportError, message else: log.debug("imported component " + moduleName) else: log.debug("imported appcomponent " + moduleName) class ResourceFile : """ Reads a Resource file into a dictionary. """ def __init__( self, rsrcFileName ) : #self.dictionary = eval( open( rsrcFileName ).read() ) # KEA 2001-09-07 # change to support using Windows-style line endings under Unix self.dictionary = util.readAndEvalFile(rsrcFileName) def getResource( self ) : return Resource( self.dictionary ) class Resource : _spec = None """ A generic tree of dictionary, array and primitive objects that is accessible using dot(.) notation. """ def __init__ ( self, aDictionary ) : if Resource._spec is None : # KEA 2001-11-17 # changed spec.py so that it can be imported rather than # having to use readAndEvalFile #thisDir = os.path.dirname( os.path.abspath( __file__ ) ) #specPath = os.path.join( thisDir, 'spec.py' ) # KEA 2001-09-07 # change to support using Windows-style line endings under Unix #specDict = util.readAndEvalFile(specPath) #Resource._spec = Spec(specDict) Resource._spec = Spec(spec.specList) # KEA 2001-12-10 # test sticking the ButtonSpec into the existing spec list #from components.button import ButtonSpec #Resource._spec.entries.append(ButtonSpec()) # KEA 2001-12-10 # components is a sub-package # rather than importing the entire sub-package # the import for each component should occur on demand as a Resource is needed # or some other mechanism could be used to force the loading of each module #import components for key in aDictionary: value = aDictionary[key] if isinstance(value, dict): aDictionary[key] = Resource(value) if isinstance(value, list): i = 0 for item in value: if isinstance(item, dict) : value[i] = Resource(item) i = i + 1 self.__dict__.update(aDictionary) self.enforceSpec(aDictionary) def enforceSpec( self, aDictionary ) : """ If Resource._spec is not None, then we look at the Spec definition and enforce mandatory/optionl/default constraints on this Resource. Although I think the Resource and Spec file formats are reasonable, this code is a hack job of the highest degree, and I don't mind admitting it - RDS ;) Maybe we'll have time to redesign ( or just design ) on the next pass ;) """ attributes = None typeStr = None if 'type' in aDictionary: typeStr = aDictionary['type'] # Get the appropriate spec. if Resource._spec is not None : # KEA 2001-12-11 # attempt to get the spec from the default Spec # which contains the non-modular components # and if that fails then load a widget (component) module # dynamically and get the spec from the imported class try: _spec = Resource._spec.getEntry(typeStr) except: # dynamic import reggie = registry.Registry.getInstance() # rds: we can lose the following, and allow # te call to getComponentSpec to do all the work. if not reggie.hasComponent(typeStr): # RDS - Prepend the path to the package containing # the built-in PythonCard components. #if typeStr.find( '.' ) == -1 : # typeStr = 'PythonCard.components.' + typeStr #clazz = Loader.getInstance().importClass( typeStr ) loadComponentModule( typeStr.lower() ) #print "using", typeStr + "._spec" _spec = reggie.getComponentSpec( typeStr ) attributes = _spec.getAttributes() if attributes is not None : for key in attributes: attribute = attributes[key] if attribute.isRequired(): if not self.hasAttribute(key): msg = 'error! ' + typeStr + '.' + key + ' is mandatory' raise error.ResourceException, msg elif attribute.isOptional(): if not self.hasAttribute(key): self.__dict__[key] = attribute.getDefaultValue() def hasAttribute(self, aString): return aString in self.__dict__ def __repr__( self ) : return 'Resource: ' + str( self.__dict__ ) class Spec : """ A Spec is a dictionary that contains meta type information that is used to validate a Resource file. TODO: Raise a warning when unspecified attributes are found in a resource. It may be interesting to process them and set them as member with get/set on instances of the class where they are found? - RDS """ def __init__ ( self, specArray ) : self.entries = [] for item in specArray : self.mergeChildren( item, specArray ) self.entries.append( component.BaseSpec( item ) ) # PUBLIC METHODS def getEntries( self ) : return self.entries def getEntry( self, aString ) : """ Find a BaseSpec by name. """ for entry in self.entries : if entry.getName() is aString : return entry raise error.ResourceException, 'error! cannot find ', aString # PRIVATE METHODS def mergeChildren( self, item, specArray ) : for child in specArray : if child[ 'info' ][ 'parent' ] is item[ 'name' ] : self.mergeContents( child, item ) def mergeContents( self, child, parent ) : childEvents = child[ 'info' ][ 'events' ] parentEvents = parent[ 'info' ][ 'events' ] events = [] for e in childEvents : events.append( e ) for e in parentEvents : events.append( e ) child[ 'info' ][ 'events' ] = events childAttributes = child[ 'info' ][ 'attributes' ] parentAttributes = parent[ 'info' ][ 'attributes' ] childAttributes.update( parentAttributes ) PythonCard-0.8.2/samples/0000755000076500007650000000000010434046771015164 5ustar alexalex00000000000000PythonCard-0.8.2/samples/addresses/0000755000076500007650000000000010434046771017141 5ustar alexalex00000000000000PythonCard-0.8.2/samples/addresses/addresses.py0000644000076500007650000003076710347526321021502 0ustar alexalex00000000000000#!/usr/bin/python """ A lot of the record structure and logic mirrors Winkler's approach used in the textIndexer, but I coded this from scratch to see what kind of differences would appear. I also didn't bother using a separate class to hold the internal data structures initially, so this version will get refactored. I realized that once I started porting the Addresses stack from HyperCard, we could use this addresses sample to test different approaches to storage formats: ZODB, mySQL, plain text files using lists and dictionaries, CSV text files, etc. """ __version__ = "$Revision: 1.36 $" __date__ = "$Date: 2005/12/13 11:13:21 $" from PythonCard import configuration, dialog, model, util import os, sys import pprint import shutil import outlook DATA_FILE = 'data.txt' """ The Document class below has a reference to the view, so it is responsible for updating the fields in the view. There should be an abstract Document class, an abstract RecordsDocument subclass and finally a DictionaryRecordsDocument or a name that reflects that the actual records are stored as a list of dictionaries. If the Document was stored as a DBM or dictionary of dictionaries then an additional field would be needed to keep track of record order and goPrevRecord, goNextRecord, goFirstRecord, and goLastRecord would have to be modified to use that ordering. """ class Document: def __init__(self, view, filename=None): self.view = view self.current = -1 self.fieldNames = self.getFieldNames() if filename is None: self.records = [] else: self.filename = filename self.openFile(filename) """ This should probably be a list supplied as part of initialization. There might also be a list for field order and fields to search. There isn't any meta-data at this point, so there isn't field type info either. """ def getFieldNames(self): fields = [] for wName in self.view.components.iterkeys(): widget = self.view.components[wName] wClass = widget.__class__.__name__ if wClass in ['TextField', 'TextArea'] and widget.visible: fields.append(wName) if fields.count('Notes') == 0: fields.append('Notes') return fields def clearFields(self): for wName in self.fieldNames: self.view.components[wName].text = "" def displayRecord(self, recordNumber): self.clearFields() self.current = recordNumber if self.current != -1: record = self.records[recordNumber] for fld in record: self.view.components[fld].text = record[fld] def goPrevRecord(self): if len(self.records) > 1: prevRec = self.current - 1 if prevRec == -1: prevRec = len(self.records) - 1 self.saveRecord(self.current) self.displayRecord(prevRec) def goNextRecord(self): if len(self.records) > 1: nextRec = self.current + 1 if nextRec == len(self.records): nextRec = 0 self.saveRecord(self.current) self.displayRecord(nextRec) def goFirstRecord(self): if len(self.records) > 1: if self.current != 0: self.saveRecord(self.current) self.displayRecord(0) def goLastRecord(self): n = len(self.records) - 1 if n > 0: if self.current != n: self.saveRecord(self.current) self.displayRecord(n) def findRecord(self, searchText, caseSensitive): # we can't search unless there is at least one record if len(self.records) > 1: self.saveRecord(self.current) current = self.current if not caseSensitive: searchText = searchText.lower() while 1: for name in self.fieldNames: if caseSensitive: fieldText = self.records[self.current][name] else: fieldText = self.records[self.current][name].lower() offset = fieldText.find(searchText) if offset != -1: # if the text is found in the Notes field and it isn't visible # then the selection below doesn't work without making the field # visible, but then the Show Notes/Hide Notes button will be out # of sync if we just set visible = 1 # so some different logic is really needed here #self.view.components[name].visible = 1 # the solution below is a hack if not self.view.components[name].visible: self.view.on_showNotes_command(self.view.components['ShowNotes'], None) self.view.components[name].setSelection(offset, offset + len(searchText)) self.view.components[name].setFocus() return self.goNextRecord() if current == self.current: return def newRecord(self): self.saveRecord(self.current) if self.current == -1: self.current = 0 #self.records.append({}) else: self.current += 1 self.records.insert(self.current, {}) self.clearFields() def deleteRecord(self): # should probably do a dialog here to give the user # a chance to cancel if self.current != -1: del self.records[self.current] if len(self.records) == 0: self.current = -1 elif self.current == len(self.records): # the last record was deleted, # so display the next to last record self.current = self.current - 1 self.displayRecord(self.current) def saveRecord(self, recordNumber): """ it would be more efficient to set a 'dirty' flag per field or at least per record if any fields change but this still works """ n = len(self.records) # in HyperCard there is always at least one record # which is not always what you want, so if we're going to # support 0 records our logic will be different for creating # an empty record initially # the boundary condition of no records will break the code right now if recordNumber == -1: pass if n > 0 and recordNumber > -1 and recordNumber < n: for wName in self.fieldNames: self.records[recordNumber][wName] = self.view.components[wName].text def openFile(self, filename): self.records = [] self.filename = filename try: if os.path.exists(filename): addresses = util.readAndEvalFile(filename) for c in addresses: self.records.append(c) if self.current == -1 and len(self.records) > 0: self.displayRecord(0) except IOError: pass def saveFile(self): # always save the records list # for transparent saves self.saveRecord(self.current) try: f = open(self.filename, "w") pprint.pprint(self.records, f) f.close() except IOError: pass class Addresses(model.Background): def on_initialize(self, event): if not outlook.WIN32_FOUND: self.menuBar.setEnabled('menuFileImportOutlook', 0) self.loadConfig() def loadConfig(self): self.configPath = os.path.join(configuration.homedir, 'addresses') if not os.path.exists(self.configPath): os.mkdir(self.configPath) basePath = self.application.applicationDirectory self.dataPath = os.path.join(self.configPath, DATA_FILE) if not os.path.exists(self.dataPath): shutil.copy2(os.path.join(basePath, DATA_FILE), self.dataPath) self.document = Document(self, self.dataPath) def doExit(self): self.document.saveFile() def on_close(self, event): self.doExit() event.skip() def on_fileImportOutlook_command(self, event): addressesToOutlookMap = {'Name':'FullName', 'Company':'CompanyName', 'Street':'MailingAddressStreet', 'City':'MailingAddressCity', 'State':'MailingAddressState', 'Zip':'MailingAddressPostalCode', 'Phone1':'HomeTelephoneNumber', 'Phone2':'BusinessTelephoneNumber', 'Phone3':'MobileTelephoneNumber', 'Phone4':'Email1Address', 'Notes':'Body' } print "attempting to load Outlook" oOutlook = outlook.MSOutlook() # delayed check for Outlook on win32 box if not oOutlook.outlookFound: # could also display an error message here self.menuBar.setEnabled('menuFileImportOutlook', 0) return print "loading records..." oOutlook.loadRecords() print "importing into addresses" for r in oOutlook.records: aRecord = {} for fld in addressesToOutlookMap: """ if fld == 'Name': names = addressesToOutlookMap[fld] fullName = r[names[0]] + " " + r[names[1]] aRecord['Name'] = fullName.strip() else: """ aRecord[fld] = r[addressesToOutlookMap[fld]] self.document.records.append(aRecord) print "done importing" self.document.goNextRecord() # show that we imported at least one record def on_exit_command(self, event): self.close() def on_goPrev_command(self, event): self.document.goPrevRecord() def on_goNext_command(self, event): self.document.goNextRecord() def on_goFirst_command(self, event): self.document.goFirstRecord() def on_goLast_command(self, event): self.document.goLastRecord() def on_findRecord_command(self, event): result = dialog.findDialog(self) if result.accepted: self.document.findRecord(result.searchText, result.caseSensitive) def on_editUndo_command(self, event): widget = self.findFocus() if hasattr(widget, 'editable') and widget.canUndo(): widget.undo() def on_editRedo_command(self, event): widget = self.findFocus() if hasattr(widget, 'editable') and widget.canRedo(): widget.redo() def on_editCut_command(self, event): widget = self.findFocus() if hasattr(widget, 'editable') and widget.canCut(): widget.cut() def on_editCopy_command(self, event): widget = self.findFocus() if hasattr(widget, 'editable') and widget.canCopy(): widget.copy() def on_editPaste_command(self, event): widget = self.findFocus() if hasattr(widget, 'editable') and widget.canPaste(): widget.paste() def on_editClear_command(self, event): widget = self.findFocus() if hasattr(widget, 'editable'): if widget.canCut(): # delete the current selection, # if we can't do a Cut we shouldn't be able to delete either # which is why i used the test above sel = widget.replaceSelection('') else: ins = widget.getInsertionPoint() widget.replace(ins, ins + 1, '') def on_editSelectAll_command(self, event): widget = self.findFocus() if hasattr(widget, 'editable'): widget.setSelection(0, widget.getLastPosition()) def on_editNewCard_command(self, event): self.document.newRecord() def on_editDeleteCard_command(self, event): self.document.deleteRecord() def on_showNotes_command(self, event): target = event.target if target.label == 'Show Notes': self.components.Notes.visible = 1 target.label = 'Hide Notes' else: self.components.Notes.visible = 0 target.label = 'Show Notes' if __name__ == '__main__': app = model.Application(Addresses) app.MainLoop() PythonCard-0.8.2/samples/addresses/addresses.rsrc.py0000644000076500007650000001543410047606311022437 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'Addresses', 'backgrounds': [ {'type':'Background', 'name':'bgBody', 'title':'Addresses', 'position':(208,183), 'size':(416, 310), 'menubar': { 'type':'MenuBar', 'menus': [ { 'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ { 'type':'MenuItem', 'name':'menuFileImportOutlook', 'label':"&Import Outlook", 'command':'fileImportOutlook'}, { 'type':'MenuItem', 'name':'fileSep1', 'label':'-' }, { 'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit'} ] }, {'type':'Menu', 'name':'Edit', 'label':'&Edit', 'items': [ { 'type':'MenuItem', 'name':'menuEditUndo', 'label':'&Undo\tCtrl+Z', 'command':'editUndo'}, { 'type':'MenuItem', 'name':'menuEditRedo', 'label':'&Redo\tCtrl+Y', 'command':'editRedo'}, { 'type':'MenuItem', 'name':'editSep1', 'label':'-' }, { 'type':'MenuItem', 'name':'menuEditCut', 'label':'Cu&t\tCtrl+X', 'command':'editCut'}, { 'type':'MenuItem', 'name':'menuEditCopy', 'label':'&Copy\tCtrl+C', 'command':'editCopy'}, { 'type':'MenuItem', 'name':'menuEditPaste', 'label':'&Paste\tCtrl+V', 'command':'editPaste'}, { 'type':'MenuItem', 'name':'editSep2', 'label':'-' }, { 'type':'MenuItem', 'name':'menuEditClear', 'label':'Cle&ar\tDel', 'command':'editClear'}, { 'type':'MenuItem', 'name':'menuEditSelectAll', 'label':'Select A&ll\tCtrl+A', 'command':'editSelectAll'}, { 'type':'MenuItem', 'name':'editSep3', 'label':'-' }, { 'type':"MenuItem", 'name':"menuEditNewCard", 'label':"&New Card\tCtrl+N", 'command':'editNewCard'}, { 'type':"MenuItem", 'name':"menuEditDeleteCard", 'label':"&Delete Card", 'command':'editDeleteCard'}, ] }, {'type':'Menu', 'name':'Go', 'label':'&Go', 'items': [ { 'type':"MenuItem", 'name':"menuGoNextCard", 'label':"&Next Card\tCtrl+1", 'command':'goNext'}, { 'type':"MenuItem", 'name':"menuGoPrevCard", 'label':"&Prev Card\tCtrl+2", 'command':'goPrev'}, { 'type':"MenuItem", 'name':"menuGoFirstCard", 'label':"&First Card\tCtrl+3", 'command':'goFirst'}, { 'type':"MenuItem", 'name':"menuGoLastCard", 'label':"&Last Card\tCtrl+4", 'command':'goLast'}, ] } ] }, 'components': [ {'type':'TextArea', 'name':'Notes', 'position':(7,64), 'size':(278, 200), 'visible':0, }, {'type':'TextField', 'name':'Name', 'position':(100,17), 'size':(241, -1), }, {'type':'TextField', 'name':'Company', 'position':(100,39), 'size':(241, -1), }, {'type':'TextField', 'name':'Street', 'position':(100,72), 'size':(183, -1), }, {'type':'TextField', 'name':'City', 'position':(100,94), 'size':(183, -1), }, {'type':'TextField', 'name':'State', 'position':(100,116), 'size':(183, -1), }, {'type':'TextField', 'name':'Zip', 'position':(100,138), 'size':(183, -1), }, {'type':'TextField', 'name':'Phone1', 'position':(100, 176), 'size':(169, -1), }, {'type':'TextField', 'name':'Phone2', 'position':(100, 198), 'size':(169, -1), }, {'type':'TextField', 'name':'Phone3', 'position':(100, 220), 'size':(169, -1), }, {'type':'TextField', 'name':'Phone4', 'position':(100, 242), 'size':(169, -1), }, {'type':'StaticText', 'name':'NameLabel', 'position':(7,24), 'size':(68, -1), 'text':'Name', 'alignment':'right', }, {'type':'StaticText', 'name':'CompanyLabel', 'position':(7,46), 'size':(68, -1), 'text':'Company', 'alignment':'right', }, {'type':'StaticText', 'name':'StreetLabel', 'position':(8,79), 'size':(68, -1), 'text':'Street', 'alignment':'right', }, {'type':'StaticText', 'name':'CityLabel', 'position':(8,101), 'size':(68, -1), 'text':'City', 'alignment':'right', }, {'type':'StaticText', 'name':'ZipCodeLabel', 'position':(8,145), 'size':(68, -1), 'text':'Zip Code', 'alignment':'right', }, {'type':'StaticText', 'name':'TelephoneLabel', 'position':(7,180), 'size':(68, -1), 'text':'Telephone', 'alignment':'right', }, {'type':'TextField', 'name':'Sortorder', 'position':(0,0), 'size':(30, -1), 'text':'1', 'visible':0, }, {'type':'TextField', 'name':'NameOrder', 'position':(141,0), 'size':(73, -1), 'text':'last word', 'visible':0, }, {'type':'StaticText', 'name':'StateLabel', 'position':(8,123), 'size':(68, -1), 'text':'State', 'alignment':'right', }, {'type':'TextField', 'name':'CorrectName', 'position':(100,0), 'size':(241, -1), 'visible':0, }, {'type':'Button', 'name':'NewCard', 'position':(301,152), 'size':(100, -1), 'label':'New Card', 'command':'editNewCard' }, {'type':'Button', 'name':'DeleteCard', 'position':(301,178), 'size':(100, -1), 'label':'Delete Card', 'command':'editDeleteCard' }, {'type':'Button', 'name':'Find', 'position':(301,100), 'size':(100, -1), 'label':'Find', 'command':'findRecord' }, {'type':'Button', 'name':'ShowNotes', 'position':(301,126), 'size':(100, -1), 'label':'Show Notes', 'command':'showNotes', }, {'type':'ImageButton', 'name':'Prev', 'position':(323,68), 'size':(26, 23), 'file':'prev.gif', 'command':'goPrev', }, {'type':'ImageButton', 'name':'Next', 'position':(355,69), 'size':(25, 23), 'file':'next.gif', 'command':'goNext', }, ] } ] } } PythonCard-0.8.2/samples/addresses/data.txt0000644000076500007650000000126607340776772020635 0ustar alexalex00000000000000[{ 'Name': 'Jane Doe', 'Company': 'Acme Dot Company', 'Street': '12 Elm Street', 'City': 'Other Town', 'State': 'Massachusetts', 'Zip': '27111', 'Phone1': '(617) 555-1212', 'Phone2': '', 'Phone3': '', 'Phone4': '', 'Notes': 'Her birthday is September 24. \nHer FAX number is 555-1111.\n \n \n', 'CorrectName': '', }, { 'Name': 'A. Royce Walthrop', 'Company': 'Acme Sprockets', 'Street': '1234 Main Street', 'City': 'Some Town', 'State': 'California', 'Zip': '95014', 'Phone1': '(415) 555-1234 (work)', 'Phone2': '', 'Phone3': '', 'Phone4': '', 'Notes': 'His birthday is April 26.\n\nHe used to work at Acme Dot Company.\n\nFAX: 555-1111 \n \n', 'CorrectName': '', }, ] PythonCard-0.8.2/samples/addresses/fields.txt0000644000076500007650000000761107340776772021172 0ustar alexalex00000000000000{'stack':{'type':'Stack', 'name':'Addresses', 'title':'Addresses', 'position':(208,183), 'size':(416, 276), 'backgrounds': [ {'type':'Background', 'file':'addresses.py', 'classname':'Addresses', 'name':'bgBody', 'components': [ {'type':'TextField', 'name':'Name', 'position':(100,17), 'size':(241, 24), }, {'type':'TextField', 'name':'Company', 'position':(100,39), 'size':(241, 23), }, {'type':'TextField', 'name':'Street', 'position':(100,72), 'size':(183, 23), }, {'type':'TextField', 'name':'City', 'position':(100,94), 'size':(183, 23), }, {'type':'TextField', 'name':'State', 'position':(100,116), 'size':(183, 23), }, {'type':'TextField', 'name':'Zip', 'position':(100,138), 'size':(183, 23), }, {'type':'TextField', 'name':'Phone1', 'position':(114,176), 'size':(169, 17), }, {'type':'TextField', 'name':'Phone2', 'position':(114,192), 'size':(169, 17), }, {'type':'TextField', 'name':'Phone3', 'position':(114,208), 'size':(169, 17), }, {'type':'TextField', 'name':'Phone4', 'position':(114,224), 'size':(169, 17), }, {'type':'StaticText', 'name':'NameLabel', 'position':(7,24), 'size':(68, 16), 'text':'Name', 'alignment':'right', }, {'type':'StaticText', 'name':'CompanyLabel', 'position':(7,46), 'size':(68, 16), 'text':'Company', 'alignment':'right', }, {'type':'StaticText', 'name':'StreetLabel', 'position':(8,79), 'size':(68, 16), 'text':'Street', 'alignment':'right', }, {'type':'StaticText', 'name':'CityLabel', 'position':(8,101), 'size':(68, 16), 'text':'City', 'alignment':'right', }, {'type':'StaticText', 'name':'ZipCodeLabel', 'position':(8,145), 'size':(68, 16), 'text':'Zip Code', 'alignment':'right', }, {'type':'StaticText', 'name':'TelephoneLabel', 'position':(7,180), 'size':(68, 16), 'text':'Telephone', 'alignment':'right', }, {'type':'TextField', 'name':'Sortorder', 'position':(0,0), 'size':(30, 19), 'text':'1', 'visible':0, }, {'type':'TextField', 'name':'NameOrder', 'position':(141,0), 'size':(73, 19), 'text':'last word', 'visible':0, }, {'type':'StaticText', 'name':'StateLabel', 'position':(8,123), 'size':(68, 16), 'text':'State', 'alignment':'right', }, {'type':'TextArea', 'name':'Notes', 'position':(7,64), 'size':(278, 183), 'visible':0, }, {'type':'TextField', 'name':'CorrectName', 'position':(100,0), 'size':(241, 24), 'visible':0, }, {'type':'Button', 'name':'bkgndbuttonid108', 'position':(293,198), 'size':(115, 48), 'label':'bkgnd button id 108', }, {'type':'Button', 'name':'PhoneNumber4', 'position':(99,227), 'size':(17, 17), 'label':'Phone Number 4', }, {'type':'Button', 'name':'PhoneNumber3', 'position':(99,211), 'size':(17, 17), 'label':'Phone Number 3', }, {'type':'Button', 'name':'PhoneNumber2', 'position':(99,195), 'size':(17, 17), 'label':'Phone Number 2', }, {'type':'Button', 'name':'PhoneNumber1', 'position':(99,179), 'size':(17, 16), 'label':'Phone Number 1', }, {'type':'Button', 'name':'Appointments', 'position':(297,198), 'size':(66, 49), 'label':'Appointments', }, {'type':'Button', 'name':'Home', 'position':(368,210), 'size':(47, 44), 'label':'Home', }, {'type':'Button', 'name':'NewCard', 'position':(301,138), 'size':(100, 19), 'label':'New Card', }, {'type':'Button', 'name':'DeleteCard', 'position':(301,161), 'size':(100, 19), 'label':'Delete Card', }, {'type':'Button', 'name':'FindÉ', 'position':(301,92), 'size':(100, 19), 'label':'FindÉ', }, {'type':'Button', 'name':'ShowNotes', 'position':(301,115), 'size':(100, 19), 'label':'Show Notes', }, {'type':'Button', 'name':'Prev', 'position':(323,68), 'size':(26, 23), 'label':'Prev', }, {'type':'Button', 'name':'Next', 'position':(355,68), 'size':(25, 23), 'label':'Next', }, {'type':'Button', 'name':'Unmark', 'position':(346,5), 'size':(18, 19), 'label':'Unmark', }, {'type':'Button', 'name':'bkgndbuttonid103', 'position':(336,1), 'size':(37, 28), 'label':'bkgnd button id 103', }, ] } ] } } PythonCard-0.8.2/samples/addresses/next.gif0000644000076500007650000000041607340776534020620 0ustar alexalex00000000000000GIF89aÄÿÿÿÚÚÚÓÓÓÌÌÌÄÄÄ»»»²²²©©©£££›››’’’ŒŒŒ„„„{{{rrrlllcccYYYFFF===555)))ÿÿÿ!ù,‹ &Ždižhª®lë¾p,Ï£eѨ]á¦uQ;^­B Æ.Èäe"¡XŒ¯‰Ò2‰@"“g,+‘D¬pDB„M*‘°Z iR¢èµÜÑ`0\ç´<Ü@Q a €Q  † Q›› ˜B ¢£¡™B ¬­°£³´µ¶·¸¹!;PythonCard-0.8.2/samples/addresses/notes.txt0000644000076500007650000000246707340776772021060 0ustar alexalex00000000000000script.txt is the HyperTalk script that I used in the Addresses stack. It is not great code, I haven't done any real HyperCard/HyperTalk programming for over four years, so a HyperTalk expert is more than welcome to clean it up and make it handle all the various button and field types correctly. data.txt is the output of the aList variable in the exportToPythonCard script. There was one bad character in data.txt that I deleted, but I didn't go back to investigate it in the script. My guess is that all the 8-bit Mac characters need to be sanitized before exporting. fields.txt is the output of the sInfo variable in the exportToPythonCard script. I made changes to the output when I copied it to addresses.rsrc.py: I added 'command':'showNotes', to Button 'ShowNotes' I renamed the Button Find which had a special Mac ... character. I removed the following background buttons: bkgndbuttonid108 PhoneNumber4 PhoneNumber3 PhoneNumber2 PhoneNumber1 Appointments Home Unmark bkgndbuttonid103 I changed Prev and Next to be ImageButtons. I changed the height of the other buttons to -1, so they would have the default height and then I added a few more pixels to their y positions so they wouldn't touch each other. I added 'command' to Prev and Next ImageButtons. I added 'command' to Find, NewCard, and DeleteCard Buttons. PythonCard-0.8.2/samples/addresses/outlook.py0000644000076500007650000000536710347526321021217 0ustar alexalex00000000000000#!/usr/bin/python """ I need a more generic way of dealing with these modules that may not be available. Also, if the MSOutlook __init__ can't be completed, what's an appropriate failure mechanism? """ __version__ = "$Revision: 1.6 $" __date__ = "$Date: 2005/12/13 11:13:21 $" try: import win32com.server.util import win32com.client import pythoncom import pywintypes import winerror WIN32_FOUND = 1 except ImportError: WIN32_FOUND = 0 import traceback import sys class MSOutlook: def __init__(self): self.outlookFound = 0 if WIN32_FOUND: #oOutlookApp = win32com.client.Dispatch("Outlook.Application.9") #self.oOutlookApp = win32com.client.Dispatch("Outlook.Application") # use gencache.EnsureDispatch to make sure makepy is run if necessary # this dramatically speeds up usage of the COM object self.oOutlookApp = win32com.client.gencache.EnsureDispatch("Outlook.Application") self.outlookFound = 1 else: #print "unable to load Outlook" pass self.olFolderInbox = 6 self.olContactItem = 2 self.olFolderContacts = 10 self.olContact = 40 self.olFolderDisplayNormal = 0 self.olMinimized = 1 self.olNormalWindow = 2 self.records = [] def loadRecords(self): if not self.outlookFound: return # this should use more try/except blocks or nested blocks onMAPI = self.oOutlookApp.GetNamespace("MAPI") ofContacts = onMAPI.GetDefaultFolder(self.olFolderContacts) #print "number of contacts:", len(ofContacts.Items) for oc in range(len(ofContacts.Items)): contact = ofContacts.Items.Item(oc + 1) if contact.Class == self.olContact: record = {} record['FullName'] = contact.FullName record['CompanyName'] = contact.CompanyName record['MailingAddressStreet'] = contact.MailingAddressStreet record['MailingAddressCity'] = contact.MailingAddressCity record['MailingAddressState'] = contact.MailingAddressState record['MailingAddressPostalCode'] = contact.MailingAddressPostalCode record['HomeTelephoneNumber'] = contact.HomeTelephoneNumber record['BusinessTelephoneNumber'] = contact.BusinessTelephoneNumber record['MobileTelephoneNumber'] = contact.MobileTelephoneNumber record['Email1Address'] = contact.Email1Address record['Body'] = contact.Body self.records.append(record) #print "InterfaceCount/GatewayCount %d/%d" % (pythoncom._GetInterfaceCount(), pythoncom._GetGatewayCount()) PythonCard-0.8.2/samples/addresses/prev.gif0000644000076500007650000000041707340776534020617 0ustar alexalex00000000000000GIF89aÄÿÿÿÚÚÚÓÓÓÌÌÌÄÄÄ»»»²²²©©©£££›››’’’ŒŒŒ„„„{{{rrrlllcccYYYFFF===555)))ÿÿÿ!ù,Œ &Ždižhª®lë¾p,ÏôkYµYÝ9YQ\S)î†;Šdri:/±Ý$‰L,Ï ¬(‰<¾ÕˆDbѺ(JÈw½ŽTÌ,£á`ÛÝp–¢€hØÛo0  u y-  ‰ 2‘ ~¡¡.‘ C"ª« ®«±²µ¶·¸¹/!;PythonCard-0.8.2/samples/addresses/readme.txt0000644000076500007650000000334607400116712021135 0ustar alexalex00000000000000addresses is the first test of converting the layout and data of an existing HyperCard stack to the PythonCard format. All the code used to do the conversion, limitations of the conversion, and the steps of the conversion are documented. addresses can import Outlook contacts. Comma separated values (CSV) import will be added in the future. addresses also implements transparent loading and saving of the contact data to a separate text file. The textIndexer sample and addresses thus provide the start of a generic transparent data storage model for PythonCard that will eventually be available to all PythonCard apps that want to use it. This sample is an experiment in converting a HyperCard stack to a PythonCard program. I used the Addresses stack that comes with HyperCard as the test case. The layout and rough functionality of the port is supposed to mirror the original, so if you don't like the interface, choice of fields, etc. then blame the original stack, I'm just the porter ;-) The original stack actually has much more functionality than the port, but this is a simple test and it is too early in the development of PythonCard to try and duplicate everything. I added the 'Import Outlook' menu item as yet another test. First of all, I'm not exactly sure what happens when the necessary modules can't be found, say on a *nix machine or a Windows box without the Python win32 extensions or Outlook isn't installed. This is not meant to be an application that someone would use every day, it is only a test. 2001-11-24 I renamed the old addresses and its resource file to addresses052.py and addresses052.rsrc.py since they are from prototype release 0.5.2. If you're interested in the conversion from HyperCard, you should look at those files.PythonCard-0.8.2/samples/addresses/script.txt0000644000076500007650000001141007340776772021220 0ustar alexalex00000000000000on exportToPythonCard put stackInfo() into sInfo put backgroundInfo() after sInfo put "] }" & return & "] }" & return & "}" & return after sInfo -- write results to a 'export.rsrc.py' file -- loop through the cards of the background and export -- the data to a dictionary put exportDataToList() into aList end exportToPythonCard function exportDataToList put "[" into txt go to first card of this bg repeat with b = 1 to number of cds in this bg put "{" & return after txt repeat with c = 1 to number of bg flds if not the sharedText of bg fld c then put "'" & removeSpaces(short name of bg fld c) & "': '" after txt put fixReturns(bg fld c) after txt put "', " & return after txt end if end repeat put "}," & return after txt go next end repeat put "]" & return after txt return txt end exportDataToList function removeSpaces txt put offset(" ", txt) into o repeat while o > 0 put empty into char o of txt put offset(" ", txt) into o end repeat return txt end removeSpaces function fixReturns txt put offset(return, txt) into o repeat while o > 0 put "\n" into char o of txt put offset(return, txt) into o end repeat return txt end fixReturns function stackInfo put "{'stack'}" into bob put "{'stack':{'type':'Stack'," & return into s put "'name':'" & removeSpaces(the short name of this stack) & "'," & return after s put "'title':'" & removeSpaces(the short name of this stack) & "'," & return after s put "'position':(" after s put the topLeft of card window & "), " & return after s put "'size':(" after s put the width of this card & ", " after s put (the height of this card) + 40 & ")," & return after s put "'backgrounds':" & return & "[" & return after s return s end stackInfo function backgroundInfo put "{'type':'Background'," & return into s put "'file':'addresses.py'," & return after s put "'classname':'Addresses'," & return after s put "'name':'bgBody'," & return after s put "'components':" & return & "[" & return after s repeat with i = 1 to the number of flds put fldDescription(i) after s end repeat repeat with i = 1 to the number of bg btns put btnDescription(i) after s end repeat return s end backgroundInfo function fldDescription i -- determine the field type put fldType(i) into fieldType if fieldType = "StaticText" then put "'text':'" & the value of bg fld i & "', " & return into textStr put "'alignment':'" & the textAlign of bg fld i & "', " & return after textStr else if the sharedText of bg fld i then put "'text':'" & the value of bg fld i & "', " & return into textStr else put "" into textStr end if -- this doesn't look all that great, so I commented it out -- if the style of bg fld i = "transparent" then -- put "'border':'none', " & return after textStr -- end if end if -- then build up the attributes appropriately put "{'type':'" & fieldType & "', 'name':'" & fldName(i) & "'," & return into s put "'position':(" & the topLeft of bg fld i & "), " & return after s put "'size':(" & the width of bg fld i & ", " after s put the height of bg fld i & "), " & return after s put textStr after s if fldVisible(i) = 0 then put "'visible':0, " & return after s end if put "}, " & return after s return s end fldDescription function btnDescription i -- determine the button type put btnType(i) into buttonType if buttonType = "Button" then put "'label':'" & short name of bg btn i & "', " & return into textStr else put "" into textStr end if -- then build up the attributes appropriately put "{'type':'" & buttonType & "', 'name':'" & btnName(i) & "'," & return into s put "'position':(" & the topLeft of bg btn i & "), " & return after s put "'size':(" & the width of bg btn i & ", " after s put the height of bg btn i & "), " & return after s put textStr after s put "}, " & return after s return s end btnDescription function btnType i -- this is just a quick hack -- bad things will happen if it is used -- on button types like radio, check box, popup, etc. return "Button" end btnType function btnName i return removeSpaces(the short name of bg btn i) end btnName function fldName i return removeSpaces(the short name of bg fld i) end fldName function fldType i if the sharedText of bg fld i then -- maybe look at lockText as well? if the textAlign of bg fld i = "left" then return "TextField" else return "StaticText" end if else if the dontWrap of bg fld i then return "TextField" else -- should probably check the return "TextArea" end if end fldType function fldVisible i if the visible of bg fld i then return 1 else return 0 end if end fldVisible PythonCard-0.8.2/samples/ataxx/0000755000076500007650000000000010434046771016311 5ustar alexalex00000000000000PythonCard-0.8.2/samples/ataxx/ataxx.py0000644000076500007650000002242210132107124017773 0ustar alexalex00000000000000#!/usr/bin/python """ Simplistic implementation of the board game reversi, better known as Othello. The algorithm for determining legal moves is not particularly efficient since no attempt is made to cache legal moves. """ """ __version__ = "$Revision: 1.4 $" __date__ = "$Date: 2004/10/10 01:20:20 $" """ from PythonCard import model from random import randint import time EMPTY = 0 BLOCK = 1 HUMAN = RED = 2 COMPUTER = PLAYER2 = BLUE = 3 BOARDWIDTH = BOARDHEIGHT = 7 DIRECTIONS = ((-1, -1), (0, -1), (1, -1), (-1, 0), (1, 0), (-1, 1), (0, 1), (1, 1)) SPLIT = DIRECTIONS JUMP = ((-2, -2), (-1, -2), (0, -2), (1, -2), (2, -2), (-2, -1), (2, -1), (-2, 0), (2, 0), (-2, 1), (2, 1), (-2, 2), (-1, 2), (0, 2), (1, 2), (2, 2)) BOARDCOLOR = 'black' GRIDCOLOR = 'cyan' BLOCKCOLOR = 'light gray' CELLWIDTH = CELLHEIGHT = 37 class GameBoard: def __init__(self): self.initializeBoard() def initializeBoard(self): self.board = {} # the board references are column, row # to simplify x, y translation for column in range(BOARDWIDTH): for row in range(BOARDHEIGHT): self.board[(column, row)] = EMPTY # different board arrangements could be used # to vary the gameplay self.board[(3, 0)] = BLOCK self.board[(0, 3)] = BLOCK self.board[(6, 3)] = BLOCK self.board[(3, 6)] = BLOCK self.board[(0, 0)] = HUMAN self.board[(6, 6)] = HUMAN self.board[(6, 0)] = COMPUTER self.board[(0, 6)] = COMPUTER # black always goes first self.nextMove = HUMAN #self.buildLegalMoves(self.nextMove) self.gameOver = False def opponentColor(self, color): if color == HUMAN: return COMPUTER else: return HUMAN def buildLegalMoves(self, column, row): """build a dictionary of legal moves with the (column, row) as the key and the number of pieces flipped as the value""" board = self.board legalMoves = {} for dx, dy in SPLIT: x = column + dx y = row + dy if board.get((x, y), None) == EMPTY: legalMoves[(x, y)] = 1 for dx, dy in JUMP: x = column + dx y = row + dy if board.get((x, y), None) == EMPTY: legalMoves[(x, y)] = 1 return legalMoves def makeMove(self, fromX, fromY, toX, toY): board = self.board color = board[(fromX, fromY)] opponent = self.opponentColor(color) dx = toX - fromX dy = toY - fromY if abs(dx) == 2 or abs(dy) == 2: # jump, so move the piece board[(fromX, fromY)] = EMPTY board[(toX, toY)] = color # now flip all the opponent pieces touching the new position for dx, dy in DIRECTIONS: x = toX + dx y = toY + dy if board.get((x, y), None) == opponent: board[(x, y)] = color self.nextMove = opponent def getScore(self): """return a tuple containing the number of empty, black, and white squares""" score = {HUMAN:0, COMPUTER:0, EMPTY:0, BLOCK:0} for value in self.board.values(): score[value] += 1 return score class Ataxx(model.Background): def on_initialize(self, event): self.boardModel = GameBoard() self.components.bufOff.size = (BOARDWIDTH * CELLWIDTH + 1, BOARDHEIGHT * CELLHEIGHT + 1) self.singleItemExpandingSizerLayout() self.drawBoard() self.updateStatus() self.player = HUMAN self.computer = COMPUTER self.lastHover = None self.startLocation = None ## # this is leftover from the reversi sample ## # and has to be updated once there is an ataxx computer strategy ## # rather than just human vs. human ## if self.computer == HUMAN: ## self.boardModel.doComputerMove(HUMAN) ## ## ## def computerMove(self): ## if self.menuBar.getChecked('menuStrategyFlipMostPieces'): ## self.boardModel.doFlipMostPiecesComputerMove(self.computer) ## else: ## self.boardModel.doRandomComputerMove(self.computer) ## # sleep for a second to make it appear ## # the computer thought long and hard on her choice :) ## time.sleep(1) ## self.drawBoard() ## self.updateStatus() def newGame(self): self.boardModel.initializeBoard() self.drawBoard() self.updateStatus() ## if self.computer == COMPUTER: ## self.computerMove() def drawCell(self, x, y, state): view = self.components.bufOff if state in [HUMAN, COMPUTER]: if state == HUMAN: color = 'red' else: color = 'blue' view.fillColor = color view.foregroundColor = 'black' center = (x * CELLWIDTH + CELLWIDTH / 2 + 1, y * CELLHEIGHT + CELLHEIGHT / 2 + 1) view.drawCircle(center, round((CELLWIDTH / 2.0) - 3)) elif state == BLOCK: view.fillColor = BLOCKCOLOR view.foregroundColor = BLOCKCOLOR view.drawRectangle((x * CELLWIDTH + 3, y * CELLHEIGHT + 3), (CELLWIDTH - 5, CELLHEIGHT - 5)) else: view.fillColor = BOARDCOLOR view.foregroundColor = BOARDCOLOR view.drawRectangle((x * CELLWIDTH + 1, y * CELLHEIGHT + 1), (CELLWIDTH - 2, CELLHEIGHT - 2)) def drawBoard(self): view = self.components.bufOff view.autoRefresh = False view.backgroundColor = BOARDCOLOR view.clear() # draw the right and bottom edge borders view.foregroundColor = GRIDCOLOR view.drawLine((0, BOARDHEIGHT * CELLHEIGHT), (BOARDWIDTH * CELLWIDTH, BOARDHEIGHT * CELLHEIGHT)) view.drawLine((BOARDWIDTH * CELLWIDTH, 0), (BOARDWIDTH * CELLWIDTH, BOARDHEIGHT * CELLHEIGHT)) for x in range(BOARDWIDTH): view.foregroundColor = GRIDCOLOR view.drawLine((x * CELLWIDTH, 0), (x * CELLWIDTH, BOARDHEIGHT * CELLHEIGHT)) for y in range(BOARDHEIGHT): view.foregroundColor = GRIDCOLOR view.drawLine((0, y * CELLHEIGHT), (BOARDWIDTH * CELLWIDTH, y * CELLHEIGHT)) state = self.boardModel.board[(x, y)] self.drawCell(x, y, state) view.autoRefresh = True view.refresh() def updateStatus(self): if self.boardModel.gameOver: score = self.boardModel.getScore() playerScore = score[self.player] computerScore = score[self.computer] scoreString = "Red: %d Blue: %d" % (score[HUMAN], score[COMPUTER]) if playerScore > computerScore: message = "Player won!" elif playerScore < computerScore: message = "Computer won!" else: message = "Tie Game" status = message + " - " + scoreString else: if self.boardModel.nextMove == HUMAN: status = "Red's move" else: status = "Blue's move" self.statusBar.text = status def on_bufOff_mouseDown(self, event): self.startLocation = None x, y = event.position x = x / CELLWIDTH y = y / CELLHEIGHT if (x >= 0 and x < BOARDWIDTH) and (y >= 0 and y < BOARDHEIGHT): if self.boardModel.board[(x, y)] == self.boardModel.nextMove: self.startLocation = (x, y) self.legalMoves = self.boardModel.buildLegalMoves(x, y) def on_bufOff_mouseDrag(self, event): if self.startLocation: x, y = event.position x = x / CELLWIDTH y = y / CELLHEIGHT #if self.boardModel.legalMove(x, y, self.boardModel.nextMove): if (x, y) != self.lastHover: # erase lastHover if needed if self.lastHover and self.boardModel.board[self.lastHover] is EMPTY: self.drawCell(self.lastHover[0], self.lastHover[1], EMPTY) # if the move is legal, show it if self.legalMoves.get((x, y), None): self.drawCell(x, y, self.boardModel.nextMove) # don't track positions outside the valid range if (x >= 0 and x < BOARDWIDTH) and (y >= 0 and y < BOARDHEIGHT): self.lastHover = (x, y) def on_bufOff_mouseUp(self, event): if self.startLocation: x, y = event.position # this is a simplistic translation # when users click on the lines # separating cells they may get a cell # they didn't expect x = x / CELLWIDTH y = y / CELLHEIGHT if self.legalMoves.get((x, y), None): self.boardModel.makeMove(self.startLocation[0], self.startLocation[1], x, y) self.drawBoard() self.updateStatus() def on_menuFileNewGame_select(self, event): self.newGame() if __name__ == '__main__': app = model.Application(Ataxx) app.MainLoop() PythonCard-0.8.2/samples/ataxx/ataxx.rsrc.py0000644000076500007650000000267110047606313020760 0ustar alexalex00000000000000 { 'application':{ 'type':'Application', 'name':'Ataxx', 'backgrounds': [ { 'type':'Background', 'name':'bgAtaxx', 'title':'Ataxx Game', 'size':( 350, 350 ), 'statusBar':True, 'menubar': { 'type':'MenuBar', 'menus': [ { 'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ { 'type':'MenuItem', 'name':'menuFileNewGame', 'label':'&New Game\tCtrl+N' }, { 'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit' } ] }, { 'type':'Menu', 'name':'mnuStrategy', 'label':'&Strategy', 'items': [ { 'type':'MenuItem', 'name':'menuStrategyFlipMostPieces', 'label':'Flip Most Pieces', 'checkable':1, 'checked':1 }, { 'type':'MenuItem', 'name':'menuStrategyRandom', 'label':'Random', 'checkable':1, 'checked':0}, ] } ] }, 'components': [ { 'type':'BitmapCanvas', 'name':'bufOff', 'position':(0, 30), 'size':(300, 300), 'backgroundColor':'lightgray', }, ] } ] } } PythonCard-0.8.2/samples/ataxx/readme.txt0000644000076500007650000000034310046023754020302 0ustar alexalex00000000000000Ataxx http://www.pressibus.org/ataxx/indexgb.html THE GAME ISN'T DONE YET, IT CURRENTLY HANDLES HUMAN VERSUS HUMAN, BUT DOESN'T CHECK FOR WHETHER THE GAME IS OVER. I JUST WANTED TO GET THIS INTO CVS SO I DON'T LOSE THE CODE. PythonCard-0.8.2/samples/chat/0000755000076500007650000000000010434046771016103 5ustar alexalex00000000000000PythonCard-0.8.2/samples/chat/chat.py0000644000076500007650000000626610046216005017372 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.6 $" __date__ = "$Date: 2004/05/05 16:53:25 $" """ from PythonCard import model import threading import Queue import wx # EchoServer derived # from echo server example in Programming Python by Mark Lutz # get socket constructor and constants import socket # server machine, '' means local host myHost = '' # listen on a non-reserved port number myPort = 50007 class EchoServer: def __init__(self, parent): self._parent = parent self.keepRunning = 1 def server(self): # make a TCP socket object sockobj = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # bind it to server port number sockobj.bind((myHost, myPort)) # listen, allow 5 pending connects sockobj.listen(5) # listen until process killed while self.keepRunning: #print 'outer loop' connection, address = sockobj.accept() # wait for next client connect #print 'Server connected by', address # connection is a new socket while self.keepRunning: #print 'inner loop' # read next line on client socket data = connection.recv(1024) if not data: break self._parent.msgQueue.put(data) wx.WakeUpIdle() connection.close() # The same port as used by the server PORT = myPort def echoSend(host, port, txt): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((host, port)) s.send(txt) s.close() class Chat(model.Background): def on_initialize(self, event): self.msgQueue = Queue.Queue() self.components.fldYourIPAddress.text = socket.gethostbyname(socket.gethostname()) self.echoServer = EchoServer(self) self.thread = threading.Thread(target = self.echoServer.server) # I think this allows Python to kill the thread when we quit wxPython # setDaemon must be called before start self.thread.setDaemon(1) self.thread.start() def on_idle(self, event): if not self.msgQueue.empty(): msg = self.msgQueue.get() self.doDisplayMsgReceived(msg) event.RequestMore() def doDisplayMsgReceived(self, data): if data is not None: self.components.fldTranscript.appendText(data + '\n') else: pass def on_btnSend_mouseClick(self, event): #print "btnSend", self.components.fldSendAddresses.text, PORT, self.components.fldInput.text txt = self.components.fldNickname.text + \ " (" + self.components.fldYourIPAddress.text + "): " + \ self.components.fldInput.text addresses = self.components.fldSendAddresses.text.split(',') #print addresses for ip in addresses: echoSend(ip.strip(), PORT, txt) self.components.fldTranscript.appendText(txt + '\n') self.components.fldInput.text = "" #print "after send" def on_close(self, event): self.echoServer.keepRunning = 0 event.skip() if __name__ == '__main__': app = model.Application(Chat) app.MainLoop() PythonCard-0.8.2/samples/chat/chat.rsrc.py0000644000076500007650000000337310047606314020345 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'Chat', 'backgrounds': [ {'type':'Background', 'name':'bgMin', 'title':'Chat PythonCard Application', 'size':(510, 482), 'menubar': {'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'menuFile', 'label':'File', 'items': [ {'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit' }, ] }, ] }, 'components': [ {'type':'StaticText', 'name':'stcYourIP', 'position':(170, 316), 'text':'Your IP Address:', }, {'type':'StaticText', 'name':'stcIPAddress', 'position':(2, 341), 'text':'Send to IP addresses:', }, {'type':'StaticText', 'name':'stcNickName', 'position':(2, 316), 'text':'Nick Name:', }, {'type':'TextArea', 'name':'fldTranscript', 'position':(0, -2), 'size':(500, 311), 'editable':0, }, {'type':'TextField', 'name':'fldNickname', 'position':(67, 312), 'size':(77, -1), 'text':'YourName', }, {'type':'TextField', 'name':'fldYourIPAddress', 'position':(258, 312), 'size':(85, -1), 'text':'127.0.0.1', }, {'type':'TextField', 'name':'fldSendAddresses', 'position':(112, 335), 'size':(274, -1), 'text':'127.0.0.1', }, {'type':'TextArea', 'name':'fldInput', 'position':(-2, 358), 'size':(388, 79), }, {'type':'Button', 'name':'btnSend', 'position':(410, 410), 'label':'Send', }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/samples/chat/readme.txt0000644000076500007650000000366607501743745020122 0ustar alexalex00000000000000This is just a basic chat client/server app. It uses the Queue module so the server thread can post messages to the main GUI event loop. One notable feature of this sample is that messages can be broadcast to more than one machine, so a group of people all using the chat sample can carry on a type of conference. This is just a sample though. I'm hoping that it will inspire other people to do a real chat client using the Jabber protocol or perhaps a simple IRC client. Enter the Nick Name (e.g. Kevin) that you would like to appear on the machines you're sending to into the "Nick Name:" field. Enter the IP addresses you want to send your messages to separated by commas in the "Send to IP addresses:" field. By default, the chat sample is set to send messages to 127.0.0.1 which is your local machine, so you can test the sample by sending messages to yourself. Enter the message you want to send in the bottom field and then click the Send button. Each message you send and receive from other people running the chat sample will be displayed in the top field. For example, after changing the "Nick Name:" field to "Kevin", typing "Hello chat" in the bottom field and clicking "Send" the top field might show: Kevin (10.0.0.2): Hello chat Kevin (10.0.0.2): Hello chat I made up the IP address above. Your machine's IP address will automatically be sent by the chat client as a way of helping identify where each message comes from. When the chat sample starts up it tries to determine your IP address and puts it in the "Your IP Address:" field. If you are using Network Address Translation (NAT) at home, it is quite likely that the IP address that other users need to send to is different. The IP address you enter for "Your IP Address:" will need to be the address of your router or modem assigned by your ISP. If your machine is behind a firewall, the chat sample will not be able to communicate unless port 50007 is open for both sending and receiving. PythonCard-0.8.2/samples/companies/0000755000076500007650000000000010434046771017142 5ustar alexalex00000000000000PythonCard-0.8.2/samples/companies/companies.py0000644000076500007650000000363610101650612021464 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.13 $" __date__ = "$Date: 2004/07/28 07:11:06 $" """ from PythonCard import configuration, flatfileDatabase, model import os, sys import webbrowser import wx # don't use a .ini DATA_FILE = 'companies.pickle' #DATA_FILE = 'companies-recs.xml' class FlatfileDatabase(flatfileDatabase.FlatfileDatabase): def on_initialize(self, event): # override the data filename # so a .ini isn't needed self.configPath = os.path.join(configuration.homedir, 'companies') if not os.path.exists(self.configPath): os.mkdir(self.configPath) self.dataFile = os.path.join(self.configPath, DATA_FILE) flatfileDatabase.FlatfileDatabase.on_initialize(self, event) # KEA 2004-07-27 # we won't receive a mouseUp event on Mac OS X # so we fake it def on_mouseDown(self, event): if wx.Platform == '__WXMAC__': self.on_mouseUp(event) else: event.skip() def on_mouseUp(self, event): #print event.target.name name = event.target.name if name in ['Profile', 'Symbol', 'Web']: url = event.target.text if name == 'Symbol': if url != '': url = 'http://finance.yahoo.com/q?s=' + url + '&d=t' if url.startswith('http://'): webbrowser.open(url) else: event.skip() if __name__ == '__main__': # dumb check and exit for the pickle file # there is almost certainly a better way to deal # with a missing data file configPath = os.path.join(configuration.homedir, 'companies') if not os.path.exists(configPath): os.mkdir(configPath) path = os.path.join(configPath, DATA_FILE) if not os.path.exists(path): print "Please run parse_companies.py first" sys.exit() app = model.Application(FlatfileDatabase) app.MainLoop() PythonCard-0.8.2/samples/companies/companies.rsrc.py0000644000076500007650000001642510110215103022424 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'Companies', 'backgrounds': [ {'type':'Background', 'name':'bgBody', 'title':'Companies', 'size':(438, 375), 'statusBar':1, 'menubar': {'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ {'type':'MenuItem', 'name':'menuFileSave', 'label':'&Save\tCtrl+S', 'command':'save', }, {'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit', }, ] }, {'type':'Menu', 'name':'Edit', 'label':'&Edit', 'items': [ {'type':'MenuItem', 'name':'menuEditUndo', 'label':'&Undo\tCtrl+Z', 'command':'editUndo', }, {'type':'MenuItem', 'name':'menuEditRedo', 'label':'&Redo\tCtrl+Y', 'command':'editRedo', }, {'type':'MenuItem', 'name':'editSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditCut', 'label':'Cu&t\tCtrl+X', 'command':'editCut', }, {'type':'MenuItem', 'name':'menuEditCopy', 'label':'&Copy\tCtrl+C', 'command':'editCopy', }, {'type':'MenuItem', 'name':'menuEditPaste', 'label':'&Paste\tCtrl+V', 'command':'editPaste', }, {'type':'MenuItem', 'name':'editSep2', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditClear', 'label':'Cle&ar\tDel', 'command':'editClear', }, {'type':'MenuItem', 'name':'menuEditSelectAll', 'label':'Select A&ll\tCtrl+A', 'command':'editSelectAll', }, {'type':'MenuItem', 'name':'editSep4', 'label':'-', }, ] }, {'type':'Menu', 'name':'Go', 'label':'&Go', 'items': [ {'type':'MenuItem', 'name':'menuEditFind', 'label':'Find...\tCtrl+F', 'command':'findRecord', }, {'type':'MenuItem', 'name':'menuEditFindNext', 'label':'Find Next\tF3', 'command':'findNextRecord', }, {'type':'MenuItem', 'name':'menuGoCard', 'label':'&Go to Record...\tCtrl+G', 'command':'goToRecord', }, {'type':'MenuItem', 'name':'editSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuGoFirstCard', 'label':'&First Record\tCtrl+1', 'command':'goFirst', }, {'type':'MenuItem', 'name':'menuGoPrevCard', 'label':'&Prev Record\tCtrl+2', 'command':'goPrev', }, {'type':'MenuItem', 'name':'menuGoNextCard', 'label':'&Next Record\tCtrl+3', 'command':'goNext', }, {'type':'MenuItem', 'name':'menuGoLastCard', 'label':'&Last Record\tCtrl+4', 'command':'goLast', }, {'type':'MenuItem', 'name':'goSep2', 'label':'-', }, {'type':'MenuItem', 'name':'menuGoSort', 'label':'&Sort Records...', 'command':'sort', }, ] }, ] }, 'components': [ {'type':'TextField', 'name':'Company', 'position':(110, 10), 'size':(306, 23), 'editable':False, }, {'type':'TextArea', 'name':'Address', 'position':(110, 40), 'size':(306, 61), 'editable':False, }, {'type':'TextField', 'name':'Phone', 'position':(110, 110), 'size':(169, -1), 'editable':False, }, {'type':'TextField', 'name':'Web', 'position':(110, 140), 'size':(307, -1), 'editable':False, 'foregroundColor':(0, 0, 255), }, {'type':'TextField', 'name':'Profile', 'position':(110, 170), 'size':(307, -1), 'editable':False, 'foregroundColor':(0, 0, 255), }, {'type':'TextField', 'name':'Symbol', 'position':(110, 205), 'size':(73, -1), 'editable':False, 'foregroundColor':(0, 0, 255), }, {'type':'TextField', 'name':'Exchange', 'position':(275, 205), 'size':(73, -1), 'editable':False, }, {'type':'TextField', 'name':'NumberOfEmployees', 'position':(110, 235), 'size':(73, -1), 'editable':False, }, {'type':'StaticText', 'name':'ExchangeLabel', 'position':(195, 210), 'size':(68, -1), 'alignment':'right', 'text':'Exchange', }, {'type':'StaticText', 'name':'SymbolLabel', 'position':(5, 210), 'size':(100, -1), 'alignment':'right', 'text':'Stock Symbol', }, {'type':'StaticText', 'name':'EmployeesLabel', 'position':(5, 240), 'size':(100, -1), 'alignment':'right', 'text':'# of Employees', }, {'type':'StaticText', 'name':'CompanyLabel', 'position':(5, 15), 'size':(100, -1), 'alignment':'right', 'text':'Company', }, {'type':'StaticText', 'name':'StreetLabel', 'position':(5, 50), 'size':(100, -1), 'alignment':'right', 'text':'Address', }, {'type':'StaticText', 'name':'TelephoneLabel', 'position':(5, 115), 'size':(100, -1), 'alignment':'right', 'text':'Telephone', }, {'type':'StaticText', 'name':'EmailLabel', 'position':(5, 175), 'size':(100, -1), 'alignment':'right', 'text':'Profile', }, {'type':'StaticText', 'name':'WebLabel', 'position':(5, 145), 'size':(100, -1), 'alignment':'right', 'text':'Web', }, {'type':'Button', 'name':'Prev', 'position':(61, 282), 'command':'goPrev', 'label':'Previous', }, {'type':'Button', 'name':'Next', 'position':(152, 282), 'command':'goNext', 'label':'Next', }, {'type':'Button', 'name':'Find', 'position':(266, 282), 'command':'findRecord', 'label':'Find...', }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/samples/companies/parse_companies.py0000644000076500007650000001570110347526322022666 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.10 $" __date__ = "$Date: 2005/12/13 11:13:22 $" """ # adapted from # http://docs.python.org/lib/dom-example.html import os from xml.dom import minidom import pprint import cPickle import time import urllib from xml.sax.saxutils import escape from PythonCard import configuration configPath = os.path.join(configuration.homedir, 'companies') if not os.path.exists(configPath): os.mkdir(configPath) XMLFILENAME = os.path.join(configPath, 'companies.xml') COMPANIES_URL = 'http://pythoncard.sourceforge.net/companies.xml' SAVEBINARY = 1 def getText(nodelist): rc = "" for node in nodelist: if node.nodeType == node.TEXT_NODE: rc = rc + node.data # convert from Unicode to ASCII and hope we aren't # tossing some information return rc.encode('ascii', 'ignore') def doParseAsList(xml): companies = [] dom = minidom.parseString(xml) entries = dom.getElementsByTagName("entry") print "Number of entries: %d" % len(entries) for entry in entries: nodes = entry.getElementsByTagName("text")[0] text = getText(nodes.childNodes) companies.append(text) return companies # try and figure out the various parts # in the text, this is the dumb version """ Agilent Technologies Inc. (NYSE:A) 395 Page Mill Road Palo Alto, CA 94306 (650) 752-5000 http://www.agilent.com Employees: 41,000 Profile: http://biz.yahoo.com/p/a/a.html """ """ Company Symbol Exchange Address Phone Web NumberOfEmployees Profile """ # Address could be split further, but can be tricky # more screwy formats # B.V.R. Technologies Ltd. (NasdaqSC:BVRT)http://www.bvrtech.com # Make Patrick cringe ;-) # even messier because I'm not using regular expressions def textToDictionary(text): # need to extra the company name to use as # a key company = {} text = text.replace('', '').replace('', '').replace('', '') text = escape(text) lines = text.splitlines() i = lines[0].rfind(' (') #name, stock = lines[0].split(' (') company['Company'] = lines[0][:i] stock = lines[0][i + 2:] # blank line tells us where the address, phone split is try: offset = lines.index('') except ValueError: offset = -1 if stock.find(')http://') != -1: # screwy stock, web = stock.split('http://') company['Web'] = 'http://' + web if stock.find(':') != -1: #exchange, symbol = stock[:-1].split(':') exchange, symbol = stock[:-1].split(':') company['Symbol'] = symbol company['Exchange'] = exchange else: company['Symbol'] = stock[:-1] else: if stock.find(':') != -1: #exchange, symbol = stock[:-1].split(':') exchange, symbol = stock[:-1].split(':') # *** KEA TO DO # need to filter out # and < > ... company['Symbol'] = symbol company['Exchange'] = exchange else: company['Symbol'] = stock[:-1] if offset != -1: company['Address'] = "\n".join(lines[1:offset - 2]) company['Web'] = lines[offset - 1] company['Phone'] = lines[offset - 2] employees = lines[-2] if employees.startswith('Employees:'): company['NumberOfEmployees'] = employees.split(': ')[-1] company['Profile'] = lines[-1].split(': ')[-1] #print company, "\n" return company def doParseAsDictionary(xml): companies = [] #companies = SortableList() dom = minidom.parseString(xml) entries = dom.getElementsByTagName("entry") print "Number of entries: %d" % len(entries) for entry in entries: nodes = entry.getElementsByTagName("text")[0] company = textToDictionary(getText(nodes.childNodes)) #print company['Company'] companies.append(company) #print company['Company'] return companies # expects a list of dictionaries # the dictionaries can contain strings and ints # this version just treats everything as a string # I'm not sure whether the quoting is robust for # fields that contain some combination of ' and/or " def listToXML(records): text = '\n' #text = '\n' text += '\n' # it is faster to do a big join of lists # than to constantly create new huge strings recList = [] for record in records: s = '' for key, value in record.items(): value = value.replace('', '') value = value.replace('', '') value = value.replace('', '') value = value.replace('', '') value = escape(value) """ value = value.replace('&', '&') value = value.replace('<', '<') value = value.replace('>', '>') """ s += """%s=%s """ % (key, repr(value)) recList.append(' ') text += "\n".join(recList) text += '\n\n' return text def xmlToList(filename): print 'Loading XML...' fp = open(filename, 'rb') xml = fp.read() fp.close() print 'Parsing XML...' startTime = time.time() #companies = doParseAsList(xml) companies = doParseAsDictionary(xml) endTime = time.time() print "Parsing time: %d seconds" % round(endTime - startTime) baseDir = os.path.dirname(filename) base = os.path.basename(filename) base = os.path.splitext(base)[0] print 'Saving list...' fp = open(os.path.join(baseDir, base + '.txt'), 'wb') pprint.pprint(companies, fp) fp.close() print 'Saving pickle...' # do you actually need to open 'wb' or is 'w' # correct with pickles either ascii or binary? fp = open(os.path.join(baseDir, base + '.pickle'), 'wb') # this ends up leaving a reference to SortableList # if companies = SortableList[] # is used above #cPickle.dump(companies, fp, SAVEBINARY) ##records = [] ##for r in companies: ## records.append(r) ##cPickle.dump(records, fp, SAVEBINARY) #cPickle.dump(companies.data, fp, SAVEBINARY) cPickle.dump(companies, fp, SAVEBINARY) fp.close() print 'Saving recs XML...' text = listToXML(companies) fp = open(os.path.join(baseDir, base + '-recs.xml'), 'w') fp.write(text) fp.close() def downloadCompaniesXML(): url = COMPANIES_URL print 'Downloading XML...' fp = urllib.urlopen(url) xml = fp.read() fp.close() print 'Saving XML...' fp = open(XMLFILENAME, 'wb') fp.write(xml) fp.close() def buildTextAndPickleFiles(): if not os.path.exists(XMLFILENAME): downloadCompaniesXML() startTime = time.time() xmlToList(XMLFILENAME) endTime = time.time() print "Total Processing time: %d seconds" % round(endTime - startTime) if __name__ == '__main__': buildTextAndPickleFiles() PythonCard-0.8.2/samples/companies/readme.txt0000644000076500007650000000265310035337427021144 0ustar alexalex00000000000000The companies sample is a work in progress to explore the use of Python pickles for storage of data and to stress the find and sort capabilities of the underlying flatfileDatabase classes. Before you can use it you must run the parse_companies.py file which will download the companies.xml file, parse it and save it as a list/dictionary in text and pickle format for use by the sample. Note that the companies.xml data file is approximately 1.5MB and so can take a long time to download on a slow modem. Messages are printed to the console to indicate the progress of the download and parsing. Here is an example output from my machine: C:\python\PythonCard\samples\companies>parse_companies.py Downloading XML... Saving XML... Loading XML... Parsing XML... Number of entries: 6635 Parsing time: 24 seconds Saving list... Saving pickle... Total Processing time: 24 seconds The parsing time will take longer on slower machines. The parsing is not bullet-proof yet, so some fields and records contain garbage HTML data. Since both the flatfileDatabase and companies sample use the flatfileDatabase.py module, it has been moved into the framework. The name and its location in the framework will likely change in the next release. The findDialog is common as well and so a common dialogs/background sub-package will probably be added to the framework in release 0.7. --- __version__ = "$Revision: 1.3 $" __date__ = "$Date: 2004/04/08 21:07:35 $" PythonCard-0.8.2/samples/conversions/0000755000076500007650000000000010434046771017534 5ustar alexalex00000000000000PythonCard-0.8.2/samples/conversions/conversions.py0000644000076500007650000001633510347526322022464 0ustar alexalex00000000000000#!/usr/bin/python """ conversions provides conversion between english <-> morse code and celsius """ __version__ = "$Revision: 1.17 $" __date__ = "$Date: 2005/12/13 11:13:22 $" from PythonCard import model try: import SOAP SOAP_AVAILABLE = True except ImportError: SOAP_AVAILABLE = False class Conversion: def __init__(self, components): pass def toDown(self, value): pass def toUp(self, value): pass class TemperatureConversion(Conversion): def __init__(self, components): components.labelUp.text = 'Fahrenheit' components.btnConvertUp.label = 'Celsius to Fahrenheit' components.btnConvertDown.label = 'Fahrenheit to Celsius' components.labelDown.text = 'Celsius' def toDown(self, degrees): return str(self.FahrenheitToCelsius(float(degrees))) def toUp(self, degrees): return str(self.CelsiusToFahrenheit(float(degrees))) def FahrenheitToCelsius(self, degrees): return (degrees - 32.0) / 9.0 * 5.0 def CelsiusToFahrenheit(self, degrees): return degrees * 9.0 / 5.0 + 32.0 class MorseCodeConversion(Conversion): def __init__(self, components): self.alphabet = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] self.morseAlphabet = ['.-', '-...', '-.-.', '-..', '.', '..-.', '--.', '....', '..', '.---', '-.-', '.-..', '--', '-.', '---', '.--.', '--.-', '.-.', '...', '-', '..-', '...-', '.--', '-..-', '-.--', '--..', '-----', '.----', '..---', '...--', '....-', '.....', '-....', '--...', '---..', '----.'] components.labelUp.text = 'English' components.btnConvertUp.label = 'Morse code to English' components.btnConvertDown.label = 'English to Morse code' components.labelDown.text = 'Morse code' def toDown(self, txt): return self.convertToMorse(txt) def toUp(self, txt): return self.convertFromMorse(txt) def convertToMorse(self, txt): converted = '' for c in txt[:]: ordC = c.upper() if c == ' ': # three spaces between words # when you include the space after each character converted = converted + ' ' else: try: converted += self.morseAlphabet[self.alphabet.index(ordC)] + ' ' except ValueError: return converted + "\n\ncharacter out of bounds, unable to complete conversion" return converted[:-1] def convertFromMorse(self, txt): converted = '' words = txt.split(' ') for w in words: letters = w.split(' ') for c in letters: if c == '': continue try: ordC = self.alphabet[self.morseAlphabet.index(c)] except ValueError: return converted + "\n\nmorse out of bounds error, unable to complete conversion" converted += ordC converted += ' ' return converted class CurrencyConversion(Conversion): def convert(self, fromCur, toCur, txt): import SOAP server = SOAP.SOAPProxy('http://services.xmethods.net/soap', \ namespace='urn:xmethods-CurrencyExchange') try: dummy = float(txt) except ValueError: return "Cannot convert anything but numbers" try: rate = server.getRate(fromCur, toCur) except ValueError: return "Error getting exchange rate" return str(float(txt) * rate) class CurrencyConversionUKUS(CurrencyConversion): def __init__(self, components): components.labelUp.text = 'UK Pounds' components.btnConvertUp.label = 'US Dollars to UK Pounds' components.btnConvertDown.label = 'UK Pounds to US Dollars' components.labelDown.text = 'US Dollars' def toDown(self, txt): return self.convertToUS(txt) def toUp(self, txt): return self.convertToUK(txt) def convertToUS(self, txt): return self.convert('UK', 'US', txt) def convertToUK(self, txt): return self.convert('US', 'UK', txt) class CurrencyConversionAUSUS(CurrencyConversion): def __init__(self, components): components.labelUp.text = 'Aussie Dollars' components.btnConvertUp.label = 'US Dollars to Aussie Dollars' components.btnConvertDown.label = 'Aussie Dollars to US Dollars' components.labelDown.text = 'US Dollars' def toDown(self, txt): return self.convertToUS(txt) def toUp(self, txt): return self.convertToAus(txt) def convertToUS(self, txt): return self.convert('Australia', 'US', txt) def convertToAus(self, txt): return self.convert('US', 'Australia', txt) class Conversions(model.Background): def on_initialize(self, event): # only enable currency conversion option if the SOAP module is installed if not SOAP_AVAILABLE: self.menuBar.setChecked('menuConvertCurrencyUKUS', False) self.menuBar.setEnabled('menuConvertCurrencyUKUS', False) self.menuBar.setChecked('menuConvertCurrencyAUSUS', False) self.menuBar.setEnabled('menuConvertCurrencyAUSUS', False) #self.conversion = TemperatureConversion(self.components) self.on_menuConvertTemperature_select(None) def on_btnConvertDown_mouseClick(self, event): self.components.field2.text = self.conversion.toDown(self.components.field1.text) def on_btnConvertUp_mouseClick(self, event): self.components.field1.text = self.conversion.toUp(self.components.field2.text) def uncheckAllMenuItems(self): self.menuBar.setChecked('menuConvertMorseCode', False) self.menuBar.setChecked('menuConvertTemperature', False) self.menuBar.setChecked('menuConvertCurrencyUKUS', False) self.menuBar.setChecked('menuConvertCurrencyAUSUS', False) def on_menuConvertMorseCode_select(self, event): self.conversion = MorseCodeConversion(self.components) self.uncheckAllMenuItems() self.menuBar.setChecked('menuConvertMorseCode') def on_menuConvertTemperature_select(self, event): self.conversion = TemperatureConversion(self.components) self.uncheckAllMenuItems() self.menuBar.setChecked('menuConvertTemperature') def on_menuConvertCurrencyUKUS_select(self, event): self.conversion = CurrencyConversionUKUS(self.components) self.uncheckAllMenuItems() self.menuBar.setChecked('menuConvertCurrencyUKUS') def on_menuConvertCurrencyAUSUS_select(self, event): self.conversion = CurrencyConversionAUSUS(self.components) self.uncheckAllMenuItems() self.menuBar.setChecked('menuConvertCurrencyAUSUS') if __name__ == '__main__': app = model.Application(Conversions) app.MainLoop() PythonCard-0.8.2/samples/conversions/conversions.rsrc.py0000644000076500007650000000430510221715332023416 0ustar alexalex00000000000000 { 'application':{ 'type':'Application', 'name':'Conversions', 'backgrounds': [ { 'type':'Background', 'name':'bgConversions', 'title':'Conversions', 'size':( 400, 350 ), 'menubar': { 'type':'MenuBar', 'menus': [ { 'type':'Menu', 'name':'mnuFile', 'label':'&File', 'items': [ { 'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit', 'command':'exit' } ] }, { 'type':'Menu', 'name':'mnuConvert', 'label':'&Convert', 'items': [ { 'type':'MenuItem', 'name':'menuConvertMorseCode', 'label':'Morse Code', 'checkable':1 }, { 'type':'MenuItem', 'name':'menuConvertTemperature', 'label':'Temperature', 'checkable':1, 'checked':1}, { 'type':'MenuItem', 'name':'menuConvertCurrencyUKUS', 'label':'Currency - UK <-> US', 'checkable':1 }, { 'type':'MenuItem', 'name':'menuConvertCurrencyAUSUS', 'label':'Currency - AUS <-> US', 'checkable':1 }, ] } ] }, 'components': [ { 'type':'StaticLine', 'name':'staticlineH', 'position':(0, 0), 'size':(400, -1)}, { 'type':'StaticText', 'name':'labelUp', 'position':(5, 5), 'text': 'one'}, { 'type':'StaticText', 'name':'labelDown', 'position':(5, 165), 'text': 'two'}, { 'type':'TextArea', 'name':'field1', 'position':(5, 25), 'size':(390, 100), 'text':'' }, { 'type':'TextArea', 'name':'field2', 'position':(5, 190), 'size':(390, 100), 'text':'' }, { 'type':'Button', 'name':'btnConvertUp', 'position':(175, 160), 'size':(200, -1), 'label':'Convert to' }, { 'type':'Button', 'name':'btnConvertDown', 'position':(175, 130), 'size':(200, -1), 'label':'Convert to' }, ] } ] } } PythonCard-0.8.2/samples/conversions/readme.txt0000644000076500007650000000177307600217700021533 0ustar alexalex00000000000000conversions provides conversion between english <-> morse code and celsius <-> fahrenheit. The conversion framework is implemented so that it should be relatively easy to add other conversions. The base class handles renaming the widgets for a particular conversion. The sample has now been expanded to include a currency conversion sample. This currently only converts between Australian Dollars and US Dollars. It uses a similar SOAP model to the stockprice sample and the server at: http://www.xmethods.net/ This could be generalised to convert between any two available currencies but would require a little more customisation of the interface. It requires the SOAP.py module from SOAP.py 0.9.7 available at: http://sourceforge.net/projects/pywebsvcs Also see the SOAP.py authors article at: http://www-106.ibm.com/developerworks/webservices/library/ws-pyth2/ The SOAP service used is documented at: http://www.xmethods.net/ve2/ViewListing.po;jsessionid=uasjc2zKRJYzpJGd55tR0xN8(QhxieSRM)?serviceid=5 PythonCard-0.8.2/samples/custdb/0000755000076500007650000000000010434046771016450 5ustar alexalex00000000000000PythonCard-0.8.2/samples/custdb/custdb.de.rsrc.py0000644000076500007650000001144010130317153021631 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'Minimal', 'backgrounds': [ {'type':'Background', 'name':'bgMin', 'title':'Kunden Datenbank', 'size':(502, 467), 'components': [ {'type':'RadioGroup', 'name':'sortBy', 'position':(8, 67), 'size':(134, -1), 'items':['Name', 'Firma'], 'label':'Sortiere nach:', 'layout':'vertical', 'max':1, 'stringSelection':'Name', }, {'type':'Button', 'name':'delButt', 'position':(340, 390), 'size':(55, -1), 'backgroundColor':(255, 0, 0), 'label':'L\xf6schen', }, {'type':'Button', 'name':'newButt', 'position':(400, 390), 'size':(84, -1), 'backgroundColor':(0, 128, 0), 'label':'Neuer Kunde', }, {'type':'TextField', 'name':'selectedFld', 'position':(230, 390), 'size':(33, -1), 'text':'0', }, {'type':'StaticText', 'name':'homepageTag', 'position':(150, 365), 'text':'Homepage:', }, {'type':'StaticText', 'name':'telMobiTag', 'position':(340, 320), 'text':'TelMobi:', }, {'type':'StaticText', 'name':'telFaxTag', 'position':(340, 345), 'text':'TelFax:', }, {'type':'StaticText', 'name':'telPrivTag', 'position':(150, 340), 'text':'TelPriv:', }, {'type':'StaticText', 'name':'telBusiTag', 'position':(150, 315), 'text':'TelBusi:', }, {'type':'StaticText', 'name':'titleTag', 'position':(350, 90), 'text':'Titel:', }, {'type':'StaticText', 'name':'functionTag', 'position':(150, 90), 'text':'Funktion:', }, {'type':'StaticText', 'name':'notesTag', 'position':(150, 195), 'text':'Bemerkung:', }, {'type':'StaticText', 'name':'emailTag', 'position':(150, 155), 'text':'Email:', }, {'type':'StaticText', 'name':'companyTag', 'position':(150, 175), 'text':'Firma:', }, {'type':'StaticText', 'name':'ortTag', 'position':(150, 130), 'text':'Ort:', }, {'type':'StaticText', 'name':'streetTag', 'position':(150, 110), 'size':(35, -1), 'text':'Strasse:', }, {'type':'StaticText', 'name':'nameTag', 'position':(150, 65), 'size':(41, 12), 'text':'Name:', }, {'type':'TextField', 'name':'firstName', 'position':(210, 65), 'size':(98, -1), }, {'type':'TextField', 'name':'name', 'position':(310, 65), 'size':(172, -1), }, {'type':'TextField', 'name':'function', 'position':(210, 85), 'size':(127, -1), }, {'type':'TextField', 'name':'title', 'position':(380, 85), 'size':(102, -1), }, {'type':'TextField', 'name':'street', 'position':(210, 105), 'size':(272, -1), }, {'type':'TextField', 'name':'zipCode', 'position':(210, 125), 'size':(78, -1), }, {'type':'TextField', 'name':'city', 'position':(290, 125), 'size':(193, -1), }, {'type':'TextField', 'name':'email', 'position':(210, 150), 'size':(273, -1), }, {'type':'TextField', 'name':'company', 'position':(210, 170), 'size':(273, -1), }, {'type':'TextArea', 'name':'notes', 'position':(210, 190), 'size':(271, 131), }, {'type':'TextField', 'name':'telBusi', 'position':(210, 320), 'size':(125, -1), }, {'type':'TextField', 'name':'telMobi', 'position':(380, 320), }, {'type':'TextField', 'name':'telPriv', 'position':(210, 340), 'size':(125, -1), }, {'type':'TextField', 'name':'telFax', 'position':(380, 340), }, {'type':'TextField', 'name':'homepage', 'position':(210, 360), 'size':(274, -1), }, {'type':'StaticText', 'name':'headline', 'position':(5, 10), 'size':(476, 31), 'alignment':'center', 'backgroundColor':(128, 128, 192), 'font':{'size': 20, 'faceName': 'Arial', 'style': 'bold', 'family': 'serif'}, 'foregroundColor':(0, 0, 125), 'text':'Kunden Datenbank', }, {'type':'Button', 'name':'nextButt', 'position':(265, 390), 'size':(19, 23), 'font':{'size': 10}, 'label':'>', }, {'type':'Button', 'name':'prevButt', 'position':(210, 390), 'size':(20, 23), 'font':{'size': 10}, 'label':'<', }, {'type':'List', 'name':'companyList', 'position':(6, 130), 'size':(138, 277), 'items':[], }, {'type':'TextArea', 'name':'editArea', 'position':(213, 40), 'size':(400, 440), 'visible':0, }, {'type':'StaticText', 'name':'CompanyListTxt', 'position':(5, 50), 'size':(73, 17), 'text':'Kunden:', }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/samples/custdb/custdb.ini0000644000076500007650000000010110047756624020432 0ustar alexalex00000000000000[ConfigData] selected = 2 data = customerdata.csv sortby = name PythonCard-0.8.2/samples/custdb/custdb.py0000644000076500007650000001630110347526322020305 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.10 $" __date__ = "$Date: 2005/12/13 11:13:22 $" """ """ use a comma separated value file as a database Author: Juergen Rauch eMail: juergen@yebu.de Date: 21-Mar-02 """ import PythonCard from PythonCard import dialog, model configFile = 'custdb.ini' columns = [ 'name', 'firstName', 'title', 'gender', 'function', 'company', 'telBusi', 'telPriv', 'telFax', 'telMobi', 'email', 'homepage', 'zipCode', 'city', 'street', 'notes', 'res1', 'res2', 'res3'] def sortByCompany(a,b): if a['company'] > b['company']: return 1 if a['company'] == b['company']: return 0 if a['company'] < b['company']: return -1 def sortByName(a,b): if a['name'] > b['name']: return 1 if a['name'] == b['name']: return 0 if a['name'] < b['name']: return -1 class CustDbStack(model.Background): def on_initialize(self, event): import ConfigParser self.parser = ConfigParser.ConfigParser() self.parser.read( configFile ) "put the company list into the listbox" self.dataFile = self.parser.get('ConfigData','data') rows = open(self.dataFile,'r').readlines() self.selected = self.parser.getint('ConfigData','selected') self.rowsDict = [] line = 0 for r in rows: line += 1 r = r[:-1] # remove the \n here r = r.replace(r'\012','\n') # convert coded 012 back to \n if r.count(',') == 18: d = {} i = 0 values = r.split(',') for k in columns: d[k]=values[i].replace(r'\054',',') # kk convert octal coded comma to real comma i+=1 self.rowsDict.append(d) else: msg = "Data inconsistent: number of commas = %s in line: %s in file: %s"%(r.count(','), line, self.dataFile) dlg = dialog.alertDialog(self, msg, '%s inconsistent'%self.dataFile) self.close() self.components.companyList.insertItems(self.getCompanyList(), 0) self.components.sortBy.stringSelection = self.parser.get('ConfigData','sortBy') self.showSelected() def getCompanyList(self): l = [] if self.parser.get('ConfigData','sortBy') == 'name': self.rowsDict.sort(sortByName) else: self.rowsDict.sort(sortByCompany) for r in self.rowsDict: if self.parser.get('ConfigData','sortBy') == 'name': if not r['name']: l.append(', '+r['company']) else: l.append(r['name']+', '+r['firstName']) else: l.append( '%s, %s'%(r['company'], r['name'])) return l def showSelected(self): if self.selected <0: self.selected = 0 if self.selected >= len(self.rowsDict): self.selected = len(self.rowsDict)-1 self.components.firstName.text = self.rowsDict[self.selected]['firstName'] self.components.name.text = self.rowsDict[self.selected]['name'] self.components.street.text = self.rowsDict[self.selected]['street'] self.components.zipCode.text = self.rowsDict[self.selected]['zipCode'] self.components.city.text = self.rowsDict[self.selected]['city'] self.components.email.text = self.rowsDict[self.selected]['email'] self.components.company.text = self.rowsDict[self.selected]['company'] self.components.notes.text = self.rowsDict[self.selected]['notes'] self.components.title.text = self.rowsDict[self.selected]['title'] self.components.function.text = self.rowsDict[self.selected]['function'] self.components.telMobi.text = self.rowsDict[self.selected]['telMobi'] self.components.telBusi.text = self.rowsDict[self.selected]['telBusi'] self.components.telFax.text = self.rowsDict[self.selected]['telFax'] self.components.telPriv.text = self.rowsDict[self.selected]['telPriv'] self.components.homepage.text = self.rowsDict[self.selected]['homepage'] self.components.selectedFld.text = str(self.selected) self.components.companyList._setSelection(int(self.selected)) self.parser.set('ConfigData','selected',self.selected) self.parser.write(open(configFile,'w')) def on_sortBy_select(self, event): self.parser.set('ConfigData','sortBy', event.target.stringSelection) self.parser.write(open(configFile,'w')) # change the content of the companyList self.components.companyList.clear() self.components.companyList.insertItems(self.getCompanyList(), 0) def on_companyList_select(self, event): self.selected = event.target.selection self.showSelected() def on_loseFocus(self, event): if event.target.name in ['firstName', 'name', 'street', 'zipCode', 'city', 'email', 'company', 'title', 'function', 'telMobi', 'telBusi', 'telFax', 'telPriv', 'homepage', 'notes']: self.rowsDict[self.selected][event.target.name] = event.target.text self.store() def on_selectedFld_keyUp(self, event): try: self.selected = int(event.target.text) except ValueError: self.selected = 0 self.showSelected() def on_nextButt_mouseDown(self, event): self.selected += 1 self.showSelected() def on_prevButt_mouseDown(self, event): self.selected -= 1 self.showSelected() def on_newButt_mouseDown(self, event): d = {} i = 0 for k in columns: d[k]= '' d['gender'] = 'm' # default self.rowsDict.append(d) self.selected = len(self.rowsDict) self.showSelected() def on_delButt_mouseUp(self, event): result = dialog.messageDialog(self, 'Are you sure you want to delete the entry: %s ?'%self.rowsDict[self.selected]['name'], 'Delete Entry.' ) if result.accepted: print "messageDialog result:\naccepted: %s\nreturnedString: %s" % (result.accepted, result.returnedString) del self.rowsDict[self.selected] self.selected -= 1 self.showSelected() self.store() def store(self): lines = [] for r in self.rowsDict: l = '' for c in columns: txt=r[c].replace(',',r'\054') # convert comma to ocal representation l = l + txt + ',' l = l.replace('\n',r'\012') # convert \n to it's octal coding lines.append(l[:-1]+'\n') # give'em the \n back lines.sort() # this is not quite right because it sorts 'A-Za-z' file = open(self.dataFile,'wb') # so we'll independantly of os terminate w/ \n file.writelines(lines) file.close() if __name__ == '__main__': app = model.Application(CustDbStack) app.MainLoop() PythonCard-0.8.2/samples/custdb/custdb.rsrc.py0000644000076500007650000001143510130317153021246 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'Minimal', 'backgrounds': [ {'type':'Background', 'name':'bgMin', 'title':'Customer database', 'size':(502, 467), 'components': [ {'type':'RadioGroup', 'name':'sortBy', 'position':(8, 67), 'size':(134, -1), 'items':['name', 'company'], 'label':'sort by:', 'layout':'vertical', 'max':1, 'stringSelection':'name', }, {'type':'Button', 'name':'delButt', 'position':(340, 390), 'size':(55, -1), 'backgroundColor':(255, 0, 0), 'label':'Delete', }, {'type':'Button', 'name':'newButt', 'position':(400, 390), 'size':(84, -1), 'backgroundColor':(0, 128, 0), 'label':'New Customer', }, {'type':'TextField', 'name':'selectedFld', 'position':(230, 390), 'size':(33, -1), 'text':'0', }, {'type':'StaticText', 'name':'homepageTag', 'position':(150, 365), 'text':'Homepage:', }, {'type':'StaticText', 'name':'telMobiTag', 'position':(340, 320), 'text':'telMobi:', }, {'type':'StaticText', 'name':'telFaxTag', 'position':(340, 345), 'text':'telFax:', }, {'type':'StaticText', 'name':'telPrivTag', 'position':(150, 340), 'text':'telPriv:', }, {'type':'StaticText', 'name':'telBusiTag', 'position':(150, 315), 'text':'telBusi:', }, {'type':'StaticText', 'name':'titleTag', 'position':(350, 90), 'text':'Title:', }, {'type':'StaticText', 'name':'functionTag', 'position':(150, 90), 'text':'Function:', }, {'type':'StaticText', 'name':'notesTag', 'position':(150, 195), 'text':'Notes:', }, {'type':'StaticText', 'name':'emailTag', 'position':(150, 155), 'text':'email:', }, {'type':'StaticText', 'name':'companyTag', 'position':(150, 175), 'text':'Company:', }, {'type':'StaticText', 'name':'ortTag', 'position':(150, 130), 'text':'City:', }, {'type':'StaticText', 'name':'streetTag', 'position':(150, 110), 'size':(35, -1), 'text':'Street:', }, {'type':'StaticText', 'name':'nameTag', 'position':(150, 65), 'size':(41, 12), 'text':'Name:', }, {'type':'TextField', 'name':'firstName', 'position':(210, 65), 'size':(98, -1), }, {'type':'TextField', 'name':'name', 'position':(310, 65), 'size':(172, -1), }, {'type':'TextField', 'name':'function', 'position':(210, 85), 'size':(127, -1), }, {'type':'TextField', 'name':'title', 'position':(380, 85), 'size':(102, -1), }, {'type':'TextField', 'name':'street', 'position':(210, 105), 'size':(272, -1), }, {'type':'TextField', 'name':'zipCode', 'position':(210, 125), 'size':(78, -1), }, {'type':'TextField', 'name':'city', 'position':(290, 125), 'size':(193, -1), }, {'type':'TextField', 'name':'email', 'position':(210, 150), 'size':(273, -1), }, {'type':'TextField', 'name':'company', 'position':(210, 170), 'size':(273, -1), }, {'type':'TextArea', 'name':'notes', 'position':(210, 190), 'size':(271, 131), }, {'type':'TextField', 'name':'telBusi', 'position':(210, 320), 'size':(125, -1), }, {'type':'TextField', 'name':'telMobi', 'position':(380, 320), }, {'type':'TextField', 'name':'telPriv', 'position':(210, 340), 'size':(125, -1), }, {'type':'TextField', 'name':'telFax', 'position':(380, 340), }, {'type':'TextField', 'name':'homepage', 'position':(210, 360), 'size':(274, -1), }, {'type':'StaticText', 'name':'headline', 'position':(5, 10), 'size':(476, 31), 'alignment':'center', 'backgroundColor':(128, 128, 192), 'font':{'size': 20, 'faceName': 'Arial', 'style': 'bold', 'family': 'serif'}, 'foregroundColor':(0, 0, 125), 'text':'Customer Database', }, {'type':'Button', 'name':'nextButt', 'position':(265, 390), 'size':(19, 23), 'font':{'size': 10}, 'label':'>', }, {'type':'Button', 'name':'prevButt', 'position':(210, 390), 'size':(20, 23), 'font':{'size': 10}, 'label':'<', }, {'type':'List', 'name':'companyList', 'position':(6, 130), 'size':(138, 277), 'items':[], }, {'type':'TextArea', 'name':'editArea', 'position':(213, 40), 'size':(400, 440), 'visible':0, }, {'type':'StaticText', 'name':'CompanyListTxt', 'position':(5, 50), 'size':(73, 17), 'text':'Customers:', }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/samples/custdb/customerdata.csv0000644000076500007650000000336207450117650021663 0ustar alexalex00000000000000Brown,Jane,,m,Secretary,Virtual Company,03225 306686,03775 2655,,,,http://www.someurl.com,44444,Munich,Berlin Plaza 11,This is just some nonsense example data.,,, Buyers,Peter,Prof.,m,Clown,PIPCO,234234-234,432432-432,,0234234444,Peter@peter.uk,,0001,London,Bond Street 122,this is nonsense,,, Cronin,H.,,m,CIO,Another Associates Ltd.,33333 55555,33333 55556,,,,http://www.somecronin.com,7777,West,Burgstr. 44,This is just some nonsense example data.,,, Danger,Buzz,,m,Director,Virtual Company,1234 3434,234434 343,,,,http://www.somedanger.com,43344,Hamburg,Lindenstr. 44,This is just some nonsense example data.,,, Deix,John,Dr.,m,Technical Director,PIPCO,77777-777,77777-776,,,,http://www.somedeix.com,88888,Anothercity,Hofstr. 88,This is just some nonsense example data.,,, Mayers,Jeff,,m,CFO,Another Associates Ltd.,12341243-34,12341234-34,55555435353,23424424,,http://www.someurl1.com,44444,Berlin,Kennedy Drive 2a,This is just some nonsense example data.,,, Reilly,Wolfgang,,m,CFO,Virtual Company,2344343434,,,,,http://www.url.com,55555,Somewhere,Broomstreet 33,This is just some nonsense example data.,,, Smith,K.H.,,m,Marketing Director,PIPCO,1235567-23,1234567-44,,,,http://www.smith.com,33333,Bonn,Janstr. 2,This is just some nonsense example data.,,, Spleen,Harald,,m,Technical Director,Virtual Company,06782 981230,06782 5208,,,,http://www.spleen.com,121212,Bielefeld,Snowstreet 27,This is just some nonsense example data.,,, Torr,Josef,,m,Senior Engineer,PIPCO,1234555,345345-345,,,,http://www.storr.com,444444,Watergate,Finnstreet 12,This is just some nonsense example data.,,, Werner,Walter,,m,Marketing Assistent,Another Associates Ltd.,03331 8554 ,03331 7532,,,,http://www.wernerurl.com,34343,Southwood,Brownstreet 5,This is just some nonsense example data.,,, PythonCard-0.8.2/samples/custdb/readme.txt0000644000076500007650000000141707470365304020453 0ustar alexalex00000000000000*********** Readme.txt ********************** This is a pythoncard example application. It makes up a very simple address database. Although it uses the german address format it should be fairly easy to adapt it to whatever is required. It is quite useful for keeping track of customer contacts. It is very very easy to use, so no further explanations here. It handles several hundred entries without slowing down or any other problem. It probabely works still fine with some thousand entries, but I did never test this. Feel free modify it to whatever use you want. Have fun Juergen email: juergen@yebu.de Data is stored in a text file in comma separated value (CSV) format. For alternative storage formats see the addresses, flatfileDatabase and textIndexer samples. PythonCard-0.8.2/samples/dbBrowser/0000755000076500007650000000000010434046771017115 5ustar alexalex00000000000000PythonCard-0.8.2/samples/dbBrowser/csvBrowse.py0000644000076500007650000000635410347526322021452 0ustar alexalex00000000000000#!/usr/bin/python """ Module Name: csvBrowse Description: Plug in for PythonCard application dbBrowse to provide simple CSV functionality Constant/configuration values are currently maintained in the source code. If we are to optimise this application they should be split into seperate configuration files (as per PythonCard/Webware style guidelines) The structure of this module should be replicated for different RDBMS so that they can be interchanged by dbBrowse - hopefully. """ __version__="$Revision $"[11:-2] __date__="$Date $" __author__="Andy Todd " import csv, os class browse: # Connection should be a dictionary with at least two keys, # 'databasename' and 'directory' # This is wildly different to other database modules def __init__(self, connection): "Setup the database connection" self._system_tables=[] try: name = os.path.join(connection["directory"], connection["databasename"]) self.reader = csv.reader(file(name, "rb")) self.headers = self.reader.next() self._db = "ok" self._cursor="ok" except IOError: self._db = None self._cursor = None # This one is used in getRow self._tableName='TheOnlyTable' def getTables(self): "Return a list of all of the non-system tables in " return [ "TheOnlyTable" ] def getColumns(self, tableName): "Get the definition of the columns in tableName" # format of dbBrowser column definitions is # column name, data type, length (for display), nullable, key, default columnDefs = [] for column in self.headers: columnName = column dataType, nullable, key, default = "varchar", "", "", "" # Dodgy default, but it works for me precision = 255 columnDefs.append((columnName, dataType, precision, nullable, key, default)) return columnDefs def getQueryString(self, tableName): "Return a SQL statement which queries all of the columns in tableName" # only used internally, not needed for csv files return "" def getRow(self, tableName): "Get a row from tableName" if tableName!=self._tableName: self._tableName=tableName result = self.reader.next() return result def getRows(self, tableName): "Get all of the rows from tableName" if tableName!=self._tableName: self._tableName=tableName result = [] for row in self.reader: result.append(row) return result if __name__ == '__main__': # We are in an interactive session so run our test routines # Connect to the database connection={ 'databasename':'testfile.csv' ,'directory':'.'} dbHolder = browse(connection) # Return all of our table names into user_tables user_tables = dbHolder.getTables() # Print out the structure of each table and its first row print "--------------------------------------------------" for table in user_tables: print dbHolder.getQueryString(table) print dbHolder.getRow(table) print "--------------------------------------------------" PythonCard-0.8.2/samples/dbBrowser/dbBrowser.ico0000644000076500007650000000342607372720652021553 0ustar alexalex00000000000000(4p3f™Ìÿ333f3™3Ì3ÿ3f3fff™fÌfÿf™3™f™™™Ì™ÿ™Ì3ÌfÌ™ÌÌÌÿÌÿ3ÿfÿ™ÿÌÿÿÿ333f3™3Ì3ÿ333333f33™33Ì33ÿ33f33f3ff3™f3Ìf3ÿf3™33™3f™3™™3Ì™3ÿ™3Ì33Ì3fÌ3™Ì3ÌÌ3ÿÌ3ÿ33ÿ3fÿ3™ÿ3Ìÿ3ÿÿ3f3fff™fÌfÿf3f33ff3f™3fÌ3fÿ3fff3fffff™ffÌffÿff™f3™ff™f™™fÌ™fÿ™fÌf3ÌffÌf™ÌfÌÌfÿÌfÿf3ÿffÿf™ÿfÌÿfÿÿf™3™f™™™Ì™ÿ™3™33™f3™™3™Ì3™ÿ3™f™3f™ff™™f™Ìf™ÿf™™™3™™f™™™™™Ì™™ÿ™™Ì™3Ì™fÌ™™Ì™ÌÌ™ÿÌ™ÿ™3ÿ™fÿ™™ÿ™Ìÿ™ÿÿ™Ì3ÌfÌ™ÌÌÌÿÌ3Ì33Ìf3Ì™3ÌÌ3Ìÿ3ÌfÌ3fÌffÌ™fÌÌfÌÿfÌ™Ì3™Ìf™Ì™™ÌÌ™Ìÿ™ÌÌÌ3ÌÌfÌÌ™ÌÌÌÌÌÿÌÌÿÌ3ÿÌfÿÌ™ÿÌÌÿÌÿÿÌÿ3ÿfÿ™ÿÌÿÿÿ3ÿ33ÿf3ÿ™3ÿÌ3ÿÿ3ÿfÿ3fÿffÿ™fÿÌfÿÿfÿ™ÿ3™ÿf™ÿ™™ÿÌ™ÿÿ™ÿÌÿ3ÌÿfÌÿ™ÌÿÌÌÿÿÌÿÿÿ3ÿÿfÿÿ™ÿÿÌÿÿÿÿÿÿÿÿ#############################################z###############################################z####################################################################################################################z####þüø|àÀ À àø|üüPythonCard-0.8.2/samples/dbBrowser/dbBrowser.py0000755000076500007650000001707010347526322021426 0ustar alexalex00000000000000#!/usr/bin/python """ App Name: dbBrowser Description: A PythonCard sample application to browse data from external data stores. These are mainly relational databases but may also include data files in future releases. The data sources currently supported are; MySQL - release 3.23.36 and above with MySQLdb 0.3.5 and above Oracle - release 8.0.5, 8.1.6, and 8.1.7 with cx_Oracle 2.3 Changes in this release; 16.09.2001 - Moved the dbLogin dialog code into its own module 20.11.2001 - Moved icon setting code to the framework 10.11.2001 - Added support for Oracle as well as MySQL. Changed the version numbering to reflect the CVS revision number 0.3 - Moved the login and database selection functionality to the dbLogin modal dialog. Added an application icon (inspired by the Windows icon used by Oracle) 0.2 - Added dynamic event handling for the navigation buttons/menu items. This means only one method is needed to do the work but it is bound to two widgets. Changed the layout of data widgets to one label and data item per line. Used 'setFocus' to place the cursor in the table choice widget when the database connection has been completed. Known bugs/Things to do; When you choose to browse a table with no rows the navigation functions should be disabled. They are currently enabled and pressing 'Next Row' or 'Previous Row' will produce errors in the console window. When switching between different databases the dynamically created widgets should be cleared up, they currently do not get changed until a table from the new database is selected. """ __version__ = '$Revision: 1.33 $'[11:-2] __date__ = "20th November, 2001" __author__ = "Andy Todd " from PythonCard import configuration, model, dialog #import wx import os import dbLogin browsingButtons=['btnFirstRow', 'btnPreviousRow', 'btnNextRow', 'btnLastRow'] class DbBrowser(model.Background): def on_initialize(self, event): "Initialise the dbBrowser main window" # Display the dbLogin modal dialog self.on_connect_command(None) # Set up the readme for the help|about menu try: self.readme=open('readme.txt').read() except IOError: self.readme=__doc__ def _enableButton(self, enabled): "Hide or show the browsing control buttons" for button in browsingButtons: self.components[button].enabled=enabled def disableButtons(self): "Hide the browsing control buttons" self._enableButton(0) def enableButtons(self): "Show the browsing control buttons" self._enableButton(1) def getARow(self, selectedTable): "Get a row from the table and put the values in our widgets" row=self._database.getRow(selectedTable) if row: self._row.append(row) self.showRow(self._index) else: self._index-=1 def showRow(self, index): "Show retrieved row number " widgetCount=0 for item in self._widgets: # All of our widgets are text, watch out for those date conversions! self.components[item].text=str(self._row[index][widgetCount]) widgetCount+=1 self.statusBar.text = "Row %d of %d" % (index+1, len(self._row)) def showAlert(self, aMessage, aTitle): "Show Alert dialog with aMessage and aTitle" dialog.alertDialog(self, aMessage, aTitle) def on_close(self, event): # Common exit code - should close DB connection here # In the meantime, just call the parent method event.skip() def on_btnBrowse_mouseClick(self, event): selectedTable=self.components["chsTables"].stringSelection if selectedTable: if hasattr(self, "_widgets"): # Remove the currently painted widgets # This is a complete bodge and will be replaced in version x for i in self._widgets: del self.components[i] del self.components['lbl'+i[3:]] self._widgets=[] # This will hold the names of the dynamically created widgets rowHeight=25 # By setting xPosWidget to 240 we assume our labels are no more than # 30 characters (30 * 8 = 240) xPosLabel, xPosWidget, yPos=1, 240, 106 # Get all of the columns for this table and create a widget for each # NB this should really be put into a seperate function for columns in self._database.getColumns(selectedTable): # Column name are of the form 'word_word_word', we will # slightly change this to 'WordWordWord' columnName=columns[0].title().replace("_", "") columnTitle = columns[0] columnType = columns[1] columnPrecision = columns[2] # Form a widget per column, as well as some boilerplate widgetDefn={'type':'StaticText', 'name':'lbl'+columnName, 'position':(xPosLabel, yPos), 'text':columnTitle} self.components[widgetDefn['name']]=widgetDefn # catch any unbounded or overly large columns if not columnPrecision or columnPrecision > 100: columnPrecision = 30 widgetDefn={'type':'TextField', 'name':'txt'+columnName, 'position':(xPosWidget, yPos), 'text':'', 'size':(columnPrecision*9, -1)} # replace 8 with a constant self.components[widgetDefn['name']]=widgetDefn self._widgets.append('txt'+columnName) # Put each label and widget on its own line yPos+=26 """ Now that we've painted the screen initialise the cursor and get the first row. Note that this assumes that the columns returned by getRow are in the same order as the call to getColumns above """ self._index=0 self._row=[] self.getARow(selectedTable) self.enableButtons() def on_connect_command(self, event): # Display the dbLogin.rsrc.py modal dialog dlg = dbLogin.dbLogin(self) dlg.showModal() dlg.destroy() def on_nextRecord_command(self, event): "Get the next row from the database" length=len(self._row)-1 if self._indexlen(self._row): self._index-=1 self._index-=1 self.showRow(self._index) def on_firstRecord_command(self, event): "Show the first row (if we've already got it)" self._index=0 self.showRow(self._index) def on_lastRecord_command(self, event): "Show the last row we have fetched so far" if self._index<(len(self._row)-1): self._index=(len(self._row)-1) self.showRow(self._index) def on_mnuExit_select(self, event): self.close() def on_mnuAbout_select(self, event): dialog.scrolledMessageDialog(self, self.readme, 'About') if __name__=="__main__": app=model.Application(DbBrowser) app.MainLoop() PythonCard-0.8.2/samples/dbBrowser/dbBrowser.rsrc.py0000644000076500007650000000744710323714730022376 0ustar alexalex00000000000000{ 'application':{ 'type':'Application', 'name':'DbBrowser', 'backgrounds': [ {'type':'Background', 'name':'DbBrowser', 'title':'DbBrowser', 'position':( 100, 100 ), 'size':( 500, 500 ), 'statusBar':1, 'icon':'dbBrowser.ico', 'style':['resizeable'], 'menubar': { 'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'mnuFile', 'label':'&File', 'items': [ { 'type':'MenuItem', 'name':'mnuOpen', 'label':'&Open\tCtrl+O', 'command':'connect' }, { 'type':'MenuItem', 'name':'mnuExit', 'label':'E&xit\tAlt+X' } ] }, {'type':'Menu', 'name':'mnuAction', 'label':'&Action', 'items': [ { 'type':'MenuItem', 'name':'mnuFirst', 'label':'&First Record', 'command':'firstRecord' }, { 'type':'MenuItem', 'name':'mnuPrevious', 'label':'&Previous Record', 'command':'previousRecord' }, { 'type':'MenuItem', 'name':'mnuNext', 'label':'&Next Record', 'command':'nextRecord' }, { 'type':'MenuItem', 'name':'mnuLast', 'label':'&Last Record', 'command':'lastRecord' } ] }, {'type':'Menu', 'name':'mnuHelp', 'label':'&Help', 'items': [ { 'type':'MenuItem', 'name':'mnuAbout', 'label':'&About dbBrowser...' } ] } ] }, 'components': [ # The rows in my layout are each 25 pixels high with starting points at # 1, 26, 51, 76, 101, 126, 151, 176, 201, 226, etc. # {'type':'StaticText', 'name':'lblUsername', 'position':(5, 1), 'text':'Username'}, # {'type':'TextField', 'name':'txtUsername', 'position':(60, 1), 'size':(75, -1), 'text':'', 'toolTip':'User Name'}, # {'type':'StaticText', 'name':'lblPassword', 'position':(140, 1), 'text':'Password'}, # {'type':'PasswordField', 'name':'txtPassword', 'position':(195, 1), 'size':(75, -1), 'text':'', 'toolTip':'Password'}, # {'type':'StaticText', 'name':'lblDatabase', 'position':(275, 1), 'text':'Database'}, # {'type':'TextField', 'name':'txtDatabase', 'position':(330, 1), 'size':(75, -1), 'text':'', 'toolTip':'Database name'}, # {'type':'Button', 'name':'btnConnect', 'position':(415, 1), 'size':(-1, -1), 'label':'Connect', 'toolTip':'Connect to Database'}, {'type':'StaticText', 'name':'lblTables', 'position':(5, 26), 'text':'Table' }, {'type':'Choice', 'name':'chsTables', 'position':(60, 26), 'size':(150, -1), 'items':[], 'stringSelection':None}, {'type':'Button', 'name':'btnBrowse', 'position':(415, 26), 'size':(-1, -1), 'label':'Browse', 'toolTip':'Browse the table data'}, {'type':'StaticLine', 'name':'lnButtons', 'position':(5, 64), 'size':(490, -1) }, {'type':'Button', 'name':'btnFirstRow', 'position':(60, 76), 'size':(-1, -1), 'label':'First Row', 'enabled':0, 'command':'firstRecord'}, {'type':'Button', 'name':'btnPreviousRow', 'position':(147, 76), 'size':(-1, -1), 'label':'Previous Row', 'enabled':0, 'command':'previousRecord'}, {'type':'Button', 'name':'btnNextRow', 'position':(260, 76), 'size':(-1, -1), 'label':'Next Row', 'enabled':0, 'command':'nextRecord'}, {'type':'Button', 'name':'btnLastRow', 'position':(351, 76), 'size':(-1, -1), 'label':'Last Row', 'enabled':0, 'command':'lastRecord'} ] } ] } } PythonCard-0.8.2/samples/dbBrowser/dbBrowser2.py0000755000076500007650000000542010347526322021504 0ustar alexalex00000000000000#!/usr/bin/python """ App Name: dbBrowser2 Description: A PythonCard sample application to browse data from external data stores. These are mainly relational databases but may also include data files in future releases. The data sources currently supported are; MySQL - release 3.23.36 and above with MySQLdb 0.3.5 and above Oracle - release 9.2, 8.0.5, 8.1.6, and 8.1.7 with cx_Oracle or DCOracle2 Gadfly - release 1.0 SQLite - using PySQLite Metakit - This sample differs from the original dbBrowser by presenting data using a wxGrid Because this provides a different interface I've removed the browsing buttons that were present in the original application. Changes in this release; Known bugs/Things to do; """ __author__ = "Andy Todd " __date__ = "3rd May, 2003" __version__ = '$Revision: 1.10 $'[11:-2] from PythonCard import model, dialog import os import dbLogin from dbTable import DBTable class DbBrowser(model.Background): def on_initialize(self, event): "Initialise the dbBrowser main window" # Display the dbLogin modal dialog self.on_connect_command(None) # Set up the readme for the help|about menu try: self.readme=open('readme.txt').read() except IOError: self.readme='' def showAlert(self, aMessage, aTitle): "Show Alert dialog with aMessage and aTitle" dialog.alertDialog(self, aMessage, aTitle) def on_close(self, event): # Common exit code - should close DB connection here # In the meantime, just call the parent method event.skip() def on_btnBrowse_mouseClick(self, event): # Completely re-written for dbBrowser2 selectedTable=self.components["chsTables"].stringSelection if selectedTable: # This is a bit of a cop out, just delete and re-create the grid gridDefn={'name':'myGrid', 'type':'Grid'} gridDefn['position']=self.components.myGrid.position gridDefn['size']=self.components.myGrid.size del self.components[gridDefn['name']] self.components[gridDefn['name']]=gridDefn self.dbTable=DBTable(self._database, selectedTable) self.components.myGrid.SetTable(self.dbTable) self.components.myGrid.AutoSizeColumns() self.components.myGrid.AdjustScrollbars() def on_connect_command(self, event): # Display the dbLogin.rsrc.py modal dialog dlg = dbLogin.dbLogin(self) dlg.showModal() dlg.destroy() def on_mnuExit_select(self, event): self.close() def on_mnuAbout_select(self, event): dialog.scrolledMessageDialog(self, self.readme, 'About') if __name__=="__main__": app=model.Application(DbBrowser) app.MainLoop() PythonCard-0.8.2/samples/dbBrowser/dbBrowser2.rsrc.py0000644000076500007650000000304410047606317022451 0ustar alexalex00000000000000{ 'application':{ 'type':'Application', 'name':'DbBrowser2', 'backgrounds': [ {'type':'Background', 'name':'DbBrowser', 'title':'DbBrowser', 'position':( 100, 100 ), 'size':( 610, 570 ), 'statusBar':1, 'icon':'dbBrowser.ico', 'menubar': { 'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'mnuFile', 'label':'&File', 'items': [ { 'type':'MenuItem', 'name':'mnuOpen', 'label':'&Open\tCtrl+O', 'command':'connect' }, { 'type':'MenuItem', 'name':'mnuExit', 'label':'E&xit\tAlt+X' } ] }, {'type':'Menu', 'name':'mnuHelp', 'label':'&Help', 'items': [ { 'type':'MenuItem', 'name':'mnuAbout', 'label':'&About dbBrowser...' } ] } ] }, 'components': [ {'type':'StaticText', 'name':'lblTables', 'position':(5, 26), 'text':'Table' }, {'type':'Choice', 'name':'chsTables', 'position':(60, 26), 'size':(150, -1), 'items':[], 'stringSelection':None}, {'type':'Button', 'name':'btnBrowse', 'position':(415, 26), 'size':(-1, -1), 'label':'Browse', 'toolTip':'Browse the table data'}, {'type':'StaticLine', 'name':'lnButtons', 'position':(5, 64), 'size':(590, -1) }, {'type':'Grid', 'name':'myGrid', 'position':(0, 110), 'size':(600, 390),}, ] } ] } } PythonCard-0.8.2/samples/dbBrowser/dbLogin.py0000755000076500007650000001073310347526322021052 0ustar alexalex00000000000000#!/usr/bin/python """ App Name: dbBrowser Description: Provide a login dialog for the dbBrowser application """ __version__ = '$Revision: 1.14 $'[11:-2] __date__ = "16th September, 2002" __author__ = "Andy Todd " import os from PythonCard import dialog, model dbHandlers = { 'MySQL': 'mySQLBrowse' ,'Oracle': 'oracleBrowse' ,'Gadfly': 'gadflyBrowse' ,'MetaKit': 'metakitBrowse' ,'PySQLite': 'pysqliteBrowse' ,'PySQLite2': 'pysqlite2Browse' ,'PostgreSQL': 'postgreBrowse' ,'CSV': 'csvBrowse' } class dbLogin(model.CustomDialog): def __init__(self, aBg): "Initialise the dialog" model.CustomDialog.__init__(self, aBg) self.parent = aBg self.components.txtUsername.setFocus() def on_btnConnect_mouseClick(self, event): """ Database connection is a dictionary so we can adapt the members depending on the RDBMS we select (in v1.0, natch) """ self.parent.statusBar.text = "Connecting ..." dbHandler = __import__(dbHandlers[self.components.choice.stringSelection]) dbClass = dbHandler.browse selection = self.components.choice.stringSelection connection = {} if selection in ('Gadfly', 'Metakit', 'PySQLite', 'PySQLite2', 'CSV'): connection['databasename'] = self.components['txtUsername'].text connection['directory'] = self.components['txtPassword'].text else: connection['username'] = self.components['txtUsername'].text connection['password'] = self.components['txtPassword'].text connection['database'] = self.components['txtDatabase'].text self.parent.connection = connection # Get the choice widget and add the available database tables to it self.parent._database=dbClass(self.parent.connection) if self.parent._database._cursor: self.parent.components.chsTables.items=self.parent._database.getTables() # Change focus to the chsTables widget, if we have any tables if self.parent.components.chsTables.items: self.parent.components.chsTables.stringSelection=self.parent.components.chsTables.items[0] self.parent.components.chsTables.setFocus() self.parent.statusBar.text = "Connected" else: # The connection do the data source has failed self.parent.showAlert('Error: Could not connect to database', 'Database Error') self.parent.statusBar.text = "Connection failed" event.skip() def on_btnFile_mouseClick(self, event): if self.components.choice.stringSelection == 'Gadfly': wildcard = wildcard = "Gadfly files (*.gfd)|*.gfd" result = dialog.openFileDialog(wildcard=wildcard) elif self.components.choice.stringSelection == 'CSV': wildcard = "CSV files (*.csv)|*.csv" result = dialog.openFileDialog(wildcard=wildcard) else: result = dialog.openFileDialog() if result.accepted: dir, filename = os.path.split(result.paths[0]) if self.components.choice.stringSelection == 'Gadfly': filename = os.path.splitext(filename)[0] self.components.txtUsername.text = filename self.components.txtPassword.text = dir def on_choice_select(self, event): "Display the appropriate widgets for the selected database" if self.components.choice.stringSelection in ('Gadfly', 'MetaKit', 'PySQLite', 'PySQLite2'): self.components.lblUsername.text = 'DB Name' self.components.lblPassword.text = 'DB Directory' self.components.lblDatabase.visible = False self.components.txtDatabase.visible = False self.components.btnFile.visible = True elif self.components.choice.stringSelection in ('CSV'): self.components.lblUsername.text = "File" self.components.lblPassword.text = "Directory" self.components.lblDatabase.visible = False self.components.txtDatabase.visible = False self.components.btnFile.visible = True else: self.components.lblUsername.text = 'Username' self.components.lblPassword.text = 'Password' self.components.lblDatabase.visible = True self.components.txtDatabase.visible = True self.components.btnFile.visible = False event.skip() PythonCard-0.8.2/samples/dbBrowser/dbLogin.rsrc.py0000644000076500007650000000310310242452461022004 0ustar alexalex00000000000000{'type':'CustomDialog', 'name':'dlgDbLogin', 'title':'Database Login', 'position':(151, 257), 'size':(375, 200), 'components': [ {'type':'StaticText', 'name':'lblDbType', 'position':(5, 5), 'text':'Database', }, {'type':'Choice', 'name':'choice', 'position':(110, 0), 'items':['MySQL', 'Oracle', 'Gadfly', 'MetaKit', 'PySQLite', 'PySQLite2', 'PostgreSQL', 'CSV'], 'stringSelection':'MySQL', }, {'type':'StaticText', 'name':'lblUsername', 'position':(5, 50), 'text':'Username', }, {'type':'TextField', 'name':'txtUsername', 'position':(110, 50), 'size':(100, -1), }, {'type':'StaticText', 'name':'lblPassword', 'position':(5, 100), 'text':'Password', }, {'type':'PasswordField', 'name':'txtPassword', 'position':(110, 100), 'size':(100, -1), }, {'type':'StaticText', 'name':'lblDatabase', 'position':(5, 150), 'text':'Database', }, {'type':'TextField', 'name':'txtDatabase', 'position':(110, 150), 'size':(100, -1), 'toolTip':'Database name', }, {'type':'Button', 'id':5100, 'name':'btnConnect', 'position':(275, 4), 'size':(80, -1), 'default': 1, 'label':'Connect', }, {'type':'Button', 'id':5101, 'name':'btnCancel', 'position':(275, 50), 'size':(80, -1), 'label':'Cancel', }, {'type':'Button', 'name':'btnFile', 'position':(275, 96), 'label':'File...', 'visible':0, }, ] # end components } # end CustomDialog PythonCard-0.8.2/samples/dbBrowser/dbTable.py0000644000076500007650000000411010116442772021016 0ustar alexalex00000000000000from wx import grid class DBTable(grid.PyGridTableBase): """Class to wrap a database table that can be assigned to a grid Inspired by wxPyDBAPITable by Nathan R Yergler """ def __init__(self, db, tableName): grid.PyGridTableBase.__init__(self) self.__db=db self.tableName=tableName self.getData(tableName) def getData(self, tableName): "Execute and return the rows to our internal data structure" # Should tableName be a method argument or should we use self.tableName? self.__rows=self.__db.getRows(tableName) self._rowCount=len(self.__rows) self._colNames=[col[0] for col in self.__db.getColumns(tableName)] self._colCount=len(self._colNames) # Table level methods def GetNumberRows(self): return self._rowCount def GetNumberCols(self): return self._colCount def AppendRows(self, numRows=1): # Implement this when we want to modify data # Should just be a simple insert (?) return True # Cell level values def IsEmptyCell(self, row, col): if self.__rows[row][col] == "" or self.__rows[row][col] is None: return True else: return False def GetValue(self, row, col): return self.__rows[row][col] def SetValue(self, row, col, valstr): # Implement this when we want to modify data # Should just be a simple update (?) return True # Label methods def GetRowLabelValue(self, row): # A record number will do fine, thanks return row+1 def GetColLabelValue(self, col): return self._colNames[col] def SetRowLavelValue(self, row, label): # Disable this for now pass def SetColLabelValue(self, row, label): # Disable this for now pass # Miscellaneous methods def refresh(self): if self.__stmt: self.getData(self.__stmt) def GetRowLabelList(self): # Not today thank you pass def GetColLabelList(self): return self._colNames PythonCard-0.8.2/samples/dbBrowser/gadflyBrowse.py0000755000076500007650000001061610347526322022124 0ustar alexalex00000000000000#!/usr/bin/python """ Module Name: gadflyBrowse Description: Plug in for PythonCard application dbBrowse to provide Gadfly specific functionality Constant/configuration values are currently maintained in the source code. If we are to optimise this application they should be split into seperate configuration files (as per PythonCard/Webware style guidelines) The structure of this module should be replicated for different RDBMS so that they can be interchanged by dbBrowse - hopefully. """ __version__="$Revision $"[11:-2] __date__="$Date $" __author__="Andy Todd " import gadfly class browse: # Connection should be a dictionary with at least two keys, # 'databasename' and 'directory' # This is wildly different to other database modules def __init__(self, connection): "Setup the database connection" self._system_tables=['__TABLE_NAMES__', '__INDEXCOLS__', '__COLUMNS__', '__INDICES__', '__DATADEFS__', 'DUAL'] # Not providing a db name is guaranteed to ruin our connection if not connection['databasename']: raise ValueError self._db = gadfly.gadfly( databasename=connection['databasename'] ,directory=connection['directory'] ) self._cursor=self._db.cursor() # This one is used in getRow self._tableName='' def getTables(self): "Return a list of all of the non-system tables in " stmt = "SELECT table_name FROM __table_names__" self._cursor.execute(stmt) # I'm using a list comprehension here instead of a for loop, # either will do but I think this is more concise (unlike this comment) return [ x[0] for x in self._cursor.fetchall() if x[0] not in self._system_tables ] def getColumns(self, tableName): "Get the definition of the columns in tableName" stmt = "SELECT column_name FROM __columns__ WHERE table_name = ?" self._cursor.execute(stmt, (tableName,)) # format of Gadfly definitions is; # column name # format of dbBrowser column definitions is # column name, data type, length (for display), nullable, key, default columnDefs = [] for column in self._cursor.fetchall(): columnName = column[0] dataType, nullable, key, default = "varchar", "", "", "" # Dodgy default, but if works for me precision = 255 columnDefs.append((columnName, dataType, precision, nullable, key, default)) return columnDefs def getQueryString(self, tableName): "Return a SQL statement which queries all of the columns in tableName" tableStructure=self.getColumns(tableName) # Construct and return the string stmt='SELECT ' for columnList in tableStructure: stmt+=columnList[0]+', ' stmt=stmt[:-2]+' FROM '+tableName return stmt def getRow(self, tableName): "Get a row from tableName" # When we upgrade to 2.2 this will be a great candidate for a # generator/iterator. In the meantime we use self._tableName to keep # track of what we are doing if tableName!=self._tableName: self._tableName=tableName self._cursor.execute(self.getQueryString(tableName)) try: result = self._cursor.fetchone() except gadfly.database.error: result = None return result def getRows(self, tableName): "Get all of the rows from tableName" if tableName!=self._tableName: self._tableName=tableName self._cursor.execute(self.getQueryString(tableName)) try: result = self._cursor.fetchall() except gadfly.database.error: result = None return result if __name__ == '__main__': # We are in an interactive session so run our test routines # Connect to the database connection={ 'databasename':'andy' ,'directory':'E:\Gadfly'} dbHolder = browse(connection) # Return all of our table names into user_tables user_tables = dbHolder.getTables() # Print out the structure of each table and its first row print "--------------------------------------------------" for table in user_tables: print dbHolder.getQueryString(table) print dbHolder.getRow(table) print "--------------------------------------------------" PythonCard-0.8.2/samples/dbBrowser/metakitBrowse.py0000644000076500007650000001206310347526322022307 0ustar alexalex00000000000000#!/usr/bin/python """ Module Name: metakitBrowse Description: Plug in for PythonCard application dbBrowse to provide MetaKit specific functionality Constant/configuration values are currently maintained in the source code. If we are to optimise this application they should be split into seperate configuration files (as per PythonCard/Webware style guidelines) The structure of this module should be replicated for different RDBMS so that they can be interchanged by dbBrowse - hopefully. To Do; Because metakit isn't a relational database we probably don't need to support the getQueryString method in this class. Its only really an internal utility method for the other, public, classes anyway. """ #jm - marked changes 030218 __version__="$Revision $"[11:-2] __date__="$Date $" __author__="Andy Todd " import metakit import os class browse: # Connection should be a dictionary with at least two keys, # 'databasename' and 'directory' # This is wildly different to other database modules def __init__(self, connection): "Setup the database connection" self._system_tables=[] # Not providing a db name is guaranteed to ruin our connection if not connection['databasename']: raise ValueError filename = os.path.join(connection['directory'], connection['databasename']) # not sure about the mode to use, I assume we just want read-only self._db = metakit.storage(filename, 0) self._cursor='placeholder' # This one is used in getRow self._tableName='' def getTables(self): "Return a list of all of the non-system tables in " return [p.name for p in self._db.contents().structure() if p.type == 'V'] #jm def getColumns(self, tableName): "Get the definition of the columns in tableName" columnDefs = [] for column in self._db.view(tableName).structure(): #jm - this block columnName, dataType = column.name,column.type if dataType in ['S','V']: dataType == 'varchar' elif dataType == 'I': dataType == 'int' elif dataType in ["F","D"]: dataType == 'float' nullable, key, default = "", "", "" # Dodgy default, but if works for me precision = 25 columnDefs.append((columnName, dataType, precision, nullable, key, default)) return columnDefs def getQueryString(self, tableName): "Return a SQL statement which queries all of the columns in tableName" tableStructure=self.getColumns(tableName) # Construct and return the string stmt='SELECT ' for columnList in tableStructure: stmt+=columnList[0]+', ' stmt=stmt[:-2]+' FROM '+tableName return stmt def getRow(self, tableName): "Get a row from tableName" # When we upgrade to 2.2 this will be a great candidate for a # generator/iterator. In the meantime we use self._tableName to keep # track of what we are doing if tableName!=self._tableName: self._tableName=tableName self._cursor = self._db.view(tableName) self._currentPos = -1 self._currentPos += 1 if self._currentPos == len(self._cursor): self._currentPos -= 1 return None # could cache these # apparently we don't need all the junk info # from getColumns nor do we need to use getQueryString columnNames = [i.name for i in self._cursor.structure()] #jm row = self._cursor[self._currentPos] result = [] for c in columnNames: try: result.append(getattr(row, c)) except AttributeError: result.append('') #print result return result def getRows(self, tableName): "Get all of the rows from tableName" # columnNames = [i[0] for i in self.getColumns(tableName)] self._cursor=self._db.view(tableName) columnNames = [i.name for i in self._cursor.structure()] #jm rows=[] for row in range(0, len(self._cursor)): currentRow=[] for column in columnNames: currentRow.append(getattr(self._cursor[row], column)) rows.append(currentRow) return rows if __name__ == '__main__': # We are in an interactive session so run our test routines # Connect to the database ##connection={ 'databasename':'andy' ## ,'directory':'E:\Gadfly'} connection={'databasename':'calflora.db', 'directory':'.'} dbHolder = browse(connection) # Return all of our table names into user_tables user_tables = dbHolder.getTables() # Print out the structure of each table and its first row print "--------------------------------------------------" for table in user_tables: print "table:", table print dbHolder.getQueryString(table) print dbHolder.getRow(table) print "--------------------------------------------------" PythonCard-0.8.2/samples/dbBrowser/mySQLBrowse.py0000755000076500007650000001315210347526322021661 0ustar alexalex00000000000000#!/usr/bin/python """ Module Name: mySQLBrowse Description: Plug in for PythonCard application dbBrowse to provide MySQL specific functionality Constant/configuration values are currently maintained in the source code. If we are to optimise this application they should be split into seperate configuration files (as per PythonCard/Webware style guidelines) The structure of this module should be replicated for different RDBMS so that they can be interchanged by dbBrowse - hopefully. The only manipulation to data is to format date values as DD-Mon-YYYY The class name was changed to 'browse' for version 0.2.1, this allows us to use the same class name in each database handler module. Data returned from getColumns has been changed for version 0.3. This enables dbBrowser.DbBrowser to be a lot more generic and removes a lot of data manipulationin the on_btnBrowse_mouseClick method. Also added 'func' to the list of system tables (it was added after version 3.23.37) """ __version__="0.3" __date__="30th March, 2002" __author__="Andy Todd " import MySQLdb class browse: # Connection should be a dictionary with at least three keys, 'username', # 'password', 'database' - may need to be normalised for other RDBMS def __init__(self, connection): "Setup the database connection" self._system_tables=['columns_priv', 'db', 'host', 'tables_priv', 'user', 'func'] # Not providing a db name is guaranteed to ruin our connection if not connection['database']: raise ValueError self._db = MySQLdb.connect( user=connection['username'] ,passwd=connection['password'] ,db=connection['database'] ) self._cursor=self._db.cursor() # This one is used in getRow self._tableName='' def getTables(self): "Return a list of all of the non-system tables in " stmt = 'show tables' self._cursor.execute(stmt) # I'm using a list comprehension here instead of a for loop, # either will do but I think this is more concise (unlike this comment) return [ x[0] for x in self._cursor.fetchall() if x[0] not in self._system_tables ] def getColumns(self, tableName): "Get the definition of the columns in tableName" stmt = 'describe ' + tableName self._cursor.execute(stmt) # format of MySQL definitions is; # column name,type (incl length & precision),null,key,default,extra # format of dbBrowser column definitions is # column name, data type, length (for display), nullable, key, default columnDefs = [] for column in self._cursor.fetchall(): columnName, nullable, key, default = column[0], column[2], column[3], column[4] columnDetails = column[1].split("(") dataType = columnDetails[0] # the first 'word' in the definition if dataType == "date": precision = 22 elif len(columnDetails) > 1: precision = columnDetails[1] bracketPosition = precision.find(")") if bracketPosition != -1: precision = precision[0:bracketPosition] commaPosition = precision.find(",") if commaPosition != -1: precision = precision[0:commaPosition] precision = int(precision) else: # Dodgy default, but if works for me precision = 255 columnDefs.append((columnName, dataType, precision, nullable, key, default)) return columnDefs def getQueryString(self, tableName): "Return a SQL statement which queries all of the columns in tableName" tableStructure=self.getColumns(tableName) # Construct and return the string stmt='SELECT ' for columnList in tableStructure: if columnList[1]=='date': stmt+='date_format('+columnList[0]+", '%d-%b-%Y'), " else: stmt+=columnList[0]+', ' stmt=stmt[:-2]+' FROM '+tableName return stmt def getRow(self, tableName): "Get a row from tableName" # When we upgrade to 2.2 this will be a great candidate for a # generator/iterator. In the meantime we use self._tableName to keep # track of what we are doing if tableName!=self._tableName: self._tableName=tableName self._cursor.execute(self.getQueryString(tableName)) return self._cursor.fetchone() def getRows(self, tableName): "Get all of the rows from tableName" # When we upgrade to 2.2 this will be a great candidate for a # generator/iterator. In the meantime we use self._tableName to keep # track of what we are doing if tableName!=self._tableName: self._tableName=tableName self._cursor.execute(self.getQueryString(tableName)) return self._cursor.fetchall() if __name__ == '__main__': # We are in an interactive session so run our test routines # Connect to the database connection={ 'username':'andy' ,'password':'andy' ,'database':'mysql'} dbHolder = mySQLBrowse(connection) # Return all of our table names into user_tables user_tables = dbHolder.getTables() # Print out the structure of each table and its first row print "--------------------------------------------------" for table in user_tables: print dbHolder.getQueryString(table) print dbHolder.getRow(table) print "--------------------------------------------------" PythonCard-0.8.2/samples/dbBrowser/oracleBrowse.py0000755000076500007650000001173110347526322022122 0ustar alexalex00000000000000#!/usr/bin/python """ Module Name: oracleBrowse Description: Plug in for PythonCard application dbBrowse to provide Oracle specific functionality Constant/configuration values are currently maintained in the source code. If we are to optimise this application they should be split into seperate configuration files (as per PythonCard/Webware style guidelines) The structure of this module should be replicated for different RDBMS so that they can be interchanged by dbBrowse - hopefully. The only manipulation to data is to format date values as DD-Mon-YYYY This module currently relies on cx_Oracle to access Oracle. It should be expanded to use other DB-API compatible access modules. Changes; 04-Apr-2002 Changed the format of columnDefs that is passed from the db handler modules back to dbBrowser in the getColumns method. This actually makes the code in this module simpler, which must be a good thing """ __version__='$Revision: 1.9 $'[11:-2] __date__='9th November 2001' __author__='Andy Todd ' try: import cx_Oracle oracle = cx_Oracle except ImportError: import DCOracle2 oracle = DCOracle2 class browse: # Connection should be a dictionary with at least three keys, 'username', # 'password', 'database' - may need to be normalised for other RDBMS def __init__(self, connection): "Setup the database connection" # self._system_tables=['columns_priv', 'db', 'host', 'tables_priv', 'user'] # Not providing some values is guaranteed to ruin our connection if ('username' not in connection) and ('password' not in connection): raise ValueError connectString = connection['username']+'/'+connection['password'] if 'database' in connection: if connection['database']: connectString += '@' + connection['database'] self._db = oracle.connect( connectString ) self._cursor=self._db.cursor() # This one is used in getRow self._tableName='' def getTables(self): "Return a list of all of the non-system tables in schema " stmt = 'SELECT table_name FROM user_tables' self._cursor.execute(stmt) return [ tableName[0] for tableName in self._cursor.fetchall() ] def getColumns(self, tableName): "Get the definition of the columns in tableName" # Have to make the data types lower case to keep in line with MySQL # format of dbBrowser column definitions is # column name, data type, length (for display), nullable, key, default stmt = """SELECT column_name, lower(data_type) data_type, decode(data_type, 'DATE', 11, 'NUMBER', nvl(data_precision, 38), data_length) precision, decode(nullable, 'Y', 'YES') nullable, ' ' key, ' ' default_value, ' ' extra FROM user_tab_columns WHERE table_name = '%s'""" % tableName self._cursor.execute(stmt) return self._cursor.fetchall() def getQueryString(self, tableName): "Return a SQL statement which queries all of the columns in tableName" tableStructure=self.getColumns(tableName) # Construct and return the string stmt='SELECT ' for columnList in tableStructure: # if columnList[1]=='DATE': # stmt+='date_format('+columnList[0]+", '%d-%b-%Y'), " # else: stmt+=columnList[0]+', ' stmt=stmt[:-2]+' FROM '+tableName return stmt def getRow(self, tableName): "Get a row from tableName" # When we upgrade to 2.2 this will be a great candidate for a # generator/iterator. In the meantime we use self._tableName to keep # track of what we are doing if tableName!=self._tableName: self._tableName=tableName self._cursor.execute(self.getQueryString(tableName)) return self._cursor.fetchone() def getRows(self, tableName): "Get all of the rows from tableName" if tableName!=self._tableName: self._tableName=tableName self._cursor.execute(self.getQueryString(tableName)) return self._cursor.fetchall() if __name__ == '__main__': # We are in an interactive session so run our test routines # Connect to the database connection={ 'username':'andy' ,'password':'andy' ,'database':'' } dbHolder = browse(connection) # Return all of our table names into user_tables user_tables = dbHolder.getTables() # Print out the structure of each table and its first row print "--------------------------------------------------" for table in user_tables: print dbHolder.getQueryString(table) # print dbHolder.getRow(table) print "--------------------------------------------------" PythonCard-0.8.2/samples/dbBrowser/postgreBrowse.py0000644000076500007650000001104410347526322022332 0ustar alexalex00000000000000#!/usr/bin/python """ Module Name: psyopg Description: Plug in for PythonCard application dbBrowse to provide Psycopg specific functionality Psycopg version of the mysqlBrowse class """ __version__="$Release $" __date__="Sat Jun 7 13:39:12 BST 2003" __author__="Jon Dyte " import psycopg from psycopg import NUMBER, STRING, INTEGER, FLOAT, DATETIME from psycopg import BOOLEAN, ROWID, LONGINTEGER class browse: # Connection should be a dictionary with at least three keys, 'username', # 'password', 'database' - may need to be normalised for other RDBMS def __init__(self, connection): "Setup the database connection" self._system_tables = [] # Not providing a db name is guaranteed to ruin our connection if not connection['database']: raise ValueError self._db = psycopg.connect( "user=%s password=%s dbname=%s" % (connection['username'], connection['password'], connection['database']) ) self._cursor=self._db.cursor() # This one is used in getRow self._tableName='' def getTables(self): "Return a list of all of the non-system tables in .\ CAVEAT: actually gets all the tables not owned by user 'postgres'" stmt ="SELECT t.tablename FROM pg_tables t WHERE tableowner <> \'postgres\'" self._cursor.execute(stmt) # I'm using a list comprehension here instead of a for loop, # either will do but I think this is more concise (unlike this comment) return [ x[0] for x in self._cursor.fetchall() if x[0] not in self._system_tables ] def getColumns(self, tableName): "Get the definition of the columns in tableName" stmt = 'select * from %s where 1=0 ' % tableName try: self._cursor.execute(stmt) except psycopg.Error: return () desc = self._cursor.description r = [] a = r.append ## shamelessly borrowed from the ZPsycopgDA for Zope for name, type, width, ds, p, scale, null_ok in desc: if type == NUMBER: if type == INTEGER: type = INTEGER elif type == FLOAT: type = FLOAT else: type = NUMBER elif type == BOOLEAN: type = BOOLEAN elif type == ROWID: type = ROWID elif type == DATETIME: type = DATETIME else: type = STRING a((name,type.name,0,0,0)) return r def getQueryString(self, tableName): "Return a SQL statement which queries all of the columns in tableName" tableStructure=self.getColumns(tableName) # Construct and return the string return 'SELECT %s FROM %s' % (", ".join([column[0] for column in tableStructure]), tableName) def getRow(self, tableName): "Get a row from tableName" # When we upgrade to 2.2 this will be a great candidate for a # generator/iterator. In the meantime we use self._tableName to keep # track of what we are doing if tableName!=self._tableName: self._tableName=tableName self._cursor.execute(self.getQueryString(tableName)) return self._cursor.fetchone() def getRows(self, tableName): "Get all of the rows from tableName" # When we upgrade to 2.2 this will be a great candidate for a # generator/iterator. In the meantime we use self._tableName to keep # track of what we are doing if tableName!=self._tableName: self._tableName=tableName self._cursor.execute(self.getQueryString(tableName)) return self._cursor.fetchall() if __name__ == '__main__': # We are in an interactive session so run our test routines # Connect to the database connection={ 'username':'' ,'password':'' ,'database':''} dbHolder = browse(connection) # Return all of our table names into user_tables user_tables = dbHolder.getTables() # Print out the structure of each table and its first row print "--------------------------------------------------" for table in user_tables: print table print dbHolder.getQueryString(table) print dbHolder.getRow(table) print "--------------------------------------------------" PythonCard-0.8.2/samples/dbBrowser/pysqlite2Browse.py0000644000076500007650000001061310347526322022604 0ustar alexalex00000000000000#!/usr/bin/python """ Module Name: pysqlite2Browse Description: Plug in for PythonCard application dbBrowse to provide pysqlite2 specific functionality Constant/configuration values are currently maintained in the source code. If we are to optimise this application they should be split into seperate configuration files (as per PythonCard/Webware style guidelines) The structure of this module should be replicated for different RDBMS so that they can be interchanged by dbBrowse - hopefully. """ __version__="$Revision $"[11:-2] __date__="$Date $" __author__="Andy Todd " # AGT 2005-05-17 # see http://www.pysqlite.org # see http://www.hwaci.com/sw/sqlite/faq.html from pysqlite2 import dbapi2 as sqlite import os class browse: # Connection should be a dictionary with at least two keys, # 'databasename' and 'directory' # This is wildly different to other database modules def __init__(self, connection): "Setup the database connection" self._system_tables=[] # Not providing a db name is guaranteed to ruin our connection if not connection['databasename']: raise ValueError filename = os.path.join(connection['directory'], connection['databasename']) # AGT 2005-05-15 single parameter, no mode on connect self._db = sqlite.connect(filename) self._cursor=self._db.cursor() # This one is used in getRow self._tableName='' def getTables(self): "Return a list of all of the non-system tables in " ##stmt = "SELECT table_name FROM __table_names__" stmt = "SELECT name FROM sqlite_master WHERE type='table' ORDER BY name;" self._cursor.execute(stmt) # I'm using a list comprehension here instead of a for loop, # either will do but I think this is more concise (unlike this comment) return [ x[0] for x in self._cursor.fetchall() if x[0] not in self._system_tables ] def getColumns(self, tableName): "Get the definition of the columns in tableName" stmt = "select * from " + tableName self._cursor.execute(stmt) #row = self._cursor.fetchone() columnDefs = [] # AGT 2005-05-15 description is a list of item, not a dict for column in self._cursor.description: columnName = column[0] dataType, nullable, key, default = "varchar", "", "", "" # Dodgy default, but if works for me precision = 255 columnDefs.append((columnName, dataType, precision, nullable, key, default)) return columnDefs def getQueryString(self, tableName): "Return a SQL statement which queries all of the columns in tableName" tableStructure=self.getColumns(tableName) # Construct and return the string stmt='SELECT ' for columnList in tableStructure: stmt+=columnList[0]+', ' stmt=stmt[:-2]+' FROM '+tableName return stmt def getRow(self, tableName): "Get a row from tableName" # When we upgrade to 2.2 this will be a great candidate for a # generator/iterator. In the meantime we use self._tableName to keep # track of what we are doing if tableName!=self._tableName: self._tableName=tableName self._cursor.execute(self.getQueryString(tableName)) result = self._cursor.fetchone() return result def getRows(self, tableName): "Get all of the rows from tableName" if tableName!=self._tableName: self._tableName=tableName self._cursor.execute(self.getQueryString(tableName)) result=self._cursor.fetchall() return result if __name__ == '__main__': # We are in an interactive session so run our test routines # Connect to the database ##connection={ 'databasename':'andy' ## ,'directory':'E:\Gadfly'} print os.getcwd() connection={'databasename':'calflora.db', 'directory':'.'} dbHolder = browse(connection) # Return all of our table names into user_tables user_tables = dbHolder.getTables() # Print out the structure of each table and its first row print "--------------------------------------------------" for table in user_tables: print "table:", table print dbHolder.getQueryString(table) print dbHolder.getRow(table) print "--------------------------------------------------" PythonCard-0.8.2/samples/dbBrowser/pysqliteBrowse.py0000644000076500007650000001026510347526322022525 0ustar alexalex00000000000000#!/usr/bin/python """ Module Name: gadflyBrowse Description: Plug in for PythonCard application dbBrowse to provide Gadfly specific functionality Constant/configuration values are currently maintained in the source code. If we are to optimise this application they should be split into seperate configuration files (as per PythonCard/Webware style guidelines) The structure of this module should be replicated for different RDBMS so that they can be interchanged by dbBrowse - hopefully. """ __version__="$Revision $"[11:-2] __date__="$Date $" __author__="Andy Todd " # KEA 2003-01-19 # see http://www.hwaci.com/sw/sqlite/faq.html import sqlite import os class browse: # Connection should be a dictionary with at least two keys, # 'databasename' and 'directory' # This is wildly different to other database modules def __init__(self, connection): "Setup the database connection" self._system_tables=[] if not connection['databasename']: raise ValueError filename = os.path.join(connection['directory'], connection['databasename']) # not sure about the mode to use, I assume we just want read-only self._db = sqlite.connect(db=filename, mode=077) self._cursor=self._db.cursor() # This one is used in getRow self._tableName='' def getTables(self): "Return a list of all of the non-system tables in " ##stmt = "SELECT table_name FROM __table_names__" stmt = "SELECT name FROM sqlite_master WHERE type='table' ORDER BY name;" self._cursor.execute(stmt) # I'm using a list comprehension here instead of a for loop, # either will do but I think this is more concise (unlike this comment) return [ x[0] for x in self._cursor.fetchall() if x[0] not in self._system_tables ] def getColumns(self, tableName): "Get the definition of the columns in tableName" stmt = "select * from " + tableName self._cursor.execute(stmt) row = self._cursor.fetchone() columnDefs = [] for column in row.keys(): columnName = column dataType, nullable, key, default = "varchar", "", "", "" # Dodgy default, but if works for me precision = 255 columnDefs.append((columnName, dataType, precision, nullable, key, default)) return columnDefs def getQueryString(self, tableName): "Return a SQL statement which queries all of the columns in tableName" tableStructure=self.getColumns(tableName) # Construct and return the string stmt='SELECT ' for columnList in tableStructure: stmt+=columnList[0]+', ' stmt=stmt[:-2]+' FROM '+tableName return stmt def getRow(self, tableName): "Get a row from tableName" # When we upgrade to 2.2 this will be a great candidate for a # generator/iterator. In the meantime we use self._tableName to keep # track of what we are doing if tableName!=self._tableName: self._tableName=tableName self._cursor.execute(self.getQueryString(tableName)) result = self._cursor.fetchone() return result def getRows(self, tableName): "Get all of the rows from tableName" if tableName!=self._tableName: self._tableName=tableName self._cursor.execute(self.getQueryString(tableName)) result=self._cursor.fetchall() return result if __name__ == '__main__': # We are in an interactive session so run our test routines # Connect to the database ##connection={ 'databasename':'andy' ## ,'directory':'E:\Gadfly'} connection={'databasename':'calflora.db', 'directory':'.'} dbHolder = browse(connection) # Return all of our table names into user_tables user_tables = dbHolder.getTables() # Print out the structure of each table and its first row print "--------------------------------------------------" for table in user_tables: print "table:", table print dbHolder.getQueryString(table) print dbHolder.getRow(table) print "--------------------------------------------------" PythonCard-0.8.2/samples/dbBrowser/readme.txt0000644000076500007650000001226010313163032021076 0ustar alexalex00000000000000Module : dbBrowser Date : 2nd July, 2003 Author : Andy Todd Minor additions: May 17, 2005 Alex Tweedly dbBrowser is a client for viewing data from relational databases. Once you connect to a database, select a table and the rows of data from it are available for you to view. The current version of dbBrowser works with MySQL, Gadfly, SQLite, Metakit, PySQLite, PySQLite2, PostgreSQL and Oracle. The code is stable but this is still an alpha release so if you are not already using any of these databases it is probably best to give this a miss until it is more stable. The current distribution includes an alternative version of dbBrowser (called dbBrowser2) which uses a wxGrid to display the results of your queries rather than the row at a time of dbBrowser. To access MySQL databases you will need MySQL installed, get it from: http://www.mysql.com/ You will also need the MySQLdb package, which can be found at (rpm, tar.gz, source): http://sourceforge.net/projects/mysql-python/ If you have MySQL but don't have any database tables or data a sample schema is included with this sample. From the scripts directory run "python mysql_sample.py" To access Oracle databases you will need the Oracle client installed, get it from: http://www.oracle.com You will also need access to an Oracle database with the appropriate user name, password and connection string. Ensure you can connect to your database through SQL*Plus before attempting to use this application. You will also need the either the cx_Oracle package which can be found at: http://www.computronix.com/utilities Or DCOracle2, available at; http://www.zope.org/Members/matt/dco2 If you have either of these modules installed dbBrowser will use them automatically. You will need the Gadfly pure Python module from: http://gadfly.sourceforge.net/ This has only been tested with release candidate 1 of this module. To access PySQLite databases you will need pysqlite installed, either version 1 or 2, get them from: http://www.pysqlite.org/ If you have pysqlite2 installed but don't have any database tables or data, a utility is included with this sample, to create a db from any CSV file. From the scripts directory run "python pysqlite2_from_csv.py". Future versions will use different databases. I'm planning to include support for ODBC. If you would like to add support for another RDBMS please send me an e-mail or post a notice to the mailing list (pythoncard-users@lists.sourceforge.net). Observations ------------ You will need to know the name of the database you want to connect to. By default MySQL creates databases called 'test' and 'mysql' when you install it. If you are stuck try the on line documentation at: http://www.mysql.com/doc/ After that you are definitely on your own - unless you send me a really nice e-mail. By default there are no tables in a fresh installation of MySQL. The application 'ignores' the system tables (columns_priv, db, host, tables_priv, user). For the application to work you will need to have created and populated your own tables. Otherwise it will simply connect to the database and then not provide you with any tables to browse. If you are connecting to oracle you will need to connect as a schema owner. If the user you connect to the database with does not own any tables you will not be able to browse any data. This is because the handler module uses the 'USER' data dictionary views. Future versions may use the 'ALL' data dictionary views but the best way to support these would be to write the code yourself, submissions are always welcome. If you select a database type of Gadfly, SQLite or Metakit the connection details will change. You need to provide a database name and location. Change Notices -------------- 16.08.2005 - Clean up and re-factoring 17.05.2005 - Added PySQLite2 support, including script to create a test database from a csv file. ??.09.2004 - Added CSV support, including a testfile.csv test sample. 02.07.2003 - Added PostgreSQL support thanks to Jon Dyte 04.05.2003 - Added dbBrowser2 11.06.2002 - Added support for the 'new' gadfly module 11.06.2002 - On startup place the cursor in the username field and make the 'connect' button the default when the user presses 'enter'. 04.04.2002 - Changed the format of the column definitions passed around by the different modules. This should cope with different datatypes in the database modules much more elegantly. 20.11.2001 - Moved icon setting code to framework 10.11.2001 - Added support for Oracle as well as MySQL. Changed the version numbering to date values 0.3 - Moved the login process to a modal dialog. This will pop up on startup. It can also be displayed when you select File|Open from the menu allowing you to change the database (or schema) the application is connected to. 0.2 - Added dynamic event handling for the navigation buttons/menu items. Changed the layout of data widgets to one label and data item per line. The focus changes to the table widget after connecting to a database. Changed format of date columns to DD-MON-YYYY for MySQL. Added some error handling to check for a valid MySQL database connection. PythonCard-0.8.2/samples/dbBrowser/scripts/0000755000076500007650000000000010434046771020604 5ustar alexalex00000000000000PythonCard-0.8.2/samples/dbBrowser/scripts/gadfly_sample.py0000755000076500007650000000516710047542621023774 0ustar alexalex00000000000000#!/usr/bin/python # Usage: python gadfly_sample.py # # Based on the mysql_sample.py script shipped with the PythonCard dbBrowser sample __author__ = "Andy Todd " import gadfly, sys # Specify some default values usageString="Usage: python %s " % sys.argv[0] if __name__=="__main__": if len(sys.argv) > 1: if sys.argv[1] in ("-h","--help") or len(sys.argv) != 3: print usageString sys.exit(0) # There is a database name on the command line dbName=sys.argv[1] dbDir=sys.argv[2] # If the database doesn't already exist we need to create it try: db=gadfly.gadfly(dbName, dbDir) except IOError: print "Database %s doesn't exist, creating it ..." % dbName db=gadfly.gadfly() db.startup(dbName, dbDir) # We have connected to a database now, lets issue some SQL # There is no error handling here, if anything goes wrong exceptions # will be raised by the MySQLdb package cursor=db.cursor() stmt=""" CREATE TABLE currencies ( currency_code VARCHAR(3) ,currency_desc VARCHAR(255) ) """ result=cursor.execute(stmt) db.commit() stmt="""CREATE UNIQUE INDEX currency_pk ON currencies(currency_code)""" result=cursor.execute(stmt) db.commit() stmt=""" INSERT INTO currencies ( currency_code, currency_desc ) VALUES ( ?, ? )""" cursor.execute(stmt, ( 'USD', 'US Dollars')) cursor.execute(stmt, ( 'AUD', 'Australian Dollars')) cursor.execute(stmt, ( 'UKP', 'Pounds Sterling')) cursor.execute(stmt, ( 'FFR', 'French Francs')) cursor.execute(stmt, ( 'HKD', 'Hong Kong Dollar')) cursor.execute(stmt, ( 'CHF', 'Swiss Franc')) cursor.execute(stmt, ( 'CAD', 'Canadian Dollar')) cursor.execute(stmt, ( 'VND', 'Vietnamese Dong')) db.commit() stmt=""" CREATE TABLE exchange_rates ( exchange_date VARCHAR ,currency_from VARCHAR(3) ,currency_to VARCHAR(3) ,exchange_rate FLOAT ) """ result=cursor.execute(stmt) db.commit() stmt=""" INSERT INTO exchange_rates ( exchange_date, currency_from, currency_to, exchange_rate ) VALUES ( ?, ?, ?, ? ) """ cursor.execute(stmt, ( '2001-08-01', 'USD', 'AUD', 1.869 )) cursor.execute(stmt, ( '2001-08-01', 'USD', 'UKP', 0.750 )) cursor.execute(stmt, ( '2001-08-01', 'UKP', 'HKD', 11.02 )) db.commit() PythonCard-0.8.2/samples/dbBrowser/scripts/mysql_sample.py0000755000076500007650000000600710047542621023665 0ustar alexalex00000000000000#!/usr/bin/python # Usage: python mysql_sample.py # # If you do not specify a username and a password then you will need # to have 'open' access to your local MySQL database. # # This script kind of assumes you are one Windows. With the Windows binary # distribution of MySQL you get two databases 'for free', one called MYSQL # and another called 'test'. We create the tables in 'test' if the user does # not specify a database name. If there is no database called 'test' on *nix # then we are in trouble. # import MySQLdb, sys # Specify some default values usageString="Usage: python %s " % sys.argv[0] dbName='test' if __name__=="__main__": if len(sys.argv) > 1: if sys.argv[1] in ("-h","--help"): print usageString sys.exit(0) if sys.argv[3]: # There is a database name on the command line dbName=sys.argv[3] # We assume arguments 1 and 2 are username and password try: db=MySQLdb.connect(user=sys.argv[1], passwd=sys.argv[2], db=dbName) except MySQLdb.OperationalError: print usageString print "Invalid username, password or db name, please try again" sys.exit(1) else: # Free entry for all try: db=MySQLdb.connect(db=dbName) except MySQLdb.OperationalError: print usageString print "You cannot connect to the 'test' database without a valid username and password" sys.exit(1) # We have connected to a database now, lets issue some SQL # There is no error handling here, if anything goes wrong exceptions # will be raised by the MySQLdb package cursor=db.cursor() stmt=""" CREATE TABLE currencies ( currency_code VARCHAR(3) NOT NULL ,currency_desc VARCHAR(255) ,PRIMARY KEY ( currency_code ) ) """ result=cursor.execute(stmt) stmt=""" INSERT INTO currencies ( currency_code, currency_desc ) VALUES ( 'USD', 'US Dollars'), ( 'AUD', 'Australian Dollars'), ( 'UKP', 'Pounds Sterling'), ( 'FFR', 'French Francs'), ( 'HKD', 'Hong Kong Dollar'), ( 'CHF', 'Swiss Franc'), ( 'CAD', 'Canadian Dollar'), ( 'VND', 'Vietnamese Dong') """ result=cursor.execute(stmt) stmt=""" CREATE TABLE exchange_rates ( exchange_date DATE NOT NULL ,currency_from VARCHAR(3) NOT NULL ,currency_to VARCHAR(3) NOT NULL ,exchange_rate NUMERIC(15,3) ) """ result=cursor.execute(stmt) stmt=""" INSERT INTO exchange_rates ( exchange_date, currency_from, currency_to, exchange_rate ) VALUES ( '2001-08-01', 'USD', 'AUD', 1.869 ), ( '2001-08-01', 'USD', 'UKP', 0.750 ), ( '2001-08-01', 'UKP', 'HKD', 11.02 ) """ result=cursor.execute(stmt) PythonCard-0.8.2/samples/dbBrowser/scripts/pysqlite2_from_csv.py0000644000076500007650000000364410242452462025012 0ustar alexalex00000000000000#!/usr/bin/python # Usage: python pysqlite2_sample.py # # Create a SQLite2 database from a CSV file with headers. __author__ = "Alex Tweedly " import sys, csv from pysqlite2 import dbapi2 as sqlite # Specify some default values usageString="Usage: python %s " % sys.argv[0] if __name__=="__main__": if len(sys.argv) > 1: if sys.argv[1] in ("-h","--help") or len(sys.argv) != 3: print usageString sys.exit(0) # There is a database name on the command line csvName=sys.argv[1] dbName=sys.argv[2] db=sqlite.connect(dbName) # We have connected to a database now, lets issue some SQL # There is no error handling here, if anything goes wrong exceptions # will be raised by the MySQLdb package csvReader = csv.reader(file(csvName)) headers = csvReader.next() # clean up headers to ensure they are valid column names # - could do more error checking here - header2 = [ x.replace(' ', '').replace('/', '') for x in headers ] # add a type to each header3 = [ x + " VARCHAR" for x in header2] # and build a single string header4 = ",".join(header3) cursor=db.cursor() stmt="CREATE TABLE sample ( %s ) " % header4 result=cursor.execute(stmt) db.commit() stmt="""CREATE UNIQUE INDEX sample_id ON sample(%s)""" % header2[0] result=cursor.execute(stmt) db.commit() for row in csvReader: stmt=""" INSERT INTO sample ( %s ) VALUES ( %s )""" % (",".join(header2), ",".join(["'" + r + "'" for r in row])) cursor.execute(stmt) db.commit() else: print usageString #sys.exit(0) PythonCard-0.8.2/samples/dbBrowser/testfile.csv0000644000076500007650000000027710116452252021447 0ustar alexalex00000000000000Item,Weight,Cost/Unit,Units,Cost Oranges,.30,$0.25,7,$1.75 Pears,0.10,$0.27,3,$0.81 Apples,0.20,$0.31,10,$3.10 Pineapple,2.00,$1.05,2,$2.10 Kiwi,0.05,$0.37,12,$4.44 Banana,0.07,$0.10,6,$0.60 PythonCard-0.8.2/samples/dialogs/0000755000076500007650000000000010434046771016606 5ustar alexalex00000000000000PythonCard-0.8.2/samples/dialogs/dialogs.py0000644000076500007650000001665110130041027020571 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.27 $" __date__ = "$Date: 2004/10/03 18:16:55 $" """ from PythonCard import dialog, model import os, sys import wx import minimalDialog class Dialogs(model.Background): def on_initialize(self, event): self.fitToComponents(None, 5) def on_listDialogs_select(self, event): name = event.stringSelection handlers = { 'alert':self.on_buttonAlert_mouseClick, 'color':self.on_buttonColor_mouseClick, 'directory':self.on_buttonDir_mouseClick, 'file':self.on_buttonFile_mouseClick, 'find':self.on_buttonFind_mouseClick, 'font':self.on_buttonFont_mouseClick, 'message':self.on_buttonMessage_mouseClick, 'multiple choice':self.on_buttonMultipleChoice_mouseClick, 'scrolled message':self.on_buttonScrolledMessage_mouseClick, 'single choice':self.on_buttonSingleChoice_mouseClick, 'open file':self.on_buttonOpenFile_mouseClick, 'save file':self.on_buttonSaveFile_mouseClick, 'text entry':self.on_buttonTextEntry_mouseClick, 'minimal':self.on_buttonMinimalDialog_mouseClick, } # call the appropriate handler handlers[name](None) def on_buttonMultipleChoice_mouseClick(self, event): result = dialog.multipleChoiceDialog(self, "message", "title", ['one', 'two', 'three']) self.components.fldResults.text = "multipleChoiceDialog result:\naccepted: %s\nSelection: %s" % (result.accepted, result.selection) def on_buttonSingleChoice_mouseClick(self, event): result = dialog.singleChoiceDialog(self, "message", "title", ['one', 'two', 'three']) self.components.fldResults.text = "singleChoiceDialog result:\naccepted: %s\nSelection: %s" % (result.accepted, result.selection) def on_buttonFind_mouseClick(self, event): result = dialog.findDialog(self) self.components.fldResults.text = "findDialog result:\naccepted: %s\nText: %s\nWhole word only: %s\nCase sensitive: %s" % (result.accepted, result.searchText, result.wholeWordsOnly, result.caseSensitive) def on_buttonColor_mouseClick(self, event): result = dialog.colorDialog(self) self.components.fldResults.text = "colorDialog result:\naccepted: %s\nColor: %s" % (result.accepted, result.color) def on_buttonFont_mouseClick(self, event): result = dialog.fontDialog(self) self.components.fldResults.text = "fontDialog result:\naccepted: %s\nColor: %s\nFont: %s" % (result.accepted, result.color, result.font) def on_buttonFile_mouseClick(self, event): wildcard = "JPG files (*.jpg;*.jpeg)|*.jpeg;*.JPG;*.JPEG;*.jpg|GIF files (*.gif)|*.GIF;*.gif|All Files (*.*)|*.*" # wildcard = '*.py' result = dialog.fileDialog(self, 'Open', '', '', wildcard ) self.components.fldResults.text = "fileDialog result:\naccepted: %s\npaths: %s" % (result.accepted, result.paths) def on_buttonOpenFile_mouseClick(self, event): wildcard = "JPG files (*.jpg;*.jpeg)|*.jpeg;*.JPG;*.JPEG;*.jpg|GIF files (*.gif)|*.GIF;*.gif|All Files (*.*)|*.*" # wildcard = '*.py' result = dialog.openFileDialog(wildcard=wildcard) self.components.fldResults.text = "openFileDialog result:\naccepted: %s\npaths: %s" % (result.accepted, result.paths) def on_buttonSaveFile_mouseClick(self, event): wildcard = "JPG files (*.jpg;*.jpeg)|*.jpeg;*.JPG;*.JPEG;*.jpg|GIF files (*.gif)|*.GIF;*.gif|All Files (*.*)|*.*" # wildcard = '*.py' result = dialog.saveFileDialog(wildcard=wildcard) self.components.fldResults.text = "saveFileDialog result:\naccepted: %s\npaths: %s" % (result.accepted, result.paths) def on_buttonDir_mouseClick(self, event): result = dialog.directoryDialog(self, 'Choose a directory', 'a') self.components.fldResults.text = "directoryDialog result:\naccepted: %s\npath: %s" % (result.accepted, result.path) """ You can pass in a specific icon (default is wx.ICON_INFORMATION) as well as the buttons (default is wx.OK | wx.CANCEL) wx.ICON_EXCLAMATION # Shows an exclamation mark icon. wx.ICON_HAND # Shows an error icon. wx.ICON_ERROR # Shows an error icon - the same as wxICON_HAND. wx.ICON_QUESTION # Shows a question mark icon. wx.ICON_INFORMATION # Shows an information (i) icon. wx.OK # Show an OK button. wx.CANCEL # Show a Cancel button. wx.YES_NO # Show Yes and No buttons. wx.YES_DEFAULT # Used with wx.YES_NO, makes Yes button the default - which is the default behaviour. wx.NO_DEFAULT # Used with wx.YES_NO, makes No button the default. """ def on_buttonMessage_mouseClick(self, event): """ result = dialog.messageDialog(self, 'a message', 'a title', wx.ICON_ERROR | wx.YES_NO) """ result = dialog.messageDialog(self, 'a message', 'a title', wx.ICON_INFORMATION | wx.YES_NO | wx.NO_DEFAULT | wx.CANCEL) #result = dialog.messageDialog(self, 'a message', 'a title') self.components.fldResults.text = "messageDialog result:\naccepted: %s\nreturnedString: %s" % (result.accepted, result.returnedString) # you can pass in an additional aStyle parameter # of wx.TE_PASSWORD or wx.TE_MULTILINE def on_buttonTextEntry_mouseClick(self, event): result = dialog.textEntryDialog(self, 'What is your favorite language?', 'A window title', 'Python') """ result = dialog.textEntryDialog(self, 'What is your favorite language?', 'A window title', 'Python', wx.TE_MULTILINE) """ self.components.fldResults.text = "textEntryDialog result:\naccepted: %s\nreturnedString: %s\ntext: %s" % (result.accepted, result.returnedString, result.text) def on_buttonScrolledMessage_mouseClick(self, event): base, ext = os.path.splitext(os.path.split(sys.argv[0])[-1]) filename = base + ".py" if os.path.exists(filename): f = open(filename, "r") msg = f.read() else: msg = "Can't find the file dialogs.py" result = dialog.scrolledMessageDialog(self, msg, filename) self.components.fldResults.text = "scrolledMessageDialog result:\naccepted: %s" % (result.accepted) def on_buttonAlert_mouseClick(self, event): result = dialog.alertDialog(self, 'a message', 'a title') self.components.fldResults.text = "alertDialog result:\naccepted: %s\nreturnedString: %s" % (result.accepted, result.returnedString) def on_buttonMinimalDialog_mouseClick(self, event): result = minimalDialog.minimalDialog(self, 'hello minimal') self.components.fldResults.text = "minimalDialog result:\naccepted: %s\ntext: %s" % (result.accepted, result.text) if __name__ == '__main__': app = model.Application(Dialogs) app.MainLoop() PythonCard-0.8.2/samples/dialogs/dialogs.rsrc.py0000644000076500007650000000206610124322633021544 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'Dialogs', 'backgrounds': [ {'type':'Background', 'name':'bg1', 'title':'Dialogs', 'size':(403, 343), 'menubar': {'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'File', 'label':'&File', 'items': [ {'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit', }, ] }, ] }, 'components': [ {'type':'List', 'name':'listDialogs', 'position':(5, 5), 'size':(145, 290), 'items':['alert', 'color', 'directory', 'file', 'find', 'font', 'message', 'multiple choice', 'open file', 'save file', 'single choice', 'scrolled message', 'text entry', 'minimal'], }, {'type':'TextArea', 'name':'fldResults', 'position':(155, 5), 'size':(240, 290), }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/samples/dialogs/minimalDialog.py0000644000076500007650000000102610106741233021714 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.7 $" __date__ = "$Date: 2004/08/12 19:18:51 $" """ from PythonCard import model class MinimalDialog(model.CustomDialog): def __init__(self, parent, txt=''): model.CustomDialog.__init__(self, parent) # if some special setup is necessary, do it here self.components.field1.text = txt def minimalDialog(parent, txt): dlg = MinimalDialog(parent, txt) result = dlg.showModal() result.text = dlg.components.field1.text dlg.destroy() return result PythonCard-0.8.2/samples/dialogs/minimalDialog.rsrc.py0000644000076500007650000000075607450756545022721 0ustar alexalex00000000000000{'type':'CustomDialog', 'name':'Minimal', 'title':'Minimal dialog', 'size':(200, 100), 'components': [ { 'type':'TextField', 'name':'field1', 'position':(0, 0), 'text':'Hello PythonCard' }, {'type':'Button', 'name':'btnOK', 'position':(10, 35), 'label':'OK', 'id':5100, 'default':1, }, {'type':'Button', 'name':'btnCancel', 'position':(100, 35), 'label':'Cancel', 'id':5101, }, ] # end components } # end CustomDialog PythonCard-0.8.2/samples/dialogs/readme.txt0000644000076500007650000000060207450262412020576 0ustar alexalex00000000000000dialogs shows off all the native dialogs currently supported by PythonCard. If you need to use a FileDialog, MessageDialog, etc. you should refer to this sample and copy the code for the dialog you want to use. dialogs also shows off a minimal user-defined dialog named minimalDialog.py You can copy minimalDialog.py and minimalDialog.rsrc.py as the basis for your own custom dialogs. PythonCard-0.8.2/samples/doodle/0000755000076500007650000000000010434046771016432 5ustar alexalex00000000000000PythonCard-0.8.2/samples/doodle/doodle.py0000644000076500007650000000602510347526322020253 0ustar alexalex00000000000000#!/usr/bin/python """ A simple bitmap drawing test. Select a color using the Color button. Click and drag the mouse to draw on the canvas. """ __version__ = "$Revision: 1.28 $" __date__ = "$Date: 2005/12/13 11:13:22 $" from PythonCard import clipboard, dialog, graphic, model import wx import os class Doodle(model.Background): def on_initialize(self, event): self.x = 0 self.y = 0 self.filename = None sizer1 = wx.BoxSizer(wx.VERTICAL) comp = self.components flags = wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.ALIGN_BOTTOM # Mac wxButton needs 7 pixels on bottom and right macPadding = 7 sizer1.Add(comp.btnColor, 0, flags, macPadding) sizer1.Add(comp.bufOff, 1, wx.EXPAND) sizer1.Fit(self) sizer1.SetSizeHints(self) self.panel.SetSizer(sizer1) self.panel.SetAutoLayout(1) self.panel.Layout() def on_bufOff_mouseEnter(self, event): self.x, self.y = event.position def on_bufOff_mouseDown(self, event): self.x, self.y = event.position event.target.drawLine((self.x, self.y), (self.x + 1, self.y + 1)) def on_bufOff_mouseDrag(self, event): x, y = event.position event.target.drawLine((self.x, self.y), (x, y)) self.x = x self.y = y def on_btnColor_mouseClick(self, event): result = dialog.colorDialog(self) if result.accepted: self.components.bufOff.foregroundColor = result.color event.target.backgroundColor = result.color def openFile(self): result = dialog.openFileDialog(None, "Import which file?") if result.accepted: path = result.paths[0] os.chdir(os.path.dirname(path)) self.filename = path bmp = graphic.Bitmap(self.filename) self.components.bufOff.drawBitmap(bmp, (0, 0)) def on_menuFileOpen_select(self, event): self.openFile() def on_menuFileSaveAs_select(self, event): if self.filename is None: path = '' filename = '' else: path, filename = os.path.split(self.filename) result = dialog.saveFileDialog(None, "Save As", path, filename) if result.accepted: path = result.paths[0] fileType = graphic.bitmapType(path) print fileType, path try: bmp = self.components.bufOff.getBitmap() bmp.SaveFile(path, fileType) return 1 except IOError: return 0 else: return 0 def on_menuEditCopy_select(self, event): clipboard.setClipboard(self.components.bufOff.getBitmap()) def on_menuEditPaste_select(self, event): bmp = clipboard.getClipboard() if isinstance(bmp, wx.Bitmap): self.components.bufOff.drawBitmap(bmp) def on_editClear_command(self, event): self.components.bufOff.clear() if __name__ == '__main__': app = model.Application(Doodle) app.MainLoop() PythonCard-0.8.2/samples/doodle/doodle.rsrc.py0000644000076500007650000000341110047606317021217 0ustar alexalex00000000000000 { 'application':{ 'type':'Application', 'name':'Doodle', 'backgrounds': [ { 'type':'Background', 'name':'bgDoodle', 'title':'Doodle PythonCard Application', 'size':( 310, 300 ), 'style':['resizeable'], 'menubar': { 'type':'MenuBar', 'menus': [ { 'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ { 'type':'MenuItem', 'name':'menuFileOpen', 'label':'&Open...\tCtrl+O' }, { 'type':'MenuItem', 'name':'menuFileSaveAs', 'label':'Save &As...' }, { 'type':'MenuItem', 'name':'fileSep1', 'label':'-' }, { 'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit' } ] }, { 'type':'Menu', 'name':'menuEdit', 'label':'&Edit', 'items': [ { 'type':'MenuItem', 'name':'menuEditCopy', 'label':'&Copy\tCtrl+C'}, { 'type':'MenuItem', 'name':'menuEditPaste', 'label':'&Paste\tCtrl+V'}, { 'type':'MenuItem', 'name':'editSep1', 'label':'-' }, { 'type':'MenuItem', 'name':'menuEditClear', 'label':'&Clear', 'command':'editClear'} ] } ] }, 'components': [ { 'type':'Button', 'name':'btnColor', 'position':(0, 0), 'label':'Color' }, { 'type':'BitmapCanvas', 'name':'bufOff', 'position':(0, 30), 'size':(300, 230) }, ] } ] } } PythonCard-0.8.2/samples/doodle/readme.txt0000644000076500007650000000107207437600743020434 0ustar alexalex00000000000000A simple bitmap drawing test. Select a color using the Color button. Click and drag the mouse to draw on the canvas. 2002-02-28 Added simple Copy and Paste that uses the entire bitmap image. Added Open and Save As so an image can be imported into the current bitmap and saved to disk in a variety of supported formats: BMP, GIF, JPG/JPEG, PCX, PNG, PNM, TIF/TIFF, XBM, and XPM. Not all formats are supported on every platform and saving as GIF results in a zero length image. I just started experimenting in order to expand doodle into a more elaborate paint program. PythonCard-0.8.2/samples/financial/0000755000076500007650000000000010434046771017110 5ustar alexalex00000000000000PythonCard-0.8.2/samples/financial/mortgage.py0000644000076500007650000000236610347526322021274 0ustar alexalex00000000000000#!/usr/bin/python """ A mortgage repayment calculator. Used in the presentation at VanPy 2005 and PyCon 2005. Subsequently borrowed for the presentation at OSDC 2005 """ __version__ = "$Revision: 1.2 $" __date__ = "$Date: 2005/12/13 11:13:22 $" from PythonCard import dialog, model import pyfi class MyBackground(model.Background) def on_initialize(self, event): # if you have any initialization # including sizer setup, do it here self.on_Calculate_mouseClick(None) def on_Calculate_mouseClick(self, event): comp = self.components try: principal = float(comp.Principal.text) interestRate = float(comp.InterestRate.text) if interestRate > 1: interestRate = interestRate / 100.0 payment15 = pyfi.amortization(principal, interestRate, 12, 15 * 12) payment30 = pyfi.amortization(principal, interestRate, 12, 30 * 12) comp.Result.text = "15 year monthly payment: %.2f\n30 year monthly payment: %.2f" % (payment15, payment30) except ValueError: dialog.alertDialog(self, 'Please enter valid values', 'Input Value(s) Error') if __name__ == '__main__': app = model.Application(MyBackground) app.MainLoop() PythonCard-0.8.2/samples/financial/mortgage.rsrc.py0000644000076500007650000000225510130317153022227 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'Template', 'backgrounds': [ {'type':'Background', 'name':'bgTemplate', 'title':'Mortgage Calculator', 'size':(400, 300), 'style':['resizeable'], 'menubar': {'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ {'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit', 'command':'exit', }, ] }, ] }, 'components': [ {'type':'StaticText', 'name':'Result', 'position':(115, 150), 'size':(65, -1), }, {'type':'Button', 'name':'Calculate', 'position':(115, 105), 'label':'Calculate', }, {'type':'TextField', 'name':'Principal', 'position':(115, 10), 'size':(70, -1), 'text':'100000', }, {'type':'TextField', 'name':'InterestRate', 'position':(115, 35), 'size':(35, -1), 'text':'7.5', }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/samples/financial/pyfi.py0000644000076500007650000000763010077261353020435 0ustar alexalex00000000000000#!/usr/bin/python """A finance library for Python. All interest rates are to be expressed in decimal notation (i.e. 0.0825 instead of 8.25) This library has been placed in the public domain. Version history: 1.0 - 2001-01 - Initial program - Rupert Scammell 2.0 - 2001-03 - Additions and revisions by Louis Luangkesorn (compound interest present value, equivalent value of an annuity) 2.1 - 2004-01 - Readability changes by Matthew Scott """ import sys import math def simpleInterest(p, r, t): """Simple interest Returns: interest value Input values: See 'Simple interest future value' below """ i = p * r * t return i def simpleInterestFutureValue(p, r, t): """Simple interest future value Returns: future value Input values: p : principal r : Interest rate (decimal) t : Investment periods """ fv = p * (1 + r * t) return fv def compoundedInterest(fv, p): """Compounded interest Returns: Interest value Input values: fv : Future value p : Principal """ i = fv - p return i def compoundInterestFutureValue(p, r, c, n): """Compound interest future value Returns: future value Input values: p : principal r : interest rate c : number of compounding periods in a year n : (c * t) , total number of compounding periods """ fv = (p * (1 + (r / c))) ** n return fv def annualYield(r, c): """Annual yield Returns: Simple interest rate necessary to yield the same amount of dollars yielded by the annual rate r compounded c times for one year Input values: r : interest rate c : number of compounding periods in a year """ y = ((1 + (r / c)) ** c) - 1 return y def ordinaryAnnuity(pymt, p, r, c, n): """Ordinary annuity formula Returns: future value Input values: pymt : payment made during compounding period p : principal r : annual interest rate c : number of compounding periods in a year n : total number of payments """ block1 = ((1 + (r / c)) ** n) - 1 block2 = r / c fv = pymt * (block1 / block2) return fv def presentValueAnnuity(pymt, r, c, n): """Present value of an annuity Returns: Lump sum that can be deposited at the beginning of the annuity's term, at the same interest rate and with the same compounding period, that would yield the same amount as the annuity. Input values: See 'Ordinary annuity formula' above.""" ipp = r / c pval = pymt * ((1 - ((1 + ipp) ** (-n))) / ipp) return pval def equivalentAnnualCost(pval, r, c, n): """Equivalent value of an annuity Returns: Coupon amount for an annuity given the present value Input values: pval : present value of annuity r : annual interest rate c : number of compounding periods in a year n : total number of payments See 'Ordinary annuity formula' above. """ ipp = r / c pymt = pval / ((1 - ((1 + ipp) ** (-n))) / ipp) return pymt def amortization(loan, r, c, n): """Amortization Returns: The amount of money that needs to be paid at the end of each period to get rid of the total loan. Input values: loan : Total loan amount r : annual interest rate c : number of compounding periods a year n : total number of compounding periods """ ipp = r / c amt = (loan * ipp) / (1 - ((1 + ipp) ** (-n))) return amt def compoundInterestPresentValue(p, r, c, n): """Compound interest present value Returns: present value Input values: p : principal r : interest rate c : number of compounding periods in a year n : (c * t), total number of compounding periods """ pv = (p / ((1 + (r / c)) ** n)) return pv PythonCard-0.8.2/samples/financial/readme.txt0000644000076500007650000000020310077261353021077 0ustar alexalex00000000000000I'm not sure whether this will become a real sample or not. This is a holding place for some demo code I want to build at VanPy. PythonCard-0.8.2/samples/flatfileDatabase/0000755000076500007650000000000010434046771020377 5ustar alexalex00000000000000PythonCard-0.8.2/samples/flatfileDatabase/fieldsTest.rsrc.py0000644000076500007650000001412510047606320024022 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'Template', 'backgrounds': [ {'type':'Background', 'name':'bgBody', 'title':'Template Database Layout', 'size':(400, 404), 'menubar': {'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ {'type':'MenuItem', 'name':'menuFileSave', 'label':'&Save\tCtrl+S', 'command':'save', }, {'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit', }, ] }, {'type':'Menu', 'name':'Edit', 'label':'&Edit', 'items': [ {'type':'MenuItem', 'name':'menuEditUndo', 'label':'&Undo\tCtrl+Z', 'command':'editUndo', }, {'type':'MenuItem', 'name':'menuEditRedo', 'label':'&Redo\tCtrl+Y', 'command':'editRedo', }, {'type':'MenuItem', 'name':'editSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditCut', 'label':'Cu&t\tCtrl+X', 'command':'editCut', }, {'type':'MenuItem', 'name':'menuEditCopy', 'label':'&Copy\tCtrl+C', 'command':'editCopy', }, {'type':'MenuItem', 'name':'menuEditPaste', 'label':'&Paste\tCtrl+V', 'command':'editPaste', }, {'type':'MenuItem', 'name':'editSep2', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditFind', 'label':'Find...\tCtrl+F', 'command':'findRecord', }, {'type':'MenuItem', 'name':'menuEditFindNext', 'label':'Find Next\tF3', 'command':'findNextRecord', }, {'type':'MenuItem', 'name':'editSep3', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditClear', 'label':'Cle&ar\tDel', 'command':'editClear', }, {'type':'MenuItem', 'name':'menuEditSelectAll', 'label':'Select A&ll\tCtrl+A', 'command':'editSelectAll', }, {'type':'MenuItem', 'name':'editSep4', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditNewCard', 'label':'&New Card\tCtrl+N', 'command':'editNewCard', }, {'type':'MenuItem', 'name':'menuEditDeleteCard', 'label':'&Delete Card', 'command':'editDeleteCard', }, ] }, {'type':'Menu', 'name':'Go', 'label':'&Go', 'items': [ {'type':'MenuItem', 'name':'menuGoFirstCard', 'label':'&First Card\tCtrl+1', 'command':'goFirst', }, {'type':'MenuItem', 'name':'menuGoPrevCard', 'label':'&Prev Card\tCtrl+2', 'command':'goPrev', }, {'type':'MenuItem', 'name':'menuGoNextCard', 'label':'&Next Card\tCtrl+3', 'command':'goNext', }, {'type':'MenuItem', 'name':'menuGoLastCard', 'label':'&Last Card\tCtrl+4', 'command':'goLast', }, {'type':'MenuItem', 'name':'goSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuGoSort', 'label':'&Sort Cards...', 'command':'sort', }, ] }, ] }, 'components': [ {'type':'TextArea', 'name':'TextArea1', 'position':(10, 242), 'size':(182, -1), }, {'type':'TextField', 'name':'TextField1', 'position':(10, 212), }, {'type':'Spinner', 'name':'Spinner1', 'position':(125, 168), 'size':(59, 21), 'max':100, 'min':1, 'value':40, }, {'type':'Slider', 'name':'Slider1', 'position':(292, 11), 'size':(92, 20), 'layout':'horizontal', 'max':100, 'min':1, 'value':82, }, {'type':'RadioGroup', 'name':'RadioGroup1', 'position':(206, 140), 'size':(125, 70), 'items':['one', 'two', 'three'], 'label':'RadioGroup1', 'layout':'horizontal', 'max':1, 'stringSelection':'one', }, {'type':'PasswordField', 'name':'PasswordField1', 'position':(10, 164), }, {'type':'List', 'name':'List1', 'position':(206, 70), 'size':(127, -1), 'items':['one', 'two', 'three'], 'stringSelection':'one', }, {'type':'Choice', 'name':'Choice1', 'position':(208, 38), 'size':(125, 21), 'items':['one', 'two', 'three'], 'stringSelection':'one', }, {'type':'CheckBox', 'name':'CheckBox1', 'position':(207, 14), 'label':'CheckBox1', }, {'type':'Calendar', 'name':'Calendar1', 'position':(10, 10), }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/samples/flatfileDatabase/flatfileDatabase.ini0000644000076500007650000000030407463334254024314 0ustar alexalex00000000000000[ConfigData] #resourceFile = fieldsTest.rsrc.py #dataFile = fieldsTestUserdata.txt resourceFile = flatfileDatabase.rsrc.py #resourceFile = flatfileDatabaseTemplate.rsrc.py dataFile = userdata.txt PythonCard-0.8.2/samples/flatfileDatabase/flatfileDatabase.py0000644000076500007650000000217410103732721024156 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.21 $" __date__ = "$Date: 2004/08/03 15:57:05 $" flatfileDatabase was derived from the addresses sample. """ from PythonCard import flatfileDatabase, model import os, sys import ConfigParser CONFIG_FILE = 'flatfileDatabase.ini' class FlatfileDatabase(flatfileDatabase.FlatfileDatabase): def on_initialize(self, event): # override the config filename self.configFilename = CONFIG_FILE flatfileDatabase.FlatfileDatabase.on_initialize(self, event) if __name__ == '__main__': # assume the ini file is in the same directory as the script path = os.path.join(os.path.dirname(os.path.abspath(sys.argv[0])), CONFIG_FILE) parser = ConfigParser.ConfigParser() parser.read(path) # the resourceFile is settable via the ini file resourceFile = parser.get('ConfigData', 'resourceFile') # KEA 2002-07-16 # since all of the needed functionality is in the framework # classes, we don't have to subclass in this module, we can # just use the base class directly app = model.Application(FlatfileDatabase, resourceFile) app.MainLoop() PythonCard-0.8.2/samples/flatfileDatabase/flatfileDatabase.rsrc.py0000644000076500007650000002154010110215761025122 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'Addresses', 'backgrounds': [ {'type':'Background', 'name':'bgBody', 'title':'Addresses', 'size':(416, 550), 'menubar': {'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ {'type':'MenuItem', 'name':'menuFileSave', 'label':'&Save\tCtrl+S', 'command':'save', }, {'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit', }, ] }, {'type':'Menu', 'name':'Edit', 'label':'&Edit', 'items': [ {'type':'MenuItem', 'name':'menuEditUndo', 'label':'&Undo\tCtrl+Z', 'command':'editUndo', }, {'type':'MenuItem', 'name':'menuEditRedo', 'label':'&Redo\tCtrl+Y', 'command':'editRedo', }, {'type':'MenuItem', 'name':'editSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditCut', 'label':'Cu&t\tCtrl+X', 'command':'editCut', }, {'type':'MenuItem', 'name':'menuEditCopy', 'label':'&Copy\tCtrl+C', 'command':'editCopy', }, {'type':'MenuItem', 'name':'menuEditPaste', 'label':'&Paste\tCtrl+V', 'command':'editPaste', }, {'type':'MenuItem', 'name':'editSep2', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditFind', 'label':'Find...\tCtrl+F', 'command':'findRecord', }, {'type':'MenuItem', 'name':'menuEditFindNext', 'label':'Find Next\tF3', 'command':'findNextRecord', }, {'type':'MenuItem', 'name':'editSep3', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditClear', 'label':'Cle&ar\tDel', 'command':'editClear', }, {'type':'MenuItem', 'name':'menuEditSelectAll', 'label':'Select A&ll\tCtrl+A', 'command':'editSelectAll', }, {'type':'MenuItem', 'name':'editSep4', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditNewCard', 'label':'&New Card\tCtrl+N', 'command':'editNewCard', }, {'type':'MenuItem', 'name':'menuEditDeleteCard', 'label':'&Delete Card', 'command':'editDeleteCard', }, ] }, {'type':'Menu', 'name':'Go', 'label':'&Go', 'items': [ {'type':'MenuItem', 'name':'menuGoFirstCard', 'label':'&First Card\tCtrl+1', 'command':'goFirst', }, {'type':'MenuItem', 'name':'menuGoPrevCard', 'label':'&Prev Card\tCtrl+2', 'command':'goPrev', }, {'type':'MenuItem', 'name':'menuGoNextCard', 'label':'&Next Card\tCtrl+3', 'command':'goNext', }, {'type':'MenuItem', 'name':'menuGoLastCard', 'label':'&Last Card\tCtrl+4', 'command':'goLast', }, {'type':'MenuItem', 'name':'goSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuGoSort', 'label':'&Sort Cards...', 'command':'sort', }, ] }, ] }, 'components': [ {'type':'StaticBox', 'name':'StaticBox1', 'position':(285, 120), 'size':(120, 150), }, {'type':'TextField', 'name':'Name', 'position':(100, 10), 'size':(241, 24), }, {'type':'TextField', 'name':'Company', 'position':(100, 40), 'size':(241, 23), }, {'type':'TextField', 'name':'Street', 'position':(100, 70), 'size':(241, 23), }, {'type':'TextField', 'name':'City', 'position':(100, 100), 'size':(171, 23), }, {'type':'TextField', 'name':'State', 'position':(100, 130), 'size':(39, 23), }, {'type':'TextField', 'name':'Zip', 'position':(100, 160), 'size':(85, 23), }, {'type':'TextField', 'name':'Phone1', 'position':(100, 190), 'size':(169, -1), }, {'type':'TextField', 'name':'Phone2', 'position':(100, 220), 'size':(169, -1), }, {'type':'TextField', 'name':'Phone3', 'position':(100, 250), 'size':(169, -1), }, {'type':'TextField', 'name':'Phone4', 'position':(100, 280), 'size':(169, -1), }, {'type':'TextField', 'name':'Email', 'position':(100, 310), 'size':(300, -1), }, {'type':'TextField', 'name':'Web', 'position':(100, 340), 'size':(300, -1), }, {'type':'TextArea', 'name':'Notes', 'position':(100, 370), 'size':(300, 135), }, {'type':'StaticText', 'name':'NameLabel', 'position':(5, 15), 'size':(68, -1), 'alignment':'right', 'text':'Name', }, {'type':'StaticText', 'name':'CompanyLabel', 'position':(5, 45), 'size':(68, -1), 'alignment':'right', 'text':'Company', }, {'type':'StaticText', 'name':'StreetLabel', 'position':(5, 80), 'size':(68, -1), 'alignment':'right', 'text':'Street', }, {'type':'StaticText', 'name':'CityLabel', 'position':(5, 105), 'size':(68, -1), 'alignment':'right', 'text':'City', }, {'type':'StaticText', 'name':'StateLabel', 'position':(5, 135), 'size':(68, -1), 'alignment':'right', 'text':'State', }, {'type':'StaticText', 'name':'ZipCodeLabel', 'position':(5, 165), 'size':(68, -1), 'alignment':'right', 'text':'Zip Code', }, {'type':'StaticText', 'name':'TelephoneLabel', 'position':(5, 195), 'size':(68, -1), 'alignment':'right', 'text':'Telephone', }, {'type':'StaticText', 'name':'EmailLabel', 'position':(5, 315), 'size':(68, -1), 'alignment':'right', 'text':'Email', }, {'type':'StaticText', 'name':'WebLabel', 'position':(5, 345), 'size':(68, -1), 'alignment':'right', 'text':'Web', }, {'type':'StaticText', 'name':'NotesLabel', 'position':(5, 375), 'size':(68, -1), 'alignment':'right', 'text':'Notes', }, {'type':'Button', 'name':'NewCard', 'position':(293, 208), 'size':(100, -1), 'command':'editNewCard', 'label':'New Card', }, {'type':'Button', 'name':'DeleteCard', 'position':(293, 238), 'size':(100, -1), 'command':'editDeleteCard', 'label':'Delete Card', }, {'type':'Button', 'name':'Find', 'position':(293, 178), 'size':(100, -1), 'command':'findRecord', 'label':'Find', }, {'type':'ImageButton', 'name':'Prev', 'position':(309, 136), 'size':(26, 30), 'border':'transparent', 'command':'goPrev', 'file':'prev.gif', }, {'type':'ImageButton', 'name':'Next', 'position':(349, 137), 'size':(25, 30), 'border':'transparent', 'command':'goNext', 'file':'next.gif', }, {'type':'TextField', 'name':'Sortorder', 'position':(0, -5), 'size':(30, 19), 'text':'1', 'visible':False, }, {'type':'TextField', 'name':'NameOrder', 'position':(141, -5), 'size':(73, 19), 'text':'last word', 'visible':False, }, {'type':'TextField', 'name':'CorrectName', 'position':(100, -5), 'size':(241, 24), 'visible':False, }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/samples/flatfileDatabase/flatfileDatabaseTemplate.rsrc.py0000644000076500007650000001137710047606326026637 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'Template', 'backgrounds': [ {'type':'Background', 'name':'bgBody', 'title':'Template Database Layout', 'size':(400, 300), 'menubar': {'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ {'type':'MenuItem', 'name':'menuFileSave', 'label':'&Save\tCtrl+S', 'command':'save', }, {'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit', }, ] }, {'type':'Menu', 'name':'Edit', 'label':'&Edit', 'items': [ {'type':'MenuItem', 'name':'menuEditUndo', 'label':'&Undo\tCtrl+Z', 'command':'editUndo', }, {'type':'MenuItem', 'name':'menuEditRedo', 'label':'&Redo\tCtrl+Y', 'command':'editRedo', }, {'type':'MenuItem', 'name':'editSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditCut', 'label':'Cu&t\tCtrl+X', 'command':'editCut', }, {'type':'MenuItem', 'name':'menuEditCopy', 'label':'&Copy\tCtrl+C', 'command':'editCopy', }, {'type':'MenuItem', 'name':'menuEditPaste', 'label':'&Paste\tCtrl+V', 'command':'editPaste', }, {'type':'MenuItem', 'name':'editSep2', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditFind', 'label':'Find...\tCtrl+F', 'command':'findRecord', }, {'type':'MenuItem', 'name':'menuEditFindNext', 'label':'Find Next\tF3', 'command':'findNextRecord', }, {'type':'MenuItem', 'name':'editSep3', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditClear', 'label':'Cle&ar\tDel', 'command':'editClear', }, {'type':'MenuItem', 'name':'menuEditSelectAll', 'label':'Select A&ll\tCtrl+A', 'command':'editSelectAll', }, {'type':'MenuItem', 'name':'editSep4', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditNewCard', 'label':'&New Card\tCtrl+N', 'command':'editNewCard', }, {'type':'MenuItem', 'name':'menuEditDeleteCard', 'label':'&Delete Card', 'command':'editDeleteCard', }, ] }, {'type':'Menu', 'name':'Go', 'label':'&Go', 'items': [ {'type':'MenuItem', 'name':'menuGoFirstCard', 'label':'&First Card\tCtrl+1', 'command':'goFirst', }, {'type':'MenuItem', 'name':'menuGoPrevCard', 'label':'&Prev Card\tCtrl+2', 'command':'goPrev', }, {'type':'MenuItem', 'name':'menuGoNextCard', 'label':'&Next Card\tCtrl+3', 'command':'goNext', }, {'type':'MenuItem', 'name':'menuGoLastCard', 'label':'&Last Card\tCtrl+4', 'command':'goLast', }, {'type':'MenuItem', 'name':'goSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuGoSort', 'label':'&Sort Cards...', 'command':'sort', }, ] }, ] }, 'components': [ ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/samples/flatfileDatabase/next.gif0000644000076500007650000000041607461054106022042 0ustar alexalex00000000000000GIF89aÄÿÿÿÚÚÚÓÓÓÌÌÌÄÄÄ»»»²²²©©©£££›››’’’ŒŒŒ„„„{{{rrrlllcccYYYFFF===555)))ÿÿÿ!ù,‹ &Ždižhª®lë¾p,Ï£eѨ]á¦uQ;^­B Æ.Èäe"¡XŒ¯‰Ò2‰@"“g,+‘D¬pDB„M*‘°Z iR¢èµÜÑ`0\ç´<Ü@Q a €Q  † Q›› ˜B ¢£¡™B ¬­°£³´µ¶·¸¹!;PythonCard-0.8.2/samples/flatfileDatabase/prev.gif0000644000076500007650000000041707461054106022041 0ustar alexalex00000000000000GIF89aÄÿÿÿÚÚÚÓÓÓÌÌÌÄÄÄ»»»²²²©©©£££›››’’’ŒŒŒ„„„{{{rrrlllcccYYYFFF===555)))ÿÿÿ!ù,Œ &Ždižhª®lë¾p,ÏôkYµYÝ9YQ\S)î†;Šdri:/±Ý$‰L,Ï ¬(‰<¾ÕˆDbѺ(JÈw½ŽTÌ,£á`ÛÝp–¢€hØÛo0  u y-  ‰ 2‘ ~¡¡.‘ C"ª« ®«±²µ¶·¸¹/!;PythonCard-0.8.2/samples/flatfileDatabase/readme.txt0000644000076500007650000000213407461054106022372 0ustar alexalex00000000000000flatfileDatabase implements persistant storage, transparent loading and saving of the data to a separate text file. The limitation on data size is that all data is read into memory when the application starts up and is written to disk when the application exits. This is not a robust storage solution, so by default a backup of the data file is made prior to writing the new file. [KEA not implemented yet 2002-04-22]. Obviously, there will be startup and shutdown delays with the app if you have a large set of data; large is relative ;-) If the app crashes for some reason before making a clean exit (this is extremely unlikely) then whatever changes were made since the last save will be lost. I went ahead and added a File->Save menu item so that the user could force a data save while they're using the app. The flatfile, textIndexer, and addresses sample provide the start of a generic transparent data storage model for PythonCard that will eventually be available to all PythonCard apps that want to use it. Patrick O'Brien's addressesZODB sample explores the same issues using ZODB as the storage format. PythonCard-0.8.2/samples/floatCanvasTest/0000755000076500007650000000000010434046771020265 5ustar alexalex00000000000000PythonCard-0.8.2/samples/floatCanvasTest/floatCanvasTest.py0000644000076500007650000001167610121700632023735 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.1 $" __date__ = "$Date: 2004/09/14 23:41:14 $" """ """ try: import Numeric import random import RandomArray haveNumeric = True except ImportError: haveNumeric = False """ import os import wx from PythonCard import model class Doodle(model.Background): def on_initialize(self, event): self.singleItemExpandingSizerLayout() ## getting all the colors and linestyles for random objects # don't need this since PythonCard has already called it #wx.lib.colourdb.updateColourDB() self.colors = wx.lib.colourdb.getColourList() self.DrawTest() def DrawTest(self,event=None): wx.GetApp().Yield() import random import RandomArray Range = (-10,10) colors = self.colors #self.BindAllMouseEvents() Canvas = self.components.float Canvas.ClearAll() Canvas.SetProjectionFun(None) ## Random tests of everything: # Rectangles for i in range(3): x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1])) lw = random.randint(1,5) cf = random.randint(0,len(colors)-1) h = random.randint(1,5) w = random.randint(1,5) Canvas.AddRectangle(x,y,h,w,LineWidth = lw,FillColor = colors[cf]) # Ellipses for i in range(3): x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1])) lw = random.randint(1,5) cf = random.randint(0,len(colors)-1) h = random.randint(1,5) w = random.randint(1,5) Canvas.AddEllipse(x,y,h,w,LineWidth = lw,FillColor = colors[cf]) ## # Dots -- Does anyone need this? ## for i in range(5): ## x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1])) ## D = random.randint(1,50) ## lw = random.randint(1,5) ## cf = random.randint(0,len(colors)-1) ## cl = random.randint(0,len(colors)-1) ## Canvas.AddDot(x,y,D,LineWidth = lw,LineColor = colors[cl],FillColor = colors[cf]) # Circles for i in range(5): x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1])) D = random.randint(1,5) lw = random.randint(1,5) cf = random.randint(0,len(colors)-1) cl = random.randint(0,len(colors)-1) Canvas.AddCircle(x,y,D,LineWidth = lw,LineColor = colors[cl],FillColor = colors[cf]) Canvas.AddText("Circle # %i"%(i),x,y,Size = 12,BackgroundColor = None,Position = "cc") # Lines for i in range(5): points = [] for j in range(random.randint(2,10)): point = (random.randint(Range[0],Range[1]),random.randint(Range[0],Range[1])) points.append(point) lw = random.randint(1,10) cf = random.randint(0,len(colors)-1) cl = random.randint(0,len(colors)-1) Canvas.AddLine(points, LineWidth = lw, LineColor = colors[cl]) # Polygons for i in range(3): points = [] for j in range(random.randint(2,6)): point = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1])) points.append(point) lw = random.randint(1,6) cf = random.randint(0,len(colors)-1) cl = random.randint(0,len(colors)-1) Canvas.AddPolygon(points, LineWidth = lw, LineColor = colors[cl], FillColor = colors[cf], FillStyle = 'Solid') ## Pointset for i in range(4): points = [] points = RandomArray.uniform(Range[0],Range[1],(100,2)) cf = random.randint(0,len(colors)-1) D = random.randint(1,4) Canvas.AddPointSet(points, Color = colors[cf], Diameter = D) # Text String = "Unscaled text" for i in range(3): ts = random.randint(10,40) cf = random.randint(0,len(colors)-1) x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1])) Canvas.AddText(String, x, y, Size = ts, Color = colors[cf], Position = "cc") # Scaled Text String = "Scaled text" for i in range(3): ts = random.random()*3 + 0.2 cf = random.randint(0,len(colors)-1) x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1])) Canvas.AddScaledText(String, x, y, Size = ts, Color = colors[cf], Position = "cc") Canvas.ZoomToBB() if __name__ == '__main__': app = model.Application(Doodle) app.MainLoop() PythonCard-0.8.2/samples/floatCanvasTest/floatCanvasTest.rsrc.py0000644000076500007650000000324510121702265024702 0ustar alexalex00000000000000 { 'application':{ 'type':'Application', 'name':'Doodle', 'backgrounds': [ { 'type':'Background', 'name':'bgDoodle', 'title':'Doodle PythonCard Application', 'size':( 610, 600 ), 'style':['resizeable'], 'menubar': { 'type':'MenuBar', 'menus': [ { 'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ { 'type':'MenuItem', 'name':'menuFileOpen', 'label':'&Open...\tCtrl+O' }, { 'type':'MenuItem', 'name':'menuFileSaveAs', 'label':'Save &As...' }, { 'type':'MenuItem', 'name':'fileSep1', 'label':'-' }, { 'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit' } ] }, { 'type':'Menu', 'name':'menuEdit', 'label':'&Edit', 'items': [ { 'type':'MenuItem', 'name':'menuEditCopy', 'label':'&Copy\tCtrl+C'}, { 'type':'MenuItem', 'name':'menuEditPaste', 'label':'&Paste\tCtrl+V'}, { 'type':'MenuItem', 'name':'editSep1', 'label':'-' }, { 'type':'MenuItem', 'name':'menuEditClear', 'label':'&Clear', 'command':'editClear'} ] } ] }, 'components': [ { 'type':'FloatCanvas', 'name':'float', 'position':(0, 30), 'size':(600, 600) }, ] } ] } } PythonCard-0.8.2/samples/flock/0000755000076500007650000000000010434046771016262 5ustar alexalex00000000000000PythonCard-0.8.2/samples/flock/flock.py0000644000076500007650000002041610347672110017730 0ustar alexalex00000000000000#!/usr/bin/python """ Builds on the "gravity" sample to show a simple animation of "boids"; shows simple emergent behaviour for a 2-D flock of "boids". This sample uses two images to animate the movement of bird-like objects. """ __version__ = "$Revision: 1.4 $" __date__ = "$Date: 2005/12/14 01:24:24 $" # KEA 2004-09-25 # based on the excellent work by Keith Peters # http://www.bit-101.com/tutorials/gravity.html # AGT 2004-10-05 # Based on Kevin's imagegravity sample - simple 2-D boids from __future__ import division try: import psyco psyco.full() except ImportError: pass import os import wx import random from PythonCard import clipboard, dialog, graphic, model, util, timer # helper functions def pointInRect(xy, rect): x, y = xy left, top, right, bottom = rect if x >= left and x <= right and y >= top and y <= bottom: return True else: return False visible_radius = 1000 max_neighbours = 40 def randomColor(): return (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)) def find_nearest(this, allsprites): nearest = [] for s in allsprites: if s == this: continue if s.x < this.x-visible_radius: continue if s.x > this.x+visible_radius: continue dist = abs(s.x-this.x)+abs(s.y-this.y) if dist > visible_radius: continue nearest.append( (dist, s.x, s.y, s.xspeed, s.yspeed) ) if len(nearest) == 0: return nearest nearest.sort() del nearest[max_neighbours:] return nearest def centre_of_mass(this, allsprites, nearest): x,y = 0,0 if len(nearest) == 0: return 0,0 for nbr in nearest: x += nbr[1] y += nbr[2] num = len(nearest) return (x/num - this.x)*0.01, (y/num - this.y)* 0.01 def not_too_close(this, allsprites, nearest): x,y = 0, 0 for nbr in nearest: if nbr[0] < 16: x += this.x - nbr[1] y += this.y - nbr[2] return x,y def align_with(this, allsprites, nearest): x,y = 0,0 for nbr in nearest: x += nbr[3] y += nbr[4] num = len(nearest) return 0.125 * x/num, 0.125 * y/num class Sprite(object): def __init__(self, parent): self.parent = parent class BoidSprite(Sprite): def __init__(self, parent, name, x, y, radius, color='red'): Sprite.__init__(self, parent) self.name = name self.name2 = name+"-2" self.x = x self.y = y self.oldx = x self.oldy = y self.radius = radius self.color = color self.xspeed = random.random() * 30 self.yspeed = random.random() * 30 self.gravity = 2 self.drag = .85 self.bounce = .9 self.dragging = False self.canvas = self.parent.components.bufOff ## self.canvas = self.parent.panel x, y = self.canvas.position ## self.parent.components[name] = {'type':'Image', 'name':name, 'file':'wing1.png', 'position':(self.x + x, self.y + y)} ## self.image = self.parent.components[name] ## self.image.visible = True ## self.parent.components[self.name2] = {'type':'Image', 'name':self.name2, 'file':'wing2.png', 'position':(self.x + x, self.y + y)} ## self.image2 = self.parent.components[self.name2] ## self.image.visible = False self.image = graphic.Bitmap('wing1.png') self.image2 = graphic.Bitmap('wing2.png') self.count = 0 def move(self): # this is sort of pointless right now # but maybe the dragging code could be moved # into the class in which case we might need # to know if we're dragging if not self.dragging: nearest = find_nearest(self, self.parent.sprites) x1, y1 = self.xspeed * self.drag, self.yspeed * self.drag if len(nearest) > 0: x2, y2 = centre_of_mass(self, self.parent.sprites, nearest) x3, y3 = not_too_close(self, self.parent.sprites, nearest) x4, y4 = align_with(self, self.parent.sprites, nearest) x1 += x2+x3+x4 y1 += y2+y3+y4 self.xspeed, self.yspeed = x1, y1 #rint self.name, (x1,y1), (x2, y2), (self.xspeed, self.yspeed) self.x += self.xspeed self.y += self.yspeed rightedge, bottomedge = self.canvas.size # bounce when we hit the edge if (self.x - self.radius) < 0: self.x = self.radius self.xspeed = -self.xspeed * self.bounce elif (self.x + self.radius) > rightedge: self.x = rightedge - self.radius self.xspeed = -self.xspeed * self.bounce if (self.y - self.radius) < 0: self.y = self.radius self.yspeed = -self.yspeed * self.bounce elif (self.y + self.radius) > bottomedge: self.y = bottomedge - self.radius self.yspeed = -self.yspeed * self.bounce ## self.xspeed = self.xspeed * self.drag ## self.yspeed = self.yspeed * self.drag + self.gravity else: self.xspeed = self.x - self.oldx self.yspeed = self.y - self.oldy self.oldx = self.x self.oldy = self.y self.draw() def draw(self): self.count += 1 if self.count == 5: self.count = 0 self.canvas.drawBitmap(self.image, (self.x, self.y)) else: self.canvas.drawBitmap(self.image2, (self.x, self.y)) def draw2(self): self.image.position = (self.x, self.y) self.image2.position = (self.x, self.y) self.count += 1 if self.count == 5: self.count = 0 self.image.visible = not self.image.visible self.image2.visible = not self.image2.visible class Boids(model.Background): def on_initialize(self, event): self.x = 0 self.y = 0 self.animate = False self.filename = None # leave it black for now #self.components.bufOff.foregroundColor = self.color self.sprites = [] self.timer = timer.Timer(self.components.btnAnimate, -1) self.initSizers() self.components.bufOff.autoRefresh = False def initSizers(self): sizer1 = wx.BoxSizer(wx.VERTICAL) sizer2 = wx.BoxSizer(wx.HORIZONTAL) comp = self.components flags = wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.ALIGN_BOTTOM # Mac wxButton needs 7 pixels on bottom and right macPadding = 7 sizer2.Add(comp.btnNewBoid, 0, flags, macPadding) sizer2.Add(comp.btnAnimate, 0, flags, macPadding) sizer2.Add(comp.btnStop, 0, flags, macPadding) sizer1.Add(sizer2, 0) sizer1.Add(comp.bufOff, 1, wx.EXPAND) sizer1.Fit(self) sizer1.SetSizeHints(self) self.panel.SetSizer(sizer1) self.panel.SetAutoLayout(1) self.panel.Layout() def on_btnNewBoid_mouseClick(self, event): name = 'boid' + str(len(self.sprites)) self.sprites.append(BoidSprite(self, name, 20, 20, 15, randomColor())) if not self.animate: for b in self.sprites: b.draw() self.components.bufOff.refresh() def on_btnAnimate_mouseClick(self, event): event.target.enabled = False self.animate = True self.frame = 0 self.startTime = util.time() self.fps = 10 timePerFrame = 1000 / self.fps self.timer.start(timePerFrame) def on_btnAnimate_timer(self, event): self.components.bufOff.clear() for b in self.sprites: b.move() # don't need to use redraw() on Mac because # we are using a timer and giving the screen # a chance to update it itself normally self.components.bufOff.refresh() self.frame += 1 self.seconds = util.time() self.statusBar.text = "Average FPS: %.4f Boids: %d" % (self.frame / (self.seconds - self.startTime), len(self.sprites)) def on_btnStop_mouseClick(self, event): self.animate = False self.components.btnAnimate.enabled = True self.timer.stop() def on_close(self, event): self.animate = False event.skip() if __name__ == '__main__': app = model.Application(Boids) app.MainLoop() PythonCard-0.8.2/samples/flock/flock.rsrc.py0000644000076500007650000000377610311356762020715 0ustar alexalex00000000000000 { 'application':{ 'type':'Application', 'name':'Flock', 'backgrounds': [ { 'type':'Background', 'name':'bgFlock', 'title':'Flock PythonCard Application', 'size':( 310, 300 ), 'style':['resizeable'], 'statusBar':1, 'menubar': { 'type':'MenuBar', 'menus': [ { 'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ { 'type':'MenuItem', 'name':'menuFileOpen', 'label':'&Open...\tCtrl+O' }, { 'type':'MenuItem', 'name':'menuFileSaveAs', 'label':'Save &As...' }, { 'type':'MenuItem', 'name':'fileSep1', 'label':'-' }, { 'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit' } ] }, { 'type':'Menu', 'name':'menuEdit', 'label':'&Edit', 'items': [ { 'type':'MenuItem', 'name':'menuEditCopy', 'label':'&Copy\tCtrl+C'}, { 'type':'MenuItem', 'name':'menuEditPaste', 'label':'&Paste\tCtrl+V'}, { 'type':'MenuItem', 'name':'editSep1', 'label':'-' }, { 'type':'MenuItem', 'name':'menuEditClear', 'label':'&Clear', 'command':'editClear'} ] } ] }, 'components': [ { 'type':'Button', 'name':'btnNewBoid', 'position':(5, 5), 'label':'New Boid' }, { 'type':'Button', 'name':'btnAnimate', 'position':(100, 5), 'label':'Animate' }, { 'type':'Button', 'name':'btnStop', 'position':(200, 5), 'label':'Stop' }, { 'type':'BitmapCanvas', 'name':'bufOff', 'position':(0, 30), 'visible':True, 'size':(300, 230) }, ] } ] } } PythonCard-0.8.2/samples/flock/readme.txt0000644000076500007650000000031410347526323020255 0ustar alexalex00000000000000Builds on the "gravity" sample to show a simple animation of "boids"; shows simple emergent behaviour for a 2-D flock of "boids". This sampe uses two images to animate the movement of bird-like objects. PythonCard-0.8.2/samples/flock/wing1.png0000644000076500007650000000040010132364152017776 0ustar alexalex00000000000000‰PNG  IHDR(-SgAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe< PLTEåÌÌÿÿÿÕȬñtRNSÿÿ×Ê AnIDATxÚb`BÄ€.@„!@„!@`FLH€, ¡ˆÄ`bDPÄbU3@)&€‚0€L(Å@ 0a4@aX @„!@úâÑÏú1¿IEND®B`‚PythonCard-0.8.2/samples/flock/wing2.png0000644000076500007650000000045110132364152020005 0ustar alexalex00000000000000‰PNG  IHDR(-SgAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<PLTEõõõðððòòòíííûûûøøøÌÌÌÿÿÿš”k tRNSÿÿÿÿÿÿÿÿÿ²Ì,Ï{IDATxÚbàDÄ€.@„!@ÄÀÊç N TÌ  ¨P €@f°qr°sÂÔP€I5''@1p2B•³3ÄÀ ÓϦ™Ã„!@„!`¨@µb3IEND®B`‚PythonCard-0.8.2/samples/gadflyDatabase/0000755000076500007650000000000010434046771020057 5ustar alexalex00000000000000PythonCard-0.8.2/samples/gadflyDatabase/gadflyDatabase.ini0000644000076500007650000000036507601371356023461 0ustar alexalex00000000000000[ConfigData] #resourceFile = fieldsTest.rsrc.py #dataFile = fieldsTestUserdata.txt resourceFile = gadflyDatabase.rsrc.py #resourceFile = flatfileDatabaseTemplate.rsrc.py #dataFile = userdata.txt dbDir = . dbName = gadflyDb tableName = addresses PythonCard-0.8.2/samples/gadflyDatabase/gadflyDatabase.py0000755000076500007650000000225010103732730023314 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.4 $" __date__ = "$Date: 2004/08/03 15:57:12 $" flatfileDatabase was derived from the addresses sample. gadflyDatabase was derived from the flatfileDatabase sample. """ from PythonCard import gadflyDatabase, model import os, sys import ConfigParser CONFIG_FILE = 'gadflyDatabase.ini' class GadflyDatabase(gadflyDatabase.GadflyDatabase): def on_initialize(self, event): # override the config filename self.configFilename = CONFIG_FILE gadflyDatabase.GadflyDatabase.on_initialize(self, event) if __name__ == '__main__': # assume the ini file is in the same directory as the script path = os.path.join(os.path.dirname(os.path.abspath(sys.argv[0])), CONFIG_FILE) parser = ConfigParser.ConfigParser() parser.read(path) # the resourceFile is settable via the ini file resourceFile = parser.get('ConfigData', 'resourceFile') # KEA 2002-07-16 # since all of the needed functionality is in the framework # classes, we don't have to subclass in this module, we can # just use the base class directly app = model.Application(GadflyDatabase, resourceFile) app.MainLoop() PythonCard-0.8.2/samples/gadflyDatabase/gadflyDatabase.rsrc.py0000644000076500007650000002152010047606327024273 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'Addresses', 'backgrounds': [ {'type':'Background', 'name':'bgBody', 'title':'Addresses', 'size':(416, 504), 'menubar': {'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ {'type':'MenuItem', 'name':'menuFileSave', 'label':'&Save\tCtrl+S', 'command':'save', }, {'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit', }, ] }, {'type':'Menu', 'name':'Edit', 'label':'&Edit', 'items': [ {'type':'MenuItem', 'name':'menuEditUndo', 'label':'&Undo\tCtrl+Z', 'command':'editUndo', }, {'type':'MenuItem', 'name':'menuEditRedo', 'label':'&Redo\tCtrl+Y', 'command':'editRedo', }, {'type':'MenuItem', 'name':'editSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditCut', 'label':'Cu&t\tCtrl+X', 'command':'editCut', }, {'type':'MenuItem', 'name':'menuEditCopy', 'label':'&Copy\tCtrl+C', 'command':'editCopy', }, {'type':'MenuItem', 'name':'menuEditPaste', 'label':'&Paste\tCtrl+V', 'command':'editPaste', }, {'type':'MenuItem', 'name':'editSep2', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditFind', 'label':'Find...\tCtrl+F', 'command':'findRecord', }, {'type':'MenuItem', 'name':'menuEditFindNext', 'label':'Find Next\tF3', 'command':'findNextRecord', }, {'type':'MenuItem', 'name':'editSep3', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditClear', 'label':'Cle&ar\tDel', 'command':'editClear', }, {'type':'MenuItem', 'name':'menuEditSelectAll', 'label':'Select A&ll\tCtrl+A', 'command':'editSelectAll', }, {'type':'MenuItem', 'name':'editSep4', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditNewCard', 'label':'&New Card\tCtrl+N', 'command':'editNewCard', }, {'type':'MenuItem', 'name':'menuEditDeleteCard', 'label':'&Delete Card', 'command':'editDeleteCard', }, ] }, {'type':'Menu', 'name':'Go', 'label':'&Go', 'items': [ {'type':'MenuItem', 'name':'menuGoFirstCard', 'label':'&First Card\tCtrl+1', 'command':'goFirst', }, {'type':'MenuItem', 'name':'menuGoPrevCard', 'label':'&Prev Card\tCtrl+2', 'command':'goPrev', }, {'type':'MenuItem', 'name':'menuGoNextCard', 'label':'&Next Card\tCtrl+3', 'command':'goNext', }, {'type':'MenuItem', 'name':'menuGoLastCard', 'label':'&Last Card\tCtrl+4', 'command':'goLast', }, {'type':'MenuItem', 'name':'goSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuGoSort', 'label':'&Sort Cards...', 'command':'sort', }, ] }, ] }, 'components': [ {'type':'StaticBox', 'name':'StaticBox1', 'position':(283, 118), 'size':(119, 150), }, {'type':'TextField', 'name':'Name', 'position':(100, 17), 'size':(241, 24), }, {'type':'TextField', 'name':'Company', 'position':(100, 39), 'size':(241, 23), }, {'type':'TextField', 'name':'Street', 'position':(100, 72), 'size':(241, 23), }, {'type':'TextField', 'name':'City', 'position':(100, 94), 'size':(171, 23), }, {'type':'TextField', 'name':'State', 'position':(100, 116), 'size':(39, 23), }, {'type':'TextField', 'name':'Zip', 'position':(100, 138), 'size':(85, 23), }, {'type':'TextField', 'name':'Phone1', 'position':(100, 176), 'size':(169, -1), }, {'type':'TextField', 'name':'Phone2', 'position':(100, 198), 'size':(169, -1), }, {'type':'TextField', 'name':'Phone3', 'position':(100, 220), 'size':(169, -1), }, {'type':'TextField', 'name':'Phone4', 'position':(100, 242), 'size':(169, -1), }, {'type':'TextField', 'name':'Email', 'position':(100, 274), 'size':(300, -1), }, {'type':'TextField', 'name':'Web', 'position':(100, 298), 'size':(300, -1), }, {'type':'TextArea', 'name':'Notes', 'position':(100, 322), 'size':(300, 135), }, {'type':'StaticText', 'name':'NameLabel', 'position':(7, 24), 'size':(68, 16), 'alignment':'right', 'text':'Name', }, {'type':'StaticText', 'name':'CompanyLabel', 'position':(7, 46), 'size':(68, 16), 'alignment':'right', 'text':'Company', }, {'type':'StaticText', 'name':'StreetLabel', 'position':(8, 79), 'size':(68, 16), 'alignment':'right', 'text':'Street', }, {'type':'StaticText', 'name':'CityLabel', 'position':(8, 101), 'size':(68, 16), 'alignment':'right', 'text':'City', }, {'type':'StaticText', 'name':'StateLabel', 'position':(8, 123), 'size':(68, 16), 'alignment':'right', 'text':'State', }, {'type':'StaticText', 'name':'ZipCodeLabel', 'position':(8, 145), 'size':(68, 16), 'alignment':'right', 'text':'Zip Code', }, {'type':'StaticText', 'name':'TelephoneLabel', 'position':(7, 180), 'size':(68, 16), 'alignment':'right', 'text':'Telephone', }, {'type':'StaticText', 'name':'EmailLabel', 'position':(7, 278), 'size':(68, 16), 'alignment':'right', 'text':'Email', }, {'type':'StaticText', 'name':'WebLabel', 'position':(7, 302), 'size':(68, 16), 'alignment':'right', 'text':'Web', }, {'type':'StaticText', 'name':'NotesLabel', 'position':(7, 325), 'size':(68, 16), 'alignment':'right', 'text':'Notes', }, {'type':'Button', 'name':'NewCard', 'position':(293, 208), 'size':(100, -1), 'command':'editNewCard', 'label':'New Card', }, {'type':'Button', 'name':'DeleteCard', 'position':(293, 238), 'size':(100, -1), 'command':'editDeleteCard', 'label':'Delete Card', }, {'type':'Button', 'name':'Find', 'position':(293, 178), 'size':(100, -1), 'command':'findRecord', 'label':'Find', }, {'type':'ImageButton', 'name':'Prev', 'position':(309, 136), 'size':(26, 30), 'border':'transparent', 'command':'goPrev', 'file':'prev.gif', }, {'type':'ImageButton', 'name':'Next', 'position':(349, 137), 'size':(25, 30), 'border':'transparent', 'command':'goNext', 'file':'next.gif', }, {'type':'TextField', 'name':'Sortorder', 'position':(0, 0), 'size':(30, 19), 'text':'1', 'visible':0, }, {'type':'TextField', 'name':'NameOrder', 'position':(141, 0), 'size':(73, 19), 'text':'last word', 'visible':0, }, {'type':'TextField', 'name':'CorrectName', 'position':(100, 0), 'size':(241, 24), 'visible':0, }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/samples/gadflyDatabase/next.gif0000644000076500007650000000041607601367466021536 0ustar alexalex00000000000000GIF89aÄÿÿÿÚÚÚÓÓÓÌÌÌÄÄÄ»»»²²²©©©£££›››’’’ŒŒŒ„„„{{{rrrlllcccYYYFFF===555)))ÿÿÿ!ù,‹ &Ždižhª®lë¾p,Ï£eѨ]á¦uQ;^­B Æ.Èäe"¡XŒ¯‰Ò2‰@"“g,+‘D¬pDB„M*‘°Z iR¢èµÜÑ`0\ç´<Ü@Q a €Q  † Q›› ˜B ¢£¡™B ¬­°£³´µ¶·¸¹!;PythonCard-0.8.2/samples/gadflyDatabase/prev.gif0000644000076500007650000000041707601367466021535 0ustar alexalex00000000000000GIF89aÄÿÿÿÚÚÚÓÓÓÌÌÌÄÄÄ»»»²²²©©©£££›››’’’ŒŒŒ„„„{{{rrrlllcccYYYFFF===555)))ÿÿÿ!ù,Œ &Ždižhª®lë¾p,ÏôkYµYÝ9YQ\S)î†;Šdri:/±Ý$‰L,Ï ¬(‰<¾ÕˆDbѺ(JÈw½ŽTÌ,£á`ÛÝp–¢€hØÛo0  u y-  ‰ 2‘ ~¡¡.‘ C"ª« ®«±²µ¶·¸¹/!;PythonCard-0.8.2/samples/gadflyDatabase/readme.txt0000644000076500007650000000154707601075375022070 0ustar alexalex00000000000000Module : gadflyDatabase Date : 21st December, 2002 Author : Andy Todd gadflyDatabase extends the flatfileDatabase module and sample. It implements a different kind of persistent storage, using the relational database gadfly. This provides all of the usual ACID properties of a relational database to the generic storage framework of PythonCard. The main classes, GadflyDatabase and Document in the module gadflyDatabase.py are direct sub classes of the classes in flatfileDatabase.py. They share, where possible, method names and properties. The major difference is that the flatfileDatabase sample needs an initialisation property called dataFile whereas gadflyDatabase requires three properties; dbDir, dbName and tableName. For it to work properly you will need to have gadfly installed. Get it from; http://gadfly.sourceforge.net/ PythonCard-0.8.2/samples/gravity/0000755000076500007650000000000010434046771016651 5ustar alexalex00000000000000PythonCard-0.8.2/samples/gravity/floatgravity.py0000644000076500007650000002615310347526323021744 0ustar alexalex00000000000000#!/usr/bin/python """ Conversion of Flash animation to PythonCard. """ __version__ = "$Revision: 1.3 $" __date__ = "$Date: 2005/12/13 11:13:23 $" # KEA 2004-09-25 # based on the excellent work by Keith Peters # http://www.bit-101.com/tutorials/gravity.html # I started with the doodle sample, so this sample still # contains some cruft # the big missing item is that I'm not currently doing hit # detection on the individual balls so they go right through each # other. I guess that needs to be part of the move method # with a reference back to the sprites list, but I have # a feeling it will be more complicated because if ball 1 # runs into ball 2, then they both need to react... from PythonCard import clipboard, dialog, graphic, model, util import wx import os import random # helper functions def pointInRect(xy, rect): x, y = xy left, top, right, bottom = rect if x >= left and x <= right and y >= top and y <= bottom: return True else: return False def randomColor(): return (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)) class Sprite(object): def __init__(self, canvas): self.canvas = canvas class BallSprite(Sprite): def __init__(self, canvas, x, y, radius, color='red'): Sprite.__init__(self, canvas) self.x = x self.y = y self.oldx = x self.oldy = y self.radius = radius self.color = color self.xspeed = random.random() * 30 self.yspeed = random.random() * 30 self.gravity = 2 self.drag = .98 self.bounce = .9 self.dragging = False self.circle = canvas.AddCircle(x, y, radius * 2, LineWidth=1, LineColor='black',FillColor=color) print self.circle print dir(self.circle) def move(self): # this is sort of pointless right now # but maybe the dragging code could be moved # into the class in which case we might need # to know if we're dragging if not self.dragging: self.x += self.xspeed self.y += self.yspeed rightedge, bottomedge = self.canvas.size # bounce when we hit the edge if (self.x - self.radius) < 0: self.x = self.radius self.xspeed = -self.xspeed * self.bounce elif (self.x + self.radius) > rightedge: self.x = rightedge - self.radius self.xspeed = -self.xspeed * self.bounce if (self.y - self.radius) < 0: self.y = self.radius self.yspeed = -self.yspeed * self.bounce elif (self.y + self.radius) > bottomedge: self.y = bottomedge - self.radius self.yspeed = -self.yspeed * self.bounce self.xspeed = self.xspeed * self.drag self.yspeed = self.yspeed * self.drag + self.gravity else: self.xspeed = self.x - self.oldx self.yspeed = self.y - self.oldy self.oldx = self.x self.oldy = self.y #print "speed", self.xspeed, self.yspeed self.draw() def draw(self): ## self.canvas.setFillColor(self.color) #self.canvas.foregroundColor = self.color ## self.canvas.drawCircle((self.x, self.y), self.radius) # this should probably be part of move, draw with a FloatCanvas # wouldn't need to do anything?! self.circle.SetXY(self.x, self.y) class Gravity(model.Background): def on_initialize(self, event): self.x = 0 self.y = 0 self.dragging = False self.animate = False self.filename = None # leave it black for now #self.components.bufOff.foregroundColor = self.color self.sprites = [] self.initSizers() canvas = self.components.bufOff canvas.ClearAll() canvas.SetProjectionFun(None) # go ahead and create one ball to get started # if you want to stress the animation loop # uncomment the loop below # my Win2K box can do approximately 130 balls and still # maintain 30 (29.9...) FPS, but above that and it starts # to slow down ## for i in range(130): ## self.sprites.append(BallSprite(self.components.bufOff, 20, 20, 15, randomColor())) self.on_btnNewBall_mouseClick(None) def initSizers(self): sizer1 = wx.BoxSizer(wx.VERTICAL) sizer2 = wx.BoxSizer(wx.HORIZONTAL) comp = self.components flags = wx.ALL | wx.ALIGN_CENTER_VERTICAL padding = 7 sizer2.Add(comp.btnNewBall, 0, flags, padding) sizer2.Add(comp.btnAnimate, 0, flags, padding) sizer2.Add(comp.btnStop, 0, flags, padding) sizer1.Add(sizer2, 0) sizer1.Add(comp.bufOff, 1, wx.EXPAND) sizer1.Fit(self) sizer1.SetSizeHints(self) self.panel.SetSizer(sizer1) self.panel.SetAutoLayout(1) self.panel.Layout() def on_btnNewBall_mouseClick(self, event): canvas = self.components.bufOff self.sprites.append(BallSprite(canvas, 20, 20, 15, randomColor())) if not self.animate: ## canvas.clear() for ball in self.sprites: ball.draw() canvas.redraw() self.statusBar.text = "Balls: %d" % len(self.sprites) def on_btnAnimate_mouseClick(self, event): event.target.enabled = False canvas = self.components.bufOff ## canvas.autoRefresh = False self.animate = True avgfps = 0 frame = 0 seconds = util.time() # number of frames to display a second # on faster boxes this will throttle the number # of frames calculated and displayed, but on slower # boxes it won't prevent slowdown fps = 30 # amount of time that should pass before drawing another frame timePerFrame = 1.0 / fps #print timePerFrame # hack to force a difference # between time and startTime # to avoid a division by zero exception on fast machines # aka my Windows box ;-) startTime = util.time() - 0.001 while self.animate: newSeconds = util.time() if newSeconds - seconds >= timePerFrame: seconds = newSeconds ## canvas.clear() for ball in self.sprites: ball.move() if wx.Platform == '__WXMAC__': canvas.redraw() else: ## canvas.refresh() pass frame += 1 self.statusBar.text = "Average FPS: %.4f Balls: %d" % (frame / (seconds - startTime), len(self.sprites)) # give the user a chance to click Stop wx.SafeYield(self, True) def on_btnStop_mouseClick(self, event): self.animate = False self.components.btnAnimate.enabled = True def on_close(self, event): self.animate = False event.skip() def on_bufOff_mouseDown(self, event): #event.target.drawLine((self.x, self.y), (self.x + 1, self.y + 1)) # figure out which ball the user clicked on, if any # i want to search the list from back to front # but I don't change the list in place, so I make a copy # is there a way to iterate over a list in reverse without # using something awkward like # for i in range(len(self.sprites) - 1, -1, -1): sprites = self.sprites[:] sprites.reverse() for ball in sprites: radius = ball.radius x = ball.x y = ball.y #print "point", event.position #print "rect", x - radius, y - radius, x + radius, y + radius if pointInRect(event.position, (x - radius, y - radius, x + radius, y + radius)): self.dragging = ball ball.dragging = True x, y = event.position self.dx = ball.x - x self.dy = ball.y - y #print self.dx, self.dy break # on a mouseLeave we will no longer # get drag messages, so we could end dragging # at that point, just keep the current behavior def on_bufOff_mouseDrag(self, event): if self.dragging: x, y = event.position ball = self.dragging ball.x = x + self.dx ball.y = y + self.dy # reraw all the objects self.components.bufOff.clear() for ball in self.sprites: ball.move() if wx.Platform == '__WXMAC__': self.components.bufOff.redraw() else: self.components.bufOff.refresh() def on_bufOff_mouseUp(self, event): if self.dragging: self.dragging.dragging = False self.dragging = None # older Doodle code # I'm keeping it around in case I need it later def on_bufOff_mouseEnter(self, event): self.x, self.y = event.position ## def on_bufOff_mouseDown(self, event): ## self.x, self.y = event.position ## event.target.drawLine((self.x, self.y), (self.x + 1, self.y + 1)) ## ## def on_bufOff_mouseDrag(self, event): ## x, y = event.position ## event.target.drawLine((self.x, self.y), (x, y)) ## self.x = x ## self.y = y def on_btnColor_mouseClick(self, event): result = dialog.colorDialog(self, color=self.color) if result.accepted: #self.components.bufOff.foregroundColor = result.color event.target.backgroundColor = result.color self.color = result.color def openFile(self): result = dialog.openFileDialog(None, "Import which file?") if result.accepted: path = result.paths[0] os.chdir(os.path.dirname(path)) self.filename = path bmp = graphic.Bitmap(self.filename) self.components.bufOff.drawBitmap(bmp, (0, 0)) def on_menuFileOpen_select(self, event): self.openFile() def on_menuFileSaveAs_select(self, event): if self.filename is None: path = '' filename = '' else: path, filename = os.path.split(self.filename) result = dialog.saveFileDialog(None, "Save As", path, filename) if result.accepted: path = result.paths[0] fileType = graphic.bitmapType(path) print fileType, path try: bmp = self.components.bufOff.getBitmap() bmp.SaveFile(path, fileType) return 1 except IOError: return 0 else: return 0 def on_menuEditCopy_select(self, event): clipboard.setClipboard(self.components.bufOff.getBitmap()) def on_menuEditPaste_select(self, event): bmp = clipboard.getClipboard() if isinstance(bmp, wx.Bitmap): self.components.bufOff.drawBitmap(bmp) def on_editClear_command(self, event): self.components.bufOff.clear() if __name__ == '__main__': app = model.Application(Gravity) app.MainLoop() PythonCard-0.8.2/samples/gravity/floatgravity.rsrc.py0000644000076500007650000000375410311356610022705 0ustar alexalex00000000000000 { 'application':{ 'type':'Application', 'name':'Gravity', 'backgrounds': [ { 'type':'Background', 'name':'bgDoodle', 'title':'Gravity PythonCard Application', 'size':( 310, 300 ), 'style':['resizeable'], 'statusBar':1, 'menubar': { 'type':'MenuBar', 'menus': [ { 'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ { 'type':'MenuItem', 'name':'menuFileOpen', 'label':'&Open...\tCtrl+O' }, { 'type':'MenuItem', 'name':'menuFileSaveAs', 'label':'Save &As...' }, { 'type':'MenuItem', 'name':'fileSep1', 'label':'-' }, { 'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit' } ] }, { 'type':'Menu', 'name':'menuEdit', 'label':'&Edit', 'items': [ { 'type':'MenuItem', 'name':'menuEditCopy', 'label':'&Copy\tCtrl+C'}, { 'type':'MenuItem', 'name':'menuEditPaste', 'label':'&Paste\tCtrl+V'}, { 'type':'MenuItem', 'name':'editSep1', 'label':'-' }, { 'type':'MenuItem', 'name':'menuEditClear', 'label':'&Clear', 'command':'editClear'} ] } ] }, 'components': [ { 'type':'Button', 'name':'btnNewBall', 'position':(5, 5), 'label':'New Ball' }, { 'type':'Button', 'name':'btnAnimate', 'position':(100, 5), 'label':'Animate' }, { 'type':'Button', 'name':'btnStop', 'position':(200, 5), 'label':'Stop' }, { 'type':'FloatCanvas', 'name':'bufOff', 'position':(0, 30), 'size':(300, 230) }, ] } ] } } PythonCard-0.8.2/samples/gravity/gravity.py0000644000076500007650000002466610347526323020725 0ustar alexalex00000000000000#!/usr/bin/python """ Conversion of Flash animation to PythonCard. """ __version__ = "$Revision: 1.8 $" __date__ = "$Date: 2005/12/13 11:13:23 $" # KEA 2004-09-25 # based on the excellent work by Keith Peters # http://www.bit-101.com/tutorials/gravity.html # I started with the doodle sample, so this sample still # contains some cruft # the big missing item is that I'm not currently doing hit # detection on the individual balls so they go right through each # other. I guess that needs to be part of the move method # with a reference back to the sprites list, but I have # a feeling it will be more complicated because if ball 1 # runs into ball 2, then they both need to react... from PythonCard import clipboard, dialog, graphic, model, util import wx import os import random # helper functions def pointInRect(xy, rect): x, y = xy left, top, right, bottom = rect if x >= left and x <= right and y >= top and y <= bottom: return True else: return False def randomColor(): return (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)) class Sprite(object): def __init__(self, canvas): self.canvas = canvas class BallSprite(Sprite): def __init__(self, canvas, x, y, radius, color='red'): Sprite.__init__(self, canvas) self.x = x self.y = y self.oldx = x self.oldy = y self.radius = radius self.color = color self.xspeed = random.random() * 30 self.yspeed = random.random() * 30 self.gravity = 2 self.drag = .98 self.bounce = .9 self.dragging = False def move(self): # this is sort of pointless right now # but maybe the dragging code could be moved # into the class in which case we might need # to know if we're dragging if not self.dragging: self.x += self.xspeed self.y += self.yspeed rightedge, bottomedge = self.canvas.size # bounce when we hit the edge if (self.x - self.radius) < 0: self.x = self.radius self.xspeed = -self.xspeed * self.bounce elif (self.x + self.radius) > rightedge: self.x = rightedge - self.radius self.xspeed = -self.xspeed * self.bounce if (self.y - self.radius) < 0: self.y = self.radius self.yspeed = -self.yspeed * self.bounce elif (self.y + self.radius) > bottomedge: self.y = bottomedge - self.radius self.yspeed = -self.yspeed * self.bounce self.xspeed = self.xspeed * self.drag self.yspeed = self.yspeed * self.drag + self.gravity else: self.xspeed = self.x - self.oldx self.yspeed = self.y - self.oldy self.oldx = self.x self.oldy = self.y #print "speed", self.xspeed, self.yspeed self.draw() def draw(self): self.canvas.fillColor = self.color #self.canvas.foregroundColor = self.color self.canvas.drawCircle((self.x, self.y), self.radius) class Gravity(model.Background): def on_initialize(self, event): self.x = 0 self.y = 0 self.dragging = False self.animate = False self.filename = None # leave it black for now #self.components.bufOff.foregroundColor = self.color self.sprites = [] self.initSizers() # go ahead and create one ball to get started # if you want to stress the animation loop # uncomment the loop below # my Win2K box can do approximately 130 balls and still # maintain 30 (29.9...) FPS, but above that and it starts # to slow down ## for i in range(130): ## self.sprites.append(BallSprite(self.components.bufOff, 20, 20, 15, randomColor())) self.on_btnNewBall_mouseClick(None) def initSizers(self): sizer1 = wx.BoxSizer(wx.VERTICAL) sizer2 = wx.BoxSizer(wx.HORIZONTAL) comp = self.components flags = wx.ALL | wx.ALIGN_CENTER_VERTICAL padding = 7 sizer2.Add(comp.btnNewBall, 0, flags, padding) sizer2.Add(comp.btnAnimate, 0, flags, padding) sizer2.Add(comp.btnStop, 0, flags, padding) sizer1.Add(sizer2, 0) sizer1.Add(comp.bufOff, 1, wx.EXPAND) sizer1.Fit(self) sizer1.SetSizeHints(self) self.panel.SetSizer(sizer1) self.panel.SetAutoLayout(1) self.panel.Layout() def on_btnNewBall_mouseClick(self, event): canvas = self.components.bufOff self.sprites.append(BallSprite(canvas, 20, 20, 15, randomColor())) if not self.animate: canvas.clear() for ball in self.sprites: ball.draw() canvas.redraw() self.statusBar.text = "Balls: %d" % len(self.sprites) def on_btnAnimate_mouseClick(self, event): event.target.enabled = False canvas = self.components.bufOff canvas.autoRefresh = False self.animate = True avgfps = 0 frame = 0 seconds = util.time() # number of frames to display a second # on faster boxes this will throttle the number # of frames calculated and displayed, but on slower # boxes it won't prevent slowdown fps = 30 # amount of time that should pass before drawing another frame timePerFrame = 1.0 / fps #print timePerFrame # hack to force a difference # between time and startTime # to avoid a division by zero exception on fast machines # aka my Windows box ;-) startTime = util.time() - 0.001 while self.animate: newSeconds = util.time() if newSeconds - seconds >= timePerFrame: seconds = newSeconds canvas.clear() for ball in self.sprites: ball.move() canvas.refresh() frame += 1 self.statusBar.text = "Average FPS: %.4f Balls: %d" % (frame / (seconds - startTime), len(self.sprites)) # give the user a chance to click Stop wx.SafeYield(self, True) def on_btnStop_mouseClick(self, event): self.animate = False self.components.btnAnimate.enabled = True def on_close(self, event): self.animate = False event.skip() def on_bufOff_mouseDown(self, event): #event.target.drawLine((self.x, self.y), (self.x + 1, self.y + 1)) # figure out which ball the user clicked on, if any # i want to search the list from back to front # but I don't change the list in place, so I make a copy # is there a way to iterate over a list in reverse without # using something awkward like # for i in range(len(self.sprites) - 1, -1, -1): sprites = self.sprites[:] sprites.reverse() for ball in sprites: radius = ball.radius x = ball.x y = ball.y #print "point", event.position #print "rect", x - radius, y - radius, x + radius, y + radius if pointInRect(event.position, (x - radius, y - radius, x + radius, y + radius)): self.dragging = ball ball.dragging = True x, y = event.position self.dx = ball.x - x self.dy = ball.y - y #print self.dx, self.dy break # on a mouseLeave we will no longer # get drag messages, so we could end dragging # at that point, just keep the current behavior def on_bufOff_mouseDrag(self, event): if self.dragging: x, y = event.position ball = self.dragging ball.x = x + self.dx ball.y = y + self.dy # reraw all the objects self.components.bufOff.clear() for ball in self.sprites: ball.move() self.components.bufOff.refresh() def on_bufOff_mouseUp(self, event): if self.dragging: self.dragging.dragging = False self.dragging = None # older Doodle code # I'm keeping it around in case I need it later def on_bufOff_mouseEnter(self, event): self.x, self.y = event.position ## def on_bufOff_mouseDown(self, event): ## self.x, self.y = event.position ## event.target.drawLine((self.x, self.y), (self.x + 1, self.y + 1)) ## ## def on_bufOff_mouseDrag(self, event): ## x, y = event.position ## event.target.drawLine((self.x, self.y), (x, y)) ## self.x = x ## self.y = y def on_btnColor_mouseClick(self, event): result = dialog.colorDialog(self, color=self.color) if result.accepted: #self.components.bufOff.foregroundColor = result.color event.target.backgroundColor = result.color self.color = result.color def openFile(self): result = dialog.openFileDialog(None, "Import which file?") if result.accepted: path = result.paths[0] os.chdir(os.path.dirname(path)) self.filename = path bmp = graphic.Bitmap(self.filename) self.components.bufOff.drawBitmap(bmp, (0, 0)) def on_menuFileOpen_select(self, event): self.openFile() def on_menuFileSaveAs_select(self, event): if self.filename is None: path = '' filename = '' else: path, filename = os.path.split(self.filename) result = dialog.saveFileDialog(None, "Save As", path, filename) if result.accepted: path = result.paths[0] fileType = graphic.bitmapType(path) print fileType, path try: bmp = self.components.bufOff.getBitmap() bmp.SaveFile(path, fileType) return 1 except IOError: return 0 else: return 0 def on_menuEditCopy_select(self, event): clipboard.setClipboard(self.components.bufOff.getBitmap()) def on_menuEditPaste_select(self, event): bmp = clipboard.getClipboard() if isinstance(bmp, wx.Bitmap): self.components.bufOff.drawBitmap(bmp) def on_editClear_command(self, event): self.components.bufOff.clear() if __name__ == '__main__': app = model.Application(Gravity) app.MainLoop() PythonCard-0.8.2/samples/gravity/gravity.rsrc.py0000644000076500007650000000375510311356610021660 0ustar alexalex00000000000000 { 'application':{ 'type':'Application', 'name':'Gravity', 'backgrounds': [ { 'type':'Background', 'name':'bgDoodle', 'title':'Gravity PythonCard Application', 'size':( 310, 300 ), 'style':['resizeable'], 'statusBar':1, 'menubar': { 'type':'MenuBar', 'menus': [ { 'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ { 'type':'MenuItem', 'name':'menuFileOpen', 'label':'&Open...\tCtrl+O' }, { 'type':'MenuItem', 'name':'menuFileSaveAs', 'label':'Save &As...' }, { 'type':'MenuItem', 'name':'fileSep1', 'label':'-' }, { 'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit' } ] }, { 'type':'Menu', 'name':'menuEdit', 'label':'&Edit', 'items': [ { 'type':'MenuItem', 'name':'menuEditCopy', 'label':'&Copy\tCtrl+C'}, { 'type':'MenuItem', 'name':'menuEditPaste', 'label':'&Paste\tCtrl+V'}, { 'type':'MenuItem', 'name':'editSep1', 'label':'-' }, { 'type':'MenuItem', 'name':'menuEditClear', 'label':'&Clear', 'command':'editClear'} ] } ] }, 'components': [ { 'type':'Button', 'name':'btnNewBall', 'position':(5, 5), 'label':'New Ball' }, { 'type':'Button', 'name':'btnAnimate', 'position':(100, 5), 'label':'Animate' }, { 'type':'Button', 'name':'btnStop', 'position':(200, 5), 'label':'Stop' }, { 'type':'BitmapCanvas', 'name':'bufOff', 'position':(0, 30), 'size':(300, 230) }, ] } ] } } PythonCard-0.8.2/samples/gravity/readme.txt0000644000076500007650000000013410131334427020635 0ustar alexalex00000000000000Conversion of Flash animation to PythonCard. http://www.bit-101.com/tutorials/gravity.html PythonCard-0.8.2/samples/helpfulWrappers/0000755000076500007650000000000010434046771020347 5ustar alexalex00000000000000PythonCard-0.8.2/samples/helpfulWrappers/helpfulWrappers.py0000644000076500007650000000540710354037623024107 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.3 $" __date__ = "$Date: 2005/12/26 19:08:03 $" """ # sample to demonstrate usage of the "helpful" wrappers in helpful.py from PythonCard import model, helpful rsrc = {'application':{'type':'Application', 'name':'testmultibuttondialog', 'backgrounds': [ {'type':'Background', 'name':'bgMin', 'title':'Demo of Helpful wrappers', 'size':(300, 100), 'components': [ {'type':'Button', 'name':'popup', 'position':(100,10), 'label':'Test pop-ups!', 'toolTip':'try this - context-click and the pop-up will appear', }, {'type':'Button', 'name':'buttons', 'position':(50,50), 'label':'Test buttons!', }, {'type':'Button', 'name':'boxes', 'position':(150,50), 'label':'Test boxes!', }, ] # end components } # end background ] # end backgrounds } } class MyBackground(model.Background): def on_initialize(self, event): self.boxes = [ ("already", False, 'already has a tooltip'), ("later", True), ("a long string to check sizing", True), "just a string", ("c", True), ("d", True), ("a1", True), ("a2", True), ("a3", True) ] pass def on_popup_mouseClick(self, event): print self.boxes def on_popup_mouseContextDown(self, event): selected = helpful.popUpMenu(self, ['this', 'set', 'of', 'strings'], self.components.popup.position) if selected: print "Selected item was '"+selected+"'" else: print "Nothing selected." def on_buttons_mouseClick(self, event): result = helpful.multiButtonDialog(self, 'some question', ['OK', 'Not OK', "Cancel"], "Test Dialog Title") print "Dialog result:\naccepted: %s\ntext: %s" % (result.accepted, result.text) result = helpful.multiButtonDialog(self, 'Dad, can I go to the movies tonight', \ ['Yes', 'No', 'Maybe', ('Ask me later', 'procrastination will be better tomorrow'), 'Ask your mum'], "Movies Dialog Title") print "Dialog result:\naccepted: %s\ntext: %s" % (result.accepted, result.text) def on_boxes_mouseClick(self, event): boxes = [ ("already", False), ("later", True) ] result = helpful.multiCheckBoxDialog(self, boxes, "Test Boxes Dialog Title") print "Dialog result:\naccepted: %s\n" % (result.accepted), result.boxes result = helpful.multiCheckBoxDialog(self, self.boxes, "Test Boxes Dialog Title") print "Dialog result:\naccepted: %s\n" % (result.accepted), result.boxes self.boxes = result.boxes if __name__ == '__main__': app = model.Application(MyBackground, None, rsrc) app.MainLoop() PythonCard-0.8.2/samples/helpfulWrappers/readme.txt0000644000076500007650000000013010332011020022307 0ustar alexalex00000000000000helpfulWrappers demonstrates the usage of the wrapper functions in PythonCard/helpful PythonCard-0.8.2/samples/hopalong/0000755000076500007650000000000010434046771016773 5ustar alexalex00000000000000PythonCard-0.8.2/samples/hopalong/hopalong.py0000644000076500007650000001174210126162233021147 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.28 $" __date__ = "$Date: 2004/09/28 04:12:11 $" """ from PythonCard import model, util import math import wx # from PIDDLE/SPING color spectrum test def bluefunc(x): return 1.0 / (1.0 + math.exp(-10*(x-0.6))) def redfunc(x): return 1.0 / (1.0 + math.exp(10*(x-0.5))) def greenfunc(x): return 1 - pow(redfunc(x+0.2),2) - bluefunc(x-0.3) def genColors(n=100): out = [None]*n; for i in range(n): x = float(i)/n out[i] = (int(redfunc(x) * 255), int(greenfunc(x) * 255), int(bluefunc(x) * 255)) return out class Hopalong(model.Background): def on_initialize(self, event): self.drawing = False self.components.bufOff.backgroundColor = 'black' self.components.bufOff.clear() self.initSizers() def initSizers(self): sizer1 = wx.BoxSizer(wx.VERTICAL) sizer2 = wx.BoxSizer(wx.HORIZONTAL) comp = self.components stcFlags = wx.LEFT | wx.BOTTOM | wx.ALIGN_CENTER fldFlags = wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.ALIGN_CENTER padding = 5 # Mac wxButton needs 7 pixels on bottom and right macPadding = 7 sizer2.Add(comp.stcA, 0, stcFlags, padding) sizer2.Add(comp.fldA, 0, fldFlags, padding) sizer2.Add(comp.stcB, 0, stcFlags, padding) sizer2.Add(comp.fldB, 0, fldFlags, padding) sizer2.Add(comp.stcC, 0, stcFlags, padding) sizer2.Add(comp.fldC, 0, fldFlags, padding) sizer2.Add(comp.stcIterations, 0, stcFlags, padding) sizer2.Add(comp.fldIterations, 0, fldFlags, padding) sizer2.Add(comp.stcXOffset, 0, stcFlags, padding) sizer2.Add(comp.fldXOffset, 0, fldFlags, padding) sizer2.Add(comp.stcYOffset, 0, stcFlags, padding) sizer2.Add(comp.fldYOffset, 0, fldFlags, padding) sizer2.Add(comp.stcScale, 0, stcFlags, padding) sizer2.Add(comp.fldScale, 0, fldFlags, padding) sizer2.Add(comp.stcColors, 0, stcFlags, padding) sizer2.Add(comp.fldColors, 0, fldFlags, padding) sizer2.Add((5, 5), 1) # spacer sizer2.Add(comp.btnDraw, 0, fldFlags, macPadding) sizer2.Add(comp.btnCancel, 0, fldFlags, macPadding) sizer1.Add(sizer2, 0, wx.EXPAND) sizer1.Add(comp.bufOff, 1, wx.EXPAND) sizer1.Fit(self) sizer1.SetSizeHints(self) self.panel.SetSizer(sizer1) self.panel.SetAutoLayout(1) self.panel.Layout() def hopalong(self, a=30.0, b=1.0, c=0.9, iterations=100000, xOffset=300.0, yOffset=300.0, scale=10.0, numColors=1000): x = 0.0 y = 0.0 colors = genColors(numColors) colorIter = iterations / len(colors) #print iterations, len(colors), colorIter sqrt = math.sqrt for i in range(len(colors)): points = [] for j in range(colorIter): if x < 0: temp = y + sqrt(abs(b * x - c)) else: temp = y - sqrt(abs(b * x - c)) y = a - x x = temp points.append((xOffset + (x * scale), yOffset + (y * scale))) # to speed up drawing, we only update when the color changes yield (colors[i], points) def doHopalong(self): self.statusBar.text = "Drawing, please wait..." canvas = self.components.bufOff a = float(self.components.fldA.text) b = float(self.components.fldB.text) c = float(self.components.fldC.text) iterations = int(self.components.fldIterations.text) xOffset = float(self.components.fldXOffset.text) yOffset = float(self.components.fldYOffset.text) scale = float(self.components.fldScale.text) numColors = int(self.components.fldColors.text) totalPointsDrawn = 0 starttime = util.time() canvas.clear() for color, points in self.hopalong(a, b, c, iterations, xOffset, yOffset, scale, numColors): canvas.foregroundColor = color canvas.drawPointList(points) totalPointsDrawn += len(points) wx.SafeYield(self) if not self.drawing: break elapsed = util.time() - starttime self.statusBar.text = "hopalong time: %f seconds (%d points drawn)" % (elapsed, totalPointsDrawn) self.drawing = False self.components.btnDraw.enabled = True self.components.btnCancel.enabled = False def on_btnDraw_mouseClick(self, event): self.drawing = True event.target.enabled = False self.components.btnCancel.enabled = True self.doHopalong() def on_btnCancel_mouseClick(self, event): self.drawing = False def on_editClear_command(self, event): self.components.bufOff.clear() def on_close(self, event): self.drawing = False event.skip() if __name__ == '__main__': app = model.Application(Hopalong) app.MainLoop() PythonCard-0.8.2/samples/hopalong/hopalong.rsrc.py0000644000076500007650000000624510047606327022132 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'Hopalong', 'backgrounds': [ {'type':'Background', 'name':'bgDoodle', 'title':'Hopalong', 'size':(800, 600), 'statusBar':1, 'style':['resizeable'], 'menubar': {'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ {'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit' }, ] }, {'type':'Menu', 'name':'menuEdit', 'label':'&Edit', 'items': [ {'type':'MenuItem', 'name':'menuEditClear', 'label':'&Clear', 'command':'editClear', }, ] }, ] }, 'components': [ {'type':'BitmapCanvas', 'name':'bufOff', 'position':(0, 30), 'size':(790, 500), 'backgroundColor':(255, 255, 255), }, {'type':'TextField', 'name':'fldA', 'position':(16, 4), 'size':(34, -1), 'text':'30.0', }, {'type':'TextField', 'name':'fldB', 'position':(74, 4), 'size':(34, -1), 'text':'1.0', }, {'type':'TextField', 'name':'fldC', 'position':(134, 4), 'size':(34, -1), 'text':'0.9', }, {'type':'TextField', 'name':'fldIterations', 'position':(238, 4), 'size':(58, -1), 'text':'100000', }, {'type':'TextField', 'name':'fldXOffset', 'position':(354, 4), 'size':(50, -1), 'text':'300', }, {'type':'TextField', 'name':'fldYOffset', 'position':(468, 4), 'size':(50, -1), 'text':'300', }, {'type':'TextField', 'name':'fldScale', 'position':(572, 4), 'size':(50, -1), 'text':'10.0', }, {'type':'TextField', 'name':'fldColors', 'position':(672, 4), 'size':(50, -1), 'text':'1000', }, {'type':'Button', 'name':'btnDraw', 'position':(702, 2), 'label':'Draw', }, {'type':'Button', 'name':'btnCancel', 'position':(702, 2), 'label':'Cancel', 'enabled':0, }, {'type':'StaticText', 'name':'stcA', 'position':(4, 10), 'text':'a:', }, {'type':'StaticText', 'name':'stcB', 'position':(62, 10), 'text':'b:', }, {'type':'StaticText', 'name':'stcC', 'position':(120, 10), 'text':'c:', }, {'type':'StaticText', 'name':'stcIterations', 'position':(184, 10), 'text':'Iterations:', }, {'type':'StaticText', 'name':'stcXOffset', 'position':(312, 10), 'text':'XOffset:', }, {'type':'StaticText', 'name':'stcYOffset', 'position':(418, 10), 'text':'YOffset:', }, {'type':'StaticText', 'name':'stcScale', 'position':(534, 10), 'text':'Scale:', }, {'type':'StaticText', 'name':'stcColors', 'position':(638, 10), 'text':'Colors:', }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/samples/hopalong/readme.txt0000644000076500007650000000130207350442772020771 0ustar alexalex00000000000000based on the hopalong algorithm by Barry Martin presented in the September 1986 Scientific American Computer Recreations column by A. K. Dewdney algorithm starts on page 15 some other interesting values to try: a = 73, b = 2.6, c = 25 a = -200, b = .1, c = -80 a = .4, b = 1, c = 0 (try a scale of 100 or 200 on this one) a = -3.14, b = .3, c = .3 I would like to experiment with ways of speeding up the calculation and/or drawing using NumPy. Suggestions are welcome. It would also be nice to be able to save and restore setups and save the current image in the window as a JPEG. I'll explore these options in the future, but you're welcome to make the additions and submit the changes yourself.PythonCard-0.8.2/samples/jabberChat/0000755000076500007650000000000010434046771017211 5ustar alexalex00000000000000PythonCard-0.8.2/samples/jabberChat/chatWindow.py0000644000076500007650000001364310046216006021666 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.22 $" __date__ = "$Date: 2004/05/05 16:53:26 $" """ import PythonCard from PythonCard import dialog, log, model import wx import os import time class ChatWindow(model.Background): def on_initialize(self, event): if not hasattr(self, 'parent'): self.parent = self.GetParent() self.initSizers() self.components.fldInput.setFocus() # this isn't quite right, the wxFlexGridSizer # containing the headers should expand horizontally as the window # expands def initSizers(self): comp = self.components sizer1 = wx.BoxSizer(wx.VERTICAL) sizer2 = wx.BoxSizer(wx.HORIZONTAL) stcSizerAttrs = wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL fldSizerAttrs = wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.EXPAND vertFlags = wx.LEFT | wx.TOP | wx.ALIGN_LEFT chkSizerAttrs = wx.RIGHT | wx.ALIGN_CENTER_VERTICAL sizer2.Add(comp.fldInput, 1, fldSizerAttrs, 20) sizer2.Add((5, 5), 0) # spacer sizer2.Add(comp.btnSend, 0, wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 20) sizer1.Add(comp.fldTranscript, 1, wx.EXPAND) sizer1.Add((5, 5), 0) # spacer sizer1.Add(sizer2, 0, wx.EXPAND) self.sizer1 = sizer1 sizer1.Fit(self) sizer1.SetSizeHints(self) self.panel.SetSizer(sizer1) self.panel.SetAutoLayout(1) self.panel.Layout() def setFonts(self, font=None): if font: self.components.fldInput.font = font self.components.fldTranscript.font = font def setToJID(self, jid, toName): self.toJID = jid self.toName = toName if jid == toName: self.title = jid else: self.title = "%s (%s)" % (toName, jid) def appendMessage(self, jid, txt): oldFocus = self.findFocus() jid = str(jid) # appendMessage could be called before # openBackground event is processed if not hasattr(self, 'parent'): self.parent = self.GetParent() now = time.localtime(time.time()) timeStr = time.strftime("[%H:%M:%S] ", now) #self.components.fldTranscript.appendText("<" + str(jid) + "> " + str(txt) + '\n') f = self.components.fldTranscript.font.description() f['style'] = 'bold' color = 'black' if self.parent.jabberConnection.JID != jid: color = 'blue' self.components.fldTranscript.SetDefaultStyle(wx.TextAttr(color, font=PythonCard.font.fontFromDescription(f))) # this might be changed to get a nickname or full name # based on the jid # strip off resource for matching purposes shortJID = jid.split('/')[0] if shortJID in self.parent.displayNames: # use just the first name # this is potentially buggy # but I don't really want to display the full name # so I probably need both a full name and nickname field nickname = self.parent.displayNames[shortJID].split(" ")[0] else: nickname = shortJID.split('@')[0] if len(self.components.fldTranscript.text) == 0: self.components.fldTranscript.appendText(timeStr + nickname + ":") else: self.components.fldTranscript.appendText("\n" + timeStr + nickname + ":") # workaround for scroll bug # http://sourceforge.net/tracker/?func=detail&aid=665381&group_id=9863&atid=109863 self.components.fldTranscript.ScrollLines(-1) f['style'] = 'regular' self.components.fldTranscript.SetDefaultStyle(wx.TextAttr('black', font=PythonCard.font.fontFromDescription(f))) ##oldFocus = self.findFocus() # making it editable, should force auto-scroll # but it doesn't seem to work, setting the focus # appears to be the key #self.components.fldTranscript.editable = 1 self.components.fldTranscript.appendText(" " + str(txt)) ##self.components.fldTranscript.SetInsertionPointEnd() #self.components.fldTranscript.editable = 0 ##self.components.fldTranscript.setFocus() ##if (oldFocus == self.components.fldInput) or (oldFocus == self.components.btnSend): ## self.components.fldInput.setFocus() ##elif oldFocus is not None: ## oldFocus.setFocus() if self.GetParent().menuBar.getChecked('menuOptionsShowWindow'): # this will bring a window in front # of another in the app and steal the focus # which might not be what the user wants # so show and raise are separate options if self.IsIconized(): self.Iconize(0) self.visible = True # make sure the chat window is in front if self.GetParent().menuBar.getChecked('menuOptionsRaiseWindow'): wx.CallAfter(self.Raise) def on_fldInput_keyPress(self, event): keyCode = event.keyCode if keyCode == 13: if self.menuBar.getChecked('menuOptionsSendOnReturn'): self.on_doSend_command(None) else: event.skip() else: event.skip() def on_doSend_command(self, event): txt = self.components.fldInput.text.rstrip() if txt: self.parent.jabberConnection.sendChatMessage(self.toJID, txt) self.appendMessage(self.parent.jabberConnection.JID, txt) self.components.fldInput.text = "" def on_menuFileClose_select(self, event): self.close() def on_close(self, event): # just hide the window until the app is actually closed # this simplifies keeping the transcript up-to-date # and means we don't have to worry about a missing window # or multiple windows for each id we are sending/receiving self.visible = False PythonCard-0.8.2/samples/jabberChat/chatWindow.rsrc.py0000644000076500007650000000307310047606330022636 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'Chat', 'backgrounds': [ {'type':'Background', 'name':'bgMin', 'title':'', 'size':(500, 482), 'style':['resizeable'], 'menubar': {'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'menuFile', 'label':'File', 'items': [ {'type':'MenuItem', 'name':'menuFileSend', 'label':'&Send\tCtrl+S', 'command':'doSend', }, {'type':'MenuItem', 'name':'menuFileClose', 'label':'Close', }, ], }, {'type':'Menu', 'name':'menuOptions', 'label':'Options', 'items': [ {'type':'MenuItem', 'name':'menuOptionsSendOnReturn', 'label':'Send on &Return\tCtrl+R', 'checkable':1, 'checked':1, }, ], }, ] }, 'components': [ {'type':'TextArea', 'name':'fldTranscript', #'position':(0, -2), 'size':(400, 300), 'editable':0, }, {'type':'TextArea', 'name':'fldInput', #'position':(-2, 358), 'size':(300, 100), }, {'type':'Button', 'name':'btnSend', 'position':(410, 410), 'label':'Send', 'command':'doSend', }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/samples/jabberChat/conferenceDialog.py0000644000076500007650000000160110106741235023001 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.5 $" __date__ = "$Date: 2004/08/12 19:18:53 $" """ from PythonCard import model import os class ConferenceDialog(model.CustomDialog): def __init__(self, parent, room='', server=None, nickname=''): model.CustomDialog.__init__(self, parent) # if some special setup is necessary, do it here self.components.fldRoomName.text = room if server: self.components.cmbRoomServer.stringSelection = server self.components.fldNickname.text = nickname def conferenceDialog(parent, room='', server=None, nickname=''): dlg = ConferenceDialog(parent, room, server, nickname) result = dlg.showModal() result.room = dlg.components.fldRoomName.text result.server = dlg.components.cmbRoomServer.stringSelection result.nickname = dlg.components.fldNickname.text dlg.destroy() return result PythonCard-0.8.2/samples/jabberChat/conferenceDialog.rsrc.py0000644000076500007650000000220410041773002023744 0ustar alexalex00000000000000{'type':'CustomDialog', 'name':'ConferenceDialog', 'title':'Join Conference', 'size':(238, 156), 'components': [ {'type':'TextField', 'name':'fldRoomName', 'position':(85, 5), 'size':(140, -1), }, {'type':'Choice', 'name':'cmbRoomServer', 'position':(85, 35), 'size':(140, 21), 'items':['conference.jabber.org', 'private.jabber.org'], 'stringSelection':'conference.jabber.org', }, {'type':'TextField', 'name':'fldNickname', 'position':(85, 65), 'size':(140, -1), }, {'type':'StaticText', 'name':'stcNickname', 'position':(10, 70), 'text':'Nickname:', }, {'type':'StaticText', 'name':'stcRoomServer', 'position':(10, 40), 'text':'Room Server:', }, {'type':'StaticText', 'name':'stcRoomName', 'position':(10, 10), 'text':'Room Name:', }, {'type':'Button', 'id':5100, 'name':'btnOK', 'position':(36, 99), 'label':'OK', }, {'type':'Button', 'id':5101, 'name':'btnCancel', 'position':(126, 99), 'label':'Cancel', }, ] # end components } # end CustomDialog PythonCard-0.8.2/samples/jabberChat/connection.py0000644000076500007650000002375710347526323021737 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.10 $" __date__ = "$Date: 2005/12/13 11:13:23 $" """ import wx import os, sys import jabber DEBUG_LEVEL = 1 class JabberConnection: def __init__(self, parent, account): self.keepRunning = 1 self._parent = parent self.con = None self.server = account['server'] self.username = account['username'] self.password = account['password'] self.resource = account['resource'] self.createNewConnection() def createNewConnection(self): # should make debug level settable in configuration con = jabber.Client(host=self.server, debug=DEBUG_LEVEL, log=sys.stderr) self.con = con con.setMessageHandler(self.messageCB) con.setPresenceHandler(self.presenceCB) con.setIqHandler(self.iqCB) con.setDisconnectHandler(self.disconnectedCB) try: con.connect() except IOError, e: print "Couldn't connect: %s" % e ##sys.exit(0) return else: print "Connected" if con.auth(self.username, self.password, self.resource): print "Logged in as %s to server %s" % (self.username, self.server) else: print "eek -> ", con.lastErr, con.lastErrCode print "Requesting Roster Info" con.requestRoster() con.sendInitPresence() JID = self.username + '@' + self.server + '/' + self.resource print "JID", JID self.JID = JID self.shortJID = str(self.JID.split('/')[0]) self.updateRoster() self.updateRosterDisplay() # track which groupchat rooms we've joined # for special presence handling self.groupchatJIDS = {} def updateRoster(self): _roster = self.con.getRoster() print "\n" self.roster = {} for jid in _roster.getJIDs(): # 2002-11-30 # don't show gateways in the roster # what is the proper handling of gateways?! if '@' not in str(jid): continue print "%s :: %s (%s/%s)" % \ (jid, _roster.getOnline(jid), _roster.getStatus(jid), _roster.getShow(jid)) self.roster[str(jid)] = [_roster.getOnline(jid), _roster.getStatus(jid), _roster.getShow(jid)] print "\n" def updateRosterDisplay(self): roster = self.roster items = {} for key in roster: jid = str(key) status = roster[key][0].lower() show = roster[key][1] if show is None: show = "" else: # I noticed that some clients might let in a CR/LF on the end # so might as well get rid of leading and trailing whitespace show = show.strip() items[jid] = (status, show) self._parent.rosterQueue.put((None, items)) wx.WakeUpIdle() """ Exception in thread Thread-1: Traceback (most recent call last): File "C:\Python22\lib\threading.py", line 408, in __bootstrap self.run() File "C:\Python22\lib\threading.py", line 396, in run apply(self.__target, self.__args, self.__kwargs) File "C:\python\jabberChat\connection.py", line 92, in spinMyWheels self.con.process(1) File "C:\python\xmlstream.py", line 450, in process if not len(self.read()): # length of 0 means disconnect File "C:\python\xmlstream.py", line 379, in read data_in = data_in + \ File "", line 1, in recv error: (10054, 'Connection reset by peer') """ def spinMyWheels(self): while self.keepRunning and self.con is not None: #print "spinning..." try: self.con.process(1) except: # sometimes I get the connection error above # so this is an attempt to workaround losing # the connection by creating a new one self.createNewConnection() print "***** CONNECTION PROBLEM *****" def sendMessage(self, to, txt, messageType='chat'): print "\n" msg = jabber.Message(to, txt.strip()) msg.setType(messageType) print "<%s> %s" % (self.JID, msg.getBody()) self.con.send(msg) print "\n" def sendChatMessage(self, to, txt): self.sendMessage(to, txt, 'chat') def sendGroupChatMessage(self, to, txt): self.sendMessage(to, txt, 'groupchat') def joinGroupChat(self, to, nickname=None): if to not in self.groupchatJIDS: self.groupchatJIDS[to] = {} if nickname is None: nickname = self.username print "****** JOINING ROOM ******", to, "as", nickname self.sendPresence(to=to + '/' + nickname) # we could get an error joining, but I'm not sure # where to process that yet def messageCB(self, con, msg): """Called when a message is recieved""" if msg.getBody(): ## Dont show blank messages ## print '<' + str(msg.getFrom()) + '>' + ' ' + msg.getBody() txt = msg.getBody() self._parent.msgQueue.put((msg.getFrom(), txt)) wx.WakeUpIdle() def presenceCB(self, con, prs): """Called when a presence is recieved""" who = str(prs.getFrom()) type = prs.getType() if type is None: type = 'available' txt = None # subscription request: # - accept their subscription # - send request for subscription to their presence if type == 'subscribe': print "subscribe request from %s" % (who) con.send(jabber.Presence(to=who, type='subscribed')) con.send(jabber.Presence(to=who, type='subscribe')) txt = "subscribe request from %s" % (who) # unsubscription request: # - accept their unsubscription # - send request for unsubscription to their presence elif type == 'unsubscribe': print "unsubscribe request from %s" % (who) con.send(jabber.Presence(to=who, type='unsubscribed')) con.send(jabber.Presence(to=who, type='unsubscribe')) txt = "unsubscribe request from %s" % (who) elif type == 'subscribed': print "we are now subscribed to %s" % (who) txt = "we are now subscribed to %s" % (who) elif type == 'unsubscribed': print "we are now unsubscribed to %s" % (who) txt = "we are now unsubscribed to %s" % (who) elif type == 'available': print "%s is available (%s / %s)" % (who, prs.getShow(), prs.getStatus()) txt = "%s is available (%s / %s)" % (who, prs.getShow(), prs.getStatus()) # who is of the form 'username@domain/resource' jid = str(who.split('/')[0]) # KEA 2002-11-30 # should presences for the same jid such as altis@jabber.org/Exodus # and altis@jabber.org/default be treated separately? # for now, skip duplicate jids for both # available and unavailable # # I'm not showing gateways either # and still need to figure out the proper handling # of them if '@' in jid and jid != self.shortJID: if jid in self.groupchatJIDS: nickname = str(who.split('/')[1]) print "*******GROUPCHAT", jid, who, prs.getStatus(), prs.getShow() self.groupchatJIDS[jid][nickname] = (prs.getStatus(), prs.getShow()) self._parent.rosterQueue.put((jid, self.groupchatJIDS[jid])) wx.WakeUpIdle() else: self.roster[jid] = ['online', prs.getStatus(), prs.getShow()] self.updateRosterDisplay() elif type == 'unavailable': print "%s is unavailable (%s / %s)" % (who, prs.getShow(), prs.getStatus()) txt = "%s is unavailable (%s / %s)" % (who, prs.getShow(), prs.getStatus()) # who is of the form 'username@domain/resource' jid = str(who.split('/')[0]) if '@' in jid and jid != self.shortJID: if jid in self.groupchatJIDS: nickname = str(who.split('/')[1]) print "*******GROUPCHAT", jid, who, prs.getStatus(), prs.getShow() try: del self.groupchatJIDS[jid][nickname] self._parent.rosterQueue.put((jid, self.groupchatJIDS[jid])) wx.WakeUpIdle() except: pass else: self.roster[jid] = ['offline', prs.getStatus(), prs.getShow()] self.updateRosterDisplay() if txt is not None: # need to decide whether we want a separate queue for # status messages, for now just let the messages be # printed to the console #self._parent.msgQueue.put(txt) #wx.WakeUpIdle() pass def iqCB(self, con,iq): """Called when an iq is recieved, we just let the library handle it at the moment""" pass # see p. 145 of the Programming Jabber # and # http://www.jabber.org/protocol/coredata.html#presence def sendPresence(self, status="Available", to=None): #presence = jabber.Presence(type='available') presence = jabber.Presence(to) presence.setStatus(status) if status == "Available": # apparently "normal" is the default #presence.setShow("normal") pass elif status == "Do Not Disturb": presence.setShow("dnd") else: presence.setShow("away") self.con.send(presence) def disconnectedCB(self, con): print "Ouch, network error" #sys.exit(1) def disconnect(self): self.con.disconnect() print "Bye!" PythonCard-0.8.2/samples/jabberChat/groupChatWindow.py0000644000076500007650000001136110043042756022704 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.7 $" __date__ = "$Date: 2004/04/25 23:12:46 $" """ import PythonCard from PythonCard import dialog, log, model import wx import os import time import chatWindow class GroupChatWindow(chatWindow.ChatWindow): # this isn't quite right, the wxFlexGridSizer # containing the headers should expand horizontally as the window # expands def initSizers(self): comp = self.components sizer1 = wx.BoxSizer(wx.VERTICAL) sizer2 = wx.BoxSizer(wx.HORIZONTAL) sizer3 = wx.BoxSizer(wx.HORIZONTAL) stcSizerAttrs = wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL fldSizerAttrs = wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.EXPAND vertFlags = wx.LEFT | wx.TOP | wx.ALIGN_LEFT chkSizerAttrs = wx.RIGHT | wx.ALIGN_CENTER_VERTICAL sizer2.Add(comp.fldTranscript, 1, wx.EXPAND) #sizer2.Add(comp.fldInput, 1, fldSizerAttrs, 20) #sizer2.Add((5, 5), 0) # spacer sizer2.Add(comp.listRoster, 0, wx.EXPAND, 20) sizer3.Add(comp.fldInput, 1, fldSizerAttrs, 20) sizer3.Add((5, 5), 0) # spacer sizer3.Add(comp.btnSend, 0, wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 20) sizer1.Add(sizer2, 1, wx.EXPAND) sizer1.Add((5, 5), 0) # spacer sizer1.Add(sizer3, 0, wx.EXPAND) self.sizer1 = sizer1 sizer1.Fit(self) sizer1.SetSizeHints(self) self.panel.SetSizer(sizer1) self.panel.SetAutoLayout(1) self.panel.Layout() def setToJID(self, jid, toName): self.toJID = jid self.toName = toName if jid == toName: self.title = jid else: self.title = "%s (%s)" % (toName, jid) def appendMessage(self, jid, txt): ## oldFocus = self.findFocus() jid = str(jid) # appendMessage could be called before # openBackground event is processed if not hasattr(self, 'parent'): self.parent = self.GetParent() # make sure the chat window is in front now = time.localtime(time.time()) timeStr = time.strftime("[%H:%M:%S] ", now) # in groupchat, the resource is the nickname # jabber@conference.jabber.org/altis try: nickname = jid.split('/')[1] if nickname == 'default': # this is probably some status message like a user joining nickname = jid except: # this is probably some status message like a user joining nickname = jid f = self.components.fldTranscript.font.description() f['style'] = 'bold' color = 'black' if nickname == jid: color = 'green' elif nickname != self.nickname: color = 'blue' self.components.fldTranscript.SetDefaultStyle(wx.TextAttr(color, font=PythonCard.font.fontFromDescription(f))) if len(self.components.fldTranscript.text) == 0: self.components.fldTranscript.appendText(timeStr + nickname + ":") else: self.components.fldTranscript.appendText("\n" + timeStr + nickname + ":") f['style'] = 'regular' if nickname == jid: color = 'green' else: color = 'black' self.components.fldTranscript.SetDefaultStyle(wx.TextAttr(color, font=PythonCard.font.fontFromDescription(f))) # making it editable, should force auto-scroll # but it doesn't seem to work, setting the focus # appears to be the key #self.components.fldTranscript.editable = 1 self.components.fldTranscript.appendText(" " + str(txt)) ##self.components.fldTranscript.SetInsertionPointEnd() #self.components.fldTranscript.editable = 0 ## self.components.fldTranscript.setFocus() ## if (oldFocus == self.components.fldInput) or (oldFocus == self.components.btnSend): ## self.components.fldInput.setFocus() ## elif oldFocus is not None: ## oldFocus.setFocus() ## if oldFocus: ## oldFocus.setFocus() ## else: ## self.components.fldInput.setFocus() if self.GetParent().menuBar.getChecked('menuOptionsShowWindow'): if self.IsIconized(): self.Iconize(0) self.visible = True if self.GetParent().menuBar.getChecked('menuOptionsRaiseWindow'): wx.CallAfter(self.Raise) def on_doSend_command(self, event): txt = self.components.fldInput.text.rstrip() if txt: self.parent.jabberConnection.sendGroupChatMessage(self.toJID, txt) #self.appendMessage(self.parent.jabberConnection.JID, txt) self.components.fldInput.text = "" PythonCard-0.8.2/samples/jabberChat/groupChatWindow.rsrc.py0000644000076500007650000000324210047606330023651 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'Chat', 'backgrounds': [ {'type':'Background', 'name':'bgMin', 'title':'', 'size':(500, 482), 'style':['resizeable'], 'menubar': {'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'menuFile', 'label':'File', 'items': [ {'type':'MenuItem', 'name':'menuFileSend', 'label':'&Send\tCtrl+S', 'command':'doSend', }, {'type':'MenuItem', 'name':'menuFileClose', 'label':'Close', }, ], }, {'type':'Menu', 'name':'menuOptions', 'label':'Options', 'items': [ {'type':'MenuItem', 'name':'menuOptionsSendOnReturn', 'label':'Send on &Return\tCtrl+R', 'checkable':1, 'checked':1, }, ], }, ] }, 'components': [ {'type':'TextArea', 'name':'fldTranscript', #'position':(0, -2), 'size':(400, 300), 'editable':0, }, {'type':'List', 'name':'listRoster', #'position':(-2, 358), 'size':(150, 300), }, {'type':'TextArea', 'name':'fldInput', #'position':(-2, 358), 'size':(300, 100), }, {'type':'Button', 'name':'btnSend', 'position':(410, 410), 'label':'Send', 'command':'doSend', }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/samples/jabberChat/incoming.wav0000644000076500007650000003521407566303210021534 0ustar alexalex00000000000000RIFF„:WAVEfmt ++data`:€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€€€€€€€€€€€€€‚~~€€„€|ƒ…€{|€€€€ƒ‚}…€{~‚…€{„„{„„~{€…}ƒ„}€‚{~„z„ƒmo‰ˆŠ}~w{€‰Šty…ˆƒy}ƒ}vy‚‚‡†|y€‚~€€ƒ€vwƒ…€‚‰Š‚€€}{}€‚„‚€€…„~~„„~|~€‚„}~‚‚€}~€ƒ„ƒ€}|}~€€€€€€€€€~€€€€€‚„ƒ€~||€€€€€€ƒ„€€€€‚ƒ‚‚€~}~€‚€€€€€€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€€~€~f€€m”ˆiq€‚mv‚…“‰mjˆ€‡|r}‡x|}{‹„x|‚€€“Œ‹‡]k||„“¦“gOn™žœebƒ’€bn€y€u~‚}{€…v{ŠŽz‚‰€xy{‚†……€|z€ŠŽ‰|~ƒ…€~‚€y{€€ƒˆ‡‚~|~€€€„„zw~€~~€€€ƒ†€|{{|}‚…‚€€|yƒƒ…€{|€ƒ{‚€‚ƒ€}}„‚€~ƒ~~‚‚€€€€€}~€€€ƒ„€€€ƒ‚€€€€€€‚€€€€€€€€€ƒ€ƒ‚‚€€€~€€€‚€€€}€€‚‚€~~€€€~€€€€~€€€€€~€~€€€€€€€€€€€€~€€~€„€€€€~‚ƒ€€ƒ„€~€ƒ‚|z€†‚€‚ƒ€€€„‚€€}}ƒ…€„}||~ƒ„„‚€~}€€€‚‚€€€€~~€€€€€€€€€€€}~„‚€€€€€€€€‚€€€€~|€‚€~€€€€€€€€€€~€€€‚€€€€€€€€€€€€€€€€€‚ƒ‚€€€€€€€€€€€€€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚€}€…‚}|ƒ€€€€€€€€€ƒ€€€€€€€€€‚|…ƒvyŒŒyt€‡‚}y€‰}y€‚{ƒ„~€„„|z~€€~~ƒ||ƒ‚€€€€€~~~€„ƒ€}€€€„…~ƒ}~€‚€}}€ƒ‚ƒ‚€€€~€€€~€€€€€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€‚„€€~z€‰‰}wv{ˆ’Šrlv‹•‡xsy€„‰‰€tv€‡ˆ€wy‚І~w†ƒ€€€„†€yz†ƒ~}€„„~‚‚€‚„‚~{~‚‚€€€€ƒ€~€„„€}~€€€~~„‹‚o„Žxsn™”yv…€~€‚|z~‚ƒ~~zv}ƒ„€‡ˆ‚|zz{|€ƒ€ƒ€€~}€€€‚ƒƒ‚ƒƒ€€€€€€€~‚‚‚ƒ€€€~~~€‚‚€~~€€€€€€€€€€€€€€€€€€€€~€€€€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚~€‚€€€~‚€€€€‚€‚€€€€€€€€€€€€ƒ€}€ƒ‚~€‚€€€€€€€€€€€€€€€€€€€€€€€|}€‚€€ƒ‚}|}€„‚|y€†‚{z€ƒƒƒ‚~|€€}z}„€}€ƒ€|€‚‚€€‚‚€}}€‚€{y„…|ƒ…‚‚~{|€ƒ€€‚~}€……‚€€~z{~€‚€€€‚‚€€€€~~~€€€€‚‚€€~~€€€‚€€€€€€€€€€€~~€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€€€€€€~€„€€~|}„†|{‚ƒ€€}x~‰ˆ~x~ƒ„z†…~€€€€„€}}‚€€~…ƒ}€‚€~€€~~€€~€‚€€‚‚‚€ƒ~€€}}€‚‚€€€ƒ‚~~‚€}~ˆ’€ag‰›Œwt‚‹€w€‰„zx‚€~}~ƒ…z}…†‚~}€€€~}ƒ‚~„€}€€€€€‚‚~‚„€||€ƒ‚€€€‚‚~|~€‚‚‚€~~€€€€€€€~€€€‚€€€€~€€€€€€€€€€€€€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€‚€€€€€‚‚€~€€€€~€€€€‚~€€€€€€€‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€}‚~€€~‚€|~ƒ…€~€ƒƒ€}‚‚}€€€€€‚€€€€€€€€~}€‚€€€‚{w…†€{…„ƒ€€}}€€}~ƒ‚€€‚‚€~€€€~€€€‚€€‚€~~€€€€€€‚€€€‚}‚ƒ|~„€}~ƒ…ƒ~zƒ‡}v~‚qwŽyw…€}€€€‚€€€~}‚‰y{ƒ…€€~~‚…|ƒ€}€„…‚v}‹’™‡\.dÔÕx5g¥™sj‚ˆˆy^p›£„hh{ˆ‹‡ypz…Šˆˆ~jn…–ˆuvƒ‡ƒzw~‡Š‚~€†‡ƒ}|€‚‡‚yw~†‰‚ƒ‚|z~†ˆ{z}~~€€{€‰†€€€}|€€€€ƒ„~z}€€ƒ€}€€‚€€€}{~~}‚„€~€€€€€€~€‚„ƒ‚‚€~€‚ƒ€€~~€€€ƒƒ€€€€€€€€€€€€€€€€€€‚€€€€€€€€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚€€€€€€€€€€€€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ƒ|~‚ƒ~~€ƒ~€‚}€ƒ‚~}ƒ€}~€‚~}‚„€|‚€~€€€€‚€~€€€‚}€ƒ‚}{€†ƒ}|„€}€€€€€€€€€€€‚€€€€€€€€€€€€€€€€€‚€€€€€~€‚€€€~€€~}„€z~„„|‚~€€€€~€‚‚~}}€ƒ€€€€€†‚€{z€ƒŠ„zt{‰‡€€€{{„ˆ€zy‚„{|‚ƒ€€‚‚}‚€~}€ƒƒ€€‚„ƒ}|€ƒƒ€€€€}€…ƒ~~‚…‚|ƒ€ƒ€}}€‚€}~ƒ…‚~ƒ‚€€€€€€}~€€€€€€€€€€€€€€€€€€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€|ƒ„‚|z€„„€}€ƒ€~‚ƒ€}~€€€€€€}€ƒƒ€~~€ƒƒ}€‚‚~~€‚ƒ€~~€€€~€~€€€€€€€€€€€€€€€€€€~€‚~€‚€}€€|…ˆ…‡†qRn¯¿|LlŽ”ƒux~}ƒ…tv‚Œ…wx|{€…{€‚ˆ‚qnƒ‘Š}vy~„„~{€ƒ„†ˆ…‚€€‚~…„€}‚…„€€~~€ƒ„~|}}~€€€‚ƒƒ‚€}}€€€€€ƒ€~€‚€€€~ƒ€€€|}~~€‚‚€€€€~€€~€€€€€‚ƒ€~€€€€‚‚€€€€~~€€€€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€€€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€}~ƒ†€w~…‡€y…‚~~€ƒ„~{~}ƒ†„€€w~€‡yw{}Œ‰{€v~ƒ†ƒƒ}~|}€€„ƒyw€€ƒ†ƒ€|y|€‚|{ƒ€€ƒ‚€€€€€€€~~}|€ƒ‚ƒ€€‚ƒƒ‚|}€€€€€€‚€€€€€€€€€€€€€~‚‚€€€€€€€€€€€€€€€€€€~~€€€ƒ€€€€€€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€€€€€€€€}|„{}ƒ‚€€€}~~}‚„€}‚„€~€€€~}€€€~€‚€‡]Ît^Z`“”…—‰h]‡’‘}hhm‰’†vu„‡€‚€|~‚„~{|{„‹tz‰Ž‰…uv~†…{w~ˆ‰ƒ€„ƒ‚€€€|{€€~~ƒ‹Ž…{y€†„}€€~{y}‚€‚€€€}}€€|x|‚„‚{‚ƒ‚ƒ€|~~{}€€‚‚€€€€‚„€€‚†‡~€}}€‚ƒ€~€€€€€€€}~€‚}€€€‚‚„ƒ€}‚„ƒ€€~~ƒ‚€‚‚‚€€€€€€}~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€€€~€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€€€€‚€€€€€€€€€€€€€€€€€€€€€€~|~€€„†ƒ|z€ƒ€{€‚z|€†‰}z‚…€}‡‚{{€ƒ|€€‚ƒ‚~}‚}|ƒ‚€€€…}w}…ˆ€y€ƒ~€€‚……ƒ€€€}}~}}€€€ƒ‚‚€€€€€€€€€€€€€‚€€€€€€‚€~~€€€€€€~€€€€€€€€€€€€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~ƒ€}€€ƒ~Œ€v{kb›ãz,—•zmf¢…{Pu’¡~tt†“u~……‚ls€™|z€‹vm‰0‘ȉÁ#µäˆ?†¢~nKЧ›šEFŽžŒp•„€yy‚…™ž~gcr„•“yr|ˆ‰kfƒ› ‚kŠ~‚•Š~zwŒ€lr€‡‚…‚}‰•Žyt„‹€su€ˆ‡{vs|ˆŠ~‚Љƒ}{ƒ‚ur}…„…‡~pv€€z€Š…ƒ€|}}~vv€…~v|…Šˆ‚|€€}|…~~{~ˆ†„ˆ‚y~€ˆ‡ƒƒ|y|…‚y€Œ}ƒƒˆy~‚†€€€‚„†‚{„„}€€~}}€‚€€~}‚€‚|z‚…€~yz„†|ƒƒy{€€…‚}€‚}~€{|„‚~€€~€‚‚€|‚ƒ€€€‚‚~~€€€€€€€€€€}€€‚ƒ€~|€€€‚ƒƒ€~}€€€€€€ƒ€€€€€€‚‚€}~ƒ~†„€€€€€€€€€€€€€€€~€€€€~~€€€€€€€€€~€~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€}|ƒ‰€x{†…~}}„}‚€~~‰u€yqŽ’ek¤bt‰z€Žƒt‚’Žu^ƒœxeo‰™sŽ’xn{ƒ{s}’€Œ„sv„€y€‡†zw€€||€‰†v|”“{q{‚€ƒ€€y~Œ…€€ˆ‰}xy€~x~‚„†ƒx|†ƒ‡‡~x€†€y{}~„…~€†ƒ€|{ƒƒ~~|{€„„…‚€€~~}~€~‚…‚~~~{{}€€ƒƒ‚‚}}}…‚€€€€}~€€~|~„…ƒ€€‚‚€~~€€€€€€€€€‚ƒ‚€€€€€€€€€€€€€€€‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€PythonCard-0.8.2/samples/jabberChat/jabberChat.ini0000644000076500007650000000017707567475556021770 0ustar alexalex00000000000000[Account] server = jabber.org username = username password = password resource = default [Options] playsound = 1 idletime = 5 PythonCard-0.8.2/samples/jabberChat/jabberChat.py0000644000076500007650000002722610347526323021620 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.34 $" __date__ = "$Date: 2005/12/13 11:13:23 $" """ from PythonCard import configuration, model, sound, timer import threading import Queue import ConfigParser import wx import os import jabber import time import shutil from chatWindow import ChatWindow from groupChatWindow import GroupChatWindow from connection import JabberConnection import conferenceDialog CONFIG_FILE = 'jabberChat.ini' class Chat(model.Background): def on_initialize(self, event): self.initSizers() self.loadConfig() self.displayOfflineUsers = 0 self.roster = {} self.chatWindows = {} self.msgQueue = Queue.Queue() self.rosterQueue = Queue.Queue() self.jabberConnection = JabberConnection(self, self.account) self.thread = threading.Thread(target = self.jabberConnection.spinMyWheels) self.thread.setDaemon(1) self.thread.start() self.idleTimer = timer.Timer(self.components.listRoster, -1) self.idleTimer.start(1000) # 1 second self.doResetIdle() # the Available and Do Not Disturb strings # should probably be settable as resource strings # the connection module references them as menu item labels # when the user starts the program, just default to Available self.statusBar.text = "Available" def initSizers(self): sizer1 = wx.BoxSizer(wx.VERTICAL) sizer1.Add(self.components.listRoster, 1, wx.EXPAND) sizer1.Fit(self) sizer1.SetSizeHints(self) self.panel.SetSizer(sizer1) self.panel.SetAutoLayout(1) self.panel.Layout() def setChatWindowFont(self): for win in self.chatWindows.itervalues(): win.setFonts(self.config['font']) def on_doSetFont_command(self, event): result = dialog.fontDialog(self, self.components.fldDocument.font) if result.accepted: self.config['font'] = result.font self.setChatWindowFont() def loadConfig(self): self.configPath = os.path.join(configuration.homedir, 'jabberchat') if not os.path.exists(self.configPath): os.mkdir(self.configPath) basePath = self.application.applicationDirectory configPath = os.path.join(self.configPath, CONFIG_FILE) if not os.path.exists(configPath): shutil.copy2(os.path.join(basePath, CONFIG_FILE), configPath) namesPath = os.path.join(self.configPath, 'names.txt') if not os.path.exists(namesPath): shutil.copy2(os.path.join(basePath, 'names.txt'), namesPath) parser = ConfigParser.ConfigParser() parser.read(configPath) self.account = {} self.account['server'] = parser.get('Account', 'server') self.account['username'] = parser.get('Account', 'username') self.account['password'] = parser.get('Account', 'password') self.account['resource'] = parser.get('Account', 'resource') self.config = {} # this needs to be made safe instead of using eval try: self.config['font'] = eval(parser.get('ChatWindow', 'font', None)) except (ConfigParser.NoSectionError, ConfigParser.NoOptionError): self.config['font'] = None try: self.config['playsound'] = eval(parser.get('Options', 'playsound')) except (ConfigParser.NoSectionError, ConfigParser.NoOptionError): self.config['playsound'] = 0 try: self.config['idletime'] = eval(parser.get('Options', 'idletime')) * 60 except (ConfigParser.NoSectionError, ConfigParser.NoOptionError): self.config['idletime'] = 0 self.displayNames = {} try: f = open(namesPath) data = f.readlines() f.close() for line in data: jid, name = line.rstrip().split(',') self.displayNames[jid] = name except IOError: pass # when user selects "Available" # we need to reset def doResetIdle(self): self.checkForIdle = 1 self.userIsIdle = 0 self.startIdle = time.time() self.lastPosition = wx.GetMousePosition() def on_idle(self, event): # handle incoming Jabber messages if not self.msgQueue.empty(): msg = self.msgQueue.get() self.doDisplayMsgReceived(msg) event.RequestMore() # handle roster changes if not self.rosterQueue.empty(): jid, roster = self.rosterQueue.get() if jid is None: self.updateRosterDisplay(roster) else: self.updateGroupChatRosterDisplay(jid, roster) event.RequestMore() # KEA 2002-11-17 # updates to how the roster displays # I would like to move this into a MultiColumnList # with icons for online/offline... # 2002-11-30 # moved from JabberConnection class # I'm still not sure that thread conflicts won't occur # but this at least seems safer # one thing that probably still needs to be added is a way # of always using the same display order def updateRosterDisplay(self, roster): items = [] # use this instead of displayed list since the # display may have a name or jid and the roster # itself is a dictionary that doesn't match one to one # with self._parent.components.listRoster.items self.displayedRosterList = [] # KEA 2003-06-04 # roster dictionary might change in size # due to other thread, so make a list of keys rosterList = roster.keys() for key in rosterList: status = roster[key][0] show = roster[key][1] if show: show = " (%s)" % roster[key][1] else: show = '' name = self.displayNames.get(key, key) if status == 'online': items.append('* ' + name + show) self.displayedRosterList.append(key) elif self.displayOfflineUsers: items.append(' ' + name) self.displayedRosterList.append(key) self.components.listRoster.items = items self.roster = roster def updateGroupChatRosterDisplay(self, jid, roster): listRoster = self.chatWindows[jid].components.listRoster items = [] for key in roster: status = roster[key][0] if status: items.append("%s (%s)" % (key, str(status))) else: items.append(key) items.sort() listRoster.items = items def on_listRoster_timer(self, event): # check for user idle if user is currently Available # but don't bother if Do Not Disturb... are set instead if self.checkForIdle and (self.config['idletime'] != 0): position = wx.GetMousePosition() if position == self.lastPosition: if self.userIsIdle == 0: # check whether we've been idle too long if (time.time() - self.startIdle) > self.config['idletime']: self.userIsIdle = 1 self.jabberConnection.sendPresence("Idle") self.statusBar.text = "Idle" #print "***user is idle***" else: if self.userIsIdle: #print "***user is no longer idle" #print "there was no activity for", round((time.time() - self.startIdle) / 60), "minutes" self.userIsIdle = 0 self.jabberConnection.sendPresence("Available") self.statusBar.text = "Available" self.startIdle = time.time() self.lastPosition = position def createChatWindow(self, jid): # the jid should be in the form of username@domain win = model.childWindow(self, ChatWindow) win.setFonts(self.config['font']) # override resource position #win.SetPosition((425, -1)) # just in case, convert to string, will this clear up Unicode issues? jid = str(jid) toName = self.displayNames.get(jid, jid) win.setToJID(jid, toName) win.visible = True self.chatWindows[jid] = win def createGroupChatWindow(self, jid, nickname=None): # the jid should be in the form of username@domain win = model.childWindow(self, GroupChatWindow) win.setFonts(self.config['font']) # override resource position #win.SetPosition((425, -1)) # just in case, convert to string, will this clear up Unicode issues? jid = str(jid) toName = self.displayNames.get(jid, jid) if nickname is None: nickname = self.jabberConnection.username win.nickname = nickname win.setToJID(jid, toName) win.visible = True self.chatWindows[jid] = win self.jabberConnection.joinGroupChat(jid, nickname) def playIncomingSound(self): if self.config['playsound']: try: filename = os.path.join(self.application.applicationDirectory, 'incoming.wav') snd = sound.Sound(filename) snd.play(1, 0) except IOError: pass def doDisplayMsgReceived(self, data): if data is not None: jid, txt = data jid = str(jid) try: jid, resource = jid.split('/') except ValueError: resource = "default" if jid not in self.chatWindows: self.createChatWindow(jid) self.playIncomingSound() #self.components.fldTranscript.appendText(data + '\n') self.chatWindows[jid].appendMessage(jid + "/" + resource, txt) else: pass # this code is dependent on the format # of the text in the list # so a change to the updateRosterDisplay # method in the connection module must be # reflected here until the jids are stored # outside the list def on_listRoster_mouseDoubleClick(self, event): jid = self.displayedRosterList[event.target.selection] if jid not in self.chatWindows: self.createChatWindow(jid) else: self.chatWindows[jid].visible = True # make sure the chat window is in front # and isn't minimized (iconized) if self.chatWindows[jid].IsIconized(): self.chatWindows[jid].Iconize(0) wx.CallAfter(self.chatWindows[jid].Raise) def on_close(self, event): self.jabberConnection.keepRunning = 0 self.jabberConnection.disconnect() self.idleTimer.stop() event.skip() def on_changeStatus_command(self, event): self.jabberConnection.sendPresence(event.target.label) self.statusBar.text = event.target.label if event.target.label == "Available": self.doResetIdle() else: self.checkForIdle = 0 def on_menuOptionsDisplayOfflineUsers_select(self, event): self.displayOfflineUsers = event.IsChecked() self.updateRosterDisplay(self.roster) def on_menuFileJoinConference_select(self, event): room = '' server = None nickname = self.jabberConnection.username result = conferenceDialog.conferenceDialog(self, '', server, nickname) if result.accepted: room = result.room server = result.server nickname = result.nickname jid = room + '@' + server self.createGroupChatWindow(jid, nickname) if __name__ == '__main__': app = model.Application(Chat) app.MainLoop() PythonCard-0.8.2/samples/jabberChat/jabberChat.rsrc.py0000644000076500007650000001071410130317154022550 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'jabberChat', 'backgrounds': [ {'type':'Background', 'name':'bgMin', 'title':'jabberChat PythonCard Application', 'size':(200, 150), 'statusBar':1, 'style':['resizeable'], 'menubar': {'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'menuFile', 'label':'File', 'items': [ {'type':'MenuItem', 'name':'menuFileJoinConference', 'label':'Join Conference...', }, {'type':'MenuItem', 'name':'menuFileSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit', }, ] }, {'type':'Menu', 'name':'menuStatus', 'label':'Presence', 'items': [ {'type':'MenuItem', 'name':'menuStatusAvailable', 'label':'Available', 'command':'changeStatus', }, {'type':'MenuItem', 'name':'menuStatusSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuStatusDoNotDisturb', 'label':'Do Not Disturb', 'command':'changeStatus', }, {'type':'MenuItem', 'name':'menuStatusSep2', 'label':'-', }, {'type':'MenuItem', 'name':'menuStatusAway', 'label':'Away', 'command':'changeStatus', }, {'type':'MenuItem', 'name':'menuStatusBeRightBack', 'label':'Be Right Back', 'command':'changeStatus', }, {'type':'MenuItem', 'name':'menuStatusBusy', 'label':'Busy', 'command':'changeStatus', }, {'type':'MenuItem', 'name':'menuStatusNotAtHome', 'label':'Not At Home', 'command':'changeStatus', }, {'type':'MenuItem', 'name':'menuStatusNotAtMyDesk', 'label':'Not At My Desk', 'command':'changeStatus', }, {'type':'MenuItem', 'name':'menuStatusNotInTheOffice', 'label':'Not In The Office', 'command':'changeStatus', }, {'type':'MenuItem', 'name':'menuStatusOnThePhone', 'label':'On The Phone', 'command':'changeStatus', }, {'type':'MenuItem', 'name':'menuStatusOutToLunch', 'label':'Out To Lunch', 'command':'changeStatus', }, {'type':'MenuItem', 'name':'menuStatusSteppedOut', 'label':'Stepped Out', 'command':'changeStatus', }, ] }, {'type':'Menu', 'name':'menuOptions', 'label':'Options', 'items': [ {'type':'MenuItem', 'name':'menuOptionsShowWindow', 'label':'Show Incoming Message Window', 'checkable':1, 'checked':1, }, {'type':'MenuItem', 'name':'menuOptionsRaiseWindow', 'label':'Raise Incoming Message Window', 'checkable':1, }, {'type':'MenuItem', 'name':'menuOptionsDisplayOfflineUsers', 'label':'Display Offline Users', 'checkable':1, }, ] }, ] }, 'components': [ {'type':'List', 'name':'listRoster', 'position':(0, 0), 'size':(250, 150), 'items':[], }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/samples/jabberChat/names.txt0000644000076500007650000000003507602437711021054 0ustar alexalex00000000000000altis@jabber.org,Kevin Altis PythonCard-0.8.2/samples/jabberChat/readme.txt0000644000076500007650000000437007602437711021214 0ustar alexalex00000000000000This is a very simple Jabber client. I combined some of the capabilities of the command-line jabberpy example client and the PythonCard chat sample. The current version of jabberChat can only send and receive messages. It doesn't implement the entire Jabber protocol, but it does use Queue so that there isn't a conflict between the jabberpy callback handlers and the GUI event loop. I'm checking this code in with hopes that someone else will make the app more complete. You'll need the jabberpy package. http://sourceforge.net/projects/jabberpy In particular, you'll want the latest versions of the jabber.py and xmlstream.py files from cvs http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jabberpy/jabberpy/ Those files should be placed somewhere on your PYTHONPATH. If you don't already have one, you should get a more full-featured Jabber client from http://www.jabbercentral.org/clients/ so that you can setup your account, subscriptions, and test sending and receiving messages. You should be able to use any Jabber server account, not just jabber.org. For a list of public servers and the gateways (AOL, MSN, Yahoo, ICQ) they support, see: http://www.jabber.org/user/publicservers.php Further Jabber information can be found at: http://www.jabber.org/ You can set the font used by the chat windows and also whether to play a sound for an incoming message by changing the jabberChat.ini file with something like this: [ChatWindow] font = {'faceName': 'Arial', 'family': 'sansSerif', 'size': 10} [Options] playsound = 1 The sound played is called incoming.wav and you can use another sound file as long as you rename it to incoming.wav. The idle timeout is also under the [Options] config heading [Options] idletime = 5 The default timeout is for 5 minutes, but it can be turned off by setting idletime = 0. There will eventually be menu items and an options dialog for controlling the various .ini file options. I added some basic support for nicknames or full names, whatever you want to use. I eventually would like to support vCards or some other standard format for the contacts. For now, you can create a names.txt file that contains lines of the format: jid,Name such as: altis@jabber.org,Kevin Altis The name will be used in the roster list and chat windows. PythonCard-0.8.2/samples/life/0000755000076500007650000000000010434046771016103 5ustar alexalex00000000000000PythonCard-0.8.2/samples/life/lexicon.py0000644000076500007650000001153410347526323020121 0ustar alexalex00000000000000#!/usr/bin/python """ A fairly simple implementation of Conway's Game of Life. """ __version__ = "$Revision: 1.19 $" __date__ = "$Date: 2005/12/13 11:13:23 $" from PythonCard import model, util import wx import os from util import readLifeFile, translateClipboardPattern """ :101: (p5) Found by Achim Flammenkamp in August 1994. The name was suggested by Bill Gosper, noting that the phase shown below displays the period in binary. ....**......**.... ...*.*......*.*... ...*..........*... **.*..........*.** **.*.*..**..*.*.** ...*.*.*..*.*.*... ...*.*.*..*.*.*... **.*.*..**..*.*.** **.*..........*.** ...*..........*... ...*.*......*.*... ....**......**.... """ def readLexiconFile(path): try: fp = open(path) data = fp.readlines() fp.close() except IOError: return None lexicon = {} # first collect the header # up to the first row of # ------ # then collect the definitions and patterns # and finally the bibliography after # the second row of # ----- inIntroduction = 1 inBibliography = 0 bibliography = '' introduction = '' term = '' for line in data: stripped = line.strip() if inIntroduction: if line.startswith('-----'): inIntroduction = 0 else: introduction += line elif inBibliography: bibliography += line else: if line.startswith('-----'): inBibliography = 1 else: # collecting an entry if stripped == '': continue elif stripped.startswith(':'): # start of new term if term != '': lexicon[term] = (description, pattern) offset = stripped.find(':', 1) term = stripped[1:offset] description = stripped[offset + 1:].lstrip() #crud, term, description = stripped.split(':') pattern = '' elif stripped.startswith('.') or stripped.startswith('*'): pattern += stripped + '\n' else: if line.startswith(' '): description += '\n\n' + stripped else: description += '\n' + stripped if term != '': lexicon[term] = (description, pattern) lexicon['INTRODUCTION'] = (introduction, '') lexicon['BIBLIOGRAPHY'] = (bibliography, '') #print len(lexicon) return lexicon class Lexicon(model.Background): def on_initialize(self, event): #self.initSizers() self.components.fldDescription.lineNumbersVisible = False self.components.fldDescription.setEditorStyle('text') self.lexiconPath = self.getParent().lexiconPath self.populatePatternsList() def populatePatternsList(self): self.lexicon = readLexiconFile(self.lexiconPath) if self.lexicon is None: self.getParent().menuBar.setEnabled('menuAutomataLexicon', False) self.visible = False else: items = self.lexicon.keys() items = util.caseinsensitive_sort(items) self.components.lstPatterns.items = items self.components.lstPatterns.selection = 0 # now simulate the user doing a selection self.on_lstPatterns_select(None) self.getParent().menuBar.setEnabled('menuAutomataLexicon', True) self.visible = True def loadPattern(self, name): #filename = name + '.lif' #path = os.path.join(self.application.applicationDirectory, 'patterns', filename) description, patternString = self.lexicon[name] if patternString != '': crud, patterns, topLeft, size = translateClipboardPattern(patternString) #print "topLeft:", topLeft, "size", size self.getParent().initAndPlacePatterns(patterns, topLeft, size) def on_lstPatterns_select(self, event): name = self.components.lstPatterns.stringSelection description, patternString = self.lexicon[name] if patternString == '': self.components.fldDescription.text = description self.components.stcSize.text = "" else: crud, patterns, topLeft, size = translateClipboardPattern(patternString) self.components.fldDescription.text = description + "\n\n" + patternString self.components.stcSize.text = "Size: (%d, %d)" % size def on_btnLoad_mouseClick(self, event): self.loadPattern(self.components.lstPatterns.stringSelection) def on_lstPatterns_mouseDoubleClick(self, event): self.loadPattern(self.components.lstPatterns.stringSelection) def on_close(self, event): self.visible = False PythonCard-0.8.2/samples/life/lexicon.rsrc.py0000644000076500007650000000134210047606330021057 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'Lexicon', 'backgrounds': [ {'type':'Background', 'name':'bgLexicon', 'title':'Lexicon', 'size':(466, 270), 'components': [ {'type':'Button', 'name':'btnLoad', 'position':(376, 196), 'label':'Load', }, {'type':'StaticText', 'name':'stcSize', 'position':(157, 200), 'text':'Size:', }, {'type':'CodeEditor', 'name':'fldDescription', 'position':(155, 0), 'size':(300, 191), 'editable':0, }, {'type':'List', 'name':'lstPatterns', 'position':(0, 0), 'size':(150, 221), 'items':[], }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/samples/life/life.py0000644000076500007650000004122510365511327017375 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.49 $" __date__ = "$Date: 2006/01/24 20:49:27 $" """ try: import psyco psyco.full() except ImportError: pass import os, sys import shutil import wx import util as lifeutil from PythonCard import clipboard, configuration, dialog, graphic, model, util from patterns import Patterns from lexicon import Lexicon class Life(model.Background): def on_initialize(self, event): self.createConfigDir() self.filename = None self.grid = None self.toggleToLife = 1 self.resizing = False # used to protect against # mouseClick after file dialog self.openingFileDialog = False scale = self.getScaleFromMenu() if scale: self.setCanvasAttributes(self.getScaleFromMenu()) else: self.menuBar.setChecked('menuScale5') self.setCanvasAttributes(5) self.initSizers() self.lexiconWindow = model.childWindow(self, Lexicon) self.lexiconWindow.position = (650, 25) self.patternsWindow = model.childWindow(self, Patterns) self.patternsWindow.position = (650, 300) def initSizers(self): sizer1 = wx.BoxSizer(wx.VERTICAL) sizer2 = wx.BoxSizer(wx.HORIZONTAL) comp = self.components flags = wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.ALIGN_BOTTOM sizer2.Add(comp.btnStart, 0, flags, 5) sizer2.Add(comp.btnStop, 0, flags, 5) sizer2.Add(comp.btnStep, 0, flags, 5) sizer1.Add(sizer2, 0, flags, 5) sizer1.Add(comp.bufOff, 1, wx.EXPAND) sizer1.Fit(self) sizer1.SetSizeHints(self) self.sizer = sizer1 self.panel.SetSizer(sizer1) self.panel.SetAutoLayout(1) self.panel.Layout() def createConfigDir(self): self.configPath = os.path.join(configuration.homedir, 'life') if not os.path.exists(self.configPath): os.mkdir(self.configPath) basePath = self.application.applicationDirectory self.lexiconPath = os.path.join(self.configPath, 'lexicon.txt') if not os.path.exists(self.lexiconPath) and os.path.exists(os.path.join(basePath, 'lexicon.txt')): shutil.copy2(os.path.join(basePath, 'lexicon.txt'), self.lexiconPath) else: # currently lexicon.txt is not part of the distribution # but it might be in the future pass self.patternsPath = os.path.join(self.configPath, 'patterns') if not os.path.exists(self.patternsPath): os.mkdir(self.patternsPath) basePath = os.path.join(basePath, 'patterns') for name in os.listdir(basePath): if name.lower().endswith('.lif') and not os.path.exists(os.path.join(self.patternsPath, name)): shutil.copy2(os.path.join(basePath, name), os.path.join(self.patternsPath, name)) def initGrid(self): # a populated grid has (x, y) tuples for keys # with 1 (alive) or 0 (dead) for the value of each key self.grid = {} self.generation = 0 def recenterCells(self, oldCenter): diffX = self.center[0] - oldCenter[0] diffY = self.center[1] - oldCenter[1] grid = {} #print "self.center", self.center, "oldCenter", oldCenter for cell in self.grid: grid[(cell[0] + diffX, cell[1] + diffY)] = self.grid[cell] self.grid = grid def setCanvasAttributes(self, scale): # whenever the window size or scale changes # this needs to be called canvas = self.components.bufOff color = 'blue' canvas.fillColor = color canvas.foregroundColor = color if self.grid is None or scale != self.scale or canvas.size != (self.width, self.height): self.scale = scale # have to resize the grid # setting self.spacing to 0 will mean # that the blocks have no space between them if self.scale < 3: self.spacing = 0 else: self.spacing = 1 if self.grid is not None: oldCenter = self.center oldSize = self.size self.width, self.height = canvas.size self.width = self.width / self.scale self.height = self.height / self.scale self.universeSize = (self.width, self.height) self.center = (self.width / 2, self.height / 2) if self.grid is None: self.initGrid() else: #self.initGrid() # attempt to preserve the existing pattern self.recenterCells(oldCenter) #print "self.universeSize:", self.universeSize, "self.center:", self.center, "self.scale:", self.scale #print "Universe Size: (%d, %d) Scale: %d" % (self.universeSize[0], self.universeSize[1], self.scale) def doRunLife(self, steps=-1): while self.keepDrawing and steps != 0: grid = self.grid newgrid = {} for cell in grid: sum = 0 #neighbors = lifeutil.neighborsTuple(cell[0], cell[1]) # it is a bit faster to inline this rather than # calling a function col, row = cell prevRow = row - 1 nextRow = row + 1 prevCol = col - 1 nextCol = col + 1 neighbors = ((prevCol, prevRow), (col, prevRow), (nextCol, prevRow), (prevCol, row), (nextCol, row), (prevCol, nextRow), (col, nextRow), (nextCol, nextRow)) # I tried a version where the dictionary kept a copy of the neighbors tuple # but the overhead in storing the data seemed to outweigh the cost # of calculating the neighbors and made this about 50% slower # also using get() with a default appears to be about 20-25% faster # than using a try/except block style access of sum += grid[neighbor] for neighbor in neighbors: sum += grid.get(neighbor, 0) #print "cell", cell, grid[cell] #print neighbors #print sum if sum == 3 or (grid[cell] and sum == 2): # cell will be alive next generation newgrid[cell] = 1 for neighbor in neighbors: newgrid.setdefault(neighbor, 0) self.generation += 1 steps -= 1 self.grid = newgrid self.displayGeneration() wx.SafeYield(self) def displayGeneration(self): canvas = self.components.bufOff width = self.scale - self.spacing canvas.autoRefresh = False canvas.clear() grid = self.grid # uncomment to see the size of the dictionary (hash) # a blinker (3 live cells in a row) will have a 15 total cells # in the dictionary for the 3 cells and the 12 surrounding neighbors #print "len(grid)", len(grid) population = 0 # very small optimization # but it avoids an if statement for every iteration if width == 1: points = [] for cell in grid: if grid[cell]: population += 1 points.append(cell) canvas.drawPointList(points) else: rects = [] scale = self.scale for cell in grid: if grid[cell]: population += 1 rects.append((cell[0] * scale, cell[1] * scale, width, width)) #canvas.drawRectangle(cell[0] * scale, cell[1] * scale, width, width) canvas.drawRectangleList(rects) canvas.refresh(True) self.statusBar.text = "Generation: %d Population: %d" % (self.generation, population) def cellAlive(self, position): col = position[0] / self.scale row = position[1] / self.scale return self.grid.get((col, row), 0) def setCell(self, col, row, alive): self.grid[(col, row)] = alive if alive: # make sure neighbors are in grid for neighbor in lifeutil.neighborsTuple(col, row): self.grid.setdefault(neighbor, 0) def toggleCell(self, position): x, y = position scale = self.scale cellWidth = scale - self.spacing row = y / scale col = x / scale alive = self.grid.get((col, row), 0) #print x, y, col, row, scale, alive if alive == self.toggleToLife: # no need to toggle return self.setCell(col, row, self.toggleToLife) y1 = row * scale x1 = col * scale canvas = self.components.bufOff if not self.toggleToLife: # need to erase a cell oldColor = canvas.foregroundColor canvas.foregroundColor = canvas.backgroundColor canvas.fillColor = canvas.backgroundColor if cellWidth == 1: canvas.drawPoint((x1, y1)) else: canvas.drawRectangle((x1, y1), (cellWidth, cellWidth)) if not self.toggleToLife: # need to restore the colors canvas.foregroundColor = oldColor canvas.fillColor = oldColor def on_bufOff_mouseDown(self, event): if self.openingFileDialog: return self.toggleToLife = not self.cellAlive(event.position) self.toggleCell(event.position) def on_bufOff_mouseDrag(self, event): if self.openingFileDialog: return self.toggleCell(event.position) def on_btnStart_mouseClick(self, event): self.components.btnStart.enabled = False self.components.btnStep.enabled = False self.keepDrawing = True startTime = util.time() self.doRunLife() print "Draw time: %f" % (util.time() - startTime) def on_btnStop_mouseClick(self, event): self.keepDrawing = False self.components.btnStart.enabled = True self.components.btnStep.enabled = True def on_btnStep_mouseClick(self, event): self.keepDrawing = True self.doRunLife(1) def initAndPlacePatterns(self, patterns, topLeft, size): width, height = size # at some point there might be an option to # not clear the current grid/universe # so that patterns can be placed, moved, and rotated # without disturbing existing patterns self.initGrid() centerX, centerY = self.center # if the pattern will fit within the current grid # it may still need to be shifted in order to be # centered correctly # this is my first attempt to shift the patterns # it isn't quite right so it is best to have at least a few # blank rows and columns of padding on each side if possible # until this algorithm is corrected left, top = topLeft if (left + width) > (width / 2): # need to shift the pattern left xDiff = (width / 2) + left elif (left + (width / 2)) < 0: xDiff = ((width / 2) + left) else: xDiff = 0 if (top + height) > (height / 2): yDiff = (height / 2) + top elif (top + (height / 2)) < 0: yDiff = ((height / 2) + top) else: yDiff = 0 #print "topLeft", topLeft, "xDiff, yDiff", xDiff, yDiff for pattern in patterns: x, y = pattern['position'] column = centerX + x - xDiff row = centerY + y - yDiff self.grid = lifeutil.placePattern(self.grid, column, row, pattern['rows']) self.displayGeneration() def openFile(self): self.openingFileDialog = 1 wildcard = "Life files (*.lif)|*.lif;*.LIF" directory = os.path.join(self.application.applicationDirectory, 'patterns') result = dialog.openFileDialog(None, "Import which file?", directory, '', wildcard) if result.accepted: path = result.paths[0] os.chdir(os.path.dirname(path)) self.filename = path description, patterns, topLeft, size = lifeutil.readLifeFile(path) print description print "topLeft:", topLeft, "size", size self.initAndPlacePatterns(patterns, topLeft, size) def on_menuFileOpen_select(self, event): self.openFile() def on_menuFileSaveAs_select(self, event): if self.filename is None: path = '' filename = '' else: path, filename = os.path.split(self.filename) wildcard = "All files (*.*)|*.*" result = dialog.saveFileDialog(None, "Save As", path, filename, wildcard) if result.accepted: path = result.paths[0] fileType = graphic.bitmapType(path) print fileType, path try: bmp = self.components.bufOff.getBitmap() bmp.SaveFile(path, fileType) return True except IOError: return False else: return False def on_menuEditCopy_select(self, event): clipboard.setClipboard(self.components.bufOff.getBitmap()) # assumes the clipboard contains a valid # text pattern like you would find in the lifep glossary.doc # # acorn # .*..... # ...*... # **..*** def on_menuEditPaste_select(self, event): data = clipboard.getClipboard() if isinstance(data, str): description, patterns, topLeft, size = lifeutil.translateClipboardPattern(data) print description print "topLeft:", topLeft, "size", size self.initAndPlacePatterns(patterns, topLeft, size) def on_editClear_command(self, event): #self.components.bufOff.clear() self.initGrid() self.displayGeneration() def on_close(self, event): self.keepDrawing = False event.skip() # it would be nice to get the scales from the resource file # rather than hard coding them here # that should be possible by walking the resource or the Scale menu # looking for a prefix menu item name of 'menuScale' def getScaleFromMenu(self): for i in [1, 2, 3, 4, 5, 10]: if self.menuBar.getChecked('menuScale' + str(i)): return i def uncheckScaleMenuItems(self, scale): for i in [1, 2, 3, 4, 5, 10]: if i != scale: self.menuBar.setChecked('menuScale' + str(i), False) def on_setScale_command(self, event): scale = int(event.target.name[9:]) self.uncheckScaleMenuItems(scale) self.setCanvasAttributes(scale) self.displayGeneration() def on_doAutomata_command(self, event): automata = event.target.name if automata == 'menuAutomataLife': result = dialog.textEntryDialog(self, 'Steps (-1 means continuous):', 'Number of steps', '-1') if result.accepted: steps = int(result.text) self.keepDrawing = True startTime = util.time() self.doRunLife(steps) print "Draw time: %f" % (util.time() - startTime) def on_idle(self, event): # have to handle resizing during idle # because the sizer hasn't done the work yet # of resizing self.components.bufOff #print "idle", self.resizing, self.GetSize(), self.components.bufOff.size if self.resizing: self.setCanvasAttributes(self.scale) self.displayGeneration() self.resizing = False self.openingFileDialog = False def on_size(self, event): # user resized the window self.resizing = True #print "on_size" #self.setCanvasAttributes(self.scale) event.skip() def on_menuAutomataLexicon_select(self, event): self.lexiconWindow.visible = True def on_menuAutomataPatternsList_select(self, event): self.patternsWindow.visible = True def on_menuAutomataDownloadLexiconAndPatterns_select(self, event): cwd = os.getcwd() os.chdir(self.application.applicationDirectory) self.statusBar.text = 'Downloading Lexicon...' lifeutil.getLexicon(self.configPath) self.lexiconWindow.populatePatternsList() self.statusBar.text = 'Downloading Patterns...' lifeutil.getPatterns(self.configPath) self.patternsWindow.populatePatternsList() os.chdir(cwd) self.statusBar.text = 'Done' if __name__ == '__main__': app = model.Application(Life) app.MainLoop() PythonCard-0.8.2/samples/life/life.rsrc.py0000644000076500007650000001131310365511327020340 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'Life', 'backgrounds': [ {'type':'Background', 'name':'bgLife', 'title':'Life PythonCard Application', 'size':(310, 300), 'statusBar':1, 'style':['resizeable'], 'menubar': {'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ {'type':'MenuItem', 'name':'menuFileOpen', 'label':'&Open...\tCtrl+O', }, {'type':'MenuItem', 'name':'menuFileSaveAs', 'label':'Save &As...', 'enabled':0, }, {'type':'MenuItem', 'name':'fileSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit', }, ] }, {'type':'Menu', 'name':'menuEdit', 'label':'&Edit', 'items': [ {'type':'MenuItem', 'name':'menuEditCopy', 'label':'&Copy\tCtrl+C', }, {'type':'MenuItem', 'name':'menuEditPaste', 'label':'&Paste\tCtrl+V', }, {'type':'MenuItem', 'name':'editSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditClear', 'label':'&Clear', 'command':'editClear', }, ] }, {'type':'Menu', 'name':'menuAutomata', 'label':'&Automata', 'items': [ {'type':'MenuItem', 'name':'menuAutomataLife', 'label':"Conway's Life...", 'command':'doAutomata', }, {'type':'MenuItem', 'name':'menuAutomataLexicon', 'label':'Lexicon Window', }, {'type':'MenuItem', 'name':'menuAutomataPatternsList', 'label':'Patterns List Window', }, {'type':'MenuItem', 'name':'automataSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuAutomataDownloadLexiconAndPatterns', 'label':'Download Lexicon and Patterns', }, ] }, {'type':'Menu', 'name':'menuFile', 'label':'&Scale', 'items': [ {'type':'MenuItem', 'name':'menuScale1', 'label':'1', 'command':'setScale', 'checkable':1, }, {'type':'MenuItem', 'name':'menuScale2', 'label':'2', 'command':'setScale', 'checkable':1, }, {'type':'MenuItem', 'name':'menuScale3', 'label':'3', 'command':'setScale', 'checkable':1, }, {'type':'MenuItem', 'name':'menuScale4', 'label':'4', 'command':'setScale', 'checkable':1, }, {'type':'MenuItem', 'name':'menuScale5', 'label':'5', 'command':'setScale', 'checkable':1, 'checked':1, }, {'type':'MenuItem', 'name':'menuScale10', 'label':'10', 'command':'setScale', 'checkable':1, }, ] }, ] }, 'components': [ {'type':'Button', 'name':'btnStart', 'position':(0, 0), 'label':'Start', }, {'type':'Button', 'name':'btnStop', 'position':(100, 0), 'label':'Stop', }, {'type':'Button', 'name':'btnStep', 'position':(200, 0), 'label':'Step', }, {'type':'BitmapCanvas', 'name':'bufOff', 'position':(0, 30), 'size':(600, 400), 'backgroundColor':(255, 255, 255), }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/samples/life/patterns/0000755000076500007650000000000010434046771017743 5ustar alexalex00000000000000PythonCard-0.8.2/samples/life/patterns/ACORN.LIF0000644000076500007650000000021310042642556021133 0ustar alexalex00000000000000#Life 1.05 #D Acorn #D The most vigorously growing 7-cell #D "methuselah" pattern. See also RABBITS. #N #P -3 -1 .* ...* **..*** PythonCard-0.8.2/samples/life/patterns/RPENTO.LIF0000644000076500007650000000036510042642556021310 0ustar alexalex00000000000000#Life 1.05 #D r-pentomino #D A small, vigorous, common pattern. #D #D When the Game of Life was first #D introduced around 1970, this was #D proposed as the smallest pattern #D for which the outcome was unknown. #N #P 3 3 .** ** .* PythonCard-0.8.2/samples/life/patterns.py0000644000076500007650000000503010347526323020312 0ustar alexalex00000000000000#!/usr/bin/python """ _A fairly simple implementation of Conway's Game of Life. """ _version__ = "$Revision: 1.18 $" __date__ = "$Date: 2005/12/13 11:13:23 $" from PythonCard import model import wx import os import glob from util import readLifeFile class Patterns(model.Background): def on_initialize(self, event): #self.initSizers() self.components.fldDescription.lineNumbersVisible = 0 self.components.fldDescription.setEditorStyle('text') self.patternsPath = self.getParent().patternsPath self.populatePatternsList() def initSizers(self): self.html = self.components.html self.html.SetRelatedFrame(self, "HTML Preview: %s") self.html.SetRelatedStatusBar(0) sizer1 = wx.BoxSizer(wx.VERTICAL) sizer1.Add(self.html, 1, wx.EXPAND) sizer1.Fit(self) sizer1.SetSizeHints(self) self.panel.SetSizer(sizer1) self.panel.SetAutoLayout(1) self.panel.Layout() def populatePatternsList(self): files = glob.glob(os.path.join(self.patternsPath, '*.[Ll][Ii][Ff]')) items = [] self.files = {} for file in files: filename = os.path.basename(file) base, ext = os.path.splitext(filename.lower()) #items.append(base) self.files[base] = file items = self.files.keys() items.sort() self.components.lstPatterns.items = items self.components.lstPatterns.selection = 0 # now simulate the user doing a selection self.on_lstPatterns_select(None) def loadPattern(self, name): path = self.files[name] #print num, path description, patterns, topLeft, size = readLifeFile(path) #print "topLeft:", topLeft, "size", size self.GetParent().initAndPlacePatterns(patterns, topLeft, size) def on_lstPatterns_select(self, event): path = self.files[self.components.lstPatterns.stringSelection] description, patterns, topLeft, size = readLifeFile(path) self.description = description self.patterns = patterns self.patternSize = size self.components.fldDescription.text = description self.components.stcSize.text = "Size: (%d, %d)" % size def on_btnLoad_mouseClick(self, event): self.loadPattern(self.components.lstPatterns.stringSelection) def on_lstPatterns_mouseDoubleClick(self, event): self.loadPattern(self.components.lstPatterns.stringSelection) def on_close(self, event): self.visible = False PythonCard-0.8.2/samples/life/patterns.rsrc.py0000644000076500007650000000134210047606330021256 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'Patterns', 'backgrounds': [ {'type':'Background', 'name':'bgPatterns', 'title':'Patterns', 'size':(466, 270), 'components': [ {'type':'Button', 'name':'btnLoad', 'position':(376, 196), 'label':'Load', }, {'type':'StaticText', 'name':'stcSize', 'position':(98, 200), 'text':'Size:', }, {'type':'CodeEditor', 'name':'fldDescription', 'position':(96, 0), 'size':(356, 191), 'editable':0, }, {'type':'List', 'name':'lstPatterns', 'position':(0, 0), 'size':(93, 221), 'items':[], }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/samples/life/readme.txt0000644000076500007650000001011707600247736020106 0ustar alexalex00000000000000A fairly simple implementation of Conway's Game of Life. I hadn't seen one done in Python before and after playing around with the CAGE library decided to see what I could do in a day or two of coding. The universe (grid) size is determined by the window size and the current grid scale. Display slows down as the population size increases, but the size of the grid doesn't impact display speed. You'll probably have to drop the scale down to 1 and use a maximized window in order to display some of the larger Life patterns and even on a fast box and video card you're unlikely to see much more than a generation/frame a second with really large patterns like Breeder. The algorithm I use to calculate the state of the grid at each generation does not wrap. I have not implemented scrolling yet. You can draw in the grid to create your own patterns. I also added clipboard support so that you can paste patterns such as those found in the lifep glossary.doc or anywhere else where you find patterns made up of lines of . and *. On 2002-12-18 I added a Lexicon window which will be displayed if you copy Stephen Silver's lexicon.txt file into the life samples directory before starting up the life sample. There are over 780 definitions and patterns in the lexicon, so I highly recommend you download it. The INTRODUCTION and BIBLIOGRAPHY are listed with the rest of the definitions and patterns. The Lexicon home page is: http://www.argentum.freeserve.co.uk/lex_home.htm And you can download the zip file that contains lexicon.txt directly at: http://www.argentum.freeserve.co.uk/lex_asc.zip For information on Conway's Game of Life and its rules, see Math.com's Life Page. http://www.math.com/students/wonders/life/life.html The original article from the October 1970 issue of Scientific American which introduced the game to the public: http://hensel.lifepatterns.net/october1970.html The fastest and most complete Life program I know of is Life32 by Johan Bontes. http://psoup.math.wisc.edu/Life32.html Life32 like a few other Life programs works on a very large universe size (grid) of 1 million x 1 million, yet is extremely fast because of the clever way the cells in the grid are stored and calculated each generation. I don't know if it uses the same algorithm as Alan Hensel's Java applet, but that applet is also very fast. http://hensel.lifepatterns.net/ The algorithm, source, etc. is available at: http://hensel.lifepatterns.net/lifeapplet.html I expect that if something similar was done in Python then my program would be fast too. I'll leave it as an exercise for the reader Another algorithm by Paul B. Callahan is slower, but is probably easier to implement, and certainly much faster than the brute force approach that I've used. http://www.radicaleye.com/lifepage/patterns/javalife.html Alan Hensel has a great collection of Life patterns at: http://www.ibiblio.org/lifepatterns/lifep.zip Paul B. Callahan provides an excellent illustrated glossary: http://www.radicaleye.com/lifepage/picgloss/picgloss.html as well as a illustrated catalog: http://www.radicaleye.com/lifepage/patterns/contents.html Additional patterns can be found at the pages above as well as links off of those pages. Put the .lif files in the patterns directory and you can easily browse the descriptions and display the patterns from the files. I've only included one file with the sample. More on Cellular Automata life.py is the first of a series of Cellular Automatan (CA) simulations I will probably make available as PythonCard samples. Erik Max Francis already has a set of modules for exploring a variety of CA sets, but the UI is mostly limited to the command-line and curses (Unix only). In addition, CAGE is not designed for speed, so even a simplistic brute force algorithm like the one I coded up for life.py is faster than doing a GUI display using CAGE. Still, CAGE is a nice set of modules to take a look at. http://www.alcyone.com/pyos/cage/ There are a lot of places to find information and programs dealing with CA. The page below is a good a place to start. http://dmoz.org/Computers/Artificial_Life/Cellular_Automata/ PythonCard-0.8.2/samples/life/util.py0000644000076500007650000001477510365503447017451 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.12 $" __date__ = "$Date: 2006/01/24 19:59:35 $" """ import os import urllib import zipfile # EXAMPLE LIF FILE """ #Life 1.05 #D Acorn #D The most vigorously growing 7-cell #D "methuselah" pattern. See also RABBITS. #N #P -3 -1 .* ...* **..*** """ def patternDimensions(patterns): # figure out the dimensions of the entire file left = 0 top = 0 right = 0 bottom = 0 for pattern in patterns: l, t = pattern['position'] width, height = pattern['size'] r = l + width b = t + height if l < left: left = l if t < top: top = t if r > right: right = r if b > bottom: bottom = b return left, top, right, bottom def readLifeFile(path): # this could be changed to a user-defined dir # saved in a config description = '' # each pattern will consist of an x, y # offset patterns = [] pattern = {} try: fp = open(path) data = fp.readlines() fp.close() except IOError: return None if data[0].strip() != '#Life 1.05': return None for line in data[1:]: s = line.strip() if s == '': pass elif s.startswith('#N') or s.startswith('#R'): # assume Conway (Normal) rules for now pass elif s.startswith('#D'): if description == '': description = s[3:].strip() else: description += "\n" + s[3:].strip() elif s.startswith('#P'): # beginning of a cell block if pattern != {}: pattern['size'] = (width, height) patterns.append(pattern.copy()) x, y = s[3:].split(' ') width = 0 height = 0 pattern = {} pattern['position'] = (int(x), int(y)) pattern['rows'] = [] else: pattern['rows'].append(s) if len(s) > width: width = len(s) height += 1 if pattern != {}: pattern['size'] = (width, height) patterns.append(pattern.copy()) left, top, right, bottom = patternDimensions(patterns) #print "bounds", left, top, right, bottom #print "size", abs(right - left), abs(bottom - top) return description, patterns, (left, top), (abs(right - left), abs(bottom - top)) """ test tube baby **....** (p2) *.*..*.* ..*..*.. ..*..*.. ...**... """ # be able to copy and paste from the glossary # process each line # strip off any leading and trailing spaces # only lines that begin with a . or * are # part of the pattern # blank lines are ignored # other lines are added to the description # a split is done on the lines to remove # things like (p60) from the pattern # this will not handle patterns larger # than a block because there is no support # for (x, y) offsets def translateClipboardPattern(data): descriptionStarted = 0 description = '' patterns = [] pattern = {} for line in data.splitlines(): s = line.strip() if s == '': pass elif not s[0] in ('.', '*', 'O'): # add line to the description # by supporting the capital O # as a symbol we can get # thrown off by a line in # the description that starts with O # in which case the pattern will # get corrupted # of course it would be nice to think the clipboard # will just contain a pattern with no description # or just use . and * if description == '': description = s else: description += "\n" + s else: try: s, desc = s.split(' ') description += "\n" + desc except ValueError: # no description pass # beginning of a cell block if pattern == {}: width = 0 height = 0 # just use 0, 0 for now # offset based on size later pattern['position'] = (0, 0) pattern['rows'] = [] pattern['rows'].append(s) if len(s) > width: width = len(s) height += 1 if pattern != {}: pattern['size'] = (width, height) patterns.append(pattern.copy()) left, top, right, bottom = patternDimensions(patterns) #print "bounds", left, top, right, bottom #print "size", abs(right - left), abs(bottom - top) return description, patterns, (left, top), (abs(right - left), abs(bottom - top)) def neighborsTuple(col, row): # return a tuple of neighbor tuples # this no longer wraps in a torus prevRow = row - 1 nextRow = row + 1 prevCol = col - 1 nextCol = col + 1 return ((prevCol, prevRow), (col, prevRow), (nextCol, prevRow), (prevCol, row), (nextCol, row), (prevCol, nextRow), (col, nextRow), (nextCol, nextRow)) def placePattern(grid, colOffset, rowOffset, pattern): row = rowOffset # pattern is a list of strings for line in pattern: col = colOffset for c in line: if c in ('*', 'O'): grid[(col, row)] = 1 for neighbor in neighborsTuple(col, row): grid.setdefault(neighbor, 0) else: grid[(col, row)] = 0 col += 1 row += 1 return grid def savefile(path, data): try: f = open(path, "w") f.write(data) f.close() except IOError, msg: print "failed to save %s: %s", path, str(msg) # KEA 2004-03-18 # these functions could be changed to use a pythoncard_config/life dir # and automatically call them when the life.py sample starts up # making sure to check whether the zip files already exist before # downloading another copy def getLexicon(path): filename = 'lexicon.txt' zipname = 'lex_asc.zip' zippath = os.path.join(path, zipname) url = 'http://www.argentum.freeserve.co.uk/' + zipname urllib.urlretrieve(url, zippath) zz = zipfile.ZipFile(zippath) savefile(os.path.join(path, filename), zz.read(filename)) def getPatterns(path): zipname = 'lifep.zip' zippath = os.path.join(path, zipname) url = 'http://www.ibiblio.org/lifepatterns/' + zipname urllib.urlretrieve(url, zippath) zz = zipfile.ZipFile(zippath) for name in zz.namelist(): savefile(os.path.join(path, 'patterns', name), zz.read(name)) PythonCard-0.8.2/samples/lsystem/0000755000076500007650000000000010434046771016664 5ustar alexalex00000000000000PythonCard-0.8.2/samples/lsystem/lsystem.py0000644000076500007650000001613210347526323020740 0ustar alexalex00000000000000#!/usr/bin/python """ A fractal display program using the Lindenmayer rule system to describe the fractal. """ __version__ = "$Revision: 1.6 $" __date__ = "$Date: 2005/12/13 11:13:23 $" from PythonCard import clipboard, dialog, graphic, model from PythonCard.turtle import AbstractTurtle, BitmapTurtle import wx import os import time class LSystem(model.Background): def on_initialize(self, event): self.filename = None self.on_iterations_select(None) self.on_angle_select(None) def on_iterations_select(self, event): self.components.iterationDisplay.text = \ str(self.components.iterations.value) def on_angle_select(self, event): self.components.angleDisplay.text = \ str(self.components.angle.value) def on_angleDisplay_textUpdate(self, event): self.components.angle.value = \ int(self.components.angleDisplay.text) def on_Render_command(self, event): self.statusBar.text = "Drawing, please wait..." starttime = time.time() fractalString = self.expand( self.components.scriptField.text, self.components.iterations.value) borderWidth = 5.0 angle = self.components.angle.value self.components.bufOff.autoRefresh = False bounds = drawAbstractFractal( fractalString, 1, angle, (0,0)) width, height = self.components.bufOff.size scale = min( (width - 2 * borderWidth) / (bounds[2]-bounds[0]), (height - 2 * borderWidth) / (bounds[3]-bounds[1])) startPos = (bounds[0] * -scale + borderWidth, bounds[1] * -scale + borderWidth) self.components.bufOff.autoRefresh = True self.drawFractal( fractalString, 'blue', scale, angle, startPos) stoptime = time.time() self.statusBar.text = "Draw time: %.2f seconds" % (stoptime - starttime) def drawFractal(self, aFractalString, color, legLength, angle, startPos): self.components.bufOff.clear() t = BitmapTurtle(self.components.bufOff) t.color(color) t.lt(90) t.moveTo(startPos[0], startPos[1]) for char in aFractalString: if char=='F': t.fd(legLength) elif char=='B': t.bk(legLength) elif char=='+': t.rt(angle) elif char=='-': t.lt(angle) elif char=='[': t.push() elif char==']': t.pop() def expand(self, fractalRules, iterations): lines = fractalRules.upper().split('\n') rules = {} for rule in lines: name, value = rule.split('=') assert(name=='AXIOM' or len(name)==1) rules[name] = value ret = rules['AXIOM'] for i in range(iterations): l = list(ret) for pos, char in enumerate(l): repl = rules.get(char, None) if repl: l[pos] = repl ret = ''.join(l) return ret def initSizers(self): sizer1 = wx.BoxSizer(wx.VERTICAL) comp = self.components flags = wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.ALIGN_BOTTOM # Mac wxButton needs 7 pixels on bottom and right macPadding = 7 sizer1.Add(comp.btnColor, 0, flags, macPadding) sizer1.Add(comp.bufOff, 1, wx.EXPAND) sizer1.Fit(self) sizer1.SetSizeHints(self) self.panel.SetSizer(sizer1) self.panel.SetAutoLayout(1) self.panel.Layout() def on_btnColor_mouseClick(self, event): result = dialog.colorDialog(self) if result.accepted: self.components.bufOff.foregroundColor = result.color event.target.backgroundColor = result.color def openFile(self): result = dialog.openFileDialog(None, "Import which file?") if result.accepted: path = result.paths[0] os.chdir(os.path.dirname(path)) self.filename = path bmp = graphic.Bitmap(self.filename) self.components.bufOff.drawBitmap(bmp, (0, 0)) def on_menuFileOpen_select(self, event): self.openFile() def on_menuFileSaveAs_select(self, event): if self.filename is None: path = '' filename = '' else: path, filename = os.path.split(self.filename) result = dialog.saveFileDialog(None, "Save As", path, filename) if result.accepted: path = result.paths[0] fileType = graphic.bitmapType(path) print fileType, path bmp = self.components.bufOff.getBitmap() try: bmp.SaveFile(path, fileType) return True except IOError: return False else: return False def on_menuEditCopy_select(self, event): widget = self.findFocus() if hasattr(widget, 'editable') and widget.canCopy(): widget.copy() else: clipboard.setClipboard(self.components.bufOff.getBitmap()) def on_menuEditPaste_select(self, event): widget = self.findFocus() if hasattr(widget, 'editable') and widget.canPaste(): widget.paste() else: bmp = clipboard.getClipboard() if isinstance(bmp, wx.Bitmap): self.components.bufOff.drawBitmap(bmp) def on_editClear_command(self, event): self.components.bufOff.clear() def drawAbstractFractal(aFractalString, legLength, angle, startPos): def recalcBounds(bounds, turtle): x, y = turtle.getXY() bounds[0] = min(bounds[0], x) bounds[1] = min(bounds[1], y) bounds[2] = max(bounds[2], x) bounds[3] = max(bounds[3], y) t = AbstractTurtle((1,1)) t.lt(90) t.moveTo(startPos[0], startPos[1]) bounds = list(startPos + startPos) for char in aFractalString: if char=='F': t.fd(legLength) recalcBounds(bounds, t) elif char=='B': t.bk(legLength) recalcBounds(bounds, t) elif char=='+': t.rt(angle) elif char=='-': t.lt(angle) elif char=='[': t.push() elif char==']': t.pop() return bounds from PythonCard.tests import pyunit class LSystemTests(pyunit.TestCase): def setUp(self): pass def tearDown(self): pass def testBoundsCheckBackwardMoves(self): bounds = drawAbstractFractal('BB+B', 1, 90, (10.0,20.0)) # remember that down is positive in this coordinate system self.assertEqual([9.0, 20.0, 10.0, 22.0], bounds) def testBoundsCheckForwardMoves(self): bounds = drawAbstractFractal('FF-F', 1, 90, (10.0,20.0)) # remember that down is positive in this coordinate system self.assertEqual([9.0, 18.0, 10.0, 20.0], bounds) if __name__ == '__main__': app = model.Application(LSystem) app.MainLoop() PythonCard-0.8.2/samples/lsystem/lsystem.rsrc.py0000644000076500007650000000720510222051501021670 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'Doodle', 'backgrounds': [ {'type':'Background', 'name':'bgLSystem', 'title':'L-System PythonCard Application', 'size':(579, 550), 'statusBar':1, 'style':['resizeable'], 'menubar': {'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ {'type':'MenuItem', 'name':'menuFileOpen', 'label':'&Open...\tCtrl+O', }, {'type':'MenuItem', 'name':'menuFileSaveAs', 'label':'Save &As...', }, {'type':'MenuItem', 'name':'fileSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit', }, ] }, {'type':'Menu', 'name':'menuEdit', 'label':'&Edit', 'items': [ {'type':'MenuItem', 'name':'menuEditCopy', 'label':'&Copy\tCtrl+C', }, {'type':'MenuItem', 'name':'menuEditPaste', 'label':'&Paste\tCtrl+V', }, {'type':'MenuItem', 'name':'editSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditClear', 'label':'&Clear', 'command':'editClear', }, ] }, {'type':'Menu', 'name':'menuRender', 'label':'&Render', 'items': [ {'type':'MenuItem', 'name':'menuRenderRenderNow', 'label':'&Render Now\tCtrl+R', 'command':'Render', }, ] }, ] }, 'components': [ {'type':'TextField', 'name':'angleDisplay', 'position':(420, 25), 'size':(36, -1), }, {'type':'StaticText', 'name':'StaticText2', 'position':(371, 29), 'text':'Angle:', }, {'type':'Slider', 'name':'angle', 'position':(367, 54), 'size':(200, 20), 'labels':False, 'layout':'horizontal', 'max':360, 'min':0, 'tickFrequency':0, 'ticks':False, 'value':45, }, {'type':'StaticText', 'name':'iterationDisplay', 'position':(435, 76), }, {'type':'StaticText', 'name':'StaticText1', 'position':(368, 76), 'text':'Iterations:', }, {'type':'Slider', 'name':'iterations', 'position':(364, 98), 'size':(200, 20), 'labels':False, 'layout':'horizontal', 'max':10, 'min':1, 'tickFrequency':0, 'ticks':False, 'value':3, }, {'type':'Button', 'name':'btnRender', 'position':(1, 35), 'command':'Render', 'label':'Render', }, {'type':'TextArea', 'name':'scriptField', 'position':(96, 0), 'size':(201, 118), 'text':'axiom=l\nl=+rf-lfl-fr+\nr=-lf+rfr+fl-', }, {'type':'Button', 'name':'btnColor', 'position':(1, 67), 'label':'Color', }, {'type':'BitmapCanvas', 'name':'bufOff', 'position':(0, 121), 'size':(568, 348), 'backgroundColor':(255, 255, 255), }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/samples/lsystem/lsystemInteractive.py0000644000076500007650000001075210347526323023140 0ustar alexalex00000000000000#!/usr/bin/python """ A fractal display program using the Lindenmayer rule system to describe the fractal. """ __version__ = "$Revision: 1.3 $" __date__ = "$Date: 2005/12/13 11:13:23 $" from PythonCard import clipboard, dialog, graphic, model from PythonCard.turtle import AbstractTurtle, BitmapTurtle import wx import os import time import lsystem class LSystem(lsystem.LSystem): def on_initialize(self, event): self.filename = None #self.on_iterations_select(None) #self.on_angle_select(None) self.components.iterationDisplay.text = \ str(self.components.iterations.value) self.components.angleDisplay.text = \ str(self.components.angle.value) self.on_Render_command(None) # depending on the complexity of the pattern string # my system becomes pretty unresponsive above 6 or 7 iterations def on_iterations_select(self, event): self.components.iterationDisplay.text = \ str(self.components.iterations.value) self.components.iterationDisplay.redraw() self.on_Render_command(None) def on_angle_select(self, event): self.components.angleDisplay.text = \ str(self.components.angle.value) self.components.angleDisplay.redraw() self.on_Render_command(None) def on_angleDisplay_textUpdate(self, event): # how do we want to validate here # just use a try/except block? try: self.components.angle.value = \ int(self.components.angleDisplay.text) self.on_Render_command(None) except ValueError: pass ## # this seemed like a good idea, but you tend to press Render so it isn't needed ## def on_scriptField_closeField(self, event): ## self.on_Render_command(None) def on_Render_command(self, event): self.statusBar.text = "Drawing, please wait..." starttime = time.time() fractalString = self.expand( self.components.scriptField.text, self.components.iterations.value) borderWidth = 5.0 * 4 angle = self.components.angle.value bounds = lsystem.drawAbstractFractal( fractalString, 1, angle, (0,0)) width, height = self.components.bufOff.size scale = min( (width - 2 * borderWidth) / (bounds[2]-bounds[0]), (height - 2 * borderWidth) / (bounds[3]-bounds[1])) startPos = (bounds[0] * -scale + borderWidth, bounds[1] * -scale + borderWidth) ## self.components.bufOff.autoRefresh = True self.components.bufOff.autoRefresh = False self.drawFractal( fractalString, 'blue', scale, angle, startPos) # the bufOff BitmapCanvas should always be 4x the size # of the onscreen BitmapCanvas so we have a simple # method to anti-alias the drawing # also need to add some padding around side, so I # multiplied borderWidth * 4 above bmp = self.components.bufOff.getBitmap() self.components.onscreen.drawBitmapScaled(bmp, (0, 0), self.components.onscreen.size) # not sure if this is needed to prevent a memory leak bmp = None stoptime = time.time() self.statusBar.text = "Draw time: %.2f seconds" % (stoptime - starttime) def drawFractal(self, aFractalString, color, legLength, angle, startPos): self.components.bufOff.clear() t = BitmapTurtle(self.components.bufOff) t.color(color) t.width(3) #t.setBackColor('black') t.cls() t.lt(90) t.moveTo(startPos[0], startPos[1]) ## bounds = list(startPos + startPos) for char in aFractalString: if char=='F': t.fd(legLength) curPos = t.getXY() ## bounds[0] = min(bounds[0], curPos[0]) ## bounds[1] = min(bounds[1], curPos[1]) ## bounds[2] = max(bounds[2], curPos[0]) ## bounds[3] = max(bounds[3], curPos[1]) elif char=='+': t.rt(angle) elif char=='-': t.lt(angle) elif char=='B': t.bk(legLength) elif char=='[': t.push() elif char==']': t.pop() ## return bounds if __name__ == '__main__': app = model.Application(LSystem) app.MainLoop() PythonCard-0.8.2/samples/lsystem/lsystemInteractive.rsrc.py0000644000076500007650000000745310222051501024073 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'Doodle', 'backgrounds': [ {'type':'Background', 'name':'bgLSystem', 'title':'L-System PythonCard Application', 'size':(579, 550), 'statusBar':1, 'style':['resizeable'], 'menubar': {'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ {'type':'MenuItem', 'name':'menuFileOpen', 'label':'&Open...\tCtrl+O', }, {'type':'MenuItem', 'name':'menuFileSaveAs', 'label':'Save &As...', }, {'type':'MenuItem', 'name':'fileSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit', }, ] }, {'type':'Menu', 'name':'menuEdit', 'label':'&Edit', 'items': [ {'type':'MenuItem', 'name':'menuEditCopy', 'label':'&Copy\tCtrl+C', }, {'type':'MenuItem', 'name':'menuEditPaste', 'label':'&Paste\tCtrl+V', }, {'type':'MenuItem', 'name':'editSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditClear', 'label':'&Clear', 'command':'editClear', }, ] }, {'type':'Menu', 'name':'menuRender', 'label':'&Render', 'items': [ {'type':'MenuItem', 'name':'menuRenderRenderNow', 'label':'&Render Now\tCtrl+R', 'command':'Render', }, ] }, ] }, 'components': [ {'type':'TextField', 'name':'angleDisplay', 'position':(420, 25), 'size':(36, -1), }, {'type':'StaticText', 'name':'StaticText2', 'position':(371, 29), 'text':'Angle:', }, {'type':'Slider', 'name':'angle', 'position':(367, 54), 'size':(200, 20), 'labels':False, 'layout':'horizontal', 'max':360, 'min':0, 'tickFrequency':0, 'ticks':False, 'value':45, }, {'type':'StaticText', 'name':'iterationDisplay', 'position':(435, 76), }, {'type':'StaticText', 'name':'StaticText1', 'position':(368, 76), 'text':'Iterations:', }, {'type':'Slider', 'name':'iterations', 'position':(364, 98), 'size':(200, 20), 'labels':False, 'layout':'horizontal', 'max':10, 'min':1, 'tickFrequency':0, 'ticks':False, 'value':3, }, {'type':'Button', 'name':'btnRender', 'position':(1, 35), 'command':'Render', 'label':'Render', }, {'type':'TextArea', 'name':'scriptField', 'position':(96, 0), 'size':(201, 118), 'text':'axiom=l\nl=+rf-lfl-fr+\nr=-lf+rfr+fl-', }, {'type':'Button', 'name':'btnColor', 'position':(1, 67), 'label':'Color', }, {'type':'BitmapCanvas', 'name':'onscreen', 'position':(0, 121), 'size':(568, 348), #'backgroundColor':(0, 0, 0), }, {'type':'BitmapCanvas', 'name':'bufOff', 'position':(0, 121), 'size':(568 * 4, 348 * 4), #'backgroundColor':(0, 0, 0), 'visible':False, }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/samples/lsystem/readme.txt0000644000076500007650000000137610052442737020667 0ustar alexalex00000000000000A fractal display program using the Lindenmayer rule system to describe the fractal. For more information on Lindenmayer Systems (L-Systems) see: http://www.biologie.uni-hamburg.de/b-online/e28_3/lsys.html Contributed by Arlo Belshee, Kim Wallmark, Ward Cunningham, and Kevin Altis. some examples until we have a file load/save implemented... axiom=l l=+rf-lfl-fr+ r=-lf+rfr+fl- koch angle=10 iterations=3 axiom=f+f+f+f f=f+f-f-ff+f+f-f seaweed angle=21 iterations=3 axiom=[f-f+af][+fa] a=ff+a-f f=f[-aff+fa+f-bbb][-ff] wheat angle=10 iterations=4 axiom=f f=ff-[-f+f+f]+[+f-f-f] stars angle=156 iterations=4 axiom=a a=ff+aaaaf+f+f--fffff the world's most difficult crossword puzzle angle=89 iterations=4 axiom=a b=af+[-b]ff+f+fff a=affbb+b+b+af+b PythonCard-0.8.2/samples/minimal/0000755000076500007650000000000010434046771016612 5ustar alexalex00000000000000PythonCard-0.8.2/samples/minimal/minimal.py0000644000076500007650000000040410042563213020576 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.10 $" __date__ = "$Date: 2004/04/24 22:13:31 $" """ from PythonCard import model class Minimal(model.Background): pass if __name__ == '__main__': app = model.Application(Minimal) app.MainLoop() PythonCard-0.8.2/samples/minimal/minimal.rsrc.py0000644000076500007650000000140110110460165021542 0ustar alexalex00000000000000 { 'application':{ 'type':'Application', 'name':'Minimal', 'backgrounds': [ { 'type':'Background', 'name':'bgMin', 'title':'Minimal PythonCard Application', 'size':( 200, 100 ), 'menubar': { 'type':'MenuBar', 'menus': [ { 'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ { 'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit' } ] } ] }, 'components': [ { 'type':'TextField', 'name':'field1', 'position':(5, 5), 'size':(150, -1), 'text':'Hello PythonCard' }, ] } ] } } PythonCard-0.8.2/samples/minimal/readme.txt0000644000076500007650000000047007521277427020620 0ustar alexalex00000000000000minimal is almost the smallest PythonCard program possible. Refer to tutorial.txt for an example of copying and modifying minimal.py as your first PythonCard program. See the minimalStandalone sample for information on building standalone executables and a simple example of a localized resource file in French.PythonCard-0.8.2/samples/minimalList/0000755000076500007650000000000010434046771017446 5ustar alexalex00000000000000PythonCard-0.8.2/samples/minimalList/minimalList.py0000644000076500007650000000735410046216006022300 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.8 $" __date__ = "$Date: 2004/05/05 16:53:26 $" """ from PythonCard import model import wx # events # itemActivated, itemFocused, # select, mouseContextClick, columnClick # keyDown class Minimal(model.Background): def on_initialize(self,event): self.initializeList() # so how much to wrap and how much to leave raw wxPython? def initializeList(self): list = self.components.list list.InsertColumn(0, "Artist") list.InsertColumn(1, "Title", wx.LIST_FORMAT_RIGHT) list.InsertColumn(2, "Genre") musicdata = { 14: ("GBV", "14 Cheerleader Coldfront", "Rock"), 28: ("The Mountain Goats", "Going to Marakesh", "Rock"), 29: ("The Mountain Goats", "Going to Georgia", "Rock"), 30: ("The Mountain Goats", "Quetzalcoatal Eats Plums", "Rock"), 31: ("Howlin Wolf", "Hip Shakin' Woman", "Blues"), 32: ("Neutral Milk Hotel", "Oh Comely", "Infinite Bliss"), 33: ("Miles Davis", "Blue in Green", "Jazz"), 15: ("Taylor Dayne", "you must be KIDDING me", "?")} items = musicdata.items() for x in range(len(items)): key, data = items[x] list.InsertStringItem(x, data[0]) list.SetStringItem(x, 0, data[0]) list.SetStringItem(x, 1, data[1]) list.SetStringItem(x, 2, data[2]) list.SetItemData(x, key) list.SetColumnWidth(0, wx.LIST_AUTOSIZE) list.SetColumnWidth(1, wx.LIST_AUTOSIZE) list.SetColumnWidth(2, 100) list.SetItemDataMap(musicdata) # show how to select an item list.SetItemState(5, wx.LIST_STATE_SELECTED, wx.LIST_STATE_SELECTED) self.currentItem = 0 # these aren't needed because the events are now part of the # MultiColumnList #wx.EVT_LIST_ITEM_SELECTED(self.panel, -1, self.on_list_itemSelected) #wx.EVT_LEFT_DCLICK(list, self.on_list_mouseDoubleClick) # these are still needed if you want the events #wx.EVT_LIST_ITEM_ACTIVATED(self.panel, -1, self.on_list_itemActivated) #wx.EVT_LIST_COL_CLICK(self.panel, -1, self.on_list_columnClick) def getColumnText(self, index, col): item = self.components.list.GetItem(index, col) return item.GetText() def on_list_select(self, event): self.currentItem = event.m_itemIndex print "on_list_select: %s, %s, %s, %s\n" % (self.currentItem, self.components.list.GetItemText(self.currentItem), self.getColumnText(self.currentItem, 1), self.getColumnText(self.currentItem, 2)) def on_list_mouseDoubleClick(self, event): # event.target # is equivelant to # self.components.list print "on_list_mouseDoubleClick item %s\n" % self.components.list.GetItemText(self.currentItem) event.skip() def on_list_itemActivated(self, event): self.currentItem = event.m_itemIndex print "on_list_itemActivated: %s\n" % self.components.list.GetItemText(self.currentItem) item = self.components.list.GetItem(self.currentItem) print item.m_text, item.m_itemId, self.components.list.GetItemData(self.currentItem) def on_list_columnClick(self, event): print "on_list_columnClick: %d\n" % event.GetColumn() # KEA 2003-08-31 # on Windows, there is a system beep for # each key press, is that a bug and if so, is it in PythonCard # or wxWindows? def on_list_keyDown(self, event): print "on_list_keyDown: %d\n" % event.keyCode event.skip() if __name__ == '__main__': app = model.Application(Minimal) app.MainLoop() PythonCard-0.8.2/samples/minimalList/minimalList.rsrc.py0000644000076500007650000000141710047606332023250 0ustar alexalex00000000000000 { 'application':{ 'type':'Application', 'name':'Minimal', 'backgrounds': [ { 'type':'Background', 'name':'bgMin', 'title':'Minimal PythonCard Application', 'size':( 400, 400 ), 'menubar': { 'type':'MenuBar', 'menus': [ { 'type':'Menu', 'name':'menuFile', 'label':'File', 'items': [ { 'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit' } ] } ] }, 'components': [ { 'type':'MultiColumnList', 'name':'list', 'position':(0, 30), 'size':(350, 200), 'columns':3, 'rules':0 }, ] } ] } } PythonCard-0.8.2/samples/minimalList/readme.txt0000644000076500007650000000007007724427427021452 0ustar alexalex00000000000000This is a simple test of the MultiColumnList component. PythonCard-0.8.2/samples/minimalStandalone/0000755000076500007650000000000010434046771020623 5ustar alexalex00000000000000PythonCard-0.8.2/samples/minimalStandalone/macbuild.py0000644000076500007650000000204710135001656022747 0ustar alexalex00000000000000import bundlebuilder import os # I set this to make adding subfolders into the package easier # KEA 2004-07-22 # rather than hard-coding the path # we'll just get the path from this module ##packageroot = "/Users/kevino/oss/eclass/eclass_builder" packageroot = os.path.abspath(os.path.dirname(__file__)) # for the purposes of building the standalone # change to the directory the build script is in to simplify imports os.chdir(packageroot) myapp = bundlebuilder.AppBuilder(verbosity=1) myapp.mainprogram = os.path.join(packageroot, "minimal.py") myapp.standalone = 1 myapp.name = "Minimal" # minimal.rsrc.py is read in at runtime, but # not using import, so can it just be placed # in the directory of the standalone? myapp.resources.append(os.path.join(packageroot, "minimal.rsrc.py")) myapp.libs.append("/usr/local/lib/wxPython-2.5.2.8/lib/libwx_macd-2.5.2.dylib") myapp.libs.append("/usr/local/lib/wxPython-2.5.2.8/lib/libwx_macd-2.5.2.rsrc") myapp.libs.append("/usr/local/lib/wxPython-2.5.2.8/lib/libwx_macd_stc-2.5.2.dylib") myapp.setup() myapp.build()PythonCard-0.8.2/samples/minimalStandalone/minimal.fr.rsrc.py0000644000076500007650000000141010110460175024162 0ustar alexalex00000000000000 { 'application':{ 'type':'Application', 'name':'Minimal', 'backgrounds': [ { 'type':'Background', 'name':'bgMin', 'title':'Application PythonCard minimum', 'size':( 200, 100 ), 'menubar': { 'type':'MenuBar', 'menus': [ { 'type':'Menu', 'name':'menuFile', 'label':'Fichier', 'items': [ { 'type':'MenuItem', 'name':'menuFileExit', 'label':'Q&uitter\tAlt+Q', 'command':'exit' } ] } ] }, 'components': [ { 'type':'TextField', 'name':'field1', 'position':(5, 5), 'size':(150, -1), 'text':'Bonjour PythonCard' }, ] } ] } } PythonCard-0.8.2/samples/minimalStandalone/minimal.py0000644000076500007650000000107410046216006022612 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.5 $" __date__ = "$Date: 2004/05/05 16:53:26 $" """ from PythonCard import model # KEA 2001-12-11 # if you want to build a standalone executable using py2exe # then uncomment the import line below # due to the way the dynamic imports of components work, each # component that an app uses needs to be imported statically when # doing a py2exe build from PythonCard.components import textfield class Minimal(model.Background): pass if __name__ == '__main__': app = model.Application(Minimal) app.MainLoop() PythonCard-0.8.2/samples/minimalStandalone/minimal.rsrc.py0000644000076500007650000000140110110460175023554 0ustar alexalex00000000000000 { 'application':{ 'type':'Application', 'name':'Minimal', 'backgrounds': [ { 'type':'Background', 'name':'bgMin', 'title':'Minimal PythonCard Application', 'size':( 200, 100 ), 'menubar': { 'type':'MenuBar', 'menus': [ { 'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ { 'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit' } ] } ] }, 'components': [ { 'type':'TextField', 'name':'field1', 'position':(5, 5), 'size':(150, -1), 'text':'Hello PythonCard' }, ] } ] } } PythonCard-0.8.2/samples/minimalStandalone/minimal.spec0000644000076500007650000000141707521277427023137 0ustar alexalex00000000000000 """ A spec file to make a standalone of minimal for Windows and Linux platforms. You can get Gordon McMillans installer from http://www.mcmillan-inc.com/install1.html Use this command to build the standalone and collect the other needed files: Build.py minimal.spec __version__ = "$Revision: 1.1 $" __date__ = "$Date: 2002/07/29 17:44:55 $" """ a = Analysis(['minimal.py'], pathex=[]) pyz = PYZ(a.pure) exe = EXE(pyz, a.scripts, exclude_binaries=1, name='buildminimal/minimal.exe', debug=0, console=1) coll = COLLECT( exe, a.binaries + \ [('minimal.rsrc.py', 'minimal.rsrc.py', 'DATA')] + \ [('readme.txt', 'readme.txt', 'DATA')], name='distminimal') PythonCard-0.8.2/samples/minimalStandalone/readme.txt0000644000076500007650000000516407723001655022626 0ustar alexalex00000000000000minimalStandalone is a copy of the minimal sample with the import line already uncommented and the necessary scripts for building a standalone version of the minimal sample with py2exe and Gordon McMillan's installer supplied. It also contains a French version of the resource file. minimal is about the smallest PythonCard program possible. Refer to walkthrough1.html in the PythonCard documentation directory for an example of copying and modifying minimal.py as your first PythonCard program. When you create standalone executable versions of a PythonCard application using either py2exe or Gordon McMillan's Installer, you end up with a folder with multiple files, incuding an exe file whose name is identical to the main Python script name you supply as the primary source file. To distribute your application, you must supply the user with all of the contents of the folder indicated in the directions below. Note that Installer creates two temporary folders called "build" and "buildminimal" that you need *not* distribute. py2exe ====== You can build a standalone Windows executable using py2exe, available at: http://py2exe.sourceforge.net/ Use the following command-line to build the minimal.exe file. python setup.py py2exe --excludes=Image The results ofthe build are placed in the minimalStandAlone\dist\minimal directory. The --windows or -w option should be used to build a windows application, similar to running the script with pythonw.exe or using a .pyw extension. See the py2exe page for other options. Gordon McMillan's Installer =========================== You can also build a standalone Windows or Linux executable using Gordon McMillan's Installer, available at http://www.mcmillan-inc.com/install1.html. Place Installer in its own folder in your Python directory's lib/site-packages directory. Use the following comand-line to build the minimal standalone with Installer: python Build.py minimal.spec The results of the build are placed in the minimalStandAlone\distminimal directory. Mac OS X bundlebuilder.py ========================= You can build a standalone on Mac OS X using the macbuild.py script. Use the following comand-line to build the minimal standalone with Installer: /usr/local/bin/python macbuild.py For more information, see the mailing list post I made in July 2003: http://aspn.activestate.com/ASPN/Mail/Message/1746353 International and localization issues ===================================== The minimal.fr.rsrc.py file is the French version of minimal.rsrc.py. If the locale setting on the users machine indicates French (fr) as the language, that resource will automatically be used. PythonCard-0.8.2/samples/minimalStandalone/setup.py0000644000076500007650000000122210224556246022332 0ustar alexalex00000000000000# A distutils script to make a standalone .exe of minimal for # Windows platforms. You can get py2exe from # http://py2exe.sourceforge.net/. Use this command to build the .exe # and collect the other needed files: # # python setup.py py2exe --excludes=Image # """ __version__ = "$Revision: 1.3 $" __date__ = "$Date: 2005/04/05 18:44:54 $" """ from distutils.core import setup import sys if sys.platform == 'darwin': import py2app buildstyle = 'app' else: import py2exe buildstyle = 'console' setup( name = "minimal", data_files = [ (".", ["readme.txt", "minimal.rsrc.py"]) ], **{buildstyle: ["minimal.py"]} ) PythonCard-0.8.2/samples/minimalTree/0000755000076500007650000000000010434046771017432 5ustar alexalex00000000000000PythonCard-0.8.2/samples/minimalTree/minimalTree.py0000644000076500007650000000201010046216007022231 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.6 $" __date__ = "$Date: 2004/05/05 16:53:27 $" """ from PythonCard import model # events # itemActivated, itemExpanding, itemExpanded, # selectionChanging, selectionChanged class Minimal(model.Background): def on_initialize(self, event): tree = self.components.tree root = tree.addRoot("1") tree.setItemHasChildren(root, 1) tree.selectItem(root) def on_tree_itemExpanding(self, event): tree = self.components.tree item=event.item # This event can happen twice in the self.Expand call if tree.isExpanded(item): return obj = int(tree.getItemText(item)) if tree.getChildrenCount(item, 0) == 0: lst = [obj * 2, (obj *2) + 1] for o in lst: new_item = tree.appendItem(item, str(o)) tree.setItemHasChildren(new_item, 1) event.skip() if __name__ == '__main__': app = model.Application(Minimal) app.MainLoop() PythonCard-0.8.2/samples/minimalTree/minimalTree.rsrc.py0000644000076500007650000000145110047606333023217 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'TreeTest', 'backgrounds': [ {'type':'Background', 'name':'bgMin', 'title':'treetest PythonCard Application', 'size':(400, 300), 'menubar': {'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ {'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit', }, ] }, ] }, 'components': [ {'type':'Tree', 'name':'tree', 'position':(0, 0), 'size':(390, 255), }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/samples/minimalTree/readme.txt0000644000076500007650000000005507724427427021441 0ustar alexalex00000000000000This is a simple test of the Tree component. PythonCard-0.8.2/samples/moderator/0000755000076500007650000000000010434046771017160 5ustar alexalex00000000000000PythonCard-0.8.2/samples/moderator/delegates.txt0000644000076500007650000000034510042221555021646 0ustar alexalex00000000000000Kevin Altis Arlo Belshee Robin Dunn Bruce Eckel Phil Edwards Neil Hodgson Tom Jacobs Simon Kittle Randy Lea Dana Moore David McNab Patrick K. O'Brien David Primmer Dan Shafer Rowland Smith Andy Todd Kimberly Wallmark Dan Winkler PythonCard-0.8.2/samples/moderator/moderator.bat0000755000076500007650000000004210042221555021631 0ustar alexalex00000000000000pythonw moderator.py delegates.txtPythonCard-0.8.2/samples/moderator/moderator.py0000644000076500007650000001144010347526323021525 0ustar alexalex00000000000000#!/usr/bin/python """ Moderator, as you may have guessed, is a moderation tool. As someone raises their hand to speak, the moderator clicks their name and it goes on the list of people waiting to speak, in order. When someone is speaking, they have a certain number of minutes to speak. It works best when there's a projector, so everyone can see they're on the list and the speaker can see how much time they have left. Contributed to the PythonCard community 4/23/2004 by Bruce Eckel """ __version__ = "$Revision: 1.9 $" __date__ = "$Date: 2005/12/13 11:13:23 $" import sys from PythonCard import dialog, model, timer # maximum time per speaker in seconds MAX_TIME = 5 * 60 #MAX_TIME = 180 DELEGATE_FILE = "delegates.txt" class Moderator(model.Background): def on_initialize(self, event): self.clockTimer = timer.Timer(self.components.txtTime, -1) self.clockModel = CountdownClockModel(MAX_TIME) self.delegates = ModeratorModel() if len(sys.argv) > 1: fname = sys.argv[1] else: fname = DELEGATE_FILE try: lines = open(fname).readlines() except IOError: lines = [] for delegate in lines: if delegate.strip(): self.delegates.add(delegate.strip()) self.update() def on_close(self, event): self.clockTimer.stop() event.skip() def shift(self): if self.delegates.queue(): self.delegates.shift() self.clockModel.reset() self.clockTimer.start(1000) else: self.clockTimer.stop() self.update() def on_timer(self, event): self.clockModel.tick() if self.clockModel.done(): self.shift() self.update() def on_lstDelegates_select(self, event): delegate = self.components.lstDelegates.stringSelection if not delegate: return self.delegates.enqueue(delegate) if not self.clockTimer.isRunning(): self.shift() self.update() def on_lstQueue_select(self, event): delegate = self.components.lstQueue.stringSelection if not delegate: return self.delegates.dequeue(delegate) self.update() def on_btnPause_mouseClick(self, event): self.clockModel.pause() def on_btnNext_mouseClick(self, event): self.shift() def update(self): if self.components.lstDelegates.items != self.delegates.idle(): self.components.lstDelegates.items = self.delegates.idle() if self.components.lstQueue.items != self.delegates.queue(): self.components.lstQueue.items = self.delegates.queue() if self.components.txtSpeaker.text != self.delegates.speaker(): self.components.txtSpeaker.text = self.delegates.speaker() if self.components.txtTime.text != self.clockModel.readout(): self.components.txtTime.text = self.clockModel.readout() def on_btnAddSpeaker_mouseClick(self, event): result = dialog.textEntryDialog(self, 'Speaker:', 'Add Speaker', 'First Last') if result.accepted: text = result.text #self.components.lstDelegates.append(text) self.delegates.add(text.strip()) self.update() class CountdownClockModel: def __init__(self, max): assert max > 0 self.max = max self.reset() def tick(self): if not self.paused: self.count += 1 def pause(self): self.paused = not self.paused def reset(self): self.count = 0 self.paused = 0 def done(self): return self.count == self.max def readout(self): remaining = self.max - self.count return "%d:%02d" % (remaining / 60, remaining % 60) class ModeratorModel: def __init__(self): self._idle = [] self._queue = [] self._speaker = "" def add(self, delegate): assert delegate self._idle.append(delegate) def enqueue(self, delegate): assert delegate self._idle.remove(delegate) self._queue.append(delegate) def dequeue(self, delegate): assert delegate self._queue.remove(delegate) self._idle.append(delegate) def shift(self): if self._speaker: self._idle.append(self._speaker) if self._queue: self._speaker = self._queue.pop(0) else: self._speaker = "" def speaker(self): return self._speaker def queue(self): return self._queue def idle(self): return self._idle if __name__ == '__main__': app = model.Application(Moderator) app.MainLoop() PythonCard-0.8.2/samples/moderator/moderator.rsrc.py0000644000076500007650000000456510130317155022476 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'Moderator', 'backgrounds': [ {'type':'Background', 'name':'bgMin', 'title':'Python Moderation Tool', 'size':(443, 600), 'menubar': {'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ {'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit', }, ] }, ] }, 'components': [ {'type':'Button', 'name':'btnAddSpeaker', 'position':(250, 539), 'size':(151, -1), 'label':'Add Speaker', }, {'type':'List', 'name':'lstDelegates', 'position':(242, 169), 'size':(171, 365), 'font':{'faceName': 'Microsoft Sans Serif', 'family': 'sansSerif', 'size': 12}, 'items':[], }, {'type':'List', 'name':'lstQueue', 'position':(15, 169), 'size':(210, 365), 'font':{'faceName': 'Microsoft Sans Serif', 'family': 'sansSerif', 'size': 14}, 'items':[], }, {'type':'Button', 'name':'btnPause', 'position':(106, 91), 'size':(99, -1), 'label':'Pause', }, {'type':'Button', 'name':'btnNext', 'position':(244, 90), 'size':(151, -1), 'label':'Next Speaker', }, {'type':'StaticText', 'name':'lblDelegates', 'position':(249, 151), 'text':'Delegates:', }, {'type':'StaticText', 'name':'lblWaiting', 'position':(17, 151), 'text':'Waiting to Speak:', }, {'type':'TextField', 'name':'txtSpeaker', 'position':(16, 23), 'size':(378, 43), 'editable':False, 'font':{'faceName': 'Microsoft Sans Serif', 'family': 'sansSerif', 'size': 22}, }, {'type':'StaticText', 'name':'lblSpeaking', 'position':(17, -1), 'text':'Now Speaking:', }, {'type':'StaticText', 'name':'lblTimeLeft', 'position':(18, 71), 'size':(203, -1), 'text':'Time Left:', }, {'type':'TextField', 'name':'txtTime', 'position':(16, 89), 'size':(79, 42), 'editable':False, 'font':{'faceName': 'Microsoft Sans Serif', 'family': 'sansSerif', 'size': 24}, 'text':'3:00', }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/samples/moderator/readme.txt0000644000076500007650000000072110042221555021144 0ustar alexalex00000000000000moderator, as you may have guessed, is a moderation tool. As someone raises their hand to speak, the moderator clicks their name and it goes on the list of people waiting to speak, in order. When someone is speaking, they have a certain number of minutes to speak. It works best when there's a projector, so everyone can see they're on the list and the speaker can see how much time they have left. Contributed to the PythonCard community 4/23/2004 by Bruce Eckel PythonCard-0.8.2/samples/montyhall/0000755000076500007650000000000010434046771017173 5ustar alexalex00000000000000PythonCard-0.8.2/samples/montyhall/closed1.jpg0000644000076500007650000000540210040262357021221 0ustar alexalex00000000000000ÿØÿàJFIFHHÿÛC  !"$"$ÿÛCÿÀid"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?û.Š( Š+çŸ~Ø ô/^èñAâ em%òî›o –ÓÔÆÏ*–Pr7cRT‚@>†¢¾fÿ†ÕøYÿ@ÿà·ÿ$Qÿ «ð³þ€3ÿÀ;oþH ¦h¯™¿áµ~ÐÆømÿÉÃjü,ÿ ŒÿðÛÿ’(éš+æoøm_…ŸôñŸþÛòEiøOö»ømâ_i>±Ñ<[Þ«} ”5­¸^W¥ˆœ¹aœqØÐÐÔQEQEQEyÏí3⋯|ñn½b&icöh$†s ¼î°,ªà ¡Æ0I\dg#ý•ü%eႎÑüÙµktÕ®åÁä€ÁbÔòÓŒ³v&³ÿà šÝÖ•û?µ¼p´Zίmepd²¢‡¸0F|9ÈÁn3‚=áæsáßxwÃ÷²C%Ö™¥[YÌð’Qž8•© 2§ã°¯Î|FÄ8a(ÒOâ“vïeú\ìÁ¯y³v™s<6ÖÒÜÜÍ0D…ä’F ¨ d±'€ç4úòïŽñoŽntûm*ÿK·ÒíP»Gq4ªÏ1$n!U”€ =Fçõ¯Ê°´¡VªIr®ç½–ahâ±1¥^ª§¼ŸOøsªðŽ´ÿhbIpß`˜G'›MêÙÛ"ÿ²Û[à réëÀÿd/ùš?íÓÿkW¾Vù¦\T©CeoÉ3»‰rê9fgW Fü±µ¯¾±Oóa^+ûVÝhú,_ üQ«ˆa‹JñÆŸ,׆ï¸ß$¸Ú `ˆ”•^¥‚@¯j¯.ý«<;ÿ 'À_ÛÇ›\XÛF.>WÂI ®bYŒïÁ ]\=ˆX|Ò…ImÌ¿?Sç«+Á£Ý¨®OàÅÝÕÿÁïß_\Íuwsáû §ži É+µºvcË1$’O$šë+ú(òŠ( Š( •?j­>Ëâí1ðÃáž§—c­Æ¥s6ò~Ñ–fƒj•)‘dWxl78ùyú¾_ðΟ‹ÿoÿx›K¸™ôÿ!Y毱®Õ,ÚÇNÿ8ƒÎá c#æPWã^!â]LÆT®£§fÛ¿Þ¹OG A°¬GÅ>Ó¯$²Ôx3þ‚zÿýÿ‡ÿW«i¶VÚvm§ÙGå[Z›‰ÚЍÉäàÖ»³ŠølMgZŒ›ot×d‘ìñf7/Ì1o„œœ§ºjÉY$¬þDõÈükÿ’5ãû¯ÿôžJÂø£ñÃÀ_µý?EׯfšêîB— cåÌlîÈ{„Y + ØŒôwí¤|Jø]ƒ¬C.›â*{k{è“xQ,mm„ƒ•$åÒ •8 ã*8ZøgGV Sm4í£³ÿ€|‹’wŠÜ‡öKÖîµÿÙÏÁ—בñXµ’ˆ ²ÚW·BrOÌR%'¶IÀêuà°&»ý¯û<Úiÿeò±5+«þfï;s øÀÛÿqÏÜÎyÀ÷úþ‘(ømãË/‚ç¢øÅàORñŸˆâ2’Ék%µÜ2‰ã$ $RH~ržb¡vÝcÿ x«Â!ÓüX“[Ü\ÞIwig4Œ^ÒÝÕ1)ÿVKrƒ¡“œ1`=ŠŠúüf¸(a]%Y¶¼¶²è¾oÔ秇TåÍsÅÿàŸºeî‹ð§Äú>§‘}aâÛ»k˜·Ù"Al¬¹RAÁd+èÚù³öuÕïü=ûK|Søa$ßm°¹¼M»V?"YŒ-"c¶Vâ%Él#!Fó¤ëö¼!bpôë/´“ûÕÏ6JÍ ¢Š+¤AEPʰA7¿ ùò%ýn™ï´W¾ý¯¿è©ø3ÿÓÿ¨ÿ…}û_ÑSðgþ§ÿ!Qÿï3ÿŸûåÿȇÖáÙžûExü+ïÚûþŠŸƒ?ð?ù øWßµ÷ý?à:òñó?ùù¾_üˆ}n™Šå _¿ì^›ÿEjõ=|Çðãà¿Æx~=øwâWÄøgYM¼ÖÌlË$¾[C:¢ª­¼hpóI9Á=p}9_©äØ*˜ ,=Fœ¢¬í·èpÔ’”›AEW¦@QEQEQEQEQEQEQEÿÙPythonCard-0.8.2/samples/montyhall/closed2.jpg0000644000076500007650000000556710040262357021236 0ustar alexalex00000000000000ÿØÿàJFIFHHÿÛC  !"$"$ÿÛCÿÀid"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?û.Š( Š+æÛÿÛ?á=µõż:_‹o"ŠVD¸†ÊÀPó+=FåSƒÈŠúJŠù›þWágý™¢¾fÿ†ÕøYÿ@ÿà·ÿ$Qÿ «ð³þ€3ÿÀ;oþH ¦h¯™¿áµ~ÐÆømÿɧá?Úïá·‰|U¤ørÇDñlwz­ô6P<Ö¶â5y\"–"rBå†p Çc@CQEQEQEÏüGñE¯‚¼®x²ðBÑiV2ܬRÎ!YTìˆ9 ïµ倞+Êe YxGà‡‡ã´6mZÝ5k¹pFù'E`0Xµ<´ãìÝ€I­ÛkþM‹Åßöåÿ¥°WIðóG¹ðï€<;áûÙ!’ëLÒ­¬æxI(ÏJŒT SŒ€qØWç>#b0”i'ñI»w²ý.v`×¼Ù»\¯¾ xkÁQ¢ëR5Ü©¾+Ktß3®à7c (ëË­Œ‘Šê«Í[àö‡wãëßkW÷š¨žà\Eg> jp~G<—@ví_”P§p¯ËpqÃ9·ˆnˢݾÞGÒe0ËåVRÇɨE](­dû_eêÿ3”Ó¿h»'¼5 Ü[Ûï’ Á+¯RŠ8þ!ëÏJ÷+iá¹¶ŠæÚhæ‚T‘°eu#!G9¯œ¾,ø–ÿâgŽm<áy,çÓâ¸ÌSùg•P—¹")pçv ² }á½7ûún‘çyÿa´ŠÛÍÛ·~Ä »8Î3ŒšïÍpÔ)S§(C’RÕÆíéÑ»ì{¼M—à°Ø|=ZT½I¦Ü9œŸ/Fï³òýS/׊þÕ·Z>‹ÃjâbÒ¼q§Ë5á„»Án7É.6‚Ø"%%W©Eà+Ú«Ë¿jÏÿÂIðÄöñÅf×6ãQ†K…Ï•ä0’B‡«˜–Dc;ðHÒáìBÃæ”*KneøéúŸY^ íEr.î¯þx.úúæk«»ŸØM<óH^I]­Ð³³Y‰$’y$×Y_ÑGQEQE|éûVÙ[xÛâŸÂ¿…÷šœ#L¿½»Õ5K†’D·‹tyÚDˆ®¢æ0À’Çæ(1ìÕàÚ¤>.ý¼æ¼Ki­m| G “„2%ËÍ2)nD‹Ç |ĈNßy¯Æ¼Cĺ™Œ(©]F+NÍ·½ržŽ6ƒa^ûPxÒÿMŽÛÂ:l²[‹Ûs=ôŠ0^"ÅV0ÙÈ«îämÁ`}Ƹ_ˆ? |?ã}fWU¼Õ!ž+u·U¶–5R¡™²w#åÏJù®µ 8˜Ô®´_ŸCê8k‚Áæ¯W„nö¾½4òßÔä>xcÂPêWÚæ‰m®ß¡7&}F28÷‘»äB±^»Í÷@_bÓ¯¬µ8ïtû»{Ëi3²h$#`pÂü+ÊáŸ<ÿA=þÿÃÿÆ«¾ð„´Ÿè_ÙGÚ™¦’IßsÈí“€áTpO\“¶eS ^N´&ܛ٭-ÿìâ*ùn2¤ñTkNu$öq²K²wÙh–æýr?ÿäxßþÅëÿý'’°¾(üpðíOÑuëÙ¦º»¥ÂØùsû²á‡@V@à ł¶ã=ûi¾_Å ë˦ø‡JžÚÞú$ÞKF[a åI9C´‚¥N8ÎŽ¾ÑÄÕƒTÛM;hìÿà$äâ·!ý’õ»­ösðeõäpÇ,V-d¢ Bì¶•íМ“ó‰Ií’pàzxì ®ÿkþÏ6šÙ|ŸìMJêÇ™»ÎÜÂã~06ÿÇÆÜs÷3žp=þ¿¤O(¢Š(¢Šð†—v·¿´¿Æ¹¬îa¹‰eÑagŠ@ê;WGBGñ+«)AR"½j¾yý—ä·üwÿ±“ÿnokèjü?äw_þÝÿÒ"z˜oá ¢Š+åŠ( Š>xòËà†¹ãè¾1xSÔ¼gâ8Œ¤²ZÉmw ¢FxÉ ’œ§˜§h]€Å†÷_Øÿž*ð‡ÁÈtÿ$Ö÷7’]ÚYÍ#´·uLFÊÕ’ÁÜ èdç Xb¢¾¿;âê™® WIFÖm¯-¬º/›õ9éáÕ9s\ñø'î™{¢ü)ñ>©Áä_Xx¶îÚæ-Á¶H[+.TpAŠú6¾lýu{ÿ~ÒßþI7Ûl.goA.ÕÈ–c H˜Á-•¸‰r[ÈÈQ¼ãé:ý¯ˆXœ=:Ëí$þõsÍ’³h(¢ŠéQEò‡ìMïÃOë—„Üê·Þ"˜ÝÞËóÏqˆaqæH~fù¤‘¹'—cÜ×ÑUó§üóþHÖ¯ÿc ßúOm_E×óß¶ó|Eÿ›ô=jÃAEW€jQEQEyVwkmûmA ÅÌ0ËuðøÃn’H¦q~\¢÷›b;`s…cÐ÷ªùcÅ?ò/‡_ö/Mÿ¢µ úž¿¡8_þEðžMâ0¢Š+ß2 (¢€>Oÿ‚~ÉÕÿìa›ÿIí«èºùá÷ÀoÚ[À:4Ú?„¾ x3N±šá®d‹ .d*ª[2Z1èŠ1œq]ü+ïÚûþŠŸƒ?ð?ù ¿,ÎxŽÇUÄSœdî®Ýÿô–wSÄÂ1IžûExü+ïÚûþŠŸƒ?ð?ù øWßµ÷ý?à:òyŸñó?ùù¾_ü‰[‡f{íà_ð¯¿kïú*~ ÿÀtÿä*?á_~×ßôTüÿ€éÿÈTÄ;Ìÿçä>ùò!õ¸vg¾Ñ^ÿ ûö¾ÿ¢§àÏüOþB£þ÷í}ÿEOÁŸøŸü…GüC¼Ïþ~Cï—ÿ"[‡fEâŸùHïû¦ÿÑZ…}O_4ü/ø)ñr?ŽÚ/Ä¿Š1ðþ¬ú=”Öð Ï™ d•Ī£Ï‘·|Ç `å~–¯ÔòlL–£NQVvÛô8jIJM ¢Š+Ó (¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÿÙPythonCard-0.8.2/samples/montyhall/closed3.jpg0000644000076500007650000000561010040262357021224 0ustar alexalex00000000000000ÿØÿàJFIFHHÿÛC  !"$"$ÿÛCÿÀid"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?û.Š( Š+æÛÿÛ?á=µõż:_‹o"ŠVD¸†ÊÀPó+=FåSƒÈŠúJŠù›þWágý™¢¾fÿ†ÕøYÿ@ÿà·ÿ$Qÿ «ð³þ€3ÿÀ;oþH ¦h¯™¿áµ~ÐÆømÿɧá?Úïá·‰|U¤ørÇDñlwz­ô6P<Ö¶â5y\"–"rBå†p Çc@CQEQEQEÏüGñE¯‚¼®x²ðBÑiV2ܬRÎ!YTìˆ9 ïµ倞+Êe YxGà‡‡ã´6mZÝ5k¹pFù'E`0Xµ<´ãìÝ€I­ÛkþM‹Åßöåÿ¥°WIðóG¹ðï€<;áûÙ!’ëLÒ­¬æxI(ÏJŒT SŒ€qØWç>#b0”i'ñI»w²ý.v`×¼Ù»^{ã‹Þð—ˆeÐï Õ.náEi~Í BÃpRY×'iŒŽG9È…Xž(Ñü?sm>«ªøjÏXžÖÝŠ«XÇ<îª yi¸d’s…ÏSï_•á]S÷Ñmy;j}Y,$kÿµÁÎ/¤]ú{ÿ àÏúkÿ÷âþ;^•á]vÃľ³×4Æ‘­.вy‰µ”‚U”PÀŽ28à‘Í|‘â2oÄ^¸ÒtË™·Ç¥GY#¢(ŠºX¨Üq·#Sü6Ô<5¨ø6ÆO ¬qiq§–(Ã@ÖG'~NI$ç;²s“ìfù} 5N”^»»¦½=ëx¯!Áeø:U°´äœ·|ÊQZ;Æë­úìõß§G^+ûVÝhú,_ üQ«ˆa‹JñÆŸ,׆ï¸ß$¸Ú `ˆ”•^¥‚@¯j¯.ý«<;ÿ 'À_ÛÇ›\XÛF.>WÂI ®bYŒïÁ \ü=ˆX|Ò…ImÌ¿?SóÚÊðh÷j+“ø1wuð{Áw××3]]Üø~ÂiçšBòJín…˜òÌI$“É&ºÊþŠ<€¢Š(¢Š(çOÚ¶ÊÛÆßþü/¼ÔáeýíÞ©ªXŒ4’%¼[£ÎÒ$Eu1† –?1Af¯Õ ¹ñwíç5â[Mkkà}8dœ!‘.^h™‘Kp"$^9æ$@ØêvûÍ~5â%ÔÌaEJê1Zvm»ýë”ôp‘´ àoþ(é6—À×vW³yQ ÌåLòdM€gi £vxc‚1óW}^kñ«á‚xæ85:æ;]fÙ*Ó3y2Ÿ­€JYˆ w ƒWã° *¼¸"Õ¯ÙôgÑdqËç‰tñ÷P’iI}™t“î—Ý®§gã;]÷ÂÚ…—ˆn-í´ËˆLSÍ;¢,{ˆ ÁŸå ©Rz6+Ç¿dIækoÛ4Ò#{gH˪Ì% Àt…PO}£Ò©ÿÂñž·¨ùþ+ñ…¼»!Ùþd×’ðrlÂòǯ^Üæ½—À~Ò|¡dihhZfšI'}Ï#¶N…QÀ=rO¡Vx|.xxTç”ÚÙh­þg¿‰­€Ë2ŠØ8m:®/DÔcg{ÝîÞÚÃï×#ñ¯þH×ÿì^¿ÿÒy+ âÇ|:×ôý^½šk«¹ \-—1°»!î8td 0¬X+`3Ñß¶‘ñ+áuüZ± ºoˆt©í­ï¢MáD±´e¶T“”;H*TàƒŽJ8ZøgGV Sm4í£³ÿ€|+’wŠÜ‡öKÖîµÿÙÏÁ—בñXµ’ˆ ²ÚW·BrOÌR%'¶IÀêuà°&»ý¯û<Úiÿeò±5+«þfï;s øÀÛÿqÏÜÎyÀ÷úþ‘]ÚÞþÒÿæ³¹†æ%—E…ž)¨xí] Ä®¬¤uH<Šõªùçö]ÿ’ßñßþÆOý¹½¯¡«ð^4ÿ‘ÝûwÿH‰êa¿„‚Š(¯–7 (¢€>(ømãË/‚ç¢øÅàORñŸˆâ2’Ék%µÜ2‰ã$ $RH~ržb¡vÝcÿ x«Â!ÓüX“[Ü\ÞIwig4Œ^ÒÝÕ1)ÿVKrƒ¡“œ1`=ŠŠúüf¸(a]%Y¶¼¶²è¾oÔ秇TåÍsÅÿàŸºeî‹ð§Äú>§‘}aâÛ»k˜·Ù"Al¬¹RAÁd+èÚù³öuÕïü=ûK|Søa$ßm°¹¼M»V?"YŒ-"c¶Vâ%Él#!Fó¤ëö¼!bpôë/´“ûÕÏ6JÍ ¢Š+¤AEPʰA7¿ ùò%ýn™ï´W¾ý¯¿è©ø3ÿÓÿ¨ÿ…}û_ÑSðgþ§ÿ!Qÿï3ÿŸûåÿȇÖáÙžûExü+ïÚûþŠŸƒ?ð?ù øWßµ÷ý?à:òñó?ùù¾_üˆ}n™Šå _¿ì^›ÿEjõ=|Óð¿à§ÅÈþ;h¿þ(xÇÃú³èöS[À,#>d’TT Cª>FÝó€1ƒ•úZ¿SɰU08Xz9EYÛoÐá©%)6‚Š(¯L€¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(ÿÙPythonCard-0.8.2/samples/montyhall/mh.py0000644000076500007650000000144210040262357020143 0ustar alexalex00000000000000#!/usr/bin/python # Monty Hall game from random import randint class MontyHall: prizedoor = 0 guessdoor = 0 bogusdoor = 0 def __init__(self): pick = randint(1,3) self.prizedoor = pick def guessDoor(self, door): self.guessdoor = door # Show Bogus Door pick = randint(1,3) while pick == self.prizedoor or pick == self.guessdoor: pick = randint(1,3) self.bogusdoor = pick def changeDoor(self): doors = [1, 2, 3] doors.remove(self.bogusdoor) doors.remove(self.guessdoor) self.guessdoor = doors[0] def win(self): if self.guessdoor == self.prizedoor: return True else: return False PythonCard-0.8.2/samples/montyhall/montyhall.py0000644000076500007650000001122310040262357021544 0ustar alexalex00000000000000#!/usr/bin/python # Monty Hall GUI from PythonCard import model import mh class MontyHallApp(model.Background): imgdoor1 = 'closed1.jpg' imgdoor2 = 'closed2.jpg' imgdoor3 = 'closed3.jpg' imgbooby = 'open-cents.jpg' imgprize = 'open-dollars.jpg' games = 0 wins = 0 changes = 0 wins_change = 0 def on_initialize(self, event): self.game = mh.MontyHall() def on_bOne_mouseClick(self, event): self.guessDoor(1) def on_bTwo_mouseClick(self, event): self.guessDoor(2) def on_bThree_mouseClick(self, event): self.guessDoor(3) def on_bYes_mouseClick(self, event): self.changeDoor(True) def on_bNo_mouseClick(self, event): self.changeDoor(False) def on_bAgain_mouseClick(self, event): self.playAgain() def on_bResults_mouseClick(self, event): self.showResults() def guessDoor(self, door): self.game.guessDoor(door) if self.game.bogusdoor == 1: self.components.image1.file = self.imgbooby elif self.game.bogusdoor == 2: self.components.image2.file = self.imgbooby else: self.components.image3.file = self.imgbooby self.components.bOne.enabled = False self.components.bTwo.enabled = False self.components.bThree.enabled = False self.components.bResults.enabled = False self.components.bAgain.enabled = False self.components.bYes.enabled = True self.components.bNo.enabled = True self.components.txtBox.text = self.guessMsg() def changeDoor(self, change): if change: self.game.changeDoor() self.changes += 1 if self.game.win(): self.wins_change += 1 self.games += 1 if self.game.win(): self.wins += 1 img = self.imgprize else: img = self.imgbooby if self.game.guessdoor == 1: self.components.image1.file = img elif self.game.guessdoor == 2: self.components.image2.file = img else: self.components.image3.file = img self.components.bYes.enabled = False self.components.bNo.enabled = False self.components.bResults.enabled = True self.components.bAgain.enabled = True self.components.txtBox.text = self.components.txtBox.text + self.prizeMsg() def playAgain(self): self.game = mh.MontyHall() self.components.image1.file = self.imgdoor1 self.components.image2.file = self.imgdoor2 self.components.image3.file = self.imgdoor3 self.components.bOne.enabled = True self.components.bTwo.enabled = True self.components.bThree.enabled = True self.components.bYes.enabled = False self.components.bNo.enabled = False self.components.bResults.enabled = False self.components.bAgain.enabled = False self.components.txtBox.text = '' def showResults(self): self.components.txtBox.text = self.resultsMsg() self.components.bResults.enabled = False self.resetResults() def resetResults(self): self.games = 0 self.changes = 0 self.wins = 0 self.wins_change = 0 def guessMsg(self): msg = """ You guessed Door %d Monty opens Door %d to reveal a worthless object. """ return msg % (self.game.guessdoor, self.game.bogusdoor) def prizeMsg(self): msg = """ Monty opens Door %d to reveal %s """ if self.game.win(): prize = "A GREAT PRIZE." else: prize = "a booby prize." return msg % (self.game.guessdoor, prize) def resultsMsg(self): games = self.games changes = self.changes wins = self.wins wins_change = self.wins_change no_changes = games - changes wins_no_change = wins - wins_change lost_change = changes - wins_change lost_no_change = no_changes - wins_no_change msg = """ Games Played: %d Changed Guess: %d Won: %d Lost: %d No Change: %d Won: %d Lost: %d """ return msg % (games, changes, wins_change, lost_change, no_changes, wins_no_change, lost_no_change) if __name__ == '__main__': app = model.Application(MontyHallApp) app.MainLoop() PythonCard-0.8.2/samples/montyhall/montyhall.rsrc.py0000644000076500007650000000512710130317155022517 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'Template', 'backgrounds': [ {'type':'Background', 'name':'bgTemplate', 'title':'Monty Hall Game', 'size':(396, 465), 'style':['resizeable'], 'menubar': {'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ {'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit', 'command':'exit', }, ] }, ] }, 'components': [ {'type':'TextArea', 'name':'txtBox', 'position':(70, 170), 'size':(237, 146), 'alignment':'left', 'font':{'faceName': 'MS Shell Dlg', 'family': 'sansSerif', 'size': 10}, }, {'type':'Button', 'name':'bResults', 'position':(235, 380), 'enabled':False, 'label':'Results', }, {'type':'Button', 'name':'bAgain', 'position':(75, 380), 'enabled':False, 'label':'Play Again', }, {'type':'StaticText', 'name':'StaticText2', 'position':(120, 320), 'font':{'faceName': 'Microsoft Sans Serif', 'family': 'sansSerif', 'size': 12}, 'text':'Change Your Guess?', }, {'type':'Button', 'name':'bNo', 'position':(195, 345), 'size':(150, -1), 'enabled':False, 'label':'NO', }, {'type':'Button', 'name':'bYes', 'position':(40, 345), 'size':(150, -1), 'enabled':False, 'label':'YES', }, {'type':'Button', 'name':'bThree', 'position':(250, 145), 'size':(95, -1), 'label':'THREE', }, {'type':'Button', 'name':'bTwo', 'position':(145, 145), 'size':(105, -1), 'label':'TWO', }, {'type':'StaticText', 'name':'StaticText1', 'position':(155, 120), 'font':{'faceName': 'Microsoft Sans Serif', 'family': 'sansSerif', 'size': 12}, 'text':'Pick a Door', }, {'type':'Image', 'name':'image3', 'position':(240, 10), 'backgroundColor':(255, 255, 255), 'file':'closed3.jpg', }, {'type':'Image', 'name':'image2', 'position':(145, 10), 'backgroundColor':(255, 255, 255), 'file':'closed2.jpg', }, {'type':'Image', 'name':'image1', 'position':(45, 10), 'backgroundColor':(255, 255, 255), 'file':'closed1.jpg', }, {'type':'Button', 'name':'bOne', 'position':(40, 145), 'size':(105, -1), 'label':'ONE', }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/samples/montyhall/open-cents.jpg0000644000076500007650000000753010040262357021746 0ustar alexalex00000000000000ÿØÿàJFIFHHÿÛC  !"$"$ÿÛCÿÀid"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ô/ÚKâ­þ3øá‡Ã}rmQÕb{­FàÙ[OÙÙð ³–`¸r£nàTIÀ§¦øÿã×Âí6öëâo‡lü}¢Âcº¸Öt[˜¡šÂ í•LZ¶€…PmÒcý^·ŠtË+ÿÛMº»ƒÌ›Nð¹´mÄyrÙb-€p~Id96z€G­Wç\MŸ¬«2Th¤à’m5»mìו¾}×F„jBìƒá¯Ä|G±»¼ð^¿«œ¢+•I‘2¤¤Š¬ó†Æ V’§exWÄ_žñmÍεi`|=Ⓣmu½1š`¸rˆÊ®ûÎK¼ŽŒ¤)ØøáãƒÐ[ét9üA‘™!ñ'‡¡ÌR;»l¶‘]!ŒH$l©hOÍ^þIÅx,ÛÜ»?å£ëø?#*”%O^‡Ó4WÌßðÚ¿ ?èã?ü¶ÿäŠ?áµ~ÐÆømÿÉôÆ'Ó4WÌßðÚ¿ ?èã?ü¶ÿäŠ?áµ~ÐÆømÿÉôÍó7ü6¯ÂÏúxÏÿí¿ù"øm_…ŸôñŸþÛòE}3Ex¿k_†^,ñ~•á›m?ÄÖ:¥ÊZÛÍyg”%s„V1Êì71 Ò`NH÷ú(¢Šð½kþOQìœý9ôúó kþOQìœý9ôúü??äo/ðÄôð¿Ã ùÇöƆëÆ>$øuð›Nš/7\Õ¾Ñtb„Ïqh‹ˆÖs°ýØI.çù'æZ¾Ž¯þ̶×ÿo ê N'†ü ÷7 ï$Ñ›÷gmÚIÈ'ã Ç‚0ê¶qM¿²›ü-úíMŸIÑEû±å…‹ãCá_ _kÓÛÉr–¨¤D„ìÌFOA¹†O8àô£Àþ ‡Å^±× ·’Ù.‘‰‰È%X« Ž£rœ21ÀéY{z~רßÞµíå±~Î\œöÓcjŠ(­H<öÖÔ4¯è÷”œdQsÐïõæµF…ÿ ìóã]?í_eò´Ö¾ßåïÏÙ™n6c#ïy[sÛvpqƒ³ð'þH‡€ÿì[Ó¿ôš:ì袊ð½kþOQìœý9ôúò_êvV¶þ›kw?—6£à#mh»Ió$²ÊW `|‘Hrp>\u Z¯Ä8ö-f͵¼cúž–øa^+ûéžÕuO‰Ÿ´Ãö«_Åw–¶×/´ ³®ÍÊ7™`O;#à¯Hø¡©Þè¿ üS¬i“ùÖ5ÝÍ´»Cl‘!vVÃX±—‚¿á ø £y—uνÿ¹ö¾äO>4òÕ~PF"X·ŸŸ~ ¯wÃ|7ñë¿%ù·ú[ægŒ{#Ù¨¢³|Q®Xxo@»Öõ6ZÚ gò×s1$*¨¥ˆàsÉšýBsŒ"å'dŽ(§'dyÿí!â-*ÇÀ×–}Ú–£å˜`NJ¢J¬]¿º¿!ÔôèÄr¾-ø{þÓü;¬Z_Å%¼®¿h‰Hö<…÷·!†7@ Âädœ?—OÔ¼Y¤ø³Çº£H»ÆUm­4“"ùk¸¢FHÆì®cí^»ð·ÀžñGÁí+ûWH€ÜËç“y ˆî eU;Ç-ŒÊð2+ãébqxÌs«BÑ|º_¬Tºú³Û*40ü•.õÖÝíþG«hÚ•†±¥ÛêzeÔwVw ¾)PðÃù‚AA‘Vë7Âú‡†ô MLY­ªO1·3K3êX“Æ<8­*úú|ü‹Ÿ{knç‹+s>]Ž3ã·ü‘Ø·¨ÿé4•ÌþÇÚ¥þ±û6ø:ïQŸÏš;imU¶*â('’— ùc=N2rI5èÞ,Ñ-|Ká][×ÒM¦«c5”ï EIP£$ qF{ðoø'ž©¨|žÒò63[¸µ³]Š<¸ŒqLW dþòi''æÇ@²O£(¢Šùkö›ŠçÃ_µgÂÚO ÒjýˆÖÒÄqy¾[ɸ0É+|ØÀ1‚wôy7íu¢ZÏâ„>#y&v>8²²‰YIÜ;’1ÀÛ&0@Álƒ‘Y¯È|G‚Xº2ëÊÿ?ø'¡ƒøYÀ~ѺŶ…ð+ÆW·qÌñÉ¥Kf¢ ßp<„<‘Àižøžcð'þH‡€ÿì[Ó¿ôš:ò_ÛWS²°ýžõ«[¹ü¹µ‹[kEÚO™ %+0>H¤98.:°ü´º°ø=à»ëi­ní¼?a ðMI"u·@ÈÊyVAä^ÿ‡tyrê•-«›û’_«fX·ï¤u•À||Ðõ½{áü–ºÉ,°Ü$óÛÆÄ4ñ(l¨ïÅ[o}¼dàþŠûœMâ)J”¶jƪ:sS]š´ÿiW_³Ž¥á©.`ƒR²•8\<è×+.õ ã.ÆÜœdW§|Ô¬4‚f§©ÝGkgn—,®xQö‰?IÀrIrk–ý¡>éI¦ßøßO“ìsǰÝÛ¬yK‡y7ŽFÆù‰<ØÏ$ò~ øiãøGK|EZ’³Çk-Ä­äí‘Õ™bÛ³vw‘ÈÎzŒšùJrÅá1œœœòŒ9Uº«èßäÿ¦{T+Pææ²r»õ¶¨úGFÔ¬5.ßSÓ.£º³¸MñJ‡†Ìr<‚<Š·Y¾Ðì<7 ZhšbÈ-mPªy¹˜’Y˜ŸRÄž09àÅiW×Sçä\ûÛ[wòd„ì‘Ç;°PHáN2@Ïq^¯^%ÿ´º¹ø§Íom4ÑZø‚Þk‡Ž2Ë g@îGÝ]î‹“ÆYGR+Ø´MNËZѬu2>ÆþÞ;›iv•ߨel0dp@5ù_‰4}ì=T¿™~VýNìÝ?ÿÁ@ÿäiö0Ãÿ¤÷5õ…|Ÿÿÿ’5¤ØÃþ“Ü×Öô<ÿ"ˆÿŠF8¯âQ_fsœÆ6ÿWøe¬Xi–²]]:Féc,Á%Glçjž' É£à¾›¤|2Ñì5;Y-n‘$wŠA†Pò»®Gcµ‡‘Ðà×aErýV?YúÅõååünmퟲö]/Ð(¢Šê1 ùçâf‰uíÅð§Äo$&ÒûH¿²‰>`x ¹w$cH¹L`“Ù?CWŒüZÿ“ø!ÿqÿý"Jöj(¢€'üa´š×¦&_xm'xÃB㉔«<6áµ¥![å‰Q[Ó?á—>ÿÐÿ•kßþ=_MÃ9]L¯.… ¯ÞÕ¿+ôùÖšœîŽÏþÇÂÏú)~ ÿÁí·ÿGü-…ŸôRüÿƒÛoþ.¸ÏøeÏ?ô#åZ÷ÿQÿ ¹ð'þ„oü«^ÿñê÷ÌŽÏþÇÂÏú)~ ÿÁí·ÿGü-…ŸôRüÿƒÛoþ.¸ÏøeÏ?ô#åZ÷ÿQÿ ¹ð'þ„oü«^ÿñêìÿál|,ÿ¢—àÏüÛñtÂØøYÿE/ÁŸø=¶ÿâëŒÿ†\øÿB7þU¯øõðËŸèFÿʵïÿ ÏþÇÂÏú)~ ÿÁí·ÿ^gãOxWÅ´ïÁøF|K¢ëfþÝûGöuôWVë%Û»c¹ÚØÏ\JÙÿ†\øÿB7þU¯øõtøð¯À~"Oø[ÂPÙj‘ÄÑGq%Ô÷ n •Ø+‘¸pXg Aôj(¢€9?Œö—Wÿ¼iccm5ÕÝχïá‚c/$®ÖîG,Ä’kæ¿…ÞøñGð%øvãžðŒv±®Ÿ=¼_j÷Û¬cs>"åÉe Ä›fd`Q\õp´kN*Fî¯'ÜjM+ ¢Š+ AEPEPEPEPEPÿÙPythonCard-0.8.2/samples/montyhall/open-dollars.jpg0000644000076500007650000001051510040262357022267 0ustar alexalex00000000000000ÿØÿàJFIFHHÿÛC  !"$"$ÿÛCÿÀid"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ô/ÚKâ­þ3øá‡Ã}rmQÕb{­FàÙ[OÙÙð ³–`¸r£nàTIÀ§¦øÿã×Âí6öëâo‡lü}¢Âcº¸Öt[˜¡šÂ í•LZ¶€…PmÒcý^·ŠtË+ÿÛMº»ƒÌ›Nð¹´mÄyrÙb-€p~Id96z€G­Wç\MŸ¬«2Th¤à’m5»mìו¾}×F„jBìƒá¯Ä|G±»¼ð^¿«œ¢+•I‘2¤¤Š¬ó†Æ V’§exWÄ_žñmÍεi`|=Ⓣmu½1š`¸rˆÊ®ûÎK¼ŽŒ¤)­ïÇ?ˆ_ô¡¥übðéñ<ílòÙxƒE;içfo*Ò}ÑFˆøI d„Ùû¶;˜ûù'à³or>ìÿ•þ¯àüŒªP•=zOÑ_3Ãjü,ÿ ŒÿðÛÿ’(ÿ†ÕøYÿ@ÿà·ÿ$WÓŸLÑ_3Ãjü,ÿ ŒÿðÛÿ’(ÿ†ÕøYÿ@ÿà·ÿ$PÓ4WÌßðÚ¿ ?èã?ü¶ÿäŠ?áµ~ÐÆømÿÉôÍàý­~x³ÅúW†m´ÿX\ê—)ko5åœ^P•ÎXÇ+°ÜÄ(;H8#ß袊(Âõ¯ù=Eÿ²r?ôäkÓëÌ5¯ù=Eÿ²r?ôäkÓëðþ<ÿ‘¼¿ÃÓÂÿ +çÛ¯ø“á×Âm:h¼ÝsVûEÑŠ=Å¢.#YÌjÃ÷a$¸sœ䟘jú:¼Gû2Û_ý¼4k¨58DžðƒÜÜB€HK¼“D"lÝ·i' œcŒ0#êÙÅ6þÊoð·ê˜-Òá8Éiñ°89bÊ9Æ3Î9¯Ÿþ6|O°ñ…‘дÍ>Agmz³Åzò`ÌÕíÊ‚\‘“œ ÀƒYø©«ð´ø*]KwŽÊÚÞ+¥¸¢xùeÚ6‚¨Ç‚pp=ÇÍUÏéF¥HÆJÊ>îYkývŽð¶¹aâMÓ[ÓCkt…“Ì]¬¤¬¤z†q‘ÇŽkN¼·önñ•}à[C>ÝKNó Ð?‘åf¿Þ_œèzõR}J½¼#ëxT½ÛJöï×ñ=5_kJ3î¿À?mmCJðî‡ðóÆ:—ý‰ã{†’(•® ²Ë,q–#ïyIÆ@%=ÿ^gûTh_ð‘~Ï>5ÓþÕö_+Mkíþ^üý™–ãf2>÷•·=·g;?äˆxþŽ;ÿI£®£s³¢Š(Âõ¯ù=Eÿ²r?ôäkÓëÉ|S©ÙX~Ûúm­Üþ\Ú€µ¢í'Ì^Ë)\òE!ÉÀùqÔ€}j¿ãص›6ÖñêzX_á…x¯ì[¦xwUÕ>&|JÓÚ®5ÞZÛ\¼@bÐ2λ7(tÞf<ì€V½#↧{¢ü3ñN±¦Oä_Xh×w6Òí ²D…Ù[ 8 E`~Æ^ ÿ„/à&æ\y×:÷üNçÚû‘<øÓËUùA‰bÜ~}ø$b½ß ðßÇ®ü—æßéo™ž1ìf®ãÌó[ü&×$‚i"r‘!db¤«LŠÃŽÅIwŠî*;˜!¹·’Úææ†T)$r(eu#x Ž1_¦b):´eM;]5÷£Í«iNP]SGÊwqè‰ð Õ¬'ŽMMõÕmEHdgÊœF½Ù´dugÁê§üA²³ŸömÓï'´·–æÛJ°û<Ï/ãm¬y\Ž:×ñ»á•·ƒ¢]sJ¼Ý¦Ý]ù+k ;à%K'zü¯×|£æäÖf»ã¸´ð¦±¥G•qoZÝMi$rKlŽ›!d)ãäæ¾%TxOkF¼lù9tÕy?žþ§ÍóûiN¬lùm¦ÞOæWÒ´ío¶¾ñLJâ’âkç–%C”yâY#ò°GwÀ¯®+Ég_h3øGNð§Û<­^ÛÏ>DŠGš¦F“(z7Ó;¾V8ÀÍzÕ}G‡…:ôåu$´ìí¯Íõ=l²”aKšºvÓ³¶§ñÛþH‡?ì[ÔôšJæcíRÿXý›|w¨ÏçÍ´¶ªÛqÉ K…|±Æ‹ž§9$šôoh–¾%ð®­áËé&ŽÓU±šÊw„"¤¨QŠ’ †8È#=x7üÏT¿Ô>Oiy?›™­ÜZÙ®Å\F8¦+2y4““óc {g¤}EPË_´ÜW>ý«>xÎÒxf“TìF¶–#ˆÓÍòÞMÁ†I[æÀÆŒ¸ +É¿k­Ö|!ñÉ0»±ñÅ•”HòÊNáÜ‘ŒîÙ1‚ dŒzÍ~Câ<ÅÑ—^WùÿÁ= ÂÎöÖ-´/^2½»ŽgŽM*[5Nûä!äŽH¤÷À8ð{?òD<ÿbÞÿ¤Ñ×’þÚº•‡ì÷­ZÝÏåͨÜZÛZ.Ò|Éé)\òE!ÉÀùqÔ€}‡àÅ¥Õ‡ÁïØß[Mkwmáûg‚hÊI­ºFSʰ ‚ Š÷ü;£Ë—T©m\ßÜ’ý[2Å¿}#¬¢ŠòßÞ-ñ7„?°ot|»i%”]‡·WŽB6Fb2¹gÝ :qöø¬L0´Yì»zØóëÖn¤¶EÚŸþIõ‡ý…cÿÑSQã¿ù6ûißú™û@ëºoˆþé:®•sÐË©ÂYUÕš&0HÞ[í$+€Ã#ëÈùú¸HF¥XÁ´”o£ü‘çÿ~Þx² ?]×î¿âAô‚ÜLL’ª¹ÊŒ«Œ¹“8!²n _KWð ­þhqÏ ‘9I\+©RU¦vSÏb¤{‚ wïeJx|4e¬’oîýSB¨§«I¿¸+矉š%Ô·Ÿ¼›Kí"þÊ$ùà‚åÜ‘Œm"å1‚NCd ý ^3ñkþNwà‡ýÇÿô‰+Ô;Of¢Š(Æm¯ù6/Û—þ–ÁZ?äx#þÅëý'Ž´ÿhý.ÃXø ã‹MF>ôK›¥]츖ÌÑ6TƒòÉ6:`ä+›øu®éýžü)¯k×ðØi¶^°’ââS³ÆÀä’H@$’+ó¯!)áèF*íÉþG^FÏ-ÿ‚ƒ]['Â}Éîa[©uÔ–8K€î‰ÁØ/RºzËž¢¾ƒÿ…±ð³þŠ_ƒ?ð{mÿÅ×€|6øi®|×SâÆI­|*beðç†ÒwŒ4.8™ÙJ°SÃnZR¾X•½3þsàOýßùV½ÿãÕôÜ3•ÔÊòèPªýí[ò¿O‘i©Îèìÿál|,ÿ¢—àÏüÛñtÂØøYÿE/ÁŸø=¶ÿâëŒÿ†\øÿB7þU¯øõðËŸèFÿʵïÿ¯|Èë5‰õ7³Ô> xîÚLo†}bÑѰARø8 §ÿ…±ð³þŠ_ƒ?ð{mÿÅ×ÿ ¹ð'þ„oü«^ÿñê?á—>ÿÐÿ•kßþ=JÊ÷ u;?ø[ ?è¥ø3ÿ¶ßü]ð¶>ÑKðgþm¿øºã?á—>ÿÐÿ•kßþ=Gü2çÀŸú¿ò­{ÿÇ©ÙÿÂØøYÿE/ÁŸø=¶ÿâëÌüiâÏ ø£öø1ÿωt]oìßÛ¿hþξŠãÊÝd»wlc·;[ëƒé[?ðËŸèFÿʵïÿ®ƒÀ¾øÄIâ xJ-R8š(î$ºžá£ ûb27 ሠEP'ñžÒêÿà÷,lm¦º»¹ðýü0A eä•ÚÝ¢¨å˜’’M|×ð»À>1èþð÷Ä¿ÜxSÀŽÖ5Óç·’ í^âuŒngÃ$\¹,¡x“`,ÃÌì +ž®iÂ¥HÝÃUäûI¥dQEt(¢Š(¢Š(¢Š(¢Š(¢ŠÿÙPythonCard-0.8.2/samples/montyhall/readme.txt0000644000076500007650000000212010040262357021155 0ustar alexalex00000000000000Monty Hall Game This is a classic problem based on a TV game show called "Let's Make a Deal" with Monty Hall as host. There are 3 closed doors. Behind one is a GREAT PRIZE. Behind the other two are worthless booby prizes. The contestant picks Door 1, Door 2, or Door 3. Before opening that door to see the prize behind it, Monty opens one of the other two doors revealing a worthless object. The contestant is then given the opportunity to change the original guess before Monty finally opens the guessed door revealing the prize. Contestants are usually guided by their own inclinations for or against 'sticking with your first choice.' Many people assume that it doesn't matter whether or not you change your guess. They assume you're faced with a 50-50 choice at that point. Surprisingly, there is a best strategy. Playing the game repeatedly should show you whether or not it's best to stick with your original guess in this situation. One interesting website is: http://www.letsmakeadeal.com/problem.htm Monty Hall Game in Python with PythonCard submitted by Tom Jacobs (tej@tpk.net)PythonCard-0.8.2/samples/mp3player/0000755000076500007650000000000010434046771017100 5ustar alexalex00000000000000PythonCard-0.8.2/samples/mp3player/mp3player.py0000644000076500007650000000466110347526323021374 0ustar alexalex00000000000000#!/usr/bin/python """ We should try and make this work on platforms other than the Mac. """ __version__ = "$Revision: 1.4 $" __date__ = "$Date: 2005/12/13 11:13:23 $" from PythonCard import dialog, model import os class MyBackground(model.Background): def on_initialize(self, event): # KEA 2004-08-03 # this is only going to work on the Mac # so it will need to be generalized later home = os.environ['HOME'] self.buildList(os.path.join(home, 'Music/iTunes/iTunes Music')) # http://www.pygame.org/docs/ref/Movie.html def on_load_mouseClick(self, event): filename = self.components.filename.text path, filename = os.path.split(filename) wildcard = "MP3 files (*.mp3)|*.mp3" result = dialog.openFileDialog(self, 'Open', path, filename, wildcard ) if result.accepted: path = result.paths[0] self.components.filename.text = path def on_play_mouseClick(self, event): filename = self.components.filename.text ## NOTE WE DON'T IMPORT PYGAME UNTIL NOW. Don't put "import pygame" at the top of the file. import pygame self.movie = pygame.movie.Movie(filename) self.movie.play() # it was a good idea at first, but mixer simply doesn't work, at least on the Mac ## assert os.path.exists(filename) ## from pygame import mixer ## mixer.init(44100, 2) ## mixer.music.load(filename) ## mixer.music.play() ## print mixer.music.get_busy() ## #time.sleep(5) ## #mixer.music.stop() def on_pause_mouseClick(self, event): try: self.movie.pause() except: pass def on_stop_mouseClick(self, event): try: self.movie.stop() self.movie.rewind() except: pass def buildList(self, path): mp3s = [] names = [] for root, dirs, files in os.walk(path): for name in files: if name.endswith('.mp3'): mp3s.append((root, name)) names.append(name) self.mp3s = mp3s self.components.mp3s.items = names def on_mp3s_select(self, event): sel = event.target.selection self.components.filename.text = os.path.join(self.mp3s[sel][0], self.mp3s[sel][1]) if __name__ == '__main__': app = model.Application(MyBackground) app.MainLoop() PythonCard-0.8.2/samples/mp3player/mp3player.rsrc.py0000644000076500007650000000256410110230107022320 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'Template', 'backgrounds': [ {'type':'Background', 'name':'bgTemplate', 'title':'simple mp3player', 'size':(404, 380), 'menubar': {'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ {'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit', 'command':'exit', }, ] }, ] }, 'components': [ {'type':'List', 'name':'mp3s', 'position':(10, 10), 'size':(384, 168), 'items':[], }, {'type':'Button', 'name':'pause', 'position':(190, 310), 'size':(109, -1), 'label':'Pause/Resume', }, {'type':'TextArea', 'name':'filename', 'position':(15, 190), 'size':(370, 100), }, {'type':'Button', 'name':'load', 'position':(15, 310), 'size':(74, -1), 'label':'Load', }, {'type':'Button', 'name':'play', 'position':(105, 310), 'size':(74, -1), 'label':'Play', }, {'type':'Button', 'name':'stop', 'position':(310, 310), 'size':(74, -1), 'label':'Stop', }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/samples/mp3player/readme.txt0000644000076500007650000000062610110230110021047 0ustar alexalex00000000000000mp3player is a quick sample I wrote during one of the VanPy Workshop '04 presentations. mp3player uses the Movie class of PyGame to do all the real work. http://www.pygame.org/docs/ref/Movie.html It might make more sense to just roll MP3 support into the PythonCard.sound module except that it will require PyGame to work and Movie has a lot more playback options than the WAV file playback in wxPython. PythonCard-0.8.2/samples/multicolumnexample/0000755000076500007650000000000010434046771021110 5ustar alexalex00000000000000PythonCard-0.8.2/samples/multicolumnexample/multicolumnexample.csv0000644000076500007650000000027707725773773025601 0ustar alexalex00000000000000Item,Weight,Cost/Unit,Units,Cost Oranges,.30,$0.25,7,$1.75 Pears,0.10,$0.27,3,$0.81 Apples,0.20,$0.31,10,$3.10 Pineapple,2.00,$1.05,2,$2.10 Kiwi,0.05,$0.37,12,$4.44 Banana,0.07,$0.10,6,$0.60 PythonCard-0.8.2/samples/multicolumnexample/multicolumnexample.py0000644000076500007650000003110110143462670025377 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.9 $" __date__ = "$Date: 2004/11/07 18:13:12 $" """ from PythonCard import dialog, model from types import TupleType, ListType, StringTypes, NoneType import pprint # Music list borrowed from wxListCtrl demo (Removed long song titles) demolists = [(('List'),('Item 1', 'Item 2', 'Item 3','Item 4','Item 5','Hit demo button again')), (('Artist','Title','Genre'), (("Bad English", "The Price Of Love", "Rock"), ("George Michael", "Praying For Time", "Rock"), ("Gloria Estefan", "Here We Are", "Rock"), ("Linda Ronstadt", "Don't Know Much", "Rock"), ("Paul Young", "Oh Girl", "Rock"), ("Paula Abdul", "Opposites Attract", "Rock"), ("Richard Marx", "Should've Known Better", "Rock"), ("Rod Stewart", "Forever Young", "Rock"), ("Roxette", "Dangerous", "Rock"), ("Sheena Easton", "The Lover In Me", "Rock"), ("Sinead O'Connor", "Nothing Compares 2 U", "Rock"), ("Stevie B.", "Because I Love You", "Rock"), ("Taylor Dayne", "Love Will Lead You Back", "Rock"), ("The Bangles", "Eternal Flame", "Rock"), ("Wilson Phillips", "Release Me", "Rock"), ("Billy Joel", "Blonde Over Blue", "Rock"), ("Billy Joel", "Famous Last Words", "Rock"), ("Billy Joel", "The River Of Dreams", "Rock"), ("Billy Joel", "Two Thousand Years", "Rock"), ("Janet Jackson", "Alright", "Rock"), ("Janet Jackson", "Black Cat", "Rock"), ("Janet Jackson", "Come Back To Me", "Rock"), ("Janet Jackson", "Escapade", "Rock"), ("Janet Jackson", "Miss You Much", "Rock"), ("Janet Jackson", "Rhythm Nation", "Rock"), ("Janet Jackson", "State Of The World", "Rock"), ("Janet Jackson", "The Knowledge", "Rock"), ("Spyro Gyra", "End of Romanticism", "Jazz"), ("Spyro Gyra", "Heliopolis", "Jazz"), ("Spyro Gyra", "Jubilee", "Jazz"), ("Spyro Gyra", "Little Linda", "Jazz"), ("Spyro Gyra", "Morning Dance", "Jazz"), ("Spyro Gyra", "Song for Lorraine", "Jazz"), ("Yes", "Owner Of A Lonely Heart", "Rock"), ("Yes", "Rhythm Of Love", "Rock"), ("Cusco", "Dream Catcher", "New Age"), ("Cusco", "Geronimos Laughter", "New Age"), ("Cusco", "Ghost Dance", "New Age"), ("Blue Man Group", "Drumbone", "New Age"), ("Blue Man Group", "Endless Column", "New Age"), ("Blue Man Group", "Klein Mandelbrot", "New Age"), ("Kenny G", "Silhouette", "Jazz"), ("Sade", "Smooth Operator", "Jazz"), ("David Arkenstone", "Stepping Stars", "New Age"), ("David Arkenstone", "Carnation Lily Lily Rose", "New Age"), ("David Lanz", "Behind The Waterfall", "New Age"), ("David Lanz", "Cristofori's Dream", "New Age"), ("David Lanz", "Heartsounds", "New Age"), ("David Lanz", "Leaves on the Seine", "New Age"), ("William Volkman","Hit demo button again","Unclassified")))] """ The Multicolumn list component is based on the wxListCtrl. The implementation here allows either single column mode or multi-column mode. Some methods have been added to allow simple replacement of the List component (which is based on the wxListBox) this is done because we had the requirement to display 3000 to 10000 items and the wxListBox will can only handle about 100 items per second (on a 663 MHz PIII system) whereas the wxListCtrl will load about 1000 items per second. The multicolumn list includes the mixins wxColumnSorterMixin (click on a column heading and it sorts by that column) and wxListCtrlAutoWidthMixin (resizes the last column to fill remaining space). A side effect of this is that the SetItemData method is *NOT* available to your application (the ItemData is set to the index of the item in the list). Pythoncard specific methods: Clear(): Removes all items from the list. GetCount(): Returns the number of items in the list. GetColumnHeadings(): Returns a list of the column headings. GetColumnHeadingInfo(): Returns a list of lists of column information consisting of column heading text specific size (or wx_LIST_AUTOSIZE if not specified on creation) column alignment. GetListCtrl(): Used if you want to ignore the Pythoncard interface and directly work with the wxListCtrl widget. GetSelectedItems(): Returns a list of items in the list (either strings for single column lists or a list of the text in each column). getStringSelection(): same as GetSelectedItems Append(aList): Inserts items at end of list InsertItems(aList, pos): Inserts items at a particular position in a list, existing items are moved down. Negative offsets are interpreted to be from the end of the list. SetColumnHeadings(aList): A list of strings which are the column headings or a list of lists containing the same information as returned by GetColumnHeadingInfo. GetItemDataMap(): This returns the dictionary, indexed by row number, of the data in the list, (mostly reserved for wxColumnSorterMixin use however here to facilitate replacement of the SetItemData method). SetItemDataMap(aDict): The wxColumnSorterMixin uses this to control column sorting. It contains a dictionary object, keyed on item number, which contain the data within the list item. SetSelection(pos): Selects the item in the list indexed by item number. SetStringSelection(aString): Selects the first item that it finds that matches the string. For multicolumn lists only the first column is examined (this is what the wxListCtrl does by default). Note that this uses exact matching. Additionally you can set the contents of the list by assigning a list to the 'items' attribute or retrieve the contents of the list by referencing the 'items' attribute. Notes: 1. Setting the Column Headings will clear the list so always set the headings before you add your list data. 2. When assigning to 'items', the number of columns is determined by the first element in the list or tuple that you pass in. If there is a difference from the number of column headings that have been set, the number of columns will be either be reduced (in the case that the first item is shorter in length) or additional columns will be added with their column number as the heading (in the case that it is larger). Subsequent items in the insertion list with either be truncated or padded with spaces to match the length of the first item. 3. The SetItemData method is reserved for use by the column sorting mixin. """ class MulticolumnExample(model.Background): def on_initialize(self, event): """ This method is the PythonCard equivalent to a constructor or __init__ method. We initialize our list of items to an empty list. """ self.demolists = demolists self.demoidx = -1 self.listcache = [] self.listcacheidx = 0 def on_appendButton_mouseClick(self, event): self._save_current_list() wildcard = "CSV files (*.csv)|*.csv|Text files (*.txt;*.log)|*.txt;*.log|All Files (*.*)|*.*" result = dialog.fileDialog(self, 'Open', '', '', wildcard ) if not result.accepted: pprint.pprint(result) return for fn in result.paths: lines = open(fn, 'r').read().strip().split('\n') items = [x.split(',') for x in lines] self.components.theList.Append(items) def on_clearButton_mouseClick(self, event): self.components.theList.Clear() def on_demoButton_mouseClick(self, event): self._save_current_list() self.demoidx = self.demoidx + 1 if self.demoidx >= len(self.demolists): self.demoidx = 0 self.components.theList.columnHeadings = self.demolists[self.demoidx][0] self.components.theList.items = self.demolists[self.demoidx][1] self.components.countArea.text = str(self.components.theList.GetCount()) if self.demoidx == 0: self.components.theList.SetSelection(self.components.theList.GetCount()-1) elif self.demoidx == 1: idx = self.components.theList.SetStringSelection('William Volkman') if idx >= 0: self.components.theList.EnsureVisible(idx) def on_exitButton_mouseClick(self, event): self.close() def on_loadButton_mouseClick(self, event): """Load the list with the contents of a CSV file. The first row is assumed to be column headings. Suggestion: replace this simple CSV hack with one of the packages designed for this purpose.""" self._save_current_list() wildcard = "CSV files (*.csv)|*.csv|Text files (*.txt;*.log)|*.txt;*.log|All Files (*.*)|*.*" result = dialog.fileDialog(self, 'Open', '', '', wildcard ) if not result.accepted: pprint.pprint(result) return items = [] for fn in result.paths: lines = open(fn, 'r').read().strip().split('\n') items.extend([x.split(',') for x in lines]) if len(items) < 2: return self.components.theList.columnHeadings = items[0] self.components.theList.items = items[1:] def on_nextButton_mouseClick(self, event): self._forward_in_cache() def on_prevButton_mouseClick(self, event): self._backward_in_cache() def on_swapButton_mouseClick(self, event): if len(self.listcache) < 1: return headings = self.components.theList.columnHeadings items = self.components.theList.items self.components.theList.columnHeadings = self.listcache[self.listcacheidx][0] self.components.theList.items = self.listcache[self.listcacheidx][1] self.listcache[self.listcacheidx] = (headings, items) def on_theList_itemActivated(self, event): """When an entry is double clicked""" base = self.components rows = base.theList.getStringSelection() if len(rows) == 0: return if not isinstance(rows[0], StringTypes): rows = [','.join(x) for x in rows] text = '\n'.join(rows) dlg = dialog.scrolledMessageDialog(self, text, 'List data') def on_theList_select(self, event): """When list entries are selected, display them (note only display first one in selection)""" base = self.components rows = base.theList.getStringSelection() if len(rows) == 0: return row = rows[0] if not isinstance(row, StringTypes): row = ' '.join(row) base.displayArea.text = row def _save_current_list(self): """Save column headings (including settings) and items into cache""" headings = self.components.theList.GetColumnHeadingInfo() items = self.components.theList.items llen = len(self.listcache) if llen > 5: self.listcache = self.listcache[1:] + [(headings, items)] else: self.listcache.append((headings, items)) self.listcacheidx = len(self.listcache) - 1 def _forward_in_cache(self): """Display the next list in the cache, wrap around if necessary, uses Append method""" llen = len(self.listcache) if llen == 0: return self.listcacheidx += 1 if self.listcacheidx >= llen: self.listcacheidx = 0 self.components.theList.columnHeadings = self.listcache[self.listcacheidx][0] self.components.theList.Append(self.listcache[self.listcacheidx][1]) def _backward_in_cache(self): """Display the previous list in the cache, wrap around if necessary, uses Insert method""" llen = len(self.listcache) if llen == 0: return self.listcacheidx -= 1 if self.listcacheidx < 0: self.listcacheidx = llen - 1 self.components.theList.columnHeadings = self.listcache[self.listcacheidx][0] self.components.theList.InsertItems(self.listcache[self.listcacheidx][1], 0) if __name__ == '__main__': app = model.Application(MulticolumnExample) app.MainLoop() PythonCard-0.8.2/samples/multicolumnexample/multicolumnexample.rsrc.py0000644000076500007650000000423410047606335026357 0ustar alexalex00000000000000 { 'application':{ 'type':'Application', 'name':'MulticolumnExample', 'backgrounds': [ { 'type':'Background', 'name':'bgMulticolumnExample', 'title':'Multicolumn Example PythonCard Application', 'size':( 620, 500 ), 'menubar': { 'type':'MenuBar', 'menus': [ { 'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ { 'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit' } ] } ] }, 'components': [ {'type':'Button', 'name':'demoButton', 'position':(510, 5), 'size':(85, 25), 'label':'Load Demo', }, {'type':'Button', 'name':'clearButton', 'position':(510, 30), 'size':(85, 25), 'label':'Clear', }, {'type':'Button', 'name':'loadButton', 'position':(510, 55), 'size':(85, 25), 'label':'Load CSV', }, {'type':'Button', 'name':'appendButton', 'position':(510, 80), 'size':(85, 25), 'label':'Append CSV', }, {'type':'Button', 'name':'swapButton', 'position':(510, 105), 'size':(85, 25), 'label':'Swap Lists', }, {'type':'Button', 'name':'prevButton', 'position':(510, 130), 'size':(85, 25), 'label':'Prev', }, {'type':'Button', 'name':'nextButton', 'position':(510, 155), 'size':(85, 25), 'label':'Next', }, {'type':'Button', 'name':'exitButton', 'position':(510, 180), 'size':(85, 25), 'label':'Exit', }, {'type':'MultiColumnList', 'name':'theList', 'position':(3, 3), #10, 305 'size':(500, 390), 'columnHeadings': ['Example List'], 'items':['Example 1','Example 2','Example 3'], }, {'type':'TextArea', 'name':'displayArea', 'position':(3, 398), 'size':(500, 40), 'font':{'family': 'monospace', 'size': 12}, }, {'type':'TextArea', 'name':'countArea', 'position':(507, 398), 'size':(85, 40), 'font':{'family': 'monospace', 'size': 12}, }, ] } ] } } PythonCard-0.8.2/samples/multicolumnexample/readme.txt0000644000076500007650000000050507725773773023130 0ustar alexalex00000000000000This is a test of the MultiColumnList component by William Volkman. His version of the MultiColumnList component was added to PythonCard in release 0.7.2 (September 2003). I made some slight mods to his resource file before checking it in, the original post is at: http://aspn.activestate.com/ASPN/Mail/Message/1546982 PythonCard-0.8.2/samples/noresource/0000755000076500007650000000000010434046771017350 5ustar alexalex00000000000000PythonCard-0.8.2/samples/noresource/noresource.py0000644000076500007650000000160510110460176022076 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.6 $" __date__ = "$Date: 2004/08/17 19:46:06 $" """ from PythonCard import model rsrc = {'application':{'type':'Application', 'name':'Minimal', 'backgrounds': [ {'type':'Background', 'name':'bgMin', 'title':'Minimal PythonCard Application', 'size':(200, 100), 'components': [ ] # end components } # end background ] # end backgrounds } } class Minimal(model.Background): def on_initialize(self, event): self.components['field1'] = {'type':'TextField', 'name':'field1', 'position':(5, 5), 'size':(150, -1), 'text':'Hello PythonCard'} if __name__ == '__main__': app = model.Application(Minimal, None, rsrc) app.MainLoop() PythonCard-0.8.2/samples/noresource/readme.txt0000644000076500007650000000154507451130313021342 0ustar alexalex00000000000000noresource is a short example of a PythonCard application that has no resource file. Normally apps should use a resource file to simplify editing layout and localization, but there might be times when you don't want an external resource file, so this shows how it can be done. There is still a resource dictionary, but it is defined as part of the source file. The one used in this sample was copied from the minimal sample, so the names haven't been changed. I did delete the menubar to shorten the example code and removed the menu handler from the background class. To make it a little more interesting, I also delayed creating 'field1' until the openBackground handler in order to show an example of creating components at runtime. Note that the name of the component must match in the assignment (self.components['field1']) and the dictionary ('name':'field1'). PythonCard-0.8.2/samples/pictureViewer/0000755000076500007650000000000010434046771020021 5ustar alexalex00000000000000PythonCard-0.8.2/samples/pictureViewer/pictureViewer.py0000644000076500007650000002126410347526324023235 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.25 $" __date__ = "$Date: 2005/12/13 11:13:24 $" """ from PythonCard import clipboard, dialog, graphic, log, model import wx import os, sys from PythonCard import EXIF class PictureViewer(model.Background): def on_initialize(self, event): # only respond to size events the user generates # I'm not sure of a better way to do this than an IDLE # hack self.ignoreSizeEvent = 1 self.x = 0 self.y = 0 self.filename = None self.bmp = None # figure out the maximum usable window size # size we can use without overlapping # the taskbar bgSize = self.size bufSize = self.GetClientSize() widthDiff = bgSize[0] - bufSize[0] heightDiff = bgSize[1] - bufSize[1] displayRect = wx.GetClientDisplayRect() self.maximizePosition = (displayRect[0], displayRect[1]) self.maximumSize = (displayRect[2] - widthDiff, displayRect[3] - heightDiff) #self.initSizers() if len(sys.argv) > 1: # accept a file argument on the command-line filename = os.path.abspath(sys.argv[1]) log.info('pictureViewer filename: ' + filename) if not os.path.exists(filename): filename = os.path.abspath(os.path.join(self.application.startingDirectory, sys.argv[1])) #print filename if os.path.isfile(filename): self.openFile(filename) if self.filename is None: self.fitWindow() self.visible = True def on_idle(self, event): self.ignoreSizeEvent = 0 # this breaks when restoring from a minimized (iconized) state # the self.normalSize flag fixed the minimize problem def on_size(self, event): if self.bmp is not None and not self.ignoreSizeEvent: #print "on_size", self.components.bufOff.size, self.panel.GetSizeTuple(), \ # self.GetClientSize(), self.getSize(), event.GetSize() oldSize = self.bmp.getSize() newSize = self.GetClientSize() widthScale = newSize[0] / (0.0 + oldSize[0]) heightScale = newSize[1] /(0.0 + oldSize[1]) #print "old new", oldSize, newSize, widthScale, heightScale self.displayFileScaled(widthScale, heightScale, 1) def sizeScaled(self, size, widthScale, heightScale): return ((int(size[0] * widthScale), int(size[1] * heightScale))) def displayFileScaled(self, widthScale, heightScale, inUserResize=0): if self.filename is not None: bufOff = self.components.bufOff bufOff.autoRefresh = 0 # figure out new size for window size = self.bmp.getSize() newSize = self.sizeScaled(size, widthScale, heightScale) bufOff.size = newSize if inUserResize: self.panel.SetSize(newSize) else: self.fitWindow() bufOff.clear() bufOff.autoRefresh = 1 bufOff.drawBitmapScaled(self.bmp, (0, 0), newSize) # attempt to display the file full size if possible # otherwise the bitmap needs to be scaled def displayFile(self): if self.filename is not None: bufOff = self.components.bufOff bufOff.autoRefresh = 0 # figure out new size for window bufOff.size = self.bmp.getSize() # is there a better way to resize the window? ##self.panel.Fit() ##self.Fit() self.fitWindow() bufOff.clear() bufOff.autoRefresh = 1 bufOff.drawBitmap(self.bmp, (0, 0)) def on_menuImageHalfSize_select(self, event): self.displayFileScaled(0.5, 0.5) def on_menuImageNormalSize_select(self, event): self.displayFile() def on_menuImageDoubleSize_select(self, event): self.displayFileScaled(2.0, 2.0) # could support true full screen as well # using ShowFullScreen def fitToScreen(self): oldSize = self.bmp.getSize() newSize = self.maximumSize widthScale = newSize[0] / (0.0 + oldSize[0]) heightScale = newSize[1] /(0.0 + oldSize[1]) scale = min(widthScale, heightScale) #print "fit", widthScale, heightScale, scale self.displayFileScaled(scale, scale) #self.position = self.maximizePosition self.Center() # we could do self.Center(), but I think I like # it better on the top-left corner of the screen # which also prevents the bottom of the image from # having a few pixels chopped off # an alternative would be to reduce the maximum size # by 4 pixels or so def on_menuImageFillScreenSize_select(self, event): # figure out which dimension is the limiting factor # then scale to that limit if self.bmp is not None: self.fitToScreen() def on_menuImageScaleSize_select(self, event): result = dialog.textEntryDialog(self, "Scale by percent:", "Scale image", "") if result.accepted: try: scale = float(result.text) / 100.0 self.displayFileScaled(scale, scale) except ValueError: pass def fitWindow(self): self.ignoreSizeEvent = 1 size = self.components.bufOff.size self.panel.SetSize(size) #if self.ignoreSizeEvent == 1: self.SetClientSize(size) def openFile(self, path): #os.chdir(os.path.dirname(path)) self.filename = path f = open(path, 'rb') tags=EXIF.process_file(f) f.close() if tags.has_key('Image Orientation'): # the repr() is something like # (0x0112) Short=8 @ 54 # but the str() is just 1, 8, etc. orientation = int(str(tags['Image Orientation'])) #print path #print 'Image Orientation: %d' % orientation #print 'Thumbnail Orientation: %s' % tags['Thumbnail Orientation'] else: orientation = 1 self.bmp = graphic.Bitmap(self.filename) if orientation == 8: # need to rotate the image # defaults to clockwise, 0 means counter-clockwise #print "rotating" self.bmp.rotate90(0) elif orientation == 6: self.bmp.rotate90(1) size = self.bmp.getSize() title = os.path.split(self.filename)[-1] + " %d x %d" % size self.title = title # if either dimension of the image is beyond our maximum # then display the image fit to the screen if size[0] > self.maximumSize[0] or size[1] > self.maximumSize[1]: self.fitToScreen() else: self.displayFile() def on_menuFileOpen_select(self, event): result = dialog.openFileDialog() if result.accepted: self.openFile(result.paths[0]) def on_menuFileSaveAs_select(self, event): if self.filename is None: path = '' filename = '' else: path, filename = os.path.split(self.filename) wildcard = "All files (*.*)|*.*" result = dialog.saveFileDialog(None, "Save As", path, filename, wildcard) if result.accepted: path = result.paths[0] fileType = graphic.bitmapType(path) #print fileType, path # should throw an error here if the user # tries to save as GIF since wxWindows doesn't # support that format due to licensing restrictions try: bmp = self.components.bufOff.getBitmap() bmp.SaveFile(path, fileType) return True except IOError: return False else: return False def on_menuEditCopy_select(self, event): clipboard.setClipboard(self.components.bufOff.getBitmap()) def on_menuEditPaste_select(self, event): bmp = clipboard.getClipboard() if isinstance(bmp, wx.Bitmap): self.components.bufOff.drawBitmap(bmp) def on_editClear_command(self, event): self.components.bufOff.clear() # decided not to use sizers # but leaving this in on the chance # I might switch back def initSizers(self): sizer1 = wx.BoxSizer(wx.VERTICAL) comp = self.components flags = wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.ALIGN_BOTTOM sizer1.Add(comp.bufOff, 1, wx.EXPAND) sizer1.Fit(self) sizer1.SetSizeHints(self) self.panel.SetSizer(sizer1) self.panel.SetAutoLayout(1) self.panel.Layout() if __name__ == '__main__': app = model.Application(PictureViewer) app.MainLoop() PythonCard-0.8.2/samples/pictureViewer/pictureViewer.rsrc.py0000644000076500007650000000477110047606335024207 0ustar alexalex00000000000000 { 'application':{ 'type':'Application', 'name':'PictureViewer', 'backgrounds': [ { 'type':'Background', 'name':'bgPictureViewer', 'title':'pictureViewer PythonCard Application', 'size':( 310, 300 ), 'style':['resizeable'], 'visible':0, 'menubar': { 'type':'MenuBar', 'menus': [ { 'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ { 'type':'MenuItem', 'name':'menuFileOpen', 'label':'&Open...\tCtrl+O' }, { 'type':'MenuItem', 'name':'menuFileSaveAs', 'label':'Save &As...' }, { 'type':'MenuItem', 'name':'fileSep1', 'label':'-' }, { 'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit' } ] }, { 'type':'Menu', 'name':'menuEdit', 'label':'&Edit', 'items': [ { 'type':'MenuItem', 'name':'menuEditCopy', 'label':'&Copy\tCtrl+C'}, { 'type':'MenuItem', 'name':'menuEditPaste', 'label':'&Paste\tCtrl+V'}, { 'type':'MenuItem', 'name':'editSep1', 'label':'-' }, { 'type':'MenuItem', 'name':'menuEditClear', 'label':'&Clear', 'command':'editClear'} ] }, { 'type':'Menu', 'name':'menuImage', 'label':'&Image', 'items': [ { 'type':'MenuItem', 'name':'menuImageHalfSize', 'label':'&Half Size\tCtrl+1'}, { 'type':'MenuItem', 'name':'menuImageNormalSize', 'label':'&Normal Size\tCtrl+2'}, { 'type':'MenuItem', 'name':'menuImageDoubleSize', 'label':'&Double Size\tCtrl+3'}, { 'type':'MenuItem', 'name':'menuImageFillScreenSize', 'label':'&Fill Screen\tCtrl+4'}, { 'type':'MenuItem', 'name':'menuImageScaleSize', 'label':'&Resize...\tCtrl+5'}, ] }, ] }, 'components': [ { 'type':'BitmapCanvas', 'name':'bufOff', 'position':(0, 0), 'size':(150, 150) }, ] } ] } } PythonCard-0.8.2/samples/pictureViewer/readme.txt0000644000076500007650000000156507500705364022026 0ustar alexalex00000000000000pictureViewer is a sample for displaying images in a variety of formats (surprise). It can can load and save images of type: BMP, GIF, JPG/JPEG, PCX, PNG, PNM, TIF/TIFF, XBM, and XPM Due to licensing restrictions, the wxWindows/wxPython library is unable to save images of type GIF, so that limitation also applies to PythonCard. I recommend that use same images in the PNG format instead. You can resize the image using the Image menu options. Dragging the window frame doesn't work quite right yet. You can Copy and Paste to the current window, so there is some overlap with the saveClipboardBitmap and doodle samples. A filename can be passed in as the first argument on the command-line and pictureViewer will open that image when it starts up. This means you can use pictureViewer from other applications or as the default viewer for Windows. Printing is not supported yet. PythonCard-0.8.2/samples/proof/0000755000076500007650000000000010434046771016311 5ustar alexalex00000000000000PythonCard-0.8.2/samples/proof/background.jpg0000644000076500007650000007325307333577351021153 0ustar alexalex00000000000000ÿØÿàJFIFHHÿþCreated with The GIMPÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ"ÿÄÿÄP !1AQ"aq‘2¡±²ÑÒBÁ#$%Drs’¢£á35RTbcdt‚ƒðñ4CS“„”¤ÿÄÿÄ,!1A"Q‘2aq#RB±3¡ÿÚ ?n¢ “ט†@ÂìÐé¹$F)ÑÀEÏ·v™~£ ? ÀÔðœ_”§DP;†zM}!V¢þ±2—ÑŠNÈM‰¾’GV¯sÕmˆúI›ÙØÉG±Üé.•(éf94Áפ?–W÷F.‹m&¸‹›ä´ šì“_CrxO_“àÈž‹~-½ ÉÝ(ù´†BTöÈ—M”× õíÀ†ÉëÌn¨`HÉ;¼ Ô¶ÛðÏŽ‘»w ëÚËRñ}fï žÐ[Ú¡™Ô³ˆJ»˜p! œMd=‘€&9q@¸*'}"ŽÙ˜ºaG¬=@ ¡cë823éÉ´T­ Q–$Å6‹”PEF)Ç6Ó¦%§à@Pì<ŒåÃV{Jt3×´!¤,ØòÄFYøBf“TOVÔ)…Y.èã •¦–ÒI'Ö[o):•’J4èÅ+°5‚LÂN3˜$1}&¢Q'5v+$#Ó-“i¬AbŠævA%jª½&… ¢ºÃS¥D…1:ªÌUùÂD ,f¡¶l ÁJ5±Ä>TˆçzúaþS†…ódCfó‰356ë®\ïLžI'CÙÈZ8¡ˆ÷R’9€lÙ5 Y@ˆ1I…J†6ê±ÏQ­‘¶ÏïŒd`‡XŠlQ»ûLWcñ/’ EmךD3Q=ªY®¦¶È} P^±¶Ú®ôr=Ìx˜ÌY¹°3˜*vÝÍVkˆqi¥L A¹xç3tðÆÎjFëc•8¸Øh^DÙ>¦çƒÌÀ ô®“¥%EP´¬~–¥ › ÖhV$€¼Ôn“–²"Ô› )Y^“]î®&ñÙ#ŒD®®Ö¡Äzsg'¤¦ #Þ†è0þ¹3Kn{ÔAE%úXß•G$N´ÝqÑ›[’]°At2aÒÂ.£Ê+#®a¨V³TzÊŸc ¨‰´Mš¾ÐôtÊî$UæPÚUï¢ÑeÑÓ’žH¹ñBùkdæÏi†ÍQÅúM©Ýf‰F¨—`m:ÃL¨A9¸!‰bz j1k9&;“­‚Öè=#°ío¼"¶0£žÐ6õÀï7NÇ×Ê ¥JÐh T'ÇH¥9¢*åEE×–dÎ ÿ(·+VQ›VÅH€*1™È9ëÖfkçˆp¯b½Ök íbå:lŠDüºÁ³ MHªâQ¦ƒªEؽ(çò–µ›a$U48ó•éÄ5åéœúÐLÀ ÌõþSý$÷Iÿ¾hŸõÄòNšØøhø“ÝCþ÷¥ûb+$ôK(Ü“C]A@Ü`öun‡s˜ž1¦AKʼnïzÍìU )œˆñ¦p9ëÚ fíNDÕ|‚/Ì2ÉkCT’`jiXdÉ5tÚœOGQè+™®âqYÌ-lb›Kdlª¼ã4ÆsÌ é)U¡˜+§µÁ$bd²ª7Õ½*ª²fУ`ö„þJ.¿Y”K_N"eǵdÚše¿]M=­Îgª£ ïbO¯ìÖÄ@ÁçàU¾4.p9睊wÌ¥4/Î"[H«“Ò.Sl>iéë!¢G^Ð4àæQª„z“vRYäyIòËC`µBQéÈ¥kZÅìS` ÔvŽ“X-;6Q^CÚ6çïÀéÒn¡*ûEW¤æÝ³myºÙ,£]‰5xãÒ-•q×é@ÙÌIbÉîÐ ªBŸLÛ7”ÊÑDa$ñøg78òŠœì%öK»Ä¨EkƒòÿÝöu" °'0¢¨ÌUdè<#Œw]3ºú%ÅgˈÀ…c8I§d9-Ú—X¨­e Ø:ÊÍDdõ‰ÕÓÝes7“²9$ݱjÅ]dñQDîlˆD0äqV±v¼Î;5tÂÙBƒž½¢Ùͧ5[4>¢ g*¶&MÕšÇ#ϘQÀYJ7Ø÷‹"Ü){ËAâ~|²@®@ ŒX#¥R§6<¢¶î$ð ߸mÖˆõÃõFˆ"ꉎÕÓs\ åh&íhj«¢>Ñè»o&½bàGHð›¾ñMµ \ZCUF:CÍzDÕ‘êxŽÑ/.q JÖŒPÕ†Ö%†'PT\KêÄ_Yß4(¡ÉæfXêŠÝ¬þ,9îææºnb0ZÐm=ý"û‰®1»C.㜎!¸dò.N6^9È@[¼Íj†(«´-X)7ÌrëCÅ¡¼"„mÛƒë6RÕŠ˜Ý…VîÄn‚òMb·¹P¿¬b—Zà±jMèR“ìÝVØ„$÷“…b·™CxóÁˆ(,Uô†’­•ÆZ'ÜË`qç5 ÒºÆêid09™³p¾Ý#bãà¢2t7@î4qV¿É‰Ó^H1ôÄ®“œ©‚å³–É ãÊ¥[E?ø‰(‹¨æ?D†Íö™È8JÊt´ï$õžÇêŸÒ?vscÚô¹ÿ,O Êôé=_‡lüIî²éz_¶$Ùo`ñ^AfrõF£¶ó˜£ß#Ò¶×r'¸äïg¸àӲı=pŒÜó†§ ý=CÉȀݻ;cu˜ŠmQ¶¦j8Àë:œr<£´ {¡Šqg5 Hÿ›pNÉ=#O]L”] +lpct’ÁÇ´ú˜ÝG#ž²Y¦Õä©Ð ¢nÈûÉuWRë ë=&<ô“¾ƒX kŸH…7Ë`ª¢E\G^fjh³h,MàŒ\iÐ*‡ƒÞs̼™Lñut¼!N& !¸Ö;ÏUôÕ›‹1m¤»(P¯ÖK“#hdeLó•@Õà‘Ò ¯ÒPúaVøn×aŽkO.ƒ»3`qÅùÜR«ÖãA⦰ܷöÌÕ“[(2eÒ%öÕñZš[NÓÁë/ªPo1z‰¼V,NRW`ÆÙçj(@ ޏÌYf+C&S­¦@ç=¤£À@jŒŒlu$…j׊"ÜúˆöU9Æ&lR±9:dy'°PbÍ3†Û_XõP.òGœYV>±¼­äœzÔÎ@â¹€Åki6k˜LÈ,í³95ä–mU"GV7F„ã¹,Y¯9i@SÂL°.ª §à–M²WƒAË)³ÖS«¦ˆ°ÄP¬ÊEf)lXW ‘ôÖ®ÿ8ÆC©X¯Xt¢ˆõ#8øy¯ œTléˆÕ]Ø#Îç:½WIÜUØY¯i ‚Xî Aùˆ·YwÉ*ÙÏ”‘·pE™«º2-€¨3ÅvŒÓRЇp7öé("Ô㬠=Óšb™N,ƒ8êf¹™óÖ¼g¬N¡-ƒD:Ò0•û…–%É»³‹fÏ#¬ % àÇ·¦:ÍsOF½:1l5ˆ½o¿œ×cÒfšƒâ'1UlÕvf‚Q9ȩ́OMïÔIÔ[D­Ae±×¤ÙÚF+ådϦC¦ÇšÑ…‹®Â)7qÖ)÷š˜©ö.vÐ`±+Åv!¹&¼ é)ÍM}ã ‚&k«öÉ#‰bW'Ò?IÈ"»IŽ¡ kÎ?JÔs‹ç¼JÖƒYHy@ã¬3§G7Ú 1ºàKQi‹ç¬Åq•vÅii«XªhÁ SŒ8àŠ €+0ÂßQPmXŸ”Ht͑馟,X}·]IéQX€GI¼ÚC±JÇhÓG^“Ôø}X|MîÂEåzXÿÎ'“¦»htžßÃêOÄ>ìn?¾ô¿lE¶ÊDQ¿¸/§¿4j=E`ñ5œ¬T÷bìú‰Ø”@†¯!NÑøf2Þ#ƒ¦›k8I(ìžI½ˆ}<Ö@‚E07Ög;r+éåÙž›­ŠMEd‘¦ dždì š³ªè¤(ó3=kCRQ ­n¸âkXª£ÌFëB/3SL­yˆ{ìVI$3QØš¿¬Ý=KQ»0HK‚ºl­cÌî)ÊÒ®C_±ÃZÍc G'1Ȫ3r<±âö5=€0ÆÀÌSi’û¹©K2õëÀ] 4¦Û5ªd­¦^ïë$t«Üj¸ÄõÙC¯‡¤Ú4¬àW+tj’|¢ZÖüã••XÈÐB§# °ñ’8˜•º¥z{‘Öe*æ¬ÆQ7œѶ÷GE¶ôG¬|^’@›'Ë3ÒÔ@9°Gç!ÔÒÉó”âwÙ²¾Ùˆ¥Ð_ÒOšûN¢ˆ>½à†$ž£ô‡ÂÝ‘di»g&™Ý“ްÙFß{‡XÇ^“F›VF"¤è‡'ìHúD0j阣\ ÷ž‡É5Œ‚:É™@ºÍ &ö%®HÉŒXd+ úÊõ4Álö‹:k|Yœç`K®P­dœ“è¤ØûÂ,Rƒ5tÉ#BrìŽPjÅ!bàyÇlÜ,æ§8Î2!/#=8•Bè[J´,PbE×™©©Ÿ{›¨-¬QGÅX8™;ì§''±®Ç`=ËÖÇXÔRPÄnšmrX¾T´3ŠZ¢t@P¾‘o¦MÙ©cªgÊ$U6q17Ø0UÑ¢€2Vp­Xç´·\Z2¾RE*ø™±•F6é°ÃíŽÑªÇP÷>]b”‡ätŽLP¢¬l±ûläKdc™ÀQ_üFadñÆ$í¨´áÇ“bd© 0>ÑB¼äÃSh·XcTfdâ-]l:ROrpH.´ dÄÒÀ7ŸIÂØÑ1ì Fú6Ü^;¢°·ÄÍM2F9òÑB##¬Æël[-™ò²OxÀ ]Ì6¡›51S þ‘nMì¤5‹£,ѲXqë& hÖ1[mó9Íñ "ÀÛ•Tž<ªP¤Œöä°!¹•é°Ùá1m´“w£WGÄX˜{<@ޱж£¤ê;¹ªé›}”~GœF"ébóÖ=n‡CeR´´ KŸÀ‰äֈΘF³ÍÎzª+ÎRºW}ê/SJ”¨æãm¤ßbó@NÔÓ`—vcN™ ]»Eêð&)Q·»@éê*dŒÔæ}ÖA7†ïj úó&Ìõ²¨¸ÕWÞuâü¦µ©ýó šäÚ@ûÐ× V7M×m1ϬN¦ÓÁÇY©´å¯Õ¡]"¶åF¼M-ßÑÉ‚yXí¾³¾iü63 E§g,gjF°'+x1ÌS[)¦iÚŽnáò ^=h T I’j¸Rx¥Ú¦èãÎG®»…(Èë*űnüˆÜOO¾g51#‹šÈËŒ`s1k¾eN«@á>ž‰ö³Q$9€tÁä(]'g§%»s:pI |¨ˆéƪù"s)¯30¸ kï¬ 8Øãu`8üЇCôšMŽ>ѬXÈí·º²†›B%ƒÈÒƒm°¹>ÍÕÆÙb…"èñ'r!M€zNRlv%]†)xšÈveIþÈ€Hä_”¨jZÑäÁ”¡{$.ÀífqOôºl›ž‡Þ4è ïÌ×J&úU²G[Ó,È5QØëÚz-ý͉£|IµUœðx©=îÎã]ÒO–læùŽÐÁ>}âóº€Ç¤zál‚HøM3’BØm°qÚäš•DßU¨ûŽ ö&Nɸ‡¨ZØ-ìùũ 8ýþæGçQ áz'ë)VNßX3z«ÔžŽeaŽ3ºæ–$ð‚ ŽœÉ'%‡¨Ò:Ó}cÔŠŸ(­ e*ª«w_ÙÉK¢LÑmhÆpcHæÏÎ'ÐùÀ lÍŠt&¥u/é Z¬p"4Üd×<ÑÛk®"%=ÒÅô?L?êœÊR’äý£—v1^±3ŸÈå4U§í¨HqbÇZ“iiø{yÊtþ&Ç0}h®ŒxËÚ3M ƒjE÷ž·ÃÃo¿ýÞÊ´ëý!<¶`Ê‘‰ê|:XûÿÝÅ«ÿ¹Ó¿ô„Ød“{i“mÒ ÇCb â0­‘d}fÕÏ~0£éc/‘Z‡8b[«™C)æñT’  yBQÝ™ÍËB›OpÀÅs7OOi‹¸åBW™ºjCÛ ¨¼–»} :EXšÄÇeaj¹J\b€ô3“¤×I/«Od’J­’ƒ`ƒSHµég¬©´}`l á¬~’˜Í4d]*”qC3UâW¬€šíÖ€«ŒN–¶s–´I©¦Úv1ûçi 9É>±Î¬Ø¯(±Œ^b\\ƒ†_ƒœ |N Ö‰CÓdfŠÆ$óƒ)„غjÀíʼn3¡¬úKÈ$õ‰}&-¸8þGzŽìƒe1`8€ÈA°*嚈õáã¬IBªo±ŽÚÐ2—‘|§'½E¹egÊ;b÷ë9¶ZûÅ%±k5’3[f/Pm£qšƒû¦Ñë&pÛ¼$ÊqE§lé;Ù…‹-޳tÖÚ€õ„ P8Äd-˜S›ð)åQ4%æáºìPOÚἸ35q 8ˆs~HòMI˜¤î±ZªÝ3÷Å9,hôídØ—­!m¨Qk¯cæÁ9úu†êCÂïò‹sd€ÞR…T-§T mχÄx¸I¤k'ÎR(WÖ¡¯\Мò5°Ü}¢ŠäsÞ-˜_XZÌW#¬C•Úç´8;Ø.:¡úz¸¶ãŠ0XŽ‹˜µªØF2œÒ1I'@à °h¯ˆBGà ‚Á˜Q&b¡ÝyL–ÑTR]ŽèȺ‚ÎÕDß[Šß‚Ú©bƒ¿hžk gÐVM“Ì—P1k¼[é²c®¢ùŒÄÍÔ­ I¦/M(YÉÅU‰¢¨ÜÄe&»ç3õl™›Çޱ{sÂzÇêéž@úÄì5F>9<±3IhÆÓÔ¿Yʬ•ºþ±É¸-UÒag1rÊßGcŒ_a±¸@F!¨7¾ÑmjLD§­‚£R¦¥º¤v æ“ø@ÈܪÇ˶jJò¸°2Bú#ÝÙ±8·9Ç[†H\šú£NÃo2˜d²g,zÙ ¬T€zÌÓa°Íôõ‹ÈÑØŸ»c,TùGi 'q7¦×Ï^%v€ß&O.Šø,ÓÓðÛ6†Æ óÆ©ü š” ZQ؉$ŒQݲ ˆ"«Ê{^àU_~û¼òO´éþП9óÏ#‰íü;¬[ßþîÝv}«Kö„f=4wž»`çƒf²#µtÉj®œÀùlÊ}5ŸSéyF)¿9GÌÏÒ9t·äœc¤0¨¾&ó¤"q’蜑x?î˜'Ç”-U¡€EÌÑÓmÔ9&-¶û:ì6FYÞn™e³Ï¬rÒ¨ o°ˆóÉå “ä·ÐZºÞ¼IÙæþÑŒÀÅÄkiP oë6.+HZLä¦ëÇœÌ$+ãž½¡JBò&™.£‹Áüç ;a(ùj̓0¤€g<‰*AcZ':VäÕb'ÿÈ*ªú˶ºûAùJ\ÈçN]ÙL}¬RV iÀV7å¨v=:ˆEYü#òƒi!‘vM©¤Jž¸éRðF:Þeí½E>Ñ/¢h’A‰r½#¥*|£¼âÇj˜Ú[EŽ™•§¾=`j­‚ÄÎtÉEséî²`|µ “šÄ­H_ F-ôË-þ}£}_z’&ùu‚ç3Oû¦:ÊÎ4虨°¸ó=;EÏ- œ´séš°1jÈ2ƒap؉j¬IÞVôOM¡vÁ€Ì*Ü—b Sqe ‰ÞêI¦K®¤œdû(gúÎ îDœê`Ü¢9‡%˰\„ÀDÿ*"芛©c¯S"nIªnA¨ëcY™†IË…¨ÇŒ‰›®ÅЕÁ{Mà™V“U’lŽajjV[õ‘³•Q\Ž‚væÔ¢Æ«Î1%ädcº+ù£ÐRÙ?I.–¡^ £OSþyç•·ÐN6Îp¶ çÊLÍ–¼Þe Ã÷ˆ$_qM:³V$!¼\ž‘èœØû@*¡¸¸Ð bsŠHWÑÀºã¥À_ 1j¸À—Ô}ªr.Ãl9ë$› œI5ò/© —úN` cÖxrså;Ÿ‚l±ø©¸¯?Ù9ˆÈã¬.>½¡é 6>°=Z1qØ6.ÉôœÍ_iº¥lïÌÎ@5Roa5ÉhfŠ…c~¾³µ¹"©¡Áò†p¦ý"füéº7oJŽ  Ø.b€Ù»uÑ„¬TçŽ's¤O“í\5¨:–´Àý&kÇn³—9È9›Êö,[èb8®ç™f›³ Ôœ +´ ò1Ú`§ÿ8‹œÓÒèR±k$ ™¹‹žS·:WyÉ–@‹Œ¬'‹VhÜ ÍßIîü0Oô‡Ý ãûëKö„ò´“y*N$ôž·Ã¢¾"÷`ííz_¶'C"ä“á]LijT]{&}¤Ž½úÄê±aŽÓêšÑô \´±Eµ1ƒ$1<Ⱦn箌.TdÜíMl6ÔÜÙæ 7 o5d›À„úª4È®{Â(ßA¾¹Þqum…Ù1e·]â×V"äŸR‚’oħp 3’,ÐëQZÈÍBH®±.5°9n‡ ¢ÅjMý¢›PnÇÚc°sÅT*{;ÓMš5¹íÒibX‘vbþ(ž+ˆ(þ+?\B”“èßNº/Ó{ðõ8·6(ÔJê(]¯Ò0i‰²Fb¤Û1½Ñ̤Ô*³q‰|`zD³xjñs,†=h.‚:«H=d^ÐÛTø®ºCê;Ÿ9´ÎOI˜Ólï@«“’8óAZ«“UçR 7Ö6XÑž…°õôö‹I“ïb6ahÕtœk…ÉÔZìã},ËÈÄå-wÇHzˆÕwg¯¤S¾Ó‘c¡T,L•èÖcdò±v¤RÅF&ÏŒæ`0ßGf¨«¡ŸÔ“ÜsÇmäg­Á}r£Ž;I_P–3ÓÙÏ{7TÝ€0DF¢[Ü{ÂÔbÙó󒾡"ºNã]¢ÒÙÚÏuFR×Bª or?Yfš «ªê#•Gg_‚„¹¾‘n øjûË[J¬’3Ú[GÔÂyF(¶ìRé’ÂŽ{ÊB…‘c´-%]âÄ¥†ðWú¼BY[C£ž‰ž€ºÉü ©ÜÇœJ[Ko6G“0 ø@ˆy+Ai0¬ñ´ ë¨vÖc©˜óF+WJ€oí9M‹¯6rª¸s(Ak'ÓÓ!¹7ÖPfE×i¯!’Iôc‚¼…?œLsé–‰ÉÄÝ»,HóJú§ÆÉßDÒüºÂùV¶8û¸ÁªÛGŸ"*3i ¤„>•°$Ün˜@éÚfËÔÁ( ,ÖlÚèNLnèôÉ;€Ï” ÕuäJ Œ‚oô‚‚ˆóé1ʖ͆&€D¶ C€­ŒÊk“Uæ ¦™ ØÏœ[|„ÍÒ`¥>+ïÚ°9†«`ßxmN ›¾Ð SbQF;ö•è …zAÒÓ$~QÊ¥T癎LÇ‘#@Ÿì…·xª8ü╎lyÔ»Dt‚ßÀÅ“dçK ÷FiàPÏh׌ã¼ÅB¹¬E[ ˜ËðŠž×ÃÚ?áÿv±?ãZGýa<}>“Ýøx¯óç»ñ:_´&/Ùbå5Ñê‹}]Ö="5žð8œa»£ØE»[ª<ϰì÷±Ä $Þjq$¥5ÕÌKbÅÏ–ÍË]Nºcœmš)—h¨×¦›Îcôô‚‹j&)Õ·Ð8€äîÀXÄ1*ûÎÒ¿œ&l}`ìØwyssDú<-l&N,Ÿ¤/—¸W&(Ø;¹˜í2°k¦bæÙ‘Ãò`PsG˜¶$_öCkj Š?¬[‹7h[¨ âhõ8ÇHv›ë¯ú^—íˆpW8¯è>WEÄ ßÚ ¡ˆ/¬vÖ{Eï&ϧ†WÛ>ª2Ù@ñœ¤‘W'ÐÔA_œz2› e•'A¸òf¦È±Ò¦`ÆfƒÛ4Âý„5$dŸÀ§RM_¬_Q}aËvØ'¤ $¥ÂQ )ÉQŠCØÛƒ1ÁCX#¤xUÒ&ò|¤šîI4¸0ÔP1Çî4¿|Áù›Gâ¡ç&ÞQ­‰Ê Ô&ïé9ÆÎ”(f®µŒÎgiûM.ÞnL›I<ùÍ¢§Â(@´ú=áÓ×Ò/WTn$ÚNÀÄäL}`̨ØCÀ—¾hg>±Z‡Å‚GyŸ3u¨î&•63Ž~ž˜oaŒrsæx¢<áJhñÖFá‰ÝdW9™ö20]éêNÆ3æn qå#ãŽ<ᆯn:M³¥Œi-Ù>«v$Ú0:¶È‰(KÝŽñ^v*Ú¦X%Y&ck(jšì7wé©§á,(ɧ%a$-ÜÝ‚DN¶¡AÍýa2`0'$𤖢}nl"›‹òwÌ.ÖML-dØï8™TzÌÈéÒ‡ÀÒÖÙ5%feÔ-Ó©€ÎÅÏ5~Hë%È™$ÓOa¯…‹’ýà Î*;€9¿(:€œ ¾¸‹Œ©Ð4ʬ_œ`-·‰*3âÉ1úl»³ÏKšØõU•ŒŒóˆP†-Ò&¬£‰¢xŠåoB“§±‡S©8ˆf!¬­\'#b‰–Hè~³è&íšÇœ`µê@ò‹Óµb êêlr.)xÊÝÉuÍ‘ÌYö†&#ST:‘·Å§h×6€9&Í×i¡ó€f˜.<@zÅäÒØì}QšasÐGix†GÒ¦®ˆÛ[‡xЊ§"I9¡¶«@nRf–&Æ([lÐóŽ@ …¬2T'*O¢vÓòúÎ ÎDv¡•ðDIÓi¾¢z†ò)Po¾½%wðv…®*PŠvÙŒR¤/.5.‚E;ˆü¡ªH<ž³4Í’söŒo`÷’äɽÏ@Qäz‘1œ•Þ5Ñ›úÜðvœr ãvû#É‚ÑrÞ’ý4Þ3Y’ii¦ÀôžŽ‰ (ÇHÉW‚ikh^§€Ðb¶rzJ\07׸‹â-vO)>€m j߬»ÜšUñ»Mñíz_¶$‹lÖÐ÷0?ÏþîÇøÖ—íQÔÐür¦ˆ~e’ö![úع"¹ @[뮣\OyΑö ¥¡¿0¥Ñ5Þ?A­Ã~fLNõºâ3MÊôƒ)º(Æ­16sçQnYM“ž™“>³œº§Pnn9Wf¸y¬\6.Q¤‚òÒpBPâ¿9Ëí¿_,J#lè5z@êjmÔ;¸]M[&…do´¾ñ@ p ãñÒ9:T)˜·„w5Ï‚€¨N6‹¸I™¯&êý&¦˜·iŠwe7Ôõ„š¡˜‚pbÛÌæ,5©·z±[äTä ˆ•ÔDE?0duœÏã Ädé€à[¦ÀOY»Õ\œ™)ת7˜“¨]iÕ˰ž'VW©¨w`æ)ßÃ_ÛºŠŸ¬Ö¬qt)Rì.Äâø‡ó¨ÙúHþkž{ý£·bk¤Íø6k’¢åœÕæÚñ‘ µ|~pÁ%”þP^‘< è-àiPÃW‹ˆ-dâáUAºäDÊ R¡:ÍýÓsƒ N SXðž 5<@š±sÉF>™¿#%|j £ž²½àçòˆÖQø€’ËI’JÛÙÑÀÌÂ(Õ‚;ÌO|q¡qçž$“ìä×LЖƒ}"˜Ñ;AûGAÆe(äx¼ûÎŒþMäщ¬ÁEà9ß:ßœv‰v4Ø£Ú –6,ÆÆ›6¾ËwîÓ‰$€ ší1¨97hŒt3”vj¥&oh$šé95™€ ÅE³ 8=c7 \&Ò1l ÄŽÝåGh@'¬™×#¸ä9®»Eäž© ´U¸pEÁXÀòé8:íýÕ[ëDÉÔŸ“´§GÄäžcIR*7¯JŒžL¡‘Û2YËv:= #7\ò#u»G.‹~"MpbÊ, :94Å0î°s P6oòƒVÝ=#tMXnDb›[ 2t·/‘HÁ<÷޽¼ ¬Ý=?ñÚkͪ ÉVÌP5 K$Ù£1œ€ vŽ“ aÏmòBgÇÈH¤¾DS¯‹1Ì.{ñ9sœyCÃÙ àžÎödÜg¡ ›o5R=ªB[¤ÔhLd»dvi¤5q,6›ZÏ"5”·:w˜³F؉EQA>¥¾èFþ~÷iºþùÓ±ÿœIƒ’F9£.÷C‡÷÷»Àýó§ÇùBw4„)5%g€‰ #¾>FbA#g“¤ º‘êg­—[>ýBú¢ÍsYx¼Àܨ°6nºLƒ^N¶˜zž @7GOw0¶¯cÒ¡«ÚŽ‘ê:Ð^£~Óœ|‡YÈ+ň¶×¢GçuÈm¤Øé,ÅuCb©‡®w ˆ^Îú×ÌVýÍ”r0RÞª“WBý¥H7f¤®hâzZçrà<ýQV£ë+@©.„:îRÙ‰"¨`T¯ñPˆ¿–7^Ð/±œ²+¦Q>"YvŽ3QeÁ%ššjRˆ´›SLÁ£Ä8Ï`é†<™Œvã›ë\MÁkhš¢ëÊî‚M´gÌuŸ8H÷dàÉðÍŽŸœvšyLÛGF H+§º¯Q¡@ïÊ9"9Š“£rcIÍÞ&­Ž¸æ„+Iç™ÁYqgíß-¬m0ŖǨ¨7׈hÁëëÚƒpáE>„ÉnÅ1«£õ1Mש=£•¸Û›+-ˆ9ìÎ-­‰|ÿTn‰g¦øŽÔ 1`3$Ôf6Gd÷ä cM mK[ªïæÀ®9fÿ÷LÊhb"KvJñ³tø8Ì~’ÙϤJ(ôò­2…ýdY1Ý‚âŸBõ²Ã>¢-ˆ œ“Þ5€6OÖ%ÕXŠ"¿XºðsL#¢ÏâR3ÍBÒö}¤©¡ä:ÃÒFq×1Ôþ/HIµ¦jÑ;©A@]DêpN,æ;PW‰~™ˆcxë)ÆÓÙ¾žíœƒ6~ÐPøšêºM*@²}f¢^xìb23¸yº`yLÂW„ªô3x™³99ŒJª{ êÍC £FðbF8úÂF?ÖQ÷‹šiF6¬ô4€q+ÒE­«Þ#BÕ@é= ˆ(Œòg›–[ C<\IõÖ‡#œGꀓ׈Œj7‘â£0½X–èJèÖlÿl§L¡Y˜J(`#‚€Á«'˜nm³9WbŠÞj¦!@¬¢?å»°&…¥ÈÄ[¾Be5zŠÚÆã´O¤Y¥Wx`ƒÊ´o[9Öˆ»7 æ†NcUK"nå!GqC9“衊s=Ð ¨‹r QÑ„…°Äå»ç5÷˜ò 9ÍÆ®$5ô¸©B¶"P¦%‰«¯¤Å­œ\¤é Þ{E1´Ñš§ª&”S†=lIÙÀ·h÷Ð䟦dº‹°p$íÐ-nÄjkhAq¹O>SJYÝUé1MšbEAœ+0i’(Þ! x¼ùBÞùö‹"‰ù‘äºÑÞ‚$ENç·œÀ§ÅyÂÞâºE-£8h¨hš‹,pOYºŠX‚¦„ÔÆ',imƒÃcUŠœ¤gÌß@ôWG8$Æ#ƒŽìÛHÁ§d“‘ÐE8*qß´¨U1é'ÔbÏÍc¼%HȽì^™ÜÕÍwj°Q¦ÁyÁ=gYRŸ,“f¸ÊìgÏfˆò˜±cúIÙƒ1@=cPcž":Ú7ÓL`­´Fa¢n¤ÅÓ°y”¦™UmërMâ…v7Mš‚ž|¥úƒcë%  \j‘T0zȳEPÉ(ÿCõ õ>Uã¡é8S­žn1B’;ÅÆÖˆ3=è4OŽ=%#H‘b(®o¼~›•$©6Þ„MºØl±qa¨ç7 ՃǑ4.î*>/Ú ¯1ô‡¦výs‰º‹ÐLÀ&¼ùàt]v=pÜH³}&#¡V{ÔfàçtVöI›ä-…v¼Ê”2i9À¬JtKdÖxÙ¤Ö;4õ£x4f!³âüã5i͘|Mˆ*/ÉŸÀ`Ózñ)÷2?óï°Çò­>¿õ„˜ø©W´·Üø÷ï°â4Æ?Ê`ªi/”&›’<$m»]L]bÄ^.P4À_äÄ’.À '£ŠVÐf•è&RA ñÀ€›ÎGœ=;gòœÎ, ªŽsÕ RЇ#!ˆŠÀ‹ƒÚ|9¿)#jp ~*ìÚMÚ*wÍõ¨å€Ý|ý¢Æ YÉâñ ¡Ö["*‚|AgoSÞ`%±ß“hµ˜&ù*9æŠÑ‰1€ø@=ã²Q»‰Ò 3›ï æMšf©ØN…ê®þRG`N~†3\ÛXâJú–¥Ll6?k³5…Œy31EÇ=î4µ¤|¢˜ 8ŒzÓ*JÙÚoTõÒÛ¸÷ä ;«ƒ›”h°«<‰”žÑµðR5ÊÇiQ|ÝùÅ.˜°GXåøéˆ¾I0•Pâ;t„¾#Ÿþ`­ÐôœjÁàˆ™eâÁq¾Æ2‚›3Š%‘©¨k®$úŽÔð|ç[–ì\•h¤ûA`;ߊl¯‹œ™ –Ú¥‚/"Ü—B¥'k¶Ãg“Ž$/¨ßY^»o:w‘2 Ý:bšKb_SÅWŽÓCnL€}`2Íp›ûÐåJŒˆu­£šU[·fM©¹ß÷J4m°I’=±2ƒ£HcT#dA+¸ƒÁë'º¦Äø…5Ö-Ün ?)[(ç8Äô¨–:õAÆ)0V›>] ù8zB¬â€ÌmFÞ‘9!ä&—F |J(ÜpÒgé¥ ÞbQ¤Ù<$ÒèkdãL‡ kÒX´F$Dí!ÉŽÒ‹“ÌbÉLÚ ŠÇyBiîæbinýXí0§Z‰•¾Š!¶j¨ˆÍGiéÞr.+åÓ9–éQPL-+b³ÂÖ‚]#´Œ1štŽÐHô1Š š£1_‹ž3Nì‘âml‘A¶ÍùÌm2­~*”êiÞÒ§¤C\â{F…¿QæqÓW«j©ŒH>yTn’†Ó&¬Ìr¢y¦$iÔÊtô‘qŠ<žÓ«?hH.í¿9¼›ZýËa¶˜,3XÁ§»†ÀéÞfÞ‚$1Ñè‚i^ŽEyÅõ‰ÙN××óšu‰°qå;OPÞxƒ;ŽÑ<áG³‚+‰w¹}{®=§Oö„ˆs`Ñï=s°ûö>ЗåâX¤ÞHÿh^7î<pOî“ݵn<Ãf%…äÎÚ¼Þ'§üxæ‚G² Ä^£Œ˜/ª¡¸ÌS8Þs±&×ò&ÇIª“c‰^®ç`EùÄ2¸l‰n=*X²ÃfÓ“R"vqe®à3ƒ‘ih? ½]zbqÀæ® z&ÇNL{@£=‰œä¬8?,æ× ŽðN¾áëÚ#RÍÐéÖ(jø¼t”Á{C>‡;·~±M\äùÀÜI4HLÑ],™TFÙ‰ì mÎ3Ön¨R¾‘0,qâ®',|8ôš¤žÙDe²v@Mõš…¨…Í¢J´læÓ:MF¸é3¡ÅÞÎ6 Ü~ÑÇPmÆLƒORטý­Ç9ˆšòrÈæÕ_´QÖ*r.‚?[è±$ƒÄWÖÌc nPq÷˜²øˆ¡0#ì+µM,ª†ÎfIR¤g‹F(¶Y‡¹ÆéŒ£ïšõ˜ã`8^ز [ºò€t÷I¼ é–[üŒÝ4¬Ž!ßO*KD,„ Ï–"Šk›ÄôuYHí]ä:˜7ƒ1JÉÜX§U5ߌNU#%ˆšJŸ#8†IÍEÍ{tcZ±ˆ4lÃPx\÷ˆ]Õu¨Ä²IcC‘]d”Öè 5-!àí4sc37Vþ‚q#0fé‹vjær“{8êÙÇŠ5S0漦²ÖÁº`mª³Þ¢»BRIènh“ødÚ­OVHŒbÅ~ø/¤½MÀL$÷LJ,bpÆ@‡òÁ» !„ w¾fI§Ù²i1-¨u Ø”èµÒœ÷‰ÛOCƒ)öuT»*ð%»(Ñ[ ô( bÄZ°äqû”‹ †pnA%`iâÀ&„~ˆ¡mÚš›$(®c@Ü *èj®å"±åkfëœF$cFâ95¦1­Pí-@ B!#œô©&’òA±ÚU¥¨°1i–’jŠtÔŽkŒ/§¸dq 9Àœ­²ÍƒpwdYBv)Å}{M-Íc‚†&ªÿI…FGaÅÝ“§½ò7&>×1´~[Ýc’ÀÏœç"¨àöé6¥±Ytrx²0 ·„ž6ÌR×Ã;Jí¸jTì†n‰ˆÜp ÅÒ®LÑV@ô•·ø†"òNú'q}š2u°þ{öÿyÓý¡'º²{ñ+÷N—øgØ^ëûãL×þa÷ÇûBÔb¤™e c0u¦ÌªÅˆòë01<ƒå=˜-f×’ì‚L[Uâó7Sp'<É×Qþa$ÐàK¡ V._¶cŒžbßJÐøÅŒâiÔ!î¬t¾ó³jD¥A¥±°Ò¿"¶Ð¬×hhq*} ¶o˜¯>£˜QÞÆG«©â@(‚xšZ .c! 9„Ø¡8ka©q[P¥‡ÞI¨)ŽÚ̵ʱ®¢Ï³7PmhßR¶LšdÖ3}zÃ]ô”ªéçèK±æÍr<æR·^дTï̱t”®ÓˆK 4ê¡Çá”Æ~IšÃ8¨˜ë¸Xò•1vF`|¥•ç´cz-Å4•‘ 2H eˆ¡jÆÒrhS“Û1¥vŽ€‰I=“6ô)÷QÇœÅT´6S¨+l!¤ ÉZM.Á]ÜV:AÔP£Ö0ÒžxéNæÌÔ•šå«@ù‡Š©Jip8‚¨7:Ê‘v­žæ/+Õ`‘b‡H œäF±fRp*%‰±‹¹:b%m“êîÎ*C¨Þ:ª®“ÑvÅÔƒTÝØ£¢ïB¤šÑ;æ¶Å®å`hÔÒíG´QrH¯Â#8ª¦-¶Õéê–oÃÍw•éH,3#ÑAñ™GÍ,(.$¹!z@Ká*¬b)# &B.îýeH|5}3'œih ­0]Æ“3;zËÀQBNbA˜q‹­€´ÀÜJŒGIF’oÉàt‹edP2 9ëP2$–…ÊKȽeÜG„ІˆJà“ˆ½MÍ‹àö†º¬·Ç="«FÅr9ps0½µô¹·á&ŒL‚* ?#vR§wynˆRª+2]H7*ÒüDué$ÊøŒŒls]Öï¤ÕW)\gò›¦ª2Ç1˜º'¥\šR¡±ŠèåUÈÝsÇ3•k¨ôŽ@(rbš´oLp(#gŠó†ºÍn£ÈW鑵 e$ņk#›‚§q9ǬÒÄŒM ,îçC%"L¿ zb¨L"5›ï J±œnÍØ N»g-:3MwfìæÐR7+Yâ,ifñÄ=3M´ý ­Y6F#]@=`7„qšö .dº¬I“îˆg&Žù 3´õ·U‘uE ¿¼4`´[ZЧšôÂg5‘W=s3{û"¯](æÍKo ž—¹€_{ûþ!+ý!6ÿ$Rù@'½Ÿ*PlÉœ2ÕUë)}^y˜‹·¨$õžÜf}£šâNú4¼‚{Éuô€·2ò2IÀ“j''ë,Ç2x¶å² $^+‡žxs邵ֿ;lZ£,R(R7㘔Ñç¬^õaYs\ãóŒ¼åÕCh¬Ä±!‚þU¦À‹=¸˜«ã=c*Ź>…>Oy¤°ÁY@[YÇ0]T¡¨óŠ5Oþ$ÎûœF.¡'ÊiÓñ ƒÆf€7(ŠT9:¦5l·0Ôx€$ÎF-Åb1V›®!Å;²l @y\ÄÖãg5Ä=`ÖkˆŒëœÇðtÌ”JV¬“úNa½OsÄHÜÍ·#®c)š‡œõˆœØ>¦¬åÒ³€á–À¸à6‹ÿÝÀ*O‹òƒLSÊ×b Çt¼ã¤pLVÓ}lÍ'røzƵ±Ðü‹ì 0©@œÇ#†Á4"pIf€\AxÓ[äw±zÚ»A¡Ž #³‘ëÞ²ÇnÒ˜T/Îl`º´n¡¥ÁÍõë%Õ¦Z¾#Ün6dº Œô›(|êZ@j~R#l@•^â?X¶[at+ÊrK³G±š,Tm¬÷ÜlùÅŠ4/Å\Çh)Ro$u’Öí‰rÛ M‚àÐõ”­äw©0V.M!€A»¿1%½)$¬ÖÖ,képôÙo&-…6©ºj@Ý\ú"e%g9°;”è>Þ }"‚ -‹< ŒU&Zª‰”mS'žú3TÙ4ßW W7 ¥.yý"šÝ…Þ;Ait‡ãcÖ«uæïF<âQB09©@6y™6GOEX•2­"¥IWhÍ%k&òxï¦vž Y¢h«‘äV‡ÒŒ¬ÓáPKLF%«û#ÛMH¶À0 €¤Xõhé4`}½#QƒIˤ­@š5 4Ζ0DTÕ”­ŽÒv6HôŒ.Ũƒ„qŸ!æt"»\Ÿ$M» `4{þS0 -âcj2Ž‘^"|Q*MQb?–aé±ÝœˆhØÇxÐâÈè!(‘d…;)MUÔ·;†d¿1¬íâæ†eø®dÓ Èè j‚J·âŸMnìñÒq;t÷uò€Û­ö¹§Ö5W³Y=`qâ&rMhÒ¼sC´ä!ñ9È®×ÌÔo©ŠË-hk‘¥ úÎ:tyúÊR@¬ŽÐ¨]ž±Çñ×´—åC5ߤ¡4¶DzFڨñ€ùÀi´Qq5F@Åtƒ} &µž;\z $Çh¹cMhÅ'vcN"Ø‚@È®ñ‡Ä|?AÃiÝŠš±1ƒ·í>³NkoEv-]/™n’ì°H-ØÉòbk³½*ÝÓZÉëÏ”æJpnj5Ø'=ãUÍž‚yÙ»dy%B™K¤yf/WM€ -ù`Œ‘ˆ „¾EÀÇ*ÊÞÌѺ„® ô˜ªTñ‰›+=.Ú–iZ¿º?„ïš‘å tÂEyJtW¥Š‹É—T>rbvïÞj)&¶š¹VÓº»Ì ¨Aˆo”O+;¾„Pýq&ç-ùMÔVÞ[Ï-”‚p{AŽ´Ní­ºÁÀú#½Ìóß»É?ã:´$ÄÖ,ßig¹×ü3îÿüNÿ¤!âw–?Ú3v“<±ŸÖü± ÇÈè¶)ðôoï09ª¯¬s®ïO(°H!vÌŒU†Þ†+  Œ N’iŸë2"¼ór%4|ãTW‚y«/( ‚ ™¼:„½DߘBíëÖ€ëdq˜q‚ŽØ–ÜU#X§P­º±q™^ÐÀskÇ&® Öì2¥îàk»2•F l51”8óí;v[ Z²U›ÀAbĽê7冹¥$?ÔIP@¼bæ|°cŒ˜z›vqU#·Yž¡Y2èN²¢¤œ û¥zª ÍÉÍ„°&S]H}$¹±Rƒ1Ȳ º?iNŠž½"4Ô¿=ezzt“è$¹èÛiY×d÷¹€¿P#?Y£H~&#ž F)èïY-PíÝùÊ4Èf±9tü#R§l:cˆÕ l.~ʪr¶1Ò?%k·”X]–I„­¶:A¤†®¬œ¥1 Ÿ•aÖåŒÊ<\žbAÜ×U›âeÛ(«[PŸ‚=räÔì`©ÄpQ´`ßy&[³&ÚG +©BW§L?)§TÃ7Ä©lŠª2 ÐÑIy0pH²›°,yF‡¿â§ ÎzfI(R'n¶ éÚí<þ³vµçÖ8‚ÉkÏX£é%œo£ÎË‘JÅ9£·ÒT¨oƒÖ¤ûkº"1 ¬5ž Ç VMêÚ¡û XÀègmèLá¬BÑ5x®H¸¢›‘›uºèbu”7âéÚQ[È#Q€¾9‹ŠvM7½°Û-÷9U÷ß°Ïò>Ê7*h™_º¾ý…¯ügOö„f/ý±¿”MÉQæÛW˜ œ¦ j‚¤¦¦oé‹{Ï©Œ-Ÿbåü€NÒoíShƒëß„µ\í2ˆ —Æ !ðÈ)Ð}„ŸSI™l;T±«P§=kZ‰KÈæstÊ=KT‰ ¦wëåªP F8n6;ÔàR ùÜfäø¨Ž9ŒM%Ù‚}"HñàÊttʯ\ñ*ƒ¥@ªHV£í8®æ¼)}!Þ±q, ! Ívº ItŒ½!ñX¯´-= Úx5Ú54,ò.l@›`F¾¢èí;±è#öí #‚­Q Ⱥ[ìO?’5±ÑP2X\u»Åt޹v*sòc©/gòœ4þ×@uœÅÙ'Ë´bmŠobµË”Ãg“À³vÌLjp'9/Ô«¶1ˆ*ˆ€uÉ – ™ dóô€’²¸Óv¨`ëÌUQ´8¨ÅZ˜ |VjgrÙª±N<"ùWÎ¥×»œ"ÛD6h2šLLáĈiœ9v¸ëç,]3UÓ‰ß(g¿%3ë±kKÚhâ $³TsWqb7›É“Érå·dÛ1dyŰÜv€ ­DcÓΠüÿ.ñ°T‡GjдP¨wI‡D€vÔiÒª`hv†šVM‘]§vvÖÀU æÄÓ GúÒ¤Ó(hqt…ɲi€òP­=[a˜ÔKj TU×LÍK6jHŽ&Þ‚]1É6| jR幆š•`ýç2Ù·pj¶kÇ[ Eƒf9œ)'ËR~YÀ7aÔg‹™ÞÆR{):–¢Ï=aÉžŸ¤JŒU]Ì+eÅ“ŠŒâ¤ƒÆØô¢98ë5šŽÀ¸èdÇÛôúNH¨2!êO ¨Ýð²­ zuŠ*ŠaÞ¥:f²FzH2µF7­‡¦,д¢Gnð4ÕQA±¹çäèƒ<ý¬-D±^±_0i“ÁN¡ UÅji…>r7oL‰äöÐѬOGx€óŸK‚©žam$íþØ©Gz!“ÞŒù–…6Ñï3H²¾G=.0€¹òûÁÒ»È DÉ4ˆç4›(+cu}&  ›6Å_nó«pŠ“»òNò¦%õ µíÕ?û2’¼©4E‹¹ø.¬BÛ÷OKÝ/þö‘~ѧûByæ—ƒ‰WºXŸ~{¾Æ?”éçÿ0Äï,´?t™æ³ïkï'm<µ` =:ÁVsç>±&¶¨SG*ZäߤÆBÈŽ%BWç0.,ä)D¡°15´ßIŒñÓž9•|Pk˜@9ü£\yl®‰ÛK g™6¾›DO]€4óùHõq"¸æ2¦sËlóBçh÷”!OB!0 `s|EÕ1 sÒP•­¯&º"â¶nÝf»ì•ÛÀ»ºŒ˜Ò œš@¢‚©F’Ð7ŽÀôœ¨n$c¬ .ÚŽ| ¹ø9ÏZ‚“ug¤Z¶æÍÑŒ,XmÄÝ% n…Žá:Û—HVº¾^QI£d¼ö”–ÜÔG”;Oœtr5¡y#ÅSŽÑCN®ˆ³_#pKg<ª6lž/ä“Tƻɜ’Ã÷Ek;©¤Î¥Xýðݱ¸ÞÅ $`d|‚+1šJQ‰išXpqç ñiè!k"ê(Ñùš2r°ï¿I­S;­ó/ÂfšP}nvˆñQL¡4ÈoëÄ 4€¬¦B ý*V°â³˜Tž|¤­ßDùgQÒ&ÕQdP7t€nqÉ•œ`zÅ”wþÉÉx'Shœ§4! 0©|ôE#8®Ó™,WÜLlv)»ØŒ° ¨ahûѦpj„ïêHšÝir5mÏ…o Œäâ¬sÖ9@Ûkõn?"_b÷0!àňЪ'¬MU ©] TâŠqÊ+BƘ7c‹§µMçÊsxN ‰Šo›ÇœB‹$¯HSi©7wèÇ2½¼€b]<4*ÄÙØåO°»¬=Û†Ú@µ<}f•]¿¤t$Æ)nÍk¹µŒyL mž³¶Ñ¬9%E0CЅ݉n–°"‡A<Ý% Hc~Rݵfy¿“Vlý»(fµn¡i½ŠŸ.d™, Ѿ%Z6Ãi"¤Š£ÎÊÒa‹ÝÅŽ„NK`Ž?8í»oîC`Í 4£[<¬ò[ŠEØ‚ÌA®#FýÆÆ<úAÔQŽo‘(Ó²9NžÌMÎM¬§OL鈵P£ùÊ®TŠóç“zD’•Ø’Nú\õ”®˜+¹°GH ¦3dF;¸ãˆŽmè•Òt'QFë鬻WÌñç*.ÆØ§[>\æu6ÀåÉÑ'Ë%A2Ïu¨þzö•í´"u m3(÷@'ß>Å|hÓý¡…5’-ü¯û¾IŸ3óÊô$WHämÌA"ü,°<á« Çî£{‘˜yª³å¦KRÖ^âp(Í Ã,+¤>?míŽf&Ðf/ðŸ$ž±`–{^œÃ9$ÞD5#¹ñìi𠦣ædúÃ7dG")æó˜‹@ >‘Š‘F));$aMww1õâRXÝÍÓÓ;²´aÇadÚѪ¢«é^G0Y¶Õò †Nìt(yÛØLôsx1º`|âZ¶P¿¬$%X_ç'c]¥¢‡Z7è ¨!²¨UCr:ˆ6d0o¦n8Xñ™Û@k#ïŸâ+ ˜Æ”í–c_¸]ŠclAüºD“\ În1µˆŒÑ ¬xÖQéWh[ê› ã0,TáãsÔ™½“UV:8£VçÛc‚bËÕ`b<)Ø,}b¾XRKdMƒÕJ'lnæâ©†6ýH”h ­Æ n¦˜<âm8ö#$ö'CMl·^Ó[JÚï1ú:` ±˜Õ@\•þÛ9fTG‘áÔSY!ªŒôEÝx»ÉõÏ|äK“žÄ½€7Ža|µÙKƒqšU¸äI»°«p¾£˜Ä­ì%:}˜¤éØ»1ƒž9FŠâèG  DTsô>;7MÞÿû§:€w±¹ó„Ä¡¼yIµX0É0o¢¼ZtŽ`7Е©°3s4Ê•²s78ª»+@ê0'>“LdŠ„ê:_¤ ‹²Éªš ;Ø¢¸,Â-˜°$ Ç9-§TG™ˆºµÁ‚ñÛ±éZ§«²¬ç´j0k$IXRÝ„ [¹Í'ÐxññÛÚ˜ AíÚÖ„~puwWo8MyT³%A4ìvÅlƒžL^©MÂÓsÁ_HeCÞñÍ$€jÝ ÒÒ-FûÃ( µ ƒd¶Ü_”`¢ºœLoÈÚâ¨Ô ƒ1‰cº1ÚÍu<ˆÕNMGb$ÚíŒÒZèÃÕcnÀép.ñå5É#Ög5!~PZðÞ;JhfJ„ªÓ ʇ­Üô‰š½¡°HÜâ³ ‘]¡c˜ÅÒ*Äç"j(WªõƒyB²Nº%M-š—Î:F…ì‘ÇHÝB¤ç€" T¯`> wsÅÌqÕ£tÈ÷˜5ÏX¹FÕ„¾ ÂæÈ„H¼¤iZúõ€è€ƒ×´é…u°T–鎓¶â›î#ã˜, 7ç+RÑŠ[ }žüWWºeN- G\ùÇ…ÅÕßy$ù$7’²w,Oáõ„²æìt2…Ó¢I㱆ɴ äæbj¨Ú¦BP† E|¯×2ò¸>õŠsÔöƒ)Ò å"GѰ ã¤Si…ÍdJu[±ÇœK¾á“žý&ã‹’1EµhC†… àÆ›Ï¤ÍÈ„(À¿8ô’Øå$•°îɱÒ7L„zç´í>€¬bi×ÚMžZ¡Rȼ3°ÎØAÜN='. FeÈ<é'tC–W» h¯”Ý¡ž¯ˆ'L *9*×'¸éáHó²¿'*ÚõÄjµ@ñ9¹â(ÛDÑ¢'ðC’{ [i9úFi•ìA‚­Â蝹ÜùHò¤M<”p4AÚÑ»w^¢,+ÅI«D–ýdµD™2^™…¼5V?YŒE\wœíâ¼Ô% A¸¾òL»é¥²aS‚E˽ٟ{{q®—þŠù` Ê=Ü {ßÙ9ÿŽCþ°ƒ…ÿš?ÚžH³ãˆF£Öj§ŽÇN³Qƒ=!1EävŸ¦ÆÏr UQ„ 0³*Û±µÇ^ð‚í·XòŒkäÕ$ÀJ|Uy™B.ÁÜ$·´ÝâiÖ*£8„¡&?ÝŽÕe'$8ê|ôé(µav,ñp5Œ4t1²øM.„éê• {óŒÛ¬äu")“=ÁãÊvžµ †«‰Ò‚îŠ#½•©¬ƒç¦üÇq"$)Û™FŽ¡Z[Ï”STpæ>ÅÉ_ÅÀ¯¤© ’3SÅdcµÃŒBÇ%{‹¿IÏkJþèäZègˆÆ‹ÅŒFqIÕ¶Ø¢ŸÜ금(Š£Ú¸ÍÑ`¶¢Õ}áSJÌÚf&ˆcwS~˜ª#ûc‘~[UÂ*\…¢s›‹žC¶K¢¬Ï}|¥ €YÌvÅ^+Ö¦šíÝÆbVMìØ¶Ï?SO;ºùLÒÍG°cþL[¨ÝÍäÚ ds‘T&DØçˆ`Ц ŸH+@ß#¤çIhRh-å±Y•{>˜zsqòáð<ðF*aÇ•IÃÛ|ŒLÝm@”[y(SOÅ b±0®:Ï7MÁ8åJþw ‰–Â)MCÝï€ñÌ•O‹Ô£Gnãgé B‘°¦8‹nºA ËŽsöŒ%Jþ+£ppE_?¤lqÚ)‹åLö˜›ƒ]f8é¨ýài›j¨©éQÒvÒß“Éâší5[‡yºd1ç7 ˆS؉$®‚©é¡.ié;peã×Êc&ì†ÏI‡ x¸)_FÊ-l,]„•”†¾’ÄÕ‹\N: À¾(ĶG¤…‰óEŒˆà~^§^³Š‡LÝLyï eေÇYf’øHwž—$vl².ƒF¬œ ¬áAbqÒ eº‹„ì5Ñ‚;É2Á‰½Û}½ƒ`}c²¢LQ@9<ÍPÞì™<¡Ä ©IîÜh‰ËœVbôõ)®Lj¶ã`s!ËíÙ+‹GiSâõž»_ü+ì6ruÓŸò„ˆþ]%~ï }íìG½£N¿ÒX¥Ë4oå †ä¿³äŸOåâô$ÁWÚFyæÌ§SH2ÕÈœlé™úÞ8)iŽÇ:äj)€¨F]„Ulœ3.¡ý# -W“XëE¸óWfî@(f%†ä5úÌu;€Œô„Wû`­bË}0´…æÈšú ’í8*®KEµYjÇSŽ›Ño©kaÖ8é ]EŠÄÍ=ªäްõ4ÔÑ#kÀK Jð9âr¾ÖÁÄ ŠÍ*¶?®a(|Ç4».Ò=nëÞ{¨wÕÚ¤vŽÚŠEUÌôØ];Eêäé©m®QŽpp ‰]ÃLêÎ4['ް¡‘f$™Zê ÇhÁ¨*…W”•1bÆ:Æ­1 $ù1†ã{¼mÝyò˜u Ûxü¢i·Õ؉٠?97¤¬×†–¶ë‰´ïÒra3ŒLÈ>žqRTé âÛ?.ÿ¶7Lú×çY•¨ Ò-Cy\öíl'Ak*í«Y0Q¦‘ºÛ˜ÝXôˆ6AùÌÈ«T¡ÅXÕöŒÐ¿H˶±cé&ù`ˆ”é ¬qÖo¥Ç¢9:Ø-ç“ö›¦ÌZŽk $rLX#@YV: ±ÆöÊ7£·NãÓ鱺@cN<ÿ8¹w¡®?%z:Œ0ãQ‰âéY’è9Ù´b°L~ÒNæ¬õ‚’½“JJÃuùF q ›ê{Æé6ÃÜ÷‘g~IÓlê•sçÆ!‚¬Ø>q.9#‘'å]‰mH—XWëÉkíÔÊW¯x‡b„cÒær(ªA3|ÁÕbª ß8F$L\X.æÇxå‹[åϰš·Yi°k˜®; e]–Pìs˜Ê UÜ“Mš÷m¡(:†Ö ÏàJŽƒsJ ±]œIÚ8ý$í®çf©&Wy&HQºE2¨Ôv›fûÉ®Å`‘§Š¢qŠ“5å‘å’±áŽí¡„nâ<«¬˜^âI7 µK`dÒJLRšNŠTŽ.ÉÌ¿Ý/^öö%}>Ÿõ„ðÑÈbI—{›Ú{óغ>Ѧ?ÖPùcý qÊæ—òx~ЊÕG3ƒUéže¯•6Eö‘êµY±ÄýnmlØIØ,—drp«fÛÈ×gŽÑL±àžÐÔ)”ÆZÔÛ‡AžbËí)(6@¹ìÊ)¬TdbìR÷1[…â-¨©ª¹CiÚ ˆd¥È¡ÐÃñ£ÕÅMÒ @4q޳v†ç¼Ñ¦¤q£LEŠ#¢´šÙC. Ä$Ô`M ƒ¿m(8™ºÞñé(ÆÛÑV>­Z9j¨TYS÷ë' 9ªíŒów2Zì:§eŠÅ—"£•AäZoYÌp}Ë|X¨½—a¥EN´AT-ró‚ˆÍÉÅf;Mvg¤\²¥¡'Øß˜¾ÓhÒô Ža %É“ÊJÁ^Öý¬s(PAê!FÖÜÏi­[v‹’NJèL¤ì^»ø¬IÝ÷Tkdvn!ÖÛuãŽ`ÎV´Q–ž  · yÆü÷Â=Iˆ°x„¬¥w]TØ-.*E ­mÄ3â€zIT’ÝòŽK¼pÛ'É‚×[v‘ë H’ÕyŽO´fŽÓsUSm·3BÑ$ƒœbP  Ä–_SˆÐ«°)cê L¥F¿vЖÒý!ÅØÄ"—ç]bÀÛ`“QNå±91_ö®³ ¹ãÊ-tȼÝÎÀNxŠq§d9»‹c_Q¬£hž‹Õ1jͪmºæb—d÷ò)Åôm Ë`Pô‹VÁ¾zB]SD‘s“kBd­èœ©Bn¹€ÜÀ±«©c8¹33:‘™—aJ/³ù^(Á.8<ž`2šN €O1/%Å$-׃òÀ¿9¨½Xàs.+‹˜òÙ¯' º}:B;tèbir*†³ë0†pE©È‘6bÌEZô¨¦Z'#tAd¶61ëÖ'—2ö»d+÷é7nÒA+ž‘Å¡ùÅjó0F'Kj˜©M§Ø“¥Y éÀô#RÜå‡="]X9±&F|¼CC'Å9¶î Oûâ› ÄÒøÚy‰’iYŽN‚cu^™—T‚lP‘­(SZÜ™<¶öM,¯¡Šß0ÿlm„[ï]d~-ÄúFé© šˆ”x’d“ù,Ó`o<ÁÚC`b¦i· õŒfÅX>rYM.¶ìàüC2s>ÿ÷yükKö„•Ø’ «ÜÀŸ~û»Õ§ûb%þXÿhf8qœ_ËGó)W&Ç2]]FÝ“Ç"0¿?¾Lú™äOØãŠÇocT‹¼ùÌg±ÖÌŸqÉâ§#šg–6•²Ø{Æ?~óF­ ¾±:š¥Eב¨Û²{ÅÉjÊñè¹>x‹ÖÓî×é1u¬…¢‡{Ô]E%+¶W‰1*JЬqqºkº¬f‘¸ŽÞ‘aÊ7‹ÉÙècÉj5¦ÆìÒ1 ×ãXïËÆ$ú¦Ø(˜èFW¡©«».9MÏ©“ééQµé*Û·#ž.¥z ïHr0'`Ï뎷ŒITñe:dï²E@œUh§­!ÚlÂÙŽ;JSP3m,{Ô˜6ã\!Ú…¬–[ÑS’}£ÐMQ¦o‚c>hu±Ì‰2œŸ¼5lØ6$ÌT²%¢´k4OqªFá´’:Ï<0݃ž‚åzž;¿·Y>HŠ“½¦¡ñº2Röä]wÕ|^á#VÜöq• †JìqÆ™$ÓAÝáð›ò‹Õ&«“åPBƒžc¡5äJöV5n³}£×TÏÐO5‰\ŽcSPï¢lùNJöû=6`ȱå¥Dx¤:z›Í2 ©XX‹Z2QR†ÜÀ.=a’ ÉÃË( º¯®2"›GF Fì`·Ò-ɵ`Êðô¾òme'ú¶×‚wcP2yý&0®~ I¾Y7’a+±EO¡3Iô1õ|6Ų»»öüÎI+±(}¢¥¤M<^#i«D°r<â .5/`é,žË¬ d¼q”R úK9Íf-ô€"ÍD¼»6H4‰6o÷ÎdÚ8æW…&Àòòƒ†˜çÎNó;±r• "[u‘Þ¢‚vƒ~‘ÄW3Hn ŽðO"¯±#J˜Ç*n#Êšxp'#dWÞd¤ä­Š”’Va½6Ç=¢ÝÁ&ÎHLêÕsªE ¿¬(KÁ<³hN«µþ<ŒCÌFo´sûEvD¢)½‹õoÈzdœQ ÁÔE‚(óˆÑ¡P](nÝŸ9Ò…ÉÝ X›Ç&b.üÑô¦1È F©É!b§UHç“äZî[±wÄ$ä“ö„iˆWiÛ@«"¤2Tö+#ä´r+$Tr“ƒ›‹ .ÆAÄh% ò“¿ÿ åmX@Š¡Vc€h`fš¨Õ#&±ÜDMåk@Üb¥>å`}ýîý§ügOö„CØQˆÿr‚¾þ÷ü«L¬"±/ò¯íÂýñOäù/iÔj;qÚTÙ9úÄjÓœ 3÷,XFBø–®Ï”æÀ® õ˜ª@l‰„°$žR OF«F $Ñãθc¦ ÁÌ5a¤D¡¢ˆ/&°y¾µ¦¡NâÝ8‚K6j¦0 ŒH1†©Œ‚¾Àë1‰,E´ä}£h„ÊX>ÓkÁZt¬Y<ÂâÝþ°>Bf¦žÊ"âU¿ýS c¤[‡"í•éj@ •)fPMÔŸE _û¥ˆ,r(Iå*e°˜,.å(mî{ÍÙ¸P òÀçáŶ2ÕÓøG†î,¶à@9ë ¨0»A:+ÿ8÷ƒ8jÇG&ìbj)@—FwϬQúDªÕÑÌæÚ8æó'”bg5eJÀßû1ºC–&‡i6AêcôØs,f)§¡¥wYº³1“ƒb `03|BGÝjAÄšpiØ\…‚n¨˜k¦MµŸ)£GžÑ‰Nhp:DIVÍbŽßJ†ºaH6#¾Q©ÛT-óPVEòšòj(Ú:­þQÊЬA\HýÑÁCé’{âg«@Åln“îsÒ]¢€X?y.†F ûÊUŽê‘'œÔ´†M¨õk|ÉXo7Ö>웘pH#Ê-ÉÄ—$Zú`óŠœF<êô?Ê4¿ŠjÏø×¼‘ûC– «þ/èùåÔb@»îDfY7§»ÿÓ¿‹Ǻëÿò4¿Š4Á÷ÅUMîÌŸÒþ(Œ™ð^¦¾ÐØãŸú¿£çÈé I/´]ϤÿéÿÄôóaÿý/âœ?àÿâu"½ÛõþQ§üQkò0ºûCxΪŸÑóªönÅABÃ…=¬Ï«o€~($æËî~~—ñNþ€üOÇóXüþ—ñMÿÊÃÓ’ûE1çÅZ>`; •8•èê ïÿ@~%Ûÿ&Ïéÿ!ð'ĪAíÿ}?â“<Ø[ý—ÙL¼ž2±zw‡´3f{П‰hÿƒ?ÛéÿÑð?Äah{·ý¾ŸñB†|IþëíF›¶ÏŸr“uS‰ûÏ¢oþ#+_ÍÜÿ~ŸñA|J1üÛ^šúÅòàk÷_h'=Už]ƒ8¸·NxèOÀÿ1ñ{·çôÿŠüñšþlþOø¤ÓɉmI}£ôxƒôÇ‹šþÙô:ü@¤“îÿ ÖÓþ)‡à¯ˆ‰ÿ“€ç´ÿŠ!僲û29ž:…4O§AÌõ×࿈ÐüÜOþ¾ŸñLo‚~"$W»ñþ{Oø¢g’\†).Ï)u9Á1Ú‡Ç_)êi|ïðïaãþÙ?ŠT¿{õÄïÿU?|óóSÒcVH¯'¨ù£ <yÕ?{ôœûÓç'ñFiü%ïÄÿÿjŸ¾LÓA¹ck³ÆÁÆx€º¤ZhOsú%ï»7ìXíóS÷Ìûð·‹Øp:|Ôþ)ÑoàØä‚òyÚ:§pc¼© æZ¿ ûår=†ùÔýñÃá¯|…ùê§ï‚ïÂ5䇆B­¾¨ ÍtQBÁž†ŸÃžø^}Œz|Äýó¿£¾û³ýè(ÿÚ'›ÒBœ£/(òu@_{‰"žéøoßÏòO§ÌOß0|5ïoú§÷DýñmMt™<øÕvx‹á·äžg ^j§³ý÷¹&ý“þÕ?|Ãðǽꇱ›ïóS÷ÉòÇ#é?¡Vš£Ë,ãí¥lHªî'¢>÷°$ÿ$?ÿDýð×áß|«cØñßæ'fÿWôÉgŒòØSXºõ‚£s‘ù‰ì¿Ã~ôaÿÚdÚ/ïŠ ûÜÉG¿ÍOßáÍþ¯éŠŽ9#Í  ¯Â9‚PmÀúÏ_ú7ïzDz×þªó÷˜>÷½üÿýS÷ÂŽ¯¸¿¦K8d½Eý 骩 ät¸š,M©4yí>¾÷Ã^Èÿ8Ÿ¾ô[ß cÙ?Ú§ï”G Ò¾/è›&<Ÿêßÿâ‚6àÐL@bI¯"'®~÷éoþʇùÔÇúÓÂ~ü"¿‘µOâ™,3¿Õýäü|ýðLð_LëŠ+|ÐÌú𿪇±µOß3ú!ïξÁŸóÉûæ<9/õB}ÈÿGôϘzV¿8 fùòŸG«ðg¿žˆö ÿžÓþ(³ðO¿ÅW»î¿í´ÿŠrÇ•ÿÅý ‡ãækôLðô™G5žg>©ÝÆ;ÏkúñÀ÷o×çiÿÃðWÄX¯wqÿm§üRˆà’wG/ÅÍËôLòCî^õÞ Ð&¯°žÂ|ñ °}ÛCüþŸñNo‚¾#.Oó~; }?âœðÍx“ñ3øƒúg€t÷µƒº_)2yžÖ—Á^ÿAŸwÿ¶Óþ(×ø;â`¯ým?âˆÉ‹+«ú~7äu鿦|ù FHœš¶—Ö{Ðψ¬ÿƒúcû¶ŸñAþ„üCòÛ[Oø§/Çm0—ãþG^›úgˆ5Xž(™Çvé삾#×»qþý?â†~ ø‰‡üGüöŸñIåø™ý_ÐRüÈðLð«nÍâzžäÖùžý÷`'#Ú´«ý1(‚~"jÿÿ·Óþ)g¹¾÷ÿ²{ãØuõýƒn–—´i»7ÎCJpÓ#ø“R^×ô ??8¾¿†ÿÙPythonCard-0.8.2/samples/proof/edit.gif0000644000076500007650000000117407333577351017737 0ustar alexalex00000000000000GIF89a7Õ?ww€£VVm||žššÁÈÈÌ**6ˆˆ¬ƒƒ‹eenbb|““·››´MMdääå;;I88F‘‘˜mmŠuu—44A¡¡Èon[[pjj…––ƒƒ§BBPss{†…¦rr‚‚¡§§Ï¬¬ÕOOh‹‹°¬¬Ô´´´00<ƒ„§¨§Ï­®ÖnnxŽŽ”®¯Ñgg­¬Õyy—­¬Ô77I–””›SS_˜˜¼»»Ù××Ù¨¨Ãÿ÷™ooOOgÄÄãÿÿÿ!ù?,7ÿÀŸpH,Ȥ²èk:—ÐèÒÙËUجvËíúˆ>Ïgµúza±zÍn»ßêÔ÷ÁÎÍ6"‘ø~.}v~|.„|Œ-|!s>6( dUzM (𡥦 5š5=°²*¥—6xXh%z¼ÃÄÄ/ *-*4±Î4Ѽ/—,œeWNÛáâáè7==3ïî==ÛÙ ¾yd%>-ô (P‚ôˆpðB¼#*Ð'áŽ#ºuòñOÆ AnˆÐ®@$M˜X¸2BK0b¸TáÄ ~ÀôhÐp‚çΙŸ;{ HЉ&€%ceÓìØ©àƒ¹¼éù'«×¯`=Xá ‡ܹ[a Ûô `½`u„-ÿìêÝË×®Çh¸ðƒÀ„Ûpi "KnÒà± –3?Æœ™³f ž5ë`,ƨE F#†Õ©W¿^M[6ìÛµS¿žSÚ‹ïßÀŸHNJ;PythonCard-0.8.2/samples/proof/proof.py0000644000076500007650000000507310046062332020003 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.16 $" __date__ = "$Date: 2004/05/05 03:51:54 $" """ import time from PythonCard import log, model class Proof(model.Background) : def on_bogus_select( self, event ) : print 'bogus!' def on_button1_mouseClick( self, event ) : button = event.target #Set the value of 'field1' to the current time #when 'button1' is clicked. now = time.localtime(time.time()) field1 = self.components.field1 print '\n\n\n\n\nfield1=', field1 field1.text = "it's %s" % time.asctime( now ) listX = self.components.list log.debug( listX.items ) log.debug( listX.stringSelection ) listX.stringSelection = "one" slider = self.components.aSlider log.debug( 'min='+ str( slider.min ) ) log.debug( 'max=' + str( slider.max ) ) log.debug( 'value=' + str( slider.value ) ) # RDS 2001-07-29 # Test setting StaticText. self.components.label.text = self.components.field2.text # KEA 2001-07-27 # test out setting colors # three different forms accepted # no mapping between names and color yet #button.setBackgroundColor('LAVENDER BLUSH') button.backgroundColor = 'BLUE' #button.setBackgroundColor('#FF0000') #rgb = (255, 0, 0) button.backgroundColor = (255, 0, 0) print button.backgroundColor def on_imagebtn_mouseClick( self, event ) : log.debug( 'imagebutton-mouseClick:' + str( event.target ) ) def on_list_select ( self, event ) : print 'list-select event, selected: ' + str( event.target.stringSelection ) print self def on_list_mouseDoubleClick( self, event ) : print 'list-mouseDoubleClick, selected: ' + str( event.target.stringSelection ) def on_field1_textUpdate ( self, event ) : log.debug( 'text-update:' + event.target.text ) #def on_field1_textEnter ( self, field, event ) : # log.debug( 'text-enter:' + field.text ) def on_field1_keyUp ( self, event ) : log.debug( 'key-up:' + str( event ) ) def on_radiogroup_select( self, event ) : log.debug( event.target ) def on_checkbox_mouseClick( self, event ) : log.debug( '\ncheckbox-clicked: ' + str( event.target ) ) def on_choice_select( self, event ) : log.debug( '\nchoice-selected: ' + str( event.target ) ) def on_mnuExit_select(self, event): self.close() if __name__ == '__main__': app = model.Application(Proof) app.MainLoop() PythonCard-0.8.2/samples/proof/proof.rsrc.py0000644000076500007650000000541010047606335020756 0ustar alexalex00000000000000# Changes - 7/25/01 - RDS # -Added 'label' item to Menu and MenuItem definitions. # -StaticText.label => StaticText.text # { 'application':{ 'type':'Application', 'name':'Proof', 'backgrounds': [ { 'type':'Background', 'name':'bg1', 'title':'PC Proof of Concept', 'size':( 400, 300 ), #'image':'background.jpg', 'image':'tile.bmp', 'tiled':1, 'menubar': { 'type':'MenuBar', 'menus': [ { 'type':'Menu', 'name':'mnuFile', 'label':'&File', 'items': [ #{ 'type':'MenuItem', 'name':'mnuOpenStack', 'label': 'Open Stack', 'command':'OpenStack' }, #{ 'type':'MenuItem', 'name':'-', 'label':'-' }, { 'type':'MenuItem', 'name':'mnuExit', 'label':'Exit' } ] } ] }, 'components': [ { 'type':'TextField', 'name':'field1', 'position':( 5, 4 ), 'size':(200, -1) }, { 'type':'TextArea', 'name':'field2', 'position':( 225, 4 ), 'size':( 150, 100 ), 'text':'' }, { 'type':'Button', 'style':'3d', 'name':'button1', 'position':( 5, 50 ), 'size':( 80, 20 ), 'label':'Button 1' }, { 'type':'PasswordField', 'name':'password1', 'position':( 225, 115 ), 'size':( -1, -1 ), 'text':'' }, { 'type':'Button', 'name':'button2', 'position':( 100, 50 ), 'size':( 80, 20 ), 'label':'Button 2' }, { 'type':'StaticText', 'name':'label', 'position':( 5, 210 ), 'size':( 80, 20 ), 'text': 'some text', 'alignment':'center' }, { 'type':'RadioGroup', 'name':'radiogroup', 'position':( 5, 100 ), 'label':'A RadioBox', 'items':[ 'one', 'two', 'five', 'three, sir' ], 'stringSelection':'two', 'layout':'vertical'}, { 'type':'Choice', 'name':'choice', 'position':( 120, 190 ), 'size':( 80, 20 ),'label':'A Choice', 'items':[ 'one', 'two', 'five', 'three, sir' ], 'stringSelection':'five' }, { 'type':'List', 'name':'list', 'position':( 120, 100 ), 'size':( 80,80 ),'items':[ 'one', 'two', 'five', 'three, sir' ], 'stringSelection':'three, sir' }, { 'type':'CheckBox', 'name':'checkbox', 'position':( 5, 230 ), 'size':( 80, 20 ), 'label':'Check box', 'checked':0 }, { 'type':'Slider', 'name':'aSlider', 'position':( 285, 220 ), 'size':( 100, 15 ), 'min':1, 'max':100, 'value':1, 'layout':'horizontal' }, { 'type':'Image', 'name':'image', 'position':( 120, 220 ), 'size':( -2, -2 ), 'file':'trash.gif'}, { 'type':'ImageButton', 'name':'imagebtn', 'position':( 200, 220 ), 'size':( -2, -2 ), 'file':'edit.gif'}, { 'type':'StaticLine', 'name':'staticlineV', 'position':( 215, 5 ), 'size':( -1, 200 ), 'layout':'vertical' }, { 'type':'StaticLine', 'name':'staticlineH', 'position':( 5, 80 ), 'size':( 200, -1 ) } ] } ] } } PythonCard-0.8.2/samples/proof/readme.txt0000644000076500007650000000071707343743577020331 0ustar alexalex00000000000000proof grew out of the original proof of concept for PythonCard. It shows off all the widgets, but the widgets sample does a much better job of showing all the widgets and allowing the user to experiment with changing the widget attributes (properties). proof shows the use of a tiled background image and handles some events not used in any of the other samples. proof will probably be replaced in the future by a sample dedicated to testing all possible events. PythonCard-0.8.2/samples/proof/tile.bmp0000644000076500007650000005134607333577351017766 0ustar alexalex00000000000000BMæR6(TT°R­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”PythonCard-0.8.2/samples/proof/trash.gif0000644000076500007650000000037107333577351020131 0ustar alexalex00000000000000GIF89a¢ÿÿÿÿÌÌÌ™™™fff333ÀÀÀ!ù,khºÜþ0ÊUêŒ%èrù`(F  ªC ‰p&š²åüB ‚€ÐÒíz= è¢!ÁaQRz*¥Í£ïÊ4>ªÛh—Ê /§N3Öë'Åhíûœý–çk²í&ˆc"l„…†…‰Š !þOCopyright 2000 by Sun Microsystems, Inc. All Rights Reserved. JLF GR Ver 1.0 ;PythonCard-0.8.2/samples/pysshed/0000755000076500007650000000000010434046771016643 5ustar alexalex00000000000000PythonCard-0.8.2/samples/pysshed/about.html0000644000076500007650000000037207562256145020653 0ustar alexalex00000000000000 PySSHed is a GUI session manager for SSH connections under Linux and Windows.

PySSHed was developed using the PythonCard GUI toolkit, http://pythoncard.sourceforge.net

PythonCard-0.8.2/samples/pysshed/author.html0000644000076500007650000000054607562256145021046 0ustar alexalex00000000000000 PySSHed was developed by Phil Edwards phil@linux2000.com. Credit is also due to the following people:

Kevin Altis altis@semi-retired.com, without whose excellent work on PythonCard none of this would be possible
PythonCard-0.8.2/samples/pysshed/changelog.txt0000644000076500007650000000174507563775445021362 0ustar alexalex00000000000000ChangeLog: v0.3.2, release date TBA - fixed exception when clicking modifyu without first selecting a session - spelling mistake in customDialogs rendered the Cancel button non-functional v0.3.1, November 6 2002 - renamed the readme and changelog files to avoid confusion in the PythonCard samples app v0.3, November 5 2002 - changed licensing terms, see help --> about --> license for details - made the dialogs a bit taller so that they look right under Windows - removed erroneous backgroundColor attributes from the resource files - added Windows support, using Putty 0.53 as the SSH client - moved the wrap_string function into customDialogs just to keep the file count down v0.2, November 2 2002 - can now specify which terminal application to use under Linux - Hostname validation improved, no longer assumes that an Internet connection is always present v0.1, November 1 2002 - First public release PythonCard-0.8.2/samples/pysshed/customDialogs.py0000644000076500007650000002015310347526324022033 0ustar alexalex00000000000000# customDialogs.py # This file contains all the custom dialogs (each based on CustomDialog) used by PySSHed # vim: ai et sw=4 ts=4 # # Copyright 2002 Phil Edwards, phil@linux2000.com # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. 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. # # THIS SOFTWARE IS PROVIDED BY PHIL EDWARDS ``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 AUTHOR OR ANY 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. # # IF THE DISTRIBUTION YOU HAVE RECEIVED IS IN BINARY-ONLY FORMAT, THE SOURCE # CODE FOR THE MOST RECENTLY-RELEASED VERSION OF THIS SOFTWARE MAY BE # OBTAINED WITHOUT REQUIRING ANY PAYMENT TO THE AUTHOR AT THE FOLLOWING URL: # http://www.linux2000.com/pysshed.html # from PythonCard import dialog, resource, graphic, model from PythonCard.model import CustomDialog import wx import os, time, socket class HTMLHelp(CustomDialog): """Displays an HTML based about box""" def __init__(self, aBg, links=None): path = os.path.join(aBg.application.applicationDirectory, 'helpAbout') aDialogRsrc = resource.ResourceFile(model.internationalResourceName(path)).getResource() CustomDialog.__init__(self, aBg, aDialogRsrc) self.parent = aBg # links is a 3-element list giving the HTML files to use for the About, Author # and License buttons if links is None: links = ['about.html', 'author.html', 'license.html'] self.links = links self.components.HtmlWindow.text = self.links[0] def on_btnOK_mouseClick(self, event): event.skip() def on_AboutBtn_mouseClick(self, event): self.components.HtmlWindow.text = self.links[0] def on_AuthorBtn_mouseClick(self, event): self.components.HtmlWindow.text = self.links[1] def on_LicenseBtn_mouseClick(self, event): self.components.HtmlWindow.text = self.links[2] class prefsDialog(CustomDialog): """Displays a preferences dialog box""" def __init__(self, aBg, section='Defaults'): path = os.path.join(aBg.application.applicationDirectory, 'prefsDialog') aDialogRsrc = resource.ResourceFile(model.internationalResourceName(path)).getResource() CustomDialog.__init__(self, aBg, aDialogRsrc) self.parent = aBg self.section = section # retrieve the right section from the config file self.components.sessionName.text = self.section if self.section =='Defaults': self.components.portNumber.text = self.parent.cfg.get(self.section, 'port') self.components.userName.text = self.parent.cfg.get(self.section, 'user') self.components.identityFile.text = self.parent.cfg.get(self.section, 'identityfile') self.components.connectCmd.text = self.parent.cfg.get(self.section, 'command') self.components.sessionName.editable = 0 self.components.StaticText4.enabled = 0 self.components.hostName.enabled = 0 else: if self.section != 'NewSession': self.components.hostName.text = self.parent.cfg.get(self.section, 'hostname') self.components.portNumber.text = self.parent.cfg.get(self.section, 'port') self.components.userName.text = self.parent.cfg.get(self.section, 'user') self.components.identityFile.text = self.parent.cfg.get(self.section, 'identityfile') self.components.connectCmd.text = self.parent.cfg.get(self.section, 'command') def on_idFileBtn_mouseClick(self, event): # select SSH private key file title = 'Select SSH private key file' start = os.path.join(os.path.expanduser('~'), '.ssh') wildcard = "All Files|*" result = dialog.openFileDialog(self, 'Open', start, '', wildcard) if result.accepted: self.components.identityFile.text = result.paths[0] def on_btnOK_mouseClick(self, event): if self.components.sessionName.text == 'Defaults': self.parent.cfg.set(self.components.sessionName.text, 'port', self.components.portNumber.text) self.parent.cfg.set(self.components.sessionName.text, 'user', self.components.userName.text) self.parent.cfg.set(self.components.sessionName.text, 'identityfile', self.components.identityFile.text) self.parent.cfg.set(self.components.sessionName.text, 'command', self.components.connectCmd.text) event.skip() elif self.components.sessionName.text == 'NewSession': bull = dialog.alertDialog(self, 'Invalid session name', 'Oops!') else: if self.components.hostName.text == '' and self.components.sessionName.text != 'Defaults': bull = dialog.alertDialog(self, 'You must enter a valid host name', 'Oops!') else: accept = 1 try: bull = socket.gethostbyname(self.components.hostName.text) except socket.gaierror: msgtxt = '"%s" may not be a valid DNS hostname. ' % self.components.hostName.text msgtxt += 'This may be because you do not currently have a connection to the internet, ' msgtxt += 'or it may be that the name you have entered really is invalid. Do you ' msgtxt += 'want to accept it anyway?' result = dialog.messageDialog(self, wrap_string(msgtxt, 50), 'Warning:', wx.ICON_EXCLAMATION | wx.YES_NO | wx.NO_DEFAULT) accept = result.accepted if accept: if not self.parent.cfg.has_section(self.components.sessionName.text): self.parent.cfg.add_section(self.components.sessionName.text) self.parent.cfg.set(self.components.sessionName.text, 'hostname', self.components.hostName.text) self.parent.cfg.set(self.components.sessionName.text, 'port', self.components.portNumber.text) self.parent.cfg.set(self.components.sessionName.text, 'user', self.components.userName.text) self.parent.cfg.set(self.components.sessionName.text, 'identityfile', self.components.identityFile.text) self.parent.cfg.set(self.components.sessionName.text, 'command', self.components.connectCmd.text) event.skip() def on_btnCancel_mouseClick(self, event): event.skip() def wrap_string(s, max, para = "\n\n"): paras = s.split(para) outStr = "" for paragraph in paras: paragraph = paragraph.replace("\n", " ") words = paragraph.split() outLine = "" lineCount = wordCount = 0 for i in range(len(words)): if (len(outLine) + len(words[i])) > max: if lineCount: outStr += "\n" outStr += outLine outLine = words[i] lineCount += 1 wordCount = 1 else: if wordCount: outLine += " " outLine += words[i] wordCount += 1 if lineCount: outStr += "\n" outStr += outLine outStr += para return outStr PythonCard-0.8.2/samples/pysshed/helpAbout.rsrc.py0000644000076500007650000000170007563775445022126 0ustar alexalex00000000000000{'type':'CustomDialog', 'name':'dlgAbout', 'title':'About PySSHed:', 'position':(-1, -1), 'size':(410, 300), 'components': [ {'type':'StaticText', 'name':'StaticText', 'position':(10, 20), 'font':{'style': 'bold', 'family': 'sansSerif', 'size': 12}, 'text':'PySSHed (Python SSH Session Editor) Ver 0.3.2', }, {'type':'Button', 'name':'AboutBtn', 'position':(10, 50), 'label':'About', }, {'type':'Button', 'name':'AuthorBtn', 'position':(95, 50), 'label':'Author', }, {'type':'Button', 'name':'LicenseBtn', 'position':(180, 50), 'label':'License', }, {'type':'HtmlWindow', 'name':'HtmlWindow', 'position':(5, 80), 'size':(395, 155), 'backgroundColor':(255, 255, 255), }, {'type':'Button', 'id':5100, 'name':'btnOK', 'position':(325, 245), 'label':'Close', }, ] # end components } # end CustomDialog PythonCard-0.8.2/samples/pysshed/license.html0000644000076500007650000000313607562256145021164 0ustar alexalex00000000000000

Copyright 2002 Phil Edwards, phil@linux2000.com

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  2. 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.

THIS SOFTWARE IS PROVIDED BY PHIL EDWARDS ``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 AUTHOR OR ANY 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.

IF THE DISTRIBUTION YOU HAVE RECEIVED IS IN BINARY-ONLY FORMAT, THE SOURCE CODE FOR THE MOST RECENTLY-RELEASED VERSION OF THIS SOFTWARE MAY BE OBTAINED WITHOUT REQUIRING ANY PAYMENT TO THE AUTHOR AT THE FOLLOWING URL:

   http://www.linux2000.com/pysshed.html
PythonCard-0.8.2/samples/pysshed/prefsDialog.rsrc.py0000644000076500007650000000344107563775445022446 0ustar alexalex00000000000000{'type':'CustomDialog', 'name':'Template', 'title':'PySSHed: Session parameters', 'position':(-1, -1), 'size':(450, 220), 'components': [ {'type':'TextField', 'name':'sessionName', 'position':(75, 15), 'size':(330, -1), }, {'type':'TextField', 'name':'hostName', 'position':(75, 45), 'size':(330, -1), }, {'type':'TextField', 'name':'portNumber', 'position':(75, 75), 'size':(55, -1), }, {'type':'TextField', 'name':'userName', 'position':(195, 75), 'size':(210, -1), }, {'type':'TextField', 'name':'identityFile', 'position':(75, 105), 'size':(330, -1), }, {'type':'TextField', 'name':'connectCmd', 'position':(75, 135), 'size':(330, -1), }, {'type':'Button', 'name':'idFileBtn', 'position':(410, 105), 'size':(25, -1), 'label':'...', }, {'type':'Button', 'id':5100, 'name':'btnOK', 'position':(75, 165), 'label':'OK', }, {'type':'Button', 'id':5101, 'name':'btnCancel', 'position':(170, 165), 'label':'Cancel', }, {'type':'StaticText', 'name':'StaticText5', 'position':(20, 20), 'text':'Session', }, {'type':'StaticText', 'name':'StaticText4', 'position':(25, 50), 'text':'Host/IP', }, {'type':'StaticText', 'name':'StaticText1', 'position':(40, 80), 'text':'Port', }, {'type':'StaticText', 'name':'StaticText2', 'position':(160, 80), 'text':'User', }, {'type':'StaticText', 'name':'StaticText3', 'position':(5, 110), 'text':'Identity file', }, {'type':'StaticText', 'name':'StaticText6', 'position':(10, 140), 'text':'Command', }, ] # end components } # end CustomDialog PythonCard-0.8.2/samples/pysshed/pysshed.py0000644000076500007650000001775010116446044020700 0ustar alexalex00000000000000#!/usr/bin/python # simple SSH session manager for Linux # vim: ai et sw=4 ts=4 # # Copyright 2002 Phil Edwards, phil@linux2000.com # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. 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. # # THIS SOFTWARE IS PROVIDED BY PHIL EDWARDS ``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 AUTHOR OR ANY 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. # # IF THE DISTRIBUTION YOU HAVE RECEIVED IS IN BINARY-ONLY FORMAT, THE SOURCE # CODE FOR THE MOST RECENTLY-RELEASED VERSION OF THIS SOFTWARE MAY BE # OBTAINED WITHOUT REQUIRING ANY PAYMENT TO THE AUTHOR AT THE FOLLOWING URL: # http://www.linux2000.com/pysshed.html # import os, sys import wx from PythonCard import dialog, model import ConfigParser import customDialogs # pwd only exists on *NIX if sys.platform.startswith('linux') or sys.platform.startswith('darwin'): CONFIG_FILE = os.path.join(os.path.expanduser('~'), '.pysshedrc') import pwd else: CONFIG_FILE = os.path.join(os.path.dirname(sys.argv[0]), 'pysshed.ini') class pysshed(model.Background): def on_initialize(self, event): self.cfg = ConfigParser.ConfigParser() # first job is to see we have any config info if not os.path.exists(CONFIG_FILE): title = 'Initial setup' txt = 'Since this is the first time you have run PySSHed, you need to configure ' txt += 'your default SSH preferences. Most users should find that the ' txt += 'default settings are satisfactory. On this system, settings will be stored ' txt += 'in "%s". Click OK to begin configuring PySSHed.' % CONFIG_FILE bull = dialog.alertDialog(self, customDialogs.wrap_string(txt, 70), title) self.cfg.add_section('Defaults') # set some (hopefully!) reasonable defaults self.cfg.set('Defaults', 'port', '22') if sys.platform.startswith('linux') or sys.platform.startswith('darwin'): self.cfg.set('Defaults', 'user', pwd.getpwuid(os.getuid())[0]) self.cfg.set('Defaults', 'identityfile', os.path.join(os.path.join(os.path.expanduser('~'), '.ssh'), 'identity')) self.cfg.set('Defaults', 'command', '/usr/X11R6/bin/xterm -e ssh') else: self.cfg.set('Defaults', 'user', '') self.cfg.set('Defaults', 'identityfile', os.path.join(os.path.dirname(os.path.abspath(sys.argv[0])), 'identity')) self.cfg.set('Defaults', 'command', '"C:\\Program files\\putty\\putty.exe"') dlg = customDialogs.prefsDialog(self, 'Defaults') if dlg.ShowModal() == wx.ID_OK: fd = open(CONFIG_FILE, 'w') self.cfg.write(fd) fd.close() dlg.destroy() self.cfg.read(CONFIG_FILE) self.updateSessionList() if len(self.components.sessionList.items) > 0: self.components.sessionList.stringSelection = self.components.sessionList.items[0] def on_connectBtn_command(self, event): section = self.components.sessionList.stringSelection if section != '': cmd = self.cfg.get(section, 'command') if sys.platform.startswith('linux') or sys.platform.startswith('darwin'): cmd += ' -p %s' % self.cfg.get(section, 'port') cmd += ' -l %s' % self.cfg.get(section, 'user') if self.cfg.get(section, 'identityfile') != '': cmd += ' -i %s' % self.cfg.get(section, 'identityfile') cmd += ' %s' % self.cfg.get(section, 'hostname') cmd += ' &' os.system(cmd) else: args = [] args.append(os.path.basename(cmd)) args.append('-ssh') args.append('-P') args.append('%s' % self.cfg.get(section, 'port')) args.append('-l') args.append('%s' % self.cfg.get(section, 'user')) if self.cfg.get(section, 'identityfile') != '': args.append('-i') args.append('%s' % self.cfg.get(section, 'identityfile')) args.append('%s' % self.cfg.get(section, 'hostname')) retval = os.spawnv(os.P_NOWAIT, cmd, args) self.components.sessionList.stringSelection = section def on_addBtn_command(self, event): oldlist = self.components.sessionList.items[:] self.cfg.add_section('NewSession') self.cfg.set('NewSession', 'port', self.cfg.get('Defaults', 'port')) self.cfg.set('NewSession', 'user', self.cfg.get('Defaults', 'user')) self.cfg.set('NewSession', 'identityfile', self.cfg.get('Defaults', 'identityfile')) self.cfg.set('NewSession', 'command', self.cfg.get('Defaults', 'command')) dlg = customDialogs.prefsDialog(self, 'NewSession') if dlg.ShowModal() == wx.ID_OK: bull = self.cfg.remove_section('NewSession') fd = open(CONFIG_FILE, 'w') self.cfg.write(fd) fd.close() else: bull = self.cfg.remove_section('NewSession') dlg.destroy() self.updateSessionList() newlist = self.components.sessionList.items[:] if newlist != oldlist: for item in newlist: if not item in oldlist: self.components.sessionList.stringSelection = item break def on_modifyBtn_command(self, event): section = self.components.sessionList.stringSelection if section != '': dlg = customDialogs.prefsDialog(self, self.components.sessionList.stringSelection) if dlg.ShowModal() == wx.ID_OK: fd = open(CONFIG_FILE, 'w') self.cfg.write(fd) fd.close() dlg.destroy() self.updateSessionList() self.components.sessionList.stringSelection = section def on_delBtn_command(self, event): msgtxt = 'Are you sure you want to delete "%s"?' % self.components.sessionList.stringSelection result = dialog.messageDialog(self, msgtxt, 'Caution!', wx.ICON_EXCLAMATION | wx.YES_NO | wx.NO_DEFAULT) if result.accepted: bull = self.cfg.remove_section(self.components.sessionList.stringSelection) fd = open(CONFIG_FILE, 'w') self.cfg.write(fd) fd.close() self.updateSessionList() self.components.sessionList.stringSelection = self.components.sessionList.items[0] def on_helpAbout_command(self, event): dlg = customDialogs.HTMLHelp(self) dlg.showModal() dlg.destroy() def updateSessionList(self): configlist = [] for config in self.cfg.sections(): if config != 'Defaults': configlist.append(config) configlist.sort() self.components.sessionList.items = configlist if __name__ == '__main__': app = model.Application(pysshed) app.MainLoop() PythonCard-0.8.2/samples/pysshed/pysshed.rsrc.py0000644000076500007650000000530310047606337021645 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'Minimal', 'backgrounds': [ {'type':'Background', 'name':'bgMin', 'title':'SSH Session Manager', 'position':(-1, -1), 'size':(360, 240), 'menubar': {'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ {'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit', }, ] }, {'type':'Menu', 'name':'menuSessions', 'label':'&Sessions', 'items': [ {'type':'MenuItem', 'name':'menuSessionConnect', 'label':'&Connect\tAlt+C', 'command':'connectBtn', }, {'type':'MenuItem', 'name':'menuSessionAdd', 'label':'&Add...\tAlt+A', 'command':'addBtn', }, {'type':'MenuItem', 'name':'menuSessionModify', 'label':'&Modify...\tAlt+M', 'command':'modifyBtn', }, {'type':'MenuItem', 'name':'menuSessionDelete', 'label':'&Delete\tAlt+D', 'command':'delBtn', }, ] }, {'type':'Menu', 'name':'menuHelp', 'label':'&Help', 'items': [ {'type':'MenuItem', 'name':'menuHelpAbout', 'label':'A&bout...\tAlt+B', 'command':'helpAbout', }, ] }, ] }, 'components': [ {'type':'Button', 'name':'quitBtn', 'position':(270, 160), 'command':'exit', 'label':'Quit', }, {'type':'Button', 'name':'delBtn', 'position':(270, 100), 'command':'delBtn', 'label':'Delete...', }, {'type':'Button', 'name':'modifyBtn', 'position':(270, 70), 'command':'modifyBtn', 'label':'Modify...', }, {'type':'Button', 'name':'addBtn', 'position':(270, 40), 'command':'addBtn', 'label':'Add...', }, {'type':'Button', 'name':'connectBtn', 'position':(270, 10), 'command':'connectBtn', 'label':'Connect', }, {'type':'List', 'name':'sessionList', 'position':(10, 10), 'size':(252, 174), 'items':[], }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/samples/pysshed/readme.txt0000644000076500007650000000211707562256145020650 0ustar alexalex00000000000000PySSHed Version 0.3.1 README file PySSHed is a simple SSH session manager for use on Linux and Windows platforms. It allows you to store and manage your most frequently used sessions without editing (and potentially invalidating) the default SSH config file on your PC. PySSHed is intended primarily for use on a Linux machine, since most Windows based SSH clients already have some sort of session manager built in. Just to show how good Python and PythonCard are for cross platform development, though, it will also interoperate with the free Windows SSH client, Putty. This version of PySSHed was written in conjunction with a fresh install of Putty-0.53, so if you have any success (or, indeed, failures) using it with other versions of Putty under Windows, I'd be happy to hear about it. The first time you run PySSHed, you'll be asked to specify some default settings - any subsequent sessions you create will use the defaults as a starting point, but you can change anything that's inappropriate on a per-session basis. Please refer to the changelog.txt file for a detailed revision history. PythonCard-0.8.2/samples/radioclient/0000755000076500007650000000000010434046771017461 5ustar alexalex00000000000000PythonCard-0.8.2/samples/radioclient/blogger.py0000644000076500007650000003542707607474116021475 0ustar alexalex00000000000000"""Blogger interface for Python http://sourceforge.net/projects/pyblogger/ This module allows you to post to a weblog and manipulate its settings. It was originally designed to work with Blogger (http://www.blogger.com/), but other weblog systems have since implemented this API, and this module can talk to any of them. Whichever system you use, you'll need an account. - Blogger: http://www.blogger.com/ - Manila: http://www.manilasites.com/ - LiveJournal: http://www.livejournal.com/ Note that LiveJournal does not support this API directly; you'll need to use a Blogger-to-LiveJournal gateway, described here: http://www.tswoam.co.uk/index.php?n_go=14 Many functions take the following common arguments: - blogID: - If connecting to Blogger, this is your blog's ID number on blogger.com; to get this, log in on blogger.com, click on your blog to edit it, and look in the query string of the URL. - For Manila, this is the base URL of your weblog. - For LiveJournal, this is the journal name. Can be left blank and the user's default journal will be used. - username: your weblog system username. - password: your weblog system password. Example: >>> import blogger >>> username = "YOUR_BLOGGER_USERNAME" >>> password = "YOUR_BLOGGER_PASSWORD" >>> blogs = blogger.listBlogs(username, password) >>> myFirstBlog = blogs[0] >>> url = myFirstBlog["url"] >>> blogID = myFirstBlog["blogid"] >>> postID = blogger.newPost(blogID, username, password, "First post!", 1) >>> print "New post is available at %s#%s" % (url, postID) """ __author__ = "Mark Pilgrim (f8dy@diveintomark.org)" __version__ = "$Revision: 1.2 $" __date__ = "$Date: 2003/01/10 07:37:50 $" __copyright__ = "Copyright (c) 2001-2 Mark Pilgrim" __license__ = "Python" # Requires Pythonware's XML-RPC library # This comes standard in Python 2.2 # Users of earlier versions must download and install from # http://www.pythonware.com/products/xmlrpc/ import xmlrpclib class TemplateType: main = "main" archiveIndex = "archiveIndex" acceptableTypes = (main, archiveIndex) class constants: # XML-RPC server. We default to Blogger's server, but you # can set this to any Blogger-compatible server # - Manila: set to your base URL + "/RPC2" # - LiveJournal: set to your Blogger-LiveJournal gateway # Alternatively, you can pass the server to any of the # functions as the last parameter to override this setting. xmlrpcServer = "http://plant.blogger.com/api/RPC2" # The application key is required by Blogger; # other weblog systems ignore it applicationKey = "1973FAF4B76FC60D35E266310C6F0605456798" # Transport is only used for testing; should be None for production transport = None def getUserInfo(username, password, serverURL=None): """Get information about a user Returns: dictionary {"nickname": "user's nickname", "userid": "user ID", "url": "user's URL", "email": "user's email", "lastname": "user's last name", "firstname": "user's first name"} Arguments: - username: your weblog username - password: your weblog password - serverURL: URL of remote server (optional, defaults to constants.xmlrpcServer) Example: >>> info = blogger.getUserInfo("my_blogger_username", "my_secret_password") >>> for k, v in info.iteritems(): ... print k, v """ server = xmlrpclib.Server(serverURL or constants.xmlrpcServer, constants.transport) info = server.blogger.getUserInfo(constants.applicationKey, username, password) return info def listBlogs(username, password, serverURL=None): """Get a list of your blogs Returns: list of dictionaries [{"blogid": ID_of_this_blog, "blogName": "name_of_this_blog", "url": "URL_of_this_blog"}, ...] Arguments: - username: your weblog username - password: your weblog password - serverURL: URL of remote server (optional, defaults to constants.xmlrpcServer) Example: >>> blogList = blogger.listBlogs("my_blogger_username", "my_secret_password") >>> for blog in blogList: ... print "ID:", blog["blogid"] ... print "Name:, blog["blogName"] ... print "URL:", blog["url"] ... print Manila notes: - Manila does not support this method, because it does not keep a centralized database of a user's blogs. """ server = xmlrpclib.Server(serverURL or constants.xmlrpcServer, constants.transport) response = server.blogger.getUsersBlogs(constants.applicationKey, username, password) return response getUsersBlogs = listBlogs def listPosts(blogID, username, password, maxPosts=20, serverURL=None): """List recent posts in your blog Returns: list of dictionaries [{"dateCreated": date/time of this post in tuple format (see http://python.org/doc/lib/module-time.html) "userid": user who posted this entry, "postid": ID of this post, "content": text of this post }, ...] Posts are listed in chronological order, oldest to newest, so listPosts(...)[-1] is the newest post Arguments: - blogID: your weblog's ID number (see module docs for details) - username: your weblog username - password: your weblog password - maxPosts: maximum number of posts to return - serverURL: URL of remote server (optional, defaults to constants.xmlrpcServer) Example: >>> blogger.listPosts(my_blog_ID, "my_blogger_username", "my_blogger_password", 1) # returns the most recent post Notes: - The Blogger server will only return the 20 most recent posts. """ server = xmlrpclib.Server(serverURL or constants.xmlrpcServer, constants.transport) response = server.blogger.getRecentPosts(constants.applicationKey, str(blogID), str(username), str(password), maxPosts) response.reverse() for i in range(len(response)): v = response[i]["dateCreated"].value response[i]["dateCreated"] = (int(v[:4]), int(v[4:6]), int(v[6:8]), int(v[9:11]), int(v[12:14]), int(v[15:17]), 0, 0, 0) return response getRecentPosts = listPosts def getPost(postID, username, password, serverURL=None): """Get a single post by ID Returns: dictionary {"dateCreated": date/time of this post in tuple format (see http://python.org/doc/lib/module-time.html) "userid": user who posted this entry, "postid": ID of this post, "content": text of this post} Arguments: - postID: the ID of the post to get - username: your weblog username - password: your weblog password - serverURL: URL of remote server (optional, defaults to constants.xmlrpcServer) Example: >>> blogger.getPost(postID, "my_blogger_username", "my_blogger_password") """ server = xmlrpclib.Server(serverURL or constants.xmlrpcServer, constants.transport) response = server.blogger.getPost(constants.applicationKey, str(postID), str(username), str(password)) v = response["dateCreated"].value response["dateCreated"] = (int(v[:4]), int(v[4:6]), int(v[6:8]), int(v[9:11]), int(v[12:14]), int(v[15:17]), 0, 0, 0) return response def newPost(blogID, username, password, text, publish=0, serverURL=None): """Post a new message to your blog Returns: string post ID: append this to your base blog URL to link to your new post Arguments: - blogID: your blog's ID number (see module docs for details) - username: your weblog username - password: your weblog password - text: the actual text you'd like to post - publish (optional): 0 = post but do not publish (default) 1 = post and publish - serverURL: URL of remote server (optional, defaults to constants.xmlrpcServer) Example: >>> postID = blogger.newPost(my_blog_ID, "my_blogger_username", "my_blogger_password, "First post!", 1) >>> print postID Blogger notes: - Posts are limited to 65536 characters by the Blogger server. - If you want to publish, you must set up your blog to remember your FTP username and password. You must do this through the web interface at blogger.com; there is currently no way to do it through this API. Manila notes: - Manila does not have the concept of "post but don't publish"; all posts are published immediately. So the "publish" flag is used as an approval flag for multi-member weblogs. See http://frontier.userland.com/emulatingBloggerInManila for details. """ server = xmlrpclib.Server(serverURL or constants.xmlrpcServer, constants.transport) postID = server.blogger.newPost(constants.applicationKey, str(blogID), str(username), str(password), str(text), publish and xmlrpclib.True or xmlrpclib.False) return postID def editPost(postID, username, password, text, publish=0, serverURL=None): """Edit an existing message in your blog Returns: 1 Arguments: - postID: ID of post to edit - username: your weblog username - password: your weblog password - text: the actual text you'd like to post - publish (optional): 0 = post but do not publish (default) 1 = post and publish - serverURL: URL of remote server (optional, defaults to constants.xmlrpcServer) Example: >>> postID = blogger.newPost(my_blog_ID, "my_blogger_username", "my_blogger_password, "First post!", 1) >>> blogger.editPost(postID, "my_blogger_username", "my_blogger_password, "This text overwrites the old text completely.", 1) Blogger notes: - Posts are limited to 65536 characters by the Blogger server. - If you want to publish, you must set up your blog to remember your FTP username and password. You must do this through the web interface at blogger.com; there is currently no way to do it through this API. Manila notes: - Manila does not have the concept of "post but don't publish"; all posts are published immediately. So the "publish" flag is used as an approval flag for multi-member weblogs. See http://frontier.userland.com/emulatingBloggerInManila for details. LiveJournal notes: - Post IDs (item IDs) are not guaranteed to be unique across all of a user's journals, so the default journal is always used. There is currently no way of editing entries on a secondary journal. See http://www.tswoam.co.uk/index.php?n_go=14 for details. """ server = xmlrpclib.Server(serverURL or constants.xmlrpcServer, constants.transport) response = server.blogger.editPost(constants.applicationKey, str(postID), str(username), str(password), str(text), publish and xmlrpclib.True or xmlrpclib.False) return response == xmlrpclib.True def deletePost(postID, username, password, publish=0, serverURL=None): """Delete an existing message in your blog Returns: 1 Arguments: - postID: ID of post to edit - username: your weblog username - password: your weblog password - publish (optional): 0 = delete but do not publish (default) 1 = delete and publish - serverURL: URL of remote server (optional, defaults to constants.xmlrpcServer) Example: >>> postID = blogger.newPost(my_blog_ID, "my_blogger_username", "my_blogger_password, "First post!", 1) >>> blogger.deletePost(postID, "my_blogger_username", "my_blogger_password, 1) Blogger notes: - Posts are limited to 7200 characters by the Blogger server. - If you want to publish, you must set up your blog to remember your FTP username and password. You must do this through the web interface at blogger.com; there is currently no way to do it through this API. LiveJournal notes: - Post IDs (item IDs) are not guaranteed to be unique across all of a user's journals, so the default journal is always used. There is currently no way of deleting entries on a secondary journal. See http://www.tswoam.co.uk/index.php?n_go=14 for details. """ server = xmlrpclib.Server(serverURL or constants.xmlrpcServer, constants.transport) response = server.blogger.deletePost(constants.applicationKey, str(postID), str(username), str(password), publish and xmlrpclib.True or xmlrpclib.False) return response == xmlrpclib.True def getTemplate(blogID, username, password, templateType="main", serverURL=None): """Get HTML template for your blog Returns: string specified HTML template Arguments: - blogID: your blog's ID number - username: your blogger.com username - password: your blogger.com password - templateType: 'main' = get main page template (default) 'archiveIndex' = get archive index template - serverURL: URL of remote server (optional, defaults to constants.xmlrpcServer) """ if templateType not in TemplateType.acceptableTypes: raise ValueError, "invalid template type: %s" % templateType server = xmlrpclib.Server(serverURL or constants.xmlrpcServer, constants.transport) htmlTemplate = server.blogger.getTemplate(constants.applicationKey, str(blogID), str(username), str(password), templateType) return htmlTemplate def setTemplate(blogID, username, password, text, templateType="main", serverURL=None): """Set HTML template for your blog Returns: 1 Arguments: - blogID: your blog's ID number - username: your blogger.com username - password: your blogger.com password - text: complete HTML text of template - templateType: 'main' = set main page template (default) 'archiveIndex' = set archive index template - serverURL: URL of remote server (optional, defaults to constants.xmlrpcServer) Notes: - The given username must be marked as an administrator on the blog in order to set the template. This is the default if you created the blog, but not the default if somebody else added you to a team blog. Administrators can add other users to their blog and give them administrative access, but they need to do it through the web interface at blogger.com. """ if templateType not in TemplateType.acceptableTypes: raise ValueError, "invalid template type: %s" % templateType server = xmlrpclib.Server(serverURL or constants.xmlrpcServer, constants.transport) server.blogger.setTemplate(constants.applicationKey, str(blogID), str(username), str(password), text, templateType) if __name__ == "__main__": try: import pydoc pydoc.help("blogger") except ImportError: print __doc__ PythonCard-0.8.2/samples/radioclient/htmlpreview.py0000644000076500007650000000124310040303133022356 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.9 $" __date__ = "$Date: 2004/04/17 19:32:43 $" """ from PythonCard import model import wx class HtmlPreview(model.Background): def on_initialize(self, event): self.html = self.components.html self.html.SetRelatedFrame(self, "HTML Preview: %s") self.html.SetRelatedStatusBar(0) sizer1 = wx.BoxSizer(wx.VERTICAL) sizer1.Add(self.html, 1, wx.EXPAND) sizer1.Fit(self) sizer1.SetSizeHints(self) self.panel.SetSizer(sizer1) self.panel.SetAutoLayout(1) self.panel.Layout() def on_close(self, event): self.visible = False PythonCard-0.8.2/samples/radioclient/htmlpreview.rsrc.py0000644000076500007650000000060010047606337023345 0ustar alexalex00000000000000 { 'application':{ 'type':'Application', 'name':'HtmlPreview', 'backgrounds': [ { 'type':'Background', 'name':'bgMin', 'title':'HTML Preview', #'size':(800, 600), 'statusBar':1, 'style':['resizeable'], 'components': [ { 'type':'HtmlWindow', 'name':'html', 'size':(400, 200), 'text':'' }, ] } ] } } PythonCard-0.8.2/samples/radioclient/pycrustrc.py0000644000076500007650000000005507430306235022065 0ustar alexalex00000000000000import xmlrpclib import blogger #import SOAP PythonCard-0.8.2/samples/radioclient/radioclient.py0000644000076500007650000001776510106741241022336 0ustar alexalex00000000000000#!/usr/bin/python from PythonCard import configuration, dialog, model import xmlrpclib import blogger import os, time import wx from htmlpreview import HtmlPreview """ __version__ = "$Revision: 1.26 $" __date__ = "$Date: 2004/08/12 19:18:57 $" """ class BloggerSite: def __init__(self, blogID, username, password, serverURL=None): self.blogID = blogID self.username = username self.password = password self.serverURL = serverURL def deletePost(self, postID, publish=1): return blogger.deletePost(postID, self.username, self.password, publish, self.serverURL) def editPost(self, postID, text, publish=1): return blogger.editPost(postID, self.username, self.password, text, publish, self.serverURL) def getPost(self, postID): return blogger.getPost(postID, self.username, self.password, self.serverURL) def getRecentPosts(self, n=20): return blogger.getRecentPosts(self.blogID, self.username, self.password, n, self.serverURL) def getTemplate(self, templateType="main"): return blogger.getTemplate(self.blogID, self.username, self.password, templateType, self.serverURL) def getUsersBlogs(self): return blogger.getUsersBlogs(self.username, self.password, self.serverURL) def getUserInfo(self): return blogger.getUserInfo(self.username, self.password, self.serverURL) def newPost(self, text, publish=1): return blogger.newPost(self.blogID, self.username, self.password, text, publish, self.serverURL) def setTemplate(self, text, templateType="main"): blogger.setTemplate(self.blogID, self.username, self.password, text, templateType, self.serverURL) class RadioSite(BloggerSite): def __init__(self, blogID, username, password, serverURL): self.blogID = 'home' self.serverURL = serverURL self.username = username self.password = password class ManilaSite(BloggerSite): def __init__(self, blogID, username, password, serverURL): self.blogID = blogID self.serverURL = serverURL self.username = username self.password = password class RadioClient(model.Background): def on_initialize(self, event): # sizers are not part of PythonCard yet # so we're just doing some wxPython directly sizer1 = wx.BoxSizer(wx.VERTICAL) sizer2 = wx.BoxSizer(wx.HORIZONTAL) sizerflags = wx.RIGHT | wx.BOTTOM | wx.ALIGN_CENTER_VERTICAL sizer2.Add(self.components.btnRecentPosts, 0, sizerflags, 5) sizer2.Add(self.components.btnNewPost, 0, sizerflags, 5) sizer2.Add(self.components.btnPreviewPost, 0, sizerflags, 5) sizer2.Add(self.components.btnEditPost, 0, sizerflags, 5) sizer1.Add(sizer2) sizer1.Add(self.components.listPosts, 0, wx.EXPAND) sizer1.Add(self.components.fldContent, 1, wx.EXPAND) sizer1.Fit(self) sizer1.SetSizeHints(self) self.panel.SetSizer(sizer1) self.panel.SetAutoLayout(1) self.panel.Layout() self.previewWindow = model.childWindow(self, HtmlPreview) # override resource position self.previewWindow.SetPosition((425, -1)) self.previewWindow.visible = True self.application.shell.autoComplete = self.menuBar.getChecked('menuOptionsAutoComplete') if self.components.fldContent.canPaste(): self.components.fldContent.paste() """ Then define RadioSite, BloggerSite, ManilaSite, MovableTypeSite, and DrupalSite classes that contain all the eccentricities of each server. Then (pay attention, this is cool) you can create an instance of the correct class with a line like this: blogclass = globals()[bloggerType + "Site"] self.blog = blogclass(blogid, username, password, url) """ # blogID, username, password, server url # blogID is ignored self.blog = RadioSite('home', '', '', 'http://127.0.0.1:5335/RPC2') def on_radioGetTemplate_command(self, event): # 'main' seems like the only template that can be retrieved # are other names defined like 'home', 'day', etc.? self.components.fldContent.text = self.blog.getTemplate() def on_radioSetTemplate_command(self, event): self.blog.setTemplate(self.components.fldContent.text) def on_radioGetRecentPosts_command(self, event): # cache the most recent posts # it would probably be better to just grab each post on the fly # so this might change self.posts = self.blog.getRecentPosts() self.posts.reverse() self.components.listPosts.clear() self.components.fldContent.text = "" for p in self.posts: dateCreated = time.strftime("%c", p['dateCreated']) firstLine = p['content'].split('\n')[0] self.components.listPosts.append(p['postid'] + ' ' + dateCreated + ' ' + firstLine.rstrip()) def getContent(self, postId): content = None for p in self.posts: if postId == p['postid']: content = p['content'] break return content def on_listPosts_select(self, event): # the first item is assumed to be the topic id topic = event.target.stringSelection.split(' ', 1)[0] content = self.getContent(topic) if content is None: self.components.fldContent.text = "" else: self.components.fldContent.text = content def on_radioNewPost_command(self, event): # post fldContent as a new post postID = self.blog.newPost(self.components.fldContent.text) # go ahead and rebuild the recent posts list and then select # the new post # there are several ways we could do this, but the line below # shows an example of calling event handlers directly self.on_radioGetRecentPosts_command(None) # the list is in reverse order, so select and display the first topic self.components.listPosts.selection = 0 self.components.fldContent.text = self.getContent(postID) def on_radioEditPost_command(self, event): sel = self.components.listPosts.stringSelection if sel == "": return selLine = self.components.listPosts.selection postID = int(sel.split(' ')[0]) self.blog.editPost(postID, self.components.fldContent.text) # now get the recent posts again just to be safe self.on_radioGetRecentPosts_command(None) # restore the previous selection self.components.listPosts.selection = selLine self.components.fldContent.text = self.getContent(str(postID)) def on_radioDeletePost_command(self, event): sel = self.components.listPosts.stringSelection if sel == "": return items = sel.split(' ') postID = items[0] # the split creates an item for each double-space so the list # looks something like # ['6', '', '02/06/2002', '10:42:46', 'AM', '', 'this', 'is', 'a', 'test'] dateTime = items[2] + " at " + items[3] msg = "Are you sure want to delete post %s made on %s?" % (postID, dateTime) result = dialog.messageDialog(self, msg, 'Delete Post', wx.ICON_EXCLAMATION | wx.YES_NO | wx.NO_DEFAULT) if result.accepted: self.blog.deletePost(int(postID)) # now get the recent posts again just to be safe self.on_radioGetRecentPosts_command(None) def on_menuOptionsAutoComplete_select(self, event): self.application.shell.autoComplete = self.menuBar.getChecked('menuOptionsAutoComplete') def on_radioPreviewPost_command(self, event): self.previewWindow.visible = True txt = self.components.fldContent.text self.previewWindow.components.html.text = '' + txt + '' if __name__ == '__main__': # now force the shell to be enabled configuration.setOption('showShell', True) app = model.Application(RadioClient) app.MainLoop() PythonCard-0.8.2/samples/radioclient/radioclient.rsrc.py0000644000076500007650000000716410047606340023302 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'Minimal', 'backgrounds': [ {'type':'Background', 'name':'bgMin', 'title':'RadioClient PythonCard Application', 'size':(464, 494), 'statusBar':1, 'style':['resizeable'], 'menubar': {'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ {'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit', }, ] }, {'type':'Menu', 'name':'menuRadio', 'label':'Radio', 'items': [ {'type':'MenuItem', 'name':'menuRadioGetRecentPosts', 'label':'Get Recent Posts', 'command':'radioGetRecentPosts', }, {'type':'MenuItem', 'name':'menuRadioNewPost', 'label':'New Post', 'command':'radioNewPost', }, {'type':'MenuItem', 'name':'menuRadioEditPost', 'label':'Upload Selected Post', 'command':'radioEditPost', }, {'type':'MenuItem', 'name':'menuRadioDeletePost', 'label':'Delete Selected Post', 'command':'radioDeletePost', }, {'type':'MenuItem', 'name':'menuRadioGetTemplate', 'label':'Get Template', 'command':'radioGetTemplate', }, {'type':'MenuItem', 'name':'menuRadioSetTemplate', 'label':'Set Template', 'command':'radioSetTemplate', }, { 'type':'MenuItem', 'name':'radioSep1', 'label':'-' }, {'type':'MenuItem', 'name':'menuRadioPreviewPost', 'label':'Preview Selected Post\tCtrl+P', 'command':'radioPreviewPost', }, ] }, {'type':'Menu', 'name':'menuOptions', 'label':'Options', 'items': [ {'type':'MenuItem', 'name':'menuOptionsAutoComplete', 'label':'Shell AutoComplete\tCtrl+1', 'checkable':1, }, ] }, ] }, 'components': [ {'type':'Button', 'name':'btnRecentPosts', 'position':(4, 2), 'command':'radioGetRecentPosts', 'label':'Recent Posts', }, {'type':'Button', 'name':'btnNewPost', 'position':(92, 2), 'command':'radioNewPost', 'label':'New Post', }, {'type':'Button', 'name':'btnPreviewPost', 'position':(172, 2), 'size':(79, -1), 'command':'radioPreviewPost', 'label':'Preview Post', }, {'type':'Button', 'name':'btnEditPost', 'position':(258, 2), 'command':'radioEditPost', 'default':1, 'label':'Upload Selected Post', }, {'type':'List', 'name':'listPosts', 'position':(-2, 30), 'size':(381, 137), 'items':[], }, {'type':'TextArea', 'name':'fldContent', 'position':(-4, 186), 'size':(380, 213), 'font':{'size': 9, 'faceName': 'Courier New', 'family': 'monospace'}, }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/samples/radioclient/readme.txt0000644000076500007650000001153207600217735021462 0ustar alexalex00000000000000This app is a playground of sorts for testing XML-RPC, the Blogger API, and SOAP using a local Radio Userland 8 server. The interface is designed for easy testing and experimenting in Python, so it is not particularly user friendly. If you know the IP address, username, and password for a remote server, radioclient can also talk to that box by changing the following line in the on_openBackground method: # username, password, server url self.blog = RadioBloggerSite('', '', 'http://127.0.0.1:5335/RPC2') *** A WARNING *** This is not a commercial tool supported by Userland or connected in any way with the Radio Userland 8 product. This is a development app done by open source developers that use Radio and is part of the PythonCard samples designed to help stress and show off the PythonCard framework. Since this app is talking to a live server, you are viewing, adding, editing, and deleting real data. If you are using the default Radio settings, your changes will be upstreamed to the public Radio server as changes are made. You should keep backups of your data, templates, and generated pages. *** YOU HAVE BEEN WARNED *** WINDOWS ONLY Radio 8 is only available for Windows and the Macintosh. PythonCard, which relies on wxPython, works on Windows and Linux/GTK, but isn't available on the Mac yet, except using a Windows emulator or running wxGTK on Mac OS X. So, for the time being this sample is effectively just for Windows users that also have Radio 8. RADIO AND THE BLOGGER API Radio implements the Blogger API as defined at http://plant.blogger.com/api/index.html As of Radio 8.0.2 it doesn't implement getUserInfo getUsersBlogs returns info about the public Radio server not the local server getTemplate and setTemplate appear to only work with the 'main' template This test app will be updated as changes are made to the blogger api in Radio Over time, this app might be expanded to include additional tests against other XML-RPC, Blogger API, and SOAP web services. The tests folder contains interactive shell sessions using various web service libraries. Note that wxPython has a great multi-column list control called wxListCtrl that will eventually be supported in PythonCard. Until then, the columns are being simulated with tabs and/or spaces in a plain List. WEBLOGS PING Mark is supposed to just wrap this one-liner into blogger.py, so I'm not going to add it to my own wrapper classes unless he doesn't do that soon. http://diveintomark.org/archives/00000054.html "Actually, XML-RPC is easier in Python than almost any other language, because the XML-RPC library uses a very cool feature of Python called "dynamic binding" to create a kind of virtual proxy that lets you call remote functions with exactly the same syntax as calling local functions. import xmlrpclib remoteServer = xmlrpclib.Server("http://rpc.weblogs.com/RPC2") remoteServer.weblogUpdates.ping(SITE_NAME, SITE_URL) This short example pings weblogs.com to tell it that your weblog has changed. I use this script to connect this Greymatter weblog to the weblogs.com community (since Greymatter has no weblogs.com support built in). But the point here is the syntax of that third line: it's the same syntax as calling a local function. Once the proxy (remoteServer) is set up, the XML-RPC library makes the object act as if it has a weblogUpdates object within it and a ping method within that. It's all a lie, of course; under the covers it's constructing an XML-RPC request and sending it off, and then receiving an XML-RPC response and parsing it and returning a native Python object. But I, as a Python developer, don't have to worry about all that if I don't want to, and I don't have to learn a new syntax for calling remote functions." REFERENCES Python http://www.python.org/ win32 extensions http://starship.python.net/crew/mhammond/win32/Downloads.html wxPython http://www.wxpython.org/ windows binaries at: http://www.wxpython.org/download.php#binaries PythonCard http://pythoncard.sourceforge.net/ xmlrpclib (use 0.9.9 if you have Python 2.1.x, it is included as part of Python 2.2) http://www.pythonware.com/downloads/index.htm#xmlrpc pyblogger http://sourceforge.net/projects/pyblogger/ The Blogger API http://plant.blogger.com/api/index.html Radio Userland 8 http://radio.userland.com/ emulatingBloggerInRadio http://radio.userland.com/emulatingBloggerInRadio emulatingBloggerInManila http://scriptingnews.userland.com/backissues/2001/08/24#manilaSupportsTheBloggerApi http://frontier.userland.com/emulatingBloggerInManila http://bloggerapitest.manilasites.com/ textRouter (a manila/blogger app written in PythonCard by Simon Kittle) http://simon.kittle.info/textrouter Python.Scripting: Python, XML-RPC and SOAP http://python.scripting.com/ Python and XML: An Introduction http://www.infector.com/Paul/Python/XML_intro.html Revision: $Revision: 1.2 $ Date: $Date: 2002/12/19 01:24:45 $ PythonCard-0.8.2/samples/radioclient/tests/0000755000076500007650000000000010434046771020623 5ustar alexalex00000000000000PythonCard-0.8.2/samples/radioclient/tests/blogspot.txt0000644000076500007650000000123207430306235023207 0ustar alexalex00000000000000>>> blogs = blogger.getUsersBlogs('kealtis', 'mypassword') >>> blogs [{'blogName': 'altis blogger blog', 'blogid': '3309566', 'isAdmin': , 'url': 'http://altis.blogspot.com'}] >>> import blogger >>> username = 'kealtis' >>> password = 'mypassword') >>> blogs = blogger.getUsersBlogs(username, password) >>> myFirstBlog = blogs[0] >>> url = myFirstBlog["url"] >>> blogID = myFirstBlog["blogid"] >>> txt = 'This post was made from the shell using blogger.py' >>> postID = blogger.newPost(blogID, username, password, txt, 1) >>> print "New post is available at %s#%s" % (url, postID) New post is available at http://altis.blogspot.com#9283060 PythonCard-0.8.2/samples/radioclient/tests/manila_blogger_api.txt0000644000076500007650000000512607430306235025157 0ustar alexalex00000000000000>>> url = 'http://bloggerapitest.manilasites.com/RPC2' >>> username = 'publictestaccount@nowhere.com' >>> password = 'easy2guess' >>> appkey = '4621527933BBFAB9CBE39BAFFD41313009CBEB1E' >>> posts = blogger.listPosts(url, username, password, 3, url) >>> len(posts) 3 >>> posts [{'dateCreated': (2002, 1, 28, 12, 19, 17, 0, 0, 0), 'userid': 'publictestaccount@nowhere.com', 'postid': 'bloggerApiTestmanilasitescomManilaWebsite#583', 'content': '

An Open Question To Those In The Know....

\r\n

 

\r\n

Hmmm.  To blend and bridge the Deanland blog with this one, the documentation indicates one must put a check in the box making it a news-items-oriented blogsite.  So I did that.

\r\n

And lost all the prior content of the blog.

\r\n

Fortunately, turning the switch off and refreshing the blog brought it back to its original form.  Content returned, normalcy (or something akin to that), too.

\r\n

Comes the question: how does it work?  Surely there\'s a way to blend the Deanland blog into this one while maintaining the content and integrity of the original site.......isn\'t there?

\r\n

 

'}, {'dateCreated': (2002, 1, 28, 14, 35, 52, 0, 0, 0), 'userid': 'publictestaccount@nowhere.com', 'postid': 'bloggerApiTestmanilasitescomManilaWebsite#584', 'content': 'Sony cuts Memory Stick prices. Sony has today announced price cuts to its Memory Stick storage (this actually took place last Friday). This is the second price cut in six months. This latest reduction brings the street price of Memory Stick... [Digital Photography Review (dpreview.com)]'}, {'dateCreated': (2002, 1, 28, 14, 38, 18, 0, 0, 0), 'userid': 'publictestaccount@nowhere.com', 'postid': 'bloggerApiTestmanilasitescomManilaWebsite#585', 'content': '&lt;%lhd.utils.dprview("Sony cuts Memory Stick prices") Sony has today announced price cuts to its Memory Stick storage (this actually took place last Friday). This is the second price cut in six months. This latest reduction brings the street price of Memory Stick... [Digital Photography Review (dpreview.com)]'}] >>> for p in posts: ... bg.components.listPosts.append(p['postid']) ... PythonCard-0.8.2/samples/radioclient/tests/soap.txt0000644000076500007650000000770507435020165022333 0ustar alexalex00000000000000# http://www.onlamp.com/pub/a/python/2001/06/14/pysoap.html # http://www.soapware.org/ # need to do more client SOAP tests against various public services >>> import SOAP >>> server = SOAP.SOAPProxy("http://services.xmethods.net/soap/servlet/rpcrouter", namespace = "urn:xmethods-Temperature") >>> server.getTemp("97232") 42.0 # http://services.xmethods.net/soap/urn:xmethods-delayed-quotes.wsdl >>> server = SOAP.SOAPProxy('http://services.xmethods.net/soap', namespace='urn:xmethods-delayed-quotes') >>> server.getQuote('MSFT') 62.659999999999997 # http://www.xmethods.net/sd/2001/BabelFishService.wsdl # http://www.xmethods.net/ve2/ViewListing.po?serviceid=14 >>> server = SOAP.SOAPProxy('http://services.xmethods.net/perl/soaplite.cgi', namespace='urn:xmethodsBabelFish', soapaction='urn:xmethodsBabelFish#BabelFish') >>> server.BabelFish('en_fr', 'Quit') u'quitt\xe9 ' >>> server.BabelFish('en_es', 'Quit') 'salido ' >>> server.BabelFish('en_es', 'Hello World') 'hola mundo ' >>> server.BabelFish('en_fr', 'Hello World') 'Bonjour Monde ' >>> # http://soaptest.activestate.com/ # this service is down, so I haven't been able to get the right incantation yet >>> server = SOAP.SOAPProxy("http://soaptest.activestate.com:8080/PerlEx/soap.plex", namespace="uri:http://activestate.com/", soapaction="urn:activestate") >>> server.StockQuoteInCountry("SUNW", "United States") # http://www-106.ibm.com/developerworks/library/ws-pyth5/ >>> import SOAP >>> remote = SOAP.SOAPProxy( ... "http://www.tankebolaget.se/scripts/Haddock.exe/soap/IHaddock", ... namespace="urn:HaddockIntf-IHaddock", ... soapaction="urn:HaddockIntf-IHaddock#Curse" ... ) >>> result = remote.Curse(LangCode='us') >>> print result Iconoclast! >>> result = remote.Curse(LangCode='us') >>> print result Pyrographers! # if you want debugging on, you need to change line 210 of SOAP.py # as mentioned in the article, or just change the Config class on # the fly in the shell like so >>> SOAP.Config.debug 0 >>> SOAP.Config.debug = 1 >>> remote.Curse(LangCode='us') *** Outgoing HTTP headers ********************************************** POST /scripts/Haddock.exe/soap/IHaddock HTTP/1.0 Host: www.tankebolaget.se User-agent: SOAP.py 0.9.7 (actzero.com) Content-type: text/xml; charset="UTF-8" Content-length: 523 SOAPAction: "urn:HaddockIntf-IHaddock#Curse" ************************************************************************ *** Outgoing SOAP ****************************************************** us ************************************************************************ *** Incoming HTTP headers ********************************************** HTTP/1.? 200 OK Server: Microsoft-IIS/5.0 Date: Mon, 04 Feb 2002 21:43:10 GMT Content-Type: text/xml Content-Length: 525 Content: ************************************************************************ *** Incoming SOAP ****************************************************** Vagabonds! ************************************************************************ 'Vagabonds!' PythonCard-0.8.2/samples/radioclient/tests/soap_dotNET.txt0000644000076500007650000000202407430306235023535 0ustar alexalex00000000000000# http://sellsbrothers.com/wahooscores/wahooscores.asmx >>> import SOAP >>> server = SOAP.SOAPProxy("http://sellsbrothers.com/wahooscores/wahooscores.asmx", namespace="uri:http://sellsbrothers.com/WahooScoresService/", soapaction="http://sellsbrothers.com/WahooScoresService/GetScores") >>> scores = server.GetScores() >>> scores.WahooScore [, , , , , , , , , ] >>> for score in scores.WahooScore: ... print score.Name, score.Score ... Don't ya just love insecure webservices? 2147483647 j00 4r3 H4x0r3d 1900000000 test 444444444 A. Einstein 31415926 csells 3456000 Johnson 1239782 Jay D 999999 Jay D 999999 Hello 999999 coucou 300000 PythonCard-0.8.2/samples/radioclient/tests/xmlrpc.txt0000644000076500007650000005224707436037016022703 0ustar alexalex00000000000000# http://effbot.org/rpc/index.htm # note that ServerProxy was changed to Server prior to the final # xmlrpclib release >>> import xmlrpclib >>> server = xmlrpclib.Server("http://effbot.org/rpc/echo.cgi") >>> server.echo("testing") 'testing' >>> server.echo("testing", "testing", 1, 2.0, [3]) ['testing', 'testing', 1, 2.0, [3]] # http://www.oreillynet.com/meerkat/xml-rpc/test.php >>> import xmlrpclib >>> import blogger >>> betty = xmlrpclib.Server("http://betty.userland.com/RPC2") >>> betty.examples.getStateName(1) 'Alabama' >>> betty.examples.getStateName(0) '' >>> server = xmlrpclib.Server('http://www.oreillynet.com/meerkat/xml-rpc/server.php') >>> server.meerkat.getCategories() [{'title': 'Data', 'id': 80}, {'title': 'Data: RDF', 'id': 82}, {'title': 'Data: XML', 'id': 23}, {'title': 'Data: XML: RSS', 'id': 73}, {'title': 'E-Commerce', 'id': 37}, {'title': 'Enterprise Computing', 'id': 38}, {'title': 'General', 'id': 4}, {'title': 'Hardware', 'id': 7}, {'title': 'Industry', 'id': 79}, {'title': 'Industry: Advertising', 'id': 62}, {'title': 'Industry: Cable', 'id': 41}, {'title': 'Industry: Handhelds', 'id': 69}, {'title': 'Industry: ISP', 'id': 35}, {'title': 'Industry: Marketing', 'id': 43}, {'title': 'Industry: Open Source', 'id': 55}, {'title': 'Industry: PC', 'id': 30}, {'title': 'Industry: Publishing', 'id': 58}, {'title': 'Industry: Publishing: Electronic', 'id': 54}, {'title': 'Industry: Semiconductor', 'id': 32}, {'title': 'Industry: Telecom', 'id': 34}, {'title': 'Industry: Ubiquitous Computing', 'id': 70}, {'title': 'Industry: Wireless', 'id': 33}, {'title': 'Lang', 'id': 56}, {'title': 'Lang: C', 'id': 49}, {'title': 'Lang: C++', 'id': 50}, {'title': 'Lang: Frontier', 'id': 47}, {'title': 'Lang: Java', 'id': 19}, {'title': 'Lang: JavaScript', 'id': 48}, {'title': 'Lang: Perl', 'id': 2}, {'title': 'Lang: PHP', 'id': 17}, {'title': 'Lang: Python', 'id': 18}, {'title': 'Lang: Ruby', 'id': 81}, {'title': 'Mobile Computing', 'id': 44}, {'title': 'OS', 'id': 26}, {'title': 'OS: Be', 'id': 8}, {'title': 'OS: BSD', 'id': 65}, {'title': 'OS: BSD: FreeBSD', 'id': 11}, {'title': 'OS: BSD: NetBSD', 'id': 57}, {'title': 'OS: BSD: OpenBSD', 'id': 66}, {'title': 'OS: CE', 'id': 28}, {'title': 'OS: Linux', 'id': 10}, {'title': 'OS: Macintosh', 'id': 12}, {'title': 'OS: Palm', 'id': 27}, {'title': 'OS: Solaris', 'id': 29}, {'title': 'OS: Windows', 'id': 9}, {'title': 'OS: X Windows', 'id': 36}, {'title': 'P2P: Instant Messaging: Jabber', 'id': 84}, {'title': 'Patents', 'id': 75}, {'title': 'Peer-to-Peer', 'id': 76}, {'title': 'Privacy', 'id': 52}, {'title': 'Protocols: DNS', 'id': 61}, {'title': 'Robotics', 'id': 68}, {'title': 'Science', 'id': 40}, {'title': 'Science: Space', 'id': 39}, {'title': 'Security', 'id': 46}, {'title': 'Server', 'id': 77}, {'title': 'Server: Application', 'id': 25}, {'title': 'Server: Database', 'id': 51}, {'title': 'Server: HTTP', 'id': 3}, {'title': 'Server: HTTP: Apache', 'id': 53}, {'title': 'Software', 'id': 14}, {'title': 'Software: Agents', 'id': 71}, {'title': 'Software: Emulation', 'id': 24}, {'title': 'Software: Game', 'id': 16}, {'title': 'Software: Linux', 'id': 6}, {'title': 'Software: OpenSource', 'id': 15}, {'title': 'Software: OpenSource: Mozilla', 'id': 74}, {'title': 'Standards: RFCs', 'id': 60}, {'title': 'Toys', 'id': 59}, {'title': 'Web', 'id': 78}, {'title': 'Web Services', 'id': 83}, {'title': 'Web: Agents', 'id': 63}, {'title': 'Web: Browsers', 'id': 67}, {'title': 'Web: Design', 'id': 20}, {'title': 'Web: General', 'id': 21}, {'title': 'Web: Graphics', 'id': 22}, {'title': 'Web: Portals', 'id': 31}, {'title': 'Web: Search Engines', 'id': 72}, {'title': 'Weblogs', 'id': 64}] >>> server.meerkat.getChannels() [{'title': '<XML>fr', 'id': 2991}, {'title': '32Bits Online', 'id': 190}, {'title': '3DGamers', 'id': 4549}, {'title': '3DGamers', 'id': 5077}, {'title': '3rd Party Plugins News', 'id': 1240}, {'title': '4xt', 'id': 2559}, {'title': '802.11b News', 'id': 5536}, {'title': 'About.com Publishing', 'id': 1039}, {'title': "Absolute Gamer's Files Archive", 'id': 23}, {'title': 'Ad Resource: Internet advertising and Web site promotion resources', 'id': 1182}, {'title': 'Adrenalin Labs News', 'id': 60}, {'title': 'ALife org News', 'id': 2004}, {'title': 'All OS X', 'id': 5626}, {'title': 'allNetDevices Wireless News', 'id': 4769}, {'title': 'allNetDevices Wireless News', 'id': 4772}, {'title': 'allUSB', 'id': 517}, {'title': 'alt.os.linux', 'id': 986}, {'title': 'AmigaNation News', 'id': 439}, {'title': 'Apache Week', 'id': 924}, {'title': 'Apache Week Features', 'id': 927}, {'title': 'Apache Week Jobs', 'id': 1225}, {'title': 'AppleSurf', 'id': 223}, {'title': 'AppWatch', 'id': 1126}, {'title': 'Astrodot', 'id': 4973}, {'title': 'BBC Science and Technology', 'id': 1957}, {'title': 'BBC Science and Technology', 'id': 5609}, {'title': 'behindTheFirewall News', 'id': 811}, {'title': 'BeNews lastest headlines', 'id': 6}, {'title': 'BeOS Central', 'id': 191}, {'title': 'BetaNews.Com', 'id': 25}, {'title': 'BetaZine com', 'id': 547}, {'title': 'Beyond 2000', 'id': 2326}, {'title': 'Boing Boing', 'id': 5584}, {'title': 'Bubble Chamber', 'id': 1030}, {'title': 'CERT/CC', 'id': 1232}, {'title': 'cms News', 'id': 4620}, {'title': 'CNET News.com: Communications', 'id': 5580}, {'title': 'CNET News.com: E-Business', 'id': 5579}, {'title': 'CNET News.com: Enterprise', 'id': 5578}, {'title': 'CNET News.com: Entertainment and Media', 'id': 5581}, {'title': 'CNET News.com: Personal Technology', 'id': 5582}, {'title': 'Cold Fusion Search', 'id': 457}, {'title': 'Comp.cx', 'id': 5257}, {'title': 'comp.lang.perl.announce newsgroup', 'id': 738}, {'title': 'Consoles.Org', 'id': 4819}, {'title': 'Cosource.com', 'id': 729}, {'title': 'CPAN Uploads', 'id': 2252}, {'title': 'CScene', 'id': 761}, {'title': 'CyberAtlas: Internet statistics and market Research for Web marketers', 'id': 1184}, {'title': 'Daily Daemon News', 'id': 2284}, {'title': "Dan Gillmor's eJournal", 'id': 5382}, {'title': "Dave Beckett's RDF Resource Guide", 'id': 5146}, {'title': 'DCGuide UK Dreamcast News', 'id': 4766}, {'title': 'debianHELP', 'id': 5072}, {'title': 'developer nation', 'id': 525}, {'title': 'Developer Shed', 'id': 1127}, {'title': 'Director Online', 'id': 488}, {'title': 'DominoPower Magazine', 'id': 104}, {'title': "Dr Dobb's TechNetCast", 'id': 142}, {'title': 'Dr Feelgood Cheat Codes etc', 'id': 37}, {'title': 'Dreamweaver Depot', 'id': 843}, {'title': 'DSL news', 'id': 4815}, {'title': 'dZine', 'id': 1088}, {'title': 'e cool WinCE Info', 'id': 329}, {'title': 'E-Business*Standards*Today', 'id': 5786}, {'title': 'eBiquity ORG', 'id': 2031}, {'title': 'Eclectic', 'id': 555}, {'title': 'eCommerce links from Tsana FAT', 'id': 239}, {'title': 'Electronic Commerce Guide: Recent news', 'id': 1183}, {'title': 'Emulation Sphere', 'id': 105}, {'title': "Eric's Weblog", 'id': 656}, {'title': 'evhead', 'id': 5096}, {'title': 'exoScience Space News', 'id': 497}, {'title': 'eXploringXML', 'id': 4471}, {'title': 'eXploringXML Channel', 'id': 1105}, {'title': 'eXtreme Gaming Network News', 'id': 4798}, {'title': 'ezyme', 'id': 443}, {'title': 'finetuning com', 'id': 107}, {'title': 'finetuning.com', 'id': 4628}, {'title': 'Free XML tools', 'id': 906}, {'title': 'Freshmeat Daily News', 'id': 4}, {'title': 'FreshPorts', 'id': 2271}, {'title': 'Frontier News', 'id': 416}, {'title': 'FSF Online - Ultimate Scifi News', 'id': 5112}, {'title': 'Fusion Trio', 'id': 1931}, {'title': 'Gabber News', 'id': 5711}, {'title': 'GameDev net', 'id': 314}, {'title': 'GBDev News', 'id': 2394}, {'title': 'geeknews', 'id': 498}, {'title': 'Geeknik', 'id': 575}, {'title': 'Gelicon Articles', 'id': 942}, {'title': 'Gelicon Tutorials', 'id': 943}, {'title': 'GraFiX Shop', 'id': 111}, {'title': 'Hack the Planet', 'id': 727}, {'title': 'Hacker News Network', 'id': 331}, {'title': 'HeadLiner.net - BeOS Gaming', 'id': 1079}, {'title': 'HeadLiner.net - BeOS News', 'id': 1076}, {'title': 'HeadLiner.net - BeOS Software', 'id': 1078}, {'title': 'HeadLiner.net - Gaming News', 'id': 1071}, {'title': 'HeadLiner.net - Linux Gaming News', 'id': 1069}, {'title': 'HeadLiner.net - Linux News', 'id': 1068}, {'title': 'HeadLiner.net - Linux Software Updates', 'id': 1070}, {'title': 'HeadLiner.net - Science Headlines', 'id': 1077}, {'title': 'HeadLiner.net - Tech News', 'id': 1067}, {'title': 'Hopeless News', 'id': 4779}, {'title': 'IceWalkers', 'id': 4771}, {'title': 'Internet Advertising Report', 'id': 1181}, {'title': 'Internet Alchemy', 'id': 24}, {'title': 'internetnews.com: Top News', 'id': 1212}, {'title': 'ISP News headlines', 'id': 1195}, {'title': 'Jabber Profiles JIG', 'id': 5712}, {'title': 'JabberCentral Recent Jabber News', 'id': 4655}, {'title': 'Jabnews', 'id': 5710}, {'title': 'Java Software Com', 'id': 849}, {'title': 'Javable com', 'id': 4889}, {'title': 'Javable com English', 'id': 4890}, {'title': 'JavaBoutique Articles and Tutorials', 'id': 5347}, {'title': 'JavaScript Tip of the Day', 'id': 1222}, {'title': 'JavaScript.com/JavaScriptSource.com channel', 'id': 5627}, {'title': 'JavaScriptSource.com news', 'id': 4832}, {'title': 'JavaWorld', 'id': 850}, {'title': 'Jon Udell', 'id': 419}, {'title': 'K Desktop Environment News', 'id': 222}, {'title': 'kst com articles', 'id': 915}, {'title': 'lambda News', 'id': 4623}, {'title': 'Latest Internet E-Commerce News headlines', 'id': 1180}, {'title': 'Latest RFC:s', 'id': 1096}, {'title': 'LibreNix com Programming Linux and BSD', 'id': 2771}, {'title': 'Linsider', 'id': 2249}, {'title': 'Linux Game Tome', 'id': 11}, {'title': 'Linux Magazine', 'id': 2019}, {'title': 'Linux Net News', 'id': 1090}, {'title': 'Linux Today', 'id': 536}, {'title': 'Linux Weekly News', 'id': 567}, {'title': 'linuxapprentice.com', 'id': 4878}, {'title': 'LinuxNews com', 'id': 4469}, {'title': 'LinuxPlanet News Tutorials and more for Linux newcomers', 'id': 470}, {'title': 'LinuxSecurity com Advisories', 'id': 3166}, {'title': 'LinuxSecurity com Feature Stories', 'id': 3167}, {'title': 'LinuxSecurity com Latest News', 'id': 3165}, {'title': 'LinuxSlides.com', 'id': 2290}, {'title': 'Mac Central latest headlines', 'id': 13}, {'title': 'Mac OS Open Source Software', 'id': 5003}, {'title': 'Mac OS X Apps', 'id': 5002}, {'title': 'Mac PR', 'id': 1050}, {'title': 'MacGIMP', 'id': 5178}, {'title': 'MacNN', 'id': 5053}, {'title': 'MacRenegade', 'id': 2331}, {'title': 'MacSPY - Mac Gaming News', 'id': 1063}, {'title': 'MacSPY - Mac Headlines', 'id': 1062}, {'title': 'MacSPY - Mac Software Updates', 'id': 1064}, {'title': 'MacWEEK com', 'id': 69}, {'title': 'Manila Newbies News', 'id': 1237}, {'title': 'Manila Newbies News', 'id': 2257}, {'title': 'ManilaISP News', 'id': 972}, {'title': 'MaximumBSD', 'id': 4682}, {'title': 'Midgard news', 'id': 2260}, {'title': 'MobileStart Headlines', 'id': 428}, {'title': 'Moreover aerospace news stories', 'id': 263}, {'title': 'Moreover cable industry stories', 'id': 270}, {'title': 'Moreover communications equipment stories', 'id': 384}, {'title': 'Moreover computer games stories', 'id': 385}, {'title': 'Moreover computer security stories', 'id': 386}, {'title': 'Moreover Database industry news', 'id': 2081}, {'title': 'Moreover database industry news stories', 'id': 900}, {'title': 'Moreover developer stories', 'id': 388}, {'title': 'Moreover e commerce stories', 'id': 390}, {'title': 'Moreover enterprise computing stories', 'id': 391}, {'title': 'Moreover gaming news stories', 'id': 278}, {'title': 'Moreover Handhelds news', 'id': 2112}, {'title': 'Moreover internet europe stories', 'id': 392}, {'title': 'Moreover internet international stories', 'id': 393}, {'title': 'Moreover Microsoft news', 'id': 2149}, {'title': 'Moreover online access stories', 'id': 395}, {'title': 'Moreover Online portals news', 'id': 2170}, {'title': 'Moreover online portals stories', 'id': 400}, {'title': 'Moreover Online search engines news', 'id': 2171}, {'title': 'Moreover Open source news', 'id': 2172}, {'title': 'Moreover OS news', 'id': 2160}, {'title': 'Moreover pc industry stories', 'id': 401}, {'title': 'Moreover pc software stories', 'id': 402}, {'title': 'Moreover personal technology stories', 'id': 864}, {'title': 'Moreover Robotics news', 'id': 2190}, {'title': 'Moreover Science news', 'id': 2192}, {'title': 'Moreover semiconductor industry stories', 'id': 404}, {'title': 'Moreover Space science news', 'id': 2198}, {'title': 'Moreover tech stocks stories', 'id': 382}, {'title': 'Moreover telecom stories', 'id': 406}, {'title': 'Moreover venture capital stories', 'id': 383}, {'title': 'Moreover Vertical portals news', 'id': 2234}, {'title': 'Moreover WAP and 3G news', 'id': 2235}, {'title': 'Moreover Web developer news', 'id': 2238}, {'title': 'Moreover Windows 2000 news', 'id': 2240}, {'title': 'Moreover Wireless sector news', 'id': 2241}, {'title': 'Moreover wireless stories', 'id': 407}, {'title': 'Moreover XML and metadata news', 'id': 2243}, {'title': 'moreover... AT&T news', 'id': 1022}, {'title': 'moreover... XML and metadata news', 'id': 683}, {'title': 'Mosfet org KDE News', 'id': 4340}, {'title': 'Mozdev.org: Developer News', 'id': 5577}, {'title': 'Mozilla Internationalization', 'id': 852}, {'title': 'Mozilla org latest headlines', 'id': 18}, {'title': 'Mozilla org NewsBot', 'id': 19}, {'title': 'MozillaZine', 'id': 317}, {'title': 'MsGeek.org', 'id': 5184}, {'title': 'My Userland', 'id': 1945}, {'title': 'NASA Today', 'id': 1971}, {'title': "NASA's Earth Observatory", 'id': 4852}, {'title': 'NetBSD Code Changes', 'id': 2390}, {'title': 'NetBSD org News', 'id': 1024}, {'title': 'NetBSD Packages', 'id': 1025}, {'title': 'New Entries at Internet Product Watch', 'id': 558}, {'title': 'New Web Services from SalCentral', 'id': 5560}, {'title': 'News from ActiveState', 'id': 5008}, {'title': 'News from JavaPerformanceTuning.com', 'id': 5575}, {'title': "News Syndication from the European Space Agency's Science Directorate", 'id': 4861}, {'title': 'NewsForge', 'id': 4990}, {'title': 'NewsIsFree: user blogs', 'id': 5596}, {'title': 'NL.Linux.org', 'id': 4807}, {'title': 'Norman Walsh resources', 'id': 17}, {'title': 'NUA Internet Surveys', 'id': 206}, {'title': "O'Reilly Network", 'id': 916}, {'title': "O'Reilly Network Apache FAQs", 'id': 2344}, {'title': "O'Reilly Network Linux FAQs", 'id': 2366}, {'title': "O'Reilly Network Weblogs", 'id': 5209}, {'title': "O'Reilly Network Weblogs: Java", 'id': 5565}, {'title': "O'Reilly Network Weblogs: LAMP", 'id': 5567}, {'title': "O'Reilly Network Weblogs: Mac", 'id': 5566}, {'title': "O'Reilly Network Weblogs: P2P", 'id': 5526}, {'title': "O'Reilly Network XML FAQs", 'id': 2365}, {'title': "O'Reilly Network: .NET DevCenter", 'id': 5559}, {'title': "O'Reilly Network: .NET Weblogs", 'id': 5574}, {'title': "O'Reilly Network: Apache DevCenter", 'id': 1111}, {'title': "O'Reilly Network: BSD DevCenter", 'id': 2384}, {'title': "O'Reilly Network: Javascript and CSS DevCenter", 'id': 5564}, {'title': "O'Reilly Network: Linux DevCenter", 'id': 1112}, {'title': "O'Reilly Network: Mac DevCenter", 'id': 5119}, {'title': "O'Reilly Network: Mozilla DevCenter", 'id': 2387}, {'title': "O'Reilly Network: Patents DevCenter", 'id': 2382}, {'title': "O'Reilly Network: PHP DevCenter", 'id': 5135}, {'title': "O'Reilly Network: Python DevCenter", 'id': 2386}, {'title': "O'Reilly Network: RSS DevCenter", 'id': 2383}, {'title': "O'Reilly Network: Wireless DevCenter", 'id': 2385}, {'title': 'Onclave Weblog:', 'id': 2250}, {'title': 'ONJava.com', 'id': 5136}, {'title': 'Online Gaming News', 'id': 4946}, {'title': 'openBSD Journal', 'id': 2361}, {'title': 'openp2p.com', 'id': 4880}, {'title': 'oreilly.com', 'id': 5055}, {'title': 'osOpinion', 'id': 440}, {'title': 'PalmPower Magazine', 'id': 132}, {'title': 'PalmStation Com', 'id': 441}, {'title': 'PDA Buzz', 'id': 133}, {'title': 'PeerIntelligence', 'id': 5576}, {'title': 'Peertal the P2P News Portal', 'id': 5177}, {'title': 'Penguin Magazine', 'id': 1201}, {'title': 'Perl News', 'id': 469}, {'title': 'PHPBuilder.com', 'id': 2388}, {'title': 'phphead.com', 'id': 5236}, {'title': 'phpHeaven', 'id': 5239}, {'title': 'phpInfo net', 'id': 5066}, {'title': 'PocketMail News', 'id': 180}, {'title': 'pocketSOAP', 'id': 5080}, {'title': 'PowerBook Central', 'id': 43}, {'title': 'Privacy Digest', 'id': 704}, {'title': 'Prograweb', 'id': 4366}, {'title': 'pyrAlert', 'id': 227}, {'title': 'Python Cookbook', 'id': 5464}, {'title': 'Python org latest headlines', 'id': 30}, {'title': 'Python URL (daily updates)', 'id': 973}, {'title': 'pythonware news', 'id': 228}, {'title': 'Quack Addict Linux News', 'id': 230}, {'title': 'raelity bytes', 'id': 5784}, {'title': 'Red Herring', 'id': 484}, {'title': 'ResearchBuzz', 'id': 1023}, {'title': 'Robotics', 'id': 4553}, {'title': 'robots net', 'id': 5320}, {'title': 'RootPrompt.org -- Nothing but Unix', 'id': 1016}, {'title': 'Ruby Garden', 'id': 5605}, {'title': 'Salon.com', 'id': 733}, {'title': 'SC-JIG News', 'id': 5713}, {'title': 'scobleizer', 'id': 5313}, {'title': 'Scripting News', 'id': 584}, {'title': 'Secure computing magazine', 'id': 1924}, {'title': 'Security Focus', 'id': 690}, {'title': 'SecurityPortal com Top News', 'id': 4683}, {'title': 'Segfault org latest headlines', 'id': 16}, {'title': 'Servlets.com', 'id': 5573}, {'title': 'Shell Extension City', 'id': 920}, {'title': 'ShowMeLinux', 'id': 4670}, {'title': 'silicondragon', 'id': 451}, {'title': 'SiliconFruit: PowerPC Platform', 'id': 949}, {'title': 'SiteReview.org | Site reviews and ratings by real web surfers', 'id': 1132}, {'title': 'Slashdot Org latest news headlines', 'id': 12}, {'title': 'SlashSites', 'id': 5035}, {'title': 'SmartMac.com', 'id': 1091}, {'title': 'Snippets of Science', 'id': 770}, {'title': 'SOAP Webservices Resource Center', 'id': 2022}, {'title': 'Software Development Times', 'id': 5054}, {'title': 'Solaris Central', 'id': 1950}, {'title': 'Solaris Central', 'id': 5611}, {'title': 'Source Wars', 'id': 2264}, {'title': 'SourceForge New Releases', 'id': 4342}, {'title': 'SourceForge Project News', 'id': 3701}, {'title': 'sourceXchange RFPs', 'id': 1055}, {'title': 'SpaceViews', 'id': 320}, {'title': 'Squishdot', 'id': 813}, {'title': 'Storm Linux News', 'id': 557}, {'title': 'Streaming Media News headlines', 'id': 1198}, {'title': 'Studio B Buzz', 'id': 1031}, {'title': 'suayan.com', 'id': 712}, {'title': 'Take23', 'id': 5056}, {'title': "TangentOrg's news", 'id': 5034}, {'title': 'Technotronic', 'id': 189}, {'title': 'The Be Site', 'id': 144}, {'title': 'The Bluetooth Weblog', 'id': 5052}, {'title': 'The Climbing News Wire', 'id': 5142}, {'title': 'The CPU Scorecard', 'id': 5}, {'title': 'The Electronic Publishing Channel', 'id': 961}, {'title': 'The FreeBSD Diary', 'id': 1052}, {'title': 'The Motley Fool', 'id': 422}, {'title': 'The Ruby Cookbook', 'id': 5319}, {'title': 'The Search Engine Channel', 'id': 5087}, {'title': 'The Shmoo Group', 'id': 808}, {'title': 'The World Wide Web Consortium', 'id': 4743}, {'title': 'TheMacSite', 'id': 858}, {'title': 'TidBITS', 'id': 5585}, {'title': "Tomalak's Realm latest news", 'id': 3}, {'title': 'UMBC AgentWeb', 'id': 1015}, {'title': 'UMBC AgentWeb', 'id': 2033}, {'title': 'UnixForever - The FreeBSD Apps Site', 'id': 1104}, {'title': 'Unmaintained Free Software', 'id': 2873}, {'title': 'UpDesk net', 'id': 508}, {'title': 'URLwire - News of The Better Web Launches Since 1994', 'id': 1100}, {'title': 'Usable Web', 'id': 703}, {'title': 'use Perl;', 'id': 4467}, {'title': 'Vaults of Parnassus', 'id': 2034}, {'title': 'WabaTris', 'id': 680}, {'title': 'Web Developer News', 'id': 1199}, {'title': 'Web Graphics Collective', 'id': 44}, {'title': 'Weblog 1 0', 'id': 548}, {'title': 'Weblogger News', 'id': 5105}, {'title': 'Webmonkey', 'id': 115}, {'title': 'WebReference News', 'id': 1097}, {'title': 'webreview.com - cross-training for web teams', 'id': 688}, {'title': 'Wide Open News', 'id': 952}, {'title': 'Windows CE Power Magazine', 'id': 154}, {'title': 'Wired News', 'id': 242}, {'title': 'Wireless Developer Network News', 'id': 2569}, {'title': 'WriteTheWeb', 'id': 2392}, {'title': 'www perl com', 'id': 303}, {'title': 'www.HyperArchive.com', 'id': 597}, {'title': 'XML About com', 'id': 2435}, {'title': 'XML News from PerlXML.com', 'id': 718}, {'title': 'XML XSL Portal', 'id': 4460}, {'title': 'XML.com', 'id': 47}, {'title': 'XML.com Cover Page', 'id': 5016}, {'title': 'XML.com Resource Guide', 'id': 4637}, {'title': 'xmlhack', 'id': 724}, {'title': 'Zope Job Board', 'id': 3702}, {'title': 'Zope Newbie News', 'id': 2026}, {'title': 'Zope org', 'id': 489}] >>> server.system.listMethods() ['meerkat.getChannels', 'meerkat.getCategories', 'meerkat.getCategoriesBySubstring', 'meerkat.getChannelsByCategory', 'meerkat.getChannelsBySubstring', 'meerkat.getItems', 'system.listMethods', 'system.methodHelp', 'system.methodSignature'] >>> methods = server.system.listMethods() >>> len(methods) 9 >>> for m in methods: ... print m ... meerkat.getChannels meerkat.getCategories meerkat.getCategoriesBySubstring meerkat.getChannelsByCategory meerkat.getChannelsBySubstring meerkat.getItems system.listMethods system.methodHelp system.methodSignature >>> dog = xmlrpclib.Server('http://www.stuffeddog.com/speller/speller-rpc.cgi') >>> dog.speller.spellCheck('fast') '' >>> dog.speller.spellCheck('fost') [{'suggestions': ['cost', 'fast', 'fest', 'fist', 'Fo st', 'Fo-st', 'foist', 'font', 'foot', 'Forst', 'fort', 'fosh', 'fot', 'frost', 'fust', 'host', 'lost', 'most', 'post', 'tost'], 'location': 1, 'word': 'fost'}] >>>PythonCard-0.8.2/samples/readme.txt0000644000076500007650000000365410035337426017167 0ustar alexalex00000000000000The main purpose of the samples is to "stress" the PythonCard framework and make sure that the framework is robust and full-featured, yet still simple for the beginner to use. "We learn by doing". As users (programmers) write more samples, we are able to identify which portions of the framework are missing, too simplistic or too complex or just plain broken. The PythonCard API changes as we identify these issues and fix the framework and the samples always represent the latest version of the API. We don't have a complete API yet, that is why we refer to the code as a PythonCard prototype. The ongoing list of things that needs to be added to PythonCard is represented by the Feature Requests here: http://sourceforge.net/tracker/?atid=369015&group_id=19015&func=browse You can also view this list using the SourceForgeTracker sample. It is essential that we create lots of samples to identify framework issues in order to avoid creating a framework only suitable for simplistic "toy" programs that are only one step beyond "hello world". Equally bad would be a framework that is too general and requires the user to do a lot of work just to write a basic program; simple programs should be simple to write; That is the reason we aren't forcing a model-view-controller (MVC) paradigm on the user, MVC is not easy to grasp or use correctly. The samples also serve as a learning tool. Since there is little documentation for PythonCard right now, the best way to learn to use PythonCard is to copy and modify the samples. Note that due to the current limitations of the framework, some samples use wxPython method calls directly. The wxPython calls can usually be identified via the method name which will start with a capital letter (e.g. GetSize instead of getSize). Please help the PythonCard project, by submitting your own samples and asking questions about PythonCard on the mailing list: http://lists.sourceforge.net/lists/listinfo/pythoncard-users PythonCard-0.8.2/samples/redemo/0000755000076500007650000000000010434046771016437 5ustar alexalex00000000000000PythonCard-0.8.2/samples/redemo/readme.txt0000644000076500007650000000043407512441055020433 0ustar alexalex00000000000000redemo.py is a port of the tkinter redemo.py included with Python in the Python22\Tools\Scripts directory. No additional functionality has been added in the first pass at the port except a menubar with Help items to load useful regular expression documentation in the users browser. PythonCard-0.8.2/samples/redemo/redemo.py0000644000076500007650000001036110105470631020254 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.16 $" __date__ = "$Date: 2004/08/08 18:31:53 $" """ import wx from PythonCard import model import os, sys import re import webbrowser class ReDemo(model.Background): def on_initialize(self, event): self.compiled = None self.previousSource = self.components.fldSource.text def recompile(self): pattern = self.components.fldPattern.text text = self.components.fldSource.text flags = self.getflags() try: self.compiled = re.compile(pattern, flags) self.components.stcStatusMessage.text = '' except re.error, msg: self.compiled = None self.components.stcStatusMessage.text = "re.error: %s" % str(msg) self.components.stcStatusMessage.backgroundColor = 'red' except TypeError, msg: self.components.stcStatusMessage.text = "TypeError: %s" % str(msg) self.components.stcStatusMessage.backgroundColor = 'red' self.reevaluate() # the logic of the tkinter version # eludes me def getflags(self): flags = 0 comp = self.components if comp.chkIGNORECASE.checked: flags += re.IGNORECASE if comp.chkLOCALE.checked: flags += re.LOCALE if comp.chkMULTILINE.checked: flags += re.MULTILINE if comp.chkDOTALL.checked: flags += re.DOTALL if comp.chkVERBOSE.checked: flags += re.VERBOSE return flags def reevaluate(self): text = self.components.fldSource.text # effectively clear any existing matches self.components.fldSource.SetStyle(0, len(text), wx.TextAttr("black", "white")) if not self.compiled: return # first item in the radio is the display once button # this will check it regardless of any future language # changes made to the resource displayJustOne = self.components.radSearchString.stringSelection == \ self.components.radSearchString.items[0] last = 0 nmatches = 0 listGroups = self.components.listGroups listGroups.items = [] while last <= len(text): m = self.compiled.search(text, last) if m is None: break first, last = m.span() if last == first: last = first+1 self.components.fldSource.SetStyle(first, last, wx.TextAttr("black", "yellow")) if nmatches == 0: groups = list(m.groups()) groups.insert(0, m.group()) for i in range(len(groups)): g = "%2d: %s" % (i, `groups[i]`) listGroups.append(g) nmatches = nmatches + 1 if displayJustOne: break if nmatches == 0: self.components.stcStatusMessage.text = '(no match)' self.components.stcStatusMessage.backgroundColor = 'yellow' #print "nmatches", nmatches, "\n" def on_fldPattern_textUpdate(self, event): self.recompile() # textUpdate events occur on SetStyle # so a variable is needed to know that we are in # the midst of an update def on_fldSource_textUpdate(self, event): if self.previousSource != self.components.fldSource.text: self.previousSource = self.components.fldSource.text self.recompile() # checkboxes def on_mouseClick(self, event): self.recompile() # radiobutton def on_radSearchString_select(self, event): self.reevaluate() def on_menuHelpReModule_select(self, event): module_url = "http://docs.python.org/lib/module-re.html" if sys.platform.startswith('win'): fn = os.path.dirname(os.__file__) fn = os.path.join(fn, os.pardir, "Doc", "lib", "module-re.html") fn = os.path.normpath(fn) if os.path.isfile(fn): module_url = fn del fn webbrowser.open(module_url) def on_menuHelpReHowTo_select(self, event): webbrowser.open('http://py-howto.sourceforge.net/regex/regex.html') if __name__ == '__main__': app = model.Application(ReDemo) app.MainLoop() PythonCard-0.8.2/samples/redemo/redemo.rsrc.py0000644000076500007650000000513510047606340021232 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'Minimal', 'backgrounds': [ {'type':'Background', 'name':'bgMin', 'title':'redemo PythonCard Application', 'size':(380, 450), 'menubar': {'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ {'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit', }, ] }, {'type':'Menu', 'name':'menuHelp', 'label':'&Help', 'items': [ {'type':'MenuItem', 'name':'menuHelpReModule', 'label':'re module documentation...', }, {'type':'MenuItem', 'name':'menuHelpReHowTo', 'label':'Regular Expression HOWTO...', }, ] }, ] }, 'components': [ {'type':'StaticText', 'name':'stcStatusMessage', 'position':(5, 90), }, {'type':'StaticText', 'name':'stcPattern', 'position':(5, 0), 'text':'Enter a Perl-style regular expression:', }, {'type':'TextField', 'name':'fldPattern', 'position':(0, 19), 'size':(370, -1), }, {'type':'CheckBox', 'name':'chkIGNORECASE', 'position':(3, 45), 'label':'IGNORECASE', }, {'type':'CheckBox', 'name':'chkLOCALE', 'position':(107, 45), 'label':'LOCALE', }, {'type':'CheckBox', 'name':'chkMULTILINE', 'position':(191, 45), 'label':'MULTILINE', }, {'type':'CheckBox', 'name':'chkDOTALL', 'position':(3, 65), 'label':'DOTALL', }, {'type':'CheckBox', 'name':'chkVERBOSE', 'position':(107, 65), 'label':'VERBOSE', }, {'type':'StaticText', 'name':'stcSource', 'position':(5, 110), 'text':'Enter a string to search:', }, {'type':'RadioGroup', 'name':'radSearchString', 'position':(5, 125), 'size':(365, -1), 'items':['Highlight first match', 'Highlight all matches'], 'layout':'horizontal', 'max':1, 'stringSelection':'Highlight first match', }, {'type':'TextArea', 'name':'fldSource', 'position':(1, 168), 'size':(370, 100), }, {'type':'List', 'name':'listGroups', 'position':(1, 269), 'size':(370, 85), 'items':[], }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/samples/reversi/0000755000076500007650000000000010434046771016643 5ustar alexalex00000000000000PythonCard-0.8.2/samples/reversi/readme.txt0000644000076500007650000000011710045057653020637 0ustar alexalex00000000000000A simplistic implementation of the board game Reversi, better known as Othello.PythonCard-0.8.2/samples/reversi/reversi.py0000644000076500007650000002704510132107125020666 0ustar alexalex00000000000000#!/usr/bin/python """ Simplistic implementation of the board game reversi, better known as Othello. The algorithm for determining legal moves is not particularly efficient since no attempt is made to cache legal moves. """ """ __version__ = "$Revision: 1.4 $" __date__ = "$Date: 2004/10/10 01:20:21 $" """ from PythonCard import dialog, model from random import randint import time import wx EMPTY = None BLACK = True WHITE = False BOARDWIDTH = BOARDHEIGHT = 8 DIRECTIONS = ((-1, -1), (0, -1), (1, -1), (-1, 0), (1, 0), (-1, 1), (0, 1), (1, 1)) BOARDCOLOR = 'dark green' CELLWIDTH = CELLHEIGHT = 37 class GameBoard: def __init__(self): self.initializeBoard() def initializeBoard(self): self.board = {} # the board references are column, row # to simplify x, y translation for column in range(BOARDWIDTH): for row in range(BOARDHEIGHT): self.board[(column, row)] = EMPTY self.board[(3, 3)] = WHITE self.board[(4, 4)] = WHITE self.board[(3, 4)] = BLACK self.board[(4, 3)] = BLACK # black always goes first self.nextMove = BLACK self.buildLegalMoves(self.nextMove) self.gameOver = False def opponentColor(self, color): if color == BLACK: return WHITE else: return BLACK def legalMove(self, column, row, color): """returns the number of pieces flipped if the move is legal otherwise it returns 0""" totalFlipped = 0 if self.board[(column, row)] == EMPTY: opponent = self.opponentColor(color) # to be a legal move # the position must be empty # the position must be adjacent to an opponent # color piece # searching in the direction of the opposing # color piece there must be a position matching # the starting position color # the edges of the board don't count board = self.board for dx, dy in DIRECTIONS: flipped = 0 x = column + dx y = row + dy if board.get((x, y), EMPTY) == opponent: # now check to see if we run into our # own color so we have something to flip # if we run into an empty space or off the board # then it isn't a legal move while board.get((x, y), EMPTY) == opponent: x += dx y += dy flipped += 1 if board.get((x, y), EMPTY) == color: totalFlipped += flipped return totalFlipped def buildLegalMoves(self, color): """build a dictionary of legal moves with the (column, row) as the key and the number of pieces flipped as the value""" self.legalMoves = {} for column, row in self.board.keys(): flipped = self.legalMove(column, row, color) if flipped: self.legalMoves[(column, row)] = flipped def legalMovesAvailable(self, color): self.buildLegalMoves(color) # look at all empty positions on the board to determine # whether any legal moves exist if self.legalMoves == {}: return False else: return True def makeMove(self, column, row, color): self.board[(column, row)] = color # now flip all the pieces opponent = self.opponentColor(color) # to be a legal move # the position must be empty # the position must be adjacent to an opponent # color piece # searching in the direction of the opposing # color piece there must be a position matching # the starting position color # the edges of the board don't count board = self.board for dx, dy in DIRECTIONS: x = column + dx y = row + dy if board.get((x, y), EMPTY) == opponent: flip = [] # now check to see if we run into our # own color so we have something to flip # if we run into an empty space or off the board # then it isn't a legal move while board.get((x, y), EMPTY) == opponent: # add pieces to flip flip.append((x, y)) x += dx y += dy if board.get((x, y), EMPTY) == color: for position in flip: board[position] = color break # change who has the next move # if there are no legal moves left for the opponent # then we check whether there are any legal moves # left for the current player # if neither has a legal move then the game is over if self.legalMovesAvailable(opponent): self.nextMove = opponent elif self.legalMovesAvailable(color): self.nextMove = color else: self.gameOver = True # computer is currently stupid and just # randomly picks from the available legal moves # if you lose then you're Mr. Gumby # what it should do instead is be able to use # various strategies such as flip the most pieces # favor certain positions like the edges but avoid the # the spots next to the corners (weighted positions) # okay, I added the flip the most pieces strategy # but it is still pretty dumb def doRandomComputerMove(self, color): legalMoves = self.legalMoves.keys() column, row = legalMoves[randint(0, len(legalMoves) - 1)] self.makeMove(column, row, color) def doFlipMostPiecesComputerMove(self, color): flipped = 0 for position in self.legalMoves.keys(): #print " ", position, self.legalMoves[position] if self.legalMoves[position] > flipped: best = position flipped = self.legalMoves[best] #print "picked:", best, self.legalMoves[best], "\n" self.makeMove(best[0], best[1], color) def getScore(self): """return a tuple containing the number of empty, black, and white squares""" score = {BLACK:0, WHITE:0, EMPTY:0} for value in self.board.values(): score[value] += 1 return score class Reversi(model.Background): def on_initialize(self, event): self.boardModel = GameBoard() self.components.bufOff.size = (BOARDWIDTH * CELLWIDTH + 1, BOARDHEIGHT * CELLHEIGHT + 1) self.singleItemExpandingSizerLayout() self.drawBoard() self.updateStatus() self.player = BLACK self.computer = WHITE self.lastHover = None if self.computer == BLACK: self.boardModel.doComputerMove(BLACK) def computerMove(self): if self.menuBar.getChecked('menuStrategyFlipMostPieces'): self.boardModel.doFlipMostPiecesComputerMove(self.computer) else: self.boardModel.doRandomComputerMove(self.computer) # sleep for a second to make it appear # the computer thought long and hard on her choice :) time.sleep(1) self.drawBoard() self.updateStatus() def newGame(self): self.boardModel.initializeBoard() self.drawBoard() self.updateStatus() if self.computer == BLACK: self.computerMove() def drawCell(self, x, y, state): view = self.components.bufOff if state in [BLACK, WHITE]: if state == BLACK: color = 'black' else: color = 'white' view.fillColor = color center = (x * CELLWIDTH + CELLWIDTH / 2 + 1, y * CELLHEIGHT + CELLHEIGHT / 2 + 1) view.drawCircle(center, round((CELLWIDTH / 2.0) - 3)) else: view.fillColor = BOARDCOLOR view.foregroundColor = BOARDCOLOR view.drawRectangle((x * CELLWIDTH + 1, y * CELLHEIGHT + 1), (CELLWIDTH - 2, CELLHEIGHT - 2)) view.foregroundColor = 'black' def drawBoard(self): view = self.components.bufOff view.autoRefresh = False view.backgroundColor = BOARDCOLOR view.clear() # draw the right and bottom edge borders view.drawLine((0, BOARDHEIGHT * CELLHEIGHT), (BOARDWIDTH * CELLWIDTH, BOARDHEIGHT * CELLHEIGHT)) view.drawLine((BOARDWIDTH * CELLWIDTH, 0), (BOARDWIDTH * CELLWIDTH, BOARDHEIGHT * CELLHEIGHT)) for x in range(BOARDWIDTH): view.drawLine((x * CELLWIDTH, 0), (x * CELLWIDTH, BOARDHEIGHT * CELLHEIGHT)) for y in range(BOARDHEIGHT): view.drawLine((0, y * CELLHEIGHT), (BOARDWIDTH * CELLWIDTH, y * CELLHEIGHT)) state = self.boardModel.board[(x, y)] self.drawCell(x, y, state) view.autoRefresh = True view.refresh() if wx.Platform == '__WXMAC__': # Mac won't update screen even after a Blit # until the event handler ends, so we have to force an update view.redraw() def updateStatus(self): if self.boardModel.gameOver: score = self.boardModel.getScore() playerScore = score[self.player] computerScore = score[self.computer] scoreString = "Black: %d White: %d" % (score[BLACK], score[WHITE]) if playerScore > computerScore: message = "Player won!" elif playerScore < computerScore: message = "Computer won!" else: message = "Tie Game" status = message + " - " + scoreString else: if self.boardModel.nextMove == BLACK: status = "Black's move" else: status = "White's move" self.statusBar.text = status def on_bufOff_mouseMove(self, event): x, y = event.position x = x / CELLWIDTH y = y / CELLHEIGHT #if self.boardModel.legalMove(x, y, self.boardModel.nextMove): if (x, y) != self.lastHover: # erase lastHover if needed if self.lastHover and self.boardModel.board[self.lastHover] is None: self.drawCell(self.lastHover[0], self.lastHover[1], EMPTY) # if the move is legal, show it if self.boardModel.legalMoves.get((x, y), None): self.drawCell(x, y, self.player) # don't track positions outside the valid range if (x >= 0 and x < BOARDWIDTH) and (y >= 0 and y < BOARDHEIGHT): self.lastHover = (x, y) def on_bufOff_mouseUp(self, event): x, y = event.position # this is a simplistic translation # when users click on the lines # separating cells they may get a cell # they didn't expect x = x / CELLWIDTH y = y / CELLHEIGHT if self.boardModel.legalMove(x, y, self.boardModel.nextMove): self.boardModel.makeMove(x, y, self.boardModel.nextMove) self.drawBoard() self.updateStatus() if not self.boardModel.gameOver: if self.boardModel.nextMove == self.computer: self.computerMove() event.skip() def on_menuFileNewGame_select(self, event): self.newGame() if __name__ == '__main__': app = model.Application(Reversi) app.MainLoop() PythonCard-0.8.2/samples/reversi/reversi.rsrc.py0000644000076500007650000000267310047606341021647 0ustar alexalex00000000000000 { 'application':{ 'type':'Application', 'name':'Reversi', 'backgrounds': [ { 'type':'Background', 'name':'bgReversi', 'title':'Reversi Game', 'size':( 350, 350 ), 'statusBar':True, 'menubar': { 'type':'MenuBar', 'menus': [ { 'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ { 'type':'MenuItem', 'name':'menuFileNewGame', 'label':'&New Game\tCtrl+N' }, { 'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit' } ] }, { 'type':'Menu', 'name':'mnuStrategy', 'label':'&Strategy', 'items': [ { 'type':'MenuItem', 'name':'menuStrategyFlipMostPieces', 'label':'Flip Most Pieces', 'checkable':1, 'checked':1 }, { 'type':'MenuItem', 'name':'menuStrategyRandom', 'label':'Random', 'checkable':1, 'checked':0}, ] } ] }, 'components': [ { 'type':'BitmapCanvas', 'name':'bufOff', 'position':(0, 30), 'size':(300, 300), 'backgroundColor':'green', }, ] } ] } } PythonCard-0.8.2/samples/rpn/0000755000076500007650000000000010434046771015763 5ustar alexalex00000000000000PythonCard-0.8.2/samples/rpn/readme.txt0000644000076500007650000000037507600747776020004 0ustar alexalex00000000000000About RPN Last updated: 2002-12-20 RPN is a Python application written with the PythonCard framework. It is a first attempt to write a complete application using PythonCard, so it may not work (don't use it for your taxes). Contributed by Randy Lea. PythonCard-0.8.2/samples/rpn/RPN.about.txt0000644000076500007650000000035107600747776020311 0ustar alexalex00000000000000About RPN Last updated: 2002-12-20 RPN is a Python application written with the PythonCard framework. It is a first attempt to write a complete application using PythonCard, so it may not work (don't use it for your taxes). PythonCard-0.8.2/samples/rpn/RPN.help.txt0000644000076500007650000000145307600747776020133 0ustar alexalex00000000000000RPN Calc Help Last updated: 2002-12-20 RPN Calc is a bit of a clone of the HP11 RPN calculator, with only a few functions implemented. The calculator is stack based, as follows: X (Top), Y, Z, T (Bottom) There are 10 memory registers: R0 - R9 Keys: +,-,/,X - operates on X and Y, result placed in X Enter - Pushes the contents of the display onto the top of stack BS (Backspace) - deletes the last number entered 1/X - returns the inverse of X x<>y - swaps the X and Y values ROT - Rotates the stack, X to T, Y to X, Z to Y, and T to Z RCL - returns the contents of the memory register pointed at by the value of the X register (must be an integer) STO - the value in the Y register is stored in the memory register pointed at by the X register PythonCard-0.8.2/samples/rpn/rpn.py0000644000076500007650000002432110347526324017136 0ustar alexalex00000000000000#!/usr/bin/python # RPN.py - an HP11 calulator clone (sorta) # TO DO # make sure stack has at least 4 values after every operation """ __version__ = "$Revision: 1.10 $" __date__ = "$Date: 2005/12/13 11:13:24 $" """ from PythonCard import dialog, model class STACK: ''' Manages the stack (X,Y,Z, and T registers) and the 10 memory registers (0-9) ''' def __init__(self): ''' Initialize stack and registers ''' # init stack T, Z, Y, X , top of stack is at the right side self._emptyStack = [0.0, 0.0, 0.0, 0.0] self._stackData = self._emptyStack # new_data_flag is set when the first new character is entered for a value self.clr_flag() # create a list for all 10 Storage Registers, initialize to 0 self._mem = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] def display(self): ''' display stack and memory data ''' print "\nStack: ", self._stackData print "Mem: ", self._mem, "\n" def stackSize(self): ''' make sure stack has at least 4 elements ''' while len(self._stackData) < 5: self.display() self._stackData.insert(0,0.0) # Stack functions def rotate(self): ''' rotate top 4 elements of stack ''' self.stackSize() # remove top 4 elements, then add back to stack in reverse order self._X = self._stackData.pop() self._Y = self._stackData.pop() self._Z = self._stackData.pop() self._T = self._stackData.pop() self._stackData.append(self._X) self._stackData.append(self._T) self._stackData.append(self._Z) self._stackData.append(self._Y) def push(self, value): ''' add value to top of stack ''' self._stackData.append(float(value)) def pop(self): ''' remove and return top of stack - X ''' self.stackSize() return self._stackData.pop() def readX(self): ''' return the top of stack, X, no change to stack ''' return self._stackData[-1:][0] def swap(self): ''' swap X and Y ''' self.stackSize() self._X = self._stackData.pop() self._Y = self._stackData.pop() self._stackData.append(self._X) self._stackData.append(self._Y) def add(self): ''' X = X + Y ''' self.stackSize() self._stackData.append(self._stackData.pop() + self._stackData.pop()) def subtract(self): ''' X = Y - X ''' self.stackSize() self._stackData.append( - (self._stackData.pop()) + self._stackData.pop()) def multiply(self): ''' X = X * Y ''' self.stackSize() self._stackData.append(self._stackData.pop() * self._stackData.pop()) def divide(self): ''' X = Y / X ''' self.stackSize() self._X = self._stackData.pop() self._Y = self._stackData.pop() if self._X != 0.0: self._X = self._Y / self._X else: self._X = None self._stackData.append(self._X) # memory operations def SetReg(self, reg, value): ''' write value into memory register reg''' if (reg == int(reg) and (reg >= 0) and (reg <=9)): self._mem[int(reg)] = value else: print "Error - invalid register" def GetReg(self, reg): ''' read memory register reg ''' if (reg == int(reg) and (reg >= 0) and (reg <=9)): return self._mem[int(reg)] else: print "Error - invalid register" return None # These functions operate on the new_data_flag # Ehe flag is set when new data is entered into the # text entry box, before the 'Enter' key is pressed def set_flag(self): self.new_data_flag = 1 def clr_flag(self): self.new_data_flag = 0 def get_flag(self): return self.new_data_flag class RPN(model.Background): ''' RPN Calculator ''' def on_initialize(self, event): # can't use a variable named self.stack # because that would conflict with self.stack defined in the Background class self._stack = STACK() # menu functions def on_menuHelpAbout_select(self, event): try: self.readme = open('RPN.about.txt').read() except IOError: self.readme = 'RPN.about.txt not found' dlg = dialog.ScrolledMessageDialog(self, self.readme, 'About RPN Calc ...') def on_menuHelpContents_select(self, event): try: self.readme = open('RPN.help.txt').read() except IOError: self.readme = 'RPN.help.txt not found' dlg = dialog.ScrolledMessageDialog(self, self.readme, 'RPN Calc Help ...') # operation buttons def on_EnterBtn_mouseClick(self, event): try: self._stack.push(self.components.result.text) # update display to float self.components.result.text = str(self._stack.readX()) except ValueError: print "ERROR - invalid number" self.components.result.text = "ERROR" self._stack.clr_flag() self._stack.display() def on_InvertBtn_mouseClick(self, event): self.storeX() # don't divide by zero if self._stack.readX != 0: self._stack.push( 1 / self._stack.pop() ) else: self.stack.pop() self._stack.push(None) self.components.result.text = str(self._stack.readX()) self._stack.display() def on_ROTBtn_mouseClick(self, event): self.storeX() self._stack.rotate() # put X back into the result box self.components.result.text = str(self._stack.readX()) self._stack.display() def on_SwapBtn_mouseClick(self, event): self.storeX() self._stack.swap() # put X back into the result box self.components.result.text = str(self._stack.readX()) self._stack.display() def on_BackBtn_mouseClick(self, event): if self._stack.get_flag() == 1: # remove the last entry and stuff back into result self.components.result.text = self.components.result.text[:-1] # self.components.result.text = str(self._stack.X) def on_PlusBtn_mouseClick(self, event): self.storeX() self._stack.add() # put X back into the result box self.components.result.text = str(self._stack.readX()) self._stack.display() def on_MinusBtn_mouseClick(self, event): self.storeX() self._stack.subtract() # put X back into the result box self.components.result.text = str(self._stack.readX()) self._stack.display() def on_MultiplyBtn_mouseClick(self, event): self.storeX() self._stack.multiply() # put X back into the result box self.components.result.text = str(self._stack.readX()) self._stack.display() def on_DivideBtn_mouseClick(self, event): self.storeX() self._stack.divide() # read the X register to see if operation OK self._result = self._stack.readX() if self._result is not None: self.components.result.text = str(self._result) else: self.components.result.text = "Divide by Zero Error" self._stack.display() def on_CHSBtn_mouseClick(self, event): # make sure that X has most recent data if self._stack.get_flag() == 1: self._stack.push (float( self.components.result.text )) self._stack.push( -1.0 * self._stack.pop() ) self.components.result.text = str(self._stack.readX()) self._stack.display() # storage register operations def on_STOBtn_mouseClick(self, event): self.storeX() # pop the X and Y values for the register and the value to write self._mem = self._stack.pop() self._value = self._stack.pop() # is the register a valid integer value? if (self._mem == int(self._mem) and (self._mem >= 0) and (self._mem <=9 )): # write value to register self._stack.SetReg(self._mem, self._value) else: # register is a non-integer print "ERROR - Non-integer value given for register" self._stack.display() def on_RCLBtn_mouseClick(self, event): self.storeX() self._stack.clr_flag() self._mem = self._stack.pop() if(self._mem == int(self._mem) and (self._mem >= 0) and (self._mem <=9 )): self._stack.push(self._stack.GetReg(self._mem)) self.components.result.text = str(self._stack.readX()) else: print "ERROR - Non-integer value given for register" return self._stack.display() # misc def add_digit(self, new_value): ''' add a new digit to the result window ''' # start at 0 after an operation (+-*/ or Enter) if self._stack.get_flag() == 1: self.components.result.text = self.components.result.text + new_value elif self._stack.get_flag() == 0: self.components.result.text = new_value self._stack.set_flag() def storeX(self): ''' If new number has been entered, push it onto the stack ''' # if necessary, push data onto stack if self._stack.get_flag() == 1: self._stack.push(self.components.result.text) self._stack.clr_flag() # calculator digit buttons (and the decimal '.') def on_0Btn_mouseClick(self, event): self.add_digit('0') def on_1Btn_mouseClick(self, event): self.add_digit('1') def on_2Btn_mouseClick(self, event): self.add_digit('2') def on_3Btn_mouseClick(self, event): self.add_digit('3') def on_4Btn_mouseClick(self, event): self.add_digit('4') def on_5Btn_mouseClick(self, event): self.add_digit('5') def on_6Btn_mouseClick(self, event): self.add_digit('6') def on_7Btn_mouseClick(self, event): self.add_digit('7') def on_8Btn_mouseClick(self, event): self.add_digit('8') def on_9Btn_mouseClick(self, event): self.add_digit('9') def on_DecimalBtn_mouseClick(self, event): self.add_digit('.') if __name__ == '__main__': app = model.Application(RPN) app.MainLoop() PythonCard-0.8.2/samples/rpn/rpn.rsrc.py0000644000076500007650000001074610047606355020114 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'RPN', 'backgrounds': [ {'type':'Background', 'name':'bgMin', 'title':'RPN Calc', 'size':(325, 287), 'menubar': {'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ {'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit', }, ] }, {'type':'Menu', 'name':'menuHelp', 'label':'&Help', 'items': [ {'type':'MenuItem', 'name':'menuHelpAbout', 'label':'&About\tAlt+A', }, {'type':'MenuItem', 'name':'menuHelpContents', 'label':'C&ontents\tAlt+O', }, ] }, ] }, 'components': [ {'type':'Button', 'name':'RCLBtn', 'position':(265, 50), 'size':(38, 34), 'label':'RCL', 'toolTip':'Recall from Register', }, {'type':'Button', 'name':'STOBtn', 'position':(265, 95), 'size':(38, 34), 'label':'STO', 'toolTip':'Store to Register', }, {'type':'Button', 'name':'SwapBtn', 'position':(265, 140), 'size':(38, 34), 'label':'SWP', 'toolTip':'Swap X and Y', }, {'type':'Button', 'name':'ROTBtn', 'position':(215, 50), 'size':(38, 34), 'label':'ROT', 'toolTip':'Rotate Stack', }, {'type':'Button', 'name':'BackBtn', 'position':(215, 95), 'size':(38, 34), 'label':'BS', 'toolTip':'Delete last Character', }, {'type':'Button', 'name':'InvertBtn', 'position':(215, 140), 'size':(38, 34), 'label':'1/x', 'toolTip':'Invert X', }, {'type':'Button', 'name':'EnterBtn', 'position':(215, 185), 'size':(88, 34), 'label':'Enter', 'toolTip':'Enter Data to X Register', }, {'type':'TextField', 'name':'result', 'position':(15, 5), 'size':(290, 30), 'alignment':'right', 'text':'0', 'toolTip':'Result ', }, {'type':'Button', 'name':'9Btn', 'position':(115, 50), 'size':(38, 34), 'label':'9', 'toolTip':'9', }, {'type':'Button', 'name':'8Btn', 'position':(65, 50), 'size':(38, 34), 'label':'8', 'toolTip':'8', }, {'type':'Button', 'name':'7Btn', 'position':(15, 50), 'size':(38, 34), 'label':'7', 'toolTip':'7', }, {'type':'Button', 'name':'6Btn', 'position':(115, 95), 'size':(38, 34), 'label':'6', 'toolTip':'6', }, {'type':'Button', 'name':'5Btn', 'position':(65, 95), 'size':(38, 34), 'label':'5', 'toolTip':'5', }, {'type':'Button', 'name':'4Btn', 'position':(15, 95), 'size':(38, 34), 'label':'4', 'toolTip':'4', }, {'type':'Button', 'name':'3Btn', 'position':(115, 140), 'size':(38, 34), 'label':'3', 'toolTip':'3', }, {'type':'Button', 'name':'2Btn', 'position':(65, 140), 'size':(38, 34), 'label':'2', 'toolTip':'2', }, {'type':'Button', 'name':'1Btn', 'position':(15, 140), 'size':(38, 34), 'label':'1', 'toolTip':'1', }, {'type':'Button', 'name':'0Btn', 'position':(15, 185), 'size':(38, 34), 'label':'0', 'toolTip':'0', }, {'type':'Button', 'name':'DecimalBtn', 'position':(65, 185), 'size':(38, 34), 'label':'.', 'toolTip':'Decimal', }, {'type':'Button', 'name':'CHSBtn', 'position':(115, 185), 'size':(38, 34), 'label':'+/-', 'toolTip':'Change Sign', }, {'type':'Button', 'name':'DivideBtn', 'position':(165, 50), 'size':(38, 34), 'label':'/', 'toolTip':'Divide', }, {'type':'Button', 'name':'MultiplyBtn', 'position':(165, 95), 'size':(38, 34), 'label':'X', 'toolTip':'Multiply', }, {'type':'Button', 'name':'MinusBtn', 'position':(165, 140), 'size':(38, 34), 'label':'-', 'toolTip':'Subtract', }, {'type':'Button', 'name':'PlusBtn', 'position':(165, 185), 'size':(38, 34), 'label':'+', 'toolTip':'Add', }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/samples/samples.pyw0000644000076500007650000001561710221714033017366 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.1 $" __date__ = "$Date: 2005/03/28 05:37:31 $" """ from PythonCard import about, dialog, model import os, sys import webbrowser import wx class Launcher(model.Background): def setupSizers(self): sizer1 = wx.BoxSizer(wx.VERTICAL) sizer2 = wx.BoxSizer(wx.HORIZONTAL) sizer3 = wx.BoxSizer(wx.VERTICAL) sizer4 = wx.BoxSizer(wx.HORIZONTAL) comp = self.components btnFlags = wx.LEFT | wx.ALIGN_BOTTOM vertFlags = wx.LEFT | wx.TOP | wx.ALIGN_LEFT sizer4.Add(comp.btnLaunch, 1, btnFlags, 5) sizer4.Add(comp.btnDescription, 1, btnFlags, 5) sizer4.Add(comp.btnSource, 1, btnFlags, 5) sizer4.Add(comp.btnResource, 1, btnFlags, 5) sizer3.Add(comp.stcCmdLineArgs, 0, wx.LEFT | wx.BOTTOM | wx.ALIGN_TOP, 5) sizer3.Add(comp.chkDebugMenu, 0, vertFlags, 5) sizer3.Add(comp.chkLogging, 0, vertFlags, 5) sizer3.Add(comp.chkMessageWatcher, 0, vertFlags, 5) sizer3.Add(comp.chkNamespaceViewer, 0, vertFlags, 5) sizer3.Add(comp.chkPropertyEditor, 0, vertFlags, 5) sizer3.Add(comp.chkShell, 0, vertFlags, 5) sizer3.Add((5, 5), 1) # spacer sizer3.Add(sizer4, 1, wx.ALIGN_BOTTOM | wx.EXPAND) sizer2.Add(comp.listSamples, 0, wx.RIGHT | wx.ALIGN_TOP, 5) sizer2.Add(sizer3, 1, wx.EXPAND) sizer1.Add(sizer2, 0, vertFlags) sizer1.Add((5, 5), 0) # spacer sizer1.Add(comp.stcDescription, 0, wx.LEFT | wx.TOP | wx.BOTTOM | wx.ALIGN_LEFT | wx.EXPAND, 5) sizer1.Add(comp.fldDescription, 1, wx.EXPAND) self.sizer1 = sizer1 sizer1.Fit(self) sizer1.SetSizeHints(self) self.panel.SetSizer(sizer1) self.panel.SetAutoLayout(1) self.panel.Layout() self.visible = True def on_initialize(self, event): self.setupSizers() self.showDescription() try: self.readme = open('readme.txt').read() except: self.readme = '' def getCommandLineArgs(self): args = [] if self.components.chkDebugMenu.checked: args.append('-d') if self.components.chkLogging.checked: args.append('-l') if self.components.chkMessageWatcher.checked: args.append('-m') if self.components.chkNamespaceViewer.checked: args.append('-n') if self.components.chkPropertyEditor.checked: args.append('-p') if self.components.chkShell.checked: args.append('-s') return args def on_launch_command(self, event): name = self.components.listSamples.stringSelection if name == "samples": path = self.application.applicationDirectory else: path = os.path.join(self.application.applicationDirectory, name) if os.path.exists(os.path.join(path, name + ".pyw")): filename = os.path.join(path, name + ".pyw") else: filename = os.path.join(path, name + ".py") args = self.getCommandLineArgs() # KEA 2002-04-28 # os.spawnv probably works on all platforms # and regardless of the quoting needs for paths with # and without spaces, but each platform is separate # below until that is confirmed if ' ' in filename: filename = '"' + filename + '"' python = sys.executable if ' ' in python: pythonQuoted = '"' + python + '"' else: pythonQuoted = python os.spawnv(os.P_NOWAIT, python, [pythonQuoted, filename] + args) def showDescription(self): path = self.components.listSamples.stringSelection if path == "samples": path = "" name = 'readme.txt' try: path = os.path.join(path, name) desc = open(path).read() self.components.fldDescription.text = desc self.components.stcDescription.text = 'Description: ' + path except: pass if self.components.fldSource.visible: self.components.fldSource.visible = 0 self.sizer1.Remove(self.components.fldSource) self.sizer1.Add(self.components.fldDescription, 1, wx.EXPAND) self.components.fldDescription.visible = 1 self.sizer1.Layout() def on_showDescription_command(self, event): self.showDescription() def showSource(self, source): name = self.components.listSamples.stringSelection if name == "samples": path = "" else: path = name try: if source == 'source': p = os.path.join(path, name + '.py') if os.path.exists(p): path = p else: path = os.path.join(path, name + '.pyw') self.components.stcDescription.text = 'Source code: ' + path else: path = os.path.join(path, name + '.rsrc.py') self.components.stcDescription.text = 'Resource: ' + path src = open(path).read() # KEA 2002-06-21 # you can't change the text of a CodeEditor # component if it isn't editable # should we change that? self.components.fldSource.editable = 1 self.components.fldSource.text = src self.components.fldSource.editable = 0 except: pass if self.components.fldDescription.visible: self.components.fldDescription.visible = 0 self.sizer1.Remove(self.components.fldDescription) self.sizer1.Add(self.components.fldSource, 1, wx.EXPAND) self.components.fldSource.visible = 1 self.sizer1.Layout() def on_showSource_command(self, event): self.showSource('source') def on_showResource_command(self, event): self.showSource('resource') def on_listSamples_select(self, event): if self.components.stcDescription.text.startswith('Description'): self.showDescription() elif self.components.stcDescription.text.startswith('Source code'): self.showSource('source') else: self.showSource('resource') def on_listSamples_mouseDoubleClick(self, event): self.on_launch_command(None) def on_menuHelpPythonCardHomePage_select(self, event): webbrowser.open('http://pythoncard.sourceforge.net/', 1, 1) def on_menuHelpOnlineDocumentation_select(self, event): webbrowser.open('http://pythoncard.sourceforge.net/documentation.html', 1, 1) def on_menuHelpAbout_select(self, event): dialog.scrolledMessageDialog(self, self.readme, 'About samples...') def on_doHelpAboutPythonCard_command(self, event): about.aboutPythonCardDialog(self) if __name__ == '__main__': app = model.Application(Launcher) app.MainLoop() PythonCard-0.8.2/samples/samples.rsrc.py0000644000076500007650000001066710317062746020164 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'Samples', 'backgrounds': [ {'type':'Background', 'name':'bgMin', 'title':'PythonCard Samples Launcher', 'size':(600, 502), 'style':['resizeable'], 'visible':0, 'menubar': {'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ {'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt-X', 'command':'exit', }, ] }, {'type':'Menu', 'name':'menuHelp', 'label':'&Help', 'items': [ {'type':'MenuItem', 'name':'menuHelpPythonCardHomePage', 'label':'PythonCard &Home Page', }, {'type':'MenuItem', 'name':'menuHelpOnlineDocumentation', 'label':'Online &Documentation', }, {'type':'MenuItem', 'name':'menuHelpSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuHelpAbout', 'label':'&About samples...', }, {'type':'MenuItem', 'name':'menuHelpAboutPythonCard', 'label':'About PythonCard...', 'command':'doHelpAboutPythonCard', }, ] }, ] }, 'components': [ {'type':'List', 'name':'listSamples', 'position':(0, 0), 'size':(150, 218), 'items':['addresses', 'ataxx', 'chat', 'companies', 'conversions', 'custdb', 'dbBrowser', \ 'dialogs', 'doodle', 'flatfileDatabase', 'flock', 'gadflyDatabase', 'gravity', \ 'hopalong', 'jabberChat', 'life', 'lsystem', 'minimal', 'minimalList', 'minimalTree', \ 'moderator', 'montyhall', 'mp3player', 'multicolumnexample', 'noresource', \ 'pictureViewer', 'proof', 'pysshed', 'radioclient', 'redemo', 'reversi', 'rpn', \ 'samples', 'saveClipboardBitmap', 'searchexplorer', \ 'simpleBrowser', 'simpleIEBrowser', 'slideshow', 'sounds', 'SourceForgeTracker', \ 'spirograph', 'spirographInteractive', 'stockprice', 'sudoku', 'textIndexer', 'textRouter', \ 'tictactoe', 'turtle', 'twistedEchoClient', \ 'webgrabber', 'webserver', 'widgets', 'worldclock'], 'stringSelection':'minimal', }, {'type':'CheckBox', 'name':'chkDebugMenu', 'position':(160, 22), 'label':'Debug Menu (-d)', }, {'type':'CheckBox', 'name':'chkLogging', 'position':(160, 22), 'label':'Logging (-l)', }, {'type':'StaticText', 'name':'stcCmdLineArgs', 'position':(160, 2), 'text':'Command line options', }, {'type':'CheckBox', 'name':'chkMessageWatcher', 'position':(160, 46), 'label':'Message Watcher (-m)', }, {'type':'CheckBox', 'name':'chkNamespaceViewer', 'position':(160, 72), 'label':'Namespace Viewer (-n)', }, {'type':'CheckBox', 'name':'chkPropertyEditor', 'position':(160, 98), 'label':'Property Editor (-p)', }, {'type':'CheckBox', 'name':'chkShell', 'position':(160, 126), 'label':'Shell (-s)', }, {'type':'Button', 'name':'btnLaunch', 'position':(158, 194), 'label':'Launch', 'command':'launch' }, {'type':'Button', 'name':'btnDescription', 'position':(268, 194), 'command':'showDescription', 'label':'Show Description', }, {'type':'Button', 'name':'btnSource', 'position':(378, 194), 'command':'showSource', 'label':'Show Source', }, {'type':'Button', 'name':'btnResource', 'position':(488, 194), 'command':'showResource', 'label':'Show Resource', }, {'type':'StaticText', 'name':'stcDescription', 'position':(1, 230), 'text':'Description', }, {'type':'TextArea', 'name':'fldDescription', 'position':(1, 246), 'size':(594, 211), 'editable':0, }, {'type':'CodeEditor', 'name':'fldSource', 'position':(1, 246), 'size':(594, 211), 'editable':0, 'visible':0, }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/samples/saveClipboardBitmap/0000755000076500007650000000000010434046771021077 5ustar alexalex00000000000000PythonCard-0.8.2/samples/saveClipboardBitmap/readme.txt0000644000076500007650000000236407460115303023073 0ustar alexalex00000000000000This is a very simple, single purpose, sample. I wrote it to avoid having to paste screenshots into MS Paint, save them as BMP files and then convert to PNG format using a command-line tool. If the clipboard contains a bitmap you can save that bitmap to disk in a variety of formats, by pressing Ctrl+S or selecting Save As... from the file menu. You can provide the extension (.jpg, .png, .bmp) to save the file in and the script will choose the format based on the extension. You can leave saveClipboardBitmap app open and then capture a different bitmap in the clipboard, switch back to saveClipboardBitmap and do another save. As a convenience, if the clipboard contains a valid bitmap when the app is started you will be prompted to do a Save As immediately without having to type Ctrl+S or select Save As... Due to licensing issues, wxWindows does not contain code to save GIF images. PNG is generally preferred for screenshots, but if there is demand I could add Python Imaging Library (PIL) support, which I think can save in GIF format. I'll probably add a clipboard preview to the script once I get a chance to play with it some more. saveClipboardBitmap is another sample that has no resource file. See the noresource sample for more of an explanation. PythonCard-0.8.2/samples/saveClipboardBitmap/saveClipboardBitmap.py0000644000076500007650000000464410347526324025374 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.18 $" __date__ = "$Date: 2005/12/13 11:13:24 $" """ from PythonCard import clipboard, dialog, graphic, model import wx import os rsrc = {'application':{'type':'Application', 'name':'saveClipboardBitmap', 'backgrounds': [ {'type':'Background', 'name':'bgMin', 'title':'saveClipboardBitmap PythonCard Application', 'size':(200, 100), 'menubar': { 'type':'MenuBar', 'menus': [ { 'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ { 'type':'MenuItem', 'name':'menuFileSaveAs', 'label':'&Save As...\tCtrl+S' }, { 'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit' }, ] } ] }, 'components': [ ] # end components } # end background ] # end backgrounds } } class Minimal(model.Background): def on_initialize(self, event): self.bmp = None self.filename = None # since there might already be an image in the clipboard # go ahead and prompt to save it self.on_menuFileSaveAs_select(None) def on_menuFileSaveAs_select(self, event): self.bmp = clipboard.getClipboard() if not isinstance(self.bmp, wx.Bitmap): return if self.filename is None: path = '' filename = '' else: path, filename = os.path.split(self.filename) # wxPython can't save GIF due to the license issues # but we can save most other formats, so this list can be expanded wildcard = "PNG files (*.png)|*.PNG;*.png" + \ "|JPG files (*.jpg;*.jpeg)|*.jpeg;*.JPG;*.JPEG;*.jpg" + \ "|BMP files (*.bmp)|*.BMP;*.bmp" + \ "|All Files (*.*)|*.*" result = dialog.saveFileDialog(None, "Save As", path, filename, wildcard) if result.accepted: path = result.paths[0] fileType = graphic.bitmapType(path) #print fileType, path self.filename = path self.bmp.SaveFile(path, fileType) return True else: return False if __name__ == '__main__': app = model.Application(Minimal, None, rsrc) app.MainLoop() PythonCard-0.8.2/samples/searchexplorer/0000755000076500007650000000000010434046771020212 5ustar alexalex00000000000000PythonCard-0.8.2/samples/searchexplorer/favorites.py0000644000076500007650000000460107413435511022564 0ustar alexalex00000000000000{'Amazon - book title': {'pastSearches': ['Breaking Windows: How Bill Gates Fumbled the Future of Microsoft', 'Hacking Exposed', 'Learning Python', 'Programming Python', 'Python Essential Reference', 'Python Standard Library'], 'postURL': '', 'preURL': 'http://www.amazon.com/exec/obidos/search-handle-url?index=books&field-title='}, 'Amazon - keyword': {'pastSearches': [], 'postURL': '', 'preURL': 'http://www.amazon.com/exec/obidos/search-handle-url?index=blended&field-keywords='}, 'Dictionary': {'pastSearches': ['epiphany', 'guido', 'hypercard', 'python'], 'postURL': '', 'preURL': 'http://www.dictionary.com/cgi-bin/dict.pl?term='}, 'Google': {'pastSearches': ['currency converter', 'hypercard', 'llamas'], 'postURL': '&meta=lr%3Dlang_en%26hl%3Den', 'preURL': 'http://www.google.com/search?q='}, 'Google Groups': {'pastSearches': ['pythoncard group:comp.lang.python'], 'postURL': '', 'preURL': 'http://groups.google.com/groups?q='}, 'Python Cookbook': {'pastSearches': [], 'postURL': '§ion=PYTHONCKBK&type=Subsection', 'preURL': 'http://aspn.activestate.com/ASPN/search?query='}, 'Python mail lists (ASPN)': {'pastSearches': [], 'postURL': '&type=Archive_Python', 'preURL': 'http://aspn.activestate.com/ASPN/search?query='}, 'PythonCard mail list (ASPN)': {'pastSearches': ['documentation', 'sizers'], 'postURL': '&type=Archive_PythonCard', 'preURL': 'http://aspn.activestate.com/ASPN/search?query='}, 'Stock Quotes': {'pastSearches': ['MSFT', 'SNE', 'intc'], 'postURL': '', 'preURL': 'http://finance.yahoo.com/quotes?symbols='}, 'iMDB - movie title': {'pastSearches': ['citizen kane', 'holy grail', 'life of brian'], 'postURL': '', 'preURL': 'http://us.imdb.com/Tsearch?title='}} PythonCard-0.8.2/samples/searchexplorer/readme.txt0000644000076500007650000000136507417665010022215 0ustar alexalex00000000000000searchExplorer was the first "useful" PythonCard app. It presents a list of search sites and when the user clicks the "Search" button, it launches a web browser to display the search results at the given site. It automatically keeps tracks of the searches made and saves them to disk. searchExplorer has an Edit menu that you might want to copy for your own code. The textIndexer and resourceEditor samples uses a similar Edit menu that use 'command' handlers rather than menu handlers which you might want to use instead. I use findfiles, searchExplorer, SourceForgeTracker, and worldclock every day, so I keep a shortcut to each app on my desktop; I renamed the copies with a .pyw extension so a console doesn't appear when I double-click the shortcuts. PythonCard-0.8.2/samples/searchexplorer/searchexplorer.py0000644000076500007650000002273710347526325023626 0ustar alexalex00000000000000#!/usr/bin/python """ App Name: SearchExplorer Created: 2001-07-21 Description: The first useful application using the PythonCard prototype. List widget needs to support selections by number rather than just by string List widget needs to support more methods for inserting, appending, clearing, etc. Need support for a default button in the resource format... If you are familiar with OOP design you'll notice that PythonCard does not implement a Model View Controller. However, unlike HyperCard I'm not using widgets themselves as data storage or storing data needed across methods in global variables, both of which were common techniques in HyperCard. Instead, I'm using instance variables. Where data is stored and how it is read and saved transparently is one of the issues we have to explore. I'm playing with naming conventions. When I make a reference to an actual widget object I'm prefixing the variable name with 'w' followed by the actual widget unique name. Visual Basic recommended a convention of three letter abbreviations for each widget type, but these abbreviations were both hard to remember except for the simplest ones (btn, lbl, fld, chk, mnu) and the convention doesn't scale well as the list of widgets grows. So, I'm also trying a verbose naming convention where I prefix the name with the widget class (listSites). This makes for much more typing, but it has an appeal. Naming conventions are just that, conventions, not hard rules or something enforced by Python or the PythonCard framework, but if everyone follows the same conventions then it will make reading and modifying PythonCard user code much easier. No attempt has been made to modularize the logic into appropriate classes and methods. I wanted to try some Rapid Application Development (RAD) without much planning, just sticking code into the event handlers as I went. There isn't much in the way of error checking either. The initial definition of the widgets for the resource file wasn't too bad, but using a GUI to create, resize, and set the properties of the widgets would have been much quicker, so creating even a simple GUI layout tool is a high priority for me once a little bit more of the prototype framework is in place. Until we have an IDE that manages both the source code and the resource file and has a way of showing the valid widgets in context, then getting widget names and method names out of sync will be a source of problems. Consequently, it might help when coding to keep a copy of the valid widgets for a given card or background at the top of the source code or class such as the list below. This is particularly nice if your editor supports split windows. fldSearch btnSearch lblSites lblPastSearches listSites listPastSearches chkExitAfterSearch btnRemoveSearch """ __version__ = "$Revision: 1.35 $" __date__ = "$Date: 2005/12/13 11:13:25 $" __author__ = "Kevin Altis " import urllib import webbrowser import pprint from PythonCard import configuration, dialog, model, util, log import os, sys import shutil FAVORITES_FILE = 'favorites.py' class SearchExplorer(model.Background): def on_initialize(self, event): self.changed = 0 wFldSearch = self.components.fldSearch # copy the clipboard to fldSearch when the app starts if wFldSearch.canPaste(): wFldSearch.paste() else: wFldSearch.text = '' #wFldSearch.setSelection(0, len(wFldSearch.text)) # below is a simpler way of selecting all of the text in a field wFldSearch.setSelection(-1, -1) self.configPath = os.path.join(configuration.homedir, 'searchexplorer') if not os.path.exists(self.configPath): os.mkdir(self.configPath) basePath = self.application.applicationDirectory self.sfFilename = os.path.join(self.configPath, FAVORITES_FILE) log.debug('Favourites are in %s' % self.sfFilename) if not os.path.exists(self.sfFilename): try: shutil.copy2(os.path.join(basePath, FAVORITES_FILE), self.sfFilename) except IOError: dialog.messageDialog(self, 'Unable to load ' + self.sfFilename, 'SearchExplorer exiting') sys.exit() self.sitesDict = util.readAndEvalFile(self.sfFilename) defaultSite = 'Google' sites = self.sitesDict.keys() # need to implement a case-insensitive sort and use that everywhere sites.sort() pastSearches = self.sitesDict[defaultSite]['pastSearches'] pastSearches.sort() wListSites = self.components.listSites wListSites.items = sites wListSites.stringSelection = defaultSite self.components.listPastSearches.items = pastSearches # *** these methods won't be called if the window close button is used *** # *** so any searches made will be lost until that event is hooked up *** # *** in the framework, unless the Exit on search checkbox is checked*** # *** and the Search button is pressed to do a search/launch a browser *** # this "event" is a native wxPython event, not our Event class def on_close(self, event): self.doExit() event.skip() def OnExit(self): print "OnExit" self.doExit() def doExit(self): # always save the current dictionary of search favorites # to simulate transparent saves if self.changed: f = open(self.sfFilename, "w") #s = repr(self.sitesDict) #f.write(s) pprint.pprint(self.sitesDict, f) f.close() def doLaunch(self): wFldSearch = self.components.fldSearch s = wFldSearch.text if s != "": # update the past searches # site = self.find('listSites').getSelection() # KEA old version above, getSelection now returns a position site = self.components.listSites.stringSelection pastSearches = self.sitesDict[site]['pastSearches'] if s not in pastSearches: self.changed = 1 pastSearches.append(s) pastSearches.sort() self.components.listPastSearches.items = pastSearches encodedText = urllib.quote_plus(s) url = self.sitesDict[site]['preURL'] + encodedText + self.sitesDict[site]['postURL'] # launch a new browser window and autoraise it # there appears to be a bug in webbrowser.py because # if a window already exists, a new one isn't being created ?! webbrowser.open(url, 1, 1) if self.components.chkExitAfterSearch.checked: self.close() # pressing return when the search button has focus or double-clicking # a past search will launch a browser window # just pressing return will work once default buttons are supported def on_btnSearch_mouseClick(self, event): self.doLaunch() #def on_fldSearch_textEnter(self, event): # self.doLaunch() def on_listPastSearches_mouseDoubleClick(self, event): self.doLaunch() def on_listSites_select(self, event): pastSearches = self.sitesDict[event.target.stringSelection]['pastSearches'] wListPastSearches = self.components.listPastSearches if len(pastSearches) > 1: pastSearches.sort() wListPastSearches.items = pastSearches def on_listPastSearches_select(self, event): self.components.fldSearch.text = event.target.stringSelection def on_btnRemoveSearch_mouseClick(self, event): wListPastSearches = self.components.listPastSearches doomed = wListPastSearches.stringSelection if doomed != "": site = self.components.listSites.stringSelection pastSearches = self.sitesDict[site]['pastSearches'] pastSearches.remove(doomed) # update self.sitesDict[site]['pastSearches'] self.changed = 1 wListPastSearches.items = pastSearches def on_menuEditUndo_select(self, event): widget = self.findFocus() if hasattr(widget, 'editable') and widget.canUndo(): widget.undo() def on_menuEditRedo_select(self, event): widget = self.findFocus() if hasattr(widget, 'editable') and widget.canRedo(): widget.redo() def on_menuEditCut_select(self, event): widget = self.findFocus() if hasattr(widget, 'editable') and widget.canCut(): widget.cut() def on_menuEditCopy_select(self, event): widget = self.findFocus() if hasattr(widget, 'editable') and widget.canCopy(): widget.copy() def on_menuEditPaste_select(self, event): widget = self.findFocus() if hasattr(widget, 'editable') and widget.canPaste(): widget.paste() def on_menuEditClear_select(self, event): widget = self.findFocus() if hasattr(widget, 'editable'): if widget.canCut(): # delete the current selection, # if we can't do a Cut we shouldn't be able to delete either # which is why i used the test above sel = widget.replaceSelection('') else: ins = widget.getInsertionPoint() widget.replace(ins, ins + 1, '') def on_menuEditSelectAll_select(self, event): widget = self.findFocus() if hasattr(widget, 'editable'): widget.setSelection(0, widget.getLastPosition()) if __name__ == '__main__': app = model.Application(SearchExplorer) app.MainLoop() PythonCard-0.8.2/samples/searchexplorer/searchexplorer.rsrc.py0000644000076500007650000000535110047606357024570 0ustar alexalex00000000000000{ 'application':{ 'type':'Application', 'name':'SearchExplorer', 'backgrounds': [ {'type':'Background', 'name':'SearchExplorer Test', 'title':'SearchExplorer', 'size':(400, 300), 'menubar': { 'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'File', 'label':'&File', 'items': [ { 'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit'} ] }, {'type':'Menu', 'name':'Edit', 'label':'&Edit', 'items': [ { 'type':'MenuItem', 'name':'menuEditUndo', 'label':'&Undo\tCtrl+Z'}, { 'type':'MenuItem', 'name':'menuEditRedo', 'label':'&Redo\tCtrl+Y'}, { 'type':'MenuItem', 'name':'editSep1', 'label':'-' }, { 'type':'MenuItem', 'name':'menuEditCut', 'label':'Cu&t\tCtrl+X'}, { 'type':'MenuItem', 'name':'menuEditCopy', 'label':'&Copy\tCtrl+C'}, { 'type':'MenuItem', 'name':'menuEditPaste', 'label':'&Paste\tCtrl+V'}, { 'type':'MenuItem', 'name':'editSep2', 'label':'-' }, { 'type':'MenuItem', 'name':'menuEditClear', 'label':'Cle&ar\tDel'}, { 'type':'MenuItem', 'name':'menuEditSelectAll', 'label':'Select A&ll\tCtrl+A'} ] } ] }, 'components': [ {'type':'TextField', 'name':'fldSearch', 'position':(5, 4), 'size':(300, -1), 'text':''}, {'type':'Button', 'name':'btnSearch', 'position':(310, 4), 'size':(-1, -1), 'label':'Search','default':1}, {'type':'StaticText', 'name':'lblSites', 'position':(5, 40), 'size':(-1, -1), 'text':'Sites'}, {'type':'StaticText', 'name':'lblPastSearches', 'position':(145, 40), 'size':(-1, -1), 'text':'Past Searches'}, {'type':'List', 'name':'listSites', 'position':(5, 60 ), 'size':(130, 150),'items':[]}, {'type':'List', 'name':'listPastSearches', 'position':(145, 60), 'size':(240, 150),'items':[]}, {'type':'CheckBox', 'name':'chkExitAfterSearch', 'position':(5, 230), 'size':(-1, -1), 'label':'Exit after Search', 'checked':1}, {'type':'Button', 'name':'btnRemoveSearch', 'position':(250, 220 ), 'size':(-1, -1), 'label':'Remove Search'} ] } ] } } PythonCard-0.8.2/samples/simpleBrowser/0000755000076500007650000000000010434046771020021 5ustar alexalex00000000000000PythonCard-0.8.2/samples/simpleBrowser/index.html0000644000076500007650000000045007435020166022012 0ustar alexalex00000000000000 Simple HTML Example

simpleBrowser readme.txt

Python Library Reference

PythonCard-0.8.2/samples/simpleBrowser/readme.txt0000644000076500007650000001173707417000440022016 0ustar alexalex00000000000000simpleBrowser is not designed to be a full web browser. The default URL is set to http://diveintopython.org/toc.html, but you can change that in the resource file. Due to limitations in HtmlWindow and the underlying wxHtmlWindow class, both the HtmlWindow component and the simpleBrowser sample are likely to change a great deal between releases. wxHtmlWindow does not have event bindings, nor can you select the text in the control. As of wxPython 2.3.2.1, the underlying wxHtmlWindow class does not send a Host: header to web servers, so servers expecting a full HTTP/1.1 request will generally return an error page. This includes almost all Apache servers, including SourceForge. The next version of wxHtmlWindow and wxPython should fix this problem so that the control works with more servers. I recommend working with HTML files on your local system to avoid HTTP server issues. The control does not support frames, JavaScript, and many other more advanced HTML features. A list of supported tags is below. Just try it with files on your local system to see what does and doesn't work. I think that it does give us a very simple way to do non-editable styled text with embedded images, tables, etc. and this is the area I would like to explore. It is not going to give us the power of Mozilla or the Internet Explorer ActiveX control. The underlying wxHtmlWindow control does support embedding other wxWindows classes in HTML and while this is fairly advanced, it is also very powerful. See the wxPython demo.py for an example. We should keep this in mind as the framework progresses. See the wxWindows/wxPython help file for more info on HTML classes. --------------------------------------------------------------------------- Tags supported by wxHTML wxHTML is not full implementation of HTML standard. Instead, it supports most common tags so that it is possible to display simple HTML documents with it. (For example it works fine with pages created in Netscape Composer or generated by tex2rtf). Following tables list all tags known to wxHTML, together with supported parameters. A tag has general form of where param_i is either paramname="paramvalue" or paramname=paramvalue - these two are equivalent. Unless stated otherwise, wxHTML is case-insensitive. Table of common parameter values We will use these substitutions in tags descriptions: [alignment] CENTER LEFT RIGHT JUSTIFY [v_alignment] TOP BOTTOM CENTER [color] HTML 4.0-compliant colour specification [fontsize] -2 -1 +0 +1 +2 +3 +4 1 2 3 4 5 6 7 [pixels] integer value that represents dimension in pixels [percent] i% where i is integer [url] an URL [string] text string [coords] c(1),c(2),c(3),...,c(n) where c(i) is integer List of supported tags A NAME=[string] HREF=[url] TARGET=[target window spec] ADDRESS AREA SHAPE=POLY SHAPE=CIRCLE SHAPE=RECT COORDS=[coords] HREF=[url] B BIG BLOCKQUOTE BODY TEXT=[color] LINK=[color] BGCOLOR=[color] BR ALIGN=[alignment] CENTER CITE CODE DD DIV ALIGN=[alignment] DL DT EM FONT COLOR=[color] SIZE=[fontsize] FACE=[comma-separated list of facenames] HR ALIGN=[alignment] SIZE=[pixels] WIDTH=[percent|pixels] NOSHADE H1 H2 H3 H4 H5 H6 I IMG SRC=[url] WIDTH=[pixels] HEIGHT=[pixels] ALIGN=TEXTTOP ALIGN=CENTER ALIGN=ABSCENTER ALIGN=BOTTOM USEMAP=[url] KBD LI MAP NAME=[string] META HTTP-EQUIV="Content-Type" CONTENT=[string] OL P ALIGN=[alignment] PRE SAMP SMALL STRIKE STRONG TABLE ALIGN=[alignment] WIDTH=[percent|pixels] BORDER=[pixels] VALIGN=[v_alignment] BGCOLOR=[color] CELLSPACING=[pixels] CELLPADDING=[pixels] TD ALIGN=[alignment] VALIGN=[v_alignment] BGCOLOR=[color] WIDTH=[percent|pixels] COLSPAN=[pixels] ROWSPAN=[pixels] TH ALIGN=[alignment] VALIGN=[v_alignment] BGCOLOR=[color] WIDTH=[percent|pixels] COLSPAN=[pixels] ROWSPAN=[pixels] TITLE TR ALIGN=[alignment] VALIGN=[v_alignment] BGCOLOR=[color] TT U UL PythonCard-0.8.2/samples/simpleBrowser/simpleBrowser.py0000644000076500007650000000710310106741243023221 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.19 $" __date__ = "$Date: 2004/08/12 19:18:59 $" """ from PythonCard import dialog, model import wx class SimpleBrowser(model.Background): def on_initialize(self, event): self.html = self.components.htmlDisplay self.html.SetRelatedFrame(self, "SimpleBrowser: %s") self.html.SetRelatedStatusBar(0) self.components.htmlDisplay.setAddressField(self.components.fldURL) self.components.fldURL.text = self.html.GetOpenedPage() self.components.fldURL.SetMark(-1, -1) btnFlags = wx.LEFT | wx.ALIGN_CENTER_VERTICAL sizer2 = wx.BoxSizer(wx.HORIZONTAL) sizer2.Add(self.components.btnBack, 0, btnFlags, 5) sizer2.Add(self.components.btnForward, 0, btnFlags, 5) sizer2.Add(self.components.btnReload, 0, btnFlags, 5) sizer2.Add(self.components.fldURL, 1, btnFlags, 5) sizer2.Add(self.components.btnGo, 0, btnFlags, 5) sizer1 = wx.BoxSizer(wx.VERTICAL) sizer1.Add(sizer2, 0, wx.EXPAND) sizer1.Add((5, 5), 0) # spacer sizer1.Add(self.html, 1, wx.EXPAND) sizer1.Fit(self) sizer1.SetSizeHints(self) self.panel.SetSizer(sizer1) self.panel.SetAutoLayout(1) self.panel.Layout() def updateCurrentAddress(self): self.components.fldURL.text = self.html.GetOpenedPage() def on_goReload_command(self, event): self.components.htmlDisplay.text = self.html.GetOpenedPage() def on_goBack_command(self, event): if self.components.htmlDisplay.HistoryCanBack(): self.components.htmlDisplay.HistoryBack() self.updateCurrentAddress() #self.components.htmlDisplay._delegate.Refresh() def on_goForward_command(self, event): if self.components.htmlDisplay.HistoryCanForward(): self.components.htmlDisplay.HistoryForward() self.updateCurrentAddress() #self.components.htmlDisplay._delegate.Refresh() def addTextToItems(self): target = self.components.fldURL text = target.text items = target.items if not items.count(text): items.insert(0, text) target.items = items target.text = text target.SetInsertionPointEnd() target.SetMark(-1, -1) def on_goURL_command(self, event): # KEA 2004-04-06 # clean up the URL # by getting rid of leading and trailing whitespace # and adding http:// if it is missing from the front # of the url target = self.components.fldURL text = target.text.strip() if not text.startswith('http://'): text = 'http://' + text if target.text != text: target.text = text self.addTextToItems() self.components.htmlDisplay.text = self.components.fldURL.text def openFile(self, path): self.components.htmlDisplay.text = path self.updateCurrentAddress() def on_menuFileOpen_select(self, event): wildcard = "HTML files (*.htm;*.html)|*.htm;*.html;*.HTM;*.HTML|All files (*.*)|*.*" result = dialog.openFileDialog(None, "Open file", '', '', wildcard) if result.accepted: path = result.paths[0] self.openFile(path) def on_fldURL_keyPress(self, event): keyCode = event.keyCode target = event.target if keyCode == 13: self.on_goURL_command(None) else: event.skip() if __name__ == '__main__': app = model.Application(SimpleBrowser) app.MainLoop() PythonCard-0.8.2/samples/simpleBrowser/simpleBrowser.rsrc.py0000644000076500007650000000352110047606357024203 0ustar alexalex00000000000000 { 'application':{ 'type':'Application', 'name':'SimpleBrowser', 'backgrounds': [ { 'type':'Background', 'name':'bgMin', 'title':'SimpleBrowser PythonCard Application', 'size':(800, 600), 'statusBar':1, 'style':['resizeable'], 'menubar': { 'type':'MenuBar', 'menus': [ { 'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ { 'type':'MenuItem', 'name':'menuFileOpen', 'label':'&Open\tCtrl+O' }, { 'type':'MenuItem', 'name':'fileSep1', 'label':'-' }, { 'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit', } ] } ] }, 'components': [ {'type':'ComboBox', 'name':'fldURL', 'position':(200, 0), 'size':(300, -1), #'text':'http://www.python.org/', }, {'type':'Button', 'name':'btnGo', 'position':(550, 0), 'label':'Go', 'default':1, 'command':'goURL', }, {'type':'Button', 'name':'btnBack', 'position':(0, 0), 'label':'Back', 'command':'goBack', }, {'type':'Button', 'name':'btnForward', 'position':(100, 0), 'label':'Forward', 'command':'goForward', }, {'type':'Button', 'name':'btnReload', 'position':(200, 0), 'label':'Reload', 'command':'goReload', }, { 'type':'HtmlWindow', 'name':'htmlDisplay', 'position':(0, 30), 'size':(750, 550), #'text':'HelloHello HTML World' 'text':'index.html' #'text':'http://diveintopython.org/toc.html' #'text':'http://www.python.org/doc/current/lib/lib.html' }, ] } ] } } PythonCard-0.8.2/samples/simpleGrid/0000755000076500007650000000000010434046771017263 5ustar alexalex00000000000000PythonCard-0.8.2/samples/simpleGrid/readme.txt0000644000076500007650000000036607645070034021265 0ustar alexalex00000000000000This is a work-in-progress sample to test the PythonCard Grid component. It is a very basic port of the wxPython\demo\GridSimple.py code. The events are manually bound in the openBackground handler, but will eventually be wrapped in PythonCard.PythonCard-0.8.2/samples/simpleGrid/simpleGrid.py0000644000076500007650000001661610120143136021727 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.12 $" __date__ = "$Date: 2004/09/09 21:08:46 $" """ from PythonCard import dialog, model import wx from wx import grid import sys class Minimal(model.Background): def on_initialize(self, event): self.log = sys.stdout self.moveTo = None ## wx.EVT_IDLE(self, self.OnIdle) mygrid = self.components.mygrid mygrid.CreateGrid(25, 25) #, wxGrid.wxGridSelectRows) ##mygrid.EnableEditing(False) # simple cell formatting mygrid.SetColSize(3, 200) mygrid.SetRowSize(4, 45) mygrid.SetCellValue(0, 0, "First cell") mygrid.SetCellValue(1, 1, "Another cell") mygrid.SetCellValue(2, 2, "Yet another cell") mygrid.SetCellValue(3, 3, "This cell is read-only") mygrid.SetCellFont(0, 0, wx.Font(12, wx.ROMAN, wx.ITALIC, wx.NORMAL)) mygrid.SetCellTextColour(1, 1, wx.RED) mygrid.SetCellBackgroundColour(2, 2, wx.CYAN) mygrid.SetReadOnly(3, 3, True) mygrid.SetCellEditor(5, 0, grid.GridCellNumberEditor(1,1000)) mygrid.SetCellValue(5, 0, "123") mygrid.SetCellEditor(6, 0, grid.GridCellFloatEditor()) mygrid.SetCellValue(6, 0, "123.34") mygrid.SetCellEditor(7, 0, grid.GridCellNumberEditor()) mygrid.SetCellValue(6, 3, "You can veto editing this cell") # attribute objects let you keep a set of formatting values # in one spot, and reuse them if needed attr = grid.GridCellAttr() attr.SetTextColour(wx.BLACK) attr.SetBackgroundColour(wx.RED) attr.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD)) # you can set cell attributes for the whole row (or column) mygrid.SetRowAttr(5, attr) mygrid.SetColLabelValue(0, "Custom") mygrid.SetColLabelValue(1, "column") mygrid.SetColLabelValue(2, "labels") mygrid.SetColLabelAlignment(wx.ALIGN_LEFT, wx.ALIGN_BOTTOM) #mygrid.SetDefaultCellOverflow(False) #r = wx.GridCellAutoWrapStringRenderer() #mygrid.SetCellRenderer(9, 1, r) # overflow cells mygrid.SetCellValue( 9, 1, "This default cell will overflow into neighboring cells, but not if you turn overflow off."); mygrid.SetCellSize(11, 1, 3, 3); mygrid.SetCellAlignment(11, 1, wx.ALIGN_CENTRE, wx.ALIGN_CENTRE); mygrid.SetCellValue(11, 1, "This cell is set to span 3 rows and 3 columns"); sizer1 = wx.BoxSizer(wx.VERTICAL) sizer1.Add(self.components.mygrid, 1, wx.EXPAND) sizer1.Fit(self) sizer1.SetSizeHints(self) self.panel.SetSizer(sizer1) self.panel.SetAutoLayout(1) self.panel.Layout() ## def OnCellLeftClick(self, event): def on_mygrid_mouseClick(self, event): self.log.write("mouseClick: (%d,%d) %s\n" % (event.row, event.column, event.position)) event.skip() def on_mygrid_mouseContextClick(self, event): self.log.write("mouseContextClick: (%d,%d) %s\n" % (event.row, event.column, event.position)) event.skip() def on_mygrid_mouseDoubleClick(self, event): self.log.write("mouseDoubleClick: (%d,%d) %s\n" % (event.row, event.column, event.position)) event.skip() def on_mygrid_mouseContextDoubleClick(self, event): self.log.write("mouseContextDoubleClick: (%d,%d) %s\n" % (event.row, event.column, event.position)) event.skip() def on_mygrid_labelClick(self, event): self.log.write("labelClick: (%d,%d) %s\n" % (event.row, event.column, event.position)) event.skip() def on_mygrid_labelContextClick(self, event): self.log.write("labelContextClick: (%d,%d) %s\n" % (event.row, event.column, event.position)) event.skip() def on_mygrid_labelDoubleClick(self, event): self.log.write("labelDoubleClick: (%d,%d) %s\n" % (event.row, event.column, event.position)) event.skip() def on_mygrid_labelContextDoubleClick(self, event): self.log.write("labelContextDoubleClick: (%d,%d) %s\n" % (event.row, event.column, event.position)) event.skip() def on_mygrid_rowSize(self, event): self.log.write("rowSize: row %d, %s\n" % (event.GetRowOrCol(), event.position)) event.skip() def on_mygrid_columnSize(self, event): self.log.write("columnSize: col %d, %s\n" % (event.GetRowOrCol(), event.position)) event.skip() def on_mygrid_rangeSelect(self, event): if event.Selecting(): self.log.write("rangeSelect: top-left %s, bottom-right %s\n" % (event.GetTopLeftCoords(), event.GetBottomRightCoords())) event.skip() def on_mygrid_cellChange(self, event): self.log.write("cellChange: (%d,%d) %s\n" % (event.row, event.column, event.position)) # Show how to stay in a cell that has bad data. We can't just # call SetGridCursor here since we are nested inside one so it # won't have any effect. Instead, set coordinants to move to in # idle time. value = self.components.mygrid.GetCellValue(event.row, event.column) if value == 'no good': self.moveTo = event.row, event.column def on_idle(self, event): if self.moveTo != None: self.components.mygrid.SetGridCursor(self.moveTo[0], self.moveTo[1]) self.moveTo = None event.skip() def on_mygrid_selectCell(self, event): self.log.write("selectCell: (%d,%d) %s\n" % (event.row, event.column, event.position)) # Another way to stay in a cell that has a bad value... mygrid = self.components.mygrid row = mygrid.GetGridCursorRow() col = mygrid.GetGridCursorCol() if mygrid.IsCellEditControlEnabled(): mygrid.HideCellEditControl() mygrid.DisableCellEditControl() value = mygrid.GetCellValue(row, col) if value == 'no good 2': return # cancels the cell selection event.skip() def on_mygrid_editorShown(self, event): if event.row == 6 and event.column == 3: result = dialog.messageDialog(self, "Are you sure you wish to edit this cell?", "Checking", wx.YES_NO) if not result.accepted: event.Veto() return self.log.write("editorShown: (%d,%d) %s\n" % (event.row, event.column, event.position)) event.skip() def on_mygrid_editorHidden(self, event): if event.row == 6 and event.column == 3: result = dialog.messageDialog(self, "Are you sure you wish to finish editing this cell?", "Checking", wx.YES_NO) if not result.accepted: event.Veto() return self.log.write("on_mygrid_editorHidden: (%d,%d) %s\n" % (event.row, event.column, event.position)) event.skip() def on_mygrid_editorCreated(self, event): self.log.write("on_mygrid_editorCreated: (%d, %d) %s\n" % (event.row, event.column, event.GetControl())) if __name__ == '__main__': app = model.Application(Minimal) app.MainLoop() PythonCard-0.8.2/samples/simpleGrid/simpleGrid.rsrc.py0000644000076500007650000000140410047606360022677 0ustar alexalex00000000000000 { 'application':{ 'type':'Application', 'name':'SimpleGrid', 'backgrounds': [ { 'type':'Background', 'name':'bgMin', 'title':'Simple Grid PythonCard Application', 'size':( 600, 400 ), 'style':['resizeable'], 'menubar': { 'type':'MenuBar', 'menus': [ { 'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ { 'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit' } ] } ] }, 'components': [ { 'type':'Grid', 'name':'mygrid', 'position':(0, 0), 'size':(400, 300), }, ] } ] } } PythonCard-0.8.2/samples/simpleIEBrowser/0000755000076500007650000000000010434046771020237 5ustar alexalex00000000000000PythonCard-0.8.2/samples/simpleIEBrowser/index.html0000644000076500007650000000045507607363070022242 0ustar alexalex00000000000000 Simple IE HTML Example

simpleIEBrowser readme.txt

Python Library Reference

PythonCard-0.8.2/samples/simpleIEBrowser/readme.txt0000644000076500007650000000057307562106264022244 0ustar alexalex00000000000000simpleIEBrowser is based on the simpleBrowser sample, but instead of the using the htmlWindow (wxHtmlWindow) control, it uses the new wxIEHtmlWin control in wxPython 2.3.3.1. This will only work under MS Windows, but since wxIEHtmlWin wraps the Internet Explorer COM control, you get a full-featured browser window. simpleIEBrowser is not designed to be a full web browser. PythonCard-0.8.2/samples/simpleIEBrowser/simpleIEBrowser.py0000644000076500007650000000700210106741245023655 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.14 $" __date__ = "$Date: 2004/08/12 19:19:01 $" """ from PythonCard import dialog, model import wx class SimpleBrowser(model.Background): def on_initialize(self, event): filename = self.application.applicationDirectory + '/index.html' self.components.htmlDisplay.text = filename btnFlags = wx.LEFT | wx.ALIGN_CENTER_VERTICAL sizer2 = wx.BoxSizer(wx.HORIZONTAL) sizer2.Add(self.components.btnBack, 0, btnFlags, 5) sizer2.Add(self.components.btnForward, 0, btnFlags, 5) sizer2.Add(self.components.btnReload, 0, btnFlags, 5) sizer2.Add(self.components.fldURL, 1, btnFlags, 5) sizer2.Add(self.components.btnGo, 0, btnFlags, 5) sizer1 = wx.BoxSizer(wx.VERTICAL) sizer1.Add(sizer2, 0, wx.EXPAND) sizer1.Add((5, 5), 0) # spacer sizer1.Add(self.components.htmlDisplay, 1, wx.EXPAND) sizer1.Fit(self) sizer1.SetSizeHints(self) self.panel.SetSizer(sizer1) self.panel.SetAutoLayout(1) self.panel.Layout() def on_htmlDisplay_titleChange(self, event): self.title = "SimpleIEBrowser: %s" % event.Text def on_htmlDisplay_statusTextChange(self, event): self.statusBar.text = event.Text def on_htmlDisplay_documentComplete(self, evt): self.current = evt.URL self.components.fldURL.text = self.current def on_goReload_command(self, event): """ enum wxIEHtmlRefreshLevel { wxIEHTML_REFRESH_NORMAL = 0, wxIEHTML_REFRESH_IFEXPIRED = 1, wxIEHTML_REFRESH_CONTINUE = 2, wxIEHTML_REFRESH_COMPLETELY = 3 }; """ # 3 is the same as wxIEHTML_REFRESH_COMPLETELY self.components.htmlDisplay.Refresh(3) def on_goBack_command(self, event): self.components.htmlDisplay.GoBack() def on_goForward_command(self, event): self.components.htmlDisplay.GoForward() def addTextToItems(self): target = self.components.fldURL text = target.text items = target.items if not items.count(text): items.insert(0, text) target.items = items target.text = text target.SetInsertionPointEnd() target.SetMark(-1, -1) def on_goURL_command(self, event): # KEA 2004-04-06 # clean up the URL # by getting rid of leading and trailing whitespace # and adding http:// if it is missing from the front # of the url target = self.components.fldURL text = target.text.strip() if not text.startswith('http://'): text = 'http://' + text if target.text != text: target.text = text self.addTextToItems() self.components.htmlDisplay.text = self.components.fldURL.text def openFile(self, path): self.components.htmlDisplay.text = path def on_menuFileOpen_select(self, event): wildcard = "HTML files (*.htm;*.html)|*.htm;*.html|All files (*.*)|*.*" result = dialog.openFileDialog(None, "Open file", '', '', wildcard) if result.accepted: path = result.paths[0] self.openFile(path) def on_fldURL_keyPress(self, event): keyCode = event.keyCode target = event.target if keyCode == 13: self.on_goURL_command(None) else: event.skip() if __name__ == '__main__': app = model.Application(SimpleBrowser) app.MainLoop() PythonCard-0.8.2/samples/simpleIEBrowser/simpleIEBrowser.rsrc.py0000644000076500007650000000352710047606360024637 0ustar alexalex00000000000000 { 'application':{ 'type':'Application', 'name':'SimpleIEBrowser', 'backgrounds': [ { 'type':'Background', 'name':'bgMin', 'title':'SimpleIEBrowser PythonCard Application', 'size':(800, 600), 'statusBar':1, 'style':['resizeable'], 'menubar': { 'type':'MenuBar', 'menus': [ { 'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ { 'type':'MenuItem', 'name':'menuFileOpen', 'label':'&Open\tCtrl+O' }, { 'type':'MenuItem', 'name':'fileSep1', 'label':'-' }, { 'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit' } ] } ] }, 'components': [ {'type':'ComboBox', 'name':'fldURL', 'position':(200, 0), 'size':(300, -1), #'text':'http://www.python.org/', }, {'type':'Button', 'name':'btnGo', 'position':(550, 0), 'label':'Go', 'default':1, 'command':'goURL', }, {'type':'Button', 'name':'btnBack', 'position':(0, 0), 'label':'Back', 'command':'goBack', }, {'type':'Button', 'name':'btnForward', 'position':(100, 0), 'label':'Forward', 'command':'goForward', }, {'type':'Button', 'name':'btnReload', 'position':(200, 0), 'label':'Reload', 'command':'goReload', }, { 'type':'IEHtmlWindow', 'name':'htmlDisplay', 'position':(0, 30), 'size':(750, 550), #'text':'HelloHello HTML World' #'text':'index.html' #'text':'http://diveintopython.org/toc.html' #'text':'http://www.python.org/doc/current/lib/lib.html' }, ] } ] } } PythonCard-0.8.2/samples/slideshow/0000755000076500007650000000000010434046771017165 5ustar alexalex00000000000000PythonCard-0.8.2/samples/slideshow/readme.txt0000644000076500007650000000370107504673562021174 0ustar alexalex00000000000000slideshow is a PythonCard application that allows you to display a series of images and HTML in a selected directory or in a list of files. You can provide a directory name on the command-line like this example on my own machine: slideshow.py "c:\digital_images\2001-03-14" to have it automatically start the slideshow in that directory. You can also provide a filename instead like this: slideshow.py filelist.txt The text file must contain a list of files for the slideshow like this: c:\digital_images\2001-03-14\DSC00393.JPG c:\digital_images\2001-03-14\DSC00388.JPG c:\digital_images\2001-03-14\DSC00390.JPG This allows you more flexibility than the directory approach to controlling both the files to be displayed and the order in which they will be shown. Of course, since this is a PythonCard application, there is a graphical interface for accomplishing these tasks as well. You can just launch slideshow.py in the usual way and then select the directory you want to use for this slide show by choosing the appropriate option from the Slildeshow menu. (For this version, at least, you cannot select a file containing a text list of images to display from a menu in the PythonCard application.) The remaining menu choices on the Slideshow menu are self-explanatory. Regardless of how you start the slide show - from the command line or from inside the application - You can use the navigation keys or menu options to move around inside the slide show. You can also change the interval between slides on the fly from the menu as well. It is legal to use navigation techniques whether or not the slideshow is in progress. If you use manual navigation at any time the show is in process, the interval timer will be restarted. If you then select "Continue," the slideshow will start from the current slide and advance automatically. Navigations Keys: First Slide: Home, Up arrow Previous Slide: Left arrow Next Slide: Right arrow Last Slide: End, Down arrow PythonCard-0.8.2/samples/slideshow/slideshow.py0000644000076500007650000004102710347526325021545 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.43 $" __date__ = "$Date: 2005/12/13 11:13:25 $" """ from PythonCard import dialog, graphic, log, model, timer, util, EXIF import wx import os, sys import zipfile from cStringIO import StringIO def imageFile(path): if os.path.isfile(path): ext = os.path.splitext(path)[-1].lower() if ext != '' and ext[0] == '.': ext = ext[1:] if ext in ['bmp', 'gif', 'jpeg', 'jpg', 'pcx', 'png', 'pnm', 'tif', 'tiff', 'xbm', 'xpm']: return 1 return 0 def htmlFile(path): if os.path.isfile(path): ext = os.path.splitext(path)[-1].lower() if ext != '' and ext[0] == '.': ext = ext[1:] if ext in ['htm', 'html']: return 1 return 0 class SlideShow(model.Background): def on_initialize(self, event): self.x = 0 self.y = 0 self.filename = None self.directory = None self.zip = None self.bmp = None self.fileList = None self.fileIndex = 0 self.clockTimer = timer.Timer(self.components.bufOff, -1) self.interval = 1000 * 2 # 5 seconds self.loop = 0 self.components.bufOff.backgroundColor = 'black' self.components.bufOff.clear() if sys.platform.startswith('win'): del self.components['htmlView'] self.components['htmlView'] = {'type':'IEHtmlWindow', 'name':'htmlView', 'position':(0, 0), 'size':(150, 150), 'visible':0} # can't disable the component if we want it # to scroll, so need another way to capture # key presses so the IE control doesn't get them # however since slideshow is for displaying HTML # where you shouldn't need to scroll this is probably fine # there is still some kind of focus bug with the IE control # on certain HTML pages self.components.htmlView.enabled = 0 # this is the code from pictureViewer # instead of a file argument, slideshow # should take either a file or directory # argument # if given a directory, the slide show would # be setup to start in that directory # if given a file argument, the contents # of the file would contain a list of files to # display, one file per line if len(sys.argv) > 1: # accept a file argument on the command-line filename = os.path.abspath(sys.argv[1]) log.info('slideshow filename: ' + filename) if not os.path.exists(filename): filename = os.path.abspath(os.path.join(self.application.startingDirectory, sys.argv[1])) #print filename if os.path.isfile(filename): #self.openFile(filename) self.buildFileListFromFile(filename) self.on_menuSlideshowFirstSlide_select(None) elif os.path.isdir(filename): includeSubDirs = self.menuBar.getChecked('menuOptionsIncludeSubDirectories') self.buildFileListFromDirectory(filename, includeSubDirs) self.on_menuSlideshowFirstSlide_select(None) # PythonCard doesn't currently support # binding key presses to just the background, so this # is a hack wx.EVT_KEY_UP(self.components.bufOff, self.on_keyPress) wx.EVT_KEY_UP(self.components.htmlView, self.on_keyPress) self.visible = True self.on_size(None) def on_timer(self, event): self.displayNextFile() def on_keyPress(self, event): # need to enable keyPresses # for backgrounds without a component that accepts keyPresses keyCode = event.GetKeyCode() #print keyCode if keyCode == wx.WXK_UP or keyCode == wx.WXK_HOME: self.on_menuSlideshowFirstSlide_select(None) elif keyCode == wx.WXK_LEFT: self.on_menuSlideshowPreviousSlide_select(None) elif keyCode == wx.WXK_RIGHT or keyCode == wx.WXK_SPACE: self.on_menuSlideshowNextSlide_select(None) elif keyCode == wx.WXK_DOWN or keyCode == wx.WXK_END: self.on_menuSlideshowLastSlide_select(None) def on_size(self, event): size = self.GetClientSize() self.panel.SetSize(size) self.components.bufOff.size = size self.components.htmlView.size = size self.displayFile() def displayFile(self): # always display the file limited to the current size of buffer if self.filename is not None: if htmlFile(self.filename): self.components.htmlView.text = self.filename self.components.bufOff.visible = 0 self.components.htmlView.visible = 1 #self.components.htmlView.setFocus() else: self.components.htmlView.visible = 0 bufOff = self.components.bufOff bufOff.autoRefresh = 0 imgSize = self.bmp.getSize() bufSize = bufOff.size bufOff.clear() bufOff.autoRefresh = 1 # the image will be displayed scaled centered # in the current buffer window # so we need to know the smallest scale dimension # and use that for scaling #newSize = self.sizeScaled(imgSize, bufSize[0], heightScale) # if the size of the image is <= the width and height of the # buffer then don't scale the image, just center it if imgSize[0] <= bufSize[0] and imgSize[1] <= bufSize[1]: xOffset = (bufSize[0] - imgSize[0]) / 2 yOffset = (bufSize[1] - imgSize[1]) / 2 bufOff.drawBitmap(self.bmp, (xOffset, yOffset)) else: widthScale = (0.0 + bufSize[0]) / imgSize[0] heightScale = (0.0 + bufSize[1]) / imgSize[1] if widthScale > heightScale: scale = heightScale newSize = (int(round(imgSize[0] * scale)), int(round((imgSize[1] * scale)))) # center horizontally offset = (bufSize[0] - newSize[0]) / 2 #print "offset", offset position = (int(round(offset)), 0) else: scale = widthScale newSize = (int(round(imgSize[0] * scale)), int(round((imgSize[1] * scale)))) # center vertically offset = (bufSize[1] - newSize[1]) / 2 #print "offset", offset position = (0, int(round(offset))) bufOff.drawBitmapScaled(self.bmp, position, newSize) self.components.bufOff.visible = 1 #self.components.bufOff.setFocus() def openFile(self, path, slideNumber=None): self.filename = path if htmlFile(self.filename): title = os.path.split(self.filename)[-1] else: if self.zip: data = self.zip.read(self.filename) tags = EXIF.process_file(StringIO(data)) log.debug("Getting %s from zip file" % self.filename) self.bmp = graphic.Bitmap() self.bmp.setImageBits(wx.ImageFromStream(StringIO(data))) else: if not os.path.exists(self.filename): return f = open(self.filename, 'rb') tags = EXIF.process_file(f) f.close() log.debug("Getting %s from file" % self.filename) self.bmp = graphic.Bitmap(self.filename) if tags.has_key('Image Orientation'): # the repr() is something like # (0x0112) Short=8 @ 54 # but the str() is just 1, 8, etc. orientation = int(str(tags['Image Orientation'])) else: orientation = 1 log.debug('Image Orientation: %d' % orientation) if tags.has_key('Thumbnail Orientation'): log.debug('Thumbnail Orientation: %s' % tags['Thumbnail Orientation']) if orientation == 8: # need to rotate the image # defaults to clockwise, 0 means counter-clockwise self.bmp.rotate90(0) elif orientation == 6: self.bmp.rotate90(1) size = self.bmp.getSize() title = os.path.split(self.filename)[-1] + " %d x %d" % size if slideNumber is not None: title = title + " Slide: %d of %d" % (slideNumber + 1, len(self.fileList)) self.title = title self.displayFile() def displayNextFile(self): if self.fileList is None: return index = self.fileIndex + 1 if self.loop and index == len(self.fileList): index = 0 if index < len(self.fileList): self.fileIndex = index self.openFile(self.fileList[self.fileIndex], self.fileIndex) # one shot timer self.clockTimer.start(self.interval, 1) def doSlideShow(self): if self.fileList is not None and self.fileList != []: self.fileIndex = -1 self.displayNextFile() def on_menuSlideshowLoop_select(self, event): self.loop = self.menuBar.getChecked('menuSlideshowLoop') def on_menuSlideshowContinue_select(self, event): # act as a toggle if self.clockTimer.isRunning(): self.clockTimer.stop() else: self.displayNextFile() def on_menuSlideshowShowSlides_select(self, event): self.doSlideShow() def on_menuSlideshowSetInterval_select(self, event): interval = str(self.interval / 1000) result = dialog.textEntryDialog(self, "Time interval between slides (seconds):", "Slide interval", interval) if result.accepted: try: interval = int(result.text) * 1000 self.interval = interval except ValueError: pass def buildFileListFromFile(self, path): try: f = open(path) txt = f.read() f.close() self.fileList = txt.splitlines() except IOError: pass def buildFileListFromDirectory(self, path, recurse=True): self.zip = None self.directory = path fileList = util.dirwalk(path, ['*'], recurse) log.debug('Directory file list: %s' % fileList) # self.fileList should be filtered here self.fileList = [] self.fileIndex = -1 for path in fileList: if imageFile(path) or htmlFile(path): self.fileList.append(path) self.fileList = util.caseinsensitive_sort(self.fileList) def buildFileListFromZip(self, path): self.zip = zipfile.ZipFile(path) self.directory = None fileList = self.zip.namelist() log.debug('Zip file list: %s' % fileList) # self.fileList should be filtered here self.fileList = [] self.fileIndex = -1 for f in fileList: ext = os.path.splitext(f)[-1].lower() if ext != '' and ext[0] == '.': ext = ext[1:] if ext in ['bmp', 'gif', 'jpeg', 'jpg', 'pcx', 'png', 'pnm', 'tif', 'tiff', 'xbm', 'xpm']: self.fileList.append(f) def on_menuSlideshowChooseZip_select(self, event): wildcard = "Zip archives (*.zip)|*.ZIP;*.zip" if 0: if self.documentPath is None: dir = '' filename = '*.txt' else: dir = os.path.dirname(self.documentPath) filename = os.path.basename(self.documentPath) result = dialog.openFileDialog(self, 'Choose a zip', wildcard=wildcard) if result.accepted: self.buildFileListFromZip(result.paths[0]) self.on_menuSlideshowFirstSlide_select(None) def on_menuSlideshowChooseDirectory_select(self, event): if self.directory is not None: directory = self.directory else: directory = '' result = dialog.directoryDialog(self, 'Choose a directory', directory) if result.accepted: includeSubDirs = self.menuBar.getChecked('menuOptionsIncludeSubDirectories') self.buildFileListFromDirectory(result.path, includeSubDirs) self.on_menuSlideshowFirstSlide_select(None) def on_menuSlideshowToggleFullScreen_select(self, event): self.ShowFullScreen(self.menuBar.getChecked('menuSlideshowToggleFullScreen')) def on_menuSlideshowStopSlides_select(self, event): # KEA 2004-07-17 # if the slideshow is running in fullscreen mode then # people can panic not knowing how to stop the slideshow and get # control back so I made the ESC key stop the slideshow and # go back to a normal window size if self.clockTimer.isRunning(): self.clockTimer.stop() if self.menuBar.getChecked('menuSlideshowToggleFullScreen'): self.menuBar.setChecked('menuSlideshowToggleFullScreen', False) self.ShowFullScreen(False) def on_menuSlideshowFirstSlide_select(self, event): if self.fileList is not None and self.fileList != []: self.fileIndex = 0 self.openFile(self.fileList[self.fileIndex], self.fileIndex) if self.clockTimer.isRunning(): self.clockTimer.start(self.interval, 1) def on_menuSlideshowPreviousSlide_select(self, event): if self.fileList is not None and self.fileList != []: self.fileIndex -= 1 if self.fileIndex == -1: self.fileIndex = len(self.fileList) - 1 self.openFile(self.fileList[self.fileIndex], self.fileIndex) if self.clockTimer.isRunning(): self.clockTimer.start(self.interval, 1) def on_menuSlideshowNextSlide_select(self, event): if self.fileList is not None and self.fileList != []: self.fileIndex += 1 if self.fileIndex == len(self.fileList): self.fileIndex = 0 self.openFile(self.fileList[self.fileIndex], self.fileIndex) if self.clockTimer.isRunning(): self.clockTimer.start(self.interval, 1) def on_menuSlideshowGotoSlide_select(self, event): if self.fileList is not None and self.fileList != []: result = dialog.textEntryDialog(self, "Slide number:", "Goto slide", str(self.fileIndex + 1)) # this version doesn't alert the user if the line number is out-of-range # it just fails quietly if result.accepted: try: n = int(result.text) - 1 if n >= 0 and n < len(self.fileList): self.fileIndex = n self.openFile(self.fileList[self.fileIndex], self.fileIndex) except ValueError: pass def on_mouseUp(self, event): self.on_menuSlideshowNextSlide_select(None) def on_menuSlideshowLastSlide_select(self, event): if self.fileList is not None and self.fileList != []: self.fileIndex = len(self.fileList) - 1 self.openFile(self.fileList[self.fileIndex], self.fileIndex) if self.clockTimer.isRunning(): self.clockTimer.start(self.interval, 1) def on_menuFileOpen_select(self, event): result = dialog.openFileDialog() if result.accepted: self.openFile(result.paths[0]) def on_menuFileOpenSlide_select(self, event): if self.fileList is not None and self.fileList != []: path = self.fileList[self.fileIndex] if imageFile(path): log.debug("image: %s" % path) viewer = os.path.abspath(os.path.join('..', 'pictureViewer', 'pictureViewer.py')) if " " in path: path = '"' + path + '"' try: util.runScript(viewer, path) except: # Fail gracefully if displaying fails pass elif htmlFile(path): log.debug("html: %s" % path) import webbrowser webbrowser.open(path, 1, 1) def on_close(self, event): self.clockTimer.stop() self.bmp = None event.skip() if __name__ == '__main__': app = model.Application(SlideShow) app.MainLoop() PythonCard-0.8.2/samples/slideshow/slideshow.rsrc.py0000644000076500007650000000734010076262760022514 0ustar alexalex00000000000000 { 'application':{ 'type':'Application', 'name':'SlideShow', 'backgrounds': [ { 'type':'Background', 'name':'bgSlideShow', 'title':'slideshow PythonCard Application', 'size':( 310, 300 ), 'style':['resizeable'], 'visible':0, 'menubar': { 'type':'MenuBar', 'menus': [ { 'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ { 'type':'MenuItem', 'name':'menuFileOpenSlide', 'label':'&Open Current Slide\tCtrl+O' }, { 'type':'MenuItem', 'name':'fileSep1', 'label':'-' }, { 'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit' } ] }, { 'type':'Menu', 'name':'menuImage', 'label':'&Slideshow', 'items': [ { 'type':'MenuItem', 'name':'menuSlideshowChooseDirectory', 'label':'Choose &Directory...\tCtrl+D', }, { 'type':'MenuItem', 'name':'menuSlideshowChooseZip', 'label':'Choose &Zip...\tCtrl+Z', }, { 'type':'MenuItem', 'name':'menuSlideshowSetInterval', 'label':'Set delay &interval...\tCtrl+I', }, { 'type':'MenuItem', 'name':'menuSlideshowShowSlides', 'label':'&Show Slides\tCtrl+S', }, { 'type':'MenuItem', 'name':'menuSlideshowContinue', 'label':'&Pause/Continue\tF8', }, { 'type':'MenuItem', 'name':'menuSlideshowLoop', 'label':'&Loop Slides\tCtrl+L', 'checkable':1, 'checked':0}, { 'type':'MenuItem', 'name':'menuSlideshowToggleFullScreen', 'label':'&Toggle Full Screen\tCtrl+F', 'checkable':1, 'checked':0}, { 'type':'MenuItem', 'name':'menuSlideshowStopSlides', 'label':'Stop Slides\tESC'}, {'type':'MenuItem', 'name':'menuSlideShowSep1', 'label':'-'}, { 'type':'MenuItem', 'name':'menuSlideshowFirstSlide', 'label':'First Slide'}, { 'type':'MenuItem', 'name':'menuSlideshowPreviousSlide', 'label':'Previous Slide'}, { 'type':'MenuItem', 'name':'menuSlideshowNextSlide', 'label':'Next Slide'}, { 'type':'MenuItem', 'name':'menuSlideshowLastSlide', 'label':'Last Slide'}, { 'type':'MenuItem', 'name':'menuSlideshowGotoSlide', 'label':'&Goto Slide...\tCtrl+G'}, ] }, { 'type':'Menu', 'name':'menuOptions', 'label':'&Options', 'items': [ { 'type':'MenuItem', 'name':'menuOptionsIncludeSubDirectories', 'label':'&Include Sub-directories', 'checkable':1, 'checked':0, }, ] }, ] }, 'components': [ { 'type':'BitmapCanvas', 'name':'bufOff', 'position':(0, 0), 'size':(150, 150) }, { 'type':'HtmlWindow', 'name':'htmlView', 'position':(0, 0), 'size':(150, 150), 'visible':0 }, ] } ] } } PythonCard-0.8.2/samples/sounds/0000755000076500007650000000000010434046771016477 5ustar alexalex00000000000000PythonCard-0.8.2/samples/sounds/anykey.wav0000644000076500007650000011471607333604012020520 0ustar alexalex00000000000000RIFFÆ™WAVEfmt ++fact‰™data‰™€€€€€~~}}}~~~~~~€€€€€€€€€€€€€~~~~~~~~~~~~~€~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚€€€~~~~~~}}~~~~~~€€€€€€€~~~~€€€€€€€€€€€€€€~~~€€€~~~~~~~~€€€€€€€€€€€€‚€€€€€~€~€€€€€€€€€€€€€€€€€€€}}}}}~~~~~€€€€€€€€€€€~~~~€€€~~~~}~€~€€€€€€€€€~~~~~~€€€€€‚‚‚‚€€~~~~€€€€‚‚‚‚‚‚€€€€€€€€€€€€€‚‚€€€€€€€€€€~~€~~~~~€€€€‚‚€€€}~~}~}~~~€€€€€~~~~€€~ˆ‚w}ˆƒx|†{}„{}‚‚~|…~€€ƒ€~€€~~}€‚ƒ~„ƒ„€‚‚‚€€€€}‚}‚ƒ‚~ƒ„‚„„ƒƒ‚ƒ‚‚|~…w|…x|‚{~€€y|„‚|{€ƒ~~€|€†{‚ƒ€{|†ˆzv†}}†tŽ{w{ŽŠuu„…|„…x{„„|ƒ€x}ˆ‚zx…{u~~}}„„y{‰…y}‰‚}…‰€x~І€vy‡ˆwy…€y‡€||…‡~|}ƒ„s}‰‚‚„y|‡…~~~}‡ˆwvˆ‚‚€yyŠŠy}…}wŠŒ}w€…†‚„ƒ{|މwx…‡‚~w~ˆ„wuy~‡‰sw€‹…zvwŽ‚syˆˆyq‰„uqŠzv}€„…}|~‚‡y}„†‚|y‡ˆ}zz€‰†|x}‚‚{y‚{{€}~€~|€ƒ}€€‚‚~€ƒ„€}€€~~€~~€~€„…‚~‚†„€}~€‚‚‚||€‚ƒ}~€ƒ„‚€‚‚‚„…„€‚„„‚~€~€€~}~€~€€€€‚~€€€~~€€~ƒ‚~€€‚}|}‚}}|‚~€‚ƒ‚€€‚„„~€}|{{~~}{z|€‚~}€ƒ„ƒƒƒƒƒ…„~~€€|{{|}~|||~€‚‚ƒƒƒƒ‚ƒ„„‚€~~{|~}||||}~‚‚ƒ„„„…†…††…ƒ‚€~|{{z{{€ƒ…††††‡††††…‚€~|}zxvuuxxxvxz|}~‚…………„„‡‡†††…ƒ„„ƒƒ‚€€~~{w}‡‚tvww{{vvvrtz~{vw|†‚…†„‡Œˆ€ƒ‚‚~||~ƒ„ƒ„ˆŠ‹ŒŒŒŽŒ‹Šˆ~~{xuokiijhgggjotux{€„‰Ž‘’”—™”‘ŽŠŠ‡„}{|}{wwxz|€€€|v~„vw|wvwtookgpxumox|‚ˆ‰ˆŠ‘––‰‹‹Šˆƒ€‚‚‚††ƒ†ˆ‹Œ‹‰ˆ‰ˆ†„‚}urrqmga`a__abcdgou|†Ž”—›œžœ™•‘Ž‹ˆ„„€zyzxxzyxzvkt‹†mkzultxniicgx~rlw~~†ŽŠŽ“š–ŒŠ‹‰Š‰‡‚‚…Œ‡†Š’‰‰ˆ†ƒ|solfca]XTTVX\^cglrzƒŠ“™Ÿ£¥¦¨¨¥¢¡žš”Œ†ƒ|zxxsmdm}feuriqztnlhixvlsyw{…†ƒ‚ˆŒ„ƒ……ƒ‡‹Š‰†ˆŽ”—––˜—™š›™”‘Œˆ„€yrlfb\VUTROOSV[_dkry~‰‘–›ž£¦§§¨¦¢ Ÿ—†‚€~|qcn‰…eayzek€}rrpjt‡‚rxƒ{uˆ†|ww{y|zwx†ŠŠ‰Œ”𡤤£¡ŸŸ ž•އƒ{rnkd\UPORRPQUY_fov{‡Œ”›ž¡££ Ÿ  ›–’І„ƒƒ€rft‹gl~u`j}xmlkho~{sy‚}v|ˆŠ„yz}{ux|yrqw}…ˆˆŒ•š›ž©¬©¨¥¢¢ š‘Œ„yogc`YRLHIKKPX\_dmw‡”𡣦©¬«¨¤¢—“‘‡‚}zzuim†…lez|fh|ƒsquoo}ƒxz‡ƒuz‡Š„{xwuqszyrrw|‰‹Ž—œ›¦¬ª©«¨¡Ÿ—Š€tif`XTOJFFGHOW\aksz‚Œ–£¥¨ª¬¬ª¨¤ž™•‹‰‚}seq‡cm~jXp‚tmuujr|x‚Š|v€‡~~zvqljptqoqtw~…Œ–¡¡¡«´³³¸¸°ª©¢—‘Š|pi`VPKEAAA@DLSX`mu~‡’𡍭¯²²°®­ª¦¡œ•ˆ‚sr‚‚jatuYYuxfirlk}x‚‰z‹†}}~xpiaafeceinrx‰˜ŸŸ¥²·µ¹À¼µ´±¦Ÿ™wodXPJB==;9>EKP]hpz‚‹”ž¤©­¯¯¯¯­¨¤ š†•ŽqorV[vuehogerxu€Š€€Œ‡‡‡„~phhic_bcabfku†Ž‘™¨°°·ÂÅÂÁÀ¼´ª¢•Œrc[PF<87559@FMXbm{ˆ’›¥«±¶¶³¹Â»ª¤§Ÿ‰‰„yjdbc`]ahihlqw„‚‚ŠŠ€w{|slljeabdipvy€‹’”›©³µ´¸¹²«ª«¤™‘‰|pf^XRLIEBAAFPYaiox„ŒŒ˜µÇ·­¼Ä­œ«¸¥”‘ˆzsqnotqe`bfhefkqhZ[eb\aljgiow€Œ“™¢¨¨ª´¼½¹¹¶¯¥ ˜Œƒ{neZTNJHD@>CHNU_lrz†’¢¹Ã¹·ÇÄ®©¸¾­—‘‚zw{{unjfbegc`dbTKRXRNT^]Z`lwˆ‘™ ¦®³¹¾Á½·µ´®¥¡œ…}sjb[VQHCAABFJSX`gjq„¥¨ž¦º¶¤ª½Ã´¨¤¡˜ŽŠŽ‘†ytqnmoicc^OGNUQJNWXUYgw}ˆ–£¨°¶º¹µ´µ±ª¥¢’ˆ{rjbZRIEDFHJLRVW[p™•¬±¥¦¹ËÁ°©­«”™ž”„}}ywvtmfbXLKRRIEJPPNZirsyƒ—ž¦²¶µ³³¶¶³¯«¦“‰|vk^SOLHEHKLKJNa~‰€—£šš¯Ä¾ª¢«®£™ž¢™†€~{zvked^VT[\ULNW\Z`ly{|‚›ž¡¨­­ª¨©ª¨£›’އ~wspdXRSURORZZU_|‘Š~Š¢¥œ¥¼Ä¶¢¢¯¬¢›šˆ|y{xqkbXTRROMPTQMR`klo|‰Œ‹”¤¬ªª¯±°­¬­¨¢›“Šƒ|qe]XQKKLJJLNNRc‰€–ª¦¤µÊư§µÁ½«£¥ž‰„ƒxjb[RMNNH@BEFIR_ghn{…Ž•¦«««­±±®©¤¡•ކ‚~uiba[SNPQPRY\Z`vˆ‡‰Ÿª¦£®¼·©¤°¶«š–˜’†€~|tke`]]ZUONRSRU\cfir|†ŠŽ—ž¢¥¨ª«©§¤¡Ÿš”‡vrokdZTOTY]`ac]ax”•‡‡–¥¥¤®¹°ž–¥¯¦–މ‚}qfdeddc\SRY_^^bdfis~ƒ„…‰’™œžŸŸž››–‘І…yurmjhddedfejruuxŒ‹‹—›™—› ””—™‰‡ˆ†yz{tljmmlcaefdchnonnv}„„‡Œ•—“‘•”Œ‰‡…‚~zwvsrwwrpsw{{|‚†~ˆ•ŽˆŒŒ‹Œ’‘Š€€ƒ…yyzvmmuzqgosmlswxssz‚…Љ†‰Žˆˆ‹…„‡Š†€„…zu€†voz‚zrzƒzr…||„ƒ}ƒ‹ˆ€„Œˆ‚†Œ…}†‚}{}zrvvku{xopz{tw|€{~†Š‡‚†ŽŒ‡‹Š„‰Ž‡ƒ‰†‚€yz~ywzzwwy{~|{ˆ†{“Šv†•†}‰Œ…ƒ‡†‚†„}|„vy~vw}}tu|}{}||~|…}…†‚„ˆˆ…ƒˆˆƒƒ†‚~‚€{}zz{zzuxz}y|€€}ƒ‡€†ˆƒ‹‡‚„wƒ‹~u‚†yz„~wx|yzƒ}y}ƒ}x‰vy‚t‡‹x|Ž„x‹Šwˆ‚€ƒ‚yy}s|vq}€ux‚y|‡~zˆˆ~~‘…}ˆ‚€‹‰}„Š}‚ƒ|}‚~y~ƒwu‡„v…}~…‚|…Š{{ƒvˆ‹|}‹~{ˆ‚{…ƒy~ƒz}„{xz{€~v€‚z}ƒ‚~ƒ‰€‡„}ƒ‰{†‚{†„{zwy‡‚m~‡xx‚ƒw€…|Š}}ކ|‚Š~…„€€~}}‚{y„zs€ƒqz‡vqˆq€ˆxˆ‚}‡‡„Ž‚~‰‹Œ€y‰‚v„€w|‚{vz}{xz|zƒ{|†}„„…„„…†„…ƒ†‰€„ˆ~„‡}€}‚}|}~{y€}|{~„x|ˆ}„ƒ}…ˆz†Š€€ˆŠ€…ˆ„ƒ‚‚y{„ys€€r{w|w{‚‚tŒw|Š€„ƒ†€ƒ†‚ƒ€y{qŒ€x„}}‡‚w‰„v€†x~…vƒ„w„‡wƒ‰y|‹y|‹|xƒƒu~ƒz|{}|~{ƒy‡vŒt€y€Œ€„€…€z„‚y†v‚x†ƒy‡~|ƒ‚}ƒ€~ƒƒ€€‚‚€~€‚€‚€~…w‰|z‡}t‰s…u‡~{‰„yƒ‹}~‡v~†}‚w€…t„wz~w„r…€w‚|‚{{Š|wŠƒv‚‡|€‚|…~~†y„|€}~z‰ƒw‰‚z‚€…ƒy‰ƒsƒ„{}}ƒ{~ƒ|~€~z~|~||}||‡u|‰~yƒ|{…x~x€{…‚y‡‰x€~„‰}†~}ˆ}}†}y{rŽs‡…w…x‡||ƒ}‡}|‹}‡y‡†s†s}‹}…„‚vŒ~t—}o–q~k€hˆo€tƒ€u‚q…v†€{…‚v‚ƒwƒ‚{Šxƒ„v‰ƒtˆ‚}‚}‚}‚|‚{|„y}y{}‚|}{‚‚{„yƒ„{ˆ{‡v€„t‡€xˆz‡~ˆy€z‰~|‹v‡{„|ƒ„w‡€x‹€wŽw~}ˆ|~…|…}ƒ{…‚y„}~~‚x‰wˆ€„„ƒ}„z‡}}†v…€zƒ{~†y†}~„zw…{‚}…{|€ƒ|…~€‚‚|€…||€}{€€yƒy„u‡€y‰x~Švƒ|ƒ}}„{~€|z€xƒ}y„||ƒ|~„wƒ„uˆ}|„z€z„€}‚}‚}…xŠ~~‰w…ƒzˆ|†„|ƒ}}„}}„z‚€|ƒ~†~}‚‚~‚„|ƒ„{…}ƒ€|‡|‚}„~€ƒ~ƒ‚~„€„€ƒ€€€ƒ|~€}|~}ƒ{~‚~€€|‚}~€~€{~|‚~~€€}}‚}€|‚}‚|}}‚~‚}€ƒ}€}~€|€|}}}|€}~~€}}‚~‚€€~€~~‚€€€€‚€€‚€€~€‚€€‚€€€‚€€‚€ƒ€€ƒ€‚€‚€‚‚~€‚€€~~€~~€~€€€€~€€~€~€€€€€€€~€|~~~~€~€€‚€‚€€‚€€€€€€€€€€€€~~~~€~€€€€‚‚‚‚‚‚ƒ‚‚‚€€€€€‚€€€‚€€€€€€‚‚‚€€~~~~€~€€€€€€€€€€€€€~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚€€€€€€€€~~~~~~~€€€€€€€€€€€€€€€~~~~~€€€€€~~~~~€€€€€€~~~€€€€€‚€‚€‚‚€€€€€€€€€€‚‚‚‚‚‚‚‚€}~~~€€€€~€€}~~~€€€€€€€€€€€€€~~~€~€~~~~~~€~~€~€€€€€€€~~~}~~}~€~€€€€‚‚‚‚€€‚€€€~€€€‚€€€~~~€€€‚‚‚‚€€€€€€~~€~~~~~~~~~€€~€€€~~~~€€€€€€€€~||}|}~|~~~~}}~€€€€€€‚‚€€~€€€€€€€€€€‚€€€€€€€€~~~~~~{|{}|~€€‚€‚‚‚‚‚~}~{|}|~€}~~}}z||z|}|„†……„‹‚†‰„„~zww|usxx„}vŠ~{‚zyx{‰v€…yy‡‚ˆƒ|‚‚zz‡y{‡‚ƒƒˆ„…Š‚‚€€~{zxyyzzx}|}‚~‚„„‡‡†ˆƒ‡ˆ†……‚€‚‚~~|v}}~yz~€~~„†ƒ„ƒwm}¤Zh—~]dN—€m€u‡’ŒŒ‰|€£€qŒ‚gv†eLe~mepuq€”™—“–¯Â±Ÿ©§—™›ƒg_caPB@==FROLTeu~ƒ•‘›µ¯£¨«œ}˜ñÑB^Ô·AnÄ}n»€Pw‰„›©›œ•}|°ª_2Yb(>) FWAPz–«Ëàåêîððïàù¬Ž‰Œ[':#$#@^ozަ¿Ãº·¯Ÿ›¥›gex}osypQoØð~9«à~Zºž4žŸf[q𬮮¤ƒz˜¬‚1 00)d‚‚®Ôñùø÷öëäãÒ¬‡mg\E5<7%7Z]Tj~„‹””’އ„…{mkxskr{€‹’™œ¥¦£¢ž~bší¸$2ª$_§aB²®Ž‚‘«µ±¹¼œ`ZjhJ(&4Yd[t°ÖÝÜÝÝàßÖŨŒ{sqndRP[onn‰£™{…—ƒlf^LEDP`d`p•¤¨·Å¶¥©±¨•~obkxk_`KI÷»4`ÉžE~µcDž«‘{–™ ¾Ê eYWTbL&5Ac†{—ËçëàÐÁµ¯³¦‰kVTcyufisw‚’‹†”j[iZ=CROPbxŽª¯«·À´«¯kvvece_dx‚ˆ–‚X}åè}2~«D2~JXªÀ«¡¶ºž¡ÅÆ‹S?%,D71=O{·¸­¶ÏáàÔ®‘zw}qeesˆ”˜¢¦œˆŽ}emc@+8>AQciwެ»»¥œž“…„i_ix}}†‰‡”–š‚VâÌT5EEž b5c¶¿ŸŽ© rm—˜c6(!FO8Fdqz§ÛÜĶ»ÇÀ­¡™~``~Šˆ……Š—ŸŸžœ…jbf\FEWP9=Xfn}Š—››£¬ ˆ‚€|~‚|{“¢›“““””’ŽŽƒ^H{â·F>Š?N ™N [§¯Šž’bk™žmHA2:_mad{…ЍÎÚí¬·¯ž˜™„ea{ІˆŒŠˆŠŒŒ‹}YPTRD;Pf[I[y„‚™š–Ž‘ ¥’|‚Š‚zŠ‘†‚Œ’——†‰‡}†ŠƒlIa»è,_¢h%^¢$#v³¡®•s޶žiND4C_]Q`{w}ªÖÖ¿µ¸¸°•Ž{XYt„‚€†ˆŠ’—˜|c`aYKB?L\gfr‚„‡–£¢š—””–“ˆ„†„€Š‰‡‡ˆ‹ŽŠ„ƒ}}ƒ‡†pJJœèž'=—7FŸ’E\­½–™žw­~KD>;SrcUl‹‘¼Ýᦱ³Ÿ†ˆ‚cTn‹†•Ž––‰u^MGFD@@C@Fd‘›’”™™œ˜†xjv‰‰‡Ž’™¢¦¥žŽ~ŒŠ€yspu}ƒˆƒcFtÓÖzUŽ^-]ˆ_$2|¸º•˜©¥ž­±’m^H7OznI]ˆ˜Ÿ¹Ó̹«°±¤}ti`hy‚„ˆ‡ˆ‘–}nbUPLHBCHNO\~œ ‹…”žš’Š‚}wy‰Ÿ’“ž§§¨¢—„zv}‚l^i{zvzlNFÚÛcF›‚E[~c0E˜ÍÈ ‡‘ ¶À©vPK@3ImfHFr ºÆËö´¹º®–~f`ap~xnt„Ž”–~k`[ZZRC:BWcfiv“¨¤•—ž›“‹‡„†…ˆ“œŸ›™ž¢ •Š„‚|wuwvtx~|{}€}urvoNWª×‹"2“œ_OkcQX}œ®£Š”°À®€_mq\Yns_b—­º¶¦¤²µ©—‰zpnlklpoksІ|uvumffd]UZcieao¤œŠ„Ÿ¢•„…І‚¡œ‹‰”˜‘†~|z{~€ysqsv{}zy{vrtjUqºÄ~$P˜‡`UWS]s‡š© Ž£ÀÄ›ndtn__b[]m„–©³©œ¦´¶¦€xvqlmqpor{‰Ž‹yuvupfYST]cefmzƒ”¥¡‘ˆŒ”•|„‡Š˜—Ž“š•…z|ypu}zqq}…€zuz{qWOƒÌ°F"eœ„b^YXoˆ›¦ ‰„ŸÃÀcc|zjc`^cs‘§«Ÿ’Ÿ®±¥’|u~~tmoomrz„€wtvyvrf[Y`ffeehu„“›™”•’‘ˆ„’˜—–•“—›š‘Іƒ€ytw{sknxwrvuomuycKn·Æ{0U‘|j[SjŒ‘›£œ’œ¶Ä«~dlvtj[KTs‡•  Ÿ§­¯¬˜€x€vicfmuxxz{}|{yvqg]Z`f^PW|’…s|Ž¥šŽ™¤”˜œ˜‹Šš“„…‰ˆ€wuywljpomoqnprgPf¶È‚-G‘—‚iKFc‰Š‹™œ“”¤»È¬py€~qXCVqz|Š–—ª²µ±¥’ŠŽŒƒr`ampkjoru{||{yvngehjeZYj}‚~|‰›¤£¤§ª¦¡›˜˜•‹€ˆˆƒ}~ƒ‚€}{yurrrmijqpni\W|»®cNjnf\Zrœ¤©¹¼»¼¸²¯£Œ}}q^OR\b^SR^pvmkt|}}yww~„€z|~}„‡†‰ŒŒš¤£ŸžŸ¢£’‰‡†ypnstsu|z`N|ȸP3o’ˆLD‚][fp§—ޤ­Ÿ•™‘ƒf[emhXO^{Œ†ˆ—¦µÂ¿µ¼Â¼©¢šŒ‚veYWSIADMRSSYfqxwv{…‰‰Š‰‚„‰‰†‡z„ŠŠ‹‘œ¡—˜™™™“ˆ‚{yymSS³€8R~…“†D0tž|[jel yr ž†’’{y‰t]p{d\nwx„ˆ‹¨³¦¡ª´¹¸¯¢™ ¡€smf`[LGNRKLW__clt|ˆ…€Š””ŽŽŽŽ…‚‡‰…‚‚‚‡Ž…†“ŒŒŒˆƒ€‡ƒkf€’\^kv~tUOs‚tjio‘‹{|˜‰ƒ„†plorrqpszƒŠ•œ¡¤¤£¢ ¢ ›”‡ƒ~ulea]\XSQU^b__cmx}}„Ž””“”—š›—”•—“‰†„„ƒ€{xy}ƒ‚~z€†ŠŠ„|~…ˆ‚zssw{wojlrutokryyvvx|‚}|…Іƒ„ŠŽŽ‹ŠŽ“—“’”‹ˆ‡†††}wyzuqnmnnnmmorssvz|{}ƒ……„ƒƒ†ˆˆ„‚‚†‡‡ƒ‚…„ƒ‚‚‚‚‚€€€ƒ~~}}~|yzyxxyxxvvyyyxxy{}{{~‚ƒ†……„„ˆˆ‡††‡ˆ‰†…††ˆ‡…ƒ„‡…€~zxz{ywwwxyxxy{}}~€‚‚‚‚‚‚ƒ„„ƒƒƒ…„‚ƒ‚€‚€~}}~}|}~‚€€ƒ„ƒ€‚‚ƒ‚~|~}{yy{||yxx{}}}}‚ƒƒ„„………††††…………ƒ‚‚‚~|{|}|xwyzyywxxz{|{{|~€ƒ„„ƒ„†‡‡‡†„ƒ„„€}}~}}~}}}~~€‚„…„ƒƒƒ„„„‚€€€~|||}}|zz|~~~}~€‚‚‚‚‚ƒ„……„„„………„ƒ„…„„ƒ‚€€€~|{{|}|yyz|}}}|}~€‚„„ƒ‚ƒƒƒƒ€~}||}}|}}~}~€€€€ƒƒ‚ƒ„„‚€‚‚~~~}{{||{{{}}|}~€‚‚‚„„…‚‚‚ƒ„‚‚‚‚‚‚€€€€~€€€€€‚‚ƒ‚‚‚‚€€€€~}~~~~~€€€‚ƒ‚ƒ„‚‚‚„ƒ‚‚€‚€~~}}}{{{|}||}~~~€€€€‚‚‚‚‚€€€€~€€€€€‚€€€€€~}~€€~~~€€€~€~~~~~~~~€€‚‚€ƒƒ€‚€€€~€€€€€€€€€‚ƒƒ€ƒƒ€€‚€‚€€€€€€€~}|~{}~~€€‚ƒ{wˆtn‹nrœ`r¥dy—‚lƒ’ukƒ‡y{€wx‰‰|}…„…‡z€ƒ€~{y||{€~|€ƒ‚…„„‡‚~ƒ‚z€†|x€‚z}ƒx|…z~}„€~‚„…ƒ€„„‚}€}}z{ƒƒ}z†~‡ˆ~z†Œ‚|‚†ƒ}~ƒƒ}{€ƒ€~‚ƒƒ‚‚‚€€~~~|}~~~}{~€}~‚€€‚‚€‚‚€€€€€‚€€€€~~€}}~}|~~~}}}~~€~~~€€€€€€€€~~|~}|}~}~~|~~€€‚ƒƒ‚ƒƒƒ‚‚ƒ‚‚€€€€€€€€~€~~~~}~€€€‚‚‚‚‚‚‚‚‚‚€~~~~~|}~}~~~€€€€~~}~~}|}|}}}}~€€‚ƒ‚‚€€€€~~~~~~~~€€€€€~~}~~~~~~€€€€€€€€€€€€€€€€‚€‚€€€€€~€€€~€€€€€€€‚‚‚‚€€~~~~~€€€€€€~~~~}~}~~}~~~~~~~~~€€€€€€€€€€€€€~~~~~~~~~€€€€€€€€€€€€~€€€€€‚‚€€€~~~~~€€€€€€~~€€€‚‚‚€€~~}}}}}}|}}€€€}~~}~€€€€€€€~~~€€€€€~~~~~~~}~~~~~€€€€€€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€‚‚‚‚‚‚‚€~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€~~€€€€€€€€€€~€€€€€€€€€€€€€€€‚€€€€€€€€€€€€€€€€€€€€€€€€~~€€€€€€€€~€~€€€€€€€€€€€€€€€€€€~~~~~~€€€€€€€€€€€€€€‚‚‚‚‚€€€€€€€€€€€€€€€€€€€€€‚‚‚€€€~~~}}}~}~}~€€€€€€€€€€€€€€€€€€€~€€€€€€€€~~€€€€€€€€€€€€€€€€~€€€€€€€€‚‚‚‚€€€€€€€€€€‚€€€€€€€€€‚‚€‚‚‚€€€€€€€€~~~~~~€€€€€€€€€€€€€€€€€€€€~€€€€€€€€€€€€€€€€€~~~~~€€~|}}z‚{yz|z„”€{vwz…„„„~~}€€‚ƒƒ…‚~zy{„„„ƒ€~~€‚‚‚€~}|}~~~~z~ƒ€€~~€‚ƒ…„€€~‚‚‚~~}||}€‚}|~‚‚‚€€~~€€~|}~~}|~€€~}}}}‚~~}|~‚………ƒ{yz~„‡„‚|yz~„„‚}yx{ƒƒƒƒ‚|y{€‡Šˆ„zy}ƒ††‚~wwy{|‚‚|yy{~…‡ƒ}{|~€‚…ˆ‡|}ƒ‡ˆ†‚~‚€‚‚‚€}{}ƒƒ~||||}€‚ƒ‚|xv}ƒ€‚€~{|†‡†„}{~ƒ„ƒ|{{~‚‚{yyƒ‚‚€}y{}~€‚ƒ{zz}‚„‚~z{ƒ„„‚~{|‚‚ƒ~{z|}ƒ‚€}zz|€‚‚‚ƒ€{xz„†ƒ€||€‚ƒ……~}‚‚„‚~|{|}€€~~{{}~~~}|{}€„†„ƒ‚…‰‰ˆ„{{}€€}}{€‚…‰‰‡„„„……ƒ‚~zwtsttvvuuw{€…ˆŠŒŒŒŒŽŒ‰„~{{|}|zvtsswy}~~€„tq˜š‰yrrwz}~~|wt€–…„‡‡…„‚|wrkdfnspmpv|‡“šž ž›œ ¡›‡{qkijie\ST\chlruy~…–›œ˜”•—™–’‰…„‡…ƒ€€€…ŠŒ}etŸª„elpffpsphc`g}žš€zŠ’Š…‰…oZQPV]_XR\qƒŽž³¾¼¿ÊÑÔÓʹ«¢™‹~ujYIEIIEEO[bbbipvwwy~~{}„ŒŽŒŠŽ•™™•“•—“ŒŠˆ}„ˆ€c^ÒžLb[€“rU\]m™¦„b|–Ž‹…nQ@G`]F49E`t—¦«®Äâíã×˼·«”…n[SWXQGDJU[du†„qmzzwphdfn~ˆ‡ƒ›¥§©©Ÿ“’™šŠz}{t{‚‚|_V™é·A^¹›L~¬`2`roš›QQœ¤„š¤~S_egfE(MQYs{z­ÆÜéÔËÛßÍźŸ{ulgXF@Tb^bkcbˆkihgom\TSXlЄЛ¦³º²¡–‘’–Œwloouyy„gf¿òƒ6ƒÌ€T.4qzw~dP€°Ÿ™Œpj{€a3&ANHO`do¯ÁÔÕÌØîë×À¹£’‹€mWJGOZ]TTeml{œƒakuge[TZbq„„«³¯³²¨¥¢˜vupmrwsv…Šqp¼é€9žÌcD–‚4yf`]q›¨š”˜}|‚xU/7SO=F]aq—²»ÆÑØäíâË¿·¤‘…vYILRLGMT\nuit™’ttofjaWYZc}…‚ŒŸ©¬¶¸¬¢Ÿ–Ž‚yqiils{wuŠ™~a¸ôœ2~Ò:|@"k‹mQ^|˜žžž˜Š†…~`7:[U:A]fn‹°¹ºÆßìêÞÎÁ¸¬™t^LJOLEHP^mwnoŽœv~xjniSSZ[k}}”§ª¯¶®©§¡—‹€~€j]q|osˆŠyt¾î‘8Í;y)cƒcD[–•—ž•ŠŒ•ŠtQCVaJ:Ibeuš²­·ÔééàÔÈ鹿jWOSN>E\X[y‡|­ÉÈÅÉÊÐÓDZ¤šŠ€xfLDPQBCMIIu„f^‡ƒ‡t{}z…ƒruŠ“‹Š’–œš‹“’‚…ˆ~fp¸Ç`B«¹R_¥~&W™};Pv|…ƒ€‹Œ›g\|…`E\eT_~r§º½½ÂÊÑÓ̹§ šƒiMLZN??7?]lRZrpzŽ…u{Š‘|…‹‹ŽŠ…˜–ˆ‚Ž—ƒ†~†{‰‰kÇKx¶~`’€EY{naZPk‡sfŽxžpsƒ}lecadhmorw†ž¨ª¯½ÈÈź±«¡“„re_\N>>LKFIQWblttv~‹Œ‘–—”‘‘І…‡ˆƒ€‚€ƒ„‡‹‰Š‡‘©—u‰tz‚`\gZdkQYmfk}xt‡‰‰‚}‰†{zyvuv}ƒ‚’š› «­­°²­§£ž–Š|td]d]KM\SLYa\]gqqqy€‚‹“™˜–•”“’‹Š‰‚‚…ƒ~…ƒˆ„‰ŒˆˆŠ‰…~{tomj]^jdS`iagnrtw{‚‡„„‘Œ‹“Ž•‘‘–•œ’””Ž‘ˆˆ„{{sszqsyrrzxxzwwzzyvtwustwuuxzz}zƒŒ„’Œ†”ˆŠ˜ƒŠ“„’Œ‹ˆ‚‡„x~}su€nltuxhv~i€q„yx‡w|‚~|…wƒ„~‰ƒƒ‰ˆŒ†‰Œ…‡†Œ…‚‰†}ŽŠyˆƒ~„ƒ|€{y~xw|kt}kn}qp|vv„p}Œw„…†€„ˆƒŽ|‚†ƒ†„‰†~„…~‚~€}|‚€y€~ƒ…}„{~{~w|~u~y{€x†‚|„‡~‹„Šƒ…„†‚‚ƒˆ|ƒ……„‚†€Šƒ~Œ€‡~{ˆ}uˆuzƒs~€w|~~}}|†}‡…€€†|€‚€|~€|€|€~{}‡‚ˆƒ…„ƒƒ„€€z|}y|{y|y~~{€€}ƒ„‚|‚„~€}}ƒ~zƒ„}„‚………€ƒƒ€„€~ƒ}~~|y}~y~~}€}‚ƒ€…‚„€ƒ‚‚ƒ€~~ƒ~}ƒ}‚„~…ƒƒ„ƒ‡€…†~…€ƒ|~}€||€z}|„}„~†„„…{~ƒx„~‚z|ƒ~„€€†‚‚‚‚€‚~}€€{~€}|~ƒ{‚~€ƒz‚ƒ~ƒ~€€€~~{|€~|~}}€€‚‚ƒ‚ƒ‚€€€~~}~€€~}ƒ~ƒ}„‚~}~~€€€€ƒ‚€„‚~‚€‚‚€‚‚‚‚€‚‚€‚€€€‚€€‚‚€‚€„‚€‚‚€‚€€€}}}€~|‚}€‚€€ƒ€~€€~~~~}€€€~€}}~~}~‚€€‚€‚‚€€€€~€€~€}}~}~|€€€€€}€€€~~€€€‚~‚‚‚€ƒ€ƒ€€~~€~~~€}€~€}‚€€‚€‚€‚‚‚‚€‚€€€€€€€~}€~~€~~‚€€€€€€€€€~~~}|}~|~|}}}}~~€€€€‚€~~€€€~€~}€|€€~€€~€€€€€€~€€‚~~‚‚‚‚‚‚‚‚€€€€€~‚€€€€€‚€€€€€~~~}}~€€~~}~}}~}~~~€€€‚€‚€‚€€€€€€€~€~~~}~}~}}€€~€~~~~~€€€‚ƒ€€~€}~{€€€€€€€€€€€ƒ€€~‚€€€‚‚€€€~€€€‚‚‚‚‚‚‚‚‚‚‚€€~~~}~}|}}~|}}~~~€~€€~€€€€€~‚€}€€€€~~~}}~€~~~~€€‚€€€‚‚‚€€€~~~~~}}~~~~€€€€~€€‚‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€€€€~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€€€€€€€€€€€€€€€€€€€€€€~~€€€€€€€€€€€€€€€€€€~~€€€€€€€€€€€€€€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~€‚‚‚‚‚€€‚‚€‚€€€€€~~~~~~~~~~~}~~}~~~~~~€€€€€€€€€€€€€€€€€€~~€€€€€€€€~~~~~~~~~~~~}~~}}~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚€€~~~~~~~~~~}~~}~~~~€€€€€€~~~€~€€€€€€€€€€~~}}}}}~}~~~~€€~€€€~~€€€‚‚ƒƒ‚‚„ƒƒƒ‚ƒ‚€€€€€€€€€€€€€€€€€€€€~~~€€}}}~}|{}||}~~~€€‚„„|}‹‡vz‡vz…}€{zz~z{‚{~€€€€€~€~€€ƒ‚‚‚‚€€€~}}}|}~}}~~~~~€€€‚€€€‚€€€€€€‚‚ƒƒ‚‚‚‚‚€~€€€~€€€‚ƒƒƒƒ„ƒ‚‚€~€€~~~~}}}~~~}}||{|||}~~€€€€€‚€€€€~~~~~~}}~}}~~~~€€€€€€‚€€€€€€€€€€~~}~}|}}|}}~~~€€€€ƒ‚ƒ……„…†„ƒƒƒ‚€€€€€€‚‚€€~}€€€€€€‚‚‚‚ƒ‚ƒƒ‚ƒ„ƒƒƒ‚€€~{|~}}yr€–Ynœ‘nmyƒ‹ƒmzŠ}€†„‡‰w}€~}xuz‚|€‚‰ˆ|}Ž|xŠŽŠˆ…„Œ‚qvxmgkljs}‚‰“”’Œ…{wwrmllnswy|„ŠŽ‘“”––’‹Š…{yvtrrqqrust{~€yj}³«RBœ¿a,p¥€d~–‘¨»« ¯·¯ yvjRAFSRIJ`qxŽ˜¬°¦£­­›ˆŠ‹ohimkhlsvyƒ{x||rhcgfcdckz†Œ„vÓÚ€T¼ë‚7‚ƒcœŽ¦½§—¦¸¯“{tpeR<))==*-H^bn€‰“¦±©Ÿ¥¯´Ÿ‚‰tmwzzyx{†ŽŒˆ…ˆ‚vkfefdbelx‰~}ºß€<íœ)nÍ›U|¥ŒŒ¹¹›˜µ½ ~tvkQA+%6<*!>Z]g{‹’§»µ®²³¬±²•€™ƒmoy~{qr…Š‚‡„qecc`^afkxƒ…‡Ž‹Œ§¶ ŠŸ©’‹Štj‚Šmr˜¤™ ¯©¢¡Œr\UM<# &%'08DVlyƒšªµ½ÅÁº¸½³œ®˜ny•‚ekyywvy…Š‚z}|mjnbR`shYnˆŠ‚ˆœ®‹ÇÇ`lÖº@Q¸Lv­Ž…«»›—©¯•paidB%$+*%$,;R`s…¡Á;¹ÊÒÆ¯›¥¼¦mzœƒcpxou~†ƒ‚ƒphlbWb`Xkyqv‡…†€ÉÚRºé.‚½dRž­e˼º¼‡dp}cF41,$#$)1=ZuvzœÀÀ­·ÍÍ·¬ ´»€mœœrnyr{€x†‘‹‚~qgniQM]dadfw…vmpÉÂba×Ù`BººSmºœ`›Ô©} Á§…wzzdG?@2$'1-)9WihpŽ©ª©¶¾¾¾¸¨™®ÄŸn­‰gz}t{…|ƒ‘Ž|rmv|_K_tm\_pzgd„Ç J‚ê¼FsÐ’K‚Æ‚bµÐ“´½—‚}yr`EGH*4E' GgVR|”Œ”²¹¬°Á잯Á«ˆ“¢Œuz~sn{„€s|‡ƒwpqqjdejpkip{xsqr¨’v´œ~ŸŠ‚˜“š›¢œ†ƒŠ€mdheWMIKJA>HTSVguu|Ž™˜ž§­°­¬°µµ«¡š’†~yxwxtnostonpppsuuv|}xuxuii~y‡˜ƒŠ”““•™Ÿ šŸ¥žŽˆŒŠvkordSMNK=7=FIFLaljr„—˜š¦¶·¬²ÇÈ·©­«˜‡†‚uptpjbdklabhjmoqv||y}~tktˆŠ€‡•˜Œ’“•™™”𦠕ž§™‰‰Žƒrnpn`SPOG=7:BBAK]ffs‰–—œª¼¹³¹Ë̽¹º° •ƒ{vpkjgcfje`gpmkr{}x|}xzutŽ‰šš‡ƒ•¡‘𤛕›¤œŽ„xssofYRLH?58@>:@Q^cl}™ž¨²»Á¿ÁÈÊľ¸®¤›wrngab`^_dcaadnqqt{‚{|„y|—”‘š œ’”–‘Œ˜œ–“™Ÿ—ˆ‰Š‚xple]UJB?824;>@KYhozŠ™¡¨¯ºÄÂÀÅËÇ¿¹²¥š‚uple_^a]\`a`bcglnrvz~zy|fƒµ”u¸Š˜™ŽŽ“’š“‘ ¤’‡“”}rvo^WTH?81,4:6=SaetŠ“«¼º½ÊÏÉÂÅ̯©ªšƒxurfZ^e^[bjhdgnmgnvtwz{~}|…„q{®ª{{ÅÁ||¸£}‹žŽ‰™™’—“Œ–‘lg‚tGGdO&8G+"@J;Heoy— ¹½´ÄÕÆ¼Åƾ²£ž£“ysqgaZY\\agbdvxnkr€opƒ‹ts‰ƒzƒ‚ršµ€i»ËcoʬW½€h¬¬p€±w‡ptjRUaD+CH&,KE:awep£¬Ÿ´ËÆÆÕÍÃÈ·¸©“›™|gtnWRY[XZ^_gqlgt|ytv~ˆ{‚‡„††|{¯©f{Ö¶V™Õ†_«¬h~¶fœ®r›‚crlMTaE,FG+2HBDckeƒ¡™ ¼Æ½ÇÒÅÃʽ®¼¯…ªXvtOIRYUPW_emkkz~w{‚ˆ„††…Š…s€¬•b•Ò\œÃb­ d€°€p¨¥p}Ÿ~dzpOYbC1JK.5LIKcijœ—¡ºÁ¹ÇÐÄÂÉ¿®·¶™Š¢ŠbltSKVQOUW^dkqnuƒx„‡„Œ„ˆ‚w”«jªÉ~`º»av¸d–©p~®gžki~cKb]7Kaai‡‘£¹¹¶ÆÌÇÇüÁºœ ª‹q{v^USQPKLV[\agowxx„އ…“‹Š~’¦gœÂ~a·¼cr´h–¥~~®Žj“ok…jUh\:CX>(BK{½‚5¸‚Oƒ—wu‰~r„—ƒsˆŒŽš¡{§‘w—€}ƒ„†…{y„‹‚zˆ†€|y~„xlqzrediigb]dljfhovzx{…‘•¡¦£¢§®ª¤¦¦¡œ˜’Žˆ}yqnngbdec`bfghpq_l›‹A`Æœ3`ÛKn¤‡n‡Žwx¡ž‹‹”™’‚‰œ–€x‹u}||{svƒƒsuƒ|{|{~tnw~tgktrhgilqmin|zw|ƒ‹‹› ›› ¦¢¡ ŸŸ˜Ž‡xwvredie^_acc`dnoda€”cK»bDž¶cax–‡”¡†€š§’Š’˜š—‰Ž™Šrz„qr|}vvtt|vu}„~~ƒ„}v|ƒ}noxwojjsvlht|wu}„ˆŠŽ‘˜ž ¡¦¨¨¡ž¢¢–Ž…yvwmffc]\]^[Zbe`dtwjgƒšuUƒ»„R„¹†d…¢…}‘ƒŠ™’€Š–‡‡‘–‘„ˆ†tv‚‚rnwzvuuuz€uz†„}{€†ƒ|y|zrpqtrifptkjrw{{}„‹‘’—  ž¤§Ÿ›Ÿž—ŽŒŒ…}yvqlieddd``fieenvuvvr~ž€[»ˆV¸g€ І‹™’€‰›—‡ƒ”‚|ƒŒ†usvlszwrqu{}zx|ƒ„}~„†~x|~zustuuqmrxvqs{~ƒŽŽ‘–™œ™˜›—”””‰‡ƒ~zxromkhgfefegjlkouwz{sx–cr«žbr«žqxš–ƒ‡ˆˆ”’„„•—‰‚ˆƒz~Š„royslqyxsrwz}{z|‚ƒ~†ˆ€{†z{{{zxrt|xru}||†‡…ˆŽ’”””—•‘‘’‰†„€{vusojijjijikpnpsvyzz€ƒ}}“ttŸŸnr™›zw“ƒƒ‹ˆ†Ž„„Œ‡€ƒˆ‡€z{€}upuzsnostttuw|}z|‚„„„„…‰‰…‚†‡‚~}||zusvwttwyz{|}„…†ˆŒ’“““І„ƒ€}ywutronqqonruttwyz}~‚|”Šq¡‘n~’w~‘‹„…‡†‰‰ƒ…ŒŒ…‚ˆ†~z|€}tszyrorwvtswy|zz|€‚‚„†ƒƒ„‚€}|~yuwzvtvyxyz}}ƒ„‡‹‹‹ŽŽ‹‡ƒƒ€{yyvsstqprrqsuuvy|||}‚‚€‚Œ‹yw“—{r‘–}x‹„‚‰ˆ‡‹‹…†ŒŒ‡„„‡ˆ‚{}‚xry|vrswwvvvx|~zz€‚‚ƒ………„‚‚„ƒ~€|yz|{xxz|}||~ƒ„‚…‰ŠˆˆŒŽŠ‹‹‹Š‡…„„|{|yuttspqqrstttuzzxy~€|‰r‹šj‚–‚pŠƒ„ƒ‚‰‹…‚ˆ‹‚€ˆ‰…{{€‚ysvzxrpuvvttvz|{|‚ƒ…„†‰‰‡…‡ˆ…‚ƒ~}{{|ywy{zyz~€‚ƒ‡‰ŠŠŒŽŽŽŒ‹ˆˆ†„ƒ€~}~{wwxvstuutvwuxz{z|}ƒ€x†p{—Žpw‘Žyx†ˆ€ƒ‚ˆˆ‚‡‹‡‡‰ƒ||‚‚wtwyurrrsutqt{|xy„ƒ‚…‡ˆˆ††ˆˆ…‚‚ƒ‚~|{|zywxyzxx{~}~€„††‰ŒŒŽŽŒ‹ˆ†……€}~}ywxxvvvuuwywwz}}|}€‚ƒ€}„Œƒv”ˆs{’‹{|Šˆ‚…†„‡‹‰„‡Œˆ…‡Š‰„~€„€wvz{spsuttstwz{z|€ƒƒƒ†‡‰‰‡‡‰Š†ƒ‚„|y{|xvvxxwvx{|}~ƒ…†‡‰‹‹ŠŠŒŒŠˆˆ‡…‚~|{ywwvuuuttuvwwxz{|~€€„„|}‹‹ywzs‡€z…ˆ„ƒ†„…ŠŠ„„‰Šˆ†„†ˆ„~|€ytuyvsqtuuttwz||}„††‡‰ŒŒ‹ŒŒ‹ˆ††…‚€~}|{zzxz{zy}€‚…†‡ˆ‰Œ‹‹ŒŒ‰‡††ƒ~|zxwwuutttuttuwxxzz|~~€ƒ†ƒ}Œˆw|ŒwzŒ‹€‡‡…‡…‚†‹†‚ƒ‡‡ƒ‚‚|xy|xsruurprtuutvz}~~€„†‡ˆ‰ŒŽŒŠ‹Š‡‡†„€~{zzywxyyyz{}}~ƒ„…†ˆ‰ˆŠŠŠŠ‰‡ˆˆ…‚„ƒ€~}{zyxwwwvwxxwy|{{€ƒƒƒƒ…‡…‚†‹‡€…ˆ„‹‡ƒ„…„…†ƒ‚……ƒ‚‚€}|}}yvwwvtttuuuuvxyxz}€€‚†‡‡‡ˆ‰Š‰ˆ‡ˆ‡„‚‚}|{zzxwxyyyz{||~€€‚ƒ…††‡ˆˆ‡‰‡‡‡‡„‚‚€~}|{{yxyyxxxyyyzz{}}~€€‚ƒ„„‚ƒ‡†‚ƒ‰ˆ‚„ˆ‡„†‡…„††„„„„ƒ‚€~~~}{{{zyyyyyyz{{{}€€ƒ„…‡††‡ˆˆˆˆ†‡†„‚~||zzxxxxwxxyy|}|~‚ƒ„„ƒ„…„„ƒ‚‚‚€}~~{z{zzzzzzzzz{||||}~~~‚‚‚ƒ‚‚ƒ„ƒƒ„…„„„‚„„ƒ‚ƒ‚€€~~~|{{{{z{{{{{|||}~}}‚ƒ„……††‡††‡†……„ƒƒ‚€~}}||{{|{{|}~~~‚‚ƒƒƒƒ…………………„„ƒƒ‚€~~}||{zzzzzz{{{{{|||}}~~€ƒƒ‚‚ƒ‚€€€€~~~~~~~~~~~~~~~}}~~~}}~}}}}~}}~~~~€€‚‚‚ƒƒ„ƒƒ‚‚€€~~~~||}||}}}~~~€€‚ƒƒ„……………††„„„ƒ‚‚‚~}~}|}||}}}}}}}~~~€€‚‚‚ƒƒƒƒ„„„„„„„„„„ƒƒ‚‚€€~~~~|}}{{|{z|{{{{{{{{|}}|}~}}~~€€‚‚‚ƒ„ƒ„„ƒ‚€€~~}}}}||}}~~€€€€‚‚‚€€€~~~~~|~~}}~~€€€€‚‚‚‚ƒƒƒ„„„……„„„„‚‚‚€€~~€€€€€€€€€€~~}}}~}}~€€‚‚ƒƒƒƒƒƒƒ‚‚‚€€~}}|{{{{|||}}~~€€€€€€€€€€€€~~~~~~~}~~~~~~~~~}}}~~~~~~~~~~~€‚‚‚‚‚‚‚‚€€€€€€€€‚‚‚€€€€€€€‚‚ƒƒƒƒ„ƒƒƒƒ‚‚‚‚€€€€€€€‚€€€~~~~~~~}~~}~~~~~~~€€€€€€€€€€€€€€€€€€€€~~~~~~~~~~~~~~~€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~€€€€€€€€~~~}~~~~}~~~~~~~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€~~~~~~~~~~~~~~€€€€€€€€€€€€€€€€€~~~~~~~~~~~~~~~‚‚‚‚‚‚‚€€€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€€€€€€€‚‚‚ƒ‚‚‚‚‚€€€€€€€€€€€~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~€€€€€€€€€€‚‚€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~~~€~~~}~~~~~€€€€€€~~~~~~~~}~}}}}}~~~~€€‚‚€€€€€€€€€€€€€‚‚‚‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~~~}~~}}}}}}}~~€€~~€€€€€€€~~~€€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€~~~~~~~~~~~~~~~~~~~~€€€€€€€~~~~~€~~~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚‚‚€~€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚€€€€€€€€€~~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚€€€€€€~~~~~~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚‚‚€€€~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~€€€€€€€€€€€€€€€€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~~~~~€€€~€€€€€€€€€€€€€€€€€€€€€‚€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~~~~~~~~~~~~~~€~~~~~~~~~~~~~~~€€€€€€€€€€€€€‚€€€€€€€€€€€€€€€€€€€€€€~~~~}~~~~~}~~~}~~~~~€€€€€€€€~€€€€€€€‚‚€€€‚‚‚‚€€€€€€€€€€€€€€€€€~~~~~~~~~€€€€€€€€€€€€‚‚‚‚€€€€€€€€€~~€€€€€€€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€~~~~€€~€€€€€€€€€€€€€€€€€€€€€‚‚€€€€€~}~~~}}}}}}}~~~~~~~~~~~~~~~~~~~~}~~~€€€€€~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€€€€€€€€€~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~~€€€€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚€€€€€€€€€€€‚€€€€€~~~~}~~~~}~}~}~~~~~~~€€€€€~~~~~~~}~€€€€€€€€€€€€€€€€€€€‚‚€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~~~~~~~|}}}}}}}}}~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚ƒƒ‚‚‚‚ƒƒƒ‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€~€€€€€€~~}}}}}}}}}~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€~~~€€‚‚‚‚‚€€€€€€€€€€€€€€€€€€€€€€‚‚‚ƒƒƒƒ‚ƒ‚ƒ‚‚‚‚‚€€€€€€€€€€€€€€€€€€~~~~}}}}}~~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€~~€€€€€‚‚‚‚ƒ‚‚‚‚‚€€€€€€€€€€‚‚‚‚‚‚‚‚ƒ‚‚‚‚‚€€€€€€€€€€€€€€€€€~~~}}}}|}}}}~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€‚‚‚‚€€€€€€€€€€€€€€€~~~€€€~~}~}}}}}}|{||}~~~€€€€€€€€€€‚€€€~}~~~~~~~}}}~€€€‚‚‚‚‚‚‚‚€ƒ€€€€€€€€€€‚‚‚ƒƒƒƒƒƒ‚‚‚‚‚€€€€}~}|}||}€€‚ƒƒƒƒƒƒ‚€~}|||{||}~~~~~~}~€‚‚‚ƒƒƒ„………„…„‚€}}{zz{zz{{|}€‚‚ƒ…„„……„ƒ‚}{yvtqonmllmoqrtwz}‚…ˆŠŒŽ‘’“”“’‘ŽŽŒŒŒ‹‹Šˆ†ƒ€}xuqnkhedbbbcgkosy€„‡‰ŒŒŒŠ‰‡„‚€~|z|z{z|ƒ…‡ŠŒŒŽ‹‰‰ˆ‡†…‡ˆ‰‹ŽŠ‡‚zuqmjgebbbcdfkotz€‡‹’“”’Ž‹ˆ„}yvrnljijkknoquw{ƒ‡ŠŽ‘“’‹ŠˆˆˆŒ’•™›žœ›™—“މ„}wtpkfc`]\\^aglt}…Œ‘”–•“Š…{uqlgdb`^_achmqw†’–šš—“ŽŽ•šŸ¢¥¤¡›—“މƒ}umg`[VSTWY]dmu|…Š’˜š››™•Š‚}sngb_]\^beinqv|‚‹’—™™˜“‰‡ˆ‡‡Ž•—™›Ÿ œšš—’‹ƒ{pg]WRQRRVY_emv‡“£¦§¤ š’‰€xpha[WTQPSZ^benx†•™ž˜’‹ŠŒŒŒ“˜››› ¦¨¨§§¤šŽ‚tjaWTRQQOOPWan{Š›¦¬¯®«§¡›–‹‚zk]SJFFIOU\acgo|‘¢¤£œ†‚„Š““˜›š›£ª¶¼º´«ž‘pe`\ULF@==AOav‡–§®²µ·¶²§™‡vhZPICAACEHMU`n{ ¥¡›–‹‰‡ˆŠ‹‡‚‰˜§±¼ÃÄ»¯¦ –ˆsbND;314:BISd{‘¤²»Ãż´®¤‘~kZMB<9:@CCJVeoz‹¤°©™“’‹„€‚€|„œ³ÁÅÆÈÌʶ¨›ˆiO@<>6+&+9K^u‘¦±¸ÁÎÖÓȹ¦•n_RH:/,16:HYddk}š¸»¦ŒˆŠ…}zyxwqvŽ´ËÏËÉÐØÖ˵¢ŒmM7271*G_n„Ÿ±¾ÇÕàÞϾ¨˜‹{cK>0()-*0GY^_bp¹Ë¶‘‡Š…wnlij®ÐÑÇÇÑáæÚ¿¤Ž}_B::*0L_lz—²ÅÒÝäàÒ½ª¡š„fI;500-'(=XaarmhÆÓ·ˆ€}†ƒujpnm’ÇàÑÅÇÕíïÜ·˜‚kQ?:4 9\kn{¼ÒÞàÝÖÇ´¥œoN91475( -Kjwo\Qs½à¿…mqzŠŠwcedb„ÀæÝ¿»ÎëúïÙƒt]F;0 6[kfpŽ»ØßÝÖÐʺ«Ÿ’}S<5;A>-&EjzcJT…ÜÜžbeu‡—‡f`jfp¬àâɸÁáõôÖ¡‚}u\F4! 0Pifc|ªÐáÛÎÈÊÆ·¨•{]JBEKE/!.Ml{pVE]©äÈ~_k~•˜Z`jexºÞÒ»µÉí÷õÉ–‚…aD-!;Vc_a´ØßÑÀÂÌȶŸ‰r\OGEG?(/TnudG9f¿å±gZp‹¢”gOeog…¿ÛòµÒ÷ö긄ˆ}_: 0DXZZqŸÌÛÒ¿ÀÍÕÁ«”}h_SMIA/#1OjsfF:nÈæœTZy™ªŒQLmsm–ËÍ·±ÀáòòÙŸš˜zS1".9HQQ]{²ÎÏÆ¿ÇØÔ½£yofYNF7()>R_fU4A”ßÃpPh€§¤t@Wyot£Çº¬³ÌïÝ𽔞¬˜kF.$$+05?EKa‚´Â¾¹½ÒÞѶ “…yjZNF7%.EW[U<)bÊÙ€Ka€š©…EEvwf‚¹¶¢¬¼á÷öÍŸ£¹ºŒYA302/+0;@Lpš«®±»ÔåÞÀ°ª¡~gURD.+=HNQ>$SµÑyHi‡ªŠIH}~c€³®–»ßöòÉ£ªÍÇŒ^MGD@4)*59Fg‰—š¡´ÒåÙĸ¹´§rc^K52:79&:šªQ2j“—œ€Sb–r•º¤Œ¢ÂØàÈ —¹Ï¸}eca`T>128>M\`e|’¨¿ÆÀÆÓÒŹ¬›ƒkQG@626' z¦O"]‰Œš_m©£xšÉ£‰±ÊÑÔÀ›–¹É£}nl`]UC736@QZW\rŸ´··É×ÕÊ·©¡’y^OH900(R `;ˆœ€]œ¼ŽÊ¼‡ÊÓʾ¢¬Ì®mrh`XJ826@LQMRj‡š¥«²ÅÕÓÎ˶­¤r^SH9/. =x–=\…w‹šem¸¹±×šŠÇÛľ·š¤Å¸ƒszodcQ>8;BMQJL^|“™§·ÊÍÊÉÆ½¹¯£Œuj^O@260 \—A @“~n‹|nª»‡Ö®ˆ»á˱±«©¼¼p‚zd[PA??AGNIG\z…‹ž¬ºÁÁÀ¾½»²§—€vpaK?=:/BRD•d™ƒ‘³¤­Ë¼”´ÙÊ«®°«ª¡‰†h\b[LD@AQUNO`w}}ˆ˜¦µ¶¶¸º¼º³£”Œˆ}k_K@@=5+0jz?-{ {o™¨¨¾°¶Â¨§ÆË°§ª¢¦š}tvqkbRGGMUULM[jt|„ˆ”¤®®±µ±±·­•…š•e`fSCCDC9:84c™r9s®–¨·’’¿Â¬¥¡¢¬¬£›‘——€vtssnbZWYaaXU^jry}‚•™ ¨™§²Ÿ‚†‰€iglYISVPUXX^^\~¨~X”ºœ‰¦«–œ«©¤•¦§‘˜ˆ‡{w{~ufjsaXhma_gi{ƒwt‡“‹”‘†‡Œ‹sr|nsrcin^i|riny|‡†yz˜¨•˜Ÿž£žŽ•™…ƒ…†ˆ€{|‚zyz~{uwxutpqukmvkfts`tƒ^b‹l~{…€v€‰s¡‚h‚’‰ƒƒ‹Œ’†Œ‹…“†…€‡ˆ}€‰…~„„„ˆˆ‡ˆ‰„†‹…~qwnggedcfeijej}qtz‚…‚Ž…~›‡œ„–˜Š–|›…n‘}vus†|{~‚‚}ˆƒ†‹ŒŒ’Žˆ†„‰rn}giycframnmvlqzq~‚j‚‡wŽŒ…†’’…Œ…‰ƒ€‚z€|}‚xt{…}}„~’‡€’‡—Š‘†|‰ˆwv}rtzrmug{shyspv~szƒx‚‡vŽ~”Œ€Š„‡‡v€j€oyrxn‰w’~–ˆ…”„”Œ~•Œ}}…‚zƒswzwp{vptvryzu{z|„ƒ‚†ˆŒŒ‡‘‡†ˆ‹„…‚yz‚wrzwz|pu€yˆ|†zˆƒ‚‚ƒƒ‚‚…‰‚z‚†v€‚vxy~n{ƒo€yr„{|}„‚ˆ…ƒ‰€‰ŠƒŠ‚x„|~x…‚u|€|zx}‚w~{}zx~~{|~y€xx†u„v~|€uŠ|†}ˆ€€~…}€€€~€€„~„Œˆ„ƒ‰ˆƒ…‹‚ƒˆ…€…‚|y„yz~yyzvxw‚~y}wƒ|y€|}|{‡ƒ|‡„€‚~…‚v…{„s|€z{{€~†€‚‹…‰‹‰ŠŠ‰ˆŠˆ„†…~{}vyzryys{vs}x{t|€s||{~{€‚~~ƒ€}†}ƒ…„‚y†z€ˆo{Šw‰‚}„„„„}‡…€ˆ‡ˆˆ|Œ‹€Š†€„„~€t~w{~xzy|z}~w{~|}}x{~vz‚w€|…€€‹‚†‹ƒ‰‹††Š|€…v€m‰o…s}~s|~x|Š„yƒ‰„‡‡Œ†ŒŠ‰Š†Œˆ…ŠŒ„Œˆ…{€yssniqieoh`vsryw~‚ŽŒ‰Œ’ˆ•‰Š’ƒ‚†{~~{orvlnmicsŠ}[tŒyx‹Œ~„’š™Œ‰˜Ÿ—’˜šŒ›•€~‚xmjb`]YbXP_ihlps}‹“—•ž­¦¤Ÿ©ª™›ƒ‰|]\nRTXD:Mz€DK}“o}©¬³ª¤–§¼³ ¤´¦‘«³…u“|gaWTOCBC79RVF[xuy‹– ­¹¶¯´½¼®©¨¡”‡ˆv_ZUR;5F5*z’F(‚³ld¶¯‚®×¾¡¨½ÓŤŸÉÆ“ž¼’a‚¡e=OWA9.'36-=Q:D„Œg|¦°³¶¹½ÀËÏ쫺¬Ž~zyfZVD8AC?'CœD¹ JÐØÙœ©ÕØÊ¹¢·Ô·‹¦¯zp–{>>gN)-+*::/?KGq˜cžÁ¯©²¼ÈÐij²´º³‘v|Ž~QBOG<90/0E¬"bͨIƒâ¨˜ãήäÕ°¡¡¿Ó¢m“±ƒl€f3GjH)8>?21Hfmtuq’¾±Ž¡ÇËÀ²«¶Ä¹ ˆˆ‹rMJ`[D/:GH13‚ G? Î‚U¾Îƒ Õ —ÌЦž­°»º}²¤gg{`JYQ*1KH97CRfogn›§¡•§Ç«¦¹À´§›’”|f[_bS@9PZG0:³b4ß‘OžÓ‘—Á Œ¼Æ¢–©¯»µ€{«­~`zxYWR88LI76ERmtW]’¦’Žš¯Ãµœ¡ÀÁ¨›––˜ŒnYcgUB;FXU9(eºƒ)sݾGÔ°‘®’ŠºÀ’¯±±¹‘tŸ¾‘Vj‹rSMDDSM65DTjgNb˜¤‚Ÿ¶º®Ÿ¬Ã¼¤šš™c_ohJMZW>0yÈ1yä½GzÛ¿‹‘}„À«n|¼Á¢¡›“®º…[t™„H@MRP<)6UbXU`¦˜›½À°§§»¿Ÿ‰”‰t]Q]dI7CY^J0F®¾EC½àK­Ú­“€x³ÃŽkœË¯ ªœœ¶¬~e~hD>DOJ3&A`cT\wœ¥”•²À»´¬¬¸¸“‚Š‹}_PS_\B8Qoa%A¹¹A@¹Ù|A¨×«Šlw»Ä€i¬Ù±œ±®¦³®‚iˆb@=BJE.&Df_Qb›£™›³Ã»¯¥¥°©Œw~o\QS^aJD`oL:…Âh1…Ü„3ȧ‰mcŸÎŸgžÚĦ°±®¸µr{‡rL@:@J?(0Vhddl®¯–ºÀ³¦›¦”|nuuiYQam[Zq\8~Ï~#lÖš$\¶¨Š{L{Í·k{ÑΫ·¼¨¬½«~r‚|eO<7N\=,Roqpq„¢­œš¥¨§ Œƒ‰ˆykghlkdajrrkIR¬Êa,Ì€%c§‹€tLz¾¢m˜Ô¾­É½ ¤¶¨ƒplicV<2KaPH`u†’‡‹¢±£™–Ž”–‚mrvkii`bpsmoz~hG}×5B¼¾F6ƒ xu^]Ÿ¾‰€»Î«¸Ñ¹˜£­”pb`^XK9>Uc[e{‰–¢œ¨¨š“~}slmgcnsges}zv{{eMÙ™2]»¬CBš…w€bg«ºŒ™Ì¸¥ÆÐ¢‰˜œ‚dTMPSJ@F\fk€‰ž¯¢ž¤Ÿ‘Š…ytrnongfuvgl{yu}z\DƒÔ¢8H³²JH’…qŠƒe‘·žžË¾œ½Ò®ƒ‰fYJBEPOMUapŠ•˜®«œžŒ{}wnlvwjsvowyvwrTBÖœ'P¼¬BB›€g‘†ršµ©µÐ· ÄÑ ŽŠk`^J;FUUU\gz“™£œ›¤Žrw†xw‚z…‚om{plmT<Ó%Qµž5SœjZ•–uް°ÂÓ´›¼Ñ®‚‡ŒqX^_I4Hi\PeƒŒŽ¡––›vr~ƒ€y|ƒƒw{ƒynsxwu`7H¯¿W)„µe9ƒ„Kcœ‹š¦³ÐÍ¥«Ê»–”‘q]cdSCDSfilw†›£ŽŠ”–ƒrvƒ‚€y~ˆrtwqtwQ2{Κ#@«›4X”_A’£{z ®½Ë·¤¾Â¡–…`gudGF]e_j}‚Œ£žŠƒŽ’‡uv~{‰x~„{upttL;€Ì#b±(f”KJ•—q‡¬©¹É¶ª½±– ¥ƒVdxeHKZ\bx†|¤ Šƒz€}x~‹Š}yˆ„yvxrTC€Ê€R­'a‘F5£xž´¼Ã¼¶»° «©^p|aJQ[V\vƒ€Ž¡£‘Š“—‰€ˆ†||Šˆ|v{‡†{qwsNJ˜Æy!r¦]*|~)Bœi€£©¼Æ¸µ¿¬ž°¬`zYK^eSZ~€t‹¥žˆ™Š}‹•€u€‰‚}yw}~suuP@…Ê‚$e¨e*u…,8…Œh{˜ž®¹¶¾¿ –¾¾a‚W[kYIc†y|‹œ›‘”‡€–t€Œ…|{y||zxrLQœº`2~›BAŒhQ™€dœ¬²¶Å»’£Ç«lw‘pPktROo}w|Š’—›œ’ˆŠ’Ž„„‚}‚{w{ztucO|·…:`¥i3pˆC1„]w‘’¬¶·»¥•¬¸{‚\bwdO[lnt~ƒ‡Ž’”–”‘‘“‹‹‡„~{tuzubSc…Œg^„WXslX_jpx‡‰Šœ¡™¡°«šœ¥Ÿ”‚|smkniflqpv|z|‚‡‰Œ•–’’”‡…„~ssldsn^m{cT^hd^`ky‚‰–™ ¬ª ¡©©ž–—‘„{upighjifjswtx…‰’š™—¥¢š”Žˆ„‚v`cwxc\il^PS\_YXdsyzŠ˜–”§²§ž­¸­ ¡Ÿ’ˆ…pfedegeckqrsy„˜Ÿ Ÿ£¦ —”Œ„{wf]dqfX^i^MLYaZUcry|ˆ—˜—¥®ª§¬³´­¦›•†zwqfbhhcflmlpw}…‡Œ™¤£¡©©›””‘„zoY]|pKUpbFQ]SJRaowzƒ™£š¤¾¹ ¨Å©¢§ž‘‰ƒ{rd]hi]]licky|z~œœ§ª¡—˜˜ŒwwbGa9D€q8FlO?^qkr‰›¬ Ÿ¾À¡¨Í¾Ž¯’|€|lg`^icTbylcx†~|ŽŸž˜¢°§–•™Œ{uxp]>DŽC%~–B3q1R‹kY{˜›§¨ŸµÊ±¤ÉÃŽ”»£hoˆoY^^U]a^nrf|˜…yš©››¦«¢žœ–‹}yg]i_2@—{ >§y]›O9“Eo®œŽ£¦±ÏÀµÏ¨–¶¨iw—|BWgNL^XXn|{~‡—¥ž’¬§œš‘‹“Špgpmb^M6Rœ€%C®#d¡PHš…Ivµ›„¢·¸¿´¡¶Ã§–¦•sy„eAVdLCV[]k{|‚ž¤›™ª¯¡˜š—‰oonbZbbF<F1€¹Q4››Eq£k[Ÿ­€‰³¹´¯¤ªÆ¹Ž”¥tzoQPiZ=IghdjxŠ”“—žŸ¤¨”› Š|~~qd_b`a`]LM}šR@š¹_CWx˜kq­Ÿ€Žº³«­¡¦¹²‡…œ’qgh]W]PDSdfiisž‹Ÿ¬¡œ™–›š…w}€tc^chcWYmrYIƒ©X@ ÀeI¢£^|›vu§™v•º©©ž¡´£~ˆ¡†bjteY]PNdhYcyw‰—†‰§©–•œžœŽ€„‡~oiilj][flehpa`œœJW¹¸P^¸©c|—’¨Šz¦·ž•œŸª«‹v‘¡|ZfvgXQLXg`O`{}„›«–£¨—”ŠŽ‰vpxvgfhdglc_n}t]b—«cRªÃ}Y¨¬tzŽ„œ„z ²˜¢¢¥zŠ›€\dpeSJIXdQLfzsz~–ª„¨–އ‰•Šsr~{nfilmlfht}sq„q©`ÈZ€¼o€’•Šxš³š‚•¢–‘Ž|{ƒd]pr`QPZi`FV|}cnˆ’”Œˆ›§•’žš‘•ƒŠ~oqxohklosrnzz|€|Œšpœ´€hµ‰yŠ™Ÿ—„ƒ§­Š˜ |}€zd[iiVOQRXZKLetefŽœª¡”Ÿ¨¤š“˜›…~}tghokbdklilru{~{€šŸ„‡´»Ž‡­­…ŠŽ•…jp”‹hk…†wrru}df|ya\hnkbZi€xcp“”€ƒ• Ÿ‘ž§–‡”ž–„‹~qv€xilvunnuzzzz‰ˆƒ†Œ‘™‹•¦‹v‹šŒxv~…ni€vh~Žƒxy€‡…vnz‚oakslddirslq…€ƒ’–•˜›Ÿž›™˜™”‹ŒŽ†}}~tpqlejjcdkjkttr|ƒƒŒŒ‘—––˜•–œ•‡Ž™Šy‹qvxtpmjntoinvvrtx{|xw{€}y{ƒƒ~€…ˆˆ‡‡ŠŒŒˆ‰‰‡‡…€„ˆ€{ƒˆ€{‚†ƒ}„€z{€xv|xv|}{}€„†…‚†ˆƒ€…‡€|‚†|~ƒ€}|~‚~€ƒ}~~}{xvvxwoouvppyzy|‚†‹‹‹‘•”•‘‹‹ˆ……ƒ€~}zwxvsuurswsqvyvtx{zy{~~€‚ƒ…„„‡ˆƒƒˆ…€‚„~}ƒy{ƒ~y}…‚‚‡‡…‡ŒŒ‰ˆŽ‡‡‰‡€€„}vz|urwxsswuvxwvy{{z|‚‚†Š‡ˆŒŒ’’‘Œ‹‰ƒ…ƒ|ywurpnoolkqupo|…zw‡‹ƒ‚‹‹‡…ˆŠ‡„„‡…‚€ƒƒ€„„‚„~€~{yyyvttwxuuy}€€€……„„†…„ƒ€€€{z~{y|}zz€ƒˆ„†Š†„†„†„|~„{|}~{‚}{†ˆ|z†„~{}€‚zw}€zz€}‚†„|‚yЇ}‚ƒ~ƒ}~€}|€}‡~}‡…|€ƒtƒ‰|{€|‚}‚~|~|{{{€€wxzz‚‚……‚„‡„ƒ„„ƒ€€€€~}{}|y{zy{z{|yz~~{‚}ƒ}€†‚‚‚„‚€„…€~‚|‚}~~}|}ƒy€‹yx‡…~}}||}|}~|y€|}€†}„ˆ€}„€}‚…†np¦Zxœ’oh“˜sqŠzyŠ}}Š{t†ƒyvz†}sƒƒ~ƒ†„„‚Š€}…‚|{ƒzx}|{z~€~|}~‚‚y…}€„{‚…~‚ƒƒƒ~ƒ†ƒ„ˆ‚p„n~Šw}w}‚zu}zz€u|v€v€|€z‰y|Š€|‰|ƒƒ}†‡z‹‚}„„€€~||uzƒwx}{~}€‚}ƒ†|€‹ƒw…‡~‚ƒ€€„…‚ƒƒ‚…‚€…€~‡z‚y|v{€w{}}€€€}ƒ„}}‰€x„…y~‚ƒ€x€†|xˆ†z€ˆ„ˆƒ€‚€€{‚{y~‚yt‚wtz~}~}‚†zz‡„wz‡{}ƒt€†||~‡‚z‚„~‚…€|„ƒ‚{ˆx€ƒ}~…„ƒ}}‹„z|ƒˆxƒ~z‚zv|ˆ|s|…€z{‚‡|r‰sy‹ƒzz‡ƒ}€ƒ|~‡~~…†‹{ƒ‰Œv†xƒxz‡€u}ƒ}zƒz}„y~€{~{z~|}€zy‡…s|‹‚|†„~ƒ„†‚…ƒ‚€{„|u~‚yy||~zy‚ƒu{Š„v‰„{„†ƒz‚†}~‚{‚ƒz|‚‡zu€ˆ{z~‡}|†ˆ{{€‡€†y‹„z~†…€yy‹†s}‡}z‚~z}…zy‚ˆv|‹Šuw‰Šzvˆ‰{y‚‡‚}€‡‚…ƒ†…„…†…‚‡ƒ€‚‚„…~ƒƒ€}}}}|}€}{~‚€‚ƒƒ‚‚‚‚†„€‚~|{}€~yy}€}}{{„„w‚‰uz–hr™ˆow~„‡rj‚‡wz~y‚‹~zƒŒ‰ƒ}‚‡yx‚„ysv{|xsw~€}|„ˆŠŠ†‡–‡~’—ˆ}z‚†|jqxwoinrwsnu}}{€‹Ž‰…‹”“ŒŒ“˜–Ž’•Š„™˜ns—Žfh{yqh]hwj^iqovvoxˆ„{}…Šˆ€|…‰„~~…ˆ…ƒ…‹‘”˜šœœ› ž”š~r„k\^eeRGS\XSXagntv}†‘“ž¤ž˜›  –‘–™’ƒy•¦S¨rOwŠvd]ez{e]s{xvpp€Œmu‡|no~rlt€ƒ€‚‡’™ššŸ¥«­ª¥¨«¦›’Ž‘Œ|ikncPLPULDHTZZ]dp}ƒ†š¡£¤¨««¦£¡š•Œ†‹Š}b|¨~A^·šBPš–h_o|‰dfŽpn~‰„sgo~ƒh[ntehu„‚‹œ¢¢¢¦­¶¸¬¥«²¥”ŽˆzsnbXVVODAKQJHUejjq~‰‘”›¢©ª¨¥¦¦Ÿ–’‘Œ‚}{z|tcd–˜TEž½eBƒ²„cr†Š‰whtŽ‹pgu…~phiu}n[`ykgv‚†‰‰Œ—¦©£¥¬³²ª¢¤ª¤’‡‰Š}lchk^IK\YHHU_^^fr}‚‡‹•Ÿ¡¤¥¨©¨£œ˜—“‡€€}ztqruqep—†P_°¢Q[£ ia~†‚yhcz†sciz~tmlqndvŒ†sv…‘’‘‘ ©¡š¡©©¥Ÿ–—ž•|ƒo`_hdTKQXYPLWeedhr€†‡Œ” £ ¡£¦¥ ˜“–•ˆ}|vrrw}wgtš™^]§¶_N—¨y\t€yvh_q„}`g}†xqvzƒŠ}o}˜w|“˜’—ž¢œ˜ž¤£š–“”•‹{y€{ndZdu^8Wp\HSaml_e{‰‚Š™ š£¨¢™“——‰~‚Šƒtqy|yxvjs›’PU ®WEƒ¤uSk|vj^o…„fa€Œyox…Št|—”z”‘‘•šŸ—Ž• œ‘‹“‡~z~€peejlbQRceSP\hiffp€…„Ž›ž›™§§˜›™‘††Š†~vy|yuu|{j|žˆRk®—NU˜˜^Us‚ug`fuucmŠ|v†’…”¢{‰œ”†…‰‡”ˆ†ŒŽ‰~€ƒ{qnlgilUMchQN^gjdbr……€…—ž£ª§Ÿš–އ‡‹„ut}}vosx{yslo‰‘gO|¥|?`›SYx‚ujhtˆŽ~o~•ƒ”š•Ž†ˆ–—w‘‰|{ƒŠŠƒ€‡‡†ŽŠ„‚ƒ„{pqtkdfd\]a`_aenpns‚Šˆ‹“ž¡ Ÿ¤ª§ žž—މ‰†~xstupjioqnmpvpoŽl^‚¡sSž‚^f‚‰ylm{‡‡zr‚–Œz‘“І…‹’}‡Ž†{€‡ˆ„‚‚‡‹‰„†‰Š‡‚‚}wrrum`dvcQbsc^fnzwly‘‰Œš£ Ÿ¥©¢››”’‚‚{spqsqmnotwrs}|o|•„_n ŒX_‘h^v„{qrx„‹„y†™™‰‰—›•’‹•Œ~ƒ‰|xƒˆz|ƒ†…€…‡ƒ€€~{yusurghrl^eokgho{{sz‰ŽˆŒ•šš››šž ˜”•“‹†„‚{vswwplrxumpyyttsp†mZ™tPr˜‚\kˆ‹zu‰Ž†„” ”ˆ›™‘ŒŠ“Œ~ˆŠvyƒƒzv{€|y}~|x|„}ntƒ|mpuvummwyssv}‚~„ŠŠ“—–”“—š–‘’“‘‰ˆ†‚~xuvvsppqrpnonks{pbv‡ep‡ˆvp|}˜Žˆ•—”Ž“–‘ˆ…‰Š„{x}~xqqxzspt{zvy~}~€„ƒ€~€{y{ytvvuuuuuwz{{}ƒ…‰Ž’”“••”“”’ŒŒ‰‚€wtusnlnlhkonmlny~qg}•~h}™}}–……“›‘‰’•’Šˆ‘‰ƒ‚……yuz~vpsxwsqv{{xz~€€€ƒ„…€ƒ}|~}xxyzxxwy{{z|€‚ƒ‡ŠŠ‹’‘‘‘’ŽŠŠˆ„|yvspolkjhikjilosnl{„vp‚ƒ{‰’Œ‡Š”’ŒŽ””ŠˆŠ‰„€~~|xtrtspoqrrssuyz{}ƒƒƒ‚‡Š‡ƒ†‡ƒ€‚€||}zxz|zz{}€€…ˆˆ‰‹Ž’’ŒŠŒ‰ƒ€ƒ‚zw|{sqtspnopqomqtsrvyyy}‚„†ˆŠŽ’’‘ŽŠ‰‰ˆ‚€{yxvsrpnoppnpsttvy|||„„……‡ˆ‰ˆˆˆ†…†…„ƒƒ‚~~{|}|z{{zzz{{zz{||}|~€€‚‚‚ƒƒ„„‚‚„„ƒ‚‚ƒ‚€‚‚€‚€€€‚€‚‚‚‚ƒ‚‚‚‚€~}}|||{{{z{{{|}}}ƒ‚‚„„„…††……††……ƒ„ƒ‚€€€~~}||{zzzyyxyxxyyyz{{{|~~~~€€€‚ƒ„„„†††…††††„„ƒƒ€~~}||{{{z{yzzz{{{{|}||~~ƒƒƒ‚ƒƒƒ‚‚‚‚‚€€€€~€€€€‚€€€€€€€€€€€€€€€€‚€‚‚€€€€€€€€~~~~~~~}~~}}~~~}~~~~~€€€~~~~~}}~}}~~~~€€€€€€€‚‚€€€€~~€€€‚‚‚‚‚€€€€€€€€€€€€€€€€€‚‚‚‚‚‚€€€~~~€~~~~~~~~}~~}~~~~~~}~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚‚‚‚€€€€€€€€~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~~~~~~~factPythonCard-0.8.2/samples/sounds/audiotest.au0000644000076500007650000005570507333604012021033 0ustar alexalex00000000000000.snd [¥@ggçççÓÍÍççg[[g[gççÛÛÛÛçÿ[[[gçÓÓÓÛÿ[[gÿgÿÿÿgçÛÛççg[SS[g[ggçÓçÛçSIIIAESMIS[S[ÿ[SMMMMSMSE>>>AEEIIEMEMSIEEA>>><>AAEEA>EEIIMSIAAEA>EE>AEEE[S[g[[MIIIAAAEEIM[[[g[[ÿ[[[[SMMIEMIMgÿÿ[gÿSSMME>A>>EAM<02%0ɺÓż¸A¼¬­§®¸ç[Ó>I:60$#""! $#+6/ÿɲ¾­««¤¤§©«¢ª§£°²ÁÉÛ:0-)66/2M6E>M>>E/4244.-2I>6:M¼[M¾¼¯²ÅºÓAç>4*+/8,(*/20AÍSÿÁgÿÛÛÓÉÍÉç[gÿÿgÓÛgçMS<ÿMSÅŶɺ®¯º¾ÉSA4%+&0*-,0>60...+(+'.88:>8/0/20880>Ig[gMEçÛÛÁÛ¾Óÿg[ÁÅɸÓÁÁ¾ÅÓÿI:.)(*++,648SSE<:4,))())0:AÓº´¯²°¼¸¾ÅżÁ纶®´¯­´¶ÅÓÛIÿÛÿ[ÓÍÓ[ÛÁMÓÍÅSSÿÛSEÓÛÓIçg><80*&,0*-E<:8IE-42/-+6ESÿ°¼¼¼¼ºÓÛg:>/8Û¾¼¸¦«¸¶ºÉ>[ÍMSÓ¸Ó¼®¼¾çÍ[24<:AgÅÉÁ°¶ÁÍÍg/>SAçºÅ[¸É>:::&.>4<ÿÉÛÿÍç><8/-4:>Û¾¼Å®¾SM<2!&6+,SÉçI¸Á>A>4$)2-/EgAÿS82.('&$4IA6ÅÛ464."$/)+8I:IgA<><-,<00SÿÓÿ´ºg[SM-:MI[ɶÁÁ´ÛçSE04I>Iɺ¶Á¬°ÅÉçÿ6AIEIÓ¼ÅÁ¸ÍçMM40Sÿɼ۲¾ÿÿ>8&)-'/8>AIÛM>>2*#'(%,2::SÛE<<0)%,&(6M>4##/#&2:>:ÅÛ8""2#)4E*)E-4IçÁÿ°ºÛÅ[[//M2<[ɾ۬²Íºgÿ20g2EçÓ¾Û¬¯ÅºÿS-2gAIɾ¼çª²Å¼ÉÓ/8ÿAIž¸Á¤­¾¾Áÿ04E2<Á¼¼¶¢§´¬«¼MÛ¾ÛÍ­¬°¬ ¨´¯®ÉESÿE>Á¼Í¼¯¶ÛÓÉ:/042,AgS[ÉÓMES4(&((!*:ÅI2:0( (20,0g8-22*#&% 4E:MçÓ>6I/*&$+&+>2$)-**EgIÓÁÁSMÓ<24+2/>[gɾ¯ºÁºÛÛ8AMAEŰ¼®ª«¸¾°[ÿS>ÛSͺº­´¨­´´ÓÁ6:IEAů¼®¨®´Á¶ÿII:gAÿÅŴŨ´¾Ágÿ.6A6>۴ɰ¬²ÉÛÁ<62,>4EÛgºç®ºÛÛAI&*6,6EÓS[²ÓM>I.%+)0*<ÛS¼ÛÁÛAS-0% A(6[çÅ[«ÉSg6'2IÅgI«ÉgE>>%>*/EÉSI­ÁE>:6"8')AÿÿA²¾>><26(&+*IÓÓA´¾>4:.<%&>SÉM¬«ÅÅÓÅ*.¾>>Ÿ¬Í¬­SM:M%*AAIÓ²¶º´ÅÿM>A.ÿ4EçS®M¼Áç¾6Éÿ:ÓÓçAÁºÛgÿ[6MÓÿ<[ÿSÉÓ¾ÍAÉgÓÛSM:ÿEÍÅÿ¼ç¶ÅÍÍçM.ÿIMɾÉÉ´®¶É¼[62,:46;¼²§¯¾ÅÛ8,/0g2S¸Á°Í¬¾[Û8M&>E.çgÍ;¾I>:-&*2+6çSÅÿ¾S4:'0%68-.+66:gÿ<>gI<:6*6:>MM<:>.222+Mg[¸¯¼ÍÉM2,0%06Egç¼ççA<44()ÿ,>ÁçÅM[6(/&.40ÿÛ®ÛçÉ:S02)(M2ÿ²ç¸Óç84< (M2Mº´¯¼©¶¼ÍEI6S:M¸[²ÉÛÿE¾0<Å2gÓ[Û<ÿ24E.:8SçÉ´Í[ç80-6,,g<Ó°Á´Í¾M,E'+M-gŸ¾[¾E>22*!M2[ºÉ¸M¼4:4+(+8A¼Iÿ¼>M+6$ >&:ÿgÁ>É806$4,6AS­M¸Égg.[!-g/ž°¸S©IÛM.4/AMÓ«Á´°ÓÍ:M)'ç-Mɯ²S«[E:-E"[/M¯I«E¾>/ÿ22,ÿ[¬Ó¾®I¼2:+%g0ÿ°¼¨É¯Ó<ç&:M6ÓͪºÓ¨MÅ640&S([²ÿ¨M¸[*ÿ6:)Sg«ÍÓªIº20.&I+Í´Á¬Á¾Á4ÿ#4>+MÓ°¾ÿ¯Mg4#8/<.Ó¸gÓ¾[Û*6%42)ç¾®ÛÁÍÓ,E"E0.4źÍE¶ÓM: E0:'g²¼ÿ¶[¾$Ó"S048´Å[ÛÓ¾,MÛ+E"®M².²Mg$"248!g¶¯:¾4°ÓÉ$¼ªE©#ª>Ó$'>28!¾É©&­/©I˜©˜ÓI.«[,š&¥޶Ų<¾-"’޼/¥S!›§Í¸4®Í¤–-˜œ8¾*­ -‰— ‡)8<§,8,ˆ)‘)8:¨4‡8¦ ‘ºÓ¯640ˆ™ Š[ž¢²4‡Ó/´gÛgÅ¥+ˆ¶.Û”(Ó'0 $&‡“²Íÿ"›ª•&ž—$!”6S/ˆ[ÓÉ0S20Šɬ)š4¾™ 6—'6‰AœŸœ ªM!É›<“–¾(Mª²Û&4SÛ¾'&)ˆ¼-"–M¦ŸÍ.œ!Ž–ç+œ+,.¢žçŸ0™ŽISÓ­6¡M¥S'ˆ˜¾ š/Áœ- ¸I¸‰°*¦¯#(¯–Å6¯ŽžM´›'*“ÉŽ*[A´Í8:´Óÿ/%ˆ²'>˜)¶ž,Ég¯2 ’‘¾S 2+>Ž«¼>*‰—ž 0&<œ¥!2Á‰ÿ™g­¨š¾É>™¶ [§ÿ²¶E®$Ÿ 4ŸE<²¼çÓç64ާ8ç8$4¥4Ÿ§M¦‹¡º"–¶Ó­!<ɉ¾ /§¨–´.)&Ž›¢ )Ó8ÿ˜¶%•E:´8:©¸ÿ4 «Ž.#«­ª<:´˜[ ©ˆŸÅ ´Á*’«É28+°‡& Á¬¯¡º‹¶$ª‰£.0Ó.¼­‰¸¾“'£$´´Iœœ•– !²Û°ÿ&§°<†›+ 'ÁE“­¯'6ç&¼‹“g S¨°/¾/ÅE>¼-™›/ÿ¬%IÓ*¼'82-‡¶ ®ÿ²º¼>Û(¥”(¨—¡ÓÛMÓ4 ¯<>„›º[¯Ž¼-ŽÉ+ š#Œ–£+‰¾¶-Ó ™,/ ˆ°©ˆ¬!°É§->Ɉ¡Ó ¤Ó’*g•6Ó¡ Œ”œ ‰—*2©§ÿ“Ó …˜ž,!‰”#ÓɾŽS°‰ž—¾>ŸºÅ#A¢6 …˜¥ÿ˜$I¢2¬£:’›žŒ¬§®E&¯¶ 'E„•ç$:Š•E¯(©'ž(—›Ÿ§(&š²"(&:)S„˜ª+“Û6(ž*¸-!’ŽŸ¬‹œ8Ó>›,+)IŽŽ› , –Å& œ¤ +8>+*Œ£‹®Aç­˜8/+ Œ©¨Ž¤ç£[ž&ÿ*$/“¥6 œ–ç'2œ«›%¯+”Žœ ª›-°«§!'¡¨: ©Ž¯$¶Û§œ¾/>ňºES—ŸÅÿS‘+Û#,)ƒ¨¢ ¶•š+¦%¼£S¡.#†¥—IÓ–(.–8M<+&>Ž–›©Û‘Á«[²ª-.E<#*…¾“’¯œ[—$Û8–« Ó ¦[¨:ÿ¾¯‰­É.-š™©ÿ""'-(ˆ”œI Ÿ‘•¤° E E$* ,Š&£ ¨I«>Œ#6)>[/¸ˆ°& š¥¬% ¯«ÉEª ˆ ¡¤Í¼ %))[Ÿ„˜’ ‡•“ª¤¤$6. ‰ÿ!ª&'>A:"%E¶°Aœ€Ž'S™Œ *ÅŒ-(S8SÍ!(‘’—%)[¥ÿœ>®' ˆº² :¯ž¯“6'¡8¼°:¼‡M¢ /ª¡—Í.Š2!¼4'8–œÁ 4›¬Áº‘))I¼§(%‰ç/²(¡ ç’°Í[:ÿº…ž™-°›™® žA¶S2# 0ˆÓ¥24¶Éž$Í"-",gÛœ‚”¸Ÿ–Š›Û¼Ž®M¡.¬g8›”—´/¥´<ŸÍ! ¬™¥! Ͱ[(4•ÿIE+-:%(—‰¶¥ ¢œ0Š#0/™ž¯!!+)I‘‰£6ªŸ¡SM™¯¾*A6 ¾˜¤4(‹0ž‘§A 4,´‰ ¢ (Mœ°)¸ŸI><#-…[—2 Å–£Å¢ª®« (!$‰˜–>) ,Ûž’Ág¾ ¢¯IMÓ ž“«8+ %• g®>%Sˆš”/竜2SÿÉÿ.2)–‹²< ÁSŽ0(/2›I%:†ž–%¯›œ¸-²¬¼¶0"“–‹º- gç‹<¾>¯–«)ÿÿˆ˜’8°¡“¶I®­œ°) ‰ž£& &ÿ‘ÅÍ>¯šž­-"4Š”¾" >Í‘ÓÿE®©Ó%ÿ‡§–AM™§Û4Å­žç¦‹¢©*E–çg4¼§¨4#$›—¬A EI82°º¨¢¢A' 0“™[ 4A—>ÿS¯¦> #-¾Œ•E¼/™A:ÁÓ¯ÿ$0¾‡˜’E¼­—¨Á­«©Í&A­‡œ“ÿ¨<˜¾8¯Û­Á"/Óˆž•Eɲ—¬Û­° ²'.A¯Œœ—I ª0–>6¸6°º"&››Ó < ‘<<«4¨Ÿ-!&6—‹šž/ #4&Ž4[¨.  0.¶‰©˜0 IŸ©M¥E­ªº# &Û‰š’ÅÉ2•S´®Á¦£!g‰¦š'$>žI©ªSžº¶!/ÿŽ–’¸"Á%“ÿ­¦Û¥¤!*!ÿ¦ŠŸ˜.S¤°¡¤ÿ´ *$2Û—¦/6 —Á­¨M°­E.%0¶Ÿ–ÿ.<¤º²g¸Á°! ÿ©Œ«–2IÁ° ®Í­Í«Ežž6!¯I¦¯A¬S¶&!(>¢”˜¬4%¨[®¯4¶A>!!#AœŸšÿ$$¬¾´¸ÿºÍ,(%0Á”œ“¾'.)©ª¤«º«¼:,$!-(E¯™¶+26¢›«¯É¯0.$%8´Ž˜º+-/¤Ÿ²ºÉ¼,*$$ 6°˜´20/£™£´¾gÁ00&+ÁŽ•¸0 (%¤Ÿ¨ºI>I/,#Û‘›•¯A %"›œ¢®AE8Û. I™–š´E ˜¥¨¶.E+Û'#:›­IŸ§Ÿ¯6S*´(+0¬ŸŸÉ)¨£—ª[ç-¶6A'-¼Žž™¶) *[œ—¥É82E¯80"gšŽ”£g(š£°*M'¬>ç%6¾Ÿ–¼ -gž—©A.,<¥8:!!A§Œ•ŸÛ*¨²$:)®¯Û()Í“—“¶!/8œž­>*4A>ÓAªŒœ›g*¬ªŸ¸":2¼¤A($ÿ–—“º" -,Ÿ¢¶E)8A0E:§Œ›ç$¯¶Ÿ¶$M-©ÓI*'¶ž–É  24£œ¸>60Û¾6(![–“•®6 &"Ÿ¤°:[M¶g*M˜‘•¨S #Ÿ› ­>EM¸>*M—’”¦[ !§˜ ¨çM[Í0+#Í”“’¤S "¥•š£¶ÿçE($#¼™•©6 +®“›®°0É, (¬š”°* 0¬’š°®+²0-Œ•–¸'A¥•˜º®,®+6 ‹•—º"S¥–˜Á®-¬+2‹•™ÉÓ°•›Û­%«!.¤Œš—Å>¼™œ[©&¸$",¶‘ž•Å* &´›ž¸¶'MS*))A—‘¨I ²ª›ªMÛ$¦:-­«•ç) -)¥”©¼ÿ'Ûº,:!>ŸŒ–ç!®­—ªI¾#£[É+!'g™•«Á ,œ¨²A[+ >¸+Í”¨‘´I 6ž¡¨¸>A<¢Iº.S—£”¯E$ 6¥¦²²6A<¢I¾-:œ›–ªÛ(«¶º².IE£IÛ-2§“šž¶´Ó£ª4¾8¬¼ÿ+ *´•¢–Á*! /-ÁŸ¸ÍÛEÁ¨[E/Ež•“¤Í°Ó¨¨<¶A¬Å[*!(0­šž–¶."/8¯Å¶çEŪ[[(#)/E¯”¦§6&ª¯œ©:¾6ŶA.!)窗–ªÓ/ §®ª§2º8´ÉM2&#"),¸›ž–¸2 4)°ž¼²:S:´[g, '+¼˜­œÛ(2MÁÉÓI2M¶çÓ2%) .I«”¨Ÿg'4SÛ¥gA8-<ÁÿM)$!")>¯—«žÍ ..IgžÓI:':Å[[, /ɘ¸Ÿg./<ÉžÅg>*IºÓ¾/&$6²–¬ÿ)2<ÍŸÓg®˜£˜¸+-E8² ¸É8E<¦º¬A! +:ºœ›˜®>%0(«®²¸(ç/¬­¼> $/Á¤—œ¦S''­´ª´(ÿ.®©¸[&/ͪ“§ç%*¬É©É'I%¶©ÁM)M¯‘¤£A-Aª¸¢Á>g2¯§ÁI(E²—²Ÿ<0Sÿ°šÛgçÿ´¨°ç&/Şŧ<".+Å ºº8ººž¤«Û&&$.M¸§­¬8 $Û¾ÿº,ç<§¨²Í"!"+g«¡šŸ¶A! ¼AE8:&ºº[:&>°¡žŸ¶/(S ®¦¾-S,ÓÍ6(#8¾˜¼Ÿgg¼«¤–«²¾É«©¼+ 0ÿ®:¸(&:,Á¥É²A´ºŸ¬ÓÛ'$&8ç«•ž¯>%-ºÓE:"E4¸¯[6(:¼«’°ž¼%I<çÛ¬<8SÁŸšŸ®<*!&))/()#!Û©°ºŸ£šœ¥¾)#+4º¥¯šÅÅ/$)ÍgÍM*6+E­<ÿ!'Sÿ²¾œ¾E¯Å6ç¸.6*8+ (8ɦ¦™˜™Í¦°¶ž¶Å¼2ÿÓÛ¼M:%%80:¾*[# '# 4:¬®ç:!/>Í´­¨“§˜Ÿ[žS­ ®Ÿ¬[SE2Á0"!0+Óç.8,-²ª¬¦¼¨«ž›¬¼,,8Ig8>Ó(S "*(8ÓSSM¾ÿž¤ºÅ/>çÿ¶¬²•´­ºg *ç4EE',4.º80'!/EÓ¾¥¥œš´²:0°É©§´®Í¶¼«­Óÿ'#*)4EI¬8­ç.Á$¶Å¼ªÁ¶[¶Û©¶[:#&.MͶۨ<ÅA8")%I4//ÿ6®ÉS6"*.Mÿ¾Å¾¯º&Ó%0Ó8ÿÍA064²S8)%46AI²ç80688ÿ:IÅɧ¶ç20<[ÛÓ¸°¤ªºç*&*+IS>E.8EI¼ç<(!+4IgÓ°£ ¬¼A6AA¾ÁÓÍASgSºM/&'/Eÿɸ¬¨´¶M:IE¼´ÁÁIÿÅç®Ó8,/06SS°ÿ/!->E<:¦Û¯¼)g(IÛçgI;²¾Û)$&6IgÛE²g¥ºAÿ-(6IEE2gÛ¾®É*+%8ÉÉÅgÓ¯¬°¾/'!.,846MÛ¸©º").>:M«°›ž´¨8ÿM¾ÉÓ¼<¶¶­®É)%!':/:0A¯­¦¯A8% --46<:É´®¸I, &+4022Û®£§°S/-#82:<:ç¶©¦¶6-#,*-./Á® ©´ç$),%&)%g¼­«Ó)%% &,¼¯ž¤¸Å++(-+,02º¤¡¡²:0&$&.´­šŸ°¶/,(&"!),Å¢›¦É[<**$#,:­¨˜š¥¥ÉE<.(%,/Ó§ž›£°ÅS0(!)¾¶›™¥Ÿ´Ûg.$ #8º¯¡¦®¯¼>-"6É®£®¨®¼Á/%"+Iͼ²¯¬¯Á>,"E/Ó´ÿ­®¯°¾M((!/(:EE¼¸¸Ó<,'<&gM:ÓgÁ¶´ÿ62!,4*6-,>gÿÿ:,*/>çMÛ8SÛɶÿM2,42<:/,/:ES:.(%M0ÓS/MÿA8MggE:..<ɸ¾´EÍÉÓ¶Û>2.:EÍÛgS[ÿÛÿE8//ÅI¯¸Ó¾ÉÅÁÁI,/(6ÉSÅÛ[ÛÓSE6)+4¾º­¥Û¯¸¾²ç<)*2<Á¾Å¾É¾¼ÓI4+)M[«¯§²®¬°°I-*$:Û¾­¸ºÁ¾ÓM6)')ÓS¥¨°¨´¸Áç0!'!0¾É­´ÓÉç<-$&Í碡Á­ÿEA/"#2º¸®¶EE/$!&¼ÉŸ§Û¼.)''**ÿ¡¬¦¼0/#! !).´¯›§¸M(#"-',8:¾¦¬®I#!(+/>6º£¢ª¶&% EMÿS8眫¢¬,I-4ÍÛç:E>Á¨²¸[2:AA[SA:8©ÅŸªSç,0AÓg:g6ͧ­®Û+-,0SÿME4M›«¡­':"(ççç>>4Å´ÁÅ0(,28[S<4)Ûg¸²M2*%-ggES0>¾¾¸ç+,..[[MI.,¤ç¢°&>!*A+:¶›¯$:0çÁÁES4º¶¶°86:2EAEA82ÅÍÁ¨S(8 2²Óºg/6Û¼¼¼<08&:A/Ÿ£MÍͬ¯¼/(Ó¸¯›¥ªM*-,++>ÛÅ>'<çSº¸¨´"60¾¯º¥©©¾8202-Iÿç2*8¯ Í>¼ç¶²( 26Í´ÿS´²ÉE(>ASASA0//IÉ[:MSÓÉ:8IIÅÅIIÍÿÓA-EMSE<<6-00ÍÛ68[>´É4gÍMºM-ÿÿAÓ:-É2486,+'*,œÿ+gÉÓž%º6>¼!ŧÉÛ2/M,8(>("*¶ŒA+¸¸É¨ž':Å(•¦%0/6-¼)4-)6𲝲+¬"ÉçÛÉ¢–S,¨:/*Ó.,2M'8ŽÁ*¥­A©Û'.¸´˜œIÿ¼+(.Û"ç2Ó#6‹&¯£§g¸:M>´¢–²2¼S"(MM$ª6ç礶­Á*Á*篚™gS¯+2Í./£>/¸• ¡¬¼I©(¯ž™¢gÁ°)0M/M£.&²  I0¦ž›¢¨Á¶A0&ESÿ¬-*¯™™›/2)¯ ™š°¬[60)%Åÿç«.2:‹ ¥ŽM+ÿÿ0š˜¸ž§4%<¸Í[®6%‰ ŠÁÁ,E¤”Åžž&S'/.žg©:#.®˜—<4'),2Áœ«­'"%#"AÁ¾6²."ˆ%Å«-<)¬’2šª0008ÅÉ:´É""IŽ “*Ÿ)+4œ²Å—Ó&E$S¼+ÿ :$/(‹ §Ž&š0ÛÛ¬©<—[+Å'",IÍ6ç°''0+‹ žŽ4”&Aç´ª<‘ES¼#($IÓ/¾ª4/g Œ%ˆ.œÁÿ¾.¨Aœ¯!®4Í4g>A¸8'2&Ÿ­ ‰²¬M¼2Åɬ*©$#:M/E¯Å.Û2'&‹[8”0­¾)ºÛ¡Û-®)²-ÿ0Sº%A,,—­ ˆ¾ —º [²%M´ž¾/$#Û/2<¼Ó4gI" ˆ-‹/“2¢ÓÉÅ´¶+¶<#²/+ÿ2Å:.I*"²”œ Ÿ›/®(&¤¯¨+™0²$M6>°6É>, ‹#‹,“2¬¾S¨Û®4¯++¶+/Û.ÍA4<(&¥£ Н ˜¦ g¬$&˜¼¶[œ*®&g<-¬:M88$‹ Å É•%ŸÁ°£.¼Á°4Û"g¾&Á8*A&Š ´Ž ɦ<¦<ªŸI©#[I%ç°6/[.ŽIÓ›*¥ÿ­ %®ÉÍÿ<Sç+>Í&/#¡§ ж¢› I¤:+šª#2Á6+Ó$[¼:04'(™S§ç¸™)Á«>2-g4>g,¼.+(6‹A¬ž ¯Ó:”'gšç4EM/4E,É>/A®ž •¨-)š!²('¥£ž®4I'M!8I<:Ó26ÿ•©>M¨*#Á¡6Íž8I6>(+6I,ç>A6ª¸£´[<¦*2g2/°¾>¬ºMI26,.çE:ÿES2¨:/¸¸MS¬8EgI8ºç:çÓç8E8:2IgAE<:AII.MÍÿEÉÅA>ÿ>>MMIMA8EAMç>08Ó:.448ç2AÁ¾Eÿ²M<çM8>MAEMÿA>MSI<4:<:,4EÛ4[ÁÉIÿÛgMS>EM><Åg:ççÿçççMSMgMSEÿçESgMMAÿ[:Sÿ>Sg[SÓçÓÓÓÍÉçS[>E>:2<>8çÿ[E[g[g[[[MMg[SMgg[[ggM[S>EMEE<[MgS><>>[gE:I[AEI8::EEAEI[AAÿ:6>SM6ESgg:ÿgES[çS/MÓI<ÿÛçgISgçMggÓM:ͺç4/IÉE4EÓç>EÛÿ::EgE<ÓE-<[¶ÿ)6¸ç:MIIIE6Û[E:ASI[IM[[>48SgE>SɼºÍ[ÿÿ[MII>8SÿE>SS::A4,I[42gÍMÍIÛgA8>MS2>çAIIIE:46EM2MS<Å[AMÓM[,46:6--6gA¶IM¸ÉMÉ­ÁɺÛ[gÛIÛSMÿ28çÓÛMçç²M<Á>>gS:[I8SÿMM4:S¾¼­­ÓÿÁÅ;EE[0,:,2ÁE:II4ÛM¼<¼ÉÓ2S.²[8ÁÉI[º68ÍE[g08S+*8-&ÿ28g:MÿMgçSÿÿIgMÿ®Å2ÉÍÓ¾ç[¦Í.Û®:,S$(,6[IIAS/AA:[g<<Ó>8ÅSgÅS>¾ÅÉgÉEÛºÓ>IMç>8/AM-Á²<´¯ÓSI-8E<<ÓMI¾Áÿ[ÿ<0[I6AE0:8820A:AçEA¼ÁçS804:I[ççÅŸ¼ÁÍÉÓͼ°ÅÛÍ>EMAEÍAIÁÅÛç[>çAçAE:*M8IE[Ó[MIMSIgSM[çÍÛ[ż°¬¸²ºSSÓSÅ´ÅÛSM¼gÓ´ÁÛ¼¼Ó²¼Á¾ÓMEA>>6AÛS[ÉMMgIS>4ÿ8,E.(.%(.'64*00.E/<824<40.+--.00,8-*:,68(,-&&+(+--2..62/2/468EA><:666.:646S8SSSgMEMMIÓgÓçgÿÍÓɾÅÁº¾¶¶º¸®´°­¯²¯¯¯¬®­´´²¼º¯´ºª«¬©¬ª©¬ª§¬®¬¯­¯¶¯²º²¶º¶¶¼¼¾ÅÁÛçÛÿgÛÿ[gEA:8:820><:A8:2./.*+*&)&%(%#%##$$!%!#%#%%'%)'(($%#%&,/.0+..--.,+/.420420666864:<A><<88446686464664//-./-.---/-//-.....----.--......///002244688:86:<AAAIIIIMM[[Sg[gggÿÿÿÿçÿççççççÛçÿÿÿÿÿÿÿÿçÿÿçÿÿggg[g[[[g[gggÿggggg[[[g[ggggggÿÿÿÿÿÿÿÿççççÛÛçççÛççççÛÛÛÛÛÓÓÓÓÓÍÍÓÓÓÓÓÓÓÓÓÛÓÓÓÓÓÛÛÛÛÛçÛÛçÿÿÿÿgg[[[[[[SSSSSSSMMMMIIEEAA>A>>><<<<<<::::::::::::888:888888888::::::::::888888888::888:::::<:<:::<<:<<:<<<<<<>>>>>AAAAEEEIMMMSS[[[gggÿççÛÛÛÍÍÍÍÉÅÉÅÅÅÅÁÁÁÁÁÁÅżº¾É¼º¸º¸¼¾¸¶´¸º¼º¾ÅÓÓçgç°´¼Íº´¶¼Û[ç¾ÅÓÍÍ[:.,/M­ª¯Å²´ç/*IEŬ¸E**çž©¾ÛA#'[º´«Í**Íš£[%-º¢¶S8"&,,E­¡ÿ,>,*.ɯÛ-86!'IÓ6'2[­© ,Á®ÿ)':¸çMÿ¨°:$[ÿ<:MÁ¢¨0Ũ­g:A¶ª¸º¦Ÿ¯ç[ºÍ¾ÍÓÅ«ž˜¾¯ª¨º::¼ ¬¬£Ÿ®Û[ÅÅ´¸º´gÛ­ž¼Á¸´Û2/ÿ©°º¾¸ÿ66[Mgÿ[A*>›Å86Ó8&¯²E/g>$<,-<:/%.œM&8+,§ÿ0M.2-)+/.6œ:6*A¥>.<+!É8,>88 )gÍš#6)A0,S«¯<..Í><ÿ 6gºS422[¶›$E¼¸>g¸¢¬[I¨©¸Ó¦Á>ͬ²çÍM¼°8´Á§¸4ŬžÛÉÓžºSÁªAI©¶ÓAEI¾œŸ*MºÍ+2稴M>¸Å/2çS*çºS-*%6Ešç,.É8.E°A./´42¼,#S8- )%>g˜%/)I,:>°+42´$&:["(S2.$) 6<•&*/º0><¯&:>²&'AS'8ÅA>'* 2¬œ+¬Áͼ¾6ÛÁÅ&,ÍMšÉM°®ÿ­¶¬ÍAIÉA>Ų¸ÿÛ00¼–É0ºIÛ¯ÛS¬¸¼ÛE>E.8ÛÓÅÓÿ2-­¨4/ª¸+ <ç8ÉÉgÁS,<2.2>çM[E0'8´Û'g­:&%I/)çS>>>>:>>>>>A>A>EEIAIAEAIM[SSMIMgSM[ççgÿ[SSMSMSSSSg[gçÛÓççÓÓÛÓÓÓçÓÓÓÓÓÓÛÓÉÓÛÛÓÓÛÛÓÓÛÓÓÓÓÓÛÛçÛÓÛÛÛçgÿççÿÿg[[S[[[[[[ggS[MMMSSMSIIIIIIIMEEAEEEIEEMEEEEMAEIAE>>EAA>AE>>A>>>>A>A>EEIMIMA>>EIIMSMMMIMIMMIMMMMSMIIEEAAEEM[gçÿSIEEIMSSMMIMSSSMMMIIMIIIMSMIIEEIMS[g[MMMSSSSSMSSSgÿÿÛçççÿÿggÿggÿÿÿgg[gS[gS[g[gg[[g[g[S[[S[[SSSMSSS[S[[[ÿggÿgÿgggggggÿg[SAA>>AAAEIM[gggg[[[SS[[[SS[S[MSSMMIIIEIIMIIIEEIAEE>AA>><<::::88642688:026>:>8266:8:E><>AIA:AS[IAISgSMMS[[SMSIMMMSgg[MMÛgSS[[çÓgM[gÿÿ[M[çÉÍçÛÓÍÍÓÛÉÁÍg[ÿÓÉÛ[M[ÓÛçgggM[çÿMEI[ÿÿ[gÛÛÿMÿÍÿgMgÍÿ[[[ÿMÿ[[ÿS[[I[IÿMAMMAgIMAESE::><4<6I<>>>:S<[>M[MgAMEA[MEIAEI<>I[MEMASEIMIgIIEMSSSAMÿAÿSSM[SMÿgç[IçSS[gçgÿSI[g[gS[SgMMSEEEg[MMMIgSIMSIç[>SgMSMM[MSEMAgIÿIMgggMSIÿES[AMMMAAEII[EAIAESEES>AgMMMSESM>MMI[AAME[IESIIMASMg[ESMSSIIEgMgSE[SgI[MgSgMIÿISSM>E[AEEE[>SSEMMSMEIMIMEgE[MSSS[[gÿ[EAIIEIEMAEEIEMSMM[MMSSSIM[E[>ESEMSMg[gM[g[[[SgSMSIMIIEIMIEAIS[M[SMSIgSM[M[[M[I[[M[MgSS[MI[IMMMSMMIMMISIM[EIEEMSSI[SMS[SgSSMMSIIAAIAEEEIIAEEAEIEAAAE>EMIIMM[MISMIMMIIEEAAAAEAAIEAIA>>A[SÍgçÿMÍ[M[[S[gMII<ÿ[¾SÛMIÅIgA>MÓÉÍÿ[MSIIMEE>>SÁÛºgMgEÍ>:44IÁ¾ÉÛIE>E>IAAE>gÅÁ²>g6>É48-+<[¼¶Ág6668><<::>IIIEA<82EžgÛ,<4-4-[ɯ©´ÅI-04IMSçÛÿSAAS¼¶ÿÓ,82/4,Eÿ¶©²Å>-26>AM[MIA<>M°¸¾²0Û6M6*AE¸­¸Ó/++.8:MMIME>2,ÁͰ¾Eç-É.2AI¸«©²8,),/,6<>AEE6++Á¯®¦(ç):<,>A¼¥¼ÉA400IAÿÓÓç[E8+%SŢŰ20ç0g4<;®¼SI2:2>IEM[ÉÛM>E>E¶º²¾M[IIMIg[SI>:AEISÓÓÓÛ[[SSES[[[IMIE>88:<AAEEMMgIMSIIEEEEIA<::88:8<6EEEMASIMÿS[MgI[gÿg[ÿ[çSSE[[ISgSÿ[ÿ[ÿ[[[çMMSI[IEME[ISÓEçISMÿIçÿ[S[AAMI[[IMMIIA>ES<ÿSMÛÿgIggçSçSgÿg[[[IAAçMMSMA8>:<:><[EIIEA[EIIAE[M[gÿÛÓgMIgEASA[M>8AIE>IAAMÿÿçÉgMg[I[>AEAIÿSA>çMAEAE4E>IEMEMSSMgMgSS[SgS>IIç[gMIA>S>AEgSEç[IE[E>E>A:AISMÿASggS[IÿçMMMççgEÿÓ[[MM[MggSçI[SSgM[[>>ASAÛSIMSSSMMMMAEAIÛIS[[SIg[AEMIEMSMI:ÿgIEM[ÓgSESIIM8I>I>AEEAIM>>A>S<>SS[gSÛÿÓççÿgSMSESI>E<:EAI>SS[SS[ÛSÿ[gSÿ[I[ÿ[MS8gM[ÍÍÿçMÛçM[gIggEAIIMIMSSE:IS[SI[ÿgç[[M[[SMAIIgM>ÿII[SgM[ÿ[IAIEMIMEE[S>>S><8>>EMIEII[ISSMIAgÛ[M[SgMAIII[EM[[MAIII>:><IEEAgMS[gg[Sgÿÿ[EM>>>>AAISEIMSMMM[MçççÿÛç[SSE<>EAE>IIES[ÿg[gSgSMMIAE>A>>IçSSMM[[MIIISg[[[MMSMIAEEEISMMSgÿÿgÿ[gggSMIIIMIEEMMMSMMEA[ÿMISMIMg[EIMIISSII[gSSgSMgÿSSMA>662,2:SÿgSE°º¾M+$)[Ͳ²Ó<:042>IIç>E<>ª¸º:*&2¸Í¾[<8:[¥­¶.%$4¼Åºg[AAMIÛE,).8MÿÓ£²ÿ&$%<¸[¶SEAMÍSÅ:(+-Sç¾²§Û>)(8MÉ[¾ÿgSÿÛÓM/$+°ÿ¼ÛEgAÓgç0#+0Ó[g©©Í6'$EÁÿÍÛIgSÿ;8'',ÿÛÓ¬ É:& SžMÿI[ÓS¼É8#!*SÍÛ«£Û2"gº¾ME6AME¶É6 *SÉÍŸ§[*+ŬÁMA:ESM°Á6/ÛÓÁ›«>$2¾¨ÉI>6A>[°Û+/gÓ¼®68º¬Ó:[EÿÍA[¾¾8*+<ÿ[´¢ªM$.¼¼g>SÛçIÛÛÛ80)/4ES¶Á§¬>#-0ººMAMÛ¶SÓÍ[:6/<:>II6çš°.%#g¬E,4Á«¼I8ÉÛ//0[M>>8*&<—¤E""[¯g*A°¬É/0Û¾A.<[:26g>#/«ž¾&68°ÿ.Å´´04ÿçÿ08g>/*IM-.gš®00-ºº(#>Ó²gIÿ¶[/,2g:>Sÿ8#*Éœ­4I<ÛM)ͺ°EMÛÍA68Eÿ2M[<6,-[«´[E¸ç[2%:ÿ<çÿÓ®ÍgAI[:4EIA44Aç°ç>ÓÉÍg.*AIEggÿ´ÿçMES>4<8<:6Ig²ÓA[Áçç2+ESAgIÿ¸gMSEgM4A>>86ESÁÅE<Á[ÛE2>ÿ6EAgÉÍSgÿM<:>SE466<>Å[Mgç[g:4ÿgIçS[ÁSçÛggI8E><66:6[¸MEÉ[ÉS/:gE[[ÿÓÍ>M[SM>.>Û>E>S<42422ç«S<ÅSÛ8+EÅÛÿ<<><-.M¥ÁS>©M6/:ÁÛ-Á´Å<2Óç:.gÁ[2ES2&+S£Å<>¢<,0EÉM(º¯Í.:¾[2,Ó¼E.gg/"-M¯®2I¡2//S[A2º´Í*ÿÉA/4ÉÍ<8ç[-#4<É¥:ç°Ó/.[:S>[²É4[[ÿ04ÿÓIESÿ4'/.E°´Eg¨0:A8g>E¼¼ÛESÉ64AÛ[EM[<,+,2Ó¡<Ó®Í4/M:>MçM,0ÿÿAM[S/*..Aº´IÅ©:4M/>8<źÛ[ÿÛ8,AMEI[M:../0IªIÓ¯¼:>>446IÁÁSÿÉÿ*4M<<[IE60/4:ÁÅI¾¦>SI6/84ÓÍÉÿ¼¾86M>8gIEA:8:6ÿ­<ɨÅMçE860MÛÁÿºº[:ÿ>6IAA<8:84E¯IS¯ª8Á[A266ÿg[Á¼ÅAÿI<4E646846:g´/ɧÍM¾Í<:.MI[M¸ÁÉ>Í[2:<066022IÉS2´¨4ÍÁÿ.4/ÿ4/[º[ESçA0A:00<246[°6Ó©¶8°ÅM84Aÿ0:Ág>AgE44E606:42[¶/ÿ§ÍS¾ÅÿA:[g68çMA<8:A82¶[4¶²SÁÉÓÓ4Iç:0EE:8A><A>EE>EIIIM[S[ÿççÛÍçÿçÿ[ESMAE[>E:M>:IMEEMMSE[gggÿçg[g[MSMSAIIESMI>EEIE>>>AIASMS[SÿMgSSS[MgMESI>E>I>EEES>MMEMMI>[S[[Mÿ[MMg>SMIgISMIEM[E[SISSS[çMÍ<>[MMM[IM:g2S[SEEA<0Û:ÅISgg:MESÓSIM:M[AIMÛ<ÓÿEçççEIAÅA[g[MÿE<6>2ÿA[çMgg2çÛ<¾ESEÛA[EAIME:SA[EççIMI[E8g8Ó:gAgME[EMMMIISMIgEM[SgEMSESESEÓEIçAMMMçA[[>çMMgSMççgMÿMII>>EA>E8>A6SM:>E:4::<06<çÉAÛ®ÉÓ¾ÓÿAAMM6IÓI>MM:088/.8gº0ɦÅSÉÓI08[[<>ºÍÛÍ/$4Á[/ç¢ç-ž(*IM*+ÅÅ2&4I82g­¾SÉÍA+Ag-,A<6ͪ.ͦÉ:ÍÅ4(:A62g°ÓÛÅÉA2EE/,:88g°Eç°°8gÍ<)6>>:Û¸¸Û¸É[E:M6.<:0E¸É4¸¬:EÉM)2AE4[ɺ[ÁÉÿÍÁEg¼ÿ6SÛA8[ÛSAçÍM:MM2062-,2IE8Ó´ÿç´ºSÿÉS<[SMIMgSAMM<4:6/06SgAE[MAAE>:>IgSçÅÅÓɼÉgg[MAAMSMggSSIA>>>>EESgççÛÓÛÿgÿgS[SMSSS[SSSMA>><88>>AIMMgggççÿÛçgg[SSIEMAAAIA>EIA>A>AAAEEIMSM[gSSg[SSSMIMIIIMMISSSSMIEEEEEEEIMSSSSggg[gÿ[S[SMMMMEIMMIEEE>AEEIIMSSggÿÿçççÿÿgg[[SMSMMMMMMMMIIIIIEIEIMMMMMMSS[[S[S[[SSSSSMSSMMS[SMSMMIIIEEEIIMSSS[g[[gS[[MMMMIIIEEIMMSIMSSMMSMMSSMSMSSSSMMSMSMSSSSSSSSSSMMMMMMIIIIIIIIEEIEEEIEAEMMM[[ggg[[SSSSSSSMMMIIIIEEIEIEIIMMIMMIMMMMMSSSMMSMMSMMIIMMMSMMSSMSSSSS[MMMMSMMSSSSMIÛSgMIMS[MIEE[gSEAIIIIIIEIIEEEMS[gÿÿçÛÛÿÿggg[[g[MMMMMIEEEISSSIAAEMSSMIS[ggSIEMM[[MMSMSSMIEIMSS[[[MIMMIS[[gÿgÿg[MMMSMSSSMMIIIAAAAAAAA>>><M[g[[[[g[[SgÿÿçÿS[[MSIIIEEA>:::>>gÿÿgSEMMMIEA[[ÿSEEAAIEEIEAA<::SMÓÓÍÛ[[g[[EEgÿÿÿM>A>AAMMMM[MI:6ç͸¾ÅMESSI>8<ÿÉÅÿI4<:A>>S¾²´ÍM8SMME>:AA:/2ÛÓºÓ[6>ÅÁ¸ÅgEÿÛçA:4[¾®¾S4/442><8.AÛÁÍÿ<:S[M040綪ºg20Eg>:<:MME6Óº´ÅÓ>AgS<,//Ͷ­ÉI--4:2A¬ÍÍ<>0[I4&*4ͯ¬¼çA/8.0,::I<<:´­¸EÿMÓ¼I.&Eÿ¦¬®ÓÛ>8.,(4A8<28S£Ég/MAÓM(#-ç´ª°ÉÍç86),2SA>>A秪Ó0Í[Åç(!*ɾ¦¸ÁÍÍ<*$(+>>26:I¼¡I8[Óçg.+ÿ¸«®­º°Û-,./EM8ÍŸÿE6ÅMM/#>ɺ°¯É²S,(*,4:8:IAg£Íÿ,®SÅ8"$Aº¾©­°®Û2*+.,:46>>:­¾E)¸EÍ2!4Ûÿ¬°®¯Û.,-,-:6ASSS¤¯S2®Û¾4 $:Óg¬²ªºÿ.,)(*428AAA ¼>+ºçÁ0&Aÿÿ¬²ª¶[44.)2AA>S¯Á°´[68*&-40688>²­S8¼g°M"'8>EÓ¥ÿSAžÍ4!4><ÍÓÓ¾ÉSS>E8[[g<Ó<ÉçA<[IçÁg[gSMÿ>>824S:M:S8ÍgEAA:>><<600:g>IAçÛÍÿIgÛÿÛÛgÛÿES[IISMM48M<:<>EçÿMÿ[ÍÓÿ[ÛgÿÿgÓ[EASEM>>E<<8<:AA>[MçIÿSÍÛEMgSg[IÛMSSEIAEEE<EAÿAISMÿÿM[[[M[[MÛIIçI[MIAM8III6EES8<>M[ÿAgSÓÿMIgSçg[ÛgSIÛISMAAE8>A>:<Í:SIAÿ[SA[IMgg[gIMIIMEA>>AIA4:Å<ÛEÛMÅÛ<6º<ç:çAÓg.<:M[çEÓM[:A>8><­Á¸0Û:ºS-<8640+$-Iͺ–¾ÿI.g, S¯¦¼ÍE:<:2-"#:¸ºÓ˜SÓ%ÛI4,Ó¬¯º¯[8ç>*."'IÁÿ¾Ó/!4)<<-ÿ«®º´g>ÿ>---+gÅɾŸ¶Mº#[++2¾ºMÉA02+&()&>¾Ûͪž:(ç4ÿ8><¯©¶¯¾A:S0-./E¸ÅS¼—[0"ÿ,E.%Û«­É´ç4I8.<:AÁ¶ÿE©¥EÍ*[*->¬¨º­Ó>2<,-,(+ç>>2“0(!Ó/28(¸¶ª¸ª¸EEA8E-6gÅSS©¦4[&:!%'ÓÓ[¶É¾2/A6E/.ÓÛÍÛ‘Á<¢[[+-Á¼¸6§¼M+)/+#%)E/<Û‘2'6¬ÿ46.¬ÿ²Û¨A0)-6:*8Ó›'<[:'(¸,>°Ÿ­.ç[860I[2/¶¡™2.°[<2.<%A¬´8*g0%%-4//E®ž MÍ¢ÓÛ8ÓÛS:ç©Ó:8>'#$'# 4Mœÿ+>²ÓAEÛ¬¯¾ªŸ¾AÉÿ<6/660.<<Åÿ(,E082:SMEÿºççÁçÛÓÛgçÍÛ¾º°ÅS[A0/020.*6>20A>MÛSÅ´´ÅÍÉÅçI[Sÿÿ[S[S4IE6EA>A8/42><<>AIMÿ[žÍÓ¾ÁÉÓIMgS::6EI/88:<88>SM2çÿS[Û¸ÉÛÅÍÅÁgSÛIAg[8ç<>2I26/40A6I:I>gAIEg¶gÛ¾¸A¸MÉ[¸6ÓAM>Û<<66A8680AAA>S>SI[ÿ¾ÿ[ºÍÍÓM¾>ÓÉç[<Í8ÿ4[II>S:g[IESI[[MÛAºgÓÿçgÿç[ÓEIçS>Ó,g6MEMAg>Û:ÛçAÿgÍ:çgMIgMMS:II:A4EIEgAE[MSEAIA[ES4ÉES8ÉEÛAç[I[8ME2SA:SAM:gIgAgçgAÁ0Ó8É2SMS[I[IgSEÅ>MIÿE[I0çI[0Á/gS8Ûÿ[2ÛMI>Û8S>SçAMAÓIIÓIMMMIÛ:ÛSSSÛIMEgEAÍ6ÿM[[S[A>ÿEEÛ:MÿAAÍIE[ÿ[>SçSMS<[ÿAMgMSSM[IMMgMSM[[ÿ[[[S[MSIIAEEEE:AMEEESMIEIAE:<466>SÛÓÅÍÓgÿEIAI>SS[IS[M>642:<ÿS¾Ó´ç[S:EAEEEISI[gM<00:8EI´¶¶ç804>ÿIE6:AçÅÍ6/0<°¯Å>8EIIE>>00IÓÛ<./Í«2"0Ó¾g>8MÛÅÓÓE8'*4AIMEœ¬­),ÍÁSA0Á²Å6AM[4(+8I¾ºS(E›¬/ #IÓ®Û&8Û©[E')6­™¯A*>ɼ<.:Á¯Û>4A¾¼Û8(*I¯°I#)Ûª«­>0'8>Ig[ÿÓçg>>IgÉÍ[-):ŲÉ/!&2Í´¶Áç[6E4EçÓÍMEMM[E>AIgMA>8SÓg6*,<Û¾¾´Åg4A:AÓÉÅIA<:SÉM4208çÉÓÅÍM:E/<º´Û:EISÉÉS<8:Eg>EgS6400Aÿçÿ>:ÛçÅS0.ÿ¶Ó[g8IÉÉÁ[86:SÿÿI628204AgEI<4M¼²Áç>ggÓ´ÁçgMÛÍMA648<<<22.:A:EAMS[çÿÿº¶ºÍÓSÛ¾ÁÅÿEEMS[A2''/:>A>6>ÿÛÉÓA6A>MMÿÛÓÍÉÓÅÁ¼¶¸Åÿ>>MgÿÛÍÛç[Ûº¸ÅÓAA[çÍg>426<60,'08EME::>AgÓÉÓÓ[[ÿͰ¯°Óg4M¾ÉÉg:4E:>0)&(-8:>2:E[SSSÓ¼´¸Åÿ¼¼Á[M-<ÛÛç[A>ÿççS4/4AAçS6<<<:8<çggçç¼®¶ÛM->ɺ´ÛA4gÛÓS0*8EEMIAISIE>AS¼ÁÿÛ¾®ÉI.*[[MÿÿÓgI660E[ÉÍɸ¥¼g2!:ÿÛÓ><>ÉÛI6.0gÛMIM[ÿSE6/+2IgÓg¾ªgg4"0,,4EEEÿ©Ag-#.4A6ME۸IA24çAS[ÉÍÿgS[:2/8:SÓÿ­ÍI66&>4/04-.0>[´S6468I.).:ÛɼÉÛÍÓ[SIESÛÛÅÉÍÍ[SEA4:8:ME8:>:EI888EÛçççÍżÁÓÛÿççgSMAA822//244:>EIMg[çÓÛÛÓÓÛÿÿg[[SSS[[ÿÿÿggSIA>:88626>MgÿÿÿçÿÿÿÿgggS[SIIMEEAE:8:8>>IISggÿ[[[MMIIAE>>:>EMM[ççÉÛçÿçÿÓSgM[SSSMIIAI>AAAAAAA><>:AEgSÿçÍÉÍÓçÿÿ[ME>A:<>>EAAIEAE>IISg[gÛÿÍÿçSSMMAEAII[MSISS[Sg[çSSS[MIIA>AESEI[gçÿgS[Sÿ[SSgSç[gI[SgS[M[M[M[MMIMEMIgM[MÿMÿ[MEIEI>E>E>MIMEMM[IgMSIIEEE<:<:<:EAMIç[çgggg[ÿ[MSSÿ[[SgSMSISEEEAAE>>>A>>>AMMSSÛÿÓÿçS[[[IIEMMSMMSS[SSSSSMSSSIIIEEEEMSISSÿ[ç[SMSMMIIEMMMMIMMMIMSMMIIMMMIIIEEEMSISMg[[[IIMMEIEEESIMEIMIIMIMIIIIIMIIIMIIMg[ggÛçÛçgÿg[[SSMMSSSMMSSSMSSSMMMSMEIIEAAEIIIIgIgMIEEEE>E>AEIIEMIMMS[[[[[g[SMMIEAAAAIIM[SÿggM[S[SMI[M[SSSSS[[S[SSMSMSIMIIEEIISSg[ÛgÍçÿ[ÿggISMSMSSSMISSMSSSMMMMEEAA>><<>EAMMgSggSSSM[MMMSS[SMSSS[MSSSEIIIEA>EA>>AESES[ÿçÿç[ÿg[[IMIIMIIIEMMSISM[MSMSIIAEEE>AESI[Sçgçÿg[[[[ISIIIIMEEIIMISISIMIIEIAA>A>>>IMSMç[Óÿÿ[[SSIMIMISMSMIS[[SSSSMMIMIEAAAA>AASISSÿÿÿç[gSS[IMIIMMIIIMMSM[SSISMMEIEIAAAAAIMSSçgÓÿç[[SSSSEMI[SSMM[[[[[[SMMIMEIAEAA>AASIgSÓgÓçggg[gMgIMM[SSMMSgS[SSMMMIIEAAAAA>>AMISMÿgçÿ[[[S[I[EMISSSISS[SSSSSMMIIEEAA>A<>>MI[Mç[Óçg[[[gI[IIISSMIIMSMMMIMIIEEAA>>>><>>II[SÛgÓÿÿ[gSSM[EMESMIIIIMSMIMMIMEIEE>A>><>>ESMSÿçÓçÛgÿ[[[IMIIMMMMIMSSSMMSMMIIIEAEAAA>>AI[[[ÛÿÉÛÛg[[SSSEMISSSMMMS[SSSSSMIIEIEEAEAAAASgggÍçÉÛçgg[SS[IMI[SSMIMM[[MSSSMMIEEEEAEE>>AMgggÓÿÍÛç[[SSMMEMISMMMIMS[SSMSMMIIEEAA>A<<A>>>ES[ggÓÿÍçÿ[SMMESEIEMMMEIIISSMMMMMIIEEEEAA>A>AEgSÿ[ÛÿÓÛg[[S[MSIIIMMIEEEMSSIIMMMIMEEEEEEAEAEIÿ[ÿÿÛÛÛÛ[SSMSIMEEIMMIEEIMSSSSSS[MSIIEEEEAEAEIg[çgÛÿÓÛg[[S[ISIMISMMIIMM[[SS[SSSSIIIIEIEEAEI[gggÛÿÍÛç[[SSMSEEAIIMEIEISSSSMSMMMIEEEEEAAAAEIÿ[ÿ[çgÛç[SMISIMAAAMIEEEIISSSSSMSMMIIEEEEAEAAESÿggÿçÛçç[MMIMIEAAEIMIIIM[[[[[SSSSMIEEAEEEAAAESÿ[[ÿgÓçÿMMEEEI>AAEMSMMMS[gg[[SSSSMIEEEEEEEAEE[ÿÿgçgÓçÿMMEIEIAAAIMSMMSM[[[[SSSMIIEEEAEEAAAAES[çSç[ÛÿgMMEMEMAEASM[MSSSggg[[SSMMIIEEAEEEEEAIÿ[ç[çgÓÛgMMEMIMEEESS[SSSS[g[SMIIIIIEEEAEEEAA>Sgg[çSÛÿÿMIEEEMIEEISgSSMMMSSSIIIIMMIEAAAEAEA>>çÛÛSçIÍÿÿEAEIEÿIMEIMSSMIIMMSSMMIIEEEEAAAEMIISMÉÓÓMMIgSSIIMS[çÿg[IMMMMSSSSSSSSMMIEEEEIIMSMMMSÿçÿg[[ggg[SSS[g[[[SMMMIIMMIIIIIIIEAAAEMMMSSMMM[g[[[[SSg[[[[SMSSMMMMIMSMIIEEIIIIIIEAEIIMMIMIIMSSMSMSS[[[S[SSSMSSSMMMIIIIEEEAAEIIAEIIIMMIIISMSMMMSMSSSSSSSS[[S[[SSMSSSMMMMIMMMMIMIIMMMSISISIMMMMMMMSPythonCard-0.8.2/samples/sounds/plan.wav0000644000076500007650000016516407333604012020155 0ustar alexalex00000000000000RIFFlêWAVEfmt "V"VdataHꀀ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~€€€€€€€€€€€€€€€€€€€€€~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~€€€€€‚ƒ„ƒ‚€~}|{{{||}~€€‚‚€~~€€€~~~~~~~~~€‚‚‚‚‚€€€€€€€€€€€€€€€€€€€€€€~~~~~€€€€€€€€€€€€€€€€€€€€€~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~€€~~~€‚‚€~}}}}}}~~€€€€€~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ƒ…ˆ‰†{wuuvwxz{}‚ƒ„„…†‡‡„~|{{|~€€€€~}}}}~~~€‚ƒ…‡‡†„‚~~}}}~€€€€€€€~€€€€~}|{{||}}~€€€€~~~~~~~€€€€€~~}}}}}~~~€€€€~~~}~~~~~~~~}}~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ƒ‡‹‹‡€ytqpqsuwz}€ƒ„„„†ˆˆ‡ƒ€|zyz{}€€€€~}|{||}~€€‚…‡ˆˆ†„‚€}||||~€€€~~~~~€‚‚‚€~}|{{{||}~€€€~~~~~€€€€€~~}|||||}}~~€€€€~~~}}~~~~~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚„‰ŽŽŠxpljjmqux|‚†ˆ††‡Š‹‰…~{yy|€|zyyz|}€‚‚ƒ„‡Š‹Š‡„‚€~||||}~€‚€~~~€‚ƒƒƒ‚€}|{zzz{{}~~€€€€~~~~~~€€€€€~}}|||||}}~~~€€~~~}}~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~€€€€€€€ƒ…‰Ž‘‡}smhghmrvy~„ˆˆ††‰‹Š…~|zy{~‚€|ywwxy|~€‚ƒ„„‡‰ŠŠˆ„€~|{|}}€‚‚~~~~~€‚ƒ……„ƒ‚}|{{zz{|}~~€€€~~~€€€€€€~~}}}}|}}~~€€€€€~~~}}}~~~~~~~~~~~€€€€€€€€€€€€~~€€€€€~~~~€€€~~}}~~€‚…‡‰‹“‘ˆ|ogcbdksx{€†‹‹ˆ…‡‰ˆ…€}|{z|€ƒ„‚€}yustux|‚„†††‡‰Š‰‡ƒ€~~}~€‚‚‚~||}~~~‚ƒ„………ƒ‚~|zz{||}~~~~~~€€€€~~}}}}~~~~~~}~~~~~~~~~~~~~~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚‚‚‚€€~~~~~€€€€€~€‚€€†—™|k_Z[`hpu|…Œ‰…‡‹ŽŒ‡‚}zxz~ƒ…„ƒ‚€{upopsx~„‡ˆ‡‡ˆ‰‹ŒŠ†‚~}|{|}€|yxz|}~€‚„…†‡ˆ‡†„‚|zyyz{||||||}~~~~€€}||{||}~~~~€€~~~}}~~~~}~~~~~~~}}}}~~€‚‚‚€€€~~€‚ƒƒƒƒ‚‚€~~€€€‚~€€„‰’œ¡š‹wfZTU[gpvˆŽˆ„ƒ‡‰ˆ…}~€…ˆˆ…{vnjjmsz‚ˆŠŠ‰ˆ†‡ˆˆ†„‚‚€€~{wuvy}„‡ˆ‰ˆˆ‡†„‚‚}||}~~}|zyxyz{}ƒ„……„„‚‚~}||}}}}}}}}}~~~~~}|||||}~€€€~~~~~~~€€€€‚‚‚ƒƒƒƒ‚‚€~~~~~€‚ƒƒƒƒ‚€€€€€~}}}~€‚‚‚€€€„‰’ž¤ŒvcVPS\hqw€Š‘…ƒ†‡…„‚ƒ‡ŒŒˆ‚{voigglt}†Š‹‰‡„‚ƒ„‡‡†‡‰‹Šˆ…„|{yussw|€‚ƒ†‡‡‡†…„ƒ„…‡†…ƒ‚€~{yvutuxz}‚„……„ƒ‚‚ƒƒ‚‚€}|{zzz{{{|}~€~}}~~€‚‚‚~||||}}~~~~~~~~€‚ƒƒƒƒƒ‚€~€€€€€€€‚ƒ„„ƒ€€~}|}}}~€‚‚‚ƒƒƒ„‰‘›¡œŒvd[X[cmu{‚‰‹†~ww}„ˆˆˆ‡ˆ‹Žˆ}{wrnmnsz……ƒ}||~‚‡ŠŒŽŽŠ†ƒ€}{yxwwx{~~~ƒ…ˆ‹Œ‰…ƒ|zyxwwxy{{|}}}}|}}„†‡‡†„‚}|{{zzyyyyzzzzyyyz|~€‚ƒ„„ƒ‚€~~~~~~~}}}||||||}~€‚ƒ„„„ƒ‚‚‚‚‚€~~~~~€€€€~~‚„„ƒ€}|}„Š‘šŸšŠtc\Z_jv}„ˆŠƒxppx„‡ˆ‰Š‘“Ž…}yxurprv{……€yustuy€ˆ‘‘‹‡„‚~€€€€~zxwvwy}‚†‰ŒŒ‹‰†ƒ‚‚‚‚‚€~}{zyxwwxy{~€‚„……„ƒ‚‚‚ƒ„……„ƒ|{ywwwwwwxy{}€€‚ƒ„……„„ƒ}|{zzyzzz{{{|}~€‚‚„„…„ƒ‚€€~}}~ƒ„ƒ€~~€ƒ„„…ˆŒ‘—œ–†pa^ais|‚ƒ„ƒ{phjv‚Š‹‹‹‹Ž‰€yx|~}|~„†„wolnsw|ƒŠŽŽŒ‰…‚€ƒ†‡‡‰Š‰†ƒ€|yvttvx{ƒ„„‚€~|{|ƒ†‰ŠŠˆ„}||}~~~||{{{|}~€‚„„„ƒ‚€€€~|zyxxyz{{|~€€€€‚‚‚‚~|{{{{|}~~€€€€‚ƒ‚ƒƒƒ€€€€~}||~€€€~€‚‚‚„…‰–š‘€meejt{€€€}rjfn{…Šˆ†…‰‹ƒ}{€…††…†‰Šˆxpnqvz}€„‡‡ƒ{y{„ˆ‰Š‹ŒŒŠ†ƒ€~€‚ƒƒ‚{ywxy|ƒ…†„}|~ƒ†‡‡‡†„‚}|}~€€€€€}|zz{}€€~}|}~€€€~€€€€€€€~~~~~}~~~~~~~~~€€€€€~~~~~|{|}€‚„ˆŒ‡|roqu{‚}zvolnv~ƒƒ€€ƒ…„‚~~€„‡ˆ‰‰Š‹‰„~ywy|€‚‚‚‚~yvvx}„……………„ƒ‚„…†††††…ƒ~}}~€€~}{zz{}€€€€€ƒ„……„ƒ‚€~}}|{zyyzzz{|}}}}~~€‚‚‚‚€~~}~~~~~~€€€€€€€€€‚€~~ƒƒ‚€~~~‚†‹‹„ypmqy…„€{xvtrsv}‚„}{|ƒƒ~}‚…‡††‡†…}|}…‡†ƒ~|{z{~ƒƒ~~€€€€‚ƒ„„„ƒƒ„„„ƒƒƒ„…†…ƒ€€€€~~}||}}~~€€‚‚ƒ‚‚‚‚‚€~~~}}|||||||}~~~~~~€€€€€€€€€€€€€€~~€€€€€€~€€€~~~€€€‚…‡‰Š‡€yvw{ƒ‚€}zwtsvz€~|zz{}|}ƒƒƒƒ‚ƒƒ„„‚‚„…†……„ƒ‚€~€‚ƒƒ‚€~}}}}~€€~}~€‚‚ƒƒƒƒ‚‚‚ƒƒƒ‚‚‚€€€€€~€€~~~~~~~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€~~~~€€~~~~~~~~~~~~~€€~|}€€}€€~~€~|}€~~ƒ‚€~~~|}€€€€€~}~~~€€€€~€~~~}~~€€}}€€~~}}€€€~|}€}}€€~|}‚€~~}~€€€~}~€€}|~€}}~€}~~€|{€„‚~|~‚}|~‚€~}~€€€~|~}}~~€}}~~}}€|~€€~€€€}}€€~~~~~}}~~}~€€~~€€~}}~~~}~€}}€€€~~~~€~~€€€€€€€€€€€€€€~~€}}~€~~~~~~~~~~~~}}€~€€€~€€~~€€€€~~€€~~€~~€€~}€~€€~~€€}|~‚€|{}„ƒ|}ƒ‚~~€€€~€€€~~€€~€€€~}€~~~~}}~~~}}}~€~}}€€}|}€~}€€~}~|}~}€~~~€€€~~~~€€~€€€€€‚‚‚~€€~}}€~}}}€}}~€}}€€~~~}|}€€~}}€~}~€€~~€€~~}~ƒ€~€€~€~~~~~€~|}ƒ€}|~}}‚~|‚€~{~‚|~€~|}ƒ€|}€€}}‚‚~~€€}~|{~€~}~€€~{~€€~|‚}~€‚}~ƒ€||ƒ‚€~~€€~€‚}|ƒ‚}{}‚…}z~ƒƒy{€‚}z~ƒƒ~z{~~‚€~…{}€ƒ}}}ƒƒ}€ƒƒ€}~€€}~€~|~€}}€€}{~‚ƒ{}€€€€~~€€}|}€}}~€~€€~~€‚€€}}€~|}~€}{~€}|~€€~|}€‚‚~|~€}{~€}€€€~~}€‚|}~€€€€€€~~€}~€€~~€€~~€~€~€€€~€€~~€~€€€€~€€€~~~~~}~€€€€‚}}€ƒƒ~}‚ƒ€~€€€~~€€€}€€€~€€€~}~€€~~€€€€€€€~€€€€€€€€€€€€€€€€‚€~}~€~~~~~~~~~~~~~~~}~~€€~}€€~}~~~€}}~~~~~€€~€€€~~~~€~€‚€€€€€~€€~~€€~€€€~~€€}~€~€€€€}~€}}€~€}~€€~}€€€€€€€€€€~~~€€€€€~}~€~€€€€€€€€€€~€~€€€€€€€€‚€€€€€€~€~~~~~~~~€~|€~}€€€€€€€€€~~}€~~~~€€~~€~€~€~€€€€€€€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€€€~€€€~~€€€€€€€€~€€€€€€€€€~~€€~~€€~~€€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€€€€€€€€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€~€~~~~€~€€€€€€€€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚‚‚‚€~~}}||||||}~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~€ƒ„„„……„ƒ‚€~|{zyxyz{||}~€€€€€€€€‚ƒƒ„……………„„„ƒƒ‚‚€€€€€€€€€~~~~~~~~~€€€€€€~~~~~~~~~~~~}~~~~~~~~~€€€€~~~€€€€€€~~„‡ˆ‰ˆˆ†„‚€}|{yxvsrrtwyz{|}~~~}}}~€ƒ„†‡ˆˆˆ‡‡‡‡†…„ƒ€~~~~~~~~~~~~~~~€‚ƒƒ„………„„„ƒƒ‚€~~~~}}}}}}~~}}}}}}}}}}~€€€€€~~}}}}}}}~~~~~~~~~~~~}}}}~~~~€€€€€€€€€€„‰ŒŒ‹Š‡ƒ€~|zxvtrpmlnrvy{|}€€€€~}}~‚„†ˆŠŒŒŠˆˆ‡‡…ƒ~|{{{{|}€€€€€€€~~}}}~~~€ƒ…†‡‡‡‡‡†…ƒ‚€}|zyyyyzzzzz{||||||}}}}~~€‚ƒƒƒ„„ƒ‚€~}||{{||}~~~~~~}|||}}~~€€€€€€‚‚‚‚„ˆ‰…€|ywusqomljkotx{}€€~}|}}}||}~„ˆŠŒŽŽŽŒ‰†ƒ‚€}{xwwwy{}ƒ„„„‚€~~}}}~‚„‡Š‹ŒŒ‹Šˆ†…ƒ}{zyxxxyz{|||{{{{{{{|}~~€ƒ…†‡‡†…„ƒ‚~}}|||{||}~€€~~}}}~}}}~}}~~~}}}~€€‚…Š‘——”Œ„{uqpnkkkkigglu|€‚„„ƒ‚}}|||‚€…‰ŒŽ‘ˆƒ~yurrssrqrtx|€„‡ŠŠ‹‰‡„‚€€ƒ…ˆ‰‹ŒŒ‰…}ywvutttuwxz{}€‚ƒ‚€~}}||}~€‚‚‚‚‚ƒƒ‚€~|zzyyz{|}~€€~~}}}}~€‚‚€€€€€€~~~~~~€ƒƒ„…ˆŽ”—“Žˆzsnllkjlnonlou}ƒ††……‚€~|||}†ˆˆ††ˆ‹ŒŒŠˆ„€|wsomnquyz{}€„‡‰ŠŠ‰ˆ‡†ƒ€€‚„††††‡ˆ‰‰‡„‚€}zwustvy|}~~‚‚‚~|||}‚€€€~|{|||||{{{|~€€€€}|{|}~~€€~~~€€€~~}~~~‚‚ƒ„‰‘šŸš’ˆ€wmfbaabfmssqry‚‰Šˆ…ƒ‚€|{{|€†Ž“’ˆ‡ˆ‡ƒ}wspnmmlms{„Š‹‰‰‰‹ŒŠ‡„ƒ„‡ˆˆ‡‡ˆŠŒ‹‡}{zzxutux|~€„‡ŠŠ†‚~}€€„…„‚}|||{ywvw{~€ƒ†ˆˆ†„€}||}}|zz{}}|{{|}~~}||}‚ƒƒƒƒ„„ƒ€~}||}}|{z{|}~~~ƒ…†ˆŒ“¥¢™‹|pgc`__`emstqory‚†‡ƒ€„‡‰ŠŒ‘™›–Š~wttsolkkouyyy{ˆŒ‹‡„…‰ŽŽ“•“Œƒ}zywtqprx}€€~~€‚„„‚€ƒ†‡‡……‡‰‹Š…zxxwuttvy|}}||‚„„„ƒƒ„……„~~}zvsstvxyz{}ƒƒ‚ƒ„††„‚€€€~|{|||zz{~€ƒ†‰‹’«±§”}i]USTX^ait}}smo{†‰ˆƒ‚„‰Ž’•“‘‘“ƒqb^bjpruwz}€}yy‡ŒŒŠ‰‹””‘Œˆ††ƒ|tljntz||}~€‚€}y{€†Š‹‰ˆˆ‰Šˆ„€~}yvwz}}zxy{}}}…ŠŒ‰„‚€~}{zyyzyxvwz|}{zz|ƒ…‡‡ˆˆ†„€}{{}~~~~~}}}€‚€~|}€ƒ…ˆ‹“Ÿ­­œ‚i\URSYekmryxkdjz†‰ˆ‡ŠŒŽ‘—™“‹ˆˆtf_eoy~‚~zvwvtu{†‘•”Ž‹‡ƒ€~~zvtv{€‚€{wvx{~€„‰Ž‘Œ‡‚€€}}€„…‚||{{yvutv{€…†…ƒ‚‚€}zz|€~|zywvtttw{~€ƒ…††„‚€€€€ƒƒ{xwxz|~€‚„…ƒ€|{}~€…‹’œª³«”v]RQUZcou{€„ƒvieo€ŒŒ’–𛓇|zxsjbdn|†‰†vppsvx|…™š•Žˆ…„„ƒ€|{}€ƒƒ~~€€~yusw~†ŒŒŒŒ‹ˆ‚}z{~‚ƒ‚€€‚ƒ€|xwwyzyxy}„„~}}~€‚ƒ…†„€|yxxxyz{}€ƒ„„‚‚‚‚ƒƒ€‚‚€~~}}{yyy{~€€€€~~}{~…ˆŠ‘¬²£‹oYNLUbr|}~€ƒ~oeer‚’’•“‰{qppolkpx‚ˆ‰ƒxnjmv}‚ˆ–™—‘‰‚‚ƒ‚€„ˆ‹‰„{zyyxy{‰Ž‰…ƒ‚€~}}ƒ††„‚~}zxy{€}~€~~~€‚………ƒƒ‚|yxxz|~€€€€~~ƒƒƒ‚~}|||}}}}}|}~~~~~ƒ…„‚…Š’ °±Ÿ„fTLMXhy|{|xlejy†ŒŠŠ“„ummoqqtz€…ˆ…~skiq|„‰Œ’’‰ƒ~||€‚ƒ‚ƒ‡‹‹‡€zuttwz}…‰Œ‹†~€€‚„††„€}{zyyz{}€ƒƒ€|yxy{~€‚ƒ„„ƒ€~~}|{{|}~~}||}~ƒ„…„‚€~~~€€~}||~€€€‚…‡„€†Žš«³¥‡gRLPZj|†‚~|{pgixˆ‘Љ‹Ž„tjjoux|€„…ƒ€{tnlr~‡Œ‰„}|~‚……†‰‹‰ƒ{tqqsyƒ…†‡ˆ…€}|~€‚ƒ„„…††…‚{yyyz}€ƒ„„‚~yvux}„……„ƒ~~~~~~~~~}}~}|{{{|~€‚ƒ„„ƒ~}~€‚ƒ€~}||}~€‚‚‚‚‚ƒ…†„€€†¬¯ž`NLUcr…€{z}ypimzˆ‘ŽŒŠ‰‹~ngjs~ƒ……ƒ~{xspqyƒŠŒ‹‹‰†ƒ}}€„ˆŠ‹‹‰„}uqqty„‡‡†„ƒ€~|~ƒ„………………ƒ{xxz}€‚ƒƒ‚{xvux}…‡…ƒ€~~~~~€~}|{zzz{|~€‚‚‚€€€€€€‚‚€}|{{|~€‚‚€}~€ƒ†‡…„…Œ—¥§–z^OO[n}…‚{wx|yrlp}‹”–‘‰„…‹Š}nhmz…Šˆ‚|yyyxusu}†‹Œ‰†„„„ƒ‚~€„‰‹Œ‹‰…€zusuz€…‡‡…ƒ€~„‡‡‡†…„„ƒ}{z|ƒ„ƒ|zxwwx|…†…‚€‚~|{{{|}‚ƒ‚‚€€‚ƒƒƒ‚‚‚‚€~}}}~€‚ƒ„…‡ŠŒ‹— š†mZUXdt‚‡~snsxwqov‚Œ‘‘††‰„xmlu‰‰„|urtxywvz‡‰‡ƒ‚ƒƒ€ƒˆŒŒ‰‡„}xvwz~‚…†ƒ~~~~„†‡‡†…ƒ‚‚}||‚……‚}zyxxx{‚……ƒ€~~€‚‚‚‚‚‚|{z{|}~€€~~€‚‚‚‚‚€~~~~}}~~~}}~€‚ƒ„„„†‰˜¤¨™~bRRYix„‡€zwzxqjlyˆ‘’‹‡†‡‡‚xlhp~ŠŽŠƒ|wtsttuy‰ŒŠ‡ƒƒƒƒ€€‚ˆ‰†‚~xutx}‚…‡…~||||}€„†‡‡†…ƒ~|{{~„†…‚|zxwwx|€ƒ„ƒ€~}}}€‚‚‚‚€}zzzz{|~€€€€~}}~€‚ƒƒ‚€€€~}}~€‚‚ƒƒ‚ƒ‡Œ• ¨¢ŠlTNXi|†ˆuqsxvpms•’Œ††‰ŒŠrjm{Œ”‘†{tstvwwx~…Љ…€ƒƒ†ŒŽŠ…~zwvx}‚…†„€}{|~~€ƒ†‡‡†„ƒ‚€~}}‚„…„~|zyxxxz}ƒ~|||}~€‚‚‚‚‚~|{{|||}€€~~~~€‚ƒ„ƒ‚€~~~~~~~~€€€‚†Œ•£žˆmXSZhy‚†vqsxwrot€Œ’‘ˆ‡ˆŠ‡~slo|‹“†{tqsuwxy~„ˆ‡ƒ~}‚ƒ‚€€…‹‰„~|zyz~‚……„€}||}ƒ†‡†…„ƒ~}|}‚……ƒ€~|{yxxy{}‚}}}~€‚„„ƒƒƒ‚€}|}~~~~€€~~~‚ƒƒ‚€€€€€€€€~~~~€€€€ƒ„„‚ƒ‡Ž–Ÿ¦…hTS]n}……}uqtwtolt‚‡„…ˆ‰„ymgoŽ“Œwqprtuwz€†ˆ…€|}ƒƒ€€„‰ŽŽ‰„~{xx{„†…‚~{z{}~~€‚…†…„‚}|||~„……ƒ€|zxxxyz~ƒƒ€~~~~ƒ„„ƒƒ„ƒ~}}}~~~€€€~~}||~€‚‚€~~~€€€~~‚ƒ…‰‘𤤒x`TXev†‚xstxwrmo{‡‹†…‡‰†}qhjwˆ““‰}uqrsuvy~…‰ˆƒ~}€‚ƒ~‚‡‹†‚}{y{„‡‡„€|{{|}}~€ƒ…††„‚}||}€„‡ˆ†ƒ€}zyyz{}€ƒ„‚~}}}}~€‚ƒƒƒƒƒ~|{|||}~€€~}}|||‚€€€€~~€€€€€€‚ƒ„‡”£Šp]W^kzƒ…€xtvyvrot‰ŽŠ‡‡ˆ‰„zoio}Œ“…{ustuvx|‡‰‡‚‚„„~ƒ‰‘Š…‚|zy{ƒ……‚~{{{|||~€ƒ………ƒ}|{{}€„ˆ‰ˆ‚}ywwxy|€‚ƒ‚~}||}‚‚ƒ„„ƒ|{zzz|~€~|{zz{}€‚‚€€~~}}€€€€€€‚…‰‘™ ¢•}fWYdt„ƒ|vuxzvpow‚‹ŽŒ‰ˆŠ‹‰sjit…’”Œxttuuvx}ƒˆ‰…‚ƒ……‚}|…Œ‡ƒ€}{yy|…†„~}~~~||}€„‡‡†„}{z{~ƒ‡‹Š„~zxxxy{~€‚‚‚€}||~€‚„…„|{z{}€€~}}~€‚‚‚€€€€€€‚ƒƒƒ‚‚„‹”¤žŠq^Y_lzƒ~yxz|zsps|…ˆ‡†‡‹Œ…wkfl{‰Œƒ{wvvuuvy~ƒ…„ƒ‡‡„~yy†ŒŠ†‚{wuvz‚ƒ€€~|zz|€„†‡‡…ƒ€}{z{„ˆ‹‡}zyxxy{~€‚ƒ‚€~}~€ƒ……ƒ€}{zz{}€€€€~}}}~€€€~}~€‚‚‚‚ƒ‡•œ¡œˆq_Zalx~}xvx|zuqt}„ˆ‡‡ˆŒŽŒ„xmio|‰ŽŠ‚|yxxwwwy}ƒƒ‚…‰ˆ„~yz€‡ŒŽŠ†ƒ€}zxx|€‚‚‚‚‚~{z|€„‡ˆˆ‡„}{z|€…ˆ†‚~{yyyyyz{|~‚€~~}}~„……ƒ€~|{|}~€€€€€€€€‚‚ƒ‚€~}‚‚‚‚‚‚„Š’›¢ xdY\es}€~yvw{|wssz‚‡ˆ‰Š‰|ohkx†Ž†{yyywwx|€ƒƒƒ„‡Œˆ€yw|ƒŠŽŽŒˆ…ƒzwvy}€€€‚„…ƒ{xy}‚†ˆ‰ˆ‡„€|z{~ƒ‡ˆ…€}{{{zyyz{~€ƒ„ƒ€~}}‚…†„|{{|}~~~~€€~}|}~‚‚€€€‚‚ƒ†‹’™Ÿ›ˆr_Y^hu||yxy}|vru}…ˆ‡ˆŠ’‡zmhmz†Š‡€|{zywuuw{~€€€ƒ‰ŽŽ‡~xx}„ŠŒŒŠ‰ˆ…|xxz}~~~€ƒ†ˆ…€{xy}‚…†‡ˆ‡…‚~€|zz}€~{xxz|~€‚ƒ„‚€€ƒ‚~~€€~}|||~€€‚ƒƒƒƒƒƒ„„…‡Š–žŸ‘|i_`fouzzyy{~ztu{ƒ†††‰Ž’’‚vnnw…ƒ~|}}}zxvvxz|||€‡ŽŒ„|z}‚†‰ŠŠŠŠ‰…zwxy{{z|€…‡†|xxz}‚„……„€€|xuvz~€}yxyz{{}€ƒ„„ƒ‚‚}|~ƒƒ~}||||~€€€~}€€€€‚‚„„…†‰˜ ŸŽxe^afnswxxy{~{vru|‚ƒ‚ƒˆ”“Œsmqz‚„}|~}}zxwxyzyxyˆŠ‚|z}ƒ……‡‰‹Š…€|{{|zxx|‚ˆ‹‰„||}€ƒ†ˆ‰‡…„ƒƒ~zvux}ƒ„‚~|{{zz{~‚„…†…„ƒ‚€~{{|€„……ƒ€~{zz|}~€€€€€ƒ„…†‰Œ‘˜š‰ue_agnrwxyz{|ytqt{‚ƒˆ’‘‰~uprz€}}~~}yxxyzywvyˆŒ…€‚ƒ„…‡ŠŒ‹‡‚}}|yww|‚‡Šˆ…~~~~‚…‡ˆˆ‡†…„‚~zvux~‚ƒ~}}|zyz|€‚ƒ…†…„ƒ‚€|zy{‚ƒƒ‚€|{yz{|‚€€~~€„…ˆ“™ž›‹yhbcflosuyz||yvrty~‚‰‘”“‹xsuy~}|}€€}|||{xutw~‡ŽŒ‡ƒ‚‚‚‚ƒ…ˆ‹‹ˆ…ƒ‚€}yutw}ƒ††„‚€~}}~ƒ…†‡‡†…„€zutw|€€€€€~|zz|}€‚„„……„}zyz}€‚ƒ‚}{zz{|~~€€‚ƒ€‚„ˆ“™žš‹zlfdglpsuy|~}zxz}~~‚ˆ“’…}yy|~|zz|€~~~}{wtru{ƒŠŒ‹ˆ†††…ƒ‚ƒ…‡ˆˆ‡………„}ywy}€‚ƒ‚ƒ„ƒ‚€‚ƒ„††…‚}ywx{|||}€~}{|}}~~€ƒ„…ƒ~||}~~€~}}}}}}}~€‚‚ƒ‚‚‚ƒ…‡‹•š–‰|ojgilorsvwyzzxwx{}}}„‰Œ‹†}|}}|zyz{|~€€}zwtux~„‡‡†…………„„„„………„ƒƒ„„ƒ~|{|}~~~€€€‚ƒ„ƒ€}{{|||||}}}}|}~‚‚€€€€€€€€€~€‚ƒƒ„†ˆ‰Œ•˜“Š~tomnoqtvxyzyxvw{}|}€„‡ˆ‡…ƒ‚‚‚€}{z||}}}~€‚‚€|yxz|€€‚„„„ƒƒ„†‡‡†ƒ‚ƒƒƒ‚‚ƒ‚~~~~~}}~€€€€~}}~€€€€€€€~}}}~€€€€~~~~~~~~}}}}}~~~€‚‚‚‚ƒ…†ˆŠŒŒ‰„|zxy{‚„ƒ}zxwxy{{zyyxxy{}€}{{{}}~~€€€€€‚€€€‚ƒ„„„ƒ‚€€‚ƒ„……„ƒ‚‚‚ƒƒ„ƒƒ‚‚€~}}}~~~}}||{zz{}~~€€€€€€~~€€€‚‚‚€€€€€‚‚‚ƒ„†ˆŠ‹‰…~{yy{~‚„ƒ}zwuvxz{zyyxwxy|€}{z{|}~~€€‚‚ƒƒƒ‚‚‚‚‚‚‚‚ƒ„………ƒ‚€€ƒ„††…„ƒ‚‚ƒƒ„„ƒ‚€€€}||~~~~}|{{|}~~~~~~~~~}}}~€€~€€€‚‚‚ƒ„†‰‹‹‰…}zyy|‚„ƒ€|ywuwxz{zyxwwxy|~€€~}{zz{|}~€‚‚ƒƒƒƒƒ‚ƒƒƒ„ƒ‚‚‚ƒ„„ƒ€~~~ƒ„„„ƒ‚‚ƒ‚‚€€€€€€€€~||}~~}}}|{{|}€€€€€€~~€€€~~}}~~€€‚ƒ„†‡ŠŒ‹‰…~{z{}„…ƒ€|yvvwy{|{zyxxxz}€~|zyyz|}}}~€‚‚‚€€‚‚‚€‚ƒ„„„„‚€€€ƒ…††…ƒ‚‚‚ƒ„„„ƒ‚€€€€€~}|}~~~}|{zyz|~~~~~~€~~~~~€~~}}~€€‚‚ƒ…†ˆŠ‹‰†‚~{yz|ƒ„ƒ€|xutvxz{zzxwvwx|~€€~|zxwyz|}~~€€€‚‚‚‚‚‚ƒ„„…„ƒ€€ƒ…‡‡‡…„ƒ‚ƒ„„„„„ƒ‚€€€€€}}}~~}}}||{{|}~€€€€€~€‚‚‚€~~~€€‚‚ƒ„…‡‰‹ŒŠ†‚|zz{‚„ƒ|xussvxzzzyxwwx{~€}zxwxz|~€€€€€‚ƒƒƒ‚‚ƒƒƒ‚‚ƒƒ„„„ƒƒ€~ƒ…††„ƒ€‚ƒƒ‚‚€€€€~}}}}}}}}|{{}€€~~€€€€~}||}~~~~~~~€‚ƒ…ˆ‹‹‰…‚}{{}€„…ƒ€{wtstwz||zyxwwx{~€€~|xvvwz}~€€€€‚ƒ‚€‚ƒƒƒƒƒƒƒƒƒƒƒ‚€€€ƒ…†‡‡…„‚‚‚‚ƒƒƒƒƒ‚€€€€€~}}||{||}}||}~~~~€~€€€€€€~~€€€€€€€€ƒ†‰‹Œ‰…~{zz}„…ƒzvrqswz|{zywuuwz~€€~{xutvy|~€€€}}}‚ƒƒ‚€€ƒ„„„„„„„ƒƒ‚‚‚‚ƒ…†‡†…ƒ‚ƒƒ„ƒ‚€€~~}|zz{||||}~}}|}~~~€€€€€€€€€€€€€€€~~~€€‚„†Š‹‰†‚€}{z{‚ƒ‚zvrpquxz{zzxvuvy}€€}yvuvy|‚‚}}~€‚ƒ„ƒ‚€‚ƒ„………„ƒ‚€€‚‚‚ƒƒ„…†…„ƒƒ‚‚‚ƒ„……„‚€~}~~~}|{{{{|}~~}}}~~~€€€€€€€€€€€€€€€€~~~~€‚…‡‰‰‡„}||}€ƒƒ|xusrtvy{{zyxxxy|€‚‚€}zxwy|‚ƒ‚~~€‚„††…ƒ‚‚ƒ…††‡†…ƒƒƒ„„ƒƒƒ„„…………„„„ƒƒ„„„„ƒ‚~~~~}}}||{{||}}}|||||}}~~~~€€€€€€€€€€~~~~~~~~~~~€‚„†ˆˆ‡„‚€~}}~€‚~{xusrsuxzzzzyxxy{}~}{yyz|€‚‚‚€€ƒ„„„„ƒ‚‚ƒƒ„…………ƒ‚‚ƒƒƒƒƒ‚‚‚‚ƒƒƒƒƒƒƒ‚‚‚‚€~~}}|||{{{{|}}}~~~}}}~~~~€€€€€€€€‚€€~~~~~~~~~€€€€€ƒ„…ƒƒƒƒ}~€~~}{xvwy|}}}}}|{z{}€~|{{|~‚‚€€‚„…†…ƒ‚‚‚‚ƒƒ„„ƒ‚€€‚ƒƒƒ‚‚‚‚ƒƒ„„ƒƒ‚‚‚‚‚‚€€~~~~~~~~}}}||}}}}}~}}}}}}}~~~~~~~~~~~€€€€€~~~}}}~~~~~~€‚„ƒ‚‚€~||€~|yvuwy{{||}{zy{}~€€~|{{{}~€€€~}}}~‚„…„ƒƒ‚‚ƒ„…†††…ƒ‚‚ƒƒƒ‚€€‚ƒƒ„„ƒ‚‚‚‚ƒ‚‚€~~~~~~~~}}}~~€€€~~~~~~~~~~€€€€€€€€€~~~~~~~~~~~~~~~~~}}~~~~~~~~~~€‚‚€€‚‚€~}}~~~~~}}}~~~~~~}}}}~~~~~~€‚‚‚‚‚ƒ„„„„„ƒƒƒƒƒƒƒƒƒ‚‚€€€€€€€€€~~~~~~~~~}}}}}~~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~~~~~~~€€€€€€€€‚€€€€€€€€€‚‚‚ƒƒ‚‚€€€€~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€||~‚~~‚€}{}ƒ€}}€~}~€€~€€~}|||}|}~ƒ}}~~~~~}|€~~~|~€}|}}|}€}}€{{~~|‚}z}€€}|€~‚~z}‚‚~x}‡„~w|ˆ||€}}‚€z}€‚{x€}{z~}z~~|‚„{z…ƒ€}}€|‚z}ƒ~|}‚~~‚~}ƒ|„€uˆ€z‚€}|ƒ|ƒ{‚|€€~z‚z€€z‚‚~€yƒ†z‚€~€ƒ{~€€~|yƒ„{|~~ƒz‚‚~€‚}„~~‚‚~~~ƒ~|~„}{|€†wz‚‡xx„„|r}†€zx~€~~||€€|{|€~€€{{‚„|y~‚‚zx…~x{~~zy~‚zy~z}}}~{~}|~}~~€}‚~|~}‚~z„y~ƒ€}{„{}€†~y„‚~z|†|}€‚~{}‚|{„€~|z‚{{}|‚|~~~}€{€…}{‚‚}{€‚‚}y„}~€~~|~‚{yƒ†{w|††|x}…ƒ|z~‚‚~~ƒ€ƒ~€€‚‚~€}‚~|‚€‚z}€‚~€z…€}{€†‚zy~‡ƒ}~~„ƒ|{€€€}~€€||€€€{|‚€~|~ƒ€{{~‚†~w{„|x~~z|~‚‚||~ƒ}{€‚„}}~€}~‚€~}}€€~~}}€€€€|}€~‚~~~~}}~€}~€~}~~€€~‚€€~€~~ƒƒ€~€}{}‚}|}}{{}~€€~~€~}~~~€€‚‚~}}„‚}~~}~€ƒ‚€€€~~~€‚€€~€}€}}~€€~{|}~}|~€€€~~‚€~€}~€~}~€~}€~||~€~€€~€€€€€‚€~€~€}~€€€€€€€€€~~~}~}~€€€~€€€ƒ‚€~~€‚‚€‚€€€~€€~‚€~}~~~€€}}€€}|~€‚€~€~}~€€€€}~€€~}~~}}~~~~ƒ„ƒ~~~~~‚ƒ‚}{yz{}}||}}|zyyz|||||}€€~€€‚„„„ƒ‚‚‚‚ƒƒ„„„‚‚‚‚‚‚‚‚€€€€€~~~~}}}}}~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€~~~~}~~~}|{}~~~~~€€€‚…Š‹…~{{~„††„zwvy|€~~~}{z{|~~}|}‚ƒ‚}}€~ƒ†ˆ‡…ƒ‚ƒƒ„…†‡‡…ƒ‚ƒ‚€‚€~}}€€~~~}}}~€€}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~€€~~~~~}}}|||}}}}~„‡ˆ†‚~zz|}ƒ„…ƒ{xwy|~€~~~}{yxy|~~~}~€‚€€€€€ƒ†ˆ‡†„ƒ‚‚‚‚‚ƒ…††…‚€€€€€€€€€€€~€‚ƒƒƒ‚€~€‚‚‚€~~€€€€~~~~~~~~~~~~€€€€€€€€€€~}}€€~~~~}~~~~~~€€ƒ„……‚{yy{}~€|ywwy|~~~}}}}|zyz|~~~}~€‚ƒ‚€€€ƒ†‡‡†„ƒƒƒƒƒƒ„…††…ƒ€€€~€€€€~~~~}||}~~~~~~€€€€~~€€~~~~~}}~~~~~~~~}}||}}~~~~}~}}~€€€€€~€~~€€€€~~~€€~~€„‚|}‚ƒ}}‚€~~‚ƒƒ‚‚ƒƒ‚}~‚‚€€}}~€€€€€€€€€€€€‚‚‚€€€‚ƒƒƒƒƒ‚‚ƒ„ƒ‚€€€€€€€€€€€€€€€€~~~~}}~~~}}~~~}}~~~~~~~€€~~~~~~~~~~~}~~~~~~€€€€€€€~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€€~~~~~~~~~~~~~~~~~~~~~~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~~~~€€~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~~~~~~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~~}}}}}~}}}}}~}}~~~~~~€€€€€€€€€€€€€€€€€€€~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~~~~€€€€€€€€€€€€€€~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€~€€€€€€€€‚‚€€€€€~~~~~~~~~~~~~~~~~~~€€€€€€€~~~~~~~€€€€€€€€€€€€€€€€€€~~~~}}€~~}~~}|}€|{{}~}}~}}~€~|~€~}}}}~€||€}|~€€€~€|€~€}~€€}}€~~~~~{~}}€€€€€}‚|}~€{€ƒ†{€†ƒ‚~}†„~„‚…€}ˆ~}„|ƒ|ƒ„s€‡€y}…~~y‚‡w|‚{€‚€†}~ƒ}~‚~~‚~„~y„ˆ~z…„}}‚}|€†}}|…|€{~‚|z„}z‚~x{€||||…„y{~Š{uƒ‚~{‚|€~{}€|zƒ{}~€€}x‚{€|~z€}€{€{}€€z~}€}z{~|‚|{}{|}~€|v|~~~x||x€||}|~~{ƒvvƒ{€zy|†|z|ƒ„€z~~„€w~‚ƒ|y€…}|~x„}u|†||}~‚~|{„†|x‚{…{{„…}|‚~„„~~‚‚ƒ‚~}ƒ†€€~~…‚}y‡y|€{|€}~‚€}~{~…€~‚…}‚…y}Šz€ƒ„…xz„„„|z‡†~~|‡†z~„ƒ~~ƒƒƒ|ƒ…„|}ƒƒv…„~|ˆ}|ƒ€z€ˆ|y€ˆ„v‚„„}~††}‚€|y|}{y‚‚zv|ƒ}}xy€‚yv~~}{{}{|€|zz|}{||€ƒzt}ƒ€yw~~€ƒ{z~€z}xƒ€vzƒzw†‚|~€~y}€ƒx|„…o{‡€…|v„„|~{}‚€ƒ{y…‚zzƒ†}u~ˆƒ}|z|‡„zz„†{y€€ƒ„{{Št~…†|zƒ€r|‰‚}z|€}~~{}~„‚y||„€wƒ€€‚w~‡€†€{„‚{„…†}u‡‰€x~Š„xyŠ…}}‚„€xЇ‰{y†€…ƒ€„„z|‚~‚„}…†vz†…}z~ƒ‚€~y{ƒ|{…xx„‚€z{ˆ~t€…€{|†{u†x~}{y€|€}{|€|x€ƒyu‚„~y|ˆ{t€ƒ}y}}€€z}~…ƒ{{„„€z„€‚~€ƒ|€€„ƒ€€€xƒ†y„‚|€ƒ}…‚|y…ƒ~†{}…€~}‡}|~|‡„~~{€…~}…‚‚{wƒƒ}}€†€wx€ƒy}„€{uy‡„}}x{‚}z‚~{{|{‚„~z{‚„‚‚|}€„‚~}‚‡}y{~…„{{€†‚wz€ƒ‚z~„€~y~„‚}ƒ†}xz~ƒ…‚€‚~€„}€ƒ……€|z€„}…‚~€€…ƒz}„‚€}€}{}‚‚~}~„‚|€€}|~€€~{{~€€~~€}}ƒƒz}~~}|}}~€}€}„„~€~ƒƒ}{}~€„}|}‚~}„‚}}‡‚~}„‚€~‚‚~~…ƒ†€~€‚~}}~€€~€|{…ƒ~€~~‚~~‚€~|~‚„‚~|~‚ƒ€}~~}}|z|}~}{z}€€€~~~|z}‚„‚zy|€{|€€~z~}€€}|~€}}}~ƒ‚|{}‚…€|}€ƒ€‚‚€€€‚ƒ‚€‚€‚ƒ~|€€~~~~~}}€€~€€€€~€€€~|~€‚~}~~€€~~~}~€€€~}{|}~}|z{}|}€€€~|~€€€€€€~}~€€~€‚€‚‚‚€€€€‚€€€ƒƒ€€‚‚~€‚€€‚‚€€€ƒ‚€€€€€€€|}€}}}}~€|~€€~€€€€€~~€}|~€€~||~€||€~~~~~~€€€€€€~€~~€‚‚€‚‚‚€€€‚ƒ‚€€€~}~~€€€€~}€€€€€~‚‚€€€€€€~~~€}|}€€~}€€~|~€€€€~}~€€€€€€~‚€~}€‚ƒ‚€€‚‚‚‚‚‚€€‚ƒ‚€€€€~€€€€€€€€€€€€€€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€~}}~~}|}~}|}~~€€€€€€€€€€€€€€€€€€€€~€€€€€€€€€€€€€€€€€€€€€~€€€€€€€€€€~~~~~~~}}~~~}|{|}~~~~€€€€€€€€€‚‚‚€€‚‚‚ƒ‚€€~}}~€‚€€€€~~€€€€€€€€‚‚ƒƒƒ€€€‚‚€€€‚€€€€€€~~}~~~~~~~~~€€€€€€€€€~~~}~€~~}€€€€€~€€‚~||~€€€€|z{€€~|{z{|~~~}|{||}~}}~~€€€‚ƒ‚€€€€€€€~~€€~~~€€€€‚‚‚ƒ‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€~~~~}}€€€€€~}~~~}€~„‡†‚~€‚ƒ‚‚€€|z{~zxx{~~|||}|{|~‚‚~}~„„ƒ‚‚ƒƒƒƒƒ„…‡†ƒ‚„…………„‚ƒƒƒ€‚‚€€~€‚‚‚‚€€‚‚‚‚€€~~~~}|||}}}}}}|}~~~~~~}~~~}}~~|{|}~}||}}|{|}}{{{|{|…ŒŽ‰ƒ~}||~…„}zxtsuy}{wvwyzz{{{zz{}~€‚ƒ~}ƒ†‡†…„ƒƒ„……††††„ƒƒƒ…‡‡†„ƒƒ‚‚ƒƒ‚€~}}}~€€€~~~€‚ƒ„„„ƒ‚‚‚ƒƒ„„ƒ‚€€€€~~~~~~~€€€€€€‚€€€€~~~~~~}|}€‡–¢œ‹tjmt~†ŒŒ€toonhgoz€ypmqx|}zurrv†‡…‚„ƒ€zy‰‰„…ŠŒŠƒ~‚„ƒ‚‚zxxz~‚}xvwz}€€„‡‡„‚‚ƒƒƒ‚‚‚‚‚‚€~~}|{{|}~}{{z{|}€~}~€€€~~~~}}}~}||}~‹›¨Ÿ„i\es€‹‡xkinpiekx~xnjoy‚{rjjs€‹Š††‡ƒ}z~ˆ‘“‡ƒ…ŠŒ†}wx~ƒ…ƒ€~~|yutv|‚†ƒ~zz~ƒ„„„„†ˆ‰ˆ†„„‡‰ˆ…„„„„ƒ}}~€€}|{{zyy{}~}|{|}€€€‚‚‚‚‚€€~~~|{}ƒˆ•›šŒtfeq‡Œ‰‚woorrlhku{zusvz|zslgjw…Šƒ}|}€‡‹‡„…‡‡ƒ~{}‚‡Œ‹†€{xwxy|€…‡…~|{}‚ƒ„…†‡†„ƒƒ„…††‡‡†„‚~}~‚‚}{yxy|~~}{zz|~€€~€‚ƒ„„„‚€~~~}~‚Š”šœ•mchz‰’‘…wljoqoihnvzxrpqv{xpfdpƒ”™‘„zy}……‡Œ”’‹„‚…Š‹…}z}…Žˆ}sprvz{|‚€zusw~„…„‚‚„†…ƒ„ˆŠŠ‡ƒƒƒ„…|yxy{}~~}}|zyy{‚ƒ‚‚€€€€€‚ƒ„„‚€€€€‚ƒƒƒ…Š’™š{idm~‹‘Š}qkotrjdfq{}wompw|xnegw‹˜—‹z~„‡‡…ˆŽ”˜“Šƒ‚‡‹ƒ||‚Œ‘Žƒxqrx|}|}€„„wru}†Š‰…ƒ„†ˆˆ…ƒ„Š‘ˆ„„†ˆ‡„‚‚…‡…€{xy|~€~}}}|yxy}€‚‚€~}}~~~€‚„„‚€~~€‚ƒ‚„Š‘˜š’nfix…‹umlpqledlx}{tnnsxxqigq„“—Žxy…†…†‹‘•’Š~‚ˆŠ…}y}†Œ‚vnnt{}{{~ƒ„~vpqyƒ‰Š…€‚…‡…‚ˆ‹„€„‡‡„‚‚„†…€yuvz~€}|{zxvuw{ƒƒ€|z{}€€€€€‚ƒƒ‚‚…–š‹vgfsƒŽ…wmlqtofbht}|tmlqxztjem€’—‚yy€†ˆ‡‡‹“™˜„€ƒŒŒ‚|~ˆ‡yppw~€~|~ƒ…€vopy…Œ‡€}€…ˆ†‚ƒ‰’ކ…‰Š‡„ƒ…‡†{ww{‚€}|{{zwvw|„ƒ{y|‚ƒƒ‚€€‚…‡‡…ƒ†–žž‘|liv†’“‰{qotwsjejv~}tlinvxrgck~“‹}tv~†ˆ††‹“˜•‹€|‚ŒŒ‚{~‡‚tmox}z|€€ypknz†ŒŠyx}ƒ†„ƒŠŽˆ~€…‰Šˆ„ƒ„†…€zxz€„…}{{ywuux|€~yuuy}~}}}~~~}~€ƒ……„„ˆ‘šŸ™†rhn€—‘ƒtmouumefq|wlfhoutkdgv‰‘Œ}rqy„‰‰‡Š‘——Ž‚|Œ••„ƒ‰‘ˆ|st}…ˆƒ~{}€}vnnvƒŠˆyvyƒ„‚‚†Œ‰‚}~„‹ŽŒˆ……††ƒ€€…ˆ‰…€||}}}}~€|xx{‚€€€€‚ƒ…†‡‡‡ˆŽ—žŽ{no|˜™‹yllu{vmhmx~{qfciswqheo‹}okr€ŠŠ†„‰’‚{}‰”—†€„Œ‹€xx€‰Œ‡yz~|vty‚ˆ†~vsw}ƒƒ€„†…€}~ƒŠŒ‡ƒƒ„„„‚ƒ……|yy{}}|{{{{zwuuy{}}{ywx{|||~€€„Š‘—–‰wkn~™”„skoyyojq|‚}pffnxyqggsƒ‹„tiiu„‹ˆ€‡†{y˜–Œ‚€‡‘Š€{€‰Ž‡{}‚~yy~„…wqrx~{xz~}{z~ƒ‡ˆ…ƒ†‡†……†‡ˆ‡„€‚……ƒ€€€~}}~€}{|}~~~~}~€‚‚€ƒ‰—–Šxkl}’Ÿš‡tlr†€rkrŠ…ugeo|€vifr„Œƒqcdt…Œ‡}zŠŒ„xu~Žš˜Œ|„“ƒ~‚“’‰{…‰†€~†‡xtw~„…€yuv{~}{y{‚‚~zz~‚„„‚€€‚‚€ƒ…„‚~}}~}}}|{zyz}~|{z|~€€‚…‰•‘~mgr‰›žzkkzˆ‡xloŽ}kbjz…€oflŒˆuc`l‰|sy„‰ƒvqw‡•˜~v|‰’…~‰‘‘Šz|„‹Š„€ƒ„€xtv~…‡ƒyrrw}€||}~{yy~„‡†‚~ƒ„‚‚„††ƒ€€ƒ„„ƒ‚€€}}}||}‚ƒ‚‚…Š’‹yljxŽœ‹ujm|ˆ„vnt‚Œ…secn~†~oiqˆ€odhwˆŒ„xs{„†uu–’…xv‹‡ƒ†‹†~„ŒŒ†ƒ„}|…ˆ‡€xtw}‚|zzzzyz}ƒƒ€|z{~‚„ƒ€~~‚…†„‚€€‚ƒ‚‚ƒ‚}|}~€ƒƒ‚†‹ŽŠ|qow‰••Šyopz…ƒ{tw‚ˆƒvkkt€‡uot€…€tmpz†ˆyu{‚ƒ~xx~ˆŽŒ‚yw}†Š‰„ƒ‡‰‡ƒ†ŒŠ„‚„†„€ƒ†ˆ†€|z}‚~{zzzzzz|€|zy{|~€~}}}}}|~‚ƒƒ}|~€‚‚€~}}}|}~~}}€ƒƒ‚€zvw|„ˆˆ‚zuw~ƒ‚~{}ƒ{wvz€‚xvy}xtv{€~{y|€€~{{„†„{{ƒ…„‚ƒ……„‚‚‚…‡ˆ‡„ƒƒ„„‚€ƒ…†…‚€€‚‚€~}}~€‚}}~€€€~~~€ƒ‚€€€€~|{‚‚€€€€€ƒ…„}z|†‡‡„€}|€ƒ‚~€ƒ‚€|zz}€~zx{€~{yy|€}{z{}}|zz}€‚~{|~ƒƒ‚€ƒ‚‚€ƒ……„‚‚„…„ƒƒƒƒƒƒ‚‚‚€~€€~~~}~€€}~€‚ƒ|z{{|~~~~|{|}‚‚‚}~‚„ƒ‚‚‚‚€€€€~|||}€||}~}}~~~~}}~~~}}~~|{|}~~}||~~~}}~€~~€‚‚‚‚‚ƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€~~€€€€€€€‚~€€€€€€~€€~€€~~€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~~~~€~}~€~||}}}||}}}}||}}}}}~~}}~~~~~~~€€€€€€€€€€~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~€€~~~~~~~~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~€€€€~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~€€€€€€€€€€€€~~€€€€€€€€€€€€€€€€€€€€€€€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ƒ†…€€~}€€€‚€€€~€‚‚‚‚‚€€~}}~~€‚ƒ‚€€~~~~€€~~~~~€€€€~~~€€€€€~}}}}}~€€€€€€€€~~~}}~~~~~~}}}~}}~~~~~€€~~€€€€€€€~€~€€€€€€€€€€€€€€€€€€€€€~}|||}}|}}~€€€€~€€‚‚ƒ‚‚€€~~~~~€€€€€€~~~~~~‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚€€€€€€€€€€€€€~~~~~~~~€€€€€€€€€€€€~~~~~~~~~}}~~~~~~~}}~~~~}~€€€€€€€~~~~~~~~€€€€€~~~}}|||}}}}}~~~~~€~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~€€€€€€€€€€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚ƒƒƒ‚€~~}}}}}}}||}}}~~~~}}}|}}~~€€€‚‚‚‚‚‚‚ƒƒ‚‚‚‚‚‚€€€€€€€€€€~~€€€€€€€~~~}~~~~~~~~~~~~~~€€€€€‚ƒ„„ƒƒ‚€~}{{{{{{z{{|}~~~~~~~}|||}}~€€‚‚ƒƒƒƒ‚‚‚‚‚‚‚ƒƒƒ‚‚‚€~~~€€‚‚‚€€€€€€€€€€~~~~}}}}}}}}~~}}}~~~~~~~€€€€€€€€€€~~~~~~~~~~~~~~~~~~~~~~~€€€€€€€€€€€€€€€€€‚ƒ„„„„„ƒ‚~}{{zzzzz{{|}~€€€€€~~~~€€‚ƒ„„…………„ƒƒ‚€€€€€€€€~~€‚‚‚ƒƒ‚‚€€€€€€€~~}}}||||}}~~€€€€€€€€~~~~~~~~~~}}}}~~~~~~~~~~~~~~€‚‚ƒ‚‚€~}|{zyyyyzz{|}~€€€€€€‚‚ƒƒƒ‚‚‚‚€~}}}}}~~~~€€€€~~~~~~€€‚‚‚ƒƒƒƒƒƒ‚€€~~~}}}}}}}~~~€€€€€€€~~~~~~~€€€€€€€€€€‚‚€€€€ƒƒ„„ƒƒ‚€€~}||{zzzz{|}~~€€€€€€€€€€€€€€€‚ƒƒ„„„„ƒ‚‚‚€~~}}}||||}~~~€€€€€€€€‚‚‚‚€~}}||{{{{{{|||}~~~€€€€€€€€~~~}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~€€€‚ƒ„„„ƒ‚€€~}|{zyxwwwwxz{|}~€€€€€€€€€€€‚‚ƒƒ„„………„ƒƒ‚‚€~~~}}~~€‚‚ƒƒƒƒƒƒƒƒƒ‚‚‚€€€‚‚‚‚€€~~~}}|||||}}~€€‚‚‚‚‚‚€€€€€~}}}}||}}~~€€€€€€€€~~~~~~~~~~~~~~~€‚„†††…„ƒ‚€~|{yxvutsstuwy{}~€‚ƒƒƒƒ‚‚€~~€‚ƒƒƒƒƒƒƒ‚€€~|{zyxxxyz{}~€‚ƒ„„…………„„ƒ‚€~~~}}}}}}}|||{{zyyyyyz{{||}~€‚‚‚‚‚€~~~~}}|||}}~~~~~~~~~~~~~~€€€€‚‚ƒƒƒƒƒ‚‚‚‚‚‚ƒ„†‡ˆˆ‡†„ƒ‚€~|zxutrpooprtvx{}€ƒ„†ˆ‰‰‰‰ˆˆ†……„ƒƒƒ„„……………………„ƒƒ€}{yxxxxxyy{|~‚„…‡ˆ‰ŠŠŠ‰‡‡†„ƒ‚€}{zzyyyyyzzzz{{{||}}~€€‚ƒƒ„„„„„ƒ‚‚‚€~~}}||||}}}}}}}}}}}}}}}}~~~~~€€‚‚ƒ„…‡‰‹‹‹Š‡„‚€~{wtqolihgfgilosvy|ƒ…†ˆˆ‰‰ˆ‡†„„ƒƒ‚‚‚ƒƒ‚‚‚€}|yxvuuttuvwxz|~€ƒ…ˆŠ‹ŽŽŽ‹Š‰ˆ†„‚€}{zyxxxyyyyxxyyyz{|}}}~~~~€‚ƒƒƒƒƒƒƒƒ‚‚€~}|{zzzz{{{|}}~~€€€€€€‚ƒ„…‡Š‘ŽŒˆ†ƒ€|xtpmjgecccfimptx|‚…ˆŠŽŽ‹Šˆ‡†…„„„„ƒƒ„„„…††‡‡†…ƒ€~|{zyxwvvvvxy|~„‡ŠŒŽ‘‘‘‹ˆ…~{ywutssssttuvxz|~€€€‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒ‚€~}}|{{{zzyyxyxxxxxxxxyz{|}ƒ†ŠŽ‘‘Ž‹‰‡„}ytplhecbbcfilorvz}…ˆŒŽŽŒŠŠ‰ˆ†……„ƒ‚‚‚‚ƒ„……„ƒ‚}|{zxwvutsttuwy|„†ˆŠŽŽŒ‰†ƒ|ywusrqqqrstvxz}~€‚‚ƒƒƒƒƒƒ‚€€€€€€€€€€€~~}}|||{{zzzzzyyz{|~‚†Š‘‘ŒŒŠ‡„€|wrnjgedcehjnpsw{~‚†ŠŽ‘‘‘ދЉ‡†…„‚€‚„…‡‡‡†…„‚€}|zxwvuuvwy|‚„‡‰‹Ž‘’’’І‚|xvsqomllmnpsvx{}€‚ƒ„„„„„„ƒ‚€€€€€€€€€€€€€€~~}||||||||}}~€‚…‰‘Ž‹‹‰‡„{wrmheca`adgiloswz~ƒ‡‹Ž‘‘ŽŒ‹‰‡…„‚€~~}}~‚ƒƒ„ƒƒ‚€}|zywvvvvwy|~€ƒ†ˆ‹ŽŠ‡ƒ€}yvsqomlllnpruwz}‚„…†††…„ƒ‚€€€€€‚‚‚‚‚€€~}}}}}}~€…ˆŠŽŽŽ‹‹Šˆ†ƒ|wsnkigedegikmqtwz~‚†‰‹ŽŒ‹‰‡†„ƒ~€‚ƒ„„ƒ‚‚‚‚€~}{zxwwwwxy{}ƒ…ˆ‰‹ŽŽŒ‹‰†ƒ}{xwutstuvwy{}€ƒ„…†‡‡ˆˆ‡†…„ƒƒ‚‚€€~}}}|||}~…ŠŒŽ‘ŽŒŒŠˆ„~zupjfda_]_behkotx|†‹‘“””“‘ŽŒŠ‡…ƒ€~|{{zzz|~€‚ƒƒƒƒƒ‚€~|ywusrrssuwz}€‚†‰ŒŽ‘‘‘‹‡„€}zwurpooopqsux{~€ƒ…†‡‡ˆˆˆ‡†„‚€~}}}}}}~~€€€~}|||}}ƒ‡Š‹ŒŠŠˆ†‚~yuqlgeb`^`behjmquy~ƒ‰‘’’’ŽŒŠ‡…ƒ}|{{|}‚ƒ„………………„ƒ~{ywvvwwxz|„†‰ŒŽ‘’““’Ž‹‡ƒ€}zwusqppqrtvx{~€‚ƒ…†‡‡‡††…ƒ‚€€‚ƒƒ„„ƒƒƒ‚‚€€€ƒ†‰‹ŒŽŽŠŠ‰ˆ…}zupkhfcaacegjlpsvz„ˆ‹ŒŽŽŽŒŒ‹Š‡†…ƒ}}}|}‚‚ƒƒ„„ƒƒƒƒ‚€~}{xuuuuuvx{}‚…ˆ‹‘’’‘Ž‹ˆ„}zwtrpnnnprsuxz|~ƒ„†††††…„ƒ‚€€€‚ƒƒƒƒƒƒ‚€€~}||}‚…†‡‰‰ˆ‡††…„€}zuqlifdccdfhikmptw|…ˆŠ‹ŒŒŒ‹ŠŠ‰ˆ††„ƒ€‚ƒ„………†……„„„ƒ‚€~|zxwwwxxy{}~€ƒ…ˆŠŒŽŽŒŠ‡„‚|zwusrqrstvx{}ƒ„†‡‡‡‡‡†…ƒ‚€€€‚ƒƒƒƒƒƒƒƒ‚~„‡‰ŠŠŠ‰ˆˆ‡†ƒ€}zvqnkheddegijmoruz~ƒ‡ŠŒŒŒŒ‹‰ˆ‡†„‚€€‚ƒ„……††††††††„ƒ|zxwwvvwxyz{}€ƒ†ˆŠŒ‹‰‡†„}zwutsstuvxz{}~‚„„…††…„ƒ‚€~~~~~}~~€€‚‚‚‚€~}}}~€ƒ…†‡†‡………„„|xuqnkhfffghjkmorvz~ƒ†‰Š‹ŒŒŒŒ‹‹Š‰ˆ†…ƒ€‚ƒ„……†††††††…„‚€~{ywvuuuuvwxz|‚„‡ˆŠŒŒ‹Šˆ†…ƒ~|{yxwwxxyz{}~€‚ƒƒƒƒƒ‚€~€ƒ„…†††……„ƒ‚‚~}|}}€‚„††‡‡…†††…ƒ}zvroljihhijlmortx|€„‡‰‰Š‹‹‹‹ŠŠˆˆ†…„‚€€‚ƒƒ„„………††††……ƒ}{yxxxxxxyy{}ƒ…‡ˆ‰‰Š‰‰ˆ‡‡…„‚€~|{zzzzz{||}~€‚ƒƒƒ‚‚€~~~~~~~~~€€€€€€~}|{{{|~€ƒ„††††…†††…ƒ‚|xuromlkkllmnprtx{ƒ…‡‡ˆ‰ˆˆ‡††…„„‚€€‚ƒ„„„…………†††…„ƒ€~|zyyxxxyyz{}~€‚ƒ…†‡‡ˆ‡‡†…„ƒ‚}|{zzz{{|}~~€‚‚‚€~~~~~}~~~€‚ƒƒ‚‚€€~~|||||}~‚ƒ…††††‡‡‡‡†„|ywtrqpoooopqsux|ƒ…………„ƒƒ‚‚€€~~}}~€‚ƒ„…††‡‡‡‡‡††……„ƒ~~~~~€‚ƒƒ„………„ƒ‚‚€€~}}||||}}~€€€€€€€€€€€€€€‚‚€€~~~~~~~€€‚ƒƒ„„„„ƒƒƒ„„ƒ‚~|zyxvttssssuvx{}‚‚‚€~~}}|||||}~€‚‚ƒƒƒƒƒƒƒ„„„„ƒƒƒ‚€€€€€€€€€€€‚ƒƒ‚‚‚‚€€~~~~}~€€€€€€€€€~€€~€€€€€€€~~~~~~€€~~~~~~~€€€~|zywwvwyz{||}~€€‚€€~~~~~~~~~}}}~€€€‚‚ƒƒƒƒƒ„………„„„„„„ƒ„„‚‚ƒƒ‚‚‚‚ƒ„„„„„ƒ„ƒƒƒ‚‚‚‚€€€€€€€€€€€~~~~~~~~~~~~~~}}~~~~~z|€€~~~~€€~~~~~~~~€‚€€‚‚‚‚‚‚€€€~|{{zz{|{|}}}}~}~~~~}~}}~€€€‚‚‚‚‚‚‚ƒ‚‚‚‚‚ƒ‚‚‚‚‚‚€€€€~~~}~~~~}}~~}}~}}~~}~}}}|||}||}}|{||}}}}}~}}}~~~~~€€€€€€€€€€‚‚‚ƒƒ‚‚‚‚‚€€€€€~~~~~~€€€€€€€€€€€€€€€€€€€€€‚‚€‚‚‚‚‚‚‚‚‚‚‚‚‚ƒ‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€~~~~~~}}~~~}}}}}}||}}}|~~~~~~~~~~€€€€€€€‚‚€€€€€~~~~}}}}}~}}~~~~~~~~~~~}}}}}}}}}}}}}}~~~~~}~€€€€€€€€€€€€€€€€€€‚‚‚€€€€€€~~~~~~~~€~€~€€€€€~€€€€€€€~€€€€€‚€€€€‚‚ƒƒƒ‚‚‚€€€€€€~~~~€€€€~}}~~}|}}{{||{|}|~€~~ƒƒ‚‚‚‚€€‚‚‚€‚€‚‚ƒƒ‚‚‚‚ƒƒ‚‚‚€€€€€~~~€€~~}~~}~€~~€}~}}}}~~}}~~}}~}€~~€~€~€}~}}~~}~}}~|||}~~~~}}|||{{|||{|}~~~~€||~}|}}}||}}}~~~€€‚ƒ€‚‚ƒ‚‚€€€€€‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€‚€€~€‚€€€€‚~}~}}€~~~}~}|~~}}}}}~€~€€€‚€‚ƒ„…„……‚‚~}}{{yyzzyz{{|~~‚‚‚€~}~~~~~}}}~~~€€€€€‚‚€ƒƒ‚‚€‚…‚‚„ƒ‚‚‚‚‚‚‚‚‚ƒ‚€€~~€€}~~~}}~~~~~}}~||}{{z{|||}||~~|}}€~~}~€}~€~~~}}~|~€ƒ…†‡ˆˆ‡†„ƒ‚€~|{yxxwwwwxy{|~€€~|zxwwwxz{}~~~€‚ƒ‚ƒƒƒƒ„ƒ€€€€‚ƒ„„„„„ƒƒ‚‚ƒƒƒ„„ƒ‚ƒƒƒ„……„†…„…„~}|{}|{|}{{|}|}~}}€}€z{}|€}ƒ‚~€€€‚€~€}€€€ƒ‡‰‹Œ‹‹‰……~|zwuutssssuwx{}€€~}{xwvuuwy{~€‚ƒ‚ƒ…„ƒ„„ƒ„„‚€~}}~€‚„†‡ˆ‡……„‚‚‚‚‚‚‚ƒƒ‚‚~}{zz{{|}~€€‚€€€€€€~|~~~€€€‚ƒ…ƒ‚‚‚€}}~}}~~~€ƒ…ŠŒŒŽŒŠ‡ƒ‚}ywtsrststuuvxy{}~~}}{yvtsrrtvz}„‡ˆ‰‰‰ˆ†……„„„„ƒ‚€€€ƒ„…†‡†…„}|zzz{|}€‚‚ƒƒ‚€€}|zyxxyz{|~€‚ƒ„ƒ‚€~~~}}~€€€€‚ƒƒƒƒ€€€€~€€‚ƒ†‰Ž’’Œ‡‚}wtqnnoqrtvvwxyyzzzyxwtrpnnnpsw|†ŠŒŒŒ‹‰‡…ƒ‚ƒƒ„„…†‡‡‡ˆ‡‡†…„‚€}{yxwxz|€ƒ…‡ˆˆ‡…‚}{zyyyz{|~€ƒ…†‡ˆ‡‡…ƒ}|{|}€‚‚ƒ„„ƒ‚€€~€€€ƒ„†ŠŒ’”–˜”‹„wsnjjjmptvwyzzzyxvutsqpooopsv{€†ŠŽ‘Ž‹ˆ…‚€€‚„†ˆ‰Š‹‹‰ˆ†„‚€~|zxvuuuwz}€ƒ†‡‡†„}zwvvvxz|‚„…†…………„‚€~}||}~ƒƒ„„„ƒ~}|||}}~~€€€€€ƒ†‹•˜™—’†~wplhhilpsvwxwvtsrqonmllllmoquz€†ŠŽŠ‡ƒ€~~€ƒ†Š‘‘Ž‹‡ƒ€}{zyxwwwwxz}€‚„†‡†„~zxvvxz~„‡ˆˆˆ‡…ƒ‚€€€€~~€‚ƒƒ‚~||{|}€‚ƒƒƒ‚‚€€€€„Š‘˜››–†vplhhjosx{|{zwusqnllllmnopqtx|‚ˆŒ‘‘Œ‰…~}~†Œ”—˜–“މƒ~{xxxyyz{{{|}~€€€}zxuttvy~ƒ†‰ŠŠ‰‡„~~€ƒ„„„ƒ€€~~}}||||}~‚ƒƒƒ€~~~‚ˆ˜ Ÿ™“‰umicdflsy€}ytplhfefgilortw{~ƒˆ‹ŒŠ†ƒ|zz}‡’–™˜–‘‹„}wsqrswz}€€~}|{zzyyxxwwxy{~…ˆ‰‰ˆ†ƒ}}~€ƒ…‡‰‰‡„~|zyyyz|}~€€€€€€€€~}||||}~€‚‡Ž—Ÿ¢¤Ÿ—Žymgc`ejs|ƒˆˆ†€xqjd`^_chnsw|‚ƒ†‡ˆ‰‡†„‚€‚†‹‘–š›š—‘Šƒ}wttuy~ƒ‡‰Š‡„zwtssuwz|~€‚„„„ƒ€€€ƒ†‰‹‹‹‰‡ƒ~zxwwy{~€‚ƒƒƒ}{zz{||}}}~~€‚…‹’šž œ”‹€xohfehnv…‰‡‚{rjd`^^bgmsx|~~~}}}€‚ƒƒ„ƒƒ‚‚ƒ„‡‹”••’މƒ}ywvx{„ˆŠŠˆƒ|vqooptx|€ƒ„„ƒ€~{{{}~€‚ƒ„„„……†‡ˆ‡†„‚€}{z{|ƒ„„ƒ}{yyz|~€‚‚€~~}|}~‚†Ž–œŸ—†|umihint|‚……€{tmhedcehlqvy{}}~~€‚ƒ‚‚‚‚‚ƒ„†ˆŠ‘”•”‘Œ‡‚~|{|~…ˆŠŠ‰…€{urpqtx|€„…†„‚|zyy|~€‚ƒ……†††……„„„ƒ‚€‚ƒƒ‚~}|||}~‚€~||||}€‚„‰—ž›”‹‚ztmkklqx€†‰‡yqjdbabejpv{~~}|{{{|}~€‚„‡‰Š‹‘‰…‚~ƒ†ˆ‹Œ‹ˆ„ytrqrvz€„†ˆ‡…}yvuwz}‚…‡ˆˆ‡…„‚€€€ƒ„„„ƒƒ‚€~}}}~€€€€€€€~}|||}~€€€‚„‰—›š–„{toklmryˆ‹‰‚ypgbabeiouz~}{xuuvy{~€‚„†‡‰Š‹ŒŽŽŒˆƒ€€ƒ†‰‹Œ‹‰„zusrtw|€ƒ……„{xvuvx|ƒ„„ƒ‚€€~ƒ„†††„ƒ€~}||}~€‚‚‚€~}}}~~€€€}}}~€„‰˜œš•‹xrpoqty…‰ˆ„|skgfhknpsvxxxvuuuwz|}}}||}€ƒ‡‹ŒŒŒ‹‰…‚€‚…‰Ž‹ˆ†ƒ€}zzz|~€‚‚‚‚€~|zyyz|‚‚ƒƒ‚€~~~‚…‡ˆˆ†„~~~~€ƒƒ„ƒ‚€~}}~€€€€~}|||||}‚†‹’——“Œƒ{ussuwz~‚†‡…wpkklnpqqrtvwwwxyz{||zyxy}„ˆŒ‹‰‡…ƒ‚‚…ˆ‹ŒŠ‡„ƒ€~}}~~€€‚ƒƒ‚€~{yxy{}€€~}|{|}‚…‡ˆ‡„‚€€‚ƒƒƒ‚€€€€€€€€€~}}||}}‚…‰••‘‹ƒzsqswz|‚„…ƒ~xrnmortsrrstvwyz{{zzywutvzƒ‡‰Šˆ…„ƒ‚€€‚„‡Š‹Œ‹‰‡†………„ƒ€€€‚ƒ„†††…‚|zyyz}€‚‚~|||}~€ƒ„……„ƒ€€€‚‚‚€€€€€€}|||}~~€ƒ†ŠŽ’Š„{wuuy|}‚††‚}xvvutttuttw{|{z{}}|zxwuvy~‚„††‡†…„ƒ‚ƒ†ˆˆ‡ˆˆˆˆˆ‰‡„‚‚‚‚ƒ„…†…ƒ€}|||{{{|}~~|{{|}€‚ƒ‚€€‚‚‚‚‚ƒƒ€€€€€€€€€~~}}~€€€€‚„†ˆ‹‹‡}zxwvxz|ƒƒ€{wuuvwwvvvwxyyxwx{}}{yxvvy|€‚‚ƒ„„ƒ‚€€„‡ˆˆ‡†††‡‡††…ƒƒ„„„‚‚‚„…†‡‡…ƒ~~~€€}|||}~~€€~}~€€€€€€€€€€€~€€€€€€€€€€€€€€€‚„‡‰‰‡ƒ€~||{|~€‚„…ƒ{yyzzzzzyxxz{zzz|}~}|zxxz}‚ƒ„„‚ƒ…†…„ƒ„„…„„„ƒƒƒ„„ƒ‚‚ƒ„……„ƒ‚‚ƒƒƒ€€€~}}~~~~~~~~~~}}}~~~~}}}}}}}}~~~~~~~€~~€€€€€~~}~~€ƒ„…„ƒ€~}|{|}}~‚‚€~}|}}}}|{{||}~}}}~€€€~||~€€€€~~€‚‚‚‚„„„„„ƒ‚‚ƒƒƒ‚‚ƒ„ƒƒ‚ƒƒƒƒ‚€€€~~~~~~~~€€~~€~~€€~€€€~~~~€€€€‚ƒƒ„„ƒ~~~~€‚ƒ‚~~}}}~~}}}}~~~}~€€€~}}~€€€€€€€€‚‚‚‚‚‚‚‚€€€€€‚‚€€€€€€€€€€€€€~~~~~~~}~~~~~~~~}}}~~~~~€€€€€€€€€€€€€€€€€€€€‚ƒ„ƒƒ‚€~~}~~€€~~}}}}}|}}~~}}~€~}}}}~~~~€€€€€€‚‚‚‚‚‚ƒ‚‚‚‚‚‚‚‚‚ƒƒ‚‚‚‚‚‚‚€~~}~~~~~~~~~~~~}~~}~~~~}~€€€€€€€€€€€€€€€€€‚ƒƒ„ƒƒ‚€‚‚~~~}}}}}}}}}}}}}~~~}||}}}}}~€€€€‚‚‚‚‚‚ƒ‚‚ƒƒƒ‚‚‚‚‚€€€€€~~~}}~~~~~~~~~~€~}~~}}€€~~~€~€€€€€€€‚‚‚€~|||}}}}~€}}}~~~~}}}~~~~}~~€€€~}~~~~~€€€€€‚€‚‚‚‚‚‚ƒ„ƒ‚‚ƒƒƒ‚‚‚‚‚‚‚€€€€€€€~}}~~€€€€€~~~€€€~‚‚€€€€~~€~}~€€€€€€‚„……„ƒ}|||}}}‚‚€|{z{{{z{|}}}}}}}€€~}||}~~€‚ƒƒ€€‚‚‚‚€€€€€‚‚€€‚‚‚‚‚ƒƒƒ‚€€‚‚€€~~}}}~~€~|z}~~~~~}~~~~~}}}~~~~~}~~}€€~~~~~~€€€ƒ†‰Š‡„‚€}zz|}|}‚†‡„~|zxyyxwxz|||{z{|}~|zz|}}}‚ƒ„…‡†ƒ~€ƒ…†‡†‡ˆˆ†„‚‚ƒ„„„‚‚„ƒƒƒƒƒƒ‚‚€€‚‚€~}||}~~~~~~}||}}~}}|}~~~~~}}}~~~~~~~~~}~€ƒ†Š“‹†‚}vtvxyz~„ˆ‡‚|xtrppqrrsvyzxvvxz|~|yxy{{}€ƒ†ˆŠŒŒ‹†€ƒ†‰‰‰Š‹Š†~~~€~~~€€€€€€~|z{‚ƒ‚~~~}}}€~~~~}}}}~}}~~}~€€~}}}}|}~€€€€~~}~€ƒ‡Œ’˜˜”‡wqpopqu|ƒ‡†{uolkllkmpuwxwxyy{~‚‚~{z|}~€„ˆŒŽ‘••‘Š…‚„†‡ˆŠŠ„€}{yyz{yxy|~~~€€‚ƒ€}{}€‚…‡‡†…„ƒ€}{{}~~~~}~~}||}~}|‚‚€~~‚ƒƒ‚€€€‚„Š’™š–‘Š‚wqolmlpxƒ|ysmkjjjiknrsssuxy}ƒ‰‰†ƒ‚‚€}~†ŠŒ’˜›˜’މ…‚‚‚ƒ‡‰†‚€~{zz{{xutvxwwz~‚…ˆŠ‰„€€~}~ƒ„…‡‰ˆ…‚€~|{zyxwvxz{{|~~}||}|yxy}€ƒ……ƒ‚‚ƒ‚€€€€€€€€€€‚„ˆ’—–“„}uqmkllqx}€~{wqonnnllmprrrsux{†‹‹‰‡…ƒ„‡Š•—–’މ†„‚‚€~}€~}}}~€}zyxxwwy|‚†ŠŒŒŠˆ‡†„‚‚‚‚ƒ„„„‚‚€~|zwuvwwxz|€‚‚‚€~~€€‚ƒ„ƒƒƒƒ‚}|{||~~ƒ†Š•˜•‘‹ƒ|uqmllnsy~€~{xvutspnmnooooptx~„ŠŽ‹‰ˆ„€‚…ŠŽ‘‘ŽŒŠˆ†‚||{zxvvxz}€ƒƒ‚~}{xvvwy|„‡ˆ‰Š‹‹Š‰‡†„~}{{|~€€€~|zyxwvvwxz{}€€ƒ„…„ƒ‚€~~€ƒ„„„ƒ‚~}|{zz{{~€…Œ’•”“‰€ysoliilquxyyyz{{zxutsrokjkmqv~…‹Ž‘‘‹‡„‚€€ƒ†‡ˆ‰‹ŒŽŠ‡†ƒ~yvtttvy}€‚„…†…ƒ~}|}}}}}„…‡ŠŒŒ‹‰‡…}ywvvvwxyy{|}}~~~~}|{{zyyz}‚„………„ƒ€~~~}||{{|~€€€€€€‚…Œ’’ˆƒ€zwsqqrtutsrrsuwyzz{{zxtqpoquy‚…ˆŠŒŒŒŒ‹Š‰‰ŠŠŠˆ‡†„„…‡‰ŠŠŠ‹‹‰†~|zyyyzz{}~€€‚ƒ„„„ƒ~}}}ƒ„……††…„‚€€~}{yxwwxxz|~€€~~~~~}}}}}}~‚‚ƒƒ‚‚€~~~~~~~~€€€‚…‰Ž’’’Ž‹†€~xusopqrtrrqqtvxyyzzzxvrpooqtw|~„†‰ŠŠ‹‹‹‹‹Œ‹Šˆ…ƒ‚‚‚ƒ…†‡ˆ‰‹Šˆ…‚€~}}|{zzyyyyz{}€ƒ………ƒ‚€€‚‚‚‚‚‚‚‚‚‚ƒƒƒ‚€}{zyyxxyz{||}}}~~€€}}}}}}~€€€€€€€€€~}~~€‚†Œ‘ŽŒ‰†„€}zvusssponoqtwy{}~€~|zywwxz{||~€‚ƒ…ˆŠŒŽ‘‘‹‰‡†……„ƒƒƒ„„„ƒ‚‚ƒ„………„ƒ€~|{zzzz{}}}}}~€‚ƒ„…„„„ƒ‚€~~}~~~}|{{||}}~€~~}}}}}}}}}|}~~€€€€€€€€€~~}}}~€„‡ŠŒŒŒŠˆ…„~{xwvtsponoqrtvxz|}}|{zyxxyyyxwxxyz|~„‡ŠŽŒ‹Šˆ†…„ƒ€~}~€‚‚‚‚€€~}}||zzyyyyz|~€‚ƒ„„„„„„„ƒ‚€}|{zzzz{|}}~~~€‚‚‚€~~~~~~€€€‚ƒ‚‚‚€~~~}~~„†ˆ‰‰‰ˆˆ‡†„‚€~}{yvspoopqstuwyz{{|}}~~}}||||}~ƒ„†‡ˆ‰Š‹ŒŽŽŽŒŒ‹‰‡„‚€€~~~~~~~€‚‚‚‚€€~~}}}}||||||}}~€‚‚€€€€~~}}}}||}~€€€‚‚‚‚‚€~~}}~~~~~~~~}}}~€‚„…†††………„ƒ€~|{ywusrrrsttuvxyyz{{||}}}}}}|||||}}~€ƒ„„……†‡‰ŠŠ‹‹‹ŠŠ‰ˆ†…„ƒ‚‚~~}}||}}~~~~}}}||}|||}}~~€€€€~~}}}}~~€€‚‚‚‚ƒƒ‚‚€~}||||}}}}~~€‚ƒ…†‡‡‡‡‡‡†…ƒ‚€~|zwutssssttuwxyyz{|~€€€€~~~€€‚‚ƒ„…‡ˆŠ‹ŒŒŒ‹ŠŠ‰‰‰ˆ‡…„ƒ€~}}}}~~~~~€€€€€€€~~~~~~~~~~}}~~~~~~~}~~€€€€€€€€€~~~~~}}}}}}}}~~}}~~€‚ƒ„„…………„ƒƒ‚€}{yxvuuuttstuuvvvwyz{|}~€€€‚‚ƒƒƒƒ„„„……†††††††‡†††……„„ƒƒ‚€€€~~}}}}}}}}}~~~~~~~~~~~~~~~~~€€€€€€€€€€€€€€€~~~~~~€ƒ„„„„„„„ƒƒƒ‚‚€~}{zyyyxxxxxxxxyyz{||}}~~€€‚‚‚‚ƒƒƒ„„……††‡‡‡‡‡‡‡‡‡ˆˆ‡†††……„ƒ‚‚€~~~}}}}}}}}}}}~~~~~~~~€€‚‚€€€€€€~}}}}}}~~€‚ƒƒ„„…………„„„ƒƒ‚‚€~}{yxwvvvvuuvvwwwxxyyz{{|||}}~~€€€‚„„…………………………††……………„„„„ƒƒƒƒƒ‚€~}}||}}}}}}}}}}}}~~€€€€€€€€~~}}}}}~~€‚‚‚‚‚€€~~~~~~~~~}}}}}}~~~€‚‚ƒƒƒ„„„„„„„ƒ‚€}|{zyyxxwwxxxxxxyz{||}~~~~~€€‚‚‚ƒƒ„„…………†††††……††††††††††………„„ƒƒƒ‚‚€~~~~~}}|{{{{||||}}}}~~~~€€€€€€€€€€€‚‚‚‚‚‚‚€€~~~}|||||||}}}}~~€€‚ƒƒƒƒƒƒƒƒ‚‚€€~|zyxwwwvvuutuuvwwyyz{|||||}~~€‚‚ƒƒƒ„„………„„………………………††…„„„ƒƒƒ‚€~~}}}}}}}}}||||||}}~}}}}}~~€€€€€€~~}}}}}~~€€€€‚‚‚‚‚€€€€€~~~~~}}}}}}}~~€€‚‚‚‚‚ƒƒƒƒƒƒƒƒ‚~|{zyyyyxxxxxxxxyzz{|}~~€‚ƒ„„„„„„„„„„……………†………„„„„……………………„„„„ƒ‚ƒƒƒƒ‚€€~~~~}}}}}}||}}}}}}}}}~~~~~~~~~~~~~~~~~€€€€‚‚€€€~~}}}}}}}}~}}~~~€‚ƒƒƒƒƒƒƒƒƒ‚‚€~}|{zyxwwwwwvvvvwwxxyz{||}}~€‚‚‚‚ƒƒƒƒƒ„„„„„„„……„„„„…………………„„ƒƒƒƒƒ‚‚€~}|||||{{{{{{{{{{|}}}}}~~~~~~€€€€€‚‚‚€~~~~~~~~€€€€€‚‚ƒƒƒ„„„„„„„„„ƒ‚~|{yxwvuutttssstuuwxyz{|}~€‚ƒƒ„„……†††……††‡ˆˆˆ‡‡‡‡††‡‡‡‡‡‡ˆ‡‡†……………„„ƒƒ‚€~~}}}}||||{{{{{|||}}}}}}}~~~~~~~~~~~~~€€€€‚ƒ‚ƒƒ‚€€~~}}}}}~~~€‚‚ƒ„„„ƒƒ‚‚‚‚€~}|zxvuttsrrqqqqrrtuuwxz{|}~€€€‚ƒ„„„„„„ƒƒ„„……………†††……†††‡‡‡‡‡†……„„ƒƒƒ‚€~}||zzzzzzyyyyxyyyz{{{{{||||}~€‚‚‚ƒƒƒƒƒƒ„„……„„„ƒ‚‚€€€~~€‚ƒƒ…………ƒ„„ƒƒ€~{ywtsrqpooooppqqstvxy{}~€ƒƒ„……††††…†……††‡‡‡ˆˆˆˆ‡‡‡ˆ‰‰‰‰‰‰ˆˆ‡†…„ƒ‚‚€~}|{{z{{{{{{z{{{{{||}~~~~~~~~€€€€€‚‚‚‚‚ƒƒ‚‚‚‚‚‚€€~}~}~}~~€‚„…††‡††…„„ƒ‚~{yvsrpnnmmmlllmnoqsuxy|}‚ƒƒ„…†‡††‡‡ˆ‡†††‡†‡‡‡‡‡ˆ‰ˆ‰‰‰‰‰Š‹Š‰ˆˆ‡…ƒ€}|{zzzzyxxxyzzzzzzzzzzz{|}}~€€‚‚‚‚‚ƒ‚‚ƒƒƒƒƒƒƒƒ‚€€€‚ƒ…‡ˆ‰Š‰‰ˆ‰‰‡…ƒ|zvspmkjiihiiijklmortwy{}‚ƒ„„……†††‡‡††…………†‡ˆˆ‡ˆŠŠŠ‰‰‰‰‰ˆˆ‡‡…ƒ‚€~}|||{{|{{zzzz{|}~~~}~~~~~~€€‚ƒ„„„ƒƒƒƒƒ‚€€€€‚ƒ„…†Š‹ŒŽŒŒ‹‹ˆ‡„€|zvqmhfeddccddggilnqswz|€€‚ƒƒ„„„…„……„…„……………‡ˆ‰‹ŒŽŽŽŒ‹ŠŠŠ‰†…ƒ‚€}{yyyyzyyz{{{{|}~~~€€‚ƒ„„………„ƒƒ‚€€~~~€€€ƒ„‰Ž’’““‘‘ŽŒ‰„‚}yuokfa`]]]]__cegjlpsvz|ƒ…ƒ„ƒƒ„ƒ‚‚‚„„………‡ˆ‰Š‹Ž‘ŽŒ‰ˆ†„ƒ€}zxwtsrrssuvwxxz||||~€€€€€€‚‚ƒ„……††…………„„„ƒƒ‚€€ƒ„‡‹Ž’”——•”’’‹‡‚ztnhd_[ZYY[\^aehknqtx{~‚ƒ„„ƒ‚€€‚ƒ„……†ˆŠ‘’“““’Œ‰‡ƒ€~|yvsqponnoqstuvwyz{{|~€€€€€‚‚ƒ„…†‡ˆ‡‡‡‡†……………„ƒƒƒ„†ˆ‹”—›œ›˜—•‡‚~wrlgaZXXWXZ]adhkosvz|€ƒ…‡‡‡†…ƒ€€€ƒ…‡‡‰Š‘”–——˜˜—•‘މ†‚~|yvspnmlllnpsvxz{|}€‚ƒ„……„‚‚‚‚ƒƒ„ƒƒ‚€€€‚ƒ…‡Š”˜›žœ›™˜–…{tnhb[USSSVX[_chkpsvy|€‚ƒƒƒ}{{{z{|ƒ†ˆ‹’–™š™™˜–’‰…}yvspnlkklmoruwy{~‚‚‚‚‚ƒƒ‚~~~~~€€€€€‚„‡‹‘–™žŸ ž››–’…€{sle`YTSTUXZ^cilotw{~€ƒ„…„ƒƒ€}{yzz{|~‚„‡‰’”–™›š˜—”‘Œ‡ƒ{wtsqommnoqtx|„†ˆˆ‰ŠŠ‰‰ˆˆ‡…ƒ€€€€€€€€€€‚„ˆ”šœ ¢ ™™”‹ƒ~yrke_XSTVY]aejosuy|‚……†„ƒ~{ywyz|~‚†ˆ‹Ž‘’“•—˜•‘‹‡|xtpmlmlkkmopsv{‚„†‡‡‡‡†…„ƒ‚‚‚‚€‚‚‚€€€~„ˆ—š¡ ™˜”Œ„~ztlf`YSRTVY^chmqtwz|}~‚ƒ‚€}zxvwz|~‚‡ŠŒ‘‘‘‘‘’’ŒŠ‡‚|wuqnlkmopqsuwy|‚…‡ˆˆˆ‡†„ƒ‚€€€€€‚€…Š’—›   ›˜—Œ…|vohc`ZVWY]aflrwy{}~€€€~|{yy|‚…Š’•–—–”’މ†‚~zurommloruwz~€ƒ…‡ˆ‰ŠŠ‰‡†„‚€€‚ƒ„………„„ƒƒ‚‚€~~}~€„Š’˜œ¢¤£ ›•ˆ|vohc_YUVY]bhntz}‚ƒ€€~{zywvuvy}„‹“•—˜˜–“Š„€|wsnljjklotx|‚…‡‡‡ˆˆˆ‡…ƒ€~}|{{|}€ƒ…‡ˆˆˆˆ‡†„‚|zwvutvy‡‘˜¥§¦¢ –Ž…}wof_ZUOMPT[biry‚„††…‚€~{xvusrqtx}‚ˆ•™œž›—’Œ‡‚|vrnjgffgimrw}„ˆ‰Š‰ˆ‡…ƒ€}zyxxyz}„‡ŠŒ‹Š‡…}ywuttvy~†‘›¢«°±®©¥ž•‹€wog`[WROQU\dmu}ƒˆ‰Šˆ†‚}{xurppopqty…‹“›Ÿ¢¤£Ÿ™“Œ„}vqmjhfghkot{‚‡‹’“‘‹‡„€}zxwvvwz}€ƒˆ‹Ž‘‰…‚~{wtqpppqsw}…‘ž¨®´¶²«¤’†zpib\XVTSTZair{ƒˆŒŒˆƒ~xspmllmpsw{€†“™Ÿ¢££Ÿ™‘‰€xqlgeefhjnrv{†‹‘‘ŽŠƒ}yvrqqsuwz}ƒ†ŠŽŽ‹ˆƒ~zvsqooqrtvx{~…‹”ž¦ª®¯ª¡—†}unjfcbbbaadint|‚…†…‚}wrmihilosx}‚†ŠŽ’–˜œžš–‡wqmjijmqux|ƒ…ˆŠ‹Œ‹‰†‚~{xwxy{ƒ†ˆŠ‹‹‹ŠŠ‰‡„‚|xvtttuxz}€€€€‚…Š‘™ ¢¢—“Š„~yuokgd`]]_ciouz}~{yxwwxz|}‚„†ˆŠ‘”—™š˜•Š„~yurpopqrsuvwx{}€ƒ…†††…ƒ€€‚„†‡ˆˆˆ‡…„„„ƒ€~|ywwwxxz|}}~~~~}}~€ƒ‡Ž•œ¢¦¨¥ š•Ž…|tmfa][YXY[_elry~ƒ‚€~{zwvvwxz~‚†ŠŽ‘”—™š›š–‘‹„}wrnlkklorvz}‚ƒ…†‡ˆ‡†„ƒ‚€€‚„…‡‰‹‹‰†„}zwtqpopqsvz}ƒ„……„‚~}||{|~ƒ‰‘›¥ª®®ª£š‘†zpf_YUTUVX[`gnv~…ˆŠŠ‡ƒ~{wtssux|‚ˆŽ’–™››œœ™•ˆ€xpjfccdglsyƒ†ˆ‰‰‰ˆ‡…ƒ}||~„ˆ‹’•–•“‰„~yuqmkiiknrw|€…ˆ‹ŒŒŠ‡„}zxvvvwy{ƒˆ—Ÿ¨­®¬§‘„xlb[WUUVZ_chnty„ˆŠŠˆ„~xsommpu{‚Š’˜œžŸž›—“މ‚{tnhecdgkpv}‚‡‹Œ‹ˆ…~{yxxxy{~…‹‘–šœž™“Œ„{rkgecdfjmqw}‚†‹Ž‹‰…€{ywuvy|}€„‡ˆŠŒŽŽŽ‘’”––”ˆysolkijklmmopqrsux|‚~|zz{}„ˆ‹Ž‘‘’‘Œˆ…‚€}{yuronoqtx{~€‚ƒƒ‚€~|zz|~ƒ…†‡ˆ‰‹‘““’Œ‡ysokhhjlnpsvx{€„†ˆ‹‹Š‡†„~~~~ƒ………†…„„……„ƒ„„…‡ŠŽˆ‚~{vrnljhikmopsvx{~‚„…„‚€}{|||~€‚„‡ŠŒ‹‰†„‚€}{xurqrsux{~€‚„……„ƒ‚€~}}~€ƒ„…ˆŠŒŽŽ‹‰…€ysokhhjlorwz}€„ˆˆˆŠŠˆ†„ƒ~||}~ƒ………†…ƒ‚ƒ‚€~}}}}€…ŠŽ’“‰„{uqmkhgikmnqtw{~‚††‡†„€|{zxy{€ƒˆ‹‘Ї…‚~|zvsppqrux|‚…‡‡†…„~|{|}ƒ…‡‰‹Ž‘‘Œ‰†€xrmjhhknquy}€‚†‰‰‰Š‹‰‡…„ƒ€~~„‡‡††…ƒ}|}{{}€…‰’”–’Žˆ{sniedehjmpsvx|€‚…††…‚|yxuwz}€ƒ‰’“’І~{xwtrppqsvy}€ƒ…‡ˆ‡†ƒ€}zyxz|ƒ‡‰ŒŽ‹‰†ƒ~ytokihjmqux{~€‚„……††††…„ƒ‚‚ƒ„…„‚€}}}}}}}}}…Š”–˜–‘Šƒ|tnifedgjmqtwyz}‚ƒ„„ƒ€|zywxz~‚†‹“•••‘Œ‡}ywvutssuvx{~ƒ……†…ƒ~{ywvx{„‰‘‘‘‘ŒŠˆ†„}yuqonnpsvy|~~~~€ƒ…‡‡ˆˆˆ‡…„ƒ‚‚ƒƒ‚€}||~~~€€ƒƒ…‰”•˜™”‹ƒ}tmifgfhlpsuxzz{|~€€‚€|yxvvy}ƒ†Œ‘“••”Š„}yvsstutttuvxz}€‚ƒ„ƒ‚€~{xvvx{€…‹’““‘‹ˆ…‚~|{zwusrrrtvxxyzzz{~„†‰‹‹‹‹‹‰†„‚€~}~~}}}}|}€€€~}}~€„‹’•šœ˜‡wojggfgjmpruwxy{~ƒ„…ƒzwtrtw}‚ˆŽ’•––”Žˆ|xuttutssstvy}„†‡‡†„~{yxy{€†Œ“••“‘ŽŒ‰‡…ƒ}zxurpppqsvy{}}}}}‚„‡‰‹Œ‹‹Šˆ…ƒ€}~~~}}}}}~€€€}|{{}€ˆ‘˜ž££’‰skfdcbdhmorvwxy{~€‚ƒƒ€{wsonry†Ž•™š›™•ކ~xsqqrsssssuwz~‚…‡‡†„}yvuuw{ˆ•˜™˜•Œˆ…‚~}{yxvusrrrtvxz{}}}||~‚„‡‹ŽŽŽŒŠ‡…‚€~|{{|{{|}}~€€€~{zzyy}„–ž¤§¥›…xmfb`_`dhlotvxz{}ƒ‚€{vrnlnt}…–œžŸžš“‹‚ysnmnprsuuvxz~‚†ˆ‰‡„}yuttvz€‡Ž•šœš•Š…~}}{yxwwuttuuvxz{{||{z|ƒ†ŠŽŠ…‚€~{zz{z{|~‚‚€}|{zy{€‰“›£©©¡•‰}ofa^]\_djosxz|}~€‚ƒ~yupllqy‚‹”›žŸŸœ–„zrlijlortvxz|~‚…ˆ‰ˆ…}yusstw}ƒŠ‘—›œš–‰ƒ~zxxxxxwvtttssuwxxy{{{{}…Š‘‘‹†‚|yyzz{|~~€€€€}{zyxy{€‡‘œ£«¬¦šŒoe_[[\_ejnsx|}~~~{xsollpw€Š” ¡ œ•Œ‚yqkhhjmrvy{}~„†‡†„|xtrrtw}…”™ž™’‹„~yxyz{{{zvttttvxzzz||{|~ƒ…ŠŽ‘‘Œ‡‚~{xx{}~‚‚‚€|yyyyy{‚‰“œ¤¬¬¥™‹|lb\YYZ_ekqv|€€}zwtpmnszƒ˜ ££ ›“ˆvnifgjnsx|~‚ƒƒ„ƒ~zwsqruzˆ‘—œž›•‡yuuvxyz{zwtsrrtvxyy{{{{}€‚…‰ŒŽŽ‰ƒ~zwvwy|~€ƒƒ€€~|zxwvvx{‚‹–¥¬ª¡”†wg]XVWY`gmty~€‚€~~}{xurpnou~†š¢¤¤ ™†|slgfhlqv{€‚ƒƒ‚ƒƒƒ‚|yvsrty†•œŸ Ÿœ–ކyvuwx{}~|ywvutuxyyy{{z{‚…ˆ‘Œ‡‚~{wuw{}‚……„ƒ„„€€~{xwwwx|…𣫝« ’ƒre]XWX]ekqw}‚‚‚}}|yvsqonpw‰“ž¤¦¤Ÿ–‹woiefjnty~‚ƒ„ƒƒ‚€}ywtqqtx‡–›žž›—ˆ€yutuwy{}~|yvuttuwyyyyyyz~‚…‰ŒŽŒˆƒ~{xvuwz~€ƒ„…„‚‚~}{xvvvvy‰”¥¬ª¢”†vf]XVVZbiouz€‚ƒ‚€}|{xvsqonot{„Ž˜ ££Ÿ—‚xpjggjnsx}‚………„ƒ€}{ywusrsv|ƒŒ“™ž˜‘Šƒ}yvvxz}€}{zxwwyzz{||{|‚„ˆŒŽ‰…€|ywvx{~„†‡†……ƒ€}{zzzy{‡™¡©«¥š‹|k`YVWZahnty‚‚„ƒ}|ywusrqqty‰“œ¡¤¢œ“‡|tlhgjnrx}„…‡†„ƒ€}{yxvtssuy†Ž•›žš”ކzwwyz|~}{ywvvxyz{|}||}€‚…ˆŒŽŠ…€|yvux{}ƒ…†…„„‚€~|zxxxxy}ƒŽ˜¡ª¬§œ}j_YVWZahmrw{}~‚€~{ywusrswzŠ”œŸ¢¡›‘„zqhddgjouy}€‚„ƒƒ„„ƒ‚|zwwwwz€‡Ž”™››˜’‹ƒ{wtstwz{|}{ywvwxz|}€€€‚„†‰ŒŒ‰…}yvtvy{~„…„ƒ‚~}|{zzzzy{„Œ–Ÿ§¬ª¢”„se\WVY_gmsy}€‚‚‚€~|zxvtrsuy‡™Ÿ£¤¡™„ypjggkou{‚„…†………„ƒ€}{xwvvx}ƒŠ–››—‘‰{vssuwxz{{zyxxxy{|}~~~}~€‚…ˆ‹ŒŒ‹‰…~zxwxz|~ƒ„„ƒ‚€~|{{{zyyz}‚Š“›¤¨¨ “…ug^XX[ahnsx|€‚‚‚}zxurpprv|„Œ”šžŸœ—Ž„{qkggjnty}ƒ„„„„„„„‚~{xussuy†“—™™—‘‹„}xvuuvxz||{zyyyz|}~~~~~ƒ†‰‹ŒŒ‹ˆ„€}zyyz|~„……„„ƒ‚€~~}}{{|}€…Ž–ž¥§£šŒ}od\Z[_flqvy|}~‚ƒƒ‚€}yuroprw~†Ž–šœ™“‹‚yqljkmquy}€‚ƒƒ…†ˆˆˆ‡…‚}yvssuz€‡“–—–“މƒ~zxwvwwxyyyxxyz|}~€}|||}~…ˆ‹ŒŒŠ‡„}{zyzz|}€€€€€€€~}|zyy{~‚Š“™ ¤£œƒtha\]`djortwxy{}€ƒ……„‚~ytpoqu{ƒ‹“—šš˜”Ž†€ytpoqrtvxz{}‚…ˆŠŒ‹Š‡‚}xtrrv{ˆŽ“••”Œˆ„}|{yxwvuuuwy{~€‚ƒ‚}||}‚…‡‰Š‰ˆ…ƒ~~~}~~~~€‚ƒƒ‚}|}}€…Œ”𠣡šŽ‚ulfcdgjnpqrstux}…ˆ‰‡„xsnmnsy‰”–•’‹†|ywvusrrrstwz„ˆŒŽŽ‹ˆƒ~yuttw|€…‰ŒŽŽŒ‹‰ˆ‡…ƒ|yvsqooqsvx{~€€~}}}~ƒƒ„……„ƒ‚~~}|{{|}€‚€~|{{}~€…Œ“˜œŸž™„xnheehknooooprw}‚‡ŠŒ‰…ytqoqu{‚‰‘’’ŽŠˆ…‚{xurpopruz~„‰ŽŠ†‚~zxxz|ƒ…ˆŠ‹‹ŒŽŽŒŠ…€{wtrqrtwy{|}~€€€€€€€‚ƒ„†††……„‚~}}|||~€€‚‚€~}}|~€ƒ‰—¢£Ÿ•Š}rkgfgjmmmkklnsz‡ŒŽŒ‡ztonosy…ŠŽŽŒ‹Šˆ…}yuqnllmptz€†‹ŽŽ‹‡ƒ€}{z{|~€‚ƒ„…‡ˆŠ‘Œˆƒ}xsqppqrtvwxy{}~€‚‚‚€~~~~€‚„……†…„ƒ€~}}||}}}}}~€€~}|{|ƒˆ—¢£ž•‰|qjffhkmmkiggkpv~…‹‹†€ytpoquz€…‰‹‹‹‹‹‹ŒŒŒŠ‡‚}ytpmllosx~„‰ŒŒ‹ˆ†„ƒƒ‚‚‚€ƒ†ŠŽ‘’’Š…€{wutttuttttuwy}€ƒ…††…‚~~ƒ…†††„ƒ‚‚‚‚€}|{{z{~€‚ƒƒ‚€~}}~€‚…‹‘—œŸŸš‘†{rnlmoqpniecdgnx‰Ž‡€zvstvzƒ†‡ˆ‡‡ˆ‰Œ‘’‡ztolklnrw|…‡ˆˆ‡‡‡ˆˆ‡†…‚€|zyz}…ŠŽ‘‘Œˆ„€}{yxvtrpoooquy}€ƒ„„ƒ‚€~~~~€€€€€€‚ƒƒƒ‚~|zyyyz|}~~~~~}||}~~~€„‰•››”‹€volkkmmkgdaadjr{ƒˆ‹Š†‚}ywwy{~€‚„„…†‡‰‹ŒŽŒ‡|wsommnpsv{‚„†‡‰Š‹ŒŒŠˆ…‚||~…ˆ‹Œ‹‰‡…ƒ|yvtrrrtvz}€‚„……„ƒƒ„„„„ƒƒ‚‚‚‚ƒ„…†ˆˆˆ‡…‚}||||{||}||}~€~}}~€ƒˆŽ•š˜†}uqpopomhd`_afnw€‡‹‹‰†‚~||}‚ƒƒƒƒƒ„†ˆŠŒˆƒ}wspooprtwz|}‚„†ŠŽ‹‡ƒ€~}~€„†‡ˆˆ‡†……………ƒ~zvspnnprux{~€‚‚ƒ„„……„~}}~€‚„……„ƒ€~|{{zzzzzxwxxz|~€‚ƒƒƒ}|||}€ƒ†Š“—™˜”Œ„|vrponliea__birz†ˆ‰‡„‚€€€‚‚‚‚ƒ†ˆŠŒŒ‰…€|xusrrstvwz|~„‡‹Ž‘ŽŒˆ…ƒ‚‚‚ƒƒ„„ƒƒƒ„„…†††…‚|ywuttuwyz|}‚ƒ„…‡ˆ‡†„‚€~}~€‚‚‚€~~~~}|zyxxxz|~€‚ƒƒƒ‚€~~~~„ˆŽ”˜™˜’Šyspoonljfcabflt}„‰‹ŒŠˆ…ƒ‚‚‚ƒƒƒƒ‚‚‚ƒ„†‰ŒŽ‹ˆƒ{wvuuuvwwxyz|ƒ‡ŠŒŽŽŠ‡…ƒ‚‚‚‚‚€€€‚„††…ƒ}zxvutuuvvwyz{|~ƒ…††…ƒ‚€~~~~€€€€~}}~~~~}|{zyxyz{}€€€~~~€‚‡“—™˜“Œ„}wsrqpnlgcaaciqy€†‰‰ˆ†…„ƒƒ„…„„ƒ‚€€€‚…‡ŠŒŽŠ‡„€}ywwwvvvvvvwz}€…‰ŒŒ‹Šˆ†„„„„„ƒ‚€€€ƒ…††…ƒ€~{yxxxxyxxxxyz|~ƒ„„„„‚€€€€~~~~}|zyyy{|~€€€€‚‚‚‚€~~~‚…‰Ž”—šš—‘ˆ|xvutrojebabgox„‡ˆˆ†„„„…†††…„~}}€„†‰‹ŒŒŠ‡…‚}{yxwvutssuwz}…ˆŠ‹Š‰‡†………………ƒ‚€~}}~€‚„……ƒ|zzyyyyyxxwvvxz|€‚ƒ„„„‚‚‚ƒƒ‚~}}}~€€€~}{zzz{|}~~~~~€ƒƒƒƒƒ~~€€‚„†ŠŽ’•—–’Œ…€{yxvspmhc``chov|ƒƒ‚‚‚ƒ…†‡‡…‚€~}}~€ƒ†ˆ‰‰‰ˆ†„‚€~|{zywuuuvxz~„†ˆ‰‰ˆˆˆˆˆˆˆ‡…ƒ€~}}~€‚ƒƒƒ‚€~|||}}|{{zywvwxz|~€‚‚‚‚‚ƒ„ƒƒ€~~}~€€~}}}}}~~~~~~€‚‚ƒ‚‚€€€‚ƒ…ˆ‘•˜—“†€|ywvtqlgc``aeltz~‚„…‡‡†„€~ƒ…‡‰‰‰‰ˆ†„‚€~|zxxwutuvx{~ƒ†ˆˆ‰ˆˆˆˆ‰‰‰‰ˆ‡…‚~~€ƒ„„‚€~}}||||{yxwvwxy{~€‚ƒƒƒƒƒ„„„……„ƒ€~}}||{|}}}}}}}~~€‚ƒƒ‚€€~€€€‚…Š“••“އ|ywusplhc``aekrx}€‚‚‚‚ƒ…†‡†…„ƒ€€€ƒ…ˆŠ‹‹Š‰ˆ†„‚€~}zywvuttuw{~‚„†ˆˆ‡‡‡‡‡ˆˆ‡†…ƒ€~~~ƒ„……„‚~~~~~}|zxvuuvxy{~€€€€€‚ƒƒƒƒ‚‚€~~~~~~|{{{{{{{|||{{{|}~€~~~~~€‚ƒ…ˆŒ‘–™˜•‰ƒ{ywtpmiebacfkrx~‚‚‚ƒ„„†‡‡†„ƒ‚€‚…‡Š‹ŒŒŒ‹‰‡†„‚}{zyxvuuvxz}„†‡††‡‡‡‡‡‡‡‡…ƒ‚€€€‚„†††…ƒ‚€~~|zxwwvvwy{}~~~~€€‚ƒ‚€~~}~€€€~}|{{||}}}}|||{|}€€€}|}}~~€‚„‡’—™˜”Žˆƒ|zwtqmjgdcdhntzƒ‚‚‚ƒ„„„ƒ‚€€~~~ƒ†‰ŒŒŠ‰ˆ…‚€~|zxwvuuvx|‚„†‡‡†…………†……„ƒ~~€‚„††…ƒ‚€~}|{zzywvuuuuwy|}~~~€‚‚‚ƒ‚‚€€€‚‚‚‚€~}}}||}}}|||}€‚ƒƒƒƒ‚€€€‚…‰’–™™–Š„€}{xurnjfdcdgjpv{€€€~~~€‚„†‰ŒŽŽŒ‹Šˆ…ƒ€~|zywvutuvy|€‚ƒ„„„ƒ‚‚‚‚‚‚ƒ‚€ƒ†‡‡‡ˆ‡„‚€~}}{yxwwwxy{|}}~}}}~~€€€€‚ƒ„„……„‚€~}}|||}}||}~€‚ƒƒƒ‚€~~~}}}~~ƒ†‹“–—•‘‹†‚}zvrnkhfeehkou{‚€€}}|||}}~„ˆŒ‹ˆ†ƒ~|zyxvuttuxz}‚‚‚€‚‚€€~ƒ…‡ˆ‰ˆ‡†…„ƒ‚‚~}|{yyyz{|}~~~}}}~~€€‚ƒ„„†‡‡†…„‚€~}|{{|{{{|}~€‚‚ƒ‚€~|{{||||}‚„ˆ’–˜—”‰„}yvspmigeefhlqw|€€}|||}|||{|}~~‚…‰Œ‘‘Ž‹‰‡„~|{zyxvvvwy{~€‚‚ƒ‚‚‚€€€€ƒ…‡‰ŠŠŠ‰ˆ‡…ƒ‚€~}{zyyxxyz{|}}}}||{{|}}}~~€‚„„†‡‡††„ƒ~}{zzzzzz|}€‚„„ƒ€}|{zz{||}~€ƒ†‹•˜˜–‘Œ‡‚}zvspmjgfeefjouz~€€~}||}}~~}~~€ƒ…‰’““’‘ŽŒŠ‡„~}|{ywuuvx{~‚‚ƒ‚€€€‚ƒ‚€€‚ƒ†ˆŠ‹‹Š‰‰‡…ƒ‚€}zywvwxyz|}~}}}}|{z{{{{{|}}~€‚„†‡ˆˆ‡…‚€}||{zyxwxxz{}€‚‚‚~||{zyz{{{|}ƒ‡Œ‘–™™–’Œ†‚|yvromjihhikpv{€~|{|}~~~~€€€‚…ˆŒŽ‘ŒŠ‰†„~}|zxuttuwz}€~~~~~€‚„†ˆ‰Š‹‹Šˆ†…ƒ‚€~{yxxxxxz|}}~~}||||{{{{{{|}}~€‚„††‡††…ƒ€~|{zzyyyz|}‚ƒ„„ƒ‚€€€~~~~}}~€ƒ…ˆŒ•˜˜•‹†‚€~{wspmkihhilpv{€€~}}}~~}~~~„ˆŒŽŽŒ‰‡…ƒ~}{yvuvwxz|~€€€€€€€€„…‡ˆˆˆ‡†…„‚€}{yyxxxy{{|||||{zyyzzzz{z{|}~€‚…†††††…„‚€}|{zzyxy{}~€‚‚‚‚€€~}|||{{{|}~€‚…‰”—˜–’ˆ„‚|yuroljhhhjnrw{~~||{{{{|}}}~~}~€ƒ‡ŠŒ‘‘‘‹ˆ…ƒ~|zwuuvwxz}€€€€€€~€€€€€ƒ„†ˆ‰‰ŠŠ‰ˆ‡……„ƒ‚€~}{zzzyz{}~~~|{|}}|||}}~~€ƒ…‡ˆˆˆ‡‡…„‚‚€~|||zz{|~‚ƒƒƒƒ‚€}}||{zz{|}~…Š”––“‹†‚|zvspmljhghkotx{}||{zyyyz{|||||}~ƒ†‰ŒŽŽŒŠˆ…„‚}|zyxwxz|}€€€€€~~~~~~}}~€‚„…†ˆŠŠ‰ˆ††……„„„ƒ}|||||||}|{xwwxxyz{{|~~~€‚„…†‡‡…ƒ‚€~}}}||||||~€‚ƒƒƒ‚€~|{{{||{|}„ˆŽ’••“Œˆ„‚|ywtqomkklmpuy}~}||{|||||}||{|~€ƒ†‰ŒŽŒ‰‡……ƒ‚}{zzz|}~€€‚‚~~~~}}~~€ƒ„…‡ˆ‡†……†‡†……„ƒ€}||||{{zzzxwxz{|}}€€€‚ƒƒ„ƒƒ~~~~~~~~€€€}}}{zz{{{|}€ƒ†Š‘‰‡…‚|yvtromkjklorvy{|{{{{{z{|}}~~}~€‚„‡‰‹ŽŽŽŒ‰‡†……„‚€~}}}}~€‚‚‚ƒ„ƒ~~€‚ƒ„………„„„„„ƒ‚‚€}{{zxxxxyyxxxyzz{}€€€‚‚‚€€€€~}}}}}}~~~~~~~~~~~~~~}}}||}€‚…ˆ‹Ž‹‰†ƒ‚€}{xvutrqqsuwy|}~}{{|{{{||}}~~~}~€ƒ…†ˆŠ‹‹‹Š‰ˆ‡‡‡†…„ƒ‚€~€‚‚€~}}~‚‚‚ƒ„„„„ƒ„„„ƒ‚‚}|||||{{{{|||}~€€€€€~~~€€€€€€€€~~~~~~~~~~}}}|{{||{{{}~‚…†‡‡‡…ƒ‚€~}|{zywvvwvuvxz|}~~~|{{{{{{|||}}~€ƒ…‡ˆˆˆ‰‰‰‡‡††……„„ƒ‚‚ƒƒ‚‚‚€€€€~€€‚ƒƒƒƒƒƒƒƒ‚ƒƒ€€~~}}~~~}}~~~~~€€€~€€~~~|}}|}~~€€€€€€€‚‚ƒƒ…†††„ƒ‚€~~|{zyyyyyyyz|}}}}}}}|{|||{{|}}~~€‚‚‚‚‚‚€€€€€‚€€‚‚€€€€€€€€‚€~}~~}}}~}||}~~}}}}}|||}}~~~~~~}}~~~~~~~~~~~~~~~~~~~~€~|}€€~~~€€€€€€€‚‚‚‚‚„…††…ƒ‚€€~~}}}}}||~~~}}}}}}}}}}~€€‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒ„………„ƒƒ„„ƒƒ‚ƒƒƒ€€‚‚‚‚‚‚‚‚‚‚€€€€€~~~~~~€€€€~~~~~}||}|||||}||{|||||||}~~}~€€€€€€~~~~~~~~~€€€€~€~~~~~~~~~}}}}}}}}}}~~}}}~~~€€€€€€€€€€€€€€€€€‚€€€€€€€€~~~~~~~}}}~~}}~~~~~~~€€€€€€€€€‚‚‚ƒƒ‚‚‚ƒƒƒ‚‚‚ƒ„ƒ‚‚‚€€€€€€€€~~~}}}~~~~~~~~~€€€€‚‚€€€‚‚‚‚‚‚€€€€€€€€€€€€€€€‚€~~~~~~~~}}~~~~}}}}}}}}}~~~~}|}}}}}}}||}}||{|||}}|{{}~~~}~€~€€€€€€€€~~~}}~~~}}}}~~~~}~~~~~€€~€€€~~€€€€€€€€€€€€€€€€€€‚‚‚‚‚‚ƒƒƒ‚‚ƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€~~~~~}~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€PythonCard-0.8.2/samples/sounds/readme.txt0000644000076500007650000000011107343743577020503 0ustar alexalex00000000000000sounds is a simple test of the sound.py module that can play .wav files. PythonCard-0.8.2/samples/sounds/sounds.py0000644000076500007650000000233010313163032020344 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.15 $" __date__ = "$Date: 2005/09/18 03:59:22 $" """ from PythonCard import dialog, model, sound import os.path class Sounds(model.Background) : def on_btnPlay_mouseClick(self, event): filename = self.components.fldFilename.text async = self.components.chkAsync.checked loop = self.components.chkLoop.checked # I don't know how to stop a looped sound playing! try: snd = sound.Sound(filename) snd.play(async, loop) except sound.SoundFileError: base = os.path.basename(filename) dialog.alertDialog(self, 'The sound file "%s" is not in a format I can understand.' % base, 'Unknown File Type') def on_btnFile_mouseClick(self, event): # wildcard = "JPG files (*.jpg;*.jpeg)|*.jpg;*.jpeg|GIF files (*.gif)|*.gif|All Files (*.*)|*.*" wildcard = "Wave files (*.wav)|*.wav;*.WAV" path = '' filename = '' result = dialog.openFileDialog(wildcard=wildcard) if result.accepted: s = result.paths[0] self.components.fldFilename.text = s if __name__ == '__main__': app = model.Application(Sounds) app.MainLoop() PythonCard-0.8.2/samples/sounds/sounds.rsrc.py0000644000076500007650000000220110047606361021324 0ustar alexalex00000000000000{ 'application':{ 'type':'Application', 'name':'Test Sounds', 'backgrounds': [ { 'type':'Background', 'name':'Test Sounds', 'title':'Test Sounds', 'position':( 5, 5 ), 'size':( 300, 200 ), 'menubar': { 'type':'MenuBar', 'menus': [ { 'type':'Menu', 'name':'File', 'label':'&File', 'items': [ { 'type':'MenuItem', 'name':'menuFileExit', 'label':'Exit', 'command':'exit' } ] } ] }, 'components': [ { 'type':'TextField', 'name':'fldFilename', 'position':( 5, 4 ), 'size':( 200, -1 ), 'text':'anykey.wav' }, { 'type':'Button', 'name':'btnFile', 'position':( 210, 5 ), 'size':( -1, -1), 'label':'Select File' }, { 'type':'Button', 'name':'btnPlay', 'position':( 5, 40 ), 'size':( -1, -1 ), 'label':'Play' }, { 'type':'CheckBox', 'name':'chkAsync', 'position':( 5, 70 ), 'size':( -1, -1 ), 'label':'Async I/O', 'checked':0 }, { 'type':'CheckBox', 'name':'chkLoop', 'position':( 5, 90 ), 'size':( -1, -1 ), 'label':'Loop sound', 'checked':0 }, ] } ] } } PythonCard-0.8.2/samples/SourceForgeTracker/0000755000076500007650000000000010434046771020723 5ustar alexalex00000000000000PythonCard-0.8.2/samples/SourceForgeTracker/readme.txt0000644000076500007650000000071707343743577022743 0ustar alexalex00000000000000SourceForgeTracker downloads XML from SourceForge in order to display Bug Reports and Feature Requests for a variety of Python SF projects. The XML processing of the Unicode is a bit buggy, so not all items are displayed. SourceForgeTracker provides an example of two alternative layouts, one that has the standard "gray" dialog look and one that uses an alternative backgroundColor and empty Image widgets behind the other widgets to give it a Yahoo-style look. PythonCard-0.8.2/samples/SourceForgeTracker/SourceForgeTracker.colorized.rsrc.py0000644000076500007650000000510010047606310027760 0ustar alexalex00000000000000# Changes - 7/25/01 - RDS # -Added 'label' item to Menu and MenuItem definitions. # -StaticText.label => StaticText.text # { 'application': { 'type':'Application', 'name':'SourceForgeTracker', 'backgrounds': [ { 'type':'Background', 'name':'bgTracker', 'title':'SourceForge Tracker', 'size':( 400, 510 ), 'backgroundColor':'aliceblue', 'menubar': { 'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ {'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit'} ] } ] }, 'components': [ {'type':'StaticLine', 'name':'staticMenuUnderline', 'position':( 0, 0 ), 'size':( 500, -1 ) }, { 'type':'StaticText', 'name':'staticStatus', 'position':( 280, 48 ), 'size':(100, -1), 'text':'', 'alignment':'right', 'backgroundColor':'#B9DAF5' }, { 'type':'Button', 'name':'buttonDownload', 'label':'Update Local Copy', 'position':( 265, 10 ), 'size':(115, -1) }, { 'type':'Choice', 'name':'choiceGroups', 'position':( 12, 10 ), 'items':['PyChecker', 'PyCrust', 'Python', 'PythonCard', 'wxPython'], 'stringSelection':'PythonCard' }, { 'type':'Choice', 'name':'choiceCategories', 'position':( 130, 10 ), 'items':['Bug Reports', 'Feature Requests'], 'stringSelection':'Bug Reports'}, {'type':'Image', 'name':'imgChoices', 'position':( 3, 4 ), 'size':( 386, 35 ), 'file':'', 'backgroundColor':'#6996E0' }, { 'type':'StaticText', 'name':'staticTopics', 'position':( 8, 48 ), 'text':'Topics', 'backgroundColor':'#B9DAF5' }, {'type':'Image', 'name':'imgTopics', 'position':( 5, 45 ), 'size':( 383, 18 ), 'file':'', 'backgroundColor':'#B9DAF5' }, { 'type':'List', 'name':'topicList', 'position':( 4, 65 ), 'size':( 384, 115 ) }, { 'type':'StaticText', 'name':'staticDetail', 'position':( 8, 192 ), 'text':'Details', 'backgroundColor':'#B9DAF5' }, {'type':'Image', 'name':'imgDetail', 'position':( 5, 190 ), 'size':( 383, 18 ), 'file':'', 'backgroundColor':'#B9DAF5' }, { 'type':'TextArea', 'name':'topicDetail', 'position':( 4, 210 ), 'size':( 384, 250 ), 'editable':0 } ] } ] } } PythonCard-0.8.2/samples/SourceForgeTracker/SourceForgeTracker.original.rsrc.py0000644000076500007650000000401410047606310027575 0ustar alexalex00000000000000# Changes - 7/25/01 - RDS # -Added 'label' item to Menu and MenuItem definitions. # -StaticText.label => StaticText.text # { 'application': { 'type':'Application', 'name':'SourceForgeTracker', 'menubar': { 'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ {'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit'} ] } ] }, 'backgrounds': [ { 'type':'Background', 'name':'bgTracker', 'title':'SourceForge Tracker', 'size':( 400, 500 ), 'components': [ {'type':'StaticLine', 'name':'staticMenuUnderline', 'position':( 0, 0 ), 'size':( 500, -1 ) }, { 'type':'StaticText', 'name':'staticStatus', 'position':( 280, 40 ), 'size':(100, -1), 'text':'', 'alignment':'right' }, { 'type':'Button', 'name':'buttonDownload', 'label':'Update Local Copy', 'position':( 270, 5 ) }, { 'type':'Choice', 'name':'choiceGroups', 'position':( 10, 5 ), 'items':['PyChecker', 'PyCrust', 'Python', 'PythonCard', 'wxPython'], 'stringSelection':'PythonCard' }, { 'type':'Choice', 'name':'choiceCategories', 'position':( 130, 5 ), 'items':['Bug Reports', 'Feature Requests'], 'stringSelection':'Bug Reports'}, { 'type':'StaticText', 'name':'staticTopics', 'position':( 5, 40 ), 'text':'Topics' }, { 'type':'List', 'name':'topicList', 'position':( 0, 55 ), 'size':( 390, 115 ) }, { 'type':'StaticText', 'name':'staticDetail', 'position':( 5, 185 ), 'text':'Details' }, { 'type':'TextArea', 'name':'topicDetail', 'position':( 0, 200 ), 'size':( 390, 250 ), 'editable':0 } ] } ] } } PythonCard-0.8.2/samples/SourceForgeTracker/SourceForgeTracker.py0000644000076500007650000001750210347526321025036 0ustar alexalex00000000000000#!/usr/bin/python """ Currently only displays Open topic items. Providing more options and displaying the full info set from the tracker database is left as an exercise for the reader. I did the hard part. ;-) Thanks to Mark Pilgrim for the DOM parsing code. http://diveintopython.org/kgp_divein.html Thanks to Mark Pilgrim and Martin Martin v. Loewis for help with XML and UNICODE issues. http://aspn.activestate.com/ASPN/Mail/Message/xml-sig/967244 """ __version__ = "$Revision: 1.23 $" __date__ = "$Date: 2005/12/13 11:13:21 $" from PythonCard import configuration, model import os from xml.dom import minidom import urllib import webbrowser BUGS = 'Bug Reports' FEATURE_REQUESTS = 'Feature Requests' TOPIC_SEPARATOR = " : " def getText(node): return "".join([c.data for c in node.childNodes if c.nodeType == c.TEXT_NODE]).encode('ascii', 'ignore') def doParse(xml): xml = xml.replace(chr(19), '') xmldoc = minidom.parseString(xml) artifacts = xmldoc.getElementsByTagName('artifact') trackerDict = {} for a in artifacts: key = a.attributes["id"].value trackerDict[key] = \ {"summary":getText(a.getElementsByTagName("summary")[0]), "detail":getText(a.getElementsByTagName("detail")[0]), "status":getText(a.getElementsByTagName("status")[0])} try: followups = a.getElementsByTagName('item') for f in followups: trackerDict[key]['detail'] += '\n\n\n' + \ 'Sender: ' + getText(f.getElementsByTagName("sender")[0]) + '\n' + \ getText(f.getElementsByTagName("text")[0]) except IndexError: pass return trackerDict class Tracker(model.Background): def on_initialize(self, event): self.configPath = os.path.join(configuration.homedir, 'sourceforgetracker') if not os.path.exists(self.configPath): os.mkdir(self.configPath) self.baseSFUrl = 'http://sourceforge.net/export/sf_tracker_export.php?' self.groupIds = {'Boa':1909, 'PyChecker':24686, 'PyCrust':31263, 'Python': 5470, 'PythonCard':19015, 'Scintilla':2439, 'wxPython':10718 } self.categoryIds = {'Boa': {BUGS:101909, FEATURE_REQUESTS:351909}, 'PyChecker': {BUGS:382217, FEATURE_REQUESTS:382220}, 'PyCrust': {BUGS:401706, FEATURE_REQUESTS:401709}, 'Python': {BUGS:105470, FEATURE_REQUESTS:355470}, 'PythonCard': {BUGS:119015, FEATURE_REQUESTS:369015}, 'Scintilla': {BUGS:102439, FEATURE_REQUESTS:352439}, 'wxPython': {BUGS:310718, FEATURE_REQUESTS:360718} } self.defaultGroup = 'PythonCard' self.defaultCategory = FEATURE_REQUESTS temp = self.groupIds.keys() temp.sort() self.components.choiceGroups.items = temp self.components.choiceGroups.stringSelection = self.defaultGroup self.components.choiceCategories.stringSelection = self.defaultCategory #self.parser = None self.trackerDict = {} self.displayTopics(self.defaultGroup, self.defaultCategory) def status(self, txt): self.components.staticStatus.text = txt def buildUrl(self, group, category): groupId = self.groupIds[group] atId = self.categoryIds[group][category] return self.baseSFUrl + 'atid=' + str(atId) + '&group_id=' + str(groupId) def buildFilename(self, group, category): name = group + '_' + category.replace(' ', '') + '.xml' return os.path.join(self.configPath, name) def loadXML(self, group, category): filename = self.buildFilename(group, category) try: fp = open(filename, 'rb') xml = fp.read() fp.close() return xml except IOError: return '' def displayTopics(self, group, category): self.components.topicList.clear() filename = self.buildFilename(group, category) if not os.path.exists(filename): url = self.buildUrl(group, category) #print "downloading", filename, url self.downloadFile(url, filename) xml = self.loadXML(group, category) self.status('Parsing XML...') self.trackerDict = doParse(xml) self.status('Display Topics...') topics = [] for artifact in self.trackerDict: # handling other variations is left as an exercise for the reader if self.trackerDict[artifact]['status'] == 'Open': topics.append(artifact + TOPIC_SEPARATOR + self.trackerDict[artifact]['summary']) topics.sort() self.components.topicList.clear() for t in topics: self.components.topicList.append(t) self.status('') def downloadFile(self, url, filename): try: #print "url", url self.status("Downloading...") fp = urllib.urlopen(url) xml = fp.read() fp.close() #print "downloaded", url self.status("Writing file...") #print filename op = open(filename, 'wb') # fix SourceForge malformed XML op.write('\n') op.write(xml) op.close() #print "wrote", filename except IOError: pass # show a warning dialog one of these days self.status('') def on_choiceGroups_select(self, event): group = event.target.stringSelection category = self.components.choiceCategories.stringSelection self.displayTopics(group, category) def on_choiceCategories_select(self, event): group = self.components.choiceGroups.stringSelection category = event.target.stringSelection self.displayTopics(group, category) def on_topicList_select(self, event): artifact, summary = event.target.stringSelection.split(TOPIC_SEPARATOR) self.components.topicDetail.text = self.trackerDict[str(artifact)]['detail'] def doLaunch(self, url): # launch a new browser window and autoraise it # there appears to be a bug in webbrowser.py because # if a window already exists, a new one isn't being created ?! webbrowser.open(url, 1, 1) def on_topicList_mouseDoubleClick(self, event): # http://sourceforge.net/tracker/index.php?func=detail&aid=446264&group_id=19015&atid=119015 selection = event.target.stringSelection if selection != "": artifactId, summary = event.target.stringSelection.split(TOPIC_SEPARATOR) group = self.components.choiceGroups.stringSelection groupId = self.groupIds[group] category = self.components.choiceCategories.stringSelection categoryId = self.categoryIds[group][category] url = 'http://sourceforge.net/tracker/index.php?func=detail&aid=' + \ str(artifactId) + '&group_id=' + str(groupId) + '&atid=' + str(categoryId) self.doLaunch(url) def on_buttonDownload_mouseClick(self, event): group = self.components.choiceGroups.stringSelection category = self.components.choiceCategories.stringSelection filename = self.buildFilename(group, category) url = self.buildUrl(group, category) #print filename #print url self.downloadFile(url, filename) self.displayTopics(group, category) if __name__ == '__main__': app = model.Application(Tracker) # use the following initialization instead # if you don't like the colorized layout #app = model.Application(Tracker, 'SourceForgeTracker.original.rsrc.py') app.MainLoop() PythonCard-0.8.2/samples/SourceForgeTracker/SourceForgeTracker.rsrc.py0000644000076500007650000000401410047606310025772 0ustar alexalex00000000000000# Changes - 7/25/01 - RDS # -Added 'label' item to Menu and MenuItem definitions. # -StaticText.label => StaticText.text # { 'application': { 'type':'Application', 'name':'SourceForgeTracker', 'menubar': { 'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ {'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit'} ] } ] }, 'backgrounds': [ { 'type':'Background', 'name':'bgTracker', 'title':'SourceForge Tracker', 'size':( 400, 500 ), 'components': [ {'type':'StaticLine', 'name':'staticMenuUnderline', 'position':( 0, 0 ), 'size':( 500, -1 ) }, { 'type':'StaticText', 'name':'staticStatus', 'position':( 280, 40 ), 'size':(100, -1), 'text':'', 'alignment':'right' }, { 'type':'Button', 'name':'buttonDownload', 'label':'Update Local Copy', 'position':( 270, 5 ) }, { 'type':'Choice', 'name':'choiceGroups', 'position':( 10, 5 ), 'items':['PyChecker', 'PyCrust', 'Python', 'PythonCard', 'wxPython'], 'stringSelection':'PythonCard' }, { 'type':'Choice', 'name':'choiceCategories', 'position':( 130, 5 ), 'items':['Bug Reports', 'Feature Requests'], 'stringSelection':'Bug Reports'}, { 'type':'StaticText', 'name':'staticTopics', 'position':( 5, 40 ), 'text':'Topics' }, { 'type':'List', 'name':'topicList', 'position':( 0, 55 ), 'size':( 390, 115 ) }, { 'type':'StaticText', 'name':'staticDetail', 'position':( 5, 185 ), 'text':'Details' }, { 'type':'TextArea', 'name':'topicDetail', 'position':( 0, 200 ), 'size':( 390, 250 ), 'editable':0 } ] } ] } } PythonCard-0.8.2/samples/spirograph/0000755000076500007650000000000010434046771017342 5ustar alexalex00000000000000PythonCard-0.8.2/samples/spirograph/readme.txt0000644000076500007650000000240307574607032021343 0ustar alexalex00000000000000spirograph.py is a direct port of the Java applet by Anu Garg at: http://www.wordsmith.org/anu/java/spirograph.html The following quote is from Anu's page: What is a Spirograph? A Spirograph is formed by rolling a circle inside or outside of another circle. The pen is placed at any point on the rolling circle. If the radius of fixed circle is R, the radius of moving circle is r, and the offset of the pen point in the moving circle is O, then the equation of the resulting curve is defined by: x = (R+r)*cos(t) - O*cos(((R+r)/r)*t) y = (R+r)*sin(t) - O*sin(((R+r)/r)*t) There is a second sample called spirographInteractive.py which draws the complete spirograph as each slider, color, or other value is changed. This makes spirographInteractive much more like the Java applet and the drawing speed is similar. On a machine with a faster video card, drawing should be sufficiently fast that the UI won't be sluggish unless the number of revolutions is quite high. However, since spirographInteractive doesn't allow you to see the individual points or lines of the pattern as they are drawn or overlay multiple patterns and is more demanding of machine resources I decided to make it a separate program rather than complicating the code and UI of the spirograph sample. PythonCard-0.8.2/samples/spirograph/spirograph.py0000644000076500007650000001651510313163032022064 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.23 $" __date__ = "$Date: 2005/09/18 03:59:22 $" """ """ this is a direct port of the Java applet at http://www.wordsmith.org/anu/java/spirograph.html """ from PythonCard import clipboard, dialog, graphic, model import wx import os import random import math class Spirograph(model.Background): def on_initialize(self, event): self.filename = None comp = self.components self.sliderLabels = { 'stcFixedCircleRadius':comp.stcFixedCircleRadius.text, 'stcMovingCircleRadius':comp.stcMovingCircleRadius.text, 'stcMovingCircleOffset':comp.stcMovingCircleOffset.text, 'stcRevolutionsInRadians':comp.stcRevolutionsInRadians.text, } self.setSliderLabels() if self.components.chkDarkCanvas.checked: self.components.bufOff.backgroundColor = 'black' self.components.bufOff.clear() self.doSpirograph() def doSpirograph(self): comp = self.components comp.btnDraw.enabled = 0 canvas = comp.bufOff width, height = canvas.size xOffset = width / 2 yOffset = height / 2 R = comp.sldFixedCircleRadius.value r = comp.sldMovingCircleRadius.value O = comp.sldMovingCircleOffset.value revolutions = comp.sldRevolutionsInRadians.value color = comp.btnColor.backgroundColor canvas.foregroundColor = color if not comp.chkAutoRefresh.checked: canvas.autoRefresh = 0 if comp.chkClearDisplay.checked: canvas.clear() if comp.radDrawingStyle.stringSelection == 'Lines': drawLines = 1 else: drawLines = 0 t = 0.0 if R+r+O == 0: # avoid divide by zero errors s = 5.0/0.0000001 else: s = 5.0/(R+r+O) rSum = R + r # avoid divide by zero errors if r == 0: r = 0.0000001 exprResult = (rSum * t) / r lastX = int(round(rSum*math.cos(t) - O*math.cos(exprResult) + xOffset)) lastY = int(round(rSum*math.sin(t) - O*math.sin(exprResult) + yOffset)) self.keepDrawing = 1 while self.keepDrawing and abs(t) <= revolutions: self.statusBar.text = 'Revolutions: %1.2f' % t exprResult = (rSum * t) / r x = int(round(rSum*math.cos(t) - O*math.cos(exprResult) + xOffset)) y = int(round(rSum*math.sin(t) - O*math.sin(exprResult) + yOffset)) if drawLines: canvas.drawLine((lastX, lastY), (x, y)) lastX = x lastY = y else: canvas.drawPoint((x, y)) t += s wx.SafeYield(self) if not comp.chkAutoRefresh.checked: canvas.autoRefresh = 1 canvas.refresh() comp.btnDraw.enabled = 1 def on_btnColor_mouseClick(self, event): result = dialog.colorDialog(self) if result.accepted: self.components.bufOff.foregroundColor = result.color event.target.backgroundColor = result.color def on_select(self, event): name = event.target.name # only process Sliders if name.startswith('sld'): labelName = 'stc' + name[3:] self.components[labelName].text = self.sliderLabels[labelName] + \ ' ' + str(event.target.value) def on_chkDarkCanvas_mouseClick(self, event): if event.target.checked: self.components.bufOff.backgroundColor = 'black' else: self.components.bufOff.backgroundColor = 'white' def setSliderLabels(self): comp = self.components for key in self.sliderLabels: sliderName = 'sld' + key[3:] comp[key].text = self.sliderLabels[key] + ' ' + str(comp[sliderName].value) def on_btnRandom_mouseClick(self, event): comp = self.components comp.sldFixedCircleRadius.value = random.randint(1, 100) comp.sldMovingCircleRadius.value = random.randint(-50, 50) comp.sldMovingCircleOffset.value = random.randint(1, 100) self.setSliderLabels() def on_btnDraw_mouseClick(self, event): self.doSpirograph() def on_btnCancel_mouseClick(self, event): self.keepDrawing = 0 def openFile(self): wildcard = "All files (*.*)|*.*" result = dialog.openFileDialog(None, "Import which file?", '', '', wildcard) if result.accepted: path = result.paths[0] os.chdir(os.path.dirname(path)) try: self.filename = path filename = os.path.splitext(os.path.basename(path))[0] if filename.startswith('spiro'): items = filename[5:].split('_') comp = self.components comp.sldFixedCircleRadius.value = int(items[0]) comp.sldMovingCircleRadius.value = int(items[1]) comp.sldMovingCircleOffset.value = int(items[2]) comp.btnColor.backgroundColor = eval(items[3]) comp.chkDarkCanvas.checked = int(items[4]) if items[5] == 'L': comp.radDrawingStyle.stringSelection = 'Lines' else: comp.radDrawingStyle.stringSelection = 'Points' comp.sldRevolutionsInRadians.value = int(items[6]) self.setSliderLabels() bmp = graphic.Bitmap(self.filename) self.components.bufOff.drawBitmap(bmp, (0, 0)) except IOError, msg: pass def on_menuFileOpen_select(self, event): self.openFile() def on_menuFileSaveAs_select(self, event): if self.filename is None: path = '' filename = '' else: path, filename = os.path.split(self.filename) comp = self.components style = comp.radDrawingStyle.stringSelection[0] filename = 'spiro' + str(comp.sldFixedCircleRadius.value) + '_' + \ str(comp.sldMovingCircleRadius.value) + '_' + \ str(comp.sldMovingCircleOffset.value) + '_' + \ str(comp.btnColor.backgroundColor) + '_' + \ str(comp.chkDarkCanvas.checked) + '_' + \ style + '_' + \ str(comp.sldRevolutionsInRadians.value) + \ '.png' wildcard = "All files (*.*)|*.*" result = dialog.saveFileDialog(None, "Save As", path, filename, wildcard) if result.accepted: path = result.paths[0] fileType = graphic.bitmapType(path) try: bmp = self.components.bufOff.getBitmap() bmp.SaveFile(path, fileType) return True except IOError, msg: return False else: return False def on_menuEditCopy_select(self, event): clipboard.setClipboard(self.components.bufOff.getBitmap()) def on_menuEditPaste_select(self, event): bmp = clipboard.getClipboard() if isinstance(bmp, wx.Bitmap): self.components.bufOff.drawBitmap(bmp) def on_editClear_command(self, event): self.components.bufOff.clear() if __name__ == '__main__': app = model.Application(Spirograph) app.MainLoop() PythonCard-0.8.2/samples/spirograph/spirograph.rsrc.py0000644000076500007650000001062110110220703023016 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'Spirograph', 'backgrounds': [ {'type':'Background', 'name':'bgSpirograph', 'title':'Spirograph PythonCard Application', 'size':(770, 595), 'statusBar':1, 'menubar': {'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ {'type':'MenuItem', 'name':'menuFileOpen', 'label':'&Open...\tCtrl+O', }, {'type':'MenuItem', 'name':'menuFileSaveAs', 'label':'Save &As...', }, {'type':'MenuItem', 'name':'fileSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit', }, ] }, {'type':'Menu', 'name':'menuEdit', 'label':'&Edit', 'items': [ {'type':'MenuItem', 'name':'menuEditCopy', 'label':'&Copy\tCtrl+C', }, {'type':'MenuItem', 'name':'menuEditPaste', 'label':'&Paste\tCtrl+V', }, {'type':'MenuItem', 'name':'editSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditClear', 'label':'&Clear', 'command':'editClear', }, ] }, ] }, 'components': [ {'type':'BitmapCanvas', 'name':'bufOff', 'position':(3, 3), 'size':(525, 525), 'thickness':1, }, {'type':'StaticText', 'name':'stcFixedCircleRadius', 'position':(540, 30), 'text':'Fixed circle radius (1 - 100):', }, {'type':'StaticText', 'name':'stcMovingCircleRadius', 'position':(540, 70), 'text':'Moving circle radius (-50 - 50):', }, {'type':'StaticText', 'name':'stcMovingCircleOffset', 'position':(540, 110), 'text':'Moving circle offset (1 - 100):', }, {'type':'StaticText', 'name':'stcRevolutionsInRadians', 'position':(540, 260), 'text':'Revolutions in radians (1 - 500):', }, {'type':'Slider', 'name':'sldFixedCircleRadius', 'position':(540, 46), 'size':(200, 20), 'layout':'horizontal', 'max':100, 'min':1, 'value':74, }, {'type':'Slider', 'name':'sldMovingCircleRadius', 'position':(540, 86), 'size':(200, 20), 'layout':'horizontal', 'max':50, 'min':-50, 'value':25, }, {'type':'Slider', 'name':'sldMovingCircleOffset', 'position':(540, 126), 'size':(200, 20), 'layout':'horizontal', 'max':100, 'min':1, 'value':78, }, {'type':'Button', 'name':'btnColor', 'position':(540, 154), 'label':'Color', 'backgroundColor':(0, 128, 255), }, {'type':'CheckBox', 'name':'chkDarkCanvas', 'position':(652, 160), 'checked':0, 'label':'Dark Canvas', }, {'type':'RadioGroup', 'name':'radDrawingStyle', 'position':(540, 200), 'items':['Lines', 'Points'], 'label':'Draw as', 'layout':'horizontal', 'max':1, 'stringSelection':'Lines', }, {'type':'Slider', 'name':'sldRevolutionsInRadians', 'position':(540, 276), 'size':(200, 20), 'layout':'horizontal', 'max':500, 'min':1, 'value':50, }, {'type':'CheckBox', 'name':'chkAutoRefresh', 'position':(540, 310), 'checked':1, 'label':'Update display while drawing', }, {'type':'CheckBox', 'name':'chkClearDisplay', 'position':(540, 330), 'checked':1, 'label':'Clear display before drawing', }, {'type':'Button', 'name':'btnRandom', 'position':(540, 360), 'label':'Random Circle Values', }, {'type':'Button', 'name':'btnDraw', 'position':(550, 400), 'label':'Draw', }, {'type':'Button', 'name':'btnCancel', 'position':(650, 400), 'label':'Stop', }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/samples/spirographInteractive/0000755000076500007650000000000010434046771021540 5ustar alexalex00000000000000PythonCard-0.8.2/samples/spirographInteractive/readme.txt0000644000076500007650000000240310044754334023533 0ustar alexalex00000000000000spirograph.py is a direct port of the Java applet by Anu Garg at: http://www.wordsmith.org/anu/java/spirograph.html The following quote is from Anu's page: What is a Spirograph? A Spirograph is formed by rolling a circle inside or outside of another circle. The pen is placed at any point on the rolling circle. If the radius of fixed circle is R, the radius of moving circle is r, and the offset of the pen point in the moving circle is O, then the equation of the resulting curve is defined by: x = (R+r)*cos(t) - O*cos(((R+r)/r)*t) y = (R+r)*sin(t) - O*sin(((R+r)/r)*t) There is a second sample called spirographInteractive.py which draws the complete spirograph as each slider, color, or other value is changed. This makes spirographInteractive much more like the Java applet and the drawing speed is similar. On a machine with a faster video card, drawing should be sufficiently fast that the UI won't be sluggish unless the number of revolutions is quite high. However, since spirographInteractive doesn't allow you to see the individual points or lines of the pattern as they are drawn or overlay multiple patterns and is more demanding of machine resources I decided to make it a separate program rather than complicating the code and UI of the spirograph sample. PythonCard-0.8.2/samples/spirographInteractive/spirographInteractive.py0000644000076500007650000001606010313163032026453 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.4 $" __date__ = "$Date: 2005/09/18 03:59:22 $" """ """ this is a direct port of the Java applet at http://www.wordsmith.org/anu/java/spirograph.html """ from PythonCard import clipboard, dialog, graphic, model import wx import os import random import math class Spirograph(model.Background): def on_initialize(self, event): self.filename = None comp = self.components self.sliderLabels = { 'stcFixedCircleRadius':comp.stcFixedCircleRadius.text, 'stcMovingCircleRadius':comp.stcMovingCircleRadius.text, 'stcMovingCircleOffset':comp.stcMovingCircleOffset.text, 'stcRevolutionsInRadians':comp.stcRevolutionsInRadians.text, } self.setSliderLabels() if self.components.chkDarkCanvas.checked: self.components.bufOff.backgroundColor = 'black' self.components.bufOff.clear() self.doSpirograph() def doSpirograph(self): comp = self.components canvas = comp.bufOff width, height = canvas.size xOffset = width / 2 yOffset = height / 2 R = comp.sldFixedCircleRadius.value r = comp.sldMovingCircleRadius.value O = comp.sldMovingCircleOffset.value revolutions = comp.sldRevolutionsInRadians.value color = comp.btnColor.backgroundColor canvas.foregroundColor = color canvas.autoRefresh = 0 canvas.clear() if comp.radDrawingStyle.stringSelection == 'Lines': drawLines = 1 else: drawLines = 0 t = 0.0 if R+r+O == 0: # avoid divide by zero errors s = 5.0/0.0000001 else: s = 5.0/(R+r+O) rSum = R + r # avoid divide by zero errors if r == 0: r = 0.0000001 exprResult = (rSum * t) / r lastX = rSum*math.cos(t) - O*math.cos(exprResult) + xOffset lastY = rSum*math.sin(t) - O*math.sin(exprResult) + yOffset self.keepDrawing = 1 points = [] while abs(t) <= revolutions: exprResult = (rSum * t) / r x = rSum*math.cos(t) - O*math.cos(exprResult) + xOffset y = rSum*math.sin(t) - O*math.sin(exprResult) + yOffset if drawLines: points.append((lastX, lastY, x, y)) lastX = x lastY = y else: points.append((x, y)) t += s if drawLines: canvas.drawLineList(points) else: canvas.drawPointList(points) canvas.autoRefresh = 1 canvas.refresh() def on_btnColor_mouseClick(self, event): result = dialog.colorDialog(self) if result.accepted: self.components.bufOff.foregroundColor = result.color event.target.backgroundColor = result.color self.doSpirograph() def on_select(self, event): name = event.target.name # only process Sliders if name.startswith('sld'): labelName = 'stc' + name[3:] self.components[labelName].text = self.sliderLabels[labelName] + \ ' ' + str(event.target.value) self.doSpirograph() def on_chkDarkCanvas_mouseClick(self, event): if event.target.checked: self.components.bufOff.backgroundColor = 'black' else: self.components.bufOff.backgroundColor = 'white' self.doSpirograph() def setSliderLabels(self): comp = self.components for key in self.sliderLabels: sliderName = 'sld' + key[3:] comp[key].text = self.sliderLabels[key] + ' ' + str(comp[sliderName].value) def on_btnRandom_mouseClick(self, event): comp = self.components comp.sldFixedCircleRadius.value = random.randint(1, 100) comp.sldMovingCircleRadius.value = random.randint(-50, 50) comp.sldMovingCircleOffset.value = random.randint(1, 100) self.setSliderLabels() self.doSpirograph() def openFile(self): wildcard = "All files (*.*)|*.*" result = dialog.openFileDialog(None, "Import which file?", '', '', wildcard) if result.accepted: path = result.paths[0] os.chdir(os.path.dirname(path)) try: self.filename = path filename = os.path.splitext(os.path.basename(path))[0] if filename.startswith('spiro'): items = filename[5:].split('_') comp = self.components comp.sldFixedCircleRadius.value = int(items[0]) comp.sldMovingCircleRadius.value = int(items[1]) comp.sldMovingCircleOffset.value = int(items[2]) comp.btnColor.backgroundColor = eval(items[3]) comp.chkDarkCanvas.checked = int(items[4]) if items[5] == 'L': comp.radDrawingStyle.stringSelection = 'Lines' else: comp.radDrawingStyle.stringSelection = 'Points' comp.sldRevolutionsInRadians.value = int(items[6]) self.setSliderLabels() bmp = graphic.Bitmap(self.filename) self.components.bufOff.drawBitmap(bmp, (0, 0)) except IOError, msg: pass def on_menuFileOpen_select(self, event): self.openFile() def on_menuFileSaveAs_select(self, event): if self.filename is None: path = '' filename = '' else: path, filename = os.path.split(self.filename) comp = self.components style = comp.radDrawingStyle.stringSelection[0] filename = 'spiro' + str(comp.sldFixedCircleRadius.value) + '_' + \ str(comp.sldMovingCircleRadius.value) + '_' + \ str(comp.sldMovingCircleOffset.value) + '_' + \ str(comp.btnColor.backgroundColor) + '_' + \ str(comp.chkDarkCanvas.checked) + '_' + \ style + '_' + \ str(comp.sldRevolutionsInRadians.value) + \ '.png' wildcard = "All files (*.*)|*.*" result = dialog.saveFileDialog(None, "Save As", path, filename, wildcard) if result.accepted: path = result.paths[0] fileType = graphic.bitmapType(path) try: bmp = self.components.bufOff.getBitmap() bmp.SaveFile(path, fileType) return True except IOError, msg: return False else: return False def on_menuEditCopy_select(self, event): clipboard.setClipboard(self.components.bufOff.getBitmap()) def on_menuEditPaste_select(self, event): bmp = clipboard.getClipboard() if isinstance(bmp, wx.Bitmap): self.components.bufOff.drawBitmap(bmp) def on_editClear_command(self, event): self.components.bufOff.clear() if __name__ == '__main__': app = model.Application(Spirograph) app.MainLoop() PythonCard-0.8.2/samples/spirographInteractive/spirographInteractive.rsrc.py0000644000076500007650000000763410110220703027424 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'Spirograph', 'backgrounds': [ {'type':'Background', 'name':'bgSpirograph', 'title':'Spirograph PythonCard Application', 'size':(770, 595), 'statusBar':1, 'menubar': {'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ {'type':'MenuItem', 'name':'menuFileOpen', 'label':'&Open...\tCtrl+O', }, {'type':'MenuItem', 'name':'menuFileSaveAs', 'label':'Save &As...', }, {'type':'MenuItem', 'name':'fileSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit', }, ] }, {'type':'Menu', 'name':'menuEdit', 'label':'&Edit', 'items': [ {'type':'MenuItem', 'name':'menuEditCopy', 'label':'&Copy\tCtrl+C', }, {'type':'MenuItem', 'name':'menuEditPaste', 'label':'&Paste\tCtrl+V', }, {'type':'MenuItem', 'name':'editSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditClear', 'label':'&Clear', 'command':'editClear', }, ] }, ] }, 'components': [ {'type':'BitmapCanvas', 'name':'bufOff', 'position':(3, 3), 'size':(525, 525), 'thickness':1, }, {'type':'StaticText', 'name':'stcFixedCircleRadius', 'position':(540, 30), 'text':'Fixed circle radius (1 - 100):', }, {'type':'StaticText', 'name':'stcMovingCircleRadius', 'position':(540, 70), 'text':'Moving circle radius (-50 - 50):', }, {'type':'StaticText', 'name':'stcMovingCircleOffset', 'position':(540, 110), 'text':'Moving circle offset (1 - 100):', }, {'type':'StaticText', 'name':'stcRevolutionsInRadians', 'position':(540, 260), 'text':'Revolutions in radians (1 - 500):', }, {'type':'Slider', 'name':'sldFixedCircleRadius', 'position':(540, 46), 'size':(200, 20), 'layout':'horizontal', 'max':100, 'min':1, 'value':74, }, {'type':'Slider', 'name':'sldMovingCircleRadius', 'position':(540, 86), 'size':(200, 20), 'layout':'horizontal', 'max':50, 'min':-50, 'value':25, }, {'type':'Slider', 'name':'sldMovingCircleOffset', 'position':(540, 126), 'size':(200, 20), 'layout':'horizontal', 'max':100, 'min':1, 'value':78, }, {'type':'Button', 'name':'btnColor', 'position':(540, 154), 'label':'Color', 'backgroundColor':(0, 128, 255), }, {'type':'CheckBox', 'name':'chkDarkCanvas', 'position':(652, 160), 'checked':0, 'label':'Dark Canvas', }, {'type':'RadioGroup', 'name':'radDrawingStyle', 'position':(540, 200), 'items':['Lines', 'Points'], 'label':'Draw as', 'layout':'horizontal', 'max':1, 'stringSelection':'Lines', }, {'type':'Slider', 'name':'sldRevolutionsInRadians', 'position':(540, 276), 'size':(200, 20), 'layout':'horizontal', 'max':500, 'min':1, 'value':50, }, {'type':'Button', 'name':'btnRandom', 'position':(540, 360), 'label':'Random Circle Values', }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/samples/stockprice/0000755000076500007650000000000010434046771017332 5ustar alexalex00000000000000PythonCard-0.8.2/samples/stockprice/readme.txt0000644000076500007650000000054407427324615021337 0ustar alexalex00000000000000This sample is a clone of the AppleScript Studio example at: http://www.oreillynet.com/pub/a/mac/2002/02/01/applescript_macosx.html It requires the SOAP.py module from SOAP.py 0.9.7 available at: http://sourceforge.net/projects/pywebsvcs Also see the SOAP.py authors article at: http://www-106.ibm.com/developerworks/webservices/library/ws-pyth2/ PythonCard-0.8.2/samples/stockprice/stockprice.py0000644000076500007650000000614610313163032022043 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.12 $" __date__ = "$Date: 2005/09/18 03:59:22 $" This sample is a clone of the AppleScript Studio example at: http://www.oreillynet.com/pub/a/mac/2002/02/01/applescript_macosx.html It requires the SOAP.py module from SOAP.py 0.9.7 available at: http://sourceforge.net/projects/pywebsvcs Also see the SOAP.py authors article at: http://www-106.ibm.com/developerworks/webservices/library/ws-pyth2/ """ from PythonCard import dialog, model import time try: from SOAP import SOAPProxy FOUND_SOAP = 1 except ImportError, msg: try: from SOAPpy import SOAPProxy FOUND_SOAP = 1 except ImportError, msg: FOUND_SOAP = 0 # KEA 2001-12-11 # if you want to build a standalone executable using py2exe # then uncomment the import line below # due to the way the dynamic imports of components work, each # component that an app uses needs to be imported statically when # doing a py2exe build #from PythonCard.components import button, choice, statictext, textfield """ # http://services.xmethods.net/soap/urn:xmethods-delayed-quotes.wsdl >>> server = SOAPProxy('http://services.xmethods.net/soap', namespace='urn:xmethods-delayed-quotes') >>> server.getQuote('MSFT') 62.659999999999997 I want to use this service # http://soaptest.activestate.com/ # http://soaptest.activestate.com/StockQuotePlus.wsdl # how am I supposed to know what country names are valid?!!! # this service is down, so I haven't been able to get the right incantation yet >>> server = SOAPProxy("http://soaptest.activestate.com:8080/PerlEx/soap.plex", namespace="uri:http://activestate.com/", soapaction="urn:activestate") >>> server.StockQuoteInCountry("SUNW", "United States") but it is currently down, so I can't test against it. I chose an alternative stock price service from the list of SOAP web services at: http://www.xmethods.net/ """ # need a decent way of handling timeouts here # look at options in SOAP.py def getStockPrice(symbol, country='United States'): price = -1 try: server = SOAPProxy('http://services.xmethods.net/soap', namespace='urn:xmethods-delayed-quotes') price = server.getQuote(symbol) except Exception, msg: pass return price class Minimal(model.Background): def on_initialize(self, event): if not FOUND_SOAP: # alert user, then exit cleanly result = dialog.alertDialog(self, "Can't find SOAP.py module, exiting application...", 'Error: Missing module') self.close() def displayDateTime(self, t): dateStr = time.strftime("%A, %B %d, %Y, %I:%M %p", t) self.components.fldDate.text = dateStr def on_btnGetPrice_mouseClick(self, event): symbol = self.components.fldStockSymbol.text country = self.components.chcCurrency.stringSelection self.components.fldStockPrice.text = str(getStockPrice(symbol, country)) now = time.localtime(time.time()) self.displayDateTime(now) if __name__ == '__main__': app = model.Application(Minimal) app.MainLoop() PythonCard-0.8.2/samples/stockprice/stockprice.rsrc.py0000644000076500007650000000412310101467457023021 0ustar alexalex00000000000000{ 'application':{ 'type':'Application', 'name':'Template', 'backgrounds': [ {'type':'Background', 'name':'bgTemplate', 'title':'Stock Price Getter', 'size':(394, 222), 'menubar': {'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ {'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit', 'command':'exit', }, ] }, ] }, 'components': [ {'type':'TextField', 'name':'fldStockSymbol', 'position':(150, 5), 'size':(60, -1), }, {'type':'Choice', 'name':'chcCurrency', 'position':(150, 35), 'size':(-1, 21), 'items':['United States'], 'stringSelection':'United States', }, {'type':'Button', 'name':'btnGetPrice', 'position':(150, 65), 'label':'Get price', 'default':1, }, {'type':'TextField', 'name':'fldStockPrice', 'position':(150, 105), 'size':(75, -1), 'editable':0, }, {'type':'TextField', 'name':'fldDate', 'position':(150, 140), 'size':(231, -1), 'editable':0, }, {'type':'StaticText', 'name':'stcDate', 'position':(5, 145), 'size':(100, -1), 'font':{'family': 'sansSerif', 'style': 'bold'}, 'text':'Date:', }, {'type':'StaticText', 'name':'stcStockPrice', 'position':(5, 110), 'size':(130, -1), 'font':{'family': 'sansSerif', 'style': 'bold'}, 'text':'Latest Stock price:', }, {'type':'StaticText', 'name':'stcCurrencyType', 'position':(5, 40), 'size':(141, -1), 'font':{'family': 'sansSerif', 'style': 'bold'}, 'text':'Choose Currency:', }, {'type':'StaticText', 'name':'stcStockSymbol', 'position':(5, 10), 'size':(135, -1), 'font':{'family': 'sansSerif', 'style': 'bold'}, 'text':'Enter Stock Symbol:', }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/samples/sudoku/0000755000076500007650000000000010434046771016476 5ustar alexalex00000000000000PythonCard-0.8.2/samples/sudoku/about.txt0000644000076500007650000000005410317062443020342 0ustar alexalex00000000000000Sudoku Solver 0.1 (c) 2005 Alex Tweedly. PythonCard-0.8.2/samples/sudoku/readme.txt0000644000076500007650000001766110317062443020501 0ustar alexalex00000000000000Sudoku Solver can solve, or help you solve, Sudoku puzzles. The rules of Sudoku are very simple: - each digit 1-9 must appear exactly once in each row, column or 3x3 square Solving a puzzle. ================= The basic step to solve a puzzle is to select a value for a square. If you click in a square which has only one possible value available, that square will be coloured in, and that value is removed from all the other squares in the same row, column and 3x3 square (because it has now been assigned to the square you clicked in, it cannot be also put in the other squares in the same row, column and 3x3 square). If there are still multiple values possible for the square you click in, you will be presented with a pop-up menu of the possible values. Selecting any one of these will assign that value to the square (as above). Of course, you can also choose to not select on of the values, but releasing the mouse button while outside the pop-up menu. When you assign a value like this, the "mechanical" work of removing that value from the row, column and 3x3 square is done for you. Note that the status bar at the bottom of the window will show the number of possible combinations left: this will decrease as the solution progresses, and should eventually reach 1. There are three buttons which further automate the solving of a puzzle. Two of these (Singles and Soles) implement the two basic solution strategies, while the third (Solve it) simply applies the two strategies in turn until it succeeds (or goes as far as it can). Singles. -------- Any square for which there is only a single remaining value allowed is called a "single". Obviously, the initial values assigned as part of the puzzle definition are one example of this. The "single" value can be assigned to that square, and then that digit can be eliminate from the other squares in the same row, the same column and the same 3x3 square. This elimination of values may generate additional "singles" - they are not immediately taken, but clicking the button again will do them. Soles. ------ There may be only one square in a row which can still contain one of the digits, and this will be called the "sole" place that digit can go. Note this square may not be a "single" - it may have any number of still-valid possibilities, but if a particular digit can only be in the one place in that row, then it can be assigned as the "sole" place for it to go. Obviously, this can be applied to columns, and to 3x3 squares as well. Solve It -------- As we said above, this simply applies each of the two methods (Singles and Soles) above in turn, until neither produces any progress. There are three further buttons for use in solving puzzles. Blank ----- This produces a new, blank puzzle (i.e. equivalent to selecting File / New from the menu). Undo and Redo ---- ---- These are fairly self-explanatory - each click will undo (or redo) one step of the solution so far. Simple, Moderate and Complex Puzzles. ==================================== The four built-in puzzles are in order of simple to more difficult. You will find that many puzzles, like the first three here, can be solved simply by applying the strategies described above (either by clicking the buttons, or more satisfyingly by working through the puzzle one square at a time). However, some puzzles, such as the fourth built-in example, will not be fully resolved by using these techniques. While there are other analytical methods possible, the usual method to tackle these is simply to "postulate" (i.e. guess !!) one of the remaining values and see whether that leads to a solution or not. Well constructed Sudoku puzzles should have only a single solution, so this method will work. The easiest way to use this Sudoku Solver to do this is to simply choose the top, left square which still has multiple values possible, and do a trial assignment of the first value to it. Then click on "Solve it", and see what happens. If this value-assignment is incorrect, it will usually lead to some square(s) having no possible values left, and it (they) will be coloured bright red, so will be easy to spot. You can then click "Undo" multiple times, until you reach the point at which you made the guess. Then try the next possible value, and again click "Solve it". If the assignment is correct, then clicking "Solve it" will usually lead to a complete solution. Occasionally, the first guessed value will lead to neither a complete solution nor a complete conflict. In this case, you may need to move on to the next square which is not yet decided, and make a guess there. But do make sure that you remember to click on "Solve it" (or that you do the equivalent effort yourself) or you risk the possibility of not detecting the complete conflict or solution. (I have not actually found a puzzle that requires this multi-step postulation, but it's theoretically possible - if you do find one, please send it to me.) Defining or selecting a puzzle. =============================== A puzzle definition sets the initial values for some of the squares assignments. There are four puzzles built-in, and you can add as many new puzzles as you like. The quickest way to create a new puzzle is to edit a text definition file, and the solve that puzzle by selecting File / Open from the menu. The format for these files is simple; each row of the puzzle is a line in the file, each character is a single square, containing either a digit or 'x'. Extra spaces or blank lines are ignored. So the file to define the first built-in puzzle could look like: 98x 354 xxx 41x xx2 8xx x32 x1x 7xx 29x 1x5 xxx xxx x6x xxx 643 xx7 21x xxx 8xx x2x x5x x2x 6x7 xxx x3x x9x You can also create a puzzle by starting with a blank puzzle (i.e. immediately after starting the program, or by clicking the "Blank" button), then specifying values for your initial squares (by clicking in a square, then selecting the value from the pop-up menu), and finally selecting menu File / Save as ... and storing the puzzle definition in a file. You could also add more 'built-in' puzzles using the resource editor, by adding invisible buttons (similar to P1, P2, P3 P4) and adding menu entries (similar to File / Puzzle1 (the actual puzzle definition goes in the "userdata" of the invisible buttons). You can save a puzzle at any time, using the File / Save As .... menu selection. This will save the puzzle in the format described above, i.e. the only info saved is which squares have a single possible value assigned. All other squares will be simply marked as 'unknown' so if you later re-open this puzzle, you will be in an equivalent position, but will not see exactly the possibilities as you had seen before saving the puzzle state. The File / Save menu item is currently disabled, because it rarely, if ever, makes sense to save the current state so as to overwrite the state in the file. Further options =============== The two buttons at the bottom of the window give you further options on how much help you are given. Toggling both of these will let you solve the puzzle with no help at all - equivalent to solving it on paper, but without any easy way to mark-up your partial solutions or ideas. Hide Undecided -------------- Normally, any square for which there are multiple values still possible will show all of those choices (and only those choices). [Remember that until you have assigned a value to a square (and the square background has been coloured in), the assignment has not happened, so even though there is only a single possible value showing, that value will continue to be available in the other squares in the row, column and 3x3 square).] Toggling this button down will hide the multiple values in such undecided squares (but if you click in the square, the pop-up menu will present only the valid choices). Hide choices ------------ This controls which values are presented in the pop-up menu; when it is toggled, all values (1-9) are in the menu - whereas in the other case, only the values known to be valid are shown. PythonCard-0.8.2/samples/sudoku/sudoku.py0000644000076500007650000004756210362205125020366 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.3 $" __date__ = "$Date: 2006/01/14 14:27:33 $" """ import os, sys import wx from wx.html import HtmlEasyPrinting from PythonCard import configuration, dialog, model, helpful import copy COLOR = { 'a': (255,200,200), 'f': (255,255,255), 'p': (255,255,255), 'u': (255,255,255), 'z': (255,0,0), 'i': (200,255,200), 'o': (200,200,255), } VERSION = "0.2" def textToHtml(txt): # the wxHTML classes don't require valid HTML # so this is enough html = txt.replace('\n\n', '

') html = html.replace('\n', '
') return html class square: def __init__(self, x,y, comp): self.x = x self.y = y self.comp = comp self.state = None self.values = [1,2,3,4,5,6,7,8,9] self.color = (255,255,255) class undosquare: def __init__(self, val, state): self.state = state self.values = val class MyBackground(model.Background): def on_initialize(self, event): # if you have any initialization # including sizer setup, do it here self.readme = None self.hideUndecided = False self.hideChoices = False self.squares = {} for i in range(9): for j in range(9): self.squares[i,j] = square(i,j, self.components["B%d%d" % (i,j)]) self.peer = {} for i in range(3): for j in range(3): self.peer[3*i+j] = [] for x in range(3): for y in range(3): self.peer[3*i+j].append( (3*i+x, 3*j+y) ) self.sizerLayout() self.startTitle = self.title self.newFile() self.components.solveIt.SetFocus() def sizerLayout(self): # Need this nonsense because we are using list components in an unusual way # We want them to be entirely visible - and Mac OSX doesn't record an adequate # minimum size (GetBestSize()) for list controls if wx.Platform == '__WXMSW__': minListSize = (45,44) elif wx.Platform <> '__WXMAC__': minListSize = (66,66) else: minListSize = (66,66) for i in range(9): for j in range(9): self.components["B%d%d" % (i,j)].SetMinSize( minListSize ) sizer1 = wx.BoxSizer(wx.VERTICAL) sizer2 = wx.BoxSizer(wx.HORIZONTAL) ## There is no sizer 3 !! sizer4 = wx.GridSizer(9, 9, 2, 2) sizer5 = wx.BoxSizer(wx.HORIZONTAL) stcSizerAttrs = wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL fldSizerAttrs = wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL vertFlags = wx.LEFT | wx.TOP | wx.ALIGN_LEFT chkSizerAttrs = wx.RIGHT | wx.ALIGN_CENTER_VERTICAL C = self.components sizer2.Add(C.solveIt, flag=fldSizerAttrs) sizer2.Add((5, 5), 0) sizer2.Add(C.Singles, flag=fldSizerAttrs) sizer2.Add((5, 5), 0) sizer2.Add(C.Soles, flag=fldSizerAttrs) sizer2.Add((45, 5), 0) sizer2.Add(C.Blank, flag=fldSizerAttrs) sizer2.Add((25, 5), 0) sizer2.Add(C.Undo, flag=fldSizerAttrs) sizer2.Add((5, 5), 0) sizer2.Add(C.Redo, flag=fldSizerAttrs) for i in range(9): for j in range(9): sizer4.Add(C["B"+str(i)+str(j)]) sizer5.Add(C.hideUndecided, flag=fldSizerAttrs) sizer5.Add((5, 5), 0) sizer5.Add(C.hideChoices, flag=fldSizerAttrs) sizer1.Add(sizer2, 0, vertFlags) sizer1.Add((5, 15), 0) # spacer sizer1.Add(sizer4, 0, vertFlags) sizer1.Add((5, 15), 0) # spacer sizer1.Add(sizer5, 0, vertFlags) sizer1.Fit(self) sizer1.SetSizeHints(self) self.panel.SetSizer(sizer1) self.panel.SetAutoLayout(1) self.panel.Layout() self.visible = True def reset(self): for i in range(9): for j in range(9): self.squares[i,j].values = [1,2,3,4,5,6,7,8,9] self.squares[i,j].color = (255,255,255) self.squares[i,j].state = 'u' self.undo = [] self.redo = [] def loadConfig(self): pass def saveConfig(self): pass def saveChanges(self): # save configuration info in the app directory #filename = os.path.basename(self.documentPath) if self.documentPath is None: filename = "Untitled" else: filename = self.documentPath msg = "The text in the %s file has changed.\n\nDo you want to save the changes?" % filename result = dialog.messageDialog(self, msg, 'textEditor', wx.ICON_EXCLAMATION | wx.YES_NO | wx.CANCEL) return result.returnedString def doExit(self): return 1 def on_close(self, event): if self.doExit(): # self.saveConfig() self.fileHistory = None self.printer = None event.skip() def on_menuFileSave_select(self, event): if self.documentPath is None: # this a "new" document and needs to go through Save As... self.on_menuFileSaveAs_select(None) else: self.saveFile(self.documentPath) def on_menuFileSaveAs_select(self, event): wildcard = "Text files (*.txt)|*.TXT;*.txt|All files (*.*)|*.*" if self.documentPath is None: dir = '' filename = '*.txt' else: dir = os.path.dirname(self.documentPath) filename = os.path.basename(self.documentPath) result = dialog.saveFileDialog(None, "Save As", dir, filename, wildcard) if result.accepted: path = result.paths[0] self.saveFile(path) return True else: return False def newFile(self): self.documentPath = None self.documentChanged = 0 self.title = 'Untitled - ' + self.startTitle self.statusBar.text = 'Untitled' self.reset() for i in range(9): for j in range(9): self.updateList(self.squares[i,j]) def setUpPuzzle(self, definition): self.reset() y = 0 for line in definition: if line.strip() == "": continue if y == 9: # must be the optional title self.title = line self.statusBar.text = line break x = 0 for c in line.strip(): sqr = self.squares[x,y] if c == " ": continue if c == "x": sqr.state = 'u' else: sqr.state = 'p' sqr.values = [int(c),] self.updateList(sqr) x += 1 y += 1 def on_builtInPuzzle_command(self, event): self.documentPath = None self.documentChanged = 0 self.title = 'Untitled - ' + self.startTitle self.statusBar.text = 'Untitled' tname = event.target.name.replace("menuFilePuzzle", "P") self.setUpPuzzle(self.components[tname].userdata.split("\n")) def openFile(self, path): # change the code below for # opening an existing document # the commented lines are from the textEditor tool # may be overridden if file includesthe optinoal title on last line self.title = os.path.split(path)[-1] + ' - ' + self.startTitle f = open(path) self.setUpPuzzle(f) f.close() self.documentPath = path self.documentChanged = 0 self.statusBar.text = path def saveFile(self, path): # change the code below for # saving an existing document f = open(path, 'w') for y in range(9): s = [] for x in range(9): tList = self.squares[x,y].values if len(tList) == 1: s.append(str(tList[0])) else: s.append('x') if x == 2 or x == 5: s.append(' ') s.append("\n") f.write(''.join(s)) if y == 2 or y == 5: f.write("\n") f.close() self.documentPath = path self.documentChanged = False self.title = os.path.split(path)[-1] + ' - ' + self.startTitle self.statusBar.text = path def on_menuFileNew_select(self, event): if self.documentChanged: save = self.saveChanges() if save == "Cancel": # don't do anything, just go back to editing pass elif save == "No": # any changes will be lost self.newFile() else: if self.documentPath is None: if self.on_menuFileSaveAs_select(None): self.newFile() else: self.saveFile(self.documentPath) self.newFile() else: # don't need to save self.newFile() def on_menuFileOpen_select(self, event): # split this method into several pieces to make it more flexible wildcard = "Text files (*.txt)|*.txt;*.TXT|All files (*.*)|*.*" result = dialog.openFileDialog(wildcard=wildcard) if result.accepted: path = result.paths[0] # an error will probably occur here if the text is too large # to fit in the wxTextCtrl (TextArea) or the file is actually # binary. Not sure what happens with CR/LF versus CR versus LF # line endings either self.openFile(path) def on_menuFilePrint_select(self, event): # put your code here for print # the commented code below is from the textEditor tool # and is simply an example #source = textToHtml(self.components.fldDocument.text) #self.printer.PrintText(source) pass def on_menuFilePrintPreview_select(self, event): # put your code here for print preview # the commented code below is from the textEditor tool # and is simply an example #source = textToHtml(self.components.fldDocument.text) #self.printer.PreviewText(source) pass def on_menuFilePageSetup_select(self, event): self.printer.PageSetup() def saveUndoPosition(self): st = {} for i in range(9): for j in range(9): sqr = self.squares[i,j] st[i,j] = undosquare(copy.copy(sqr.values), sqr.state) self.undo.append(st) self.redo = [] def on_Blank_mouseClick(self, event): self.on_menuFileNew_select(event) def on_Undo_command(self, event): # if we are at the end - i.e. no redo info yet, then we should take a snapshot # right now so that we can get back to this point if len(self.redo) == 0: self.saveUndoPosition() st = self.undo[-1] self.redo.append(st) del self.undo[-1] ## print "undo", len(self.undo), len(self.redo) if len(self.undo) == 0: result = dialog.alertDialog(self, 'No more to Undo', 'Undo Alert') return st = self.undo[-1] ## for k,v in self.undo[-1].iteritems(): ## print k, v.state, v.values for i in range(9): for j in range(9): sqr = self.squares[i,j] sqr.values = copy.copy(st[i,j].values) sqr.state = st[i,j].state self.updateList(sqr) self.redo.append(st) del self.undo[-1] t = self.count() self.statusBar.text = "Possible choices left %d" % t ## print "undo", len(self.undo), len(self.redo) def on_Redo_command(self, event): ## print "redo", len(self.undo), len(self.redo) if len(self.redo) == 0: result = dialog.alertDialog(self, 'No more to Redo', 'Redo Alert') return st = self.redo[-1] for i in range(9): for j in range(9): sqr = self.squares[i,j] sqr.values = copy.copy(st[i,j].values) sqr.state = st[i,j].state self.updateList(sqr) self.undo.append(st) del self.redo[-1] t = self.count() self.statusBar.text = "Possible choices left %d" % t ## print "redo", len(self.undo), len(self.redo) def on_hideUndecided_mouseClick(self, event): self.hideUndecided = self.components.hideUndecided.checked for i in range(9): for j in range(9): self.updateList(self.squares[i,j]) def on_hideChoices_mouseClick(self, event): self.hideChoices = self.components.hideChoices.checked def on_doHelpAbout_command(self, event): dialog.messageDialog(self, "Sudoku Solver" + "\n\n" + \ "Version %s" % VERSION + "\n\n" + \ "(c) 2005 Alex Tweedly", "About Sudoku Solver", wx.ICON_INFORMATION | wx.OK) pass def on_doHelpHelp_command(self, event): if not self.readme: self.readme = open('readme.txt').read() dialog.scrolledMessageDialog(self, self.readme, 'Help') pass def singles(self): self.saveUndoPosition() for i in range(9): for j in range(9): sqr = self.squares[i,j] if len(sqr.values) == 1 and (sqr.state == 'p' or sqr.state == 'a' or sqr.state == 'f'): sqr.state = 'i' self.fillin(sqr, i,j) def soles(self): self.saveUndoPosition() for i in range(9): # check the col used = {1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0,9:0} last = {1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0,9:0} for j in range(9): sqr = self.squares[i,j] for c in sqr.values: used[c] += 1 last[c] = j for c,val in used.iteritems(): if val == 1: ss = self.squares[i, last[c]] if len(ss.values) <> 1: ss.values = [c,] ss.state = 'o' #rint "col", i, last[c], c self.fillin(ss,i,last[c]) # check the row used = {1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0,9:0} last = {1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0,9:0} for j in range(9): sqr = self.squares[j,i] for c in sqr.values: used[c] += 1 last[c] = j for c,val in used.iteritems(): if val == 1: ss = self.squares[last[c], i] if len(ss.values) <> 1: ss.values = [c,] ss.state = 'o' #rint "row", last[c], i, c self.fillin(ss,last[c],i) # check the square used = {1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0,9:0} last = {1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0,9:0} for j in range(9): sqr = self.squares[self.peer[i][j]] #rint i,j,self.peer[i][j] for c in sqr.values: used[c] += 1 last[c] = self.peer[i][j] for c,val in used.iteritems(): if val == 1: x,y = last[c] ss = self.squares[x,y] #rint i,c,val,ss.values if len(ss.values) <> 1: ss.values = [c,] ss.state = 'o' #rint "3x3", x, y, c self.fillin(ss,x,y) def fillin(self, sqr, i, j): if len(sqr.values) <> 1: print "help - bad values list", i,j, ss value = sqr.values[0] for d in range(9): if d == j: continue ss = self.squares[i,d] if value in ss.values: self.delValue(ss, value) ss.state = 'f' self.updateList(ss) #if len(ss.values) == 1: self.fillin(ss,i,d) for d in range(9): if d == i: continue ss = self.squares[d,j] if value in ss.values: self.delValue(ss, value) #if len(ss.values) == 1: self.fillin(ss,d,j) for d,e in self.peer[3*(i/3) + j/3]: if d == i and e == j: continue ss = self.squares[d,e] if value in ss.values: self.delValue(ss, value) ss.state = 'f' #if len(ss.values) == 1: self.fillin(ss,d,e) self.updateList(sqr) t = self.count() self.statusBar.text = "Possible choices left %d" % t def count(self): t = 1 for i in range(9): for j in range(9): t *= len(self.squares[i,j].values) if t == 0: return 0 return t def on_Singles_mouseClick(self, event): self.singles() def on_Soles_mouseClick(self, event): self.soles() def on_solveIt_mouseClick(self, event): last = -1 t = self.count() while last <> t and t > 1: last = t self.singles() t = self.count() if t == last: self.soles() t = self.count() def updateList(self, sqr): if len(sqr.values) == 0: items = [" ", " ", " "] sqr.state = 'z' elif len(sqr.values) == 1: items = [" ", " "+str(sqr.values[0])+" ", " "] else: s = [] for c in xrange(1,10): if c in sqr.values: s.append(str(c)) else: s.append(" ") all = " ".join(s) items = [all[:5], all[6:11], all[12:]] if self.hideUndecided and (sqr.state == 'u' or sqr.state == 'f'): items = [' ', ' ', ' '] sqr.comp.items = items sqr.comp.backgroundColor = COLOR[sqr.state] def delValue(self, sqr, value): if value in sqr.values: del sqr.values[sqr.values.index(value)] self.updateList(sqr) def on_popup_command(self, event): comp = event.target selected = 0 x = int(comp.name[1]) y = int(comp.name[2]) sqr = self.squares[x,y] if len(sqr.values) == 1: if self.hideChoices and (sqr.state == 'u' or sqr.state == 'f'): items = ['1','2','3','4','5','6','7','8','9'] else: selected = sqr.values[0] else: # make a menu self.menu = wx.Menu() # add the items items = [] if self.hideChoices: items = ['1','2','3','4','5','6','7','8','9'] else: for c in sqr.values: items.append(str(c)) if selected == 0: # Popup the menu. selected = helpful.popUpMenu(self, items, comp.position) if selected: selected = int(selected) else: selected = 0 if selected > 0: self.saveUndoPosition() sqr.values = [selected,] sqr.state = 'a' self.updateList(sqr) comp.backgroundColor = (200,100,100) self.fillin(sqr, int(comp.name[1]), int(comp.name[2])) if __name__ == '__main__': app = model.Application(MyBackground) app.MainLoop() PythonCard-0.8.2/samples/sudoku/sudoku.rsrc.py0000644000076500007650000005114010317062443021325 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'Template', 'backgrounds': [ {'type':'Background', 'name':'Sudoku', 'title':'Standard Template with full menus', 'size':(565, 647), 'statusBar':1, 'style':['resizeable'], 'menubar': {'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ {'type':'MenuItem', 'name':'menuFileNew', 'label':'&New\tCtrl+N', }, {'type':'MenuItem', 'name':'menuFileOpen', 'label':'&Open\tCtrl+O', }, {'type':'MenuItem', 'name':'menuFileSave', 'label':'&Save\tCtrl+S', 'enabled':0, }, {'type':'MenuItem', 'name':'menuFileSaveAs', 'label':'Save &As...', 'command':'saveas', }, {'type':'MenuItem', 'name':'fileSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuFilePuzzle1', 'label':'Puzzle1\tCtrl+1', 'command':'builtInPuzzle', }, {'type':'MenuItem', 'name':'menuFilePuzzle2', 'label':'Puzzle2\tCtrl+2', 'command':'builtInPuzzle', }, {'type':'MenuItem', 'name':'menuFilePuzzle3', 'label':'Puzzle3\tCtrl+3', 'command':'builtInPuzzle', }, {'type':'MenuItem', 'name':'menuFilePuzzle4', 'label':'Puzzle4\tCtrl+4', 'command':'builtInPuzzle', }, {'type':'MenuItem', 'name':'fileSep2', 'label':'-', }, {'type':'MenuItem', 'name':'menuFilePageSetup', 'label':'Page Set&up...', }, {'type':'MenuItem', 'name':'menuFilePrint', 'label':'&Print...\tCtrl+P', }, {'type':'MenuItem', 'name':'menuFilePrintPreview', 'label':'Print Pre&view', }, {'type':'MenuItem', 'name':'fileSep2', 'label':'-', }, {'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit', }, ] }, {'type':'Menu', 'name':'Edit', 'label':'&Edit', 'items': [ {'type':'MenuItem', 'name':'menuEditUndo', 'label':'&Undo\tCtrl+Z', 'command':'Undo', }, {'type':'MenuItem', 'name':'menuEditRedo', 'label':'&Redo\tCtrl+Y', 'command':'Redo', }, {'type':'MenuItem', 'name':'editSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditMode', 'label':'&Mode and Preferences\tCtrl+M', 'command':'doMode', }, ] }, {'type':'Menu', 'name':'menuHelp', 'label':'&Help', 'items': [ {'type':'MenuItem', 'name':'menuHelpHelp', 'label':'&Help', 'command':'doHelpHelp', }, {'type':'MenuItem', 'name':'menuHelpAbout', 'label':'&About ...', 'command':'doHelpAbout', }, ] }, ] }, 'components': [ {'type':'ToggleButton', 'name':'hideChoices', 'position':(347, 540), 'size':(85, -1), 'label':'Hide Choices', }, {'type':'ToggleButton', 'name':'hideUndecided', 'position':(49, 540), 'label':'Hide Undecided', }, {'type':'Button', 'name':'Redo', 'position':(223, 65), 'size':(60, -1), 'command':'Redo', 'label':'Redo', }, {'type':'Button', 'name':'Undo', 'position':(135, 65), 'size':(60, -1), 'command':'Undo', 'label':'Undo', }, {'type':'Button', 'name':'Blank', 'position':(48, 65), 'size':(60, -1), 'label':'Blank', }, {'type':'Button', 'name':'P4', 'position':(526, 99), 'size':(20, -1), 'enabled':False, 'label':'P4', 'userdata':'42x xxx x1x\nxxx 54x x3x\nxx6 xx7 xxx\n\nxxx xxx 279\nx1x xxx x6x\n342 xxx xxx\n\nxxx 9xx 3xx\nx6x x38 xxx\nx8x xxx x57\nNine-by-Nine Puzzle 3\n', 'visible':False, }, {'type':'Button', 'name':'P3', 'position':(523, 65), 'size':(20, -1), 'enabled':False, 'label':'P3', 'userdata':'9x4 xxx 3x1\nx1x xxx xx9\nxx2 xxx 68x\n\nx5x xxx xxx\nx93 1x5 4x6\nxx7 x24 8xx\n\n34x 79x xx8\n8xx 3x1 94x\n6xx xx8 21x\n\nNine-by-Nine Puzzle 3\n', 'visible':False, }, {'type':'Button', 'name':'P2', 'position':(524, 30), 'size':(20, -1), 'enabled':False, 'label':'P2', 'userdata':'52x xxx xx4\nxxx xxx 5xx\nxx7 6xx xxx\n\nx15 x6x xxx\n4xx 8x3 x6x\nxxx xx2 9x5\n\nxx1 xxx 8xx\nxxx xx1 x42\n674 9xx xx3\n\nNine-by-Nine Puzzle 2', 'visible':False, }, {'type':'Button', 'name':'P1', 'position':(524, 2), 'size':(20, -1), 'enabled':False, 'label':'P1', 'userdata':'98x 354 xxx\n41x xx2 8xx\nx32 x1x 7xx\n\n29x 1x5 xxx\nxxx x6x xxx\n643 xx7 21x\n\nxxx 8xx x2x\nx5x x2x 6x7\nxxx x3x x9x\nNine-by-Nine Puzzle 1\n ', 'visible':False, }, {'type':'Button', 'name':'Soles', 'position':(235, 20), 'size':(53, -1), 'label':'Soles', }, {'type':'Button', 'name':'Singles', 'position':(128, 20), 'size':(53, -1), 'label':'Singles', }, {'type':'Button', 'name':'solveIt', 'position':(26, 20), 'size':(53, -1), 'label':'Solve It !', }, {'type':'List', 'name':'B00', 'position':(50, 100), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'stringSelection':'3', 'userdata':'123456789', }, {'type':'List', 'name':'B01', 'position':(50, 145), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B02', 'position':(50, 190), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B03', 'position':(50, 241), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B04', 'position':(50, 286), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B05', 'position':(50, 331), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B06', 'position':(50, 382), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B07', 'position':(50, 427), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B08', 'position':(50, 472), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B10', 'position':(95, 100), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'stringSelection':'2', 'userdata':'123456789', }, {'type':'List', 'name':'B11', 'position':(95, 145), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B12', 'position':(95, 190), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B13', 'position':(95, 241), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B14', 'position':(95, 286), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B15', 'position':(95, 331), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B16', 'position':(95, 382), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B17', 'position':(95, 427), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B18', 'position':(95, 472), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B20', 'position':(140, 100), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B21', 'position':(140, 145), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B22', 'position':(140, 190), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B23', 'position':(140, 241), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B24', 'position':(140, 286), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B25', 'position':(140, 331), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B26', 'position':(140, 382), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B27', 'position':(140, 427), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B28', 'position':(140, 472), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B30', 'position':(191, 100), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B31', 'position':(191, 145), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B32', 'position':(191, 190), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B33', 'position':(191, 241), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B34', 'position':(191, 286), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B35', 'position':(191, 331), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B36', 'position':(191, 382), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B37', 'position':(191, 427), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B38', 'position':(191, 472), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B40', 'position':(236, 100), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B41', 'position':(236, 145), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B42', 'position':(236, 190), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B43', 'position':(236, 241), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B44', 'position':(236, 286), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B45', 'position':(236, 331), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B46', 'position':(236, 382), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B47', 'position':(236, 427), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B48', 'position':(236, 472), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B50', 'position':(281, 100), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B51', 'position':(281, 145), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B52', 'position':(281, 190), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B53', 'position':(281, 241), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B54', 'position':(281, 286), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B55', 'position':(281, 331), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B56', 'position':(281, 382), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B57', 'position':(281, 427), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B58', 'position':(281, 472), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B60', 'position':(332, 100), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B61', 'position':(332, 145), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B62', 'position':(332, 190), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B63', 'position':(332, 241), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B64', 'position':(332, 286), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B65', 'position':(332, 331), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B66', 'position':(332, 382), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B67', 'position':(332, 427), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B68', 'position':(332, 472), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B70', 'position':(377, 100), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B71', 'position':(377, 145), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B72', 'position':(377, 190), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B73', 'position':(377, 241), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B74', 'position':(377, 286), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B75', 'position':(377, 331), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B76', 'position':(377, 382), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B77', 'position':(377, 427), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B78', 'position':(377, 472), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B80', 'position':(422, 100), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B81', 'position':(422, 145), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B82', 'position':(422, 190), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B83', 'position':(422, 241), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B84', 'position':(422, 286), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B85', 'position':(422, 331), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B86', 'position':(422, 382), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B87', 'position':(422, 427), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, {'type':'List', 'name':'B88', 'position':(422, 472), 'size':(66, 66), 'command':'popup', 'items':['1', '2', '3'], 'userdata':'123456789', }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/samples/testevents/0000755000076500007650000000000010434046771017370 5ustar alexalex00000000000000PythonCard-0.8.2/samples/testevents/pycrustrc.py0000644000076500007650000000007110044501507021764 0ustar alexalex00000000000000import gc gc.set_debug(gc.DEBUG_LEAK | gc.DEBUG_OBJECTS) PythonCard-0.8.2/samples/testevents/readme.txt0000644000076500007650000000020010134521020021334 0ustar alexalex00000000000000testevents is used to verify that background and components events fire in the same order and behave the same on all platforms. PythonCard-0.8.2/samples/testevents/testevents.py0000644000076500007650000001316410353551333022146 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.22 $" __date__ = "$Date: 2005/12/25 17:11:55 $" """ import wx print "wxPython", wx.__version__ from PythonCard import model, timer class MinimalChild(model.Background): # creates a child window - using same resource file # same appearance - but buttons and fields are not activated def on_initialize(self, event): print "initialize child window" self.title = "Child Window" def callableFunction(self, stringParameter): print "in child function", stringParameter class Minimal(model.Background): # background events def on_initialize(self, event): print "initialize", event.target.name self.num_idles = 0 self.fldTimer = timer.Timer(self.components.fld) self.fldTimer.start(10 * 1000) # 10 seconds self.btnTimer = timer.Timer(self.components.btn) self.btnTimer.start(3 * 1000) # 3 seconds self.components.btn.setFocus() # on the Mac, findFocus() is returning None # when the sample is started with a runtime tool focus = self.findFocus() if focus: print " has focus:", focus.name def on_activate(self, event): print "activate", event.target.name event.skip() def on_deactivate(self, event): print "deactivate", event.target.name event.skip() def on_close(self, event): print "close", event.target.name self.fldTimer.stop() self.btnTimer.stop() event.skip() def on_idle(self, event): # prevent idle message flood self.num_idles += 1 if self.num_idles < 5: print "idle", event.target.name event.skip() def on_timer(self, event): print "timer", event.target.name, \ " interval: %.2f seconds" % (event.interval / 1000.0) def on_maximize(self, event): print "maximize", event.target.name event.skip() def on_minimize(self, event): print "minimize", event.target.name event.skip() def on_restore(self, event): print "restore", event.target.name event.skip() def on_move(self, event): print "move", event.target.name, event.position event.skip() def on_size(self, event): print "size", event.target.name, event.size event.skip() # component events def on_gainFocus(self, event): print "gainFocus", event.target.name event.skip() def on_loseFocus(self, event): print "loseFocus", event.target.name event.skip() def on_closeField(self, event): print "closeField", event.target.name event.skip() def on_mouseMove(self, event): print "mouseMove", event.target.name, event.position event.skip() def on_mouseDrag(self, event): print "mouseDrag", event.target.name, event.position event.skip() def on_mouseEnter(self, event): print "mouseEnter", event.target.name, event.position event.skip() def on_mouseLeave(self, event): print "mouseLeave", event.target.name, event.position event.skip() def on_keyDown(self, event): print "keyDown", event.target.name, event.keyCode, \ event.altDown, event.controlDown, event.shiftDown event.skip() def on_keyUp(self, event): print "keyUp", event.target.name, event.keyCode, \ event.altDown, event.controlDown, event.shiftDown event.skip() def on_keyPress(self, event): print "keyPress", event.target.name, event.keyCode, \ event.altDown, event.controlDown, event.shiftDown event.skip() def on_textUpdate(self, event): print "textUpdate", event.target.name event.skip() def on_mouseDown(self, event): print "mouseDown", event.target.name event.skip() def on_mouseUp(self, event): print "mouseUp", event.target.name event.skip() def on_mouseClick(self, event): print "mouseClick", event.target.name event.skip() def on_btn_mouseClick(self, event): print "btn mouseClick", event.target.name event.skip() def on_setText_command(self, event): print "setText command", event.target.name self.components.fld.text = "After setText" event.skip() def on_openChildWindow_command(self, event): # delayed events - check the order these 'print's appear # should be # openChildWindow command # leaving openCHildWindow # initializing child window # in child function via CallAfter # in child function 10 ms in future print "openChildWindow command", event.target.name # KEA 2005-12-25 # the path for sys.modules[MinimalChild.__module__].__file__ # will be relative to the starting directory # so childWindow will fail if a resource file isn't provided # I'm not sure if this is a bug due to PythonCard changing the # directory to the application directory on startup or # the __file__ attribute already being set prior to our sys.path[0] # fix in model.py a combination of the two or something else. # However, always providing a resource path seems to work for # childWindow. win = model.childWindow(self, MinimalChild, 'testevents.rsrc.py') wx.FutureCall(10, win.callableFunction, "10 ms in the Future") wx.CallAfter(win.callableFunction, "via CallAfter") print "leaving openChildWindow" if __name__ == '__main__': app = model.Application(Minimal) app.MainLoop() PythonCard-0.8.2/samples/testevents/testevents.rsrc.py0000644000076500007650000000250510130317156023107 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'TestEvents', 'backgrounds': [ {'type':'Background', 'name':'bgMin', 'title':'Test Events PythonCard Application', 'size':(300, 250), 'menubar': {'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ {'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit', }, ] }, ] }, 'components': [ {'type':'Button', 'name':'childBtn', 'position':(149, 65), 'command':'openChildWindow', 'label':'childBtn', }, {'type':'TextField', 'name':'fld', 'position':(0, 0), 'text':'Hello PythonCard', }, {'type':'TextArea', 'name':'fldArea', 'position':(0, 30), 'size':(-1, 100), 'text':'The quick brown fox jumped over the lazy dog.', }, {'type':'Button', 'name':'btn', 'position':(150, 0), 'label':'btn', }, {'type':'Button', 'name':'cmdBtn', 'position':(150, 30), 'command':'openChildWindow', 'label':'cmdBtn', }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/samples/testNotebook/0000755000076500007650000000000010434046771017644 5ustar alexalex00000000000000PythonCard-0.8.2/samples/testNotebook/doodle.py0000644000076500007650000000565110313163032021455 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.2 $" __date__ = "$Date: 2005/09/18 03:59:22 $" """ from PythonCard import clipboard, dialog, graphic, model import wx import os class Doodle(model.PageBackground): def on_initialize(self, event): self.x = 0 self.y = 0 self.filename = None sizer1 = wx.BoxSizer(wx.VERTICAL) comp = self.components flags = wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.ALIGN_BOTTOM # Mac wxButton needs 7 pixels on bottom and right macPadding = 7 sizer1.Add(comp.btnColor, 0, flags, macPadding) sizer1.Add(comp.bufOff, 1, wx.EXPAND) sizer1.Fit(self) sizer1.SetSizeHints(self) self.panel.SetSizer(sizer1) self.panel.SetAutoLayout(1) self.panel.Layout() def on_bufOff_mouseEnter(self, event): self.x, self.y = event.position def on_bufOff_mouseDown(self, event): self.x, self.y = event.position event.target.drawLine((self.x, self.y), (self.x + 1, self.y + 1)) def on_bufOff_mouseDrag(self, event): x, y = event.position event.target.drawLine((self.x, self.y), (x, y)) self.x = x self.y = y def on_btnColor_mouseClick(self, event): result = dialog.colorDialog(self) if result.accepted: self.components.bufOff.foregroundColor = result.color event.target.backgroundColor = result.color def openFile(self): result = dialog.openFileDialog(None, "Import which file?") if result.accepted: path = result.paths[0] os.chdir(os.path.dirname(path)) self.filename = path bmp = graphic.Bitmap(self.filename) self.components.bufOff.drawBitmap(bmp, (0, 0)) def on_menuFileOpen_select(self, event): self.openFile() def on_menuFileSaveAs_select(self, event): if self.filename is None: path = '' filename = '' else: path, filename = os.path.split(self.filename) result = dialog.saveFileDialog(None, "Save As", path, filename) if result.accepted: path = result.paths[0] fileType = graphic.bitmapType(path) print fileType, path try: bmp = self.components.bufOff.getBitmap() bmp.SaveFile(path, fileType) return 1 except IOError, msg: return 0 else: return 0 def on_menuEditCopy_select(self, event): clipboard.setClipboard(self.components.bufOff.getBitmap()) def on_menuEditPaste_select(self, event): bmp = clipboard.getClipboard() if isinstance(bmp, wx.Bitmap): self.components.bufOff.drawBitmap(bmp) def on_editClear_command(self, event): self.components.bufOff.clear() if __name__ == '__main__': app = model.Application(Doodle) app.MainLoop() PythonCard-0.8.2/samples/testNotebook/doodle.rsrc.py0000644000076500007650000000341110122335466022427 0ustar alexalex00000000000000 { 'application':{ 'type':'Application', 'name':'Doodle', 'backgrounds': [ { 'type':'Background', 'name':'bgDoodle', 'title':'Doodle PythonCard Application', 'size':( 310, 300 ), 'style':['resizeable'], 'menubar': { 'type':'MenuBar', 'menus': [ { 'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ { 'type':'MenuItem', 'name':'menuFileOpen', 'label':'&Open...\tCtrl+O' }, { 'type':'MenuItem', 'name':'menuFileSaveAs', 'label':'Save &As...' }, { 'type':'MenuItem', 'name':'fileSep1', 'label':'-' }, { 'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit' } ] }, { 'type':'Menu', 'name':'menuEdit', 'label':'&Edit', 'items': [ { 'type':'MenuItem', 'name':'menuEditCopy', 'label':'&Copy\tCtrl+C'}, { 'type':'MenuItem', 'name':'menuEditPaste', 'label':'&Paste\tCtrl+V'}, { 'type':'MenuItem', 'name':'editSep1', 'label':'-' }, { 'type':'MenuItem', 'name':'menuEditClear', 'label':'&Clear', 'command':'editClear'} ] } ] }, 'components': [ { 'type':'Button', 'name':'btnColor', 'position':(0, 0), 'label':'Color' }, { 'type':'BitmapCanvas', 'name':'bufOff', 'position':(0, 30), 'size':(300, 230) }, ] } ] } } PythonCard-0.8.2/samples/testNotebook/edit.gif0000644000076500007650000000117410121627723021256 0ustar alexalex00000000000000GIF89a7Õ?ww€£VVm||žššÁÈÈÌ**6ˆˆ¬ƒƒ‹eenbb|““·››´MMdääå;;I88F‘‘˜mmŠuu—44A¡¡Èon[[pjj…––ƒƒ§BBPss{†…¦rr‚‚¡§§Ï¬¬ÕOOh‹‹°¬¬Ô´´´00<ƒ„§¨§Ï­®ÖnnxŽŽ”®¯Ñgg­¬Õyy—­¬Ô77I–””›SS_˜˜¼»»Ù××Ù¨¨Ãÿ÷™ooOOgÄÄãÿÿÿ!ù?,7ÿÀŸpH,Ȥ²èk:—ÐèÒÙËUجvËíúˆ>Ïgµúza±zÍn»ßêÔ÷ÁÎÍ6"‘ø~.}v~|.„|Œ-|!s>6( dUzM (𡥦 5š5=°²*¥—6xXh%z¼ÃÄÄ/ *-*4±Î4Ѽ/—,œeWNÛáâáè7==3ïî==ÛÙ ¾yd%>-ô (P‚ôˆpðB¼#*Ð'áŽ#ºuòñOÆ AnˆÐ®@$M˜X¸2BK0b¸TáÄ ~ÀôhÐp‚çΙŸ;{ HЉ&€%ceÓìØ©àƒ¹¼éù'«×¯`=Xá ‡ܹ[a Ûô `½`u„-ÿìêÝË×®Çh¸ðƒÀ„Ûpi "KnÒà± –3?Æœ™³f ž5ë`,ƨE F#†Õ©W¿^M[6ìÛµS¿žSÚ‹ïßÀŸHNJ;PythonCard-0.8.2/samples/testNotebook/minimal.py0000644000076500007650000000040710121625116021632 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.1 $" __date__ = "$Date: 2004/09/14 17:28:46 $" """ from PythonCard import model class Minimal(model.PageBackground): pass if __name__ == '__main__': app = model.Application(Minimal) app.MainLoop() PythonCard-0.8.2/samples/testNotebook/minimal.rsrc.py0000644000076500007650000000140110121625116022575 0ustar alexalex00000000000000 { 'application':{ 'type':'Application', 'name':'Minimal', 'backgrounds': [ { 'type':'Background', 'name':'bgMin', 'title':'Minimal PythonCard Application', 'size':( 200, 100 ), 'menubar': { 'type':'MenuBar', 'menus': [ { 'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ { 'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit' } ] } ] }, 'components': [ { 'type':'TextField', 'name':'field1', 'position':(5, 5), 'size':(150, -1), 'text':'Hello PythonCard' }, ] } ] } } PythonCard-0.8.2/samples/testNotebook/readme.txt0000644000076500007650000000023610121625116021630 0ustar alexalex00000000000000Until we have a Notebook integrated into some of the other samples or tools this will serve as a basic test app, but I don't expect to include it in releases.PythonCard-0.8.2/samples/testNotebook/testNotebook.py0000644000076500007650000001045410122335466022676 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.6 $" __date__ = "$Date: 2004/09/16 16:11:34 $" """ import os, sys import wx from PythonCard import model import minimal import widgets import doodle class TestNotebook(model.Background): def on_initialize(self, event): # KEA 2004-09-16 # if we don't set a min size then the window is # very small. this may not be the correct way to # solve the problem... self.components.notebook.SetMinSize(self.components.notebook.size) self.singleItemExpandingSizerLayout() panel = wx.Panel(self.components.notebook, -1) panel.text1 = wx.TextCtrl(panel, -1, 'Hello Notebook', (5, 5)) self.components.notebook.AddPage(panel, 'wx panel', True) # you can't add a wx.Frame to a notebook ## frame = wx.Frame(self.components.notebook, -1) ## frame.text1 = wx.TextCtrl(frame, -1, 'Notebook 2', (5, 5)) ## self.components.notebook.AddPage(frame, 'frame', True) # let's pretend we were just given a string with the class to # load to see how this would be handled in the Notebook component # automatically #win = model.childWindow(self.components.notebook, minimal.Minimal) pageName = 'minimal' classString = 'minimal.Minimal' # assume for now that there will be one and only one # dot rather than something like modules.minimal.Minimal or just Minimal # indicating that the class is actually in the main source file # which would cause all sorts of problems with finding the resource file print "adding minimal page..." import imp moduleName, className = classString.split('.') fp, pathname, description = imp.find_module(moduleName) try: m = imp.load_module(moduleName, fp, pathname, description) win = model.childWindow(self.components.notebook, getattr(m, className)) self.components.notebook.AddPage(win, pageName, True) # now test setting the attribute for reference below setattr(self.components.notebook, pageName, win) #print self.components.notebook.GetPage(1).components.field1.text page = self.components.notebook.minimal print page.components.field1.text print "menuFileExit enabled:", page.menuBar.getEnabled('menuFileExit') finally: # Since we may exit via an exception, close fp explicitly. if fp: fp.close() win2 = model.childWindow(self.components.notebook, widgets.WidgetsTest) self.components.notebook.AddPage(win2, 'widgets', True) win3 = model.childWindow(self.components.notebook, doodle.Doodle) self.components.notebook.AddPage(win3, 'doodle', True) page = self.components.notebook.getPage(3) # it appears that since on_initialize hasn't run yet # after adding the page, the sizer code in doodle # in on_initialize hasn't been run so the page size # below is what we want but after the sizer code runs it # will be (300, 260) # if the user resizes the window, the sizer works as expected # but if the window hasn't been resized, then when you click # on the doodle tab the page doesn't fill the whole window # I don't know what the correct solution is yet, but this seems # to work. i have to use a method with CallAfter # so that's why we aren't just using the attribute size = page.size wx.CallAfter(page.SetSize, size) print "number of pages:", self.components.notebook.getPageCount() print "last page text: %s\n" % \ self.components.notebook.getPageText(self.components.notebook.getPageCount() - 1) print "stringSelection:", self.components.notebook.stringSelection self.components.notebook.stringSelection = 'minimal' def on_notebook_pageChanging(self, event): print "pageChanging - oldSelection: %d, selection: %d" % (event.oldSelection, event.selection) event.skip() def on_notebook_pageChanged(self, event): print "pageChanged - oldSelection: %d, selection: %d" % (event.oldSelection, event.selection) event.skip() if __name__ == '__main__': app = model.Application(TestNotebook) app.MainLoop() PythonCard-0.8.2/samples/testNotebook/testNotebook.rsrc.py0000644000076500007650000000136210122335466023644 0ustar alexalex00000000000000 { 'application':{ 'type':'Application', 'name':'Minimal', 'backgrounds': [ { 'type':'Background', 'name':'bgMin', 'title':'Notebook Test', 'size':( 800, 600 ), 'style':['resizeable'], 'menubar': { 'type':'MenuBar', 'menus': [ { 'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ { 'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit' } ] } ] }, 'components': [ { 'type':'Notebook', 'name':'notebook', 'position':(5, 5), 'size':(785, 540), }, ] } ] } } PythonCard-0.8.2/samples/testNotebook/tile.bmp0000644000076500007650000005134610121627723021305 0ustar alexalex00000000000000BMæR6(TT°R­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”PythonCard-0.8.2/samples/testNotebook/widgets.html0000644000076500007650000000073010121625116022165 0ustar alexalex00000000000000 Simple HTML Example

Hello HTML

simple tables
images
and...links
see the readme.txt for more info
PythonCard-0.8.2/samples/testNotebook/widgets.py0000644000076500007650000004017310313163032021653 0ustar alexalex00000000000000#!/usr/bin/python """ KEA notes to myself __version__ = "$Revision: 1.3 $" __date__ = "$Date: 2005/09/18 03:59:22 $" __author__ = "Kevin Altis " """ from PythonCard import dialog, model import os import inspect import wx BORDER = 5 RESIZE_LEFT = 1 RESIZE_RIGHT = 2 DRAG_X = 3 RESIZE_TOP = 4 RESIZE_BOTTOM = 5 DRAG_Y = 6 class WidgetsTest(model.PageBackground): """ All the widgets that can be changed have a three-letter prefix followed by the actual classname to distinguish them from other widgets in the background. Compare the method of changing the attribute state in on_chkEnabled_mouseClick versus on_chkVisible_mouseClick. I'm using self.components.itervalues() to iterate over a list of all the widgets at once. """ def on_initialize(self, event): self.bitmapCanvasTest() def on_sldSlider_select(self, event): self.components.fldTextField.text = str(event.target.value) """ def on_spnSpinner_spinUp(self, event): event.target.value = event.target.value + 1 def on_spnSpinner_spinDown(self, event): event.target.value = event.target.value - 1 """ def bitmapCanvasTest(self): canvas = self.components.bmpBitmapCanvas canvas.drawPoint((5, 5)) canvas.foregroundColor = 'red' canvas.drawLine((5, 10), (20, 30)) canvas.foregroundColor = 'blue' canvas.drawRectangle((25, 5), (30, 20)) canvas.drawText('Text', (5, 30)) canvas.drawRotatedText('Rotated', (60, 40), 90) canvas.foregroundColor = 'gray' canvas.fillColor = 'gray' canvas.drawEllipse((80, 5), (30, 30)) def on_chkEnabled_mouseClick(self, event): checked = event.target.checked for w in self.components.itervalues(): # for btnButton, wType would be widget.Button # __class__ would be widget.Button # we can't use isinstance unless we put it in a try/except # block because isinstance requires a valid class as the # 2nd argument, so passing in "elTextField" or something like # that triggers an exception # KEA 2001-08-09 # need a better way of getting the widget prefix dynamically # I've just gone soft in the head and can't see the right way here if w.__class__.__name__.startswith(w.name[3:]): w.enabled = checked self.components.fldTextFieldNoBorder.enabled = checked def on_chkVisible_mouseClick(self, event): print "on_chkVisible_mouseClick" checked = event.target.checked for w in self.components.itervalues(): if w.__class__.__name__.startswith(w.name[3:]): w.visible = checked self.components.fldTextFieldNoBorder.visible = checked # editable only applies to TextField, PasswordField, and TextArea def on_chkEditable_mouseClick(self, event): checked = event.target.checked self.components.fldTextField.editable = checked self.components.fldPasswordField.editable = checked self.components.fldTextArea.editable = checked self.components.fldTextFieldNoBorder.editable = checked def on_btnBackgroundColor_mouseClick(self, event): result = dialog.colorDialog(self) if result.accepted: color = result.color for w in self.components.itervalues(): if w.__class__.__name__.startswith(w.name[3:]): w.backgroundColor = color self.components.fldTextFieldNoBorder.backgroundColor = color # compare this method of expliciting setting each component # one at a time compared to the for loop above def on_btnForegroundColor_mouseClick(self, event): result = dialog.colorDialog(self) if result.accepted: color = result.color # print color self.components.btnButton.foregroundColor = color self.components.fldTextField.foregroundColor = color self.components.fldPasswordField.foregroundColor = color self.components.fldTextArea.foregroundColor = color self.components.txtStaticText.foregroundColor = color self.components.chkCheckBox.foregroundColor = color self.components.chkToggleButton.foregroundColor = color self.components.radRadioGroup.foregroundColor = color self.components.popChoice.foregroundColor = color self.components.lstList.foregroundColor = color self.components.sldSlider.foregroundColor = color self.components.imgImage.foregroundColor = color self.components.imgImageButton.foregroundColor = color self.components.fldTextFieldNoBorder.foregroundColor = color self.components.calCalendar.foregroundColor = color self.components.cmbComboBox.foregroundColor = color self.components.gagGauge.foregroundColor = color self.components.spnSpinner.foregroundColor = color self.components.linStaticLine.foregroundColor = color self.components.stbStaticBox.foregroundColor = color def on_btnFont_mouseClick(self, event): result = dialog.fontDialog(self, self.components.btnButton.font) if result.accepted: #color = result.color font = result.font for w in self.components.itervalues(): if w.__class__.__name__.startswith(w.name[3:]): w.font = font self.components.fldTextFieldNoBorder.font = font def on_btnToolTip_mouseClick(self, event): result = dialog.textEntryDialog(self, 'Enter a toolTip:', 'ToolTip', 'Hello toolTip') if result.accepted: txt = result.text for w in self.components.itervalues(): if w.__class__.__name__.startswith(w.name[3:]): w.toolTip = txt def on_btnBgBackgroundColor_mouseClick(self, event): result = dialog.colorDialog(self) if result.accepted: color = result.color self.backgroundColor = color """ experimental drag and resize code hold down the control key and mouseDown to drag a widget hold down the control key and mouseDown within 5 pixels of the edge of the widget to resize This seems to work okay on Windows, but not so well on Linux. My algorithm is probably not very good. """ def on_mouseDown(self, event): global BORDER if event.controlDown: # record the starting location so, that the drags are # always relative and the widget won't jump around self.dragOffset = event.position xClick, yClick = self.dragOffset size = event.target.size rect = (0, 0, size[0] - BORDER, size[1] - BORDER) print rect print xClick, yClick if xClick < BORDER: print "resize left" self.xOp = RESIZE_LEFT elif xClick > rect[2]: print "resize right" self.xOp = RESIZE_RIGHT else: print "drag x" self.xOp = DRAG_X if yClick < BORDER: print "resize top" self.yOp = RESIZE_TOP elif yClick > rect[3]: print "resize bottom" self.yOp = RESIZE_BOTTOM else: print "drag y" self.yOp = DRAG_Y event.skip() def on_mouseDrag(self, event): target = event.target if event.controlDown: xPos, yPos = target.position width, height = target.size newWidth = width newHeight = height print "xPos %d, yPos %d" % (xPos, yPos) if self.xOp == DRAG_X and self.yOp == DRAG_Y: xOff = xPos + event.x - self.dragOffset[0] yOff = yPos + event.y - self.dragOffset[1] print "xOff %d, yOff %d" % (xOff, yOff) target.position = (xOff, yOff) else: xOff = xPos if self.xOp == RESIZE_LEFT: # both width and the x position have to change xOff = xPos + event.x - self.dragOffset[0] newWidth = width + xPos - xOff #event.x + self.dragOffset[0] elif self.xOp == RESIZE_RIGHT: # RESIZE_RIGHT #newWidth += event.x - self.dragOffset[0] #newWidth += 1 newWidth = event.x print "width %d, newWidth %d" % (width, newWidth) yOff = yPos if self.yOp == RESIZE_TOP: # both height and the y position have to change yOff = yPos + event.y - self.dragOffset[1] newHeight = height + yPos - yOff #event.y + self.dragOffset[1] elif self.yOp == RESIZE_BOTTOM: # RESIZE_BOTTOM #newHeight += event.y - self.dragOffset[1] #newHeight += 1 newHeight = event.y print "height %d, newHeight %d" % (height, newHeight) print "xOff %d, yOff %d" % (xOff, yOff) if xPos != xOff or yPos != yOff: target.position = (xOff, yOff) if width != newWidth or height != newHeight: #target._delegate.SetSize((width, height)) target.SetSize((newWidth, newHeight)) #target._delegate.SetDimensions(xOff, yOff, newWidth, newHeight) event.skip() # KEA 2002-05-07 # some methods to build up component documentation # using the built-in component specs def getAttributesList(self, attributes): names = [a for a in attributes] names.sort() listX = [] for n in names: if attributes[n].hasDefaultValueList(): listX.append([n, attributes[n].getDefaultValueList()]) else: value = attributes[n].getDefaultValue() if value == '': value = "''" listX.append([n, value]) return listX def getEventsList(self, spec): events = [e.name for e in spec.getEvents()] events.sort() return events def getMethodsList(self, object): listX = [] methods = inspect.getmembers(object, inspect.ismethod) for m in methods: if m[0][0] in "abcdefghijklmnopqrstuvwxyz": listX.append(m[0]) return listX def on_menuFileDumpWidgets_select(self, event): self.dumpDocs() def dumpDocs(self): #try: result = dialog.directoryDialog(None, 'Create widgets_documention in:', '') if result.accepted: widgetsDir = result.path else: return widgetsDir = os.path.join(widgetsDir, 'components') if not os.path.exists(widgetsDir): os.mkdir(widgetsDir) imagesDir = os.path.join(widgetsDir, 'images') if not os.path.exists(imagesDir): os.mkdir(imagesDir) toc = '' toc += '\n%s\n' % 'PythonCard Components' toc += '

PythonCard Components

\n' componentsList = [] for w in self.components.itervalues(): if w.__class__.__name__.startswith(w.name[3:]): # document each widget name = w.__class__.__name__ spec = w._spec doc = '' doc += '\n%s\n' % (name + ': PythonCard component') doc += '

Component: %s

' % name doc += '\n
\n' % ('images/' + name + '.png') doc += '\n

Required Attributes

\n' doc += '\n' doc += '\n' for a in self.getAttributesList(spec.getRequiredAttributes()): doc += "\n" % (a[0], a[1]) doc += '
NameDefault value
%s%s
' doc += '\n\n

Optional Attributes

\n' doc += '\n' doc += '\n' for a in self.getAttributesList(spec.getOptionalAttributes()): doc += "\n" % (a[0], a[1]) doc += '
NameDefault value
%s%s
' doc += '\n\n

Events:

\n' doc += '\n' for e in self.getEventsList(spec): doc += "\n" % e doc += '
%s
' doc += '\n\n

Methods:

\n' doc += '\n' td = '' * 4 tr = '' + td + '\n' doc += tr % ('method', 'args', 'doc string', 'comments') for e in self.getMethodsList(w): method = getattr(w, e) docstring = inspect.getdoc(method) if docstring is None: docstring = " " comments = inspect.getcomments(method) if comments is None: comments = " " #source = inspect.getcomments(method) argspec = inspect.getargspec(method) formattedargs = inspect.formatargspec(argspec[0], argspec[1], argspec[2], argspec[3]) doc += "\n" % \ (e, formattedargs, docstring, comments) doc += '
%s
%s%s%s%s
' # need to decide what we want to dump from the methods # we probably don't want to dump everything including # wxPython methods, so this is where we need to decide # on the case of the first letter of the method # whatever is done here should be the same thing used # to display methods in the shell # arg lists and tooltips (docstrings) will be used here too # write out the documentation for the component doc += '\n
SourceForge Logo' doc += '\n\n' filename = name + '.html' path = os.path.join(widgetsDir, filename) f = open(path, 'w') f.write(doc) f.close() # create an image using the actual component # on screen # comment this out once you have created the images # you want bmp = wx.EmptyBitmap(w.size[0], w.size[1]) memdc = wx.MemoryDC() memdc.SelectObject(bmp) dc = wx.WindowDC(w) memdc.BlitPointSize((0, 0), w.size, dc, (0, 0)) imgfilename = os.path.join(imagesDir, name + '.png') bmp.SaveFile(imgfilename, wx.BITMAP_TYPE_PNG) dc = None memdc.SelectObject(wx.NullBitmap) memdc = None bmp = None componentsList.append('
%s
\n' % (filename, name)) # now create the table of contents, index.html componentsList.sort() for c in componentsList: toc += c toc += '\n
SourceForge Logo' toc += '\n\n' filename = os.path.join(widgetsDir, 'index.html') f = open(filename, 'w') f.write(toc) f.close() if __name__ == '__main__': app = model.Application(WidgetsTest) app.MainLoop() PythonCard-0.8.2/samples/testNotebook/widgets.rsrc.py0000644000076500007650000001713310130317156022630 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'StackWidgetsTest', 'backgrounds': [ {'type':'Background', 'name':'bgWidgets', 'title':'Widgets Test', 'size':(800, 600), 'menubar': {'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'File', 'label':'&File', 'items': [ {'type':'MenuItem', 'name':'menuFileDumpWidgets', 'label':'Create Components Docs...', }, {'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit', }, ] }, ] }, 'components': [ {'type':'ToggleButton', 'name':'chkToggleButton', 'position':(100, 225), 'size':(85, -1), 'label':'ToggleButton', }, {'type':'StaticText', 'name':'labelToggleButton', 'position':(5, 230), 'text':'ToggleButton:', }, {'type':'StaticText', 'name':'labelBitmapCanvas', 'position':(476, 496), 'text':'BitmapCanvas:', }, {'type':'BitmapCanvas', 'name':'bmpBitmapCanvas', 'position':(566, 494), 'size':(112, 50), 'backgroundColor':(255, 255, 255), }, {'type':'StaticText', 'name':'labelHtmlWindow', 'position':(546, 264), 'text':'HtmlWindow:', }, {'type':'HtmlWindow', 'name':'htmHtmlWindow', 'position':(540, 288), 'size':(195, 150), 'backgroundColor':(255, 255, 255), 'text':'widgets.html', }, {'type':'StaticBox', 'name':'stbStaticBox', 'position':(563, 449), 'size':(116, 32), 'label':'A StaticBox', }, {'type':'StaticText', 'name':'labelStaticBox', 'position':(498, 460), 'text':'StaticBox:', }, {'type':'StaticText', 'name':'labelSpinner', 'position':(228, 450), 'text':'Spinner:', }, {'type':'Spinner', 'name':'spnSpinner', 'position':(310, 450), 'max':100, 'min':1, 'value':93, }, {'type':'StaticText', 'name':'labelGauge', 'position':(228, 408), 'text':'Gauge:', }, {'type':'Gauge', 'name':'gagGauge', 'position':(310, 404), 'size':(128, -1), 'layout':'horizontal', 'max':100, 'value':50, }, {'type':'Calendar', 'name':'calCalendar', 'position':(299, 200), }, {'type':'StaticText', 'name':'labelCalendar', 'position':(228, 260), 'text':'Calendar:', }, {'type':'ComboBox', 'name':'cmbComboBox', 'position':(311, 364), 'size':(125, -1), 'items':['one', 'two', 'three'], 'stringSelection':'two', 'text':'two', }, {'type':'StaticText', 'name':'labelComboBox', 'position':(228, 370), 'text':'ComboBox:', }, {'type':'StaticBox', 'name':'StaticBox1', 'position':(543, 10), 'size':(250, 242), 'label':'Attributes', }, {'type':'StaticLine', 'name':'staticMenuUnderline', 'position':(0, 0), 'size':(800, -1), 'layout':'horizontal', }, {'type':'CheckBox', 'name':'chkEnabled', 'position':(550, 30), 'checked':True, 'label':'Enabled', }, {'type':'CheckBox', 'name':'chkVisible', 'position':(550, 50), 'checked':True, 'label':'Visible', }, {'type':'CheckBox', 'name':'chkEditable', 'position':(550, 70), 'checked':True, 'label':'Editable', }, {'type':'Button', 'name':'btnBackgroundColor', 'position':(550, 95), 'label':'BackgroundColor', }, {'type':'Button', 'name':'btnForegroundColor', 'position':(550, 125), 'label':'ForegroundColor', }, {'type':'Button', 'name':'btnFont', 'position':(550, 155), 'label':'Font', }, {'type':'Button', 'name':'btnToolTip', 'position':(550, 185), 'label':'ToolTip', }, {'type':'Button', 'name':'btnBgBackgroundColor', 'position':(550, 215), 'label':'Background BackgroundColor', }, {'type':'StaticText', 'name':'labelButton', 'position':(5, 5), 'text':'Button:', }, {'type':'StaticText', 'name':'labelTextField', 'position':(5, 35), 'text':'TextField:', }, {'type':'StaticText', 'name':'labelPasswordField', 'position':(5, 65), 'text':'PasswordField:', }, {'type':'StaticText', 'name':'labelTextArea', 'position':(5, 95), 'text':'TextArea:', }, {'type':'StaticText', 'name':'labelStaticText', 'position':(5, 170), 'text':'StaticText:', }, {'type':'StaticText', 'name':'labelCheckBox', 'position':(5, 200), 'text':'CheckBox:', }, {'type':'StaticText', 'name':'labelRadioGroup', 'position':(5, 260), 'text':'RadioGroup:', }, {'type':'StaticText', 'name':'labelChoice', 'position':(5, 360), 'text':'Choice:', }, {'type':'StaticText', 'name':'labelList', 'position':(5, 390), 'text':'List:', }, {'type':'StaticText', 'name':'labelSlider', 'position':(5, 490), 'text':'Slider:', }, {'type':'StaticText', 'name':'labelStaticLine', 'position':(5, 520), 'text':'StaticLine:', }, {'type':'StaticText', 'name':'labelImage', 'position':(315, 5), 'text':'Image:', }, {'type':'StaticText', 'name':'labelImageButton', 'position':(315, 110), 'text':'ImageButton:', }, {'type':'TextField', 'name':'fldTextFieldNoBorder', 'position':(315, 150), 'size':(180, -1), 'border':'none', 'text':'TextField with no border', }, {'type':'Button', 'name':'btnButton', 'position':(100, 4), 'label':'Button', }, {'type':'TextField', 'name':'fldTextField', 'position':(100, 32), 'size':(180, -1), }, {'type':'PasswordField', 'name':'fldPasswordField', 'position':(100, 62), 'size':(180, -1), }, {'type':'TextArea', 'name':'fldTextArea', 'position':(100, 92), 'size':(180, 60), 'text':'Use the checkboxes and buttons on the right to set the attributes of the widgets on the left.\n\nThe editable attribute only applies to TextField, PasswordFiled, and TextArea.', }, {'type':'StaticText', 'name':'txtStaticText', 'position':(100, 170), 'text':'StaticText', }, {'type':'CheckBox', 'name':'chkCheckBox', 'position':(100, 200), 'label':'CheckBox', }, {'type':'RadioGroup', 'name':'radRadioGroup', 'position':(100, 260), 'items':['one', 'two', 'three'], 'label':'A RadioBox', 'layout':'vertical', 'max':1, 'stringSelection':'one', }, {'type':'Choice', 'name':'popChoice', 'position':(100, 360), 'items':['one', 'two', 'three'], 'stringSelection':'two', }, {'type':'List', 'name':'lstList', 'position':(100, 390), 'size':(-1, 70), 'items':['one', 'two', 'three'], 'stringSelection':'three', }, {'type':'Slider', 'name':'sldSlider', 'position':(100, 490), 'size':(200, 20), 'layout':'horizontal', 'max':100, 'min':1, 'value':1, }, {'type':'StaticLine', 'name':'linStaticLine', 'position':(100, 520), 'size':(200, -1), 'layout':'horizontal', }, {'type':'ImageButton', 'name':'imgImageButton', 'position':(405, 110), 'border':'transparent', 'file':'edit.gif', }, {'type':'Image', 'name':'imgImage', 'position':(385, 5), 'file':'tile.bmp', }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/samples/testSplitter/0000755000076500007650000000000010434046771017672 5ustar alexalex00000000000000PythonCard-0.8.2/samples/testSplitter/doodle.py0000644000076500007650000000573510313163032021506 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.2 $" __date__ = "$Date: 2005/09/18 03:59:22 $" """ from PythonCard import clipboard, dialog, graphic, model import wx import os class Doodle(model.PageBackground): def on_initialize(self, event): self.x = 0 self.y = 0 self.filename = None self.initSizers() def initSizers(self): sizer1 = wx.BoxSizer(wx.VERTICAL) comp = self.components flags = wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.ALIGN_BOTTOM # Mac wxButton needs 7 pixels on bottom and right macPadding = 7 sizer1.Add(comp.btnColor, 0, flags, macPadding) sizer1.Add(comp.bufOff, 1, wx.EXPAND) sizer1.Fit(self) sizer1.SetSizeHints(self) self.panel.SetSizer(sizer1) self.panel.SetAutoLayout(1) self.panel.Layout() def on_bufOff_mouseEnter(self, event): self.x, self.y = event.position def on_bufOff_mouseDown(self, event): self.x, self.y = event.position event.target.drawLine((self.x, self.y), (self.x + 1, self.y + 1)) def on_bufOff_mouseDrag(self, event): x, y = event.position event.target.drawLine((self.x, self.y), (x, y)) self.x = x self.y = y def on_btnColor_mouseClick(self, event): result = dialog.colorDialog(self) if result.accepted: self.components.bufOff.foregroundColor = result.color event.target.backgroundColor = result.color def openFile(self): result = dialog.openFileDialog(None, "Import which file?") if result.accepted: path = result.paths[0] os.chdir(os.path.dirname(path)) self.filename = path bmp = graphic.Bitmap(self.filename) self.components.bufOff.drawBitmap(bmp, (0, 0)) def on_menuFileOpen_select(self, event): self.openFile() def on_menuFileSaveAs_select(self, event): if self.filename is None: path = '' filename = '' else: path, filename = os.path.split(self.filename) result = dialog.saveFileDialog(None, "Save As", path, filename) if result.accepted: path = result.paths[0] fileType = graphic.bitmapType(path) print fileType, path try: bmp = self.components.bufOff.getBitmap() bmp.SaveFile(path, fileType) return 1 except IOError, msg: return 0 else: return 0 def on_menuEditCopy_select(self, event): clipboard.setClipboard(self.components.bufOff.getBitmap()) def on_menuEditPaste_select(self, event): bmp = clipboard.getClipboard() if isinstance(bmp, wx.Bitmap): self.components.bufOff.drawBitmap(bmp) def on_editClear_command(self, event): self.components.bufOff.clear() if __name__ == '__main__': app = model.Application(Doodle) app.MainLoop() PythonCard-0.8.2/samples/testSplitter/doodle.rsrc.py0000644000076500007650000000341110126353153022452 0ustar alexalex00000000000000 { 'application':{ 'type':'Application', 'name':'Doodle', 'backgrounds': [ { 'type':'Background', 'name':'bgDoodle', 'title':'Doodle PythonCard Application', 'size':( 310, 300 ), 'style':['resizeable'], 'menubar': { 'type':'MenuBar', 'menus': [ { 'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ { 'type':'MenuItem', 'name':'menuFileOpen', 'label':'&Open...\tCtrl+O' }, { 'type':'MenuItem', 'name':'menuFileSaveAs', 'label':'Save &As...' }, { 'type':'MenuItem', 'name':'fileSep1', 'label':'-' }, { 'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit' } ] }, { 'type':'Menu', 'name':'menuEdit', 'label':'&Edit', 'items': [ { 'type':'MenuItem', 'name':'menuEditCopy', 'label':'&Copy\tCtrl+C'}, { 'type':'MenuItem', 'name':'menuEditPaste', 'label':'&Paste\tCtrl+V'}, { 'type':'MenuItem', 'name':'editSep1', 'label':'-' }, { 'type':'MenuItem', 'name':'menuEditClear', 'label':'&Clear', 'command':'editClear'} ] } ] }, 'components': [ { 'type':'Button', 'name':'btnColor', 'position':(0, 0), 'label':'Color' }, { 'type':'BitmapCanvas', 'name':'bufOff', 'position':(0, 30), 'size':(300, 230) }, ] } ] } } PythonCard-0.8.2/samples/testSplitter/minimal.py0000644000076500007650000000040710126353153021664 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.1 $" __date__ = "$Date: 2004/09/28 21:23:55 $" """ from PythonCard import model class Minimal(model.PageBackground): pass if __name__ == '__main__': app = model.Application(Minimal) app.MainLoop() PythonCard-0.8.2/samples/testSplitter/minimal.rsrc.py0000644000076500007650000000140110126353153022627 0ustar alexalex00000000000000 { 'application':{ 'type':'Application', 'name':'Minimal', 'backgrounds': [ { 'type':'Background', 'name':'bgMin', 'title':'Minimal PythonCard Application', 'size':( 200, 100 ), 'menubar': { 'type':'MenuBar', 'menus': [ { 'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ { 'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit' } ] } ] }, 'components': [ { 'type':'TextField', 'name':'field1', 'position':(5, 5), 'size':(150, -1), 'text':'Hello PythonCard' }, ] } ] } } PythonCard-0.8.2/samples/testSplitter/readme.txt0000644000076500007650000000137710126353153021671 0ustar alexalex00000000000000Until we have a Splitter integrated into some of the other samples or tools this will serve as a basic test app, but I don't expect to include it in releases. There should be variations testing all the splitter varieties we're going to support. Instead of minimal I was thinking about something more complicated involving the Tree component, List, or MultiColumnList in the left pane. Perhaps this would also be a good place to test a virtual MultiColumnList, perhaps doing a file list and displaying an image in the top-right pane and EXIF info in the bottom-right or something like that. Anyway, we need a more complicated example to work through issues about how these things are going to work. I suppose we could have yet another RSS reader any other ideas? PythonCard-0.8.2/samples/testSplitter/testSplitter.py0000644000076500007650000001337510313163032022745 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.2 $" __date__ = "$Date: 2005/09/18 03:59:22 $" """ from PythonCard import clipboard, dialog, graphic, model import wx import os import minimal import doodle # minimalist panel that works like PageBackground # for testing purposes class MyPanel(wx.Panel): def __init__(self, aParent, size, name): wx.Panel.__init__(self, aParent, -1, size=size, name=name) self.panel = wx.Panel(self, -1, style=wx.TAB_TRAVERSAL | wx.NO_FULL_REPAINT_ON_RESIZE) self.field1 = wx.TextCtrl(self, -1, 'Hello World') self._sizer = wx.BoxSizer(wx.VERTICAL) self._sizer.Add(self.panel, True, wx.EXPAND) self._sizer.Fit(self) self._sizer.SetSizeHints(self) self.SetSizer(self._sizer) self.Layout() class TestSplitter(model.SplitterBackground): def on_initialize(self, event): # the splitter code is adapted from the wxPython demo Main.py # I was having to do RemoveChild with Background # but SplitterBackground seems okay ## self.RemoveChild(self.panel) ## self.panel = None splitter = wx.SplitterWindow(self, -1, style=wx.CLIP_CHILDREN | wx.SP_LIVE_UPDATE | wx.SP_3D) splitter2 = wx.SplitterWindow(splitter, -1, style=wx.CLIP_CHILDREN | wx.SP_LIVE_UPDATE | wx.SP_3D) self.splitter = splitter self.splitter2 = splitter2 win1 = MyPanel(splitter, (100, 50), 'win1') #win1 = model.childWindow(splitter, doodle.Doodle) win1 = model.childWindow(splitter, minimal.Minimal) #win2 = model.childWindow(splitter, minimal.Minimal) #win2 = MyPanel(splitter, (100, 50), 'win2') win2 = model.childWindow(splitter2, doodle.Doodle) #win2 = model.childWindow(splitter2, minimal.Minimal) win3 = model.childWindow(splitter2, doodle.Doodle) self.win1 = win1 self.win2 = win2 self.win3 = win3 # add the windows to the splitter and split it. splitter2.SplitHorizontally(win2, win3, 160) splitter.SplitVertically(win1, splitter2, 200) #splitter.SplitVertically(win1, win2, 150) splitter.SetMinimumPaneSize(20) splitter2.SetMinimumPaneSize(20) self.size = (600, 400) # Make the splitter on the right expand the top window when resized def SplitterOnSize(evt): splitter = evt.GetEventObject() sz = splitter.GetSize() splitter.SetSashPosition(sz.height - 160, False) evt.Skip() #splitter2.Bind(wx.EVT_SIZE, SplitterOnSize) """ Doodle methods MAJOR UNRESOLVED ISSUES just like top-level event handlers and methods when dealing with a Notebook how do we want these kinds of methods to work with a SplitterBackground? if the event handlers and methods such as openFile are defined in the top-level parent then they will be found, but rather than references such as self.components.bufOff they would have to make specific references to the child such as self.win3.components.bufOff this makes sense from the standpoint that the associated menus also have to be specified in the top-level Background resource but it would seem to reduce reusability so could we and should we bind and dispatch events such that a child could add menus and menu items from its resource during the initLayout call or something like that? depending on the focus context, events would be directed at the appropriate child. i'm not even sure that is doable. needless to say the containers introduced with Notebook and SplitterBackground are making me worry about PythonCard becoming even more of a confusing hack job than it already is. """ def openFile(self): win = self.findFocus() print win result = dialog.openFileDialog(None, "Import which file?") if result.accepted: path = result.paths[0] os.chdir(os.path.dirname(path)) self.filename = path bmp = graphic.Bitmap(self.filename) #self.components.bufOff.drawBitmap(bmp, (0, 0)) self.win3.components.bufOff.drawBitmap(bmp, (0, 0)) def on_menuFileOpen_select(self, event): self.openFile() def on_menuFileSaveAs_select(self, event): if self.filename is None: path = '' filename = '' else: path, filename = os.path.split(self.filename) result = dialog.saveFileDialog(None, "Save As", path, filename) if result.accepted: path = result.paths[0] fileType = graphic.bitmapType(path) print fileType, path try: #bmp = self.components.bufOff.getBitmap() bmp = self.win3.components.bufOff.getBitmap() bmp.SaveFile(path, fileType) return 1 except Exception, msg: # Should check for a particular exception return 0 else: return 0 def on_menuEditCopy_select(self, event): #clipboard.setClipboard(self.components.bufOff.getBitmap()) clipboard.setClipboard(self.win3.components.bufOff.getBitmap()) def on_menuEditPaste_select(self, event): bmp = clipboard.getClipboard() if isinstance(bmp, wx.Bitmap): #self.components.bufOff.drawBitmap(bmp) self.win3.components.bufOff.drawBitmap(bmp) def on_editClear_command(self, event): #self.components.bufOff.clear() self.win3.components.bufOff.clear() if __name__ == '__main__': app = model.Application(TestSplitter) app.MainLoop() PythonCard-0.8.2/samples/testSplitter/testSplitter.rsrc.py0000644000076500007650000000307610126353153023721 0ustar alexalex00000000000000 { 'application':{ 'type':'Application', 'name':'Doodle', 'backgrounds': [ { 'type':'Background', 'name':'bgDoodle', 'title':'Doodle PythonCard Application', 'size':( 310, 200 ), 'style':['resizeable'], 'menubar': { 'type':'MenuBar', 'menus': [ { 'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ { 'type':'MenuItem', 'name':'menuFileOpen', 'label':'&Open...\tCtrl+O' }, { 'type':'MenuItem', 'name':'menuFileSaveAs', 'label':'Save &As...' }, { 'type':'MenuItem', 'name':'fileSep1', 'label':'-' }, { 'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit' } ] }, { 'type':'Menu', 'name':'menuEdit', 'label':'&Edit', 'items': [ { 'type':'MenuItem', 'name':'menuEditCopy', 'label':'&Copy\tCtrl+C'}, { 'type':'MenuItem', 'name':'menuEditPaste', 'label':'&Paste\tCtrl+V'}, { 'type':'MenuItem', 'name':'editSep1', 'label':'-' }, { 'type':'MenuItem', 'name':'menuEditClear', 'label':'&Clear', 'command':'editClear'} ] } ] }, 'components': [ ] } ] } } PythonCard-0.8.2/samples/textIndexer/0000755000076500007650000000000010434046771017467 5ustar alexalex00000000000000PythonCard-0.8.2/samples/textIndexer/journal.py0000644000076500007650000000156007337533260021517 0ustar alexalex00000000000000import time call_stack = [] journal = [] journal_level = 0 def OpenJournal(name): global call_stack, journal, journal_level start_time = time.time() call_stack.append(len(journal)) journal.append((name, journal_level, start_time)) journal_level = journal_level + 1 def CloseJournal(): global call_stack, journal, journal_level end_time = time.time() index = call_stack[-1] del call_stack[-1] name, level, start_time = journal[index] journal[index] = (name, level, end_time - start_time) journal_level = journal_level - 1 if journal_level == 0: DumpJournal() def DumpJournal(): global call_stack, journal, journal_level assert(len(call_stack) == 0) for entry in range(0, len(journal)): name, level, time = journal[entry] print " " * level, name, round(time, 2) journal = [] PythonCard-0.8.2/samples/textIndexer/readme.txt0000644000076500007650000000142507600217741021465 0ustar alexalex00000000000000Dan's explanation of the code. "It's about text searching and the hint bit algorithms hypercard uses, which is more formally called "superimposed coding". It's really about indexing and compressing text which is useful on stacks with thousands of cards of text where you want fast search..." The stack is currently stored as using ZODB, so you must have ZODB installed to try this sample. I plan to change the code to pickle or shelve the data instead. The Import Stack menu option is intended for importing stacks of the format described in: Managing Gigabytes Compressing and Indexing Documents and Images Second Edition, 1999 http://www.cs.mu.oz.au/mg/ source at: http://www.cs.mu.oz.au/mg/mg-1.2.1.tar.gz If you attempt to Import a ZODB stack it will corrupt the data. PythonCard-0.8.2/samples/textIndexer/textIndexer.py0000644000076500007650000003570010313163032022333 0ustar alexalex00000000000000#!/usr/bin/env python """ __version__ = "$Revision: 1.28 $" __date__ = "$Date: 2005/09/18 03:59:22 $" translation of Dan Winkler's PythonCard demo from Tk to wxWindows (wxPythonCard.py) by Neil Hodgson wxWindows to PythonCard by Kevin Altis the first version also used ZODB, but since I've been trying to track down what I think is an error related to ZODB, I may go ahead and blow away ZODB or just comment it out and use something else since right now the stack is getting corrupted. I haven't gone back yet to see if this happens with Neil's initial port. changed self.stack references to self.wstack (winkler stack) to avoid name collision with PythonCard stack variable changed wxTextCtrl method calls to dot notation PythonCard TextArea calls renamed the methods called during menu events to be command events this also shows off doing command events for the Edit menu items which are otherwise identical to the ones in the searchexplorer sample """ from PythonCard import configuration, dialog, model import wx import time from journal import * import ZODB from Persistence import Persistent from ZODB.PersistentList import PersistentList from ZODB import DB, FileStorage import BTrees from BTrees import OOBTree import re import string import os class CardStack(Persistent): def __init__(self): self._v_current_card = 0 self._v_text = None self._v_cardNumber = None self.last_id = 0 self.card_list = PersistentList() self.to_be_indexed = PersistentList() self.card_store = OOBTree.OOBTree() self.hint_store = OOBTree.OOBTree() self.CreateCard(at_end=1, and_set=0) def SetHints(self, id, hints): if self.to_be_indexed[0] == id: self.hint_store[id] = hints del self.to_be_indexed[0] else: print "Not saving hints for card id", id, "because card has been deleted." def StoreText(self, id, text): self.card_store[id] = self.Compress(text) self.hint_store[id] = None if id not in self.to_be_indexed: self.to_be_indexed.append(id) get_transaction().commit() def GetText(self, id): return self.Decompress(self.card_store[id]) def DeleteCard(self): if len(self.card_list) <= 1: return id = self.card_list[self._v_current_card] del self.card_list[self._v_current_card] del self.card_store[id] del self.hint_store[id] self.SetCard(self._v_current_card) def NewCard(self): self.SaveCurrentCard() self.CreateCard() def CreateCard(self, at_end=0, text="", and_set=1): id = self.last_id + 1 self.last_id = id if at_end: self.card_list.append(id) else: self.card_list.insert(self._v_current_card + 1, id) self.StoreText(id, text) if and_set: self.SetCard(self._v_current_card + 1) def SetCard(self, card_num): if card_num >= len(self.card_list): card_num = len(self.card_list) - 1 if card_num < 0: card_num = 0 self._v_current_card = card_num id = self.card_list[card_num] card_text = self.GetText(id) self._v_text.text = card_text self._v_cardNumber.text = 'Card: ' + str(card_num + 1) print "Card", card_num + 1, "of", len(self.card_list) def SaveCurrentCard(self): text = self._v_text.text id = self.card_list[self._v_current_card] self.StoreText(id, text) def Decompress(self, text): if len(text) == 0: return text flag_index = len(text)-1 flag = text[flag_index] if flag == chr(0): return text[0:-1] from zlib import decompress return decompress(text[0:-1]) def Compress(self, text): old_len = len(text) if old_len == 0: return text from zlib import compress start_time = time.time() compressed = compress(text, 9) elapsed_time = time.time() - start_time new_len = len(compressed) if new_len < old_len: print "compressed", old_len, "bytes by", old_len - new_len, "bytes" return compressed + chr(1) print "leaving text of len", old_len, "uncompressed." return text + chr(0) def GoNext(self, dummy=""): self.SaveCurrentCard() self.SetCard(self._v_current_card + 1) def GoPrev(self, dummy=""): self.SaveCurrentCard() self.SetCard(self._v_current_card - 1) def GoFirst(self): self.SaveCurrentCard() self.SetCard(0) def GoLast(self): self.SaveCurrentCard() self.SetCard(len(self.card_list)-1) def ImportStack(self): """imports stacks of the format described in Managing Gigabytes Compressing and Indexing Documents and Images Second Edition, 1999 http://www.cs.mu.oz.au/mg/ source at http://www.cs.mu.oz.au/mg/mg-1.2.1.tar.gz """ wildcard = "stack files (*.stack)|*.stack|All Files (*.*)|*.*" result = dialog.openFileDialog(None, "Import which stack?", '', '', wildcard) if result.accepted: path = result.paths[0] file = open(path, "r") cards = file.read().split(str(chr(2))) for text in cards: self.CreateCard(at_end=1, text=re.sub("\r", "\n", text), and_set=0) file.close() self.SetCard(0) class Hinter: min_stem = 3 max_stem = 4 strip_chars = "" spaces = None table = None def __init__(self, stack, id): self.start_time = time.time() self.wstack = stack self.id = id self.stage = 0 self.hints = 0 if self.strip_chars == "": for char in range(0,256): if not chr(char) in (string.letters + string.digits): self.strip_chars = self.strip_chars + chr(char) self.spaces = " " * len(self.strip_chars) self.table = string.maketrans(self.strip_chars, self.spaces) text = stack.GetText(id) self.words = text.translate(self.table).split() def GetNextStem(self): if self.curr_stem < len(self.stems): stem = self.stems[self.curr_stem] self.curr_stem = self.curr_stem + 1 return stem return "" def ComputeHint(self, stem): import whrandom generator = whrandom.whrandom() generator.seed(ord(stem[0]), ord(stem[1]), ord(stem[2])) nbits = 0 try_count = 0 hint_bits = 0 while nbits < self.codeword_set and try_count < self.codeword_set * 20: try_count = try_count + 1 bit_num = generator.randint(0, self.codeword_len*8-1) bit_mask = 1L << bit_num if not hint_bits & bit_mask: # not yet set hint_bits = hint_bits | bit_mask nbits = nbits + 1 return hint_bits def StemNextWord(self): # trim, lowercase, uniq stem = self.words[self.curr_word][0:self.max_stem] self.curr_word = self.curr_word + 1 if len(stem) >= self.min_stem: stem = stem.lower() self.stems[stem] = 1; def DoOneIdleStep(self): step_start_time = time.clock() if self.stage == 0: # set up to compute stems self.curr_word = 0 self.stems = {} self.stage = 1 return 0 # not done elif self.stage == 1: # compute a few stems while time.clock() - step_start_time < 0.01: if self.curr_word < len(self.words): self.StemNextWord() else: # done computing stems, set up for computing hints self.words = None self.stems = self.stems.keys() print len(self.stems), "unique stems" from math import log pf = 1.0/1000 w = (1/log(2)*log(1/pf)) m = (1/log(2))**2*len(self.stems)*log(1/pf) self.codeword_len = int(round(m/8)) self.codeword_set = int(round(w)) print self.codeword_len, "hint bytes for this card" print self.codeword_set, "bits set per stem" self.curr_stem = 0 self.stage = 2 return 0 # not done return 0 # not done elif self.stage == 2: # compute a few hints while time.clock() - step_start_time < 0.01: stem = self.GetNextStem() if stem <> "": self.hints = self.hints | self.ComputeHint(stem) else: #print self.hints print "indexed card id", self.id, "in", \ round(time.time() - self.start_time,2), "seconds" self.wstack.SetHints(self.id, self.hints) return 1 # done return 0 # not done #class CardFrame(wx.Frame): class CardFrame(model.Background): def on_initialize(self, event): self.configPath = os.path.join(configuration.homedir, 'textindexer') if not os.path.exists(self.configPath): os.mkdir(self.configPath) self.filename = os.path.join(self.configPath, 'zhome.stack') self.storage = FileStorage.FileStorage(self.filename) db = DB(self.storage) self.connection = conn = db.open() dbroot = conn.root() if not dbroot.has_key('stack'): dbroot['stack'] = CardStack() stack = dbroot['stack'] self._v_idle_tasks = [] self.wstack = stack self.CreateParts() stack.SetCard(0) wx.EVT_IDLE(self, self.Idler) def CreateParts(self): self.wstack._v_text = self.components.field1 self.wstack._v_cardNumber = self.components.stcCardNumber #self.CreateStatusBar() def CompactStack(self): self.wstack.SaveCurrentCard() self.connection._db.pack() def on_compactStack_command(self, event): self.CompactStack() def on_importStack_command(self, event): self.wstack.SaveCurrentCard() self.wstack.ImportStack() def on_exit_command(self, event): # KEA Shutdown wasn't being called before, maybe that # caused the .stack file corruption? self.Shutdown() self.close(True) def on_editUndo_command(self, event): widget = self.findFocus() if hasattr(widget, 'editable') and widget.canUndo(): widget.undo() def on_editRedo_command(self, event): widget = self.findFocus() if hasattr(widget, 'editable') and widget.canRedo(): widget.redo() def on_editCut_command(self, event): widget = self.findFocus() if hasattr(widget, 'editable') and widget.canCut(): widget.cut() def on_editCopy_command(self, event): widget = self.findFocus() if hasattr(widget, 'editable') and widget.canCopy(): widget.copy() def on_editPaste_command(self, event): widget = self.findFocus() if hasattr(widget, 'editable') and widget.canPaste(): widget.paste() def on_editClear_command(self, event): widget = self.findFocus() if hasattr(widget, 'editable'): if widget.canCut(): # delete the current selection, # if we can't do a Cut we shouldn't be able to delete either # which is why i used the test above sel = widget.replaceSelection('') else: ins = widget.getInsertionPoint() widget.replace(ins, ins + 1, '') def on_editSelectAll_command(self, event): widget = self.findFocus() if hasattr(widget, 'editable'): widget.setSelection(0, widget.getLastPosition()) def on_editNewCard_command(self, event): self.wstack.NewCard() def on_editDeleteCard_command(self, event): self.wstack.DeleteCard() def on_goNext_command(self, event): self.wstack.GoNext() def on_goPrev_command(self, event): self.wstack.GoPrev() def on_goFirst_command(self, event): self.wstack.GoFirst() def on_goLast_command(self, event): self.wstack.GoLast() def findNext(self, searchText): startCard = self.wstack._v_current_card numCards = len(self.wstack.card_list)-1 # move to the next card and repeat the search until a match # or we come back to the card we started on doneSearching = 0 while not doneSearching: if self.wstack._v_current_card == numCards: self.wstack.GoFirst() else: self.wstack.GoNext() if self.wstack._v_current_card == startCard: doneSearching = 1 fieldText = self.components.field1.text.lower() offset = fieldText.find(searchText) if offset != -1: offset += fieldText.count('\n', 0, offset) self.components.field1.setSelection(offset, offset + len(searchText)) self.components.field1.setFocus() doneSearching = 1 def on_doFind_command(self, event): searchText = self.components.fldFind.text.lower() fieldText = self.components.field1.text.lower() offset = fieldText.find(searchText) if offset != -1: self.components.field1.setSelection(offset, offset + len(searchText)) self.components.field1.setFocus() else: self.findNext(searchText) def on_doFindNext_command(self, event): searchText = self.components.fldFind.text.lower() fieldText = self.components.field1.text.lower() selOffset = self.components.field1.getSelection()[1] offset = fieldText[selOffset:].find(searchText) if offset != -1: offset += selOffset self.components.field1.setSelection(offset, offset + len(searchText)) self.components.field1.setFocus() else: self.findNext(searchText) def AddIdleTask(self, task): self._v_idle_tasks.append(task) def Shutdown(self): self.wstack.SaveCurrentCard() def Idler(self, event): #print "idling" if len(self._v_idle_tasks) > 0: done = self._v_idle_tasks[0].DoOneIdleStep() if done: del self._v_idle_tasks[0] elif len(self.wstack.to_be_indexed) > 0: id = self.wstack.to_be_indexed[0] print "indexing card id", id if id in self.wstack.card_list: hinter = Hinter(self.wstack, id) self.AddIdleTask(hinter) else: print "not indexing card id", id, "because it has been deleted" del self.wstack.to_be_indexed[0] # card has been deleted if __name__ == '__main__': app = model.Application(CardFrame) app.MainLoop() PythonCard-0.8.2/samples/textIndexer/textIndexer.rsrc.py0000644000076500007650000001273610047606364023325 0ustar alexalex00000000000000 { 'application':{ 'type':'Application', 'name':'TextIndexer', 'backgrounds': [ { 'type':'Background', 'name':'bgCard', 'title':'Text Indexing and Compression', 'size':( 400, 350 ), 'menubar': { 'type':'MenuBar', 'menus': [ { 'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ { 'type':'MenuItem', 'name':'menuFileCompactStack', 'label':"&Compact Stack", 'command':'compactStack' }, { 'type':'MenuItem', 'name':'menuFileImportStack', 'label':"&Import Stack", 'command':'importStack'}, { 'type':'MenuItem', 'name':'fileSep1', 'label':'-' }, { 'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit'} ] }, {'type':'Menu', 'name':'Edit', 'label':'&Edit', 'items': [ { 'type':'MenuItem', 'name':'menuEditUndo', 'label':'&Undo\tCtrl+Z', 'command':'editUndo'}, { 'type':'MenuItem', 'name':'menuEditRedo', 'label':'&Redo\tCtrl+Y', 'command':'editRedo'}, { 'type':'MenuItem', 'name':'editSep1', 'label':'-' }, { 'type':'MenuItem', 'name':'menuEditCut', 'label':'Cu&t\tCtrl+X', 'command':'editCut'}, { 'type':'MenuItem', 'name':'menuEditCopy', 'label':'&Copy\tCtrl+C', 'command':'editCopy'}, { 'type':'MenuItem', 'name':'menuEditPaste', 'label':'&Paste\tCtrl+V', 'command':'editPaste'}, { 'type':'MenuItem', 'name':'editSep2', 'label':'-' }, { 'type':'MenuItem', 'name':'menuEditClear', 'label':'Cle&ar\tDel', 'command':'editClear'}, { 'type':'MenuItem', 'name':'menuEditSelectAll', 'label':'Select A&ll\tCtrl+A', 'command':'editSelectAll'}, { 'type':'MenuItem', 'name':'editSep3', 'label':'-' }, { 'type':"MenuItem", 'name':"menuEditNewCard", 'label':"&New Card\tCtrl+N", 'command':'editNewCard'}, { 'type':"MenuItem", 'name':"menuEditDeleteCard", 'label':"&Delete Card", 'command':'editDeleteCard'}, ] }, {'type':'Menu', 'name':'Go', 'label':'&Go', 'items': [ { 'type':"MenuItem", 'name':"menuGoNextCard", 'label':"&Next Card\tCtrl+1", 'command':'goNext'}, { 'type':"MenuItem", 'name':"menuGoPrevCard", 'label':"&Prev Card\tCtrl+2", 'command':'goPrev'}, { 'type':"MenuItem", 'name':"menuGoFirstCard", 'label':"&First Card\tCtrl+3", 'command':'goFirst'}, { 'type':"MenuItem", 'name':"menuGoLastCard", 'label':"&Last Card\tCtrl+4", 'command':'goLast'}, ] } ] }, 'components': [ { 'type':'TextArea', 'name':'field1', 'position':(0, 0), 'size':(390, 200), 'text':'Hello PythonCard' }, { 'type':'Button', 'name':'btnFirstCard', 'position':(30, 210), 'label':'First', 'command':'goFirst'}, { 'type':'Button', 'name':'btnPrevCard', 'position':(110, 210), 'label':'Previous', 'command':'goPrev'}, { 'type':'Button', 'name':'btnNextCard', 'position':(190, 210), 'label':'Next', 'command':'goNext'}, { 'type':'Button', 'name':'btnLastCard', 'position':(270, 210), 'label':'Last', 'command':'goLast'}, { 'type':'StaticLine', 'name':'staticlineH', 'position':( 5, 240 ), 'size':( 385, -1 ) }, { 'type':'StaticText', 'name':'labelFind', 'position':(0, 255), 'size':(40, -1), 'alignment':'right', 'text':'Find:' }, { 'type':'TextField', 'name':'fldFind', 'position':(50, 250), 'size':(150, -1), 'text':'' }, { 'type':'Button', 'name':'btnFind', 'position':(210, 250), 'label':'Find', 'command':'doFind'}, { 'type':'Button', 'name':'btnFindNext', 'position':(290, 250), 'label':'Find Next', 'command':'doFindNext'}, { 'type':'StaticText', 'name':'stcCardNumber', 'position':(5, 280)}, ] } ] } } PythonCard-0.8.2/samples/textRouter/0000755000076500007650000000000010434046772017352 5ustar alexalex00000000000000PythonCard-0.8.2/samples/textRouter/bloggeraccount.py0000644000076500007650000003365110107721630022720 0ustar alexalex00000000000000from PythonCard import dialog import xmlrpclib import wx from trTransport import trURLlibTransport """ __version__ = "$Revision: 1.19 $" __date__ = "$Date: 2004/08/15 17:55:36 $" """ ## ===================== ## ## Blogger Account Class ## ## ===================== ## # Encapsualtes the functionality we need for Blogger accounts. class BloggerAccount: "Encapsulate one blogger account details and user preferences" def __init__(self, proxy=""): self.prefs = {"username" : "", "password" : "", "rpcserver" : "http://plant.blogger.com/api/RPC2",\ "activeBlog" : -1} self.blogs = [] self.settings = {"appkey" : "4621527933BBFAB9CBE39BAFFD41313009CBEB1E"} self.loggedIn = 0 self.currentPostId = -1 # used only when we fetch an existing post for editting. self.previousPosts = [] self.sessionPassword = "" # used to store the password when the user # doesn't want it saved to a config file. self.lastErrorMessage = "" self.errorOccured = 0 self.currentPostID = -1 #print "ba: useProxy: " + proxy self.proxy = proxy def createBloggerSite(self): """Set's up the xmlrpclib site object.""" self.bloggerSite = xmlrpclib.Server(self.prefs["rpcserver"], \ transport=trURLlibTransport(self.proxy)) def setProxy(self, proxy): """Set's the proxy.""" self.proxy = proxy def bloggerLogin(self): """Logs in to a blogger server. Returns 1 on success, 0 on failure.""" # check the settings have been entered. if (not self.checkSetupOK(1)): return 0 if self.getPassword() == "": result = dialog.textEntryDialog(None, \ 'Please enter your Blogger password (It will not be saved to the config): ', "Password entry...", '', wx.TE_PASSWORD) if not result.accepted: self.setErrorMessage("You must enter a password to continue.") return 0 self.sessionPassword = result.text if not self.getLoggedIn(): #if self.useProxy == "yes": # print "created with proxy" # self.bloggerSite = xmlrpclib.Server(self.prefs["rpcserver"], transport=UrllibTransport()) #else: # print "created without proxy" self.createBloggerSite() try: self.blogs = self.bloggerSite.blogger.getUsersBlogs(self.settings["appkey"], \ self.prefs["username"], \ self.getPassword()) #print self.blogs if len(self.blogs) > 0 and self.prefs["activeBlog"] == -1: self.prefs["activeBlog"] = 0 except xmlrpclib.Fault, e: self.setErrorMessage("Error logging in: %s" % e.faultString) return 0 self.setLoggedIn(1) else: self.setErrorMessage("Already logged in.") return 0 return 1 def bloggerBlogText(self, text): """Blogs the text to the chosen blog within the current Blogger account.""" boolTrue = xmlrpclib.Boolean(1) if (not self.checkSetupOK()): return if text == "": self.setErrorMessage("Text to blog can't be blank. (You may want to check the output mode.)") return 0 try: postid = self.bloggerSite.blogger.newPost(self.settings["appkey"], \ self.blogs[self.prefs["activeBlog"]-1]["blogid"], \ self.prefs["username"], \ self.getPassword(), \ text, boolTrue) self.setErrorMessage("") except xmlrpclib.Fault, e: self.setErrorMessage("Error adding text to homepage: %s" % e.faultString) return 0 if self.prefs["weblogsPing"] == "Yes": #print "pinging weblogs.com" try: #print self.blogs[self.prefs["activeBlog"]-1]["blogName"] #print self.blogs[self.prefs["activeBlog"]-1]["url"] weblogsCom = xmlrpclib.Server("http://rpc.weblogs.com/RPC2", \ transport=trURLlibTransport(self.proxy)) weblogsCom.weblogUpdates.ping(self.blogs[self.prefs["activeBlog"]-1]["blogName"], \ self.blogs[self.prefs["activeBlog"]-1]["url"]) self.setErrorMessage("") except xmlrpclib.Fault, e: self.setErrorMessage("Blog successfully updated. But error while 'pinging' weblogs.com:" % e.faultString) return 0 #else: #print "NOT pinging weblogs.com" self.currentPostId = -1 return postid def bloggerFetchPreviousPosts(self, number = 10): """Fetchs a list of previous posts from the Blogger server.""" boolTrue = xmlrpclib.Boolean(1) if (not self.checkSetupOK()): return 0 try: self.blogs[self.prefs["activeBlog"]-1]["previousPosts"] = \ self.bloggerSite.blogger.getRecentPosts(self.settings["appkey"], \ self.blogs[self.prefs["activeBlog"]-1]["blogid"],\ self.prefs["username"], \ self.getPassword(), \ number) self.setErrorMessage("") except xmlrpclib.Fault, e: self.setErrorMessage("Error downloading previous posts: %s" % e.faultString) return 0 return 1 def bloggerGetTemplate(self, type = "main"): """Gets a template for the current blog.""" boolTrue = xmlrpclib.Boolean(1) if (not self.checkSetupOK()): return try: self.blogs[self.prefs["activeBlog"]-1]["template"] = \ self.bloggerSite.blogger.getTemplate(self.settings["appkey"], \ self.blogs[self.prefs["activeBlog"]-1]["blogid"],\ self.prefs["username"], \ self.getPassword(), \ type) self.setErrorMessage("") except xmlrpclib.Fault, e: self.setErrorMessage("Error downloading template: %s" % e.faultString) return return self.blogs[self.prefs["activeBlog"]-1]["template"] def bloggerSetTemplate(self, type, text): """Sets a template for the current blog.""" boolTrue = xmlrpclib.Boolean(1) if (not self.checkSetupOK()): return 0 try: self.bloggerSite.blogger.setTemplate(self.settings["appkey"], \ self.blogs[self.prefs["activeBlog"]-1]["blogid"],\ self.prefs["username"], \ self.getPassword(), \ text, type) self.setErrorMessage("") except xmlrpclib.Fault, e: self.setErrorMessage("Error saving template: %s" % e.faultString) return 0 return 1 def bloggerGetPost(self, postid): """Fetches a single post from the server.""" if (not self.checkSetupOK()): return 0 try: post = self.bloggerSite.blogger.getPost(self.settings["appkey"], \ postid, \ self.prefs["username"], \ self.getPassword()) self.setErrorMessage("") except xmlrpclib.Fault, e: self.setErrorMessage("Error fetching post: %s" % e.faultString) return 0 return post def bloggerDeletePost(self, index): """Deletes a post.""" boolTrue = xmlrpclib.Boolean(1) postid = self.blogs[self.prefs["activeBlog"] - 1]["previousPosts"][index]["postid"] if (not self.checkSetupOK()): return 0 try: self.bloggerSite.blogger.deletePost(self.settings["appkey"], \ postid, \ self.prefs["username"], \ self.getPassword(), \ boolTrue) self.blogs[self.prefs["activeBlog"]-1]["previousPosts"][index:index+1] = [] self.setErrorMessage("") except xmlrpclib.Fault, e: self.setErrorMessage("Error deleting post: %s" % e.faultString) return 0 return 1 def bloggerUpdatePost(self, content): """Updates a post with the content given.""" boolTrue = xmlrpclib.Boolean(1) if (not self.checkSetupOK()): return 0 try: self.bloggerSite.blogger.editPost(self.settings["appkey"], \ self.currentPostId, \ self.prefs["username"], \ self.getPassword(), \ content, \ boolTrue) self.setErrorMessage("") except xmlrpclib.Fault, e: self.setErrorMessage("Error updating post: %s" % e.faultString) return 0 return 1 def setPrefs(self, rpcserver="", username="", password="", weblogsPing=""): """Sets the user specific settings from the arguments""" self.prefs["rpcserver"] = rpcserver self.prefs["username"] = username self.prefs["password"] = password self.prefs["weblogsPing"] = weblogsPing def checkSetupOK(self, toCheck = 0): """Checks that the setup is OK for contacting a server. Accepts an integer arguement, each bit specifies corresponds to one check, if the bit is one the check is done. If the argument is 0, all checks are done. Returns 1 if the checks are passed, 0 if one fails.""" # do we need to have the settings entered ? if toCheck == 0 or toCheck & 1: if self.prefs['username'] == "" or self.prefs['rpcserver'] == "": self.setErrorMessage("You must setup the Blogger account details first.") return 0 # do we need to be logged in ? if toCheck == 0 or toCheck & 2: if self.getLoggedIn() == 0: self.setErrorMessage("You must login first.") return 0 # do we need to have an activeBlog chosen ? if toCheck == 0 or toCheck & 4: if self.getActiveBlog() == -1: self.setErrorMessage("You must choose a blog first.") return 0 # do we need to have downloaded list of previous posts if toCheck & 8: #if self.blogs[self.prefs["activeBlog"]-1]["previousPosts"] == []: if ("previousPosts" not in self.blogs[self.prefs["activeBlog"]-1]) or \ self.blogs[self.prefs["activeBlog"]-1]["previousPosts"] == []: self.setErrorMessage("You must download the previous posts first.") return 0 self.setErrorMessage("") return 1 def getPassword(self): """Returns the password, if one is set in the config that is returned, else the session password is checked""" if self.prefs["password"] != "": return self.prefs["password"] return self.sessionPassword def setLoggedIn(self, loggedIn): """Sets the state of the 'logged-in-ness'""" self.loggedIn = loggedIn def getLoggedIn(self): """Returns the state of the 'logged-in-ness'""" return self.loggedIn def setActiveBlog(self, activeBlog): """Sets the active blog""" # we need to check here that the given blog number is in range: try: activeBlog = int(activeBlog) except ValueError, e: self.setErrorMessage("Value entered must be a number.") return 0 if activeBlog > len(self.blogs) or activeBlog < 1: self.setErrorMessage("Chosen blog number (%d) is out of range." % activeBlog) return 0 self.prefs["activeBlog"] = activeBlog return 1 def getActiveBlog(self): """Returns the number of the currently active blog""" return self.prefs["activeBlog"] def setErrorMessage(self, msg): """Sets the last error message variable and the 'errorOccured' flag""" self.lastErrorMessage = msg if self.lastErrorMessage != "": self.errorOccured = 1 else: self.errorOccured = 0 def getErrorMessage(self): """Returns a string describing the last error to occur.""" return self.lastErrorMessage def anErrorOccured(self): """Returns 0 if last operation was a success, 1 if last operation failed.""" return (self.errorOccured) PythonCard-0.8.2/samples/textRouter/customDialogs.py0000644000076500007650000003721110106741246022537 0ustar alexalex00000000000000from PythonCard import dialog, resource from PythonCard.model import CustomDialog import wx from wx import Yield from string import whitespace from time import sleep import webbrowser import pprint from wordwrap import wrap_string """ __version__ = "$Revision: 1.27 $" __date__ = "$Date: 2004/08/12 19:19:02 $" """ # --------------------- # # Custom Dialogs # # --------------------- # # This file contains all the custom dialogs (each based on CustomDialog) used by textRouter. class AboutDialog(CustomDialog): """Displays a simple about screen.""" def __init__(self, aBg, title, description, links) : """Initialize the defaults for the input boxes.""" self.links = links # build the resource which describes this particular preferences window aDialogRsrc = self.buildAboutResource(title, description, links) CustomDialog.__init__(self, aBg, aDialogRsrc) self.parent = aBg def buildAboutResource(self, title, description, links): """This builds a string containing a resource description as you find in a .rsrc files""" description = description.replace("\n", "\\n") description = description.replace("'", "\\'") # build the body of the About dialog resourece string. done first so we know the # total height of the whole window when we write out the main string at the end. bodyRSRC = " {'type':'StaticText', 'name':'labelDesc', 'position':(10,10)," + \ "'alignment':'center','size':(360,30),'text':'" + title + "'}," bodyRSRC = bodyRSRC + " {'type':'TextArea', 'name':'labelDesc', 'position':(10,40)," + \ "'size':(360,80),'text':'" + description + "'}," vert = 140 for i in range(len(links)): link = links[i] bodyRSRC = bodyRSRC + " {'type':'StaticText', 'name':'labelLinkDesc%d', " % i + \ "'position':(10,%d)," % (vert) + \ "'text':'" + link[0] + "'}," vert += 20 bodyRSRC = bodyRSRC + " {'type':'StaticText', 'name':'labelLink%d', " % i + \ "'position':(10,%d)," % (vert) + \ "'foregroundColor':'blue', 'text':'" + link[1] + "'}," vert += 30 bodyRSRC = bodyRSRC + \ "{'type':'Button', 'name':'btnOK', 'position':(10, %d), " % vert + \ "'label':'OK', 'id':5100 }" + \ " ] } " vert += 60 # construct the final resource string. dlgRSRC = "{'type':'CustomDialog','name':'dlgAbout'," + \ " 'title':'About " + title + "...','position':(-1,-1),'size':(390, %d),\n\n'components': [" % vert dlgRSRC += bodyRSRC # eval the resource string, pass it to Resource() and return it. return resource.Resource( eval(dlgRSRC) ) def on_mouseUp(self, event): target = event.target if target._name[0:9] == "labelLink": self.doLaunchURL(int(target._name[9:])) else: event.skip() def doLaunchURL(self, num): """Launch a URL.""" try: webbrowser.open(self.links[num][1], 1, 1) except webbrowser.Error, e: result = dialog.messageDialog(self, "Could not find a runable browser.", "Error launching URL", \ wx.ICON_INFORMATION | wx.OK) # these shouldn't be necessary ... (see textEditor.pyw) def on_btnOK_mouseClick(self, event): event.skip() class AutoTextScrollerDialog(CustomDialog): """Set's up a speed reading window.""" def __init__(self, aBg, title, prefs, text) : """Initialize the defaults for the input boxes.""" self.reading = 0 self.location = 0 self.text = text self.delay = ("textScrollerDelay" in prefs) and prefs["textScrollerDelay"] or 0.3 self.words = ("textScrollerWords" in prefs) and prefs["textScrollerWords"] or 1 self.font = ("textScrollerFont" in prefs) and prefs["textScrollerFont"] or \ "{'style': 'bold', 'faceName': 'helvetica', 'family': 'sansSerif', 'size': 24}" # build the resource which describes this particular preferences window aDialogRsrc = self.buildSpeedReaderResource(title, prefs) CustomDialog.__init__(self, aBg, aDialogRsrc) self.parent = aBg def on_btnStart_mouseClick(self, event): """Starts the speed reading going.""" if self.reading == 1: return self.reading = 1 self.doReading() def on_btnPause_mouseClick(self, event): """Pauses the speed reading.""" self.reading = 0 def doReading(self): while self.components.theWords.text[-5:-1] != "-end": if self.reading == 0: break self.components.theWords.text = self.getNextWords() Yield() sleep(self.delay) self.reading = 0 def getNextWords(self): """Gets the next set of words.""" str = "" for i in range(self.words): str += self.getNextWord() if str[-5:-1] == "-end": break return str def getNextWord(self): start = self.location if start >= len(self.text): return "-end-" for i in range(start, len(self.text)): #if not (curses.ascii.isalnum(self.text[i]) or self.text[i] == "-"): if not (self.text[i].isalpha() or self.text[i] == "-"): break self.location = i + 1 return self.text[start:i+1] # these shouldn't be necessary ... (see textEditor.pyw) def on_btnClose_mouseClick(self, event): self.reading = 0 Yield() event.skip() def buildSpeedReaderResource(self, title, prefs): """This builds a string containing a resource description as you find in a .rsrc files""" # main StaticText whcih holds each word bodyRSRC = " {'type':'StaticText', 'name':'theWords', 'position':(10,100)," + \ "'alignment':'center','font':" + self.font + ",'size':(520,110),'text':'-'}," # the buttons bodyRSRC = bodyRSRC + \ "{'type':'Button', 'name':'btnStart', 'position':(10, 260)," + \ "'label':'Start', 'toolTip':'Starts Speed Reading' }, " + \ "{'type':'Button', 'name':'btnPause', 'position':(110, 260)," + \ "'label':'Pause', 'toolTip':'Pauses Speed Reading' }, " + \ "{'type':'Button', 'name':'btnClose', 'position':(210, 260), " + \ "'label':'Close', 'id':5100 }," + \ " ] } " # construct the final resource string. dlgRSRC = "{'type':'CustomDialog','name':'dlgAutoTextScroller'," + \ " 'title':'" + title + "','position':(100,100),'size':(540, 320),\n\n'components': [" dlgRSRC += bodyRSRC # eval the resource string, pass it to Resource() and return it. return resource.Resource( eval(dlgRSRC) ) class ChooserDialog(CustomDialog): """Presents a dialog with a list of things to choose from in it.""" def __init__(self, aBg, title, caption, options, defOption) : """Initialize the defaults for the input boxes""" # build the resource which describes this particular preferences window self.options = options aDialogRsrc = self.buildChooserResource(title, caption, options, defOption) CustomDialog.__init__(self, aBg, aDialogRsrc) self.parent = aBg def buildChooserResource(self, title, caption, options, defOption): """This builds a string containing a resource description as you find in a .rsrc files""" # dynamically build each of the list choices optionsStr = "[" for opt in options: txt = opt.replace("'", "\\'") # optionsStr = optionsStr + "'" + opt.replace("'", "\\'") + "'," optionsStr = optionsStr + "'" + txt + "'," optionsStr = optionsStr + "]" # construct the resource string. dlgRSRC = "{'type':'CustomDialog','name':'dlgChooser'," + \ " 'title':'" + title + "','position':(100,50),'size':(445, 330),\n\n'components': [" dlgRSRC = dlgRSRC + " {'type':'StaticText', 'name':'labelCaption', 'position':(10,10)," + \ "'text':'" + caption.replace("'", "\\'") + "'}," dlgRSRC = dlgRSRC + " {'type':'List', 'name':'options', 'position':(10,30),'size':(415,200)," + \ "'items':" + optionsStr + ",'stringSelection':'" + defOption.replace("'", "\\'") + "'}," dlgRSRC = dlgRSRC + \ "{'type':'Button', 'name':'btnOK', 'position':(10, 260), " + \ "'label':'OK', 'id':5100, 'default':1, 'toolTip':'Update Preferences'}," + \ "{'type':'Button', 'name':'btnCancel', 'position':(110, 260)," + \ "'label':'Cancel', 'id':5101, 'toolTip':'Discard Preferences Changes' } " + \ " ] } " # eval the resource string, pass it to Resource() and return it. return resource.Resource( eval(dlgRSRC) ) # these shouldn't be necessary ... (see textEditor.pyw) def on_btnOK_mouseClick(self, event): event.skip() def on_btnCancel_mouseClick(self, event): event.skip() ## ===================== ## ## Preferences Class ## ## ===================== ## # This is used to create all the Preference settings windows at run time. The dialog # is generated on the fly at run time and its contents depends on an array, preferences, # which is passed to the class at initialization class PreferencesDialog(CustomDialog): """Produces the main preferences custom dialog where user can enter generic settings.""" def __init__(self, aBg, title = "", preferences = []) : """Initialize the defaults for the input boxes""" # build the resource which describes this particular preferences window self.prefs = preferences aDialogRsrc = self.buildPrefsResource(title, preferences) CustomDialog.__init__(self, aBg, aDialogRsrc) self.values = {} self.parent = aBg def on_printHelpString_command(self, event): itemName = event.target._name[3:] for pref in self.prefs: if itemName == pref[0]: helpText = wrap_string(pref[2], 70) result = dialog.messageDialog(self, helpText, \ "Settings Help", wx.ICON_INFORMATION | wx.OK) def buildPrefsResource(self, title, preferences): """This builds a string containing a resource description as you find in a .rsrc files""" location = 15 height = 80 prefsResString = "" # dynamically build each of the preference choices. for preference in preferences: escapedDefaultPref = preference[3] if preference[4] != 2 and preference[4] != 6 and preference[4] != 7: escapedDefaultPref = escapedDefaultPref.replace("'", "\\'") prefsResString = prefsResString + \ "{'type':'StaticText', 'name':'lab" + preference[0] + "', " + \ "'position':(45, %d), " % (location) + \ "'text':'" + preference[1].replace("'", "\\'") + "'}," + \ "{'type':'Button', 'name':'btn" + preference[0] + "', " + \ "'position':(15, %d), 'size':(18,-1)," % (location-3) + \ "'label':'?','command':'printHelpString'}," # prefernce needs a text box for normal string. if preference[4] == 1: # 1 prefsResString = prefsResString + \ "{'type':'TextField', 'name':'" + preference[0] + "', " + \ "'size':(200,-1), 'position':(220, %d), " % (location-3) + \ "'text':'" + escapedDefaultPref + "'}," # text box, but for a number elif preference[4] == 2 or preference[4] == 6: # was 4 prefsResString = prefsResString + \ "{'type':'TextField', 'name':'" + preference[0] + "', " + \ "'size':(200,-1), 'position':(220, %d), " % (location-3) + \ "'text':'%s'}," % escapedDefaultPref # password field elif preference[4] == 3: # 3 prefsResString = prefsResString + \ "{'type':'PasswordField', 'name':'" + preference[0] + "', " + \ "'size':(200,-1), 'position':(220, %d), " % (location-3) + \ "'text':'" + preference[3] + "'}," # "Yes"/"No" choice box elif preference[4] == 4: # was 2 - I changed the order so it made more sense. prefsResString = prefsResString + \ "{'type':'Choice', 'name':'" + preference[0] + "', " + \ "'size':(80,-1), 'position':(220, %d), " % (location-3) + \ "'items':['Yes','No'],'stringSelection':'" + escapedDefaultPref + "'}," # Custom choice box elif preference[4] == 5: # prefsResString = prefsResString + \ "{'type':'Choice', 'name':'" + preference[0] + "', " + \ "'size':(80,-1), 'position':(220, %d), " % (location-3) + \ "'items':[" for item in preference[5]: prefsResString = prefsResString + "'%s'," % item prefsResString = prefsResString + "], 'stringSelection':'" + escapedDefaultPref + "'}," # Font preference elif preference[4] == 7: prefsResString = prefsResString + \ "{'type':'Button', 'name':'" + preference[0] + "', " + \ "'size':(60,-1), 'label':'Choose','position':(220, %d), " % (location-3) + \ "'command':'fontChoose'}," location = location + 35 height = height + 35 # construct the resource string. dlgRSRC = "{'type':'CustomDialog','name':'dlgPrefs'," + \ " 'title':'" + title + "','position':(100,50),'size':(440, %d),\n\n'components': [" % height dlgRSRC = dlgRSRC + prefsResString dlgRSRC = dlgRSRC + \ "{'type':'Button', 'name':'btnOK', 'position':(15, %d), " % (height - 55) + \ "'label':'OK', 'id':5100, 'default':1, 'toolTip':'Update Preferences'}," + \ "{'type':'Button', 'name':'btnCancel', 'position':(115, %d)," % (height - 55) + \ "'label':'Cancel', 'id':5101, 'toolTip':'Discard Preferences Changes' } " + \ " ] } " # eval the resource string, pass it to Resource() and return it. return resource.Resource( eval(dlgRSRC) ) def on_fontChoose_command(self, event): pp = pprint.PrettyPrinter(indent=4) result = dialog.fontDialog(self) if result.accepted: self.values[event.target._name] = pp.pformat(result.font).replace("\n", "") # these shouldn't be necessary ... (see textEditor.pyw) def on_btnOK_mouseClick(self, event): event.skip() def on_btnCancel_mouseClick(self, event): event.skip() PythonCard-0.8.2/samples/textRouter/docs/0000755000076500007650000000000010434046772020302 5ustar alexalex00000000000000PythonCard-0.8.2/samples/textRouter/docs/how_to_build.txt0000644000076500007650000000034610035337427023521 0ustar alexalex00000000000000Building a Windows EXE using 'py2exe'. All you have to do, once everything is installed, is just type: c:\path\to\tr> python setup.py py2exe -w --icon tr.ico --excludes=Image -O1 in the PythonCard/samples/textRouter directory. PythonCard-0.8.2/samples/textRouter/docs/readme.html0000644000076500007650000002016107400701753022421 0ustar alexalex00000000000000 TextRouter README

TextRouter README

What is it ?

 TextRouter is a generic weblogging and text "routing" client. It's main use is for posting to Blogger and/or Manila maintained weblogs. It is designed to be the sort of app which is kept running the whole time; the idea being that if you find a piece of text you'd like to send somewhere, you can simply copy and paste it into TextRouter and send it on its way.

 Some screen shots are available at: http://simon.kittle.info/stories/storyReader$116

 There is now a textRouter mailing list which you are welcome to post questions, comments, bugs, feature requests, etc, to. It is at : http://groups.yahoo.com/group/textrouter.

Features

 The aim of TextRouter is to be as convinient as possible. Features that exist to help make TextRouter reach this goal include:

 1. Posting to Blogger and Manila.

 2. Multiple Blogger and multiple Manila accounts supported.

 3. Blogger support includes: new/edit/delete posts and upload/downloading of templates.

 4. Automatic weblogs.com "pinging" for Blogger accounts. (Manila has support for this buil in)

 5. Manila support includes: homepage flip/add/get/set, stories new/edit, uploading of pictures and uploading of OPML files direct to the homepage.

 6. Input/Output "modes" which allow you to select what portion of text the next operation (loading/saving/blogging/cutting/pasting) works on.

 7. Common editing functionality; make bold/italic, center, inserting hyperlink, stripping HTML, formatting paragraphs.

 8. Drag + Drop for URL's; turning them automatically in to links.

 9. Shortcuts (Manila style, implemented locally for Blogger)

 10. Proxy support. (This is a little experimental at the moment, but should work.)

 Things that are planned:

 1. Movable Type support. (Once the XML-RPC interface is done)

 2. LiveJournal support.

 3. Support for more Manila specific features.

 4. Routing to RSS Files on the local disk

Blogger

 Blogger (http://www.blogger.com) is a free service which allows a user to easily maintain a weblog on their website. When you update your weblog (either via a web based form or a client like this one) Blogger takes care of updating all the HTML, archiving old posts, and FTP'ing the data to your website.

Manila

 Manila (http://manila.userland.com) is a Content Management System from Userland Software, Inc. While Manila can manage whole websites, it has a number of specific features for maintaining weblog type sites. There is a list of companies that provide Manila hosting at: http://www.edithere.com/directory/22/websiteHostingServices/manila.

Requirements

 TextRouter is written using the PythonCard framework (http://pythoncard.sourceforge.net), if you want to run it on *nix systems you will need to download PythonCard. (There is an exe package for Windows which is self-contained.)

 PythonCard requires version 2.0 or higher of Python and wxPython 2.3.x (http://www.wxpython.org). As soon as 2.3.2 is available, that will probably be the minimum wxPython requirement.

 The only other requirement is the Python XML-RPC library from PythonWare (http://www.pythonware.com/products/xmlrpc/).

 Note that you need the latest development version of the XML-RPC library, the 0.9.8 stable version is not good enough. (In 0.9.9 the Transport() classes were all changed, which made proxy stuff easier to do, but is also incompatible with earlier Transport() classes).

Downloading

 NOTE: This software is released under the Python License, it comes with no warranty, etc, etc. See http://www.python.org/2.2/license.html for details.

 If you are on Windows by far the simplest and quickest way to get TextRouter is to download this zip package: http://www.tswoam.co.uk/files/textrouter/textrouter-0.58.zip. This is self contained and so has everything you ened to run TextRouter including the documentation.

 If you are on a Linux/Unix system, or if you are on Windows but want to run the very latest version, then you need to first get Python 2.x and wxPython 2.3.x. Once these are working then you just need to download PythonCard. For this go to the PythonCard homepage and either download a ZIP'ed release of PythonCard, or get the very latest version from anonymous CVS. (Instructions for CVS are on the SourceForge site)

 Note: If you are running it from the source code, you will need version 2.3.2b7 of wxPython to use the drag + drop URL functionality.

Details

 Last Updated: {lastUpdateString}

 Contact: simon@kittle.co.uk

 Latest info: http://simon.kittle.info/textrouter

 Mailing List: http://groups.yahoo.com/group/textrouter



Comments to Simon Kittle.    Last Updated: Tue, 27 Nov 2001 11:15:21 GMT
OPML Version PythonCard-0.8.2/samples/textRouter/docs/textRouter_help.html0000644000076500007650000002614107400701753024365 0ustar alexalex00000000000000 TextRouter Help

TextRouter Help

Intro

 TextRouter is a weblogging client that you run on your desktop; it is used to interact with Content Management Systems such as Blogger and Manila. This document explains each part of the app; what it is for and how it works. For more info on the concept of TextRouter see the 'readme.txt' file.

The Main TextRouter Window

 At the top of the main TextRouter window is a one-line high text field; this text box is for entering the subject of email's, and the title/subject of any Manila stories which you edit. Below this is a large text area (known as the "buffer"), two buttons, and two radio-groups. The buffer is where you type in text you want to "route" (send) to Blogger, Manila, etc. The two buttons - "Clear It" and "Get Clipboard Text" - do exactly what you'd expect, they clear the buffer and place text from the clipboard in to the buffer respectively. They exist purely for convenience - convenience is what this app is about.

 The two radio-groups are for specifying the current Input and Output mode. These are explained below.

Input/Output Modes

 If the behaviour of TextRouter seems quirky it is probably due to the "Input Action" and/or the "Output Action" radio-groups at the bottom of the display.

 The "Input Action" radio-group lets you specify how input operations are handled. An input operation is any operation which results in text coming in to TextRouter; this includes pasting text, reading in files, getting previous Blogger posts and getting the current Manila homepage.

 If the "Input Action" is set to "inserts" things will probably behave as you would expect; incoming text will be inserted at the current cursor position. If a chunk of text is selected, this text will be replaced with the incoming text. This is the default mode.

 The the "Input Action" is set to "appends" then incoming text will always be appended to the end of the buffer, even if there is an existing selection. If "Input Action" is set to "replaces" then the incoming text will replace completey what text there was in the buffer, even if it wasn't selected.

 The "Output Action" radio-group is more simple, it lets you specify what text is "routed" when you send/process text. So if you have three paragraphs of text in the buffer, but you only want to blog one to your Manila/Blogger website, you can just select that paragraph, check "selection", and blog away. If "all" is selected, then all the text in the buffer will be output.

 It's worth noting that the Input/Output modes also apply to internal operations. So if you want to strip the HTML from only one paragraph, you can simply set the output mode to "selection", set the input mode to "inserts" and hit "Strip HTML". This will replace the selected paragraph with a HTML free version of the same text.

The Main Preferences

 The main textRouter preferences, accessible from the 'File -> Preferences' menu, holds settings such as auto save config, paragraph width, number of undo levels, and your proxy settings. All of the preferences here (and in all Preferences windows) have little "?" buttons, which when clicked will display some pop-up help for that specific preference.

 The only thing to note regarding these preferences, is that if you change the proxy settings, you will need to restart TextRouter for the changes to take effect.

The "Route Text To" Menu

 The "Route To" menu is how you quickly route text to some place, Blogger, Manila, an email address, etc. All the items on the menu have quick key combinations to make things faster for these common functions.

 The "Blogger" menu item simply takes the current output text (either all of the buffer, or just the selection, depending on the mode) and blogs it to the currently active blog. The "Manila" menu item by default does the equivalent thing, it add's the output text to the homepage. However, it is possible to alter what this menu item does depending on how you work. You can either have it ADD text to the Manila homepage, you can have this menu item SET the current text as the homepage (overwriting what was there), or you can use the OPML setting which means 'Route To Manila' will upload the OPML document (outline file) associated with your Manila account direct to the Manila server.

 The "Email" menu items let you send the output text to an email address, either a predefined one (think mailing lists) or one you enter there and then. The "RSS File" menu item is not currently implemented but will eventually route the text to an RSS file on the local disk.

The Manila Menu

 The Manila Menu is where you define and setup your Manila accounts. Most items are fairly straight forward. The preferences allow you to setup things like auto-logging in, etc, the "Accounts" menu items allow you to define your accounts. The "Jump To URL" menu lets you fire up a browser with your Manila homepage or one of your statistics page in it.

 The "Get Homepage" item will download the current homepage, and "Flip Homepage" lets you flip the homepage performing exactly the same operation as the browser based "Flip Homepage" button. Two other menu items - "Add To Homepage" and "Set As Homepage" - are available from this menu, but it is envisaged that you will assign one of these functions to the "Route To Manila" menu item and use it from there (where it has a quick key combination).

 The "Set Homepage From OPML" menu item uploads a specified OPML file direct to the Manila server. The OPML file (outline file) is specified in the Manila accounts setup section. It always uses the same file for convinience.

 The "Story" menu items let you download, edit, and then upload stories from and to the Manila server. The "Upload Picture" menu item is also fairly self explanatory.

 The "Set Story as Homepage" menu item will set the contents of the current homepage (the content listed under today's date) to be that of the story you choose. Note:, this doesn't automatically Flip The Homepage, so you'll need to make sure you do this manaually if required.

The Blogger Menu

 The Blogger menu is the Blogger equivalent of the Manila menu. It allows you to define your Blogger accounts and preferences, choose your active blog, get the list of previous posts, start editing a previous post and delete previous posts. You can also get and set the Blogger HTML templates from here too, this is especailly useful for downloading the template and then firing up an external HTML editor (Emacs :) to edit it with.

 The 'Fetch Previous Posts' menu item is available so you can force textRouter to refresh it's cache of old posts. If you want to edit an old post, you can either 'Insert Previous Post..' (which will automatically download the last 10 posts, if they haven't already been downloaded) or you can use 'Get Post by ID', using the later, you will need to know the numeric ID of the post. At the moment, these ID's are not logged to a text file, so you'll have to look them up manaully, but this will be changed soon.

 Once your editing a post though, you simply use 'Update Post' to save the changes to the server.

The Email Menu

 This is where you define your email settings and any predefined email addresses you'd like to use.

The Utilities Menu

 This menu provides a few utility functions. They are not particularly polished functions yet, but may still be useful. External editor fires up an external editor loaded up with a temporary file which contains the contents of the current buffer. Text Auto-Scroller brings up a window which allows you to have the current text of the buffer auto-scrolled for you, so there is no need to use scroll bars to read down a long page.

 The third option on this menu applies a "filter". Filters allow you to define a program which accepts a standard input stream and which outputs a standard output steam, i.e, a pipe. The current output text (the selection or all, depending, as always, on the current output mode) is feed in to the pipe and the output from the pipe is feed back in to the buffer.

 The "New Shortcut" and "Remove Shortcut" items simply define shortcuts which you can use in your text. A shortcut is simply a small piece of text you type in quotes which is then expanded to it's full version when the text is sent to Blogger. You can use shortcuts to define short names for URL's, for links, or for any lengthy piece of text you type often.

 The shortcuts file is automatically loaded at startup, if it exists, and by default it is automatically saved at shutdown. In future, there may be functionality to automatically merge two shortcut files, etc.



Comments to Simon Kittle.    Last Updated: Tue, 27 Nov 2001 11:24:19 GMT
OPML Version PythonCard-0.8.2/samples/textRouter/docs/textRouter_help.txt0000644000076500007650000002166607400701753024247 0ustar alexalex00000000000000 TextRouter Help =============== Intro ===== TextRouter is a weblogging client that you run on your desktop; it is used to interact with Content Management Systems such as Blogger and Manila. This document explains each part of the app; what it is for and how it works. For more info on the concept of TextRouter see the 'readme.txt' file. The Main TextRouter Window ========================== At the top of the main TextRouter window is a one-line high text field; this text box is for entering the subject of email's, and the title/subject of any Manila stories which you edit. Below this is a large text area (known as the "buffer"), two buttons, and two radio-groups. The buffer is where you type in text you want to "route" (send) to Blogger, Manila, etc. The two buttons - "Clear It" and "Get Clipboard Text" - do exactly what you'd expect, they clear the buffer and place text from the clipboard in to the buffer respectively. They exist purely for convenience - convenience is what this app is about. The two radio-groups are for specifying the current Input and Output mode. These are explained below. Input/Output Modes ================== If the behaviour of TextRouter seems quirky it is probably due to the "Input Action" and/or the "Output Action" radio-groups at the bottom of the display. The "Input Action" radio-group lets you specify how input operations are handled. An input operation is any operation which results in text coming in to TextRouter; this includes pasting text, reading in files, getting previous Blogger posts and getting the current Manila homepage. If the "Input Action" is set to "inserts" things will probably behave as you would expect; incoming text will be inserted at the current cursor position. If a chunk of text is selected, this text will be replaced with the incoming text. This is the default mode. The the "Input Action" is set to "appends" then incoming text will always be appended to the end of the buffer, even if there is an existing selection. If "Input Action" is set to "replaces" then the incoming text will replace completey what text there was in the buffer, even if it wasn't selected. The "Output Action" radio-group is more simple, it lets you specify what text is "routed" when you send/process text. So if you have three paragraphs of text in the buffer, but you only want to blog one to your Manila/Blogger website, you can just select that paragraph, check "selection", and blog away. If "all" is selected, then all the text in the buffer will be output. It's worth noting that the Input/Output modes also apply to internal operations. So if you want to strip the HTML from only one paragraph, you can simply set the output mode to "selection", set the input mode to "inserts" and hit "Strip HTML". This will replace the selected paragraph with a HTML free version of the same text. The Main Preferences ==================== The main textRouter preferences, accessible from the 'File -> Preferences' menu, holds settings such as auto save config, paragraph width, number of undo levels, and your proxy settings. All of the preferences here (and in all Preferences windows) have little "?" buttons, which when clicked will display some pop-up help for that specific preference. The only thing to note regarding these preferences, is that if you change the proxy settings, you will need to restart TextRouter for the changes to take effect. The "Route Text To" Menu ======================== The "Route To" menu is how you quickly route text to some place, Blogger, Manila, an email address, etc. All the items on the menu have quick key combinations to make things faster for these common functions. The "Blogger" menu item simply takes the current output text (either all of the buffer, or just the selection, depending on the mode) and blogs it to the currently active blog. The "Manila" menu item by default does the equivalent thing, it add's the output text to the homepage. However, it is possible to alter what this menu item does depending on how you work. You can either have it ADD text to the Manila homepage, you can have this menu item SET the current text as the homepage (overwriting what was there), or you can use the OPML setting which means 'Route To Manila' will upload the OPML document (outline file) associated with your Manila account direct to the Manila server. The "Email" menu items let you send the output text to an email address, either a predefined one (think mailing lists) or one you enter there and then. The "RSS File" menu item is not currently implemented but will eventually route the text to an RSS file on the local disk. The Manila Menu =============== The Manila Menu is where you define and setup your Manila accounts. Most items are fairly straight forward. The preferences allow you to setup things like auto-logging in, etc, the "Accounts" menu items allow you to define your accounts. The "Jump To URL" menu lets you fire up a browser with your Manila homepage or one of your statistics page in it. The "Get Homepage" item will download the current homepage, and "Flip Homepage" lets you flip the homepage performing exactly the same operation as the browser based "Flip Homepage" button. Two other menu items - "Add To Homepage" and "Set As Homepage" - are available from this menu, but it is envisaged that you will assign one of these functions to the "Route To Manila" menu item and use it from there (where it has a quick key combination). The "Set Homepage From OPML" menu item uploads a specified OPML file direct to the Manila server. The OPML file (outline file) is specified in the Manila accounts setup section. It always uses the same file for convinience. The "Story" menu items let you download, edit, and then upload stories from and to the Manila server. The "Upload Picture" menu item is also fairly self explanatory. The "Set Story as Homepage" menu item will set the contents of the current homepage (the content listed under today's date) to be that of the story you choose. Note:, this doesn't automatically Flip The Homepage, so you'll need to make sure you do this manaually if required. The Blogger Menu ================ The Blogger menu is the Blogger equivalent of the Manila menu. It allows you to define your Blogger accounts and preferences, choose your active blog, get the list of previous posts, start editing a previous post and delete previous posts. You can also get and set the Blogger HTML templates from here too, this is especailly useful for downloading the template and then firing up an external HTML editor (Emacs :) to edit it with. The 'Fetch Previous Posts' menu item is available so you can force textRouter to refresh it's cache of old posts. If you want to edit an old post, you can either 'Insert Previous Post..' (which will automatically download the last 10 posts, if they haven't already been downloaded) or you can use 'Get Post by ID', using the later, you will need to know the numeric ID of the post. At the moment, these ID's are not logged to a text file, so you'll have to look them up manaully, but this will be changed soon. Once your editing a post though, you simply use 'Update Post' to save the changes to the server. The Email Menu ============== This is where you define your email settings and any predefined email addresses you'd like to use. The Utilities Menu ================== This menu provides a few utility functions. They are not particularly polished functions yet, but may still be useful. External editor fires up an external editor loaded up with a temporary file which contains the contents of the current buffer. Text Auto-Scroller brings up a window which allows you to have the current text of the buffer auto-scrolled for you, so there is no need to use scroll bars to read down a long page. The third option on this menu applies a "filter". Filters allow you to define a program which accepts a standard input stream and which outputs a standard output steam, i.e, a pipe. The current output text (the selection or all, depending, as always, on the current output mode) is feed in to the pipe and the output from the pipe is feed back in to the buffer. The "New Shortcut" and "Remove Shortcut" items simply define shortcuts which you can use in your text. A shortcut is simply a small piece of text you type in quotes which is then expanded to it's full version when the text is sent to Blogger. You can use shortcuts to define short names for URL's, for links, or for any lengthy piece of text you type often. The shortcuts file is automatically loaded at startup, if it exists, and by default it is automatically saved at shutdown. In future, there may be functionality to automatically merge two shortcut files, etc. PythonCard-0.8.2/samples/textRouter/manilaaccount.py0000644000076500007650000004654310107721630022544 0ustar alexalex00000000000000from PythonCard import dialog import xmlrpclib #from socket import gaierror import wx import time from trTransport import trURLlibTransport """ __version__ = "$Revision: 1.23 $" __date__ = "$Date: 2004/08/15 17:55:36 $" """ ## ===================== ## ## Manila Account Class ## ## ===================== ## # Encapsualtes the functionality we need for Manila accounts. class ManilaAccount: "Encapsulate one manila site settings and access info" def __init__(self, proxy=""): self.prefs = {"username" : "", "password" : "", "siteurl" : "", "rpcserver" : "", "weblogOPML" : ""} self.settings = {} self.loggedIn = 0 self.msgs = [] self.currentHPMsgNum = -1 self.currentHPContent = {'subject':''} self.storiesList = {} self.stories = {} self.currentStory = -1 self.sessionPassword = "" # used to store the password when the user # doesn't want it saved to a config file. self.lastErrorMessage = "" self.errorOccured = 0 self.proxy = proxy def createManilaSite(self): """Set's up the xmlrpclib site object.""" self.manilaSite = xmlrpclib.Server(self.prefs["rpcserver"], \ transport=trURLlibTransport(self.proxy)) def setProxy(self, proxy): """Set's the proxy.""" self.proxy = proxy def manilaLogin(self): """Logs in to a Manila server. Returns 1 on success, 0 on failure.""" if (not self.checkSetupOK(1)): return 0 if self.getPassword() == "": result = dialog.textEntryDialog(None, \ 'Please enter your Manila password (It will not be saved to the config): ', "Password entry...", '', wx.TE_PASSWORD) if not result.accepted: self.setErrorMessage("You must enter a password to continue.") return 0 self.sessionPassword = result.text if not self.getLoggedIn(): try: self.createManilaSite() self.settings["sitename"] = self.manilaSite.manila.getSiteName(self.prefs["siteurl"]) self.storiesList = self.manilaSite.manila.message.listStories(self.prefs["username"], \ self.getPassword(), \ self.settings["sitename"]) self.setLoggedIn(1) except xmlrpclib.Fault, e: self.sessionPassword = "" self.setErrorMessage("Error logging in: %s" % e.faultString) return 0 else: self.setErrorMessage("Already logged in.") return 0 return 1 def manilaGetStoryList(self): """Gets the latest story list from the server.""" if (not self.checkSetupOK()): return try: self.storiesList = self.manilaSite.manila.message.listStories(self.prefs["username"], \ self.getPassword(), \ self.settings["sitename"]) #print self.storiesList self.setErrorMessage("") except xmlrpclib.Fault, e: self.setErrorMessage("Error getting story list: %s" % e.faultString) def manilaCreateMsg(self, subject, body, bodyType): """Creates a message.""" if (not self.checkSetupOK()): return 0 try: boolTrue = xmlrpclib.Boolean(1) renderInfo = { "name" : "pikeRenderer", "flRenderOnEntry" : boolTrue } msg = self.manilaSite.manila.message.create(self.prefs["username"], \ self.getPassword(), \ self.settings["sitename"], subject, body, bodyType, 0, 0, renderInfo) self.setErrorMessage("") except xmlrpclib.Fault, e: self.setErrorMessage("Error creating message: %s" % e.faultString) return 0 return msg def manilaAttachPicture(self, msgNum, pictureFilename, mimeType): """Reads in an image from a file, and attaches it to the specified message.""" if (not self.checkSetupOK()): return 0 try: file = open(pictureFilename, "rb") picData = file.read() file.close() except IOError, e: self.status("Couldn't open image file '%s'." % pictureFilename) return picture = xmlrpclib.Binary(picData) try: boolTrue = xmlrpclib.Boolean(1) self.manilaSite.manila.message.attachPicture(self.prefs["username"], \ self.getPassword(), \ self.settings["sitename"], \ msgNum, \ mimeType, \ picture ) self.manilaSite.manila.message.addToPicturesList(self.prefs["username"], \ self.getPassword(), \ self.settings["sitename"], \ msgNum,) self.setErrorMessage("") except xmlrpclib.Fault, e: self.setErrorMessage("Error attaching picture to message: %s" % e.faultString) def manilaAddToStoriesList(self, msg): """Add's a message to the story list.""" if (not self.checkSetupOK()): return 0 try: msgNum = msg["msgnum"] self.manilaSite.manila.message.addToStoriesList(self.prefs["username"], \ self.getPassword(), \ self.settings["sitename"], msgNum) self.storiesList[msgNum] = [ msg["subject"], msg["member"] ] self.setErrorMessage("") except xmlrpclib.Fault, e: self.setErrorMessage("Error adding message to stories list: %s" % e.faultString) def manilaDownloadStory(self, msgNum): """Downloads a story.""" if (not self.checkSetupOK()): return try: self.stories[msgNum] = self.manilaSite.manila.message.get(self.prefs["username"], \ self.getPassword(), \ self.settings["sitename"], msgNum) #print self.stories[msgNum] self.setErrorMessage("") except xmlrpclib.Fault, e: self.setErrorMessage("Error downloading story: %s" % e.faultString) return return self.stories[msgNum] def manilaUploadStory(self, msgNum, subject, body, bodyType): """Uploads a story.""" if (not self.checkSetupOK()): return try: boolTrue = xmlrpclib.Boolean(1) self.manilaSite.manila.message.set(self.prefs["username"], \ self.getPassword(), \ self.settings["sitename"], \ msgNum, \ subject, \ body, \ bodyType, \ 0, {'name' : 'pikeRenderer', 'flRenderOnEntry' : boolTrue} ) self.setErrorMessage("") except xmlrpclib.Fault, e: self.setErrorMessage("Error uploading story: %s" % e.faultString) def manilaFlipHomepage(self): """Flips the homepage of the Manila server.""" if (not self.checkSetupOK()): return try: self.manilaSite.manila.homepage.flip(self.prefs["username"], \ self.getPassword(), \ self.settings["sitename"]) self.setErrorMessage("") except xmlrpclib.Fault, e: self.setErrorMessage("Error flipping homepage: %s" % e.faultString) def manilaAddTextToHP(self, text): """Adds given text to the homepage of the Manila server.""" if (not self.checkSetupOK()): return 0 if text == "": self.setErrorMessage("Text to blog can't be blank. (You may want to check the output mode.)") return if self.prefs["usePostedLine"] == "Yes": text = text + "
" + time.strftime(self.prefs["postedLine"], time.localtime()) try: self.manilaSite.manila.homepage.addToHomepage(self.prefs["username"], \ self.getPassword(), \ self.prefs["siteurl"], \ text.replace("\n\n", "\n\n

")) self.setErrorMessage("") except xmlrpclib.Fault, e: self.setErrorMessage("Error adding text to homepage: %s" % e.faultString) return 0 return 1 def manilaGetHP(self): """Gets the current text of the homepage.""" if (not self.checkSetupOK()): return 0 try: self.currentHPMsgNum = self.manilaSite.manila.homepage.getMsgNum(self.prefs["username"], \ self.getPassword(), \ self.settings["sitename"]) self.currentHPContent = self.manilaSite.manila.message.get(self.prefs["username"], \ self.getPassword(), \ self.settings["sitename"], \ self.currentHPMsgNum) self.setErrorMessage("") except xmlrpclib.Fault, e: self.setErrorMessage("Error getting current Manila homepage: %s" % e.faultString) return 0 return 1 def manilaSetHP(self, text, autoRender="Yes"): """Sets the Manila homepage to be the current text.""" boolTrue = xmlrpclib.Boolean(1) if (not self.checkSetupOK()): return 0 if text == "": self.setErrorMessage("Text to blog can't be blank. (You may want to check the output mode.)") return try: self.currentHPMsgNum = self.manilaSite.manila.homepage.getMsgNum(self.prefs["username"], \ self.getPassword(), \ self.settings["sitename"]) except xmlrpclib.Fault, e: self.setErrorMessage("Error getting current homepage message number: %s" % e.faultString) return 0 defRendererInfo = { 'flRenderOnEntry' : boolTrue, 'name' : 'pikeRenderer' } defWindowInfo ={'height' : 100, 'width' : 100, 'top' : 10, 'left' : 10, 'right' : 110, 'bottom' : 110,\ 'scrollLine' : 1, 'expansionState' : 1} defBodyType = "text/x-outline-tabbed" #print self.currentHPContent if ("msgnum" in self.currentHPContent) and (self.currentHPMsgNum == self.currentHPContent["msgnum"]): subject = ("subject" in self.currentHPContent) and \ self.currentHPContent["subject"] bodyType = ("bodyType" in self.currentHPContent) and \ self.currentHPContent["bodyType"] or defBodyType windowInfo = ("windowInfo" in self.currentHPContent) and \ self.currentHPContent["windowInfo"] or defWindowInfo if autoRender == "Yes": rendererInfo = ("rendererInfo" in self.currentHPContent) and \ self.currentHPContent["rendererInfo"] or defRendererInfo else: #print "no" # we were gonna sort out a renderer that doesn't insert "
"'s here, but one could not # be found. it needs investigating futher. rendererInfo = defRendererInfo else: subject = "" bodyType = defBodyType windowInfo = defWindowInfo if autoRender == "Yes": rendererInfo = defRendererInfo else: #print "no" rendererInfo = defRendererInfo #print subject #print bodyType #print windowInfo #print rendererInfo try: self.manilaSite.manila.message.set(self.prefs["username"], \ self.getPassword(), \ self.settings["sitename"], \ self.currentHPMsgNum, \ subject, \ text, \ bodyType,\ windowInfo,\ rendererInfo) self.setErrorMessage("") except xmlrpclib.Fault, e: self.setErrorMessage("Error setting current Manila homepage: %s" % e.faultString) return 0 return 1 def manilaSetHomepageFromMSG(self, msgNum): """Set's the homepage from the given message number.""" if (not self.checkSetupOK()): return try: self.manilaSite.manila.homepage.setMsgNum(self.prefs["username"], \ self.getPassword(), \ self.settings["sitename"], \ msgNum) self.setErrorMessage("") except xmlrpclib.Fault, e: self.setErrorMessage("Error setting homepage from story: %s" % e.faultString) def manilaSetHPFromOutline(self, filename): """Sets the Manila homepage from an OPML file.""" boolTrue = xmlrpclib.Boolean(1) if (not self.checkSetupOK()): return 0 try: file = open(filename, "r") opmlDoc = file.read() #print opmlDoc file.close() except IOError, e: self.setErrorMessage("Couldn't open file '%s' for sending to Manila server." % filename) return try: self.currentHPMsgNum = self.manilaSite.manila.homepage.getMsgNum(self.prefs["username"], \ self.getPassword(), \ self.settings["sitename"]) except xmlrpclib.Fault, e: self.setErrorMessage("Error getting current homepage message number: %s" % e.faultString) return 0 rendererInfo = { 'flRenderOnEntry' : boolTrue, 'name' : 'pikeRenderer' } bodyType = "text/x-opml" try: self.manilaSite.manila.message.set(self.prefs["username"], \ self.getPassword(), \ self.settings["sitename"], \ self.currentHPMsgNum, \ "Weblog", \ opmlDoc, \ bodyType,\ {}, rendererInfo) self.setErrorMessage("") except xmlrpclib.Fault, e: self.setErrorMessage("Error setting Manila homepage: %s" % e.faultString) return 0 return 1 def setPrefs(self, siteurl="", rpcserver="", username="", password="", \ weblogOPML="", usePostedLine="No", postedLine="" ): """Sets the user specific settings from the arguments""" self.prefs["siteurl"] = siteurl self.prefs["rpcserver"] = rpcserver self.prefs["username"] = username self.prefs["password"] = password self.prefs["weblogOPML"] = weblogOPML self.prefs["usePostedLine"] = usePostedLine self.prefs["postedLine"] = postedLine def checkSetupOK(self, toCheck = 0): """Checks that the setup is OK for contacting a server. Accepts an integer arguement, each bit specifies corresponds to one check, if the bit is one the check is done. If the argument is 0, all checks are done. Returns 1 if the checks are passed, 0 if one fails.""" if toCheck == 0 or toCheck & 1: if self.prefs['username'] == "" or \ self.prefs['rpcserver'] == "" or self.prefs['siteurl'] == "": self.setErrorMessage("You must setup the Manila server details first.") return 0 if toCheck == 0 or toCheck & 2: if self.getLoggedIn() == 0: self.setErrorMessage("You must login first.") return 0 if toCheck & 4: if self.currentHPMsgNum == -1: self.setErrorMessage("You must download the current homepage before you can set it.") return 0 self.setErrorMessage("") return 1 def getPassword(self): """Returns the password, if one is set in the config that is returned, else the session password is checked""" if self.prefs["password"] != "": return self.prefs["password"] return self.sessionPassword def setLoggedIn(self, loggedIn): """Sets the state of the 'logged-in-ness'""" self.loggedIn = loggedIn def getLoggedIn(self): """Returns the state of the 'logged-in-ness'""" return self.loggedIn def setErrorMessage(self, msg): """Sets the last error message variable and the 'errorOccured' flag""" self.lastErrorMessage = msg if self.lastErrorMessage != "": self.errorOccured = 1 else: self.errorOccured = 0 def getErrorMessage(self): """Returns a string describing the last error to occur.""" return self.lastErrorMessage def anErrorOccured(self): """Returns 0 if last operation was a success, 1 if last operation failed.""" return (self.errorOccured) PythonCard-0.8.2/samples/textRouter/readme.txt0000644000076500007650000001167707465660601021367 0ustar alexalex00000000000000 TextRouter README ================= What is it ? ============ TextRouter is a generic weblogging and text "routing" client. It's main use is for posting to Blogger and/or Manila maintained weblogs. It is designed to be the sort of app which is kept running the whole time; the idea being that if you find a piece of text you'd like to send somewhere, you can simply copy and paste it into TextRouter and send it on its way. Some screen shots are available at: http://simon.kittle.info/stories/storyReader$116 There is now a textRouter mailing list which you are welcome to post questions, comments, bugs, feature requests, etc, to. It is at : http://groups.yahoo.com/group/textrouter. Features ======== The aim of TextRouter is to be as convinient as possible. Features that exist to help make TextRouter reach this goal include: 1 Posting to Blogger and Manila. 2 Multiple Blogger and multiple Manila accounts supported. 3 Blogger support includes: new/edit/delete posts and upload/downloading of templates. 4 Automatic weblogs.com "pinging" for Blogger accounts. (Manila has support for this buil in) 5 Manila support includes: homepage flip/add/get/set, stories new/edit, uploading of pictures and uploading of OPML files direct to the homepage. 6 Input/Output "modes" which allow you to select what portion of text the next operation (loading/saving/blogging/cutting/pasting) works on. 7 Common editing functionality; make bold/italic, center, inserting hyperlink, stripping HTML, formatting paragraphs. 8 Drag + Drop for URL's; turning them automatically in to links. 9 Shortcuts (Manila style, implemented locally for Blogger) 10 Proxy support. (This is a little experimental at the moment, but should work.) Things that are planned: 1 Movable Type support. (Once the XML-RPC interface is done) 2 LiveJournal support. 3 Support for more Manila specific features. 4 Routing to RSS Files on the local disk Blogger ======= Blogger (http://www.blogger.com) is a free service which allows a user to easily maintain a weblog on their website. When you update your weblog (either via a web based form or a client like this one) Blogger takes care of updating all the HTML, archiving old posts, and FTP'ing the data to your website. Manila ====== Manila (http://manila.userland.com) is a Content Management System from Userland Software, Inc. While Manila can manage whole websites, it has a number of specific features for maintaining weblog type sites. There is a list of companies that provide Manila hosting at: http://www.edithere.com/directory/22/websiteHostingServices/manila. Requirements ============ TextRouter is written using the PythonCard framework (http://pythoncard.sourceforge.net), if you want to run it on *nix systems you will need to download PythonCard. (There is an exe package for Windows which is self-contained.) PythonCard requires version 2.0 or higher of Python and wxPython 2.3.x (http://www.wxpython.org). As soon as 2.3.2 is available, that will probably be the minimum wxPython requirement. The only other requirement is the Python XML-RPC library from PythonWare (http://www.pythonware.com/products/xmlrpc/). Note that you need the latest development version of the XML-RPC library, the 0.9.8 stable version is not good enough. (In 0.9.9 the Transport() classes were all changed, which made proxy stuff easier to do, but is also incompatible with earlier Transport() classes). Downloading =========== NOTE: This software is released under the Python License, it comes with no warranty, etc, etc. See http://www.python.org/2.2/license.html for details. If you are on Windows by far the simplest and quickest way to get TextRouter is to download this zip package: http://www.tswoam.co.uk/files/textrouter/textrouter-0.58.zip. This is self contained and so has everything you ened to run TextRouter including the documentation. If you are on a Linux/Unix system, or if you are on Windows but want to run the very latest version, then you need to first get Python 2.x and wxPython 2.3.x. Once these are working then you just need to download PythonCard. For this go to the PythonCard homepage and either download a ZIP'ed release of PythonCard, or get the very latest version from anonymous CVS. (Instructions for CVS are on the SourceForge site) Note: If you are running it from the source code, you will need version 2.3.2b7 of wxPython to use the drag + drop URL functionality. Note: This will only work with Python2.1 if you download and install the xmlrpc library from http://www.pythonware.com/products/xmlrpc/ Details ======= Last Updated: Tue, 27 Nov 2001 11:15:21 GMT Contact: simon@kittle.co.uk Latest info: http://simon.kittle.info/textrouter Mailing List: http://groups.yahoo.com/group/textrouter PythonCard-0.8.2/samples/textRouter/setup.py0000644000076500007650000000060510047505221021052 0ustar alexalex00000000000000 from distutils.core import setup import py2exe setup( name = "textRouter", console = ["textRouter.py"], data_files = [ ("docs", ["docs/textRouter_help.html", "docs/readme.html"]), (".", ["strings.txt", "readme.txt", "textRouter.rsrc.py", "tr.ico"]) ] ) PythonCard-0.8.2/samples/textRouter/shortcutsSet.py0000644000076500007650000000344007603106520022427 0ustar alexalex00000000000000import re class ShortcutsSet: def __init__(self): self.shortcuts = {} def applyTo(self, text): for shortcut in self.shortcuts.keys(): text = re.sub('(?Wrap Text' function.", "usePxyP" : "Use proxy server?", "usePxyH" : "This specifies whehter you want to use the proxy server specified below.", "pxyServP" : "Proxy server:", "pxyServH" : "The server name of your HTTP proxy server (with out the 'http://').", "pxyPortP" : "Proxy server port:", "pxyPortH" : "The port which the proxy runs on. ", }, # HTML Preferences Prompts + Help Messages "htmlPrefs" : { "bTagP" : "Tag to use for bold ?", "bTagH" : "What tag to use for bold text, you probaby want B, but if your using XHTML you might want STRONG.", "iTagP" : "Tag to use for italic ?", "iTagH" : "What tag to use for italicized text, you probaby want I, but if your using XHTML you might want EM.", "cTagP" : "Tag to use for centering ?", "cTagH" : "What tag scheme you want to use for centernig text, the default is to use

but you may want to just use the
tag.", }, # Manila Preferences Prompts + Help Messages "mnlPrefs" : { "aLogP" : "Auto-login to Manila ?", "aLogH" : "If set, this option will cause TextRouter to automatically login to the Manila account upon startup.", "aGetP" : "Auto-get Manila Homepage ?", "aGetH" : "If set, this option will cause TextRouter to automatically get the current homepage on startup. (Auto-Login to Manila must be set for this to work).", "rToMP" : "Route-To-Manila function:", "rToMH" : "This option configures how the \"Route To->Manila\" menu item works. If it is \"adds\", then the \"Route To->Manila\" menu item will add the text to the current homepage, if it is \"sets\", the text will become the homepage, overwriting whatever was there. If it is \"opml\", then the homepage will be set directly from the defined OPML outline for the account. All actions are always available via the main Manila menu.", "aRndrP" : "Do HTML rendering ?", "aRndrH" : "This controls whether TextRouter tells Manila to push the posted text through the default HTML renderer. All this basiclly does is convert blank lines in to two
tags. You will probably want it on, but you may want to turn it off if your posting already formatted HTML with already existing
", }, # Blogger Preferences Prompts + Help Messages "blgPrefs" : { "aLogP" : "Auto-login to Blogger ?", "aLogH" : "If set, this option will cause TextRouter to automatically login to the Blogger account upon startup.", }, # Email Settings Prompts + Help Messages "emlPrefs" : { "srvNamP" : "SMTP Email server:", "srvNamH" : "This is the address of your email server, e.g, mail.isp.com", "srvPtP" : "SMTP server port:", "srvPtH" : "The port of your ISP's SMTP server, almost always 25.", "nameP" : "Your name:", "nameH" : "This should be your full name, it is used to construct the From: header which will be placed on outgoing emails.", "addrP" : "Email address:", "addrH" : "This should be your email address, it is used to construct the From: header which will be placed on outgoing emails.", }, # Utility Preferences Prompts + Help Messages "utilPrefs" : { "extEdP" : "External editor:", "extEdH" : "This is the external editor to run whe the Utilities->External Editor menu command is selected.", "tsDelP" : "Text Scroller Delay:", "tsDelH" : "This is the delay used between words by the Text Scroller app.", "tsWrdsP" : "Text Scroller Words:", "tsWrdsH" : "This is the number of words the Text Scroller should show at once.", "tsFntP" : "Text Scroller Font:", "tsFntH" : "This is the font used by the TextScroller for the text which the main word is displayed in.", "shctFP" : "Shortcuts file:", "shctFH" : "The file you would like to store your shortcuts in.", "asShctP" : "Auto save shortcuts file ?", "asShctH" : "This setting allows you to specify whether you save your shortcuts automatically when TextRouter quits.", "apShctP" : "Auto apply shortcuts to: ", "apShctH" : "This controls when the shortcuts are expanded; 'none' means the shortcuts will never be automatically expanded, 'all' means they will be expanded when you post to Blogger + Manila and 'blogger' means they will only be expanded when you post to blogger." }, # New Predefined Email Address Prompts + Help Messages "newEmlPrefs" : { "nameP" : "Recipient's Name:", "nameH" : "This is the full name of the person/mailing list who the address belongs to.", "addrP" : "Email address:", "addrH" : "The email address you want to define.", }, # Prompts + Messages for the New Filter screen "newFltPrefs" : { "nameP" : "Filter Name:", "nameH" : "A friendly name you want to give the filter.", "cmdP" : "Command:", "cmdH" : "The actual filter command (as you would type it on the command line).", }, # Prompts + Messages for the New Manila Account screen "newMnlPrefs" : { "siteUrlP" : "Site URL:", "siteUrlH" : "The URL of the main root page of your website (e.g. http://www.example.com/).", "rpcP" : "RPC Server URL:", "rpcH" : "The URL of the RPC server for your account, usually something like: http://www.example.com/RPC2.", "userP" : "Username:", "userH" : "Your username on the remote Manila server (usually your email address).", "passP" : "Password:", "passH" : "Your password on the Manila server.", "opmlP" : "Weblog OPML file:", "opmlH" : "This is the file that will be used when posting to your Manila weblog direct from an OPML file.", "usePosP" : "Use 'Posted By' Line?", "usePosH" : "If this is set to 'Yes', then the following line will be added to every post you make to Manila via the 'Add To HP' menu item.", "postedP" : "Custom 'Posted By' line:", "postedH" : "This line will be added to each post you make via the 'Add To HP' function. You can use any of the replacements used by the 'strftime' POSIX system call, if you don't know what that means, the following are the most useful: %H = Current hour (24), %I = Current hour (12), %M = Current minute, %p = AM or PM. See the help for more details.", }, # Prompts + Messages for the Blogger Account settings screen "newBlgPrefs" : { "rpcP" : "RPC Server URL:", "rpcH" : "The URL of the RPC server for your account. This will be http://plant.blogger.com/api/RPC2 for all Blogger.com accounts. It will only be different if you are using a Blogger compatible system.", "userP" : "Username:", "userH" : "Your username for this Blogger account.", "passP" : "Password:", "passH" : "Your password for this Blogger account.", "bWelogsP" : "Ping Weblogs.com ?", "bWelogsH" : "Should TextRouter 'ping' weblogs.com everytime you update your site to let it know you've updated ? This will result in your blog being listed at weblogs.com", }, # Prompts + Messages for the New Filter screen "newShortcut" : { "nameP" : "Shortcut Name:", "nameH" : "A name of this shortcut, this is the text you will type to use the shortcut. (You type the text in quotes to use it)", "scP" : "Shortcut:", "scH" : "The full text that the shortcut will be expanded to.", }, } PythonCard-0.8.2/samples/textRouter/textRouter.py0000644000076500007650000033006210313163032022076 0ustar alexalex00000000000000#!/usr/local/bin/python """ __version__ = "$Revision: 1.85 $" __date__ = "$Date: 2005/09/18 03:59:22 $" __author__ = "simon@kittle.co.uk" App: TextRouter Desc: TextRouter is a generic weblogging and text "routing" application. It's main use is for posting to Blogger and/or Manila maintained weblogs. It is designed to be the sort of app which is kept running the whole time; the idea being that if you find a piece of text you'd like to send somewhere, you can simply copy and paste it into TextRouter and send it on its way. """ import pprint # for config import webbrowser import smtplib # standard python + pythoncard imports from time import sleep # for the text auto scroller reader. from PythonCard import dialog, model, util import os import sys import re import wx # sizer stuff from types import * from wordwrap import wrap_string # my own imports from customDialogs import * from bloggeraccount import * from manilaaccount import * from shortcutsSet import * from trDragDrop import * ## ===================== ## ## Main TextRouter Class ## ## ===================== ## class TextRouter(model.Background): #def __init__(self, aParent, aId, aStackRsrc, aBgRsrc): # PythonCard.model.Background.__init__(self, aParent, aId, aStackRsrc, aBgRsrc) def on_initialize(self, event): """Startup""" ## -- window configuration follows topSizer = wx.BoxSizer(wx.HORIZONTAL) mainSizer = wx.BoxSizer(wx.VERTICAL) buttonSizer = wx.BoxSizer(wx.VERTICAL) controlsSizer = wx.BoxSizer(wx.HORIZONTAL) comp = self.components ## -- handle the drop + drop of text # - myTextDropTarget = trTextDropTarget(self) # - comp.area1._delegate.SetDropTarget(myTextDropTarget) if wx.__version__ == "2.3.2b7" or wx.__version__ == "2.3.2": myURLDropTarget = trURLDropTarget(self) comp.area1.SetDropTarget(myURLDropTarget) # buttons, no vert. resize, border of 2 pixels round all edges buttonSizer.Add(comp.buttonClearIt, 0, wx.ALL, 2) buttonSizer.Add(comp.buttonClipIt, 0, wx.ALL, 2) # top sizer. this does the subject/title: label + text box. topSizer.Add(comp.lblSubject, 0, wx.ALL | wx.ALIGN_LEFT, 3) topSizer.Add(comp.area2, 1, wx.ALL | wx.ALIGN_LEFT, 0) # bottom controls panel, no horiz. resizing, borders round all edges of width 0 for buttons (they've # already got border) and 4 for the two radio choices. controlsSizer.Add(buttonSizer, 0, wx.ALL | wx.ALIGN_LEFT, 0) controlsSizer.Add(comp.nextInputActionMode, 0, wx.ALL | wx.ALIGN_CENTER_HORIZONTAL, 4) controlsSizer.Add(comp.nextOutputActionMode, 0, wx.ALL | wx.ALIGN_RIGHT, 4) # main sizer, the big text area can be resized vertically, others can't. they can all be sized # horizontally (wx.EXPAND), plus statusLine StaticText control has a bit of padding round all edges mainSizer.Add(topSizer, 0, wx.EXPAND) mainSizer.Add(comp.area1, 1, wx.EXPAND) mainSizer.Add(controlsSizer, 0, wx.EXPAND) #mainSizer.Add(comp.statusLine._delegate, 0, wx.EXPAND | wx.ALL, 2) # we don't want this because it always resizes window to "shrink-wrap" the controls on startup, # which means you can't use GNOME or presumably some Windows toys to remember the size + position # - mainSizer.Fit(self) # put it in to action. self.panel.SetSizer(mainSizer) self.panel.SetAutoLayout(1) self.panel.Layout() self.panel.Refresh() wx.Yield() self.status("Loading...") ## -- data configuration follows # keep track of find parameters self.lastFind = {'searchText':'', 'wholeWordsOnly':0, 'caseSensitive':0} # the two main accounts self.theManilaAccounts = [] self.theCurrentManilaAccount = -1 self.theBloggerAccounts = [] self.theCurrentBloggerAccount = -1 # misc setup + settings self.configFile = "textRouter.conf" self.undoStack = [] self.undoStackPos = 0 self.shortcuts = ShortcutsSet() # default preferences lists self.generalPrefs = {"defaultDirectory" : '.', "tmpFile" : "temp.txt", "externalEditor" : "notepad",\ "alwaysClear" : 'Yes', "autoSaveConfig" : 'Yes', \ "undoHistorySize" : 10, "autoLoadTextFile":'No', 'autoSaveTextFile':'No', "mainFont" : "", "paragraphWidth" : 74, "useProxy" : "No", "proxyServer" : "", "proxyPort" : 0} self.htmlPrefs = { "boldTag" : 'b', "italicTag" : 'i', 'centerTag' : 'div' } self.manilaPrefs = { "manilaAutoLogin" : 'No', 'manilaAutoGetHomepage' : 'No', \ 'routeToManilaAction' : 'adds', 'autoRender' : 'Yes' } self.bloggerPrefs = { "bloggerAutoLogin" : 'No' } self.utilitiesPrefs = { "externalEditor" : "notepad", "textScrollerDelay" : 0.2, \ "textScrollerWords" : 4, \ "textScrollerFont" : \ "{'style':'bold','faceName':'helvetica','family':'sansSerif','size': 24}", "shortcutsFile" : "shortcuts.txt", "autoSaveShortcuts" : "Yes", "expandShortcuts" : "blogger" } self.emailPrefs = {"serverName" : "", "serverPort" : 25, "name" : "", "email" : ""} self.emailRcpts = [] self.filters = [] self.stateSettings = {} self.loadInStrings() self.loadInConfig() self.loadInShortcuts() # load up the text file if the users pref says so, and if we have a last-load file to load if self.generalPrefs["autoLoadTextFile"] == "Yes" and \ ("defaultFileLoad" in self.stateSettings): self.insertFile(self.stateSettings["defaultFileLoad"]) self.saveState() self.components.area1.setFocus() def saveState(self): """Saves the current text and selection state to the undo history stack.""" wx.Yield() currentText = self.components.area1.text currentSel = self.components.area1.getSelection() self.undoStack.insert(self.undoStackPos, [ currentText, currentSel ] ) if self.undoStackPos != 0: self.undoStack[0:self.undoStackPos] = [] self.undoStackPos = 0 if len(self.undoStack) > (self.generalPrefs["undoHistorySize"]+1): self.undoStack[(self.generalPrefs["undoHistorySize"]+1):] = [] #print "===== SAVE" #print " undoStackPosition %d" % self.undoStackPos #print " stack size %d" % len(self.undoStack) #print "----- stack:" #for state in self.undoStack: #print " Text:" + state[0][0:40] #print " (%d, %d)" % (state[1][0], state[1][1]) #print "" def restoreState(self): """Restores the last text and selection state from the undo history stack.""" if self.undoStackPos+1 == len(self.undoStack) or self.undoStackPos == \ (self.generalPrefs["undoHistorySize"]+1): # no more undo info val = [] else: self.undoStackPos = self.undoStackPos + 1 val = self.undoStack[self.undoStackPos] #print "===== UNDO" #print " undoStackPosition %d" % self.undoStackPos #print " stack size %d" % len(self.undoStack) #print "----- stack:" #for state in self.undoStack: #print " Text:" + state[0][0:40] #print " (%d, %d)" % (state[1][0], state[1][1]) #print "VAL:" #print val #print "" return val def doRedo(self): if self.undoStackPos == 0: return [] else: self.undoStackPos = self.undoStackPos - 1 val = self.undoStack[self.undoStackPos] return val # ------------------------- # # File Menu Handlers # # ------------------------- # def on_menuFileLoad_select(self, event): if ("defaultFileLoad" in self.stateSettings) and self.stateSettings["defaultFileLoad"] != "": self.insertFile(self.stateSettings["defaultFileLoad"]) self.saveState() else: self.on_menuFileLoadFrom_select(event) def on_menuFileLoadFrom_select(self, event): """Load a file from disk and insert/append/overwrite it in to the main text box.""" #print "on_menuFileLoadFrom_select: entered" result = dialog.fileDialog(self, 'Open...', \ self.generalPrefs["defaultDirectory"], '', \ "*") if result.accepted: path = result.paths[0] else: self.status("File insert cancelled.") return 0 self.insertFile(path) self.stateSettings["defaultFileLoad"] = path self.saveState() ## -- MENU: FILE: Save Text -- def on_menuFileSave_select(self, event): """Saves the text to the last used file.""" if ("defaultFileSave" in self.stateSettings) and self.stateSettings["defaultFileSave"] != "": self.saveText(self.stateSettings["defaultFileSave"]) else: self.on_menuFileSaveAs_select(event) def on_menuFileSaveAs_select(self, event): """Saves the text to a file chosen by dialog box.""" result = dialog.fileDialog(self, 'Save As...', self.generalPrefs["defaultDirectory"],\ "text.txt", "*", wx.SAVE) if result.accepted: path = result.paths[0] self.saveText(path) self.stateSettings["defaultFileSave"] = path else: self.status("Save cancelled.") ## -- MENU: FILE: Load + Save Config File -- def on_menuFileLoadConfig_select(self, event): """Loads in the config file in to the default location""" result = dialog.fileDialog(self, 'Open', self.generalPrefs["defaultDirectory"], \ self.configFile, "conf") if result.accepted: path = result.paths[0] self.loadInConfig(path) def on_menuFileSaveConfig_select(self, event): """Saves the config file in to the default location""" self.saveConfig() def on_menuFileSaveConfigAs_select(self, event): """Saves the config file in to a specified (by dialog) file""" result = dialog.fileDialog(self, 'Save As...', self.generalPrefs["defaultDirectory"],\ self.configFile, "conf", wx.SAVE) if result.accepted: path = result.paths[0] self.saveConfig(path) ## -- MENU: FILE: Preferences -- def on_menuFilePreferences_select(self, event): """Let the user specify some general preferences""" inputDetails = [["defaultDirectory", self.strs["genPrefs"]["defDirP"],\ self.strs["genPrefs"]["defDirH"],\ self.generalPrefs["defaultDirectory"], 1], ["tmpFile", self.strs["genPrefs"]["tmpFileP"], \ self.strs["genPrefs"]["tmpFileH"], self.generalPrefs["tmpFile"], 1], ["alwaysClear", self.strs["genPrefs"]["aClrP"], \ self.strs["genPrefs"]["aClrH"], self.generalPrefs["alwaysClear"], 4], ["autoSaveConfig", self.strs["genPrefs"]["aSaveP"], \ self.strs["genPrefs"]["aSaveH"], \ self.generalPrefs["autoSaveConfig"], 4], ["autoLoadTextFile", self.strs["genPrefs"]["aLdTxtP"], \ self.strs["genPrefs"]["aLdTxtH"], \ self.generalPrefs["autoLoadTextFile"], 4 ], ["autoSaveTextFile", self.strs["genPrefs"]["aSvTxtP"], \ self.strs["genPrefs"]["aSvTxtH"], \ self.generalPrefs["autoSaveTextFile"], 4 ], ["undoHistorySize", self.strs["genPrefs"]["undoP"], \ self.strs["genPrefs"]["undoH"], \ self.generalPrefs["undoHistorySize"], 2], ["paragraphWidth", self.strs["genPrefs"]["pWdthP"], \ self.strs["genPrefs"]["pWdthH"], \ self.generalPrefs["paragraphWidth"], 2], ["useProxy", self.strs["genPrefs"]["usePxyP"], \ self.strs["genPrefs"]["usePxyH"], \ self.generalPrefs["useProxy"], 4], ["proxyServer", self.strs["genPrefs"]["pxyServP"], \ self.strs["genPrefs"]["pxyServH"], \ self.generalPrefs["proxyServer"], 1], ["proxyPort", self.strs["genPrefs"]["pxyPortP"], \ self.strs["genPrefs"]["pxyPortH"], \ self.generalPrefs["proxyPort"], 2], ] c_useProxy = self.generalPrefs["useProxy"] c_proxyServer = self.generalPrefs["proxyServer"] c_proxyPort = self.generalPrefs["proxyPort"] self.showPreferencesScreen(self.generalPrefs, inputDetails, "Main Preferences", "General preferences updated.") # re-generate xmlrpclib server objects if any of the proxy settings has changed if self.generalPrefs["useProxy"] != c_useProxy or \ self.generalPrefs["proxyServer"] != c_proxyServer or \ self.generalPrefs["proxyPort"] != c_proxyPort: # here we really need to regenertate all the settings, but that ain't done yet print "changed in proxy settings detected, redoing HTTP req objects" def on_close(self, event): self.doExit() event.skip() def doExit(self): """Exits""" if self.generalPrefs["autoSaveConfig"] == 'Yes': self.saveConfig() if self.generalPrefs["autoSaveTextFile"] == 'Yes': if ("defaultFileSave" in self.stateSettings): self.saveText(self.stateSettings["defaultFileSave"]) if self.utilitiesPrefs["autoSaveShortcuts"] == 'Yes': self.saveShortcuts() # ------------------------- # # Edit Menu Handlers # # ------------------------- # # following taken from the textEditor example, which in turn was taken from the searchexplorer # example. Here, we always use 'self.components.area1' and don't use findFocus() because the whole # point of the app is to be quick, there is no other text area, and if you use findFocus() and the focus # isn't in the textbox (it's in the button, or radio-group, etc) then the thing won't happen. # UNDO + REDO don't use the builtin things either, this is because I wanted to keep a small # history of things. # the following was copied and pasted from the searchexplorer sample def on_menuEditUndo_select(self, event): """Undoes the last action.""" newState = self.restoreState() if newState == []: self.status("No more undo information.") else: self.components.area1.text = newState[0] self.components.area1.setSelection(newState[1][0], newState[1][1]) def on_menuEditRedo_select(self, event): """Returns to a saved state.""" newState = self.doRedo() if newState == []: self.status("No redo information.") else: self.components.area1.text = newState[0] self.components.area1.setSelection(newState[1][0], newState[1][1]) def on_menuEditCut_select(self, event): """Cuts the current selection.""" widget = self.components.area1 if hasattr(widget, 'editable') and widget.canCut(): widget.cut() self.saveState() def on_menuEditCopy_select(self, event): """Copies current selection.""" widget = self.components.area1 if hasattr(widget, 'editable') and widget.canCopy(): widget.copy() def on_menuEditPaste_select(self, event): """Pastes in to the textbox, obey's nextInputActionMode.""" widget = self.components.area1 if hasattr(widget, 'editable') and widget.canPaste(): self.updateTextBoxFromClipboard() self.saveState() def findNext(self, searchText, wholeWordsOnly, caseSensitive): fieldText = self.components.area1.text if not caseSensitive: searchText = searchText.lower() fieldText = fieldText.lower() selOffset = self.components.area1.getSelection()[1] # need to update the algorithm so we can match whole words only # are there any tools built into Python to help with that? # do we have to use a regular expression? offset = fieldText[selOffset:].find(searchText) if offset != -1: offset += selOffset #offset += fieldText.count('\n', 0, offset) self.components.area1.setSelection(offset, offset + len(searchText)) self.components.area1.setFocus() def on_doEditFind_command(self, event): # keep track of the last find and preload # the search text and radio buttons lastFind = self.lastFind result = dialog.findDialog(self, lastFind['searchText'], lastFind['wholeWordsOnly'], lastFind['caseSensitive']) if result.accepted: lastFind['searchText'] = result.searchText lastFind['wholeWordsOnly'] = result.wholeWordsOnly lastFind['caseSensitive'] = result.caseSensitive self.findNext(lastFind['searchText'], lastFind['wholeWordsOnly'], lastFind['caseSensitive']) def on_doEditFindNext_command(self, event): self.findNext(self.lastFind['searchText'], self.lastFind['wholeWordsOnly'], self.lastFind['caseSensitive']) def on_menuEditRemoveNewlines_select(self, event): """Removes the newlines from the selection/all.""" txt = self.getOutputText().replace("\n", " ") self.updateTextBox(txt) self.saveState() def on_menuEditWrapText_select(self, event): """Folds selected/all text in to a paragraph of text. Line width specified in user prefs.""" txt = self.getOutputText() self.updateTextBox(wrap_string(txt, self.generalPrefs["paragraphWidth"])) self.saveState() def on_menuEditClear_select(self, event): """Clears selection.""" widget = self.components.area1 if hasattr(widget, 'editable'): if widget.canCut(): # delete the current selection, # if we can't do a Cut we shouldn't be able to delete either # which is why i used the test above sel = widget.replaceSelection('') else: ins = widget.getInsertionPoint() widget.replace(ins, ins + 1, '') self.saveState() def on_menuEditSelectAll_select(self, event): """Selects all.""" widget = self.components.area1 if hasattr(widget, 'editable'): widget.setSelection(0, widget.getLastPosition()) self.saveState() # ------------------------- # # HTML Menu Handlers # # ------------------------- # def tagSelection(self, tagName): if tagName + 'Tag' in self.htmlPrefs: tag = self.htmlPrefs[tagName + 'Tag'] else: tag = tagName widget = self.components.area1 if hasattr(widget, 'editable') and widget.canCut(): sel = widget.getSelection() selectedText = widget.getStringSelection() widget.replaceSelection("<%s>%s" % (tag, selectedText, tag)) widget.setSelection( sel[0], (sel[1] + 2 * len(tag) + 5) ) self.saveState() def on_menuHtmlStripHTML_select(self, event): """Strips all the HTML tags from the selection.""" txt = self.getOutputText() #print txt #print re.sub("<[^>]*>", "", txt) self.updateTextBox(re.sub("<[^>]*>", "", txt)) self.saveState() def on_menuHtmlMake_command(self, event): # strip menuHtml from the name self.tagSelection(event.target.name[8:].lower()) def on_menuHtmlAddLink_command(self, event): widget = self.components.area1 if hasattr(widget, 'editable') and widget.canCut(): result = dialog.textEntryDialog(self, 'URL:', 'Add Link', 'http://') if result.accepted: url = result.text sel = widget.getSelection() selectedText = widget.getStringSelection() widget.replaceSelection('%s' % (url, selectedText)) hrefLen = len(url) + len('') widget.setSelection( sel[0], (sel[1] + hrefLen) ) self.saveState() def on_menuHtmlCenter_select(self, event): """Puts the prefrence of centering tag's around selected text.""" # we need this here because the
option isn't simply
, we have the attribute, etc widget = self.components.area1 if hasattr(widget, 'editable') and widget.canCut(): sel = widget.getSelection() selectedText = widget.getStringSelection() if self.htmlPrefs["centerTag"] == "center": self.tagSelection("center") else: widget.replaceSelection('
%s
' % (selectedText)) divLen = len('
') widget.setSelection( sel[0], (sel[1] + divLen) ) self.saveState() def on_menuHtmlPreferences_select(self, event): """Let the user specify some general preferences""" inputDetails = [ ["boldTag", self.strs["htmlPrefs"]["bTagP"], self.strs["htmlPrefs"]["bTagH"], self.htmlPrefs["boldTag"], 1], ["italicTag", self.strs["htmlPrefs"]["iTagP"], self.strs["htmlPrefs"]["iTagH"], self.htmlPrefs["italicTag"], 1], ["centerTag", self.strs["htmlPrefs"]["cTagP"], self.strs["htmlPrefs"]["cTagH"], self.htmlPrefs["centerTag"], 5, ['center', 'div']], ] self.showPreferencesScreen(self.htmlPrefs,inputDetails,"HTML Preferences","HTML preferences updated.") # ------------------------- # # 'Route To' Menu Handlers # # ------------------------- # def on_menuRouteToManila_select(self, event): """Routes the text to the Manila homepage.""" if self.manilaPrefs["routeToManilaAction"] == "adds": self.on_menuManilaAddToHP_select(event) elif self.manilaPrefs["routeToManilaAction"] == "sets": self.on_menuManilaSetAsHP_select(event) elif self.manilaPrefs["routeToManilaAction"] == "opml": self.on_menuManilaSetHPFromOPML_select(event) def on_menuRouteToBlogger_select(self, event): """Routes the text to the active blog in the current Blogger account.""" if not self.checkBloggerAccounts(3): return curBlogAccount = self.theBloggerAccounts[self.theCurrentBloggerAccount] if curBlogAccount.currentPostId != -1: result = dialog.messageDialog(self, \ "You have previously started editing an existing post.\nDo you really want to blog current text as a new post?", \ "Warning: Editing of previous post detected.", wx.ICON_EXCLAMATION | wx.YES_NO) if not result.accepted: self.status("Blogging of text cancelled.") return 0 self.showWaitMsg("Blogging text...") outputText = self.getOutputText() if self.utilitiesPrefs["expandShortcuts"] == "blogger" or \ self.utilitiesPrefs["expandShortcuts"] == "all": outputText = self.shortcuts.applyTo(outputText) postid = curBlogAccount.bloggerBlogText(outputText) if curBlogAccount.anErrorOccured(): self.status(curBlogAccount.getErrorMessage()) else: self.status("Text blogged successfully, the ID of the post is: %s" % postid) if self.generalPrefs["alwaysClear"] == 'Yes': self.components.area1.text = "" def on_menuRouteToEmailPredefined_select(self, event): if self.emailPrefs["serverName"] == "" or self.emailPrefs["name"] == "" or \ self.emailPrefs["email"] == "": self.status("You must configure your email settings before you can send email.") return 0 if self.getOutputText() == "": self.status("You must type something before you can email it.") return 0 if self.emailRcpts == []: self.status("There are no predefined email address to route email to.") return 0 options = [ "%s <%s>" % (addy[0], addy[1]) for addy in self.emailRcpts ] default = options[0] dlg = ChooserDialog(self, 'Choose Email Address', \ "Choose which email address to route text to...", \ options, default) dlg.showModal() if not dlg.accepted(): self.status("Email cancelled.") else: i = dlg.components.options.findString(dlg.components.options.stringSelection) if i == -1: self.status("No recipient selected.") else: self.showWaitMsg("Emailing text...") self.sendEmailTo(options[i], self.getOutputText(), self.components.area2.text) self.status("Email sent to '%s'" % options[i]) if self.generalPrefs["alwaysClear"] == 'Yes': self.components.area1.text = "" dlg.destroy() def on_menuRouteToEmail_select(self, event): if self.emailPrefs["serverName"] == "" or self.emailPrefs["name"] == "" or \ self.emailPrefs["email"] == "": self.status("You must configure your email settings before you can send email.") return 0 if self.getOutputText() == "": self.status("You must type something before you can email it.") return 0 result = dialog.textEntryDialog(self, 'Please enter the email address:', "Please enter the email address", '') if not result.accepted: self.status("Email cancelled.") return self.showWaitMsg("Emailing text...") recipient = result.text self.sendEmailTo(recipient, self.getOutputText()) self.status("Email sent to '%s'" % recipient) if self.generalPrefs["alwaysClear"] == 'Yes': self.components.area1.text = "" def on_menuRouteToRSS_select(self, event): self.status("on_menuRouteToRSS_select: Not implemented yet") return # ------------------------- # # Manila Menu Handlers # # ------------------------- # def on_menuManilaLogin_select(self, event): """Calls method to login to the Manila server. Shows result in status bar.""" if not self.checkManilaAccounts(3): return self.showWaitMsg("Logging in...") self.theManilaAccounts[self.theCurrentManilaAccount].manilaLogin() if self.theManilaAccounts[self.theCurrentManilaAccount].anErrorOccured(): self.status(self.theManilaAccounts[self.theCurrentManilaAccount].getErrorMessage()) else: self.status("Logged in to '%s' successfully." % self.theManilaAccounts[self.theCurrentManilaAccount].prefs["siteurl"]) def on_menuManilaFlipHomepage_select(self, event): """Confirms user request to flip homepage, and then attempts to flip it.""" if not self.checkManilaAccounts(3): return result = dialog.messageDialog(self, \ "Really flip homepage?", \ "Flip Homepage Confirm") if result.accepted: self.showWaitMsg("Flipping homepage...") self.theManilaAccounts[self.theCurrentManilaAccount].manilaFlipHomepage() if self.theManilaAccounts[self.theCurrentManilaAccount].anErrorOccured(): self.status(self.theManilaAccounts[self.theCurrentManilaAccount].getErrorMessage()) else: self.status("Homepage flipped successfully.") else: self.status("Homepage not flipped.") # now make it so we have to reget the message number before we can set it again. (Flip homepage, # changes the message number) self.currentHPMsgNum = -1 def on_menuManilaAddToHP_select(self, event): """Adds the text to the Manila homepage.""" if not self.checkManilaAccounts(3): return self.showWaitMsg("Adding text to homepage...") self.theManilaAccounts[self.theCurrentManilaAccount].manilaAddTextToHP(self.getOutputText()) if self.theManilaAccounts[self.theCurrentManilaAccount].anErrorOccured(): self.status(self.theManilaAccounts[self.theCurrentManilaAccount].getErrorMessage()) else: self.status("Text added to homepage successfully.") if self.generalPrefs["alwaysClear"] == 'Yes': self.components.area1.text = "" def on_menuManilaGetHP_select(self, event): """Get's the current homepage content, and places it in the text box.""" if not self.checkManilaAccounts(3): return curManilaAccount = self.theManilaAccounts[self.theCurrentManilaAccount] self.showWaitMsg("Fetching homepage...") curManilaAccount.manilaGetHP() if curManilaAccount.anErrorOccured(): self.status(curManilaAccount.getErrorMessage()) else: self.updateTextBox(curManilaAccount.currentHPContent["body"].replace("\r", "\n")) self.status("Homepage content successfully downloaded.") self.saveState() # undo stack history. def on_menuManilaSetAsHP_select(self, event): """Set's the current homepage content, and places it in the text box.""" if not self.checkManilaAccounts(3): return self.showWaitMsg("Updating homepage...") #print self.manilaPrefs["autoRender"] self.theManilaAccounts[self.theCurrentManilaAccount].manilaSetHP(self.getOutputText(), \ self.manilaPrefs["autoRender"]) if self.theManilaAccounts[self.theCurrentManilaAccount].anErrorOccured(): self.status(self.theManilaAccounts[self.theCurrentManilaAccount].getErrorMessage()) else: self.status("Manila homepage '%s' successfully updated." % \ self.theManilaAccounts[self.theCurrentManilaAccount].prefs["siteurl"]) def on_menuManilaSetHPFromOPML_select(self, event): """Set's the current homepage content direct from an OPML file.""" if not self.checkManilaAccounts(3): return curManilaAccount = self.theManilaAccounts[self.theCurrentManilaAccount] if curManilaAccount.prefs["weblogOPML"] == "": self.status("You haven't defined an OPML file for this Manila account yet.") return self.showWaitMsg("Uploading OPML file to homepage...") #print self.manilaPrefs["autoRender"] curManilaAccount.manilaSetHPFromOutline(curManilaAccount.prefs["weblogOPML"]) if curManilaAccount.anErrorOccured(): self.status(curManilaAccount.getErrorMessage()) else: self.status("Manila homepage '%s' successfully updated." % \ curManilaAccount.prefs["siteurl"]) def on_menuManilaGetStoryList_select(self, event): """Update the story list.""" if not self.checkManilaAccounts(3): return self.showWaitMsg("Getting story list...") self.theManilaAccounts[self.theCurrentManilaAccount].manilaGetStoryList() if self.theManilaAccounts[self.theCurrentManilaAccount].anErrorOccured(): self.status(self.theManilaAccounts[self.theCurrentManilaAccount].getErrorMessage()) else: self.status("Story list for '%s' downloaded." % self.theManilaAccounts[self.theCurrentManilaAccount].prefs["siteurl"]) def on_menuManilaDownloadStory_select(self, event): """Download's a story. Cool.""" if not self.checkManilaAccounts(3): return curManilaAccount = self.theManilaAccounts[self.theCurrentManilaAccount] if not curManilaAccount.checkSetupOK(): self.status(curManilaAccount.getErrorMessage()) return listX = [ "%s" % curManilaAccount.storiesList[key][0] for key in curManilaAccount.storiesList.keys() ] dlg = ChooserDialog(self, "Story Download", \ "Choose a story to download...", \ listX, listX[0]) result = dlg.showModal() if result.accepted: i = dlg.components.options.findString(dlg.components.options.stringSelection) if i == -1: self.status("No story selected for downloading.") else: msgNum = int(curManilaAccount.storiesList.keys()[i]) self.showWaitMsg("Downloading story '%s' (msg num: %d)..." % \ (listX[i],msgNum)) story = curManilaAccount.manilaDownloadStory(msgNum) if curManilaAccount.anErrorOccured(): self.status("Story download failed: %s" % curManilaAccount.getErrorMessage()) else: self.updateTextBox(story["body"].replace("\r", "\n")) self.updateSubject(story["subject"]) curManilaAccount.currentStory = i if "opml" in story: result = dialog.messageDialog(self, \ "Warning: The story you downloaded also contained an OPML version,\nif you save this text version of the story it may overwrite the OPML version.", "Warning..", wx.ICON_EXCLAMATION | wx.OK) self.status("Downloaded story '%s' (msg num: %d) successfully." % \ (listX[i],msgNum)) else: self.status("Story download cancelled.") dlg.destroy() def on_menuManilaUploadStory_select(self, event): """Upload's a story.""" if not self.checkManilaAccounts(3): return curManilaAccount = self.theManilaAccounts[self.theCurrentManilaAccount] if not curManilaAccount.checkSetupOK(): self.status(curManilaAccount.getErrorMessage()) return listX = [ "%s" % curManilaAccount.storiesList[key][0] for key in curManilaAccount.storiesList.keys() ] defIndex = ((curManilaAccount.currentStory != -1) and [curManilaAccount.currentStory] or [0])[0] dlg = ChooserDialog(self, "Story Upload", \ "Choose a story to upload the text to...", \ listX, listX[defIndex]) dlg.showModal() if dlg.accepted(): i = dlg.components.options.findString(dlg.components.options.stringSelection) if i == -1: self.status("No story selected for uploading text to.") else: msgNum = int(curManilaAccount.storiesList.keys()[i]) self.showWaitMsg("Uploading to story '%s' (msg num: %d)..." % \ (listX[i],msgNum)) curManilaAccount.manilaUploadStory(msgNum, self.getSubjectText(),\ self.getOutputText(), "text/x-outline-tabbed") if curManilaAccount.anErrorOccured(): self.status("Story upload failed: %s" % curManilaAccount.getErrorMessage()) else: self.status("Uploaded to story '%s' (msg num: %d) successfully." % \ (listX[i],msgNum)) else: self.status("Story upload cancelled.") dlg.destroy() def on_menuManilaUploadPicture_select(self, event): """Upload's an image to the Manila server.""" if not self.checkManilaAccounts(3): return curManilaAccount = self.theManilaAccounts[self.theCurrentManilaAccount] if not curManilaAccount.checkSetupOK(): self.status(curManilaAccount.getErrorMessage()) return wildcard = "JPG files (*.jpg;*.jpeg)|*.jpg;*.jpeg|GIF files (*.gif)|*.gif|All Files (*.*)|*.*" result = dialog.fileDialog(self, 'Open...', \ self.generalPrefs["defaultDirectory"], '', \ wildcard) if result.accepted: path = result.paths[0] if path.endswith("gif"): mimeType = "image/gif" elif path.endswith("jpeg") or path.endswith("jpg"): mimeType = "image/jpeg" else: imgTypes = ["image/jpeg", "image/gif"] dlgC = ChooserDialog(self, 'Choose Image Type', \ "Choose the type of your image (Manila only supprts GIF + JPEG)...", \ imgTypes, imgTypes[0]) result = dlgC.showModal() if not result.accepted: self.status("Image uploading cancelled.") dlgC.destroy() return i = dlgC.components.options.findString(dlgC.components.options.stringSelection) if i == -1: self.status("Image uploading cancelled (no mime type selected for image).") dlgC.destroy() return dlgC.destroy() mimeType = imgTypes[i] result = dialog.textEntryDialog(self, 'Picture Name:', 'Picture Name', '') if result.accepted: imageTitle = result.text self.showWaitMsg("Uploadng image...") msg = curManilaAccount.manilaCreateMsg(imageTitle,\ "...", "text/x-outline-tabbed") if curManilaAccount.anErrorOccured(): self.status("Error uploading image: %s" % curManilaAccount.getErrorMessage()) else: curManilaAccount.manilaAttachPicture(msg["msgnum"], path, mimeType) if curManilaAccount.anErrorOccured(): self.status("Error uploading image: %s" % curManilaAccount.getErrorMessage()) else: self.status("Image uploaded successfully.") else: self.status("Image upload cancelled.") else: self.status("Image upload cancelled.") def on_menuManilaPostNewStory_select(self, event): """Posts text as a new story.""" if not self.checkManilaAccounts(3): return self.showWaitMsg("Posting text as story...") curManilaAccount = self.theManilaAccounts[self.theCurrentManilaAccount] if not curManilaAccount.checkSetupOK(): self.status(curManilaAccount.getErrorMessage()) return msg = curManilaAccount.manilaCreateMsg(self.getSubjectText(),\ self.getOutputText(), "text/x-outline-tabbed") if curManilaAccount.anErrorOccured(): self.status("Error posting new story: %s" % curManilaAccount.getErrorMessage()) else: #print "message:" #print msg curManilaAccount.manilaAddToStoriesList(msg) if curManilaAccount.anErrorOccured(): self.status("Error posting new story: %s" % curManilaAccount.getErrorMessage()) else: self.status("New story '%s' posted successfully. (msg num: %d)" % \ (self.getSubjectText(), int(msg["msgnum"]))) def on_menuManilaSetStoryAsHP_select(self, event): """Set's a chosen story to be the current homepage.""" if not self.checkManilaAccounts(3): return curManilaAccount = self.theManilaAccounts[self.theCurrentManilaAccount] if not curManilaAccount.checkSetupOK(): self.status(curManilaAccount.getErrorMessage()) return listX = [ "%s" % curManilaAccount.storiesList[key][0] for key in curManilaAccount.storiesList.keys() ] defIndex = ((curManilaAccount.currentStory != -1) and [curManilaAccount.currentStory] or [0])[0] dlg = ChooserDialog(self, "Set Homepage", \ "Choose a story to set the homepage as...", \ listX, listX[defIndex]) dlg.showModal() if dlg.accepted(): i = dlg.components.options.findString(dlg.components.options.stringSelection) if i == -1: self.status("No story selected for making the homepage.") else: msgNum = int(curManilaAccount.storiesList.keys()[i]) self.showWaitMsg("Setting homepage from story '%s' (msg num: %d)..." % \ (listX[i],msgNum)) curManilaAccount.manilaSetHomepageFromMSG(msgNum) if curManilaAccount.anErrorOccured(): self.status("Error setting homepage from story: %s" % curManilaAccount.getErrorMessage()) else: self.status("Set homepage from story '%s' (num: %d) successfully." % \ (listX[i],msgNum)) else: self.status("Story upload cancelled.") dlg.destroy() def on_menuManilaNewAccount_select(self, event): """Defines a new Manila account settings.""" inputDetails = [ ["siteurl", self.strs["newMnlPrefs"]["siteUrlP"], \ self.strs["newMnlPrefs"]["siteUrlH"], \ "", 1], ["rpcserver", self.strs["newMnlPrefs"]["rpcP"], \ self.strs["newMnlPrefs"]["rpcH"], \ "", 1], ["username", self.strs["newMnlPrefs"]["userP"], \ self.strs["newMnlPrefs"]["userH"], \ "", 1], ["password", self.strs["newMnlPrefs"]["passP"], \ self.strs["newMnlPrefs"]["passH"], \ "", 3], ["weblogOPML", self.strs["newMnlPrefs"]["opmlP"], \ self.strs["newMnlPrefs"]["opmlH"], \ "", 1], ["usePostedLine", self.strs["newMnlPrefs"]["usePosP"], \ self.strs["newMnlPrefs"]["usePosH"], \ "No", 4], ["postedLine", self.strs["newMnlPrefs"]["postedP"], \ self.strs["newMnlPrefs"]["postedH"], \ "posted at %I:%M %p", 1], ] dlg = PreferencesDialog(self, "Manila Account Settings", inputDetails) dlg.showModal() if dlg.accepted(): if self.generalPrefs["useProxy"] == "Yes": proxy = self.generalPrefs["proxyServer"] + ":" + str(self.generalPrefs["proxyPort"]) else: proxy = "" self.theManilaAccounts.append(ManilaAccount(proxy)) self.theManilaAccounts[-1].setPrefs(dlg.components.siteurl.text, \ dlg.components.rpcserver.text, \ dlg.components.username.text, \ dlg.components.password.text, dlg.components.weblogOPML.text, \ dlg.components.usePostedLine.stringSelection, \ dlg.components.postedLine.text, \ ) if len(self.theManilaAccounts) == 1: self.theCurrentManilaAccount = 0 self.status("New manila account defined.") else: self.status("Cancelled.") # for site in self.theManilaAccounts: # dumpDataStruct(site.prefs) dlg.destroy() def on_menuManilaEditAccount_select(self, event): """Edits an existing Manila account settings.""" if not self.checkManilaAccounts(3): return curManilaAccount = self.theManilaAccounts[self.theCurrentManilaAccount] weblogDef = ("weblogOPML" in curManilaAccount.prefs and \ [ curManilaAccount.prefs["weblogOPML"] ] or \ [ "" ])[0] usePostedL = ("usePostedLine" in curManilaAccount.prefs and \ [ curManilaAccount.prefs["usePostedLine"] ] or \ [ "No" ])[0] postedLine = ("postedLine" in curManilaAccount.prefs and \ [ curManilaAccount.prefs["postedLine"] ] or \ [ "posted at %I:%M %p" ])[0] inputDetails = [ ["siteurl", self.strs["newMnlPrefs"]["siteUrlP"], \ self.strs["newMnlPrefs"]["siteUrlH"], \ curManilaAccount.prefs["siteurl"], 1], ["rpcserver", self.strs["newMnlPrefs"]["rpcP"], \ self.strs["newMnlPrefs"]["rpcH"], \ curManilaAccount.prefs["rpcserver"], 1], ["username", self.strs["newMnlPrefs"]["userP"], \ self.strs["newMnlPrefs"]["userH"], \ curManilaAccount.prefs["username"], 1], ["password", self.strs["newMnlPrefs"]["passP"], \ self.strs["newMnlPrefs"]["passH"], \ curManilaAccount.prefs["password"], 3], ["weblogOPML", self.strs["newMnlPrefs"]["opmlP"], \ self.strs["newMnlPrefs"]["opmlH"], \ weblogDef, 1], ["usePostedLine", self.strs["newMnlPrefs"]["usePosP"], \ self.strs["newMnlPrefs"]["usePosH"], \ usePostedL, 4], ["postedLine", self.strs["newMnlPrefs"]["postedP"], \ self.strs["newMnlPrefs"]["postedH"], \ postedLine, 1], ] dlg = PreferencesDialog(self, "Manila Account Settings", inputDetails) dlg.showModal() if dlg.accepted(): curManilaAccount.setPrefs(dlg.components.siteurl.text, \ dlg.components.rpcserver.text, \ dlg.components.username.text, \ dlg.components.password.text,\ dlg.components.weblogOPML.text, \ dlg.components.usePostedLine.stringSelection, \ dlg.components.postedLine.text, \ ) self.status("Settings for Manila account '%s' updated." % curManilaAccount.prefs["siteurl"]) else: self.status("Cancelled.") dlg.destroy() def on_menuManilaChooseActiveAccount_select(self, event): """Gives the user a list of defined manila accounts so they can select the active one.""" if not self.checkManilaAccounts(1): return options = [] for manilaSite in self.theManilaAccounts: options.append(manilaSite.prefs["siteurl"]) defIndex = self.theCurrentManilaAccount if defIndex == -1: defIndex = 0 default = options[ defIndex ] dlg = ChooserDialog(self, 'Choose Active Manila Account', \ "Choose which Manila account to set as active...", \ options, default) dlg.showModal() if not dlg.accepted(): self.status("Manila account selection cancelled.") else: i = dlg.components.options.findString(dlg.components.options.stringSelection) if i == -1: self.status("No account selected for activation.") else: self.theCurrentManilaAccount = i self.status("Manila site number %d (%s) set as active." % (i + 1, options[i])) dlg.destroy() def on_menuManilaRemoveAccount_select(self, event): """Gives the user a list of defined manila accounts so they can select on to be removed.""" if not self.checkManilaAccounts(1): return options = [] for manilaSite in self.theManilaAccounts: options.append(manilaSite.prefs["siteurl"]) default = options[0] dlg = ChooserDialog(self, 'Remove Manila Account', \ "Choose which Manila account to remove...", \ options, default) dlg.showModal() if not dlg.accepted(): self.status("Removing of manila account cancelled.") else: i = dlg.components.options.findString(dlg.components.options.stringSelection) if i == -1: self.status("No account selected for deletion.") else: self.theManilaAccounts[i:i+1] = [] if len(self.theManilaAccounts) == 0: self.theCurrentManilaAccount = -1 else: if self.theCurrentManilaAccount == i: self.theCurrentManilaAccount = 0 self.status("Manila site number %d (%s) has been removed." % (i + 1, options[i])) dlg.destroy() def on_menuManilaJumpTo_select(self, event): """Displays a quick 'Jump To' choice box.""" if not self.checkManilaAccounts(1): return prettyLocations = [] urls = [] manilaAccount = self.theManilaAccounts[self.theCurrentManilaAccount] if manilaAccount.prefs["siteurl"][-1] == "/": url = manilaAccount.prefs["siteurl"][0:-1] else: url = manilaAccount.prefs["siteurl"] prettyLocations.append("Main Page") prettyLocations.append("Discussion Chronological View") prettyLocations.append("Discussion Topics View") prettyLocations.append("Most-Read Messages") prettyLocations.append("Hourly Hits") prettyLocations.append("Referers") prettyLocations.append("Preferences") prettyLocations.append("Shortcuts") urls.append(url) urls.append(url + "/discuss") urls.append(url + "/discuss/?mode=topic") urls.append(url + "/stats/mostReadMessages") urls.append(url + "/stats/hourlyHits") urls.append(url + "/stats/referers") urls.append(url + "/admin/sitePrefs/default$welcome") urls.append(url + "/admin/viewShortcuts") storyURL = url + "/stories/storyReader$" for key in manilaAccount.storiesList.keys(): prettyLocations.append(manilaAccount.storiesList[key][0]) urls.append(storyURL + str(int(key))) prompt = "Please choose the URL to jump to on %s" % url dlg = ChooserDialog(self, "Choose URL", prompt, \ prettyLocations, prettyLocations[0]) dlg.showModal() if not dlg.accepted(): self.status("Jump-To-URL cancelled.") dlg.destroy() else: i = dlg.components.options.findString(dlg.components.options.stringSelection) if i == -1: self.status("No webpage selected for loading.") else: dlg.destroy() webbrowser.open(urls[i], 1, 1) def on_menuManilaPreferences_select(self, event): """Let the user specify some Manila specific preferences""" inputDetails = [ ["manilaAutoLogin", self.strs["mnlPrefs"]["aLogP"], self.strs["mnlPrefs"]["aLogH"], self.manilaPrefs["manilaAutoLogin"], 4], ["manilaAutoGetHomepage", self.strs["mnlPrefs"]["aGetP"], self.strs["mnlPrefs"]["aGetH"], self.manilaPrefs["manilaAutoGetHomepage"], 4], ["routeToManilaAction", self.strs["mnlPrefs"]["rToMP"], self.strs["mnlPrefs"]["rToMH"], self.manilaPrefs["routeToManilaAction"], 5, ['adds', 'sets', 'opml']], # ["autoRender", self.strs["mnlPrefs"]["aRndrP"], # self.strs["mnlPrefs"]["aRndrH"], # self.manilaPrefs["autoRender"], 4 ], ] self.showPreferencesScreen(self.manilaPrefs,inputDetails,"Manila Preferences","Manila preferences updated.") # ------------------------- # # Blogger Menu Handlers # # ------------------------- # def on_menuBloggerLogin_select(self, event): """Calls method to login to the Manila server. Shows result in status bar.""" if not self.checkBloggerAccounts(3): return self.showWaitMsg("Logging in...") self.theBloggerAccounts[self.theCurrentBloggerAccount].bloggerLogin() if self.theBloggerAccounts[self.theCurrentBloggerAccount].anErrorOccured(): self.status(self.theBloggerAccounts[self.theCurrentBloggerAccount].getErrorMessage()) else: self.status("Logged in to Blogger account '%s' successfully." % \ self.theBloggerAccounts[self.theCurrentBloggerAccount].prefs["username"] ) def on_menuBloggerChooseBlog_select(self, event): """Chooses a blog from the users' list of weblogs""" if not self.checkBloggerAccounts(3): return if (not self.theBloggerAccounts[self.theCurrentBloggerAccount].checkSetupOK(3)): self.status(self.theBloggerAccounts[self.theCurrentBloggerAccount].getErrorMessage()) return options = [ weblog["blogName"] for weblog in self.theBloggerAccounts[self.theCurrentBloggerAccount].blogs ] defIndex = self.theBloggerAccounts[self.theCurrentBloggerAccount].prefs["activeBlog"] - 1 if defIndex == -2: defIndex = 0 default = options[ defIndex ] dlg = ChooserDialog(self, 'Choose Active Blog', \ "Choose the blog number to make active...", \ options, default) dlg.showModal() if not dlg.accepted(): self.status("Active blog selection cancelled.") else: i = dlg.components.options.findString(dlg.components.options.stringSelection) if i == -1: self.status("No blog selected for activation.") else: self.status("Blog '%s' set as active." % (self.theBloggerAccounts[self.theCurrentBloggerAccount].blogs[i]["blogName"])) self.theBloggerAccounts[self.theCurrentBloggerAccount].setActiveBlog(i+1) dlg.destroy() def on_menuBloggerFetchPosts_select(self, event): """Fetches the previous 10 posts from the Blogger server.""" if not self.checkBloggerAccounts(3): return self.showWaitMsg("Fetching posts...") postid = self.theBloggerAccounts[self.theCurrentBloggerAccount].bloggerFetchPreviousPosts() if self.theBloggerAccounts[self.theCurrentBloggerAccount].anErrorOccured(): self.status(self.theBloggerAccounts[self.theCurrentBloggerAccount].getErrorMessage()) #print self.theBloggerAccount.getErrorMessage() else: self.status("Posts downloaded successfully, now use 'Blogger->Insert Previous Post' to start editing old posts.") def on_menuBloggerInsertPrevPost_select(self, event): """Gets an existing post for editting.""" if not self.checkBloggerAccounts(3): return curBlogAccount = self.theBloggerAccounts[self.theCurrentBloggerAccount] # check logged in if (not curBlogAccount.checkSetupOK(0)): self.status(curBlogAccount.getErrorMessage()) return 0 if ("previousPosts" not in curBlogAccount.blogs[curBlogAccount.prefs["activeBlog"]-1]) or \ curBlogAccount.blogs[curBlogAccount.prefs["activeBlog"]-1]["previousPosts"] == []: self.showWaitMsg("Fetching previous posts...") postid = curBlogAccount.bloggerFetchPreviousPosts() if curBlogAccount.anErrorOccured(): self.status(curBlogAccount.getErrorMessage()) return else: self.status("Previous posts fetched, now choose one to edit...") #if (not curBlogAccount.checkSetupOK(8)): #self.status(curBlogAccount.getErrorMessage()) #return activeBlogIndex = curBlogAccount.prefs["activeBlog"]-1 prevPosts = curBlogAccount.blogs[activeBlogIndex]["previousPosts"] options = [] for index in range(len(curBlogAccount.blogs[activeBlogIndex]["previousPosts"])): text = prevPosts[index]["content"].replace("\n"," ") options.append( "%d: %s%s" % (index+1, text[0:50], (len(text) > 50) and "..." or "") ) default = options[0] dlg = ChooserDialog(self, 'Choose Post To Edit', \ "Choose the post to edit...", \ options, default) dlg.showModal() if not dlg.accepted(): self.status("Post editing cancelled.") else: i = dlg.components.options.findString(dlg.components.options.stringSelection) if i == -1: self.status("No previous post selected.") else: curBlogAccount.currentPostId = prevPosts[i]["postid"] self.updateTextBox(prevPosts[i]["content"]) self.status("Editing previous post, use 'Blogger->Update Post' to save you edits when done.") self.saveState() dlg.destroy() def on_menuBloggerGetPost_select(self, event): """Gets an existing post for editting.""" if not self.checkBloggerAccounts(3): return curBlogAccount = self.theBloggerAccounts[self.theCurrentBloggerAccount] # check logged in if (not curBlogAccount.checkSetupOK(0)): self.status(curBlogAccount.getErrorMessage()) return 0 result = dialog.textEntryDialog(self, 'Fetch Post:', 'Post ID', '') if not result.accepted: self.status("Post editing cancelled.") else: try: num = result.text self.showWaitMsg("Fetching post number '%s'..." % num) post = curBlogAccount.bloggerGetPost(num) if curBlogAccount.anErrorOccured(): self.status(curBlogAccount.getErrorMessage()) return curBlogAccount.currentPostId = post["postid"] self.updateTextBox(post["content"]) self.status("Editing previous post, use 'Blogger->Update Post' to save you edits when done.") self.saveState() except ValueError, e: self.status("Error: Post ID must be a number.") def on_menuBloggerDeletePost_select(self, event): """Deletes a post.""" if not self.checkBloggerAccounts(3): return curBlogAccount = self.theBloggerAccounts[self.theCurrentBloggerAccount] # check logged in if (not curBlogAccount.checkSetupOK(15)): self.status(curBlogAccount.getErrorMessage()) return 0 if "previousPosts" not in curBlogAccount.blogs[curBlogAccount.prefs["activeBlog"]-1] or \ curBlogAccount.blogs[curBlogAccount.prefs["activeBlog"]-1]["previousPosts"] == []: self.showWaitMsg("Fetching previous posts...") postid = curBlogAccount.bloggerFetchPreviousPosts() if curBlogAccount.anErrorOccured(): self.status(curBlogAccount.getErrorMessage()) return else: self.status("Previous posts fetched, now choose one to delete...") #if (not curBlogAccount.checkSetupOK(8)): #self.status(curBlogAccount.getErrorMessage()) #return activeBlogIndex = curBlogAccount.prefs["activeBlog"]-1 prevPosts = curBlogAccount.blogs[activeBlogIndex]["previousPosts"] options = [] for index in range(len(prevPosts)): text = prevPosts[index]["content"].replace("\n"," ") options.append( "%d: %s%s" % (index+1, text[0:50], (len(text) > 50) and "..." or "") ) default = options[0] dlg = ChooserDialog(self, 'Choose Post To Delete', \ "Choose the post to delete...", \ options, default) dlg.showModal() if not dlg.accepted(): self.status("Post deletion cancelled.") else: i = dlg.components.options.findString(dlg.components.options.stringSelection) if i == -1: self.status("No previous post selected for deletion.") else: self.showWaitMsg("Deleting...") postid = prevPosts[i]["postid"] curBlogAccount.bloggerDeletePost(i) if curBlogAccount.anErrorOccured(): self.status(curBlogAccount.getErrorMessage()) else: self.status("Post deleted successfully.") if curBlogAccount.currentPostId == postid: curBlogAccount.currentPostId = -1 dlg.destroy() def on_menuBloggerUpdatePost_select(self, event): """Updates an existing post. A Previous post much be fetched first.""" if not self.checkBloggerAccounts(3): return curBlogAccount = self.theBloggerAccounts[self.theCurrentBloggerAccount] if (not curBlogAccount.checkSetupOK(0)): self.status(curBlogAccount.getErrorMessage()) return if curBlogAccount.currentPostId == -1: self.status("You must start editing a previous post before update it.") return self.showWaitMsg("Updating...") outputText = self.components.area1.text if self.utilitiesPrefs["expandShortcuts"] == "blogger" or \ self.utilitiesPrefs["expandShortcuts"] == "all": outputText = self.shortcuts.applyTo(outputText) curBlogAccount.bloggerUpdatePost(outputText) if curBlogAccount.anErrorOccured(): self.status(curBlogAccount.getErrorMessage()) #print self.theBloggerAccount.getErrorMessage() else: self.status("Post updated successfully.") if self.generalPrefs["alwaysClear"] == 'Yes': self.components.area1.text = "" curBlogAccount.currentPostId = -1 curBlogAccount.blogs[curBlogAccount.prefs["activeBlog"]-1]["previousPosts"] = [] def on_menuBloggerGetTemplate_select(self, event): """Gets the users template from Blogger.""" if not self.checkBloggerAccounts(3): return if not self.theBloggerAccounts[self.theCurrentBloggerAccount].checkSetupOK(): self.status(self.theBloggerAccounts[self.theCurrentBloggerAccount].getErrorMessage()) return tmplNames = ["main", "archiveIndex"] prettyNames = [ "Main", "Archive" ] dlg = ChooserDialog(self, 'Choose Template To Get', \ "Choose the template to get...", \ prettyNames, prettyNames[0]) dlg.showModal() if not dlg.accepted(): self.status("Tempalte downloading cancelled.") dlg.destroy() return else: i = dlg.components.options.findString(dlg.components.options.stringSelection) if i == -1: self.status("No temlpate type selected.") dlg.destroy() return dlg.destroy() self.showWaitMsg("Downloading template...") tmpl = self.theBloggerAccounts[self.theCurrentBloggerAccount].bloggerGetTemplate(tmplNames[i]) if self.theBloggerAccounts[self.theCurrentBloggerAccount].anErrorOccured(): self.status(self.theBloggerAccounts[self.theCurrentBloggerAccount].getErrorMessage()) return self.updateTextBox(tmpl) self.status("%s template for blog '%s' downloaded." % (prettyNames[i], self.theBloggerAccounts[self.theCurrentBloggerAccount].prefs["username"]) ) def on_menuBloggerSetTemplate_select(self, event): """Sets the users template from Blogger.""" if not self.checkBloggerAccounts(3): return curBlogAccount = self.theBloggerAccounts[self.theCurrentBloggerAccount] if not curBlogAccount.checkSetupOK(): self.status(curBlogAccount.getErrorMessage()) return tmplNames = ["main", "archiveIndex"] dlg = ChooserDialog(self, 'Set Template', \ "Choose the template to set...", \ ["Main", "Archive"], "Main") dlg.showModal() if not dlg.accepted(): self.status("Template saving cancelled.") dlg.destroy() return else: i = dlg.components.options.findString(dlg.components.options.stringSelection) if i == -1: self.status("No template type selected.") dlg.destroy() return dlg.destroy() self.showWaitMsg("Saving template...") tmpl = curBlogAccount.bloggerSetTemplate(tmplNames[i], self.getOutputText()) if curBlogAccount.anErrorOccured(): self.status(curBlogAccount.getErrorMessage()) return self.status("Template saved.") def on_menuBloggerJumpTo_select(self, event): """Displays a quick 'Jump To' choice box.""" if not self.checkBloggerAccounts(1): return self.theBloggerAccounts[self.theCurrentBloggerAccount].checkSetupOK(3) if self.theBloggerAccounts[self.theCurrentBloggerAccount].anErrorOccured(): self.status(self.theBloggerAccounts[self.theCurrentBloggerAccount].getErrorMessage()) return prettyLocations = [] urls = [] for bloggerAccount in self.theBloggerAccounts: for blog in bloggerAccount.blogs: name = blog["blogName"] url = blog["url"] prettyLocations.append(name) urls.append(url) if len(prettyLocations) == 0: self.status("There are no blogs to jump to.") dlg = ChooserDialog(self, "Choose URL", "Please choose the URL to jump to:", \ prettyLocations, prettyLocations[0]) dlg.showModal() if not dlg.accepted(): self.status("Jump-To-URL cancelled.") dlg.destroy() else: i = dlg.components.options.findString(dlg.components.options.stringSelection) if i == -1: self.status("No webpage selected for loading.") else: dlg.destroy() webbrowser.open(urls[i], 1, 1) def on_menuBloggerNewAccount_select(self, event): """Defines a new Blogger account settings.""" inputDetails = [ ["rpcserver", self.strs["newBlgPrefs"]["rpcP"], \ self.strs["newBlgPrefs"]["rpcH"], \ "http://plant.blogger.com/api/RPC2", 1], ["username", self.strs["newBlgPrefs"]["userP"], \ self.strs["newBlgPrefs"]["userH"], \ "", 1], ["password", self.strs["newBlgPrefs"]["passP"], \ self.strs["newBlgPrefs"]["passH"], "", 3], ["weblogsPing", self.strs["newBlgPrefs"]["bWelogsP"], self.strs["newBlgPrefs"]["bWelogsH"], "Yes" , 4], ] dlg = PreferencesDialog(self, "Blogger Account Settings", inputDetails) dlg.showModal() if dlg.accepted(): #if self.generalPrefs["useProxy"] == 'Yes': # self.theBloggerAccounts.append(BloggerAccount("yes")) #else: if self.generalPrefs["useProxy"] == "Yes": proxy = self.generalPrefs["proxyServer"] + ":" + str(self.generalPrefs["proxyPort"]) else: proxy = "" self.theBloggerAccounts.append(BloggerAccount(proxy)) self.theBloggerAccounts[-1].setPrefs(dlg.components.rpcserver.text, \ dlg.components.username.text, \ dlg.components.password.text, \ dlg.components.weblogsPing.stringSelection) if len(self.theBloggerAccounts) == 1: self.theCurrentBloggerAccount = 0 self.status("New Blogger account defined.") else: self.status("Cancelled.") dlg.destroy() def on_menuBloggerEditAccount_select(self, event): """Edits settings for an existing Blogger account.""" if not self.checkBloggerAccounts(3): return curBlogAccount = self.theBloggerAccounts[self.theCurrentBloggerAccount] if "weblogsPing" in curBlogAccount.prefs: defWeblogsPing = curBlogAccount.prefs["weblogsPing"] else: defWeblogsPing = "Yes" inputDetails = [ ["rpcserver", self.strs["newBlgPrefs"]["rpcP"], \ self.strs["newBlgPrefs"]["rpcH"], \ curBlogAccount.prefs["rpcserver"], 1], ["username", self.strs["newBlgPrefs"]["userP"], \ self.strs["newBlgPrefs"]["userH"], \ curBlogAccount.prefs["username"], 1], ["password", self.strs["newBlgPrefs"]["passP"], \ self.strs["newBlgPrefs"]["passH"], curBlogAccount.prefs["password"], 3], ["weblogsPing", self.strs["newBlgPrefs"]["bWelogsP"], self.strs["newBlgPrefs"]["bWelogsH"], defWeblogsPing , 4], ] dlg = PreferencesDialog(self, "Blogger Account Settings", inputDetails) dlg.showModal() if dlg.accepted(): curBlogAccount.setPrefs(dlg.components.rpcserver.text, \ dlg.components.username.text, \ dlg.components.password.text, \ dlg.components.weblogsPing.stringSelection) self.status("Settings for Blogger account '%s' updated." % curBlogAccount.prefs["username"]) else: self.status("Cancelled.") dlg.destroy() def on_menuBloggerChooseActiveAccount_select(self, event): """Gives the user a list of defined blogger accounts so they can select the active one.""" if not self.checkBloggerAccounts(1): return options = [] for bloggerSite in self.theBloggerAccounts: options.append(bloggerSite.prefs["username"]) defIndex = self.theCurrentBloggerAccount if defIndex == -1: defIndex = 0 default = options[ defIndex ] dlg = ChooserDialog(self, 'Choose Active Blogger Account', \ "Choose which Blogger account to set as active...", \ options, default) dlg.showModal() if not dlg.accepted(): self.status("Blogger account selection cancelled.") else: i = dlg.components.options.findString(dlg.components.options.stringSelection) if i == -1: self.status("No Blogger account selected for activation.") else: self.theCurrentBloggerAccount = i self.status("Blogger site number %d (%s) set as active." % (i + 1, options[i])) dlg.destroy() def on_menuBloggerRemoveAccount_select(self, event): """Gives the user a list of defined Blogger accounts so they can select on to be removed.""" if not self.checkBloggerAccounts(1): return options = [] for bloggerSite in self.theBloggerAccounts: options.append(bloggerSite.prefs["username"]) default = options[0] dlg = ChooserDialog(self, 'Remove Blogger Account', \ "Choose which Blogger account to remove...", \ options, default) dlg.showModal() if not dlg.accepted(): self.status("Removing of Blogger account cancelled.") else: i = dlg.components.options.findString(dlg.components.options.stringSelection) self.theBloggerAccounts[i:i+1] = [] if len(self.theBloggerAccounts) == 0: self.theCurrentBloggerAccount = -1 else: if self.theCurrentBloggerAccount == i: self.theCurrentBloggerAccount = 0 self.status("Blogger site number %d (%s) has been removed." % (i + 1, options[i])) dlg.destroy() def on_menuBloggerPreferences_select(self, event): """Let the user specify some blogger specific preferences""" inputDetails = [ ["bloggerAutoLogin", self.strs["blgPrefs"]["aLogP"], self.strs["blgPrefs"]["aLogH"], self.bloggerPrefs["bloggerAutoLogin"], 4], ] self.showPreferencesScreen(self.bloggerPrefs, inputDetails, "Blogger Preferences", \ "Blogger preferences updated.") # ------------------------- # # Email Menu Handlers # # ------------------------- # def on_menuEmailNewEmailRcpt_select(self, event): """Allows the user to define a new email address.""" inputDetails = [ ["name", self.strs["newEmlPrefs"]["nameP"], \ self.strs["newEmlPrefs"]["nameH"], "", 1], ["email", self.strs["newEmlPrefs"]["addrP"], \ self.strs["newEmlPrefs"]["addrH"], \ "", 1], ] dlg = PreferencesDialog(self, "New Predefined Email Address", inputDetails) dlg.showModal() if dlg.accepted(): self.emailRcpts.append( [ dlg.components.name.text, dlg.components.email.text ] ) self.status("Predefined email address added: '%s <%s>'" % (self.emailRcpts[-1][0], self.emailRcpts[-1][1])) else: self.status("New email address cancelled.") dlg.destroy() def on_menuEmailRemoveEmailRcpt_select(self, event): """Lists the predefined email address so the user can choose one to delete.""" if self.emailRcpts == []: self.status("There are no predefined email address to remove.") return 0 options = [ "%s <%s>" % (addy[0], addy[1]) for addy in self.emailRcpts ] default = options[0] dlg = ChooserDialog(self, 'Choose Email Address', \ "Choose which email address to remove...", \ options, default) dlg.showModal() if not dlg.accepted(): self.status("Address deletion cancelled.") else: i = dlg.components.options.findString(dlg.components.options.stringSelection) if i == -1: self.status("No address selected for deleting.") else: self.status("Removed predefined address: '%s'." % options[i]) self.emailRcpts[i:i+1] = [] dlg.destroy() def on_menuEmailPreferences_select(self, event): """Handles the inputting of email settings""" inputDetails = [ ["serverName", self.strs["emlPrefs"]["srvNamP"], self.strs["emlPrefs"]["srvNamH"], self.emailPrefs["serverName"], 1], ["serverPort", self.strs["emlPrefs"]["srvPtP"], self.strs["emlPrefs"]["srvPtH"], self.emailPrefs["serverPort"], 2], ["name", self.strs["emlPrefs"]["nameP"], self.strs["emlPrefs"]["nameH"], self.emailPrefs["name"], 1], ["email", self.strs["emlPrefs"]["addrP"], self.strs["emlPrefs"]["addrH"], self.emailPrefs["email"], 1], ] dlg = PreferencesDialog(self, "Email Preferences", inputDetails) dlg.showModal() if dlg.accepted(): self.emailPrefs["serverName"] = dlg.components.serverName.text self.emailPrefs["serverPort"] = int(dlg.components.serverPort.text) self.emailPrefs["name"] = dlg.components.name.text self.emailPrefs["email"] = dlg.components.email.text self.status("Email settings updated.") else: self.status("Cancelled.") dlg.destroy() def on_menuSettingsRSS_select(self, event): self.status("on_menuSettingsRSS_select: Not implemented yet") return # ------------------------- # # Utilities Menu Handlers # # ------------------------- # def on_menuUtilitiesExternalEditor_select(self, event): """Loads the text up in an external editor for editing, then reads it back in when done.""" if not self.saveText(self.generalPrefs["tmpFile"]): return os.system(self.utilitiesPrefs["externalEditor"] + " " + self.generalPrefs["tmpFile"] + ' &') if wx.Platform == "__WXMSW__": self.insertFile(self.generalPrefs["tmpFile"]) def on_menuUtilitiesTextScroller_select(self, event): dlg=AutoTextScrollerDialog(self,"TextRouter - Auto Scroller",self.utilitiesPrefs,self.getOutputText()) dlg.showModal() if dlg.accepted(): self.status("Done.") dlg.destroy() def on_menuUtilitiesNewFilter_select(self, event): """Allows the user to define a new filter.""" inputDetails = [ ["name", self.strs["newFltPrefs"]["nameP"], self.strs["newFltPrefs"]["nameH"], "", 1], ["command", self.strs["newFltPrefs"]["cmdP"], self.strs["newFltPrefs"]["cmdH"], "", 1], ] dlg = PreferencesDialog(self, "New Filter", inputDetails) dlg.showModal() if dlg.accepted(): self.filters.append( [ dlg.components.name.text, dlg.components.command.text ] ) self.status("Filter (%s) added." % (self.filters[-1][0])) else: self.status("New filter definition cancelled.") dlg.destroy() def on_menuUtilitiesRemoveFilter_select(self, event): """Lists the defined filters so the user can choose one to delete.""" if self.filters == []: self.status("There are currently no filters defined.") return 0 options = [ "%s" % filter[0] for filter in self.filters ] default = options[0] dlg = ChooserDialog(self, 'Choose Filter', \ "Choose which filter to remove...", \ options, default) dlg.showModal() if not dlg.accepted(): self.status("Filter deletion cancelled.") else: i = dlg.components.options.findString(dlg.components.options.stringSelection) if i == -1: self.status("No filter selected for deleting.") else: self.status("Removed filter: '%s'." % options[i]) self.filters[i:i+1] = [] dlg.destroy() def on_menuUtilitiesNewShortcut_select(self, event): """Allows the user to define a new shortcut.""" inputDetails = [ ["name", self.strs["newShortcut"]["nameP"], self.strs["newShortcut"]["nameH"], "", 1], ["shortcut", self.strs["newShortcut"]["scP"], self.strs["newShortcut"]["scH"], "", 1], ] dlg = PreferencesDialog(self, "New Shortcut", inputDetails) dlg.showModal() if dlg.accepted(): self.shortcuts.addShortcut( dlg.components.name.text, dlg.components.shortcut.text ) self.status("Shortcut '%s' added, type \"%s\" (with the quotes) to use this shortcut." % (dlg.components.name.text,dlg.components.name.text) ) else: self.status("New shortcut definition cancelled.") dlg.destroy() def on_menuUtilitiesRemoveShortcut_select(self, event): """Lists shortcuts so the user can choose one to delete.""" if len(self.shortcuts.shortcuts) == 0: self.status("There are currently no shortcuts defined.") return 0 options = self.shortcuts.shortcuts.keys() default = options[0] dlg = ChooserDialog(self, 'Choose Shortcut', \ "Choose which shortcut to remove...", \ options, default) dlg.showModal() if not dlg.accepted(): self.status("Shortcut deletion cancelled.") else: if dlg.components.options.stringSelection == "": self.status("No shortcut selected for deleting.") else: self.status("Removed shortcut '%s'." % dlg.components.options.stringSelection) self.shortcuts.delShortcut(dlg.components.options.stringSelection) dlg.destroy() #self.shortcuts.printShortcuts() def on_menuUtilitiesPreferences_select(self, event): """Let the user specify some preferences which pertain to the utility functions.""" inputDetails = [ ["externalEditor", self.strs["utilPrefs"]["extEdP"], \ self.strs["utilPrefs"]["extEdH"], \ self.utilitiesPrefs["externalEditor"], 1], ["textScrollerDelay", self.strs["utilPrefs"]["tsDelP"], \ self.strs["utilPrefs"]["tsDelH"], \ self.utilitiesPrefs["textScrollerDelay"], 6], ["textScrollerWords", self.strs["utilPrefs"]["tsWrdsP"], \ self.strs["utilPrefs"]["tsWrdsH"], \ self.utilitiesPrefs["textScrollerWords"], 2], ["textScrollerFont", self.strs["utilPrefs"]["tsFntP"], \ self.strs["utilPrefs"]["tsFntH"], \ self.utilitiesPrefs["textScrollerFont"], 7], ["shortcutsFile", self.strs["utilPrefs"]["shctFP"], \ self.strs["utilPrefs"]["shctFH"], \ self.utilitiesPrefs["shortcutsFile"], 1], ["autoSaveShortcuts", self.strs["utilPrefs"]["asShctP"], \ self.strs["utilPrefs"]["asShctH"], \ self.utilitiesPrefs["autoSaveShortcuts"], 4], ["expandShortcuts", self.strs["utilPrefs"]["apShctP"], \ self.strs["utilPrefs"]["apShctH"], \ self.utilitiesPrefs["expandShortcuts"], 5, ['blogger', 'all', 'none'] ], ] self.showPreferencesScreen(self.utilitiesPrefs, inputDetails, "Utility Preferences", "Utility preferences updated.") def on_menuUtilitiesApplyFilter_select(self, event): """Lets the user choose a filter which is then applied to the text.""" if self.filters == []: self.status("There are currently no filters defined.") return 0 options = [ "%s" % filter[0] for filter in self.filters ] default = options[0] dlg = ChooserDialog(self, 'Choose Filter', \ "Choose which filter to apply...", \ options, default) dlg.showModal() if not dlg.accepted(): self.status("Filter application cancelled.") else: i = dlg.components.options.findString(dlg.components.options.stringSelection) fhandles = os.popen2(self.filters[i][1]) fhandles[0].write(self.getOutputText()) fhandles[0].close() self.updateTextBox(fhandles[1].read()) dlg.destroy() # ------------------------- # # Help Menu Handlers # # ------------------------- # def on_menuHelpHelp_select(self, event): """Displays the TextRouter help in a ScrolledMessage dialog window.""" webbrowser.open("docs/textRouter_help.html", 1, 1) def on_menuHelpReadme_select(self, event): """Displays the README in a ScrolledMessage dialog window.""" webbrowser.open("docs/readme.html", 1, 1) def on_menuHelpAbout_select(self, event): """Displays a small About dialog box.""" dlg = AboutDialog(self, "TextRouter 0.60", \ """\ TextRouter is a generic weblogging and text "routing" application. It's main use is for posting to Blogger and/or Manila maintained weblogs. It is designed to be the sort of app which is kept running the whole time; the idea being that if you find a piece of text you'd like to send somewhere, you can simply copy and paste it into TextRouter and send it on its way.\ """,\ [ ["TextRouter Homepage:", "http://simon.kittle.info/textrouter/"], ["PythonCard Homepage:", "http://pythoncard.sourceforge.net/"] ] ) dlg.showModal() dlg.destroy() # ------------------------- # # Button Handlers # # ------------------------- # def on_buttonClearIt_mouseClick(self, event): """Clears the text input box""" # this was debugging other stuff. #print "stuff:" #print self.components.area1.getInsertionPoint() #print self.components.area1.getSelection() #self.components.area1.replaceSelection("boo", 0) self.components.area1.text = "" self.components.area2.text = "" self.saveState() def on_buttonClipIt_mouseClick(self, event): """Puts the clip-board text in to the input text box""" self.updateTextBoxFromClipboard() self.saveState() def on_area1_keyPress(self, event): #print "keyPress", event.GetKeyCode() if event.keyCode == 9: event.target.replaceSelection("\t") else: event.skip() # ------------------------- # # Misc Stuff # # ------------------------- # def showPreferencesScreen(self, prefsList, inputDetails, title, updatedMsg): dlg = PreferencesDialog(self, title, inputDetails) dlg.showModal() if dlg.accepted(): for pref in inputDetails: if pref[4] == 1 or pref[4] == 3: # text entry (text + passwords) prefsList[pref[0]] = getattr(dlg.components, pref[0]).text elif pref[4] == 2: # numbers try: prefsList[pref[0]] = int(getattr(dlg.components, pref[0]).text) except ValueError, e: pass elif pref[4] == 4 or pref[4] == 5: # Yes/No + Custom choices prefsList[pref[0]] = getattr(dlg.components, pref[0]).stringSelection elif pref[4] == 6: # floats try: prefsList[pref[0]] = float(getattr(dlg.components, pref[0]).text) except ValueError, e: pass elif pref[4] == 7: # fonts if pref[0] in dlg.values: prefsList[pref[0]] = dlg.values[pref[0]] #print type(prefsList[pref[0]]) self.status(updatedMsg) else: self.status("Cancelled.") dlg.destroy() def sendEmailTo(self, emailRcpt, body, subject): """Sends the text specified to the address specified.""" # build up the email. msg = "From: %s <%s>\r\n" % (self.emailPrefs["name"], self.emailPrefs["email"]) msg = msg + "To: %s\r\n" % emailRcpt msg = msg + "Subject: %s\r\n" % subject msg = msg + "User-Agent: TextRouter/0.40\r\n\r\n" msg = msg + body.replace("\n", "\r\n") msg = msg + "\r\n" # send the email smtpServer = smtplib.SMTP(self.emailPrefs["serverName"], self.emailPrefs["serverPort"]) smtpServer.sendmail(self.emailPrefs["email"], emailRcpt, msg) smtpServer.quit() def checkManilaAccounts(self, toCheck = 0): """This checks that at least one Manila account is defined and that there is an active account.""" code = 1 if toCheck & 2 and self.theCurrentManilaAccount == -1: self.status("Warning: You must set a Manila account as active.") code = 0 if toCheck & 1 and self.theManilaAccounts == []: self.status("Warning: No Manila accounts have been defined.") code = 0 return code def checkBloggerAccounts(self, toCheck = 0): """This checks that at least one Blogger account is defined and that there is an active account.""" code = 1 if toCheck & 2 and self.theCurrentBloggerAccount == -1: self.status("Warning: You must set a Blogger account as active.") code = 0 if toCheck & 1 and self.theBloggerAccounts == []: self.status("Warning: No Blogger accounts have been defined.") code = 0 return code def getInputActionMode(self): """Returns the type of action the next text input should do.""" if self.components.nextInputActionMode.stringSelection == "inserts": return "insert" elif self.components.nextInputActionMode.stringSelection == "appends": return "append" elif self.components.nextInputActionMode.stringSelection == "replaces": return "replace" def getOutputActionMode(self): """Returns what part of the text the next output action should work on.""" return self.components.nextOutputActionMode.stringSelection def insertFile(self, path): """Given a filename this method opens it, and add's it to the main text box.""" try: file = open(path, "r") except IOError, e: self.status("Can't open file (%s) for inserting: " % e) return 0 data = file.read() file.close() actionStr = self.updateTextBox(data) self.status("File '%s' %s." % (path, actionStr)) return 1 def getOutputText(self): """Returns the current output text according to the current output mode.""" mode = self.getOutputActionMode() if mode == "all": return self.components.area1.text elif mode == "selection": # cursel = self.components.area1.getSelection() return self.components.area1.getStringSelection() #text[cursel[0]:cursel[1]] def getSubjectText(self): """Returns the subject text.""" return self.components.area2.text def updateSubject(self, subject): """Updates the subject box.""" self.components.area2.text = subject def updateTextBox(self, newText, mode = ""): """Takes a new piece of text, and adds it to the text box according to the current action mode.""" if mode == "": mode = self.getInputActionMode() ## open new, overwriting existing text in main textbox. if mode == "replace": self.components.area1.text = newText actionStr = "loaded" ## apend elif mode == "append": self.components.area1.text = self.components.area1.text + newText actionStr = "appended" ## insert elif mode == "insert": sel = self.components.area1.getSelection() pos = self.components.area1.getInsertionPoint() #if wx.Platform == "__WXMSW__": #str = self.components.area1.text[0:pos] #pos = pos - str.count('\n') if sel[0] != sel[1]: # this make's it act like "normal". like when you paste in a selection. self.components.area1.replaceSelection("") self.components.area1.text = self.components.area1.text[0:pos] + \ newText + \ self.components.area1.text[pos:] actionStr = "inserted" return(actionStr) def updateTextBoxFromClipboard(self): """Updates the text box from clipboard, taking in to account the current input mode. Needed because for the clipboard so we can use .paste() and not mess with wxTheClipboard.""" mode = self.getInputActionMode() if mode == "replace": self.components.area1.text = "" self.components.area1.paste() elif mode == "append": curpos = self.components.area1.getInsertionPoint() cursel = self.components.area1.getSelection() self.components.area1.setInsertionPoint(self.components.area1.getLastPosition()) self.components.area1.setSelection(self.components.area1.getLastPosition(), \ self.components.area1.getLastPosition()) self.components.area1.paste() wx.Yield() # needed because the above statement seems to happen after the two below sometimes self.components.area1.setInsertionPoint(curpos) self.components.area1.setSelection(cursel[0], cursel[1]) elif mode == "insert": self.components.area1.paste() def status(self, txt): """Sets the status bar text to given argument""" self.statusBar.text = txt wx.Yield() #self.components.statusLine.text = txt def showWaitMsg(self, txt): """Sets the status bar text to given argument""" #self.components.statusLine.text = txt #wx.Yield() self.status(txt) def loadInStrings(self, stringsFile = "strings.txt"): """Loads in the strings (prompts, help messages) from the strings file.""" try: self.strs = util.readAndEvalFile(stringsFile) except IOError, e: result = dialog.messageDialog(self, \ "Error: The strings file containing the user prompts and messages could not be found.\nThis file is needed to run the program. Please find the file and restart", "Strings File Error", wx.ICON_ERROR | wx.OK) sys.exit(1) def loadInConfig(self, configFile = "textRouter.conf"): """Loads in a config file, and sets the Manila site account settings accordingly""" msg = "Loading: Config file loaded." self.status(msg) try: configuration = util.readAndEvalFile(configFile) except IOError, e: self.status("Error loading config file: %s" % e) return # load's up the general preferences self.loadInPrefsSet(configuration, "generalPrefs", "generalPreferences") # load's up the html preferences self.loadInPrefsSet(configuration, "htmlPrefs", "htmlPreferences") # load's up the email preferences self.loadInPrefsSet(configuration, "emailPrefs", "emailPreferences") # load's up the manila preferences self.loadInPrefsSet(configuration, "manilaPrefs", "manilaPreferences") # load's up the blogger preferences self.loadInPrefsSet(configuration, "bloggerPrefs", "bloggerPreferences") # load's up the blogger preferences self.loadInPrefsSet(configuration, "utilitiesPrefs", "utilitiesPreferences") # load's up the state settings (last input/output action, last load/save filenames) if "stateSettings" in configuration: for aKey in configuration["stateSettings"].keys(): self.stateSettings[aKey] = configuration["stateSettings"][aKey] self.loadInStateSettings() # load's up the predefined email recipients if "emailRecipients" in configuration: self.emailRcpts = configuration["emailRecipients"] # load's up the filters if "filters" in configuration: self.filters = configuration["filters"] # sets the manila settings via the setter method if "manilaAccounts" in configuration: for manilaAccountPrefs in configuration["manilaAccounts"]: # these are specifically checked for, because they were later additions, and so by doing # this we didn't break the config file for people who were already using it. weblogFile = ("weblogOPML" in manilaAccountPrefs and \ [ manilaAccountPrefs["weblogOPML"] ] or \ [ "" ])[0] usePostedL = ("usePostedLine" in manilaAccountPrefs and \ [ manilaAccountPrefs["usePostedLine"] ] or \ [ "No" ])[0] postedLine = ("postedLine" in manilaAccountPrefs and \ [ manilaAccountPrefs["postedLine"] ] or \ [ "posted at %I:%M %p" ])[0] if self.generalPrefs["useProxy"] == "Yes": proxy = self.generalPrefs["proxyServer"] + ":" + str(self.generalPrefs["proxyPort"]) else: proxy = "" self.theManilaAccounts.append(ManilaAccount(proxy)) self.theManilaAccounts[-1].setPrefs(manilaAccountPrefs["siteurl"], \ manilaAccountPrefs["rpcserver"], \ manilaAccountPrefs["username"], \ manilaAccountPrefs["password"], \ weblogFile, \ usePostedL, \ postedLine ) # sets the blogger settings via the setter method, and then setups the active blog. if "bloggerAccounts" in configuration: for bloggerAccountPrefs in configuration["bloggerAccounts"]: if "weblogsPing" in bloggerAccountPrefs: weblogsPing = bloggerAccountPrefs["weblogsPing"] else: weblogsPing = "Yes" #if self.generalPrefs["useProxy"] == 'Yes': # print "using proxy" # self.theBloggerAccounts.append(BloggerAccount("yes")) #else: # print "not using proxy" if self.generalPrefs["useProxy"] == "Yes": proxy = self.generalPrefs["proxyServer"] + ":" + str(self.generalPrefs["proxyPort"]) else: proxy = "" self.theBloggerAccounts.append(BloggerAccount(proxy)) self.theBloggerAccounts[-1].setPrefs(bloggerAccountPrefs["rpcserver"], \ bloggerAccountPrefs["username"], \ bloggerAccountPrefs["password"], \ weblogsPing) # can't use setActiveBlog because we haven't logged in yet. arg. self.theBloggerAccounts[-1].prefs["activeBlog"] = int(bloggerAccountPrefs["activeBlog"]) ## -- now do the actual auto login for Blogger if self.bloggerPrefs["bloggerAutoLogin"] == 'Yes': if "theCurrentBloggerAccount" not in self.stateSettings or \ self.stateSettings["theCurrentBloggerAccount"] == -1: msg += " Can't login to Blogger because you have no accounts defined." else: self.status(msg + " Logging in to Blogger...") self.theBloggerAccounts[self.theCurrentBloggerAccount].bloggerLogin() if self.theBloggerAccounts[self.theCurrentBloggerAccount].anErrorOccured(): msg += " Error logging in to Blogger." else: msg += " Blogger login OK." self.status(msg) ## -- now do the actual auto login for Manila if self.manilaPrefs["manilaAutoLogin"] == 'Yes': if self.theCurrentManilaAccount != -1: self.theManilaAccounts[self.theCurrentManilaAccount].manilaLogin() if self.theManilaAccounts[self.theCurrentManilaAccount].anErrorOccured(): msg += " Error logging in to Manila." else: msg += " Manila login OK." self.status(msg) # now get homepage, if we thats also in the prefs if self.manilaPrefs["manilaAutoGetHomepage"] == 'Yes': self.theManilaAccounts[self.theCurrentManilaAccount].manilaGetHP() if self.theManilaAccounts[self.theCurrentManilaAccount].anErrorOccured(): msg += " Error getting homepage." else: self.updateTextBox(self.theManilaAccounts[self.theCurrentManilaAccount].currentHPContent["body"]) msg += " Homepage downloaded successfully." self.status(msg) def loadInPrefsSet(self, configuration, nameSet, nameSetConfig): # load's up the blogger preferences if nameSetConfig in configuration: for aKey in configuration[nameSetConfig].keys(): getattr(self, nameSet)[aKey] = configuration[nameSetConfig][aKey] def loadInShortcuts(self): """Load's in the shortcuts.""" try: self.shortcuts.loadShortcutsFile(self.utilitiesPrefs["shortcutsFile"]) except IOError, e: self.status("Error loading shortcuts: %s" % e) #self.shortcuts.printShortcuts() def saveShortcuts(self): """Save's the shortcuts.""" try: self.shortcuts.saveShortcutsFile(self.utilitiesPrefs["shortcutsFile"]) except IOError, e: self.status("Error saving shortcuts: %s" % e) def saveText(self, path): """ """ try: textFile = open(path, "w") except IOError, e: self.status("Can't open file (%s) for writing: " % e) return 0 textFile.write(self.getOutputText()) if len(self.components.area1.text) > 0 and self.components.area1.text[-1] != "\n": textFile.write("\n") textFile.close() self.status("Text saved to file '%s'." % path) return 1 def saveConfig(self, configFile = "textRouter.conf"): """Saves a config file.""" try: cfile = open(configFile, "w") except IOError, e: self.status("Can't open file: %s" % e) return cfile.write("{\n") self.writePrefsSet(cfile, "generalPreferences", self.generalPrefs) self.writePrefsSet(cfile, "htmlPreferences", self.htmlPrefs) self.collectStateSettings() self.writePrefsSet(cfile, "stateSettings", self.stateSettings) self.writePrefsSet(cfile, "emailPreferences", self.emailPrefs) self.writePrefsSet(cfile, "emailRecipients", self.emailRcpts, 2) self.writePrefsSet(cfile, "filters", self.filters, 2) self.writePrefsSet(cfile, "manilaPreferences", self.manilaPrefs) self.writePrefsSet(cfile, "bloggerPreferences", self.bloggerPrefs) self.writePrefsSet(cfile, "utilitiesPreferences", self.utilitiesPrefs) theManilaAccountPrefs = [ site.prefs for site in self.theManilaAccounts ] self.writePrefsSet(cfile, "manilaAccounts", theManilaAccountPrefs, 2) theBloggerAccountPrefs = [ site.prefs for site in self.theBloggerAccounts ] self.writePrefsSet(cfile, "bloggerAccounts", theBloggerAccountPrefs) cfile.write("}\n") cfile.close() self.status("Config file saved.") def writePrefsSet(self, configFile, setName, prefs, type = 1): pp = pprint.PrettyPrinter(indent=4) configFile.write(" '%s' : \n" % (setName)) configFile.write(pp.pformat(prefs)) configFile.write(",\n") def loadInStateSettings(self): """Loads the state settings from the dictionary read in from the config file""" if "inputActionMode" in self.stateSettings: self.components.nextInputActionMode.stringSelection = self.stateSettings["inputActionMode"] if "outputActionMode" in self.stateSettings: self.components.nextOutputActionMode.stringSelection = self.stateSettings["outputActionMode"] if "theCurrentManilaAccount" in self.stateSettings: self.theCurrentManilaAccount = self.stateSettings["theCurrentManilaAccount"] if "theCurrentBloggerAccount" in self.stateSettings: self.theCurrentBloggerAccount = self.stateSettings["theCurrentBloggerAccount"] def collectStateSettings(self): """Collects all the state settings in to 'self.stateSettings' ready for saving to the config file.""" # some things, like the default load/save files don't need to be collected or loadedIn because # they are stored directly in the stateSettings dictionary, thats why they are not here. self.stateSettings["inputActionMode"] = self.components.nextInputActionMode.stringSelection self.stateSettings["outputActionMode"] = self.components.nextOutputActionMode.stringSelection self.stateSettings["theCurrentManilaAccount"] = self.theCurrentManilaAccount self.stateSettings["theCurrentBloggerAccount"] = self.theCurrentBloggerAccount # startup if __name__ == '__main__': app = model.Application(TextRouter) app.MainLoop() PythonCard-0.8.2/samples/textRouter/textRouter.rsrc.py0000644000076500007650000004753710130317157023070 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'GuiPyBlog', 'backgrounds': [ {'type':'Background', 'name':'bgTextRouter', 'title':'TextRouter 0.60', 'size':(650, 426), 'statusBar':1, 'icon':'tr.ico', 'style':['resizeable'], 'menubar': {'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ {'type':'MenuItem', 'name':'menuFileLoad', 'label':'&Open', }, {'type':'MenuItem', 'name':'menuFileLoadFrom', 'label':'Op&en...', }, {'type':'MenuItem', 'name':'menuFileSave', 'label':'&Save', }, {'type':'MenuItem', 'name':'menuFileSaveAs', 'label':'Save &As...', }, {'type':'MenuItem', 'name':'editSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuFileLoadConfig', 'label':'&Load Config...', }, {'type':'MenuItem', 'name':'menuFileSaveConfig', 'label':'S&ave Config', }, {'type':'MenuItem', 'name':'menuFileSaveConfigAs', 'label':'Sa&ve Config As...', }, {'type':'MenuItem', 'name':'editSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuFilePreferences', 'label':'&Preferences...', }, {'type':'MenuItem', 'name':'editSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tCtrl+Q', 'command':'exit', }, ] }, {'type':'Menu', 'name':'Edit', 'label':'&Edit', 'items': [ {'type':'MenuItem', 'name':'menuEditUndo', 'label':'&Undo\tCtrl+Z', }, {'type':'MenuItem', 'name':'menuEditRedo', 'label':'&Redo\tCtrl+Y', }, {'type':'MenuItem', 'name':'editSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditCut', 'label':'Cu&t\tCtrl+X', }, {'type':'MenuItem', 'name':'menuEditCopy', 'label':'&Copy\tCtrl+C', }, {'type':'MenuItem', 'name':'menuEditPaste', 'label':'&Paste\tCtrl+V', }, { 'type':'MenuItem', 'name':'editSep2', 'label':'-' }, { 'type':'MenuItem', 'name':'menuEditFind', 'label':'&Find...\tCtrl+F', 'command':'doEditFind'}, { 'type':'MenuItem', 'name':'menuEditFindNext', 'label':'&Find Next\tF3', 'command':'doEditFindNext'}, {'type':'MenuItem', 'name':'editSep3', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditRemoveNewlines', 'label':'Remove &Newlines', }, {'type':'MenuItem', 'name':'menuEditWrapText', 'label':'&Wrap Text', }, {'type':'MenuItem', 'name':'editSep4', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditClear', 'label':'Cle&ar\tDel', }, {'type':'MenuItem', 'name':'menuEditSelectAll', 'label':'Select A&ll\tCtrl+A', }, ] }, {'type':'Menu', 'name':'HTML', 'label':'F&ormat', 'items': [ {'type':'MenuItem', 'name':'menuHtmlBold', 'label':'&Bold\tCtrl+B', 'command':'menuHtmlMake', }, {'type':'MenuItem', 'name':'menuHtmlItalic', 'label':'&Italic\tCtrl+I', 'command':'menuHtmlMake', }, {'type':'MenuItem', 'name':'menuHtmlCenter', 'label':'&Center', }, {'type':'MenuItem', 'name':'menuHtmlCode', 'label':'C&ode', 'command':'menuHtmlMake', }, {'type':'MenuItem', 'name':'menuHtmlBlockquote', 'label':'Block"e', 'command':'menuHtmlMake', }, {'type':'MenuItem', 'name':'htmlSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuHtmlAddLink', 'label':'&Add Link...\tCtrl+L', 'command':'menuHtmlAddLink', }, {'type':'MenuItem', 'name':'htmlSep2', 'label':'-', }, {'type':'MenuItem', 'name':'menuHtmlStripHTML', 'label':'&Strip HTML\tCtrl+G', }, {'type':'MenuItem', 'name':'htmlSep2', 'label':'-', }, {'type':'MenuItem', 'name':'menuHtmlPreferences', 'label':'Preferences...', }, ] }, {'type':'Menu', 'name':'menuRouteTo', 'label':'&Route Text To...', 'items': [ {'type':'MenuItem', 'name':'menuRouteToBlogger', 'label':'&Blogger\tCtrl+W', }, {'type':'MenuItem', 'name':'menuRouteToManila', 'label':'&Manila\tCtrl+E', }, {'type':'MenuItem', 'name':'editSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuRouteToEmailPredefined', 'label':'&Predefined Email...\tCtrl+R', }, {'type':'MenuItem', 'name':'menuRouteToEmail', 'label':'&New Email...\tCtrl+T', }, # {'type':'MenuItem', # 'name':'editSep1', # 'label':'-', # }, # {'type':'MenuItem', # 'name':'menuRouteToRSS', # 'label':'RSS File...\tAlt-R', # }, ] }, {'type':'Menu', 'name':'menuManila', 'label':'&Manila', 'items': [ {'type':'MenuItem', 'name':'menuManilaLogin', 'label':'&Login', }, {'type':'MenuItem', 'name':'menuManilaFlipHomepage', 'label':'&Flip Homepage...', }, {'type':'MenuItem', 'name':'editSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuManilaAddToHP', 'label':'&Add To Homepage', }, {'type':'MenuItem', 'name':'editSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuManilaGetHP', 'label':'&Get Current Homepage', }, {'type':'MenuItem', 'name':'menuManilaSetAsHP', 'label':'&Set As Homepage', }, {'type':'MenuItem', 'name':'menuManilaSetHPFromOPML', 'label':'Set &Homepage From OPML', }, {'type':'MenuItem', 'name':'editSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuManilaGetStoryList', 'label':'Get Story Lis&t', }, {'type':'MenuItem', 'name':'menuManilaDownloadStory', 'label':'&Download Story...', }, {'type':'MenuItem', 'name':'menuManilaUploadStory', 'label':'&Upload Story...', }, {'type':'MenuItem', 'name':'menuManilaPostNewStory', 'label':'Post As &New Story', }, {'type':'MenuItem', 'name':'menuManilaSetStoryAsHP', 'label':'S&et Story As Homepage', }, {'type':'MenuItem', 'name':'editSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuManilaUploadPicture', 'label':'Upload &Image...', }, {'type':'MenuItem', 'name':'editSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuManilaJumpTo', 'label':'&Jump To URL...', }, {'type':'MenuItem', 'name':'editSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuManilaChooseActiveAccount', 'label':'Choose Active Account...', }, {'type':'MenuItem', 'name':'menuManilaNewAccount', 'label':'New Account...', }, {'type':'MenuItem', 'name':'menuManilaEditAccount', 'label':'Edit Account...', }, {'type':'MenuItem', 'name':'menuManilaRemoveAccount', 'label':'Remove Account...', }, {'type':'MenuItem', 'name':'editSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuManilaPreferences', 'label':'&Preferences...', }, ] }, {'type':'Menu', 'name':'menuBlogger', 'label':'&Blogger', 'items': [ {'type':'MenuItem', 'name':'menuBloggerLogin', 'label':'&Login', }, {'type':'MenuItem', 'name':'menuBloggerChooseBlog', 'label':'&Choose Blog...', }, {'type':'MenuItem', 'name':'editSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuBloggerFetchPosts', 'label':'&Fetch Previous Posts', }, {'type':'MenuItem', 'name':'menuBloggerInsertPrevPost', 'label':'&Insert Previous Post...', }, {'type':'MenuItem', 'name':'menuBloggerGetPost', 'label':'Ge&t Post By ID...', }, {'type':'MenuItem', 'name':'menuBloggerUpdatePost', 'label':'&Update Post', }, {'type':'MenuItem', 'name':'menuBloggerDeletePost', 'label':'&Delete Post...', }, {'type':'MenuItem', 'name':'editSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuBloggerGetTemplate', 'label':'&Get Template...', }, {'type':'MenuItem', 'name':'menuBloggerSetTemplate', 'label':'&Set Template...', }, {'type':'MenuItem', 'name':'editSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuBloggerJumpTo', 'label':'&Jump To Blog...', }, {'type':'MenuItem', 'name':'editSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuBloggerChooseActiveAccount', 'label':'Choose Active Account...', }, {'type':'MenuItem', 'name':'menuBloggerNewAccount', 'label':'New Account...', }, {'type':'MenuItem', 'name':'menuBloggerEditAccount', 'label':'Edit Account...', }, {'type':'MenuItem', 'name':'menuBloggerRemoveAccount', 'label':'Remove Account...', }, {'type':'MenuItem', 'name':'editSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuBloggerPreferences', 'label':'&Preferences...', }, ] }, {'type':'Menu', 'name':'menuEmail', 'label':'Emai&l', 'items': [ {'type':'MenuItem', 'name':'menuEmailNewEmailRcpt', 'label':'New Email Recipient', }, {'type':'MenuItem', 'name':'menuEmailRemoveEmailRcpt', 'label':'Remove Recipient', }, {'type':'MenuItem', 'name':'editSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuEmailPreferences', 'label':'&Preferences...', }, # {'type':'MenuItem', # 'name':'editSep1', # 'label':'-', # }, # {'type':'MenuItem', # 'name':'menuSettingsRSS', # 'label':'RSS Files...', # }, ] }, {'type':'Menu', 'name':'menuUtilities', 'label':'&Utilities', 'items': [ {'type':'MenuItem', 'name':'menuUtilitiesExternalEditor', 'label':'&External Editor', }, {'type':'MenuItem', 'name':'menuUtilitiesTextScroller', 'label':'&Text Auto-Scroller', }, {'type':'MenuItem', 'name':'menuUtilitiesApplyFilter', 'label':'&Apply Filter', }, {'type':'MenuItem', 'name':'editSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuUtilitiesNewFilter', 'label':'&New Filter', }, {'type':'MenuItem', 'name':'menuUtilitiesRemoveFilter', 'label':'&Remove Filter', }, {'type':'MenuItem', 'name':'editSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuUtilitiesNewShortcut', 'label':'New &Shortcut', }, {'type':'MenuItem', 'name':'menuUtilitiesRemoveShortcut', 'label':'Remove S&hortcut', }, {'type':'MenuItem', 'name':'editSep1', 'label':'-', }, # {'type':'MenuItem', # 'name':'menuUtilitiesLoadShortcuts', # 'label':'&Load Shortcuts...', # }, # {'type':'MenuItem', # 'name':'menuUtilitiesSaveShortcuts', # 'label':'Sa&ve Shortcuts...', # }, # {'type':'MenuItem', # 'name':'editSep1', # 'label':'-', # }, {'type':'MenuItem', 'name':'menuUtilitiesPreferences', 'label':'&Preferences...', }, ] }, {'type':'Menu', 'name':'menuHelp', 'label':'&Help', 'items': [ {'type':'MenuItem', 'name':'menuHelpHelp', 'label':'&Help (loads browser)', }, {'type':'MenuItem', 'name':'menuHelpReadme', 'label':'&README (loads browser)', }, {'type':'MenuItem', 'name':'editSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuHelpAbout', 'label':'&About TextRouter...', }, ] }, ] }, 'components': [ {'type':'StaticText', 'name':'lblSubject', 'position':(0, 0), 'size':(80, -1), 'text':'Title/Subject:', }, {'type':'TextField', 'name':'area2', 'position':(100, 0), 'size':(530, 22), }, {'type':'TextArea', 'name':'area1', 'position':(0, 40), 'size':(640, 300), }, {'type':'Button', 'name':'buttonClearIt', 'position':(1, 303), 'size':(120, -1), 'label':'Clear It', }, {'type':'Button', 'name':'buttonClipIt', 'position':(1, 327), 'size':(120, -1), 'label':'Get Clipboard Text', }, {'type':'RadioGroup', 'name':'nextInputActionMode', 'position':(131, 303), #'size':(240, -1), 'label':'Input Action:', 'layout':'horizontal', 'items':['inserts', 'appends', 'replaces'], 'stringSelection':'inserts', 'toolTip':'Controls how the next text input action (from file, clipboard, remote server) works.' }, {'type':'RadioGroup', 'name':'nextOutputActionMode', 'position':(380, 303), #'size':(160, -1), 'label':'Output Action Works On:', 'layout':'horizontal', 'items':['all', 'selection'], 'stringSelection':'all', 'toolTip':'Controls how the next text output action (to file, blogger, manila, email) works.' }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/samples/textRouter/tr.ico0000644000076500007650000000427607377014123020501 0ustar alexalex00000000000000 ¨( @€ÿÿÿÝÝØØÕÕÒÒÏÏDDDËËããááÈÈÄÄ¿¿»»··³³°°­­ªª¯¯…+*–––-,‘‘‘–-,ŒŒŒŸ/.ˆˆˆ‹‹¥/.ƒƒƒˆˆ§§­0/~~~££³10yyy  ››––¹21sss¿32nnnÆ43Ë43jjjÐ54eee×64```Þ64[[[å64UUUí64NNNÿ64ÿPR777}ƒŠŽ“˜›¡§ª­³ºÀÄÈÌÐÕÙßåéòöüÿ€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿ,,,999EEERRR___lllxxx………’’’ŸŸŸ«««¸¸¸ÅÅÅÒÒÒÞÞÞëëëøøøðûÿ¤  ÀÜÀðʦ>]|›ºÙð$$ÿHHÿllÿÿ´´ÿ>](|2›<ºFÙUð$mÿH…ÿlÿµÿ´Íÿ*>?]T|i›~º“Ùªð$¶ÿHÂÿlÎÿÚÿ´æÿ>>]]||››ººÙÙðð$ÿÿHÿÿlÿÿÿÿ´ÿÿ>*]?|T›iº~Ù“ðª$ÿ¶HÿÂlÿÎÿÚ´ÿæ>]|(›2º<ÙFðU$ÿmHÿ…lÿÿµ´ÿÍ>]|›ºÙð$ÿ$HÿHlÿlÿ´ÿ´>](|2›<ºFÙUðmÿ$…ÿHÿlµÿÍÿ´*>?]T|i›~º“Ùªð¶ÿ$ÂÿHÎÿlÚÿæÿ´>>]]||››ººÙÙððÿÿ$ÿÿHÿÿlÿÿÿÿ´>*]?|T›iº~Ù“ðª@AACDEFGHIJKLMNOPQRSTUV[WXYZ@ABCDEFGHIJKLMNOPQRSTUVVWXYZ>>?>>?====;;<;;<99:99:7787785565563343334"1121112*+0000000000000/&)*+............../#&)*+,,-,,-#&''("''(#$$%"$$% !" !       PythonCard-0.8.2/samples/textRouter/tr.xpm0000644000076500007650000000715007400737432020527 0ustar alexalex00000000000000/* XPM */ static char * unknown[] = { "32 32 91 2", " s None c None", ".. c #0000d5", "#. c #00008e", "a. c #5b5b5b", "b. c #2f30ad", "c. c #aa00aa", "d. c #838383", "e. c #0000c8", "f. c #00008a", "g. c #c200c2", "h. c #2e2fa5", "i. c #2c2d90", "j. c #000093", "k. c #d200d2", "l. c #3334c6", "m. c #0000c4", "n. c #00007d", "o. c #3436ed", "p. c #8b008b", "q. c #3436d7", "r. c #8c8c8c", "s. c #3436ff", "t. c #9b009b", "u. c #0000df", "v. c #000098", "w. c #a300a3", "x. c #0000c0", "y. c #6a6a6a", "z. c #a700a7", "A. c #0000a1", "B. c #3334cb", "C. c #b300b3", "D. c #af00af", "E. c #7e7e7e", "F. c #0000aa", "G. c #b700b7", "H. c #373737", "I. c #bb00bb", "J. c #0000b3", "K. c #bf00bf", "L. c #3436e5", "M. c #cb00cb", "N. c #2a2b85", "O. c #cf00cf", "P. c #4e4e4e", "Q. c #880088", "R. c #0000f6", "S. c #900090", "T. c #737373", "U. c #e300e3", "V. c #2c2d96", "W. c #3233bf", "X. c #0000ff", "Y. c #3031b3", "Z. c #a000a0", "0. c #0000e9", "1. c #000083", "2. c #656565", "3. c #0000f2", "4. c #3435d0", "5. c #b000b0", "6. c #797979", "7. c #0000e5", "8. c #c400c4", "9. c #5250ff", ".# c #c800c8", "## c #0000ee", "a# c #0000a7", "b# c #d800d8", "c# c #6e6e6e", "d# c #2e2f9f", "e# c #606060", "f# c #969696", "g# c #ad00ad", "h# c #0000fc", "i# c #3436de", "j# c #888888", "k# c #0000d0", "l# c #555555", "m# c #0000d9", "n# c #444444", "o# c #d500d5", "p# c #0000ba", "q# c #00009b", "r# c #dd00dd", "s# c #e100e1", "t# c #0000cc", "u# c #960096", "v# c #0000ad", "w# c #919191", "x# c #3132b9", " ", " r#b#o#k.O.n# ", " b#o#k.O.n# ", " o#k.O.n# ", " k.O.M. ", " U.s#r#b#o#k.O.M..#8.g.K.I.G.C.5.g#c.D. ", " s#r#b#o#k.O.M..#8.g.K.I.G.C.5.g#c.D. ", " r#b#o#k.O.M..#8.g.K.I.G.C.5.g#c.D. ", " 8.g.K.n# ", " g.K.I.n# ", " K.I.G.n# N.N.N.N.N.N.N.N.N.N.N.N.f# ", " I.G.C.n# i.i.i.i.i.i.i.i.i.i.i.i.i.i.w# ", " G.C.5.n# V.V.r. V.V.r. ", " C.5.g#n# d#d#j# S.p.n# d#d#j# ", " 5.g#c.n# h.h.d.S.p.Q.n# h.h.d. ", " g#c.z.n# b.b.E.p.Q.n# b.b.E. ", " c.z.w.n# Y.Y.6.Q.n# Y.Y.6. ", " z.w.Z.t.u# x#x#T.n# x#x#T. ", " w.Z.t.u#S. W.W.W.W.W.W.W.W.W.W.W.W.W.W.c# ", " t.u#S.p. l.l.l.l.l.l.l.l.l.l.l.l.l.c# ", " S.p.Q. B.B.y. B.B.B.y. ", " 4.4.2. 4.4.4.2. ", " q.q.e# q.q.e# ", " i#i#a. i#i#a. ", " L.L.l# L.L.l# ", " o.o.P. o.o.P. ", " s.s.n# s.s.n# ", " 9.9.H. 9.9.H. ", " ", " n.1.f.#.j.v.q#A.a#F.v#J.p#x.m.e.t#k#..m#u.7.0.0.3.R.h#X. ", " n.1.1.#.j.v.q#A.a#F.v#J.p#x.m.e.t#k#..m#u.7.0.##3.R.h#X. ", " "};PythonCard-0.8.2/samples/textRouter/trDragDrop.py0000644000076500007650000000242710037024475021774 0ustar alexalex00000000000000import wx class trURLDropTarget(wx.PyDropTarget): def __init__(self, trWindow): wx.PyDropTarget.__init__(self) self.trWin = trWindow self.data = wx.URLDataObject(); self.SetDataObject(self.data) def OnDragOver(self, x, y, d): return wx.DragLink def OnData(self, x, y, d): if not self.GetData(): return wx.DragNone text = self.data.GetURL() if text.count("\n") == 0 and text.find("://") != -1: text = "" self.trWin.updateTextBox(text, "insert") return d class trTextDropTarget(wx.PyDropTarget): def __init__(self, trWindow): wx.PyDropTarget.__init__(self) self.do = wx.TextDataObject() self.SetDataObject(self.do) self.trWin = trWindow def OnEnter(self, x, y, d): #print "OnEnter: %d, %d, %d" % (x, y, d) return wx.DragCopy #def OnLeave(self): #print "OnLeave" def OnDrop(self, x, y): #print "OnDrop: %d %d" % (x, y) return true def OnData(self, x, y, d): #print "OnData: %d, %d, %d" % (x, y, d) self.GetData() #print "%s" % self.do.GetText() self.trWin.updateTextBox(self.do.GetText()) return d PythonCard-0.8.2/samples/textRouter/trTransport.py0000644000076500007650000000242407427324615022273 0ustar alexalex00000000000000# eventually this will do the proxy stuff, when I can get it to work. the # exmaple proxy code at the bottom was found on the net somewhere, but it # seems to only work intermitentaly. # arg. import xmlrpclib class trURLlibTransport(xmlrpclib.Transport): # client identifier (may be overridden) user_agent = "textRouter/0.58" def __init__(self, proxy=""): self.proxy = proxy def request(self, host, handler, request_body, verbose=0): # issue XML-RPC request if self.proxy != "": h = self.make_connection(self.proxy) else: h = self.make_connection(host) if verbose: h.set_debuglevel(1) if self.proxy != "": self.send_request(h, "http://" + host + handler, request_body) else: self.send_request(h, handler, request_body) self.send_host(h, host) self.send_user_agent(h) self.send_content(h, request_body) errcode, errmsg, headers = h.getreply() if errcode != 200: raise xmlrpclib.ProtocolError( host + handler, errcode, errmsg, headers ) self.verbose = verbose return self.parse_response(h.getfile()) PythonCard-0.8.2/samples/textRouter/wordwrap.py0000644000076500007650000000206307603106520021562 0ustar alexalex00000000000000#!/usr/bin/env python # # word_wrap.py # # this was originally based on some code I found on the net, but I # couldn't get that to work so I just wrote it afresh. """ __version__ = "$Revision: 1.4 $" __date__ = "$Date: 2002/12/27 17:26:40 $" """ def wrap_string(str, max, para = "\n\n"): paras = str.split(para) outStr = "" for paragraph in paras: paragraph = paragraph.replace("\n", " ") words = paragraph.split() outLine = "" lineCount = wordCount = 0 for i in range(len(words)): if (len(outLine) + len(words[i])) > max: if lineCount: outStr += "\n" outStr += outLine outLine = words[i] lineCount += 1 wordCount = 1 else: if wordCount: outLine += " " outLine += words[i] wordCount += 1 if lineCount: outStr += "\n" outStr += outLine outStr += para return outStr PythonCard-0.8.2/samples/tictactoe/0000755000076500007650000000000010434046772017144 5ustar alexalex00000000000000PythonCard-0.8.2/samples/tictactoe/empty.gif0000644000076500007650000000170407333604012020762 0ustar alexalex00000000000000GIF87add÷€€€€€€€€€ÀÀÀÀÜÀ¦Êð@ ` €   À à @ @@@`@€@ @À@à@` `@```€` `À`à`€ €@€`€€€ €À€à€   @ ` €   À à À À@À`À€À ÀÀÀàÀà à@à`à€à àÀààà@ @@@`@€@ @À@à@ @ @@ @` @€ @  @À @à @@@ @@@@@`@@€@@ @@À@@à@@`@ `@@`@``@€`@ `@À`@à`@€@ €@@€@`€@€€@ €@À€@à€@ @  @@ @` @€ @  @À @à @À@ À@@À@`À@€À@ À@ÀÀ@àÀ@à@ à@@à@`à@€à@ à@Àà@àà@€ €@€`€€€ €À€à€ € €@ €` €€ €  €À €à €@€ @€@@€`@€€@€ @€À@€à@€`€ `€@`€``€€`€ `€À`€à`€€€ €€@€€`€€€€€ €€À€€à€€ €  €@ €` €€ €  €À €à €À€ À€@À€`À€€À€ À€ÀÀ€àÀ€à€ à€@à€`à€€à€ à€Àà€àà€À À@À`À€À ÀÀÀàÀ À À@ À` À€ À  ÀÀ Àà À@À @À@@À`@À€@À @ÀÀ@Àà@À`À `À@`À``À€`À `ÀÀ`Àà`À€À €À@€À`€À€€À €ÀÀ€Àà€À À  À@ À` À€ À  ÀÀ Àà ÀÀÀ ÀÀ@ÀÀ`ÀÀ€ÀÀ ÀÀÿûð  ¤€€€ÿÿÿÿÿÿÿÿÿÿÿÿ!ù,dd¡ÿ H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»xóêÝË·¯ß¿€ L¸°áÈ+^ÌXp@;PythonCard-0.8.2/samples/tictactoe/lines.jpg0000644000076500007650000001713707333604012020760 0ustar alexalex00000000000000ÿØÿàJFIF,,ÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀÂ"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?÷ú(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¨®na³¶’ââEŽÆY›µ4›v@KEV±¿µÔ­…ÅœË,D•ÈÈÁˆ<гC‹‹³ÜŠ(¤EPEPEPEPEPEFËYÓõå‚Òé%’/¼£=3ŒQî2:zÕ(ɦÒÑzŠ(©¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¬?È«{ÿÿÐÖ·+Æò*ÞÿÀ?ô5­ð¿Ç‡ªüÅ-Š>ÿ ÿõòßú ×U\¯€?ä?ý|·þ‚µÕV˜ï÷‰úŠ;Q\…Q@Q@Q@Q@Q@yÇ€?ä=?ý{7þ„µèõçÿôÿõìßú×£„ÿw­è¿R%º=Š(¯8°¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¬?È«{ÿÿÐÖ·+Æò*ÞÿÀ?ô5­ð¿Ç‡ªüÅ-Š>ÿ ÿõòßú ×U\¯€?ä?ý|·þ‚µÕV˜ï÷‰úŠ;Q\…Q@Q@Q@Q@Q@yÇ€?ä=?ý{7þ„µèõçÿôÿõìßú×£„ÿw­è¿R%º=Š(¯8°¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¬?È«{ÿÿÐÖ·+Æò*ÞÿÀ?ô5­ð¿Ç‡ªüÅ-Š>ÿ ÿõòßú ×U\¯€?ä?ý|·þ‚µÕV˜ï÷‰úŠ;Q\…Q@Q@Q@Q@Q@yÇ€?ä=?ý{7þ„µèõçÿôÿõìßú×£„ÿw­è¿R%º=Š(¯8°¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¬?È«{ÿÿÐÖ·+Æò*ÞÿÀ?ô5­ð¿Ç‡ªüÅ-Š>ÿ ÿõòßú ×U\¯€?ä?ý|·þ‚µÕV˜ï÷‰úŠ;Q\…Q@Q@Q@Q@Q@yÇ€?ä=?ý{7þ„µèõçÿôÿõìßú×£„ÿw­è¿R%º=Š(¯8°¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¬?È«{ÿÿÐÖ·+Æò*ÞÿÀ?ô5­ð¿Ç‡ªüÅ-Š>ÿ ÿõòßú ×U\¯€?ä?ý|·þ‚µÕV˜ï÷‰úŠ;Q\…Q@Q@Q@Q@Q@yÇ€?ä=?ý{7þ„µèõçÿôÿõìßú×£„ÿw­è¿R%º=Š(¯8°¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¬?È«{ÿÿÐÖ·+Æò*ÞÿÀ?ô5­ð¿Ç‡ªüÅ-Š>ÿ ÿõòßú ×U\¯€?ä?ý|·þ‚µÕV˜ï÷‰úŠ;Q\…Q@Q@Q@Q@Q@yÇ€?ä=?ý{7þ„µèõçÿôÿõìßú×£„ÿw­è¿R%º=Š(¯8°¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¬?È«{ÿÿÐÖ·+Æò*ÞÿÀ?ô5­ð¿Ç‡ªüÅ-Š>ÿ ÿõòßú ×U\¯€?ä?ý|·þ‚µÕV˜ï÷‰úŠ;Q\…Q@Q@Q@Q@Q@yÇ€?ä=?ý{7þ„µèõçÿôÿõìßú×£„ÿw­è¿R%º=Š(¯8°¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(®Å:Þ¹ºZÜ$~SÉ!![#ƒÆyNçñè(­)U•)©Çt&¯¡çð€j¿óñeÿ}·ÿGü ¯üüYßmÿÄ×£Ñ]ßÚ¸Žëî'‘qÿ«ÿ?_÷Ûñ4ªÿÏÅ—ýößüMz=jâ;¯¸9çð€j¿óñeÿ}·ÿGü ¯üüYßmÿÄ×£ÑGö®#ºûƒ‘qÿ«ÿ?_÷Ûñ4ªÿÏÅ—ýößüMz=jâ;¯¸9çð€j¿óñeÿ}·ÿGü ¯üüYßmÿÄ×£ÑGö®#ºûƒ‘qÿ«ÿ?_÷Ûñ4ªÿÏÅ—ýößüMz=jâ;¯¸9çð€j¿óñeÿ}·ÿUu/j^Ÿ-äó[4qã!‰äÝG­zaøÃþE[ßøþ†µ¥ ʼêÆ.Ömt‚±Âhþ½Ö­æÚ[tEÆDŒÀä{ëZð€j¿óñeÿ}·ÿ[¾ÿ ÿõòßú ×UWŠÌkÓ­(FÖA&8ÿ„UÿŸ‹/ûí¿øš?áÕçâËþûoþ&½ŠÃûWÝ}ÃäGœÂªÿÏÅ—ýößüMð€j¿óñeÿ}·ÿ^EÚ¸ŽëîDyÇü ¯üüYßmÿÄÑÿ«ÿ?_÷Ûñ5èôQý«ˆî¾àäGœÂªÿÏÅ—ýößüMð€j¿óñeÿ}·ÿ^EÚ¸ŽëîDyÇü ¯üüYßmÿÄÑÿ«ÿ?_÷Ûñ5èôQý«ˆî¾àäGœÂªÿÏÅ—ýößüMð€j¿óñeÿ}·ÿ^EÚ¸ŽëîDyÇü ¯üüYßmÿÄÖ.£ÜkWomlñ#¬fBd$ `}kØkÎ<ÿ!éÿëÙ¿ô%®Ì>:´èÔœ·­ø’â“Aÿ«ÿ?_÷Ûñ4ªÿÏÅ—ýößüMz=Çý«ˆî¾â¹çð€j¿óñeÿ}·ÿGü ¯üüYßmÿÄ×£ÑGö®#ºûƒ‘qÿ«ÿ?_÷Ûñ4ªÿÏÅ—ýößüMz=jâ;¯¸9çð€j¿óñeÿ}·ÿGü ¯üüYßmÿÄ×£ÑGö®#ºûƒ‘qÿ«ÿ?_÷Ûñ4ªÿÏÅ—ýößüMz=jâ;¯¸9çð€j¿óñeÿ}·ÿGü ¯üüYßmÿÄ×£ÑGö®#ºûƒ‘qÿ«ÿ?_÷Ûñ5½áo ^è—sÍss$‘…ÄX‚sœœÓ·Ôþ=M\½X8JÖ~CPH(¢Šá((¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+Æò*ÞÿÀ?ô5­ÊÃñ‡üŠ·¿ðý k|/ñáê¿1Kb€?ä?ý|·þ‚µÕW+àùÏÿ_-ÿ ­uU¦;ýâ~¢ŽÁEW!AEPEPEPEPEP^qàùOÿ^Íÿ¡-z=yÇ€?ä=?ý{7þ„µèá?Ýëz/Ô‰nG¢Š+Î,(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+Æò*ÞÿÀ?ô5­ÊÃñ‡üŠ·¿ðý k|/ñáê¿1Kb€?ä?ý|·þ‚µÕW+àùÏÿ_-ÿ ­uU¦;ýâ~¢ŽÁEW!AEPEPEPEPEP^qàùOÿ^Íÿ¡-z=yÇ€?ä=?ý{7þ„µèá?Ýëz/Ô‰nG¢Š+Î,(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+Æò*ÞÿÀ?ô5­ÊÃñ‡üŠ·¿ðý k|/ñáê¿1Kb€?ä?ý|·þ‚µÕW+àùÏÿ_-ÿ ­uU¦;ýâ~¢ŽÁEW!AEPEPEPEPEP^qàùOÿ^Íÿ¡-z=yÇ€?ä=?ý{7þ„µèá?Ýëz/Ô‰nG¢Š+Î,(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+Æò*ÞÿÀ?ô5­ÊÃñ‡üŠ·¿ðý k|/ñáê¿1Kb€?ä?ý|·þ‚µÕW+àùÏÿ_-ÿ ­uU¦;ýâ~¢ŽÁEW!AEPEPEPEPEP^qàùOÿ^Íÿ¡-z=yÇ€?ä=?ý{7þ„µèá?Ýëz/Ô‰nG¢Š+Î,(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+Æò*ÞÿÀ?ô5­ÊÃñ‡üŠ·¿ðý k|/ñáê¿1Kb€?ä?ý|·þ‚µÕW+àùÏÿ_-ÿ ­uU¦;ýâ~¢ŽÁEW!AEPEPEPEPEP^qàùOÿ^Íÿ¡-z=yÇ€?ä=?ý{7þ„µèá?Ýëz/Ô‰nG¢Š+Î,(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+Æò*ÞÿÀ?ô5­ÊÃñ‡üŠ·¿ðý k|/ñáê¿1Kb€?ä?ý|·þ‚µÕW+àùÏÿ_-ÿ ­uU¦;ýâ~¢ŽÁEW!AEPEPEPEPEP^qàùOÿ^Íÿ¡-z=yÇ€?ä=?ý{7þ„µèá?Ýëz/Ô‰nG¢Š+Î,(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¹ÿèWzäékp‘ùLK$„…lŽä};ŸÇJPŒæ£'eÜLè(¯8ÿ„UÿŸ‹/ûí¿øš?áÕçâËþûoþ&»¾§‡ÿŸËîÿ‚O3ìz=çð€j¿óñeÿ}·ÿGü ¯üüYßmÿÄÑõ§‡ÿŸËîÿ‚ϱèôWœÂªÿÏÅ—ýößüMð€j¿óñeÿ}·ÿGÔðÿóù}ßðC™ö=Šóø@5_ùø²ÿ¾Ûÿ‰£þ Wþ~,¿ï¶ÿâhúžþ/»þs>Ç£Ñ^qÿ«ÿ?_÷Ûñ4ªÿÏÅ—ýößüMSÃÿÏå÷ÁgØôzÃñ‡üŠ·¿ðý k”ÿ„UÿŸ‹/ûí¿øš«©xCPÒôùo'šÙ£ÌO$ê=kJZ«ª¦îºÁ“¶ÇOàùÏÿ_-ÿ ­uUå?†/u«G¹¶–Ýd1‘#09ÀúÖ‡ü ¯üüYßmÿÄÕâ°Ô%ZR•TŸkÁ·mG¢¼ãþ Wþ~,¿ï¶ÿâhÿ„UÿŸ‹/ûí¿øšÃêxùü¾ïø#æ}G¢¼ãþ Wþ~,¿ï¶ÿâhÿ„UÿŸ‹/ûí¿øš>§‡ÿŸËîÿ‚ϱèôWœÂªÿÏÅ—ýößüMð€j¿óñeÿ}·ÿGÔðÿóù}ßðC™ö=Šóø@5_ùø²ÿ¾Ûÿ‰£þ Wþ~,¿ï¶ÿâhúžþ/»þs>Ç£Ñ^qÿ«ÿ?_÷Ûñ4ªÿÏÅ—ýößüMSÃÿÏå÷ÁgØôz+Î?áÕçâËþûoþ&ø@5_ùø²ÿ¾Ûÿ‰£êxùü¾ïø!Ìû^qàùOÿ^Íÿ¡-ð€j¿óñeÿ}·ÿXº>q­]½µ³Äޱ™ 0õ®Ì>ŒhÔŒj];]ÛmüÉmÝh{ çð€j¿óñeÿ}·ÿGü ¯üüYßmÿÄ×Ôðÿóù}ßðJæ}G¢¼ãþ Wþ~,¿ï¶ÿâhÿ„UÿŸ‹/ûí¿øš>§‡ÿŸËîÿ‚ϱèôWœÂªÿÏÅ—ýößüMð€j¿óñeÿ}·ÿGÔðÿóù}ßðC™ö=Šóø@5_ùø²ÿ¾Ûÿ‰£þ Wþ~,¿ï¶ÿâhúžþ/»þs>Ç£Ñ^qÿ«ÿ?_÷Ûñ4ªÿÏÅ—ýößüMSÃÿÏå÷ÁgØôz+Î?áÕçâËþûoþ&ø@5_ùø²ÿ¾Ûÿ‰£êxùü¾ïø!ÌûEyÇü ¯üüYßmÿÄÖ÷…¼5{¢]Ï5ÍÌL’FGb ÎrrNßSøçW BrTßkÁo±ÔÑEÂPQEQEQEQEQEQEQEQEVŒ?äU½ÿ€èk[•‡ãùoàúÖø_ãÃÕ~b–ÅÈúùoýkª®WÀòŸþ¾[ÿAZê«LwûÄýE‚Š(®B‚Š( Š( Š( Š( Š( ¼ãÀòŸþ½›ÿBZôzóÈzúöoý kÑ»Öô_©ÝEWœXQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEVŒ?äU½ÿ€èk[•‡ãùoàúÖø_ãÃÕ~b–ÅÈúùoýkª®WÀòŸþ¾[ÿAZê«LwûÄýE‚Š(®B‚Š( Š( Š( Š( Š( ¼ãÀòŸþ½›ÿBZôzóÈzúöoý kÑ»Öô_©ÝEWœXQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEVŒ?äU½ÿ€èk[•‡ãùoàúÖø_ãÃÕ~b–ÅÈúùoýkª®WÀòŸþ¾[ÿAZê«LwûÄýE‚Š(®B‚Š( Š( Š( Š( Š( ¼ãÀòŸþ½›ÿBZôzóÈzúöoý kÑ»Öô_©ÝEWœXQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEVŒ?äU½ÿ€èk[•‡ãùoàúÖø_ãÃÕ~b–ÅÈúùoýkª®WÀòŸþ¾[ÿAZê«LwûÄýE‚Š(®B‚Š( Š( Š( Š( Š( ¼ãÀòŸþ½›ÿBZôzóÈzúöoý kÑ»Öô_©ÝEWœXQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEVŒ?äU½ÿ€èk[•‡ãùoàúÖø_ãÃÕ~b–ÅÈúùoýkª®WÀòŸþ¾[ÿAZê«LwûÄýE‚Š(®B‚Š( Š( Š( Š( Š( ¼ãÀòŸþ½›ÿBZôzóÈzúöoý kÑ»Öô_©ÝEWœXQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEVŒ?äU½ÿ€èk[•‡ãùoàúÖø_ãÃÕ~b–ÅÈúùoýkª®WÀòŸþ¾[ÿAZê«LwûÄýE‚Š(®B‚Š( Š( Š( Š( Š( ¼ãÀòŸþ½›ÿBZôzóÈzúöoý kÑ»Öô_©ÝEWœXQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEVŒ?äU½ÿ€èk[•‘â{i¯<9y ¼m$¤)½NÀÛ Ò­û¯ÌOc3ÀòŸþ¾[ÿAZꫜðU•Í–‰"Ý@ð»ÎΪãQÓ¨äèëLkO6»Š;Q\¥Q@Q@Q@Q@Q@yÇ€?ä=?ý{7þ„µèõÂø+I¿±Ö®dº´–XLeœ`Ü:ý#ÌW¡…’Xzɾ‹õ"[£º¢Š+Ï,(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÿÙPythonCard-0.8.2/samples/tictactoe/lrggumby.gif0000644000076500007650000000614007424557463021475 0ustar alexalex00000000000000GIF87add÷€€€€€€€€€ÀÀÀÀÜÀ¦Êð@ ` €   À à @ @@@`@€@ @À@à@` `@```€` `À`à`€ €@€`€€€ €À€à€   @ ` €   À à À À@À`À€À ÀÀÀàÀà à@à`à€à àÀààà@ @@@`@€@ @À@à@ @ @@ @` @€ @  @À @à @@@ @@@@@`@@€@@ @@À@@à@@`@ `@@`@``@€`@ `@À`@à`@€@ €@@€@`€@€€@ €@À€@à€@ @  @@ @` @€ @  @À @à @À@ À@@À@`À@€À@ À@ÀÀ@àÀ@à@ à@@à@`à@€à@ à@Àà@àà@€ €@€`€€€ €À€à€ € €@ €` €€ €  €À €à €@€ @€@@€`@€€@€ @€À@€à@€`€ `€@`€``€€`€ `€À`€à`€€€ €€@€€`€€€€€ €€À€€à€€ €  €@ €` €€ €  €À €à €À€ À€@À€`À€€À€ À€ÀÀ€àÀ€à€ à€@à€`à€€à€ à€Àà€àà€À À@À`À€À ÀÀÀàÀ À À@ À` À€ À  ÀÀ Àà À@À @À@@À`@À€@À @ÀÀ@Àà@À`À `À@`À``À€`À `ÀÀ`Àà`À€À €À@€À`€À€€À €ÀÀ€Àà€À À  À@ À` À€ À  ÀÀ Àà ÀÀÀ ÀÀ@ÀÀ`ÀÀ€ÀÀ ÀÀÿûð  ¤€€€ÿÿÿÿÿÿÿÿÿÿÿÿ!ù,ddÿÿ H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ£=ö^Æü73¦Í™oâ| “&‚2{Ú¤Y'Iž4yêÔIThÒ§Dc–º74jR1æDjRç¥7sþ»wàiЬ÷´ÎD€õ%Ömk-iï«M»Yí!(Ë©V{ã.- 7&)¼6܃Zõè¿÷¨þ ,ø€”-¶$‘’y‹%BkÉ,…‹Þºu¿"ÖÙ ,W‘/9‘šò¯m#GN`*À·¼LâyïaÓ‰]ëm]8¬ã{IH%™YêöÞÔXÝqR2å·‚ßw´ÿuu p»‚oB¾žüd’$¥Pµ'…ìm›îÜÝ+U ¸‚T,pÓm•B…+TpQ jé±EVdq}åž|¥(ñÕ÷´rÛ;lÝVÊ¥, ],ÐÅ;¦hÊ-¦˜òNLï(@V4êu)œì‡Zb]iÀôfO[¸âN^€øÎ Tñ…§T!b¯PÁ€¯Üòâ+ ˜‚Û]åmÀ9få Vtýo¤"¤¥ç¡](ÐÀ_œò…^eXfùÎ+¦ÈèŠz”"EhJèèÊ-oÑuOhßM!…¤lÚ˜ÕA¦À%zaÅxöYÅ)§xñÅ+¯œ"è¯Xÿ‡À\t·&¤W ·ôz ]n~Çp¡ñ–V’÷¸S!2P_4ÐW¾¢*ª·°úʦÄJ_hR,º™¤ ÛE¶·üBW)KP›ðÓK D t²€¨VðÉpž¼RAg¸š%«¥˜â¡Í$—*0E·½¾B×§Ì.ñ£)5Ù¦ X T°p'_Y°¶Ù.Љ+À5öO°T˜Áj¯3Ñbð€Rš~§ÀÈVTÁÀÉB+@Afœ²ò+uNœY0Ùó›gÜükIìë…U(`ZQ1QÚõÈ MiÈ]°Šê+1Š©ÔkŠ®IPq*Ÿ ÿ±Nñ.ÀDîÆ»öMgk ‹nRµAf}ð;&Ma"”gÈÕP¼Q*"Ò(û•¿ßbPU=Å©Z¿ÒCÚ…-›ËïLˆØö;¼ón µPºúŽeóºnmgy‹„S¥¦êz½QDáßVh«ý ¯œ±2\ÔTÕïÔ¬5šGÙÞݿrèA¥$±I®£;éêÛ­jeÛUÓï`‘ÁnA;×}$&%’«Œâ0rÝ£\zËþZÅ=mu«6«±ï´×:z$& 0ê$÷¢šÐd ›ˆ ™-ƒiË…oãÝWÒrWÀ­bèzE[èbÄeÍ…¯` †ÿn“(f}áiâ-N£)”"€;Xç’ºìëÙâ N8Ꮆ€ MÊÖ$DáÕ†=­€‹”—¿WüBfU,EP5AB•P/dÁ å=ì]8Ñí°ú*‹q¡ ¨Ð-"ì.É ‚ªP#¶‰§ã—"Ä6JqŠ< ò‰*SÌ$QxÙ‹åº`=¹Ê’¥äjê‚&{̦ž„aów„Œ ´ Oêq%I èŸðô¤¯u?ƒÜ¡=¤öÌRdëŽ(± &Ð¥±ê}ö¸fdó0 Ê,Y¿Ùéݤx4yG­Ê̵Ä&ý‘Ú\ÿ•QÌG/ªüO“š40ž)H5m¹PÀÒ’ª1e H®¢©}j íZÀîõNë0¯¡Uˆh—{€FhÜ)EBÕ3/VÄ–@Ï} ™¬™ ÆAZqiEÜTŸ·t.8R*oºž¦è4"1‰˜làÒ °• õ åQR—q)àRäBÏ;à Hàª-*RI©)La ^•€È@ÄôÜè«dÈ•dÄŠÔ-Hl à#¶`©»J€ xåB\%ÀV[ s¥ëCÀWð96¯xmì&àØ-´Â¶pE+ iTÅ.$3´RøvE†R”Ö±eàO)lA@̺bW9õ,CÜ®Àÿ‚è±¢S)RÛ Ö¢ëµ˜‘­Cާ€-àh´¥(ø¦P†gÒ³ òÕn¹ÐŠÎ ÷ ÷(._C»+þ 6N¯uEto!Þ]qb—×ÍÉgÌÊÞ]åªV´zm).;ÞGi–RMïÌì¥%h°`¯cË…ñöJ³­±®~R¯$W mÓ;ßV´‚º¾%¯iUšºES¼Ù 'FÌW¾þÅ—½G}³dZçx¸'nÚÔf g©áh¾NyÑ÷â‚t®X?–áâµÏøêµ‰ìqO€Ì¨Vx&4|YԦě-ñJ¯Ã/¶Úš@$ö«,ÿ2¥€ÙʾOÉ9™¸È"^bù¬ÿ.kÚhBSàt ކ)È låËÐvòèAè%âyÁá²^û˜Ò$¿!ƒ-Mh{Ü¢ .îqL4µ&ÆILÈ‚^6E†èþâÒeÎ¡ó¬æ³úgS¨ëp\Ahèb/h¶Š^õ®à𤠣Â!_”\‹%ÆÄR€QâC©) 1Æ>H½˜ wÊ$ÙÿÁt±£-{K¼«Ê4Ç”<\sÛ=\À©NaJ¹ÀLy¿HO´“õY°Ýµ‘Ë ½ê, ä˜ Ø ÔÊð1Én¦³6z=5§ ¦¤ûܼè OÕýβƒ×2åÝd‹ŽIw”_†ÿcä(ÿ¦ò`öcàX´7 Ö4OæŸ ´MÇ™1Üõ:q¤s7…¬¡Å|e«‰-˜¦<·R¼ƒ¼2¸]Eu+Xä¾+Ï› Rþ´¥Á¢ךVæwž‹RzýÆD+ÒRŒÖVgòZÛäÖ ÊI‘çŠ ¾ãv|&o·ÞŸÄ—Þ1Ü^õ¹ˆ¼C)¹X_Ãd{‡Doô¦„ÀH•Šî:A¶ËÛ=V-@çþµW╌f{P@,ÉlnDËDS c–‰€iCåuËô›R'¸@¸}.œ®?3x'Xõµˆ¼¯€ž•o#&FíªVÔ͸bƒD)*t≮Ðg)Üñ%œXfm÷’“=B¯Ëqê\b]ü[Oþm+‰½ÖíŠþˆÁçÎñ1° Ù][xìáô(Ç* åPåsX€x€˜€ ¸;PythonCard-0.8.2/samples/tictactoe/readme.txt0000644000076500007650000000530107414437117021142 0ustar alexalex00000000000000tictactoe shows off using a background image, the ImageButton widget and background handlers. Francois Granger sent the email below which you can adapt to the tictactoe sample if you want a better computer opponent than Mr. Gumby. -----Original Message----- From: Francois Granger [mailto:fgranger@altern.org] Sent: Tuesday, January 01, 2002 1:50 PM To: Kevin Altis Subject: TicTacToe You published a TicTacToe game developped with PythonCard recently with some questions about a winning algorythm. Since I worked on the same subject for some time, I got a working brute force one. It needs cleaning. See below. seq is the previous sequence of turns in the form [(i, j), (i, j), ...] turn is the current turn numbered from 0 ====================================== class ComputerAnal(Player): """ The computer analyse the board """ def move(self, seq, turn, warn = ""): """ Analytical seek for solution seq is a sequence of tuples representing previous moves. return a tuple i, j representing the next move. """ prompt = warn + "Player " + str(self.token) + " : " print prompt if turn == 0: i,j = 1,1 elif turn == 1 and seq[0] != (1,1): i,j = 1,1 elif turn == 1: i, j = 0,0 else: b = [[0,0,0],[0,0,0],[0,0,0]] x = 0 for move in seq: i, j = move if x == self.play: b[i][j] = 1 else: b[i][j] = -1 x = not x row = [0,0,0] col = [0,0,0] diag =[0,0] """ find any line where there are two similar tokens and third is empty. first for me so I play and win then for the other so I play and he can't win other wise at random. """ for i in range(3): row[i] = b[i][0] + b[i][1] + b[i][2] for j in range(3): col[j] = b[0][j] + b[1][j] + b[2][j] diag[0] = b[0][0] + b[1][1] + b[2][2] diag[1] = b[0][2] + b[1][1] + b[2][0] pass if diag[0] == 2: for i in range(3): if not b[i][i]: return i,i if diag[1] == 2: for i in range(3): if not b[i][2-i]: return i,2-i for i in range(3): if row[i] == 2: for j in range(3): if not b[i][j]: return i,j for j in range(3): if col[j] == 2: for i in range(3): if not b[i][j]: return i,j if diag[0] == -2: for i in range(3): if not b[i][i]: return i,i if diag[1] == -2: for i in range(3): if not b[i][2-i]: return i,2-i for i in range(3): if row[i] == -2: for j in range(3): if not b[i][j]: return i,j for j in range(3): if col[j] == -2: for i in range(3): if not b[i][j]: return i,j pass i,j = rand.randint(0, 2), rand.randint(0, 2) print i,j return i, j ====================================== PythonCard-0.8.2/samples/tictactoe/sillywalk.gif0000644000076500007650000000357207424557463021666 0ustar alexalex00000000000000GIF87add÷€€€€€€€€€ÀÀÀÀÜÀ¦Êð@ ` €   À à @ @@@`@€@ @À@à@` `@```€` `À`à`€ €@€`€€€ €À€à€   @ ` €   À à À À@À`À€À ÀÀÀàÀà à@à`à€à àÀààà@ @@@`@€@ @À@à@ @ @@ @` @€ @  @À @à @@@ @@@@@`@@€@@ @@À@@à@@`@ `@@`@``@€`@ `@À`@à`@€@ €@@€@`€@€€@ €@À€@à€@ @  @@ @` @€ @  @À @à @À@ À@@À@`À@€À@ À@ÀÀ@àÀ@à@ à@@à@`à@€à@ à@Àà@àà@€ €@€`€€€ €À€à€ € €@ €` €€ €  €À €à €@€ @€@@€`@€€@€ @€À@€à@€`€ `€@`€``€€`€ `€À`€à`€€€ €€@€€`€€€€€ €€À€€à€€ €  €@ €` €€ €  €À €à €À€ À€@À€`À€€À€ À€ÀÀ€àÀ€à€ à€@à€`à€€à€ à€Àà€àà€À À@À`À€À ÀÀÀàÀ À À@ À` À€ À  ÀÀ Àà À@À @À@@À`@À€@À @ÀÀ@Àà@À`À `À@`À``À€`À `ÀÀ`Àà`À€À €À@€À`€À€€À €ÀÀ€Àà€À À  À@ À` À€ À  ÀÀ Àà ÀÀÀ ÀÀ@ÀÀ`ÀÀ€ÀÀ ÀÀÿûð  ¤€€€ÿÿÿÿÿÿÿÿÿÿÿÿ!ù,ddÿÿ H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç )Ú;p©{öBªÄhS0anZIs¢=)1_ÂL’²¦Ï†¤vîLòeÏŸH  “hL[Ž&ZŠ©U˜ ² 5µ«À{W¯j•âuê—IpBm¥3ë²?oÂ,c”Sö+nH{÷”’r‹Ó{®À”òrË[¿5íM¹ÕŠÔ-W®lK4ÉiÞ}Ù‚g™:PªohŽ˜o•ruÙÞÕ«HýÚ#bÌ­¦$Iý-Óǽ9"pÅE”’O‡v€<¹FRRH¥Äi<§U)®­Wÿ5…xp¢¡ŠGµ%„^ µ¥U$†V—Zs¢¹Û?KyWæ&g\ž‘hcŽdƤ]‰Ü Xäb¢Ó=H –\vž¸)¼ dbXeFW$ñ­d[+Rõ'˜ç)ÿjB©Ýɤ©Ò…êÓYÙÕ8œ@nùèB‹JJꉸ7•;;MAJZm–yáCC–Z§™ùuõ¢€÷°IÑg+®“²Ø`æV E°–jªqæzu€õ‘’*Dì‘;逈z(|,Ũï™Â%®·!p'¹Óõë}Êf4*ÆìWIàFdc}¸:åp‹ µ;0Šƒ¬ÐÄ—Y²ÉúÈ1‘ñ²¼PˆÔÙ’2LJ`*sCö'\¡9Ù›ñÎ.Z¥€=öT¶ÉK²¢64ÑUuä‹\°¥rüÝÓÔ'§SLÁEz÷l±ÉêÌõAD^+zjhQk#ä&RЛnŠÙÖÿýáÂ[úñ ;PythonCard-0.8.2/samples/tictactoe/tictactoe.py0000644000076500007650000001671110106741250021470 0ustar alexalex00000000000000#!/usr/bin/python """ KEA notes to myself Created: 2001-07-29 __version__ = "$Revision: 1.22 $" __date__ = "$Date: 2004/08/12 19:19:04 $" __author__ = "Kevin Altis " It's a little too early to do a Tetris clone, so here's a Tic Tac Toe game complete with a computer opponent that has no strategy (he's Mr. Gumby after all). Not bad for an afternoon of work, including the image touchups. There could very well be bugs in the "logic" since I could only play so many games of Tic Tac Toe before going insane, so feel free to test away. The main point of this exercise is to test the framework. """ import time import random from PythonCard import graphic, model class Tic(model.Background) : def on_initialize(self, event): self.computerImage = 'lrggumby.gif' self.computer = -5 self.human = 5 self.draw = 0 self.humanImage = 'sillywalk.gif' self.emptyImage = 'empty.gif' self.playfieldButtons = [] for i in range(8): self.playfieldButtons.append(self.components['btn' + str(i + 1)]) self.clearBoard() def setButtonImage(self, btnName, image): button = self.components[btnName] button.bitmap = graphic.Bitmap(image) #print 'setButtonImage', btnName, image def clearBoard(self): self.board = [0,0,0, 0,0,0, 0,0,0] for i in range(9): name = 'btn' + str(i) self.setButtonImage(name, self.emptyImage) chk = self.components.chkComputerFirst if chk.checked: self.computerFirst = 1 else: self.computerFirst= 0 self.turn = 0 self.gameOverFlag = 0 wStaticTurn = self.components.staticTurn if self.computerFirst: self.doComputerMove() wStaticTurn.text = 'Your Turn' # the computer could be "smart" but that would be boring # since every game would be a draw or the human would # have to be really "slow" # games are more fun this way # also this way I'll get email from overly helpful computer science majors # telling me how to do the computer logic for tic-tac-toe ;-) def getRandomMove(self): legalMoves = [] for i in range(9): if self.board[i] == 0: legalMoves.append(i) #print 'legal moves:', legalMoves return random.choice(legalMoves) def threeInARow(self): # the winning combos # yes, there is a clever way of calculating these # but it is left as an exercise for the reader combos =[ [0,1,2], [3,4,5], [6,7,8], [0,3,6], [1,4,7], [2,5,8], [0,4,8],[2,4,6] ] winner = 0 for combo in combos: #print combo # I bet there is a clever map or lambda I could use here?! total = self.board[combo[0]] + self.board[combo[1]] + self.board[combo[2]] if total == self.computer * 3 or total == self.human * 3: winner = total break return winner def gameOver(self): """ returns a tuple showing whether the game is over (0 or 1) and who won (computer, human, draw) if the game isn't over, then the 2nd item is None """ # a game is is over when one player gets 3 in a row # or there are no empty squares left on the board # but you knew that... winner = self.threeInARow() #print "winner", winner if winner == 0: if 0 in self.board: return (0, None) else: # no winner and no board positions open, so must be a draw return (0, self.draw) else: # somebody won return (1, winner) def legalMove(self, btnName): if self.gameOverFlag: return 0 pos = int(btnName[3]) # 0,1,2,3,4,5,6,7,8 if self.board[pos] == 0: return 1 def displayGameOverMessage(self, winner): # game is over self.gameOverFlag = 1 #print "game over", gameOverMan wStaticTurn = self.components.staticTurn wStaticTurn.text = "Game Over" #print "displayGameOverMessage winner", winner if winner[1] == self.computer * 3: strWinner = "Mr. Gumby is the winner!" elif winner[1] == self.human * 3: strWinner = "You Won!" else: strWinner = "It's a draw." wStaticTurn.text = strWinner #dlg = dialog.messageDialog(self, strWinner, "Game Over", wx.ICON_EXCLAMATION | wx.OK) # this is automatically called at the end of a human move # or at the beginning of a new game if the computer goes first # so we can do most of the game logic here def doComputerMove(self): # first check to see if the human won on the last move or the game is a draw winner = self.gameOver() if winner[0] or winner[1] == self.draw: self.displayGameOverMessage(winner) else: # if not, then the computer does a move move = self.getRandomMove() # print move self.board[move] = self.computer self.setButtonImage('btn' + str(move), self.computerImage) # check to see if the computer just won or the game is a draw winner = self.gameOver() if winner[0] or winner[1] == self.draw: self.displayGameOverMessage(winner) # you'll notice all the button scripts are exactly the same # so now that messages are passed up the hierarchy, only a # single background mouseClick handler # is required. I left the on_btn0_mouseClick to show off # that we're binding correctly, that handler isn't actually # required def isPlayfieldButton(self, button): # only the playfield uses ImageButton, so this is safe #if isinstance(button, registry.Registry.getInstance().getComponentClass('ImageButton')): if button in self.playfieldButtons: return 1 else: return 0 def on_mouseUp(self, event): # make sure that we only handle a mouseClick for # the ImageButtons on the playfield if self.isPlayfieldButton(event.target): btnName = event.target.name print "bg1 mouseUp handler", btnName pos = int(btnName[3]) #print event.target.getName(), 'clicked' if self.legalMove(btnName): self.board[pos] = self.human self.setButtonImage(btnName, self.humanImage) self.doComputerMove() else: print "illegal move" # play a beep or do some other warning, a dialog would be too much else: event.skip() def on_btn0_mouseUp(self, event): btnName = event.target.name print "btn0 mouseUp handler", btnName pos = int(btnName[3]) #print event.target.getName(), 'clicked' if self.legalMove(btnName): self.board[pos] = self.human self.setButtonImage(btnName, self.humanImage) self.doComputerMove() else: print "illegal move" # play a beep or do some other warning, a dialog would be too much def on_btnNewGame_mouseClick(self, event): self.clearBoard() if __name__ == '__main__': app = model.Application(Tic) app.MainLoop() PythonCard-0.8.2/samples/tictactoe/tictactoe.rsrc.py0000644000076500007650000000406110110221632022423 0ustar alexalex00000000000000# Changes - 7/25/01 - RDS # -Added 'label' item to Menu and MenuItem definitions. # -StaticText.label => StaticText.text # { 'application':{ 'type':'Application', 'name':'TicTacToe', 'backgrounds': [ { 'type':'Background', 'name':'bg1', 'title':'Tic Tac Toe', 'size':( 390, 470 ), 'image':'lines.jpg', 'menubar': { 'type':'MenuBar', 'menus': [ { 'type':'Menu', 'name':'mnuFile', 'label':'&File', 'items': [ { 'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit', 'command':'exit' } ] } ] }, 'components': [ { 'type':'CheckBox', 'name':'chkComputerFirst', 'position':( 20, 380 ), 'label':'Mr. Gumby goes first', 'checked':0, 'backgroundColor':'white' }, { 'type':'Button', 'name':'btnNewGame', 'position':( 280, 380 ), 'label':'New Game' }, #{ 'type':'Button', 'name':'btnNewGame', 'position':( 5, 450 ), 'label':'New Game' }, { 'type':'StaticText', 'name':'staticTurn', 'position':( 100, 410 ), 'size':(200, -1), 'text': '', 'alignment':'center', 'backgroundColor':'white' }, { 'type':'Image', 'name':'btn0', 'position':( 20, 20 ), 'size':(-2,-2), 'file':'empty.gif'}, { 'type':'Image', 'name':'btn1', 'position':( 140, 20 ), 'size':(-2,-2), 'file':'empty.gif'}, { 'type':'Image', 'name':'btn2', 'position':( 260, 20 ), 'size':(-2,-2), 'file':'empty.gif'}, { 'type':'Image', 'name':'btn3', 'position':( 20, 140 ), 'size':(-2,-2), 'file':'empty.gif'}, { 'type':'Image', 'name':'btn4', 'position':( 140, 140 ), 'size':(-2,-2), 'file':'empty.gif'}, { 'type':'Image', 'name':'btn5', 'position':( 260, 140 ), 'size':(-2,-2), 'file':'empty.gif'}, { 'type':'Image', 'name':'btn6', 'position':( 20, 260 ), 'size':(-2,-2), 'file':'empty.gif'}, { 'type':'Image', 'name':'btn7', 'position':( 140, 260 ), 'size':(-2,-2), 'file':'empty.gif'}, { 'type':'Image', 'name':'btn8', 'position':( 260, 260 ), 'size':(-2,-2), 'file':'empty.gif'} ] } ] } } PythonCard-0.8.2/samples/turtle/0000755000076500007650000000000010434046772016504 5ustar alexalex00000000000000PythonCard-0.8.2/samples/turtle/docs/0000755000076500007650000000000010434046772017434 5ustar alexalex00000000000000PythonCard-0.8.2/samples/turtle/docs/bugs.txt0000644000076500007650000000150507333604331021131 0ustar alexalex00000000000000Known Bugs wxTurtle.py When the turtle is visible (showTurtle or st used), there are very noticeable gaps on the ends of the turtle with pen widths greater than 1. I have tried using a variety of CAP and JOIN styles, but I think the real problem comes from the INVERT source mode being used to draw the turtle onto the screen. INVERT mode is used to avoid messing up the underlying drawing. Unless there is a bug in wxPython that has to do with CAP and JOIN styles, this bug may not be fixable. When different colored turtles cross paths, the colored pixels underneath can be left in an incorrect state. This can be seen on the 4bugs.txt and pentests.txt scripts. I think this bug has to do with the copy mode (INVERT) and the fact that the turtles are not erased in the same order they are drawn, so again this bug may not be fixable.PythonCard-0.8.2/samples/turtle/docs/changes.txt0000644000076500007650000000741007437776315021623 0ustar alexalex00000000000000Change log 2002-03-01 removed methods such as fd() for forward and simply aliased them in the __init__ method of AbstractTurtle like this: self.fd = self.forward 2001-12-26 added ChaosScript1Fastest.txt to show of drawPointList() 2001-10-14 turtle sample revision to match new turtle.py module in framework removed aTurtle.py, wxTurtle.py, and wxTurtleChaos.py added ChaosScript1Direct.txt to show using the BitmapCanvas draw methods directly, removed ChaosScript2.txt modified various scripts to use autoRefresh = 0 to improve performance madness.txt slows down dramatically if autoRefresh = 1 but I left madness.txt as is for now 2001-08-30 add line method line(x1, y1, x2, y2) line doesn't impact the turtle position added statusBar to test_turtle window and elapsed drawing time is now displayed in the status bar 2001-08-08 added a TurtleDC class which saves the underlying panel size so that when the window is resized, the center point (home) for the turtle can be updated added doc strings to all methods in aTurtle.py and wxTurtle.py drawTurtle renamed to _drawTurtle degrees and radians renamed to _degrees and _radians removed PenUp, PenDown, up and down methods fixed scripts using these deprecated methods 2001-08-03 Spent a half hour "porting" it over to PythonCard. Bye bye tkinter version. 2001-06-15 Made additions and fixed some bugs in automata.txt. automata.txt which displays some one-dimensional binary cellular automata can now display R1 and R2 based rules, can be set to wrap, and Wolfram format rule patterns can be used, which simplifies trying rules that have already been discovered. 2001-06-14 I started changing method names to Python naming conventions so showTurtle instead of showturtle or ShowTurtle or SHOWTURTLE. I'm leaning towards using all lowercase for abbreviations, so the abbreviated form of showTurtle is st. I made some changes and additions to the documentation. I created a "FAQ.txt" file which is currently empty, a "bugs.txt" file for tracking bugs and a "file descriptions.txt" file that describes the modules, applications, and scripts contained in the current distribution and an "installation.txt" file. Those sections were removed from the "readme.txt" file. Added showTurtle (st), hideTurtle (ht), and the necessary logic and method (drawTurtle, turtleDelay) to support drawing the turtle and keeping it from erasing or corrupting the underlying image being drawn. This impacted the following methods: left, setHeading, color, width, _goto. plot is not impacted since it doesn't currently impact the turtle position or turtle heading (angle). Drawing with the turtle visible has not been extensively tested. turtleDelay was added so that drawing could be slowed down based on user preference; turtleDelay uses the time.sleep method, so fractions of a second such as .01 are acceptable. The added functionality to support showTurtle and hideTurtle has very little impact on overall drawing speed when the turtle is not visible. The tkTurtle support for drawing the turtle currently has the same functionality as Guido's turtle.py in the Python Standard Library. Drawing a separate turtle as in wxTurtle appears to eat too many resources, so until I figure out a fix, the old-style arrow while drawing will be used. Changed how the pen is handled in wxTurtle in order to support attributes other than color for each turtle pen. Added setBackColor (setbc), setPenColor (setpc), and width methods. 2001-06-13 Added madness.txt and generalPlot.txt scripts Fixed the invalid parameter list in the lineTo method in aTurtle.py. Added changes.txt, a change log to track changes between releases 2001-06-11 Posted the first public release to http://www.semi-retired.com/python/turtle/ Revision: $Revision: 1.8 $ Date: $Date: 2002/03/01 22:12:29 $ PythonCard-0.8.2/samples/turtle/docs/FAQ.txt0000644000076500007650000000160010035337427020576 0ustar alexalex00000000000000Frequently Asked Questions (FAQ) Revision: $Revision: 1.5 $ Date: $Date: 2004/04/08 21:07:35 $ Q: How do I control the turtle from the shell. A: You can do the simple example below and anything else you see in the scripts directory directly from the shell. >>> from PythonCard.turtle import BitmapTurtle >>> t = BitmapTurtle(bg.components.bufOff) >>> t.st() >>> t.color('blue') >>> t.fd(100) >>> for i in range(5): ... t.fd(50) ... t.rt(72) Note that the first part of this example is no longer necessary since the pycrustrc.py file automatically loads the first commands, so you can start experimenting at the "t.st()" line. Since the turtle library uses floating-point numbers and tests and conversions quite often, some "strange" behavior may crop up. I suggest reading: Floating Point Arithmetic: Issues and Limitations http://python.sourceforge.net/devel-docs/tut/node14.htmlPythonCard-0.8.2/samples/turtle/docs/file descriptions.txt0000644000076500007650000000074607430306235023605 0ustar alexalex00000000000000Revision: $Revision: 1.3 $ Date: $Date: 2002/02/06 20:05:49 $ Modules wxTurtleCurves.py Contains some standard curves such as dragon, c, and Hilbert. tWrapper.py Wrapper for wxTurtle to hide the underlying module used by a script. This is the module most scripts should use. wxTurtleCurves subclasses tWrapper, so whatever tWrapper subclasses will impact them as well. turtle.py A program for viewing the output of scripts that use the turtle library. PythonCard-0.8.2/samples/turtle/docs/logo commands.txt0000644000076500007650000001261207333604331022714 0ustar alexalex00000000000000Kevin Altis altis@semi-retired.com 2001-06-10 --- BYTE magazine November 1982 p. 282 - 288 I haven't found a comprehensive list of turtle graphic commands online yet, so any pointers would be appreciated. The problem with turtle graphic commands is that at least back in 1982, there wasn't a standard, so some names differed and in some cases the functionality differed as well between implementations. In addition, other turtle graphics libraries done for other languages expanded or created their own command variations. BACKGROUND - returns the color number of the current background. (SETBG) Also sets the background to a given color. BACKWARD (BACK, BK) - moves the turtle backward CLEAN - clears the screen, but doesn't move the turtle CLEARSCREEN (CLS, DRAW) - clears screen and initializes turtle COLOR - returns the color number of the sprite currently being talked to DOT - puts a dot at the indicated point on the turtle graphics screen FENCE (NOWRAP) - tells the turtle to draw without wraparound - gives error message if turtle tries to plot offscreen FORWARD (FD) - moves the turtle forward HEADING - returns the heading number of the active sprite or turtle HIDETURTLE (HT) - makes the triangular turtle shape disappear HOME - tells active turtle or sprite to go to the center of screen LEFT (LT) - turns the turtle or sprite left a given number of degrees PEN - returns values for pen type and color PENCOLOR - returns value of pen color. (SETPC) Also sets the current turtle pen color. PENDOWN (PD) - makes the turtle pen ready to draw a line PENERASE - makes the turtle pen ready to erase a line PENREVERSE - makes the turtle pen ready to reverse a line (draws if line isn't there, erases if it is; Terrapin/Krell Logo used PENCOLOR 6 to get the same effect) PENUP (PU) - makes the turtle pen inactive POS (WHERE) - returns the position of the turtle RIGHT (RT) - turns the turtle or sprite right a given number of degrees SETHEADING - gives the active sprite or turtle a given heading SETPEN - sets color and type of turtle pen SETPOS (SETXY, SXY) - moves the turtle to a new position SETX (SX), SETY (SY) - moves turtle to given x- or y-coordinate, other coordinate unchanged SHOWTURTLE (ST) - makes the triangular turtle shape appear TOWARDs - returns heading value turtle would have if it were pointing toward a given position TURTLESTATE - returns pen position, turtle status, background color, and pen color WINDOW - allows the turtle to plot offscreen (although the plotting can never be seen) WRAP - causes the turtle to appear on the opposite side of the screen if it attempts to go offscreen XCOR, YCOR - returns the x- or y-coordinate of the active sprite or turtle XVEL, YVEL - returns the x- or y-velocity of the active sprite Coordinate System Most turtle graphics systems put the point 0,0 at the center of the screen rather than the top left corner of the screen. In addition, most graphic displays attribute positive values to x and y as they go down and right across the screen, so the top-left corner would be (0,0) and the bottom-right point on a 640x480 pixel display might be (639, 479). On a typical Logo turtle graphics screen the top-left on a 640x480 display would be something like (-320, 240) and the bottom-right point would be (319, -239). The zero degrees (heading = 0) for a turtle is typically pointing right along the x-axis with positive values heading left and up towards the y-axis. Math The biggest issue to be aware of is that most Logo programs I've seen expect arguments to cos, sin, tan, etc. to be in degrees, rather than radians. If you're translating a Logo program and see something like sin(180 / n) then in Python that would become sin(pi / n). Nongraphics commands If you're translating a turtle graphics program from Logo, you'll likely run into nongraphics commands that will need to be translated into something equivelant in Python. Here are some of the more common commands you are likely to see, along with some example translations. CLEARTEXT - clears all text from screen and puts cursor at beginning of first text line COUNT - returns the number of elements in a list END - signals the end of a procedure LOCAL - declares a variable as local to the enclosing procedure without making it the argument of the procedure MAKE - assigns a name to a value RANDOM - generates a random number between 0 and n REPEAT - executes a list a given number of times STOP - stops a procedure Here's a typical recursive procedure, which I translated in the bytedesign.txt script. TO PENTL :SIDE :ANG IF :SIDE < 2 [STOP] FD :SIDE LT :ANG PENTL :SIDE - .38 :ANG END in Python using my turtle graphics library and pentl defined as a class method, this becomes: def pentl(self, side, ang): if side < 2: return self.fd(side) self.lt(ang) self.pentl(side - .38, ang) Note that instead of STOP we use return. Python doesn't require the END to signal the end of a function (method). Logo uses lists to get most of its work done, so a typical loop looks like: REPEAT 5 [FD 64.65 PD WHEEL POS PU BK 64.65 RT 72] which in Python becomes: for i in range(5): self.fd(64.65) self.pd() self.wheel(self.getXY()) self.pu() self.bk(64.65) self.rt(72) Note the use of getXY() instead of POS in the original Logo program. Local variables might look something like this: LOCAL "OLDH MAKE "OLDH HEADING in Python this becomes oldh = self.getHeading()PythonCard-0.8.2/samples/turtle/docs/notes.txt0000644000076500007650000001013507333604331021320 0ustar alexalex00000000000000Notes Revision: $Revision: 1.1 $ Date: $Date: 2001/08/06 21:15:05 $ Some Goals An abstract base module should be suitable for subclasses such that the subclasses can implement features suitable to a given output device: ascii, wxPython, tk, PostScript or some other non-bitmap format, external turtle robot most likely controlled via the serial port (Lego Mindstorms?). The robot could be used to draw large patterns. [Note that in some cases the underlying logic would have to change since in the case of a robot a plot(x, y) command would require an implicit: save pen state, save current x, y, penUp, goto x, y, penDown, do the plot, penUp, restore saved x, y, restore pen state, etc. or something like that.] The wxTurtle module should be suitable for use in applications other than the PythonCard sample. Guido's turtle.py seems difficult to use as a module in a different app, but maybe I just don't understand its use?! Support a fast turtle (current version) as well as throttling and a visible turtle so that regardless of machine speed the user can see exactly what the turtle is doing. Use of wxTurtle should conform to Python programming standards, not attempt to simulate logo. If you learn to program using wxTurtle, then that knowledge should apply to other programming projects and wxTurtle should support Python programming constructs without any extra parsing overhead. support multiple turtles simply by creating multiple objects t1 = turtleCoat() t2 = turtleCoat() t3 = turtleCoat() Each turtle can have its own coordinate system, pen attributes such as width, color, line style (dotted, hatched), line ending (rounded), etc. Since the underlying drawing is mostly likely done within a single graphics canvas any routine that does actual drawing will need to set the current color... prior to drawing. The safest thing to do would be to save the current settings, then set them according to the current turtle, then restore the old settings, but it is probably simpler to just overwrite the current settings since we can probably be sure that the next turtle doing some drawing will set the variables as well. If the overhead is high for the setup, then a class can be created that shares color settings, etc. among turtles. It may be possible to have each turtle in a separate thread and draw independently, but probably not unless all the components are thread safe. More likely would be sequential drawing, so if there was a list containing three turtle objects a loop... could do an operation such as forward and right on each turtle in sequence to get interesting patterns. The initial states (color, angle) would be different for each turtle. With wxPython need a way to copy the current canvas contents to an offscreen buffer, then when the window gets a paint event like OnPaint, the offscreen buffer would be copied back to the canvas. The offscreen buffer would either be automatically updated after each drawing operation (slow) or during some kind pause in processing or explicitly in the code. I think the Logo coordinate system wraps. support basic Logo turtle graphic commands and their abbreviations, plus Guido's version. Don't support various capitalizations, always use Python standard such as "showTurtle" instead of "ShowTurtle". Also, some turtle graphic implementations have different names for the same command such as ClearGraphics (cg) for ClearScreen (cs), so I have to decide whether to support lots of aliases for commands to simplify porting code from other sources at the risk of users of wxTurtle having too many ways of doing the same thing and making code hard to read. If all you want to do is plot points or draw lines using a cartesian coordinate system then wxTurtle is overkill and actually slows down the drawing if you wanted to skip setting the pen. However, it is probably convenient to have simple drawing in wxTurtle to hide some of the setup... of accessing wxPython/wxWindows drawing routines directly. In addition, wxTurtle will eventually have a virtual coordinate space so you can adjust scaling, the 0,0 point offsets, etc. so any drawing code like chaos or hopalong will benefit from these additions. PythonCard-0.8.2/samples/turtle/docs/readme.txt0000644000076500007650000000767107333604331021440 0ustar alexalex00000000000000Release History Revision: $Revision: 1.1 $ Date: $Date: 2001/08/06 21:15:05 $ 2001-08-03 Converted to run as a PythonCard application. The shell can be used to move the turtle around the screen interactively. 2001-06-## - first public release. This is an alpha-release in order to get feedback from potential users. It is likely that the underlying turtle classes will be rewritten, but there should be minimal impact (other than a change to the module names used) on any scripts written to use the turtle modules. However, a major overhaul of the design is not out of the question, so don't build anything big on top of the module at this point without at least contacting me. Overview A turtle library alternative to turtle.py included in the Python Standard Library. The current focus is on a turtle library for wxPython, but I'm trying to create the turtle modules in such a way that the various modules are subclassed from an abstract turtle class in order to isolate features that are specific to a given graphics library such as tk or wxPython. Hopefully, this will also simplify having a module that doesn't draw directly on the screen such as a PostScript module for printing or a module that controls a robot like those you can build with Lego Mindstorms. In all cases, a turtle script that doesn't make use of module specific features should run without changes using a different module. It should also be possible to do a Jython version, that uses Java classes for the actual drawing, but I'm not going to investigate that until later. With that in mind, I created a tWrapper.py module with the sole purpose of hiding which underlying module is being used, so that turtle scripts can refer to the tWrapper class as their base class. This is not Logo My goal is not to create a simulated logo environment in Python. I wanted to make it very simple to translate existing Logo turtle graphic programs to my Python turtle scripts by supporting the same commands, but I didn't want to try and simulate the Logo data structures or program flow control such as for loops. If there are gotchas to look out for when converting from Logo, I'll try and identify that in the documentation and examples. I would like the ability to do turtle graphics from the Python interpreter by creating a window and then typing simple commands such as "forward" and "right" in the interpreter to interactively control one or more turtles. The current version has turtle scripts that still look like Python, so assuming you have a turtle object t, you use: t.forward(100) t.right(90) rather than the Logo style FORWARD 100 RIGHT 90 Case is still significant, but there are abbreviated versions of methods, so t.forward(100) can be abbreviated to t.fd(100). You can have multiple turtle objects, but it would be possible to create a wrapper class that only allowed one global turtle and allowed you to type: fd(100) rt(90) because somewhere in the class or script there was a fd = t.fd rt = t.rt or something like that. Scripts The scripts currently have a .txt extension. They must meet the same requirements as a normal Python file (.py), but since the scripts can't be run on their own I thought it best not to use the .py extension. wxTurtleApp.py is currently required in order to run the scripts since it handles setting up the drawing environment and execing the scripts. You can edit the scripts using PythonWin or any other editor; PythonWin treats the .txt files as Python code, if you're using Emacs or another editor you might be better off naming the scripts with a .py extension. There are a number of scripts which show off chaotic behavior or do plotting and drawing that isn't strictly turtle graphics. However, the framework of providing a canvas to draw in and some simple tools for maintaining a pen, calculating distances, etc. show how the library can be used to visualize many different types of ideas quickly and easily. Kevin Altis altis@semi-retired.com 2001-06-08PythonCard-0.8.2/samples/turtle/pycrustrc.py0000644000076500007650000000022710035336222021102 0ustar alexalex00000000000000from PythonCard.turtle import BitmapTurtle t = BitmapTurtle(bg.components.bufOff) t.st() t.color('blue') for i in range(5): t.fd(50) t.lt(72) PythonCard-0.8.2/samples/turtle/readme.txt0000644000076500007650000000175310050024222020464 0ustar alexalex00000000000000turtle provides a fairly complete turtle library, numerous sample turtle scripts (in the scripts directory). The shell can be used to move the turtle(s) around interactively. For example, the simple example below shows controlling the turtle from the shell. >>> t.st() >>> t.color('blue') >>> t.fd(100) >>> for i in range(5): ... t.fd(50) ... t.rt(72) See the turtle docs directory for more information. 2002-07-17 Update: All of the samples will draw dramatically faster if Auto Refresh is unchecked in the Commands menu. If you have a fast machine and especially if you have a fast video card such as a nVidia GeForce2 or better, then a lot of the turtle samples will draw reasonably fast, except where points are plotted; the full window blit after each drawing operation will make even those sample scripts slow. If you have on-board video or a slow machine you will definitely want to uncheck Auto Refresh! This applies to Mac OS X as well which seems quite slow if Auto Refresh is checked. PythonCard-0.8.2/samples/turtle/scripts/0000755000076500007650000000000010434046772020173 5ustar alexalex00000000000000PythonCard-0.8.2/samples/turtle/scripts/automata.py0000644000076500007650000001431510050024223022341 0ustar alexalex00000000000000# 1-dimensional binary cellular automata example # this is not done for maximum efficiency # the line is a simple list with a simulated wrap-around if desired # each bit and the bit to the left and right of it # on the line is treated as a binary number # 001 is 1 decimal and 111 is 7 decimal # so a rule can be tested simply by seeing the sum # of the bits # and the rule itself is just a list of numbers to match # [0, 7] for example means if the sum of the bits is 0 or 7 # then turn the bit on in the next iteration # http://psoup.math.wisc.edu/mcell/rullex_1dbi.html # http://psoup.math.wisc.edu/mcell/ca_rules.html # http://psoup.math.wisc.edu/mcell/ca_gallery.html # http://psoup.math.wisc.edu/mcell/rullex_1dto.html from wrappers import Turtle from random import randint # wrapper for any additional drawing routines # that need to know about each other class WolframTurtle(Turtle): def wolframRule(self, str): """convert hex str to list of numbers""" hex = {'F':[1,1,1,1],'E':[1,1,1,0],'D':[1,1,0,1],'C':[1,1,0,0], 'B':[1,0,1,1],'A':[1,0,1,0],'9':[1,0,0,1],'8':[1,0,0,0], '7':[0,1,1,1],'6':[0,1,1,0],'5':[0,1,0,1],'4':[0,1,0,0], '3':[0,0,1,1],'2':[0,0,1,0],'1':[0,0,0,1],'0':[0,0,0,0]} # first create a binary list str = str.upper() bList = [] for c in str: bList += hex[c] # multiply each item in the list by its position # only return the non-zero items bList.reverse() nList = [] for i in range(len(bList)): if bList[i]: nList.append(i) #print str, nList, bList return nList def drawLine(self, line, x, y): points = [] for i in range(len(line)): if line[i]: # KEA 2004-05-10 # it is faster to just draw on the BitmapCanvas directly # and even faster to use the drawPointList method # in fact this whole example doesn't have anything to # do with turtle graphics :) #self.plot(x + i, y) #self.canvas.drawPoint((x + i, y)) points.append((x + i, y)) self.canvas.drawPointList(points) def randomLine(self, n): r = [] for i in range(n): r.append(randint(0, 1)) return r def draw(canvas): t = WolframTurtle(canvas) t.cls() # change wrap, ruleWidth, and r to get different patterns wrap = 1 # if 0, each side is padded with zeros ruleWidth = 2 # 1 or 2 - number of bits to check to the left or right r = t.randomLine(100) #r = [0] * 50 + [1] + [0] * 50 # a line with only one bit on in the center #r = [1] + [0] * 100 #r = [1,0] * 9 + [1,1,1,1,0] + [1,1,0] * 20 + [0] * 20 + [1,0,0,1,0,1,1,1,1,0,0,0,1] print r pad = [0] * ruleWidth lpad = len(pad) if wrap: a = r[-lpad:] + r[:] + r[:lpad] # wrap line else: a = pad + r[:] + pad # wrap line """ rule1 = [0, 7] rule2 = [1, 2, 3, 4, 5, 6] # opposite of rule 1 rule3 = [0, 5, 6, 7] rule4 = [0, 3, 5, 6, 7] rule5 = [1, 2, 4] # opposite of rule 4 rule6 = [1, 2, 4, 5, 6] #rule7 = [0, 3, 7] # opposite of rule 6 rule7 = [6,5,3,2,1] # R1,W6E rule8 = [5,4,2,1] # R1,W36 rule9 = [31,29,27,26,24,23,20,19,18,14,13,12,9,5,4,1] # chaotic gliders rule10 = [29,27,26,25,24,23,19,17,12,11,6,4,3] # solitons D1 """ """ rules.append(rule1) rules.append(rule2) rules.append(rule3) rules.append(rule4) rules.append(rule5) rules.append(rule6) rules.append(rule7) rules.append(rule8) """ # create a method to turn rule notation like R1,W6E into # the search width (R1 is 1 cell to the left and 1 cell to # the right) and a list of numbers (W36 is [5,4,2,1] # create another method to handle this syntax # R2,C10,M1,S0,S1,B0,B3 # from http://psoup.math.wisc.edu/mcell/rullex_1dto.html # 1D CA at http://psoup.math.wisc.edu/mcell/rullex_1dbi.html rules = [] # now create a list of rules if ruleWidth == 1: rules.append(t.wolframRule("36")) # brownian motion rules.append(t.wolframRule("6E")) # fishing-net rules.append(t.wolframRule("16")) # heavy triangles rules.append(t.wolframRule("5A")) # linear a rules.append(t.wolframRule("96")) # linear b rules.append(t.wolframRule("12")) # pascal's triangle (use just a single bit in the center) else: rules.append(t.wolframRule("BC82271C")) # bermuda triangle rules.append(t.wolframRule("AD9C7232")) # chaotic gliders rules.append(t.wolframRule("89ED7106")) # compound gliders rules.append(t.wolframRule("1C2A4798")) # fliform gliders 1 rules.append(t.wolframRule("5C6A4D98")) # fliform gliders 2 rules.append(t.wolframRule("5F0C9AD8")) # fish bones rules.append(t.wolframRule("B51E9CE8")) # glider p106 W4668ED14 rules.append(t.wolframRule("4668ED14")) # raindrops x = 10 original = a[:] lena = len(a) - (2 * lpad) for rule in rules: # R2 rules are too long to write on the screen # but this works fine for R1 rules if ruleWidth == 1: t.moveTo(x, 0) t.write(str(rule)) #print a[lpad:-lpad] #print a t.drawLine(a[lpad:-lpad], x, 19) for i in range(500): b = [0] * lena # a[lpad:-lpad] for j in range(lena): # generalize this to check an arbitrary number of # cells to the left and right if ruleWidth == 1: sum = a[j + lpad - 1] * 4 + a[j + lpad] * 2 + a[j + lpad + 1] else: sum = a[j + lpad - 2] * 16 + a[j + lpad - 1] * 8 + a[j + lpad] * 4 + a[j + lpad + 1] * 2 + a[j + lpad + 2] if sum in rule: b[j] = 1 else: b[j] = 0 t.drawLine(b, x, 20 + i) if wrap: a = b[-lpad:] + b[:] + b[:lpad] else: a = pad + b[:] + pad x += lena + 10 a = original[:] PythonCard-0.8.2/samples/turtle/scripts/byteDesign.py0000644000076500007650000000613410050024223022623 0ustar alexalex00000000000000# example based on article in BYTE magazine # Problem Solving with Logo: Using Turtle Graphics to Redraw a Design # November 1982 # p. 118 - 134 from wrappers import Turtle class ByteTurtle(Turtle): def design(self, homePos, scale): self.pu() for i in range(5): self.fd(64.65 * scale) self.pd() self.wheel(self.getXY(), scale) self.pu() self.bk(64.65 * scale) self.rt(72) self.pu(); self.setXY(homePos); self.rt(36); self.fd(24.5 * scale); self.rt(198); self.pd() self.centerpiece(46 * scale, 143.4, scale) def wheel(self, initpos, scale): self.rt(54) for i in range(4): self.pentpiece(initpos, scale) self.pd(); self.lt(36) for i in range(5): self.tripiece(initpos, scale) self.lt(36) for i in range(5): self.pd() self.rt(72) self.fd(28 * scale) self.pu() self.bk(28 * scale) self.lt(54) def tripiece(self, initpos, scale): oldh = self.getHeading() self.pd(); self.bk(2.5 * scale) self.tripolyr(31.5 * scale, scale) self.pu(); self.setXY(initpos); self.setHeading(oldh) self.pd(); self.bk(2.5 * scale) self.tripolyl(31.5 * scale, scale) self.pu(); self.setXY(initpos); self.setHeading(oldh) self.lt(72) def pentpiece(self, initpos, scale): oldh = self.getHeading() self.pu(); self.fd(29 * scale); self.pd() for i in range(5): self.fd(18 * scale) self.rt(72) self.pentr(18 * scale, 75, scale) self.pu(); self.setXY(initpos); self.setHeading(oldh) self.fd(29 * scale); self.pd() for i in range(5): self.fd(18 * scale) self.rt(72) self.pentl(18 * scale, 75, scale) self.pu(); self.setXY(initpos); self.setHeading(oldh) self.lt(72) def pentl(self, side, ang, scale): if side < (2 * scale): return self.fd(side) self.lt(ang) self.pentl(side - (.38 * scale), ang, scale) def pentr(self, side, ang, scale): if side < (2 * scale): return self.fd(side) self.rt(ang) self.pentr(side - (.38 * scale), ang, scale) def tripolyr(self, side, scale): if side < (4 * scale): return self.fd(side) self.rt(111) self.fd(side / 1.78) self.rt(111) self.fd(side / 1.3) self.rt(146) self.tripolyr(side * .75, scale) def tripolyl(self, side, scale): if side < (4 * scale): return self.fd(side) self.lt(111) self.fd(side / 1.78) self.lt(111) self.fd(side / 1.3) self.lt(146) self.tripolyl(side * .75, scale) def centerpiece(self, s, a, scale): self.fd(s); self.lt(a) if s < (7.5 * scale): return self.centerpiece(s - (1.2 * scale), a, scale) def draw(canvas): t = ByteTurtle(canvas) t.cls() """ t.pu() t.lt(90) t.fd(30) t.rt(90) t.pd() """ t.design(t.getXY(), 2.3) PythonCard-0.8.2/samples/turtle/scripts/chaosScript1.py0000644000076500007650000000212110050024223023061 0ustar alexalex00000000000000 from wrappers import Turtle def draw(canvas): t = Turtle(canvas) t.cls() autoRefreshTemp = t.canvas.autoRefresh t.canvas.autoRefresh = 0 xOffset = 50 yOffset = 0 scale = 1.0 r = 2.9 # when r was 4.0 I got an exception when doing the int # conversion below, so I need to consider the appropriate # behaviour when x or y is out of bounds for an int # and also out of bounds of the current cliprect or frame steps = 400 inc = (4.0 - 2.9) / steps for j in range(steps): r += inc x = 0.3 y = j + 30 for i in range(200): x = r * x * (1 - x) for i in range(300): x = r * x * (1 - x) x1 = int(500 * x) # originally self.plot(dc, x1, y1, xOffset, yOffset, scale) # the scale and offset stuff should probably # be part of the turtle or coordinate space x2 = int(xOffset + scale * x1) y2 = int(yOffset + scale * y) t.plot(x2, y2) t.canvas.refresh() t.canvas.autoRefresh = autoRefreshTemp PythonCard-0.8.2/samples/turtle/scripts/chaosScript1Fastest.py0000644000076500007650000000223110050024223024415 0ustar alexalex00000000000000# KEA 2001-10-14 # this is the same algorithm as chaosScript1.py # but rather than using a turtle, the script below uses the # canvas (BitmapCanvas) and drawPointList directly # it still draws line by line so the pattern evolves # on the screen rather than just showing the whole thing at once # plus the extra blit overhead for each line isn't that bad # with a decent video card def draw(canvas): canvas.clear() xOffset = 50 yOffset = 0 scale = 1.0 r = 2.9 # when r was 4.0 I got an exception when doing the int # conversion below, so I need to consider the appropriate # behaviour when x or y is out of bounds for an int # and also out of bounds of the current cliprect or frame steps = 400 inc = (4.0 - 2.9) / steps for j in range(steps): points = [] r += inc x = 0.3 y = j + 30 for i in range(200): x = r * x * (1 - x) for i in range(300): x = r * x * (1 - x) x1 = int(500 * x) x2 = int(xOffset + scale * x1) y2 = int(yOffset + scale * y) points.append((x2, y2)) canvas.drawPointList(points) PythonCard-0.8.2/samples/turtle/scripts/chaosScript2.py0000644000076500007650000000455010050024223023072 0ustar alexalex00000000000000 # another example that doesn't actually use the turtle for drawing import math import sys from wrappers import Turtle class ChaosTurtle(Turtle): def chaos(self, a=1.5732, xOrig=0.0, yOrig=0.0, endRange=38, xOffset=250, yOffset=250, scale=200.0): mult = 1.2 / endRange tempAutoRefresh = self.canvas.autoRefresh self.canvas.autoRefresh = False for j in range(1, endRange + 1): x = xOrig + mult * j y = yOrig + mult * j for i in range(1000): temp = x * math.cos(a) - (y - (x * x)) * math.sin(a) y = x * math.sin(a) + (y - (x * x)) * math.cos(a) x = temp try: self.canvas.drawPoint((xOffset + scale * x, yOffset + scale * y)) except OverflowError: pass self.canvas.refresh() self.canvas.autoRefresh = tempAutoRefresh # this is an alternate implementation of the method above, # but it uses drawPointList instead. in order to avoid # an OverflowError exception in drawPointList an explicit # check that x1 and y1 are in the maxint conversion range # must be done. at least on my machine the need to create # the temporary variables x1, y1 and the conversion check # ends up making this method slower that the method above def chaosWithList(self, a=1.5732, xOrig=0.0, yOrig=0.0, endRange=38, xOffset=250, yOffset=250, scale=200.0): mult = 1.2 / endRange points = [] maxint = sys.maxint for j in range(1, endRange + 1): x = xOrig + mult * j y = yOrig + mult * j for i in range(1000): temp = x * math.cos(a) - (y - (x * x)) * math.sin(a) y = x * math.sin(a) + (y - (x * x)) * math.cos(a) x = temp x1 = xOffset + scale * x y1 = yOffset + scale * y if x1 > -maxint and x1 < maxint and y1 > -maxint and y1 < maxint: points.append((x1, y1)) self.canvas.drawPointList(points) def draw(canvas): t = ChaosTurtle(canvas) t.cls() #t.chaos(1.5732, 0.0, 0.0, 38, 250, 250, 200) t.chaos(1.1111, 0.0, 0.0, 38, 250, 250, 200) # zoom in on one section of the same set as above #t.chaos(1.1111, 0.74, 0.27, 500, 0, 0, 500) PythonCard-0.8.2/samples/turtle/scripts/coordinates.py0000644000076500007650000000247310105465760023062 0ustar alexalex00000000000000# test coordinate system from wrappers import Turtle class CoordinatesTurtle(Turtle): def doTick(self, n): self.right(90) self.forward(5) self.write("%d" % n) self.back(10) self.forward(5) self.left(90) def draw(canvas): t = CoordinatesTurtle(canvas) t.cls t.plot() # "0, 0" in Logo space, but "windowWidth / 2, windowHeight / 2" in Guido space # in Guido space (turtle.py from Python standard library) t.color('green') for i in range(4): t.fd(250) t.doTick(250) t.fd(250) t.bk(500) t.lt(90) # note that the lines are not perfectly straight above which indicates a truncation or # rounding bug. since i have yet to mess with the coordinate system or keeping a high-precision # virtual turtle that is only converted to integer coordinates when drawing i haven't # traced out the problem """ t.plot(10, 10) t.plot(10, 500) t.plot(500, 500) t.plot(500, 10) """ t.color('gray') for i in (10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180): t.lt(i) t.fd(i * 2) #print t._angle # change this to write on screen, DrawText or something t.write("%d" % t._angle) t.bk(i * 2) t.rt(i) PythonCard-0.8.2/samples/turtle/scripts/distance.py0000644000076500007650000000144210076524260022333 0ustar alexalex00000000000000 import math from wrappers import Turtle def draw(canvas): t1 = Turtle(canvas) t1.cls() """ # test towards (towardsXY) # these kinds of tests should be done using pyunit tt = Turtle(canvas) for i in range(0, 370, 10): tt.pu() tt.lt(i) tt.fd(100) print "angle: %f, t1 towards tt: %f, tt towards t1: %f" % (i, t1.towards(tt), tt.towards(t1)) tt.bk(100) tt.rt(i) """ # test the distance calculation t1.left(45) t1.forward(100 * math.sqrt(2)) t2 = Turtle(canvas) t2.forward(100) d = t2.distance(t1) # should display 100 t2.write("%f" % d) # test the odometer reading t1.resetOdometer() t1.resumeOdometer() t1.polygon(4, 100) t1.write("odometer: %f" % t1.getOdometer()) PythonCard-0.8.2/samples/turtle/scripts/firstTests.py0000644000076500007650000000422210050024223022674 0ustar alexalex00000000000000 from wrappers import CurvesTurtle class SimpleTurtle(CurvesTurtle): def square1(self, distance): self.polygon(4, distance) # just to be different, turn right instead of left def square2(self, distance): for i in range(4): self.forward(distance) self.right(90) def polygon(self, sides, distance): angle = 360.0 / sides for i in range(sides): self.forward(distance) self.left(angle) def draw(canvas): t = SimpleTurtle(canvas) t.color('blue') t.rDragon(3, 12) t.color('orange') t.cCurve(5, 10) t.color('black') t.square2(30) t.square1(100) t.polygon(6, 30) #print t._invradian #print t.angle # I would like to be able to call routines like square2 and polygon1 # without having refer to the object if something like below # is possible? #def polygon(sides, distance): tc.polygon1(sides, distance) #polygon(3, 60) # I got this from chapter 4 of Learning Python, it seems to work # functions are just objects # so we create local objects that point to the methods of the object # this only works for the object, not the class in general, so a # different solution might be more appropriate square = t.square1 polygon = t.polygon t.color('green') # test to see if we get a green square square(150) # this also shows some kind of truncation or rounding error # the top corners of the triangle are off by one pixel t.color('black') t.pu() t.home() t.lt(180) t.fd(200) t.rt(180) t.pd() t.color('blue') for i in range(5): polygon(5, 40) #t.polygon(5, 40) t.left(360.0 / 5) t2 = SimpleTurtle(canvas) t2.color('red') t2.polygon(16, 10) t.color('blue') #t.forward(200) polygon(8, 80) # if this works correctly # the arcs will be different colors # so _goto has to be changed to set the pen characteristics # before drawing for i in range(18): #t.color('blue') t.forward(50) t.right(30) #t2.color('red') t2.fd(50) t2.rt(30) PythonCard-0.8.2/samples/turtle/scripts/fourBugs.py0000644000076500007650000000325210105467447022344 0ustar alexalex00000000000000# example based on article in BYTE magazine # 4 bugs starting in separate corners of a square # walk towards each other (this is also the picture on the cover) # November 1982 # p. 236 - 240 from wrappers import Turtle import wx def draw(canvas): t = Turtle(canvas) t.cls() # create four bugs and send them to the four corners of a square bug1 = Turtle(canvas) bug1.color('magenta') bug1.st() bug1.pu() bug1.rt(45) bug1.fd(300) bug1.pd() bug2 = Turtle(canvas) bug2.color('green') bug2.st() bug2.pu() bug2.rt(135) bug2.fd(300) bug2.pd() bug3 = Turtle(canvas) bug3.color('blue') bug3.st() bug3.pu() bug3.rt(225) bug3.fd(300) bug3.pd() bug4 = Turtle(canvas) bug4.color('orange') bug4.st() bug4.pu() bug4.rt(315) bug4.fd(300) bug4.pd() # bug1 is added at the end of the list as a convenience bList = [bug1, bug2, bug3, bug4, bug1] # speed up drawing time tempAutoRefresh = canvas.autoRefresh canvas.autoRefresh = 0 # the bugs take 400 "steps" toward each other for i in range(430): # orient each bug towards its neighbor # by doing this separately from # the step forward, we don't need to maintain # state in a separate list for b in range(4): h = bList[b].towards(bList[b + 1]) bList[b].setHeading(h) # each bug takes one step forward for b in range(4): bList[b].fd(1) canvas.refresh() if wx.Platform == '__WXMAC__': canvas.redraw() canvas.autoRefresh = tempAutoRefresh for b in range(4): bList[b].ht() PythonCard-0.8.2/samples/turtle/scripts/generalPlot.py0000644000076500007650000001256210050024223023004 0ustar alexalex00000000000000# this is the beginnings of a generalized set of plotting # methods for drawing graphs where x and y can be described # by an equation such as x = t, y = cos(t) # where t is the iteration value over some low to high range # and a step value # since Python can be handed a couple of strings that # are then have eval() applied to them in the loop # generalPlot allows any equation to be passed in as long # as it can be defined in terms of t # the tschirnhausen curve is shown as its own method and # defined in terms of generalPlot for comparison import math from math import cos, pi, sin, sqrt, tan from wrappers import Turtle # wrapper for any additional drawing routines # that need to know about each other class PlotTurtle(Turtle): def doTick(self, n): self.right(90) self.forward(5) self.write("%d" % n) self.back(10) self.forward(5) self.left(90) def coordinateLines(self, x0, y0, xScale, yScale, xLow, xHigh): self.moveTo(0, y0) self.color('blue') self.lineTo(1000, y0) self.moveTo(x0, 0) self.lineTo(x0, 1000) self.moveTo(x0, y0) """ for i in range(10): self.moveTo(i * xLow * xScale + x0, y0) self.doTick(i * xLow) self.moveTo(i * xHigh * xScale + x0, y0) self.doTick(i * xHigh) self.lt(90) """ self.color('black') def generalPlot(self, xOffset, yOffset, xScale, yScale, xEquation, yEquation, low, high, stepSize): # the units of t are radians print "xEquation:", xEquation print "yEquation:", yEquation steps = int((high - low) / stepSize) + 2 # low to high inclusive # moveTo the first point to avoid an extra line t = low x = eval(xEquation) y = eval(yEquation) self.moveTo(x * xScale + xOffset, y * yScale + yOffset) for j in range(steps): t += stepSize x = eval(xEquation) y = eval(yEquation) # self.plot(x * xScale + xOffset, y * yScale + yOffset) self.lineTo(x * xScale + xOffset, y * yScale + yOffset) #self.write("%f, %f" % (x, y)) #break def tschirnhausen2(self, xOffset, yOffset, xScale, yScale, a, low, high, stepSize): # the units of t are radians steps = int((high - low) / stepSize) + 2 # low to high inclusive # moveTo the first point to avoid an extra line t = low - stepSize x = 3 * a * (pow(t, 2) - 3) y = a * t * (pow(t, 2) - 3) self.moveTo(x * xScale + xOffset, y * yScale + yOffset) for j in range(steps): t += stepSize temp = a * (pow(t, 2) - 3) x = 3 * temp y = t * temp # self.plot(x * xScale + xOffset, y * yScale + yOffset) self.lineTo(x * xScale + xOffset, y * yScale + yOffset) """ based on the Tschirnhausen algorithm presented in the May 1988 Scientific American Computer Recreations column by A. K. Dewdney algorithm starts on page 121 """ def tschirnhausen(self, xOffset, yOffset, xScale, yScale, low, high, stepSize): # the units of t are radians a = 1.0 # a = 0.3 steps = int(high - low) / stepSize aSteps = int((2 - 0.1) / 0.1) a = 0.1 for i in range(aSteps): # moveTo the first point to avoid an extra line t = low x = 3 * a * (pow(t, 2) - 3) y = t * a * (pow(t, 2) - 3) self.moveTo(x * xScale + xOffset, y * yScale + yOffset) for j in range(steps): t += stepSize x = 3 * a * (pow(t, 2) - 3) y = a * t * (pow(t, 2) - 3) # self.plot(x * xScale + xOffset, y * yScale + yOffset) self.lineTo(x * xScale + xOffset, y * yScale + yOffset) a += .1 def draw(canvas): t1 = PlotTurtle(canvas) t1.cls() t1.coordinateLines(300, 250, 100, 100, -10, 10) # plot sin, cos, and tan t1.color('red') t1.generalPlot(300, 250, 100, 100, "t", "sin(t)", -pi, pi, .01) t1.color('green') t1.generalPlot(300, 250, 100, 100, "t", "cos(t)", -pi, pi, .01) t1.color('purple') t1.generalPlot(300, 250, 100, 100, "t", "tan(t)", -pi, pi, .01) # generalPlot takes an equation for x and an equation for y # and iterates over a range with a step value # t is the value of each iteration # hippopede t1.color('black') for a in range(20, 50, 5): b = 20 t1.generalPlot(300, 250, 2, 2, "2*cos(t)*sqrt("+str(a)+"*"+str(b)+"-"+"pow("+str(b)+",2)*pow(sin(t), 2))", "2*sin(t)*sqrt("+str(a)+"*"+str(b)+"-"+"pow("+str(b)+",2)*pow(sin(t), 2))", -pi, pi, pi/180) t1.tschirnhausen(200, 250, 5, 3, -4.4, 4.4, .01) #t1.tschirnhausen2(200, 250, 5, 3, 1.0, -4.4, 4.4, .01) """ aLow = .1 aHigh = 2 aStepSize = .1 aSteps = ((aHigh - aLow) / aStepSize) + 2 # aLow to aHigh inclusive a = aLow - aStepSize for i in range(aSteps): a += .1 # a stepSize of .01 gives pretty smooth curves t1.generalPlot(200, 250, 5, 3, "3*" + str(a) + "*(pow(t,2)-3)", "t*" + str(a) + "*(pow(t, 2)-3)", -4.4, 4.4, .01) """ PythonCard-0.8.2/samples/turtle/scripts/goldenSection.py0000644000076500007650000000263110132107125023325 0ustar alexalex00000000000000 # adapted from Just example at: # http://just.letterror.com/ltrwiki/DrawBot # the main downside to this version that I see # is that apparently the Oval primitive or underlying # Mac OS X draw calls change the thickness # of the oval outline as well as anti-alias the drawing # which I'm not sure how to do with wxPython # I could probably anti-alias by drawing at 4x the size and then # scaling the image I guess?! # but in comparison that would be lame import math def draw(canvas): canvas.foregroundColor = 'black' canvas.backgroundColor = 'white' canvas.clear() # if you want to speed up drawing a bit, uncomment # the canvas.autoRefresh and canvas.refresh() lines below # I think it is more fun to watch the pattern being drawn #canvas.autoRefresh = False w, h = canvas.size cx, cy = w/2, h/2 phi = (math.sqrt(5) + 1)/2-1 oradius = 10.0 blue = int(255 * 0.25) for i in range(720): #c = (0.0, 0.0, 0.0) radius = 1.5*oradius * math.sin(i * math.pi/720) r = round(radius) temp = phi*i*2*math.pi # color args need to be ints where 0 <= c <=s 255 c = min(255 * i / 360.0, 255) canvas.fillColor = (c, c, blue) canvas.drawEllipse((round(cx-(radius/2) + 0.25*i*math.cos(temp)), round(cy-(radius/2) + 0.25*i*math.sin(temp))), (r, r)) #canvas.autoRefresh = True #canvas.refresh() PythonCard-0.8.2/samples/turtle/scripts/helloTurtle.py0000644000076500007650000000024310050024223023024 0ustar alexalex00000000000000# this is a simple turtle script from wrappers import Turtle def draw(canvas): t = Turtle(canvas) t.cls() t.forward(100) t.write("Hello Turtle") PythonCard-0.8.2/samples/turtle/scripts/hilbert.py0000644000076500007650000000045210050024223022154 0ustar alexalex00000000000000# example derived from # Turtle Geometry: The Computer as a Medium for Exploring Mathematics # by Harold Abelson and Andrea diSessa # p. 96-98 from wrappers import CurvesTurtle def draw(canvas): t = CurvesTurtle(canvas) t.cls() t.moveTo(50, 50) t.right(90) t.hilbert(5, 6, 1) PythonCard-0.8.2/samples/turtle/scripts/kochCurves.py0000644000076500007650000000244610050024223022644 0ustar alexalex00000000000000# examples derived from # Visual Modeling with Logo: A Structural Approach to Seeing # by James Clayson # p. 146 # and # Turtle Geometry: The Computer as a Medium for Exploring Mathematics # by Harold Abelson and Andrea diSessa # p. 91 # see http://physics.hallym.ac.kr/education/chaos/ncsa/Fgeom.html # for some more explanation of fractals from wrappers import CurvesTurtle def draw(canvas): t = CurvesTurtle(canvas) t.cls() t.pu() t.lt(90) t.fd(50) t.rt(90) t.pd() # VM p. 146 t.fractalgon(3, 200, 4, -1) t.fractalgon(3, 250, 4, 1) # if you turn on the odometer you should see the total distance # the turle has gone, so you can compare a level 1 curve to # level 2, 3, etc. # but you will need to subtract the radius (rad) distance * 2 # to compensate for the forward() and back() calls in fractalgon # the same distance measurements can be done with other curves: # cCurves, dragon, hilbert, or any drawing commands # for example as the number of sides increases in a polygon # the distance traveled will approach the 2 * pi * r (the radius) # (circumference) of the circle bounded by the polygon # # odometer commands # t.getOdometer() # t.resumeOdometer() # t.resetOdometer() # t.suspendOdometer() PythonCard-0.8.2/samples/turtle/scripts/madness.py0000644000076500007650000000256410050024223022163 0ustar alexalex00000000000000""" based on the "madness" algorithm by Stanley S. Miller presented in the May 1988 Scientific American Computer Recreations column by A. K. Dewdney algorithm starts on page 121 """ import math from math import cos, sin from wrappers import Turtle class MadnessTurtle(Turtle): def madness(self, xOffset, yOffset, scale, n, stepSize): # in the article, the equations were # x = sin(.99 * t) - .7 * cos(3.01 * t) # y = cos(1.01 * t) + .1 * sin(15.03 * t) # the units of t are radians a = 1.0 # a = 0.3 b = 0.99 c = -0.7 d = 3.01 e = 1.0 # e = 0.9 f = 1.01 g = 0.1 h = 15.03 # moveTo the first point to avoid a line from # the center position t = -n * stepSize x = a * sin(b * t) + c * cos(d * t) y = e * cos(f * t) + g * sin(h * t) self.moveTo(x * scale + xOffset, y * scale + yOffset) for t in range(-n, n): t *= stepSize x = a * sin(b * t) + c * cos(d * t) y = e * cos(f * t) + g * sin(h * t) #self.plot(x * scale + xOffset, y * scale + yOffset) self.lineTo(x * scale + xOffset, y * scale + yOffset) def draw(canvas): t1 = MadnessTurtle(canvas) t1.cls() # a stepSize of .01 gives pretty smooth curves t1.madness(350, 250, 200, 40000, .01) PythonCard-0.8.2/samples/turtle/scripts/pentests.py0000644000076500007650000000336410105467450022413 0ustar alexalex00000000000000 from wrappers import Turtle # KEA 2004-08-08 # workaround for Mac not updating display until idle import wx def draw(canvas): # top left corner is 0,0 and bottom right is some positive x and positive y # so the coordinate space is not like a Logo turtle where 0,0 is the center # of the screen # these are returning the screen dimensions, not the width of the dc #print dc_local.GetSize() #print dc_local.GetSizeTuple() #print dc_local.GetClippingBox() t1 = Turtle(canvas) # background is shared among all turtles t1.setBackColor('black') t1.color('red') t1.showTurtle() t1.turtleDelay(1) t1.cls() # get rid of any previous drawing t2 = Turtle(canvas) t2.color('green') t2.showTurtle() t2.width(2) t2.left(120) t3 = Turtle(canvas) t3.color('blue') #t3.showTurtle() t3.width(3) t3.left(240) t1.forward(50) t2.forward(50) t3.forward(50) # for loop below is equivelant, need a better way of doing # index range though nList = ['1', '2', '3'] for i in nList: eval('t' + i + '.pu()') eval('t' + i + '.forward(50)') eval('t' + i + '.pd()') # KEA 2004-08-08 # workaround for Mac not updating display until idle if wx.Platform == '__WXMAC__': canvas.redraw() tList = [t1, t2, t3] for i in range(6): [t.fd(80) for t in tList] # huge delay so we can see the turtle #for j in range(1000000): pass [t.rt(60) for t in tList] # huge delay so we can see the turtle #for j in range(1000000): pass # KEA 2004-08-08 # workaround for Mac not updating display until idle if wx.Platform == '__WXMAC__': canvas.redraw() PythonCard-0.8.2/samples/turtle/scripts/raceturtles.py0000644000076500007650000000162610050024223023064 0ustar alexalex00000000000000# simple example to show putting multiple # turtles in a list and then applying the # same function to each one, in this case # "racing" them down the screen from wrappers import Turtle def draw(canvas): t = Turtle(canvas) t.cls() #print "On your mark, get set,", # don't make this larger than 255 # since we're using a different shade of red for each turtle # and there are only 256 shades :) maxTurtles = 200 tList = [] for i in range(maxTurtles): t = Turtle(canvas) t.moveTo((i + 1) * 3, 10) t.rt(90) t.color(i + (255 - maxTurtles), 0 , 0) # r, g, b color tList.append(t) autoRefreshTemp = tList[0].canvas.autoRefresh tList[0].canvas.autoRefresh = False #print "go!" for i in range(50): for t in tList: t.fd(10) tList[0].canvas.refresh() tList[0].canvas.autoRefresh = autoRefreshTemp PythonCard-0.8.2/samples/turtle/scripts/spingon.py0000644000076500007650000000506710105465761022230 0ustar alexalex00000000000000# examples derived from # Visual Modeling with Logo: A Structural Approach to Seeing # by James Clayson from wrappers import Turtle import math from math import pi, sin class GonTurtle(Turtle): # same as polygon, but without the efficiency ;-) def ngon(self, n, edge): for i in range(n): self.fd(edge) self.rt(360.0 / n) # draw a n-sided polygon with radius rad # p. 30 def cngon(self, n, rad): self.pu() self.fd(rad) angle = 180 - (90 * (n - 2) / n) self.rt(angle) self.pd() edge = 2 * rad * sin(pi / n) # logo uses sin(180 / n); Python uses radians self.ngon(n, edge) self.left(angle) self.pu() self.bk(rad) self.pd() # p. 22 def spingon(self, n, edge, angle, growth, times): if times < 1: return self.ngon(n, edge) self.rt(angle) self.spingon(n, edge * growth, angle, growth, times - 1) # another way to do recursion, though the way above seems best """ def spingon(self, n, edge, angle, growth, times): if times > 0: self.ngon(n, edge) self.rt(angle) self.spingon(n, edge * growth, angle, growth, times - 1) """ def draw(canvas): t = GonTurtle(canvas) t.cls() # check that variations of plot works """ t.plot() # uses current x, y #t.plot(375, 300) t.plot(None,10) t.plot(10,None) """ # p. 21 #t.spingon(50, 3, 10, 1.02, 95) radius = 150 # check the radius by uncommenting this """ t.color('blue') for i in range(36): t.fd(radius) t.bk(radius) t.rt(10) """ """ # show that as the number of sides increases # the distance traveled approaches the circumference # of the circle # use the built-in cPolygon (centered-Polygon aTurtle class method) # output is sent to the console window print "circumference: %f" % (2 * pi * radius) for i in range(3, 30): t.resetOdometer() t.resumeOdometer() t.cPolygon(i, radius) dist = t.getOdometer() - (2 * radius) print "sides: %d, distance: %f" % (i, dist) t.suspendOdometer() """ # same as t.color('black') t.color(0, 0, 0) # any r, g, b values between 0 - 255 are valid t.color(50, 100, 200) """""" for i in range(10): t.cngon(8, radius) #t.cngon(6, radius) #t.cngon(5, radius) #t.cngon(4, radius) #t.cngon(3, radius) t.rt(5) radius = radius - 5 """""" PythonCard-0.8.2/samples/turtle/scripts/sun.py0000644000076500007650000000307010050024223021327 0ustar alexalex00000000000000# examples derived from # Turtle Geometry: The Computer as a Medium for Exploring Mathematics # by Harold Abelson and Andrea diSessa from wrappers import Turtle class SunTurtle(Turtle): # p. 10 def arcr(self, r, deg): for i in range(deg): self.forward(r) self.right(1) # p. 11 def arcl(self, r, deg): for i in range(deg): self.forward(r) self.left(1) # p. 12 def ray(self, r): for i in range(2): self.arcr(r, 90) self.arcl(r, 90) """ self.arcl(r, 90) self.arcr(r, 90) self.arcl(r, 90) self.arcr(r, 90) """ # p. 12 def circles(self): for i in range(9): self.arcr(1, 360) self.right(40) # p. 12 def petal(self, size): self.arcr(size, 60) self.right(120) self.arcr(size, 60) self.right(120) # p. 12 def flower(self, size): for i in range(6): self.petal(size) self.right(60) # p. 12 def sun(self, size): for i in range(9): self.ray(size) self.rt(160) def draw(canvas): t = SunTurtle(canvas) t.cls() #t.circles() #t.flower(3) # simplify coding below by mapping the object methods pu = t.pu pd = t.pd rt = t.rt lt = t.lt fd = t.fd bk = t.bk sun = t.sun pu() lt(90) fd(225) rt(90) bk(100) pd() t.color('gold') sun(1.5) t.moveTo(10, 10) t.write("Good Morning!") PythonCard-0.8.2/samples/turtle/scripts/template.py0000644000076500007650000000012210050024223022330 0ustar alexalex00000000000000from wrappers import Turtle def draw(canvas): t = Turtle(canvas) t.cls() PythonCard-0.8.2/samples/turtle/scripts/threeTurtles.py0000644000076500007650000000153010050024223023213 0ustar alexalex00000000000000 from wrappers import CurvesTurtle def draw(canvas): # top left corner is 0,0 and bottom right is some positive x and positive y # so the coordinate space is not like a Logo turtle where 0,0 is the center # of the screen t1 = CurvesTurtle(canvas) t1.color('red') # show turtle #t1.st() # get rid of any previous drawing t1.cls() t2 = CurvesTurtle(canvas) t2.color('green') #t2.st() t2.left(120) t3 = CurvesTurtle(canvas) t3.color('blue') #t3.st() t3.left(240) tList = [t1, t2, t3] for t in tList: t.pu() t.forward(50) t.pd() ## for i in range(6): ## [t.fd(80) for t in tList] ## [t.rt(60) for t in tList] #[t.cCurve(4, 10) for t in tList] [t.rDragon(4, 11) for t in tList] #[t.lDragon(4, 11) for t in tList] PythonCard-0.8.2/samples/turtle/scripts/toitles.py0000644000076500007650000000151610050024223022210 0ustar alexalex00000000000000from wrappers import Turtle def draw(canvas): t = Turtle(canvas) t.cls() namedColors = ['aquamarine', 'black', 'blue', 'blue violet', 'brown', 'cadet blue', 'coral', 'cornflower blue', 'cyan', 'dark grey', 'dark green', 'dark olive green', 'dark orchid', 'dark slate blue'] boids = [] for i in range(len(namedColors)): b = Turtle(canvas) b.moveTo(50, 50) #b.penUp() b.color(namedColors[i]) print namedColors[i] b.showTurtle() b.rt(5 * i) b.fd(10 * i) boids.append(b) autoRefreshTemp = boids[0].canvas.autoRefresh boids[0].canvas.autoRefresh = False for i in range(550): for b in boids: b.fd(1) boids[0].canvas.refresh() boids[0].canvas.autoRefresh = autoRefreshTemp PythonCard-0.8.2/samples/turtle/scripts/trees.py0000644000076500007650000000644410050024223021654 0ustar alexalex00000000000000# examples derived from # Visual Modeling with Logo: A Structural Approach to Seeing # by James Clayson # and # Turtle Geometry: The Computer as a Medium for Exploring Mathematics # by Harold Abelson and Andrea diSessa import wrappers from random import uniform class TreesTurtle(wrappers.Turtle): # TG p. 85 def node(self, length, angle, level): if level == 0: return # point along left branch and draw it self.left(angle) self.lbranch(length, angle, level - 1) # draw right branch self.right(2 * angle) self.rbranch(length, angle, level - 1) # make node state-transparent self.left(angle) # TG p. 84 def lbranch(self, length, angle, level): # draw a long stem self.forward(2 * length) # do next level self.node(length, angle, level) # make lbranch state-transparent self.back (2 * length) # TG p. 84 def rbranch(self, length, angle, level): # draw a short stem self.forward(length) # do next level self.node(length, angle, level) # make lbranch state-transparent self.back (length) # VM p. 292 def tree(self, a, b, n, t, bt, f, l): if l < 1: return pos = self.getXY() self.fd(a) self.rt(t) for i in range(n): pos2 = self.getXY() self.fd(b) self.tree(a * f, b * f, n, t, bt, f, l - 1) #self.bk(b) self.setXY(pos2) self.lt(bt) self.rt((n * bt) - t) #self.moveTo(pos[0], pos[1]) self.setXY(pos) #self.bk(a) # VM p. 306 def randTree(self, a, n, t, bt, f, l): # to draw multiply branched recursive trees # with randomized components if l < 1: return # save the current position and angle pos = self.getXY() heading = self.getHeading() self.fd(uniform(0.5 * a, 1.5 * a)) self.rt(uniform(0.5 * t, 1.5 * t)) #self.fd(uniform(0.5 * t, 1.5 * t)) for i in range(n): d = uniform(0.5 * a / 2, 1.5 * a / 2) # save the position (not the heading) pos2 = self.getXY() self.fd(d) self.randTree(a * f, n, t, bt, f, l - 1) # restore the position self.setXY(pos2) self.lt(uniform(0.5 * bt, 1.5 * bt)) # restore the saved position and heading self.setXY(pos) self.setHeading(heading) def testTree(self, size): if size < 5: return self.fd(size) self.lt(30) self.testTree(size * .7) self.rt(60) self.testTree(size * .7) self.lt(30) self.bk(size) def testRTree(self, size): if size < 5: return self.fd(size) self.lt(30) self.testRTree(size * ((uniform(1, 5) + 5) / 10)) self.rt(60) self.testRTree(size * ((uniform(1, 5) + 5) / 10)) self.lt(30) self.bk(size) def draw(canvas): t = TreesTurtle(canvas) t.cls() t.left(90) #t.tree(80, 40, 4, 60, 30, .6, 5) #t.randTree(50, 3, 60, 30, .6, 4) #t.randTree(30, 3, 30, 30, .75, 5) #t.randTree(30, 3, 30, 15, .9, 5) t.pu() t.bk(150) t.pd() #t.testTree(75) t.testRTree(50) #t.lbranch(20, 20, 7) PythonCard-0.8.2/samples/turtle/scripts/wrappers.py0000644000076500007650000000720510050024223022371 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.1 $" __date__ = "$Date: 2004/05/11 01:12:51 $" """ # by referring to the Turtle class in this # module rather than PythonCard.turtle.BitmapTurtle # directly in scripts, the script can be run in # a different turtle environment such as LegoTurtle # by simply changing the import line below # of course, I haven't written those other # turtle wrappers, but it never hurts to plan ahead # i'm open to suggestions for another way of achieving # the same result, namely not needing to change myriads # of turtle scripts in order to run them in a different # graphics environment (BitmapTurtle, LegoTurtle, etc.) from PythonCard import turtle class Turtle(turtle.BitmapTurtle): pass # examples derived from # Visual Modeling with Logo: A Structural Approach to Seeing # by James Clayson # and # Turtle Geometry: The Computer as a Medium for Exploring Mathematics # by Harold Abelson and Andrea diSessa class CurvesTurtle(Turtle): # TG p. 92 def cCurve(self, size, level): if level == 0: self.forward(size) return self.cCurve(size, level - 1) self.right(90) self.cCurve(size, level - 1) self.left(90) # TG p. 93 def lDragon(self, size, level): if level == 0: self.forward(size) return self.lDragon(size, level - 1) self.left(90) self.rDragon(size, level - 1) # TG p. 93 def rDragon(self, size, level): if level == 0: self.forward(size) return self.lDragon(size, level - 1) self.right(90) self.rDragon(size, level - 1) # example derived from # Turtle Geometry: The Computer as a Medium for Exploring Mathematics # by Harold Abelson and Andrea diSessa # p. 96-98 def hilbert(self, size, level, parity): if level == 0: return # rotate and draw first subcurve with opposite parity to big curve self.left(parity * 90) self.hilbert(size, level - 1, -parity) # interface to and draw second subcurve with same parity as big curve self.forward(size) self.right(parity * 90) self.hilbert(size, level - 1, parity) # third subcurve self.forward(size) self.hilbert(size, level - 1, parity) # fourth subcurve self.right(parity * 90) self.forward(size) self.hilbert(size, level - 1, -parity) # a final turn is needed to make the turtle # end up facing outward from the large square self.left(parity * 90) # Visual Modeling with Logo: A Structural Approach to Seeing # by James Clayson # Koch curve, after Helge von Koch who introduced this geometric figure in 1904 # p. 146 def fractalgon(self, n, rad, lev, dir): import math # if dir = 1 turn outward # if dir = -1 turn inward edge = 2 * rad * math.sin(math.pi / n) # logo uses sin(180 / n); Python uses radians self.pu() self.fd(rad) self.pd() self.rt(180 - (90 * (n - 2) / n)) for i in range(n): self.fractal(edge, lev, dir) self.rt(360 / n) self.lt(180 - (90 * (n - 2) / n)) self.pu() self.bk(rad) self.pd() # p. 146 def fractal(self, dist, depth, dir): if depth < 1: self.fd(dist) return self.fractal(dist / 3, depth - 1, dir) self.lt(60 * dir) self.fractal(dist / 3, depth - 1, dir) self.rt(120 * dir) self.fractal(dist / 3, depth - 1, dir) self.lt(60 * dir) self.fractal(dist / 3, depth - 1, dir) PythonCard-0.8.2/samples/turtle/turtle.py0000644000076500007650000000616410221715124020370 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.26 $" __date__ = "$Date: 2005/03/28 05:47:00 $" I'll add support for editing the .txt file scripts once we have a multi-window framework in place and a decent way of doing at least rudimentary editing, syntax highlighting, syntax checking, etc. In other words, not until scintilla is running inside the PythonCard framework to give us styled text fields and more. """ import wx from PythonCard import configuration, dialog, model, turtle import os import time class TurtleBg(model.Background): def on_initialize(self, event): self.fNameTurtleScript = os.path.join('scripts', 'threeTurtles.py') self.singleItemExpandingSizerLayout() self.components.bufOff.backgroundColor = 'white' if wx.Platform == '__WXMAC__': # KEA 2005-03-26 # if CallAfter isn't used, the Mac doesn't update the menu correctly # this might be a bug wx.CallAfter(self.menuBar.setChecked, 'menuCommandsAutoRefresh', False) self.components.bufOff.autoRefresh = False def doDraw(self): starttime = time.time() cwd = os.getcwd() path, filename = os.path.split(self.fNameTurtleScript) os.chdir(path) module = __import__(os.path.splitext(filename)[0], globals(), globals()) # make sure that if this module was previously imported # that we get the new version reload(module) module.draw(self.components.bufOff) os.chdir(cwd) if not self.components.bufOff.autoRefresh: self.components.bufOff.refresh() # in case a script doesn't cleanup after itself, get the buffer # back in sync with the menu self.components.bufOff.autoRefresh = self.menuBar.getChecked('menuCommandsAutoRefresh') stoptime = time.time() elapsed = stoptime - starttime self.statusBar.text = "Draw time: %f seconds" % (elapsed) def on_menuFileOpen_select(self, event): currentDir = os.getcwd() wildcard = "Turtle files (*.py)|*.py" path = 'scripts' filename = '' result = dialog.openFileDialog(self, 'Open', path, filename, wildcard) if result.accepted: self.fNameTurtleScript = result.paths[0] os.chdir(currentDir) self.doDraw() def on_menuFileDrawTurtle_select(self, event): self.doDraw() def on_menuCommandsClear_select(self, event): # this is unclean and will need to be changed # I'll change it after I think more about what sorts # of commands I want to support in the menu and whether # they should be global or specific to individual turtles self.components.bufOff.clear() if not self.components.bufOff.autoRefresh: self.components.bufOff.refresh() def on_menuCommandsAutoRefresh_select(self, event): self.components.bufOff.autoRefresh = self.menuBar.getChecked('menuCommandsAutoRefresh') if __name__ == '__main__': # now force the shell to be enabled configuration.setOption('showShell', True) app = model.Application(TurtleBg) app.MainLoop() PythonCard-0.8.2/samples/turtle/turtle.rsrc.py0000644000076500007650000000342610047606365021352 0ustar alexalex00000000000000# Revision: $Revision: 1.12 $ # Date: $Date: 2004/05/10 05:02:45 $ { 'application':{ 'type':'Application', 'name':'Turtle', 'backgrounds': [ { 'type':'Background', 'name':'bgTurtle', 'title':'Turtle Test', 'size':( 750, 600 ), 'statusBar':1, 'style':['resizeable'], 'menubar': { 'type':'MenuBar', 'menus': [ { 'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ { 'type':'MenuItem', 'name':'menuFileOpen', 'label':"&Open File...\tCtrl+O" }, { 'type':'MenuItem', 'name':'menuFileDrawTurtle', 'label':"Draw &Turtle\tCtrl+T" }, { 'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit' } ] }, { 'type':'Menu', 'name':'menuCommands', 'label':'&Commands', 'items': [ { 'type':'MenuItem', 'name':'menuCommandsClear', 'label':"Clear Screen" }, { 'type':'MenuItem', 'name':'commandsSep1', 'label':'-' }, { 'type':'MenuItem', 'name':'menuCommandsAutoRefresh', 'label':'Auto Refresh', 'checkable':1, 'checked':1}, ] } ] }, 'components': [ { 'type':'BitmapCanvas', 'name':'bufOff', 'position':(0, 30), 'size':(750, 600) }, #{ 'type':'Button', 'name':'btnRun', 'position':(5, 5), 'label':'Run' }, #{ 'type':'StaticLine', 'name':'sep1', 'position':(0, 0), 'size':(750, -1) }, ] } ] } } PythonCard-0.8.2/samples/twistedEchoClient/0000755000076500007650000000000010434046772020606 5ustar alexalex00000000000000PythonCard-0.8.2/samples/twistedEchoClient/readme.txt0000644000076500007650000000177510044004332022575 0ustar alexalex00000000000000Twisted Echo client which uses the TwistedApplication class. class TwistedApplication(model.Application): def OnInit(self): model.Application.OnInit(self) reactor.startRunning() wx.EVT_TIMER(self, 999999, self.OnTimer) self.twistedTimer = wx.Timer(self, 999999) self.twistedTimer.Start(250, False) return True def OnTimer(self, event): reactor.iterate() def OnExit(self): # need to stop the timer for cleanup purposes self.twistedTimer.Stop() self.twistedTimer = None reactor.stop() You need to start pbecho.py first so you have a server to connect to. pbecho.py is included in the Twisted distribution within your Python site-packages directory: site-packages/TwistedDocs/examples/pbecho.py Contributed by Stephen Waterbury. Additional code by Kevin Altis Adapted from Uwe C. Schroeder's cookbook entry "Using wxPython with Twisted Python" http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/181780 PythonCard-0.8.2/samples/twistedEchoClient/twistedEchoClient.py0000644000076500007650000000551410106741250024573 0ustar alexalex00000000000000""" Twisted PythonCard PbEchoClient """ from PythonCard import model, twistedModel from twisted.cred.credentials import UsernamePassword from twisted.spread import pb from twisted.internet import reactor from PythonCard.templates.dialogs.loginDialog import loginDialog class DefinedError(pb.Error): pass class EchoClient(model.Background): """ TPC PB Echo GUI Panel """ def on_initialize(self, event): self.pbfactory = pb.PBClientFactory() # KEA the Send button and SendTextField should be disabled # until a successful login self.components.SendTextField.enabled = False self.components.buttonSend.enabled = False def on_SendTextField_keyPress(self, event): # if user presses return, send text if event.keyCode == 13: self.sendAndClearText() else: event.skip() # KEA 2004-04-27 # this should popup a custom dialog # to prompt the user for the host, port number, # username, and password # with defaults of "localhost", pb.portno # "guest", and "guest" # this dialog is going to be pretty common so we'll stick # in PythonCard/templates/dialogs to simplify usage from # other twisted apps def on_buttonLogin_mouseClick(self, event): result = loginDialog(self, port=pb.portno) if result.accepted: # verify input here? host = result.host port = result.port username = result.username password = result.password reactor.connectTCP(host, port, self.pbfactory) self.pbfactory.login( UsernamePassword(username, password) ).addCallbacks(self.loginsuccess, self.loginfailure) def loginsuccess(self, perspective): self.statusBar.text = 'Connected' self.components.SendTextField.enabled = True self.components.buttonSend.enabled = True self.components.SendTextField.setFocus() self.perspective = perspective def loginfailure(self, error): self.displaycontent("Error on login: %s" % error) def sendAndClearText(self): fld = self.components.SendTextField self.perspective.callRemote('echo', fld.text ).addCallbacks(self.echosuccess, self.echofailure) fld.text = "" def on_buttonSend_mouseClick(self, event): self.sendAndClearText() def echosuccess(self, message): self.displaycontent(message) def echofailure(self, error): t = error.trap(DefinedError) self.displaycontent("error received"+t) def displaycontent(self, text): self.components.ReceivedTextArea.appendText(text + "\n") if __name__ == '__main__': app = twistedModel.TwistedApplication(EchoClient) app.MainLoop() PythonCard-0.8.2/samples/twistedEchoClient/twistedEchoClient.rsrc.py0000644000076500007650000000270510103732730025542 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'Dialogs', 'backgrounds': [ {'type':'Background', 'name':'bg1', 'title':'Twisted PythonCard PB Echo Client', 'size':(375, 270), 'statusBar':1, 'menubar': {'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'File', 'label':'&File', 'items': [ {'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit', }, ] }, ] }, 'components': [ {'type':'StaticText', 'name':'StatusStaticText', 'position':(284, 215), 'backgroundColor':(0, 255, 127), 'font':{'family': 'sansSerif', 'size': 10}, 'text':'CONNECTED', 'visible':0, }, {'type':'Button', 'name':'buttonLogin', 'position':(22, 140), 'size':(117, -1), 'label':'Login', }, {'type':'TextField', 'name':'SendTextField', 'position':(20, 180), 'size':(330, -1), 'alignment':'left', }, {'type':'TextArea', 'name':'ReceivedTextArea', 'position':(20, 0), 'size':(330, 125), 'alignment':'left', }, {'type':'Button', 'name':'buttonSend', 'position':(151, 140), 'size':(125, -1), 'label':'Send', }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/samples/webgrabber/0000755000076500007650000000000010434046772017267 5ustar alexalex00000000000000PythonCard-0.8.2/samples/webgrabber/readme.txt0000644000076500007650000000267607477707247021316 0ustar alexalex00000000000000webgrabber is a conversion of the tkinter program wsgui.py, which is a GUI front-end to websucker.py. The original websucker.py and webchecker.py files are located in your Python\Tools\webchecker directory. I've included the webchecker.py and websucker.py files with this sample because it isn't possible to import directly from the Tools\webchecker directory. This sample shows how to use a one-shot timer and a separate thread that communicates back to the GUI event loop via a Queue. It should also give a rough idea of the difference between a simple tkinter program and a simple PythonCard program, though the PythonCard program is not an exact conversion, since I decided to drop the option to have many grabbing processes active at once. If you want to do that it is simple to just start another copy of the webgrabber.py application. Enter a URL into the URL field and a directory you would like to save the results to. If no directory is entered, then the results will be saved to the webgrabber directory. Click to "Go" button to start the "grabbing". The default verbosity level is set at 2 so messages will appear in the console as each file is checked. A message will also appear in the statusbar. You can click "Cancel" or close the app at any time to stop the download. Once the download is complete, the statusbar will show "[done]". If you click "Go" without changing the URL or directory, all the files will be checked and only new files downloaded.PythonCard-0.8.2/samples/webgrabber/webchecker.py0000644000076500007650000006737207477707247022000 0ustar alexalex00000000000000#! /usr/bin/env python # Original code by Guido van Rossum; extensive changes by Sam Bayer, # including code to check URL fragments. """Web tree checker. This utility is handy to check a subweb of the world-wide web for errors. A subweb is specified by giving one or more ``root URLs''; a page belongs to the subweb if one of the root URLs is an initial prefix of it. File URL extension: In order to easy the checking of subwebs via the local file system, the interpretation of ``file:'' URLs is extended to mimic the behavior of your average HTTP daemon: if a directory pathname is given, the file index.html in that directory is returned if it exists, otherwise a directory listing is returned. Now, you can point webchecker to the document tree in the local file system of your HTTP daemon, and have most of it checked. In fact the default works this way if your local web tree is located at /usr/local/etc/httpd/htdpcs (the default for the NCSA HTTP daemon and probably others). Report printed: When done, it reports pages with bad links within the subweb. When interrupted, it reports for the pages that it has checked already. In verbose mode, additional messages are printed during the information gathering phase. By default, it prints a summary of its work status every 50 URLs (adjustable with the -r option), and it reports errors as they are encountered. Use the -q option to disable this output. Checkpoint feature: Whether interrupted or not, it dumps its state (a Python pickle) to a checkpoint file and the -R option allows it to restart from the checkpoint (assuming that the pages on the subweb that were already processed haven't changed). Even when it has run till completion, -R can still be useful -- it will print the reports again, and -Rq prints the errors only. In this case, the checkpoint file is not written again. The checkpoint file can be set with the -d option. The checkpoint file is written as a Python pickle. Remember that Python's pickle module is currently quite slow. Give it the time it needs to load and save the checkpoint file. When interrupted while writing the checkpoint file, the old checkpoint file is not overwritten, but all work done in the current run is lost. Miscellaneous: - You may find the (Tk-based) GUI version easier to use. See wcgui.py. - Webchecker honors the "robots.txt" convention. Thanks to Skip Montanaro for his robotparser.py module (included in this directory)! The agent name is hardwired to "webchecker". URLs that are disallowed by the robots.txt file are reported as external URLs. - Because the SGML parser is a bit slow, very large SGML files are skipped. The size limit can be set with the -m option. - When the server or protocol does not tell us a file's type, we guess it based on the URL's suffix. The mimetypes.py module (also in this directory) has a built-in table mapping most currently known suffixes, and in addition attempts to read the mime.types configuration files in the default locations of Netscape and the NCSA HTTP daemon. - We follow links indicated by , and tags. We also honor the tag. - We now check internal NAME anchor links, as well as toplevel links. - Checking external links is now done by default; use -x to *disable* this feature. External links are now checked during normal processing. (XXX The status of a checked link could be categorized better. Later...) - If external links are not checked, you can use the -t flag to provide specific overrides to -x. Usage: webchecker.py [option] ... [rooturl] ... Options: -R -- restart from checkpoint file -d file -- checkpoint filename (default %(DUMPFILE)s) -m bytes -- skip HTML pages larger than this size (default %(MAXPAGE)d) -n -- reports only, no checking (use with -R) -q -- quiet operation (also suppresses external links report) -r number -- number of links processed per round (default %(ROUNDSIZE)d) -t root -- specify root dir which should be treated as internal (can repeat) -v -- verbose operation; repeating -v will increase verbosity -x -- don't check external links (these are often slow to check) -a -- don't check name anchors Arguments: rooturl -- URL to start checking (default %(DEFROOT)s) """ __version__ = "$Revision: 1.1 $" import sys import os from types import * import string import StringIO import getopt import pickle import urllib import urlparse import sgmllib import mimetypes import robotparser # Extract real version number if necessary if __version__[0] == '$': _v = string.split(__version__) if len(_v) == 3: __version__ = _v[1] # Tunable parameters DEFROOT = "file:/usr/local/etc/httpd/htdocs/" # Default root URL CHECKEXT = 1 # Check external references (1 deep) VERBOSE = 1 # Verbosity level (0-3) MAXPAGE = 150000 # Ignore files bigger than this ROUNDSIZE = 50 # Number of links processed per round DUMPFILE = "@webchecker.pickle" # Pickled checkpoint AGENTNAME = "webchecker" # Agent name for robots.txt parser NONAMES = 0 # Force name anchor checking # Global variables def main(): checkext = CHECKEXT verbose = VERBOSE maxpage = MAXPAGE roundsize = ROUNDSIZE dumpfile = DUMPFILE restart = 0 norun = 0 try: opts, args = getopt.getopt(sys.argv[1:], 'Rd:m:nqr:t:vxa') except getopt.error, msg: sys.stdout = sys.stderr print msg print __doc__%globals() sys.exit(2) # The extra_roots variable collects extra roots. extra_roots = [] nonames = NONAMES for o, a in opts: if o == '-R': restart = 1 if o == '-d': dumpfile = a if o == '-m': maxpage = string.atoi(a) if o == '-n': norun = 1 if o == '-q': verbose = 0 if o == '-r': roundsize = string.atoi(a) if o == '-t': extra_roots.append(a) if o == '-a': nonames = not nonames if o == '-v': verbose = verbose + 1 if o == '-x': checkext = not checkext if verbose > 0: print AGENTNAME, "version", __version__ if restart: c = load_pickle(dumpfile=dumpfile, verbose=verbose) else: c = Checker() c.setflags(checkext=checkext, verbose=verbose, maxpage=maxpage, roundsize=roundsize, nonames=nonames ) if not restart and not args: args.append(DEFROOT) for arg in args: c.addroot(arg) # The -t flag is only needed if external links are not to be # checked. So -t values are ignored unless -x was specified. if not checkext: for root in extra_roots: # Make sure it's terminated by a slash, # so that addroot doesn't discard the last # directory component. if root[-1] != "/": root = root + "/" c.addroot(root, add_to_do = 0) try: if not norun: try: c.run() except KeyboardInterrupt: if verbose > 0: print "[run interrupted]" try: c.report() except KeyboardInterrupt: if verbose > 0: print "[report interrupted]" finally: if c.save_pickle(dumpfile): if dumpfile == DUMPFILE: print "Use ``%s -R'' to restart." % sys.argv[0] else: print "Use ``%s -R -d %s'' to restart." % (sys.argv[0], dumpfile) def load_pickle(dumpfile=DUMPFILE, verbose=VERBOSE): if verbose > 0: print "Loading checkpoint from %s ..." % dumpfile f = open(dumpfile, "rb") c = pickle.load(f) f.close() if verbose > 0: print "Done." print "Root:", string.join(c.roots, "\n ") return c class Checker: checkext = CHECKEXT verbose = VERBOSE maxpage = MAXPAGE roundsize = ROUNDSIZE nonames = NONAMES validflags = tuple(dir()) def __init__(self): self.reset() def setflags(self, **kw): for key in kw.keys(): if key not in self.validflags: raise NameError, "invalid keyword argument: %s" % str(key) for key, value in kw.items(): setattr(self, key, value) def reset(self): self.roots = [] self.todo = {} self.done = {} self.bad = {} # Add a name table, so that the name URLs can be checked. Also # serves as an implicit cache for which URLs are done. self.name_table = {} self.round = 0 # The following are not pickled: self.robots = {} self.errors = {} self.urlopener = MyURLopener() self.changed = 0 def note(self, level, format, *args): if self.verbose > level: if args: format = format%args self.message(format) def message(self, format, *args): if args: format = format%args print format def __getstate__(self): return (self.roots, self.todo, self.done, self.bad, self.round) def __setstate__(self, state): self.reset() (self.roots, self.todo, self.done, self.bad, self.round) = state for root in self.roots: self.addrobot(root) for url in self.bad.keys(): self.markerror(url) def addroot(self, root, add_to_do = 1): if root not in self.roots: troot = root scheme, netloc, path, params, query, fragment = \ urlparse.urlparse(root) i = string.rfind(path, "/") + 1 if 0 < i < len(path): path = path[:i] troot = urlparse.urlunparse((scheme, netloc, path, params, query, fragment)) self.roots.append(troot) self.addrobot(root) if add_to_do: self.newlink((root, ""), ("", root)) def addrobot(self, root): root = urlparse.urljoin(root, "/") if self.robots.has_key(root): return url = urlparse.urljoin(root, "/robots.txt") self.robots[root] = rp = robotparser.RobotFileParser() self.note(2, "Parsing %s", url) rp.debug = self.verbose > 3 rp.set_url(url) try: rp.read() except (OSError, IOError), msg: self.note(1, "I/O error parsing %s: %s", url, msg) def run(self): while self.todo: self.round = self.round + 1 self.note(0, "\nRound %d (%s)\n", self.round, self.status()) urls = self.todo.keys() urls.sort() del urls[self.roundsize:] for url in urls: self.dopage(url) def status(self): return "%d total, %d to do, %d done, %d bad" % ( len(self.todo)+len(self.done), len(self.todo), len(self.done), len(self.bad)) def report(self): self.message("") if not self.todo: s = "Final" else: s = "Interim" self.message("%s Report (%s)", s, self.status()) self.report_errors() def report_errors(self): if not self.bad: self.message("\nNo errors") return self.message("\nError Report:") sources = self.errors.keys() sources.sort() for source in sources: triples = self.errors[source] self.message("") if len(triples) > 1: self.message("%d Errors in %s", len(triples), source) else: self.message("Error in %s", source) # Call self.format_url() instead of referring # to the URL directly, since the URLs in these # triples is now a (URL, fragment) pair. The value # of the "source" variable comes from the list of # origins, and is a URL, not a pair. for url, rawlink, msg in triples: if rawlink != self.format_url(url): s = " (%s)" % rawlink else: s = "" self.message(" HREF %s%s\n msg %s", self.format_url(url), s, msg) def dopage(self, url_pair): # All printing of URLs uses format_url(); argument changed to # url_pair for clarity. if self.verbose > 1: if self.verbose > 2: self.show("Check ", self.format_url(url_pair), " from", self.todo[url_pair]) else: self.message("Check %s", self.format_url(url_pair)) url, local_fragment = url_pair if local_fragment and self.nonames: self.markdone(url_pair) return page = self.getpage(url_pair) if page: # Store the page which corresponds to this URL. self.name_table[url] = page # If there is a fragment in this url_pair, and it's not # in the list of names for the page, call setbad(), since # it's a missing anchor. if local_fragment and local_fragment not in page.getnames(): self.setbad(url_pair, ("Missing name anchor `%s'" % local_fragment)) for info in page.getlinkinfos(): # getlinkinfos() now returns the fragment as well, # and we store that fragment here in the "todo" dictionary. link, rawlink, fragment = info # However, we don't want the fragment as the origin, since # the origin is logically a page. origin = url, rawlink self.newlink((link, fragment), origin) else: # If no page has been created yet, we want to # record that fact. self.name_table[url_pair[0]] = None self.markdone(url_pair) def newlink(self, url, origin): if self.done.has_key(url): self.newdonelink(url, origin) else: self.newtodolink(url, origin) def newdonelink(self, url, origin): if origin not in self.done[url]: self.done[url].append(origin) # Call self.format_url(), since the URL here # is now a (URL, fragment) pair. self.note(3, " Done link %s", self.format_url(url)) # Make sure that if it's bad, that the origin gets added. if self.bad.has_key(url): source, rawlink = origin triple = url, rawlink, self.bad[url] self.seterror(source, triple) def newtodolink(self, url, origin): # Call self.format_url(), since the URL here # is now a (URL, fragment) pair. if self.todo.has_key(url): if origin not in self.todo[url]: self.todo[url].append(origin) self.note(3, " Seen todo link %s", self.format_url(url)) else: self.todo[url] = [origin] self.note(3, " New todo link %s", self.format_url(url)) def format_url(self, url): link, fragment = url if fragment: return link + "#" + fragment else: return link def markdone(self, url): self.done[url] = self.todo[url] del self.todo[url] self.changed = 1 def inroots(self, url): for root in self.roots: if url[:len(root)] == root: return self.isallowed(root, url) return 0 def isallowed(self, root, url): root = urlparse.urljoin(root, "/") return self.robots[root].can_fetch(AGENTNAME, url) def getpage(self, url_pair): # Incoming argument name is a (URL, fragment) pair. # The page may have been cached in the name_table variable. url, fragment = url_pair if self.name_table.has_key(url): return self.name_table[url] scheme, path = urllib.splittype(url) if scheme in ('mailto', 'news', 'javascript', 'telnet'): self.note(1, " Not checking %s URL" % scheme) return None isint = self.inroots(url) # Ensure that openpage gets the URL pair to # print out its error message and record the error pair # correctly. if not isint: if not self.checkext: self.note(1, " Not checking ext link") return None f = self.openpage(url_pair) if f: self.safeclose(f) return None text, nurl = self.readhtml(url_pair) if nurl != url: self.note(1, " Redirected to %s", nurl) url = nurl if text: return Page(text, url, maxpage=self.maxpage, checker=self) # These next three functions take (URL, fragment) pairs as # arguments, so that openpage() receives the appropriate tuple to # record error messages. def readhtml(self, url_pair): url, fragment = url_pair text = None f, url = self.openhtml(url_pair) if f: text = f.read() f.close() return text, url def openhtml(self, url_pair): url, fragment = url_pair f = self.openpage(url_pair) if f: url = f.geturl() info = f.info() if not self.checkforhtml(info, url): self.safeclose(f) f = None return f, url def openpage(self, url_pair): url, fragment = url_pair try: return self.urlopener.open(url) except (OSError, IOError), msg: msg = self.sanitize(msg) self.note(0, "Error %s", msg) if self.verbose > 0: self.show(" HREF ", url, " from", self.todo[url_pair]) self.setbad(url_pair, msg) return None def checkforhtml(self, info, url): if info.has_key('content-type'): ctype = string.lower(info['content-type']) else: if url[-1:] == "/": return 1 ctype, encoding = mimetypes.guess_type(url) if ctype == 'text/html': return 1 else: self.note(1, " Not HTML, mime type %s", ctype) return 0 def setgood(self, url): if self.bad.has_key(url): del self.bad[url] self.changed = 1 self.note(0, "(Clear previously seen error)") def setbad(self, url, msg): if self.bad.has_key(url) and self.bad[url] == msg: self.note(0, "(Seen this error before)") return self.bad[url] = msg self.changed = 1 self.markerror(url) def markerror(self, url): try: origins = self.todo[url] except KeyError: origins = self.done[url] for source, rawlink in origins: triple = url, rawlink, self.bad[url] self.seterror(source, triple) def seterror(self, url, triple): try: # Because of the way the URLs are now processed, I need to # check to make sure the URL hasn't been entered in the # error list. The first element of the triple here is a # (URL, fragment) pair, but the URL key is not, since it's # from the list of origins. if triple not in self.errors[url]: self.errors[url].append(triple) except KeyError: self.errors[url] = [triple] # The following used to be toplevel functions; they have been # changed into methods so they can be overridden in subclasses. def show(self, p1, link, p2, origins): self.message("%s %s", p1, link) i = 0 for source, rawlink in origins: i = i+1 if i == 2: p2 = ' '*len(p2) if rawlink != link: s = " (%s)" % rawlink else: s = "" self.message("%s %s%s", p2, source, s) def sanitize(self, msg): if isinstance(IOError, ClassType) and isinstance(msg, IOError): # Do the other branch recursively msg.args = self.sanitize(msg.args) elif isinstance(msg, TupleType): if len(msg) >= 4 and msg[0] == 'http error' and \ isinstance(msg[3], InstanceType): # Remove the Message instance -- it may contain # a file object which prevents pickling. msg = msg[:3] + msg[4:] return msg def safeclose(self, f): try: url = f.geturl() except AttributeError: pass else: if url[:4] == 'ftp:' or url[:7] == 'file://': # Apparently ftp connections don't like to be closed # prematurely... text = f.read() f.close() def save_pickle(self, dumpfile=DUMPFILE): if not self.changed: self.note(0, "\nNo need to save checkpoint") elif not dumpfile: self.note(0, "No dumpfile, won't save checkpoint") else: self.note(0, "\nSaving checkpoint to %s ...", dumpfile) newfile = dumpfile + ".new" f = open(newfile, "wb") pickle.dump(self, f) f.close() try: os.unlink(dumpfile) except os.error: pass os.rename(newfile, dumpfile) self.note(0, "Done.") return 1 class Page: def __init__(self, text, url, verbose=VERBOSE, maxpage=MAXPAGE, checker=None): self.text = text self.url = url self.verbose = verbose self.maxpage = maxpage self.checker = checker # The parsing of the page is done in the __init__() routine in # order to initialize the list of names the file # contains. Stored the parser in an instance variable. Passed # the URL to MyHTMLParser(). size = len(self.text) if size > self.maxpage: self.note(0, "Skip huge file %s (%.0f Kbytes)", self.url, (size*0.001)) self.parser = None return self.checker.note(2, " Parsing %s (%d bytes)", self.url, size) self.parser = MyHTMLParser(url, verbose=self.verbose, checker=self.checker) self.parser.feed(self.text) self.parser.close() def note(self, level, msg, *args): if self.checker: apply(self.checker.note, (level, msg) + args) else: if self.verbose >= level: if args: msg = msg%args print msg # Method to retrieve names. def getnames(self): if self.parser: return self.parser.names else: return [] def getlinkinfos(self): # File reading is done in __init__() routine. Store parser in # local variable to indicate success of parsing. # If no parser was stored, fail. if not self.parser: return [] rawlinks = self.parser.getlinks() base = urlparse.urljoin(self.url, self.parser.getbase() or "") infos = [] for rawlink in rawlinks: t = urlparse.urlparse(rawlink) # DON'T DISCARD THE FRAGMENT! Instead, include # it in the tuples which are returned. See Checker.dopage(). fragment = t[-1] t = t[:-1] + ('',) rawlink = urlparse.urlunparse(t) link = urlparse.urljoin(base, rawlink) infos.append((link, rawlink, fragment)) return infos class MyStringIO(StringIO.StringIO): def __init__(self, url, info): self.__url = url self.__info = info StringIO.StringIO.__init__(self) def info(self): return self.__info def geturl(self): return self.__url class MyURLopener(urllib.FancyURLopener): http_error_default = urllib.URLopener.http_error_default def __init__(*args): self = args[0] apply(urllib.FancyURLopener.__init__, args) self.addheaders = [ ('User-agent', 'Python-webchecker/%s' % __version__), ] def http_error_401(self, url, fp, errcode, errmsg, headers): return None def open_file(self, url): path = urllib.url2pathname(urllib.unquote(url)) if os.path.isdir(path): if path[-1] != os.sep: url = url + '/' indexpath = os.path.join(path, "index.html") if os.path.exists(indexpath): return self.open_file(url + "index.html") try: names = os.listdir(path) except os.error, msg: raise IOError, msg, sys.exc_traceback names.sort() s = MyStringIO("file:"+url, {'content-type': 'text/html'}) s.write('\n' % urllib.quote(os.path.join(path, ""))) for name in names: q = urllib.quote(name) s.write('%s\n' % (q, q)) s.seek(0) return s return urllib.FancyURLopener.open_file(self, url) class MyHTMLParser(sgmllib.SGMLParser): def __init__(self, url, verbose=VERBOSE, checker=None): self.myverbose = verbose # now unused self.checker = checker self.base = None self.links = {} self.names = [] self.url = url sgmllib.SGMLParser.__init__(self) def start_a(self, attributes): self.link_attr(attributes, 'href') # We must rescue the NAME # attributes from the anchor, in order to # cache the internal anchors which are made # available in the page. for name, value in attributes: if name == "name": if value in self.names: self.checker.message("WARNING: duplicate name %s in %s", value, self.url) else: self.names.append(value) break def end_a(self): pass def do_area(self, attributes): self.link_attr(attributes, 'href') def do_body(self, attributes): self.link_attr(attributes, 'background', 'bgsound') def do_img(self, attributes): self.link_attr(attributes, 'src', 'lowsrc') def do_frame(self, attributes): self.link_attr(attributes, 'src', 'longdesc') def do_iframe(self, attributes): self.link_attr(attributes, 'src', 'longdesc') def do_link(self, attributes): for name, value in attributes: if name == "rel": parts = string.split(string.lower(value)) if ( parts == ["stylesheet"] or parts == ["alternate", "stylesheet"]): self.link_attr(attributes, "href") break def do_object(self, attributes): self.link_attr(attributes, 'data', 'usemap') def do_script(self, attributes): self.link_attr(attributes, 'src') def do_table(self, attributes): self.link_attr(attributes, 'background') def do_td(self, attributes): self.link_attr(attributes, 'background') def do_th(self, attributes): self.link_attr(attributes, 'background') def do_tr(self, attributes): self.link_attr(attributes, 'background') def link_attr(self, attributes, *args): for name, value in attributes: if name in args: if value: value = string.strip(value) if value: self.links[value] = None def do_base(self, attributes): for name, value in attributes: if name == 'href': if value: value = string.strip(value) if value: if self.checker: self.checker.note(1, " Base %s", value) self.base = value def getlinks(self): return self.links.keys() def getbase(self): return self.base if __name__ == '__main__': main() PythonCard-0.8.2/samples/webgrabber/webgrabber.py0000644000076500007650000001243610114637217021744 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.13 $" __date__ = "$Date: 2004/08/30 14:49:51 $" """ import wx from PythonCard import dialog, model, timer import websucker import sys import os import threading import Queue import time VERBOSE = 2 try: class Canceled(Exception): "Exception used to cancel run()." except (NameError, TypeError): Canceled = __name__ + ".Canceled" class SuckerThread(websucker.Sucker): stopit = 0 savedir = None rootdir = None def __init__(self, msgq): self.msgq = msgq websucker.Sucker.__init__(self) self.setflags(verbose=VERBOSE) self.urlopener.addheaders = [ ('User-agent', 'websucker/%s' % websucker.__version__), ] def message(self, format, *args): if args: format = format%args ##print format self.msgq.put(format) def run1(self, url): try: try: self.reset() self.addroot(url) self.run() except Canceled: self.message("[canceled]") else: self.message("[done]") finally: self.msgq.put(None) def savefile(self, text, path): if self.stopit: raise Canceled websucker.Sucker.savefile(self, text, path) def getpage(self, url): if self.stopit: raise Canceled return websucker.Sucker.getpage(self, url) def savefilename(self, url): path = websucker.Sucker.savefilename(self, url) print "path", path print "self.rootdir", self.rootdir if self.savedir: n = len(self.rootdir) if path[:n] == self.rootdir: path = path[n:] while path[:1] == os.sep: path = path[1:] print "self.savedir", self.savedir print "path", path path = os.path.join(self.savedir, path) return path def XXXaddrobot(self, *args): pass def XXXisallowed(self, *args): return 1 class WebSuckerView(model.Background): #sucker = None #msgq = None def on_initialize(self, event): self.sucker = None self.msgq = None self.clockTimer = timer.Timer(self.components.fldURL, -1) #self.clockTimer.start(100) # 100 milliseconds def on_close(self, event): self.cancel() self.clockTimer.stop() event.skip() def on_timer(self, event): if self.msgq is not None: self.check_msgq() def on_btnDirectory_mouseClick(self, event): dir = self.components.fldDirectory.text if dir == '': dir = self.application.applicationDirectory result = dialog.directoryDialog(self, '', dir) if result.accepted: self.components.fldDirectory.text = result.path def on_btnGo_mouseClick(self, event): self.go() def on_btnCancel_mouseClick(self, event): self.cancel() # the remaining code is a modification of the App class code # in wsgui.py def message(self, text, *args): if args: text = text % args #self.status_label.config(text=text) self.statusBar.text = text def check_msgq(self): while not self.msgq.empty(): msg = self.msgq.get() if msg is None: #self.go_button.configure(state=NORMAL) self.components.btnGo.enabled = 1 #self.auto_button.configure(state=NORMAL) #self.cancel_button.configure(state=DISABLED) self.components.btnCancel.enabled = 0 if self.sucker: self.sucker.stopit = 0 #self.top.bell() else: self.message(msg) #self.top.after(100, self.check_msgq) self.clockTimer.start(100, 1) # 100 milliseconds, one shot def go(self, event=None): if not self.msgq: self.msgq = Queue.Queue(0) self.check_msgq() if not self.sucker: self.sucker = SuckerThread(self.msgq) if self.sucker.stopit: return #self.url_entry.selection_range(0, END) #url = self.url_entry.get() url = self.components.fldURL.text url = url.strip() if not url: #self.top.bell() self.message("[Error: No URL entered]") return self.rooturl = url dir = self.components.fldDirectory.text if not dir: self.sucker.savedir = None else: self.sucker.savedir = dir self.sucker.rootdir = os.path.dirname(websucker.Sucker.savefilename(self.sucker, url)) #self.go_button.configure(state=DISABLED) self.components.btnGo.enabled = 0 #self.auto_button.configure(state=DISABLED) #self.cancel_button.configure(state=NORMAL) self.components.btnCancel.enabled = 1 self.message( '[running...]') self.sucker.stopit = 0 t = threading.Thread(target=self.sucker.run1, args=(url,)) t.start() def cancel(self): if self.sucker: self.sucker.stopit = 1 self.message("[canceling...]") if __name__ == '__main__': app = model.Application(WebSuckerView) app.MainLoop() PythonCard-0.8.2/samples/webgrabber/webgrabber.rsrc.py0000644000076500007650000000271710047606366022723 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'webgrabber', 'backgrounds': [ {'type':'Background', 'name':'bgGrabber', 'title':'webgrabber PythonCard Application', 'size':(540, 172), 'statusBar':1, 'menubar': {'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ {'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit', }, ] }, ] }, 'components': [ {'type':'TextField', 'name':'fldURL', 'position':(65, 0), 'size':(466, -1), }, {'type':'TextField', 'name':'fldDirectory', 'position':(65, 30), 'size':(370, -1), }, {'type':'StaticText', 'name':'stcDirectory', 'position':(0, 30), 'text':'Directory:', }, {'type':'StaticText', 'name':'stcURL', 'position':(0, 5), 'text':'URL:', }, {'type':'Button', 'name':'btnDirectory', 'position':(455, 30), 'label':'Directory...', }, {'type':'Button', 'name':'btnGo', 'position':(360, 70), 'label':'Go', 'default':1, }, {'type':'Button', 'name':'btnCancel', 'position':(455, 70), 'label':'Cancel', }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/samples/webgrabber/websucker.py0000644000076500007650000000655307477707247021662 0ustar alexalex00000000000000#! /usr/bin/env python """A variant on webchecker that creates a mirror copy of a remote site.""" __version__ = "$Revision: 1.1 $" import os import sys import string import urllib import getopt import webchecker # Extract real version number if necessary if __version__[0] == '$': _v = string.split(__version__) if len(_v) == 3: __version__ = _v[1] def main(): verbose = webchecker.VERBOSE try: opts, args = getopt.getopt(sys.argv[1:], "qv") except getopt.error, msg: print msg print "usage:", sys.argv[0], "[-qv] ... [rooturl] ..." return 2 for o, a in opts: if o == "-q": verbose = 0 if o == "-v": verbose = verbose + 1 c = Sucker() c.setflags(verbose=verbose) c.urlopener.addheaders = [ ('User-agent', 'websucker/%s' % __version__), ] for arg in args: print "Adding root", arg c.addroot(arg) print "Run..." c.run() class Sucker(webchecker.Checker): checkext = 0 nonames = 1 # SAM 11/13/99: in general, URLs are now URL pairs. # Since we've suppressed name anchor checking, # we can ignore the second dimension. def readhtml(self, url_pair): url = url_pair[0] text = None path = self.savefilename(url) try: f = open(path, "rb") except IOError: f = self.openpage(url_pair) if f: info = f.info() nurl = f.geturl() if nurl != url: url = nurl path = self.savefilename(url) text = f.read() f.close() self.savefile(text, path) if not self.checkforhtml(info, url): text = None else: if self.checkforhtml({}, url): text = f.read() f.close() return text, url def savefile(self, text, path): dir, base = os.path.split(path) makedirs(dir) try: f = open(path, "wb") f.write(text) f.close() self.message("saved %s", path) except IOError, msg: self.message("didn't save %s: %s", path, str(msg)) def savefilename(self, url): type, rest = urllib.splittype(url) host, path = urllib.splithost(rest) while path[:1] == "/": path = path[1:] user, host = urllib.splituser(host) host, port = urllib.splitnport(host) host = string.lower(host) if not path or path[-1] == "/": path = path + "index.html" if os.sep != "/": path = string.join(string.split(path, "/"), os.sep) if os.name == "mac": path = os.sep + path path = os.path.join(host, path) return path def makedirs(dir): if not dir: return if os.path.exists(dir): if not os.path.isdir(dir): try: os.rename(dir, dir + ".bak") os.mkdir(dir) os.rename(dir + ".bak", os.path.join(dir, "index.html")) except os.error: pass return head, tail = os.path.split(dir) if not tail: print "Huh? Don't know how to make dir", dir return makedirs(head) os.mkdir(dir, 0777) if __name__ == '__main__': sys.exit(main() or 0) PythonCard-0.8.2/samples/webserver/0000755000076500007650000000000010434046772017171 5ustar alexalex00000000000000PythonCard-0.8.2/samples/webserver/console_server.py0000644000076500007650000000251510053523531022564 0ustar alexalex00000000000000#!/usr/bin/python ############################################ # implement a HTTP server in Python which # knows how to run server-side CGI scripts; # change root dir for your server machine ############################################ import os from BaseHTTPServer import HTTPServer from CGIHTTPServer import CGIHTTPRequestHandler import socket class MyRequestHandler(CGIHTTPRequestHandler): def is_python(self, path): """Test whether argument path is a Python script.""" head, tail = os.path.splitext(path) return tail.lower() in (".py", ".pyw", ".cgi") class localServer(HTTPServer): def __init__(self, server_address, RequestHandlerClass): self.allowAny = 0 self.validIPList = ['127.0.0.1'] # add host IP address that this server is running on self.validIPList.append(socket.gethostbyname(socket.gethostname())) HTTPServer.__init__(self, server_address, RequestHandlerClass) def verify_request(self, request, client_address): if self.allowAny or client_address[0] in self.validIPList: return 1 else: return 0 if __name__ == '__main__': os.chdir("html") # my hostname, portnumber srvraddr = ('', 8000) srvrobj = localServer(srvraddr, MyRequestHandler) # run as perpetual demon srvrobj.serve_forever() PythonCard-0.8.2/samples/webserver/html/0000755000076500007650000000000010434046772020135 5ustar alexalex00000000000000PythonCard-0.8.2/samples/webserver/html/cgi-bin/0000755000076500007650000000000010434046772021445 5ustar alexalex00000000000000PythonCard-0.8.2/samples/webserver/html/cgi-bin/contacts.py0000644000076500007650000000453110313163032023621 0ustar alexalex00000000000000#!/usr/bin/python import os, sys import cgi from PythonCard import util DATA_FILE = ["..", "..", "addresses", "data.txt"] FIELD_ORDER = ['Name', 'Company', 'Street', 'State', 'Zip', 'Phone1', 'Phone2', 'Phone3', 'Phone4', 'Notes'] class Document: def __init__(self, filename): self.current = -1 #self.fieldNames = self.getFieldNames() if filename is None: self.records = [] else: self.filename = filename self.openFile(filename) def openFile(self, filename): self.records = [] self.filename = filename try: if os.path.exists(filename): addresses = util.readAndEvalFile(filename) for c in addresses: self.records.append(c) if self.current == -1 and len(self.records) > 0: #self.displayRecord(0) pass except Exception, msg: pass def findRecords(self, fields, value): results = [] for record in self.records: for field in fields: if record[field].lower().find(value) != -1: results.append(record) continue return results # probably want to stick this in a table def printRecord(record): #keys = record.keys() #keys.sort() #for k in keys: for k in FIELD_ORDER: # on the off chance the field doesn't exist in the record # use try/except try: s = record[k] if s == '': # skip empty fields continue s = s.replace('\n\n', '

') s = s.replace('\n', '
') print "%s: %s
" % (k, s) except Exception, msg: pass print "


" path = os.sep.join(DATA_FILE) document = Document(path) form = cgi.FieldStorage() name = form['name'].value.lower() results = document.findRecords(['Name', 'Company'], name) print "Content-type: text/html\r\n\r\n", print '' print "" # change this so the CGI is also the form print "Search for %s
" % name #print "Path: %s
" % os.path.abspath(path) #print "exists: %s
" % str(os.path.exists(path)) for record in results: printRecord(record) #print "" print "" PythonCard-0.8.2/samples/webserver/html/cgi-bin/file_upload.py0000644000076500007650000000245310313163032024267 0ustar alexalex00000000000000#!/usr/bin/python import cgi, sys, os UPLOADSSDIR = '..' + os.sep + 'uploads' form = cgi.FieldStorage() fileitem = form["input_file"] print "Content-type: text/html\r\n\r\n", print "File Upload Result" if fileitem.filename and fileitem.file: # it is important to restrict uploads to a particular # user-specified directory rather than using # the path of the uploaded file # the extension could still be bogus or the contents # could contain a virus, trojan, etc., but that # is something the user has to watch out for dir = UPLOADSSDIR target = fileitem.filename target = target.replace(':', '/') target = target.replace('\\', '/') filename = target.split('/')[-1] try: path = os.path.join(dir, filename) # we could check for file existance and not write the file # if it already exists fp = open(path, 'wb') fp.write(fileitem.file.read()) fp.close() print "Upload of file %s was successful." % filename except Exception, msg: # Should check for a particular Exception print "Upload of file %s failed." % filename else: print "Please provide a file to upload. Hit the Back button in your browser to try again." print "" PythonCard-0.8.2/samples/webserver/html/cgi-bin/testenv.py0000644000076500007650000000061710101747202023476 0ustar alexalex00000000000000#!/usr/bin/python print "Content-type: text/html\r\n\r\n", print '' print "" print "
"
import os, sys
from cgi import escape
print "Python %s" % sys.version
keys = os.environ.keys()
keys.sort()
for k in keys:
    print "%s\t%s" % (escape(k), escape(os.environ[k]))
print "
" print "" PythonCard-0.8.2/samples/webserver/html/cgi-bin/testIgnore.py0000644000076500007650000000016010053523531024125 0ustar alexalex00000000000000# ignore is a regular expression that will match the filenames # for the modules to exclude. ignore = '.*\.py$' PythonCard-0.8.2/samples/webserver/html/cgi-bin/webservices.py0000644000076500007650000000557310313163032024333 0ustar alexalex00000000000000#!/usr/bin/python """CGI wrapper for implementing an XML-RPC server Any .py scripts in the WEBSERVICESDIR directory (defined below) will be accessible via XML-RPC by using the URL of this CGI script as the XML-RPC server. Example: - This script is at http://diveintomark.org/cgi-bin/webservices.cgi - sample.py is in WEBSERVICESDIR and contains this function: def helloWorld(): return "Hello World!" - From the client, you would invoke it like this: >>> import xmlrpclib >>> server = xmlrpclib.Server('http://diveintomark.org/cgi-bin/webservices.cgi') >>> server.sample.helloWorld() 'Hello World!' The WEBSERVICESDIR can contain as many services as you like, each in its own .py file. The .py files are imported like normal modules, so all the normal Python tricks apply: you can have module-level globals, or hide functions by naming them starting with "_". """ # KEA 2002-06-09 # I removed the $ $ below to preserve Mark's info # when this file gets checked into cvs __author__ = "Mark Pilgrim (f8dy@diveintomark.org)" __version__ = "Revision: 1.1.1.1 " __date__ = "Date: 2002/02/21 19:20:22 " __copyright__ = "Copyright (c) 2002 Mark Pilgrim" __license__ = "Python" import os, sys import xmlrpclib # directory of web service-enabled scripts #WEBSERVICESDIR = '../../../webservices/' WEBSERVICESDIR = '..' + os.sep + 'webservices' # maximum allowed length of XML-RPC request (in bytes) MAXREQUESTLENGTH = 10000 def isAvailable(modulename): def getFullPath(filename): return os.path.join(WEBSERVICESDIR, filename) def isModuleOrFolder(filename): return os.path.isdir(filename) or os.path.splitext(filename)[1] == '.py' def stripName(filename): return os.path.splitext(os.path.split(filename)[1])[0] all = map(getFullPath, os.listdir(WEBSERVICESDIR)) some = filter(isModuleOrFolder, all) stripped = map(stripName, some) return modulename in stripped def dispatch(method, params): modulename, functionname = method.split('.', 1) if not isAvailable(modulename): raise ImportError, 'Requested service not found' sys.path.insert(0, WEBSERVICESDIR) m = __import__(modulename) result = apply(getattr(m, functionname), params) result = (result,) return result def main(): try: contentLength = int(os.environ["CONTENT_LENGTH"]) if contentLength > MAXREQUESTLENGTH: raise ValueError, 'Request too large' data = sys.stdin.read(contentLength) params, method = xmlrpclib.loads(data) result = dispatch(method, params) response = xmlrpclib.dumps(result, methodresponse=1) except Exception, msg: # Should test for a particular Exception response = xmlrpclib.dumps(xmlrpclib.Fault(1, "%s: %s" % sys.exc_info()[:2])) print 'Content-type: text/xml' print 'Content-length: %s' % len(response) print print response if __name__ == '__main__': main() PythonCard-0.8.2/samples/webserver/html/contacts.html0000644000076500007650000000044207500700630022627 0ustar alexalex00000000000000 Contacts Search
Find name:
PythonCard-0.8.2/samples/webserver/html/file_upload.html0000644000076500007650000000050307536765276023324 0ustar alexalex00000000000000 Upload File

File name:

PythonCard-0.8.2/samples/webserver/oldModsWebserver.py0000644000076500007650000004463310313163032023024 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.2 $" __date__ = "$Date: 2005/09/18 03:59:22 $" """ import wx from PythonCard import configuration, model import os, sys import shutil from BaseHTTPServer import HTTPServer import CGIHTTPServer from CGIHTTPServer import CGIHTTPRequestHandler import threading import Queue import ConfigParser import socket # imports needed code is moved back into standard libs import urllib import select CONFIG_FILE = 'webserver.ini' # a backwards compatible date_time_string function # with the one in BaseHTTPRequestHandler # it seems like this should be moved and made a function # as I've done below import time import rfc822 weekdayname = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] monthname = [None, 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] def date_time_string(t=None): global weekdayname, monthname """Return the current date and time formatted for a message header.""" if not t: t = time.time() # assume user supplied time value will be local, not gmt! year, month, day, hh, mm, ss, wd, y, z = time.gmtime(t) s = "%s, %02d %3s %4d %02d:%02d:%02d GMT" % ( weekdayname[wd], day, monthname[month], year, hh, mm, ss) return s class MyRequestHandler(CGIHTTPRequestHandler): # the server variable contains the reference back to the view def log_message(self, format, *args): msg = "%s - - [%s] %s\n" % (self.address_string(), self.log_date_time_string(), format%args) if format.startswith('"%s"'): self.server._notify_window.msgQueue.put(msg) wx.WakeUpIdle() # just log to the GUI now, this could go to a file as well else: # don't put CGI error and exit status messages in the main log print msg cgi_extensions = [".py", ".pyw", ".cgi"] def is_python(self, path): """Test whether argument path is a Python script.""" head, tail = os.path.splitext(path) return tail.lower() in self.cgi_extensions # this is a modification to run_cgi in CGIHTTPRequestHandler # to deal with the IE POST bug which should get fixed in # Python 2.2.2 and 2.3 # the only additions are under the comment starting with KEA def run_cgi(self): """Execute a CGI script.""" dir, rest = self.cgi_info i = rest.rfind('?') if i >= 0: rest, query = rest[:i], rest[i+1:] else: query = '' i = rest.find('/') if i >= 0: script, rest = rest[:i], rest[i:] else: script, rest = rest, '' scriptname = dir + '/' + script scriptfile = self.translate_path(scriptname) if not os.path.exists(scriptfile): self.send_error(404, "No such CGI script (%s)" % `scriptname`) return if not os.path.isfile(scriptfile): self.send_error(403, "CGI script is not a plain file (%s)" % `scriptname`) return ispy = self.is_python(scriptname) if not ispy: if not (self.have_fork or self.have_popen2 or self.have_popen3): self.send_error(403, "CGI script is not a Python script (%s)" % `scriptname`) return # KEA 2002-09-17 # it is a pain to have to chmod on CGIs # and this is a personal server, so skip this check #if not self.is_executable(scriptfile): # self.send_error(403, "CGI script is not executable (%s)" % # `scriptname`) # return # Reference: http://hoohoo.ncsa.uiuc.edu/cgi/env.html # XXX Much of the following could be prepared ahead of time! env = {} env['SERVER_SOFTWARE'] = self.version_string() env['SERVER_NAME'] = self.server.server_name env['GATEWAY_INTERFACE'] = 'CGI/1.1' env['SERVER_PROTOCOL'] = self.protocol_version env['SERVER_PORT'] = str(self.server.server_port) env['REQUEST_METHOD'] = self.command uqrest = urllib.unquote(rest) env['PATH_INFO'] = uqrest env['PATH_TRANSLATED'] = self.translate_path(uqrest) env['SCRIPT_NAME'] = scriptname if query: env['QUERY_STRING'] = query host = self.address_string() if host != self.client_address[0]: env['REMOTE_HOST'] = host env['REMOTE_ADDR'] = self.client_address[0] # XXX AUTH_TYPE # XXX REMOTE_USER # XXX REMOTE_IDENT if self.headers.typeheader is None: env['CONTENT_TYPE'] = self.headers.type else: env['CONTENT_TYPE'] = self.headers.typeheader length = self.headers.getheader('content-length') if length: env['CONTENT_LENGTH'] = length accept = [] for line in self.headers.getallmatchingheaders('accept'): if line[:1] in "\t\n\r ": accept.append(line.strip()) else: accept = accept + line[7:].split(',') env['HTTP_ACCEPT'] = ','.join(accept) ua = self.headers.getheader('user-agent') if ua: env['HTTP_USER_AGENT'] = ua co = filter(None, self.headers.getheaders('cookie')) if co: env['HTTP_COOKIE'] = ', '.join(co) # XXX Other HTTP_* headers if self.have_fork: # KEA 2002-09-15 # make sure CGIs have access to os.environ env.update(os.environ) else: # Since we're setting the env in the parent, provide empty # values to override previously set values for k in ('QUERY_STRING', 'REMOTE_HOST', 'CONTENT_LENGTH', 'HTTP_USER_AGENT', 'HTTP_COOKIE'): env.setdefault(k, "") self.send_response(200, "Script output follows") decoded_query = query.replace('+', ' ') if self.have_fork: # Unix -- fork as we should args = [script] if '=' not in decoded_query: args.append(decoded_query) # KEA 2002-09-15 # we want to run as the same user # that started the server so we have access # to their files #nobody = CGIHTTPServer.nobody_uid() # KEA # not supposed to flush on Mac OS X #self.rfile.flush() # Always flush before forking self.wfile.flush() # Always flush before forking pid = os.fork() if pid != 0: # Parent pid, sts = os.waitpid(pid, 0) # throw away additional data [see bug #427345] while select.select([self.rfile], [], [], 0)[0]: waste = self.rfile.read(1) if sts: self.log_error("CGI script exit status %#x", sts) return # Child try: # KEA 2002-09-15 # see nobody comment above #try: # os.setuid(nobody) #except os.error: # pass os.dup2(self.rfile.fileno(), 0) os.dup2(self.wfile.fileno(), 1) os.execve(scriptfile, args, env) except Exception, msg: # Should test for a particular Exception self.server.handle_error(self.request, self.client_address) os._exit(127) elif self.have_popen2 or self.have_popen3: # Windows -- use popen2 or popen3 to create a subprocess import shutil if self.have_popen3: popenx = os.popen3 else: popenx = os.popen2 os.environ.update(env) cmdline = scriptfile if self.is_python(scriptfile): interp = sys.executable if interp.lower().endswith("w.exe"): # On Windows, use python.exe, not pythonw.exe interp = interp[:-5] + interp[-4:] cmdline = "%s -u %s" % (interp, cmdline) if '=' not in query and '"' not in query: cmdline = '%s "%s"' % (cmdline, query) self.log_message("command: %s", cmdline) try: nbytes = int(length) except Exception, msg: # Should test for a particular Exception nbytes = 0 files = popenx(cmdline, 'b') fi = files[0] fo = files[1] if self.have_popen3: fe = files[2] if self.command.lower() == "post" and nbytes > 0: data = self.rfile.read(nbytes) fi.write(data) # KEA now throw away data past Content-length while select.select([self.rfile._sock], [], [], 0)[0] != []: waste = self.rfile._sock.recv(1) fi.close() shutil.copyfileobj(fo, self.wfile) if self.have_popen3: errors = fe.read() fe.close() if errors: self.log_error('%s', errors) sts = fo.close() if sts: self.log_error("CGI script exit status %#x", sts) else: self.log_message("CGI script exited OK") else: # Other O.S. -- execute script in this process os.environ.update(env) save_argv = sys.argv save_stdin = sys.stdin save_stdout = sys.stdout save_stderr = sys.stderr try: try: sys.argv = [scriptfile] if '=' not in decoded_query: sys.argv.append(decoded_query) sys.stdout = self.wfile sys.stdin = self.rfile execfile(scriptfile, {"__name__": "__main__"}) finally: sys.argv = save_argv sys.stdin = save_stdin sys.stdout = save_stdout sys.stderr = save_stderr except SystemExit, sts: self.log_error("CGI script exit status %s", str(sts)) else: self.log_message("CGI script exited OK") # replacement for SimpleHTTPServer.SimpleHTTPRequestHandler.send_head # which should eventually make its way back into the # SimpleHTTPServer in Python 2.2.2 and 2.3 # this version handles If-Modified-Since and 304 responses and # sends the Content-Length def send_head(self): """Common code for GET and HEAD commands. This sends the response code and MIME headers. Return value is either a file object (which has to be copied to the outputfile by the caller unless the command was HEAD, and must be closed by the caller under all circumstances), or None, in which case the caller has nothing further to do. """ """Version of send_head that support CGI scripts""" ## print self.command ## print self.request_version ## print self.path ## print self.headers if self.is_cgi(): return self.run_cgi() #else: # return SimpleHTTPServer.SimpleHTTPRequestHandler.send_head(self) path = self.translate_path(self.path) f = None if os.path.isdir(path): for index in "index.html", "index.htm": index = os.path.join(path, index) if os.path.exists(index): path = index break else: return self.list_directory(path) ctype = self.guess_type(path) if ctype.startswith('text/'): mode = 'r' else: mode = 'rb' try: f = open(path, mode) except IOError: self.send_error(404, "File not found") return None try: s = os.stat(path) # the os.stat modified time should be local # mdt is only used for comparisons below now mdt = time.gmtime(s[8]) lastModified = date_time_string(s[8]) size = str(s[6]) except Exception, msg: # Should test for a particular exception mdt = None lastModified = None size = None ims = self.headers.getheader('if-modified-since') not_modified = 0 if ims and mdt: # items 6, 7, 8 of parsedate will be usable # so those aren't used in the comparison below # see http://www.python.org/doc/current/lib/module-rfc822.html sdt = rfc822.parsedate(ims.split(';')[0]) if mdt[:6] <= sdt[:6]: not_modified = 1 # don't send back a file if 304 f = None if not_modified: self.send_response(304) else: # note that send_response doesn't currently # accept an optional size parameter, so it can't # pass on the size to log_request # I've provided a backward-compatible version below that uses # a named argument self.send_response(200, size=size) if lastModified: self.send_header("Last-Modified", lastModified) if size: self.send_header("Content-Length", size) self.send_header("Content-type", ctype) self.end_headers() return f # replacement for send_response in BaseHTTPRequestHandler # that accepts a named size parameter def send_response(self, code, message=None, size=None): """Send the response header and log the response code. Also send two standard headers with the server software version and the current date. """ if size: self.log_request(code, size) else: self.log_request(code) if message is None: if code in self.responses: message = self.responses[code][0] else: message = '' if self.request_version != 'HTTP/0.9': self.wfile.write("%s %s %s\r\n" % (self.protocol_version, str(code), message)) self.send_header('Server', self.version_string()) self.send_header('Date', self.date_time_string()) class WebServer(HTTPServer): def __init__(self, notify_window, server_address, RequestHandlerClass, validIPList=None): self._notify_window = notify_window # this list will come from a config file # and there will be a dialog to edit the valid IP addresses if validIPList: self.validIPList = validIPList else: self.validIPList = ['127.0.0.1'] # add host IP address that this server is running on self.validIPList.append(socket.gethostbyname(socket.gethostname())) self.allowAny = 0 HTTPServer.__init__(self, server_address, RequestHandlerClass) def verify_request(self, request, client_address): if self.allowAny or client_address[0] in self.validIPList: return 1 else: return 0 # just a guess that this is how we should use threads def server(self): self.serve_forever() class WebServerView(model.Background): def on_initialize(self, event): self.initSizers() self.loadConfig() # if you wanted to limit the on screen log size, then set # this to something other than 0 self.maxSizeLog = 0 # Set up event handler for any worker thread results """ Robin said: The Queue class is thread-safe, using a mutex and semaphore to protect access to its contents, so is ideally suited for something like this. """ self.msgQueue = Queue.Queue() os.chdir(self.htdocs) self.srvraddr = ('', self.port) # give the server and request handlers # a reference back to the view for logging self.webServer = WebServer(self, self.srvraddr, MyRequestHandler, self.validIPList) self.thread = threading.Thread(target = self.webServer.server) # I think this allows Python to kill the thread when we quit wxPython # setDaemon must be called before start self.thread.setDaemon(1) self.thread.start() def loadConfig(self): self.configPath = os.path.join(configuration.homedir, 'webserver') if not os.path.exists(self.configPath): os.mkdir(self.configPath) configPath = os.path.join(self.configPath, CONFIG_FILE) defaultPath = os.path.join(self.application.applicationDirectory, CONFIG_FILE) if not os.path.exists(configPath): shutil.copy2(defaultPath, configPath) parser = ConfigParser.ConfigParser() parser.read(configPath) self.htdocs = parser.get('ConfigData', 'htdocs') self.port = int(parser.get('ConfigData', 'port')) ips = parser.get('ConfigData', 'iplist') self.validIPList = ips.split(',') def initSizers(self): sizer1 = wx.BoxSizer(wx.VERTICAL) sizer1.Add(self.components.fldLog, 1, wx.EXPAND) sizer1.Fit(self) sizer1.SetSizeHints(self) self.panel.SetSizer(sizer1) self.panel.SetAutoLayout(1) self.panel.Layout() def on_idle(self, event): if not self.msgQueue.empty(): msg = self.msgQueue.get() self.doLogResult(msg) event.RequestMore() def doLogResult(self, data): if data is not None: # code borrowed from the Message Watcher event history display log = self.components.fldLog log.SetReadOnly(0) if self.maxSizeLog and log.GetLength() > self.maxSizeLog: # delete many lines at once to reduce overhead text = log.GetText() endDel = text.index('\n', self.maxSizeLog / 10) + 1 log.SetTargetStart(0) log.SetTargetEnd(endDel) log.ReplaceTarget("") log.GotoPos(log.GetLength()) log.AddText(data) log.GotoPos(log.GetLength()) log.SetReadOnly(1) else: pass def on_menuOptionsAllowAny_select(self, event): self.webServer.allowAny = self.menuBar.getChecked('menuOptionsAllowAny') if __name__ == '__main__': app = model.Application(WebServerView) app.MainLoop() PythonCard-0.8.2/samples/webserver/readme.txt0000644000076500007650000000526710105732474021175 0ustar alexalex00000000000000webserver is a simple front-end to the HTTP server classes. It supports HEAD, GET, and POST requests for files and CGI scripts. An example CGI script is provided to test environment variables. Place any files you want to serve in the HTML directory or change the default HTML directory to another location. After you've started the server you should be able to connect to it from your machine using the URL http://localhost:8000/ or http://127.0.0.1:8000/ You'll need to add additional IP addresses to the validIPList if you would like other machines on your LAN or friends on the Internet to connect to your machine for exchanging files, etc. The reason the server is restrictive about what IP addresses are allowed to connect is that the server and CGI implementation provided in the Python Standard Libraries may have security holes. It is a bad idea to allow arbitrary connections to your machine. On Windows I think you need to start python with the -u option, unbuffered binary stdout and stderr (also PYTHONUNBUFFERED=x) for CGIs that process or output binary data to work correctly, but this may no longer be necessary with Python 2.2.1 or later. For comparison, I've also provided a console_server.py file which will run without a GUI. When ConfigParser support is added to the GUI front-end server the console_server.py file will be updated to read the same configs. For more information see: http://www.python.org/doc/current/lib/module-BaseHTTPServer.html http://www.python.org/doc/current/lib/module-SimpleHTTPServer.html http://www.python.org/doc/current/lib/module-CGIHTTPServer.html Mac OS X and Linux Notes: In order to run CGI scripts on Mac OS X or Linux you will first have to do a chmod +x on the CGI scripts. You may also have to change the #!/usr/bin/python at the top of each CGI script. 2002-06-09 I added Mark Pilgrim's PyWebServices scripts, so the webserver can now act as an XML-RPC server too. After starting up the webserver sample you can test the XML-RPC server capabilities by running the radioclient sample, which automatically shows the shell and imports the xmlrpclib module. Then try this in the shell: >>> server = xmlrpclib.Server('http://localhost:8000/cgi-bin/webservices.py') >>> server.system.listMethods() {'sample.helloWorld()': 'None', 'examples.getStateName(stateIndex)': 'None', 'system.listMethods()': 'None'} >>> server.sample.helloWorld() 'Hello World!' >>> server.examples.getStateName(1) 'Alabama' >>> server.examples.getStateName(50) 'Wyoming' For more information see: http://diveintomark.org/archives/2002/02/07.html#python_web_services http://www.python.org/doc/current/lib/module-xmlrpclib.html http://www.python.org/doc/current/lib/serverproxy-objects.html PythonCard-0.8.2/samples/webserver/runwebserver.bat0000755000076500007650000000002607477242202022412 0ustar alexalex00000000000000python -u webserver.pyPythonCard-0.8.2/samples/webserver/uploads/0000755000076500007650000000000010434046772020640 5ustar alexalex00000000000000PythonCard-0.8.2/samples/webserver/uploads/readme.txt0000644000076500007650000000010607715737164022645 0ustar alexalex00000000000000The file_upload.py script will place uploaded files in this directory.PythonCard-0.8.2/samples/webserver/webserver.ini0000644000076500007650000000007207526775653021714 0ustar alexalex00000000000000[ConfigData] htdocs = html port = 8000 iplist = 127.0.0.1 PythonCard-0.8.2/samples/webserver/webserver.py0000644000076500007650000001472010313163032021534 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.27 $" __date__ = "$Date: 2005/09/18 03:59:22 $" """ import wx from PythonCard import configuration, model import os, sys import shutil from BaseHTTPServer import HTTPServer import CGIHTTPServer from CGIHTTPServer import CGIHTTPRequestHandler import threading import Queue import ConfigParser import socket # imports needed code is moved back into standard libs import urllib import select CONFIG_FILE = 'webserver.ini' # a backwards compatible date_time_string function # with the one in BaseHTTPRequestHandler # it seems like this should be moved and made a function # as I've done below import time import rfc822 weekdayname = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] monthname = [None, 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] def date_time_string(t=None): global weekdayname, monthname """Return the current date and time formatted for a message header.""" if not t: t = time.time() # assume user supplied time value will be local, not gmt! year, month, day, hh, mm, ss, wd, y, z = time.gmtime(t) s = "%s, %02d %3s %4d %02d:%02d:%02d GMT" % ( weekdayname[wd], day, monthname[month], year, hh, mm, ss) return s class MyRequestHandler(CGIHTTPRequestHandler): # the server variable contains the reference back to the view def log_message(self, format, *args): msg = "%s - - [%s] %s\n" % (self.address_string(), self.log_date_time_string(), format%args) if format.startswith('"%s"'): self.server._notify_window.msgQueue.put(msg) wx.WakeUpIdle() # just log to the GUI now, this could go to a file as well else: # don't put CGI error and exit status messages in the main log print msg cgi_extensions = [".py", ".pyw", ".cgi"] def is_python(self, path): """Test whether argument path is a Python script.""" head, tail = os.path.splitext(path) return tail.lower() in self.cgi_extensions class WebServer(HTTPServer): def __init__(self, notify_window, server_address, RequestHandlerClass, validIPList=None): self._notify_window = notify_window # this list will come from a config file # and there will be a dialog to edit the valid IP addresses if validIPList: self.validIPList = validIPList else: self.validIPList = ['127.0.0.1'] # add host IP address that this server is running on # this will fail for address spaces like 10.0.0.x, 192.168.0.x # etc., so what is the appropriate way to add those? # I get errors like # socket.gaierror: (7, 'No address associated with nodename') try: self.validIPList.append(socket.gethostbyname(socket.gethostname())) except Exception, msg: pass self.allowAny = 0 HTTPServer.__init__(self, server_address, RequestHandlerClass) def verify_request(self, request, client_address): if self.allowAny or client_address[0] in self.validIPList: return 1 else: return 0 # just a guess that this is how we should use threads def server(self): self.serve_forever() class WebServerView(model.Background): def on_initialize(self, event): self.initSizers() self.loadConfig() # if you wanted to limit the on screen log size, then set # this to something other than 0 self.maxSizeLog = 0 # Set up event handler for any worker thread results """ Robin said: The Queue class is thread-safe, using a mutex and semaphore to protect access to its contents, so is ideally suited for something like this. """ self.msgQueue = Queue.Queue() os.chdir(self.htdocs) self.srvraddr = ('', self.port) # give the server and request handlers # a reference back to the view for logging self.webServer = WebServer(self, self.srvraddr, MyRequestHandler, self.validIPList) self.thread = threading.Thread(target = self.webServer.server) # I think this allows Python to kill the thread when we quit wxPython # setDaemon must be called before start self.thread.setDaemon(1) self.thread.start() def loadConfig(self): self.configPath = os.path.join(configuration.homedir, 'webserver') if not os.path.exists(self.configPath): os.mkdir(self.configPath) configPath = os.path.join(self.configPath, CONFIG_FILE) defaultPath = os.path.join(self.application.applicationDirectory, CONFIG_FILE) if not os.path.exists(configPath): shutil.copy2(defaultPath, configPath) parser = ConfigParser.ConfigParser() parser.read(configPath) self.htdocs = parser.get('ConfigData', 'htdocs') self.port = int(parser.get('ConfigData', 'port')) ips = parser.get('ConfigData', 'iplist') self.validIPList = ips.split(',') def initSizers(self): sizer1 = wx.BoxSizer(wx.VERTICAL) sizer1.Add(self.components.fldLog, 1, wx.EXPAND) sizer1.Fit(self) sizer1.SetSizeHints(self) self.panel.SetSizer(sizer1) self.panel.SetAutoLayout(1) self.panel.Layout() def on_idle(self, event): if not self.msgQueue.empty(): msg = self.msgQueue.get() self.doLogResult(msg) event.RequestMore() def doLogResult(self, data): if data is not None: # code borrowed from the Message Watcher event history display log = self.components.fldLog log.SetReadOnly(0) if self.maxSizeLog and log.GetLength() > self.maxSizeLog: # delete many lines at once to reduce overhead text = log.GetText() endDel = text.index('\n', self.maxSizeLog / 10) + 1 log.SetTargetStart(0) log.SetTargetEnd(endDel) log.ReplaceTarget("") log.GotoPos(log.GetLength()) log.AddText(data) log.GotoPos(log.GetLength()) log.SetReadOnly(1) else: pass def on_menuOptionsAllowAny_select(self, event): self.webServer.allowAny = self.menuBar.getChecked('menuOptionsAllowAny') if __name__ == '__main__': app = model.Application(WebServerView) app.MainLoop() PythonCard-0.8.2/samples/webserver/webserver.rsrc.py0000644000076500007650000000231310047606366022517 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'WebServer', 'backgrounds': [ {'type':'Background', 'name':'bgWeb', 'title':'WebServer PythonCard Application', 'size':(800, 482), 'style':['resizeable'], 'menubar': {'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ {'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit', }, ] }, {'type':'Menu', 'name':'menuOptions', 'label':'&Options', 'items': [ {'type':'MenuItem', 'name':'menuOptionsAllowAny', 'label':'&Allow any machine to connect', 'checkable':1, }, ] }, ] }, 'components': [ {'type':'CodeEditor', 'name':'fldLog', 'position':(0, 0), 'size':(800, 327), 'editable':0, }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/samples/webserver/webservices/0000755000076500007650000000000010434046772021512 5ustar alexalex00000000000000PythonCard-0.8.2/samples/webserver/webservices/examples.py0000644000076500007650000000160207501304407023672 0ustar alexalex00000000000000states = [ 'Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 'Colorado', 'Connecticut', 'Delaware', 'Florida', 'Georgia', 'Hawaii', 'Idaho', 'Illinois', 'Indiana', 'Iowa', 'Kansas', 'Kentucky', 'Louisiana', 'Maine', 'Maryland', 'Massachusetts', 'Michigan', 'Minnesota', 'Mississippi', 'Missouri', 'Montana', 'Nebraska', 'Nevada', 'New Hampshire', 'New Jersey', 'New Mexico', 'New York', 'North Carolina', 'North Dakota', 'Ohio', 'Oklahoma', 'Oregon', 'Pennsylvania', 'Rhode Island', 'South Carolina', 'South Dakota', 'Tennessee', 'Texas', 'Utah', 'Vermont', 'Virginia', 'Washington', 'West Virginia', 'Wisconsin', 'Wyoming'] def getStateName(stateIndex): return states[stateIndex - 1] PythonCard-0.8.2/samples/webserver/webservices/sample.py0000644000076500007650000000005307501304407023334 0ustar alexalex00000000000000 def helloWorld(): return "Hello World!" PythonCard-0.8.2/samples/webserver/webservices/system.py0000644000076500007650000000324607501304407023406 0ustar alexalex00000000000000"""System web service for meta-information about other available web services""" # KEA 2002-06-09 # I removed the $ $ below to preserve Mark's info # when this file gets checked into cvs __author__ = "Mark Pilgrim (f8dy@diveintomark.org)" __version__ = "Revision: 1.1.1.1 " __date__ = "Date: 2002/02/21 19:20:22" __copyright__ = "Copyright (c) 2002 Mark Pilgrim" __license__ = "Python" import inspect, os, sys #WEBSERVICESDIR = '/home/f8dy/webservices/' WEBSERVICESDIR = '..' + os.sep + 'webservices' + os.sep def _getAvailableServices(dirname): path = os.path.abspath(os.path.split(dirname)[0]) files = os.listdir(path) isService = lambda f: os.path.splitext(f)[1] == '.py' files = filter(isService, files) filenameToModuleName = lambda f: os.path.splitext(f)[0] moduleNames = map(filenameToModuleName, files) sys.path.insert(0, dirname) modules = map(__import__, moduleNames) return modules def _getModuleInfo(module): info = {} for name, f in inspect.getmembers(module, inspect.isfunction): if name[0] != '_': info[name] = {"args":apply(inspect.formatargspec, inspect.getargspec(f)), "doc":inspect.getdoc(f)} return info def listMethods(): rc = {} modules = _getAvailableServices(WEBSERVICESDIR) for module in modules: info = _getModuleInfo(module) for functionname, functioninfo in info.items(): rc[module.__name__ + '.' + functionname + functioninfo['args']] = str(functioninfo['doc']) return rc def _test(): rc = listMethods() for desc, doc in rc.items(): print desc print ' %s' % doc if __name__ == '__main__': _test() PythonCard-0.8.2/samples/widgets/0000755000076500007650000000000010434046772016633 5ustar alexalex00000000000000PythonCard-0.8.2/samples/widgets/edit.gif0000644000076500007650000000117407333605247020254 0ustar alexalex00000000000000GIF89a7Õ?ww€£VVm||žššÁÈÈÌ**6ˆˆ¬ƒƒ‹eenbb|““·››´MMdääå;;I88F‘‘˜mmŠuu—44A¡¡Èon[[pjj…––ƒƒ§BBPss{†…¦rr‚‚¡§§Ï¬¬ÕOOh‹‹°¬¬Ô´´´00<ƒ„§¨§Ï­®ÖnnxŽŽ”®¯Ñgg­¬Õyy—­¬Ô77I–””›SS_˜˜¼»»Ù××Ù¨¨Ãÿ÷™ooOOgÄÄãÿÿÿ!ù?,7ÿÀŸpH,Ȥ²èk:—ÐèÒÙËUجvËíúˆ>Ïgµúza±zÍn»ßêÔ÷ÁÎÍ6"‘ø~.}v~|.„|Œ-|!s>6( dUzM (𡥦 5š5=°²*¥—6xXh%z¼ÃÄÄ/ *-*4±Î4Ѽ/—,œeWNÛáâáè7==3ïî==ÛÙ ¾yd%>-ô (P‚ôˆpðB¼#*Ð'áŽ#ºuòñOÆ AnˆÐ®@$M˜X¸2BK0b¸TáÄ ~ÀôhÐp‚çΙŸ;{ HЉ&€%ceÓìØ©àƒ¹¼éù'«×¯`=Xá ‡ܹ[a Ûô `½`u„-ÿìêÝË×®Çh¸ðƒÀ„Ûpi "KnÒà± –3?Æœ™³f ž5ë`,ƨE F#†Õ©W¿^M[6ìÛµS¿žSÚ‹ïßÀŸHNJ;PythonCard-0.8.2/samples/widgets/readme.txt0000644000076500007650000000106410124034763020623 0ustar alexalex00000000000000widgets shows off all the PythonCard widgets. You can set many of the attributes to see how it impacts each widget type. The "Create Component Docs..." menu item lets you choose a directory to save a set of HTML documentation for the PythonCard components. A "components" directory will be created in the directory you choose with a file for each component that contains the list of attributes and events. You should choose the PythonCard/docs/html/framework directory as the save directory if you want to be able to follow links from the components.html file. PythonCard-0.8.2/samples/widgets/tile.bmp0000644000076500007650000005134607333605247020303 0ustar alexalex00000000000000BMæR6(TT°R­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ²¥µ²¥µ²¥µ²¥µ²¥µ²¥­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µªœµªœµªœµªœµªœµªœ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”½²¥½²¥½²¥½²¥½²¥½²¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®œµ®œµ®œµ®œµ®œµ®œ­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”µ®¥µ®¥µ®¥µ®¥µ®¥µ®¥­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”­¦”PythonCard-0.8.2/samples/widgets/widgets.html0000644000076500007650000000073007463777437021210 0ustar alexalex00000000000000 Simple HTML Example

Hello HTML

simple tables
images
and...links
see the readme.txt for more info
PythonCard-0.8.2/samples/widgets/widgets.py0000644000076500007650000002400210355044311020636 0ustar alexalex00000000000000#!/usr/bin/python """ KEA notes to myself __version__ = "$Revision: 1.45 $" __date__ = "$Date: 2005/12/29 20:36:25 $" __author__ = "Kevin Altis " """ from PythonCard import dialog, model BORDER = 5 RESIZE_LEFT = 1 RESIZE_RIGHT = 2 DRAG_X = 3 RESIZE_TOP = 4 RESIZE_BOTTOM = 5 DRAG_Y = 6 class WidgetsTest(model.Background): """ All the widgets that can be changed have a three-letter prefix followed by the actual classname to distinguish them from other widgets in the background. Compare the method of changing the attribute state in on_chkEnabled_mouseClick versus on_chkVisible_mouseClick. I'm using self.components.itervalues() to iterate over a list of all the widgets at once. """ def on_initialize(self, event): self.bitmapCanvasTest() def on_sldSlider_select(self, event): self.components.fldTextField.text = str(event.target.value) """ def on_spnSpinner_spinUp(self, event): event.target.value = event.target.value + 1 def on_spnSpinner_spinDown(self, event): event.target.value = event.target.value - 1 """ def bitmapCanvasTest(self): canvas = self.components.bmpBitmapCanvas canvas.drawPoint((5, 5)) canvas.foregroundColor = 'red' canvas.drawLine((5, 10), (20, 30)) canvas.foregroundColor = 'blue' canvas.drawRectangle((25, 5), (30, 20)) canvas.drawText('Text', (5, 30)) canvas.drawRotatedText('Rotated', (60, 40), 90) canvas.foregroundColor = 'gray' canvas.fillColor = 'gray' canvas.drawEllipse((80, 5), (30, 30)) def on_chkEnabled_mouseClick(self, event): checked = event.target.checked for w in self.components.itervalues(): # for btnButton, wType would be widget.Button # __class__ would be widget.Button # we can't use isinstance unless we put it in a try/except # block because isinstance requires a valid class as the # 2nd argument, so passing in "elTextField" or something like # that triggers an exception # KEA 2001-08-09 # need a better way of getting the widget prefix dynamically # I've just gone soft in the head and can't see the right way here if w.__class__.__name__.startswith(w.name[3:]): w.enabled = checked self.components.fldTextFieldNoBorder.enabled = checked def on_chkVisible_mouseClick(self, event): checked = event.target.checked for w in self.components.itervalues(): if w.__class__.__name__.startswith(w.name[3:]): w.visible = checked self.components.fldTextFieldNoBorder.visible = checked # editable only applies to TextField, PasswordField, and TextArea def on_chkEditable_mouseClick(self, event): checked = event.target.checked self.components.fldTextField.editable = checked self.components.fldPasswordField.editable = checked self.components.fldTextArea.editable = checked self.components.fldTextFieldNoBorder.editable = checked def on_btnBackgroundColor_mouseClick(self, event): result = dialog.colorDialog(self) if result.accepted: color = result.color for w in self.components.itervalues(): if w.__class__.__name__.startswith(w.name[3:]): w.backgroundColor = color self.components.fldTextFieldNoBorder.backgroundColor = color # compare this method of expliciting setting each component # one at a time compared to the for loop above def on_btnForegroundColor_mouseClick(self, event): result = dialog.colorDialog(self) if result.accepted: color = result.color # print color self.components.btnButton.foregroundColor = color self.components.fldTextField.foregroundColor = color self.components.fldPasswordField.foregroundColor = color self.components.fldTextArea.foregroundColor = color self.components.txtStaticText.foregroundColor = color self.components.chkCheckBox.foregroundColor = color self.components.chkToggleButton.foregroundColor = color self.components.radRadioGroup.foregroundColor = color self.components.popChoice.foregroundColor = color self.components.lstList.foregroundColor = color self.components.sldSlider.foregroundColor = color self.components.imgImage.foregroundColor = color self.components.imgImageButton.foregroundColor = color self.components.fldTextFieldNoBorder.foregroundColor = color self.components.calCalendar.foregroundColor = color self.components.cmbComboBox.foregroundColor = color self.components.gagGauge.foregroundColor = color self.components.spnSpinner.foregroundColor = color self.components.linStaticLine.foregroundColor = color self.components.stbStaticBox.foregroundColor = color def on_btnFont_mouseClick(self, event): result = dialog.fontDialog(self, self.components.btnButton.font) if result.accepted: #color = result.color font = result.font for w in self.components.itervalues(): if w.__class__.__name__.startswith(w.name[3:]): w.font = font self.components.fldTextFieldNoBorder.font = font def on_btnToolTip_mouseClick(self, event): result = dialog.textEntryDialog(self, 'Enter a toolTip:', 'ToolTip', 'Hello toolTip') if result.accepted: txt = result.text for w in self.components.itervalues(): if w.__class__.__name__.startswith(w.name[3:]): w.toolTip = txt def on_btnBgBackgroundColor_mouseClick(self, event): result = dialog.colorDialog(self) if result.accepted: color = result.color self.backgroundColor = color """ experimental drag and resize code hold down the control key and mouseDown to drag a widget hold down the control key and mouseDown within 5 pixels of the edge of the widget to resize This seems to work okay on Windows, but not so well on Linux. My algorithm is probably not very good. """ def on_mouseDown(self, event): global BORDER if event.controlDown: # record the starting location so, that the drags are # always relative and the widget won't jump around self.dragOffset = event.position xClick, yClick = self.dragOffset size = event.target.size rect = (0, 0, size[0] - BORDER, size[1] - BORDER) print rect print xClick, yClick if xClick < BORDER: print "resize left" self.xOp = RESIZE_LEFT elif xClick > rect[2]: print "resize right" self.xOp = RESIZE_RIGHT else: print "drag x" self.xOp = DRAG_X if yClick < BORDER: print "resize top" self.yOp = RESIZE_TOP elif yClick > rect[3]: print "resize bottom" self.yOp = RESIZE_BOTTOM else: print "drag y" self.yOp = DRAG_Y event.skip() def on_mouseDrag(self, event): target = event.target if event.controlDown: xPos, yPos = target.position width, height = target.size newWidth = width newHeight = height print "xPos %d, yPos %d" % (xPos, yPos) if self.xOp == DRAG_X and self.yOp == DRAG_Y: xOff = xPos + event.x - self.dragOffset[0] yOff = yPos + event.y - self.dragOffset[1] print "xOff %d, yOff %d" % (xOff, yOff) target.position = (xOff, yOff) else: xOff = xPos if self.xOp == RESIZE_LEFT: # both width and the x position have to change xOff = xPos + event.x - self.dragOffset[0] newWidth = width + xPos - xOff #event.x + self.dragOffset[0] elif self.xOp == RESIZE_RIGHT: # RESIZE_RIGHT #newWidth += event.x - self.dragOffset[0] #newWidth += 1 newWidth = event.x print "width %d, newWidth %d" % (width, newWidth) yOff = yPos if self.yOp == RESIZE_TOP: # both height and the y position have to change yOff = yPos + event.y - self.dragOffset[1] newHeight = height + yPos - yOff #event.y + self.dragOffset[1] elif self.yOp == RESIZE_BOTTOM: # RESIZE_BOTTOM #newHeight += event.y - self.dragOffset[1] #newHeight += 1 newHeight = event.y print "height %d, newHeight %d" % (height, newHeight) print "xOff %d, yOff %d" % (xOff, yOff) if xPos != xOff or yPos != yOff: target.position = (xOff, yOff) if width != newWidth or height != newHeight: #target._delegate.SetSize((width, height)) target.SetSize((newWidth, newHeight)) #target._delegate.SetDimensions(xOff, yOff, newWidth, newHeight) event.skip() def on_menuFileDumpWidgets_select(self, event): self.dumpDocs() def dumpDocs(self): from PythonCard import documentation result = dialog.directoryDialog(None, 'Create documention in:', '') if result.accepted: widgetsDir = result.path documentation.dumpComponentDocs(self, widgetsDir) if __name__ == '__main__': app = model.Application(WidgetsTest) app.MainLoop() PythonCard-0.8.2/samples/widgets/widgets.rsrc.py0000644000076500007650000001713310130317157021617 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'StackWidgetsTest', 'backgrounds': [ {'type':'Background', 'name':'bgWidgets', 'title':'Widgets Test', 'size':(800, 600), 'menubar': {'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'File', 'label':'&File', 'items': [ {'type':'MenuItem', 'name':'menuFileDumpWidgets', 'label':'Create Components Docs...', }, {'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit', }, ] }, ] }, 'components': [ {'type':'ToggleButton', 'name':'chkToggleButton', 'position':(100, 225), 'size':(85, -1), 'label':'ToggleButton', }, {'type':'StaticText', 'name':'labelToggleButton', 'position':(5, 230), 'text':'ToggleButton:', }, {'type':'StaticText', 'name':'labelBitmapCanvas', 'position':(476, 496), 'text':'BitmapCanvas:', }, {'type':'BitmapCanvas', 'name':'bmpBitmapCanvas', 'position':(566, 494), 'size':(112, 50), 'backgroundColor':(255, 255, 255), }, {'type':'StaticText', 'name':'labelHtmlWindow', 'position':(546, 264), 'text':'HtmlWindow:', }, {'type':'HtmlWindow', 'name':'htmHtmlWindow', 'position':(540, 288), 'size':(195, 150), 'backgroundColor':(255, 255, 255), 'text':'widgets.html', }, {'type':'StaticBox', 'name':'stbStaticBox', 'position':(563, 449), 'size':(116, 32), 'label':'A StaticBox', }, {'type':'StaticText', 'name':'labelStaticBox', 'position':(498, 460), 'text':'StaticBox:', }, {'type':'StaticText', 'name':'labelSpinner', 'position':(228, 450), 'text':'Spinner:', }, {'type':'Spinner', 'name':'spnSpinner', 'position':(310, 450), 'max':100, 'min':1, 'value':93, }, {'type':'StaticText', 'name':'labelGauge', 'position':(228, 408), 'text':'Gauge:', }, {'type':'Gauge', 'name':'gagGauge', 'position':(310, 404), 'size':(128, -1), 'layout':'horizontal', 'max':100, 'value':50, }, {'type':'Calendar', 'name':'calCalendar', 'position':(299, 200), }, {'type':'StaticText', 'name':'labelCalendar', 'position':(228, 260), 'text':'Calendar:', }, {'type':'ComboBox', 'name':'cmbComboBox', 'position':(311, 364), 'size':(125, -1), 'items':['one', 'two', 'three'], 'stringSelection':'two', 'text':'two', }, {'type':'StaticText', 'name':'labelComboBox', 'position':(228, 370), 'text':'ComboBox:', }, {'type':'StaticBox', 'name':'StaticBox1', 'position':(543, 10), 'size':(250, 242), 'label':'Attributes', }, {'type':'StaticLine', 'name':'staticMenuUnderline', 'position':(0, 0), 'size':(800, -1), 'layout':'horizontal', }, {'type':'CheckBox', 'name':'chkEnabled', 'position':(550, 30), 'checked':True, 'label':'Enabled', }, {'type':'CheckBox', 'name':'chkVisible', 'position':(550, 50), 'checked':True, 'label':'Visible', }, {'type':'CheckBox', 'name':'chkEditable', 'position':(550, 70), 'checked':True, 'label':'Editable', }, {'type':'Button', 'name':'btnBackgroundColor', 'position':(550, 95), 'label':'BackgroundColor', }, {'type':'Button', 'name':'btnForegroundColor', 'position':(550, 125), 'label':'ForegroundColor', }, {'type':'Button', 'name':'btnFont', 'position':(550, 155), 'label':'Font', }, {'type':'Button', 'name':'btnToolTip', 'position':(550, 185), 'label':'ToolTip', }, {'type':'Button', 'name':'btnBgBackgroundColor', 'position':(550, 215), 'label':'Background BackgroundColor', }, {'type':'StaticText', 'name':'labelButton', 'position':(5, 5), 'text':'Button:', }, {'type':'StaticText', 'name':'labelTextField', 'position':(5, 35), 'text':'TextField:', }, {'type':'StaticText', 'name':'labelPasswordField', 'position':(5, 65), 'text':'PasswordField:', }, {'type':'StaticText', 'name':'labelTextArea', 'position':(5, 95), 'text':'TextArea:', }, {'type':'StaticText', 'name':'labelStaticText', 'position':(5, 170), 'text':'StaticText:', }, {'type':'StaticText', 'name':'labelCheckBox', 'position':(5, 200), 'text':'CheckBox:', }, {'type':'StaticText', 'name':'labelRadioGroup', 'position':(5, 260), 'text':'RadioGroup:', }, {'type':'StaticText', 'name':'labelChoice', 'position':(5, 360), 'text':'Choice:', }, {'type':'StaticText', 'name':'labelList', 'position':(5, 390), 'text':'List:', }, {'type':'StaticText', 'name':'labelSlider', 'position':(5, 490), 'text':'Slider:', }, {'type':'StaticText', 'name':'labelStaticLine', 'position':(5, 520), 'text':'StaticLine:', }, {'type':'StaticText', 'name':'labelImage', 'position':(315, 5), 'text':'Image:', }, {'type':'StaticText', 'name':'labelImageButton', 'position':(315, 110), 'text':'ImageButton:', }, {'type':'TextField', 'name':'fldTextFieldNoBorder', 'position':(315, 150), 'size':(180, -1), 'border':'none', 'text':'TextField with no border', }, {'type':'Button', 'name':'btnButton', 'position':(100, 4), 'label':'Button', }, {'type':'TextField', 'name':'fldTextField', 'position':(100, 32), 'size':(180, -1), }, {'type':'PasswordField', 'name':'fldPasswordField', 'position':(100, 62), 'size':(180, -1), }, {'type':'TextArea', 'name':'fldTextArea', 'position':(100, 92), 'size':(180, 60), 'text':'Use the checkboxes and buttons on the right to set the attributes of the widgets on the left.\n\nThe editable attribute only applies to TextField, PasswordFiled, and TextArea.', }, {'type':'StaticText', 'name':'txtStaticText', 'position':(100, 170), 'text':'StaticText', }, {'type':'CheckBox', 'name':'chkCheckBox', 'position':(100, 200), 'label':'CheckBox', }, {'type':'RadioGroup', 'name':'radRadioGroup', 'position':(100, 260), 'items':['one', 'two', 'three'], 'label':'A RadioBox', 'layout':'vertical', 'max':1, 'stringSelection':'one', }, {'type':'Choice', 'name':'popChoice', 'position':(100, 360), 'items':['one', 'two', 'three'], 'stringSelection':'two', }, {'type':'List', 'name':'lstList', 'position':(100, 390), 'size':(-1, 70), 'items':['one', 'two', 'three'], 'stringSelection':'three', }, {'type':'Slider', 'name':'sldSlider', 'position':(100, 490), 'size':(200, 20), 'layout':'horizontal', 'max':100, 'min':1, 'value':1, }, {'type':'StaticLine', 'name':'linStaticLine', 'position':(100, 520), 'size':(200, -1), 'layout':'horizontal', }, {'type':'ImageButton', 'name':'imgImageButton', 'position':(405, 110), 'border':'transparent', 'file':'edit.gif', }, {'type':'Image', 'name':'imgImage', 'position':(385, 5), 'file':'tile.bmp', }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/samples/worldclock/0000755000076500007650000000000010434046772017330 5ustar alexalex00000000000000PythonCard-0.8.2/samples/worldclock/night.jpg0000644000076500007650000000760507333605247021155 0ustar alexalex00000000000000ÿØÿàJFIFddÿþAdobe ImageReadyÿìDucky%ÿîAdobedÀÿÛ„    ''**''98889@@@@@@@@@@   ((#& &#,,((,,77577@@@@@@@@@@ÿÀ ,"ÿÄ‘ 1!Q’ÓTAqRsDa‘±"2²45#¡Bábr!Q1ARq3a2‚‘BÑ"ÿÚ ?ùÜ>ż&wwsŒã•ëj4N*Ÿ,e—æ5/.ñ§Þð™?öžÈÍ€n.Ä[ÓœozÂkOd=;Æ«OöðšÓÙ•ÓŸYûÆ”«W'Uí/‘îO‹±ôçÞ°šÓÙNq½ë ­=‘_É>³÷É>³÷“Ébü|]ˆ·§8Þõ„֞̇åî2­Åá5§³)y}8¯©¶ìÊr•ä›N.Y}¶ÕÙêÎ^Kú#Bò÷}ë ­=˜~^ãJÜVZ{3”/¥cn9•^Sœ¯'Z)¶•™YWSpG‹~Ò¼»Æ˜¬&´ödúsïXMiìŒ÷7·•kIåö—½¾¼Q¢›Mûyݺºd«™èGGåî2²³÷•'¸ñbì_Á«ÓügzÂëKfYys¼¿ía5§³2ÁÞIýNœ¹NÓ½œU^E”âÖiÂru\8š—DtôçÞ°šÓÙNñªWý¬&´öe#9¤“›o‘Yééi¾jœõ½u/ÇÅØ‹¯.ñ§Þ°ºÓÙ“éÎ7½a5§²+§>³÷9õŸ¼y~>.ÄYùsoxMi쇧8Þõ„̮֞œúÏÞ4çÖ~òy,>>.Ä[ÓœozÂkOd=9Æ÷¬&´öEtçÖ~ñ§>³÷%‡ÇÅØ‹zsïXMi쇧8Þõ„֞ȮœúÏÞ4çÖ~ñä°øø»oNq½ë ­=ôçÞ°šÓÙÓŸYûÆœúÏÞ<–b-éÎ7½a5§²œã{ÖZ{"ºsë?xÓŸYûÇ’ÃãâìE½9Æ÷¬&´öCÓœozÂkOdWòO¬ýåo/o]&ÓÍR«Ù¸’<’ž„SÂø– FW÷÷ŠM%·&Ýyàˆüs®>jV‡ ÞÞO…Œ¤ßùaoÿHô»÷A¢ê†¹ž{ãÆ²ãŠÿ«™_cú7‹øÀº½ùœ]µÈSý ÎÅü`VMéJ™ØuNM08Ç_Bó¼j©t1ç_šÌç :+½Nxš“MUÔèèìgcV¥\ ’V.pI Ó-*N%8^§¦Û±ØV?Rä4ÛÌs•ÜT£E‘Úk[¨‡±«¬¢×‘Ò·ã88ÓÚh"qRYzÍ/r:µgÔ̲:«QiIÊ•ä!ª6³m§/  qj=‚)9$ò.S£Ž”_õ³˜ŽÐÑR”.ï"£GmI½ycœ‹»¶Õ^DÕ…ÕÖ])I¶ŒÛª´ÉÚêjNJ­Û›µ€¶u HHËZ.’@6’«±RòJÚ$NºðЯçöY^MhäHæÕY‹ÝÍF|¼ˆÙÕ%5Zÿ“5fÜ6ä¢ôU‹9ͶÝ^V«®pt’Dm²ö°Ý¬>äzÿ òßía»X}Èõ;ÿAy³û˜ÿcú“øÀ¤¾§ÎËà¡yÙ?Œ Kê|ìn\>Ý}@h»mÅ6g4]4བœeàuN%€$ÄÔ¬´©òÿÈŒ«’Çm jª™ÆŠ.MdeTòºÇžÑyy_•XŽf”£Z³‹[’-&›ªT*¡À·:-ÑÚ¬ÌRRç;ÉÆî:I*œ]ÿ]Ϊ¹ìX&šªÊŒÚr­jê¬:BiI++l}§Gjèè䢪ì’n‹œ£ÿ.K^P®RiŵBB^¢_.å5mäAÉ%WÊRù|µåVÍÞRB„ÿ’Ë–‰ ‰KEV•’—²J4åy÷än6ØrZS’®SºÓ›äqkr\È“¬™ÊNN¬ƒeÀÌ(ÿk ÚÃîG©ßú-þÖµ‡ÜS¿ôlÊþæ?ØÅþ…çdþ0)/©ó²øè^vOã’úŸ; ™pûuô hMÁä³”¨ NŒ””¬$͸ô| Ö5\«!…« Ö¶åkY Îñ(Ö9jpQmѬ¥VS¿\äç­•Ñ«H48ÐŽ”’4(Ere"î*1YÝ¥ŒoyzÖ°ˆ”jš²§Ã*Ó“9ÜÖÍp+ª|N†uÉC­Ü\c–ו–(¾YèòK*ç+³²‚*¤Ë¶•¼¶%%FRZwq®•yÈ”ú•¸:”/ªé*%œêZâO€Jq¬’AAU‹Yó(«]*sìZ¢±ÚËZ¶ô#i“¦NGi:n”Ê™PoÆXía»X}Èõ;ÿAå¿ÚÃv°û‘êwþÍ™_ÜÇû°?Ð¼ìŸÆ%õ>v_Ò⺉ü`R_SçasZñ×^DF(Á¤­ÀbŒ [‚Ñœ£cɘ­£ OÔ·:«Õ•IR¼¨¤ÒŒ²eV•£-*¥ÈsÓ¢õ'£h%:d­š¢$£%Fr²kÀë¥w#0:NíEU:”4NT£‡ š ‘F2+sLi¢©a&xMÃÚ¹Qw|ù"bñÚtÔÕd¬jΠç Ú´šËœéUœåÕ­*½_4 Î:K3V2ÕYÅVr)Z–kº(ïY"ÛVæ8JR“Êη³É¢¹m8Ñ›Qi1W²áÔñŸø´¹QÂŒ”ÚæÌ[VcèJÝ.a¶Ý]¬éwy£‘ؑʌ¼þVt[%…mx£¥î‹Ž’yy=§äi¾B\^•UÈL®Ôcû¡(™’»K4*Õº¾JPŠ3¤s+p£Và 1F­Ê?ÚÃv°û‘êwþƒËÑo†¢­/a]dzÿ s3»^LzîbÀÿBó²—ÔùÙ|ô/;'ñI}Oˇۯ¡hérÒž^[`Jh'M`¤/²ræ.yÚkFlœð «ºƒö2åféÕ¥MÎŒ4¹™ä´[VЀAˆŒœ]Q¦Ü¦TjJ‰%b2ËcæKÏ’ïåÉL…Ê^Ê*.5Êù+Åz¾ Î èRo ¡èM>0SiÕZˆrÒ’’¤_).rmVŽ•9‚t¢Ë%Û\åâá'ó%—”˜ÜØäú ¼ºê.s—j½'îTšÖ>Å'¬±uJßaNb÷‘Ñ–KCªðZÉ!GûXnÖr=NÿÐyoö°Ý¬>äzÿ sfW÷1þÆ,ô/;'ñI}O—ÀÿBó²—ÔùØÜ¸}ºú€.WÏ_aÜåp¾§Ðuf?#Z~$7DÞc„ï²X‰½¼®HÙÊs;¥#WÄâöä€$ƒC‚Hi»u‚3.¦£ZØÎ2VVœŽèáÌ×’R“h¼ïª©•å9ZÕ–öyM8(¬”´ ‰AÃrïwè§L¯”àu»¼ŒcGncŒ‰µ¡ÕNÀâïßýVOih^)Q<ŒÍÒÉL«'¡yEI4ùLÒTmf4·ES4ž“o9Ö)×cœ‘¡S‚ö°Ý¬>äzÿ òßía»X}Èõ;ÿ@æÌ¯îcýŒXè^vOã’úŸ;/þ…çdþ0)/©ó±¹pûuô ;Üý%o/–ŠÉKK]Ñ]ד•œYj¬ÙÛqTˆ’@ ²Â)w&ã–] @l”›tE¤ÒZ -¤FN5§)5Žoö°Ý¬>äzÿ òßía»X}Èõ;ÿ@æÌ¯îcýŒXè^vOã’úŸ;/þçbþ0)/©ó°¹—·_BÐñ’£‹±•²ÂŽ?Q ’ía»X}Èõ;ÿAå÷¬7k¹§èÌïîcýŒX&—¼o"üOã’”tžUiÚë …¾›ÿbòWqy ÒtéLïàÞ\Þ±:ðÙ“]Žpå§BMÄkãJ9ÍÞ åÍë¯ ˜ðo.oXxlĽ<¸»Ñ†±Î4£œÝà¾\Þ±:ðÙòæõ‰×†ÌKØyqw£’ÎN”s£w‚ùszÄëÃf<Ë›Ö'^1/aåÅÞŒYɪÎnð_.oXxlǃyszÄëÃf%ì<¸»ŒK9e¢–“vؾ åÍë¯ ˜|˯½buá³ö\]Æ% Ç9»Á|¹½buá³ åÍë¯ ˜—°òâïF %œšÇ9»Á|¹½buá³ åÍë¯ ˜—°òâïF%œiG9»Á|¹½buá³ åÍë¯ ˜—°òâïFÇ8ÒŽsw‚ùszÄëÃf<Ë›Ö'^1/aåÅÞŒ:QÎ4–tnð_.oXxlÇ‚ùszÄëÃf%ì<¸»Ñ†«8ªVº—òâïXxlÉ|Ë®ÜV'^1/aåÅÞ`ÒŽq¤³›¼Ë›Ö'^1à¾\Þ±:ðÙ‰{..äaÒŽqUœßàÞ\Þ±:ðÙòîõ‰×†ÌKØyqw˜*³Š¥Êoð.ïXxlÃàþ]vâ±:ðÙ’m°òâï<ý(çD¶—-¦ÿòæõ‰×†ÌxG—w¬N¼6b^ÃË‹¼óô–q¤³›üË›Ö'^1à¾\Þ±:ðÙ–^ÃË‹¼Ã¥ãIg7x/—7¬N¼6cÁ|¹½buá³ö\]èÁ“ýŒ6w{¹—\3Ë×·xˆâ1“¹”gÊPi¸ºªÿŽÂŸìÇýßÏO–¶{ ?C+d§’«„ÉÿÙPythonCard-0.8.2/samples/worldclock/readme.txt0000644000076500007650000000466407417665010021337 0ustar alexalex00000000000000worldclock downloads an image off the www.time.gov server. Worldclock doesn't use a menubar. 2001-08-23 Andy Todd converted the JavaScript code to a Python script xearth.py, so JavaScript is no longer required to run this sample. We left the old JavaScript calls and xearth.js with the sample in case people want to compare the old and new. The original readme below has not been updated to reflect the code change. ka --- This is a very simple example that currently only uses two StaticText widgets and an ImageButton widget. It runs an external JavaScript program via a popen (pipe) call to calculate the appropriate image which it then downloads from the www.time.gov server and displays via the ImageButton. The clock is updated every minute and the image is updated every five minutes by default. I'm using an __init__ method and some wxPython code (wxTimer and EVT_IDLE) directly because that functionality isn't in PythonCard yet. As the PythonCard prototype expands in functionality, the wxPython calls will be replaced. This code has been tested on Windows 98 and Windows 2000. I've been told that if you are running Win98 and Norton Anti-virus, that the popen call in Python won't work, so beware. Running the script on *nix requires a number of changes described below. in xearth.js you must change the line: var QueryTimeZone = -7; to match the offset of your own time zone. The USA West coast is -7 the East coast is -4, Sydney, Australia is 10, other time zones are left as an exercise for the reader ;-) Eventually xearth.js will go away and be replaced by the equivalent code in Python, but part of the fun of this convoluted example is that it calls another program to do its work. If you want to run this on *nix you'll have to change the line jScript = "cscript //nologo xearth.js" in worldclock.py to the equivalent for running a standalone JavaScript (ECMAScript) program in your version of *nix. You'll also need to change the line in xearth.js WScript.echo(updatexearthImage()); to the equivalent print statement for the JavaScript interpreter on your *nix box. Change worldclock_standalone.pyw to worldclock_standalone.py if you want to see the output, say for debugging purposes. ka --- ps. The original HTML file timezone.html is included so you can see the scary HTML someone had to write to get a page that looks like http://www.time.gov/timezone.cgi?Pacific/d/-8/java Luckily, I was able to steal the good parts for my own desktop app. PythonCard-0.8.2/samples/worldclock/timezone.html0000644000076500007650000003233607333605247022061 0ustar alexalex00000000000000 The official U.S. time - clock
Switch to non-animated version of this page (without Java)
Right now, the official U.S. time is:
You have chosen the timezone
 

 

PythonCard-0.8.2/samples/worldclock/worldclock.py0000644000076500007650000000536110313163032022033 0ustar alexalex00000000000000#!/usr/bin/python """ KEA notes to myself Created: 2001-07-22 __version__ = "$Revision: 1.28 $" __date__ = "$Date: 2005/09/18 03:59:22 $" __author__ = "Kevin Altis " I'm using an ImageButton rather than an image because I want to catch mouseMove (hmm, should that be mouseOver ?) events and pop up a relative time for east coast, midwest, london, sydney, etc. However, we need the option to set style=0 rather than the default wxBU_AUTODRAW. http://www.time.gov/images/xearths/night.jpg """ import urllib import os import time import wx from cStringIO import StringIO from PythonCard import graphic, log, model, timer import xearth class WorldClock(model.Background): def on_initialize(self, event): self.url = '' # KEA 2002-05-27 # switched to timer events self.clockTimer = timer.Timer(self.components.staticTextClock, -1) self.clockTimer.start(1000) # 1 second self.imageTimer = timer.Timer(self.components.imageButtonWorld, -1) self.imageTimer.start(5 * 60 * 1000) # 5 minutes # force the first update self.updateDateAndTime() self.updateImage() def on_staticTextClock_timer(self, event): self.updateDateAndTime() def updateDateAndTime(self): t = time.strftime("%I:%M %p") if t[0] == "0": t = t[1:] if self.components.staticTextClock.text != t: self.components.staticTextClock.text = t d = time.strftime("%A, %B %d, %Y") if self.components.staticTextDate.text != d: self.components.staticTextDate.text = d def on_imageButtonWorld_timer(self, event): self.updateImage() def updateImage(self): log.info("interval is up...") url = "http://www.time.gov/" + xearth.getLatLong() if url == self.url: return self.url = url log.info("updating image ", url) # download image from www.time.gov try: fp = urllib.urlopen(url) jpg = fp.read() fp.close() except Exception, msg: return wImageButtonWorld = self.components.imageButtonWorld # with wxPython 2.3.3.1 and above it is no longer # necessary to write the file to disk before displaying it newBitmap = graphic.Bitmap() # I could probably use the fp file object, but using the # jpg variable seems cleaner newBitmap.setImageBits(wx.ImageFromStream(StringIO(jpg))) wImageButtonWorld.bitmap = newBitmap def on_close(self, event): self.clockTimer.stop() self.imageTimer.stop() event.skip() if __name__ == '__main__': app = model.Application(WorldClock) app.MainLoop() PythonCard-0.8.2/samples/worldclock/worldclock.rsrc.py0000644000076500007650000000134510047606367023022 0ustar alexalex00000000000000{ 'application':{ 'type':'Application', 'name':'worldclock', 'backgrounds': [ {'type':'Background', 'name':'World Clock bg', 'title':'World Clock', 'size':(309, 208), 'components': [ {'type':'Image', 'name':'imageButtonWorld', 'position':( 0, 20 ), 'label':'', 'file':'night.jpg'}, {'type':'StaticText', 'name':'staticTextClock', 'position':(255, 3)}, {'type':'StaticText', 'name':'staticTextDate', 'position':(1, 3), 'size':(175, -1)}, # {'type':'TextField', 'name':'staticTextClock', 'position':(255, 3), 'editable':0, 'border':'none'}, # {'type':'TextField', 'name':'staticTextDate', 'position':(1, 3), 'size':(175, -1), 'editable':0, 'border':'none'}, ] } ] } } PythonCard-0.8.2/samples/worldclock/xearth.js0000644000076500007650000001145307333605247021167 0ustar alexalex00000000000000 // KEA // The two main functions use global variables, so we have to // set all this up unless the functions are going to get changed. var ClientRecieveTime=new Date(); var QueryTimeZone = -7; var QueryTimeZoneOffsetMin = QueryTimeZone * 60 // -420 var NISTSendTimeGMTms = ClientRecieveTime.getTime() - ( QueryTimeZoneOffsetMin * 60 * 1000 ); // NIST start time in the query time zone var QueryTimeZoneOffset = ( QueryTimeZoneOffsetMin * 60 * 1000 ) ; // Client start time in some time zone var ClientRecieveTimems = ClientRecieveTime.getTime() ; // what timezone does your computer think it is? - in minutes //var ClientTimeZone = Math.floor(NISTSendTime.getTimezoneOffset()) ; var ClientTimeZone = QueryTimeZoneOffsetMin; var ClientNISTDelta = Math.floor(NISTSendTimeGMTms - ClientRecieveTimems); //WScript.echo(QueryTimeZoneOffset) //WScript.echo(" ") //WScript.echo(ClientRecieveTime) //WScript.echo(" ") //WScript.echo(ClientTimeZone) //WScript.echo(" ") //WScript.echo(ClientNISTDelta) //WScript.echo(" ") WScript.echo(updatexearthImage()); function updatexearthImage() { // get the computer's date var Thisdate = new Date(); // convert to NIST date, using offset calculated in ClientNISTDelta ThisMilliseconds = Thisdate.getTime() + ClientNISTDelta ; // KEA get rid of reference to DOM, just return the data // document.images['xearth'].src = xearthSrc(ThisMilliseconds); return xearthSrc(ThisMilliseconds); // setTimeout("updatexearthImage()", 10000); } function xearthSrc(ThisMilliseconds) { var ssue = ThisMilliseconds / 1000; var TWOPI = 2 * Math.PI; var EpochStart = 631065600; var DaysSinceEpoch = (ssue - EpochStart) / (24*3600); var RadsPerDay = TWOPI / 365.242191; var Epsilon_g = 279.403303 * (TWOPI / 360); var OmegaBar_g = 282.768422 * (TWOPI / 360); var Eccentricity = 0.016713; var MeanObliquity = 23.440592 * (TWOPI / 360); //Compute lambda = sun_ecliptic_longitude(ssue) //Begin sun_ecliptic_longitude var D = DaysSinceEpoch; var N = RadsPerDay * D; N = N % TWOPI; if (N < 0) N += TWOPI; var M_sun = N + Epsilon_g - OmegaBar_g; if (M_sun < 0) M_sun += TWOPI; //Compute var E = solve_keplers_equation(M_sun); //Begin solve_keplers_equation var E = M_sun; var delta; while (1) { delta = E - (Eccentricity*Math.sin(E)) - M_sun; if (Math.abs(delta) <= 1E-10) break; E -= delta / (1 - (Eccentricity*Math.cos(E))); } //End solve_keplers_equation var lambda = OmegaBar_g + (2 * Math.atan(Math.sqrt((1+Eccentricity) / (1-Eccentricity)) * Math.tan(E/2))); //End sun_ecliptic_longitude //Compute ecliptic_to_equatorial(lambda, 0.0, alpha, delta) var sin_e = Math.sin(MeanObliquity); var cos_e = Math.cos(MeanObliquity); var alpha = Math.atan2(Math.sin(lambda)*cos_e, Math.cos(lambda)); var delta = Math.asin(sin_e*Math.sin(lambda)); //End ecliptic_to_equatorial //Compute GST(ssue) //Compute JD = julian_date(year, month, day) var TmpDate = new Date(ThisMilliseconds); var OffsetMilliseconds = ThisMilliseconds ; //+ (60000*TmpDate.getTimezoneOffset()); var ThisDate = new Date(OffsetMilliseconds); var y = ThisDate.getYear(); if (y < 1000) y += 1900; var m = ThisDate.getMonth() + 1; var z = ThisDate.getDate(); // if ((m==1) || (m==2)) { // y -= 1; // m += 12; } var A = y / 100; var B = 2 - A + (A/4); var C = 365.25 * y; var D = 30.6001 * (m+1); var JD = B + C + D + z + 1720994.5; //End julian_date var T = (JD - 2451545) / 36525; var T0 = ((((T + 2.5862E-5) * T) + 2400.051336) * T) + 6.697374558; T0 = T0 % 24; if (T0 < 0) T0 += 24; var UT = ThisDate.getHours() + ((ThisDate.getMinutes() + (ThisDate.getSeconds() / 60)) / 60); T0 += UT * 1.002737909; T0 = T0 % 24; if (T0 < 0) T0 += 24; //End GST var tmp = alpha - ((TWOPI/24)*T0); while (tmp < -Math.PI) {tmp += TWOPI;}; while (tmp > Math.PI) {tmp -= TWOPI;}; var lon = tmp * (360/TWOPI); var lat = delta * (360/TWOPI); //Generate the path of the appropriate xearth image //lon is even lon = Math.round(lon); //if (lon & 1 != 0) { if (lon % 2 != 0) { if (lon > 0) { lon -= 1; } else { lon += 1; } } // force even for mozilla 4.01-4.05 // Consolidate lines, 4/5/01 - PRF lon = Math.round(lon/2) * 2; if (lon <= -181) lon = -180; if (lon >= 181) lon = 180; //lat is odd lat = Math.round(lat); //if (lat & 1 == 0) { if (lat % 2 == 0) { if (lat > 0) { lat -= 1; } else { lat += 1; } } // force odd for mozilla 4.01-4.05 // Fixed broken algorithm, 4/5/01 - PRF lat = (Math.round(lat/2 - 1) * 2) + 1; if (lat <= -24) lat = -23; if (lat >= 24) lat = 23; var latStr; var lonStr; if (lat < 0) latStr = (-lat) + "S"; else latStr = lat + "N"; if (lon < 0) lonStr = (-lon) + "S"; else lonStr = lon + "N"; return "images/xearths/" + latStr + "/" + lonStr + ".jpg"; //return lon; } PythonCard-0.8.2/samples/worldclock/xearth.py0000644000076500007650000001046407360025557021204 0ustar alexalex00000000000000import math, time def getLatLong(): "Returns URL for day/night picture" # Define some 'constants' ClientRecieveTime=time.time() * 1000 # QueryTimeZone = 10 QueryTimeZone = -time.timezone/3600 QueryTimeZoneOffsetMin = QueryTimeZone * 60 NISTSendTimeGMTms = ClientRecieveTime - ( QueryTimeZoneOffsetMin * 60 * 1000 ) # NIST start time in the query time zone QueryTimeZoneOffset = ( QueryTimeZoneOffsetMin * 60 * 1000 ) # Replace this with "QueryTimeZoneOffset = ( -time.timezone * 60 * 1000 )" # Client start time in some time zone ClientRecieveTimems = ClientRecieveTime # what timezone does your computer think it is? - in minutes ClientTimeZone = QueryTimeZoneOffsetMin; ClientNISTDelta = math.floor(NISTSendTimeGMTms - ClientRecieveTimems) currTime = ClientRecieveTime + ClientNISTDelta # ThisMilliseconds gmtTime = time.gmtime() ssue = currTime / 1000 TwoPi = 2 * math.pi EpochStart = 631065600 DaysSinceEpoch = (ssue - EpochStart)/ (24*3600) RadsPerDay = TwoPi / 365.242191 Epsilon_g = 279.403303 * (TwoPi / 360) OmegaBar_g = 282.768422 * (TwoPi / 360) Eccentricity = 0.016713 MeanObliquity = 23.440592 * (TwoPi / 360); # Calculate sun_ecliptic_longitude N = RadsPerDay * DaysSinceEpoch N = N % TwoPi if N < 0: N += TwoPi # This should never be executed, but never mind M_Sun = N + Epsilon_g - OmegaBar_g if M_Sun < 0: M_Sun += TwoPi # This should never be executed either # Now we solve keplers equation. For those who are interested keplers # equation is all about plotting the orbit of an object on the # elliptic plane. E = M_Sun while 1: delta = E - (Eccentricity*math.sin(E)) - M_Sun if (abs(delta) <= 1E-10): break E -= delta / (1 - (Eccentricity*math.cos(E))) # End of the keplers equation solution myLambda = OmegaBar_g + (2 * math.atan(math.sqrt((1+Eccentricity) / (1-Eccentricity)) * math.tan(E/2))) # There, finished calculating the sun ecliptic longitude # Now we calculate the ecliptic to equatorial (something or other) sin_e = math.sin(MeanObliquity) cos_e = math.cos(MeanObliquity) alpha = math.atan2(math.sin(myLambda)*cos_e, math.cos(myLambda)) delta = math.asin(sin_e*math.sin(myLambda)); # End of ecliptic to equatorial # We calculate the Julian date here, Python could probably do this better # I leave it to the casual observer to replace the following few lines y = gmtTime[0] # Year m = gmtTime[1] # Month number z = gmtTime[2] # Day number A = y / 100 B = 2 - A + (A/4) C = 365.25 * y D = 30.6001 * (m+1) JD = B + C + D + z + 1720994.5 T = (JD - 2451545) / 36525 T0 = ((((T + 2.5862E-5) * T) + 2400.051336) * T) + 6.697374558 T0 = T0 % 24 if T0 < 0: T0 += 24 UT = (float(gmtTime[3])) + ((float(gmtTime[4]) + (float(gmtTime[5]) / 60)) / 60) T0 += UT * 1.002737909 T0 = T0 % 24 if T0 < 0: T0 += 24 tmp = alpha - ((TwoPi/24)*T0); while tmp < -math.pi: tmp += TwoPi while tmp > math.pi: tmp -= TwoPi # Now calculate our longitude and latitude lon = tmp * (360/TwoPi) lat = delta * (360/TwoPi) # Generate the path of the appropriate xearth image lon = round(lon) if (lon % 2 != 0): if (lon > 0): lon -= 1 else: lon += 1 lon = round(lon/2) * 2 if lon <= -181: lon = -180 if lon >= 181: lon = 180 # lat is odd lat = round(lat) if (lat % 2 == 0): if lat > 0: lat -= 1 else: lat += 1 # Need to do different calculations for negative and positive values of lat # to emulate the way javascript handles rounding if lat < 0: lat = (round(int(lat/2) - 1) * 2) + 1 else: lat = (round(lat/2 - 1) * 2) + 1 if lat <= -24: lat = -23 if lat >= 24: lat = 23 if lat < 0: latStr = str(int(-lat)) + "S" else: latStr = str(int(lat)) + "N" if lon < 0: lonStr = str(int(-lon)) + "S" else: lonStr = str(int(lon)) + "N" # url = "http://www.time.gov/" + getLatLong() # return 'http://www.time.gov/images/xearths/11N/154N.jpg' return "images/xearths/" + latStr + "/" + lonStr + ".jpg" PythonCard-0.8.2/setup.py0000755000076500007650000000741710130045242015227 0ustar alexalex00000000000000#!/usr/bin/env python # $Id: setup.py,v 1.22 2004/10/03 18:53:22 kasplat Exp $ # By R.Suzi rnd@onego.ru # Extended and expanded by Andy Todd WIN_DEFAULT_COMMAND = "install" APPLICATION_NAME = "PythonCard" from distutils.core import setup from distutils.command.install_data import install_data import glob, os, sys import __version__ if len(sys.argv) == 1 and sys.platform.startswith("win"): sys.argv.append(WIN_DEFAULT_COMMAND) classifiers = """\ Development Status :: 4 - Beta Environment :: MacOS X Environment :: MacOS X :: Carbon Environment :: Win32 (MS Windows) Environment :: X11 Applications :: GTK Intended Audience :: Developers Intended Audience :: Education Intended Audience :: End Users/Desktop Intended Audience :: Information Technology Intended Audience :: Other Audience Intended Audience :: Science/Research Intended Audience :: System Administrators License :: OSI Approved :: BSD License Natural Language :: English Operating System :: MacOS :: MacOS X Operating System :: Microsoft :: Windows Operating System :: POSIX :: Linux Programming Language :: Python Topic :: Software Development Topic :: Software Development :: User Interfaces """ longdescription = "PythonCard is a GUI construction kit for building cross-platform " + \ "desktop applications on Windows, Mac OS X, and Linux, using the Python language." """ This script is setup.py of the PythonCard package. You need to have wxPython to run PythonCard """ class smart_install_data(install_data): def run(self): #need to change self.install_dir to the actual library dir install_cmd = self.get_finalized_command('install') self.install_dir = getattr(install_cmd, 'install_lib') return install_data.run(self) def recurseDir(startDir): # This should all be replaced by calls to os.path.walk, but later listX=[startDir] for fyle in os.listdir(startDir): file=os.path.join(startDir,fyle) if os.path.isdir(file): listX.extend(recurseDir(file)) return listX def makeDataDirs(rootDir=APPLICATION_NAME, dataDirs=['.', 'docs','samples', 'tools']): "Construct a list of the data directories to be included" # This function will return a list of tuples, each tuple being of the form; # ( , [] ) listX=[] results=[] for directory in dataDirs: directories=recurseDir(directory) results.extend(directories) for directory in results: if os.path.split(directory)[1]!='CVS': # Add this directory and its contents to list files=[] for file in os.listdir(directory): if file!='CVS' and file!='.cvsignore': if os.path.isfile(os.path.join(directory, file)): files.append(os.path.join(directory, file)) listX.append((rootDir+'/'+directory, files)) # list.append((rootDir, 'stc_styles.cfg')) return listX setup(name=APPLICATION_NAME, version=__version__.VERSION_STRING, description="PythonCard GUI-builder", author="PythonCard Developers", author_email="pythoncard-users@lists.sourceforge.net", url="http://pythoncard.sourceforge.net/", download_url="http://sourceforge.net/project/showfiles.php?group_id=19015", classifiers = filter(None, classifiers.split("\n")), long_description = longdescription, platforms = "Mac OS X, Windows, Linux", packages=[APPLICATION_NAME, APPLICATION_NAME + ".components", APPLICATION_NAME + ".templates", APPLICATION_NAME + ".templates.dialogs"], package_dir={APPLICATION_NAME: '.'}, scripts=["install-pythoncard.py"], license="BSD", cmdclass = { 'install_data': smart_install_data}, data_files=makeDataDirs(), ) # End of setup.py PythonCard-0.8.2/simpleSizer.py0000644000076500007650000001233510323306733016376 0ustar alexalex00000000000000""" __version__ = "$Revision: 1.2 $" __date__ = "$Date: 2005/10/12 22:27:39 $" """ """ Simple sizer for PythonCard Uses a simple method for sizing: - each component type is defined to be fixed or stretchable - uses GetBestSize() to get a min size for each component - each component is placed by its centre point as laid out - centre locations are scaled by "current window size / min size" This will adjust component sizes for differences between OS's, but will not move components to make space. """ import wx DEBUG = False DEBUG1 = False #---------------------------------------------------------------------- class simpleSizer(wx.PySizer): def __init__(self, minsize, border=0): wx.PySizer.__init__(self) self.minsize = minsize self.border = border #-------------------------------------------------- def Add(self, item, option=0, flag=0, border=0, pos=None, size=None, growX = False, growY = False ): if DEBUG: print "adding", item.name, pos, size, growX, growY wx.PySizer.Add(self, item, option, flag, border, userData=(pos, size, growX, growY)) #-------------------------------------------------- def CalcMin( self ): x,y = self.minsize return wx.Size(x, y) #-------------------------------------------------- def RecalcSizes( self ): # save current dimensions, etc. curWidth, curHeight = self.GetSize() px, py = self.GetPosition() minWidth, minHeight = self.CalcMin() if DEBUG: print minWidth, minHeight, curWidth, curHeight if minWidth == 0 or minHeight == 0: return scaleX = 100 * curWidth / minWidth scaleY = 100 * curHeight / minHeight # iterate children and set dimensions... for item in self.GetChildren(): pos, size, growX, growY = item.GetUserData() if DEBUG: print "in recalc", pos, size, growX, growY cx,cy = pos sx,sy = size cx = (cx * scaleX + sx*scaleX/2) / 100 cy = (cy * scaleY + sy*scaleY/2) / 100 if growX: sx = sx * scaleX / 100 if growY: sy = sy * scaleY / 100 self.SetItemBounds( item, cx-sx/2, cy-sy/2, sx, sy ) #-------------------------------------------------- def SetItemBounds(self, item, x, y, w, h): # calculate the item's actual size and position within # its grid cell ipt = wx.Point(x, y) isz = wx.Size(w,h) if DEBUG: print "in itembounds", x,y,w,h item.SetDimension(ipt, isz) #-------------------------------------------------- # AGT fill this list heightGrowableTypes = ["BitmapCanvas", "CodeEditor", "HtmlWindow", \ "Image", "List", "MultiColumnList", "Notebook", \ "RadioGroup", "StaticBox", "TextArea", \ "Tree"] widthGrowableTypes = ["BitmapCanvas", "CheckBox", "Choice", \ "CodeEditor", "ComboBox", "HtmlWindow", \ "Image", "List", "MultiColumnList", \ "Notebook", \ "PasswordField", "RadioGroup", "Spinner", \ "StaticBox", "StaticText", "TextArea", \ "TextField", "Tree"] growableTypes = ["Gauge", "Slider", "StaticLine"] def autoSizer(aBg): winX, winY = aBg.size # make list of all components, make a simpleSizer to hold them complist = [] for compName in aBg.components.iterkeys(): comp = aBg.components[compName] complist.append( comp ) sizer = simpleSizer(aBg.panel.size) # add the components to the grid for comp in complist: tx, ty = comp.position dx, dy = comp.size # AGT Must be an easier way to get a component's type ?? compType = comp._resource.__dict__['type'] dx1, dy1 = comp.GetBestSize() if dx1 > dx: dx = dx1 if dy1 > dy: # hack to deal with the fact that GetBestSize() comes up with too # large heights for textareas. if compType <> "TextArea": dy = dy1 # AGT FUTURE this checks contents of the component's userdata # extend resourceEditor to allow a way to set this if "HEIGHT_GROWABLE" in comp.userdata or \ compType in heightGrowableTypes or \ (compType in growableTypes and comp.layout == "vertical"): compGrowableY = True else: compGrowableY = False if "WIDTH_GROWABLE" in comp.userdata or \ compType in widthGrowableTypes or \ (compType in growableTypes and comp.layout == "horizontal"): compGrowableX = True else: compGrowableX = False sizer.Add(comp, pos=(tx,ty), size=(dx,dy), growX = compGrowableX, growY = compGrowableY ) if DEBUG1: print "adding ", comp.name, (tx, ty), (dx, dy), compGrowableX, compGrowableY sizer.SetSizeHints(aBg) aBg.panel.SetSizer(sizer) aBg.panel.SetAutoLayout(1) aBg.panel.Layout() #-------------------------------------------------- PythonCard-0.8.2/singleton.py0000644000076500007650000001672710040025674016101 0ustar alexalex00000000000000""" __version__ = "$Revision: 1.2 $" __date__ = "$Date: 2004/04/16 14:55:00 $" """ """ A Python Singleton mixin class that makes use of some of the ideas found at http://c2.com/cgi/wiki?PythonSingleton. Just inherit from it and you have a singleton. No code is required in subclasses to create singleton behavior -- inheritance from Singleton is all that is needed. Assume S is a class that inherits from Singleton. Useful behaviors are: 1) Getting the singleton: S.getInstance() returns the instance of S. If none exists, it is created. 2) The usual idiom to construct an instance by calling the class, i.e. S() is disabled for the sake of clarity. If it were allowed, a programmer who didn't happen notice the inheritance from Singleton might think he was creating a new instance. So it is felt that it is better to make that clearer by requiring the call of a class method that is defined in Singleton. An attempt to instantiate via S() will restult in an SingletonException being raised. 3) If S.__init__(.) requires parameters, include them in the first call to S.getInstance(.). If subsequent calls have parameters, a SingletonException is raised. 4) As an implementation detail, classes that inherit from Singleton may not have their own __new__ methods. To make sure this requirement is followed, an exception is raised if a Singleton subclass includ es __new__. This happens at subclass instantiation time (by means of the MetaSingleton metaclass. By Gary Robinson, grobinson@transpose.com. No rights reserved -- placed in the public domain -- which is only reasonable considering how much it owes to other people's version which are in the public domain. The idea of using a metaclass came from a comment on Gary's blog (see http://www.garyrobinson.net/2004/03/python_singleto.html#comments). Not guaranteed to be fit for any particular purpose. RDS - 2004-04-16 To make a class a Singleton, inhert from singleton.Singleton. Call .getInstance() to get the single instance of . Any arguments passed to .getInstance() will be passed on to your .__init__. """ class SingletonException(Exception): pass class MetaSingleton(type): def __new__(metaclass, strName, tupBases, dict): if dict.has_key('__new__'): raise SingletonException, 'Can not override __new__ in a Singleton' return super(MetaSingleton,metaclass).__new__(metaclass, strName, tupBases, dict) def __call__(cls, *lstArgs, **dictArgs): raise SingletonException, 'Singletons may only be instantiated through getInstance()' class Singleton(object): __metaclass__ = MetaSingleton def getInstance(cls, *lstArgs): """ Call this to instantiate an instance or retrieve the existing instance. If the singleton requires args to be instantiated, include them the first time you call getInstance. """ if cls._isInstantiated(): if len(lstArgs) != 0: raise SingletonException, 'If no supplied args, singleton must already be instantiated, or __init__ must require no args' else: if len(lstArgs) != cls._getConstructionArgCountNotCountingSelf(): raise SingletonException, 'If the singleton requires __init__ args, supply them on first instantiation' instance = cls.__new__(cls) instance.__init__(*lstArgs) cls.cInstance = instance return cls.cInstance getInstance = classmethod(getInstance) def _isInstantiated(cls): return hasattr(cls, 'cInstance') _isInstantiated = classmethod(_isInstantiated) def _getConstructionArgCountNotCountingSelf(cls): return cls.__init__.im_func.func_code.co_argcount - 1 _getConstructionArgCountNotCountingSelf = classmethod(_getConstructionArgCountNotCountingSelf) def _forgetClassInstanceReferenceForTesting(cls): """ This is designed for convenience in testing -- sometimes you want to get rid of a singleton during test code to see what happens when you call getInstance() under a new situation. To really delete the object, all external references to it also need to be deleted. """ delattr(cls,'cInstance') _forgetClassInstanceReferenceForTesting = classmethod(_forgetClassInstanceReferenceForTesting) if __name__ == '__main__': import unittest class PublicInterfaceTest(unittest.TestCase): def testReturnsSameObject(self): """ Demonstrates normal use -- just call getInstance and it returns a singleton instance """ class A(Singleton): def __init__(self): super(A, self).__init__() a1 = A.getInstance() a2 = A.getInstance() self.assertEquals(id(a1), id(a2)) def testInstantiateWithMultiArgConstructor(self): """ If the singleton needs args to construct, include them in the first call to get instances. """ class B(Singleton): def __init__(self, arg1, arg2): super(B, self).__init__() self.arg1 = arg1 self.arg2 = arg2 b1 = B.getInstance('arg1 value', 'arg2 value') b2 = B.getInstance() self.assertEquals(b1.arg1, 'arg1 value') self.assertEquals(b1.arg2, 'arg2 value') self.assertEquals(id(b1), id(b2)) def testTryToInstantiateWithoutNeededArgs(self): class B(Singleton): def __init__(self, arg1, arg2): super(B, self).__init__() self.arg1 = arg1 self.arg2 = arg2 self.assertRaises(SingletonException, B.getInstance) def testTryToInstantiateWithoutGetInstance(self): """ Demonstrates that singletons can ONLY be instantiated through getInstance, as long as they call Singleton.__init__ during construction. If this check is not required, you don't need to call Singleton.__init__(). """ class A(Singleton): def __init__(self): super(A, self).__init__() self.assertRaises(SingletonException, A) def testDontAllowNew(self): def instantiatedAnIllegalClass(): class A(Singleton): def __init__(self): super(A, self).__init__() def __new__(metaclass, strName, tupBases, dict): return super(MetaSingleton,metaclass).__new__(metaclass, strName, tupBases, dict) self.assertRaises(SingletonException, instantiatedAnIllegalClass) def testDontAllowArgsAfterConstruction(self): class B(Singleton): def __init__(self, arg1, arg2): super(B, self).__init__() self.arg1 = arg1 self.arg2 = arg2 b1 = B.getInstance('arg1 value', 'arg2 value') self.assertRaises(SingletonException, B, 'arg1 value', 'arg2 value') unittest.main() PythonCard-0.8.2/sound.py0000644000076500007650000000256510313163031015213 0ustar alexalex00000000000000""" __version__ = "$Revision: 1.7 $" __date__ = "$Date: 2005/09/18 03:59:21 $" """ import wx import sndhdr class SoundFileError(Exception): pass class Sound: """ Feeble beginnings of a class for playing sounds. The goal is to be able to provide a filename and then be able to play the sound without worrying about sound formats or particular OS capabilities. I haven't investigated the Python Standard Libraries much yet. """ def __init__(self, filename) : self._filename = filename self._sndType = sndhdr.what(filename) if self._sndType: self._sndType = self._sndType[0] if self._sndType in ['wav']: try: self._sound = wx.Sound(filename) # support resources? except: self._sndType = None else: self._sndType = None if not self._sndType: raise SoundFileError, 'This is not a valid sound file' def play(self, async=True, looped=False) : if self._sndType: if async: if looped: flags = wx.SOUND_ASYNC | wx.SOUND_LOOP else: flags = wx.SOUND_ASYNC else: flags = wx.SOUND_SYNC self._sound.Play(flags) def stop(self): if self._sndType: self._sound.Stop() PythonCard-0.8.2/spec.py0000644000076500007650000000773110047606306015030 0ustar alexalex00000000000000# __version__ = "$Revision: 1.24 $" # __date__ = "$Date: 2004/05/10 05:01:58 $" # The format of an entry is: # # '' : { # 'parent' : < | None > , # 'events' : < [ '', ... ] >, # 'attributes' : < { '' : { # 'presence' : < 'mandatory' | 'optional' >, # 'default' : # > } # } # How do we distinguish between resource/runtime # Will 'mouseClick' work if specified in Widget's event list? # Note that events and attributes are inherited. The res.Spec class # depends on the following entries being in order from top to bottom # based on inheritance. Component must appear before Widget, Widget # must appear before TextField, Textfield must appear before PasswordField, # ad nauseum ;) specList = [ { 'name':'Component', 'info':{ 'parent' : None, 'events' : [], 'attributes' : { 'name' : { 'presence' : 'mandatory' }, 'command' : { 'presence' : 'optional', 'default' : None } } }}, { 'name':'Application', 'info': { 'parent' : None, 'events' : [], 'attributes' : { 'name' : { 'presence' : 'mandatory' }, } }}, { 'name':'MenuBar', 'info': { 'parent' : None, 'events' : [], 'attributes' : { 'menus' : { 'presence' : 'optional', 'default': [] } } }}, { 'name':'Menu' , 'info': { 'parent' : None, 'events' : [], 'attributes' : { 'name' : { 'presence' : 'mandatory' }, 'label' : { 'presence' : 'mandatory' }, 'enabled' : { 'presence' : 'optional', 'default' : 1 }, 'items' : { 'presence' : 'optional', 'default': [] } } }}, { 'name':'MenuItem', 'info': { 'parent' : 'Component', 'events' : [], 'attributes' : { 'label' : { 'presence' : 'mandatory' }, 'checkable' : { 'presence' : 'optional', 'default': 0 }, 'checked' : { 'presence' : 'optional', 'default': 0 }, 'enabled' : { 'presence' : 'optional', 'default' : 1 } } }}, { 'name':'Background', 'info': { 'parent' : None, 'events' : ['openBackground'], 'attributes' : { 'name' : { 'presence' : 'mandatory' }, 'title' : { 'presence' : 'mandatory' }, 'position' : { 'presence' : 'optional', 'default' : [ -1, -1 ] }, 'size' : { 'presence' : 'optional', 'default' : [ -1, -1 ] }, 'menubar' : { 'presence' : 'optional', 'default' : None }, 'statusBar' : { 'presence' : 'optional', 'default' : 0 }, 'icon' : { 'presence' : 'optional', 'default' : None }, 'foregroundColor' : { 'presence' : 'optional', 'default' : None }, 'backgroundColor' : { 'presence' : 'optional', 'default' : None }, 'image' : { 'presence' : 'optional', 'default' : None } , 'tiled' : { 'presence' : 'optional', 'default' : 0 }, 'visible' : { 'presence' : 'optional', 'default' : 1 }, 'style' : { 'presence' : 'optional', 'default' : [] }, 'strings': { 'presence' : 'optional', 'default' : {} }, } }}, { 'name':'CustomDialog', 'info': { 'parent' : None, #'events' : ['openBackground'], 'events' : [], 'attributes' : { 'name' : { 'presence' : 'mandatory' }, 'title' : { 'presence' : 'mandatory' }, 'position' : { 'presence' : 'optional', 'default' : [ -1, -1 ] }, 'size' : { 'presence' : 'optional', 'default' : [ -1, -1 ] }, #'file' : { 'presence' : 'mandatory' } , #'foregroundColor' : { 'presence' : 'optional', 'default' : None }, #'backgroundColor' : { 'presence' : 'optional', 'default' : None }, 'strings': { 'presence' : 'optional', 'default' : {} }, } }}, ] PythonCard-0.8.2/statusbar.py0000644000076500007650000000145510076257712016110 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.13 $" __date__ = "$Date: 2004/07/17 17:20:10 $" """ import wx class StatusBar(wx.StatusBar): """ A simple StatusBar with a single text field. """ def __init__(self, parent): # only display the resizing grip if the window is resizable # the logic below is used because it appears different # default flags are used on different platforms if not (parent.GetWindowStyle() & wx.RESIZE_BORDER): wx.StatusBar.__init__(self, parent, wx.NewId(), 0) else: wx.StatusBar.__init__(self, parent) if wx.Platform == '__WXMAC__': self.SetSize((self.GetSizeTuple()[0], 15)) text = property(wx.StatusBar.GetStatusText, wx.StatusBar.SetStatusText, doc="text displayed in the statusBar") PythonCard-0.8.2/stc-styles.cfg0000644000076500007650000004377710042753766016341 0ustar alexalex00000000000000common.defs.msw={'size': 9, 'mono': 'Courier New', 'ln-size': 8, 'ln2-size': 7, 'ln-font': 'Lucida Console', 'backcol': '#FFFFFF', 'plaintext-size': 10} common.defs.gtk={'mono': 'Courier', 'ln-font': 'Helvetica', 'size': 12, 'ln-size': 10, 'backcol': '#FFFFFF', 'ln2-size': 9, 'plaintext-size': 12} common.defs.mac={'mono': 'Courier', 'ln-font': 'Helvetica', 'size': 12, 'ln-size': 10, 'backcol': '#FFFFFF', 'ln2-size': 9, 'plaintext-size': 12} common.styleidnames = {STC_STYLE_DEFAULT: 'Style default', STC_STYLE_LINENUMBER: 'Line numbers', STC_STYLE_BRACELIGHT: 'Matched braces', STC_STYLE_BRACEBAD: 'Unmatched brace', STC_STYLE_CONTROLCHAR: 'Control characters', STC_STYLE_INDENTGUIDE: 'Indent guide'} [style.xml] setting.xml.-3= setting.xml.-2= setting.xml.-1= style.xml.000= style.xml.001=bold,fore:#0000A0 style.xml.002=fore:#800000 style.xml.003=bold style.xml.005=fore:#0000FF style.xml.006=fore:#800080 style.xml.007=fore:#800080 style.xml.008= style.xml.009=fore:#008000 style.xml.010=bold style.xml.011= style.xml.012=bold,fore:#008000 style.xml.013=bold,fore:#008000 style.xml.032=face:%(mono)s,size:%(size)d style.xml.033=size:%(ln-size)d style.xml.034= style.xml.035= style.xml.036= style.xml.037= [style.cpp] setting.cpp.-3=fore:#C4C4FF setting.cpp.-2= setting.cpp.-1= style.cpp.000= style.cpp.001=fore:#008040,back:#EAFFEA style.cpp.002=fore:#008040,back:#EAFFEA style.cpp.003= style.cpp.004=fore:#0076AE style.cpp.005=bold,fore:#004080 style.cpp.006=fore:#800080 style.cpp.007=fore:#800040 style.cpp.008= style.cpp.009=fore:#808000 style.cpp.010=bold style.cpp.011= style.cpp.012=back:#FFD5FF style.cpp.013=fore:#8000FF style.cpp.032=face:%(mono)s,size:%(size)d style.cpp.033=size:%(ln-size)s style.cpp.034=fore:#0000FF,back:#FFFFB9,bold style.cpp.035=fore:#FF0000,back:#FFFFB9,bold style.cpp.036= style.cpp.037= [style.prop] setting.prop.-3= setting.prop.-2= setting.prop.-1= style.prop.000=fore:#000080 style.prop.001=fore:#008000,back:#DDFFDD style.prop.002=bold style.prop.003=bold,fore:#00DF00 style.prop.004=fore:#800000 style.prop.032=size:%(plaintext-size)d,face:%(mono)s style.prop.033= style.prop.034= style.prop.035= style.prop.036= style.prop.037= [style.text] setting.text.-3= setting.text.-2= setting.text.-1= style.text.000= style.text.032=size:%(plaintext-size)d,face:%(mono)s style.text.033= style.text.034= style.text.035= style.text.036= style.text.037= [style.html] style.html.001=bold,fore:#0000A0 style.html.002=fore:#800000 style.html.003=bold style.html.005=fore:#0000FF style.html.006=fore:#800080 style.html.007=fore:#800080 style.html.009=fore:#008000 style.html.010=bold style.html.012=bold style.html.013=bold style.html.014=fore:#8000FF,bold style.html.017=fore:#808000 style.html.018=bold style.html.032=face:%(mono)s,size:%(size)d style.html.033=size:%(ln-size)d [style.python.default] setting.python.-2=fore:#000000 setting.python.-1=fore:#000000,back:#88C4FF style.python.000=fore:#808080 style.python.001=fore:#007F00,back:#E8FFE8,italic style.python.002=fore:#007F7F style.python.003=fore:#7F007F style.python.004=fore:#7F007F style.python.005=fore:#00007F,bold style.python.006=fore:#7F0000 style.python.007=fore:#000033,back:#FFFFE8 style.python.008=fore:#0000FF,bold style.python.009=fore:#007F7F,bold style.python.010=bold style.python.012=fore:#7F7F7F,italic style.python.013=fore:#000000,back:#E0C0E0,eolfilled style.python.032=back:%(backcol)s,face:%(mono)s,size:%(size)d style.python.033=size:%(ln-size)d,face:%(ln-font)s,back:#A0A0A0 style.python.034=fore:#0000FF,back:#FFFF88,bold style.python.035=fore:#FF0000,back:#FFFF88,bold [style.python.classic] setting.python.-2=fore:#FFFFFF setting.python.-1=fore:#000000,back:#C0C0C0 style.python.000=fore:#C0C0C0 style.python.001=fore:#00FF00,italic style.python.002=fore:#00FFFF style.python.003=fore:#FF80FF style.python.004=fore:#FF80FF style.python.005=fore:#FFFFFF,bold style.python.006=fore:#FFFFC6 style.python.007=fore:#FFFFC6 style.python.008=fore:#79FFBC,bold style.python.009=fore:#79BCFF,bold style.python.010=bold,fore:#FFFFFF style.python.012=fore:#C0C0C0,italic style.python.013=fore:#000000,back:#CA8BE4,eolfilled style.python.032=back:#000080,face:%(mono)s,size:%(size)d,fore:#FFFF00 style.python.033=size:5,face:%(ln-font)s,back:#000000,fore:#FFFF80,bold style.python.034=fore:#0000D9,back:#79BCFF,bold style.python.035=fore:#D50000,back:#79BCFF,bold [style.python.twilight] setting.python.-2=fore:#FFFFFF setting.python.-1=fore:#000000,back:#888888 style.python.000=fore:#808080 style.python.001=fore:#00B000,italic style.python.002=fore:#FF00FF style.python.003=fore:#FFFF00 style.python.004=fore:#FFFF00 style.python.005=fore:#80FFFF,bold style.python.006=fore:#00C1C1 style.python.007=fore:#00C1C1 style.python.008=fore:#FFFF00,bold style.python.009=fore:#CEFFCE,bold style.python.010=bold,fore:#80FFFF style.python.012=fore:#A0A0A0,italic style.python.013=fore:#000000,back:#959500,eolfilled style.python.032=back:#000000,face:%(mono)s,size:%(size)d,fore:#FFFFFF style.python.033=size:%(ln2-size)d,face:%(ln-font)s,back:#414141,fore:#FFFFB7,bold style.python.034=fore:#0000FF,back:#80FFFF,bold style.python.035=fore:#FF0000,back:#80FFFF,bold [style.python.idle] setting.python.-1=fore:#FFFFFF,back:#0000A0 style.python.001=fore:#DD0000 style.python.003=fore:#00AA00 style.python.004=fore:#00AA00 style.python.005=fore:#FF7700 style.python.006=fore:#00AA00 style.python.007=fore:#00AA00 style.python.008=fore:#0000FF style.python.009=fore:#0000FF style.python.012=fore:#DD0000 style.python.032=face:%(mono)s,size:%(size)d style.python.033=size:%(ln-size)d,face:%(ln-font)s,back:#A0A0A0 style.python.034=fore:#0000FF,bold style.python.035=fore:#DD0000,bold [style.python.pythonwin] setting.python.-2=fore:#000000 setting.python.-1=fore:#000000,back:#88C4FF style.python.000=fore:#808080 style.python.001=fore:#007F00,back:#E8FFE8,italic style.python.002=fore:#007F7F style.python.003=fore:#7F007F style.python.004=fore:#7F007F style.python.005=fore:#00007F,bold style.python.006=fore:#7F0000 style.python.007=fore:#000033,back:#FFFFE8 style.python.008=fore:#0000FF,bold style.python.009=fore:#007F7F,bold style.python.010=bold style.python.012=fore:#7F7F7F,italic style.python.013=fore:#000000,back:#E0C0E0,eolfilled style.python.032=back:%(backcol)s,face:%(mono)s,size:%(size)d style.python.033=size:%(ln-size)d,face:%(ln-font)s,back:#A0A0A0 style.python.034=fore:#0000FF,back:#FFFF88,bold style.python.035=fore:#FF0000,back:#FFFF88,bold [style.python.mystyles] setting.python.-2=fore:#000000 setting.python.-1=fore:#000000,back:#88C4FF style.python.000=fore:#808080 style.python.001=fore:#007F00,back:%(backcol)s,italic style.python.002=fore:#007F7F style.python.003=fore:#7F007F style.python.004=fore:#7F007F style.python.005=fore:#00007F,bold style.python.006=fore:#7F0000 style.python.007=fore:#000033,back:#FFFFE8 style.python.008=fore:#0000FF,bold style.python.009=fore:#007F7F,bold style.python.010= style.python.011= style.python.012=fore:#7F7F7F,italic style.python.013=fore:#000000,back:#E0C0E0,eolfilled style.python.032=back:%(backcol)s,face:%(mono)s,size:%(size)d style.python.033=size:%(ln-size)d,face:%(ln-font)s,back:#A0A0A0 style.python.034=fore:#000000,back:#80FFFF style.python.035=fore:#000000,back:#FF8080 style.python.036= style.python.037= [style.html.default] style.html.001=bold,fore:#0000A0 style.html.002=fore:#800000 style.html.003=bold style.html.005=fore:#0000FF style.html.006=fore:#800080 style.html.007=fore:#800080 style.html.009=fore:#008000 style.html.010=bold style.html.012=bold style.html.013=bold style.html.014=fore:#8000FF,bold style.html.017=fore:#808000 style.html.018=bold style.html.032=face:%(mono)s,size:%(size)d style.html.033=size:%(ln-size)d [style.xml.default] style.html.001=bold,fore:#0000A0 style.html.002=fore:#800000 style.html.003=bold style.html.005=fore:#0000FF style.html.006=fore:#800080 style.html.007=fore:#800080 style.html.009=fore:#008000 style.html.010=bold style.html.012=bold style.html.013=bold style.html.014=fore:#8000FF,bold style.html.017=fore:#808000 style.html.018=bold style.html.032=face:%(mono)s,size:%(size)d style.html.033=size:%(ln-size)d [style.cpp.default] style.cpp.001=fore:#008040,back:#EAFFEA style.cpp.002=fore:#008040,back:#EAFFEA,size:8 style.cpp.004=fore:#0076AE style.cpp.005=bold,fore:#004080 style.cpp.006=fore:#800080 style.cpp.009=fore:#808000 style.cpp.010=bold style.cpp.012=back:#FFD5FF style.cpp.032=face:%(mono)s style.cpp.033=size:%(ln-size)s style.cpp.034=fore:#0000FF,back:#FFFFB9,bold style.cpp.035=fore:#FF0000,back:#FFFFB9,bold [style.prop.default] style.prop.000=fore:#000080 style.prop.001=fore:#008000,back:#DDFFDD style.prop.002=bold style.prop.003=bold,fore:#804000 style.prop.004=fore:#800000 style.prop.032=size:7 [style.text.default] [python] displaysrc=## Comment Blocks!\nclass MyClass(MyParent):\n """ Class example """\n def __init__(self):\n ''' Triple quotes '''\n # Do something silly\n a = ('Py' + "thon") * 100\n b = 'EOL unclosed string\n c = [Matched braces]\n d = {Unmatched brace braces={'good': (9, 12), 'bad': (10, 12)} styleidnames={STC_P_DEFAULT: 'Default', STC_P_COMMENTLINE: 'Comment', STC_P_NUMBER : 'Number', STC_P_STRING : 'String', STC_P_CHARACTER: 'Single quoted string', STC_P_WORD: 'Keyword', STC_P_TRIPLE:'Triple quotes', STC_P_TRIPLEDOUBLE: 'Triple double quotes', STC_P_CLASSNAME: 'Class definition', STC_P_DEFNAME: 'Function or method', STC_P_OPERATOR: 'Operators', STC_P_IDENTIFIER: 'Identifiers', STC_P_COMMENTBLOCK: 'Comment blocks', STC_P_STRINGEOL: 'EOL unclosed string'} lexer=STC_LEX_PYTHON keywords=and as assert break class continue def del elif else except exec finally for from global if import in is lambda not or pass print raise return try while [html] displaysrc=\n\n STC Style Editor\n \n \n \n < Text for testing >\n \n \n \n braces={} keywords=a abbr acronym address applet area b base basefont bdo big blockquote body br button caption center cite code col colgroup dd del dfn dir div dl dt em fieldset font form frame frameset h1 h2 h3 h4 h5 h6 head hr html i iframe img input ins isindex kbd label legend li link map menu meta noframes noscript object ol optgroup option p param pre q s samp script select small span strike strong style sub sup table tbody td textarea tfoot th thead title tr tt u ul var xmlns abbr accept-charset accept accesskey action align alink alt archive axis background bgcolor border cellpadding cellspacing char charoff charset checked cite class classid clear codebase codetype color cols colspan compact content coords data datafld dataformatas datapagesize datasrc datetime declare defer dir disabled enctype face for frame frameborder headers height href hreflang hspace http-equiv id ismap label lang language link longdesc marginwidth marginheight maxlength media method multiple name nohref noresize noshade nowrap object onblur onchange onclick ondblclick onfocus onkeydown onkeypress onkeyup onload onmousedown onmousemove onmouseover onmouseout onmouseup onreset onselect onsubmit onunload profile prompt readonly rel rev rows rowspan rules scheme scope shape size span src standby start style summary tabindex target text title type usemap valign value valuetype version vlink vspace width text password checkbox radio submit reset file hidden image public !doctype lexer=STC_LEX_HTML styleidnames={STC_H_DEFAULT: 'Default', STC_H_TAG: 'Tag', STC_H_TAGUNKNOWN: 'Tag unknown', STC_H_ATTRIBUTE: 'Attribute', STC_H_NUMBER: 'Number', STC_H_DOUBLESTRING: 'Double string', STC_H_SINGLESTRING:'Single string', STC_H_OTHER: 'Other', STC_H_COMMENT: 'Comment', STC_H_ENTITY: 'Entity', STC_H_TAGEND: 'Tag end', STC_H_XMLSTART: 'XML start', STC_H_XMLEND: 'XML End', STC_H_SCRIPT: 'Script', STC_H_ASP: 'ASP', STC_H_ASPAT: 'ASPAT', STC_H_CDATA: 'CDATA', STC_H_QUESTION: 'Question', STC_H_VALUE: 'Value', STC_HJ_START: 'JS - Start',STC_HJ_DEFAULT: 'JS - Default',STC_HJ_COMMENT: 'JS - Comment',STC_HJ_COMMENTLINE: 'JS - Comment line',STC_HJ_COMMENTDOC : 'JS - Comment doc',STC_HJ_NUMBER: 'JS - Number',STC_HJ_WORD: 'JS - Word',STC_HJ_KEYWORD: 'JS - Keyword',STC_HJ_DOUBLESTRING: 'JS - String',STC_HJ_SINGLESTRING: 'JS - Single quoted string',STC_HJ_SYMBOLS: 'JS - Symbol',STC_HJ_STRINGEOL: 'JS - EOL unclosed string', STC_HPHP_DEFAULT: 'HP - Default', STC_HPHP_HSTRING: 'HP - String', STC_HPHP_SIMPLESTRING: 'HP - Simple string', STC_HPHP_WORD: 'HP - Word', STC_HPHP_NUMBER: 'HP - Number', STC_HPHP_VARIABLE: 'HP - Variable', STC_HPHP_COMMENT: 'HP - Comment', STC_HPHP_COMMENTLINE: 'HP - Comment line', STC_HP_START: 'Py - Start', STC_HP_DEFAULT: 'Py - Default', STC_HP_COMMENTLINE: 'Py - Comment line', STC_HP_NUMBER: 'Py - Number', STC_HP_STRING: 'Py - String', STC_HP_CHARACTER: 'Py - Single quoted string', STC_HP_WORD: 'Py - Keyword', STC_HP_TRIPLE: 'Py - Triple quotes', STC_HP_TRIPLEDOUBLE: 'Py - Triple double quotes', STC_HP_CLASSNAME: 'Py - Class definition', STC_HP_DEFNAME: 'Py - Function or method', STC_HP_OPERATOR: 'Py - Operator', STC_HP_IDENTIFIER: 'Py - Identifier'} unused = STC_HPHP_STRINGEOL: 'HP - EOL unclosed string', STC_HPHP_HSTRING_VARIABLE, STC_HPHP_OPERATOR [xml] displaysrc=\n\n\n \n Gegbefuna Nwannem\n
666 Murtala Mohammed Blvd.
\n 999-101-1001\n nwanneg@naija.ng\n
\n
braces={} keywords=a abbr acronym address applet area b base basefont bdo big blockquote body br button caption center cite code col colgroup dd del dfn dir div dl dt em fieldset font form frame frameset h1 h2 h3 h4 h5 h6 head hr html i iframe img input ins isindex kbd label legend li link map menu meta noframes noscript object ol optgroup option p param pre q s samp script select small span strike strong style sub sup table tbody td textarea tfoot th thead title tr tt u ul var xmlns abbr accept-charset accept accesskey action align alink alt archive axis background bgcolor border cellpadding cellspacing char charoff charset checked cite class classid clear codebase codetype color cols colspan compact content coords data datafld dataformatas datapagesize datasrc datetime declare defer dir disabled enctype face for frame frameborder headers height href hreflang hspace http-equiv id ismap label lang language link longdesc marginwidth marginheight maxlength media method multiple name nohref noresize noshade nowrap object onblur onchange onclick ondblclick onfocus onkeydown onkeypress onkeyup onload onmousedown onmousemove onmouseover onmouseout onmouseup onreset onselect onsubmit onunload profile prompt readonly rel rev rows rowspan rules scheme scope shape size span src standby start style summary tabindex target text title type usemap valign value valuetype version vlink vspace width text password checkbox radio submit reset file hidden image public !doctype lexer=STC_LEX_XML styleidnames={STC_H_DEFAULT: 'Default', STC_H_TAG: 'Tag', STC_H_TAGUNKNOWN: 'Tag unknown', STC_H_ATTRIBUTE: 'Attribute', STC_H_NUMBER: 'Number', STC_H_DOUBLESTRING: 'Double quoted string', STC_H_SINGLESTRING:'Single quoted string', STC_H_OTHER: 'Other inside tag', STC_H_COMMENT: 'Comment', STC_H_ENTITY: 'Entity', STC_H_TAGEND: 'Tag end', STC_H_XMLSTART: 'XML start', STC_H_XMLEND: 'XML End'} [cpp] displaysrc=#include \n// Extract style settings from a spec-string\nvoid wxStyledTextCtrl::StyleSetSpec(int styleNum, const wxString& spec) {\n wxStringTokenizer tkz(spec, ',');\n while (tkz.HasMoreTokens() || 42) {\n wxString token = tkz.GetNextToken();\n wxString option = token.BeforeFirst(':');\n wxString val = token.AfterFirst(':');\n if (option == "bold")\n StyleSetBold(styleNum, true);\n/* End of code snippet */ @"Verbatim" " \n braces={'good': (5, 10), 'bad': (5, 38)} keywords=asm auto bool break case catch char class const const_cast continue default delete do double dynamic_cast else enum explicit export extern false float for friend goto if inline int long mutable namespace new operator private protected public register reinterpret_cast return short signed sizeof static static_cast struct switch template this throw true try typedef typeid typename union unsigned using virtual void volatile wchar_t while lexer=STC_LEX_CPP styleidnames={STC_C_DEFAULT: 'Default', STC_C_COMMENT: 'Comment',STC_C_COMMENTLINE: 'Comment line',STC_C_COMMENTDOC: 'Comment doc',STC_C_NUMBER: 'Number',STC_C_WORD: 'Keyword',STC_C_STRING: 'String',STC_C_CHARACTER: 'Character',STC_C_UUID: 'UUID',STC_C_PREPROCESSOR: 'Preprocessor',STC_C_OPERATOR: 'Operator', STC_C_IDENTIFIER: 'Identifier', STC_C_STRINGEOL: 'EOL unclosed string', STC_C_VERBATIM: 'Verbatim'} [prop] displaysrc=# The property's properties\n[prop]\ndisplaysrc=# The property's properties ...\nbraces={}\nkeywords=\nlexer=STC_LEX_PROPERTIES\n\n; Section with a default value\n[section]\n@default=42 braces={} keywords= lexer=STC_LEX_PROPERTIES styleidnames={0: 'Default', 1: 'Comment', 2: 'Section', 3: 'Assignment operator', 4:'Default value'} [text] displaysrc=Text uses the NULL lexer, so there\naren't really language spesific styles to set.\nOnly the default styles makes sense. braces={} keywords= lexer=STC_LEX_NULL styleidnames={0: 'Default'} [style.python] setting.python.-3= setting.python.-2=fore:#000000 setting.python.-1=fore:#000000,back:#88C4FF style.python.000=fore:#808080 style.python.001=fore:#007F00,back:%(backcol)s,italic style.python.002=fore:#007F7F style.python.003=fore:#7F007F style.python.004=fore:#7F007F style.python.005=fore:#00007F,bold style.python.006=fore:#7F0000 style.python.007=fore:#000033,back:#FFFFE8 style.python.008=fore:#0000FF,bold style.python.009=fore:#007F7F,bold style.python.010= style.python.011= style.python.012=fore:#7F7F7F,italic style.python.013=fore:#000000,back:#E0C0E0,eolfilled style.python.032=back:%(backcol)s,face:%(mono)s,size:%(size)d style.python.033=size:%(ln-size)d,face:%(ln-font)s,back:#A0A0A0 style.python.034=fore:#000000,back:#80FFFF style.python.035=fore:#000000,back:#FF8080 style.python.036= style.python.037= PythonCard-0.8.2/STCStyleEditor.py0000644000076500007650000016273510042753766016735 0ustar alexalex00000000000000#----------------------------------------------------------------------------- # Name: STCStyleEditor.py # Purpose: Style editor for the wx.StyledTextCtrl # # Author: Riaan Booysen # # Created: 2001/08/20 # RCS-ID: $Id: STCStyleEditor.py,v 1.13 2004/04/25 15:23:34 kasplat Exp $ # Copyright: (c) 2001 - 2003 Riaan Booysen # Licence: wxWindows license #----------------------------------------------------------------------------- #Boa:Dialog:STCStyleEditDlg """ Style editor for the wx.StyledTextCtrl. Reads in property style definitions from a config file. Modified styled can be saved (and optionally applied to a given list of STCs) It can also maintain a Common definition dictionary of font names, colours and sizes which can be shared across multiple language style definitions. This is also used to store platform spesific settings as fonts and sizes vary with platform. The following items are defined in the stc-styles.rc.cfg file. common.defs.msw - Common definition dictionary used on wxMSW common.defs.gtk - Common definition dictionary used on wxGTK common.defs.mac - Common definition dictionary used on wxMAC common.styleidnames - STC styles shared by all languages Each supported language defines the following groups: [] displaysrc - Example source to display in the editor braces - Dictionary defining the (line, column) for showing 'good' and 'bad' brace matching (both keys optional) keywords - Space separated list of keywords lexer - wxSTC constant for the language lexer styleidnames - Dictionary of language spesific style numbers and names [style.] - The users current style values [style..default] - Default style values (can be reverted from) 0 or more predefined style groups or 'themes' [style..] Currently the following languages are supported: python, html, xml, cpp, text, props Other languages can be added by just defining the above settings for them in the config file (if wxSTC implements them). Use the initSTC function to initialise your wxSTC from a config file. """ import os, sys, string, pprint, copy import wx from wx.lib.anchors import LayoutAnchors from wx import stc settingsIdNames = {-1: 'Selection', -2: 'Caret', -3: 'Edge'} # KEA 2004-01-22 # quick workaround for wxPython 2.5 # I'm defining commonPropDefs in OnAddsharebtnButton below where it is used # to avoid a seg fault on Mac OS X with wxPython 2.5 #commonPropDefs = {'fore': '#888888', 'size': 8, # 'face': wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT).GetFaceName()} styleCategoryDescriptions = { '----Language----': 'Styles spesific to the language', '----Standard----': 'Styles shared by all languages', '----Settings----': 'Properties set by STC methods', '----Common----': 'User definable values that can be shared between languages'} platformSettings = {'__WXMSW__': ('msw', 8), '__WXGTK__': ('gtk', 10), '__WXMAC__': ('mac', 11)} [wxID_STCSTYLEEDITDLG, wxID_STCSTYLEEDITDLGADDCOMMONITEMBTN, wxID_STCSTYLEEDITDLGBGCOLBTN, wxID_STCSTYLEEDITDLGBGCOLCB, wxID_STCSTYLEEDITDLGBGCOLDEFCB, wxID_STCSTYLEEDITDLGBGCOLOKBTN, wxID_STCSTYLEEDITDLGCANCELBTN, wxID_STCSTYLEEDITDLGCONTEXTHELPBUTTON1, wxID_STCSTYLEEDITDLGELEMENTLB, wxID_STCSTYLEEDITDLGFACECB, wxID_STCSTYLEEDITDLGFACEDEFCB, wxID_STCSTYLEEDITDLGFACEOKBTN, wxID_STCSTYLEEDITDLGFGCOLBTN, wxID_STCSTYLEEDITDLGFGCOLCB, wxID_STCSTYLEEDITDLGFGCOLDEFCB, wxID_STCSTYLEEDITDLGFGCOLOKBTN, wxID_STCSTYLEEDITDLGFIXEDWIDTHCHK, wxID_STCSTYLEEDITDLGOKBTN, wxID_STCSTYLEEDITDLGPANEL1, wxID_STCSTYLEEDITDLGPANEL2, wxID_STCSTYLEEDITDLGPANEL3, wxID_STCSTYLEEDITDLGPANEL4, wxID_STCSTYLEEDITDLGREMOVECOMMONITEMBTN, wxID_STCSTYLEEDITDLGSIZECB, wxID_STCSTYLEEDITDLGSIZEOKBTN, wxID_STCSTYLEEDITDLGSPEEDSETTINGCH, wxID_STCSTYLEEDITDLGSTATICBOX1, wxID_STCSTYLEEDITDLGSTATICBOX2, wxID_STCSTYLEEDITDLGSTATICLINE1, wxID_STCSTYLEEDITDLGSTATICTEXT2, wxID_STCSTYLEEDITDLGSTATICTEXT3, wxID_STCSTYLEEDITDLGSTATICTEXT4, wxID_STCSTYLEEDITDLGSTATICTEXT6, wxID_STCSTYLEEDITDLGSTATICTEXT7, wxID_STCSTYLEEDITDLGSTATICTEXT8, wxID_STCSTYLEEDITDLGSTATICTEXT9, wxID_STCSTYLEEDITDLGSTC, wxID_STCSTYLEEDITDLGSTYLEDEFST, wxID_STCSTYLEEDITDLGTABOLDCB, wxID_STCSTYLEEDITDLGTABOLDDEFCB, wxID_STCSTYLEEDITDLGTAEOLFILLEDCB, wxID_STCSTYLEEDITDLGTAEOLFILLEDDEFCB, wxID_STCSTYLEEDITDLGTAITALICCB, wxID_STCSTYLEEDITDLGTAITALICDEFCB, wxID_STCSTYLEEDITDLGTASIZEDEFCB, wxID_STCSTYLEEDITDLGTAUNDERLINEDCB, wxID_STCSTYLEEDITDLGTAUNDERLINEDDEFCB, ] = map(lambda _init_ctrls: wx.NewId(), range(47)) class STCStyleEditDlg(wx.Dialog): """ Style editor for the wx.StyledTextCtrl """ _custom_classes = {'wx.Window' : ['wx.StyledTextCtrl']} def _init_ctrls(self, prnt): # generated method, don't edit wx.Dialog.__init__(self, id=wxID_STCSTYLEEDITDLG, name='STCStyleEditDlg', parent=prnt, pos=wx.Point(567, 279), size=wx.Size(493, 482), style=wx.WANTS_CHARS | wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER, title=self.stc_title) self.SetClientSize(wx.Size(485, 455)) self.SetAutoLayout(True) self.SetSizeHints(425, 400, -1, -1) self.Center(wx.BOTH) wx.EVT_SIZE(self, self.OnStcstyleeditdlgSize) self.speedsettingCh = wx.Choice(choices=[], id=wxID_STCSTYLEEDITDLGSPEEDSETTINGCH, name='speedsettingCh', parent=self, pos=wx.Point(96, 28), size=wx.Size(380, 21), style=0, validator=wx.DefaultValidator) self.speedsettingCh.SetConstraints(LayoutAnchors(self.speedsettingCh, True, True, True, False)) self.speedsettingCh.SetHelpText('The speed setting allows you to revert to one of the predefined style sets. This will overwrite your current settings when tha dialog is posted.') wx.EVT_CHOICE(self.speedsettingCh, wxID_STCSTYLEEDITDLGSPEEDSETTINGCH, self.OnSpeedsettingchChoice) self.elementLb = wx.ListBox(choices=[], id=wxID_STCSTYLEEDITDLGELEMENTLB, name='elementLb', parent=self, pos=wx.Point(8, 70), size=wx.Size(175, 128), style=0, validator=wx.DefaultValidator) self.elementLb.SetConstraints(LayoutAnchors(self.elementLb, True, True, True, False)) self.elementLb.SetHelpText('Select a style here to edit it. Common definitions can be added and maintained here. A common definition is a property that can be shared between styles and special cased per platform.') wx.EVT_LISTBOX(self.elementLb, wxID_STCSTYLEEDITDLGELEMENTLB, self.OnElementlbListbox) self.addCommonItemBtn = wx.Button(id=wxID_STCSTYLEEDITDLGADDCOMMONITEMBTN, label='Add', name='addCommonItemBtn', parent=self, pos=wx.Point(8, 200), size=wx.Size(88, 17), style=0) self.addCommonItemBtn.SetToolTipString('Add new Common definition') wx.EVT_BUTTON(self.addCommonItemBtn, wxID_STCSTYLEEDITDLGADDCOMMONITEMBTN, self.OnAddsharebtnButton) self.removeCommonItemBtn = wx.Button(id=wxID_STCSTYLEEDITDLGREMOVECOMMONITEMBTN, label='Remove', name='removeCommonItemBtn', parent=self, pos=wx.Point(96, 200), size=wx.Size(88, 17), style=0) self.removeCommonItemBtn.SetToolTipString('Remove the selected Common definition') wx.EVT_BUTTON(self.removeCommonItemBtn, wxID_STCSTYLEEDITDLGREMOVECOMMONITEMBTN, self.OnRemovesharebtnButton) self.styleDefST = wx.StaticText(id=wxID_STCSTYLEEDITDLGSTYLEDEFST, label='(nothing selected)', name='styleDefST', parent=self, pos=wx.Point(96, 8), size=wx.Size(376, 16), style=wx.ST_NO_AUTORESIZE) self.styleDefST.SetFont(wx.Font(self.style_font_size, wx.SWISS, wx.NORMAL, wx.BOLD, False, '')) self.styleDefST.SetConstraints(LayoutAnchors(self.styleDefST, True, True, True, False)) self.staticLine1 = wx.StaticLine(id=wxID_STCSTYLEEDITDLGSTATICLINE1, name='staticLine1', parent=self, pos=wx.Point(48, 64), size=wx.Size(135, 0), style=wx.LI_HORIZONTAL) self.staticLine1.SetConstraints(LayoutAnchors(self.staticLine1, True, True, True, False)) self.staticText6 = wx.StaticText(id=wxID_STCSTYLEEDITDLGSTATICTEXT6, label='Style', name='staticText6', parent=self, pos=wx.Point(8, 56), size=wx.Size(40, 13), style=0) self.staticText8 = wx.StaticText(id=wxID_STCSTYLEEDITDLGSTATICTEXT8, label='Style def:', name='staticText8', parent=self, pos=wx.Point(8, 8), size=wx.Size(88, 13), style=0) self.staticText9 = wx.StaticText(id=wxID_STCSTYLEEDITDLGSTATICTEXT9, label='SpeedSetting:', name='staticText9', parent=self, pos=wx.Point(8, 32), size=wx.Size(88, 13), style=0) self.panel3 = wx.Panel(id=wxID_STCSTYLEEDITDLGPANEL3, name='panel3', parent=self, pos=wx.Point(199, 56), size=wx.Size(160, 120), style=wx.TAB_TRAVERSAL) self.panel3.SetConstraints(LayoutAnchors(self.panel3, False, True, True, False)) self.panel4 = wx.Panel(id=wxID_STCSTYLEEDITDLGPANEL4, name='panel4', parent=self, pos=wx.Point(364, 56), size=wx.Size(114, 120), style=wx.TAB_TRAVERSAL) self.panel4.SetConstraints(LayoutAnchors(self.panel4, False, True, True, False)) self.panel1 = wx.Panel(id=wxID_STCSTYLEEDITDLGPANEL1, name='panel1', parent=self, pos=wx.Point(202, 177), size=wx.Size(149, 40), style=wx.TAB_TRAVERSAL) self.panel1.SetConstraints(LayoutAnchors(self.panel1, False, True, True, False)) self.panel2 = wx.Panel(id=wxID_STCSTYLEEDITDLGPANEL2, name='panel2', parent=self, pos=wx.Point(364, 178), size=wx.Size(112, 40), style=wx.TAB_TRAVERSAL) self.panel2.SetConstraints(LayoutAnchors(self.panel2, False, True, True, False)) self.stc = stc.StyledTextCtrl(id=wxID_STCSTYLEEDITDLGSTC, name='stc', parent=self, pos=wx.Point(8, 224), size=wx.Size(469, 191), style=wx.SUNKEN_BORDER) self.stc.SetConstraints(LayoutAnchors(self.stc, True, True, True, True)) self.stc.SetHelpText('The style preview window. Click or move the cursor over a spesific style to select the style for editing in the editors above.') wx.EVT_LEFT_UP(self.stc, self.OnUpdateUI) wx.EVT_KEY_UP(self.stc, self.OnUpdateUI) self.contextHelpButton1 = wx.ContextHelpButton(parent=self, pos=wx.Point(8, 423), size=wx.Size(24, 24), style=wx.BU_AUTODRAW) self.contextHelpButton1.SetConstraints(LayoutAnchors(self.contextHelpButton1, True, False, False, True)) self.okBtn = wx.Button(id=wxID_STCSTYLEEDITDLGOKBTN, label='OK', name='okBtn', parent=self, pos=wx.Point(316, 423), size=wx.Size(75, 23), style=0) self.okBtn.SetConstraints(LayoutAnchors(self.okBtn, False, False, True, True)) self.okBtn.SetToolTipString('Save changes to the config file') wx.EVT_BUTTON(self.okBtn, wxID_STCSTYLEEDITDLGOKBTN, self.OnOkbtnButton) self.cancelBtn = wx.Button(id=wxID_STCSTYLEEDITDLGCANCELBTN, label='Cancel', name='cancelBtn', parent=self, pos=wx.Point(400, 423), size=wx.Size(75, 23), style=0) self.cancelBtn.SetConstraints(LayoutAnchors(self.cancelBtn, False, False, True, True)) self.cancelBtn.SetToolTipString('Close dialog without saving changes') wx.EVT_BUTTON(self.cancelBtn, wxID_STCSTYLEEDITDLGCANCELBTN, self.OnCancelbtnButton) self.staticText4 = wx.StaticText(id=wxID_STCSTYLEEDITDLGSTATICTEXT4, label='Face:', name='staticText4', parent=self.panel1, pos=wx.Point(0, 0), size=wx.Size(48, 13), style=0) self.fixedWidthChk = wx.CheckBox(id=wxID_STCSTYLEEDITDLGFIXEDWIDTHCHK, label='', name='fixedWidthChk', parent=self.panel1, pos=wx.Point(0, 23), size=wx.Size(16, 19), style=0) self.fixedWidthChk.SetToolTipString('Check this for Fixed Width fonts') wx.EVT_CHECKBOX(self.fixedWidthChk, wxID_STCSTYLEEDITDLGFIXEDWIDTHCHK, self.OnFixedwidthchkCheckbox) self.faceCb = wx.ComboBox(choices=[], id=wxID_STCSTYLEEDITDLGFACECB, name='faceCb', parent=self.panel1, pos=wx.Point(17, 18), size=wx.Size(101, 21), style=0, validator=wx.DefaultValidator, value='') self.staticText7 = wx.StaticText(id=wxID_STCSTYLEEDITDLGSTATICTEXT7, label='Size:', name='staticText7', parent=self.panel2, pos=wx.Point(0, 0), size=wx.Size(40, 13), style=0) self.sizeCb = wx.ComboBox(choices=[], id=wxID_STCSTYLEEDITDLGSIZECB, name='sizeCb', parent=self.panel2, pos=wx.Point(0, 17), size=wx.Size(80, 21), style=0, validator=wx.DefaultValidator, value='') self.sizeOkBtn = wx.Button(id=wxID_STCSTYLEEDITDLGSIZEOKBTN, label='ok', name='sizeOkBtn', parent=self.panel2, pos=wx.Point(80, 17), size=wx.Size(32, 21), style=0) self.faceOkBtn = wx.Button(id=wxID_STCSTYLEEDITDLGFACEOKBTN, label='ok', name='faceOkBtn', parent=self.panel1, pos=wx.Point(117, 18), size=wx.Size(32, 21), style=0) self.fgColBtn = wx.Button(id=wxID_STCSTYLEEDITDLGFGCOLBTN, label='Foreground', name='fgColBtn', parent=self.panel3, pos=wx.Point(8, 16), size=wx.Size(96, 16), style=0) wx.EVT_BUTTON(self.fgColBtn, wxID_STCSTYLEEDITDLGFGCOLBTN, self.OnFgcolbtnButton) self.fgColCb = wx.ComboBox(choices=[], id=wxID_STCSTYLEEDITDLGFGCOLCB, name='fgColCb', parent=self.panel3, pos=wx.Point(8, 32), size=wx.Size(96, 21), style=0, validator=wx.DefaultValidator, value='') self.fgColOkBtn = wx.Button(id=wxID_STCSTYLEEDITDLGFGCOLOKBTN, label='ok', name='fgColOkBtn', parent=self.panel3, pos=wx.Point(104, 32), size=wx.Size(32, 21), style=0) self.staticText3 = wx.StaticText(id=wxID_STCSTYLEEDITDLGSTATICTEXT3, label='default', name='staticText3', parent=self.panel3, pos=wx.Point(112, 15), size=wx.Size(38, 16), style=0) self.fgColDefCb = wx.CheckBox(id=wxID_STCSTYLEEDITDLGFGCOLDEFCB, label='checkBox1', name='fgColDefCb', parent=self.panel3, pos=wx.Point(136, 31), size=wx.Size(16, 16), style=0) self.bgColBtn = wx.Button(id=wxID_STCSTYLEEDITDLGBGCOLBTN, label='Background', name='bgColBtn', parent=self.panel3, pos=wx.Point(8, 64), size=wx.Size(96, 16), style=0) wx.EVT_BUTTON(self.bgColBtn, wxID_STCSTYLEEDITDLGBGCOLBTN, self.OnBgcolbtnButton) self.bgColCb = wx.ComboBox(choices=[], id=wxID_STCSTYLEEDITDLGBGCOLCB, name='bgColCb', parent=self.panel3, pos=wx.Point(8, 80), size=wx.Size(96, 21), style=0, validator=wx.DefaultValidator, value='') self.bgColOkBtn = wx.Button(id=wxID_STCSTYLEEDITDLGBGCOLOKBTN, label='ok', name='bgColOkBtn', parent=self.panel3, pos=wx.Point(104, 80), size=wx.Size(32, 21), style=0) self.staticBox2 = wx.StaticBox(id=wxID_STCSTYLEEDITDLGSTATICBOX2, label='Text attributes', name='staticBox2', parent=self.panel4, pos=wx.Point(0, 0), size=wx.Size(112, 112), style=0) self.staticBox2.SetConstraints(LayoutAnchors(self.staticBox2, False, True, True, False)) self.staticBox2.SetHelpText('Text attribute flags.') self.staticText2 = wx.StaticText(id=wxID_STCSTYLEEDITDLGSTATICTEXT2, label='default', name='staticText2', parent=self.panel4, pos=wx.Point(64, 12), size=wx.Size(40, 16), style=0) self.taBoldDefCb = wx.CheckBox(id=wxID_STCSTYLEEDITDLGTABOLDDEFCB, label='checkBox1', name='taBoldDefCb', parent=self.panel4, pos=wx.Point(88, 27), size=wx.Size(16, 16), style=0) self.taItalicDefCb = wx.CheckBox(id=wxID_STCSTYLEEDITDLGTAITALICDEFCB, label='checkBox1', name='taItalicDefCb', parent=self.panel4, pos=wx.Point(88, 48), size=wx.Size(16, 16), style=0) self.taUnderlinedDefCb = wx.CheckBox(id=wxID_STCSTYLEEDITDLGTAUNDERLINEDDEFCB, label='checkBox1', name='taUnderlinedDefCb', parent=self.panel4, pos=wx.Point(88, 70), size=wx.Size(16, 16), style=0) self.taEOLfilledDefCb = wx.CheckBox(id=wxID_STCSTYLEEDITDLGTAEOLFILLEDDEFCB, label='checkBox1', name='taEOLfilledDefCb', parent=self.panel4, pos=wx.Point(88, 92), size=wx.Size(16, 16), style=0) self.taEOLfilledCb = wx.CheckBox(id=wxID_STCSTYLEEDITDLGTAEOLFILLEDCB, label='EOL filled', name='taEOLfilledCb', parent=self.panel4, pos=wx.Point(8, 92), size=wx.Size(80, 16), style=0) wx.EVT_CHECKBOX(self.taEOLfilledCb, wxID_STCSTYLEEDITDLGTAEOLFILLEDCB, self.OnTaeoffilledcbCheckbox) self.taUnderlinedCb = wx.CheckBox(id=wxID_STCSTYLEEDITDLGTAUNDERLINEDCB, label='Underlined', name='taUnderlinedCb', parent=self.panel4, pos=wx.Point(8, 70), size=wx.Size(80, 16), style=0) wx.EVT_CHECKBOX(self.taUnderlinedCb, wxID_STCSTYLEEDITDLGTAUNDERLINEDCB, self.OnTaunderlinedcbCheckbox) self.taItalicCb = wx.CheckBox(id=wxID_STCSTYLEEDITDLGTAITALICCB, label='Italic', name='taItalicCb', parent=self.panel4, pos=wx.Point(8, 48), size=wx.Size(80, 16), style=0) wx.EVT_CHECKBOX(self.taItalicCb, wxID_STCSTYLEEDITDLGTAITALICCB, self.OnTaitaliccbCheckbox) self.taBoldCb = wx.CheckBox(id=wxID_STCSTYLEEDITDLGTABOLDCB, label='Bold', name='taBoldCb', parent=self.panel4, pos=wx.Point(8, 27), size=wx.Size(80, 16), style=0) wx.EVT_CHECKBOX(self.taBoldCb, wxID_STCSTYLEEDITDLGTABOLDCB, self.OnTaboldcbCheckbox) self.bgColDefCb = wx.CheckBox(id=wxID_STCSTYLEEDITDLGBGCOLDEFCB, label='checkBox1', name='bgColDefCb', parent=self.panel3, pos=wx.Point(136, 79), size=wx.Size(16, 16), style=0) self.staticBox1 = wx.StaticBox(id=wxID_STCSTYLEEDITDLGSTATICBOX1, label='Colour', name='staticBox1', parent=self.panel3, pos=wx.Point(0, 0), size=wx.Size(157, 112), style=0) self.staticBox1.SetConstraints(LayoutAnchors(self.staticBox1, False, True, True, False)) self.faceDefCb = wx.CheckBox(id=wxID_STCSTYLEEDITDLGFACEDEFCB, label='checkBox1', name='faceDefCb', parent=self.panel1, pos=wx.Point(117, 0), size=wx.Size(16, 16), style=0) self.taSizeDefCb = wx.CheckBox(id=wxID_STCSTYLEEDITDLGTASIZEDEFCB, label='checkBox1', name='taSizeDefCb', parent=self.panel2, pos=wx.Point(80, 0), size=wx.Size(16, 16), style=0) def __init__(self, parent, langTitle, lang, configFile, STCsToUpdate=()): self.stc_title = 'wx.StyledTextCtrl Style Editor' self.stc_title = 'wx.StyledTextCtrl Style Editor - %s' % langTitle self.style_font_size = 8 self.style_font_size = platformSettings[wx.Platform][1] self._init_ctrls(parent) self.lang = lang self.configFile = configFile self.style = '' self.styleNum = 0 self.names = [] self.values = {} self.STCsToUpdate = STCsToUpdate self._blockUpdate = False for combo, okBtn, evtRet, evtCB, evtRDC in ( (self.fgColCb, self.fgColOkBtn, self.OnfgColRet, self.OnfgColCombobox, self.OnGotoCommonDef), (self.bgColCb, self.bgColOkBtn, self.OnbgColRet, self.OnbgColCombobox, self.OnGotoCommonDef), (self.faceCb, self.faceOkBtn, self.OnfaceRet, self.OnfaceCombobox, self.OnGotoCommonDef), (self.sizeCb, self.sizeOkBtn, self.OnsizeRet, self.OnsizeCombobox, self.OnGotoCommonDef)): self.bindComboEvts(combo, okBtn, evtRet, evtCB, evtRDC) (self.config, self.commonDefs, self.styleIdNames, self.styles, self.styleGroupNames, self.predefStyleGroups, self.otherLangStyleGroupNames, self.otherLangStyleGroups, self.displaySrc, self.lexer, self.keywords, self.braceInfo) = \ initFromConfig(configFile, lang) self.currSpeedSetting = 'style.%s'%self.lang for grp in [self.currSpeedSetting]+self.styleGroupNames: self.speedsettingCh.Append(grp) self.speedsettingCh.SetSelection(0) margin = 0 self.stc.SetMarginType(margin, stc.STC_MARGIN_NUMBER) self.stc.SetMarginWidth(margin, 25) self.stc.SetMarginSensitive(margin, True) stc.EVT_STC_MARGINCLICK(self.stc, wxID_STCSTYLEEDITDLGSTC, self.OnMarginClick) self.stc.SetUseTabs(False) self.stc.SetTabWidth(4) self.stc.SetIndentationGuides(True) self.stc.SetEdgeMode(stc.STC_EDGE_BACKGROUND) self.stc.SetEdgeColumn(44) self.setStyles() self.populateStyleSelector() self.defNames, self.defValues = parseProp(\ self.styleDict.get(stc.STC_STYLE_DEFAULT, '')) self.stc.SetText(self.displaySrc) self.stc.EmptyUndoBuffer() self.stc.SetCurrentPos(self.stc.GetTextLength()) self.stc.SetAnchor(self.stc.GetTextLength()) self.populateCombosWithCommonDefs() # Logical grouping of controls and the property they edit self.allCtrls = [((self.fgColBtn, self.fgColCb, self.fgColOkBtn), self.fgColDefCb, 'fore', wxID_STCSTYLEEDITDLGFGCOLDEFCB), ((self.bgColBtn, self.bgColCb, self.bgColOkBtn), self.bgColDefCb, 'back', wxID_STCSTYLEEDITDLGBGCOLDEFCB), (self.taBoldCb, self.taBoldDefCb, 'bold', wxID_STCSTYLEEDITDLGTABOLDDEFCB), (self.taItalicCb, self.taItalicDefCb, 'italic', wxID_STCSTYLEEDITDLGTAITALICDEFCB), (self.taUnderlinedCb, self.taUnderlinedDefCb, 'underline', wxID_STCSTYLEEDITDLGTAUNDERLINEDDEFCB), (self.taEOLfilledCb, self.taEOLfilledDefCb, 'eolfilled', wxID_STCSTYLEEDITDLGTAEOLFILLEDDEFCB), ((self.sizeCb, self.sizeOkBtn), self.taSizeDefCb, 'size', wxID_STCSTYLEEDITDLGTASIZEDEFCB), ((self.faceCb, self.faceOkBtn, self.fixedWidthChk), self.faceDefCb, 'face', wxID_STCSTYLEEDITDLGFACEDEFCB)] self.clearCtrls(disableDefs=True) # centralised default checkbox event handler self.chbIdMap = {} for ctrl, chb, prop, wid in self.allCtrls: self.chbIdMap[wid] = ctrl, chb, prop, wid wx.EVT_CHECKBOX(chb, wid, self.OnDefaultCheckBox) chb.SetToolTipString('Toggle defaults') self.Center(wx.BOTH) #---Property methods------------------------------------------------------------ def getCtrlForProp(self, findprop): for ctrl, chb, prop, wid in self.allCtrls: if findprop == prop: return ctrl, chb raise Exception('PropNotFound', findprop) def editProp(self, on, prop, val=''): oldstyle = self.rememberStyles() if on: if not self.names.count(prop): self.names.append(prop) self.values[prop] = val else: try: self.names.remove(prop) except ValueError: pass try: del self.values[prop] except KeyError: pass try: self.updateStyle() return True except KeyError, errkey: wx.LogError('Name not found in Common definition, '\ 'please enter valid reference. (%s)'%errkey) self.restoreStyles(oldstyle) return False #---Control population methods-------------------------------------------------- def setStyles(self): if self._blockUpdate: return self.styles, self.styleDict, self.styleNumIdxMap = \ setSTCStyles(self.stc, self.styles, self.styleIdNames, self.commonDefs, self.lang, self.lexer, self.keywords) def updateStyle(self): # called after a control edited self.names, self.values # Special case for saving common defs settings if self.styleNum == 'common': strVal = self.style[2] = self.values.values()[0] if self.style[1] == 'size': self.style[2] = int(strVal) self.commonDefs[self.style[0]] = self.style[2] self.styleDefST.SetLabel(strVal) else: self.style = writePropVal(self.names, self.values) styleDecl = writeProp(self.styleNum, self.style, self.lang) self.styles[self.styleNumIdxMap[self.styleNum]] = styleDecl self.styleDefST.SetLabel(self.style) self.setStyles() def findInStyles(self, txt, styles): for style in styles: if style.find(txt) != -1: return True return False def rememberStyles(self): return self.names[:], copy.copy(self.values) def restoreStyles(self, style): self.names, self.values = style self.updateStyle() def clearCtrls(self, isDefault=False, disableDefs=False): self._blockUpdate = True try: for ctrl, chb, prop, wid in self.allCtrls: if prop in ('fore', 'back'): cbtn, txt, btn = ctrl cbtn.SetBackgroundColour(\ wx.SystemSettings.GetColour(wx.SYS_COLOUR_BTNFACE)) cbtn.SetForegroundColour(wx.Colour(255, 255, 255)) cbtn.Enable(isDefault) txt.SetValue('') txt.Enable(isDefault) btn.Enable(isDefault) elif prop == 'size': cmb, btn = ctrl cmb.SetValue('') cmb.Enable(isDefault) btn.Enable(isDefault) elif prop == 'face': cmb, btn, chk = ctrl cmb.SetValue('') cmb.Enable(isDefault) btn.Enable(isDefault) chk.Enable(isDefault) chk.SetValue(False) elif prop in ('bold', 'italic', 'underline', 'eolfilled'): ctrl.SetValue(False) ctrl.Enable(isDefault) chb.Enable(not isDefault and not disableDefs) chb.SetValue(True) finally: self._blockUpdate = False def populateProp(self, items, default, forceDisable=False): self._blockUpdate = True try: for name, val in items: if name: ctrl, chb = self.getCtrlForProp(name) if name in ('fore', 'back'): cbtn, txt, btn = ctrl repval = val%self.commonDefs cbtn.SetBackgroundColour(strToCol(repval)) cbtn.SetForegroundColour(wx.Colour(0, 0, 0)) cbtn.Enable(not forceDisable) txt.SetValue(val) txt.Enable(not forceDisable) btn.Enable(not forceDisable) chb.SetValue(default) elif name == 'size': cmb, btn = ctrl cmb.SetValue(val) cmb.Enable(not forceDisable) btn.Enable(not forceDisable) chb.SetValue(default) elif name == 'face': cmb, btn, chk = ctrl cmb.SetValue(val) cmb.Enable(not forceDisable) btn.Enable(not forceDisable) chk.Enable(not forceDisable) chb.SetValue(default) elif name in ('bold', 'italic', 'underline', 'eolfilled'): ctrl.Enable(not forceDisable) ctrl.SetValue(True) chb.SetValue(default) finally: self._blockUpdate = False def valIsCommonDef(self, val): return len(val) >= 5 and val[:2] == '%(' def populateCtrls(self): self.clearCtrls(self.styleNum == stc.STC_STYLE_DEFAULT, disableDefs=self.styleNum < 0) # handle colour controls for settings if self.styleNum < 0: self.fgColDefCb.Enable(True) if self.styleNum == -1: self.bgColDefCb.Enable(True) # populate with default style self.populateProp(self.defValues.items(), True, self.styleNum != stc.STC_STYLE_DEFAULT) # override with current settings self.populateProp(self.values.items(), False) def getCommonDefPropType(self, commonDefName): val = self.commonDefs[commonDefName] if type(val) == type(0): return 'size' if len(val) == 7 and val[0] == '#': return 'fore' return 'face' def bindComboEvts(self, combo, btn, btnEvtMeth, comboEvtMeth, rdclickEvtMeth): wx.EVT_COMBOBOX(combo, combo.GetId(), comboEvtMeth) wx.EVT_BUTTON(btn, btn.GetId(), btnEvtMeth) wx.EVT_RIGHT_DCLICK(combo, rdclickEvtMeth) combo.SetToolTipString('Select from list or click "ok" button on the right to change a manual entry, right double-click \n'\ 'the drop down button to select Common definition in the Style Editor (if applicable)') btn.SetToolTipString('Accept value') def populateCombosWithCommonDefs(self, fixedWidthOnly=None): self._blockUpdate = True try: commonDefs = {'fore': [], 'face': [], 'size': []} if self.elementLb.GetSelection() < self.commonDefsStartIdx: for common in self.commonDefs.keys(): prop = self.getCommonDefPropType(common) commonDefs[prop].append('%%(%s)%s'%(common, prop=='size' and 'd' or 's')) # Colours currFg, currBg = self.fgColCb.GetValue(), self.bgColCb.GetValue() self.fgColCb.Clear(); self.bgColCb.Clear() for colCommonDef in commonDefs['fore']: self.fgColCb.Append(colCommonDef) self.bgColCb.Append(colCommonDef) self.fgColCb.SetValue(currFg); self.bgColCb.SetValue(currBg) # Font if fixedWidthOnly is None: fixedWidthOnly = self.fixedWidthChk.GetValue() fontEnum = wx.FontEnumerator() fontEnum.EnumerateFacenames(fixedWidthOnly=fixedWidthOnly) fontNameList = fontEnum.GetFacenames() fontNameList.sort() currFace = self.faceCb.GetValue() self.faceCb.Clear() for colCommonDef in ['']+fontNameList+commonDefs['face']: self.faceCb.Append(colCommonDef) self.faceCb.SetValue(currFace) # Size (XXX add std font sizes) currSize = self.sizeCb.GetValue() self.sizeCb.Clear() for colCommonDef in commonDefs['size']: self.sizeCb.Append(colCommonDef) self.sizeCb.SetValue(currSize) finally: self._blockUpdate = False def populateStyleSelector(self): numStyles = self.styleIdNames.items() numStyles.sort() self.styleNumLookup = {} stdStart = -1 stdOffset = 0 extrOffset = 0 # add styles for num, name in numStyles: if num == stc.STC_STYLE_DEFAULT: self.elementLb.InsertItems([name, '----Language----'], 0) self.elementLb.Append('----Standard----') stdStart = stdPos = self.elementLb.GetCount() else: # std styles if num >= 33 and num < 40: self.elementLb.InsertItems([name], stdStart + stdOffset) stdOffset = stdOffset + 1 # extra styles elif num >= 40: self.elementLb.InsertItems([name], stdStart + extrOffset -1) extrOffset = extrOffset + 1 # normal lang styles else: self.elementLb.Append(name) self.styleNumLookup[name] = num # add settings self.elementLb.Append('----Settings----') settings = settingsIdNames.items() settings.sort();settings.reverse() for num, name in settings: self.elementLb.Append(name) self.styleNumLookup[name] = num # add definitions self.elementLb.Append('----Common----') self.commonDefsStartIdx = self.elementLb.GetCount() for common in self.commonDefs.keys(): tpe = type(self.commonDefs[common]) self.elementLb.Append('%('+common+')'+(tpe is type('') and 's' or 'd')) self.styleNumLookup[common] = num #---Colour methods-------------------------------------------------------------- def getColourDlg(self, colour, title=''): data = wx.ColourData() data.SetColour(colour) data.SetChooseFull(True) dlg = wx.ColourDialog(self, data) try: dlg.SetTitle(title) if dlg.ShowModal() == wx.ID_OK: data = dlg.GetColourData() return data.GetColour() finally: dlg.Destroy() return None colDlgTitles = {'fore': 'Foreground', 'back': 'Background'} def editColProp(self, colBtn, colCb, prop): col = self.getColourDlg(colBtn.GetBackgroundColour(), self.colDlgTitles[prop]+ ' colour') if col: colBtn.SetForegroundColour(wx.Colour(0, 0, 0)) colBtn.SetBackgroundColour(col) colStr = colToStr(col) colCb.SetValue(colStr) self.editProp(True, prop, colStr) def OnFgcolbtnButton(self, event): self.editColProp(self.fgColBtn, self.fgColCb, 'fore') def OnBgcolbtnButton(self, event): self.editColProp(self.bgColBtn, self.bgColCb, 'back') def editColTCProp(self, colCb, colBtn, prop, val=None): if val is None: colStr = colCb.GetValue() else: colStr = val if colStr: col = strToCol(colStr%self.commonDefs) if self.editProp(colStr!='', prop, colStr): if colStr: colBtn.SetForegroundColour(wx.Colour(0, 0, 0)) colBtn.SetBackgroundColour(col) else: colBtn.SetForegroundColour(wx.Colour(255, 255, 255)) colBtn.SetBackgroundColour(\ wx.SystemSettings.GetColour(wx.SYS_COLOUR_BTNFACE)) def OnfgColRet(self, event): try: self.editColTCProp(self.fgColCb, self.fgColBtn, 'fore') except AssertionError: wx.LogError('Not a valid colour value') def OnfgColCombobox(self, event): if self._blockUpdate: return try: self.editColTCProp(self.fgColCb, self.fgColBtn, 'fore', event.GetString()) except AssertionError: wx.LogError('Not a valid colour value') def OnbgColRet(self, event): try: self.editColTCProp(self.bgColCb, self.bgColBtn, 'back') except AssertionError: wx.LogError('Not a valid colour value') def OnbgColCombobox(self, event): if self._blockUpdate: return try: self.editColTCProp(self.bgColCb, self.bgColBtn, 'back', event.GetString()) except AssertionError: wx.LogError('Not a valid colour value') #---Text attribute events------------------------------------------------------- def OnTaeoffilledcbCheckbox(self, event): self.editProp(event.IsChecked(), 'eolfilled') def OnTaitaliccbCheckbox(self, event): self.editProp(event.IsChecked(), 'italic') def OnTaboldcbCheckbox(self, event): self.editProp(event.IsChecked(), 'bold') def OnTaunderlinedcbCheckbox(self, event): self.editProp(event.IsChecked(), 'underline') def OnGotoCommonDef(self, event): val = event.GetEventObject().GetValue() if self.valIsCommonDef(val): idx = self.elementLb.FindString(val) if idx != -1: self.elementLb.SetSelection(idx, True) self.OnElementlbListbox(None) def OnfaceRet(self, event): self.setFace(self.faceCb.GetValue()) def OnfaceCombobox(self, event): if self._blockUpdate: return self.setFace(event.GetString()) def setFace(self, val): try: val%self.commonDefs except KeyError: wx.LogError('Invalid common definition') else: self.editProp(val!='', 'face', val) def OnsizeRet(self, event): self.setSize(self.sizeCb.GetValue()) def OnsizeCombobox(self, event): if self._blockUpdate: return self.setSize(event.GetString()) def setSize(self, val): try: int(val%self.commonDefs) except ValueError: wx.LogError('Not a valid integer size value') except KeyError: wx.LogError('Invalid common definition') else: self.editProp(val!='', 'size', val) #---Main GUI events------------------------------------------------------------- def OnElementlbListbox(self, event): isCommon = self.elementLb.GetSelection() >= self.commonDefsStartIdx self.removeCommonItemBtn.Enable(isCommon) styleIdent = self.elementLb.GetStringSelection() # common definition selected if isCommon: common = styleIdent[2:-2] prop = self.getCommonDefPropType(common) self.clearCtrls(disableDefs=True) if prop == 'fore': self.fgColBtn.Enable(True) self.fgColCb.Enable(True) self.fgColOkBtn.Enable(True) elif prop == 'face': self.faceCb.Enable(True) self.fixedWidthChk.Enable(True) self.faceOkBtn.Enable(True) elif prop == 'size': self.sizeCb.Enable(True) self.sizeOkBtn.Enable(True) commonDefVal = str(self.commonDefs[common]) self.styleDefST.SetLabel(commonDefVal) self.populateProp( [(prop, commonDefVal)], True) self.styleNum = 'common' self.style = [common, prop, commonDefVal] self.names, self.values = [prop], {prop: commonDefVal} # normal style element selected elif len(styleIdent) >=2 and styleIdent[:2] != '--': self.styleNum = self.styleNumLookup[styleIdent] self.style = self.styleDict[self.styleNum] self.names, self.values = parseProp(self.style) if self.styleNum == stc.STC_STYLE_DEFAULT: self.defNames, self.defValues = \ self.names, self.values self.checkBraces(self.styleNum) self.styleDefST.SetLabel(self.style) self.populateCtrls() # separator selected else: self.clearCtrls(disableDefs=True) if styleIdent: self.styleDefST.SetLabel(styleCategoryDescriptions[styleIdent]) self.populateCombosWithCommonDefs() def OnDefaultCheckBox(self, event): if self.chbIdMap.has_key(event.GetId()): ctrl, chb, prop, wid = self.chbIdMap[event.GetId()] restore = not event.IsChecked() if prop in ('fore', 'back'): cbtn, cmb, btn = ctrl cbtn.Enable(restore) cmb.Enable(restore) btn.Enable(restore) if restore: colStr = cmb.GetValue() #if prop == 'fore': colStr = self.fgColCb.GetValue() #else: colStr = self.bgColCb.GetValue() if colStr: self.editProp(True, prop, colStr) else: self.editProp(False, prop) elif prop == 'size': cmb, btn = ctrl val = cmb.GetValue() if val: self.editProp(restore, prop, val) cmb.Enable(restore) btn.Enable(restore) elif prop == 'face': cmb, btn, chk = ctrl val = cmb.GetStringSelection() if val: self.editProp(restore, prop, val) cmb.Enable(restore) btn.Enable(restore) chk.Enable(restore) elif prop in ('bold', 'italic', 'underline', 'eolfilled'): ctrl.Enable(restore) if ctrl.GetValue(): self.editProp(restore, prop) def OnOkbtnButton(self, event): # write styles and common defs to the config wx.BeginBusyCursor() try: writeStylesToConfig(self.config, 'style.%s'%self.lang, self.styles) self.config.SetPath('') self.config.Write(commonDefsFile, `self.commonDefs`) self.config.Flush() for stc in self.STCsToUpdate: setSTCStyles(stc, self.styles, self.styleIdNames, self.commonDefs, self.lang, self.lexer, self.keywords) finally: wx.EndBusyCursor() self.EndModal(wx.ID_OK) def OnCancelbtnButton(self, event): self.EndModal(wx.ID_CANCEL) def OnCommondefsbtnButton(self, event): dlg = wx.TextEntryDialog(self, 'Edit common definitions dictionary', 'Common definitions', pprint.pformat(self.commonDefs), style=wx.TE_MULTILINE | wx.OK | wx.CANCEL | wx.CENTRE) try: if dlg.ShowModal() == wx.ID_OK: print "doing eval" answer = eval(dlg.GetValue(), stc.__dict__) print "answer", answer assert type(answer) is type({}), 'Not a valid dictionary' oldDefs = self.commonDefs self.commonDefs = answer try: self.setStyles() except KeyError, badkey: wx.LogError(str(badkey)+' not defined but required, \n'\ 'reverting to previous common definition') self.commonDefs = oldDefs self.setStyles() self.populateCombosWithCommonDefs() finally: dlg.Destroy() def OnSpeedsettingchChoice(self, event): group = event.GetString() if group: userStyles = 'style.%s'%self.lang if self.currSpeedSetting == userStyles: self.predefStyleGroups[userStyles] = self.styles self.styles = self.predefStyleGroups[group] self.setStyles() self.defNames, self.defValues = parseProp(\ self.styleDict.get(stc.STC_STYLE_DEFAULT, '')) self.OnElementlbListbox(None) self.currSpeedSetting = group def OnFixedwidthchkCheckbox(self, event): self.populateCombosWithCommonDefs(event.Checked()) def OnAddsharebtnButton(self, event): commonPropDefs = {'fore': '#888888', 'size': 8, 'face': wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT).GetFaceName()} dlg = CommonDefDlg(self) try: if dlg.ShowModal() == wx.ID_OK: prop, name = dlg.result if not self.commonDefs.has_key(name): self.commonDefs[name] = commonPropDefs[prop] self.elementLb.Append('%('+name+')'+\ (type(commonPropDefs[prop]) is type('') and 's' or 'd')) self.elementLb.SetSelection(self.elementLb.GetCount()-1, True) self.populateCombosWithCommonDefs() self.OnElementlbListbox(None) finally: dlg.Destroy() def OnRemovesharebtnButton(self, event): ownGroup = 'style.%s'%self.lang comDef = self.elementLb.GetStringSelection() # Search ALL styles before removing srchDct = {ownGroup: self.styles} srchDct.update(self.predefStyleGroups) srchDct.update(self.otherLangStyleGroups) matchList = [] for grpName, styles in srchDct.items(): if self.findInStyles(comDef, styles): matchList.append(grpName) if matchList: wx.LogError('Aborted: '+comDef+' is still used in the styles of the \n'\ 'following groups in the config file (stc-styles.rc.cfg):\n'+ \ '\n'.join(matchList)) else: del self.commonDefs[comDef[2:-2]] self.setStyles() self.populateCombosWithCommonDefs() selIdx = self.elementLb.GetSelection() self.elementLb.Delete(selIdx) if selIdx == self.elementLb.GetCount(): selIdx = selIdx - 1 self.elementLb.SetSelection(selIdx, True) self.OnElementlbListbox(None) #---STC events------------------------------------------------------------------ def OnUpdateUI(self, event): styleBefore = self.stc.GetStyleAt(self.stc.GetCurrentPos()) if self.styleIdNames.has_key(styleBefore): self.elementLb.SetStringSelection(self.styleIdNames[styleBefore], True) else: self.elementLb.SetSelection(0, False) self.styleDefST.SetLabel('Style %d not defined, sorry.'%styleBefore) self.OnElementlbListbox(None) event.Skip() def checkBraces(self, style): if style == stc.STC_STYLE_BRACELIGHT and self.braceInfo.has_key('good'): line, col = self.braceInfo['good'] pos = self.stc.PositionFromLine(line-1) + col braceOpposite = self.stc.BraceMatch(pos) if braceOpposite != -1: self.stc.BraceHighlight(pos, braceOpposite) elif style == stc.STC_STYLE_BRACEBAD and self.braceInfo.has_key('bad'): line, col = self.braceInfo['bad'] pos = self.stc.PositionFromLine(line-1) + col self.stc.BraceBadLight(pos) else: self.stc.BraceBadLight(-1) return def OnStcstyleeditdlgSize(self, event): self.Layout() # Without this refresh, resizing leaves artifacts self.Refresh(1) event.Skip() def OnMarginClick(self, event): self.elementLb.SetStringSelection('Line numbers', True) self.OnElementlbListbox(None) #---Common definition dialog---------------------------------------------------- [wxID_COMMONDEFDLG, wxID_COMMONDEFDLGCANCELBTN, wxID_COMMONDEFDLGCOMDEFNAMETC, wxID_COMMONDEFDLGOKBTN, wxID_COMMONDEFDLGPROPTYPERBX, wxID_COMMONDEFDLGSTATICBOX1] = map(lambda _init_ctrls: wx.NewId(), range(6)) class CommonDefDlg(wx.Dialog): def _init_ctrls(self, prnt): wx.Dialog.__init__(self, id = wxID_COMMONDEFDLG, name = 'CommonDefDlg', parent = prnt, pos = wx.Point(398, 249), size = wx.Size(192, 220), style = wx.DEFAULT_DIALOG_STYLE, title = 'Common definition') self.SetClientSize(wx.Size(184, 200)) self.propTypeRBx = wx.RadioBox(choices = ['Colour value', 'Font face', 'Size value'], id = wxID_COMMONDEFDLGPROPTYPERBX, label = 'Property type', majorDimension = 1, name = 'propTypeRBx', parent = self, point = wx.Point(8, 8), size = wx.Size(168, 92), style = wx.RA_SPECIFY_COLS, validator = wx.DefaultValidator) self.propTypeRBx.SetSelection(self._propTypeIdx) self.staticBox1 = wx.StaticBox(id = wxID_COMMONDEFDLGSTATICBOX1, label = 'Name', name = 'staticBox1', parent = self, pos = wx.Point(8, 108), size = wx.Size(168, 46), style = 0) self.comDefNameTC = wx.TextCtrl(id = wxID_COMMONDEFDLGCOMDEFNAMETC, name = 'comDefNameTC', parent = self, pos = wx.Point(16, 124), size = wx.Size(152, 21), style = 0, value = '') self.comDefNameTC.SetLabel(self._comDefName) self.okBtn = wx.Button(id = wxID_COMMONDEFDLGOKBTN, label = 'OK', name = 'okBtn', parent = self, pos = wx.Point(8, 164), size = wx.Size(80, 23), style = 0) wx.EVT_BUTTON(self.okBtn, wxID_COMMONDEFDLGOKBTN, self.OnOkbtnButton) self.cancelBtn = wx.Button(id = wxID_COMMONDEFDLGCANCELBTN, label = 'Cancel', name = 'cancelBtn', parent = self, pos = wx.Point(96, 164), size = wx.Size(80, 23), style = 0) wx.EVT_BUTTON(self.cancelBtn, wxID_COMMONDEFDLGCANCELBTN, self.OnCancelbtnButton) def __init__(self, parent, name='', propIdx=0): self._comDefName = '' self._comDefName = name self._propTypeIdx = 0 self._propTypeIdx = propIdx self._init_ctrls(parent) self.propMap = {0: 'fore', 1: 'face', 2: 'size'} self.result = ( '', '' ) self.Center(wx.BOTH) def OnOkbtnButton(self, event): self.result = ( self.propMap[self.propTypeRBx.GetSelection()], self.comDefNameTC.GetValue() ) self.EndModal(wx.ID_OK) def OnCancelbtnButton(self, event): self.result = ( '', '' ) self.EndModal(wx.ID_CANCEL) #---Functions useful outside of the editor---------------------------------- def setSelectionColour(stcwindow, style): names, values = parseProp(style) if 'fore' in names: stcwindow.SetSelForeground(True, strToCol(values['fore'])) if 'back' in names: stcwindow.SetSelBackground(True, strToCol(values['back'])) def setCursorColour(stcwindow, style): names, values = parseProp(style) if 'fore' in names: stcwindow.SetCaretForeground(strToCol(values['fore'])) def setEdgeColour(stcwindow, style): names, values = parseProp(style) if 'fore' in names: stcwindow.SetEdgeColour(strToCol(values['fore'])) def strToCol(strCol): assert len(strCol) == 7 and strCol[0] == '#', 'Not a valid colour string: '+strCol return wx.Colour(string.atoi('0x'+strCol[1:3], 16), string.atoi('0x'+strCol[3:5], 16), string.atoi('0x'+strCol[5:7], 16)) def colToStr(col): return '#%s%s%s' % (string.zfill(string.upper(hex(col.Red())[2:]), 2), string.zfill(string.upper(hex(col.Green())[2:]), 2), string.zfill(string.upper(hex(col.Blue())[2:]), 2)) def writeProp(num, style, lang): if num >= 0: return 'style.%s.%s='%(lang, string.zfill(`num`, 3)) + style else: return 'setting.%s.%d='%(lang, num) + style def writePropVal(names, values): res = [] for name in names: if name: res.append(values[name] and name+':'+values[name] or name) return ','.join(res) def parseProp(prop): items = prop.split(',') names = [] values = {} for item in items: nameVal = item.split(':') names.append(nameVal[0].strip()) if len(nameVal) == 1: values[nameVal[0]] = '' else: values[nameVal[0]] = nameVal[1].strip() return names, values def parsePropLine(prop): name, value = prop.split('=') return int(name.split('.')[-1]), value def setSTCStyles(stcwindow, styles, styleIdNames, commonDefs, lang, lexer, keywords): #wx.LogMessage('Set style') styleDict = {} styleNumIdxMap = {} # build style dict based on given styles for numStyle in styles: num, style = parsePropLine(numStyle) styleDict[num] = style # Add blank style entries for undefined styles newStyles = [] styleItems = styleIdNames.items() + settingsIdNames.items() styleItems.sort() idx = 0 for num, name in styleItems: styleNumIdxMap[num] = idx if not styleDict.has_key(num): styleDict[num] = '' newStyles.append(writeProp(num, styleDict[num], lang)) idx = idx + 1 # Set background colour to reduce flashing effect on refresh or page switch bkCol = None if styleDict.has_key(0): prop = styleDict[0] else: prop = styleDict[stc.STC_STYLE_DEFAULT] names, vals = parseProp(prop) if 'back' in names: bkCol = strToCol(vals['back']%commonDefs) if bkCol is None: bkCol = wx.WHITE stcwindow.SetBackgroundColour(bkCol) # Set the styles on the wx.STC stcwindow.StyleResetDefault() stcwindow.ClearDocumentStyle() stcwindow.SetLexer(lexer) stcwindow.SetKeyWords(0, keywords) stcwindow.StyleSetSpec(stc.STC_STYLE_DEFAULT, styleDict[stc.STC_STYLE_DEFAULT] % commonDefs) stcwindow.StyleClearAll() for num, style in styleDict.items(): if num >= 0: stcwindow.StyleSetSpec(num, style % commonDefs) elif num == -1: setSelectionColour(stcwindow, style % commonDefs) elif num == -2: setCursorColour(stcwindow, style % commonDefs) elif num == -3: setEdgeColour(stcwindow, style % commonDefs) stcwindow.Colourise(0, stcwindow.GetTextLength()) return newStyles, styleDict, styleNumIdxMap #---Config reading and writing ------------------------------------------------- commonDefsFile = 'common.defs.%s'%(platformSettings[wx.Platform][0]) def readPyValFromConfig(conf, name): return eval(conf.Read(name).replace('\r\n', '\n') + '\n', stc.__dict__) def initFromConfig(configFile, lang): if not os.path.exists(configFile): raise Exception, 'Config file %s not found'%configFile cfg = wx.FileConfig(localFilename=configFile, style=wx.CONFIG_USE_LOCAL_FILE) cfg.SetExpandEnvVars(False) # read in all group names for this language groupPrefix = 'style.%s'%lang gpLen = len(groupPrefix) predefStyleGroupNames, otherLangStyleGroupNames = [], [] cont, val, idx = cfg.GetFirstGroup() while cont: if val != groupPrefix and len(val) >= 5 and val[:5] == 'style': if len(val) > gpLen and val[:gpLen] == groupPrefix: predefStyleGroupNames.append(val) else: otherLangStyleGroupNames.append(val) cont, val, idx = cfg.GetNextGroup(idx) # read in common elements commonDefs = readPyValFromConfig(cfg, commonDefsFile) assert type(commonDefs) is type({}), \ 'Common definitions (%s) not a valid dict'%commonDefsFile commonStyleIdNames = readPyValFromConfig(cfg, 'common.styleidnames') assert type(commonStyleIdNames) is type({}), \ 'Common definitions (%s) not a valid dict'%'common.styleidnames' # Lang spesific settings cfg.SetPath(lang) styleIdNames = readPyValFromConfig(cfg, 'styleidnames') assert type(commonStyleIdNames) is type({}), \ 'Not a valid dict [%s] styleidnames)'%lang styleIdNames.update(commonStyleIdNames) braceInfo = readPyValFromConfig(cfg, 'braces') assert type(commonStyleIdNames) is type({}), \ 'Not a valid dict [%s] braces)'%lang displaySrc = cfg.Read('displaysrc') lexer = readPyValFromConfig(cfg, 'lexer') keywords = cfg.Read('keywords') cfg.SetPath('') # read in current styles styles = readStylesFromConfig(cfg, groupPrefix) # read in predefined styles predefStyleGroups = {} for group in predefStyleGroupNames: predefStyleGroups[group] = readStylesFromConfig(cfg, group) # read in all other style sections otherLangStyleGroups = {} for group in otherLangStyleGroupNames: otherLangStyleGroups[group] = readStylesFromConfig(cfg, group) return (cfg, commonDefs, styleIdNames, styles, predefStyleGroupNames, predefStyleGroups, otherLangStyleGroupNames, otherLangStyleGroups, displaySrc, lexer, keywords, braceInfo) def readStylesFromConfig(config, group): config.SetPath('') config.SetPath(group) styles = [] cont, val, idx = config.GetFirstEntry() while cont: styles.append(val+'='+config.Read(val)) cont, val, idx = config.GetNextEntry(idx) config.SetPath('') return styles def writeStylesToConfig(config, group, styles): config.SetPath('') config.DeleteGroup(group) config.SetPath(group) for style in styles: name, value = style.split('=') config.Write(name, value.strip()) config.SetPath('') #------------------------------------------------------------------------------- def initSTC(stcwindow, config, lang): """ Main module entry point. Initialise a wxSTC from given config file.""" (cfg, commonDefs, styleIdNames, styles, predefStyleGroupNames, predefStyleGroups, otherLangStyleGroupNames, otherLangStyleGroups, displaySrc, lexer, keywords, braceInfo) = initFromConfig(config, lang) setSTCStyles(stcwindow, styles, styleIdNames, commonDefs, lang, lexer, keywords) #------------------------------------------------------------------------------- if __name__ == '__main__': STC_CONFIG_FILE = 'stc-styles.cfg' app = wx.PySimpleApp() provider = wx.SimpleHelpProvider() wx.HelpProvider_Set(provider) home = os.environ.get('HOME') if home: home = os.path.join(home, 'pythoncard_config') if not os.path.exists(home): home = '.' else: home = '.' config = os.path.abspath(os.path.join(home, STC_CONFIG_FILE)) if 0: f = wx.Frame(None, -1, 'Test frame (double click for editor)') stcwindow = stc.StyledTextCtrl(f, -1) def OnDblClick(evt, stc=stc): dlg = STCStyleEditDlg(None, 'Python', 'python', config, (stcwindow,)) try: dlg.ShowModal() finally: dlg.Destroy() stcwindow.SetText(open('STCStyleEditor.py').read()) wx.EVT_LEFT_DCLICK(stc, OnDblClick) initSTC(stcwindow, config, 'python') f.Show(True) app.MainLoop() else: dlg = STCStyleEditDlg(None, 'Python', 'python', #'HTML', 'html', #'XML', 'xml', #'C++', 'cpp', #'Text', 'text', #'Properties', 'prop', config) try: dlg.ShowModal() finally: dlg.Destroy() PythonCard-0.8.2/templates/0000755000076500007650000000000010434046770015515 5ustar alexalex00000000000000PythonCard-0.8.2/templates/__init__.py0000644000076500007650000000000010047560076017614 0ustar alexalex00000000000000PythonCard-0.8.2/templates/dialogs/0000755000076500007650000000000010434046770017137 5ustar alexalex00000000000000PythonCard-0.8.2/templates/dialogs/__init__.py0000644000076500007650000000000010041762760021234 0ustar alexalex00000000000000PythonCard-0.8.2/templates/dialogs/findDialog.py0000644000076500007650000000361110106740447021550 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.2 $" __date__ = "$Date: 2004/08/12 19:12:39 $" """ from PythonCard import dialog, model class FindDialog(model.CustomDialog): def __init__(self, aBg, searchText='', wholeWordsOnly=0, caseSensitive=0, searchField=None, searchableFields=None): model.CustomDialog.__init__(self, aBg) self.parent = aBg # if some special setup is necessary, do it here self.components.fldFind.text = searchText self.components.chkMatchWholeWordOnly.checked = wholeWordsOnly self.components.chkMatchCase.checked = caseSensitive if searchableFields is None: self.components.popSearchField.visible = False else: searchableFields.insert(0, 'All') self.components.popSearchField.items = searchableFields if searchField is None: self.components.popSearchField.stringSelection = 'All' else: self.components.popSearchField.stringSelection = searchField self.components.fldFind.setSelection(0, len(self.components.fldFind.text)) #self.components.fldFind.SetMark(-1, -1) self.components.fldFind.setFocus() def findDialog(parent, searchText='', wholeWordsOnly=0, caseSensitive=0, searchField=None, searchableFields=None): dlg = FindDialog(parent, searchText, wholeWordsOnly, caseSensitive, searchField, searchableFields) result = dlg.showModal() result.searchText= dlg.components.fldFind.text result.wholeWordsOnly = dlg.components.chkMatchWholeWordOnly.checked result.caseSensitive = dlg.components.chkMatchCase.checked sel = dlg.components.popSearchField.stringSelection if searchableFields is None or sel == 'All': result.searchField = None else: result.searchField = sel dlg.destroy() return result PythonCard-0.8.2/templates/dialogs/findDialog.rsrc.py0000644000076500007650000000211610110217313022501 0ustar alexalex00000000000000{'type':'CustomDialog', 'name':'dlgFind', 'title':'Find dialog', 'size':(380, 130), 'components': [ {'type':'StaticText', 'name':'stcFindWhat', 'position':(7, 10), 'text':'Find What:', }, {'type':'TextField', 'name':'fldFind', 'position':(80, 7), 'size':(195, -1), }, {'type':'Button', 'id':5100, 'name':'btnFindNext', 'position':(285, 5), 'default':1, 'label':'Find Next', }, {'type':'Button', 'id':5101, 'name':'btnCancel', 'position':(285, 35), 'label':'Cancel', }, {'type':'CheckBox', 'name':'chkMatchWholeWordOnly', 'position':(7, 35), 'label':'Match whole word only', }, {'type':'CheckBox', 'name':'chkMatchCase', 'position':(7, 55), 'label':'Match case', }, {'type':'Choice', 'name':'popSearchField', 'position':(102, 80), 'size':(162, 21), 'items':[], }, {'type':'StaticText', 'name':'stcSearchField', 'position':(7, 80), 'text':'Search Field:', }, ] # end components } # end CustomDialog PythonCard-0.8.2/templates/dialogs/loginDialog.py0000644000076500007650000000167210106740447021745 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.2 $" __date__ = "$Date: 2004/08/12 19:12:39 $" """ from PythonCard import model class LoginDialog(model.CustomDialog): def __init__(self, parent, host="127.0.0.1", port=80, username="guest", password="guest"): model.CustomDialog.__init__(self, parent) self.components.fldHost.text = host self.components.fldPort.text = str(port) self.components.fldUsername.text = username self.components.fldPassword.text = password #def myDialog(parent, txt): def loginDialog(parent, host="127.0.0.1", port=80, username="guest", password="guest"): dlg = LoginDialog(parent, host, port, username, password) result = dlg.showModal() result.host = dlg.components.fldHost.text result.port = int(dlg.components.fldPort.text) result.username = dlg.components.fldUsername.text result.password = dlg.components.fldPassword.text dlg.destroy() return result PythonCard-0.8.2/templates/dialogs/loginDialog.rsrc.py0000644000076500007650000000252410043563714022712 0ustar alexalex00000000000000{'type':'CustomDialog', 'name':'Template', 'title':'Dialog Template', 'position':(5, 5), 'size':(300, 197), 'components': [ {'type':'TextField', 'name':'fldHost', 'position':(95, 10), 'alignment':'left', 'text':'127.0.0.1', }, {'type':'TextField', 'name':'fldPort', 'position':(95, 33), 'size':(48, -1), 'alignment':'left', 'text':'80', }, {'type':'TextField', 'name':'fldUsername', 'position':(95, 57), 'alignment':'left', 'text':'guest', }, {'type':'TextField', 'name':'fldPassword', 'position':(95, 81), 'alignment':'left', 'text':'guest', }, {'type':'StaticText', 'name':'stcHost', 'position':(10, 10), 'text':'Host:', }, {'type':'StaticText', 'name':'stcPort', 'position':(12, 34), 'text':'Port:', }, {'type':'StaticText', 'name':'stcPassword', 'position':(13, 86), 'text':'Password:', }, {'type':'StaticText', 'name':'stcUsername', 'position':(11, 61), 'text':'Username:', }, {'type':'Button', 'id':5100, 'name':'btnOK', 'position':(9, 119), 'label':'OK', }, {'type':'Button', 'id':5101, 'name':'btnCancel', 'position':(101, 119), 'label':'Cancel', }, ] # end components } # end CustomDialog PythonCard-0.8.2/templates/dialogs/runOptionsDialog.py0000644000076500007650000000545210106740447023015 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.1 $" __date__ = "$Date: 2004/08/12 19:12:39 $" """ from PythonCard import model import os import wx class RunOptionsDialog(model.CustomDialog): def __init__(self, aBg, cmdLineArgs): model.CustomDialog.__init__(self, aBg) self.parent = aBg self.components.chkDebugMenu.checked = cmdLineArgs['debugmenu'] self.components.chkLogging.checked = cmdLineArgs['logging'] self.components.chkMessageWatcher.checked = cmdLineArgs['messagewatcher'] self.components.chkNamespaceViewer.checked = cmdLineArgs['namespaceviewer'] self.components.chkPropertyEditor.checked = cmdLineArgs['propertyeditor'] self.components.chkShell.checked = cmdLineArgs['shell'] self.components.fldOtherArgs.text = cmdLineArgs['otherargs'] self.initSizers() def initSizers(self): sizer1 = wx.BoxSizer(wx.VERTICAL) sizer2 = wx.BoxSizer(wx.VERTICAL) sizer3 = wx.BoxSizer(wx.HORIZONTAL) sizer4 = wx.BoxSizer(wx.HORIZONTAL) comp = self.components btnFlags = wx.LEFT | wx.ALIGN_BOTTOM vertFlags = wx.LEFT | wx.TOP | wx.ALIGN_LEFT fldFlags = wx.LEFT | wx.TOP | wx.ALIGN_CENTER sizer4.Add(comp.stcOtherArgs, 0, fldFlags, 5) sizer4.Add(comp.fldOtherArgs, 1, fldFlags, 5) sizer3.Add(comp.btnOK, 0, btnFlags, 5) sizer3.Add(comp.btnCancel, 0, btnFlags, 5) sizer2.Add(comp.stcCmdLineArgs, 0, wx.LEFT | wx.BOTTOM | wx.ALIGN_TOP, 5) sizer2.Add(comp.chkDebugMenu, 0, vertFlags, 5) sizer2.Add(comp.chkLogging, 0, vertFlags, 5) sizer2.Add(comp.chkMessageWatcher, 0, vertFlags, 5) sizer2.Add(comp.chkNamespaceViewer, 0, vertFlags, 5) sizer2.Add(comp.chkPropertyEditor, 0, vertFlags, 5) sizer2.Add(comp.chkShell, 0, vertFlags, 5) sizer2.Add(sizer4, 0, vertFlags) sizer2.Add((5, 5), 1) # spacer sizer2.Add(sizer3, 1, wx.ALIGN_BOTTOM) sizer1.Add(sizer2, 0, vertFlags) sizer1.Fit(self) sizer1.SetSizeHints(self) self.panel.SetSizer(sizer1) self.panel.SetAutoLayout(1) self.panel.Layout() def runOptionsDialog(parent, cmdLineArgs): dlg = RunOptionsDialog(parent, cmdLineArgs) result = dlg.showModal() if result.accepted: result.debugmenu = dlg.components.chkDebugMenu.checked result.logging = dlg.components.chkLogging.checked result.messagewatcher= dlg.components.chkMessageWatcher.checked result.namespaceviewer = dlg.components.chkNamespaceViewer.checked result.propertyeditor = dlg.components.chkPropertyEditor.checked result.shell = dlg.components.chkShell.checked result.otherargs = dlg.components.fldOtherArgs.text dlg.destroy() return result PythonCard-0.8.2/templates/dialogs/runOptionsDialog.rsrc.py0000644000076500007650000000261610106740447023764 0ustar alexalex00000000000000{'type':'CustomDialog', 'name':'runOptions', 'title':'Run Options', 'size':(200, 220), 'components': [ {'type':'StaticText', 'name':'stcCmdLineArgs', 'position':(10, 5), 'text':'Command line options:', }, {'type':'CheckBox', 'name':'chkDebugMenu', 'position':(10, 25), 'label':'Debug Menu (-d)', }, {'type':'CheckBox', 'name':'chkLogging', 'position':(10, 25), 'label':'Logging (-l)', }, {'type':'CheckBox', 'name':'chkMessageWatcher', 'position':(10, 50), 'label':'Message Watcher (-m)', }, {'type':'CheckBox', 'name':'chkNamespaceViewer', 'position':(10, 75), 'label':'Namespace Viewer (-n)', }, {'type':'CheckBox', 'name':'chkPropertyEditor', 'position':(10, 100), 'label':'Property Editor (-p)', }, {'type':'CheckBox', 'name':'chkShell', 'position':(10, 120), 'label':'Shell (-s)', }, {'type':'StaticText', 'name':'stcOtherArgs', 'text':'Other args:', }, {'type':'TextField', 'name':'fldOtherArgs', 'size':(200, -1), 'text':'', }, {'type':'Button', 'name':'btnOK', 'position':(8, 152), 'default':1, 'id':5100, 'label':'OK', }, {'type':'Button', 'name':'btnCancel', 'position':(105, 152), 'id':5101, 'label':'Cancel', }, ] # end components } PythonCard-0.8.2/templates/htmlpreview.py0000644000076500007650000000135710101224467020433 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.1 $" __date__ = "$Date: 2004/07/26 15:54:31 $" """ from PythonCard import model import wx import sys class HtmlPreview(model.Background): def on_initialize(self, event): if sys.platform.startswith('win'): size = self.components.html.size del self.components['html'] self.components['html'] = {'type':'IEHtmlWindow', 'name':'html', 'position':(0, 0), 'size':size, 'visible':True} else: self.components.html.SetRelatedFrame(self, "HTML Preview: %s") self.components.html.SetRelatedStatusBar(0) self.singleItemExpandingSizerLayout() def on_close(self, event): self.visible = False PythonCard-0.8.2/templates/htmlpreview.rsrc.py0000644000076500007650000000060010101224467021371 0ustar alexalex00000000000000 { 'application':{ 'type':'Application', 'name':'HtmlPreview', 'backgrounds': [ { 'type':'Background', 'name':'bgMin', 'title':'HTML Preview', #'size':(800, 600), 'statusBar':1, 'style':['resizeable'], 'components': [ { 'type':'HtmlWindow', 'name':'html', 'size':(400, 200), 'text':'' }, ] } ] } } PythonCard-0.8.2/testIgnore.py0000644000076500007650000000023610054721273016211 0ustar alexalex00000000000000# ignore is a regular expression that will match the filenames # for the modules to exclude. ignore = '(pycrustrc)|(install-pythoncard)|(setup)|(fixdc)\.py$' PythonCard-0.8.2/tests/0000755000076500007650000000000010434046772014663 5ustar alexalex00000000000000PythonCard-0.8.2/tests/__init__.py0000644000076500007650000000000010053523531016750 0ustar alexalex00000000000000PythonCard-0.8.2/tests/EventTest.py0000644000076500007650000000076010037603552017153 0ustar alexalex00000000000000from PythonCard import event, log import unittest class Dummy : def visitIdleEvent( self, aParam ) : log.debug( 'visitIdleEvent(): ', aParam ) class TestEvents( unittest.TestCase ) : def setUp( self ) : pass def testEvent( self ) : #self.assert_(element in self.seq) dummy = Dummy() evt = event.IdleEvent( dummy ) print evt evt.accept( dummy, 'this is a parameter' ) if __name__ == '__main__': unittest.main() PythonCard-0.8.2/tests/minimalTest.py0000644000076500007650000000071110053523531017510 0ustar alexalex00000000000000from PythonCard import model, test import addresses import time if __name__ == '__main__': runtime = test.Runtime( '../addresses/addresses.py', addresses.Addresses ) app = runtime.getApplication() user = test.User( app.getWindows()[ 0 ] ) time.sleep( 1 ) user.click( 'Next' ) user.type( 'Name', 'dude' ) time.sleep( 1 ) user.click( 'Next' ) #assert( w.getComponent( 'field1' ).GetValue() == 'this is some text' ) PythonCard-0.8.2/tests/pyunit.py0000644000076500007650000000750110053523531016556 0ustar alexalex00000000000000""" This is a simple uability extension for unittest. It only exports a subset of the names in that module, making it simpler to see which ones matter. Futhermore, it extracts the boilerplate involved in the most common method of unit testing, so that a test declaration module needs only one import and one statement besides the definitions for the tests. Any test module that uses pyunit will actually support two methods of running tests. The first is to simply run it as a script. If you do, it will run all of its tests and return. The second method is to load it and call its suite() method, which will then return a pyunit.TestSuite. Test suites can be composed, and then run in a batch. This makes it easy to run all of your tests in a batch as long as they all pass, then to drill down by just running the script for any test which is failing. The most important symbols exported from the pyunit module are: classes: TestCase TestSuite TextTestRunner TestRunner functions: exportAllTests() runTests(TestSuite, [TestRunner]) To show how they are used, I have included a sample declaration of a test suite, and a sample script for running a test suite. Declaring tests: import pyunit class CallTests(pyunit.TestCase): def testEmpty(self): pass class MoreTests(pyunit.TestCase): def testEmpty(self): pass def testFailing(self): assert 1 == 2 pyunit.exportAllTests() That's it. Now for running tests in a few modules that you know the name of: import MyTests, MyOtherTests, pyunit suite = pyunit.TestSuite((MyTests.suite(), MyOtherTests.suite()) pyunit.runTests(suite) # or, to use a special test runner import FancyRunners pyunit.runTests(suite, FancyRunners.XMLRunner()) Again, pretty simple. All of the work comes in finding the modules that you want to run tests from. You may want to look at the script runAllTests.py for an example: it runs all tests defined in modules of a certain name, in any subdirectory of the directory in which it is run. """ import unittest from unittest import TestCase, TestSuite, TextTestRunner def makeUsualSuite(obj): return unittest.makeSuite(obj, 'test') def suite(dictToExportFrom): import types tests = [] for name in dictToExportFrom: obj = dictToExportFrom[name] if(isinstance(obj, (type, types.ClassType)) and issubclass(obj, unittest.TestCase)): tests.append(obj) return unittest.TestSuite(map(makeUsualSuite,tests)) def callersGlobals(): """ returns the globals dictionary active from the caller of the function that calls this one. """ import sys try: raise Exception("dummy") except Exception: return sys.exc_info()[2].tb_frame.f_back.f_back.f_globals def exportAllTests(): """ This function must be called from some other module. This function will do one of two things, depending on whether the calling module is the __main__ one or not. If the calling module is __main__, then it causes that module to immediately run any unit tests that it has declared. For this reason, it should always be called at top-level scope, as the last line in the file. If the caller is not __main__, then exportAllTests() causes that module to define a suite() function which exports all of its tests. It does this by mucking with the calling module's dictionaries. If you call this function from a module that already declares a function named suite, the old definition will be overwritten. This is defined to maximally reduce the number of lines of boilerplate that must be written in each testing file, not to honor encapsulation. You have been warned. """ callingGlobals = callersGlobals() if(callingGlobals['__name__'] == '__main__'): runTests(suite(callingGlobals)) else: callingGlobals['suite'] = lambda: suite(callingGlobals) def runTests(testSuite, testRunner=unittest.TextTestRunner()): testRunner.run(testSuite) PythonCard-0.8.2/tests/runAllTests.py0000644000076500007650000000652510054721274017520 0ustar alexalex00000000000000""" This is a simple script to run all unit tests in a directory and its subdirectories. It simply searches for all modules ending in "Test", imports them all, calls suite() on each one, composes all of those suites, and runs the resultant suite. The easiest way to define a suite function in each of your test modules is to use the pyunit module. Simply call pyunit.exportAllTests() after you have declared all of your tests, and it will define a suite() function that will work. This script can run with any test runner. Simply pass the module and classname on the command line. It defaults to using pyunit.TextTestRunner. """ import os import sys import types import re import pyunit def loadTheSuite(modName): try: mod = __import__(modName, globals(), locals(), []) except: print "Failed to import module %s while trying to locate tests." % modName return None attrs = mod.__dict__.values() attrs = filter( lambda obj: isinstance(obj, (type, types.ClassType)) and issubclass(obj, pyunit.unittest.TestCase), attrs) return pyunit.unittest.TestSuite(map(pyunit.makeUsualSuite, attrs)) def getIgnorePattern(): try: oldpath = sys.path sys.path = [os.getcwd()] if sys.modules.get('testIgnore', None): del sys.modules['testIgnore'] import testIgnore sys.path = oldpath print 'Ignoring some files in %s, with pattern %s' \ % (os.getcwd(), testIgnore.ignore) return testIgnore.ignore except Exception, e: return '^$' def locateAllTestSuites(): sys.path.append(".") testSuites = [] for root, dirs, files in os.walk('.'): walkPos = os.getcwd() os.chdir(root) ignoredFiles = getIgnorePattern() testSuites.extend( map( lambda fileName: loadTheSuite(os.path.splitext(fileName)[0]), filter( ## lambda x: re.match("[^.]*\.py$", x) lambda x: (not x.endswith('.rsrc.py') and x.endswith('.py') or x.endswith('.pyw')) and not re.match(ignoredFiles, x), ## and x!= 'setup.py', files))) os.chdir(walkPos) if 'CVS' in dirs: dirs.remove('CVS') # don't visit CVS directories testSuites = filter( lambda x: x != None, testSuites) return pyunit.TestSuite(testSuites) def printUsage(): print """ This script locates and runs all tests in test modules in the current directory or any of its subdirectories. A test module is defined as any module which is named *.py, and includes a function named suite(). Usage: python runAllTests.py - or - python runAllTests.py TestRunnerModule TestRunnerClassName The first usage will result in all tests being run via the TextTestRunner. The second usage allows you to specify which test runner should be used to collect and output the results of the test. Any test runner may be used, as long as it meets the requirements of the unittest module, and can be found on the python include path. """ def selectTestRunner(argv): if(1 == len(argv)): return pyunit.TextTestRunner() else: if(3 == len(argv)): mod = __import__(argv[1], globals(), locals(), []) return getattr(mod, argv[2])() else: printUsage() raise IndexError("Please correct the script arguments to match above usage guidelines.") def run(argv=[""]): pyunit.runTests( locateAllTestSuites(), selectTestRunner(argv)) if(__name__ == "__main__"): run(sys.argv) PythonCard-0.8.2/tests/runTimeTest.py0000644000076500007650000000352610054721274017521 0ustar alexalex00000000000000""" __version__ = "$Revision: 1.1 $" __date__ = "$Date: 2004/05/25 19:47:08 $" """ import sys from PythonCard import model import threading import wx class Runtime( threading.Thread ) : def __init__( self, path, clazz ) : threading.Thread.__init__( self ) sys.argv = [ path ] self._clazz = clazz self._running = False self.start() def run( self ) : self._app = model.Application( self._clazz ) self._running = True self._app.MainLoop() def getApplication( self ) : while not self._running : pass return self._app class User( object ) : def __init__( self, window ) : """ Create a test proxy to a PythonCard window. """ self._window = window def click( self, path ) : """ Generate a mouse down event for the button identified by 'path'. Path example: myPanel.myButton """ button = self._window.getComponent( path ) event = wx.CommandEvent( wx.wxEVT_COMMAND_BUTTON_CLICKED, button.GetId() ) wx.PostEvent( button, event ) def type( self, path, text ) : """ Type the 'text', character by character, into the TextField or TextArea identified by 'path' Path example: myPanel.myField """ field = self._window.getComponent( path ) field.SetValue( text ) #event = wx.CommandEvent( wx.wxEVT_COMMAND_TEXT_ENTER, field.GetId() ) #wx.PostEvent( field, event ) def select( self, path, value ) : """ Set the selected value of the component identified by path to 'value'. This method can be used for popop menus, and single selection lists. Path example: myPanel.myMenu """ pass PythonCard-0.8.2/tests/ScriptableTest.py0000644000076500007650000000312610045270631020156 0ustar alexalex00000000000000from PythonCard import event, log, component import unittest class TestHandler( component.Scriptable ) : def __init__( self, name, parent ) : component.Scriptable.__init__( self, parent ) self._name = name def on_doIt( self, event ) : global handledIn handledIn = self._name def getName( self ) : return self._name class HandlerWithMissingMethod( component.Scriptable ) : def __init__( self, name, parent ) : component.Scriptable.__init__( self, parent ) self._name = name def getName( self ) : return self._name class TestScriptable( unittest.TestCase, event.EventListener ) : def __init__( self, name ) : unittest.TestCase.__init__( self, name ) event.EventLog.getInstance().addEventListener( self ) def eventOccurred( self, event ) : print 'event=', event def setUp( self ) : pass def testScriptable( self ) : global handledIn parent = TestHandler( 'parent', None ) parent.execute( 'on_doIt', ( 'howdy parent' ) ) self.assertEqual( handledIn, 'parent' ) child = TestHandler( 'child', parent ) child.execute( 'on_doIt', ( 'howdy child' ) ) self.assertEqual( handledIn, 'child' ) missing = HandlerWithMissingMethod( 'missing', parent ) missing.execute( 'on_doIt', ( 'howdy missing(parent)' ) ) self.assertEqual( handledIn, 'parent' ) missing.execute( 'on_wtf', ( 'no dice' ) ) if __name__ == '__main__': unittest.main() PythonCard-0.8.2/tests/UnitTestSample.py0000644000076500007650000000022310053523531020141 0ustar alexalex00000000000000import pyunit class ClassTests(pyunit.TestCase): def setUp(self): pass def tearDown(self): pass def testSomething(self): pass PythonCard-0.8.2/timer.py0000644000076500007650000000064010037112536015202 0ustar alexalex00000000000000""" __version__ = "$Revision: 1.1 $" __date__ = "$Date: 2004/04/14 01:35:26 $" """ import wx class Timer(wx.Timer): """ Simple wrapper of wxTimer so that all apps using timers can use mixedCase style methods and avoid importing wx. """ getInterval = wx.Timer.GetInterval isOneShot = wx.Timer.IsOneShot isRunning = wx.Timer.IsRunning start = wx.Timer.Start stop = wx.Timer.Stop PythonCard-0.8.2/tools/0000755000076500007650000000000010434046770014657 5ustar alexalex00000000000000PythonCard-0.8.2/tools/codeEditor/0000755000076500007650000000000010434046772016742 5ustar alexalex00000000000000PythonCard-0.8.2/tools/codeEditor/codeEditor.py0000644000076500007650000013707610351637654021416 0ustar alexalex00000000000000#!/usr/bin/env python """ __version__ = "$Revision: 1.126 $" __date__ = "$Date: 2005/12/19 23:18:04 $" PythonCard Editor (codeEditor) wiki page http://wiki.wxpython.org/index.cgi/PythonCardEditor wxStyledTextCtrl documentation http://wiki.wxpython.org/index.cgi/wxStyledTextCtrl """ from PythonCard import about, configuration, dialog, log, menu, model, resource, util from PythonCard.templates.dialogs import runOptionsDialog from modules import scriptutils import os, sys import wx from wx import stc from wx.html import HtmlEasyPrinting import pprint from PythonCard import STCStyleEditor from modules import colorizer import cStringIO import webbrowser # KEA 2004-07-22 # force imports for components used in .rsrc.py file # so we can do a make standalones with py2exe and bundlebuilder from PythonCard.components import codeeditor USERCONFIG = 'user.config.txt' # KEA 2002-05-03 # this could be more sophisticated # by using an external source code colorizer # or Scintillas over lexical analyzer?! def textToHtml(source): """Return text converted to HTML.""" # KEA 2003-08-07 # how should we deal with Unicode? source = source.encode('iso-8859-1') output = cStringIO.StringIO() colorizer.Parser(source, output).format(None, None) html = output.getvalue() return html # KEA doc handling adapted from python_docs # method in IDLE EditorWindow.py pythoncard_url = util.documentationURL("documentation.html") shell_url = util.documentationURL("shell.html") help_url = "http://docs.python.org/" if sys.platform.startswith("win"): fn = os.path.dirname(os.__file__) fn = os.path.join(fn, os.pardir, "Doc", "index.html") fn = os.path.normpath(fn) if os.path.isfile(fn): help_url = fn del fn elif sys.platform == 'darwin': fn = '/Library/Frameworks/Python.framework/Versions/' + \ 'Current/Resources/Python.app/Contents/Resources/English.lproj/' + \ 'PythonDocumentation/index.html' if os.path.exists(fn): help_url = "file://" + fn class CodeEditor(model.Background): def on_initialize(self, event): self.initSizers() self.setDefaultStyles() # KEA 2002-05-08 # wxFileHistory isn't wrapped, so use raw wxPython # the file history is not actually saved when you quit # or shared between windows right now # also the file list gets appended to the File menu # rather than going in front of the Exit menu # I suspect I have to add the Exit menu after the file history # which means changing how the menus in resources are loaded # so I'll do that later self.fileHistory = wx.FileHistory() fileMenu = self.GetMenuBar().GetMenu(0) self.fileHistory.UseMenu(fileMenu) wx.EVT_MENU_RANGE(self, wx.ID_FILE1, wx.ID_FILE9, self.OnFileHistory) self.lastStatus = None self.lastPos = None #self.configPath = os.path.abspath(os.curdir) self.configPath = os.path.join(configuration.homedir, 'codeeditor') self.loadConfig() self.cmdLineArgs = {'debugmenu':False, 'logging':False, 'messagewatcher':False, 'namespaceviewer':False, 'propertyeditor':False, 'shell':False, 'otherargs':''} self.lastFind = {'searchText':'', 'replaceText':'', 'wholeWordsOnly':False, 'caseSensitive':False} self.startTitle = self.title if len(sys.argv) > 1: # accept a file argument on the command-line filename = os.path.abspath(sys.argv[1]) log.info('codeEditor filename: ' + filename) if not os.path.exists(filename): filename = os.path.abspath(os.path.join(self.application.startingDirectory, sys.argv[1])) #print filename if os.path.isfile(filename): self.openFile(filename) # the second argument can be a line number to jump to # this is experimental, but a nice feature # KEA 2002-05-01 # gotoLine causes the Mac to segfault if (len(sys.argv) > 2): try: line = int(sys.argv[2]) self.gotoLine(line) except: pass else: self.newFile() else: self.newFile() self.printer = HtmlEasyPrinting() # KEA 2002-05-08 # wxSTC defaults will eventually be settable via a dialog # and saved in a user config, perhaps compatible with IDLE # or Pythonwin self.components.document.SetEdgeColumn(75) # KEA 2002-05-08 # the wxFindReplaceDialog is not wrapped # so this is an experiment to see how it works wx.EVT_COMMAND_FIND(self, -1, self.OnFind) wx.EVT_COMMAND_FIND_NEXT(self, -1, self.OnFind) wx.EVT_COMMAND_FIND_REPLACE(self, -1, self.OnFind) wx.EVT_COMMAND_FIND_REPLACE_ALL(self, -1, self.OnFind) wx.EVT_COMMAND_FIND_CLOSE(self, -1, self.OnFindClose) self.visible = True self.loadShell() def initSizers(self): sizer1 = wx.BoxSizer(wx.VERTICAL) sizer1.Add(self.components.document, 1, wx.EXPAND) sizer1.Fit(self) sizer1.SetSizeHints(self) self.panel.SetSizer(sizer1) self.panel.SetAutoLayout(1) self.panel.Layout() def on_idle(self, event): self.updateTitleBar() self.updateStatusBar() def updateStatusBar(self): if self.documentPath: path = self.documentPath else: path = self.resource.strings.untitled pos = self.components.document.GetCurrentPos() newText = "File: %s | Line: %d | Column: %d" % \ (path, self.components.document.LineFromPosition(pos) + 1, self.components.document.GetColumn(pos) + 1) if self.lastPos != pos and self.lastStatus != newText: self.statusBar.text = newText self.lastStatus = newText self.lastPos = pos def updateTitleBar(self): title = self.title modified = self.components.document.GetModify() if modified and title[0] != '*': self.title = '* ' + title + ' *' elif not modified and title[0] == '*': self.title = title[2:-2] # these are event handlers bound above # since they aren't automatically bound by PythonCard # I used the wxPython naming conventions # these methods will eventually be converted # KEA 2002-05-08 # this is adapted from the wxPython demo def OnFind(self, event): map = { wx.wxEVT_COMMAND_FIND : "FIND", wx.wxEVT_COMMAND_FIND_NEXT : "FIND_NEXT", wx.wxEVT_COMMAND_FIND_REPLACE : "REPLACE", wx.wxEVT_COMMAND_FIND_REPLACE_ALL : "REPLACE_ALL", } et = event.GetEventType() try: evtType = map[et] except KeyError: evtType = "**Unknown Event Type**" self.lastFind['searchText'] = event.GetFindString() flags = event.GetFlags() self.lastFind['wholeWordsOnly'] = flags & wx.FR_WHOLEWORD != 0 self.lastFind['caseSensitive'] = flags & wx.FR_MATCHCASE != 0 if et == wx.wxEVT_COMMAND_FIND_REPLACE or et == wx.wxEVT_COMMAND_FIND_REPLACE_ALL: replaceTxt = "Replace text: " + event.GetReplaceString() self.lastFind['replaceText'] = event.GetReplaceString() else: replaceTxt = "" #print "%s -- Find text: %s %s Flags: %d \n" % (evtType, event.GetFindString(), replaceTxt, event.GetFlags()) if et == wx.wxEVT_COMMAND_FIND or et == wx.wxEVT_COMMAND_FIND_NEXT: self.findNext(self.lastFind['searchText'], self.lastFind['wholeWordsOnly'], self.lastFind['caseSensitive']) elif et == wx.wxEVT_COMMAND_FIND_REPLACE: # the way Notepad works # pressing Replace causes a Find Next # if there is no selection # if the text that is selected matches # the search criteria, then it is replaced # and a Find Next occurs doc = self.components.document txt = doc.GetSelectedText() sel = doc.GetSelection() if self.lastFind['searchText'].lower() == txt.lower(): # since we don't know criteria for word boundaries # let wxSTC do the searching doc.SetCurrentPos(doc.GetSelectionStart()) result = self.findNext(self.lastFind['searchText'], self.lastFind['wholeWordsOnly'], self.lastFind['caseSensitive']) if result != -1 and sel == doc.GetSelection(): replaceText = self.lastFind['replaceText'] doc.ReplaceSelection(replaceText) pos = doc.GetCurrentPos() doc.SetSelection(pos - len(replaceText), pos) result = self.findNext(self.lastFind['searchText'], self.lastFind['wholeWordsOnly'], self.lastFind['caseSensitive']) elif et == wx.wxEVT_COMMAND_FIND_REPLACE_ALL: self.replaceAll(self.lastFind['searchText'], self.lastFind['replaceText'], self.lastFind['wholeWordsOnly'], self.lastFind['caseSensitive']) # search/replace from current position def replaceAll(self, searchText, replaceText, wholeWordsOnly, caseSensitive): # unless there is a built-in method for Replace All # we need to brute force this search doc = self.components.document pos = doc.GetCurrentPos() sel = doc.GetSelection() doc.SetCurrentPos(0) # should we handle this replace all operation as a single # undoable operation? replaced = 0 while -1 != self.findNext(searchText, wholeWordsOnly, caseSensitive): doc.ReplaceSelection(replaceText) replaced += 1 self.statusBar.text = self.resource.strings.replaced % replaced self.lastPos = self.components.document.GetCurrentPos() if not replaced: # restore previous position and selection doc.SetSelection(sel[0], sel[1]) doc.SetCurrentPos(pos) def replaceTabs(self): """Replace tabs with four spaces.""" self.replaceAll('\t', ' ', 0, 0) def OnFindClose(self, event): event.GetDialog().Destroy() def OnFileHistory(self, event): fileNum = event.GetId() - wx.ID_FILE1 path = self.fileHistory.GetHistoryFile(fileNum) if self.components.document.GetModify(): save = self.saveChanges() if save == "Cancel": # don't do anything, just go back to editing return elif save == "No": # any changes will be lost pass else: if self.documentPath is None: # if the user cancels out of the Save As then go back to editing if not self.on_menuFileSaveAs_select(None): return else: self.saveFile(self.documentPath) self.openFile(path) # back to PythonCard methods def setDefaultStyles(self): config = configuration.getStyleConfigPath() # KEA 2002-05-28 # STCStyleEditor doesn't work yet on OS X if config is not None: STCStyleEditor.initSTC(self.components.document, config, 'python') if self.application.shell is not None: STCStyleEditor.initSTC(self.application.shell, config, 'python') def setEditorStyle(self): try: self.components.document.setEditorStyle(os.path.splitext(self.documentPath)[-1]) except: self.components.document.setEditorStyle('python') def loadConfig(self): try: if not os.path.exists(self.configPath): os.mkdir(self.configPath) path = os.path.join(self.configPath, USERCONFIG) self.config = util.readAndEvalFile(path) if self.config != {}: if 'position' in self.config: self.position = self.config['position'] if 'size' in self.config: self.size = self.config['size'] if 'history' in self.config: history = self.config['history'] history.reverse() for h in history: self.fileHistory.AddFileToHistory(h) if 'view_white_space' in self.config: self.components.document.SetViewWhiteSpace(self.config['view_white_space']) self.menuBar.setChecked('menuViewWhitespace', self.config['view_white_space']) if 'indentation_guides' in self.config: self.components.document.SetIndentationGuides(self.config['indentation_guides']) self.menuBar.setChecked('menuViewIndentationGuides', self.config['indentation_guides']) if 'right_edge_guide' in self.config: self.components.document.SetEdgeMode(self.config['right_edge_guide']) self.menuBar.setChecked('menuViewRightEdgeIndicator', self.config['right_edge_guide']) if 'view_EOL' in self.config: self.components.document.SetViewEOL(self.config['view_EOL']) self.menuBar.setChecked('menuViewEndOfLineMarkers', self.config['view_EOL']) if 'line_numbers' in self.config: self.components.document.lineNumbersVisible = self.config['line_numbers'] self.menuBar.setChecked('menuViewLineNumbers', self.config['line_numbers']) if 'folding' in self.config: self.components.document.codeFoldingVisible = self.config['folding'] self.menuBar.setChecked('menuViewCodeFolding', self.config['folding']) if 'macros' in self.config: self.macros = self.config['macros'] # should match based on name instead m = self.menuBar.menus[4] rsrc = resource.Resource({'type':'MenuItem', 'name': 'scriptletSep2', 'label':'-'}) mi = menu.MenuItem(self, m, rsrc) m.appendMenuItem(mi) for macro in self.macros: #print 'm', macro if macro['key'] == '': key = '' else: key = '\t' + macro['key'] rsrc = resource.Resource({'type':'MenuItem', 'name': 'menuScriptlet' + macro['label'], 'label': macro['label'] + key, 'command':'runMacro'}) mi = menu.MenuItem(self, m, rsrc) m.appendMenuItem(mi) except: self.config = {} def saveConfig(self): self.config['position'] = self.GetRestoredPosition() self.config['size'] = self.GetRestoredSize() self.config['view_white_space'] = self.components.document.GetViewWhiteSpace() self.config['indentation_guides'] = self.components.document.GetIndentationGuides() self.config['right_edge_guide'] = self.components.document.GetEdgeMode() self.config['view_EOL'] = self.components.document.GetViewEOL() self.config['line_numbers'] = self.components.document.lineNumbersVisible self.config['folding'] = self.components.document.codeFoldingVisible history = [] for i in range(self.fileHistory.GetCount()): history.append(self.fileHistory.GetHistoryFile(i)) self.config['history'] = history try: path = os.path.join(self.configPath, USERCONFIG) f = open(path, "w") pprint.pprint(self.config, f) f.close() except: pass # argh def saveChanges(self): # save configuration info in the app directory #filename = os.path.basename(self.documentPath) if self.documentPath is None: filename = self.resource.strings.untitled else: filename = self.documentPath msg = self.resource.strings.documentChangedPrompt % filename result = dialog.messageDialog(self, msg, self.resource.strings.codeEditor, wx.ICON_EXCLAMATION | wx.YES_NO | wx.CANCEL) return result.returnedString def doExit(self): if self.components.document.GetModify(): save = self.saveChanges() if save == "Cancel": return False elif save == "No": return True else: if self.documentPath is None: return self.on_menuFileSaveAs_select(None) else: self.saveFile(self.documentPath) return True else: return True def on_close(self, event): if self.doExit(): try: # KEA 2004-04-08 # if an exception occurs during on_initialize # then saveConfig could fail because some windows # might not exist, so in that situation just exit gracefully self.saveConfig() except: pass self.fileHistory = None self.printer = None event.skip() def on_menuFileSave_select(self, event): if self.documentPath is None: # this a "new" document and needs to go through Save As... self.on_menuFileSaveAs_select(None) else: self.saveFile(self.documentPath) def on_menuFileSaveAs_select(self, event): #wildcard = "Python scripts (*.py;*.pyw)|*.py;*.pyw|Text files (*.txt)|*.txt|All files (*.*)|*.*" wildcard = self.resource.strings.saveAsWildcard if self.documentPath is None: dir = '' filename = '*.py' else: dir = os.path.dirname(self.documentPath) filename = os.path.basename(self.documentPath) result = dialog.saveFileDialog(None, self.resource.strings.saveAs, dir, filename, wildcard) if result.accepted: path = result.paths[0] self.saveFile(path) self.fileHistory.AddFileToHistory(path) return True else: return False def newFile(self): self.components.document.text = '' self.documentPath = None self.setEditorStyle() self.components.document.SetSavePoint() self.title = self.resource.strings.untitled + ' - ' + self.startTitle #self.statusBar.text = self.resource.strings.untitled self.lastStatus = None # KEA 2003-07-26 # reset EOL to match platform # this may not actually be what the user expects # so perhaps this should be an option in a dialog?! self.autoSetEOL() def openFile(self, path): try: self.components.document.SetUndoCollection(0) self.components.document.ClearAll() f = open(path, 'rb') try: self.components.document.text = f.read() finally: f.close() self.documentPath = path os.chdir(os.path.dirname(self.documentPath)) self.components.document.EmptyUndoBuffer() self.components.document.SetUndoCollection(1) self.components.document.SetSavePoint() self.title = os.path.split(path)[-1] + ' - ' + self.startTitle #self.statusBar.text = path self.lastStatus = None self.fileHistory.AddFileToHistory(path) # KEA 2002-06-29 # just as a test, let's see how the XML and/or HTML styles # look self.setEditorStyle() self.autoSetEOL() except: pass def saveFile(self, path): try: f = open(path, 'wb') try: f.write(self.components.document.text) finally: f.close() self.documentPath = path os.chdir(os.path.dirname(self.documentPath)) self.components.document.SetSavePoint() self.title = os.path.split(path)[-1] + ' - ' + self.startTitle #self.statusBar.text = path self.lastStatus = None self.setEditorStyle() except: pass # KEA 2003-07-26 def autoSetEOL(self): """ when opening an existing file automatically set the EOL mode to match the current line endings for the file if the document is empty then set EOL to the original EOL state """ doc = self.components.document if doc.GetLength(): line = doc.GetLine(0) else: line = os.linesep if line.endswith('\r\n'): doc.SetEOLMode(stc.STC_EOL_CRLF) elif line.endswith('\n'): doc.SetEOLMode(stc.STC_EOL_LF) elif line.endswith('\r'): doc.SetEOLMode(stc.STC_EOL_CR) # File menu # KEA 2002-05-04 # need to decide on UI for multiple windows # New Window, Open in New Window, New, Open, etc. # since we aren't doing MDI # we could have child windows, but what would the organization be?! def on_menuFileNewWindow_select(self, event): app = os.path.split(sys.argv[0])[-1] filename = os.path.join(self.application.applicationDirectory, app) python = sys.executable if ' ' in python: pythonQuoted = '"' + python + '"' else: pythonQuoted = python os.spawnv(os.P_NOWAIT, python, [pythonQuoted, filename]) # for this to work, all the windows need to share a common list of windows # a File->Exit would iterate through each? """ path = os.path.join(self.application.applicationDirectory, 'codeEditor') rsrc = resource.ResourceFile(model.internationalResourceName(path)).getResource() self.childWindow = CodeEditor(self, rsrc.application.backgrounds[0]) """ def on_menuFileNew_select(self, event): if self.components.document.GetModify(): save = self.saveChanges() if save == "Cancel": # don't do anything, just go back to editing pass elif save == "No": # any changes will be lost self.newFile() else: if self.documentPath is None: if self.on_menuFileSaveAs_select(None): self.newFile() else: self.saveFile(self.documentPath) self.newFile() else: # don't need to save self.newFile() def on_menuFileOpen_select(self, event): if self.components.document.GetModify(): save = self.saveChanges() if save == "Cancel": # don't do anything, just go back to editing return elif save == "No": # any changes will be lost pass else: if self.documentPath is None: # if the user cancels out of the Save As then go back to editing if not self.on_menuFileSaveAs_select(None): return else: self.saveFile(self.documentPath) # split this method into several pieces to make it more flexible #wildcard = "Python scripts (*.py;*.pyw)|*.py;*.pyw|Text files (*.txt)|*.txt|All files (*.*)|*.*" wildcard = self.resource.strings.saveAsWildcard result = dialog.openFileDialog(None, self.resource.strings.openFile, '', '', wildcard) if result.accepted: path = result.paths[0] # an error will probably occur here if the text is too large # to fit in the wxTextCtrl (TextArea) or the file is actually # binary. Not sure what happens with CR/LF versus CR versus LF # line endings either self.openFile(path) def on_menuFilePrint_select(self, event): source = textToHtml(self.components.document.text) self.printer.PrintText(source) def on_menuFilePrintPreview_select(self, event): source = textToHtml(self.components.document.text) self.printer.PreviewText(source) def on_menuFilePageSetup_select(self, event): self.printer.PageSetup() # Edit menu def on_menuEditUndo_select(self, event): widget = self.findFocus() if hasattr(widget, 'editable') and widget.CanUndo(): widget.Undo() def on_menuEditRedo_select(self, event): widget = self.findFocus() if hasattr(widget, 'editable') and widget.CanRedo(): widget.Redo() def on_menuEditCut_select(self, event): widget = self.findFocus() # KEA 2002-05-03 # no CanCut() method? if hasattr(widget, 'editable'): widget.Cut() def on_menuEditCopy_select(self, event): widget = self.findFocus() # KEA 2002-05-03 # no CanCopy() method? if hasattr(widget, 'editable'): widget.Copy() def on_menuEditPaste_select(self, event): widget = self.findFocus() if hasattr(widget, 'editable') and widget.CanPaste(): widget.Paste() def on_menuEditClear_select(self, event): widget = self.findFocus() if hasattr(widget, 'editable'): widget.ClearSelection() def on_menuEditSelectAll_select(self, event): widget = self.findFocus() if hasattr(widget, 'editable'): widget.SelectAll() def findNext(self, searchText, wholeWordsOnly, caseSensitive): if searchText == '': return -1 doc = self.components.document current = doc.GetCurrentPos() last = doc.GetLength() if wx.VERSION >= (2, 3, 3): flags = 0 if caseSensitive: flags = flags + stc.STC_FIND_MATCHCASE if wholeWordsOnly: flags = flags + stc.STC_FIND_WHOLEWORD result = doc.FindText(current, last, searchText, flags) else: result = doc.FindText(current, last, searchText, caseSensitive, wholeWordsOnly) if result != -1: # update the selection, which also changes the cursor position n = len(searchText) doc.SetSelection(result, result + n) else: # should we beep or flash the screen or present an error dialog? pass return result def on_doEditFindReplace_command(self, event): data = wx.FindReplaceData() flags = data.GetFlags() data.SetFindString(self.lastFind['searchText']) data.SetReplaceString(self.lastFind['replaceText']) if self.lastFind['wholeWordsOnly']: flags = flags | wx.FR_WHOLEWORD if self.lastFind['caseSensitive']: flags = flags | wx.FR_MATCHCASE data.SetFlags(flags) dlg = wx.FindReplaceDialog(self, data, "Find & Replace", wx.FR_REPLACEDIALOG) dlg.data = data # save a reference to it... # KEA 2004-04-18 # can't use visible attribute # probably need to create a wrapper for FindReplaceDialog # to make it more like PythonCard #dlg.visible = True dlg.Show() def on_doEditReplaceTabs_command(self, event): self.replaceTabs() def on_doEditFind_command(self, event): # keep track of the last find and preload # the search text and radio buttons lastFind = self.lastFind result = dialog.findDialog(self, lastFind['searchText'], lastFind['wholeWordsOnly'], lastFind['caseSensitive']) if result.accepted: lastFind['searchText'] = result.searchText lastFind['wholeWordsOnly'] = result.wholeWordsOnly lastFind['caseSensitive'] = result.caseSensitive self.findNext(lastFind['searchText'], lastFind['wholeWordsOnly'], lastFind['caseSensitive']) def on_doEditFindNext_command(self, event): self.findNext(self.lastFind['searchText'], self.lastFind['wholeWordsOnly'], self.lastFind['caseSensitive']) def gotoLine(self, lineNumber): try: # GotoLine is zero based, but we ask the user # for a line number starting at 1 self.components.document.GotoLine(lineNumber - 1) except: pass def on_doEditGoTo_command(self, event): result = dialog.textEntryDialog(self, self.resource.strings.gotoLineNumber, self.resource.strings.gotoLine, '') # this version doesn't alert the user if the line number is out-of-range # it just fails quietly if result.accepted: try: self.gotoLine(int(result.text)) except: pass def on_indentRegion_command(self, event): self.components.document.CmdKeyExecute(stc.STC_CMD_TAB) def on_dedentRegion_command(self, event): self.components.document.CmdKeyExecute(stc.STC_CMD_BACKTAB) def on_commentRegion_command(self, event): # need to do the equivelant of the IDLE # comment_region_event in AutoIndent.py doc = self.components.document sel = doc.GetSelection() start = doc.LineFromPosition(sel[0]) end = doc.LineFromPosition(sel[1]) if end > start and doc.GetColumn(sel[1]) == 0: end = end - 1 doc.BeginUndoAction() for lineNumber in range(start, end + 1): firstChar = doc.PositionFromLine(lineNumber) doc.InsertText(firstChar, '##') doc.SetCurrentPos(doc.PositionFromLine(start)) doc.SetAnchor(doc.GetLineEndPosition(end)) doc.EndUndoAction() def on_uncommentRegion_command(self, event): # need to do the equivelant of the IDLE # uncomment_region_event in AutoIndent.py doc = self.components.document sel = doc.GetSelection() start = doc.LineFromPosition(sel[0]) end = doc.LineFromPosition(sel[1]) if end > start and doc.GetColumn(sel[1]) == 0: end = end - 1 doc.BeginUndoAction() for lineNumber in range(start, end + 1): firstChar = doc.PositionFromLine(lineNumber) if chr(doc.GetCharAt(firstChar)) == '#': if chr(doc.GetCharAt(firstChar + 1)) == '#': # line starts with ## doc.SetCurrentPos(firstChar + 2) else: # line starts with # doc.SetCurrentPos(firstChar + 1) doc.DelLineLeft() doc.SetCurrentPos(doc.PositionFromLine(start)) doc.SetAnchor(doc.GetLineEndPosition(end)) doc.EndUndoAction() # View menu def on_menuViewWhitespace_select(self, event): self.components.document.SetViewWhiteSpace(event.IsChecked()) def on_menuViewIndentationGuides_select(self, event): self.components.document.SetIndentationGuides(event.IsChecked()) def on_menuViewRightEdgeIndicator_select(self, event): if event.IsChecked(): self.components.document.SetEdgeMode(stc.STC_EDGE_LINE) #self.components.document.SetEdgeMode(stc.STC_EDGE_BACKGROUND) else: self.components.document.SetEdgeMode(stc.STC_EDGE_NONE) def on_menuViewEndOfLineMarkers_select(self, event): self.components.document.SetViewEOL(event.IsChecked()) def on_menuViewFixedFont_select(self, event): pass def on_menuViewLineNumbers_select(self, event): self.components.document.lineNumbersVisible = event.IsChecked() def on_menuViewCodeFolding_select(self, event): self.components.document.codeFoldingVisible = event.IsChecked() # Format menu def on_doSetStyles_command(self, event): config = configuration.getStyleConfigPath() if config is None: return cwd = os.curdir os.chdir(os.path.dirname(config)) dlg = STCStyleEditor.STCStyleEditDlg(self, 'Python', 'python', #'HTML', 'html', #'XML', 'xml', #'C++', 'cpp', #'Text', 'text', #'Properties', 'prop', config) try: dlg.ShowModal() finally: dlg.Destroy() os.chdir(cwd) self.setDefaultStyles() def on_menuFormatWrap_select(self, event): self.components.document.SetWrapMode(event.IsChecked()) def wordCount(self, text): chars = len(text) words = len(text.split()) # this doesn't always match the getNumberOfLines() method # so this should probably be changed lines = len(util.normalizeEOL(text).split('\n')) return chars, words, lines # Help menu def on_doHelpAbout_command(self, event): # once we have generic dialogs going, put a more interesting # About box here if self.documentPath is None: filename = self.resource.strings.untitled else: filename = os.path.basename(self.documentPath) countString = "%d " + self.resource.strings.chars + \ ", %d " + self.resource.strings.words + \ ", %d " + self.resource.strings.lines dialog.messageDialog(self, self.resource.strings.sample + "\n\n" + \ self.resource.strings.document + ": %s\n" % filename + \ countString \ % self.wordCount(self.components.document.text), self.resource.strings.about, wx.ICON_INFORMATION | wx.OK) def on_doHelpAboutPythonCard_command(self, event): about.aboutPythonCardDialog(self) def on_menuScriptletShell_select(self, event): self.loadShell() if self.application.shell is not None: self.application.shellFrame.visible = not self.application.shellFrame.visible def on_menuScriptletNamespace_select(self, event): self.loadNamespace() if self.application.namespace is not None: self.application.namespaceFrame.visible = not self.application.namespaceFrame.visible def on_menuScriptletSaveUserConfiguration_select(self, event): configuration.saveUserConfiguration(self.application) def on_menuShellChangeDirectory_select(self, event): try: if self.documentPath: path = os.path.dirname(self.documentPath) else: path = '' result = dialog.directoryDialog(self, 'Choose a directory', path) if result.accepted: path = result.path os.chdir(path) self.application.shell.run('os.getcwd()') except: pass def on_menuScriptletSaveShellSelection_select(self, event): if self.application.shell is not None: txt = self.application.shell.GetSelectedText() lines = [] for line in txt.splitlines(): lines.append(self.application.shell.lstripPrompt(line)) # this is the quick way to convert a list back into a string # appending to strings can be slow because it creates a new string # each time, so a list is used instead while building up the script script = '\n'.join(lines) try: #wildcard = "Python files (*.py)|*.py|All Files (*.*)|*.*" wildcard = self.resource.strings.scriptletWildcard scriptletsDir = os.path.join(self.application.applicationDirectory, 'scriptlets') result = dialog.saveFileDialog(None, self.resource.strings.saveAs, scriptletsDir, 'scriptlet.py', wildcard) if result.accepted: path = result.paths[0] f = open(path, 'w') f.write(script) f.close() except: pass def execScriptlet(self, filename): try: command = 'execfile(%r)' % filename self.application.shell.run(command=command, prompt=0, verbose=0) except: pass def on_menuScriptletRunScriptlet_select(self, event): self.loadShell() #curDir = os.getcwd() if self.application.shell is not None: #wildcard = "Python files (*.py)|*.py|All Files (*.*)|*.*" wildcard = self.resource.strings.scriptletWildcard # wildcard = '*.py' scriptletsDir = os.path.join(self.application.applicationDirectory, 'scriptlets') result = dialog.openFileDialog(self, self.resource.strings.openFile, scriptletsDir, '', wildcard) if result.accepted: filename = result.paths[0] self.execScriptlet(filename) #os.chdir(curDir) """ >>> mb = bg.menuBar >>> m = mb.menus[4] >>> from PythonCard import menu, resource >>> rsrc = resource.Resource({'type':'MenuItem', 'name': 'scriptletSep2', 'label':'-'}) >>> mi = menu.MenuItem(bg, m, rsrc) >>> m.appendMenuItem(mi) >>> rsrc = resource.Resource({'type':'MenuItem', 'name': 'menuScriptletinsertDateAndTime', 'label':'insertDateAndTime\tCtrl+1', 'command':'runMacro'}) >>> mi = menu.MenuItem(bg, m, rsrc) >>> m.appendMenuItem(mi) """ """ Need to have a "Macros" dialog that let's the user select a script to run, a label for the script which will default to the script name, and a hot key. The dialog will prepend menuScriptlet on the front, add the item to the menu and store it in the config so it is remembered between loads. """ def on_runMacro_command(self, event): name = event.target.name[len('menuScriptlet'):] #scriptletsDir = os.path.join(self.application.applicationDirectory, 'scriptlets') #filename = os.path.join(scriptletsDir, name + '.py') for macro in self.macros: if macro['label'] == name: filename = macro['filename'] self.execScriptlet(filename) break # KEA 2002-05-04 # need to experiment to determine when skip() # must be called and when to avoid it when we # want to eat and process key presses ourselves # also are the wxEVT_STC_ different than the plain # EVT_CHAR, EVT_KEY_DOWN ??? # # from binding.py # aWxEvent.altDown = aWxEvent.AltDown() # aWxEvent.controlDown = aWxEvent.ControlDown() # aWxEvent.shiftDown = aWxEvent.ShiftDown() # aWxEvent.keyCode = aWxEvent.GetKeyCode() def on_document_keyDown(self, event): #print "keyPress", event.keyCode, event.shiftDown, event.controlDown, event.altDown # smart auto-indent on Return # this is brute force and currently assumes 4 space # Guido indentation style keyCode = event.keyCode target = event.target if keyCode == wx.WXK_RETURN: # since we won't be calling skip, insert a newline manually self.components.document.CmdKeyExecute(stc.STC_CMD_NEWLINE) # why isn't GetCurrentLine 0 based? line = target.GetCurrentLine() - 1 txt = target.GetLine(line) stripped = txt.rstrip() # auto-indent block indent = target.GetLineIndentation(line) padding = " " * indent pos = target.GetCurrentPos() if len(stripped) > 0 and stripped[-1] == ':': # KEA 2002-05-06 to do # should use GetStyleAt() on the actual pos of # the : to make sure the style is not wxSTC_P_COMMENTLINE... # actually this is more complex and really when the style # we need to walk backwards until we find a colon not in # one of the comment styles before doing an auto-indent # but I don't feel like getting it all working before 0.6.6 # so this is left as an exercise for the reader ;-) ## whitespace = len(txt) - len(stripped) ## colonPos = target.GetLineEndPosition(line) - whitespace + 1 ## if target.GetStyleAt(colonPos) not in \ ## [stc.STC_P_COMMENTLINE, ## stc.STC_P_COMMENTBLOCK, ## stc.STC_P_TRIPLEDOUBLE ]: padding += " " * 4 target.InsertText(pos, padding) newpos = pos + len(padding) target.SetCurrentPos(newpos) target.SetSelection(newpos, newpos) else: event.skip() def on_checkSyntax_command(self, event): if self.documentPath is None: save = self.saveChanges() if save == "Cancel" or save == "No": # don't do anything, just go back to editing # we have to have a file on disk to check # if we used StringIO we could simulate a file # but I don't know if it is worth it pass else: if self.on_menuFileSaveAs_select(None): scriptutils.CheckFile(self, self.documentPath) self.lastPos = self.components.document.GetCurrentPos() else: if self.components.document.GetModify(): # auto-save self.saveFile(self.documentPath) scriptutils.CheckFile(self, self.documentPath) self.lastPos = self.components.document.GetCurrentPos() def on_fileRunOptions_command(self, event): result = runOptionsDialog.runOptionsDialog(self, self.cmdLineArgs) if result.accepted: self.cmdLineArgs['debugmenu'] = result.debugmenu self.cmdLineArgs['logging'] = result.logging self.cmdLineArgs['messagewatcher'] = result.messagewatcher self.cmdLineArgs['namespaceviewer'] = result.namespaceviewer self.cmdLineArgs['propertyeditor'] = result.propertyeditor self.cmdLineArgs['shell'] = result.shell self.cmdLineArgs['otherargs'] = result.otherargs # script running code def runScript(self, useInterpreter): if self.documentPath is None: save = self.saveChanges() if save == "Cancel" or save == "No": # don't do anything, just go back to editing return else: if not self.on_menuFileSaveAs_select(None): # they didn't actually save, just go back # to editing return elif self.components.document.GetModify(): # auto-save self.saveFile(self.documentPath) # this algorithm, taken from samples.py assumes the rsrc.py file and the main # program file have the same basename # if that isn't the case then this doesn't work and we need a different solution path, filename = os.path.split(self.documentPath) if wx.Platform == '__WXMAC__': filename = self.documentPath else: if ' ' in self.documentPath: filename = '"' + self.documentPath + '"' else: filename = self.documentPath # the args should come from a dialog or menu items that are checked/unchecked args = util.getCommandLineArgs(self.cmdLineArgs) # change to the script directory before attempting to run curdir = os.path.dirname(os.path.abspath(os.curdir)) os.chdir(os.path.dirname(self.documentPath)) if wx.Platform == '__WXMAC__': # this is a bad hack to deal with the user starting # codeEditor.py from the Finder if sys.executable == '/': python = '/Applications/Python.app/Contents/MacOS/python' else: python = sys.executable elif wx.Platform == '__WXMSW__': # always launch with a console python = os.path.join(os.path.dirname(sys.executable), 'python.exe') else: python = sys.executable if ' ' in python: pythonQuoted = '"' + python + '"' else: pythonQuoted = python if useInterpreter: os.spawnv(os.P_NOWAIT, python, [pythonQuoted, '-i', filename] + args) else: os.spawnv(os.P_NOWAIT, python, [pythonQuoted, filename] + args) os.chdir(curdir) def on_fileRun_command(self, event): # KEA 2001-12-14 # we should prompt to save the file if needed # or in the case of a new file, do a save as before attempting # to do a run self.runScript(0) def on_fileRunWithInterpreter_command(self, event): # KEA 2001-12-14 # we should prompt to save the file if needed # or in the case of a new file, do a save as before attempting # to do a run self.runScript(1) def on_findFiles_command(self, event): fn = self.application.applicationDirectory fn = os.path.join(fn, os.pardir, "findfiles", "findfiles.py") fn = os.path.normpath(fn) if not os.path.isfile(fn): return if wx.Platform == '__WXMAC__': filename = fn else: filename = '"' + fn + '"' if wx.Platform == '__WXMAC__': # this is a bad hack to deal with the user starting # codeEditor.py from the Finder if sys.executable == '/': python = '/Applications/Python.app/Contents/MacOS/python' else: python = sys.executable elif wx.Platform == '__WXMSW__': python = os.path.join(os.path.dirname(sys.executable), 'pythonw.exe') else: python = sys.executable if ' ' in python: pythonQuoted = '"' + python + '"' else: pythonQuoted = python os.spawnv(os.P_NOWAIT, python, [pythonQuoted, filename]) def on_showShellDocumentation_command(self, event): global shell_url webbrowser.open(shell_url) def on_showPythonCardDocumentation_command(self, event): global pythoncard_url webbrowser.open(pythoncard_url) def on_showPythonDocumentation_command(self, event): global help_url if sys.platform.startswith("win"): # KEA 2003-10-15 AGT 2005-12-20 # BIG hack for Python 2.3 Windows help file (or Python 2.4) # need to decide on a clean way of handling various doc options fn = os.path.dirname(os.__file__) chmfile = "Python" + sys.version[0] + sys.version[2] + ".chm" fn = os.path.join(fn, os.pardir, "Doc", chmfile) fn = os.path.normpath(fn) if os.path.isfile(fn): os.startfile(fn) else: webbrowser.open(help_url) # KEA 2004-08-18 # I'll probably move this functionality into model.Application # and just call a macOpenFile method in the current background class MyApplication(model.Application): # support drag and drop on the application icon on the Mac def MacOpenFile(self, filename): # code to load filename goes here self.backgrounds[0].openFile(filename) if __name__ == '__main__': app = MyApplication(CodeEditor) app.MainLoop() PythonCard-0.8.2/tools/codeEditor/codeEditor.rsrc.py0000644000076500007650000003123010112647163022336 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'codeEditor', 'backgrounds': [ {'type':'Background', 'name':'bgCodeEditor', 'title':'Code Editor PythonCard Application', 'size':(400, 300), 'statusBar':1, 'visible':0, 'style':['resizeable'], 'visible':0, 'menubar': {'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ {'type':'MenuItem', 'name':'menuFileNewWindow', 'label':'New Window', }, {'type':'MenuItem', 'name':'menuFileNew', 'label':'&New\tCtrl+N', }, {'type':'MenuItem', 'name':'menuFileOpen', 'label':'&Open\tCtrl+O', }, {'type':'MenuItem', 'name':'menuFileSave', 'label':'&Save\tCtrl+S', }, {'type':'MenuItem', 'name':'menuFileSaveAs', 'label':'Save &As...', }, {'type':'MenuItem', 'name':'fileSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuFileCheckSyntax', 'label':'&Check Syntax (Module)\tAlt+F5', 'command':'checkSyntax', }, {'type':'MenuItem', 'name':'menuFileRun', 'label':'&Run\tCtrl+R', 'command':'fileRun', }, {'type':'MenuItem', 'name':'menuFileRunWithInterpreter', 'label':'Run with &interpreter\tCtrl+Shift+R', 'command':'fileRunWithInterpreter', }, {'type':'MenuItem', 'name':'menuFileRunOptions', 'label':'Run Options...', 'command':'fileRunOptions', }, {'type':'MenuItem', 'name':'fileSep2', 'label':'-', }, {'type':'MenuItem', 'name':'menuFilePageSetup', 'label':'Page Set&up...', }, {'type':'MenuItem', 'name':'menuFilePrint', 'label':'&Print...\tCtrl+P', }, {'type':'MenuItem', 'name':'menuFilePrintPreview', 'label':'Print Pre&view', }, {'type':'MenuItem', 'name':'fileSep2', 'label':'-', }, {'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit', }, ] }, {'type':'Menu', 'name':'Edit', 'label':'&Edit', 'items': [ {'type':'MenuItem', 'name':'menuEditUndo', 'label':'&Undo\tCtrl+Z', }, {'type':'MenuItem', 'name':'menuEditRedo', 'label':'&Redo\tCtrl+Y', }, {'type':'MenuItem', 'name':'editSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditCut', 'label':'Cu&t\tCtrl+X', }, {'type':'MenuItem', 'name':'menuEditCopy', 'label':'&Copy\tCtrl+C', }, {'type':'MenuItem', 'name':'menuEditPaste', 'label':'&Paste\tCtrl+V', }, {'type':'MenuItem', 'name':'editSep2', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditFind', 'label':'&Find...\tCtrl+F', 'command':'doEditFind', }, {'type':'MenuItem', 'name':'menuEditFindNext', 'label':'&Find Next\tF3', 'command':'doEditFindNext', }, {'type':'MenuItem', 'name':'menuEditFindFiles', 'label':'Find in Files...\tAlt+F3', 'command':'findFiles', }, {'type':'MenuItem', 'name':'menuEditReplace', 'label':'&Replace...\tCtrl+H', 'command':'doEditFindReplace', }, {'type':'MenuItem', 'name':'menuEditGoTo', 'label':'&Go To...\tCtrl+G', 'command':'doEditGoTo', }, {'type':'MenuItem', 'name':'editSep3', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditReplaceTabs', 'label':'&Replace tabs with spaces', 'command':'doEditReplaceTabs', }, {'type':'MenuItem', 'name':'editSep3', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditClear', 'label':'Cle&ar\tDel', }, {'type':'MenuItem', 'name':'menuEditSelectAll', 'label':'Select A&ll\tCtrl+A', }, {'type':'MenuItem', 'name':'editSep4', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditIndentRegion', 'label':'&Indent Region', 'command':'indentRegion', }, {'type':'MenuItem', 'name':'menuEditDedentRegion', 'label':'&Dedent Region', 'command':'dedentRegion', }, {'type':'MenuItem', 'name':'menuEditCommentRegion', 'label':'Comment &out region\tAlt+3', 'command':'commentRegion', }, {'type':'MenuItem', 'name':'menuEditUncommentRegion', 'label':'U&ncomment region\tShift+Alt+3', 'command':'uncommentRegion', }, ] }, {'type':'Menu', 'name':'menuView', 'label':'&View', 'items': [ {'type':'MenuItem', 'name':'menuViewWhitespace', 'label':'&Whitespace', 'checkable':1, }, {'type':'MenuItem', 'name':'menuViewIndentationGuides', 'label':'Indentation &guides', 'checkable':1, }, {'type':'MenuItem', 'name':'menuViewRightEdgeIndicator', 'label':'&Right edge indicator', 'checkable':1, }, {'type':'MenuItem', 'name':'menuViewEndOfLineMarkers', 'label':'&End-of-line markers', 'checkable':1, }, {'type':'MenuItem', 'name':'menuViewFixedFont', 'label':'&Fixed Font', 'enabled':0, 'checkable':1, }, {'type':'MenuItem', 'name':'viewSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuViewLineNumbers', 'label':'&Line Numbers', 'checkable':1, 'checked':1, }, {'type':'MenuItem', 'name':'menuViewCodeFolding', 'label':'&Code Folding', 'checkable':1, 'checked':0, }, ] }, {'type':'Menu', 'name':'menuFormat', 'label':'F&ormat', 'items': [ {'type':'MenuItem', 'name':'menuFormatStyles', 'label':'&Styles...', 'command':'doSetStyles', }, {'type':'MenuItem', 'name':'menuFormatWrap', 'label':'&Wrap Lines', 'checkable':1, }, ] }, {'type':'Menu', 'name':'menuScriptlet', 'label':'&Shell', 'items': [ {'type':'MenuItem', 'name':'menuScriptletShell', 'label':'&Shell Window\tF5', }, {'type':'MenuItem', 'name':'menuScriptletNamespace', 'label':'&Namespace Window\tF6', }, {'type':'MenuItem', 'name':'menuScriptletSaveUserConfiguration', 'label':'Save &Configuration', }, {'type':'MenuItem', 'name':'menuShellChangeDirectory', 'label':'Change &Directory...', }, {'type':'MenuItem', 'name':'scriptletSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuScriptletSaveShellSelection', 'label':'Save Shell Selection...', }, {'type':'MenuItem', 'name':'menuScriptletRunScriptlet', 'label':'Run Scriptlet...', }, ] }, {'type':'Menu', 'name':'menuHelp', 'label':'&Help', 'items': [ {'type':'MenuItem', 'name':'menuShellDocumentation', 'label':'&Shell Documentation...', 'command':'showShellDocumentation', }, {'type':'MenuItem', 'name':'menuPythonCardDocumentation', 'label':'&PythonCard Documentation...\tF1', 'command':'showPythonCardDocumentation', }, {'type':'MenuItem', 'name':'menuPythonDocumentation', 'label':'Python &Documentation...', 'command':'showPythonDocumentation', }, {'type':'MenuItem', 'name':'helpSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuHelpAbout', 'label':'&About codeEditor...', 'command':'doHelpAbout', }, {'type':'MenuItem', 'name':'menuHelpAboutPythonCard', 'label':'About PythonCard...', 'command':'doHelpAboutPythonCard', }, ] }, ] }, 'strings': { 'saveAs':'Save As', 'about':'About codeEditor...', 'saveAsWildcard':'All files (*.*)|*.*|Python scripts (*.py;*.pyw)|*.pyw;*.PY;*.PYW;*.py|Text files (*.txt;*.text)|*.text;*.TXT;*.TEXT;*.txt|HTML and XML files (*.htm;*.html;*.xml)|*.htm;*.xml;*.HTM;*.HTML;*.XML;*.html', 'chars':'chars', 'gotoLine':'Goto line', 'lines':'lines', 'gotoLineNumber':'Goto line number:', 'documentChangedPrompt':'The text in the %s file has changed.\n\nDo you want to save the changes?', 'untitled':'Untitled', 'sample':'codeEditor sample', 'codeEditor':'codeEditor', 'replaced':'Replaced %d occurances', 'words':'words', 'openFile':'Open file', 'scriptletWildcard':'Python files (*.py)|*.py|All Files (*.*)|*.*', 'document':'Document', }, 'components': [ {'type':'CodeEditor', 'name':'document', 'position':(0, 0), 'size':(250, 100), }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/tools/codeEditor/codeEditorR.py0000644000076500007650000001466410122400605021511 0ustar alexalex00000000000000#!/usr/bin/env python """ __version__ = "$Revision: 1.14 $" __date__ = "$Date: 2004/09/16 21:11:33 $" experimental version with Resource File support PythonCard Editor (codeEditor) wiki page http://wiki.wxpython.org/index.cgi/PythonCardEditor wxStyledTextCtrl documentation http://wiki.wxpython.org/index.cgi/wxStyledTextCtrl """ import os import wx from PythonCard import model, registry, resource import codeEditor def getResourceFilename(path): path, filename = os.path.split(path) base = os.path.splitext(filename)[0] resourceFilename = os.path.join(path, base + '.rsrc.py') return resourceFilename # this really needs to know about the structure # of the file by parsing the classes and methods # it won't deal with duplicate handler names... # with just simple matching def handlerExists(text, componentName, eventName): eventText = 'def on_' + componentName + '_' + eventName + '(' # commands are a special case since the command name # does not have to be tied to the component name # so that will require special handling by looking # at the command attribute of the component return text.find(eventText) class CodeEditorR(codeEditor.CodeEditor): def initSizers(self): sizer1 = wx.BoxSizer(wx.VERTICAL) sizer2 = wx.BoxSizer(wx.HORIZONTAL) sizer2.Add(self.components.popComponentNames) sizer2.Add(self.components.popComponentEvents) sizer1.Add(sizer2, 0) sizer1.Add(self.components.document, 1, wx.EXPAND) sizer1.Fit(self) sizer1.SetSizeHints(self) self.panel.SetSizer(sizer1) self.panel.SetAutoLayout(1) self.panel.Layout() def on_idle(self, event): self.updateTitleBar() self.updateStatusBar() # KEA 2003-01-06 # resource file support # if there is an associated resource file then # it should be checked periodically to see if it has # changed and if so, update our internal resource # as well as the component names and events menus # the events menu should also be updated as the user # edits the text to keep the defined events marked # with a + # the code below is too CPU intensive to run # all the time, so I've commented it out until # a better way of updating the event list is found ##sel = self.components.popComponentNames.stringSelection ##if sel != '': ## self.fillEventNames(sel) def openFile(self, path): try: self.components.document.SetUndoCollection(0) self.components.document.ClearAll() f = open(path, 'rb') try: self.components.document.text = f.read() finally: f.close() self.documentPath = path os.chdir(os.path.dirname(self.documentPath)) self.components.document.EmptyUndoBuffer() self.components.document.SetUndoCollection(1) self.components.document.SetSavePoint() self.title = os.path.split(path)[-1] + ' - ' + self.startTitle #self.statusBar.text = path self.lastStatus = None self.fileHistory.AddFileToHistory(path) # KEA 2002-06-29 # just as a test, let's see how the XML and/or HTML styles # look self.setEditorStyle() # KEA 2003-01-06 # resource file support self.setResourceFile() except: pass # KEA 2003-01-06 # resource file support def setResourceFile(self): self.components.popComponentNames.items = [] self.components.popComponentEvents.items = [] try: self.resourceFilename = getResourceFilename(self.documentPath) self.rsrc = resource.ResourceFile(self.resourceFilename).getResource() self.rsrcComponents = {} if hasattr(self.rsrc, 'application'): components = self.rsrc.application.backgrounds[0].components else: # CustomDialog components = self.rsrc.components for c in components: self.rsrcComponents[c.name] = c.type items = self.rsrcComponents.keys() items.sort() self.components.popComponentNames.items = items except: pass def fillEventNames(self, componentName): r = registry.Registry.getInstance() componentType = self.rsrcComponents[componentName] spec = r.components[componentType]._spec tmp = spec.getEventNames() + ['command'] tmp.sort() text = self.components.document.text eventNames = [] for e in tmp: if handlerExists(text, componentName, e) != -1: eventNames.append('+ ' + e) else: eventNames.append(' ' + e) # should we try and save and restore the current selection? if self.components.popComponentEvents.items != eventNames: self.components.popComponentEvents.items = eventNames def on_popComponentNames_select(self, event): self.fillEventNames(event.target.stringSelection) def on_popComponentEvents_select(self, event): document = self.components.document componentName = self.components.popComponentNames.stringSelection # this is tied to the ' ' and '+ ' used in fillEventNames # we just want the event name eventName = event.target.stringSelection.split(' ')[-1] eventText = 'def on_' + componentName + '_' + eventName + '(' offset = handlerExists(document.text, componentName, eventName) #print eventText, offset if offset != -1: document.SetSelection(offset, offset) else: # event handler doesn't exist? # so create one at the current selection? sel = document.GetSelection() start = document.LineFromPosition(sel[0]) # this could take into account the current indent eventText = eventText + 'self, event):\n pass\n' firstChar = document.PositionFromLine(start) document.BeginUndoAction() document.InsertText(firstChar, eventText) document.SetCurrentPos(document.PositionFromLine(start)) document.EndUndoAction() document.setFocus() if __name__ == '__main__': app = model.Application(CodeEditorR) app.MainLoop() PythonCard-0.8.2/tools/codeEditor/codeEditorR.rsrc.py0000644000076500007650000003035610112647163022470 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'codeEditor', 'backgrounds': [ {'type':'Background', 'name':'bgCodeEditor', 'title':'Code Editor R PythonCard Application', 'size':(400, 300), 'statusBar':1, 'visible':0, 'style':['resizeable'], 'visible':0, 'menubar': {'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ {'type':'MenuItem', 'name':'menuFileNewWindow', 'label':'New Window', }, {'type':'MenuItem', 'name':'menuFileNew', 'label':'&New\tCtrl+N', }, {'type':'MenuItem', 'name':'menuFileOpen', 'label':'&Open\tCtrl+O', }, {'type':'MenuItem', 'name':'menuFileSave', 'label':'&Save\tCtrl+S', }, {'type':'MenuItem', 'name':'menuFileSaveAs', 'label':'Save &As...', }, {'type':'MenuItem', 'name':'fileSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuFileCheckSyntax', 'label':'&Check Syntax (Module)\tAlt+F5', 'command':'checkSyntax', }, {'type':'MenuItem', 'name':'menuFileRun', 'label':'&Run\tCtrl+R', 'command':'fileRun', }, {'type':'MenuItem', 'name':'menuFileRunWithInterpreter', 'label':'Run with &interpreter\tCtrl+Shift+R', 'command':'fileRunWithInterpreter', }, {'type':'MenuItem', 'name':'menuFileRunOptions', 'label':'Run Options...', 'command':'fileRunOptions', }, {'type':'MenuItem', 'name':'fileSep2', 'label':'-', }, {'type':'MenuItem', 'name':'menuFilePageSetup', 'label':'Page Set&up...', }, {'type':'MenuItem', 'name':'menuFilePrint', 'label':'&Print...\tCtrl+P', }, {'type':'MenuItem', 'name':'menuFilePrintPreview', 'label':'Print Pre&view', }, {'type':'MenuItem', 'name':'fileSep2', 'label':'-', }, {'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit', }, ] }, {'type':'Menu', 'name':'Edit', 'label':'&Edit', 'items': [ {'type':'MenuItem', 'name':'menuEditUndo', 'label':'&Undo\tCtrl+Z', }, {'type':'MenuItem', 'name':'menuEditRedo', 'label':'&Redo\tCtrl+Y', }, {'type':'MenuItem', 'name':'editSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditCut', 'label':'Cu&t\tCtrl+X', }, {'type':'MenuItem', 'name':'menuEditCopy', 'label':'&Copy\tCtrl+C', }, {'type':'MenuItem', 'name':'menuEditPaste', 'label':'&Paste\tCtrl+V', }, {'type':'MenuItem', 'name':'editSep2', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditFind', 'label':'&Find...\tCtrl+F', 'command':'doEditFind', }, {'type':'MenuItem', 'name':'menuEditFindNext', 'label':'&Find Next\tF3', 'command':'doEditFindNext', }, {'type':'MenuItem', 'name':'menuEditFindFiles', 'label':'Find in Files...\tAlt+F3', 'command':'findFiles', }, {'type':'MenuItem', 'name':'menuEditReplace', 'label':'&Replace...\tCtrl+H', 'command':'doEditFindReplace', }, {'type':'MenuItem', 'name':'menuEditGoTo', 'label':'&Go To...\tCtrl+G', 'command':'doEditGoTo', }, {'type':'MenuItem', 'name':'editSep3', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditReplaceTabs', 'label':'&Replace tabs with spaces', 'command':'doEditReplaceTabs', }, {'type':'MenuItem', 'name':'editSep3', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditClear', 'label':'Cle&ar\tDel', }, {'type':'MenuItem', 'name':'menuEditSelectAll', 'label':'Select A&ll\tCtrl+A', }, {'type':'MenuItem', 'name':'editSep4', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditIndentRegion', 'label':'&Indent Region', 'command':'indentRegion', }, {'type':'MenuItem', 'name':'menuEditDedentRegion', 'label':'&Dedent Region', 'command':'dedentRegion', }, {'type':'MenuItem', 'name':'menuEditCommentRegion', 'label':'Comment &out region\tAlt+3', 'command':'commentRegion', }, {'type':'MenuItem', 'name':'menuEditUncommentRegion', 'label':'U&ncomment region\tShift+Alt+3', 'command':'uncommentRegion', }, ] }, {'type':'Menu', 'name':'menuView', 'label':'&View', 'items': [ {'type':'MenuItem', 'name':'menuViewWhitespace', 'label':'&Whitespace', 'checkable':1, }, {'type':'MenuItem', 'name':'menuViewIndentationGuides', 'label':'Indentation &guides', 'checkable':1, }, {'type':'MenuItem', 'name':'menuViewRightEdgeIndicator', 'label':'&Right edge indicator', 'checkable':1, }, {'type':'MenuItem', 'name':'menuViewEndOfLineMarkers', 'label':'&End-of-line markers', 'checkable':1, }, {'type':'MenuItem', 'name':'menuViewFixedFont', 'label':'&Fixed Font', 'enabled':0, 'checkable':1, }, {'type':'MenuItem', 'name':'viewSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuViewLineNumbers', 'label':'&Line Numbers', 'checkable':1, 'checked':1, }, {'type':'MenuItem', 'name':'menuViewCodeFolding', 'label':'&Code Folding', 'checkable':1, 'checked':0, }, ] }, {'type':'Menu', 'name':'menuFormat', 'label':'F&ormat', 'items': [ {'type':'MenuItem', 'name':'menuFormatStyles', 'label':'&Styles...', 'command':'doSetStyles', }, {'type':'MenuItem', 'name':'menuFormatWrap', 'label':'&Wrap Lines', 'checkable':1, }, ] }, {'type':'Menu', 'name':'menuScriptlet', 'label':'&Shell', 'items': [ {'type':'MenuItem', 'name':'menuScriptletShell', 'label':'&Shell Window\tF5', }, {'type':'MenuItem', 'name':'menuScriptletNamespace', 'label':'&Namespace Window\tF6', }, {'type':'MenuItem', 'name':'scriptletSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuScriptletSaveShellSelection', 'label':'Save Shell Selection...', }, {'type':'MenuItem', 'name':'menuScriptletRunScriptlet', 'label':'Run Scriptlet...', }, ] }, {'type':'Menu', 'name':'menuHelp', 'label':'&Help', 'items': [ {'type':'MenuItem', 'name':'menuShellDocumentation', 'label':'&Shell Documentation...', 'command':'showShellDocumentation', }, {'type':'MenuItem', 'name':'menuPythonCardDocumentation', 'label':'&PythonCard Documentation...\tF1', 'command':'showPythonCardDocumentation', }, {'type':'MenuItem', 'name':'menuPythonDocumentation', 'label':'Python &Documentation...', 'command':'showPythonDocumentation', }, {'type':'MenuItem', 'name':'helpSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuHelpAbout', 'label':'&About codeEditor...', 'command':'doHelpAbout', }, ] }, ] }, 'strings': { 'saveAs':'Save As', 'about':'About codeEditor...', 'saveAsWildcard':'All files (*.*)|*.*|Python scripts (*.py;*.pyw)|*.pyw;*.PY;*.PYW;*.py|Text files (*.txt;*.text)|*.text;*.TXT;*.TEXT;*.txt|HTML and XML files (*.htm;*.html;*.xml)|*.htm;*.xml;*.HTM;*.HTML;*.XML;*.html', 'chars':'chars', 'gotoLine':'Goto line', 'lines':'lines', 'gotoLineNumber':'Goto line number:', 'documentChangedPrompt':'The text in the %s file has changed.\n\nDo you want to save the changes?', 'untitled':'Untitled', 'sample':'codeEditor sample', 'codeEditor':'codeEditor', 'replaced':'Replaced %d occurances', 'words':'words', 'openFile':'Open file', 'scriptletWildcard':'Python files (*.py)|*.py|All Files (*.*)|*.*', 'document':'Document', }, 'components': [ {'type':'Choice', 'name':'popComponentNames', }, {'type':'Choice', 'name':'popComponentEvents', }, {'type':'CodeEditor', 'name':'document', 'position':(0, 0), 'size':(250, 100), }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/tools/codeEditor/Info.plist0000644000076500007650000000366010110701330020672 0ustar alexalex00000000000000 CFBundleDevelopmentRegion English CFBundleDocumentTypes CFBundleTypeExtensions c cgi c++ cp cpp cs css csv dtd h htm html log plist py python pyw sgml sh shtm shtml text txt xhtml xml xsl xslt yaml * CFBundleTypeMIMETypes text/plain CFBundleTypeName Python Module CFBundleTypeOSTypes TEXT **** CFBundleTypeRole Editor CFBundleExecutable CodeEditor CFBundleName CodeEditor CFBundleIdentifier CodeEditor CFBundlePackageType APPL CFBundleGetInfoString 0.8 CFBundleShortVersionString 0.8 CFBundleSignature ???? CFBundleVersion 0.8 (v1.124) CFBundleInfoDictionaryVersion 6.0 PythonCard-0.8.2/tools/codeEditor/macbuild.py0000644000076500007650000000404710135001656021067 0ustar alexalex00000000000000 import os, sys import bundlebuilder import plistlib # I set this to make adding subfolders into the package easier # KEA 2004-07-22 # rather than hard-coding the path # we'll just get the path from this module ##packageroot = "/Users/kevino/oss/eclass/eclass_builder" packageroot = os.path.abspath(os.path.dirname(__file__)) # for the purposes of building the standalone # change to the directory the build script is in to simplify imports os.chdir(packageroot) # Create the AppBuilder myapp = bundlebuilder.AppBuilder(verbosity=1) # Tell it where to find the main script - the one that loads on startup myapp.mainprogram = os.path.join(packageroot, "codeEditor.py") # drag&dropped filenames show up in sys.argv # this doesn't seem to work, need to add additional # import argvemulator in my code? #myapp.argv_emulation=1 # make this app self contained myapp.standalone = 1 myapp.name = "CodeEditor" myapp.plist = plistlib.Plist.fromFile(os.path.join(packageroot, "Info.plist")) # includePackages forces certain packages to be added to the app bundle ##myapp.includePackages.append("encodings") ##myapp.includePackages.append("_xmlplus") # Here you add supporting files and/or folders to your bundle myapp.resources.append(os.path.join(packageroot, "scriptlets")) myapp.resources.append(os.path.join(packageroot, "codeEditor.rsrc.py")) myapp.resources.append(os.path.join(packageroot, "..", "..", "templates", "dialogs", "runOptionsDialog.rsrc.py")) myapp.resources.append(os.path.join(packageroot, "..", "..", "pythoncard_config.txt")) myapp.resources.append(os.path.join(packageroot, "..", "..", "stc-styles.cfg")) # bundlebuilder does not yet have the capability to detect what shared libraries # are needed by your app - so in this case I am adding the wxPython libs manually myapp.libs.append("/usr/local/lib/wxPython-2.5.2.8/lib/libwx_macd-2.5.2.dylib") myapp.libs.append("/usr/local/lib/wxPython-2.5.2.8/lib/libwx_macd-2.5.2.rsrc") myapp.libs.append("/usr/local/lib/wxPython-2.5.2.8/lib/libwx_macd_stc-2.5.2.dylib") # Here we build the app! myapp.setup() myapp.build() PythonCard-0.8.2/tools/codeEditor/modules/0000755000076500007650000000000010434046772020412 5ustar alexalex00000000000000PythonCard-0.8.2/tools/codeEditor/modules/__init__.py0000644000076500007650000000003607465034231022517 0ustar alexalex00000000000000# turn modules into a package PythonCard-0.8.2/tools/codeEditor/modules/colorizer.py0000644000076500007650000001075510042754001022766 0ustar alexalex00000000000000""" MoinMoin - Python Source Parser KEA, modified for PythonCard to use wxSTC styles 2002-06-28 __version__ = "$Revision: 1.7 $" __date__ = "$Date: 2004/04/25 15:23:45 $" """ # Imports import cgi, sys, cStringIO import keyword, token, tokenize import os from PythonCard import configuration, STCStyleEditor cfg = STCStyleEditor.initFromConfig(configuration.getStyleConfigPath(), 'python') # cfg is a big tuple styles = cfg[3] styleDict = {} # build style dict based on given styles for numStyle in styles: num, style = STCStyleEditor.parsePropLine(numStyle) attributes = style.split(',') for a in attributes: if a.startswith('fore:'): foreColor = a[a.find(':')+1:] styleDict[num] = foreColor else: if num not in styleDict: styleDict[num] = "#000000" ############################################################################# ### Python Source Parser (does Hilighting) ############################################################################# _KEYWORD = token.NT_OFFSET + 1 _TEXT = token.NT_OFFSET + 2 """ _colors = { token.NUMBER: '#0080C0', token.OP: '#0000C0', token.STRING: '#004080', tokenize.COMMENT: '#008000', token.NAME: '#000000', token.ERRORTOKEN: '#FF8080', _KEYWORD: '#C00000', _TEXT: '#000000', } """ _colors = { token.NUMBER: styleDict[2], token.OP: styleDict[10], token.STRING: styleDict[3], tokenize.COMMENT: styleDict[1], token.NAME: styleDict[11], token.ERRORTOKEN: '#FF8080', _KEYWORD: styleDict[5], _TEXT: styleDict[0], } class Parser: """ Send colored python source. """ def __init__(self, raw, out = sys.stdout): """ Store the source text. """ self.raw = raw.expandtabs().strip() self.out = out def format(self, formatter, form): """ Parse and send the colored source. """ # store line offsets in self.lines self.lines = [0, 0] pos = 0 while 1: pos = self.raw.find('\n', pos) + 1 if not pos: break self.lines.append(pos) self.lines.append(len(self.raw)) # parse the source and write it self.pos = 0 text = cStringIO.StringIO(self.raw) self.out.write('
')
        try:
            tokenize.tokenize(text.readline, self)
        except tokenize.TokenError, ex:
            msg = ex[0]
            line = ex[1][0]
            self.out.write("

ERROR: %s

%s\n" % ( msg, self.raw[self.lines[line]:])) self.out.write('
') def __call__(self, toktype, toktext, (srow,scol), (erow,ecol), line): """ Token handler. """ if 0: print "type", toktype, token.tok_name[toktype], "text", toktext, print "start", srow,scol, "end", erow,ecol, "
" # calculate new positions oldpos = self.pos newpos = self.lines[srow] + scol self.pos = newpos + len(toktext) # handle newlines if toktype in [token.NEWLINE, tokenize.NL]: self.out.write('\n') return # send the original whitespace, if needed if newpos > oldpos: self.out.write(self.raw[oldpos:newpos]) # skip indenting tokens if toktype in [token.INDENT, token.DEDENT]: self.pos = newpos return # map token type to a color group if token.LPAR <= toktype and toktype <= token.OP: toktype = token.OP elif toktype == token.NAME and keyword.iskeyword(toktext): toktype = _KEYWORD color = _colors.get(toktype, _colors[_TEXT]) style = '' if toktype == token.ERRORTOKEN: style = ' style="border: solid 1.5pt #FF0000;"' # send text self.out.write('' % (color, style)) self.out.write(cgi.escape(toktext)) self.out.write('') if __name__ == "__main__": import os, sys print "Formatting..." # assume first argument is the filename filename = sys.argv[1] print filename url = filename + '.html' # open own source source = open(filename).read() # write colorized version to "python.html" Parser(source, open(url, 'wt')).format(None, None) print "Opening..." import webbrowser webbrowser.open(url, 1, 1) PythonCard-0.8.2/tools/codeEditor/modules/scriptutils.py0000644000076500007650000001010607603106520023337 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.3 $" __date__ = "$Date: 2002/12/27 17:26:40 $" modified version of Pythonwin scriptutils.py """ import os, sys import traceback # KEA 2002-05-08 # should probably refactor this so we're not passing around the background def CheckFile(background, pathName): what = "check" background.statusBar.text = what.capitalize()+'ing module...' try: f = open(pathName) except IOError, details: background.statusBar.text = "Cant open file '%s' - %s" % (pathName, details) return try: code = f.read() + "\n" finally: f.close() try: codeObj = compile(code, pathName,'exec') if RunTabNanny(background, pathName): #win32ui.SetStatusText("Python and the TabNanny successfully checked the file '"+os.path.basename(pathName)+"'") background.statusBar.text = "Python and the TabNanny successfully checked the file '"+os.path.basename(pathName)+"'" except SyntaxError: #background.statusBar.text = 'SyntaxError' _HandlePythonFailure(background, what, pathName) def RunTabNanny(background, filename): import cStringIO import tabnanny # Capture the tab-nanny output newout = cStringIO.StringIO() old_out = sys.stderr, sys.stdout sys.stderr = sys.stdout = newout try: tabnanny.check(filename) finally: # Restore output sys.stderr, sys.stdout = old_out data = newout.getvalue() if data: try: lineno = data.split()[1] lineno = int(lineno) _JumpToPosition(background, filename, lineno) try: # Try and display whitespace #GetActiveEditControl().SCISetViewWS(1) pass except: pass #win32ui.SetStatusText("The TabNanny found trouble at line %d" % lineno) background.statusBar.text = "The TabNanny found trouble at line %d" % lineno except (IndexError, TypeError, ValueError): background.statusBar.text = "The tab nanny complained, but I cant see where!" print data return 0 return 1 def _JumpToPosition(background, fileName, lineno, col = 1): #JumpToDocument(fileName, lineno, col) #print fileName, lineno, col doc = background.components.document doc.GotoLine(lineno - 1) if col == 1: pos = doc.PositionFromLine(lineno - 1) doc.SetSelection(pos, doc.GetLineEndPosition(lineno - 1)) doc.SetCurrentPos(pos) else: pos = doc.PositionFromLine(lineno - 1) + col - 1 doc.SetSelection(pos, pos) doc.SetCurrentPos(pos) def _HandlePythonFailure(background, what, syntaxErrorPathName = None): typ, details, tb = sys.exc_info() if typ == SyntaxError: try: msg, (fileName, line, col, text) = details if (not fileName or fileName =="") and syntaxErrorPathName: fileName = syntaxErrorPathName _JumpToPosition(background, fileName, line, col) except (TypeError, ValueError): msg = str(details) #win32ui.SetStatusText('Failed to ' + what + ' - syntax error - %s' % msg) background.statusBar.text = 'Failed to ' + what + ' - syntax error - %s' % msg else: traceback.print_exc() #win32ui.SetStatusText('Failed to ' + what + ' - ' + str(details) ) # KEA 2002-06-03 # this needs to be more robust, but it is better than nothing for # simple indentation errors #try: # see if we have something of the form # (line 10) # for an error message that indicates the line number # the proper solution is to probably get the line number from the # traceback stack frame but I don't know how to do that #print traceback.tb_lineno(tb) try: msg, (fileName, line, col, text) = details _JumpToPosition(background, fileName, line, col) except: pass background.statusBar.text = 'Failed to ' + what + ' - ' + str(details) tb = None # Clean up a cycle. PythonCard-0.8.2/tools/codeEditor/readme.txt0000644000076500007650000000715410051172244020734 0ustar alexalex00000000000000Python Source Code Editor The codeEditor sample in PythonCard is focused on being a simple to use Python source code editor. It is not intended to be a generic editor or replace vi(m), Emacs, etc. If you are already happy with your existing editing environment for Python source code, there is no particular reason you have to switch. codeEditor and the resourceEditor and shell will be more tightly integrated as the project progresses so that the user has a simple Integrated Development Environment (IDE) for building desktop applications without needing to use an external program for editing. Based on textEditor sample, but using wxStyledTextCtrl (wxSTC) For more information, see: PythonCard Editor (codeEditor) wiki page http://wiki.wxpython.org/index.cgi/PythonCardEditor wxStyledTextCtrl documentation http://wiki.wxpython.org/index.cgi/wxStyledTextCtrl If you use this sample as a real text editor then you should be careful to always work on backup copies of documents in case there are bugs that might corrupt your text. You can change the style used to display the source code; the style is also used by the PythonCard shell. The last position and size of the window will be saved in a user.config.txt file. The About dialog displays the current filename, character, word, and line count. Scriptlets See the following message in the archive for more info. http://aspn.activestate.com/ASPN/Mail/Message/PythonCard/1181106 Associating Python files with codeEditor on Windows These instructions are for Windows 2000. They may be slightly different on other versions of Windows. 1. Open the Explorer and choose "Folder Options..." under the "Tools" menu 2. Click on the "File Types" tab 3. Scroll down in the "Registered file types" list and select extension "PY Python File" 4. Click on the "Advanced" button 4a. You should be looking at an "Edit File Type" dialog with a list of Actions such as Edit and Open. Open is probably in bold since it is the default action usually associated with .py files. 5. Click on the "New..." button 5a. You should be looking at a "New Action" dialog 6. In the "Action:" field type in a label such as "Edit with PythonCard". This is the label that will show up in the context menu when you right-click on a .py file in the Explorer 7. in the "Application used to perform action:" field you need to specify the path to the Python executable as well as the location of the codeEditor.py file. On a Python 2.3.3 installation using the default installer this will look like: C:\Python23\pythonw.exe C:\Python23\Lib\site-packages\PythonCard\tools\codeEditor\codeEditor.py "%1" Substitute your own paths for the ones above and put quotes (") around the paths with spaces in them, if any. If you want a console when codeEditor.py runs, then use python.exe instead of pythonw.exe 8. Click "OK" 8a. You should now have an "Edit with PythonCard" item in your "Edit File Type" dialog 8b. The item in bold is the default action; Open will be the default if nothing is showing up in bold. Whether you want to "Edit with PythonCard" or "Open" (run) a script when you double-click a file in the Explorer is of course a personal preference. If you want "Edit with PythonCard" as the default action, then select "Edit with PythonCard" in the list, and click the "Set Default" button. 9. Click "OK" 10. Click "Close" in the "Folder Options" dialog 11. Open a directory in the explorer that contains a .py file, then right-click on the file and choose "Edit with PythonCard" and the file should be opened with codeEditor.py 11a. If it doesn't work, double-check the steps above 12. Repeat the process for .pyw files, using the same name and path. PythonCard-0.8.2/tools/codeEditor/restEditor.py0000644000076500007650000000703110113513155021425 0ustar alexalex00000000000000#!/usr/bin/env python """ __version__ = "$Revision: 1.7 $" __date__ = "$Date: 2004/08/27 02:03:25 $" """ import os from PythonCard import dialog, model from codeEditor import CodeEditor from wx import stc import webbrowser # reST from PythonCard.templates.htmlpreview import HtmlPreview from snippet import restify class RestEditor(CodeEditor): def on_initialize(self, event): super(RestEditor, self).on_initialize(event) self.renderOnReturn = self.menuBar.getChecked('menuFormatRenderOnReturn') self.previewWindow = model.childWindow(self, HtmlPreview) #self.previewWindow.position = (425, -1) self.previewWindow.visible = True self.html = '' # reST def on_previewPost_command(self, event): self.previewWindow.Show() txt = self.components.document.text if self.menuBar.getChecked('menuViewSourceIsHtml'): firstLine = txt[:10].lower() if firstLine.startswith('\n\n\n\n' + txt + '\n\n\n' else: # KEA 2004-08-15 # snippet.restify is returning None when there is a reST error # what's a better way to provide feedback to the user without barfing # all over the output? rest = restify(txt) if rest: html = '\n\n\n\n' + rest + '\n\n\n' else: html = self.previewWindow.components.html.text # do make sure stylesheets and relative image references can be found # might need to chdir here # won't work until there is a document path curdir = os.getcwd() self.previewWindow.components.html.text = html self.html = html os.chdir(curdir) def on_document_keyDown(self, event): if event.keyCode == 13 and self.renderOnReturn: # since we won't be calling skip, insert a newline manually self.components.document.CmdKeyExecute(stc.STC_CMD_NEWLINE) self.on_previewPost_command(None) else: event.skip() def saveHtmlFile(self, path): try: f = open(path, 'wb') try: f.write(self.html) finally: f.close() except: pass def on_saveHtml_command(self, event): wildcard = "HTML files (*.html)|*.html|All files (*.*)|*.*" #wildcard = self.resource.strings.saveAsWildcard if self.documentPath is None: dir = '' filename = '*.html' else: dir = os.path.dirname(self.documentPath) filename = os.path.splitext(os.path.basename(self.documentPath))[0] + '.html' result = dialog.saveFileDialog(None, self.resource.strings.saveAs, dir, filename, wildcard) if result.accepted: path = result.paths[0] self.saveHtmlFile(path) def on_menuFormatRenderOnReturn_select(self, event): self.renderOnReturn = self.menuBar.getChecked('menuFormatRenderOnReturn') def on_doHelpRest_command(self, event): webbrowser.open('http://docutils.sourceforge.net/rst.html') def on_doHelpRestQuickReference_command(self, event): webbrowser.open('http://docutils.sourceforge.net/docs/user/rst/quickref.html') if __name__ == '__main__': app = model.Application(RestEditor) app.MainLoop() PythonCard-0.8.2/tools/codeEditor/restEditor.rsrc.py0000644000076500007650000003502210113513155022376 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'codeEditor', 'backgrounds': [ {'type':'Background', 'name':'bgCodeEditor', 'title':'Code Editor PythonCard Application', 'size':(400, 300), 'statusBar':1, 'visible':0, 'style':['resizeable'], 'visible':0, 'menubar': {'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ {'type':'MenuItem', 'name':'menuFileNewWindow', 'label':'New Window', }, {'type':'MenuItem', 'name':'menuFileNew', 'label':'&New\tCtrl+N', }, {'type':'MenuItem', 'name':'menuFileOpen', 'label':'&Open\tCtrl+O', }, {'type':'MenuItem', 'name':'menuFileSave', 'label':'&Save\tCtrl+S', }, {'type':'MenuItem', 'name':'menuFileSaveAs', 'label':'Save &As...', }, {'type':'MenuItem', 'name':'menuFileSaveHtml', 'label':'Save HTML As...', 'command':'saveHtml', }, {'type':'MenuItem', 'name':'fileSep1', 'label':'-', }, ## {'type':'MenuItem', ## 'name':'menuFileCheckSyntax', ## 'label':'&Check Syntax (Module)\tAlt+F5', ## 'command':'checkSyntax', ## }, ## {'type':'MenuItem', ## 'name':'menuFileRun', ## 'label':'&Run\tCtrl+R', ## 'command':'fileRun', ## }, ## {'type':'MenuItem', ## 'name':'menuFileRunWithInterpreter', ## 'label':'Run with &interpreter\tCtrl+Shift+R', ## 'command':'fileRunWithInterpreter', ## }, ## {'type':'MenuItem', ## 'name':'menuFileRunOptions', ## 'label':'Run Options...', ## 'command':'fileRunOptions', ## }, ## {'type':'MenuItem', ## 'name':'fileSep2', ## 'label':'-', ## }, {'type':'MenuItem', 'name':'menuFilePageSetup', 'label':'Page Set&up...', }, {'type':'MenuItem', 'name':'menuFilePrint', 'label':'&Print...\tCtrl+P', }, {'type':'MenuItem', 'name':'menuFilePrintPreview', 'label':'Print Pre&view', }, {'type':'MenuItem', 'name':'fileSep2', 'label':'-', }, {'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit', }, ] }, {'type':'Menu', 'name':'Edit', 'label':'&Edit', 'items': [ {'type':'MenuItem', 'name':'menuEditUndo', 'label':'&Undo\tCtrl+Z', }, {'type':'MenuItem', 'name':'menuEditRedo', 'label':'&Redo\tCtrl+Y', }, {'type':'MenuItem', 'name':'editSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditCut', 'label':'Cu&t\tCtrl+X', }, {'type':'MenuItem', 'name':'menuEditCopy', 'label':'&Copy\tCtrl+C', }, {'type':'MenuItem', 'name':'menuEditPaste', 'label':'&Paste\tCtrl+V', }, {'type':'MenuItem', 'name':'editSep2', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditFind', 'label':'&Find...\tCtrl+F', 'command':'doEditFind', }, {'type':'MenuItem', 'name':'menuEditFindNext', 'label':'&Find Next\tF3', 'command':'doEditFindNext', }, {'type':'MenuItem', 'name':'menuEditFindFiles', 'label':'Find in Files...\tAlt+F3', 'command':'findFiles', }, {'type':'MenuItem', 'name':'menuEditReplace', 'label':'&Replace...\tCtrl+H', 'command':'doEditFindReplace', }, {'type':'MenuItem', 'name':'menuEditGoTo', 'label':'&Go To...\tCtrl+G', 'command':'doEditGoTo', }, {'type':'MenuItem', 'name':'editSep3', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditReplaceTabs', 'label':'&Replace tabs with spaces', 'command':'doEditReplaceTabs', }, {'type':'MenuItem', 'name':'editSep3', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditClear', 'label':'Cle&ar\tDel', }, {'type':'MenuItem', 'name':'menuEditSelectAll', 'label':'Select A&ll\tCtrl+A', }, {'type':'MenuItem', 'name':'editSep4', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditIndentRegion', 'label':'&Indent Region', 'command':'indentRegion', }, {'type':'MenuItem', 'name':'menuEditDedentRegion', 'label':'&Dedent Region', 'command':'dedentRegion', }, {'type':'MenuItem', 'name':'menuEditCommentRegion', 'label':'Comment &out region\tAlt+3', 'command':'commentRegion', }, {'type':'MenuItem', 'name':'menuEditUncommentRegion', 'label':'U&ncomment region\tShift+Alt+3', 'command':'uncommentRegion', }, ] }, {'type':'Menu', 'name':'menuView', 'label':'&View', 'items': [ {'type':'MenuItem', 'name':'menuViewWhitespace', 'label':'&Whitespace', 'checkable':1, }, {'type':'MenuItem', 'name':'menuViewIndentationGuides', 'label':'Indentation &guides', 'checkable':1, }, {'type':'MenuItem', 'name':'menuViewRightEdgeIndicator', 'label':'&Right edge indicator', 'checkable':1, }, {'type':'MenuItem', 'name':'menuViewEndOfLineMarkers', 'label':'&End-of-line markers', 'checkable':1, }, {'type':'MenuItem', 'name':'menuViewFixedFont', 'label':'&Fixed Font', 'enabled':0, 'checkable':1, }, {'type':'MenuItem', 'name':'viewSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuViewLineNumbers', 'label':'&Line Numbers', 'checkable':1, 'checked':1, }, {'type':'MenuItem', 'name':'menuViewCodeFolding', 'label':'&Code Folding', 'checkable':1, 'checked':0, }, {'type':'MenuItem', 'name':'viewSep2', 'label':'-', }, {'type':'MenuItem', 'name':'menuViewPreviewHTML', 'label':'&Preview HTML\tCtrl+1', 'command':'previewPost', }, {'type':'MenuItem', 'name':'menuViewSourceIsHtml', 'label':'Source is HTML', 'checkable':1, 'checked':0, }, ] }, {'type':'Menu', 'name':'menuFormat', 'label':'F&ormat', 'items': [ {'type':'MenuItem', 'name':'menuFormatStyles', 'label':'&Styles...', 'command':'doSetStyles', }, {'type':'MenuItem', 'name':'menuFormatWrap', 'label':'&Wrap Lines', 'checkable':1, }, {'type':'MenuItem', 'name':'formatSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuFormatRender', 'label':'Render Page\tCtrl+R', 'command':'previewPost', }, {'type':'MenuItem', 'name':'menuFormatRenderOnReturn', 'label':'Render on Return', 'checkable':1, 'checked':1, }, ] }, {'type':'Menu', 'name':'menuScriptlet', 'label':'&Shell', 'items': [ {'type':'MenuItem', 'name':'menuScriptletShell', 'label':'&Shell Window\tF5', }, {'type':'MenuItem', 'name':'menuScriptletNamespace', 'label':'&Namespace Window\tF6', }, {'type':'MenuItem', 'name':'menuScriptletSaveUserConfiguration', 'label':'Save &Configuration', }, {'type':'MenuItem', 'name':'menuShellChangeDirectory', 'label':'Change &Directory...', }, {'type':'MenuItem', 'name':'scriptletSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuScriptletSaveShellSelection', 'label':'Save Shell Selection...', }, {'type':'MenuItem', 'name':'menuScriptletRunScriptlet', 'label':'Run Scriptlet...', }, ] }, {'type':'Menu', 'name':'menuHelp', 'label':'&Help', 'items': [ {'type':'MenuItem', 'name':'menuShellDocumentation', 'label':'&Shell Documentation...', 'command':'showShellDocumentation', }, {'type':'MenuItem', 'name':'menuPythonCardDocumentation', 'label':'&PythonCard Documentation...\tF1', 'command':'showPythonCardDocumentation', }, {'type':'MenuItem', 'name':'menuPythonDocumentation', 'label':'Python &Documentation...', 'command':'showPythonDocumentation', }, {'type':'MenuItem', 'name':'helpSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuHelpRest', 'label':'reStructuredText Home Page', 'command':'doHelpRest', }, {'type':'MenuItem', 'name':'menuHelpRestQuickReference', 'label':'reStructuredText Quick Reference', 'command':'doHelpRestQuickReference', }, {'type':'MenuItem', 'name':'helpSep2', 'label':'-', }, {'type':'MenuItem', 'name':'menuHelpAbout', 'label':'&About codeEditor...', 'command':'doHelpAbout', }, {'type':'MenuItem', 'name':'menuHelpAboutPythonCard', 'label':'About PythonCard...', 'command':'doHelpAboutPythonCard', }, ] }, ] }, 'strings': { 'saveAs':'Save As', 'about':'About codeEditor...', 'saveAsWildcard':'All files (*.*)|*.*|Python scripts (*.py;*.pyw)|*.pyw;*.PY;*.PYW;*.py|Text files (*.txt;*.text)|*.text;*.TXT;*.TEXT;*.txt|HTML and XML files (*.htm;*.html;*.xml)|*.htm;*.xml;*.HTM;*.HTML;*.XML;*.html', 'chars':'chars', 'gotoLine':'Goto line', 'lines':'lines', 'gotoLineNumber':'Goto line number:', 'documentChangedPrompt':'The text in the %s file has changed.\n\nDo you want to save the changes?', 'untitled':'Untitled', 'sample':'codeEditor sample', 'codeEditor':'codeEditor', 'replaced':'Replaced %d occurances', 'words':'words', 'openFile':'Open file', 'scriptletWildcard':'Python files (*.py)|*.py|All Files (*.*)|*.*', 'document':'Document', }, 'components': [ {'type':'CodeEditor', 'name':'document', 'position':(0, 0), 'size':(250, 100), }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/tools/codeEditor/scriptlets/0000755000076500007650000000000010434046772021136 5ustar alexalex00000000000000PythonCard-0.8.2/tools/codeEditor/scriptlets/documentWordCount.py0000644000076500007650000000111610106740615025163 0ustar alexalex00000000000000import wx from PythonCard import dialog, util def wordCount(text): chars = len(text) words = len(text.split()) # this doesn't always match the getNumberOfLines() method # so this should probably be changed lines = len(text.splitlines()) return chars, words, lines if bg.documentPath is None: filename = 'Untitled' else: filename = os.path.basename(bg.documentPath) dialog.MessageDialog(bg, "Document: %s\n" % filename + "%d chars, %d words, %d lines" % wordCount(util.normalizeEOL(bg.components.document.text)), 'Word Count', wx.ICON_INFORMATION | wx.OK) PythonCard-0.8.2/tools/codeEditor/scriptlets/insertDateAndTime.py0000644000076500007650000000021707465012257025055 0ustar alexalex00000000000000import time now = time.localtime(time.time()) dateStr = time.strftime("%A, %B %d, %Y, %I:%M %p", now) comp.document.ReplaceSelection(dateStr) PythonCard-0.8.2/tools/codeEditor/scriptlets/insertDialog.py0000644000076500007650000000544710110454170024130 0ustar alexalex00000000000000from PythonCard import dialog alertDialogTemplate = """result = dialog.alertDialog(self, 'a message', 'a title') if result.accepted: returned = result.returnedString """ colorDialogTemplate = """result = dialog.colorDialog(self) if result.accepted: color = result.color """ directoryDialogTemplate = """result = dialog.directoryDialog(self, 'Choose a directory', '') if result.accepted: path = result.path """ findDialogTemplate = """result = dialog.findDialog(self) if result.accepted: searchText = result.searchText wholeWordsOnly = result.wholeWordsOnly caseSensitive = result.caseSensitive """ fontDialogTemplate = """result = dialog.fontDialog(self) if result.accepted: color = result.color font = result.font """ messageDialogTemplate = """result = dialog.messageDialog(self, 'a message', 'a title', wx.ICON_INFORMATION | wx.YES_NO | wx.NO_DEFAULT | wx.CANCEL) if result.accepted: returned = result.returnedString """ multipleChoiceDialogTemplate = """result = dialog.multipleChoiceDialog(self, "message", "title", ['one', 'two', 'three']) if result.accepted: sel = result.selection """ openFileDialogTemplate = """wildcard = "JPG files (*.jpg;*.jpeg)|*.jpg;*.jpeg;*.JPG;*.JPEG|GIF files (*.gif)|*.gif;*.GIF|All Files (*.*)|*.*" result = dialog.openFileDialog(self, 'Open', '', '', wildcard ) if result.accepted: path = result.paths[0] """ saveFileDialogTemplate = """wildcard = "JPG files (*.jpg;*.jpeg)|*.jpg;*.jpeg;*.JPG;*.JPEG|GIF files (*.gif)|*.gif;*.GIF|All Files (*.*)|*.*" result = dialog.saveFileDialog(self, 'Save', '', '', wildcard ) if result.accepted: path = result.paths[0] """ scrolledMessageDialogTemplate = """dialog.scrolledMessageDialog(self, 'message', 'title') if result.accepted: # you don't really need the accepted test, since there isn't a result # to check for a scrolledMessageDialog pass """ singleChoiceDialogTemplate = """result = dialog.singleChoiceDialog(self, "message", "title", ['one', 'two', 'three']) if result.accepted: sel = result.selection """ textEntryDialogTemplate = """result = dialog.textEntryDialog(self, 'message', 'title', 'text') if result.accepted: returned = result.returnedString text = result.text """ dialogsList = ['alertDialog', 'colorDialog', 'directoryDialog', 'findDialog', 'fontDialog', 'messageDialog', 'multipleChoiceDialog', 'openFileDialog', 'saveFileDialog', 'scrolledMessageDialog', 'singleChoiceDialog', 'textEntryDialog'] dialogsList.sort() result = dialog.singleChoiceDialog(None, "Pick a dialog:", "Dialogs", dialogsList) if result.accepted: dialogText = eval(result.selection + 'Template') # could get the current indent and insert the appropriate # number of spaces before each line of the template here comp.document.ReplaceSelection(dialogText) PythonCard-0.8.2/tools/codeEditor/scriptlets/selectionWordCount.py0000644000076500007650000000114710106740615025336 0ustar alexalex00000000000000import wx from PythonCard import dialog, util def wordCount(text): chars = len(text) words = len(text.split()) # this doesn't always match the getNumberOfLines() method # so this should probably be changed lines = len(text.splitlines()) return chars, words, lines if bg.documentPath is None: filename = 'Untitled' else: filename = os.path.basename(bg.documentPath) text = util.normalizeEOL(bg.components.document.GetSelectedText()) dialog.MessageDialog(bg, "Document: %s\n" % filename + "%d chars, %d words, %d lines" % wordCount(text), 'Word Count', wx.ICON_INFORMATION | wx.OK) PythonCard-0.8.2/tools/codeEditor/scriptlets/testIgnore.py0000644000076500007650000000016010053523531023616 0ustar alexalex00000000000000# ignore is a regular expression that will match the filenames # for the modules to exclude. ignore = '.*\.py$' PythonCard-0.8.2/tools/codeEditor/scriptlets/unorderedList.py0000644000076500007650000000035307465012257024335 0ustar alexalex00000000000000# inserts "\t* " before each line in the selection text = bg.components.document.GetSelectedText() unorderedList = "" for i in text.splitlines(1): unorderedList += "\t* " + i bg.components.document.ReplaceSelection(unorderedList) PythonCard-0.8.2/tools/codeEditor/snippet.py0000644000076500007650000000156410110023754020766 0ustar alexalex00000000000000from docutils import core from docutils.writers.html4css1 import Writer,HTMLTranslator from docutils.utils import SystemMessage class NoHeaderHTMLTranslator(HTMLTranslator): def __init__(self, document): HTMLTranslator.__init__(self,document) self.head_prefix = ['','','','',''] self.body_prefix = [] self.body_suffix = [] self.stylesheet = [] _w = Writer() _w.translator_class = NoHeaderHTMLTranslator def restify(string): # return core.publish_string(string,writer=_w) try: result = core.publish_string(string,writer=_w, settings_overrides={'traceback': True}) except SystemMessage, e: result = None print "barf" return result if __name__ == '__main__': test = """ Test example of reST__ document. __ http://docutils.sf.net/rst.html - item 1 - item 2 - item 3 """ print restify(test) PythonCard-0.8.2/tools/experimentalResourceEditor/0000755000076500007650000000000010434046772022235 5ustar alexalex00000000000000PythonCard-0.8.2/tools/experimentalResourceEditor/images/0000755000076500007650000000000010434046772023502 5ustar alexalex00000000000000PythonCard-0.8.2/tools/experimentalResourceEditor/images/sizingHandle.bmp0000644000076500007650000000033610137000312026577 0ustar alexalex00000000000000BMÞ6(¨ÔÔÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿPythonCard-0.8.2/tools/experimentalResourceEditor/modules/0000755000076500007650000000000010434046772023705 5ustar alexalex00000000000000PythonCard-0.8.2/tools/experimentalResourceEditor/modules/__init__.py0000644000076500007650000000003610137000312025771 0ustar alexalex00000000000000# turn modules into a package PythonCard-0.8.2/tools/experimentalResourceEditor/modules/actionBinderDialog.py0000644000076500007650000000410110165335055027770 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.2 $" __date__ = "$Date: 2004/12/31 20:44:29 $" """ from PythonCard import model class ActionBinderDialog(model.CustomDialog): def __init__(self, parent): model.CustomDialog.__init__(self, parent) self.resource_editor = parent for inst in self.resource_editor.components.keys(): if inst not in self.resource_editor.sizingHandleNames: self.components.sourceComponent.append(inst) self.components.destinationComponent.append(inst) # if some special setup is necessary, do it here # example from samples/dialogs/minimalDialog.py # self.components.field1.text = txt def on_sourceComponent_select(self, wx_event): the_widget = self.resource_editor.components[wx_event.stringSelection] self.components.sourceEvent.clear() for evt in the_widget._spec.getEventNames(): self.components.sourceEvent.append(evt) self.components.sourceComponent.selected = wx_event.stringSelection def on_btnApply_mouseClick(self, wx_event): sourceComponent = self.components.sourceComponent.stringSelection sourceEvent = self.components.sourceEvent.stringSelection destinationComponent = self.components.destinationComponent.stringSelection destinationFunction = self.components.destinationFunction.text if max(len(sourceComponent), len(sourceEvent), len(destinationComponent), len(destinationFunction)) == 0: return the_widget = self.resource_editor.components[sourceComponent] actionBindings = the_widget.actionBindings actionBindings[sourceEvent] = (destinationComponent, destinationFunction) self.resource_editor.documentChanged = True def runDialog(parent): dlg = ActionBinderDialog(parent) result = dlg.showModal() # stick your results into the result dictionary here # example from samples/dialogs/minimalDialog.py # result.text = dlg.components.field1.text dlg.destroy() return result PythonCard-0.8.2/tools/experimentalResourceEditor/modules/actionBinderDialog.rsrc.py0000644000076500007650000000140510137002764030741 0ustar alexalex00000000000000{'type':'CustomDialog', 'name':'Template', 'title':'Dialog Template', 'position':(41, 87), 'size':(711, 538), 'components': [ {'type':'Button', 'name':'btnApply', 'position':(596, 407), 'label':'&Apply', }, {'type':'TextField', 'name':'destinationFunction', 'position':(434, 10), 'size':(250, -1), }, {'type':'List', 'name':'destinationComponent', 'position':(300, 10), 'size':(-1, 421), 'items':[], }, {'type':'List', 'name':'sourceEvent', 'position':(155, 10), 'size':(-1, 421), 'items':[], }, {'type':'List', 'name':'sourceComponent', 'position':(10, 10), 'size':(-1, 421), 'items':[], }, ] # end components } # end CustomDialog PythonCard-0.8.2/tools/experimentalResourceEditor/modules/backgroundInfoDialog.py0000644000076500007650000000740110137000312030310 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.1 $" __date__ = "$Date: 2004/10/24 19:21:46 $" """ from PythonCard import dialog, model, util import os class BackgroundInfoDialog(model.CustomDialog): def __init__(self, aBg, rsrc): model.CustomDialog.__init__(self, aBg) self.parent = aBg # if some special setup is necessary, do it here self.components.fldName.text = rsrc.name self.components.fldTitle.text = rsrc.title self.components.fldPosition.text = str(rsrc.position) self.components.fldSize.text = str(rsrc.size) self.components.chkStatusBar.checked = rsrc.statusBar if rsrc.foregroundColor is not None: #self.components.fldForegroundColor.text = colorDescription(rsrc.foregroundColor) self.components.fldForegroundColor.text = str(rsrc.foregroundColor) if rsrc.backgroundColor is not None: #self.components.fldBackgroundColor.text = colorDescription(rsrc.backgroundColor) self.components.fldBackgroundColor.text = str(rsrc.backgroundColor) if rsrc.image is not None: self.components.fldImage.text = rsrc.image self.components.chkTiled.checked = rsrc.tiled self.components.chkVisible.checked = rsrc.visible self.components.chkResizeable.checked = (rsrc.style != []) if rsrc.icon is not None: self.components.fldIcon.text = rsrc.icon def on_btnForegroundColor_mouseClick(self, event): result = dialog.colorDialog(self, color=util.colorFromString(self.components.fldForegroundColor.text)) if result.accepted: self.components.fldForegroundColor.text = str(result.color) def on_btnBackgroundColor_mouseClick(self, event): result = dialog.colorDialog(self, color=util.colorFromString(self.components.fldBackgroundColor.text)) if result.accepted: self.components.fldBackgroundColor.text = str(result.color) def on_btnFile_mouseClick(self, event): result = dialog.openFileDialog() if result.accepted: path = result.paths[0] filename = util.relativePath(self.parent.filename, path) self.components.fldImage.text = filename def on_btnIconFile_mouseClick(self, event): wildcard = "Icon Files (*.ico)|*.ico|XPM Files (*.xpm)|*.xpm|All Files (*.*)|*.*" result = dialog.openFileDialog(wildcard=wildcard) if result.accepted: path = result.paths[0] filename = util.relativePath(self.parent.filename, path) self.components.fldIcon.text = filename def backgroundInfoDialog(parent, rsrc): dlg = BackgroundInfoDialog(parent, rsrc) result = dlg.showModal() if result.accepted: result.name = dlg.components.fldName.text result.title = dlg.components.fldTitle.text result.position = eval(dlg.components.fldPosition.text) result.size = eval(dlg.components.fldSize.text) result.statusBar = dlg.components.chkStatusBar.checked result.foregroundColor = util.colorFromString(dlg.components.fldForegroundColor.text) result.backgroundColor = util.colorFromString(dlg.components.fldBackgroundColor.text) if dlg.components.fldImage.text != '': result.image = dlg.components.fldImage.text else: result.image = None result.tiled = dlg.components.chkTiled.checked result.visible = dlg.components.chkVisible.checked if dlg.components.chkResizeable.checked: result.style = ['resizeable'] else: result.style = [] if dlg.components.fldIcon.text != '': result.icon = dlg.components.fldIcon.text else: result.icon = None dlg.destroy() return result PythonCard-0.8.2/tools/experimentalResourceEditor/modules/backgroundInfoDialog.rsrc.py0000644000076500007650000000616710137000312031270 0ustar alexalex00000000000000{'type':'CustomDialog', 'name':'backgroundInfo', 'title':'Background Info', 'size':(370, 380), 'components': [ {'type':'StaticText', 'name':'stcName', 'position':(10, 10), 'text':'Name:', }, {'type':'StaticText', 'name':'stcTitle', 'position':(10, 35), 'text':'Title:', }, {'type':'StaticText', 'name':'stcPosition', 'position':(10, 60), 'text':'Position:', }, {'type':'StaticText', 'name':'stcSize', 'position':(10, 85), 'text':'Size:', }, {'type':'StaticText', 'name':'stcForegroundColor', 'position':(10, 110), 'text':'Foreground color:', }, {'type':'StaticText', 'name':'stcBackgroundColor', 'position':(10, 135), #'size':(90, -1), 'text':'Background color:', }, {'type':'StaticText', 'name':'stcImage', 'position':(10, 160), 'text':'Image:', }, {'type':'StaticText', 'name':'stcIcon', 'position':(10, 210), 'text':'Icon:', }, {'type':'TextField', 'name':'fldName', 'position':(130, 5), }, {'type':'TextField', 'name':'fldTitle', 'position':(130, 30), 'size':(188, -1), }, {'type':'TextField', 'name':'fldPosition', 'position':(130, 55), 'size':(80, -1), }, {'type':'TextField', 'name':'fldSize', 'position':(130, 80), 'size':(80, -1), }, {'type':'TextField', 'name':'fldForegroundColor', 'position':(130, 110), 'size':(100, -1), }, {'type':'Button', 'name':'btnForegroundColor', 'position':(250, 110), 'label':'Color...', }, {'type':'TextField', 'name':'fldBackgroundColor', 'position':(130, 135), 'size':(100, -1), }, {'type':'Button', 'name':'btnBackgroundColor', 'position':(250, 135), 'label':'Color...', }, {'type':'TextField', 'name':'fldImage', 'position':(130, 160), 'size':(100, -1), }, {'type':'Button', 'name':'btnFile', 'position':(250, 160), 'label':'File...', }, {'type':'CheckBox', 'name':'chkTiled', 'position':(130, 185), 'size':(135, -1), 'checked':0, 'label':'Tile image', }, {'type':'TextField', 'name':'fldIcon', 'position':(130, 210), 'size':(100, -1), }, {'type':'Button', 'name':'btnIconFile', 'position':(250, 210), 'label':'File...', }, {'type':'CheckBox', 'name':'chkStatusBar', 'position':(130, 235), 'checked':0, 'label':'Status bar on window', }, {'type':'CheckBox', 'name':'chkVisible', 'position':(130, 260), 'size':(135, -1), 'checked':1, 'label':'Visible at startup', }, {'type':'CheckBox', 'name':'chkResizeable', 'position':(130, 285), 'size':(135, -1), 'checked':0, 'label':'Resizeable', }, {'type':'Button', 'name':'btnOK', 'position':(10, 320), 'label':'OK', 'default':1, 'id':5100, }, {'type':'Button', 'name':'btnCancel', 'position':(115, 320), 'label':'Cancel', 'id':5101, }, ] # end components } # end CustomDialog PythonCard-0.8.2/tools/experimentalResourceEditor/modules/dialogInfoDialog.py0000644000076500007650000000171510137000312027432 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.1 $" __date__ = "$Date: 2004/10/24 19:21:46 $" """ from PythonCard import dialog, model import os class DialogInfoDialog(model.CustomDialog): def __init__(self, aBg, rsrc): model.CustomDialog.__init__(self, aBg) self.parent = aBg # if some special setup is necessary, do it here self.components.fldName.text = rsrc.name self.components.fldTitle.text = rsrc.title self.components.fldPosition.text = str(rsrc.position) self.components.fldSize.text = str(rsrc.size) def dialogInfoDialog(parent, rsrc): dlg = DialogInfoDialog(parent, rsrc) result = dlg.showModal() if result.accepted: result.name = dlg.components.fldName.text result.title = dlg.components.fldTitle.text result.position = eval(dlg.components.fldPosition.text) result.size = eval(dlg.components.fldSize.text) dlg.destroy() return result PythonCard-0.8.2/tools/experimentalResourceEditor/modules/dialogInfoDialog.rsrc.py0000644000076500007650000000247610137000312030407 0ustar alexalex00000000000000{'type':'CustomDialog', 'name':'dialogInfo', 'title':'Dialog Info', 'size':(370, 170), 'components': [ {'type':'StaticText', 'name':'stcName', 'position':(10, 10), 'size':(45, -1), 'text':'Name:', }, {'type':'StaticText', 'name':'stcTitle', 'position':(10, 35), 'size':(45, -1), 'text':'Title:', }, {'type':'StaticText', 'name':'stcPosition', 'position':(10, 60), 'size':(45, -1), 'text':'Position:', }, {'type':'StaticText', 'name':'stcSize', 'position':(10, 85), 'size':(45, -1), 'text':'Size:', }, {'type':'TextField', 'name':'fldName', 'position':(110, 5), 'size':(188, -1), }, {'type':'TextField', 'name':'fldTitle', 'position':(110, 30), 'size':(188, -1), }, {'type':'TextField', 'name':'fldPosition', 'position':(110, 55), 'size':(68, -1), }, {'type':'TextField', 'name':'fldSize', 'position':(110, 80), 'size':(68, -1), }, {'type':'Button', 'name':'btnOK', 'position':(10, 110), 'label':'OK', 'default':1, 'id':5100, }, {'type':'Button', 'name':'btnCancel', 'position':(115, 110), 'label':'Cancel', 'id':5101, }, ] # end components } # end CustomDialog PythonCard-0.8.2/tools/experimentalResourceEditor/modules/menuDialog.py0000644000076500007650000003346610137000312026333 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.1 $" __date__ = "$Date: 2004/10/24 19:21:46 $" """ from PythonCard import log, model, resource import os import wx MENULIST_PADDING = '....' def menuItemAttributes(menuItem): desc = " {'type':'MenuItem',\n" desc += " 'name':'%s',\n" % menuItem['name'] # KEA 2002-05-16 # work on string repr to get strings with mixed ' and " to work correctly if menuItem['shortcut'] == '': desc += """ 'label':%s,\n""" % repr(menuItem['label']) else: desc += """ 'label':%s,\n""" % repr(menuItem['label'] + '\t' + menuItem['shortcut']) try: if menuItem['command'] is not None: desc += " 'command':'%s',\n" % menuItem['command'] except: pass try: if not menuItem['enabled']: desc += " 'enabled':0,\n" except: pass try: if menuItem['checkable']: desc += " 'checkable':1,\n" if menuItem['checked']: desc += " 'checked':1,\n" except: pass desc += " },\n" return desc def menuAttributes(menu): desc = " {'type':'Menu',\n" desc += " 'name':'%s',\n" % menu['name'] desc += """ 'label':%s,\n""" % repr(menu['label']) desc += " 'items': [\n" return desc def menuResourceFromList(menuList): #desc = " 'menubar': {'type':'MenuBar',\n" desc = "{'type':'MenuBar',\n" desc += " 'menus': [\n" inMenu = 0 for m in menuList: if m['type'] == 'Menu': if inMenu: # close Menu desc += " ]\n" desc += " },\n" desc += menuAttributes(m) inMenu = 1 else: desc += menuItemAttributes(m) # close Menu desc += " ]\n" desc += " },\n" # close MenuBar desc += " ]\n" desc += "}\n" d = eval(desc) return resource.Resource(d) class MenuDialog(model.CustomDialog): def __init__(self, aBg, rsrc): model.CustomDialog.__init__(self, aBg) self.parent = aBg # if some special setup is necessary, do it here if rsrc is not None: #aBg.printMenubar(rsrc) self.menuList = self.parseMenus(rsrc) else: self.menuList = [] for m in self.menuList: if m['type'] == 'Menu': self.components.listMenus.append(m['label']) else: self.components.listMenus.append(MENULIST_PADDING + m['label']) #self.components.listMenus.items = self.parseMenus(rsrc) # Esc doesn't seem to work, it ends up closing the dialog # so need to work on that self.keyCodes = {wx.WXK_ESCAPE:'ESC', wx.WXK_SPACE:'Space', wx.WXK_DELETE:'Del', wx.WXK_F1:'F1', wx.WXK_F2:'F2', wx.WXK_F3:'F3', wx.WXK_F4:'F4', wx.WXK_F5:'F5', wx.WXK_F6:'F6', wx.WXK_F7:'F7', wx.WXK_F8:'F8', wx.WXK_F9:'F9', wx.WXK_F10:'F10', wx.WXK_F11:'F11', wx.WXK_F12:'F12', } #self.components.fldName.text = rsrc.application.name #self.components.fldTitle.text = rsrc.application.title #self.components.fldPosition.text = str(rsrc.application.position) #self.components.fldSize.text = str(rsrc.application.size) #self.components.chkStatusBar.checked = rsrc.application.statusBar def buildMenu(self, name, label): m = {} m['type'] = 'Menu' m['name'] = name m['label'] = label return m def buildMenuItem(self, name, label, shortcut, command, enabled, checkable, checked): m = {} m['type'] = 'MenuItem' m['name'] = name m['label'] = label m['shortcut'] = shortcut m['command'] = command m['enabled'] = enabled m['checkable'] = checkable m['checked'] = checked return m def parseMenus(self, menubar): menuList = [] for menu in menubar.menus: #menuList.append(menu.label) #print menu.type, menu.name, menu.label menuList.append(self.buildMenu(menu.name, menu.label)) for menuItem in menu.items: itemParts = menuItem.label.split("\t") label = itemParts[0] try: shortcut = itemParts[1] except: shortcut = '' #menuList.append("....%s" % itemParts[0]) #print menuItem.type, menuItem.name, itemParts, menuItem.command, menuItem.enabled, menuItem.checkable, menuItem.checked menuList.append(self.buildMenuItem(menuItem.name, label, shortcut, menuItem.command, menuItem.enabled, menuItem.checkable, menuItem.checked)) return menuList def on_fldShortcut_keyDown(self, event): # this should handle the special key codes keyCode = event.keyCode if keyCode > 32 and keyCode < 127: keyStr = chr(keyCode).upper() elif keyCode in self.keyCodes: keyStr = self.keyCodes[keyCode] else: event.target.text = '' return if event.shiftDown: keyStr = 'Shift+' + keyStr if event.altDown: keyStr = 'Alt+' + keyStr if event.controlDown: keyStr = 'Ctrl+' + keyStr if len(keyStr) > 1: # don't allow just a number or letter # without a modifier # might also need a leading Ctrl or Alt event.target.text = keyStr def on_fldShortcut_keyPress(self, event): pass def on_fldName_loseFocus(self, event): sel = self.components.listMenus.selection try: self.menuList[sel]['name'] = event.target.text log.info(self.menuList[sel]) except: pass def on_fldLabel_loseFocus(self, event): def normalize(label): name = label.replace("&", "").replace(".", "").replace(" ", "") return name sel = self.components.listMenus.selection try: label = event.target.text if self.menuList[sel]['type'] == 'Menu' and self.menuList[sel]['label'] == 'New Menu': oldname = self.menuList[sel]['name'] if oldname == 'menuNewMenu': name = 'menu'+normalize(label) self.menuList[sel]['name'] = name self.components.fldName.text = name elif self.menuList[sel]['type'] == 'MenuItem' and self.menuList[sel]['label'] == 'New Item': oldname = self.menuList[sel]['name'] menuname = 'menuMenu' for i in range(sel+1): if self.menuList[sel-i]['type'] == 'Menu': menuname = self.menuList[sel-i]['name'] break if oldname == menuname+'NewItem': name = menuname+normalize(label) self.menuList[sel]['name'] = name self.components.fldName.text = name self.menuList[sel]['label'] = label if self.menuList[sel]['type'] == 'MenuItem': label = MENULIST_PADDING + label self.components.listMenus.setString(sel, label) log.info(self.menuList[sel]) except: pass def on_fldShortcut_loseFocus(self, event): sel = self.components.listMenus.selection try: if self.menuList[sel]['type'] == 'MenuItem': self.menuList[sel]['shortcut'] = event.target.text log.info(self.menuList[sel]) except: pass def on_fldCommand_loseFocus(self, event): sel = self.components.listMenus.selection try: if self.menuList[sel]['type'] == 'MenuItem': if event.target.text == '': self.menuList[sel]['command'] = None else: self.menuList[sel]['command'] = event.target.text log.info(self.menuList[sel]) except: pass def on_chkEnabled_mouseClick(self, event): sel = self.components.listMenus.selection try: if self.menuList[sel]['type'] == 'MenuItem': self.menuList[sel]['enabled'] = event.target.checked log.info(self.menuList[sel]) except: pass def on_chkCheckable_mouseClick(self, event): sel = self.components.listMenus.selection try: if self.menuList[sel]['type'] == 'MenuItem': self.menuList[sel]['checkable'] = event.target.checked log.info(self.menuList[sel]) except: pass def on_chkChecked_mouseClick(self, event): sel = self.components.listMenus.selection try: if self.menuList[sel]['type'] == 'MenuItem': self.menuList[sel]['checked'] = event.target.checked log.info(self.menuList[sel]) except: pass def displayItemAttributes(self, sel): m = self.menuList[sel] self.components.fldListIndex.text = str(sel) self.components.fldName.text = m['name'] self.components.fldLabel.text = m['label'] if m['type'] == 'MenuItem': self.components.fldShortcut.text = m['shortcut'] if m['command'] is None: self.components.fldCommand.text = '' else: self.components.fldCommand.text = m['command'] self.components.chkEnabled.checked = m['enabled'] self.components.chkCheckable.checked = m['checkable'] self.components.chkChecked.checked = m['checked'] self.components.stcShortcut.visible = 1 self.components.stcCommand.visible = 1 self.components.fldShortcut.visible = 1 self.components.fldCommand.visible = 1 self.components.chkEnabled.visible = 1 self.components.chkCheckable.visible = 1 self.components.chkChecked.visible = 1 else: self.components.stcShortcut.visible = 0 self.components.stcCommand.visible = 0 self.components.fldShortcut.visible = 0 self.components.fldCommand.visible = 0 self.components.chkEnabled.visible = 0 self.components.chkCheckable.visible = 0 self.components.chkChecked.visible = 0 def on_listMenus_select(self, event): self.displayItemAttributes(event.target.selection) def rebuildListMenus(self, sel=-1): self.components.listMenus.clear() for m in self.menuList: if m['type'] == 'Menu': self.components.listMenus.append(m['label']) else: self.components.listMenus.append(MENULIST_PADDING + m['label']) if sel != -1: self.components.listMenus.selection = sel def on_btnUp_mouseClick(self, event): sel = self.components.listMenus.selection # a selection of -1 means no selection # a selection of 0 is the first item in the list if sel > 0: temp = self.menuList[sel] self.menuList[sel] = self.menuList[sel - 1] self.menuList[sel - 1] = temp self.rebuildListMenus(sel - 1) def on_btnDown_mouseClick(self, event): sel = self.components.listMenus.selection if sel != -1 and sel < len(self.menuList) - 1: temp = self.menuList[sel] self.menuList[sel] = self.menuList[sel + 1] self.menuList[sel + 1] = temp self.rebuildListMenus(sel + 1) def on_btnDelete_mouseClick(self, event): sel = self.components.listMenus.selection if sel != -1: del self.menuList[sel] self.components.listMenus.delete(sel) if len(self.menuList) > 0: if sel > 0: sel = sel - 1 self.components.listMenus.selection = sel self.displayItemAttributes(sel) def on_btnNewMenu_mouseClick(self, event): sel = self.components.listMenus.selection self.menuList.append(" ") # extend list if sel == -1: sel = len(self.menuList) - 1 else: self.menuList[sel+1:] = self.menuList[sel:-1] sel = sel+1 self.menuList[sel] = self.buildMenu('menuNewMenu', 'New Menu') self.rebuildListMenus(sel) self.displayItemAttributes(sel) def on_btnNewMenuItem_mouseClick(self, event): sel = self.components.listMenus.selection self.menuList.append(" ") # extend list if sel == -1: sel = len(self.menuList) - 1 else: self.menuList[sel+1:] = self.menuList[sel:-1] sel = sel+1 name = 'menuMenu' for i in range(1, sel+1): if self.menuList[sel-i]['type'] == 'Menu': name = self.menuList[sel-i]['name'] break self.menuList[sel] = self.buildMenuItem(name+'NewItem', 'New Item', '', None, 1, 0, 0) self.rebuildListMenus(sel) self.displayItemAttributes(sel) def menuDialog(parent, rsrc): dlg = MenuDialog(parent, rsrc) result = dlg.showModal() if result.accepted: if len(dlg.menuList) == 0: result.menubar = None else: result.menubar = menuResourceFromList(dlg.menuList) dlg.destroy() return result PythonCard-0.8.2/tools/experimentalResourceEditor/modules/menuDialog.rsrc.py0000644000076500007650000000453510137000312027276 0ustar alexalex00000000000000{'type':'CustomDialog', 'name':'menuDialog', 'title':'Menu Editor', 'size':(480, 300), 'components': [ {'type':'List', 'name':'listMenus', 'position':(0, 0), 'size':(185, 185), 'items':[], }, {'type':'Button', 'name':'btnUp', 'position':(5, 190), 'size':(50, -1), 'label':'Up', }, {'type':'Button', 'name':'btnDown', 'position':(60, 190), 'size':(60, -1), 'label':'Down', }, {'type':'Button', 'name':'btnDelete', 'position':(125, 190), 'size':(60, -1), 'label':'Delete', }, {'type':'StaticText', 'name':'stcName', 'position':(200, 10), 'text':'Name:', }, {'type':'StaticText', 'name':'stcLabel', 'position':(200, 35), 'text':'Label:', }, {'type':'StaticText', 'name':'stcShortcut', 'position':(200, 60), 'text':'Shortcut:', }, {'type':'StaticText', 'name':'stcCommand', 'position':(200, 85), 'text':'Command:', }, {'type':'TextField', 'name':'fldListIndex', 'position':(460, 5), 'visible':False, }, {'type':'TextField', 'name':'fldName', 'position':(275, 5), 'size':(188, -1), }, {'type':'TextField', 'name':'fldLabel', 'position':(275, 30), 'size':(188, -1), }, {'type':'TextField', 'name':'fldShortcut', 'position':(275, 55), 'size':(188, -1), }, {'type':'TextField', 'name':'fldCommand', 'position':(275, 80), 'size':(188, -1), }, {'type':'CheckBox', 'name':'chkEnabled', 'position':(275, 110), 'checked':True, 'label':'Enabled', }, {'type':'CheckBox', 'name':'chkCheckable', 'position':(275, 135), 'label':'Checkable', }, {'type':'CheckBox', 'name':'chkChecked', 'position':(275, 160), 'label':'Checked', }, {'type':'Button', 'name':'btnNewMenu', 'position':(220, 190), 'label':'New Menu', }, {'type':'Button', 'name':'btnNewMenuItem', 'position':(320, 190), 'label':'New MenuItem', }, {'type':'Button', 'id':5100, 'name':'btnOK', 'position':(10, 240), 'default':1, 'label':'OK', }, {'type':'Button', 'id':5101, 'name':'btnCancel', 'position':(115, 240), 'label':'Cancel', }, ] # end components } # end CustomDialog PythonCard-0.8.2/tools/experimentalResourceEditor/modules/newComponentDialog.py0000644000076500007650000000356410137000312030037 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.1 $" __date__ = "$Date: 2004/10/24 19:21:46 $" """ from PythonCard import model class NewComponentDialog(model.CustomDialog): def __init__(self, aBg, original, attributes, offsets, title): model.CustomDialog.__init__(self, aBg) self.parent = aBg self.title = title if title.startswith("New"): add = "" else: add = "Copy" self.components.fldName.text = original['name'] + add if "label" in attributes: self.components.lblLabelOrText.text = "Label:" if "label" in original.keys(): self.components.fldLabelOrText.text = original['label'] + add else: self.components.fldLabelOrText.text = original['name'] + add elif "text" in attributes: self.components.lblLabelOrText.text = "Text:" if "text" in original.keys(): self.components.fldLabelOrText.text = original['text'] + add else: self.components.fldLabelOrText.text = original['name'] + add else: self.components.lblLabelOrText.visible = False self.components.fldLabelOrText.visible = False self.components.fldLabelOrText.enabled = False self.components.chkHorizontal.visible = offsets self.components.chkVertical.visible = offsets def newComponentDialog(aBg, original, attributes, offsets, title): dlg = NewComponentDialog(aBg, original, attributes, offsets, title) result = dlg.showModal() if result.accepted: result.name = dlg.components.fldName.text result.labelortext = dlg.components.fldLabelOrText.text result.horizontal = dlg.components.chkHorizontal.checked result.vertical = dlg.components.chkVertical.checked dlg.destroy() return result PythonCard-0.8.2/tools/experimentalResourceEditor/modules/newComponentDialog.rsrc.py0000644000076500007650000000216610137000312031004 0ustar alexalex00000000000000{'type':'CustomDialog', 'name':'Template', 'title':'Dialog Template', 'size':(300, 170), 'components': [ {'type':'TextField', 'name':'fldName', 'position':(60, 9), 'size':(230, -1), }, {'type':'TextField', 'name':'fldLabelOrText', 'position':(60, 40), 'size':(230, -1), }, {'type':'CheckBox', 'name':'chkHorizontal', 'position':(10, 80), 'label':'Offset Horizontally', }, {'type':'CheckBox', 'name':'chkVertical', 'position':(170, 80), 'label':'Offset Vertically', }, {'type':'Button', 'id':5100, 'name':'btnOK', 'position':(30, 110), 'label':'OK', }, {'type':'Button', 'id':5101, 'name':'btnCancel', 'position':(130, 110), 'label':'Cancel', }, {'type':'StaticText', 'name':'lblLabelOrText', 'position':(5, 40), 'size':(50, -1), 'alignment':'right', 'text':'Label:', }, {'type':'StaticText', 'name':'lblName', 'position':(5, 10), 'size':(50, -1), 'alignment':'right', 'text':'Name:', }, ] # end components } # end CustomDialog PythonCard-0.8.2/tools/experimentalResourceEditor/modules/propertyEditor.py0000644000076500007650000004776610165335055027332 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.2 $" __date__ = "$Date: 2004/12/31 20:44:29 $" """ from PythonCard import dialog, font, model, registry, util from PythonCard.event import ChangeListener import resourceOutput import time import os import string import wx # KEA this is a load of dingos' kidneys and needs to be rewritten # 2002-02-22 # now I'm compounding the problem by porting from the original # Property Editor to a PythonCard background class PropertyEditor(model.Background, ChangeListener): def on_initialize(self, event): self._parent = self.GetParent() self._comp = self._parent.components self._updatingComponent = 0 self.autoAttributeUpdate = True ##self.components.addChangeEventListener(self) self._comp.addChangeEventListener(self) self.checkItems = ['enabled', 'visible', 'editable', 'checked', 'default', \ 'rules', 'labels', 'ticks', 'horizontalScrollbar'] self.popItems = ['layout', 'border', 'style', 'alignment', 'stringSelection'] self.cantModify = ['id', 'name', 'alignment', 'layout', 'style', 'border', \ 'horizontalScrollbar', 'min', 'max', 'columns', 'rules', 'labels', 'ticks'] self.editItems = [self.components.wField, self.components.wColor, self.components.wFont, self.components.wTextArea, self.components.wChecked, self.components.wPop, self.components.wFile,] # KEA 2001-08-14 # this was causing an assertion error with the hybrid wxPython #self.components.wComponentList.SetSelection(0) if self.components.wComponentList.stringSelection == "": wClass = "" else: wName, wClass = self.components.wComponentList.stringSelection.split(" : ") self.setValidProps(wClass) #self.displayComponents(self.components) self.displayComponents(self._comp) self.visible = True # KEA 2004-08-23 # support updating of attributes without the need # for clicking the Update button def on_wField_closeField(self, event): if self.autoAttributeUpdate: self.updateComponent() def on_wTextArea_closeField(self, event): if self.autoAttributeUpdate: self.updateComponent() def on_wChecked_mouseClick(self, event): if self.autoAttributeUpdate: self.updateComponent() def on_wPop_select(self, event): if self.autoAttributeUpdate: self.updateComponent() def on_wColor_mouseClick(self, event): result = dialog.colorDialog(self, color=util.colorFromString(self.components.wField.text)) if result.accepted: self.components.wField.text = str(result.color) if self.autoAttributeUpdate: self.updateComponent() def on_wFont_mouseClick(self, event): wName, wClass = self.components.wComponentList.stringSelection.split(" : ") ##widget = self.components[wName] widget = self._comp[wName] f = widget.font if f is None: desc = font.fontDescription(widget.GetFont()) f = font.Font(desc) result = dialog.fontDialog(self, f) if result.accepted: #color = dlg.getColor() f = result.font #self.components.wField.SetValue("%s;%s" % (f, color)) self.components.wField.text = "%s" % f if self.autoAttributeUpdate: self.updateComponent() def on_wFile_mouseClick(self, event): path, filename = os.path.split(self.components.wField.text) result = dialog.openFileDialog(self, directory=path, filename=filename) if result.accepted: self.components.wField.text = util.relativePath(self._parent.filename, result.paths[0]) if self.autoAttributeUpdate: self.updateComponent() def addWidgetToComponentList(self, widget): wName = widget.name # KEA 2004-01-25 # just use __name__, the other code must have been something from wxPython 2.3 #wClass = str(widget.__class__).split('.') #self.components.wComponentList.Append(wName + " : " + wClass[len(wClass) - 1]) wClass = widget.__class__.__name__ self.components.wComponentList.Append(wName + " : " + wClass) # KEA 2002-02-23 # need to redo the logic below to avoid asserts in hybrid # versions of wxPython, but also be cleaner def deleteWidgetFromComponentList(self, wName, wClass): i = self.components.wComponentList.GetSelection() j = self.components.wComponentList.FindString(wName + " : " + wClass) if i == -1 or i != j: if j != -1: self.components.wComponentList.Delete(j) else: if j > 0: self.components.wComponentList.SetSelection(j - 1) if j != -1: self.components.wComponentList.Delete(j) if self.components.wComponentList.GetSelection() == -1: self.setValidProps("") self.hideAllBut(self.components.wField) else: wName, wClass = self.components.wComponentList.stringSelection.split(" : ") # deselect the name from properties list self.setValidProps(wClass) propName = self.components.wPropertyList.stringSelection if propName == "": propName = "name" self.components.wPropertyList.stringSelection = "name" self.displayProperty(wName, wClass, propName) def selectComponentList(self, wName, wClass): self.components.wComponentList.stringSelection = wName + " : " + wClass self.setValidProps(wClass) propName = self.components.wPropertyList.stringSelection #print propName if propName == "": propName = "name" self.components.wPropertyList.stringSelection = "name" self.displayProperty(wName, wClass, propName) c = self._parent.components[wName] if hasattr(c, 'position'): # AB 2004-12-31 # Don't set a tooltip pos for components that don't have a pos - they aren't displayed. self._parent.setToolTipDrag(wName, c.position, c.size) def changed(self, event): ##comp = self.components if self._updatingComponent: # KEA 2003-01-04 # hack to speed up updates in place return comp = self._comp wName, wClass = event.getOldValue().split(",") if wName in comp: # new item added self.addWidgetToComponentList(comp[wName]) else: # item deleted self.deleteWidgetFromComponentList(wName, wClass) """ def on_wCopy_mouseClick(self, event): wName, wClass = self.components.wComponentList.stringSelection.split(" : ") # what needs to happen here is to have a method for the Widget class that # will provide a valid resource description, each subclass of widget would # override the method to deal with their specific resource attributes # the Widget class should provide some ordering so that 'type', # 'position', 'size' comes before less commonly used items, the actual # ordering could just be defined in a list, so it is easy to change # also, if the current values match the defaults for a widget attribute # then that attribute should not be provided as part of the output print "this is just a placeholder method right now," print "the resource is not actually copied to the clipboard yet" pprint.pprint(self._comp[wName]) """ def on_wUpdate_mouseClick(self, event): self.updateComponent() def updateComponent(self): wName, wClass = self.components.wComponentList.stringSelection.split(" : ") propName = self.components.wPropertyList.stringSelection if propName in self.checkItems: value = self.components.wChecked.checked elif propName in self.popItems: value = self.components.wPop.stringSelection elif propName in ('items', 'userdata') or (wClass == 'TextArea' and propName == 'text'): value = self.components.wTextArea.text else: #value = self.components.wField.GetValue() value = self.components.wField.text if propName not in ['label', 'stringSelection', 'text', 'toolTip', 'userdata']: try: value = eval(value) except: pass # KEA 2004-05-10 # need to figure out where to stick validation code # but for now just need to make sure that if we're changing the name # attribute that it is valid, but similar checks will be necessary for # integer fields, a list of items, etc. # also maybe each attribute should have a doc or help string displayed # saying what the attribute does, example values, etc. if propName == 'name': badValue = False # if it isn't valid then display an alert and exit # must start with a letter and only contain alphanumeric characters if value == "" or value[0] not in string.ascii_letters: badValue = True else: alphanumeric = string.ascii_letters + string.digits for c in value: if c not in alphanumeric: badValue = True break if badValue: dialog.alertDialog(None, "Name must start with a letter and only contain letters and numbers.", 'Error: Name is invalid') self.components.wField.setFocus() self.components.wField.setSelection(-1, -1) return # check for duplicate names is done below ##widget = self.components[wName] widget = self._comp[wName] # KEA 2002-02-23 # I can't remember why this is actually necessary if propName == 'size': width, height = value if wClass not in ['BitmapCanvas', 'HtmlWindow']: bestWidth, bestHeight = widget.GetBestSize() if width == -1: width = bestWidth if height == -1: height = bestHeight widget.size = (width, height) #setattr(widget, propName, (width, height)) #print widget.size, propName, width, height else: if (propName in self.cantModify) or \ (propName == 'items' and wClass == 'RadioGroup'): order = self._comp.order.index(wName) desc = resourceOutput.widgetAttributes(self._parent, widget) if desc.endswith(',\n'): desc = eval(desc[:-2]) else: desc = eval(desc) if propName == 'name': if value == wName: # user didn't actually change the name return elif value in self._comp: # we already have a component with that name dialog.alertDialog(self, 'Another component already exists with the name ' + value, 'Error: unable to rename component') return if value is None: desc[propName] = 'none' elif propName in ['min', 'max']: desc[propName] = int(value) else: desc[propName] = value # need to experiment with freeze and thaw to avoid # a lot of update events startTime = time.time() # this is going to trigger a changed event # as we delete the old component self._updatingComponent = True del self._comp[wName] if propName == 'name': wName = value # this is going to trigger another changed event # as we create a new component with the changed attribute self._comp[wName] = desc c = self._comp[wName] wx.EVT_LEFT_DOWN(c, self._parent.on_mouseDown) wx.EVT_LEFT_UP(c, self._parent.on_mouseUp) wx.EVT_MOTION(c, self._parent.on_mouseDrag) # now restore the order of the component # have to update the startName in case the name was updated if propName == 'name': self._parent.startName = wName self._comp.order.remove(wName) self._comp.order.insert(order, wName) self._parent.fixComponentOrder(wName) self._updatingComponent = False endTime = time.time() #print "attribute change took:", endTime - startTime else: if wClass in ['Image', 'ImageButton'] and propName == 'file': cwd = os.getcwd() try: os.chdir(self._parent.filename) except: pass setattr(widget, propName, value) os.chdir(cwd) else: setattr(widget, propName, value) #print propName, value # KEA 2002-02-23 self._parent.showSizingHandles(wName) def setValidProps(self, wClass): #print "setValidProps", wClass oldProp = self.components.wPropertyList.stringSelection if wClass == "": self.components.wPropertyList.Clear() else: ##props = self.propList + self.optionalProps[wClass] ##props.sort() ##print "props", props # get the property (attribute) list from the spec klass = registry.Registry.getInstance().getComponentClass(wClass) props = klass._spec.getAttributes().keys() # KEA 2002-03-24 # only show the 'id' attribute for Button # and only when displaying dialog properties if not (self._parent.editingDialog and wClass == 'Button'): # AB 2004-12-31 # The id attrib is optional, and may not be present. All widgets will have # IDs, but Components may not. If it is not present, then we don't need to remove it. if 'id' in props: props.remove('id') # AB 2004-12-31 # Don't show the action bindings at all. Edit them only via the action binding dialog. if 'actionBindings' in props: props.remove('actionBindings') props.sort() ##print "spec props", specProps self.components.wPropertyList.Clear() self.components.wPropertyList.InsertItems(props, 0) if oldProp in props: self.components.wPropertyList.stringSelection = oldProp def hideAllBut(self, widget): for w in self.editItems: if widget.id != w.id: w.visible = False def displayProperty(self, wName, wClass, propName): self.components.wName.text = propName + ":" ##widget = self.components[wName] widget = self._comp[wName] if propName in ['label', 'stringSelection', 'text', 'toolTip'] or propName in self.checkItems: value = getattr(widget, propName) else: value = str(getattr(widget, propName)) if propName in self.checkItems: self.hideAllBut(self.components.wChecked) self.components.wChecked.visible = True self.components.wChecked.checked = value elif propName in self.popItems: self.hideAllBut(self.components.wPop) self.components.wPop.visible = True self.components.wPop.Clear() if propName == 'stringSelection': for v in widget.items: self.components.wPop.Append(v) else: for v in widget._spec.getAttributes()[propName].values: self.components.wPop.Append(v) try: self.components.wPop.stringSelection = value except: # if value is empty or doesn't already exist pass elif propName in ('items', 'userdata') or (wClass == 'TextArea' and propName == 'text'): #print 'displaying TextArea' self.hideAllBut(self.components.wTextArea) self.components.wTextArea.visible = True self.components.wTextArea.text = value else: self.hideAllBut(self.components.wField) self.components.wField.visible = True if propName == 'foregroundColor' or propName == 'backgroundColor': self.components.wColor.visible = True elif propName == 'font': self.components.wFont.visible = True elif propName == 'file': self.components.wFile.visible = True self.components.wName.text = propName + ":" # KEA 2002-02-23 # I can't remember why this is actually necessary if propName == 'size': width, height = getattr(widget, propName) if wClass not in ['BitmapCanvas', 'HtmlWindow']: bestWidth, bestHeight = widget.GetBestSize() if width == bestWidth: width = -1 if height == bestHeight: height = -1 size = (width, height) value = str(size) self.components.wField.text = value # this should only display if the attribute is settable # so name, alignment, and others are read-only # KEA 2002-02-23 # wUpdate is always visible now self.components.wUpdate.visible = True def on_wComponentList_select(self, event): #print 'selectComponentListEvent: %s\n' % event.GetString() wName, wClass = event.GetString().split(" : ") # change the wPropertiesList to only show relevant properties # either display the name by default or try and preserve the # wPropertiesList selection and display that item, so for example # you could look at size for all widgets, simply by going up and down # the components list self.setValidProps(wClass) propName = self.components.wPropertyList.stringSelection #print propName if propName == "": propName = "name" self.components.wPropertyList.stringSelection = "name" self.displayProperty(wName, wClass, propName) c = self._parent.components[wName] if hasattr(c, 'position'): self._parent.showSizingHandles(wName) self._parent.setToolTipDrag(wName, c.position, c.size) def on_wPropertyList_select(self, event): propName = event.GetString() wName, wClass = self.components.wComponentList.stringSelection.split(" : ") if wName != "": self.displayProperty(wName, wClass, propName) def clearComponentList(self): self.components.wComponentList.Clear() self.statusBar.text = '' def clearPropertyList(self): self.components.wPropertyList.Clear() def displayComponents(self, components): self.components.wComponentList.Freeze() self.components.wComponentList.Clear() self._comp = components for c in components.order: if c not in self._parent.sizingHandleNames: self.addWidgetToComponentList(components[c]) self.components.wComponentList.Thaw() self.components.wComponentList.Refresh() self.components.wComponentList.Update() def on_close(self, event): self.visible = False parent = self.GetParent() parent.menuBar.setChecked('menuViewPropertyEditor', 0) PythonCard-0.8.2/tools/experimentalResourceEditor/modules/propertyEditor.rsrc.py0000644000076500007650000000362410137000312030243 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'Template', 'backgrounds': [ {'type':'Background', 'name':'bgTemplate', 'title':'resourceEditor Property Editor', 'size':(405, 270), 'visible':0, 'statusBar':1, 'components': [ {'type':'Button', 'name':'wUpdate', 'position':(320, 195), 'label':'Update', 'visible':0, 'default':1, }, {'type':'Choice', 'name':'wPop', 'position':(130, 130), 'size':(-1, 21), 'items':[], 'visible':0, }, {'type':'CheckBox', 'name':'wChecked', 'position':(130, 132), 'visible':0, 'label':'', }, {'type':'TextArea', 'name':'wTextArea', 'position':(130, 130), 'size':(260, 50), 'visible':0, }, {'type':'Button', 'name':'wFont', 'position':(320, 130), 'label':'Font...', 'visible':0, }, {'type':'Button', 'name':'wColor', 'position':(320, 130), 'label':'Color...', 'visible':0, }, {'type':'Button', 'name':'wFile', 'position':(320, 130), 'label':'File...', 'visible':0, }, {'type':'TextField', 'name':'wField', 'position':(130, 130), 'size':(180, -1), }, {'type':'StaticText', 'name':'wName', 'position':(5, 135), 'size':(120, -1), 'alignment':'right', 'text':'name:', }, {'type':'List', 'name':'wPropertyList', 'position':(225, 20), 'size':(165, 100), 'items':[], }, {'type':'List', 'name':'wComponentList', 'position':(5, 20), 'size':(200, 100), 'items':[], }, {'type':'StaticText', 'name':'Properties', 'position':(228, 3), 'text':'Properties', }, {'type':'StaticText', 'name':'stcNameClass', 'position':(5, 3), 'text':'Name : Class', }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/tools/experimentalResourceEditor/modules/resourceOutput.py0000644000076500007650000002370310402012531027311 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.3 $" __date__ = "$Date: 2006/03/03 10:07:21 $" """ import wx SPACES = ' ' def colorDescription(color): if isinstance(color, str): return "'%s'" % color else: return "%s" % str(color) # this is a complete hack job in order to avoid # outputting defaults def widgetAttributes(background, aWidget): # this might be overly aggressive # it could be that the normal default of white might be different on these # various widgets rather than being the same, so the wxTextCtrl is # not a good comparison flds = ['TextField', 'PasswordField', 'TextArea'] txtWidgets = ['TextField', 'PasswordField', 'TextArea', 'Choice', 'List', 'Calendar', 'ComboBox'] imgWidgets = ['Image', 'ImageButton'] comp = background.propertyEditorWindow.components dFgC = comp.wUpdate.foregroundColor.Get() dBgC = comp.wUpdate.backgroundColor.Get() dFont = repr(comp.wUpdate.font) dTextBgC = comp.wField.backgroundColor.Get() # make sure these primary attributes show up # at the beginning of the listing # the remaining ones will be in alphabetical order dStr = "{'type':'%s', \n" % aWidget.__class__.__name__ # KEA 2002-03-24 # only save the special ids if background.editingDialog and aWidget.__class__.__name__ == 'Button': if aWidget.id in [wx.ID_OK, wx.ID_CANCEL, wx.ID_YES, wx.ID_NO]: dStr += " 'id':%d, \n" % aWidget.id dStr += " 'name':'%s', \n" % aWidget.name dStr += " 'position':%s, \n" % str(aWidget.position) # try and determine default sizes width, height = aWidget.size if aWidget.__class__.__name__ in imgWidgets: width, height = aWidget._size elif aWidget.__class__.__name__ not in ['BitmapCanvas', 'HtmlWindow', 'IEHtmlWindow', 'Gauge', 'StaticBox']: bestWidth, bestHeight = aWidget.GetBestSize() if bestWidth == width: width = -1 if bestHeight == height: height = -1 if width != -1 or height != -1: dStr += " 'size':(%d, %d), \n" % (width, height) #for key in aWidget._getAttributeNames(): attributes = aWidget._spec.getAttributes().keys() attributes.sort() for key in attributes: if key in ['id', 'bitmap', 'name', 'position', 'selection', 'size']: pass elif getattr(aWidget, key) is not None: #print aWidget.__class__.__name__, key, getattr(aWidget, key) value = getattr(aWidget, key) if key == 'file' and aWidget.__class__.__name__ in imgWidgets and value == '': dStr += " 'file':'', \n" continue if key == 'alignment' and \ aWidget.__class__.__name__ in ['StaticText', 'PasswordField', 'TextField', 'TextArea'] \ and value == 'left': continue if key == 'border' and aWidget.__class__.__name__ in txtWidgets and value == '3d': continue if key == 'backgroundColor' and \ aWidget.__class__.__name__ in txtWidgets and \ value.Get() == dTextBgC: continue if key == 'foregroundColor' and value.Get() == dFgC: continue if key == 'backgroundColor' and value.Get() == dBgC: continue if key == 'font' and repr(value) == dFont: continue if key == 'actionBindings' and value == {}: continue # KEA 2002-07-07 # what other Unicode strings do we need to deal with above? #print key, value, type(value) if isinstance(value, (str, unicode)): # if isinstance(value, unicode): # value = value.encode('ascii', 'ignore') # need to escape strings #pprint.pprint(value) if value != '': dStr += """ %s:%s, \n""" % (repr(key), repr(value)) else: if (key in ['editable', 'enabled', 'visible'] and value == True) or \ (key in ['checked', 'default', 'horizontalScrollbar'] and value == False): # don't include default values pass else: dStr += " '%s':%s, \n" % (key, value) dStr += ' },\n' return dStr def resourceMenuItemAttributes(menuItem): desc = SPACES * 4 + " {'type':'MenuItem',\n" desc += SPACES * 4 + " 'name':'%s',\n" % menuItem.name desc += SPACES * 4 + """ 'label':%s,\n""" % repr(menuItem.label) try: if menuItem.command is not None: desc += SPACES * 4 + " 'command':'%s',\n" % menuItem.command except: pass try: if not menuItem.enabled: desc += SPACES * 4 + " 'enabled':0,\n" except: pass try: if menuItem.checkable: desc += SPACES * 4 + " 'checkable':1,\n" if menuItem.checked: desc += SPACES * 4 + " 'checked':1,\n" except: pass desc += SPACES * 4 + " },\n" return desc def resourceMenuAttributes(menu): desc = SPACES * 3 + " {'type':'Menu',\n" desc += SPACES * 3 + " 'name':'%s',\n" % menu.name desc += SPACES * 3 + """ 'label':%s,\n""" % repr(menu.label) desc += SPACES * 3 + " 'items': [\n" for m in menu.items: desc += resourceMenuItemAttributes(m) desc += SPACES * 3 + " ]\n" desc += SPACES * 3 + " },\n" return desc def resourceMenubarAttributes(menubar): desc = SPACES * 2 + "'menubar': {'type':'MenuBar',\n" desc += SPACES * 2 + " 'menus': [\n" for m in menubar.menus: desc += resourceMenuAttributes(m) desc += SPACES * 2 + " ]\n" desc += SPACES + " },\n" return desc def resourceBackgroundAttributes(background, bg): desc = " {'type':'Background',\n" desc += " 'name':'%s',\n" % bg.name desc += """ 'title':%s,\n""" % repr(bg.title) # KEA 2004-10-04 # need a more sophisticated way of specifying an optional position # but just saving the position the user is editing the window at # is bad, so turn it off for now ## desc += " 'position':%s,\n" % str(background.GetPositionTuple()) desc += " 'size':%s,\n" % str(background.GetSizeTuple()) if bg.statusBar is not None and bg.statusBar: desc += " 'statusBar':1,\n" if bg.foregroundColor is not None: desc += " 'foregroundColor':" + colorDescription(bg.foregroundColor) + ",\n" if bg.backgroundColor is not None: desc += " 'backgroundColor':" + colorDescription(bg.backgroundColor) + ",\n" if bg.icon is not None: desc += " 'icon':'%s',\n" % bg.icon if bg.image is not None: desc += " 'image':'%s',\n" % bg.image if bg.tiled: desc += " 'tiled':1,\n" if not bg.visible: desc += " 'visible':0,\n" if bg.style != []: desc += " 'style':%s,\n" % str(bg.style) desc += "\n" try: desc += resourceMenubarAttributes(bg.menubar) except: pass # KEA 2002-05-15 # strings if bg.strings != {}: desc += " 'strings': {\n" for s in bg.strings.__dict__: desc += """ %s:%s,\n""" % (repr(s), repr(bg.strings.__dict__[s])) desc += " },\n\n" desc += " 'components': [\n\n" return desc def resourceStackAttributes(background): if background.rsrc is None: print "no rsrc" # we should probably blow up here desc = "{'application':{'type':'Application',\n" desc += " 'name':'%s',\n" % background.rsrc.application.name desc += " 'backgrounds': [\n" desc += resourceBackgroundAttributes(background, background.rsrc.application.backgrounds[0]) return desc def resourceDialogAttributes(background, bg): desc = "{'type':'CustomDialog',\n" desc += " 'name':'%s',\n" % bg.name desc += " 'title':'%s',\n" % bg.title desc += " 'position':%s,\n" % str(background.GetPositionTuple()) desc += " 'size':%s,\n" % str(background.GetSizeTuple()) #if bg.statusBar is not None and bg.statusBar: # desc += " 'statusBar':1,\n" #desc += "\n" #if bg.foregroundColor is not None: # desc += " 'foregroundColor':" + colorDescription(bg.foregroundColor) + ",\n" #if bg.backgroundColor is not None: # desc += " 'backgroundColor':" + colorDescription(bg.backgroundColor) + ",\n" #if bg.image is not None: # desc += " 'image':'%s',\n" % bg.image #if bg.tiled != 0: # desc += " 'tiled':1,\n" # KEA 2002-09-12 # strings if bg.strings != {}: desc += "\n 'strings': {\n" for s in bg.strings.__dict__: desc += """ %s:%s,\n""" % (repr(s), repr(bg.strings.__dict__[s])) desc += " },\n\n" desc += " 'components': [\n\n" return desc def resourceAttributes(background): # KEA 2002-03-24 """ editingDialog = 0 try: name = background.rsrc.application.name except: editingDialog = 1 """ if background.editingDialog: desc = resourceDialogAttributes(background, background.rsrc) for w in background.components.order: if w not in background.sizingHandleNames: desc += widgetAttributes(background, background.components[w]) + "\n" desc += "] # end components\n" desc += "} # end CustomDialog\n" else: desc = resourceStackAttributes(background) for w in background.components.order: if w not in background.sizingHandleNames: desc += widgetAttributes(background, background.components[w]) + "\n" desc += "] # end components\n" desc += "} # end background\n" desc += "] # end backgrounds\n" desc += "} }\n" return desc PythonCard-0.8.2/tools/experimentalResourceEditor/modules/stackInfoDialog.py0000644000076500007650000000114010137000312027270 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.1 $" __date__ = "$Date: 2004/10/24 19:21:46 $" """ from PythonCard import model import os class StackInfoDialog(model.CustomDialog): def __init__(self, aBg, rsrc): model.CustomDialog.__init__(self, aBg) self.parent = aBg # if some special setup is necessary, do it here self.components.fldName.text = rsrc.application.name def stackInfoDialog(parent): dlg = StackInfoDialog(parent, parent.rsrc) result = dlg.showModal() result.text = dlg.components.fldName.text dlg.destroy() return result PythonCard-0.8.2/tools/experimentalResourceEditor/modules/stackInfoDialog.rsrc.py0000644000076500007650000000120610137000312030243 0ustar alexalex00000000000000{'type':'CustomDialog', 'name':'stackInfo', 'title':'Stack Info', 'size':(270, 100), 'components': [ {'type':'StaticText', 'name':'stcName', 'position':(10, 10), 'size':(45, -1), 'text':'Name:', }, {'type':'TextField', 'name':'fldName', 'position':(60, 5), 'size':(188, -1), }, {'type':'Button', 'name':'btnOK', 'position':(10, 40), 'label':'OK', 'default':1, 'id':5100, }, {'type':'Button', 'name':'btnCancel', 'position':(115, 40), 'label':'Cancel', 'id':5101, }, ] # end components } # end CustomDialog PythonCard-0.8.2/tools/experimentalResourceEditor/modules/stringDialog.py0000644000076500007650000001144110137000312026662 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.1 $" __date__ = "$Date: 2004/10/24 19:21:46 $" """ from PythonCard import log, model, resource import os import wx NEWSTRING = 'newString' SPACER = ' : ' def stringResourceFromList(stringList): desc = " {\n" for s in stringList: desc += """ %s:%s,\n""" % (repr(s), repr(stringList[s])) # close strings desc += " }\n" d = eval(desc) return resource.Resource(d) class StringDialog(model.CustomDialog): def __init__(self, aBg, stringList): model.CustomDialog.__init__(self, aBg) self.parent = aBg """ # KEA 2004-08-22 # workaround/hack to make sure closeField message # is processed prior to the dialog being closed # this occurs when one of the fields are edited and then # the user clicks Ok # this hack works because we don't process on_close # the first time, but rather delay it by posting a second close message self.closeDialog = False """ # if some special setup is necessary, do it here self.stringList = stringList sortedStrings = self.stringList.keys() sortedStrings.sort() for s in sortedStrings: label = self.getLabelFromKey(s) self.components.listStrings.append(label) def parseStrings(self, rsrc): stringList = {} for s in rsrc.__dict__: stringList[s] = rsrc.__dict__[s] return stringList def getLabelFromKey(self, key): return key + SPACER + self.stringList[key].split('\n')[0] def updateItemLabel(self, n, key): label = self.getLabelFromKey(key) self.components.listStrings.setString(n, label) def getStringSelectionKey(self): return self.components.listStrings.stringSelection.split()[0] def on_fldName_closeField(self, event): print "closeField fldName", event.target.text newName = event.target.text previousName = self.getStringSelectionKey() # if the name changes then we have to check to see # if the dictionary already has a key with the new # name if newName in self.stringList: # replace? pass else: sel = self.components.listStrings.selection self.stringList[newName] = self.stringList[previousName] del self.stringList[previousName] #self.components.listStrings.setString(sel, newName) self.updateItemLabel(sel, newName) def on_fldValue_closeField(self, event): print "closeField fldValue", event.target.text sel = self.components.listStrings.selection name = self.getStringSelectionKey() self.stringList[name] = event.target.text self.updateItemLabel(sel, name) def displayItemAttributes(self, s): self.components.fldName.text = s self.components.fldValue.text = self.stringList[s] def on_listStrings_select(self, event): self.displayItemAttributes(self.getStringSelectionKey()) def on_btnDelete_mouseClick(self, event): sel = self.components.listStrings.selection name = self.getStringSelectionKey() if sel != -1: del self.stringList[name] self.components.listStrings.delete(sel) if len(self.stringList) > 0: if sel > len(self.stringList) - 1: sel = sel - 1 self.components.listStrings.selection = sel self.displayItemAttributes(self.getStringSelectionKey()) def on_btnNew_mouseClick(self, event): s = NEWSTRING if s in self.stringList: self.components.listStrings.stringSelection = self.getLabelFromKey(s) else: self.stringList[s] = '' sel = len(self.stringList) - 1 self.components.listStrings.append(s) self.components.listStrings.stringSelection = s self.updateItemLabel(sel, s) self.displayItemAttributes(self.getStringSelectionKey()) """ # KEA 2004-08-22 # experiment to workaround Mac closeField bug # ignore for now along with the extra debug print statements in closeField # event handlers above def on_mouseClick(self, event): try: print self.closeDialog print event.target.name print event.target.id except: pass if self.closeDialog: event.skip() else: self.closeDialog = True wx.PostEvent(self, event) """ def stringDialog(parent, rsrc): dlg = StringDialog(parent, rsrc) result = dlg.showModal() if result.accepted: result.stringList = stringResourceFromList(dlg.stringList) dlg.destroy() return result PythonCard-0.8.2/tools/experimentalResourceEditor/modules/stringDialog.rsrc.py0000644000076500007650000000232310137000312027631 0ustar alexalex00000000000000{'type':'CustomDialog', 'name':'stringDialog', 'title':'String Editor', 'size':(480, 300), 'components': [ {'type':'List', 'name':'listStrings', 'position':(0, 0), 'size':(185, 185), 'items':[], }, {'type':'Button', 'name':'btnNew', 'position':(5, 190), 'label':'New', }, {'type':'Button', 'name':'btnDelete', 'position':(108, 191), 'label':'Delete', }, {'type':'StaticText', 'name':'stcName', 'position':(200, 10), 'text':'Name:', }, {'type':'StaticText', 'name':'stcValue', 'position':(200, 35), 'text':'Value:', }, {'type':'TextField', 'name':'fldListIndex', 'position':(460, 5), 'visible':0, }, {'type':'TextField', 'name':'fldName', 'position':(260, 5), 'size':(188, -1), }, {'type':'TextArea', 'name':'fldValue', 'position':(260, 35), 'size':(188, 197), }, {'type':'Button', 'name':'btnOK', 'position':(10, 240), 'label':'OK', 'default':1, 'id':5100, }, {'type':'Button', 'name':'btnCancel', 'position':(115, 240), 'label':'Cancel', 'id':5101, }, ] # end components } # end CustomDialog PythonCard-0.8.2/tools/experimentalResourceEditor/readme.txt0000644000076500007650000000357210137000312024216 0ustar alexalex00000000000000Last updated: 2002-04-13 This represents the beginnings of a GUI resource (layout) editor for PythonCard. You can view the attributes for all components and menus by selecting the Resource... menu item in the View menu prior to doing a Save or Save As... under the File menu to output a new file. Known Bugs and Issues: There are no constraints applied when the shift key is held down, but there is there a grid for the widgets to "snap to". You can only select one widget at a time. Sizers and anchors are not supported. It is likely anchors will be supported before sizers. Some of the components don't move or resize correctly all the time, you should report problems to the mailing list. The Choice component seems prone to this movement problem. If a component is difficult to select or move, you can always select it via the Property Editor and then change its position attribute via the Property Editor rather than trying to drag the control itself; the sizing handles should also work. There is a bug that causes the top three sizing handles to appear incorrectly, usually when the widget y position is at -1. I am trying to determine if this is actually a problem with wxPython or some rare interaction in the resourceEditor code. [I think this is fixed as of release 0.6.2 -ka] When editing a dialog or other window that doesn't have a menubar, you'll probably need to increase the vertical size of the window by 20 or 30 pixels to compensate for the resourceEditor menubar. Once your layout looks the way you want it you can subtract the pixel padding you added earlier. On Microsoft Windows, the menubar may wrap if the width of the window is not wide enough, in which case you'll need to add even more padding. The next revision of the resourceEditor will use a separate window for doing layout so that the size of a window is always accurate and shows the menubar of the app you're editing. PythonCard-0.8.2/tools/experimentalResourceEditor/resourceEditor.py0000644000076500007650000021172710165335055025613 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.3 $" __date__ = "$Date: 2004/12/31 20:44:29 $" """ # TODO: Start using exceptions! import os, sys import pprint import webbrowser import wx from PythonCard import about, clipboard, configuration, dialog, graphic, log from PythonCard import menu, model, registry, resource, util from PythonCard.templates.dialogs import runOptionsDialog from modules import backgroundInfoDialog from modules import stackInfoDialog from modules import menuDialog from modules import newComponentDialog from modules import stringDialog from modules import dialogInfoDialog from modules.propertyEditor import PropertyEditor from modules import resourceOutput from modules import actionBinderDialog SIZING_HANDLE_SIZE = 7 NUM_SIZING_HANDLES = 8 RESOURCE_TEMPLATE = 'template.rsrc.py' RESOURCE_DIALOG_TEMPLATE = 'dialogTemplate.rsrc.py' USERCONFIG = 'user.config.txt' # KEA doc handling adapted from python_docs # method in IDLE EditorWindow.py pythoncard_url = util.documentationURL("documentation.html") resourceeditor_url = util.documentationURL("resource_editor_overview.html") class DummyDialog(model.CustomDialog): def __init__(self, aBg, path): # load the resource aDialogRsrc = resource.ResourceFile(path).getResource() model.CustomDialog.__init__(self, aBg, aDialogRsrc) def on_mouseClick(self, event): event.skip() class ResourceEditor(model.Background): def on_initialize(self, event): self.filename = None self.documentChanged = False self.cmdLineArgs = {'debugmenu':False, 'logging':False, 'messagewatcher':False, 'namespaceviewer':False, 'propertyeditor':False, 'shell':False, 'otherargs':''} self.lastCaptured = None self.startName = None self.startPosition = (0, 0) self.startSize = (0, 0) self.offset = (0, 0) self.startToolTip = '' try: self.readme = open('readme.txt').read() except: self.readme = '' # KEA 2002-06-27 # copied from codeEditor.py # wxFileHistory isn't wrapped, so use raw wxPython # also the file list gets appended to the File menu # rather than going in front of the Exit menu # I suspect I have to add the Exit menu after the file history # which means changing how the menus in resources are loaded # so I'll do that later self.fileHistory = wx.FileHistory() fileMenu = self.GetMenuBar().GetMenu(0) self.fileHistory.UseMenu(fileMenu) wx.EVT_MENU_RANGE(self, wx.ID_FILE1, wx.ID_FILE9, self.OnFileHistory) self.buildComponentsMenu() self.cursors = {} self.cursors['topRight'] = wx.StockCursor(wx.CURSOR_SIZENESW) self.cursors['bottomLeft'] = self.cursors['topRight'] self.cursors['topMiddle'] = wx.StockCursor(wx.CURSOR_SIZENS) self.cursors['bottomMiddle'] = self.cursors['topMiddle'] self.cursors['topLeft'] = wx.StockCursor(wx.CURSOR_SIZENWSE) self.cursors['bottomRight'] = self.cursors['topLeft'] self.cursors['middleLeft'] = wx.StockCursor(wx.CURSOR_SIZEWE) self.cursors['middleRight'] = self.cursors['middleLeft'] self.cursors['general'] = wx.StockCursor(wx.CURSOR_SIZING) self.cursors['null'] = wx.NullCursor self.sizingHandleNames = ['topLeft', 'topMiddle', 'topRight', 'middleLeft', 'middleRight', 'bottomLeft', 'bottomMiddle', 'bottomRight'] if wx.Platform == '__WXMSW__': path = os.path.join(self.application.applicationDirectory, 'images', 'sizingHandle.bmp') sizingHandleTemplate = {'type':'ImageButton', 'name':'topLeft', 'position':(3, 3), 'size':(SIZING_HANDLE_SIZE, SIZING_HANDLE_SIZE), 'file':path, 'border':'none', 'visible':0} elif wx.Platform == '__WXMAC__': #self.resizingHandleColor = (0,0,128) path = os.path.join(self.application.applicationDirectory, 'images', 'sizingHandle.bmp') sizingHandleTemplate = {'type':'Image', 'name':'topLeft', 'position':(3, 3), 'size':(SIZING_HANDLE_SIZE, SIZING_HANDLE_SIZE), 'file':path, #'backgroundColor':self.resizingHandleColor, 'border':'none', 'visible':0} else: self.resizingHandleColor = (0,0,128) sizingHandleTemplate = {'type':'ImageButton', 'name':'topLeft', 'position':(3, 3), 'size':(SIZING_HANDLE_SIZE, SIZING_HANDLE_SIZE), 'file':'', 'backgroundColor':self.resizingHandleColor, 'visible':0} for sizingHandle in self.sizingHandleNames: sizingHandleTemplate['name'] = sizingHandle self.components[sizingHandle] = sizingHandleTemplate self.propertyEditorWindow = model.childWindow(self, PropertyEditor) self.xGridSize = 5 self.yGridSize = 5 self.alignToGrid = self.menuBar.getChecked('menuOptionsAlignToGrid') self.showGridLines = self.menuBar.getChecked('menuOptionsShowGridLines') path = os.path.join(self.application.applicationDirectory, 'templates', \ RESOURCE_TEMPLATE) self.rsrc = resource.ResourceFile(path).getResource() self.updatePanel(self.rsrc) # KEA 2004-05-14 # this actually should only occur once for the panel # so I'm moving it into initialize which should work as long as # the panel isn't destroyed while editing, opening new files, etc. # KEA link up events for new dragging code wx.EVT_LEFT_DOWN(self.panel, self.on_mouseDown) wx.EVT_LEFT_UP(self.panel, self.on_mouseUp) wx.EVT_MOTION(self.panel, self.on_mouseDrag) wx.EVT_CHAR(self.panel, self.on_keyPress) self.configPath = os.path.join(configuration.homedir, 'resourceeditor') self.loadConfig() """ # KEA 2002-03-03 # this doesn't appear to work, some additional accelerator table modification # must be messing up the bindings # setup acceleratortable for background acctbl = wx.AcceleratorTable([ (wx.ACCEL_CTRL, ord('C'), self.menuBar.getMenuId('menuEditCopy')), (wx.ACCEL_CTRL, ord('X'), self.menuBar.getMenuId('menuEditCut')), (wx.ACCEL_CTRL, ord('V'), self.menuBar.getMenuId('menuEditPaste')) ]) self.SetAcceleratorTable(acctbl) """ # KEA 2001-12-24 # once we can do dynamic menus we should load the component list dynamically # to build the first part of the Component menu # Add BitmapCanvas # Add Button # ... # perhaps there should be a framework function to return the list of files in # the components directory or list of components and then a method in the # resourceEditor can load each component module as it builds the menu # MRV 2002-08-08 # copied and changed from codeEditor to allow commandline argument for resource file # then can use from windows explorer rightclick... if len(sys.argv) > 1: # accept a file argument on the command-line filename = os.path.abspath(sys.argv[1]) log.info('resourceEditor filename: ' + filename) if not os.path.exists(filename): filename = os.path.abspath(os.path.join(self.application.startingDirectory, sys.argv[1])) if os.path.isfile(filename): if filename.endswith('rsrc.py'): self.filename = filename self.openFile(filename) self.resizingHandler = { 'topLeft':self.on_topLeft_mouseDrag, 'topMiddle':self.on_topMiddle_mouseDrag, 'topRight':self.on_topRight_mouseDrag, 'middleLeft':self.on_middleLeft_mouseDrag, 'middleRight':self.on_middleRight_mouseDrag, 'bottomLeft':self.on_bottomLeft_mouseDrag, 'bottomMiddle':self.on_bottomMiddle_mouseDrag, 'bottomRight':self.on_bottomRight_mouseDrag } self.createDC() def OnFileHistory(self, event): fileNum = event.GetId() - wx.ID_FILE1 path = self.fileHistory.GetHistoryFile(fileNum) if self.documentChanged: save = self.saveChanges() if save == "Cancel": # don't do anything, just go back to editing return elif save == "No": # any changes will be lost pass else: if self.filename is None: # if the user cancels out of the Save As then go back to editing if not self.on_menuFileSaveAs_select(None): return else: self.saveFile() self.openFile(path) # KEA 2004-05-12 # transition to dynamic component menu # and component addition def buildComponentsMenu(self): """ Dynamically build the menu for the components supported by the resourceEditor. Eventually this will be a list or some form of palette instead of a menu. """ # only built-in components are handled currently, so an appcomponents # directory or fully-qualified component paths are handled # theoretically when the user loads a resource file the menu should # be updated, but this is all highly dependent on how imports are # handled, registry updated, etc. # One idea would be for the resourceEditor to register itself as # a change listener and have the registry subclass Changeable so it could # notify the resourceEditor. In that case, the algorithm below would # have to be modified since each menu item would be added as it receives # a change notice from the registry and would need to check the existing # menu to prevent duplicates as well as insert into the menu in the correct # order. Or perhaps, the menu items could be wiped out and recreated which # is probably simpler. # get a list of all the modules in components moduleNames = registry.Registry.getInstance().findBuiltInComponents() # KEA 2004-05-12 # I know that IEHtmlWindow is platform specific and has problems # in the resourceEditor and Grid doesn't work right either so I'm # conditionally preventing them from being loaded here until I figure # out how to deal with them # Container is another one that isn't applicable yet if True: try: moduleNames.remove('iehtmlwindow') except ValueError: pass if True: try: moduleNames.remove('grid') except ValueError: pass if True: try: moduleNames.remove('container') except ValueError: pass # need to force an import of all of the modules in components for name in moduleNames: resource.loadComponentModule(name) # should match based on name instead # name to object or id like menubar helpers? m = self.menuBar.menus[2] names = registry.Registry.getInstance().components.keys() names.sort() for key in names: rsrc = resource.Resource({'type':'MenuItem', 'name': 'menuComponentAdd' + key, 'label': key, 'command':'componentAdd'}) mi = menu.MenuItem(self, m, rsrc) m.appendMenuItem(mi) def clearWidgets(self): for w in self.components.keys(): if w not in self.sizingHandleNames: del self.components[w] def positionSizingHandles(self, position, size): x, y = position width, height = size halfHandleSize = SIZING_HANDLE_SIZE / 2 log.debug('positionSizingHandles position:' + str(position) + ", size:" + str(size)) self.components['topLeft'].position = (x - SIZING_HANDLE_SIZE, y - SIZING_HANDLE_SIZE) self.components['topMiddle'].position = (x + (width / 2) - halfHandleSize, y - SIZING_HANDLE_SIZE) self.components['topRight'].position = (x + width, y - SIZING_HANDLE_SIZE) self.components['middleLeft'].position = (x - SIZING_HANDLE_SIZE, y + (height / 2) - halfHandleSize) self.components['middleRight'].position = (x + width, y + (height / 2) - halfHandleSize) self.components['bottomLeft'].position = (x - SIZING_HANDLE_SIZE, y + height) self.components['bottomMiddle'].position = (x + (width / 2) - halfHandleSize, y + height) self.components['bottomRight'].position = (x + width, y + height) def showSizingHandles(self, name): self.startName = name self.positionSizingHandles(self.components[name].position, self.components[name].size) for sizingHandle in self.sizingHandleNames: self.components[sizingHandle].visible = True if wx.Platform == '__WXMAC__': pass #self.components[sizingHandle].backgroundColor = self.resizingHandleColor elif wx.Platform == '__WXGTK__': self.components[sizingHandle].backgroundColor = self.resizingHandleColor # overly conservative, but effective self.documentChanged = True def hideSizingHandles(self): if self.components.topLeft.visible: for sizingHandle in self.sizingHandleNames: self.components[sizingHandle].visible = False if wx.Platform == '__WXMAC__': self.panel.Refresh() def gtkHideSizingHandles(self, name): for sizingHandle in self.sizingHandleNames: if sizingHandle == name: self.components[sizingHandle].backgroundColor = self.backgroundColor else: self.components[sizingHandle].visible = False def setToolTip(self, target): self.propertyEditorWindow.statusBar.text = "Component: %s Pos: %s Size: %s" % (str(target.name), str(target.position), str(target.size)) """ x, y = target.position width, height = target.size tip = "name: " + target.name + " \n" + \ "position: " + str(x) + ", " + str(y) + " \n" + \ "size: " + str(width) + ", " + str(height) if tip != target.toolTip: target.toolTip = tip """ def setToolTipDrag(self, name, position, size): self.propertyEditorWindow.statusBar.text = "Component: %s Pos: %s Size: %s" % (name, str(position), str(size)) def on_mouseEnter(self, event): name = event.target.name if name in self.sizingHandleNames: try: self.SetCursor(self.cursors[name]) except: # not all platforms have all cursors, but hopefully # the general sizing cursor is always available self.SetCursor(self.cursors['general']) else: # KEA 2003-05-05 # get rid of cursor change on wxTextCtrl self.SetCursor(wx.StockCursor(wx.CURSOR_ARROW)) self.setToolTip(event.target) def on_mouseLeave(self, event): if event.target.name in self.sizingHandleNames: self.SetCursor(self.cursors['null']) def pointInControl(self, position): #print 'pointInControl:' #position = self.panel.ClientToScreen( position ) #print ' position=', position globalPosition = self.panel.ScreenToClient(wx.GetMousePosition()) #print ' globalPosition=', globalPosition result = None for name in self.components.order: if name in self.sizingHandleNames: continue control = self.components[name] if not hasattr(control, 'position'): continue r = control.GetRect() #print ' ', control, r if (r.Inside(globalPosition)): #print ' ', control result = control break #print "pointInControl", result return result # KEA 2004-03-27 # the DC and lastPosition handling are basically a bunch # of hacks for event bugs in WXMAC and I'm sure I'm going to regret them def createDC(self): dc = wx.ClientDC(self.panel) dc.SetPen(wx.Pen('black', 1, wx.DOT)) dc.SetBrush(wx.TRANSPARENT_BRUSH) dc.SetLogicalFunction(wx.INVERT) self.dc = dc def on_size(self, event): self.createDC() event.skip() def drawTheRect(self): position = [self.startGlobalPosition[0], self.startGlobalPosition[1]] position[0] = position[0] - self.startGlobalOffset[0] position[1] = position[1] - self.startGlobalOffset[1] ##rect = [self.startGlobalPosition[0], self.startGlobalPosition[1], self.startSize[0], self.startSize[1]] ##rect[0] = rect[0] - self.startGlobalOffset[0] ##rect[1] = rect[1] - self.startGlobalOffset[1] ##print "drawTheRect", rect ##dc.DrawRectangle(rect[0], rect[1], rect[2], rect[3]) self.dc.DrawRectanglePointSize((position[0], position[1]), (self.startSize[0], self.startSize[1])) ##self.rect = rect self.lastPosition = position #print " self.lastPosition", self.lastPosition def on_mouseDown(self, event): # KEA 2003-03-23 # protect against panel events #print "on_mouseDown" globalPosition = wx.GetMousePosition() control = event.GetEventObject() if control is self.panel: control = self.pointInControl(event.GetPosition()) if control is None: self.hideSizingHandles() self.startName = None return #target = event.target target = control if target.name not in self.sizingHandleNames: self.startName = target.name if self.application.pw is not None: self.application.pw.selectComponentsList(target.name, target.__class__.__name__) # KEA 2002-02-23 self.propertyEditorWindow.selectComponentList(target.name, target.__class__.__name__) # KEA 2003-03-23 # new drag code self.startGlobalPosition = self.panel.ScreenToClient(globalPosition) self.startGlobalOffset = target.ScreenToClient(globalPosition) # KEA 2003-05-05 # workaround for 3D border on Windows t = target.__class__.__name__ if wx.Platform == "__WXMSW__": if ['List', 'PasswordField', 'TextField', 'TextArea'].count(t): self.startGlobalOffset = [self.startGlobalOffset[0] + wx.SystemSettings.GetMetric(wx.SYS_EDGE_X), self.startGlobalOffset[1] + wx.SystemSettings.GetMetric(wx.SYS_EDGE_Y)] elif ['Gauge', 'StaticLine'].count(t): self.startGlobalOffset = [self.startGlobalOffset[0] + wx.SystemSettings.GetMetric(wx.SYS_BORDER_X), self.startGlobalOffset[1] + wx.SystemSettings.GetMetric(wx.SYS_BORDER_Y)] elif t == 'Spinner': # compensate for width of TextCtrl portion of # compound control - width of arrow buttons self.startGlobalOffset[0] += target.size[0] - 16 elif wx.Platform == "__WXMAC__": # KEA 2004-07-27 # The SYS_EDGE and SYS_BORDER numbers don't seem to work on the Mac # so I just experimented to find the values below to prevent the components # from "hopping" when the user selects them if ['List'].count(t): self.startGlobalOffset = [self.startGlobalOffset[0] - 1, self.startGlobalOffset[1] - 1] elif ['PasswordField', 'TextField', 'TextArea'].count(t): self.startGlobalOffset = [self.startGlobalOffset[0] + 3, self.startGlobalOffset[1] + 3] elif ['StaticBox'].count(t): # KEA 2004-08-16 # sigh, another complete behavior hack if target.label: self.startGlobalOffset = [self.startGlobalOffset[0] + 4, self.startGlobalOffset[1] + 18] else: self.startGlobalOffset = [self.startGlobalOffset[0] + 4, self.startGlobalOffset[1] + 3] #print "globalPosition", globalPosition #print "self.startGlobalPosition", self.startGlobalPosition #print "self.startGlobalOffset", self.startGlobalOffset ##self.startGlobalPosition[0] =- self.startGlobalOffset[0] ##self.startGlobalPosition[1] =- self.startGlobalOffset[1] self.hideSizingHandles() else: if not self.startName: return #print "res4 sizing handles", self.startName self.resizingHandleTarget = target.name if wx.Platform == '__WXMSW__': self.hideSizingHandles() elif wx.Platform == '__WXMAC__': self.hideSizingHandles() ##if self.lastCaptured is not None: ## self.lastCaptured.ReleaseMouse() ##target.CaptureMouse() ##self.lastCaptured = target else: #print "capturing mouse" #if self.lastCaptured is not None: # self.lastCaptured.ReleaseMouse() #self.gtkHideSizingHandles(target.name) self.hideSizingHandles() #target.CaptureMouse() #self.lastCaptured = target self.startPosition = self.components[self.startName].position self.startSize = self.components[self.startName].size self.offset = target.ScreenToClient(globalPosition) if target.name not in self.sizingHandleNames: self.drawTheRect() self.movingComponent = True #self.startToolTip = self.components[self.startName].toolTip ###print "capturing mouse" ###if self.lastCaptured is not None: ### self.lastCaptured.ReleaseMouse() #self.gtkHideSizingHandles(target.name) ###target.CaptureMouse() ###self.lastCaptured = targe ##event.skip() def on_mouseDrag(self, event): ##print "on_mouseDrag", event.Dragging() # protect against double-clicks in the open file dialog # when switching rsrc.py files #if event.target.name not in self.sizingHandleNames and self.startName in self.components: if not event.Dragging(): return #print "on_mouseDrag" if wx.Platform == '__WXMAC__' and not hasattr(self, 'lastPosition'): self.on_mouseDown(event) if self.startName in self.components: if not self.movingComponent and self.resizingHandleTarget: self.resizingHandler[self.resizingHandleTarget](event) return self.hideSizingHandles() # erase the last rect self.dc.DrawRectanglePointSize((self.lastPosition[0], self.lastPosition[1]), (self.startSize[0], self.startSize[1])) # use the global mouse position and the initial offset and start # to figure out where to draw a rect in global coordinates x, y = self.panel.ScreenToClient(wx.GetMousePosition()) xOffset = x - self.startGlobalOffset[0] yOffset = y - self.startGlobalOffset[1] if self.alignToGrid: xOffset = xOffset / self.xGridSize * self.xGridSize yOffset = yOffset / self.yGridSize * self.yGridSize self.lastPosition[0] = xOffset self.lastPosition[1] = yOffset self.dc.DrawRectanglePointSize((self.lastPosition[0], self.lastPosition[1]), (self.startSize[0], self.startSize[1])) # doesn't do anything if just drawing rects self.setToolTipDrag(self.startName, self.lastPosition, self.startSize) ##event.skip() # KEA 2004-09-15 # support cursor keys to move components one pixel at a time # the event is coming from the panel so we have to use the wx methods def on_keyPress(self, event): keyCode = event.GetKeyCode() if keyCode in (wx.WXK_LEFT, wx.WXK_UP, wx.WXK_RIGHT, wx.WXK_DOWN): # self.startName might not be set # that may actually be a bug, but this should always work s = self.propertyEditorWindow.components.wComponentList.stringSelection if s: name = s.split(" : ")[0] if name in self.components: x, y = self.components[name].position if self.alignToGrid: # for now I'm only going to align to grid # in the direction of the cursor movement if keyCode == wx.WXK_LEFT: x = (x - self.xGridSize) / self.xGridSize * self.xGridSize elif keyCode == wx.WXK_RIGHT: x = (x + self.xGridSize) / self.xGridSize * self.xGridSize elif keyCode == wx.WXK_UP: y = (y - self.yGridSize) / self.yGridSize * self.yGridSize elif keyCode == wx.WXK_DOWN: y = (y + self.yGridSize) / self.yGridSize * self.yGridSize else: if keyCode == wx.WXK_LEFT: x = x - 1 elif keyCode == wx.WXK_RIGHT: x = x + 1 elif keyCode == wx.WXK_UP: y = y - 1 elif keyCode == wx.WXK_DOWN: y = y + 1 self.components[name].position = (x, y) # make sure sizing handles follow component self.showSizingHandles(name) # update the position on the propertyEditor status bar self.setToolTipDrag(name, (x, y), self.components[name].size) def on_mouseUp(self, event): # protect against double-clicks in the open file dialog # when switching rsrc.py files ####print "on_mouseUp BEFORE", self.rect if self.startName in self.components: if self.movingComponent: self.dc.DrawRectanglePointSize((self.lastPosition[0], self.lastPosition[1]), (self.startSize[0], self.startSize[1])) self.components[self.startName].position = (self.lastPosition[0], self.lastPosition[1]) #print "on_mouseUp", self.lastPosition self.panel.Refresh() self.movingComponent = False if wx.Platform == '__WXMAC__': ##if self.lastCaptured is not None: ## self.lastCaptured.ReleaseMouse() ## self.lastCaptured = None #event.target.ReleaseMouse() # clear up drag artifacts self.Refresh() if wx.Platform == '__WXGTK__': ##if self.lastCaptured is not None: ## self.lastCaptured.ReleaseMouse() ## self.lastCaptured = None #event.target.ReleaseMouse() self.Refresh() self.showSizingHandles(self.startName) self.resizingHandleTarget = None #self.setToolTip(self.components[self.startName]) #self.components[self.startName].toolTip = self.startToolTip # KEA 2003-05-13 # these should no longer be needed ## # KEA 2002-04-30 ## # workaround for WXMAC ## def on_mouseClick(self, event): ## print "on_mouseClick" ## if wx.Platform == '__WXMAC__': ## self.on_mouseUp(event) ## ## # KEA 2002-04-30 ## # workaround for WXMAC ## def on_select(self, event): ## print "on_select" ## if wx.Platform == '__WXMAC__': ## self.on_mouseUp(event) # KEA 2001-12-24 # I need to refactor the common elements of the resizing handle code # I also want to add a Component info window to show the component # name, position, size as the component is moved and resized # THe 2002-08-29 # Refactored the common elements of resizing handle code. def doResize(self, event, (n, w, s, e)): if not self.startName: return try: # Windows xOffset = event.x - self.offset[0] yOffset = event.y - self.offset[1] except: # Mac OS X and Linux/GTK #x, y = event.GetPosition() globalPosition = wx.GetMousePosition() x, y = self.components[self.resizingHandleTarget].ScreenToClient(globalPosition) xOffset = x - self.offset[0] yOffset = y - self.offset[1] xStartOffset = self.startPosition[0] + e * xOffset yStartOffset = self.startPosition[1] + n * yOffset if self.alignToGrid: xOffset = xOffset / self.xGridSize * self.xGridSize yOffset = yOffset / self.yGridSize * self.yGridSize xStartOffset = xStartOffset / self.xGridSize * self.xGridSize yStartOffset = yStartOffset / self.yGridSize * self.yGridSize width = self.startSize[0] + (w - e) * xOffset height = self.startSize[1] + (s - n) * yOffset self.components[self.startName].position = (xStartOffset, yStartOffset) self.components[self.startName].size = (width, height) self.setToolTip(self.components[self.startName]) def on_topLeft_mouseDrag(self, event): self.doResize(event, (1, 0, 0, 1)) def on_topMiddle_mouseDrag(self, event): self.doResize(event, (1, 0, 0, 0)) def on_topRight_mouseDrag(self, event): self.doResize(event, (1, 1, 0, 0)) def on_middleLeft_mouseDrag(self, event): self.doResize(event, (0, 0, 0, 1)) def on_middleRight_mouseDrag(self, event): self.doResize(event, (0, 1, 0, 0)) def on_bottomLeft_mouseDrag(self, event): self.doResize(event, (0, 0, 1, 1)) def on_bottomMiddle_mouseDrag(self, event): self.doResize(event, (0, 0, 1, 0)) def on_bottomRight_mouseDrag(self, event): self.doResize(event, (0, 1, 1, 0)) def saveChanges(self): if self.filename is None: filename = "Untitled" else: filename = self.filename msg = "The data in the %s file has changed.\n\nDo you want to save the changes?" % filename result = dialog.messageDialog(self, msg, 'resourceEditor', wx.ICON_EXCLAMATION | wx.YES_NO | wx.CANCEL) return result.returnedString def newFile(self, fullTemplatePath): """ KEA 2003-07-31 the logic of where templates come from, the user selecting a template, prompting to save, etc. should be refactored especially if we are going to support a pythoncard_config/resourceEditor/templates directory for user-specific resource/code templates for now we'll assume a single templates dir and put the save logic here also need to decide if resourceEditor should startup differently like not showing a new layout to begin with maybe have an option to start with a new project prompt, open resource dialog, or none so user can select from the history (always lots of UI decisions ;-) """ # prompt to save # user will probably end up creating a new dir # and changing the filename templatePath, templateFilename = os.path.split(fullTemplatePath) #print path, filename # have the user save the source or resource?! wildcard = "Python files (*.py)|*.py" # don't set the starting dir, let user navigate result = dialog.saveFileDialog(None, "Save As", "", templateFilename[:-8] + ".py", wildcard) if result.accepted: path = result.paths[0] if path.endswith('.rsrc.py'): basepath = os.path.splitext(os.path.splitext(path)[0])[0] elif path.endswith('.py'): basepath = os.path.splitext(path)[0] else: # user didn't use a .py extension? # should this be an error? basepath = path #print basepath # now we need to copy and rename the # template files to the user chosen location import shutil destPath, destFilename = os.path.split(basepath) # copy the .py file fname = os.path.join(templatePath, templateFilename[:-8] + ".py") tname = os.path.join(destPath, destFilename + ".py") #print "copying", tname shutil.copy(fname, tname) # copy the .rsrc.py file fname = os.path.join(templatePath, templateFilename) tname = os.path.join(destPath, destFilename + ".rsrc.py") #print "copying", tname shutil.copy(fname, tname) self.filename = tname #print self.filename else: # present a dialog instead?! return self.resetAndClearWidgets() path = os.path.join(self.filename) self.rsrc = resource.ResourceFile(path).getResource() ##self.filename = None self.updatePanel(self.rsrc) if self.editingDialog: comp = self.rsrc.components else: comp = self.rsrc.application.backgrounds[0].components for w in comp: self.components[w.name] = w self.rebindEventsForDragging() self.documentChanged = False # could change the resource and title bar # here to give the user more feedback def saveFile(self): if self.filename is None: return self.on_menuFileSaveAs_select(None) else: ##desc = self.resourceAttributes() desc = resourceOutput.resourceAttributes(self) try: f = open(self.filename, 'w') f.write(desc) f.close() self.documentChanged = False self.fileHistory.AddFileToHistory(self.filename) return True except Exception, e: message = 'The resource file could not be saved.\n' + str( e ) dialog.messageDialog(self, message, 'ResourceEditor Error', wx.ICON_EXCLAMATION | wx.OK) return False def revertFile(self): self.resetAndClearWidgets() if self.filename is None: path = os.path.join(self.application.applicationDirectory, 'templates', \ RESOURCE_TEMPLATE) self.rsrc = resource.ResourceFile(path).getResource() else: self.rsrc = resource.ResourceFile(self.filename).getResource() self.updatePanel(self.rsrc) # KEA 2002-03-24 # either we're editing a Background or a Dialog if self.editingDialog: comp = self.rsrc.components else: comp = self.rsrc.application.backgrounds[0].components for w in comp: self.components[w.name] = w self.rebindEventsForDragging() self.documentChanged = False def getNewFileTemplates(self): templatesDir = os.path.join(self.application.applicationDirectory, 'templates') fileList = os.listdir(templatesDir) #fileList.sort() templates = [] for filename in fileList: # get 'title' path = os.path.join(templatesDir, filename) if os.path.isfile(path): try: rsrc = resource.ResourceFile(path).getResource() try: templates.append((rsrc.application.backgrounds[0].title, path, 'background')) except: templates.append((rsrc.title, path, 'dialog')) except: # not a resource file pass templates.sort() return templates def doNewFile(self): templates = self.getNewFileTemplates() listX = [] for t in templates: #print t[0], t[2], t[1] listX.append(t[0]) result = dialog.singleChoiceDialog(self, "Choose a resource template", "Templates", listX) if result.accepted: name = result.selection for t in templates: if t[0] == name: filename = t[1] self.newFile(filename) def on_menuFileNew_select(self, event): if self.documentChanged: save = self.saveChanges() if save == "Cancel": # don't do anything, just go back to editing pass elif save == "No": # any changes will be lost #self.newFile(RESOURCE_TEMPLATE) self.doNewFile() else: if self.filename is None: if self.on_menuFileSaveAs_select(None): #self.newFile(RESOURCE_TEMPLATE) self.doNewFile() else: self.saveFile() #self.newFile(RESOURCE_TEMPLATE) self.doNewFile() else: #self.newFile(RESOURCE_TEMPLATE) self.doNewFile() def on_menuFileNewDialog_select(self, event): if self.documentChanged: save = self.saveChanges() if save == "Cancel": # don't do anything, just go back to editing pass elif save == "No": # any changes will be lost self.newFile(RESOURCE_DIALOG_TEMPLATE) else: if self.filename is None: if self.on_menuFileSaveAs_select(None): self.newFile(RESOURCE_DIALOG_TEMPLATE) else: self.saveFile() self.newFile(RESOURCE_DIALOG_TEMPLATE) else: self.newFile(RESOURCE_DIALOG_TEMPLATE) def on_menuFileSave_select(self, event): self.saveFile() def on_menuFileSaveAs_select(self, event): if self.filename is None: path = '' filename = '' else: path, filename = os.path.split(self.filename) wildcard = "resource files (*.rsrc.py)|*.rsrc.py" result = dialog.saveFileDialog(None, "Save As", path, filename, wildcard) if result.accepted: path = result.paths[0] # KEA 2002-06-01 # force .rsrc.py extension # the one problem with this is that # the user won't be prompted for an overwrite # of a .rsrc.py file if they didn't enter that # in the save as dialog if not path.endswith('.rsrc.py'): path = os.path.splitext(path)[0] + '.rsrc.py' ##desc = self.resourceAttributes() desc = resourceOutput.resourceAttributes(self) try: f = open(path, 'w') f.write(desc) f.close() self.filename = path self.documentChanged = False return True except: return False else: return False def on_menuFileRevert_select(self, event): if self.documentChanged: if self.filename is None: filename = "Untitled" else: filename = self.filename msg = "You will lose any changes you've made to %s.\n\nAre you sure you want to revert to the last saved version?" % filename result = dialog.messageDialog(self, msg, 'resourceEditor', wx.ICON_EXCLAMATION | wx.YES_NO | wx.CANCEL | wx.NO_DEFAULT) save = result.returnedString if save == "Cancel" or save == "No": # don't do anything, just go back to editing pass else: # any changes will be lost self.revertFile() else: self.revertFile() def resetAndClearWidgets(self): self.startName = None self.startPosition = (0, 0) self.startSize = (0, 0) self.offset = (0, 0) if self.application.pw is not None: if wx.Platform == '__WXMAC__': self.application.pw.selectComponentsList('topLeft', 'Image') else: self.application.pw.selectComponentsList('topLeft', 'ImageButton') # KEA 2002-02-23 self.propertyEditorWindow.clearComponentList() self.propertyEditorWindow.clearPropertyList() self.hideSizingHandles() self.clearWidgets() def openFile(self, path): self.resetAndClearWidgets() os.chdir(os.path.dirname(path)) self.filename = path rsrc = resource.ResourceFile(path).getResource() self.rsrc = rsrc self.updatePanel(self.rsrc) # KEA 2002-03-24 # either we're editing a Background or a Dialog if self.editingDialog: comp = self.rsrc.components else: comp = self.rsrc.application.backgrounds[0].components for w in comp: self.components[w.name] = w self.rebindEventsForDragging() self.documentChanged = False self.fileHistory.AddFileToHistory(self.filename) def doOpenFile(self): wildcard = "resource files (*.rsrc.py)|*.rsrc.py" result = dialog.openFileDialog(None, "Import which resource file?", '', '', wildcard) if result.accepted: self.openFile(result.paths[0]) def on_menuFileOpen_select(self, event): if self.documentChanged: save = self.saveChanges() if save == "Cancel": # don't do anything, just go back to editing pass elif save == "No": # any changes will be lost self.doOpenFile() else: if self.filename is None: if self.on_menuFileSaveAs_select(None): self.doOpenFile() else: self.saveFile() self.doOpenFile() else: self.doOpenFile() def on_menuHelpAbout_select(self, event): dialog.scrolledMessageDialog(self, self.readme, 'About resourceEditor...') def on_doHelpAboutPythonCard_command(self, event): about.aboutPythonCardDialog(self) def fixComponentOrder(self, name): for c in self.components.order: self.components[c].Lower() if self.application.pw is not None: self.application.pw.clearComponentsList() self.application.pw.displayComponents(self.components) self.application.pw.selectComponentsList(name, self.components[name].__class__.__name__) # KEA 2002-02-23 ##self.propertyEditorWindow.Freeze() self.propertyEditorWindow.clearComponentList() self.propertyEditorWindow.displayComponents(self.components) self.propertyEditorWindow.selectComponentList(name, self.components[name].__class__.__name__) ##self.propertyEditorWindow.Thaw() def create_component(self, desc, offsets, promptString, errString): optionalAttributes = registry.Registry.getInstance().components[desc['type']]._spec._optionalAttributes.keys() result = newComponentDialog.newComponentDialog(self, desc, optionalAttributes, offsets, promptString) if result.accepted: name = result.name if name in self.components: dialog.alertDialog(self, name + " already exists", 'Error: Unable to '+errString+' widget') return if 'label' in optionalAttributes: desc['label'] = result.labelortext elif 'text' in optionalAttributes: desc['text'] = result.labelortext desc['name'] = name self.components[name] = desc if offsets: # offset the widget so that it isn't underneath the original x, y = self.components[name].position dx, dy = self.components[name].size #rint x, y, dx, dy if result.horizontal: x += dx+30 if result.vertical: y += dy+30 else: if result.vertical: y += dy+30 else: x += 10 y += 10 #rint " => ", x, y self.components[name].position = (x, y) # KEA 2001-12-20 # hack to insert component so that it is the first one # in the list # a similar trick will be needed for re-ordering widgets self.components.order.remove(name) self.components.order.insert(NUM_SIZING_HANDLES, name) self.fixComponentOrder(name) self.startName = name new_component = self.components[self.startName] self.startPosition = getattr(new_component, 'position', (0,0)) self.startSize = getattr(new_component, 'size', (0,0)) self.offset = (0, 0) if hasattr(new_component, 'position'): self.showSizingHandles(name) else: self.hideSizingHandles() self.documentChanged = True if hasattr(new_component, 'position'): wx.EVT_LEFT_DOWN(new_component, self.on_mouseDown) wx.EVT_LEFT_UP(new_component, self.on_mouseUp) wx.EVT_MOTION(new_component, self.on_mouseDrag) def on_componentDuplicate_command(self, event): if self.startName in self.components: aWidget = self.components[self.startName] # now loop through the original widget and build a dictionary suitable # for making a copy d = {} d['type'] = aWidget.__class__.__name__ #for key in aWidget._getAttributeNames(): attributes = aWidget._spec.getAttributes().keys() attributes.sort() for key in attributes: # I'm not exactly sure why I have to special-case these tuples if key == 'bitmap': # this should get recreated from the file attribute pass elif key == "id": # must avoid duplicate IDs pass elif key in ['position', 'size']: d[key] = getattr(aWidget, key) elif getattr(aWidget, key) is not None: d[key] = getattr(aWidget, key) self.create_component(d, True, 'Duplicate ' + d['type'], "duplicate") def on_componentDelete_command(self, event): if self.startName in self.components: aWidget = self.components[self.startName] msg = "Are you sure you want to delete %s %s?" % (aWidget.__class__.__name__, aWidget.name) result = dialog.messageDialog(self, msg, 'Delete Component', wx.ICON_INFORMATION | wx.YES_NO | wx.NO_DEFAULT) if result.accepted: self.hideSizingHandles() del self.components[aWidget.name] self.documentChanged = True def on_componentAdd_command(self, event): # event.target.name will be something like # menuComponentAddButton, so the first 16 characters # can be thrown away to get the component name className = event.target.name[16:] # find a unique name i = 1 while True: if className + str(i) not in self.components: desc = registry.Registry.getInstance().components[className]._spec.getMinimalResourceDict(className + str(i)) break i += 1 desc['position'] = (10, 10) self.create_component(desc, False, "New"+className, "create") def on_componentSendBack_command(self, event): if self.startName in self.components and \ self.components.order.index(self.startName) != len(self.components.order) - 1: self.components.order.remove(self.startName) self.components.order.append(self.startName) self.fixComponentOrder(self.startName) def on_componentMoveBack_command(self, event): if self.startName in self.components: i = self.components.order.index(self.startName) ln = len(self.components.order) - 1 if i >= NUM_SIZING_HANDLES and i < ln: self.components.order.remove(self.startName) if i == ln - 1: self.components.order.append(self.startName) else: self.components.order.insert(i + 1, self.startName) self.fixComponentOrder(self.startName) def on_componentMoveForward_command(self, event): if self.startName in self.components: i = self.components.order.index(self.startName) if i > NUM_SIZING_HANDLES: self.components.order.remove(self.startName) self.components.order.insert(i - 1, self.startName) self.fixComponentOrder(self.startName) def on_componentBringFront_command(self, event): if self.startName in self.components and \ self.components.order.index(self.startName) != NUM_SIZING_HANDLES: self.components.order.remove(self.startName) self.components.order.insert(NUM_SIZING_HANDLES, self.startName) self.fixComponentOrder(self.startName) def on_displayAttributes_command(self, event): ##desc = self.resourceAttributes() desc = resourceOutput.resourceAttributes(self) dialog.scrolledMessageDialog(self, desc, 'Resource') def on_menuViewPropertyEditor_select(self, event): self.propertyEditorWindow.visible = not self.propertyEditorWindow.visible def updatePanel(self, rsrc): # KEA 2002-03-24 # this will need to update different parameters # depending on whether we're editing a background or dialog self.editingDialog = False try: background = rsrc.application.backgrounds[0] except: dlg = self.rsrc self.editingDialog = True # unhook the grid drawing and then rebind later if necessary if self.showGridLines: self.panel.Unbind(wx.EVT_ERASE_BACKGROUND) if self.editingDialog: self.menuBar.setEnabled('menuFileRun', False) self.menuBar.setEnabled('menuFileRunWithInterpreter', False) self.menuBar.setEnabled('menuFilePreviewDialog', True) self.menuBar.setEnabled('menuEditBackgroundInfo', False) self.menuBar.setEnabled('menuEditMenubar', False) self.menuBar.setEnabled('menuEditDialogInfo', True) self.title = dlg.title self._createStatusBar(dlg) self.position = dlg.position #self.setSize((dlg.size[0], dlg.size[1] + 20)) self.size = dlg.size self.setImage('') self.setTiled(False) self.panel._imageFile = self.image self.panel._backgroundTiling = self.tiled defaultBgColor = wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DFACE) self.backgroundColor = defaultBgColor self.panel.Disconnect(-1, -1, wx.wxEVT_ERASE_BACKGROUND) self.panel._bitmap = None else: self.menuBar.setEnabled('menuFileRun', True) self.menuBar.setEnabled('menuFileRunWithInterpreter', True) self.menuBar.setEnabled('menuFilePreviewDialog', False) self.menuBar.setEnabled('menuEditBackgroundInfo', True) self.menuBar.setEnabled('menuEditMenubar', True) self.menuBar.setEnabled('menuEditDialogInfo', False) self.title = background.title self._createStatusBar(background) self.position = background.position if background.menubar is None: #self.setSize((background.size[0], background.size[1] + 20)) self.size = background.size else: self.size = background.size self.setImage(background.image) self.setTiled(background.tiled) self.panel._imageFile = self.image self.panel._backgroundTiling = self.tiled defaultBgColor = wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DFACE) self.backgroundColor = defaultBgColor self.foregroundColor = background.foregroundColor self.backgroundColor = background.backgroundColor if self.image is not None : self.panel._bitmap = graphic.Bitmap(self.image) wx.EVT_ERASE_BACKGROUND( self.panel, self.panel.onEraseBackground ) else: self.panel.Disconnect(-1, -1, wx.wxEVT_ERASE_BACKGROUND) self.panel._bitmap = None self.movingComponent = False self.resizingHandleTarget = None if self.showGridLines: self.panel.Bind(wx.EVT_ERASE_BACKGROUND, self.drawPanelGridLines) self.panel.Refresh() def drawPanelGridLines(self, event): dc = event.GetDC() if not dc : dc = wx.ClientDC(self.panel) r = self.panel.GetUpdateRegion().GetBox() dc.SetClippingRegion(r.x, r.y, r.width, r.height) # need to set the background color to the default panel color brush = dc.GetBackground() brush.SetColour(self.panel.GetBackgroundColour()) dc.SetBackground(brush) dc.Clear() # should the color be settable by the user and then save # that in the prefs? dc.SetPen(wx.Pen('darkgray', 1, wx.SOLID)) w, h = self.panel.size xgrid = self.xGridSize ygrid = self.yGridSize nx = w / xgrid ny = h / ygrid for x in range(1, nx + 1): dc.DrawLine(x * xgrid, 0, x * xgrid, h) for y in range(1, ny + 1): dc.DrawLine(0, y * ygrid, w, y * ygrid) def rebindEventsForDragging(self): for name in self.components.order: if name not in self.sizingHandleNames: #print name c = self.components[name] wx.EVT_LEFT_DOWN(c, self.on_mouseDown) wx.EVT_LEFT_UP(c, self.on_mouseUp) wx.EVT_MOTION(c, self.on_mouseDrag) # KEA 2004-08-12 # for each of the dialogs below, the code should be refactored # so that the dialog modules have a function wrapper and the # result contains whatever attributes would be needed # the function should probably not have side-effects def on_fileRunOptions_command(self, event): result = runOptionsDialog.runOptionsDialog(self, self.cmdLineArgs) if result.accepted: self.cmdLineArgs['debugmenu'] = result.debugmenu self.cmdLineArgs['logging'] = result.logging self.cmdLineArgs['messagewatcher'] = result.messagewatcher self.cmdLineArgs['namespaceviewer'] = result.namespaceviewer self.cmdLineArgs['propertyeditor'] = result.propertyeditor self.cmdLineArgs['shell'] = result.shell self.cmdLineArgs['otherargs'] = result.otherargs def on_editStackInfo_command(self, event): result = stackInfoDialog.stackInfoDialog(self, self.rsrc) if result.accepted: self.rsrc.application.name = result.text self.documentChanged = True # need to change the logic so that self.rsrc # and the current window are updated def on_editBackgroundInfo_command(self, event): background = self.rsrc.application.backgrounds[0] background.position = self.GetPositionTuple() background.size = self.GetSizeTuple() result = backgroundInfoDialog.backgroundInfoDialog(self, background) if result.accepted: background.name = result.name background.title = result.title background.position = result.position background.size = result.size background.statusBar = result.statusBar background.foregroundColor = result.foregroundColor background.backgroundColor = result.backgroundColor background.image = result.image background.tiled = result.tiled background.visible = result.visible background.style = result.style background.icon = result.icon self.updatePanel(self.rsrc) self.documentChanged = True # need to change the logic so that self.rsrc # and the current window are updated def on_editDialogInfo_command(self, event): background = self.rsrc background.position = self.GetPositionTuple() background.size = self.GetSizeTuple() result = dialogInfoDialog.dialogInfoDialog(self, background) if result.accepted: background.name = result.name background.title = result.title background.position = result.position background.size = result.size self.updatePanel(self.rsrc) self.documentChanged = True def on_editMenubar_command(self, event): try: menubar = self.rsrc.application.backgrounds[0].menubar except: menubar = None result = menuDialog.menuDialog(self, menubar) if result.accepted: self.rsrc.application.backgrounds[0].menubar = result.menubar self.documentChanged = True def on_editActionBinder_command(self, event): actionBinderDialog.runDialog(self) def on_editStrings_command(self, event): stringList = {} try: if self.editingDialog: strings = self.rsrc.strings else: strings = self.rsrc.application.backgrounds[0].strings for s in strings.__dict__: stringList[s] = strings.__dict__[s] except: stringList = {} result = stringDialog.stringDialog(self, stringList) if result.accepted: if self.editingDialog: self.rsrc.strings = result.stringList else: self.rsrc.application.backgrounds[0].strings = result.stringList self.documentChanged = True def on_optionGridSize_command(self, event): result = dialog.textEntryDialog(self, 'Enter the preferred grid size (e.g. 5):', 'Grid Size', str(self.xGridSize)) if result.accepted: try: size = int(result.text) self.xGridSize = size self.yGridSize = size if self.showGridLines: self.panel.Refresh() except: # should probably do an alert dialog here pass def on_menuOptionsAlignToGrid_select(self, event): self.alignToGrid = self.menuBar.getChecked('menuOptionsAlignToGrid') def on_menuOptionsShowGridLines_select(self, event): self.showGridLines = self.menuBar.getChecked('menuOptionsShowGridLines') if self.showGridLines: self.panel.Bind(wx.EVT_ERASE_BACKGROUND, self.drawPanelGridLines) else: self.panel.Unbind(wx.EVT_ERASE_BACKGROUND) self.panel.Refresh() def getCommandLineArgs(self): args = ' ' if self.cmdLineArgs['debugmenu']: args += '-d ' if self.cmdLineArgs['logging']: args += '-l ' if self.cmdLineArgs['messagewatcher']: args += '-m ' if self.cmdLineArgs['namespaceviewer']: args += '-n ' if self.cmdLineArgs['propertyeditor']: args += '-p ' if self.cmdLineArgs['shell']: args += '-s ' """ if self.menuBar.getChecked('menuOptionsLogging'): args += '-l ' if self.menuBar.getChecked('menuOptionsMessageWatcher'): args += '-m ' if self.menuBar.getChecked('menuOptionsNamespaceViewer'): args += '-n ' if self.menuBar.getChecked('menuOptionsPropertyEditor'): args += '-p ' if self.menuBar.getChecked('menuOptionsShell'): args += '-s ' """ return args def previewDialog(self): if self.filename is None: # KEA 2002-03-25 # should probably present an error dialog here return dlg = DummyDialog(self, self.filename) dlg.showModal() dlg.destroy() def on_filePreviewDialog_command(self, event): # we should prompt to save the .rsrc.py file if needed # or in the case of a new file, do a save as before attempting # to do a preview self.previewDialog() def runScript(self, useInterpreter): # KEA 2004-05-08 # auto-save code taken from codeEditor if self.filename is None: save = self.saveChanges() if save == "Cancel" or save == "No": # don't do anything, just go back to editing return else: if not self.on_menuFileSaveAs_select(None): # they didn't actually save, just go back # to editing return elif self.documentChanged: # auto-save self.saveFile() if self.filename is None: # KEA 2002-03-25 # should probably present an error dialog here return # this algorithm, taken from samples.py assumes the rsrc.py file and the main # program file have the same basename # if that isn't the case then this doesn't work and we need a different solution path, filename = os.path.split(self.filename) name = filename.split('.')[0] if os.path.exists(os.path.join(path, name + ".pyw")): filename = '"' + os.path.join(path, name + ".pyw") + '"' else: filename = '"' + os.path.join(path, name + ".py") + '"' # the args should come from a dialog or menu items that are checked/unchecked args = self.getCommandLineArgs() if useInterpreter: interp = ' -i ' else: interp = ' ' if sys.platform.startswith('win'): # KEA 2002-03-06 # always launch with console in the resourceEditor for debugging purposes python = os.path.join(os.path.dirname(sys.executable), 'python.exe') if ' ' in python: pythonQuoted = '"' + python + '"' else: pythonQuoted = python if useInterpreter and os.name != 'nt': os.spawnv(os.P_NOWAIT, python, [pythonQuoted, interp, filename, args]) else: os.spawnv(os.P_NOWAIT, python, [pythonQuoted, interp, filename, args]) else: if ' ' in sys.executable: python = '"' + sys.executable + '"' else: python = sys.executable os.system(python + interp + filename + args + ' &') def on_fileRun_command(self, event): self.runScript(False) def on_fileRunWithInterpreter_command(self, event): self.runScript(True) def copyWidgetDescriptionToClipboard(self, name): widget = self.components[name] desc = resourceOutput.widgetAttributes(self, widget) if desc.endswith(',\n'): desc = desc[:-2] clipboard.setClipboard(desc) def on_menuEditCut_select(self, event): if self.components.topLeft.visible and self.startName in self.components: aWidget = self.components[self.startName] msg = "Are you sure you want to Cut %s %s?" % (aWidget.__class__.__name__, aWidget.name) result = dialog.messageDialog(self, msg, 'Cut Component', wx.ICON_INFORMATION | wx.YES_NO | wx.NO_DEFAULT) if result.accepted: self.copyWidgetDescriptionToClipboard(self.startName) self.hideSizingHandles() del self.components[aWidget.name] self.documentChanged = True def on_menuEditCopy_select(self, event): if self.components.topLeft.visible and self.startName in self.components: self.copyWidgetDescriptionToClipboard(self.startName) def on_menuEditPaste_select(self, event): # need to figure out the logic of checking the contents # of the clipboard to see if it is something we can use # then checking whether the component already exists # if it exists, prompt for a new name # create the widget desc = clipboard.getClipboard() if not isinstance(desc, str): return # KEA 2004-09-10 # the clipboard is converting newlines to returns # which causes eval to fail if wx.Platform == '__WXMAC__': desc = '\n'.join(desc.splitlines()) # this is dangerous so we need a better way of converting # the text in the clipboard to a dictionary safely if desc[0] == '{' and desc[-1] == '}': desc = eval(desc) name = desc['name'] # AGT 2004-07-08 # give dialog to set name self.create_component(desc, True, 'Paste ' + desc['type'], "paste") def loadConfig(self): try: if not os.path.exists(self.configPath): os.mkdir(self.configPath) path = os.path.join(self.configPath, USERCONFIG) self.config = util.readAndEvalFile(path) if self.config != {}: if 'propertyEditorWindow.position' in self.config: self.propertyEditorWindow.SetPosition(self.config['propertyEditorWindow.position']) if 'history' in self.config: history = self.config['history'] history.reverse() for h in history: self.fileHistory.AddFileToHistory(h) except: self.config = {} def saveConfig(self): self.config['propertyEditorWindow.position'] = self.propertyEditorWindow.GetRestoredPosition() self.config['propertyEditorWindow.size'] = self.propertyEditorWindow.GetRestoredSize() history = [] for i in range(self.fileHistory.GetCount()): history.append(self.fileHistory.GetHistoryFile(i)) self.config['history'] = history try: path = os.path.join(self.configPath, USERCONFIG) f = open(path, "w") pprint.pprint(self.config, f) f.close() except: pass # argh def doExit(self): if self.documentChanged: save = self.saveChanges() if save == "Cancel": return False elif save == "No": return True else: if self.filename is None: return self.on_menuFileSaveAs_select(None) else: return self.saveFile() else: return True def doCleanup(self): # memory leak cleanup for k in self.cursors: self.cursors[k] = None def on_close(self, event): try: # KEA 2004-04-08 # if an exception occurs during on_initialize # then doCleanup and saveConfig could fail because some windows # might not exist, so in that situation just exit gracefully if self.doExit(): self.saveConfig() self.doCleanup() event.skip() except: event.skip() def on_showPythonCardDocumentation_command(self, event): global pythoncard_url webbrowser.open(pythoncard_url) def on_showResourceEditorDocumentation_command(self, event): global resourceeditor_url webbrowser.open(resourceeditor_url) if __name__ == '__main__': # now force the property editor to be enabled #configuration('showPropertyEditor', 1) #configuration('showShell', 1) app = model.Application(ResourceEditor) app.MainLoop() PythonCard-0.8.2/tools/experimentalResourceEditor/resourceEditor.rsrc.py0000644000076500007650000002054510137002757026556 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'ResEdit', 'backgrounds': [ {'type':'Background', 'name':'bgDrag', 'title':'Resource Editor', 'size':(316, 166), 'style':['resizeable'], 'menubar': {'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ {'type':'MenuItem', 'name':'menuFileNew', 'label':'&New...\tCtrl+N', }, {'type':'MenuItem', 'name':'menuFileOpen', 'label':'&Open...\tCtrl+O', }, {'type':'MenuItem', 'name':'menuFileSave', 'label':'Save\tCtrl+S', }, {'type':'MenuItem', 'name':'menuFileSaveAs', 'label':'Save &As...', }, {'type':'MenuItem', 'name':'menuFileRevert', 'label':'Revert', }, {'type':'MenuItem', 'name':'fileSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuFileRun', 'label':'&Run\tCtrl+R', 'command':'fileRun', }, {'type':'MenuItem', 'name':'menuFileRunWithInterpreter', 'label':'Run with &interpreter\tCtrl+Shift+R', 'command':'fileRunWithInterpreter', }, {'type':'MenuItem', 'name':'menuFileRunOptions', 'label':'Run Options...', 'command':'fileRunOptions', }, {'type':'MenuItem', 'name':'menuFilePreviewDialog', 'label':'Preview Dialog', 'command':'filePreviewDialog', }, {'type':'MenuItem', 'name':'fileSep2', 'label':'-', }, {'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit', }, ] }, {'type':'Menu', 'name':'menuEdit', 'label':'&Edit', 'items': [ {'type':'MenuItem', 'name':'menuEditCut', 'label':'Cu&t\tCtrl+X', }, {'type':'MenuItem', 'name':'menuEditCopy', 'label':'&Copy\tCtrl+C', }, {'type':'MenuItem', 'name':'menuEditPaste', 'label':'&Paste\tCtrl+V', }, {'type':'MenuItem', 'name':'editSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuComponentDuplicate', 'label':'&Duplicate', 'command':'componentDuplicate', }, {'type':'MenuItem', 'name':'menuComponentDelete', 'label':'Delete\tDel', 'command':'componentDelete', }, {'type':'MenuItem', 'name':'componentSep2', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditBackgroundInfo', 'label':'Background Info...', 'command':'editBackgroundInfo', }, {'type':'MenuItem', 'name':'menuEditMenubar', 'label':'Menu Editor...', 'command':'editMenubar', }, {'type':'MenuItem', 'name':'menuEditActionBinder', 'label':'Edit Actions...', 'command':'editActionBinder', }, {'type':'MenuItem', 'name':'menuEditStrings', 'label':'String Editor...', 'command':'editStrings', }, {'type':'MenuItem', 'name':'menuEditDialogInfo', 'label':'Dialog Info...', 'command':'editDialogInfo', }, ] }, {'type':'Menu', 'name':'menuComponent', 'label':'&Component', 'items': [] }, {'type':'Menu', 'name':'menuOptions', 'label':'&Options', 'items': [ {'type':'MenuItem', 'name':'menuOptionsGridSize', 'label':'Grid Size...', 'command':'optionGridSize', }, {'type':'MenuItem', 'name':'menuOptionsAlignToGrid', 'label':'Align Components to Grid\tCtrl+G', 'checkable':1, }, {'type':'MenuItem', 'name':'menuOptionsShowGridLines', 'label':'Show Grid Lines', 'checkable':1, 'checked':0, }, {'type':'MenuItem', 'name':'componentSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuComponentSendBack', 'label':'Send to Back\tCtrl+1', 'command':'componentSendBack', }, {'type':'MenuItem', 'name':'menuComponentMoveBack', 'label':'Move Backward\tCtrl+2', 'command':'componentMoveBack', }, {'type':'MenuItem', 'name':'menuComponentMoveForward', 'label':'Move Forward\tCtrl+3', 'command':'componentMoveForward', }, {'type':'MenuItem', 'name':'menuComponentBringFront', 'label':'Bring to Front\tCtrl+4', 'command':'componentBringFront', }, ] }, {'type':'Menu', 'name':'menuView', 'label':'&View', 'items': [ {'type':'MenuItem', 'name':'menuViewAttributes', 'label':'&Resource...', 'command':'displayAttributes', }, {'type':'MenuItem', 'name':'menuViewSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuViewPropertyEditor', 'label':'Property Editor\tCtrl+P', 'checkable':1, 'checked':1, }, ] }, {'type':'Menu', 'name':'menuHelp', 'label':'&Help', 'items': [ {'type':'MenuItem', 'name':'menuResourceEditorDocumentation', 'label':'&resourceEditor Documentation...\tF1', 'command':'showResourceEditorDocumentation', }, {'type':'MenuItem', 'name':'menuPythonCardDocumentation', 'label':'&PythonCard Documentation...', 'command':'showPythonCardDocumentation', }, {'type':'MenuItem', 'name':'helpSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuHelpAbout', 'label':'&About resourceEditor...', }, {'type':'MenuItem', 'name':'menuHelpAboutPythonCard', 'label':'About PythonCard...', 'command':'doHelpAboutPythonCard', }, ] }, ] }, 'components': [ ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/tools/experimentalResourceEditor/templates/0000755000076500007650000000000010434046772024233 5ustar alexalex00000000000000PythonCard-0.8.2/tools/experimentalResourceEditor/templates/dialogTemplate.py0000644000076500007650000000130710137000312027515 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.1 $" __date__ = "$Date: 2004/10/24 19:21:46 $" """ from PythonCard import model class MyDialog(model.CustomDialog): def __init__(self, parent, txt=''): model.CustomDialog.__init__(self, parent) # if some special setup is necessary, do it here # example from samples/dialogs/minimalDialog.py # self.components.field1.text = txt #def myDialog(parent, txt): def myDialog(parent): dlg = MyDialog(parent, txt) result = dlg.showModal() # stick your results into the result dictionary here # example from samples/dialogs/minimalDialog.py # result.text = dlg.components.field1.text dlg.destroy() return result PythonCard-0.8.2/tools/experimentalResourceEditor/templates/dialogTemplate.rsrc.py0000644000076500007650000000065610137000312030473 0ustar alexalex00000000000000{'type':'CustomDialog', 'name':'Template', 'title':'Dialog Template', 'size':(300, 100), 'style':['resizeable'], 'components': [ {'type':'Button', 'name':'btnOK', 'position':(10, 35), 'label':'OK', 'id':5100, 'default':1, }, {'type':'Button', 'name':'btnCancel', 'position':(100, 35), 'label':'Cancel', 'id':5101, }, ] # end components } # end CustomDialog PythonCard-0.8.2/tools/experimentalResourceEditor/templates/template.py0000644000076500007650000000061410137000312026375 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.1 $" __date__ = "$Date: 2004/10/24 19:21:46 $" """ from PythonCard import model class MyBackground(model.Background): def on_initialize(self, event): # if you have any initialization # including sizer setup, do it here pass if __name__ == '__main__': app = model.Application(MyBackground) app.MainLoop() PythonCard-0.8.2/tools/experimentalResourceEditor/templates/template.rsrc.py0000644000076500007650000000126310137000312027346 0ustar alexalex00000000000000 { 'application':{ 'type':'Application', 'name':'Template', 'backgrounds': [ { 'type':'Background', 'name':'bgTemplate', 'title':'Standard Template with File->Exit menu', 'size':( 400, 300 ), 'style':['resizeable'], 'statusBar':0, 'menubar': { 'type':'MenuBar', 'menus': [ { 'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ { 'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit', 'command':'exit', } ] } ] }, 'components': [ ] } ] } } PythonCard-0.8.2/tools/experimentalResourceEditor/templates/templateFullMenus.py0000644000076500007650000002116410137000312030233 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.1 $" __date__ = "$Date: 2004/10/24 19:21:46 $" """ import os, sys import wx from wx.html import HtmlEasyPrinting from PythonCard import configuration, dialog, model def textToHtml(txt): # the wxHTML classes don't require valid HTML # so this is enough html = txt.replace('\n\n', '

') html = html.replace('\n', '
') return html class MyBackground(model.Background): def on_initialize(self, event): # if you have any initialization # including sizer setup, do it here self.printer = HtmlEasyPrinting() # self.loadConfig() self.startTitle = self.title self.newFile() def loadConfig(self): pass def saveConfig(self): pass def saveChanges(self): # save configuration info in the app directory #filename = os.path.basename(self.documentPath) if self.documentPath is None: filename = "Untitled" else: filename = self.documentPath msg = "The text in the %s file has changed.\n\nDo you want to save the changes?" % filename result = dialog.messageDialog(self, msg, 'textEditor', wx.ICON_EXCLAMATION | wx.YES_NO | wx.CANCEL) return result.returnedString def doExit(self): if self.documentChanged: save = self.saveChanges() if save == "Cancel": return False elif save == "No": return True else: if self.documentPath is None: return self.on_menuFileSaveAs_select(None) else: self.saveFile(self.documentPath) return True else: return 1 def on_close(self, event): if self.doExit(): # self.saveConfig() self.fileHistory = None self.printer = None event.skip() def on_menuFileSave_select(self, event): if self.documentPath is None: # this a "new" document and needs to go through Save As... self.on_menuFileSaveAs_select(None) else: self.saveFile(self.documentPath) def on_menuFileSaveAs_select(self, event): wildcard = "Text files (*.txt)|*.TXT;*.txt|All files (*.*)|*.*" if self.documentPath is None: dir = '' filename = '*.txt' else: dir = os.path.dirname(self.documentPath) filename = os.path.basename(self.documentPath) result = dialog.saveFileDialog(None, "Save As", dir, filename, wildcard) if result.accepted: path = result.paths[0] self.saveFile(path) return True else: return False def newFile(self): # change the code below for # creating a new document # the commented line is from the textEditor tool # self.components.fldDocument.text = '' self.documentPath = None self.documentChanged = 0 self.title = 'Untitled - ' + self.startTitle self.statusBar.text = 'Untitled' def openFile(self, path): # change the code below for # opening an existing document # the commented lines are from the textEditor tool try: # f = open(path) # self.components.fldDocument.text = f.read().replace('\r\n','\n') # f.close() self.documentPath = path self.documentChanged = 0 self.title = os.path.split(path)[-1] + ' - ' + self.startTitle self.statusBar.text = path except: pass def saveFile(self, path): # change the code below for # saving an existing document # the commented lines are from the textEditor tool try: # f = open(path, 'w') # f.write(self.components.fldDocument.text) # f.close() self.documentPath = path self.documentChanged = False self.title = os.path.split(path)[-1] + ' - ' + self.startTitle self.statusBar.text = path except: pass def on_menuFileNew_select(self, event): if self.documentChanged: save = self.saveChanges() if save == "Cancel": # don't do anything, just go back to editing pass elif save == "No": # any changes will be lost self.newFile() else: if self.documentPath is None: if self.on_menuFileSaveAs_select(None): self.newFile() else: self.saveFile(self.documentPath) self.newFile() else: # don't need to save self.newFile() def on_menuFileOpen_select(self, event): # should probably have an alert dialog here # warning about saving the current file before opening another one if self.documentChanged: save = self.saveChanges() if save == "Cancel": # don't do anything, just go back to editing return elif save == "No": # any changes will be lost pass else: if self.documentPath is None: # if the user cancels out of the Save As then go back to editing if not self.on_menuFileSaveAs_select(None): return else: self.saveFile(self.documentPath) # split this method into several pieces to make it more flexible wildcard = "Text files (*.txt)|*.txt;*.TXT|All files (*.*)|*.*" result = dialog.openFileDialog(wildcard=wildcard) if result.accepted: path = result.paths[0] # an error will probably occur here if the text is too large # to fit in the wxTextCtrl (TextArea) or the file is actually # binary. Not sure what happens with CR/LF versus CR versus LF # line endings either self.openFile(path) def on_menuFilePrint_select(self, event): # put your code here for print # the commented code below is from the textEditor tool # and is simply an example #source = textToHtml(self.components.fldDocument.text) #self.printer.PrintText(source) pass def on_menuFilePrintPreview_select(self, event): # put your code here for print preview # the commented code below is from the textEditor tool # and is simply an example #source = textToHtml(self.components.fldDocument.text) #self.printer.PreviewText(source) pass def on_menuFilePageSetup_select(self, event): self.printer.PageSetup() # the following was copied and pasted from the searchexplorer sample def on_menuEditUndo_select(self, event): widget = self.findFocus() if hasattr(widget, 'editable') and widget.canUndo(): widget.undo() def on_menuEditRedo_select(self, event): widget = self.findFocus() if hasattr(widget, 'editable') and widget.canRedo(): widget.redo() def on_menuEditCut_select(self, event): widget = self.findFocus() if hasattr(widget, 'editable') and widget.canCut(): widget.cut() def on_menuEditCopy_select(self, event): widget = self.findFocus() if hasattr(widget, 'editable') and widget.canCopy(): widget.copy() def on_menuEditPaste_select(self, event): widget = self.findFocus() if hasattr(widget, 'editable') and widget.canPaste(): widget.paste() def on_menuEditClear_select(self, event): widget = self.findFocus() if hasattr(widget, 'editable'): if widget.canCut(): # delete the current selection, # if we can't do a Cut we shouldn't be able to delete either # which is why i used the test above sel = widget.replaceSelection('') else: ins = widget.getInsertionPoint() try: widget.replace(ins, ins + 1, '') except: pass def on_menuEditSelectAll_select(self, event): widget = self.findFocus() if hasattr(widget, 'editable'): widget.setSelection(0, widget.getLastPosition()) def on_doHelpAbout_command(self, event): # put your About box here pass if __name__ == '__main__': app = model.Application(MyBackground) app.MainLoop() PythonCard-0.8.2/tools/experimentalResourceEditor/templates/templateFullMenus.rsrc.py0000644000076500007650000000651010137000312031201 0ustar alexalex00000000000000 { 'application':{ 'type':'Application', 'name':'Template', 'backgrounds': [ { 'type':'Background', 'name':'bgTemplate', 'title':'Standard Template with full menus', 'size':( 400, 300 ), 'style':['resizeable'], 'statusBar':1, 'menubar': { 'type':'MenuBar', 'menus': [ { 'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ { 'type':'MenuItem', 'name':'menuFileNew', 'label':'&New\tCtrl+N' }, { 'type':'MenuItem', 'name':'menuFileOpen', 'label':'&Open\tCtrl+O' }, { 'type':'MenuItem', 'name':'menuFileSave', 'label':'&Save\tCtrl+S' }, { 'type':'MenuItem', 'name':'menuFileSaveAs', 'label':'Save &As...' }, { 'type':'MenuItem', 'name':'fileSep1', 'label':'-' }, { 'type':'MenuItem', 'name':'menuFilePageSetup', 'label':'Page Set&up...' }, { 'type':'MenuItem', 'name':'menuFilePrint', 'label':'&Print...\tCtrl+P' }, { 'type':'MenuItem', 'name':'menuFilePrintPreview', 'label':'Print Pre&view' }, { 'type':'MenuItem', 'name':'fileSep2', 'label':'-' }, { 'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit', } ] }, # most of the edit menu was copied from the searchexplorer sample {'type':'Menu', 'name':'Edit', 'label':'&Edit', 'items': [ { 'type':'MenuItem', 'name':'menuEditUndo', 'label':'&Undo\tCtrl+Z'}, { 'type':'MenuItem', 'name':'menuEditRedo', 'label':'&Redo\tCtrl+Y'}, { 'type':'MenuItem', 'name':'editSep1', 'label':'-' }, { 'type':'MenuItem', 'name':'menuEditCut', 'label':'Cu&t\tCtrl+X'}, { 'type':'MenuItem', 'name':'menuEditCopy', 'label':'&Copy\tCtrl+C'}, { 'type':'MenuItem', 'name':'menuEditPaste', 'label':'&Paste\tCtrl+V'}, { 'type':'MenuItem', 'name':'editSep2', 'label':'-' }, { 'type':'MenuItem', 'name':'menuEditClear', 'label':'Cle&ar\tDel'}, { 'type':'MenuItem', 'name':'menuEditSelectAll', 'label':'Select A&ll\tCtrl+A'} ] }, { 'type':'Menu', 'name':'menuHelp', 'label':'&Help', 'items': [ { 'type':'MenuItem', 'name':'menuHelpAbout', 'label':'&About ...', 'command':'doHelpAbout'}, ] }, ] }, 'components': [ ] } ] } } PythonCard-0.8.2/tools/experimentalResourceEditor/templates/templateNoMenus.py0000644000076500007650000000061410137000312027702 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.1 $" __date__ = "$Date: 2004/10/24 19:21:46 $" """ from PythonCard import model class MyBackground(model.Background): def on_initialize(self, event): # if you have any initialization # including sizer setup, do it here pass if __name__ == '__main__': app = model.Application(MyBackground) app.MainLoop() PythonCard-0.8.2/tools/experimentalResourceEditor/templates/templateNoMenus.rsrc.py0000644000076500007650000000040510137000312030650 0ustar alexalex00000000000000 { 'application':{ 'type':'Application', 'name':'Template', 'backgrounds': [ { 'type':'Background', 'name':'bgTemplate', 'title':'Standard Template with no menus', 'size':( 400, 300 ), 'components': [ ] } ] } } PythonCard-0.8.2/tools/findfiles/0000755000076500007650000000000010434046772016624 5ustar alexalex00000000000000PythonCard-0.8.2/tools/findfiles/findfiles.py0000644000076500007650000004370010130630672021134 0ustar alexalex00000000000000#!/usr/bin/python """ KEA notes to myself Created: 2001-07-25 __version__ = "$Revision: 1.86 $" __date__ = "$Date: 2004/10/05 23:43:54 $" __author__ = "Kevin Altis " 2002-06-11 converted from regex to re, see these helpful pages for more info http://py-howto.sourceforge.net/regex-to-re/ http://py-howto.sourceforge.net/regex-to-re/node3.html """ import urllib import webbrowser import pprint import os, sys import re from PythonCard import configuration, dialog, log, model, util import wx # KEA 2004-07-22 # force imports for components used in .rsrc.py file # so we can do a make standalones with py2exe and bundlebuilder from PythonCard.components import button, checkbox, combobox, list, statictext, textfield LASTGREPFILE = 'findfiles.grep' USERCONFIG = 'user.config.txt' pythoncard_url = util.documentationURL("documentation.html") findfiles_url = util.documentationURL("findfiles.html") class FindFiles(model.Background): def on_initialize(self, event): self.dir = None self.documentPath = None self.documentChanged = 0 # there should probably be a menu item to # raise and lower the font size if wx.Platform in ('__WXMAC__', '__WXGTK__'): font = self.components.listResults.font if wx.Platform == '__WXMAC__': font.size = 10 elif wx.Platform == '__WXGTK__': font.size = 12 self.components.listResults.font = font # KEA 2002-06-27 # copied from codeEditor.py # wxFileHistory isn't wrapped, so use raw wxPython # also the file list gets appended to the File menu # rather than going in front of the Exit menu # I suspect I have to add the Exit menu after the file history # which means changing how the menus in resources are loaded # so I'll do that later self.fileHistory = wx.FileHistory() fileMenu = self.GetMenuBar().GetMenu(0) self.fileHistory.UseMenu(fileMenu) wx.EVT_MENU_RANGE(self, wx.ID_FILE1, wx.ID_FILE9, self.OnFileHistory) self.sizerLayout() self.configPath = os.path.join(configuration.homedir, 'findfiles') self.loadConfig() path = os.path.join(self.configPath, LASTGREPFILE) self.loadGrepFile(path) def sizerLayout(self): sizer1 = wx.BoxSizer(wx.VERTICAL) sizer2 = wx.FlexGridSizer(3, 4, 3, 10) sizer3 = wx.BoxSizer(wx.HORIZONTAL) stcSizerAttrs = wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL fldSizerAttrs = wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL vertFlags = wx.LEFT | wx.TOP | wx.ALIGN_LEFT chkSizerAttrs = wx.RIGHT | wx.ALIGN_CENTER_VERTICAL comp = self.components # sadly this doesn't look good on the Mac #w, h = comp.lblSearchFor.size #sizer3.Add((w + 10, 5), 0) # spacer sizer3.Add((5, 5), 0) # spacer sizer3.Add(comp.chkCaseSensitive, 0, chkSizerAttrs, 20) sizer3.Add(comp.chkSearchSubdirectories, 0, chkSizerAttrs, 20) #sizer3.Add(comp.chkVerbose, 0, chkSizerAttrs, 20) sizer3.Add(comp.chkOpenWithResourceEditor, 0, chkSizerAttrs, 20) sizer3.Add(comp.btnViewFile, 0, chkSizerAttrs, 20) sizer2.Add(comp.lblSearchFor, flag=stcSizerAttrs) sizer2.Add(comp.fldSearchPattern, flag=fldSizerAttrs) sizer2.Add(comp.btnSearch, flag=fldSizerAttrs) sizer2.Add(comp.btnCancel, flag=fldSizerAttrs) sizer2.Add(comp.lblDirectories, flag=stcSizerAttrs) sizer2.Add(comp.fldDirectories, flag=fldSizerAttrs) sizer2.Add(comp.btnAddDirs, flag=fldSizerAttrs) sizer2.Add((5, 5), 0) # spacer sizer2.Add(comp.lblFileTypes, flag=stcSizerAttrs) sizer2.Add(comp.fldWildcard, flag=fldSizerAttrs) sizer2.Add((5, 5), 0) # spacer sizer2.Add((5, 5), 0) # spacer sizer1.Add(sizer2, 0, vertFlags) sizer1.Add((5, 5), 0) # spacer sizer1.Add(sizer3, 0, vertFlags) sizer1.Add((5, 5), 0) # spacer sizer1.Add(comp.listResults, 1, wx.EXPAND) sizer1.Fit(self) sizer1.SetSizeHints(self) self.panel.SetSizer(sizer1) self.panel.SetAutoLayout(1) self.panel.Layout() self.visible = True def OnFileHistory(self, event): fileNum = event.GetId() - wx.ID_FILE1 path = self.fileHistory.GetHistoryFile(fileNum) self.loadGrepFile(path) def loadConfig(self): try: if not os.path.exists(self.configPath): os.mkdir(self.configPath) path = os.path.join(self.configPath, USERCONFIG) self.config = util.readAndEvalFile(path) if self.config != {}: if 'findfiles.position' in self.config: self.position = self.config['findfiles.position'] if 'findfiles.size' in self.config: self.size = self.config['findfiles.size'] if 'searches' in self.config: self.components.fldSearchPattern.items = self.config['searches'] if 'history' in self.config: history = self.config['history'] history.reverse() for h in history: self.fileHistory.AddFileToHistory(h) except: self.config = {} def saveConfig(self): self.config['findfiles.position'] = self.GetRestoredPosition() self.config['findfiles.size'] = self.GetRestoredSize() history = [] for i in range(self.fileHistory.GetCount()): history.append(self.fileHistory.GetHistoryFile(i)) # the limitation on the number of items to save is obviously # arbitrary, so I guess this could be made a setting as well self.config['searches'] = self.components.fldSearchPattern.items[:100] self.config['history'] = history try: path = os.path.join(self.configPath, USERCONFIG) f = open(path, "w") pprint.pprint(self.config, f) f.close() except: pass # argh def on_close(self, event): # kill search loop if needed self.stopSearching = True path = os.path.join(self.configPath, LASTGREPFILE) self.saveGrepFile(path) self.saveConfig() event.skip() def on_menuFileOpen_select(self, event): # split this method into several pieces to make it more flexible wildcard = "Grep files (*.grep)|*.grep|All files (*.*)|*.*" result = dialog.openFileDialog(wildcard=wildcard) if result.accepted: path = result.paths[0] self.loadGrepFile(path) def on_btnChangeDirs_mouseClick(self, event): wildcard = "Grep files (*.grep)|*.grep" result = dialog.openFileDialog(wildcard=wildcard) if result.accepted: s = result.paths[0] self.dir = os.path.dirname(s) fileList = [] filenames = os.listdir(self.dir) for fName in filenames: root, ext = os.path.splitext(fName) if ext == '.grep': fileList.append(fName) fileList.sort() # again, need a case-insensitive sort self.components.listFiles.items = fileList def setSearchParams(self, searchPattern='', dirs='', wildcard='*', caseSensitive=False, searchSubdirectories=True, verbose=False): self.components.fldDirectories.text = dirs self.components.fldWildcard.text = wildcard self.components.fldSearchPattern.text = searchPattern self.components.chkCaseSensitive.checked = caseSensitive self.components.chkSearchSubdirectories.checked = searchSubdirectories self.components.chkVerbose.checked = verbose def loadGrepFile(self, filename): try: file = open(filename, 'rb') txt = file.read() file.close() dirs, wildcard, searchPattern, caseSensitive, searchSubdirectories, verbose = txt.split('\t') self.setSearchParams(searchPattern, dirs, wildcard, caseSensitive in ('1', 'True'), searchSubdirectories in ('1', 'True'), verbose.rstrip() in ('1', 'True')) self.components.fldSearchPattern.setFocus() self.documentPath = None self.documentChanged = 0 self.fileHistory.AddFileToHistory(filename) except: pass self.components.fldSearchPattern.SetMark(-1, -1) def on_listFiles_select(self, event): try: filename = os.path.join(self.dir, list.stringSelection) self.loadGrepFile(filename) except: pass def toggleSearchCancel(self, state): self.components.btnSearch.enabled = state self.components.btnCancel.enabled = not state def doSearch(self): self.toggleSearchCancel(False) log.info("Grep for %s in %s" % (self.greppattern, self.filpattern)) log.info('#Search '+self.dirpattern) if self.verbose: log.info('# ='+self.dirpattern) log.info('# Files '+self.filpattern) log.info('# For '+self.greppattern) # KEA 2002-06-11 # "There's no equivalent of regex_syntax; # re supports only one syntax, and you can't change it." # http://py-howto.sourceforge.net/regex-to-re/node3.html #regex.set_syntax(regex_syntax.RE_SYNTAX_GREP) if self.casesensitive: self.pat = re.compile(self.greppattern) else: self.pat = re.compile(self.greppattern, re.IGNORECASE) log.info("Searching. Please wait...") patterns = self.filpattern.split(";") self.components.listResults.clear() self.statusBar.text = "Searching..." found = 0 self.stopSearching = False for dir in self.dirpattern.split(';'): for filename in util.dirwalk(dir, patterns, self.recurse): if self.SearchFile(filename): found += 1 if self.stopSearching: break else: self.statusBar.text = "Files found: %d Searching: %s" % (found, filename) wx.SafeYield(self, True) self.statusBar.text = "Files found: %d" % found self.toggleSearchCancel(True) def SearchFile(self, filename): if self.verbose: log.info('# ..'+filename) try: lines = open(filename, 'r').readlines() except: lines = [] found = 0 for i in range(len(lines)): line = lines[i] if self.pat.search(line) is not None: if not found: self.components.listResults.append(filename) found = 1 self.components.listResults.append(' '+`i+1` + ': '+line[:-1]) return found def addTextToItems(self): target = self.components.fldSearchPattern text = target.text items = target.items if not items.count(text): items.insert(0, text) target.items = items target.text = text target.SetInsertionPointEnd() target.SetMark(-1, -1) def on_btnSearch_mouseClick(self, event): self.addTextToItems() self.dirpattern = self.components.fldDirectories.text self.filpattern = self.components.fldWildcard.text if self.filpattern == '': self.filpattern = '*' self.greppattern = self.components.fldSearchPattern.text self.casesensitive = self.components.chkCaseSensitive.checked self.recurse = self.components.chkSearchSubdirectories.checked self.verbose = self.components.chkVerbose.checked #print self.greppattern #print self.dirpattern #print self.filpattern #print self.casesensitive #print self.recurse #print self.verbose self.doSearch() def on_btnCancel_mouseClick(self, event): self.stopSearching = True self.toggleSearchCancel(True) def on_btnAddDirs_mouseClick(self, event): wFldDirectories = self.components.fldDirectories dirs = wFldDirectories.text result = dialog.directoryDialog(self, '', '') if result.accepted: s = result.path if dirs == "": wFldDirectories.text = s else: found = 0 # should the search be case-insensitive? for dir in dirs.split(";"): if s.upper() == dir.upper(): found = 1 break if not found: wFldDirectories.text = dirs + ";" + s def saveGrepFile(self, path): txt = self.components.fldDirectories.text + "\t" + \ self.components.fldWildcard.text + "\t" + \ self.components.fldSearchPattern.text + "\t" + \ str(self.components.chkCaseSensitive.checked) + "\t" + \ str(self.components.chkSearchSubdirectories.checked) + "\t" + \ str(self.components.chkVerbose.checked) + "\n" try: f = open(path, 'wb') f.write(txt) f.close() self.documentPath = path self.documentChanged = 0 self.fileHistory.AddFileToHistory(path) except: pass def on_menuFileSaveAs_select(self, event): wildcard = "Grep files (*.grep)|*.grep|All files (*.*)|*.*" if self.documentPath is None: dir = '' filename = '*.grep' else: dir = os.path.dirname(self.documentPath) filename = os.path.basename(self.documentPath) result = dialog.saveFileDialog(None, "Save As", dir, filename, wildcard) if result.accepted: path = result.paths[0] self.saveGrepFile(path) return True else: return False def editFile(self, filename, lineno=None): if filename == '': return log.debug("filename: " + filename + " lineno: " + str(lineno)) # edit Python scripts with codeEditor # everything else with textEditor # the list of extensions and associated programs to # open with should be user settable if self.components.chkOpenWithResourceEditor.checked and filename.endswith('.rsrc.py'): program = os.path.join("..", "resourceEditor", "resourceEditor.pyw") if not os.path.exists(program): program = os.path.join("..", "resourceEditor", "resourceEditor.py") else: program = os.path.join("..", "codeEditor", "codeEditor.pyw") if not os.path.exists(program): program = os.path.join("..", "codeEditor", "codeEditor.py") # throw an exception if program can't be found? log.debug('program: ' + program) if wx.Platform in ('__WXMAC__', '__WXGTK__'): args = [filename] else: args = ['"' + filename + '"'] if lineno is not None: args.append(str(lineno)) log.debug(args) if ' ' in program: program = '"' + program + '"' python = sys.executable if ' ' in python: pythonQuoted = '"' + python + '"' else: pythonQuoted = python os.spawnv(os.P_NOWAIT, python, [pythonQuoted, program] + args) def on_btnViewFile_mouseClick(self, event): self.on_listResults_mouseDoubleClick(None) def on_listResults_mouseDoubleClick(self, event): target = self.components.listResults #clickLine = target.positionToXY(target.getInsertionPoint())[1] + 1 clickLine = target.selection log.info("clickLine: " + str(clickLine)) # getLineText is 0 based #current = target.getLineText(clickLine - 1) current = target.stringSelection if not current.startswith(" "): self.editFile(current.rstrip()) else: """ if current[:1] == '#': # we have a comment line return current if current[:2] != ' ': # just fake a result line return current[:-1] + "(1) # LLAMA LINE\n" """ delim = current.find(': ') greplineno = current[2:delim] greptext = current[delim+2:] # search backwards in the results until we find # a line that doesn't begin with two spaces, which should # be the full path for the grep result line = '' lineno = clickLine while lineno != 0: lineno = lineno - 1 line = target.getString(lineno) if not line.startswith(" "): break # chop any trailing newline filename = line.rstrip() #print 'delim:', delim #print 'greplineno:', greplineno #print 'greptext:', greptext #print 'filename:', filename #print filename + '(' + greplineno + ') ' + greptext self.editFile(filename, greplineno) def on_fldSearchPattern_keyPress(self, event): keyCode = event.keyCode target = event.target # once the Search button has gotten # focus the return key doesn't appear # to go to the ComboBox anymore # need to investigate further if keyCode == 13: # pressing return also starts a search # just as if the user clicked on the Search button self.on_btnSearch_mouseClick(None) #wx.CallAfter(target.setFocus()) else: event.skip() def on_showFindFilesDocumentation_command(self, event): global findfiles_url webbrowser.open(findfiles_url) def on_showPythonCardDocumentation_command(self, event): global pythoncard_url webbrowser.open(pythoncard_url) if __name__ == '__main__': app = model.Application(FindFiles) app.MainLoop() PythonCard-0.8.2/tools/findfiles/findfiles.rsrc.py0000644000076500007650000000705210130627662022111 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'Find Files', 'backgrounds': [ {'type':'Background', 'name':'FindFiles', 'title':'Find Files', 'size':(700, 550), 'visible':0, 'style':['resizeable'], 'statusBar':1, 'menubar': {'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'File', 'label':'&File', 'items': [ {'type':'MenuItem', 'name':'menuFileOpen', 'label':'&Open\tCtrl+O', }, {'type':'MenuItem', 'name':'menuFileSaveAs', 'label':'Save &As...', }, {'type':'MenuItem', 'name':'fileSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit', }, ] }, {'type':'Menu', 'name':'menuHelp', 'label':'&Help', 'items': [ {'type':'MenuItem', 'name':'menuFindFilesDocumentation', 'label':'&findfiles Documentation...\tF1', 'command':'showFindFilesDocumentation', }, {'type':'MenuItem', 'name':'menuPythonCardDocumentation', 'label':'&PythonCard Documentation...', 'command':'showPythonCardDocumentation', }, ] }, ] }, 'components': [ {'type':'StaticText', 'name':'lblSearchFor', 'position':(5, 5), 'text':'Search for:', }, {'type':'StaticText', 'name':'lblDirectories', 'position':(5, 35), 'text':'Directories:', }, {'type':'StaticText', 'name':'lblFileTypes', 'position':(5, 65), 'text':'File types:', }, {'type':'ComboBox', 'name':'fldSearchPattern', 'position':(65, 2), 'size':(280, -1), }, {'type':'Button', 'name':'btnSearch', 'position':(555, 2), 'label':'Search', 'default':1, }, {'type':'Button', 'name':'btnCancel', 'position':(655, 2), 'label':'Cancel', }, {'type':'TextField', 'name':'fldDirectories', 'position':(65, 32), 'size':(480, -1), }, {'type':'Button', 'name':'btnAddDirs', 'position':(555, 32), 'label':'Add Dirs', }, {'type':'TextField', 'name':'fldWildcard', 'position':(65, 62), 'size':(180, -1), }, {'type':'CheckBox', 'name':'chkCaseSensitive', 'position':(65, 90), 'label':'Case sensitive', }, {'type':'CheckBox', 'name':'chkSearchSubdirectories', 'position':(189, 90), 'checked':1, 'label':'Search subdirectories', }, {'type':'CheckBox', 'name':'chkVerbose', 'position':(341, 90), 'label':'Verbose', 'visible':0, }, {'type':'CheckBox', 'name':'chkOpenWithResourceEditor', 'position':(341, 90), 'checked':0, 'label':'Open .rsrc.py files with resourceEditor', }, {'type':'Button', 'name':'btnViewFile', 'position':(541, 90), 'label':'Open Selected File', }, {'type':'List', 'name':'listResults', 'position':(5, 114), 'size':(680, 150), 'font':{'size': 9, 'family': 'monospace'}, }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/tools/findfiles/macbuild.py0000644000076500007650000000341610135001656020750 0ustar alexalex00000000000000 import os, sys import bundlebuilder # I set this to make adding subfolders into the package easier # KEA 2004-07-22 # rather than hard-coding the path # we'll just get the path from this module ##packageroot = "/Users/kevino/oss/eclass/eclass_builder" packageroot = os.path.abspath(os.path.dirname(__file__)) # for the purposes of building the standalone # change to the directory the build script is in to simplify imports os.chdir(packageroot) # Create the AppBuilder myapp = bundlebuilder.AppBuilder(verbosity=1) # Tell it where to find the main script - the one that loads on startup myapp.mainprogram = os.path.join(packageroot, "findfiles.py") myapp.standalone = 1 myapp.name = "FindFiles" # includePackages forces certain packages to be added to the app bundle ##myapp.includePackages.append("encodings") ##myapp.includePackages.append("_xmlplus") # KEA 2004-07-22 # force imports for components used in .rsrc.py file #from PythonCard.components import button, checkbox, combobox, list, statictext, textfield # Here you add supporting files and/or folders to your bundle ##myapp.resources.append(os.path.join(packageroot, "about")) ##myapp.resources.append(os.path.join(packageroot, "autorun")) ##myapp.resources.append(os.path.join(packageroot, "Graphics")) myapp.resources.append(os.path.join(packageroot, "findfiles.rsrc.py")) # bundlebuilder does not yet have the capability to detect what shared libraries # are needed by your app - so in this case I am adding the wxPython libs manually myapp.libs.append("/usr/local/lib/wxPython-2.5.2.8/lib/libwx_macd-2.5.2.dylib") myapp.libs.append("/usr/local/lib/wxPython-2.5.2.8/lib/libwx_macd-2.5.2.rsrc") myapp.libs.append("/usr/local/lib/wxPython-2.5.2.8/lib/libwx_macd_stc-2.5.2.dylib") # Here we build the app! myapp.setup() myapp.build() PythonCard-0.8.2/tools/findfiles/readme.txt0000644000076500007650000000034707572206177020634 0ustar alexalex00000000000000findfiles can read the .grep files created by PythonWin. It can do a grep search just like PythonWin and display the results. You can double-click on a line in the results and it will open the textEditor sample to the result line.PythonCard-0.8.2/tools/oneEditor/0000755000076500007650000000000010434046772016611 5ustar alexalex00000000000000PythonCard-0.8.2/tools/oneEditor/codePage.py0000644000076500007650000002171610354647171020702 0ustar alexalex00000000000000#!/usr/bin/env python """ __version__ = "$Revision: 1.5 $" __date__ = "$Date: 2005/12/29 02:48:25 $" PythonCard Editor (codeEditor) wiki page http://wiki.wxpython.org/index.cgi/PythonCardEditor wxStyledTextCtrl documentation http://wiki.wxpython.org/index.cgi/wxStyledTextCtrl """ from PythonCard import about, configuration, dialog, log, menu, model, resource, util, registry from PythonCard.templates.dialogs import runOptionsDialog from modules import scriptutils import os, sys import wx from wx import stc from wx.html import HtmlEasyPrinting import pprint from PythonCard import STCStyleEditor from modules import colorizer import cStringIO import webbrowser class CodePage(model.PageBackground): def on_initialize(self, event): self.initSizers() self.setDefaultStyles() self.lastStatus = None self.lastPos = None def initSizers(self): sizer1 = wx.BoxSizer(wx.VERTICAL) sizer1.Add(self.components.document, 1, wx.EXPAND) sizer1.Fit(self) sizer1.SetSizeHints(self) self.panel.SetSizer(sizer1) self.panel.SetAutoLayout(1) self.panel.Layout() def setDefaultStyles(self): config = configuration.getStyleConfigPath() # KEA 2002-05-28 # STCStyleEditor doesn't work yet on OS X if config is not None: STCStyleEditor.initSTC(self.components.document, config, 'python') if self.application.shell is not None: STCStyleEditor.initSTC(self.application.shell, config, 'python') def setEditorStyle(self): try: self.components.document.setEditorStyle(os.path.splitext(self.documentPath)[-1]) except: self.components.document.setEditorStyle('python') def saveAsFile(self): resourceStrings = self.topLevelParent.resource.strings #wildcard = "Python scripts (*.py;*.pyw)|*.py;*.pyw|Text files (*.txt)|*.txt|All files (*.*)|*.*" wildcard = resourceStrings.saveAsWildcard if self.documentPath is None: dir = '' filename = '*.py' else: dir = os.path.dirname(self.documentPath) filename = os.path.basename(self.documentPath) result = dialog.saveFileDialog(None, resourceStrings.saveAs, dir, filename, wildcard) if result.accepted: path = result.paths[0] self.saveFile(path) self.topLevelParent.fileHistory.AddFileToHistory(path) return True else: return False def newFile(self): self.components.document.text = '' self.documentPath = None self.setEditorStyle() self.components.document.SetSavePoint() self.statusBar.text = self.resource.strings.untitled self.lastStatus = None # KEA 2003-07-26 # reset EOL to match platform # this may not actually be what the user expects # so perhaps this should be an option in a dialog?! self.autoSetEOL() self.topLevelParent.setTitleBar(self.resource.strings.untitled) def openFile(self, path): try: self.components.document.SetUndoCollection(0) self.components.document.ClearAll() f = open(path, 'rb') try: self.components.document.text = f.read() finally: f.close() self.documentPath = path os.chdir(os.path.dirname(self.documentPath)) self.components.document.EmptyUndoBuffer() self.components.document.SetUndoCollection(1) self.components.document.SetSavePoint() #self.statusBar.text = path self.lastStatus = None self.topLevelParent.fileHistory.AddFileToHistory(path) # KEA 2002-06-29 # just as a test, let's see how the XML and/or HTML styles # look self.setEditorStyle() self.autoSetEOL() self.topLevelParent.setTitleBar(os.path.split(path)[-1]) wx.CallAfter(self.components.document.SetFocus) except: pass def saveFile(self, path): try: f = open(path, 'wb') try: f.write(self.components.document.text) finally: f.close() self.documentPath = path os.chdir(os.path.dirname(self.documentPath)) self.components.document.SetSavePoint() #self.statusBar.text = path self.lastStatus = None self.setEditorStyle() self.topLevelParent.setTitleBar(os.path.split(path)[-1]) except: pass # KEA 2003-07-26 def autoSetEOL(self): """ when opening an existing file automatically set the EOL mode to match the current line endings for the file if the document is empty then set EOL to the original EOL state """ doc = self.components.document if doc.GetLength(): line = doc.GetLine(0) else: line = os.linesep if line.endswith('\r\n'): doc.SetEOLMode(stc.STC_EOL_CRLF) elif line.endswith('\n'): doc.SetEOLMode(stc.STC_EOL_LF) elif line.endswith('\r'): doc.SetEOLMode(stc.STC_EOL_CR) # Edit menu def on_menuEditUndo_select(self, event): widget = self.findFocus() if hasattr(widget, 'editable') and widget.CanUndo(): widget.Undo() def on_menuEditRedo_select(self, event): widget = self.findFocus() if hasattr(widget, 'editable') and widget.CanRedo(): widget.Redo() def on_menuEditCut_select(self, event): widget = self.findFocus() # KEA 2002-05-03 # no CanCut() method? if hasattr(widget, 'editable'): widget.Cut() def on_menuEditCopy_select(self, event): widget = self.findFocus() # KEA 2002-05-03 # no CanCopy() method? if hasattr(widget, 'editable'): widget.Copy() def on_menuEditPaste_select(self, event): widget = self.findFocus() if hasattr(widget, 'editable') and widget.CanPaste(): widget.Paste() def on_menuEditClear_select(self, event): widget = self.findFocus() if hasattr(widget, 'editable'): widget.ClearSelection() def on_menuEditSelectAll_select(self, event): widget = self.findFocus() if hasattr(widget, 'editable'): widget.SelectAll() def on_document_keyDown(self, event): #print "keyPress", event.keyCode, event.shiftDown, event.controlDown, event.altDown # smart auto-indent on Return # this is brute force and currently assumes 4 space # Guido indentation style keyCode = event.keyCode target = event.target if keyCode == wx.WXK_RETURN: # since we won't be calling skip, insert a newline manually self.components.document.CmdKeyExecute(stc.STC_CMD_NEWLINE) # why isn't GetCurrentLine 0 based? line = target.GetCurrentLine() - 1 txt = target.GetLine(line) stripped = txt.rstrip() # auto-indent block indent = target.GetLineIndentation(line) padding = " " * indent pos = target.GetCurrentPos() if len(stripped) > 0 and stripped[-1] == ':': # KEA 2002-05-06 to do # should use GetStyleAt() on the actual pos of # the : to make sure the style is not wxSTC_P_COMMENTLINE... # actually this is more complex and really when the style # we need to walk backwards until we find a colon not in # one of the comment styles before doing an auto-indent # but I don't feel like getting it all working before 0.6.6 # so this is left as an exercise for the reader ;-) ## whitespace = len(txt) - len(stripped) ## colonPos = target.GetLineEndPosition(line) - whitespace + 1 ## if target.GetStyleAt(colonPos) not in \ ## [stc.STC_P_COMMENTLINE, ## stc.STC_P_COMMENTBLOCK, ## stc.STC_P_TRIPLEDOUBLE ]: padding += " " * 4 target.InsertText(pos, padding) newpos = pos + len(padding) target.SetCurrentPos(newpos) target.SetSelection(newpos, newpos) else: event.skip() # AGT 2004/10/03 # why have this here - just do in top level ??? # but keep this here as a placeholder to remind me to change it def becomeFocus(self): if self.documentPath: self.topLevelParent.setTitleBar(self.documentPath) else: self.topLevelParent.setTitleBar("") # This is no longer a stand-alone - need to add a simple wrapper to test #if __name__ == '__main__': #app = model.Application(CodePage) #app.MainLoop() PythonCard-0.8.2/tools/oneEditor/codePage.rsrc.py0000644000076500007650000000270210130111011021607 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'codeEditor', 'backgrounds': [ {'type':'Background', 'name':'bgCodeEditor', 'title':'Code Page PythonCard Application', 'position':(132, 132), 'size':(407, 308), 'statusBar':1, 'visible':0, 'style':['resizeable'], 'strings': { 'saveAs':'Save As', 'openFile':'Open file', 'chars':'chars', 'gotoLine':'Goto line', 'gotoLineNumber':'Goto line number:', 'sample':'codeEditor sample', 'codeEditor':'codeEditor', 'words':'words', 'documentChangedPrompt':'The text in the %s file has changed.\n\nDo you want to save the changes?', 'saveAsWildcard':'All files (*.*)|*.*|Python scripts (*.py;*.pyw)|*.pyw;*.PY;*.PYW;*.py|Text files (*.txt;*.text)|*.text;*.TXT;*.TEXT;*.txt|HTML and XML files (*.htm;*.html;*.xml)|*.htm;*.xml;*.HTM;*.HTML;*.XML;*.html', 'about':'About codeEditor...', 'document':'Document', 'lines':'lines', 'untitled':'Untitled', 'replaced':'Replaced %d occurances', 'scriptletWildcard':'Python files (*.py)|*.py|All Files (*.*)|*.*', }, 'components': [ {'type':'CodeEditor', 'name':'document', 'position':(2, 2), 'size':(386, 246), 'backgroundColor':(255, 255, 255), }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/tools/oneEditor/images/0000755000076500007650000000000010434046772020056 5ustar alexalex00000000000000PythonCard-0.8.2/tools/oneEditor/images/sizingHandle.bmp0000644000076500007650000000033610130111011023143 0ustar alexalex00000000000000BMÞ6(¨ÔÔÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿPythonCard-0.8.2/tools/oneEditor/Info.plist0000644000076500007650000000366010130111011020532 0ustar alexalex00000000000000 CFBundleDevelopmentRegion English CFBundleDocumentTypes CFBundleTypeExtensions c cgi c++ cp cpp cs css csv dtd h htm html log plist py python pyw sgml sh shtm shtml text txt xhtml xml xsl xslt yaml * CFBundleTypeMIMETypes text/plain CFBundleTypeName Python Module CFBundleTypeOSTypes TEXT **** CFBundleTypeRole Editor CFBundleExecutable CodeEditor CFBundleName CodeEditor CFBundleIdentifier CodeEditor CFBundlePackageType APPL CFBundleGetInfoString 0.8 CFBundleShortVersionString 0.8 CFBundleSignature ???? CFBundleVersion 0.8 (v1.124) CFBundleInfoDictionaryVersion 6.0 PythonCard-0.8.2/tools/oneEditor/macbuild.py0000644000076500007650000000404710135001657020737 0ustar alexalex00000000000000 import os, sys import bundlebuilder import plistlib # I set this to make adding subfolders into the package easier # KEA 2004-07-22 # rather than hard-coding the path # we'll just get the path from this module ##packageroot = "/Users/kevino/oss/eclass/eclass_builder" packageroot = os.path.abspath(os.path.dirname(__file__)) # for the purposes of building the standalone # change to the directory the build script is in to simplify imports os.chdir(packageroot) # Create the AppBuilder myapp = bundlebuilder.AppBuilder(verbosity=1) # Tell it where to find the main script - the one that loads on startup myapp.mainprogram = os.path.join(packageroot, "codeEditor.py") # drag&dropped filenames show up in sys.argv # this doesn't seem to work, need to add additional # import argvemulator in my code? #myapp.argv_emulation=1 # make this app self contained myapp.standalone = 1 myapp.name = "CodeEditor" myapp.plist = plistlib.Plist.fromFile(os.path.join(packageroot, "Info.plist")) # includePackages forces certain packages to be added to the app bundle ##myapp.includePackages.append("encodings") ##myapp.includePackages.append("_xmlplus") # Here you add supporting files and/or folders to your bundle myapp.resources.append(os.path.join(packageroot, "scriptlets")) myapp.resources.append(os.path.join(packageroot, "codeEditor.rsrc.py")) myapp.resources.append(os.path.join(packageroot, "..", "..", "templates", "dialogs", "runOptionsDialog.rsrc.py")) myapp.resources.append(os.path.join(packageroot, "..", "..", "pythoncard_config.txt")) myapp.resources.append(os.path.join(packageroot, "..", "..", "stc-styles.cfg")) # bundlebuilder does not yet have the capability to detect what shared libraries # are needed by your app - so in this case I am adding the wxPython libs manually myapp.libs.append("/usr/local/lib/wxPython-2.5.2.8/lib/libwx_macd-2.5.2.dylib") myapp.libs.append("/usr/local/lib/wxPython-2.5.2.8/lib/libwx_macd-2.5.2.rsrc") myapp.libs.append("/usr/local/lib/wxPython-2.5.2.8/lib/libwx_macd_stc-2.5.2.dylib") # Here we build the app! myapp.setup() myapp.build() PythonCard-0.8.2/tools/oneEditor/modules/0000755000076500007650000000000010434046772020261 5ustar alexalex00000000000000PythonCard-0.8.2/tools/oneEditor/modules/__init__.py0000644000076500007650000000003610130111011022335 0ustar alexalex00000000000000# turn modules into a package PythonCard-0.8.2/tools/oneEditor/modules/backgroundInfoDialog.py0000644000076500007650000000740110130111011024654 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.1 $" __date__ = "$Date: 2004/10/03 23:58:01 $" """ from PythonCard import dialog, model, util import os class BackgroundInfoDialog(model.CustomDialog): def __init__(self, aBg, rsrc): model.CustomDialog.__init__(self, aBg) self.parent = aBg # if some special setup is necessary, do it here self.components.fldName.text = rsrc.name self.components.fldTitle.text = rsrc.title self.components.fldPosition.text = str(rsrc.position) self.components.fldSize.text = str(rsrc.size) self.components.chkStatusBar.checked = rsrc.statusBar if rsrc.foregroundColor is not None: #self.components.fldForegroundColor.text = colorDescription(rsrc.foregroundColor) self.components.fldForegroundColor.text = str(rsrc.foregroundColor) if rsrc.backgroundColor is not None: #self.components.fldBackgroundColor.text = colorDescription(rsrc.backgroundColor) self.components.fldBackgroundColor.text = str(rsrc.backgroundColor) if rsrc.image is not None: self.components.fldImage.text = rsrc.image self.components.chkTiled.checked = rsrc.tiled self.components.chkVisible.checked = rsrc.visible self.components.chkResizeable.checked = (rsrc.style != []) if rsrc.icon is not None: self.components.fldIcon.text = rsrc.icon def on_btnForegroundColor_mouseClick(self, event): result = dialog.colorDialog(self, color=util.colorFromString(self.components.fldForegroundColor.text)) if result.accepted: self.components.fldForegroundColor.text = str(result.color) def on_btnBackgroundColor_mouseClick(self, event): result = dialog.colorDialog(self, color=util.colorFromString(self.components.fldBackgroundColor.text)) if result.accepted: self.components.fldBackgroundColor.text = str(result.color) def on_btnFile_mouseClick(self, event): result = dialog.openFileDialog() if result.accepted: path = result.paths[0] filename = util.relativePath(self.parent.filename, path) self.components.fldImage.text = filename def on_btnIconFile_mouseClick(self, event): wildcard = "Icon Files (*.ico)|*.ico|XPM Files (*.xpm)|*.xpm|All Files (*.*)|*.*" result = dialog.openFileDialog(wildcard=wildcard) if result.accepted: path = result.paths[0] filename = util.relativePath(self.parent.filename, path) self.components.fldIcon.text = filename def backgroundInfoDialog(parent, rsrc): dlg = BackgroundInfoDialog(parent, rsrc) result = dlg.showModal() if result.accepted: result.name = dlg.components.fldName.text result.title = dlg.components.fldTitle.text result.position = eval(dlg.components.fldPosition.text) result.size = eval(dlg.components.fldSize.text) result.statusBar = dlg.components.chkStatusBar.checked result.foregroundColor = util.colorFromString(dlg.components.fldForegroundColor.text) result.backgroundColor = util.colorFromString(dlg.components.fldBackgroundColor.text) if dlg.components.fldImage.text != '': result.image = dlg.components.fldImage.text else: result.image = None result.tiled = dlg.components.chkTiled.checked result.visible = dlg.components.chkVisible.checked if dlg.components.chkResizeable.checked: result.style = ['resizeable'] else: result.style = [] if dlg.components.fldIcon.text != '': result.icon = dlg.components.fldIcon.text else: result.icon = None dlg.destroy() return result PythonCard-0.8.2/tools/oneEditor/modules/backgroundInfoDialog.rsrc.py0000644000076500007650000000616710130111011025634 0ustar alexalex00000000000000{'type':'CustomDialog', 'name':'backgroundInfo', 'title':'Background Info', 'size':(370, 380), 'components': [ {'type':'StaticText', 'name':'stcName', 'position':(10, 10), 'text':'Name:', }, {'type':'StaticText', 'name':'stcTitle', 'position':(10, 35), 'text':'Title:', }, {'type':'StaticText', 'name':'stcPosition', 'position':(10, 60), 'text':'Position:', }, {'type':'StaticText', 'name':'stcSize', 'position':(10, 85), 'text':'Size:', }, {'type':'StaticText', 'name':'stcForegroundColor', 'position':(10, 110), 'text':'Foreground color:', }, {'type':'StaticText', 'name':'stcBackgroundColor', 'position':(10, 135), #'size':(90, -1), 'text':'Background color:', }, {'type':'StaticText', 'name':'stcImage', 'position':(10, 160), 'text':'Image:', }, {'type':'StaticText', 'name':'stcIcon', 'position':(10, 210), 'text':'Icon:', }, {'type':'TextField', 'name':'fldName', 'position':(130, 5), }, {'type':'TextField', 'name':'fldTitle', 'position':(130, 30), 'size':(188, -1), }, {'type':'TextField', 'name':'fldPosition', 'position':(130, 55), 'size':(80, -1), }, {'type':'TextField', 'name':'fldSize', 'position':(130, 80), 'size':(80, -1), }, {'type':'TextField', 'name':'fldForegroundColor', 'position':(130, 110), 'size':(100, -1), }, {'type':'Button', 'name':'btnForegroundColor', 'position':(250, 110), 'label':'Color...', }, {'type':'TextField', 'name':'fldBackgroundColor', 'position':(130, 135), 'size':(100, -1), }, {'type':'Button', 'name':'btnBackgroundColor', 'position':(250, 135), 'label':'Color...', }, {'type':'TextField', 'name':'fldImage', 'position':(130, 160), 'size':(100, -1), }, {'type':'Button', 'name':'btnFile', 'position':(250, 160), 'label':'File...', }, {'type':'CheckBox', 'name':'chkTiled', 'position':(130, 185), 'size':(135, -1), 'checked':0, 'label':'Tile image', }, {'type':'TextField', 'name':'fldIcon', 'position':(130, 210), 'size':(100, -1), }, {'type':'Button', 'name':'btnIconFile', 'position':(250, 210), 'label':'File...', }, {'type':'CheckBox', 'name':'chkStatusBar', 'position':(130, 235), 'checked':0, 'label':'Status bar on window', }, {'type':'CheckBox', 'name':'chkVisible', 'position':(130, 260), 'size':(135, -1), 'checked':1, 'label':'Visible at startup', }, {'type':'CheckBox', 'name':'chkResizeable', 'position':(130, 285), 'size':(135, -1), 'checked':0, 'label':'Resizeable', }, {'type':'Button', 'name':'btnOK', 'position':(10, 320), 'label':'OK', 'default':1, 'id':5100, }, {'type':'Button', 'name':'btnCancel', 'position':(115, 320), 'label':'Cancel', 'id':5101, }, ] # end components } # end CustomDialog PythonCard-0.8.2/tools/oneEditor/modules/colorizer.py0000644000076500007650000001075510130111011022617 0ustar alexalex00000000000000""" MoinMoin - Python Source Parser KEA, modified for PythonCard to use wxSTC styles 2002-06-28 __version__ = "$Revision: 1.1 $" __date__ = "$Date: 2004/10/03 23:58:01 $" """ # Imports import cgi, sys, cStringIO import keyword, token, tokenize import os from PythonCard import configuration, STCStyleEditor cfg = STCStyleEditor.initFromConfig(configuration.getStyleConfigPath(), 'python') # cfg is a big tuple styles = cfg[3] styleDict = {} # build style dict based on given styles for numStyle in styles: num, style = STCStyleEditor.parsePropLine(numStyle) attributes = style.split(',') for a in attributes: if a.startswith('fore:'): foreColor = a[a.find(':')+1:] styleDict[num] = foreColor else: if num not in styleDict: styleDict[num] = "#000000" ############################################################################# ### Python Source Parser (does Hilighting) ############################################################################# _KEYWORD = token.NT_OFFSET + 1 _TEXT = token.NT_OFFSET + 2 """ _colors = { token.NUMBER: '#0080C0', token.OP: '#0000C0', token.STRING: '#004080', tokenize.COMMENT: '#008000', token.NAME: '#000000', token.ERRORTOKEN: '#FF8080', _KEYWORD: '#C00000', _TEXT: '#000000', } """ _colors = { token.NUMBER: styleDict[2], token.OP: styleDict[10], token.STRING: styleDict[3], tokenize.COMMENT: styleDict[1], token.NAME: styleDict[11], token.ERRORTOKEN: '#FF8080', _KEYWORD: styleDict[5], _TEXT: styleDict[0], } class Parser: """ Send colored python source. """ def __init__(self, raw, out = sys.stdout): """ Store the source text. """ self.raw = raw.expandtabs().strip() self.out = out def format(self, formatter, form): """ Parse and send the colored source. """ # store line offsets in self.lines self.lines = [0, 0] pos = 0 while 1: pos = self.raw.find('\n', pos) + 1 if not pos: break self.lines.append(pos) self.lines.append(len(self.raw)) # parse the source and write it self.pos = 0 text = cStringIO.StringIO(self.raw) self.out.write('

')
        try:
            tokenize.tokenize(text.readline, self)
        except tokenize.TokenError, ex:
            msg = ex[0]
            line = ex[1][0]
            self.out.write("

ERROR: %s

%s\n" % ( msg, self.raw[self.lines[line]:])) self.out.write('
') def __call__(self, toktype, toktext, (srow,scol), (erow,ecol), line): """ Token handler. """ if 0: print "type", toktype, token.tok_name[toktype], "text", toktext, print "start", srow,scol, "end", erow,ecol, "
" # calculate new positions oldpos = self.pos newpos = self.lines[srow] + scol self.pos = newpos + len(toktext) # handle newlines if toktype in [token.NEWLINE, tokenize.NL]: self.out.write('\n') return # send the original whitespace, if needed if newpos > oldpos: self.out.write(self.raw[oldpos:newpos]) # skip indenting tokens if toktype in [token.INDENT, token.DEDENT]: self.pos = newpos return # map token type to a color group if token.LPAR <= toktype and toktype <= token.OP: toktype = token.OP elif toktype == token.NAME and keyword.iskeyword(toktext): toktype = _KEYWORD color = _colors.get(toktype, _colors[_TEXT]) style = '' if toktype == token.ERRORTOKEN: style = ' style="border: solid 1.5pt #FF0000;"' # send text self.out.write('' % (color, style)) self.out.write(cgi.escape(toktext)) self.out.write('') if __name__ == "__main__": import os, sys print "Formatting..." # assume first argument is the filename filename = sys.argv[1] print filename url = filename + '.html' # open own source source = open(filename).read() # write colorized version to "python.html" Parser(source, open(url, 'wt')).format(None, None) print "Opening..." import webbrowser webbrowser.open(url, 1, 1) PythonCard-0.8.2/tools/oneEditor/modules/dialogInfoDialog.py0000644000076500007650000000171510130111011023776 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.1 $" __date__ = "$Date: 2004/10/03 23:58:01 $" """ from PythonCard import dialog, model import os class DialogInfoDialog(model.CustomDialog): def __init__(self, aBg, rsrc): model.CustomDialog.__init__(self, aBg) self.parent = aBg # if some special setup is necessary, do it here self.components.fldName.text = rsrc.name self.components.fldTitle.text = rsrc.title self.components.fldPosition.text = str(rsrc.position) self.components.fldSize.text = str(rsrc.size) def dialogInfoDialog(parent, rsrc): dlg = DialogInfoDialog(parent, rsrc) result = dlg.showModal() if result.accepted: result.name = dlg.components.fldName.text result.title = dlg.components.fldTitle.text result.position = eval(dlg.components.fldPosition.text) result.size = eval(dlg.components.fldSize.text) dlg.destroy() return result PythonCard-0.8.2/tools/oneEditor/modules/dialogInfoDialog.rsrc.py0000644000076500007650000000247610130111011024753 0ustar alexalex00000000000000{'type':'CustomDialog', 'name':'dialogInfo', 'title':'Dialog Info', 'size':(370, 170), 'components': [ {'type':'StaticText', 'name':'stcName', 'position':(10, 10), 'size':(45, -1), 'text':'Name:', }, {'type':'StaticText', 'name':'stcTitle', 'position':(10, 35), 'size':(45, -1), 'text':'Title:', }, {'type':'StaticText', 'name':'stcPosition', 'position':(10, 60), 'size':(45, -1), 'text':'Position:', }, {'type':'StaticText', 'name':'stcSize', 'position':(10, 85), 'size':(45, -1), 'text':'Size:', }, {'type':'TextField', 'name':'fldName', 'position':(110, 5), 'size':(188, -1), }, {'type':'TextField', 'name':'fldTitle', 'position':(110, 30), 'size':(188, -1), }, {'type':'TextField', 'name':'fldPosition', 'position':(110, 55), 'size':(68, -1), }, {'type':'TextField', 'name':'fldSize', 'position':(110, 80), 'size':(68, -1), }, {'type':'Button', 'name':'btnOK', 'position':(10, 110), 'label':'OK', 'default':1, 'id':5100, }, {'type':'Button', 'name':'btnCancel', 'position':(115, 110), 'label':'Cancel', 'id':5101, }, ] # end components } # end CustomDialog PythonCard-0.8.2/tools/oneEditor/modules/menuDialog.py0000644000076500007650000003346610130111011022677 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.1 $" __date__ = "$Date: 2004/10/03 23:58:01 $" """ from PythonCard import log, model, resource import os import wx MENULIST_PADDING = '....' def menuItemAttributes(menuItem): desc = " {'type':'MenuItem',\n" desc += " 'name':'%s',\n" % menuItem['name'] # KEA 2002-05-16 # work on string repr to get strings with mixed ' and " to work correctly if menuItem['shortcut'] == '': desc += """ 'label':%s,\n""" % repr(menuItem['label']) else: desc += """ 'label':%s,\n""" % repr(menuItem['label'] + '\t' + menuItem['shortcut']) try: if menuItem['command'] is not None: desc += " 'command':'%s',\n" % menuItem['command'] except: pass try: if not menuItem['enabled']: desc += " 'enabled':0,\n" except: pass try: if menuItem['checkable']: desc += " 'checkable':1,\n" if menuItem['checked']: desc += " 'checked':1,\n" except: pass desc += " },\n" return desc def menuAttributes(menu): desc = " {'type':'Menu',\n" desc += " 'name':'%s',\n" % menu['name'] desc += """ 'label':%s,\n""" % repr(menu['label']) desc += " 'items': [\n" return desc def menuResourceFromList(menuList): #desc = " 'menubar': {'type':'MenuBar',\n" desc = "{'type':'MenuBar',\n" desc += " 'menus': [\n" inMenu = 0 for m in menuList: if m['type'] == 'Menu': if inMenu: # close Menu desc += " ]\n" desc += " },\n" desc += menuAttributes(m) inMenu = 1 else: desc += menuItemAttributes(m) # close Menu desc += " ]\n" desc += " },\n" # close MenuBar desc += " ]\n" desc += "}\n" d = eval(desc) return resource.Resource(d) class MenuDialog(model.CustomDialog): def __init__(self, aBg, rsrc): model.CustomDialog.__init__(self, aBg) self.parent = aBg # if some special setup is necessary, do it here if rsrc is not None: #aBg.printMenubar(rsrc) self.menuList = self.parseMenus(rsrc) else: self.menuList = [] for m in self.menuList: if m['type'] == 'Menu': self.components.listMenus.append(m['label']) else: self.components.listMenus.append(MENULIST_PADDING + m['label']) #self.components.listMenus.items = self.parseMenus(rsrc) # Esc doesn't seem to work, it ends up closing the dialog # so need to work on that self.keyCodes = {wx.WXK_ESCAPE:'ESC', wx.WXK_SPACE:'Space', wx.WXK_DELETE:'Del', wx.WXK_F1:'F1', wx.WXK_F2:'F2', wx.WXK_F3:'F3', wx.WXK_F4:'F4', wx.WXK_F5:'F5', wx.WXK_F6:'F6', wx.WXK_F7:'F7', wx.WXK_F8:'F8', wx.WXK_F9:'F9', wx.WXK_F10:'F10', wx.WXK_F11:'F11', wx.WXK_F12:'F12', } #self.components.fldName.text = rsrc.application.name #self.components.fldTitle.text = rsrc.application.title #self.components.fldPosition.text = str(rsrc.application.position) #self.components.fldSize.text = str(rsrc.application.size) #self.components.chkStatusBar.checked = rsrc.application.statusBar def buildMenu(self, name, label): m = {} m['type'] = 'Menu' m['name'] = name m['label'] = label return m def buildMenuItem(self, name, label, shortcut, command, enabled, checkable, checked): m = {} m['type'] = 'MenuItem' m['name'] = name m['label'] = label m['shortcut'] = shortcut m['command'] = command m['enabled'] = enabled m['checkable'] = checkable m['checked'] = checked return m def parseMenus(self, menubar): menuList = [] for menu in menubar.menus: #menuList.append(menu.label) #print menu.type, menu.name, menu.label menuList.append(self.buildMenu(menu.name, menu.label)) for menuItem in menu.items: itemParts = menuItem.label.split("\t") label = itemParts[0] try: shortcut = itemParts[1] except: shortcut = '' #menuList.append("....%s" % itemParts[0]) #print menuItem.type, menuItem.name, itemParts, menuItem.command, menuItem.enabled, menuItem.checkable, menuItem.checked menuList.append(self.buildMenuItem(menuItem.name, label, shortcut, menuItem.command, menuItem.enabled, menuItem.checkable, menuItem.checked)) return menuList def on_fldShortcut_keyDown(self, event): # this should handle the special key codes keyCode = event.keyCode if keyCode > 32 and keyCode < 127: keyStr = chr(keyCode).upper() elif keyCode in self.keyCodes: keyStr = self.keyCodes[keyCode] else: event.target.text = '' return if event.shiftDown: keyStr = 'Shift+' + keyStr if event.altDown: keyStr = 'Alt+' + keyStr if event.controlDown: keyStr = 'Ctrl+' + keyStr if len(keyStr) > 1: # don't allow just a number or letter # without a modifier # might also need a leading Ctrl or Alt event.target.text = keyStr def on_fldShortcut_keyPress(self, event): pass def on_fldName_loseFocus(self, event): sel = self.components.listMenus.selection try: self.menuList[sel]['name'] = event.target.text log.info(self.menuList[sel]) except: pass def on_fldLabel_loseFocus(self, event): def normalize(label): name = label.replace("&", "").replace(".", "").replace(" ", "") return name sel = self.components.listMenus.selection try: label = event.target.text if self.menuList[sel]['type'] == 'Menu' and self.menuList[sel]['label'] == 'New Menu': oldname = self.menuList[sel]['name'] if oldname == 'menuNewMenu': name = 'menu'+normalize(label) self.menuList[sel]['name'] = name self.components.fldName.text = name elif self.menuList[sel]['type'] == 'MenuItem' and self.menuList[sel]['label'] == 'New Item': oldname = self.menuList[sel]['name'] menuname = 'menuMenu' for i in range(sel+1): if self.menuList[sel-i]['type'] == 'Menu': menuname = self.menuList[sel-i]['name'] break if oldname == menuname+'NewItem': name = menuname+normalize(label) self.menuList[sel]['name'] = name self.components.fldName.text = name self.menuList[sel]['label'] = label if self.menuList[sel]['type'] == 'MenuItem': label = MENULIST_PADDING + label self.components.listMenus.setString(sel, label) log.info(self.menuList[sel]) except: pass def on_fldShortcut_loseFocus(self, event): sel = self.components.listMenus.selection try: if self.menuList[sel]['type'] == 'MenuItem': self.menuList[sel]['shortcut'] = event.target.text log.info(self.menuList[sel]) except: pass def on_fldCommand_loseFocus(self, event): sel = self.components.listMenus.selection try: if self.menuList[sel]['type'] == 'MenuItem': if event.target.text == '': self.menuList[sel]['command'] = None else: self.menuList[sel]['command'] = event.target.text log.info(self.menuList[sel]) except: pass def on_chkEnabled_mouseClick(self, event): sel = self.components.listMenus.selection try: if self.menuList[sel]['type'] == 'MenuItem': self.menuList[sel]['enabled'] = event.target.checked log.info(self.menuList[sel]) except: pass def on_chkCheckable_mouseClick(self, event): sel = self.components.listMenus.selection try: if self.menuList[sel]['type'] == 'MenuItem': self.menuList[sel]['checkable'] = event.target.checked log.info(self.menuList[sel]) except: pass def on_chkChecked_mouseClick(self, event): sel = self.components.listMenus.selection try: if self.menuList[sel]['type'] == 'MenuItem': self.menuList[sel]['checked'] = event.target.checked log.info(self.menuList[sel]) except: pass def displayItemAttributes(self, sel): m = self.menuList[sel] self.components.fldListIndex.text = str(sel) self.components.fldName.text = m['name'] self.components.fldLabel.text = m['label'] if m['type'] == 'MenuItem': self.components.fldShortcut.text = m['shortcut'] if m['command'] is None: self.components.fldCommand.text = '' else: self.components.fldCommand.text = m['command'] self.components.chkEnabled.checked = m['enabled'] self.components.chkCheckable.checked = m['checkable'] self.components.chkChecked.checked = m['checked'] self.components.stcShortcut.visible = 1 self.components.stcCommand.visible = 1 self.components.fldShortcut.visible = 1 self.components.fldCommand.visible = 1 self.components.chkEnabled.visible = 1 self.components.chkCheckable.visible = 1 self.components.chkChecked.visible = 1 else: self.components.stcShortcut.visible = 0 self.components.stcCommand.visible = 0 self.components.fldShortcut.visible = 0 self.components.fldCommand.visible = 0 self.components.chkEnabled.visible = 0 self.components.chkCheckable.visible = 0 self.components.chkChecked.visible = 0 def on_listMenus_select(self, event): self.displayItemAttributes(event.target.selection) def rebuildListMenus(self, sel=-1): self.components.listMenus.clear() for m in self.menuList: if m['type'] == 'Menu': self.components.listMenus.append(m['label']) else: self.components.listMenus.append(MENULIST_PADDING + m['label']) if sel != -1: self.components.listMenus.selection = sel def on_btnUp_mouseClick(self, event): sel = self.components.listMenus.selection # a selection of -1 means no selection # a selection of 0 is the first item in the list if sel > 0: temp = self.menuList[sel] self.menuList[sel] = self.menuList[sel - 1] self.menuList[sel - 1] = temp self.rebuildListMenus(sel - 1) def on_btnDown_mouseClick(self, event): sel = self.components.listMenus.selection if sel != -1 and sel < len(self.menuList) - 1: temp = self.menuList[sel] self.menuList[sel] = self.menuList[sel + 1] self.menuList[sel + 1] = temp self.rebuildListMenus(sel + 1) def on_btnDelete_mouseClick(self, event): sel = self.components.listMenus.selection if sel != -1: del self.menuList[sel] self.components.listMenus.delete(sel) if len(self.menuList) > 0: if sel > 0: sel = sel - 1 self.components.listMenus.selection = sel self.displayItemAttributes(sel) def on_btnNewMenu_mouseClick(self, event): sel = self.components.listMenus.selection self.menuList.append(" ") # extend list if sel == -1: sel = len(self.menuList) - 1 else: self.menuList[sel+1:] = self.menuList[sel:-1] sel = sel+1 self.menuList[sel] = self.buildMenu('menuNewMenu', 'New Menu') self.rebuildListMenus(sel) self.displayItemAttributes(sel) def on_btnNewMenuItem_mouseClick(self, event): sel = self.components.listMenus.selection self.menuList.append(" ") # extend list if sel == -1: sel = len(self.menuList) - 1 else: self.menuList[sel+1:] = self.menuList[sel:-1] sel = sel+1 name = 'menuMenu' for i in range(1, sel+1): if self.menuList[sel-i]['type'] == 'Menu': name = self.menuList[sel-i]['name'] break self.menuList[sel] = self.buildMenuItem(name+'NewItem', 'New Item', '', None, 1, 0, 0) self.rebuildListMenus(sel) self.displayItemAttributes(sel) def menuDialog(parent, rsrc): dlg = MenuDialog(parent, rsrc) result = dlg.showModal() if result.accepted: if len(dlg.menuList) == 0: result.menubar = None else: result.menubar = menuResourceFromList(dlg.menuList) dlg.destroy() return result PythonCard-0.8.2/tools/oneEditor/modules/menuDialog.rsrc.py0000644000076500007650000000453510130111011023642 0ustar alexalex00000000000000{'type':'CustomDialog', 'name':'menuDialog', 'title':'Menu Editor', 'size':(480, 300), 'components': [ {'type':'List', 'name':'listMenus', 'position':(0, 0), 'size':(185, 185), 'items':[], }, {'type':'Button', 'name':'btnUp', 'position':(5, 190), 'size':(50, -1), 'label':'Up', }, {'type':'Button', 'name':'btnDown', 'position':(60, 190), 'size':(60, -1), 'label':'Down', }, {'type':'Button', 'name':'btnDelete', 'position':(125, 190), 'size':(60, -1), 'label':'Delete', }, {'type':'StaticText', 'name':'stcName', 'position':(200, 10), 'text':'Name:', }, {'type':'StaticText', 'name':'stcLabel', 'position':(200, 35), 'text':'Label:', }, {'type':'StaticText', 'name':'stcShortcut', 'position':(200, 60), 'text':'Shortcut:', }, {'type':'StaticText', 'name':'stcCommand', 'position':(200, 85), 'text':'Command:', }, {'type':'TextField', 'name':'fldListIndex', 'position':(460, 5), 'visible':False, }, {'type':'TextField', 'name':'fldName', 'position':(275, 5), 'size':(188, -1), }, {'type':'TextField', 'name':'fldLabel', 'position':(275, 30), 'size':(188, -1), }, {'type':'TextField', 'name':'fldShortcut', 'position':(275, 55), 'size':(188, -1), }, {'type':'TextField', 'name':'fldCommand', 'position':(275, 80), 'size':(188, -1), }, {'type':'CheckBox', 'name':'chkEnabled', 'position':(275, 110), 'checked':True, 'label':'Enabled', }, {'type':'CheckBox', 'name':'chkCheckable', 'position':(275, 135), 'label':'Checkable', }, {'type':'CheckBox', 'name':'chkChecked', 'position':(275, 160), 'label':'Checked', }, {'type':'Button', 'name':'btnNewMenu', 'position':(220, 190), 'label':'New Menu', }, {'type':'Button', 'name':'btnNewMenuItem', 'position':(320, 190), 'label':'New MenuItem', }, {'type':'Button', 'id':5100, 'name':'btnOK', 'position':(10, 240), 'default':1, 'label':'OK', }, {'type':'Button', 'id':5101, 'name':'btnCancel', 'position':(115, 240), 'label':'Cancel', }, ] # end components } # end CustomDialog PythonCard-0.8.2/tools/oneEditor/modules/newComponentDialog.py0000644000076500007650000000356410130111011024403 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.1 $" __date__ = "$Date: 2004/10/03 23:58:01 $" """ from PythonCard import model class NewComponentDialog(model.CustomDialog): def __init__(self, aBg, original, attributes, offsets, title): model.CustomDialog.__init__(self, aBg) self.parent = aBg self.title = title if title.startswith("New"): add = "" else: add = "Copy" self.components.fldName.text = original['name'] + add if "label" in attributes: self.components.lblLabelOrText.text = "Label:" if "label" in original.keys(): self.components.fldLabelOrText.text = original['label'] + add else: self.components.fldLabelOrText.text = original['name'] + add elif "text" in attributes: self.components.lblLabelOrText.text = "Text:" if "text" in original.keys(): self.components.fldLabelOrText.text = original['text'] + add else: self.components.fldLabelOrText.text = original['name'] + add else: self.components.lblLabelOrText.visible = False self.components.fldLabelOrText.visible = False self.components.fldLabelOrText.enabled = False self.components.chkHorizontal.visible = offsets self.components.chkVertical.visible = offsets def newComponentDialog(aBg, original, attributes, offsets, title): dlg = NewComponentDialog(aBg, original, attributes, offsets, title) result = dlg.showModal() if result.accepted: result.name = dlg.components.fldName.text result.labelortext = dlg.components.fldLabelOrText.text result.horizontal = dlg.components.chkHorizontal.checked result.vertical = dlg.components.chkVertical.checked dlg.destroy() return result PythonCard-0.8.2/tools/oneEditor/modules/newComponentDialog.rsrc.py0000644000076500007650000000216610130111011025350 0ustar alexalex00000000000000{'type':'CustomDialog', 'name':'Template', 'title':'Dialog Template', 'size':(300, 170), 'components': [ {'type':'TextField', 'name':'fldName', 'position':(60, 9), 'size':(230, -1), }, {'type':'TextField', 'name':'fldLabelOrText', 'position':(60, 40), 'size':(230, -1), }, {'type':'CheckBox', 'name':'chkHorizontal', 'position':(10, 80), 'label':'Offset Horizontally', }, {'type':'CheckBox', 'name':'chkVertical', 'position':(170, 80), 'label':'Offset Vertically', }, {'type':'Button', 'id':5100, 'name':'btnOK', 'position':(30, 110), 'label':'OK', }, {'type':'Button', 'id':5101, 'name':'btnCancel', 'position':(130, 110), 'label':'Cancel', }, {'type':'StaticText', 'name':'lblLabelOrText', 'position':(5, 40), 'size':(50, -1), 'alignment':'right', 'text':'Label:', }, {'type':'StaticText', 'name':'lblName', 'position':(5, 10), 'size':(50, -1), 'alignment':'right', 'text':'Name:', }, ] # end components } # end CustomDialog PythonCard-0.8.2/tools/oneEditor/modules/propertyEditor.py0000644000076500007650000004720310130111011023640 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.1 $" __date__ = "$Date: 2004/10/03 23:58:01 $" """ from PythonCard import dialog, font, model, registry, util from PythonCard.event import ChangeListener import resourceOutput import time import os import string import wx # KEA this is a load of dingos' kidneys and needs to be rewritten # 2002-02-22 # now I'm compounding the problem by porting from the original # Property Editor to a PythonCard background class PropertyEditor(model.Background, ChangeListener): def on_initialize(self, event): self._parent = self.GetParent() self._comp = self._parent.components self._updatingComponent = 0 self.autoAttributeUpdate = True ##self.components.addChangeEventListener(self) self._comp.addChangeEventListener(self) self.editItems = [self.components.wField, self.components.wColor, self.components.wFont, self.components.wTextArea, self.components.wChecked, self.components.wPop, self.components.wFile,] # KEA 2001-08-14 # this was causing an assertion error with the hybrid wxPython #self.components.wComponentList.SetSelection(0) if self.components.wComponentList.stringSelection == "": wClass = "" else: wName, wClass = self.components.wComponentList.stringSelection.split(" : ") self.setValidProps(wClass) #self.displayComponents(self.components) self.displayComponents(self._comp) self.visible = True # KEA 2004-08-23 # support updating of attributes without the need # for clicking the Update button def on_wField_closeField(self, event): if self.autoAttributeUpdate: self.updateComponent() def on_wTextArea_closeField(self, event): if self.autoAttributeUpdate: self.updateComponent() def on_wChecked_mouseClick(self, event): if self.autoAttributeUpdate: self.updateComponent() def on_wPop_select(self, event): if self.autoAttributeUpdate: self.updateComponent() def on_wColor_mouseClick(self, event): result = dialog.colorDialog(self, color=util.colorFromString(self.components.wField.text)) if result.accepted: self.components.wField.text = str(result.color) if self.autoAttributeUpdate: self.updateComponent() def on_wFont_mouseClick(self, event): wName, wClass = self.components.wComponentList.stringSelection.split(" : ") ##widget = self.components[wName] widget = self._comp[wName] f = widget.font if f is None: desc = font.fontDescription(widget.GetFont()) f = font.Font(desc) result = dialog.fontDialog(self, f) if result.accepted: #color = dlg.getColor() f = result.font #self.components.wField.SetValue("%s;%s" % (f, color)) self.components.wField.text = "%s" % f if self.autoAttributeUpdate: self.updateComponent() def on_wFile_mouseClick(self, event): path, filename = os.path.split(self.components.wField.text) result = dialog.openFileDialog(self, directory=path, filename=filename) if result.accepted: self.components.wField.text = util.relativePath(self._parent.filename, result.paths[0]) if self.autoAttributeUpdate: self.updateComponent() def addWidgetToComponentList(self, widget): wName = widget.name # KEA 2004-01-25 # just use __name__, the other code must have been something from wxPython 2.3 #wClass = str(widget.__class__).split('.') #self.components.wComponentList.Append(wName + " : " + wClass[len(wClass) - 1]) wClass = widget.__class__.__name__ self.components.wComponentList.Append(wName + " : " + wClass) # KEA 2002-02-23 # need to redo the logic below to avoid asserts in hybrid # versions of wxPython, but also be cleaner def deleteWidgetFromComponentList(self, wName, wClass): i = self.components.wComponentList.GetSelection() j = self.components.wComponentList.FindString(wName + " : " + wClass) if i == -1 or i != j: if j != -1: self.components.wComponentList.Delete(j) else: if j > 0: self.components.wComponentList.SetSelection(j - 1) if j != -1: self.components.wComponentList.Delete(j) if self.components.wComponentList.GetSelection() == -1: self.setValidProps("") self.hideAllBut(self.components.wField) else: wName, wClass = self.components.wComponentList.stringSelection.split(" : ") # deselect the name from properties list self.setValidProps(wClass) propName = self.components.wPropertyList.stringSelection if propName == "": propName = "name" self.components.wPropertyList.stringSelection = "name" self.displayProperty(wName, wClass, propName) def selectComponentList(self, wName, wClass): self.components.wComponentList.stringSelection = wName + " : " + wClass self.setValidProps(wClass) propName = self.components.wPropertyList.stringSelection #print propName if propName == "": propName = "name" self.components.wPropertyList.stringSelection = "name" self.displayProperty(wName, wClass, propName) c = self._parent.components[wName] self._parent.setToolTipDrag(wName, c.position, c.size) def changed(self, event): ##comp = self.components if self._updatingComponent: # KEA 2003-01-04 # hack to speed up updates in place return comp = self._comp wName, wClass = event.getOldValue().split(",") if wName in comp: # new item added self.addWidgetToComponentList(comp[wName]) else: # item deleted self.deleteWidgetFromComponentList(wName, wClass) """ def on_wCopy_mouseClick(self, event): wName, wClass = self.components.wComponentList.stringSelection.split(" : ") # what needs to happen here is to have a method for the Widget class that # will provide a valid resource description, each subclass of widget would # override the method to deal with their specific resource attributes # the Widget class should provide some ordering so that 'type', # 'position', 'size' comes before less commonly used items, the actual # ordering could just be defined in a list, so it is easy to change # also, if the current values match the defaults for a widget attribute # then that attribute should not be provided as part of the output print "this is just a placeholder method right now," print "the resource is not actually copied to the clipboard yet" pprint.pprint(self._comp[wName]) """ def on_wUpdate_mouseClick(self, event): self.updateComponent() def updateComponent(self): # make these attributes of self, since they are duplicated below in displayProperty checkItems = ['enabled', 'visible', 'editable', 'checked', 'default', 'rules', 'labels', 'ticks', 'horizontalScrollbar'] popItems = ['layout', 'border', 'style', 'alignment', 'stringSelection'] cantmodify = ['id', 'name', 'alignment', 'layout', 'style', 'border', 'horizontalScrollbar', \ 'min', 'max', 'columns', 'rules', 'labels', 'ticks'] wName, wClass = self.components.wComponentList.stringSelection.split(" : ") propName = self.components.wPropertyList.stringSelection # KEA 2002-02-23 ##if propName not in cantmodify: #print "updating", wName if propName in checkItems: value = self.components.wChecked.checked elif propName in popItems: value = self.components.wPop.stringSelection elif propName in ('items', 'userdata') or (wClass == 'TextArea' and propName == 'text'): value = self.components.wTextArea.text else: #value = self.components.wField.GetValue() value = self.components.wField.text if propName not in ['label', 'stringSelection', 'text', 'toolTip']: try: value = eval(value) except: pass # KEA 2004-05-10 # need to figure out where to stick validation code # but for now just need to make sure that if we're changing the name # attribute that it is valid, but similar checks will be necessary for # integer fields, a list of items, etc. # also maybe each attribute should have a doc or help string displayed # saying what the attribute does, example values, etc. if propName == 'name': badValue = False # if it isn't valid then display an alert and exit # must start with a letter and only contain alphanumeric characters if value == "" or value[0] not in string.ascii_letters: badValue = True else: alphanumeric = string.ascii_letters + string.digits for c in value: if c not in alphanumeric: badValue = True break if badValue: dialog.alertDialog(None, "Name must start with a letter and only contain letters and numbers.", 'Error: Name is invalid') self.components.wField.setFocus() self.components.wField.setSelection(-1, -1) return # check for duplicate names is done below ##widget = self.components[wName] widget = self._comp[wName] # KEA 2002-02-23 # I can't remember why this is actually necessary if propName == 'size': width, height = value if wClass not in ['BitmapCanvas', 'HtmlWindow']: bestWidth, bestHeight = widget.GetBestSize() if width == -1: width = bestWidth if height == -1: height = bestHeight widget.size = (width, height) #setattr(widget, propName, (width, height)) #print widget.size, propName, width, height else: if (propName in cantmodify) or \ (propName == 'items' and wClass == 'RadioGroup'): order = self._comp.order.index(wName) desc = resourceOutput.widgetAttributes(self._parent, widget) if desc.endswith(',\n'): desc = eval(desc[:-2]) else: desc = eval(desc) if propName == 'name': if value == wName: # user didn't actually change the name return elif value in self._comp: # we already have a component with that name dialog.alertDialog(self, 'Another component already exists with the name ' + value, 'Error: unable to rename component') return if value is None: desc[propName] = 'none' elif propName in ['min', 'max']: desc[propName] = int(value) else: desc[propName] = value # need to experiment with freeze and thaw to avoid # a lot of update events startTime = time.time() # this is going to trigger a changed event # as we delete the old component self._updatingComponent = True del self._comp[wName] if propName == 'name': wName = value # this is going to trigger another changed event # as we create a new component with the changed attribute self._comp[wName] = desc c = self._comp[wName] wx.EVT_LEFT_DOWN(c, self._parent.on_mouseDown) wx.EVT_LEFT_UP(c, self._parent.on_mouseUp) wx.EVT_MOTION(c, self._parent.on_mouseDrag) # now restore the order of the component # have to update the startName in case the name was updated if propName == 'name': self._parent.startName = wName self._comp.order.remove(wName) self._comp.order.insert(order, wName) self._parent.fixComponentOrder(wName) self._updatingComponent = False endTime = time.time() #print "attribute change took:", endTime - startTime else: if wClass in ['Image', 'ImageButton'] and propName == 'file': cwd = os.getcwd() try: os.chdir(self._parent.filename) except: pass setattr(widget, propName, value) os.chdir(cwd) else: setattr(widget, propName, value) #print propName, value # KEA 2002-02-23 self._parent.showSizingHandles(wName) def setValidProps(self, wClass): #print "setValidProps", wClass oldProp = self.components.wPropertyList.stringSelection if wClass == "": self.components.wPropertyList.Clear() else: ##props = self.propList + self.optionalProps[wClass] ##props.sort() ##print "props", props # get the property (attribute) list from the spec klass = registry.Registry.getInstance().getComponentClass(wClass) props = klass._spec.getAttributes().keys() # KEA 2002-03-24 # only show the 'id' attribute for Button # and only when displaying dialog properties if not (self._parent.editingDialog and wClass == 'Button'): props.remove('id') props.sort() ##print "spec props", specProps self.components.wPropertyList.Clear() self.components.wPropertyList.InsertItems(props, 0) if oldProp in props: self.components.wPropertyList.stringSelection = oldProp def hideAllBut(self, widget): for w in self.editItems: if widget.id != w.id: w.visible = False def displayProperty(self, wName, wClass, propName): checkItems = ['enabled', 'visible', 'editable', 'checked', 'default', 'rules', 'labels', 'ticks', 'horizontalScrollbar'] popItems = ['layout', 'border', 'style', 'alignment', 'stringSelection'] self.components.wName.text = propName + ":" ##widget = self.components[wName] widget = self._comp[wName] if propName in ['label', 'stringSelection', 'text', 'toolTip'] or propName in checkItems: value = getattr(widget, propName) else: value = str(getattr(widget, propName)) if propName in checkItems: self.hideAllBut(self.components.wChecked) self.components.wChecked.visible = True self.components.wChecked.checked = value elif propName in popItems: self.hideAllBut(self.components.wPop) self.components.wPop.visible = True self.components.wPop.Clear() if propName == 'stringSelection': for v in widget.items: self.components.wPop.Append(v) else: for v in widget._spec.getAttributes()[propName].values: self.components.wPop.Append(v) try: self.components.wPop.stringSelection = value except: # if value is empty or doesn't already exist pass elif propName in ('items', 'userdata') or (wClass == 'TextArea' and propName == 'text'): #print 'displaying TextArea' self.hideAllBut(self.components.wTextArea) self.components.wTextArea.visible = True self.components.wTextArea.text = value else: self.hideAllBut(self.components.wField) self.components.wField.visible = True if propName == 'foregroundColor' or propName == 'backgroundColor': self.components.wColor.visible = True elif propName == 'font': self.components.wFont.visible = True elif propName == 'file': self.components.wFile.visible = True self.components.wName.text = propName + ":" # KEA 2002-02-23 # I can't remember why this is actually necessary if propName == 'size': width, height = getattr(widget, propName) if wClass not in ['BitmapCanvas', 'HtmlWindow']: bestWidth, bestHeight = widget.GetBestSize() if width == bestWidth: width = -1 if height == bestHeight: height = -1 size = (width, height) value = str(size) self.components.wField.text = value # this should only display if the attribute is settable # so name, alignment, and others are read-only # KEA 2002-02-23 # wUpdate is always visible now self.components.wUpdate.visible = True def on_wComponentList_select(self, event): #print 'selectComponentListEvent: %s\n' % event.GetString() wName, wClass = event.GetString().split(" : ") # change the wPropertiesList to only show relevant properties # either display the name by default or try and preserve the # wPropertiesList selection and display that item, so for example # you could look at size for all widgets, simply by going up and down # the components list self.setValidProps(wClass) propName = self.components.wPropertyList.stringSelection #print propName if propName == "": propName = "name" self.components.wPropertyList.stringSelection = "name" self.displayProperty(wName, wClass, propName) self._parent.showSizingHandles(wName) c = self._parent.components[wName] self._parent.setToolTipDrag(wName, c.position, c.size) def on_wPropertyList_select(self, event): propName = event.GetString() wName, wClass = self.components.wComponentList.stringSelection.split(" : ") if wName != "": self.displayProperty(wName, wClass, propName) def clearComponentList(self): self.components.wComponentList.Clear() self.statusBar.text = '' def clearPropertyList(self): self.components.wPropertyList.Clear() def displayComponents(self, components): self.components.wComponentList.Freeze() self.components.wComponentList.Clear() self._comp = components for c in components.order: if c not in self._parent.sizingHandleNames: self.addWidgetToComponentList(components[c]) self.components.wComponentList.Thaw() self.components.wComponentList.Refresh() self.components.wComponentList.Update() def on_close(self, event): self.visible = False parent = self.GetParent() parent.menuBar.setChecked('menuViewPropertyEditor', 0) PythonCard-0.8.2/tools/oneEditor/modules/propertyEditor.rsrc.py0000644000076500007650000000362410130111011024607 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'Template', 'backgrounds': [ {'type':'Background', 'name':'bgTemplate', 'title':'resourceEditor Property Editor', 'size':(405, 270), 'visible':0, 'statusBar':1, 'components': [ {'type':'Button', 'name':'wUpdate', 'position':(320, 195), 'label':'Update', 'visible':0, 'default':1, }, {'type':'Choice', 'name':'wPop', 'position':(130, 130), 'size':(-1, 21), 'items':[], 'visible':0, }, {'type':'CheckBox', 'name':'wChecked', 'position':(130, 132), 'visible':0, 'label':'', }, {'type':'TextArea', 'name':'wTextArea', 'position':(130, 130), 'size':(260, 50), 'visible':0, }, {'type':'Button', 'name':'wFont', 'position':(320, 130), 'label':'Font...', 'visible':0, }, {'type':'Button', 'name':'wColor', 'position':(320, 130), 'label':'Color...', 'visible':0, }, {'type':'Button', 'name':'wFile', 'position':(320, 130), 'label':'File...', 'visible':0, }, {'type':'TextField', 'name':'wField', 'position':(130, 130), 'size':(180, -1), }, {'type':'StaticText', 'name':'wName', 'position':(5, 135), 'size':(120, -1), 'alignment':'right', 'text':'name:', }, {'type':'List', 'name':'wPropertyList', 'position':(225, 20), 'size':(165, 100), 'items':[], }, {'type':'List', 'name':'wComponentList', 'position':(5, 20), 'size':(200, 100), 'items':[], }, {'type':'StaticText', 'name':'Properties', 'position':(228, 3), 'text':'Properties', }, {'type':'StaticText', 'name':'stcNameClass', 'position':(5, 3), 'text':'Name : Class', }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/tools/oneEditor/modules/resourceOutput.py0000644000076500007650000002356210402012531023670 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.3 $" __date__ = "$Date: 2006/03/03 10:07:21 $" """ import wx SPACES = ' ' def colorDescription(color): if isinstance(color, str): return "'%s'" % color else: return "%s" % str(color) # this is a complete hack job in order to avoid # outputting defaults def widgetAttributes(background, aWidget): # this might be overly aggressive # it could be that the normal default of white might be different on these # various widgets rather than being the same, so the wxTextCtrl is # not a good comparison flds = ['TextField', 'PasswordField', 'TextArea'] txtWidgets = ['TextField', 'PasswordField', 'TextArea', 'Choice', 'List', 'Calendar', 'ComboBox'] imgWidgets = ['Image', 'ImageButton'] comp = background.propertyEditorWindow.components dFgC = comp.wUpdate.foregroundColor.Get() dBgC = comp.wUpdate.backgroundColor.Get() dFont = repr(comp.wUpdate.font) dTextBgC = comp.wField.backgroundColor.Get() # make sure these primary attributes show up # at the beginning of the listing # the remaining ones will be in alphabetical order dStr = "{'type':'%s', \n" % aWidget.__class__.__name__ # KEA 2002-03-24 # only save the special ids if background.editingDialog and aWidget.__class__.__name__ == 'Button': if aWidget.id in [wx.ID_OK, wx.ID_CANCEL, wx.ID_YES, wx.ID_NO]: dStr += " 'id':%d, \n" % aWidget.id dStr += " 'name':'%s', \n" % aWidget.name dStr += " 'position':%s, \n" % str(aWidget.position) # try and determine default sizes width, height = aWidget.size if aWidget.__class__.__name__ in imgWidgets: width, height = aWidget._size elif aWidget.__class__.__name__ not in ['BitmapCanvas', 'HtmlWindow', 'IEHtmlWindow', 'Gauge', 'StaticBox']: bestWidth, bestHeight = aWidget.GetBestSize() if bestWidth == width: width = -1 if bestHeight == height: height = -1 if width != -1 or height != -1: dStr += " 'size':(%d, %d), \n" % (width, height) #for key in aWidget._getAttributeNames(): attributes = aWidget._spec.getAttributes().keys() attributes.sort() for key in attributes: if key in ['id', 'bitmap', 'name', 'position', 'selection', 'size']: pass elif getattr(aWidget, key) is not None: #print aWidget.__class__.__name__, key, getattr(aWidget, key) value = getattr(aWidget, key) if key == 'file' and aWidget.__class__.__name__ in imgWidgets and value == '': dStr += " 'file':'', \n" continue if key == 'alignment' and \ aWidget.__class__.__name__ in ['StaticText', 'PasswordField', 'TextField', 'TextArea'] \ and value == 'left': continue if key == 'border' and aWidget.__class__.__name__ in txtWidgets and value == '3d': continue if key == 'backgroundColor' and \ aWidget.__class__.__name__ in txtWidgets and \ value.Get() == dTextBgC: continue if key == 'foregroundColor' and value.Get() == dFgC: continue if key == 'backgroundColor' and value.Get() == dBgC: continue if key == 'font' and repr(value) == dFont: continue # KEA 2002-07-07 # what other Unicode strings do we need to deal with above? #print key, value, type(value) if isinstance(value, (str, unicode)): # if isinstance(value, unicode): # value = value.encode('ascii', 'ignore') # need to escape strings #pprint.pprint(value) if value != '': dStr += """ %s:%s, \n""" % (repr(key), repr(value)) else: if (key in ['editable', 'enabled', 'visible'] and value == True) or \ (key in ['checked', 'default', 'horizontalScrollbar'] and value == False): # don't include default values pass else: dStr += " '%s':%s, \n" % (key, value) dStr += ' },\n' return dStr def resourceMenuItemAttributes(menuItem): desc = SPACES * 4 + " {'type':'MenuItem',\n" desc += SPACES * 4 + " 'name':'%s',\n" % menuItem.name desc += SPACES * 4 + """ 'label':%s,\n""" % repr(menuItem.label) try: if menuItem.command is not None: desc += SPACES * 4 + " 'command':'%s',\n" % menuItem.command except: pass try: if not menuItem.enabled: desc += SPACES * 4 + " 'enabled':0,\n" except: pass try: if menuItem.checkable: desc += SPACES * 4 + " 'checkable':1,\n" if menuItem.checked: desc += SPACES * 4 + " 'checked':1,\n" except: pass desc += SPACES * 4 + " },\n" return desc def resourceMenuAttributes(menu): desc = SPACES * 3 + " {'type':'Menu',\n" desc += SPACES * 3 + " 'name':'%s',\n" % menu.name desc += SPACES * 3 + """ 'label':%s,\n""" % repr(menu.label) desc += SPACES * 3 + " 'items': [\n" for m in menu.items: desc += resourceMenuItemAttributes(m) desc += SPACES * 3 + " ]\n" desc += SPACES * 3 + " },\n" return desc def resourceMenubarAttributes(menubar): desc = SPACES * 2 + "'menubar': {'type':'MenuBar',\n" desc += SPACES * 2 + " 'menus': [\n" for m in menubar.menus: desc += resourceMenuAttributes(m) desc += SPACES * 2 + " ]\n" desc += SPACES + " },\n" return desc def resourceBackgroundAttributes(background, bg): desc = " {'type':'Background',\n" desc += " 'name':'%s',\n" % bg.name desc += """ 'title':%s,\n""" % repr(bg.title) # KEA 2004-10-04 # need a more sophisticated way of specifying an optional position # but just saving the position the user is editing the window at # is bad, so turn it off for now ## desc += " 'position':%s,\n" % str(background.GetPositionTuple()) desc += " 'size':%s,\n" % str(background.GetSizeTuple()) if bg.statusBar is not None and bg.statusBar: desc += " 'statusBar':1,\n" if bg.foregroundColor is not None: desc += " 'foregroundColor':" + colorDescription(bg.foregroundColor) + ",\n" if bg.backgroundColor is not None: desc += " 'backgroundColor':" + colorDescription(bg.backgroundColor) + ",\n" if bg.icon is not None: desc += " 'icon':'%s',\n" % bg.icon if bg.image is not None: desc += " 'image':'%s',\n" % bg.image if bg.tiled: desc += " 'tiled':1,\n" if not bg.visible: desc += " 'visible':0,\n" if bg.style != []: desc += " 'style':%s,\n" % str(bg.style) desc += "\n" try: desc += resourceMenubarAttributes(bg.menubar) except: pass # KEA 2002-05-15 # strings if bg.strings != {}: desc += " 'strings': {\n" for s in bg.strings.__dict__: desc += """ %s:%s,\n""" % (repr(s), repr(bg.strings.__dict__[s])) desc += " },\n\n" desc += " 'components': [\n\n" return desc def resourceStackAttributes(background): if background.rsrc is None: print "no rsrc" # we should probably blow up here desc = "{'application':{'type':'Application',\n" desc += " 'name':'%s',\n" % background.rsrc.application.name desc += " 'backgrounds': [\n" desc += resourceBackgroundAttributes(background, background.rsrc.application.backgrounds[0]) return desc def resourceDialogAttributes(background, bg): desc = "{'type':'CustomDialog',\n" desc += " 'name':'%s',\n" % bg.name desc += " 'title':'%s',\n" % bg.title desc += " 'position':%s,\n" % str(background.GetPositionTuple()) desc += " 'size':%s,\n" % str(background.GetSizeTuple()) #if bg.statusBar is not None and bg.statusBar: # desc += " 'statusBar':1,\n" #desc += "\n" #if bg.foregroundColor is not None: # desc += " 'foregroundColor':" + colorDescription(bg.foregroundColor) + ",\n" #if bg.backgroundColor is not None: # desc += " 'backgroundColor':" + colorDescription(bg.backgroundColor) + ",\n" #if bg.image is not None: # desc += " 'image':'%s',\n" % bg.image #if bg.tiled != 0: # desc += " 'tiled':1,\n" # KEA 2002-09-12 # strings if bg.strings != {}: desc += "\n 'strings': {\n" for s in bg.strings.__dict__: desc += """ %s:%s,\n""" % (repr(s), repr(bg.strings.__dict__[s])) desc += " },\n\n" desc += " 'components': [\n\n" return desc def resourceAttributes(background): # KEA 2002-03-24 """ editingDialog = 0 try: name = background.rsrc.application.name except: editingDialog = 1 """ if background.editingDialog: desc = resourceDialogAttributes(background, background.rsrc) for w in background.components.order: if w not in background.sizingHandleNames: desc += widgetAttributes(background, background.components[w]) + "\n" desc += "] # end components\n" desc += "} # end CustomDialog\n" else: desc = resourceStackAttributes(background) for w in background.components.order: if w not in background.sizingHandleNames: desc += widgetAttributes(background, background.components[w]) + "\n" desc += "] # end components\n" desc += "} # end background\n" desc += "] # end backgrounds\n" desc += "} }\n" return desc PythonCard-0.8.2/tools/oneEditor/modules/scriptutils.py0000644000076500007650000001014510132337561023213 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.2 $" __date__ = "$Date: 2004/10/10 23:02:09 $" modified version of Pythonwin scriptutils.py """ import os, sys import traceback # KEA 2002-05-08 # should probably refactor this so we're not passing around the background # AGT 2004-10-10 # should refactor whis so we're not passing around 'statusBar' and 'document' def CheckFile(statusBar, document, pathName): what = "check" statusBar.text = what.capitalize()+'ing module...' try: f = open(pathName) except IOError, details: statusBar.text = "Cant open file '%s' - %s" % (pathName, details) return try: code = f.read() + "\n" finally: f.close() try: codeObj = compile(code, pathName,'exec') if RunTabNanny(statusBar, document, pathName): #win32ui.SetStatusText("Python and the TabNanny successfully checked the file '"+os.path.basename(pathName)+"'") statusBar.text = "Python and the TabNanny successfully checked the file '"+os.path.basename(pathName)+"'" except SyntaxError: #background.statusBar.text = 'SyntaxError' _HandlePythonFailure(statusBar, document, what, pathName) def RunTabNanny(statusBar, document, filename): import cStringIO import tabnanny # Capture the tab-nanny output newout = cStringIO.StringIO() old_out = sys.stderr, sys.stdout sys.stderr = sys.stdout = newout try: tabnanny.check(filename) finally: # Restore output sys.stderr, sys.stdout = old_out data = newout.getvalue() if data: try: lineno = data.split()[1] lineno = int(lineno) _JumpToPosition(document, filename, lineno) try: # Try and display whitespace #GetActiveEditControl().SCISetViewWS(1) pass except: pass #win32ui.SetStatusText("The TabNanny found trouble at line %d" % lineno) statusBar.text = "The TabNanny found trouble at line %d" % lineno except (IndexError, TypeError, ValueError): statusBar.text = "The tab nanny complained, but I cant see where!" print data return 0 return 1 def _JumpToPosition(doc, fileName, lineno, col = 1): #JumpToDocument(fileName, lineno, col) #print fileName, lineno, col ###doc = document doc.GotoLine(lineno - 1) if col == 1: pos = doc.PositionFromLine(lineno - 1) doc.SetSelection(pos, doc.GetLineEndPosition(lineno - 1)) doc.SetCurrentPos(pos) else: pos = doc.PositionFromLine(lineno - 1) + col - 1 doc.SetSelection(pos, pos) doc.SetCurrentPos(pos) def _HandlePythonFailure(statusBar, document, what, syntaxErrorPathName = None): typ, details, tb = sys.exc_info() if typ == SyntaxError: try: msg, (fileName, line, col, text) = details if (not fileName or fileName =="") and syntaxErrorPathName: fileName = syntaxErrorPathName _JumpToPosition(document, fileName, line, col) except (TypeError, ValueError): msg = str(details) #win32ui.SetStatusText('Failed to ' + what + ' - syntax error - %s' % msg) statusBar.text = 'Failed to ' + what + ' - syntax error - %s' % msg else: traceback.print_exc() #win32ui.SetStatusText('Failed to ' + what + ' - ' + str(details) ) # KEA 2002-06-03 # this needs to be more robust, but it is better than nothing for # simple indentation errors #try: # see if we have something of the form # (line 10) # for an error message that indicates the line number # the proper solution is to probably get the line number from the # traceback stack frame but I don't know how to do that #print traceback.tb_lineno(tb) try: msg, (fileName, line, col, text) = details _JumpToPosition(document, fileName, line, col) except: pass statusBar.text = 'Failed to ' + what + ' - ' + str(details) tb = None # Clean up a cycle. PythonCard-0.8.2/tools/oneEditor/modules/stackInfoDialog.py0000644000076500007650000000114010130111011023634 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.1 $" __date__ = "$Date: 2004/10/03 23:58:01 $" """ from PythonCard import model import os class StackInfoDialog(model.CustomDialog): def __init__(self, aBg, rsrc): model.CustomDialog.__init__(self, aBg) self.parent = aBg # if some special setup is necessary, do it here self.components.fldName.text = rsrc.application.name def stackInfoDialog(parent): dlg = StackInfoDialog(parent, parent.rsrc) result = dlg.showModal() result.text = dlg.components.fldName.text dlg.destroy() return result PythonCard-0.8.2/tools/oneEditor/modules/stackInfoDialog.rsrc.py0000644000076500007650000000120610130111011024607 0ustar alexalex00000000000000{'type':'CustomDialog', 'name':'stackInfo', 'title':'Stack Info', 'size':(270, 100), 'components': [ {'type':'StaticText', 'name':'stcName', 'position':(10, 10), 'size':(45, -1), 'text':'Name:', }, {'type':'TextField', 'name':'fldName', 'position':(60, 5), 'size':(188, -1), }, {'type':'Button', 'name':'btnOK', 'position':(10, 40), 'label':'OK', 'default':1, 'id':5100, }, {'type':'Button', 'name':'btnCancel', 'position':(115, 40), 'label':'Cancel', 'id':5101, }, ] # end components } # end CustomDialog PythonCard-0.8.2/tools/oneEditor/modules/stringDialog.py0000644000076500007650000001144110130111011023226 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.1 $" __date__ = "$Date: 2004/10/03 23:58:01 $" """ from PythonCard import log, model, resource import os import wx NEWSTRING = 'newString' SPACER = ' : ' def stringResourceFromList(stringList): desc = " {\n" for s in stringList: desc += """ %s:%s,\n""" % (repr(s), repr(stringList[s])) # close strings desc += " }\n" d = eval(desc) return resource.Resource(d) class StringDialog(model.CustomDialog): def __init__(self, aBg, stringList): model.CustomDialog.__init__(self, aBg) self.parent = aBg """ # KEA 2004-08-22 # workaround/hack to make sure closeField message # is processed prior to the dialog being closed # this occurs when one of the fields are edited and then # the user clicks Ok # this hack works because we don't process on_close # the first time, but rather delay it by posting a second close message self.closeDialog = False """ # if some special setup is necessary, do it here self.stringList = stringList sortedStrings = self.stringList.keys() sortedStrings.sort() for s in sortedStrings: label = self.getLabelFromKey(s) self.components.listStrings.append(label) def parseStrings(self, rsrc): stringList = {} for s in rsrc.__dict__: stringList[s] = rsrc.__dict__[s] return stringList def getLabelFromKey(self, key): return key + SPACER + self.stringList[key].split('\n')[0] def updateItemLabel(self, n, key): label = self.getLabelFromKey(key) self.components.listStrings.setString(n, label) def getStringSelectionKey(self): return self.components.listStrings.stringSelection.split()[0] def on_fldName_closeField(self, event): print "closeField fldName", event.target.text newName = event.target.text previousName = self.getStringSelectionKey() # if the name changes then we have to check to see # if the dictionary already has a key with the new # name if newName in self.stringList: # replace? pass else: sel = self.components.listStrings.selection self.stringList[newName] = self.stringList[previousName] del self.stringList[previousName] #self.components.listStrings.setString(sel, newName) self.updateItemLabel(sel, newName) def on_fldValue_closeField(self, event): print "closeField fldValue", event.target.text sel = self.components.listStrings.selection name = self.getStringSelectionKey() self.stringList[name] = event.target.text self.updateItemLabel(sel, name) def displayItemAttributes(self, s): self.components.fldName.text = s self.components.fldValue.text = self.stringList[s] def on_listStrings_select(self, event): self.displayItemAttributes(self.getStringSelectionKey()) def on_btnDelete_mouseClick(self, event): sel = self.components.listStrings.selection name = self.getStringSelectionKey() if sel != -1: del self.stringList[name] self.components.listStrings.delete(sel) if len(self.stringList) > 0: if sel > len(self.stringList) - 1: sel = sel - 1 self.components.listStrings.selection = sel self.displayItemAttributes(self.getStringSelectionKey()) def on_btnNew_mouseClick(self, event): s = NEWSTRING if s in self.stringList: self.components.listStrings.stringSelection = self.getLabelFromKey(s) else: self.stringList[s] = '' sel = len(self.stringList) - 1 self.components.listStrings.append(s) self.components.listStrings.stringSelection = s self.updateItemLabel(sel, s) self.displayItemAttributes(self.getStringSelectionKey()) """ # KEA 2004-08-22 # experiment to workaround Mac closeField bug # ignore for now along with the extra debug print statements in closeField # event handlers above def on_mouseClick(self, event): try: print self.closeDialog print event.target.name print event.target.id except: pass if self.closeDialog: event.skip() else: self.closeDialog = True wx.PostEvent(self, event) """ def stringDialog(parent, rsrc): dlg = StringDialog(parent, rsrc) result = dlg.showModal() if result.accepted: result.stringList = stringResourceFromList(dlg.stringList) dlg.destroy() return result PythonCard-0.8.2/tools/oneEditor/modules/stringDialog.rsrc.py0000644000076500007650000000232310130111011024175 0ustar alexalex00000000000000{'type':'CustomDialog', 'name':'stringDialog', 'title':'String Editor', 'size':(480, 300), 'components': [ {'type':'List', 'name':'listStrings', 'position':(0, 0), 'size':(185, 185), 'items':[], }, {'type':'Button', 'name':'btnNew', 'position':(5, 190), 'label':'New', }, {'type':'Button', 'name':'btnDelete', 'position':(108, 191), 'label':'Delete', }, {'type':'StaticText', 'name':'stcName', 'position':(200, 10), 'text':'Name:', }, {'type':'StaticText', 'name':'stcValue', 'position':(200, 35), 'text':'Value:', }, {'type':'TextField', 'name':'fldListIndex', 'position':(460, 5), 'visible':0, }, {'type':'TextField', 'name':'fldName', 'position':(260, 5), 'size':(188, -1), }, {'type':'TextArea', 'name':'fldValue', 'position':(260, 35), 'size':(188, 197), }, {'type':'Button', 'name':'btnOK', 'position':(10, 240), 'label':'OK', 'default':1, 'id':5100, }, {'type':'Button', 'name':'btnCancel', 'position':(115, 240), 'label':'Cancel', 'id':5101, }, ] # end components } # end CustomDialog PythonCard-0.8.2/tools/oneEditor/readme.txt0000644000076500007650000000715410317014135020602 0ustar alexalex00000000000000Python Source Code Editor The codeEditor sample in PythonCard is focused on being a simple to use Python source code editor. It is not intended to be a generic editor or replace vi(m), Emacs, etc. If you are already happy with your existing editing environment for Python source code, there is no particular reason you have to switch. codeEditor and the resourceEditor and shell will be more tightly integrated as the project progresses so that the user has a simple Integrated Development Environment (IDE) for building desktop applications without needing to use an external program for editing. Based on textEditor sample, but using wxStyledTextCtrl (wxSTC) For more information, see: PythonCard Editor (codeEditor) wiki page http://wiki.wxpython.org/index.cgi/PythonCardEditor wxStyledTextCtrl documentation http://wiki.wxpython.org/index.cgi/wxStyledTextCtrl If you use this sample as a real text editor then you should be careful to always work on backup copies of documents in case there are bugs that might corrupt your text. You can change the style used to display the source code; the style is also used by the PythonCard shell. The last position and size of the window will be saved in a user.config.txt file. The About dialog displays the current filename, character, word, and line count. Scriptlets See the following message in the archive for more info. http://aspn.activestate.com/ASPN/Mail/Message/PythonCard/1181106 Associating Python files with codeEditor on Windows These instructions are for Windows 2000. They may be slightly different on other versions of Windows. 1. Open the Explorer and choose "Folder Options..." under the "Tools" menu 2. Click on the "File Types" tab 3. Scroll down in the "Registered file types" list and select extension "PY Python File" 4. Click on the "Advanced" button 4a. You should be looking at an "Edit File Type" dialog with a list of Actions such as Edit and Open. Open is probably in bold since it is the default action usually associated with .py files. 5. Click on the "New..." button 5a. You should be looking at a "New Action" dialog 6. In the "Action:" field type in a label such as "Edit with PythonCard". This is the label that will show up in the context menu when you right-click on a .py file in the Explorer 7. in the "Application used to perform action:" field you need to specify the path to the Python executable as well as the location of the codeEditor.py file. On a Python 2.3.3 installation using the default installer this will look like: C:\Python23\pythonw.exe C:\Python23\Lib\site-packages\PythonCard\tools\codeEditor\codeEditor.py "%1" Substitute your own paths for the ones above and put quotes (") around the paths with spaces in them, if any. If you want a console when codeEditor.py runs, then use python.exe instead of pythonw.exe 8. Click "OK" 8a. You should now have an "Edit with PythonCard" item in your "Edit File Type" dialog 8b. The item in bold is the default action; Open will be the default if nothing is showing up in bold. Whether you want to "Edit with PythonCard" or "Open" (run) a script when you double-click a file in the Explorer is of course a personal preference. If you want "Edit with PythonCard" as the default action, then select "Edit with PythonCard" in the list, and click the "Set Default" button. 9. Click "OK" 10. Click "Close" in the "Folder Options" dialog 11. Open a directory in the explorer that contains a .py file, then right-click on the file and choose "Edit with PythonCard" and the file should be opened with codeEditor.py 11a. If it doesn't work, double-check the steps above 12. Repeat the process for .pyw files, using the same name and path. PythonCard-0.8.2/tools/oneEditor/resourceEditor.py0000644000076500007650000021104510130111011022130 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.1 $" __date__ = "$Date: 2004/10/03 23:58:01 $" """ # TODO: Start using exceptions! import os, sys import pprint import webbrowser import wx from PythonCard import about, clipboard, configuration, dialog, graphic, log from PythonCard import menu, model, registry, resource, util from PythonCard.templates.dialogs import runOptionsDialog from modules import backgroundInfoDialog from modules import stackInfoDialog from modules import menuDialog from modules import newComponentDialog from modules import stringDialog from modules import dialogInfoDialog from modules.propertyEditor import PropertyEditor from modules import resourceOutput SIZING_HANDLE_SIZE = 7 NUM_SIZING_HANDLES = 8 RESOURCE_TEMPLATE = 'template.rsrc.py' RESOURCE_DIALOG_TEMPLATE = 'dialogTemplate.rsrc.py' USERCONFIG = 'user.config.txt' # KEA doc handling adapted from python_docs # method in IDLE EditorWindow.py pythoncard_url = util.documentationURL("documentation.html") resourceeditor_url = util.documentationURL("resource_editor_overview.html") class DummyDialog(model.CustomDialog): def __init__(self, aBg, path): # load the resource aDialogRsrc = resource.ResourceFile(path).getResource() model.CustomDialog.__init__(self, aBg, aDialogRsrc) def on_mouseClick(self, event): event.skip() class ResourceEditor(model.Background): def on_initialize(self, event): self.filename = None self.documentChanged = False self.cmdLineArgs = {'debugmenu':False, 'logging':False, 'messagewatcher':False, 'namespaceviewer':False, 'propertyeditor':False, 'shell':False, 'otherargs':''} self.lastCaptured = None self.startName = None self.startPosition = (0, 0) self.startSize = (0, 0) self.offset = (0, 0) self.startToolTip = '' try: self.readme = open('readme.txt').read() except: self.readme = '' # KEA 2002-06-27 # copied from codeEditor.py # wxFileHistory isn't wrapped, so use raw wxPython # also the file list gets appended to the File menu # rather than going in front of the Exit menu # I suspect I have to add the Exit menu after the file history # which means changing how the menus in resources are loaded # so I'll do that later self.fileHistory = wx.FileHistory() fileMenu = self.GetMenuBar().GetMenu(0) self.fileHistory.UseMenu(fileMenu) wx.EVT_MENU_RANGE(self, wx.ID_FILE1, wx.ID_FILE9, self.OnFileHistory) self.buildComponentsMenu() self.cursors = {} self.cursors['topRight'] = wx.StockCursor(wx.CURSOR_SIZENESW) self.cursors['bottomLeft'] = self.cursors['topRight'] self.cursors['topMiddle'] = wx.StockCursor(wx.CURSOR_SIZENS) self.cursors['bottomMiddle'] = self.cursors['topMiddle'] self.cursors['topLeft'] = wx.StockCursor(wx.CURSOR_SIZENWSE) self.cursors['bottomRight'] = self.cursors['topLeft'] self.cursors['middleLeft'] = wx.StockCursor(wx.CURSOR_SIZEWE) self.cursors['middleRight'] = self.cursors['middleLeft'] self.cursors['general'] = wx.StockCursor(wx.CURSOR_SIZING) self.cursors['null'] = wx.NullCursor self.sizingHandleNames = ['topLeft', 'topMiddle', 'topRight', 'middleLeft', 'middleRight', 'bottomLeft', 'bottomMiddle', 'bottomRight'] if wx.Platform == '__WXMSW__': path = os.path.join(self.application.applicationDirectory, 'images', 'sizingHandle.bmp') sizingHandleTemplate = {'type':'ImageButton', 'name':'topLeft', 'position':(3, 3), 'size':(SIZING_HANDLE_SIZE, SIZING_HANDLE_SIZE), 'file':path, 'border':'none', 'visible':0} elif wx.Platform == '__WXMAC__': #self.resizingHandleColor = (0,0,128) path = os.path.join(self.application.applicationDirectory, 'images', 'sizingHandle.bmp') sizingHandleTemplate = {'type':'Image', 'name':'topLeft', 'position':(3, 3), 'size':(SIZING_HANDLE_SIZE, SIZING_HANDLE_SIZE), 'file':path, #'backgroundColor':self.resizingHandleColor, 'border':'none', 'visible':0} else: self.resizingHandleColor = (0,0,128) sizingHandleTemplate = {'type':'ImageButton', 'name':'topLeft', 'position':(3, 3), 'size':(SIZING_HANDLE_SIZE, SIZING_HANDLE_SIZE), 'file':'', 'backgroundColor':self.resizingHandleColor, 'visible':0} for sizingHandle in self.sizingHandleNames: sizingHandleTemplate['name'] = sizingHandle self.components[sizingHandle] = sizingHandleTemplate self.propertyEditorWindow = model.childWindow(self, PropertyEditor) self.xGridSize = 5 self.yGridSize = 5 self.alignToGrid = self.menuBar.getChecked('menuOptionsAlignToGrid') self.showGridLines = self.menuBar.getChecked('menuOptionsShowGridLines') path = os.path.join(self.application.applicationDirectory, 'templates', \ RESOURCE_TEMPLATE) self.rsrc = resource.ResourceFile(path).getResource() self.updatePanel(self.rsrc) # KEA 2004-05-14 # this actually should only occur once for the panel # so I'm moving it into initialize which should work as long as # the panel isn't destroyed while editing, opening new files, etc. # KEA link up events for new dragging code wx.EVT_LEFT_DOWN(self.panel, self.on_mouseDown) wx.EVT_LEFT_UP(self.panel, self.on_mouseUp) wx.EVT_MOTION(self.panel, self.on_mouseDrag) wx.EVT_CHAR(self.panel, self.on_keyPress) self.configPath = os.path.join(configuration.homedir, 'resourceeditor') self.loadConfig() """ # KEA 2002-03-03 # this doesn't appear to work, some additional accelerator table modification # must be messing up the bindings # setup acceleratortable for background acctbl = wx.AcceleratorTable([ (wx.ACCEL_CTRL, ord('C'), self.menuBar.getMenuId('menuEditCopy')), (wx.ACCEL_CTRL, ord('X'), self.menuBar.getMenuId('menuEditCut')), (wx.ACCEL_CTRL, ord('V'), self.menuBar.getMenuId('menuEditPaste')) ]) self.SetAcceleratorTable(acctbl) """ # KEA 2001-12-24 # once we can do dynamic menus we should load the component list dynamically # to build the first part of the Component menu # Add BitmapCanvas # Add Button # ... # perhaps there should be a framework function to return the list of files in # the components directory or list of components and then a method in the # resourceEditor can load each component module as it builds the menu # MRV 2002-08-08 # copied and changed from codeEditor to allow commandline argument for resource file # then can use from windows explorer rightclick... if len(sys.argv) > 1: # accept a file argument on the command-line filename = os.path.abspath(sys.argv[1]) log.info('resourceEditor filename: ' + filename) if not os.path.exists(filename): filename = os.path.abspath(os.path.join(self.application.startingDirectory, sys.argv[1])) if os.path.isfile(filename): if filename.endswith('rsrc.py'): self.filename = filename self.openFile(filename) self.resizingHandler = { 'topLeft':self.on_topLeft_mouseDrag, 'topMiddle':self.on_topMiddle_mouseDrag, 'topRight':self.on_topRight_mouseDrag, 'middleLeft':self.on_middleLeft_mouseDrag, 'middleRight':self.on_middleRight_mouseDrag, 'bottomLeft':self.on_bottomLeft_mouseDrag, 'bottomMiddle':self.on_bottomMiddle_mouseDrag, 'bottomRight':self.on_bottomRight_mouseDrag } self.createDC() def OnFileHistory(self, event): fileNum = event.GetId() - wx.ID_FILE1 path = self.fileHistory.GetHistoryFile(fileNum) if self.documentChanged: save = self.saveChanges() if save == "Cancel": # don't do anything, just go back to editing return elif save == "No": # any changes will be lost pass else: if self.filename is None: # if the user cancels out of the Save As then go back to editing if not self.on_menuFileSaveAs_select(None): return else: self.saveFile() self.openFile(path) # KEA 2004-05-12 # transition to dynamic component menu # and component addition def buildComponentsMenu(self): """ Dynamically build the menu for the components supported by the resourceEditor. Eventually this will be a list or some form of palette instead of a menu. """ # only built-in components are handled currently, so an appcomponents # directory or fully-qualified component paths are handled # theoretically when the user loads a resource file the menu should # be updated, but this is all highly dependent on how imports are # handled, registry updated, etc. # One idea would be for the resourceEditor to register itself as # a change listener and have the registry subclass Changeable so it could # notify the resourceEditor. In that case, the algorithm below would # have to be modified since each menu item would be added as it receives # a change notice from the registry and would need to check the existing # menu to prevent duplicates as well as insert into the menu in the correct # order. Or perhaps, the menu items could be wiped out and recreated which # is probably simpler. # get a list of all the modules in components moduleNames = registry.Registry.getInstance().findBuiltInComponents() # KEA 2004-05-12 # I know that IEHtmlWindow is platform specific and has problems # in the resourceEditor and Grid doesn't work right either so I'm # conditionally preventing them from being loaded here until I figure # out how to deal with them # Container is another one that isn't applicable yet if True: try: moduleNames.remove('iehtmlwindow') except ValueError: pass if True: try: moduleNames.remove('grid') except ValueError: pass if True: try: moduleNames.remove('container') except ValueError: pass # need to force an import of all of the modules in components for name in moduleNames: resource.loadComponentModule(name) # should match based on name instead # name to object or id like menubar helpers? m = self.menuBar.menus[2] names = registry.Registry.getInstance().components.keys() names.sort() for key in names: rsrc = resource.Resource({'type':'MenuItem', 'name': 'menuComponentAdd' + key, 'label': key, 'command':'componentAdd'}) mi = menu.MenuItem(self, m, rsrc) m.appendMenuItem(mi) def clearWidgets(self): for w in self.components.keys(): if w not in self.sizingHandleNames: del self.components[w] def positionSizingHandles(self, position, size): x, y = position width, height = size halfHandleSize = SIZING_HANDLE_SIZE / 2 log.debug('positionSizingHandles position:' + str(position) + ", size:" + str(size)) self.components['topLeft'].position = (x - SIZING_HANDLE_SIZE, y - SIZING_HANDLE_SIZE) self.components['topMiddle'].position = (x + (width / 2) - halfHandleSize, y - SIZING_HANDLE_SIZE) self.components['topRight'].position = (x + width, y - SIZING_HANDLE_SIZE) self.components['middleLeft'].position = (x - SIZING_HANDLE_SIZE, y + (height / 2) - halfHandleSize) self.components['middleRight'].position = (x + width, y + (height / 2) - halfHandleSize) self.components['bottomLeft'].position = (x - SIZING_HANDLE_SIZE, y + height) self.components['bottomMiddle'].position = (x + (width / 2) - halfHandleSize, y + height) self.components['bottomRight'].position = (x + width, y + height) def showSizingHandles(self, name): self.startName = name self.positionSizingHandles(self.components[name].position, self.components[name].size) for sizingHandle in self.sizingHandleNames: self.components[sizingHandle].visible = True if wx.Platform == '__WXMAC__': pass #self.components[sizingHandle].backgroundColor = self.resizingHandleColor elif wx.Platform == '__WXGTK__': self.components[sizingHandle].backgroundColor = self.resizingHandleColor # overly conservative, but effective self.documentChanged = True def hideSizingHandles(self): if self.components.topLeft.visible: for sizingHandle in self.sizingHandleNames: self.components[sizingHandle].visible = False if wx.Platform == '__WXMAC__': self.panel.Refresh() def gtkHideSizingHandles(self, name): for sizingHandle in self.sizingHandleNames: if sizingHandle == name: self.components[sizingHandle].backgroundColor = self.backgroundColor else: self.components[sizingHandle].visible = False def setToolTip(self, target): self.propertyEditorWindow.statusBar.text = "Component: %s Pos: %s Size: %s" % (str(target.name), str(target.position), str(target.size)) """ x, y = target.position width, height = target.size tip = "name: " + target.name + " \n" + \ "position: " + str(x) + ", " + str(y) + " \n" + \ "size: " + str(width) + ", " + str(height) if tip != target.toolTip: target.toolTip = tip """ def setToolTipDrag(self, name, position, size): self.propertyEditorWindow.statusBar.text = "Component: %s Pos: %s Size: %s" % (name, str(position), str(size)) def on_mouseEnter(self, event): name = event.target.name if name in self.sizingHandleNames: try: self.SetCursor(self.cursors[name]) except: # not all platforms have all cursors, but hopefully # the general sizing cursor is always available self.SetCursor(self.cursors['general']) else: # KEA 2003-05-05 # get rid of cursor change on wxTextCtrl self.SetCursor(wx.StockCursor(wx.CURSOR_ARROW)) self.setToolTip(event.target) def on_mouseLeave(self, event): if event.target.name in self.sizingHandleNames: self.SetCursor(self.cursors['null']) def pointInControl(self, position): #print 'pointInControl:' #position = self.panel.ClientToScreen( position ) #print ' position=', position globalPosition = self.panel.ScreenToClient(wx.GetMousePosition()) #print ' globalPosition=', globalPosition result = None for name in self.components.order: if name in self.sizingHandleNames: continue control = self.components[name] r = control.GetRect() #print ' ', control, r if (r.Inside(globalPosition)): #print ' ', control result = control break #print "pointInControl", result return result # KEA 2004-03-27 # the DC and lastPosition handling are basically a bunch # of hacks for event bugs in WXMAC and I'm sure I'm going to regret them def createDC(self): dc = wx.ClientDC(self.panel) dc.SetPen(wx.Pen('black', 1, wx.DOT)) dc.SetBrush(wx.TRANSPARENT_BRUSH) dc.SetLogicalFunction(wx.INVERT) self.dc = dc def on_size(self, event): self.createDC() event.skip() def drawTheRect(self): position = [self.startGlobalPosition[0], self.startGlobalPosition[1]] position[0] = position[0] - self.startGlobalOffset[0] position[1] = position[1] - self.startGlobalOffset[1] ##rect = [self.startGlobalPosition[0], self.startGlobalPosition[1], self.startSize[0], self.startSize[1]] ##rect[0] = rect[0] - self.startGlobalOffset[0] ##rect[1] = rect[1] - self.startGlobalOffset[1] ##print "drawTheRect", rect ##dc.DrawRectangle(rect[0], rect[1], rect[2], rect[3]) self.dc.DrawRectanglePointSize((position[0], position[1]), (self.startSize[0], self.startSize[1])) ##self.rect = rect self.lastPosition = position #print " self.lastPosition", self.lastPosition def on_mouseDown(self, event): # KEA 2003-03-23 # protect against panel events #print "on_mouseDown" globalPosition = wx.GetMousePosition() control = event.GetEventObject() if control is self.panel: control = self.pointInControl(event.GetPosition()) if control is None: self.hideSizingHandles() self.startName = None return #target = event.target target = control if target.name not in self.sizingHandleNames: self.startName = target.name if self.application.pw is not None: self.application.pw.selectComponentsList(target.name, target.__class__.__name__) # KEA 2002-02-23 self.propertyEditorWindow.selectComponentList(target.name, target.__class__.__name__) # KEA 2003-03-23 # new drag code self.startGlobalPosition = self.panel.ScreenToClient(globalPosition) self.startGlobalOffset = target.ScreenToClient(globalPosition) # KEA 2003-05-05 # workaround for 3D border on Windows t = target.__class__.__name__ if wx.Platform == "__WXMSW__": if ['List', 'PasswordField', 'TextField', 'TextArea'].count(t): self.startGlobalOffset = [self.startGlobalOffset[0] + wx.SystemSettings.GetMetric(wx.SYS_EDGE_X), self.startGlobalOffset[1] + wx.SystemSettings.GetMetric(wx.SYS_EDGE_Y)] elif ['Gauge', 'StaticLine'].count(t): self.startGlobalOffset = [self.startGlobalOffset[0] + wx.SystemSettings.GetMetric(wx.SYS_BORDER_X), self.startGlobalOffset[1] + wx.SystemSettings.GetMetric(wx.SYS_BORDER_Y)] elif t == 'Spinner': # compensate for width of TextCtrl portion of # compound control - width of arrow buttons self.startGlobalOffset[0] += target.size[0] - 16 elif wx.Platform == "__WXMAC__": # KEA 2004-07-27 # The SYS_EDGE and SYS_BORDER numbers don't seem to work on the Mac # so I just experimented to find the values below to prevent the components # from "hopping" when the user selects them if ['List'].count(t): self.startGlobalOffset = [self.startGlobalOffset[0] - 1, self.startGlobalOffset[1] - 1] elif ['PasswordField', 'TextField', 'TextArea'].count(t): self.startGlobalOffset = [self.startGlobalOffset[0] + 3, self.startGlobalOffset[1] + 3] elif ['StaticBox'].count(t): # KEA 2004-08-16 # sigh, another complete behavior hack if target.label: self.startGlobalOffset = [self.startGlobalOffset[0] + 4, self.startGlobalOffset[1] + 18] else: self.startGlobalOffset = [self.startGlobalOffset[0] + 4, self.startGlobalOffset[1] + 3] #print "globalPosition", globalPosition #print "self.startGlobalPosition", self.startGlobalPosition #print "self.startGlobalOffset", self.startGlobalOffset ##self.startGlobalPosition[0] =- self.startGlobalOffset[0] ##self.startGlobalPosition[1] =- self.startGlobalOffset[1] self.hideSizingHandles() else: if not self.startName: return #print "res4 sizing handles", self.startName self.resizingHandleTarget = target.name if wx.Platform == '__WXMSW__': self.hideSizingHandles() elif wx.Platform == '__WXMAC__': self.hideSizingHandles() ##if self.lastCaptured is not None: ## self.lastCaptured.ReleaseMouse() ##target.CaptureMouse() ##self.lastCaptured = target else: #print "capturing mouse" #if self.lastCaptured is not None: # self.lastCaptured.ReleaseMouse() #self.gtkHideSizingHandles(target.name) self.hideSizingHandles() #target.CaptureMouse() #self.lastCaptured = target self.startPosition = self.components[self.startName].position self.startSize = self.components[self.startName].size self.offset = target.ScreenToClient(globalPosition) if target.name not in self.sizingHandleNames: self.drawTheRect() self.movingComponent = True #self.startToolTip = self.components[self.startName].toolTip ###print "capturing mouse" ###if self.lastCaptured is not None: ### self.lastCaptured.ReleaseMouse() #self.gtkHideSizingHandles(target.name) ###target.CaptureMouse() ###self.lastCaptured = targe ##event.skip() def on_mouseDrag(self, event): ##print "on_mouseDrag", event.Dragging() # protect against double-clicks in the open file dialog # when switching rsrc.py files #if event.target.name not in self.sizingHandleNames and self.startName in self.components: if not event.Dragging(): return #print "on_mouseDrag" if wx.Platform == '__WXMAC__' and not hasattr(self, 'lastPosition'): self.on_mouseDown(event) if self.startName in self.components: if not self.movingComponent and self.resizingHandleTarget: self.resizingHandler[self.resizingHandleTarget](event) return self.hideSizingHandles() # erase the last rect self.dc.DrawRectanglePointSize((self.lastPosition[0], self.lastPosition[1]), (self.startSize[0], self.startSize[1])) # use the global mouse position and the initial offset and start # to figure out where to draw a rect in global coordinates x, y = self.panel.ScreenToClient(wx.GetMousePosition()) xOffset = x - self.startGlobalOffset[0] yOffset = y - self.startGlobalOffset[1] if self.alignToGrid: xOffset = xOffset / self.xGridSize * self.xGridSize yOffset = yOffset / self.yGridSize * self.yGridSize self.lastPosition[0] = xOffset self.lastPosition[1] = yOffset self.dc.DrawRectanglePointSize((self.lastPosition[0], self.lastPosition[1]), (self.startSize[0], self.startSize[1])) # doesn't do anything if just drawing rects self.setToolTipDrag(self.startName, self.lastPosition, self.startSize) ##event.skip() # KEA 2004-09-15 # support cursor keys to move components one pixel at a time # the event is coming from the panel so we have to use the wx methods def on_keyPress(self, event): keyCode = event.GetKeyCode() if keyCode in (wx.WXK_LEFT, wx.WXK_UP, wx.WXK_RIGHT, wx.WXK_DOWN): # self.startName might not be set # that may actually be a bug, but this should always work s = self.propertyEditorWindow.components.wComponentList.stringSelection if s: name = s.split(" : ")[0] if name in self.components: x, y = self.components[name].position if self.alignToGrid: # for now I'm only going to align to grid # in the direction of the cursor movement if keyCode == wx.WXK_LEFT: x = (x - self.xGridSize) / self.xGridSize * self.xGridSize elif keyCode == wx.WXK_RIGHT: x = (x + self.xGridSize) / self.xGridSize * self.xGridSize elif keyCode == wx.WXK_UP: y = (y - self.yGridSize) / self.yGridSize * self.yGridSize elif keyCode == wx.WXK_DOWN: y = (y + self.yGridSize) / self.yGridSize * self.yGridSize else: if keyCode == wx.WXK_LEFT: x = x - 1 elif keyCode == wx.WXK_RIGHT: x = x + 1 elif keyCode == wx.WXK_UP: y = y - 1 elif keyCode == wx.WXK_DOWN: y = y + 1 self.components[name].position = (x, y) # make sure sizing handles follow component self.showSizingHandles(name) # update the position on the propertyEditor status bar self.setToolTipDrag(name, (x, y), self.components[name].size) def on_mouseUp(self, event): # protect against double-clicks in the open file dialog # when switching rsrc.py files ####print "on_mouseUp BEFORE", self.rect if self.startName in self.components: if self.movingComponent: self.dc.DrawRectanglePointSize((self.lastPosition[0], self.lastPosition[1]), (self.startSize[0], self.startSize[1])) self.components[self.startName].position = (self.lastPosition[0], self.lastPosition[1]) #print "on_mouseUp", self.lastPosition self.panel.Refresh() self.movingComponent = False if wx.Platform == '__WXMAC__': ##if self.lastCaptured is not None: ## self.lastCaptured.ReleaseMouse() ## self.lastCaptured = None #event.target.ReleaseMouse() # clear up drag artifacts self.Refresh() if wx.Platform == '__WXGTK__': ##if self.lastCaptured is not None: ## self.lastCaptured.ReleaseMouse() ## self.lastCaptured = None #event.target.ReleaseMouse() self.Refresh() self.showSizingHandles(self.startName) self.resizingHandleTarget = None #self.setToolTip(self.components[self.startName]) #self.components[self.startName].toolTip = self.startToolTip # KEA 2003-05-13 # these should no longer be needed ## # KEA 2002-04-30 ## # workaround for WXMAC ## def on_mouseClick(self, event): ## print "on_mouseClick" ## if wx.Platform == '__WXMAC__': ## self.on_mouseUp(event) ## ## # KEA 2002-04-30 ## # workaround for WXMAC ## def on_select(self, event): ## print "on_select" ## if wx.Platform == '__WXMAC__': ## self.on_mouseUp(event) # KEA 2001-12-24 # I need to refactor the common elements of the resizing handle code # I also want to add a Component info window to show the component # name, position, size as the component is moved and resized # THe 2002-08-29 # Refactored the common elements of resizing handle code. def doResize(self, event, (n, w, s, e)): if not self.startName: return try: # Windows xOffset = event.x - self.offset[0] yOffset = event.y - self.offset[1] except: # Mac OS X and Linux/GTK #x, y = event.GetPosition() globalPosition = wx.GetMousePosition() x, y = self.components[self.resizingHandleTarget].ScreenToClient(globalPosition) xOffset = x - self.offset[0] yOffset = y - self.offset[1] xStartOffset = self.startPosition[0] + e * xOffset yStartOffset = self.startPosition[1] + n * yOffset if self.alignToGrid: xOffset = xOffset / self.xGridSize * self.xGridSize yOffset = yOffset / self.yGridSize * self.yGridSize xStartOffset = xStartOffset / self.xGridSize * self.xGridSize yStartOffset = yStartOffset / self.yGridSize * self.yGridSize width = self.startSize[0] + (w - e) * xOffset height = self.startSize[1] + (s - n) * yOffset self.components[self.startName].position = (xStartOffset, yStartOffset) self.components[self.startName].size = (width, height) self.setToolTip(self.components[self.startName]) def on_topLeft_mouseDrag(self, event): self.doResize(event, (1, 0, 0, 1)) def on_topMiddle_mouseDrag(self, event): self.doResize(event, (1, 0, 0, 0)) def on_topRight_mouseDrag(self, event): self.doResize(event, (1, 1, 0, 0)) def on_middleLeft_mouseDrag(self, event): self.doResize(event, (0, 0, 0, 1)) def on_middleRight_mouseDrag(self, event): self.doResize(event, (0, 1, 0, 0)) def on_bottomLeft_mouseDrag(self, event): self.doResize(event, (0, 0, 1, 1)) def on_bottomMiddle_mouseDrag(self, event): self.doResize(event, (0, 0, 1, 0)) def on_bottomRight_mouseDrag(self, event): self.doResize(event, (0, 1, 1, 0)) def saveChanges(self): if self.filename is None: filename = "Untitled" else: filename = self.filename msg = "The data in the %s file has changed.\n\nDo you want to save the changes?" % filename result = dialog.messageDialog(self, msg, 'resourceEditor', wx.ICON_EXCLAMATION | wx.YES_NO | wx.CANCEL) return result.returnedString def newFile(self, fullTemplatePath): """ KEA 2003-07-31 the logic of where templates come from, the user selecting a template, prompting to save, etc. should be refactored especially if we are going to support a pythoncard_config/resourceEditor/templates directory for user-specific resource/code templates for now we'll assume a single templates dir and put the save logic here also need to decide if resourceEditor should startup differently like not showing a new layout to begin with maybe have an option to start with a new project prompt, open resource dialog, or none so user can select from the history (always lots of UI decisions ;-) """ # prompt to save # user will probably end up creating a new dir # and changing the filename templatePath, templateFilename = os.path.split(fullTemplatePath) #print path, filename # have the user save the source or resource?! wildcard = "Python files (*.py)|*.py" # don't set the starting dir, let user navigate result = dialog.saveFileDialog(None, "Save As", "", templateFilename[:-8] + ".py", wildcard) if result.accepted: path = result.paths[0] if path.endswith('.rsrc.py'): basepath = os.path.splitext(os.path.splitext(path)[0])[0] elif path.endswith('.py'): basepath = os.path.splitext(path)[0] else: # user didn't use a .py extension? # should this be an error? basepath = path #print basepath # now we need to copy and rename the # template files to the user chosen location import shutil destPath, destFilename = os.path.split(basepath) # copy the .py file fname = os.path.join(templatePath, templateFilename[:-8] + ".py") tname = os.path.join(destPath, destFilename + ".py") #print "copying", tname shutil.copy(fname, tname) # copy the .rsrc.py file fname = os.path.join(templatePath, templateFilename) tname = os.path.join(destPath, destFilename + ".rsrc.py") #print "copying", tname shutil.copy(fname, tname) self.filename = tname #print self.filename else: # present a dialog instead?! return self.resetAndClearWidgets() path = os.path.join(self.filename) self.rsrc = resource.ResourceFile(path).getResource() ##self.filename = None self.updatePanel(self.rsrc) if self.editingDialog: comp = self.rsrc.components else: comp = self.rsrc.application.backgrounds[0].components for w in comp: self.components[w.name] = w self.rebindEventsForDragging() self.documentChanged = False # could change the resource and title bar # here to give the user more feedback def saveFile(self): if self.filename is None: return self.on_menuFileSaveAs_select(None) else: ##desc = self.resourceAttributes() desc = resourceOutput.resourceAttributes(self) try: f = open(self.filename, 'w') f.write(desc) f.close() self.documentChanged = False self.fileHistory.AddFileToHistory(self.filename) return True except Exception, e: message = 'The resource file could not be saved.\n' + str( e ) dialog.messageDialog(self, message, 'ResourceEditor Error', wx.ICON_EXCLAMATION | wx.OK) return False def revertFile(self): self.resetAndClearWidgets() if self.filename is None: path = os.path.join(self.application.applicationDirectory, 'templates', \ RESOURCE_TEMPLATE) self.rsrc = resource.ResourceFile(path).getResource() else: self.rsrc = resource.ResourceFile(self.filename).getResource() self.updatePanel(self.rsrc) # KEA 2002-03-24 # either we're editing a Background or a Dialog if self.editingDialog: comp = self.rsrc.components else: comp = self.rsrc.application.backgrounds[0].components for w in comp: self.components[w.name] = w self.rebindEventsForDragging() self.documentChanged = False def getNewFileTemplates(self): templatesDir = os.path.join(self.application.applicationDirectory, 'templates') fileList = os.listdir(templatesDir) #fileList.sort() templates = [] for filename in fileList: # get 'title' path = os.path.join(templatesDir, filename) if os.path.isfile(path): try: rsrc = resource.ResourceFile(path).getResource() try: templates.append((rsrc.application.backgrounds[0].title, path, 'background')) except: templates.append((rsrc.title, path, 'dialog')) except: # not a resource file pass templates.sort() return templates def doNewFile(self): templates = self.getNewFileTemplates() listX = [] for t in templates: #print t[0], t[2], t[1] listX.append(t[0]) result = dialog.singleChoiceDialog(self, "Choose a resource template", "Templates", listX) if result.accepted: name = result.selection for t in templates: if t[0] == name: filename = t[1] self.newFile(filename) def on_menuFileNew_select(self, event): if self.documentChanged: save = self.saveChanges() if save == "Cancel": # don't do anything, just go back to editing pass elif save == "No": # any changes will be lost #self.newFile(RESOURCE_TEMPLATE) self.doNewFile() else: if self.filename is None: if self.on_menuFileSaveAs_select(None): #self.newFile(RESOURCE_TEMPLATE) self.doNewFile() else: self.saveFile() #self.newFile(RESOURCE_TEMPLATE) self.doNewFile() else: #self.newFile(RESOURCE_TEMPLATE) self.doNewFile() def on_menuFileNewDialog_select(self, event): if self.documentChanged: save = self.saveChanges() if save == "Cancel": # don't do anything, just go back to editing pass elif save == "No": # any changes will be lost self.newFile(RESOURCE_DIALOG_TEMPLATE) else: if self.filename is None: if self.on_menuFileSaveAs_select(None): self.newFile(RESOURCE_DIALOG_TEMPLATE) else: self.saveFile() self.newFile(RESOURCE_DIALOG_TEMPLATE) else: self.newFile(RESOURCE_DIALOG_TEMPLATE) def on_menuFileSave_select(self, event): self.saveFile() def on_menuFileSaveAs_select(self, event): if self.filename is None: path = '' filename = '' else: path, filename = os.path.split(self.filename) wildcard = "resource files (*.rsrc.py)|*.rsrc.py" result = dialog.saveFileDialog(None, "Save As", path, filename, wildcard) if result.accepted: path = result.paths[0] # KEA 2002-06-01 # force .rsrc.py extension # the one problem with this is that # the user won't be prompted for an overwrite # of a .rsrc.py file if they didn't enter that # in the save as dialog if not path.endswith('.rsrc.py'): path = os.path.splitext(path)[0] + '.rsrc.py' ##desc = self.resourceAttributes() desc = resourceOutput.resourceAttributes(self) try: f = open(path, 'w') f.write(desc) f.close() self.filename = path self.documentChanged = False return True except: return False else: return False def on_menuFileRevert_select(self, event): if self.documentChanged: if self.filename is None: filename = "Untitled" else: filename = self.filename msg = "You will lose any changes you've made to %s.\n\nAre you sure you want to revert to the last saved version?" % filename result = dialog.messageDialog(self, msg, 'resourceEditor', wx.ICON_EXCLAMATION | wx.YES_NO | wx.CANCEL | wx.NO_DEFAULT) save = result.returnedString if save == "Cancel" or save == "No": # don't do anything, just go back to editing pass else: # any changes will be lost self.revertFile() else: self.revertFile() def resetAndClearWidgets(self): self.startName = None self.startPosition = (0, 0) self.startSize = (0, 0) self.offset = (0, 0) if self.application.pw is not None: if wx.Platform == '__WXMAC__': self.application.pw.selectComponentsList('topLeft', 'Image') else: self.application.pw.selectComponentsList('topLeft', 'ImageButton') # KEA 2002-02-23 self.propertyEditorWindow.clearComponentList() self.propertyEditorWindow.clearPropertyList() self.hideSizingHandles() self.clearWidgets() def openFile(self, path): self.resetAndClearWidgets() os.chdir(os.path.dirname(path)) self.filename = path rsrc = resource.ResourceFile(path).getResource() self.rsrc = rsrc self.updatePanel(self.rsrc) # KEA 2002-03-24 # either we're editing a Background or a Dialog if self.editingDialog: comp = self.rsrc.components else: comp = self.rsrc.application.backgrounds[0].components for w in comp: self.components[w.name] = w self.rebindEventsForDragging() self.documentChanged = False self.fileHistory.AddFileToHistory(self.filename) def doOpenFile(self): wildcard = "resource files (*.rsrc.py)|*.rsrc.py" result = dialog.openFileDialog(None, "Import which resource file?", '', '', wildcard) if result.accepted: self.openFile(result.paths[0]) def on_menuFileOpen_select(self, event): if self.documentChanged: save = self.saveChanges() if save == "Cancel": # don't do anything, just go back to editing pass elif save == "No": # any changes will be lost self.doOpenFile() else: if self.filename is None: if self.on_menuFileSaveAs_select(None): self.doOpenFile() else: self.saveFile() self.doOpenFile() else: self.doOpenFile() def on_menuHelpAbout_select(self, event): dialog.scrolledMessageDialog(self, self.readme, 'About resourceEditor...') def on_doHelpAboutPythonCard_command(self, event): about.aboutPythonCardDialog(self) def fixComponentOrder(self, name): for c in self.components.order: self.components[c].Lower() if self.application.pw is not None: self.application.pw.clearComponentsList() self.application.pw.displayComponents(self.components) self.application.pw.selectComponentsList(name, self.components[name].__class__.__name__) # KEA 2002-02-23 ##self.propertyEditorWindow.Freeze() self.propertyEditorWindow.clearComponentList() self.propertyEditorWindow.displayComponents(self.components) self.propertyEditorWindow.selectComponentList(name, self.components[name].__class__.__name__) ##self.propertyEditorWindow.Thaw() def create_component(self, desc, offsets, promptString, errString): optionalAttributes = registry.Registry.getInstance().components[desc['type']]._spec._optionalAttributes.keys() result = newComponentDialog.newComponentDialog(self, desc, optionalAttributes, offsets, promptString) if result.accepted: name = result.name if name in self.components: dialog.alertDialog(self, name + " already exists", 'Error: Unable to '+errString+' widget') return if 'label' in optionalAttributes: desc['label'] = result.labelortext elif 'text' in optionalAttributes: desc['text'] = result.labelortext desc['name'] = name self.components[name] = desc if offsets: # offset the widget so that it isn't underneath the original x, y = self.components[name].position dx, dy = self.components[name].size #rint x, y, dx, dy if result.horizontal: x += dx+30 if result.vertical: y += dy+30 else: if result.vertical: y += dy+30 else: x += 10 y += 10 #rint " => ", x, y self.components[name].position = (x, y) # KEA 2001-12-20 # hack to insert component so that it is the first one # in the list # a similar trick will be needed for re-ordering widgets self.components.order.remove(name) self.components.order.insert(NUM_SIZING_HANDLES, name) self.fixComponentOrder(name) self.startName = name self.startPosition = self.components[self.startName].position self.startSize = self.components[self.startName].size self.offset = (0, 0) self.showSizingHandles(name) self.documentChanged = True c = self.components[self.startName] wx.EVT_LEFT_DOWN(c, self.on_mouseDown) wx.EVT_LEFT_UP(c, self.on_mouseUp) wx.EVT_MOTION(c, self.on_mouseDrag) def on_componentDuplicate_command(self, event): if self.startName in self.components: aWidget = self.components[self.startName] # now loop through the original widget and build a dictionary suitable # for making a copy d = {} d['type'] = aWidget.__class__.__name__ #for key in aWidget._getAttributeNames(): attributes = aWidget._spec.getAttributes().keys() attributes.sort() for key in attributes: # I'm not exactly sure why I have to special-case these tuples if key == 'bitmap': # this should get recreated from the file attribute pass elif key == "id": # must avoid duplicate IDs pass elif key in ['position', 'size']: d[key] = getattr(aWidget, key) elif getattr(aWidget, key) is not None: d[key] = getattr(aWidget, key) self.create_component(d, True, 'Duplicate ' + d['type'], "duplicate") def on_componentDelete_command(self, event): if self.startName in self.components: aWidget = self.components[self.startName] msg = "Are you sure you want to delete %s %s?" % (aWidget.__class__.__name__, aWidget.name) result = dialog.messageDialog(self, msg, 'Delete Component', wx.ICON_INFORMATION | wx.YES_NO | wx.NO_DEFAULT) if result.accepted: self.hideSizingHandles() del self.components[aWidget.name] self.documentChanged = True def on_componentAdd_command(self, event): # event.target.name will be something like # menuComponentAddButton, so the first 16 characters # can be thrown away to get the component name className = event.target.name[16:] # find a unique name i = 1 while True: if className + str(i) not in self.components: desc = registry.Registry.getInstance().components[className]._spec.getMinimalResourceDict(className + str(i)) break i += 1 desc['position'] = (10, 10) self.create_component(desc, False, "New"+className, "create") def on_componentSendBack_command(self, event): if self.startName in self.components and \ self.components.order.index(self.startName) != len(self.components.order) - 1: self.components.order.remove(self.startName) self.components.order.append(self.startName) self.fixComponentOrder(self.startName) def on_componentMoveBack_command(self, event): if self.startName in self.components: i = self.components.order.index(self.startName) ln = len(self.components.order) - 1 if i >= NUM_SIZING_HANDLES and i < ln: self.components.order.remove(self.startName) if i == ln - 1: self.components.order.append(self.startName) else: self.components.order.insert(i + 1, self.startName) self.fixComponentOrder(self.startName) def on_componentMoveForward_command(self, event): if self.startName in self.components: i = self.components.order.index(self.startName) if i > NUM_SIZING_HANDLES: self.components.order.remove(self.startName) self.components.order.insert(i - 1, self.startName) self.fixComponentOrder(self.startName) def on_componentBringFront_command(self, event): if self.startName in self.components and \ self.components.order.index(self.startName) != NUM_SIZING_HANDLES: self.components.order.remove(self.startName) self.components.order.insert(NUM_SIZING_HANDLES, self.startName) self.fixComponentOrder(self.startName) def on_displayAttributes_command(self, event): ##desc = self.resourceAttributes() desc = resourceOutput.resourceAttributes(self) dialog.scrolledMessageDialog(self, desc, 'Resource') def on_menuViewPropertyEditor_select(self, event): self.propertyEditorWindow.visible = not self.propertyEditorWindow.visible def updatePanel(self, rsrc): # KEA 2002-03-24 # this will need to update different parameters # depending on whether we're editing a background or dialog self.editingDialog = False try: background = rsrc.application.backgrounds[0] except: dlg = self.rsrc self.editingDialog = True # unhook the grid drawing and then rebind later if necessary if self.showGridLines: self.panel.Unbind(wx.EVT_ERASE_BACKGROUND) if self.editingDialog: self.menuBar.setEnabled('menuFileRun', False) self.menuBar.setEnabled('menuFileRunWithInterpreter', False) self.menuBar.setEnabled('menuFilePreviewDialog', True) self.menuBar.setEnabled('menuEditBackgroundInfo', False) self.menuBar.setEnabled('menuEditMenubar', False) self.menuBar.setEnabled('menuEditDialogInfo', True) self.title = dlg.title self._createStatusBar(dlg) self.position = dlg.position #self.setSize((dlg.size[0], dlg.size[1] + 20)) self.size = dlg.size self.setImage('') self.setTiled(False) self.panel._imageFile = self.image self.panel._backgroundTiling = self.tiled defaultBgColor = wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DFACE) self.backgroundColor = defaultBgColor self.panel.Disconnect(-1, -1, wx.wxEVT_ERASE_BACKGROUND) self.panel._bitmap = None else: self.menuBar.setEnabled('menuFileRun', True) self.menuBar.setEnabled('menuFileRunWithInterpreter', True) self.menuBar.setEnabled('menuFilePreviewDialog', False) self.menuBar.setEnabled('menuEditBackgroundInfo', True) self.menuBar.setEnabled('menuEditMenubar', True) self.menuBar.setEnabled('menuEditDialogInfo', False) self.title = background.title self._createStatusBar(background) self.position = background.position if background.menubar is None: #self.setSize((background.size[0], background.size[1] + 20)) self.size = background.size else: self.size = background.size self.setImage(background.image) self.setTiled(background.tiled) self.panel._imageFile = self.image self.panel._backgroundTiling = self.tiled defaultBgColor = wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DFACE) self.backgroundColor = defaultBgColor self.foregroundColor = background.foregroundColor self.backgroundColor = background.backgroundColor if self.image is not None : self.panel._bitmap = graphic.Bitmap(self.image) wx.EVT_ERASE_BACKGROUND( self.panel, self.panel.onEraseBackground ) else: self.panel.Disconnect(-1, -1, wx.wxEVT_ERASE_BACKGROUND) self.panel._bitmap = None self.movingComponent = False self.resizingHandleTarget = None if self.showGridLines: self.panel.Bind(wx.EVT_ERASE_BACKGROUND, self.drawPanelGridLines) self.panel.Refresh() def drawPanelGridLines(self, event): dc = event.GetDC() if not dc : dc = wx.ClientDC(self.panel) r = self.panel.GetUpdateRegion().GetBox() dc.SetClippingRegion(r.x, r.y, r.width, r.height) # need to set the background color to the default panel color brush = dc.GetBackground() brush.SetColour(self.panel.GetBackgroundColour()) dc.SetBackground(brush) dc.Clear() # should the color be settable by the user and then save # that in the prefs? dc.SetPen(wx.Pen('darkgray', 1, wx.SOLID)) w, h = self.panel.size xgrid = self.xGridSize ygrid = self.yGridSize nx = w / xgrid ny = h / ygrid for x in range(1, nx + 1): dc.DrawLine(x * xgrid, 0, x * xgrid, h) for y in range(1, ny + 1): dc.DrawLine(0, y * ygrid, w, y * ygrid) def rebindEventsForDragging(self): for name in self.components.order: if name not in self.sizingHandleNames: #print name c = self.components[name] wx.EVT_LEFT_DOWN(c, self.on_mouseDown) wx.EVT_LEFT_UP(c, self.on_mouseUp) wx.EVT_MOTION(c, self.on_mouseDrag) # KEA 2004-08-12 # for each of the dialogs below, the code should be refactored # so that the dialog modules have a function wrapper and the # result contains whatever attributes would be needed # the function should probably not have side-effects def on_fileRunOptions_command(self, event): result = runOptionsDialog.runOptionsDialog(self, self.cmdLineArgs) if result.accepted: self.cmdLineArgs['debugmenu'] = result.debugmenu self.cmdLineArgs['logging'] = result.logging self.cmdLineArgs['messagewatcher'] = result.messagewatcher self.cmdLineArgs['namespaceviewer'] = result.namespaceviewer self.cmdLineArgs['propertyeditor'] = result.propertyeditor self.cmdLineArgs['shell'] = result.shell self.cmdLineArgs['otherargs'] = result.otherargs def on_editStackInfo_command(self, event): result = stackInfoDialog.stackInfoDialog(self, self.rsrc) if result.accepted: self.rsrc.application.name = result.text self.documentChanged = True # need to change the logic so that self.rsrc # and the current window are updated def on_editBackgroundInfo_command(self, event): background = self.rsrc.application.backgrounds[0] background.position = self.GetPositionTuple() background.size = self.GetSizeTuple() result = backgroundInfoDialog.backgroundInfoDialog(self, background) if result.accepted: background.name = result.name background.title = result.title background.position = result.position background.size = result.size background.statusBar = result.statusBar background.foregroundColor = result.foregroundColor background.backgroundColor = result.backgroundColor background.image = result.image background.tiled = result.tiled background.visible = result.visible background.style = result.style background.icon = result.icon self.updatePanel(self.rsrc) self.documentChanged = True # need to change the logic so that self.rsrc # and the current window are updated def on_editDialogInfo_command(self, event): background = self.rsrc background.position = self.GetPositionTuple() background.size = self.GetSizeTuple() result = dialogInfoDialog.dialogInfoDialog(self, background) if result.accepted: background.name = result.name background.title = result.title background.position = result.position background.size = result.size self.updatePanel(self.rsrc) self.documentChanged = True def on_editMenubar_command(self, event): try: menubar = self.rsrc.application.backgrounds[0].menubar except: menubar = None result = menuDialog.menuDialog(self, menubar) if result.accepted: self.rsrc.application.backgrounds[0].menubar = result.menubar self.documentChanged = True def on_editStrings_command(self, event): stringList = {} try: if self.editingDialog: strings = self.rsrc.strings else: strings = self.rsrc.application.backgrounds[0].strings for s in strings.__dict__: stringList[s] = strings.__dict__[s] except: stringList = {} result = stringDialog.stringDialog(self, stringList) if result.accepted: if self.editingDialog: self.rsrc.strings = result.stringList else: self.rsrc.application.backgrounds[0].strings = result.stringList self.documentChanged = True def on_optionGridSize_command(self, event): result = dialog.textEntryDialog(self, 'Enter the preferred grid size (e.g. 5):', 'Grid Size', str(self.xGridSize)) if result.accepted: try: size = int(result.text) self.xGridSize = size self.yGridSize = size if self.showGridLines: self.panel.Refresh() except: # should probably do an alert dialog here pass def on_menuOptionsAlignToGrid_select(self, event): self.alignToGrid = self.menuBar.getChecked('menuOptionsAlignToGrid') def on_menuOptionsShowGridLines_select(self, event): self.showGridLines = self.menuBar.getChecked('menuOptionsShowGridLines') if self.showGridLines: self.panel.Bind(wx.EVT_ERASE_BACKGROUND, self.drawPanelGridLines) else: self.panel.Unbind(wx.EVT_ERASE_BACKGROUND) self.panel.Refresh() def getCommandLineArgs(self): args = ' ' if self.cmdLineArgs['debugmenu']: args += '-d ' if self.cmdLineArgs['logging']: args += '-l ' if self.cmdLineArgs['messagewatcher']: args += '-m ' if self.cmdLineArgs['namespaceviewer']: args += '-n ' if self.cmdLineArgs['propertyeditor']: args += '-p ' if self.cmdLineArgs['shell']: args += '-s ' """ if self.menuBar.getChecked('menuOptionsLogging'): args += '-l ' if self.menuBar.getChecked('menuOptionsMessageWatcher'): args += '-m ' if self.menuBar.getChecked('menuOptionsNamespaceViewer'): args += '-n ' if self.menuBar.getChecked('menuOptionsPropertyEditor'): args += '-p ' if self.menuBar.getChecked('menuOptionsShell'): args += '-s ' """ return args def previewDialog(self): if self.filename is None: # KEA 2002-03-25 # should probably present an error dialog here return dlg = DummyDialog(self, self.filename) dlg.showModal() dlg.destroy() def on_filePreviewDialog_command(self, event): # we should prompt to save the .rsrc.py file if needed # or in the case of a new file, do a save as before attempting # to do a preview self.previewDialog() def runScript(self, useInterpreter): # KEA 2004-05-08 # auto-save code taken from codeEditor if self.filename is None: save = self.saveChanges() if save == "Cancel" or save == "No": # don't do anything, just go back to editing return else: if not self.on_menuFileSaveAs_select(None): # they didn't actually save, just go back # to editing return elif self.documentChanged: # auto-save self.saveFile() if self.filename is None: # KEA 2002-03-25 # should probably present an error dialog here return # this algorithm, taken from samples.py assumes the rsrc.py file and the main # program file have the same basename # if that isn't the case then this doesn't work and we need a different solution path, filename = os.path.split(self.filename) name = filename.split('.')[0] if os.path.exists(os.path.join(path, name + ".pyw")): filename = '"' + os.path.join(path, name + ".pyw") + '"' else: filename = '"' + os.path.join(path, name + ".py") + '"' # the args should come from a dialog or menu items that are checked/unchecked args = self.getCommandLineArgs() if useInterpreter: interp = ' -i ' else: interp = ' ' if sys.platform.startswith('win'): # KEA 2002-03-06 # always launch with console in the resourceEditor for debugging purposes python = os.path.join(os.path.dirname(sys.executable), 'python.exe') if ' ' in python: pythonQuoted = '"' + python + '"' else: pythonQuoted = python if useInterpreter and os.name != 'nt': os.spawnv(os.P_NOWAIT, python, [pythonQuoted, interp, filename, args]) else: os.spawnv(os.P_NOWAIT, python, [pythonQuoted, interp, filename, args]) else: if ' ' in sys.executable: python = '"' + sys.executable + '"' else: python = sys.executable os.system(python + interp + filename + args + ' &') def on_fileRun_command(self, event): self.runScript(False) def on_fileRunWithInterpreter_command(self, event): self.runScript(True) def copyWidgetDescriptionToClipboard(self, name): widget = self.components[name] desc = resourceOutput.widgetAttributes(self, widget) if desc.endswith(',\n'): desc = desc[:-2] clipboard.setClipboard(desc) def on_menuEditCut_select(self, event): if self.components.topLeft.visible and self.startName in self.components: aWidget = self.components[self.startName] msg = "Are you sure you want to Cut %s %s?" % (aWidget.__class__.__name__, aWidget.name) result = dialog.messageDialog(self, msg, 'Cut Component', wx.ICON_INFORMATION | wx.YES_NO | wx.NO_DEFAULT) if result.accepted: self.copyWidgetDescriptionToClipboard(self.startName) self.hideSizingHandles() del self.components[aWidget.name] self.documentChanged = True def on_menuEditCopy_select(self, event): if self.components.topLeft.visible and self.startName in self.components: self.copyWidgetDescriptionToClipboard(self.startName) def on_menuEditPaste_select(self, event): # need to figure out the logic of checking the contents # of the clipboard to see if it is something we can use # then checking whether the component already exists # if it exists, prompt for a new name # create the widget desc = clipboard.getClipboard() if not isinstance(desc, str): return # KEA 2004-09-10 # the clipboard is converting newlines to returns # which causes eval to fail if wx.Platform == '__WXMAC__': desc = '\n'.join(desc.splitlines()) # this is dangerous so we need a better way of converting # the text in the clipboard to a dictionary safely if desc[0] == '{' and desc[-1] == '}': desc = eval(desc) name = desc['name'] # AGT 2004-07-08 # give dialog to set name self.create_component(desc, True, 'Paste ' + desc['type'], "paste") def loadConfig(self): try: if not os.path.exists(self.configPath): os.mkdir(self.configPath) path = os.path.join(self.configPath, USERCONFIG) self.config = util.readAndEvalFile(path) if self.config != {}: if 'propertyEditorWindow.position' in self.config: self.propertyEditorWindow.SetPosition(self.config['propertyEditorWindow.position']) if 'history' in self.config: history = self.config['history'] history.reverse() for h in history: self.fileHistory.AddFileToHistory(h) except: self.config = {} def saveConfig(self): self.config['propertyEditorWindow.position'] = self.propertyEditorWindow.GetRestoredPosition() self.config['propertyEditorWindow.size'] = self.propertyEditorWindow.GetRestoredSize() history = [] for i in range(self.fileHistory.GetCount()): history.append(self.fileHistory.GetHistoryFile(i)) self.config['history'] = history try: path = os.path.join(self.configPath, USERCONFIG) f = open(path, "w") pprint.pprint(self.config, f) f.close() except: pass # argh def doExit(self): if self.documentChanged: save = self.saveChanges() if save == "Cancel": return False elif save == "No": return True else: if self.filename is None: return self.on_menuFileSaveAs_select(None) else: return self.saveFile() else: return True def doCleanup(self): # memory leak cleanup for k in self.cursors: self.cursors[k] = None def on_close(self, event): try: # KEA 2004-04-08 # if an exception occurs during on_initialize # then doCleanup and saveConfig could fail because some windows # might not exist, so in that situation just exit gracefully if self.doExit(): self.saveConfig() self.doCleanup() event.skip() except: event.skip() def on_showPythonCardDocumentation_command(self, event): global pythoncard_url webbrowser.open(pythoncard_url) def on_showResourceEditorDocumentation_command(self, event): global resourceeditor_url webbrowser.open(resourceeditor_url) if __name__ == '__main__': # now force the property editor to be enabled #configuration('showPropertyEditor', 1) #configuration('showShell', 1) app = model.Application(ResourceEditor) app.MainLoop() PythonCard-0.8.2/tools/oneEditor/resourceEditor.rsrc.py0000644000076500007650000002023110130111011023073 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'ResEdit', 'backgrounds': [ {'type':'Background', 'name':'bgDrag', 'title':'Resource Editor', 'size':(316, 166), 'style':['resizeable'], 'menubar': {'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ {'type':'MenuItem', 'name':'menuFileNew', 'label':'&New...\tCtrl+N', }, {'type':'MenuItem', 'name':'menuFileOpen', 'label':'&Open...\tCtrl+O', }, {'type':'MenuItem', 'name':'menuFileSave', 'label':'Save\tCtrl+S', }, {'type':'MenuItem', 'name':'menuFileSaveAs', 'label':'Save &As...', }, {'type':'MenuItem', 'name':'menuFileRevert', 'label':'Revert', }, {'type':'MenuItem', 'name':'fileSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuFileRun', 'label':'&Run\tCtrl+R', 'command':'fileRun', }, {'type':'MenuItem', 'name':'menuFileRunWithInterpreter', 'label':'Run with &interpreter\tCtrl+Shift+R', 'command':'fileRunWithInterpreter', }, {'type':'MenuItem', 'name':'menuFileRunOptions', 'label':'Run Options...', 'command':'fileRunOptions', }, {'type':'MenuItem', 'name':'menuFilePreviewDialog', 'label':'Preview Dialog', 'command':'filePreviewDialog', }, {'type':'MenuItem', 'name':'fileSep2', 'label':'-', }, {'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit', }, ] }, {'type':'Menu', 'name':'menuEdit', 'label':'&Edit', 'items': [ {'type':'MenuItem', 'name':'menuEditCut', 'label':'Cu&t\tCtrl+X', }, {'type':'MenuItem', 'name':'menuEditCopy', 'label':'&Copy\tCtrl+C', }, {'type':'MenuItem', 'name':'menuEditPaste', 'label':'&Paste\tCtrl+V', }, {'type':'MenuItem', 'name':'editSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuComponentDuplicate', 'label':'&Duplicate', 'command':'componentDuplicate', }, {'type':'MenuItem', 'name':'menuComponentDelete', 'label':'Delete\tDel', 'command':'componentDelete', }, {'type':'MenuItem', 'name':'componentSep2', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditBackgroundInfo', 'label':'Background Info...', 'command':'editBackgroundInfo', }, {'type':'MenuItem', 'name':'menuEditMenubar', 'label':'Menu Editor...', 'command':'editMenubar', }, {'type':'MenuItem', 'name':'menuEditStrings', 'label':'String Editor...', 'command':'editStrings', }, {'type':'MenuItem', 'name':'menuEditDialogInfo', 'label':'Dialog Info...', 'command':'editDialogInfo', }, ] }, {'type':'Menu', 'name':'menuComponent', 'label':'&Component', 'items': [] }, {'type':'Menu', 'name':'menuOptions', 'label':'&Options', 'items': [ {'type':'MenuItem', 'name':'menuOptionsGridSize', 'label':'Grid Size...', 'command':'optionGridSize', }, {'type':'MenuItem', 'name':'menuOptionsAlignToGrid', 'label':'Align Components to Grid\tCtrl+G', 'checkable':1, }, {'type':'MenuItem', 'name':'menuOptionsShowGridLines', 'label':'Show Grid Lines', 'checkable':1, 'checked':0, }, {'type':'MenuItem', 'name':'componentSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuComponentSendBack', 'label':'Send to Back\tCtrl+1', 'command':'componentSendBack', }, {'type':'MenuItem', 'name':'menuComponentMoveBack', 'label':'Move Backward\tCtrl+2', 'command':'componentMoveBack', }, {'type':'MenuItem', 'name':'menuComponentMoveForward', 'label':'Move Forward\tCtrl+3', 'command':'componentMoveForward', }, {'type':'MenuItem', 'name':'menuComponentBringFront', 'label':'Bring to Front\tCtrl+4', 'command':'componentBringFront', }, ] }, {'type':'Menu', 'name':'menuView', 'label':'&View', 'items': [ {'type':'MenuItem', 'name':'menuViewAttributes', 'label':'&Resource...', 'command':'displayAttributes', }, {'type':'MenuItem', 'name':'menuViewSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuViewPropertyEditor', 'label':'Property Editor\tCtrl+P', 'checkable':1, 'checked':1, }, ] }, {'type':'Menu', 'name':'menuHelp', 'label':'&Help', 'items': [ {'type':'MenuItem', 'name':'menuResourceEditorDocumentation', 'label':'&resourceEditor Documentation...\tF1', 'command':'showResourceEditorDocumentation', }, {'type':'MenuItem', 'name':'menuPythonCardDocumentation', 'label':'&PythonCard Documentation...', 'command':'showPythonCardDocumentation', }, {'type':'MenuItem', 'name':'helpSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuHelpAbout', 'label':'&About resourceEditor...', }, {'type':'MenuItem', 'name':'menuHelpAboutPythonCard', 'label':'About PythonCard...', 'command':'doHelpAboutPythonCard', }, ] }, ] }, 'components': [ ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/tools/oneEditor/restEditor.py0000644000076500007650000000703110130111011021254 0ustar alexalex00000000000000#!/usr/bin/env python """ __version__ = "$Revision: 1.1 $" __date__ = "$Date: 2004/10/03 23:58:01 $" """ import os from PythonCard import dialog, model from codeEditor import CodeEditor from wx import stc import webbrowser # reST from PythonCard.templates.htmlpreview import HtmlPreview from snippet import restify class RestEditor(CodeEditor): def on_initialize(self, event): super(RestEditor, self).on_initialize(event) self.renderOnReturn = self.menuBar.getChecked('menuFormatRenderOnReturn') self.previewWindow = model.childWindow(self, HtmlPreview) #self.previewWindow.position = (425, -1) self.previewWindow.visible = True self.html = '' # reST def on_previewPost_command(self, event): self.previewWindow.Show() txt = self.components.document.text if self.menuBar.getChecked('menuViewSourceIsHtml'): firstLine = txt[:10].lower() if firstLine.startswith('\n\n\n\n' + txt + '\n\n\n' else: # KEA 2004-08-15 # snippet.restify is returning None when there is a reST error # what's a better way to provide feedback to the user without barfing # all over the output? rest = restify(txt) if rest: html = '\n\n\n\n' + rest + '\n\n\n' else: html = self.previewWindow.components.html.text # do make sure stylesheets and relative image references can be found # might need to chdir here # won't work until there is a document path curdir = os.getcwd() self.previewWindow.components.html.text = html self.html = html os.chdir(curdir) def on_document_keyDown(self, event): if event.keyCode == 13 and self.renderOnReturn: # since we won't be calling skip, insert a newline manually self.components.document.CmdKeyExecute(stc.STC_CMD_NEWLINE) self.on_previewPost_command(None) else: event.skip() def saveHtmlFile(self, path): try: f = open(path, 'wb') try: f.write(self.html) finally: f.close() except: pass def on_saveHtml_command(self, event): wildcard = "HTML files (*.html)|*.html|All files (*.*)|*.*" #wildcard = self.resource.strings.saveAsWildcard if self.documentPath is None: dir = '' filename = '*.html' else: dir = os.path.dirname(self.documentPath) filename = os.path.splitext(os.path.basename(self.documentPath))[0] + '.html' result = dialog.saveFileDialog(None, self.resource.strings.saveAs, dir, filename, wildcard) if result.accepted: path = result.paths[0] self.saveHtmlFile(path) def on_menuFormatRenderOnReturn_select(self, event): self.renderOnReturn = self.menuBar.getChecked('menuFormatRenderOnReturn') def on_doHelpRest_command(self, event): webbrowser.open('http://docutils.sourceforge.net/rst.html') def on_doHelpRestQuickReference_command(self, event): webbrowser.open('http://docutils.sourceforge.net/docs/user/rst/quickref.html') if __name__ == '__main__': app = model.Application(RestEditor) app.MainLoop() PythonCard-0.8.2/tools/oneEditor/restEditor.rsrc.py0000644000076500007650000003502210130111011022225 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'codeEditor', 'backgrounds': [ {'type':'Background', 'name':'bgCodeEditor', 'title':'Code Editor PythonCard Application', 'size':(400, 300), 'statusBar':1, 'visible':0, 'style':['resizeable'], 'visible':0, 'menubar': {'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ {'type':'MenuItem', 'name':'menuFileNewWindow', 'label':'New Window', }, {'type':'MenuItem', 'name':'menuFileNew', 'label':'&New\tCtrl+N', }, {'type':'MenuItem', 'name':'menuFileOpen', 'label':'&Open\tCtrl+O', }, {'type':'MenuItem', 'name':'menuFileSave', 'label':'&Save\tCtrl+S', }, {'type':'MenuItem', 'name':'menuFileSaveAs', 'label':'Save &As...', }, {'type':'MenuItem', 'name':'menuFileSaveHtml', 'label':'Save HTML As...', 'command':'saveHtml', }, {'type':'MenuItem', 'name':'fileSep1', 'label':'-', }, ## {'type':'MenuItem', ## 'name':'menuFileCheckSyntax', ## 'label':'&Check Syntax (Module)\tAlt+F5', ## 'command':'checkSyntax', ## }, ## {'type':'MenuItem', ## 'name':'menuFileRun', ## 'label':'&Run\tCtrl+R', ## 'command':'fileRun', ## }, ## {'type':'MenuItem', ## 'name':'menuFileRunWithInterpreter', ## 'label':'Run with &interpreter\tCtrl+Shift+R', ## 'command':'fileRunWithInterpreter', ## }, ## {'type':'MenuItem', ## 'name':'menuFileRunOptions', ## 'label':'Run Options...', ## 'command':'fileRunOptions', ## }, ## {'type':'MenuItem', ## 'name':'fileSep2', ## 'label':'-', ## }, {'type':'MenuItem', 'name':'menuFilePageSetup', 'label':'Page Set&up...', }, {'type':'MenuItem', 'name':'menuFilePrint', 'label':'&Print...\tCtrl+P', }, {'type':'MenuItem', 'name':'menuFilePrintPreview', 'label':'Print Pre&view', }, {'type':'MenuItem', 'name':'fileSep2', 'label':'-', }, {'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit', }, ] }, {'type':'Menu', 'name':'Edit', 'label':'&Edit', 'items': [ {'type':'MenuItem', 'name':'menuEditUndo', 'label':'&Undo\tCtrl+Z', }, {'type':'MenuItem', 'name':'menuEditRedo', 'label':'&Redo\tCtrl+Y', }, {'type':'MenuItem', 'name':'editSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditCut', 'label':'Cu&t\tCtrl+X', }, {'type':'MenuItem', 'name':'menuEditCopy', 'label':'&Copy\tCtrl+C', }, {'type':'MenuItem', 'name':'menuEditPaste', 'label':'&Paste\tCtrl+V', }, {'type':'MenuItem', 'name':'editSep2', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditFind', 'label':'&Find...\tCtrl+F', 'command':'doEditFind', }, {'type':'MenuItem', 'name':'menuEditFindNext', 'label':'&Find Next\tF3', 'command':'doEditFindNext', }, {'type':'MenuItem', 'name':'menuEditFindFiles', 'label':'Find in Files...\tAlt+F3', 'command':'findFiles', }, {'type':'MenuItem', 'name':'menuEditReplace', 'label':'&Replace...\tCtrl+H', 'command':'doEditFindReplace', }, {'type':'MenuItem', 'name':'menuEditGoTo', 'label':'&Go To...\tCtrl+G', 'command':'doEditGoTo', }, {'type':'MenuItem', 'name':'editSep3', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditReplaceTabs', 'label':'&Replace tabs with spaces', 'command':'doEditReplaceTabs', }, {'type':'MenuItem', 'name':'editSep3', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditClear', 'label':'Cle&ar\tDel', }, {'type':'MenuItem', 'name':'menuEditSelectAll', 'label':'Select A&ll\tCtrl+A', }, {'type':'MenuItem', 'name':'editSep4', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditIndentRegion', 'label':'&Indent Region', 'command':'indentRegion', }, {'type':'MenuItem', 'name':'menuEditDedentRegion', 'label':'&Dedent Region', 'command':'dedentRegion', }, {'type':'MenuItem', 'name':'menuEditCommentRegion', 'label':'Comment &out region\tAlt+3', 'command':'commentRegion', }, {'type':'MenuItem', 'name':'menuEditUncommentRegion', 'label':'U&ncomment region\tShift+Alt+3', 'command':'uncommentRegion', }, ] }, {'type':'Menu', 'name':'menuView', 'label':'&View', 'items': [ {'type':'MenuItem', 'name':'menuViewWhitespace', 'label':'&Whitespace', 'checkable':1, }, {'type':'MenuItem', 'name':'menuViewIndentationGuides', 'label':'Indentation &guides', 'checkable':1, }, {'type':'MenuItem', 'name':'menuViewRightEdgeIndicator', 'label':'&Right edge indicator', 'checkable':1, }, {'type':'MenuItem', 'name':'menuViewEndOfLineMarkers', 'label':'&End-of-line markers', 'checkable':1, }, {'type':'MenuItem', 'name':'menuViewFixedFont', 'label':'&Fixed Font', 'enabled':0, 'checkable':1, }, {'type':'MenuItem', 'name':'viewSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuViewLineNumbers', 'label':'&Line Numbers', 'checkable':1, 'checked':1, }, {'type':'MenuItem', 'name':'menuViewCodeFolding', 'label':'&Code Folding', 'checkable':1, 'checked':0, }, {'type':'MenuItem', 'name':'viewSep2', 'label':'-', }, {'type':'MenuItem', 'name':'menuViewPreviewHTML', 'label':'&Preview HTML\tCtrl+1', 'command':'previewPost', }, {'type':'MenuItem', 'name':'menuViewSourceIsHtml', 'label':'Source is HTML', 'checkable':1, 'checked':0, }, ] }, {'type':'Menu', 'name':'menuFormat', 'label':'F&ormat', 'items': [ {'type':'MenuItem', 'name':'menuFormatStyles', 'label':'&Styles...', 'command':'doSetStyles', }, {'type':'MenuItem', 'name':'menuFormatWrap', 'label':'&Wrap Lines', 'checkable':1, }, {'type':'MenuItem', 'name':'formatSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuFormatRender', 'label':'Render Page\tCtrl+R', 'command':'previewPost', }, {'type':'MenuItem', 'name':'menuFormatRenderOnReturn', 'label':'Render on Return', 'checkable':1, 'checked':1, }, ] }, {'type':'Menu', 'name':'menuScriptlet', 'label':'&Shell', 'items': [ {'type':'MenuItem', 'name':'menuScriptletShell', 'label':'&Shell Window\tF5', }, {'type':'MenuItem', 'name':'menuScriptletNamespace', 'label':'&Namespace Window\tF6', }, {'type':'MenuItem', 'name':'menuScriptletSaveUserConfiguration', 'label':'Save &Configuration', }, {'type':'MenuItem', 'name':'menuShellChangeDirectory', 'label':'Change &Directory...', }, {'type':'MenuItem', 'name':'scriptletSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuScriptletSaveShellSelection', 'label':'Save Shell Selection...', }, {'type':'MenuItem', 'name':'menuScriptletRunScriptlet', 'label':'Run Scriptlet...', }, ] }, {'type':'Menu', 'name':'menuHelp', 'label':'&Help', 'items': [ {'type':'MenuItem', 'name':'menuShellDocumentation', 'label':'&Shell Documentation...', 'command':'showShellDocumentation', }, {'type':'MenuItem', 'name':'menuPythonCardDocumentation', 'label':'&PythonCard Documentation...\tF1', 'command':'showPythonCardDocumentation', }, {'type':'MenuItem', 'name':'menuPythonDocumentation', 'label':'Python &Documentation...', 'command':'showPythonDocumentation', }, {'type':'MenuItem', 'name':'helpSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuHelpRest', 'label':'reStructuredText Home Page', 'command':'doHelpRest', }, {'type':'MenuItem', 'name':'menuHelpRestQuickReference', 'label':'reStructuredText Quick Reference', 'command':'doHelpRestQuickReference', }, {'type':'MenuItem', 'name':'helpSep2', 'label':'-', }, {'type':'MenuItem', 'name':'menuHelpAbout', 'label':'&About codeEditor...', 'command':'doHelpAbout', }, {'type':'MenuItem', 'name':'menuHelpAboutPythonCard', 'label':'About PythonCard...', 'command':'doHelpAboutPythonCard', }, ] }, ] }, 'strings': { 'saveAs':'Save As', 'about':'About codeEditor...', 'saveAsWildcard':'All files (*.*)|*.*|Python scripts (*.py;*.pyw)|*.pyw;*.PY;*.PYW;*.py|Text files (*.txt;*.text)|*.text;*.TXT;*.TEXT;*.txt|HTML and XML files (*.htm;*.html;*.xml)|*.htm;*.xml;*.HTM;*.HTML;*.XML;*.html', 'chars':'chars', 'gotoLine':'Goto line', 'lines':'lines', 'gotoLineNumber':'Goto line number:', 'documentChangedPrompt':'The text in the %s file has changed.\n\nDo you want to save the changes?', 'untitled':'Untitled', 'sample':'codeEditor sample', 'codeEditor':'codeEditor', 'replaced':'Replaced %d occurances', 'words':'words', 'openFile':'Open file', 'scriptletWildcard':'Python files (*.py)|*.py|All Files (*.*)|*.*', 'document':'Document', }, 'components': [ {'type':'CodeEditor', 'name':'document', 'position':(0, 0), 'size':(250, 100), }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/tools/oneEditor/scriptlets/0000755000076500007650000000000010434046773021006 5ustar alexalex00000000000000PythonCard-0.8.2/tools/oneEditor/scriptlets/documentWordCount.py0000644000076500007650000000115210137030454025027 0ustar alexalex00000000000000import wx from PythonCard import dialog, util def wordCount(text): chars = len(text) words = len(text.split()) # this doesn't always match the getNumberOfLines() method # so this should probably be changed lines = len(text.splitlines()) return chars, words, lines if self.currentPage.documentPath is None: filename = 'Untitled' else: filename = os.path.basename(self.currentPage.documentPath) dialog.messageDialog(self, "Document: %s\n" % filename + "%d chars, %d words, %d lines" % wordCount(util.normalizeEOL(self.currentDocument.text)), 'Word Count', wx.ICON_INFORMATION | wx.OK) PythonCard-0.8.2/tools/oneEditor/scriptlets/insertDateAndTime.py0000644000076500007650000000022610137030454024711 0ustar alexalex00000000000000import time now = time.localtime(time.time()) dateStr = time.strftime("%A, %B %d, %Y, %I:%M %p", now) self.currentDocument.ReplaceSelection(dateStr) PythonCard-0.8.2/tools/oneEditor/scriptlets/insertDialog.py0000644000076500007650000000545610137030454024003 0ustar alexalex00000000000000from PythonCard import dialog alertDialogTemplate = """result = dialog.alertDialog(self, 'a message', 'a title') if result.accepted: returned = result.returnedString """ colorDialogTemplate = """result = dialog.colorDialog(self) if result.accepted: color = result.color """ directoryDialogTemplate = """result = dialog.directoryDialog(self, 'Choose a directory', '') if result.accepted: path = result.path """ findDialogTemplate = """result = dialog.findDialog(self) if result.accepted: searchText = result.searchText wholeWordsOnly = result.wholeWordsOnly caseSensitive = result.caseSensitive """ fontDialogTemplate = """result = dialog.fontDialog(self) if result.accepted: color = result.color font = result.font """ messageDialogTemplate = """result = dialog.messageDialog(self, 'a message', 'a title', wx.ICON_INFORMATION | wx.YES_NO | wx.NO_DEFAULT | wx.CANCEL) if result.accepted: returned = result.returnedString """ multipleChoiceDialogTemplate = """result = dialog.multipleChoiceDialog(self, "message", "title", ['one', 'two', 'three']) if result.accepted: sel = result.selection """ openFileDialogTemplate = """wildcard = "JPG files (*.jpg;*.jpeg)|*.jpg;*.jpeg;*.JPG;*.JPEG|GIF files (*.gif)|*.gif;*.GIF|All Files (*.*)|*.*" result = dialog.openFileDialog(self, 'Open', '', '', wildcard ) if result.accepted: path = result.paths[0] """ saveFileDialogTemplate = """wildcard = "JPG files (*.jpg;*.jpeg)|*.jpg;*.jpeg;*.JPG;*.JPEG|GIF files (*.gif)|*.gif;*.GIF|All Files (*.*)|*.*" result = dialog.saveFileDialog(self, 'Save', '', '', wildcard ) if result.accepted: path = result.paths[0] """ scrolledMessageDialogTemplate = """dialog.scrolledMessageDialog(self, 'message', 'title') if result.accepted: # you don't really need the accepted test, since there isn't a result # to check for a scrolledMessageDialog pass """ singleChoiceDialogTemplate = """result = dialog.singleChoiceDialog(self, "message", "title", ['one', 'two', 'three']) if result.accepted: sel = result.selection """ textEntryDialogTemplate = """result = dialog.textEntryDialog(self, 'message', 'title', 'text') if result.accepted: returned = result.returnedString text = result.text """ dialogsList = ['alertDialog', 'colorDialog', 'directoryDialog', 'findDialog', 'fontDialog', 'messageDialog', 'multipleChoiceDialog', 'openFileDialog', 'saveFileDialog', 'scrolledMessageDialog', 'singleChoiceDialog', 'textEntryDialog'] dialogsList.sort() result = dialog.singleChoiceDialog(None, "Pick a dialog:", "Dialogs", dialogsList) if result.accepted: dialogText = eval(result.selection + 'Template') # could get the current indent and insert the appropriate # number of spaces before each line of the template here self.currentDocument.ReplaceSelection(dialogText) PythonCard-0.8.2/tools/oneEditor/scriptlets/selectionWordCount.py0000644000076500007650000000120310137030454025173 0ustar alexalex00000000000000import wx from PythonCard import dialog, util def wordCount(text): chars = len(text) words = len(text.split()) # this doesn't always match the getNumberOfLines() method # so this should probably be changed lines = len(text.splitlines()) return chars, words, lines if self.currentPage.documentPath is None: filename = 'Untitled' else: filename = os.path.basename(self.currentPage.documentPath) text = util.normalizeEOL(self.currentDocument.GetSelectedText()) dialog.messageDialog(self, "Document: %s\n" % filename + "%d chars, %d words, %d lines" % wordCount(text), 'Word Count', wx.ICON_INFORMATION | wx.OK) PythonCard-0.8.2/tools/oneEditor/scriptlets/testIgnore.py0000644000076500007650000000016010130111011023443 0ustar alexalex00000000000000# ignore is a regular expression that will match the filenames # for the modules to exclude. ignore = '.*\.py$' PythonCard-0.8.2/tools/oneEditor/scriptlets/unorderedList.py0000644000076500007650000000034710137030454024174 0ustar alexalex00000000000000# inserts "\t* " before each line in the selection text = self.currentDocument.GetSelectedText() unorderedList = "" for i in text.splitlines(1): unorderedList += "\t* " + i self.currentDocument.ReplaceSelection(unorderedList) PythonCard-0.8.2/tools/oneEditor/snippet.py0000644000076500007650000000156410130111011020617 0ustar alexalex00000000000000from docutils import core from docutils.writers.html4css1 import Writer,HTMLTranslator from docutils.utils import SystemMessage class NoHeaderHTMLTranslator(HTMLTranslator): def __init__(self, document): HTMLTranslator.__init__(self,document) self.head_prefix = ['','','','',''] self.body_prefix = [] self.body_suffix = [] self.stylesheet = [] _w = Writer() _w.translator_class = NoHeaderHTMLTranslator def restify(string): # return core.publish_string(string,writer=_w) try: result = core.publish_string(string,writer=_w, settings_overrides={'traceback': True}) except SystemMessage, e: result = None print "barf" return result if __name__ == '__main__': test = """ Test example of reST__ document. __ http://docutils.sf.net/rst.html - item 1 - item 2 - item 3 """ print restify(test) PythonCard-0.8.2/tools/oneEditor/tabcodeEditor.py0000644000076500007650000014600610354647171021743 0ustar alexalex00000000000000#!/usr/bin/env python """ __version__ = "$Revision: 1.15 $" __date__ = "$Date: 2005/12/29 02:48:25 $" PythonCard Editor (codeEditor) wiki page http://wiki.wxpython.org/index.cgi/PythonCardEditor wxStyledTextCtrl documentation http://wiki.wxpython.org/index.cgi/wxStyledTextCtrl """ from PythonCard import about, configuration, dialog, log, menu, model, resource, util, registry from PythonCard.templates.dialogs import runOptionsDialog import codePage from modules import scriptutils import os, sys import wx from wx import stc from wx.html import HtmlEasyPrinting import pprint from PythonCard import STCStyleEditor from modules import colorizer import cStringIO import webbrowser NEVER_BLANK = True # if True, closing last tab causes newFile # KEA 2004-07-22 # force imports for components used in .rsrc.py file # so we can do a make standalones with py2exe and bundlebuilder from PythonCard.components import codeeditor USERCONFIG = 'user.config.txt' # KEA 2002-05-03 # this could be more sophisticated # by using an external source code colorizer # or Scintillas over lexical analyzer?! def textToHtml(source): """Return text converted to HTML.""" # KEA 2003-08-07 # how should we deal with Unicode? source = source.encode('iso-8859-1') output = cStringIO.StringIO() colorizer.Parser(source, output).format(None, None) html = output.getvalue() return html # KEA doc handling adapted from python_docs # method in IDLE EditorWindow.py pythoncard_url = util.documentationURL("documentation.html") shell_url = util.documentationURL("shell.html") help_url = "http://docs.python.org/" if sys.platform.startswith("win"): fn = os.path.dirname(os.__file__) fn = os.path.join(fn, os.pardir, "Doc", "index.html") fn = os.path.normpath(fn) if os.path.isfile(fn): help_url = fn del fn elif sys.platform == 'darwin': fn = '/Library/Frameworks/Python.framework/Versions/' + \ 'Current/Resources/Python.app/Contents/Resources/English.lproj/' + \ 'PythonDocumentation/index.html' if os.path.exists(fn): help_url = "file://" + fn def getResourceFilename(path): path, filename = os.path.split(path) base = os.path.splitext(filename)[0] resourceFilename = os.path.join(path, base + '.rsrc.py') return resourceFilename # this really needs to know about the structure # of the file by parsing the classes and methods # it won't deal with duplicate handler names... # with just simple matching def handlerExists(text, componentName, eventName): eventText = 'def on_' + componentName + '_' + eventName + '(' # commands are a special case since the command name # does not have to be tied to the component name # so that will require special handling by looking # at the command attribute of the component return text.find(eventText) class TabCodeEditor(model.Background): def on_initialize(self, event): self.pages = [] self.currentPageNumber = -1 self.currentPage = None self.currentDocument = None self.initSizers() # KEA 2002-05-08 # wxFileHistory isn't wrapped, so use raw wxPython # the file history is not actually saved when you quit # or shared between windows right now # also the file list gets appended to the File menu # rather than going in front of the Exit menu # I suspect I have to add the Exit menu after the file history # which means changing how the menus in resources are loaded # so I'll do that later self.fileHistory = wx.FileHistory() fileMenu = self.GetMenuBar().GetMenu(0) self.fileHistory.UseMenu(fileMenu) wx.EVT_MENU_RANGE(self, wx.ID_FILE1, wx.ID_FILE9, self.OnFileHistory) self.lastStatus = None self.lastPos = None self.configPath = os.path.join(configuration.homedir, 'tabbedcodeeditor') self.loadConfig() self.cmdLineArgs = {'debugmenu':False, 'logging':False, 'messagewatcher':False, 'namespaceviewer':False, 'propertyeditor':False, 'shell':False, 'otherargs':''} self.lastFind = {'searchText':'', 'replaceText':'', 'wholeWordsOnly':False, 'caseSensitive':False} self.startTitle = self.title if len(sys.argv) > 1: # accept a file argument on the command-line filename = os.path.abspath(sys.argv[1]) log.info('codeEditor filename: ' + filename) if not os.path.exists(filename): filename = os.path.abspath(os.path.join(self.application.startingDirectory, sys.argv[1])) #print filename if os.path.isfile(filename): self.openFile(filename) # the second argument can be a line number to jump to # this is experimental, but a nice feature # KEA 2002-05-01 # gotoLine causes the Mac to segfault if (len(sys.argv) > 2): try: line = int(sys.argv[2]) self.gotoLine(line) except: pass else: self.newFile() else: self.newFile() self.printer = HtmlEasyPrinting() # KEA 2002-05-08 # wxSTC defaults will eventually be settable via a dialog # and saved in a user config, perhaps compatible with IDLE # or Pythonwin ###### self.components.document.SetEdgeColumn(75) # KEA 2002-05-08 # the wxFindReplaceDialog is not wrapped # so this is an experiment to see how it works wx.EVT_COMMAND_FIND(self, -1, self.OnFind) wx.EVT_COMMAND_FIND_NEXT(self, -1, self.OnFind) wx.EVT_COMMAND_FIND_REPLACE(self, -1, self.OnFind) wx.EVT_COMMAND_FIND_REPLACE_ALL(self, -1, self.OnFind) wx.EVT_COMMAND_FIND_CLOSE(self, -1, self.OnFindClose) self.visible = True self.loadShell() # hack to get around size event being hooked up # after on_initialize is called? # that is the only explanation I can think of for needing # to do this w, h = self.size wx.FutureCall(1, self.SetSize, (w, h - 1)) wx.FutureCall(1, self.SetSize, (w, h)) def initSizers(self): sizer1 = wx.BoxSizer(wx.VERTICAL) sizer2 = wx.BoxSizer(wx.HORIZONTAL) sizer2.Add(self.components.popComponentNames) sizer2.Add(self.components.popComponentEvents) sizer2.Add( (10,21) ) sizer1.Add(sizer2, 0) sizer1.Add(self.components.notebook, 1, wx.EXPAND) sizer1.Fit(self) sizer1.SetSizeHints(self) self.panel.SetSizer(sizer1) self.panel.SetAutoLayout(1) self.panel.Layout() def on_idle(self, event): if self.currentPageNumber >= 0: self.currentPage = self.pages[self.currentPageNumber] self.currentDocument = self.pages[self.currentPageNumber].components.document else: self.currentPage = None self.currentDocument = None self.updateTitleBar() if self.currentPage: self.updateStatusBar() # KEA 2003-01-06 # resource file support # if there is an associated resource file then # it should be checked periodically to see if it has # changed and if so, update our internal resource # as well as the component names and events menus # the events menu should also be updated as the user # edits the text to keep the defined events marked # with a + # the code below is too CPU intensive to run # all the time, so I've commented it out until # a better way of updating the event list is found ##sel = self.components.popComponentNames.stringSelection ##if sel != '': ## self.fillEventNames(sel) def updateStatusBar(self): if self.currentPage: if self.currentPage.documentPath: path = self.currentPage.documentPath else: path = self.resource.strings.untitled pos = self.currentDocument.GetCurrentPos() newText = "File: %s | Line: %d | Column: %d" % \ (path, self.currentDocument.LineFromPosition(pos) + 1, self.currentDocument.GetColumn(pos) + 1) #print "updatestatusbar", self.lastPos, pos, self.lastStatus, newText if self.lastStatus != newText: self.statusBar.text = newText self.lastStatus = newText self.currentPage.lastPos = pos else: self.statusBar.text = "No File" def setTitleBar(self, path): if not path: path = self.resource.strings.untitled self.title = path + " " + self.startTitle self.components.notebook.SetPageText(self.currentPageNumber, os.path.split(path)[-1]) self.updateTitleBar() def updateTitleBar(self): title = self.title pageText = self.components.notebook.GetPageText(self.currentPageNumber) if self.currentPage: modified = self.currentDocument.GetModify() else: modified = '' if modified and title[0] != '*': self.title = '* ' + title + ' *' self.components.notebook.SetPageText(self.currentPageNumber, '* ' + pageText + ' *') self.panel.Refresh() elif not modified and title[0] == '*': self.title = title[2:-2] self.components.notebook.SetPageText(self.currentPageNumber, pageText[2:-2]) self.panel.Refresh() # these are event handlers bound above # since they aren't automatically bound by PythonCard # I used the wxPython naming conventions # these methods will eventually be converted # KEA 2002-05-08 # this is adapted from the wxPython demo def OnFind(self, event): map = { wx.wxEVT_COMMAND_FIND : "FIND", wx.wxEVT_COMMAND_FIND_NEXT : "FIND_NEXT", wx.wxEVT_COMMAND_FIND_REPLACE : "REPLACE", wx.wxEVT_COMMAND_FIND_REPLACE_ALL : "REPLACE_ALL", } et = event.GetEventType() try: evtType = map[et] except KeyError: evtType = "**Unknown Event Type**" self.lastFind['searchText'] = event.GetFindString() flags = event.GetFlags() self.lastFind['wholeWordsOnly'] = flags & wx.FR_WHOLEWORD != 0 self.lastFind['caseSensitive'] = flags & wx.FR_MATCHCASE != 0 if et == wx.wxEVT_COMMAND_FIND_REPLACE or et == wx.wxEVT_COMMAND_FIND_REPLACE_ALL: replaceTxt = "Replace text: " + event.GetReplaceString() self.lastFind['replaceText'] = event.GetReplaceString() else: replaceTxt = "" #print "%s -- Find text: %s %s Flags: %d \n" % (evtType, event.GetFindString(), replaceTxt, event.GetFlags()) if et == wx.wxEVT_COMMAND_FIND or et == wx.wxEVT_COMMAND_FIND_NEXT: self.findNext(self.lastFind['searchText'], self.lastFind['wholeWordsOnly'], self.lastFind['caseSensitive']) elif et == wx.wxEVT_COMMAND_FIND_REPLACE: # the way Notepad works # pressing Replace causes a Find Next # if there is no selection # if the text that is selected matches # the search criteria, then it is replaced # and a Find Next occurs doc = self.currentDocument txt = doc.GetSelectedText() sel = doc.GetSelection() if self.lastFind['searchText'].lower() == txt.lower(): # since we don't know criteria for word boundaries # let wxSTC do the searching doc.SetCurrentPos(doc.GetSelectionStart()) result = self.findNext(self.lastFind['searchText'], self.lastFind['wholeWordsOnly'], self.lastFind['caseSensitive']) if result != -1 and sel == doc.GetSelection(): replaceText = self.lastFind['replaceText'] doc.ReplaceSelection(replaceText) pos = doc.GetCurrentPos() doc.SetSelection(pos - len(replaceText), pos) result = self.findNext(self.lastFind['searchText'], self.lastFind['wholeWordsOnly'], self.lastFind['caseSensitive']) elif et == wx.wxEVT_COMMAND_FIND_REPLACE_ALL: self.replaceAll(self.lastFind['searchText'], self.lastFind['replaceText'], self.lastFind['wholeWordsOnly'], self.lastFind['caseSensitive']) # search/replace from current position def replaceAll(self, searchText, replaceText, wholeWordsOnly, caseSensitive): # unless there is a built-in method for Replace All # we need to brute force this search doc = self.currentDocument pos = doc.GetCurrentPos() sel = doc.GetSelection() doc.SetCurrentPos(0) # should we handle this replace all operation as a single # undoable operation? replaced = 0 while -1 != self.findNext(searchText, wholeWordsOnly, caseSensitive): doc.ReplaceSelection(replaceText) replaced += 1 self.statusBar.text = self.resource.strings.replaced % replaced self.currentPage.lastPos = self.currentDocument.GetCurrentPos() if not replaced: # restore previous position and selection doc.SetSelection(sel[0], sel[1]) doc.SetCurrentPos(pos) def replaceTabs(self): """Replace tabs with four spaces.""" self.replaceAll('\t', ' ', 0, 0) def OnFindClose(self, event): event.GetDialog().Destroy() def OnFileHistory(self, event): fileNum = event.GetId() - wx.ID_FILE1 path = self.fileHistory.GetHistoryFile(fileNum) self.openFile(path) # back to PythonCard methods def loadConfig(self): try: if not os.path.exists(self.configPath): os.mkdir(self.configPath) path = os.path.join(self.configPath, USERCONFIG) self.config = util.readAndEvalFile(path) if self.config != {}: if 'position' in self.config: self.position = self.config['position'] if 'size' in self.config: self.size = self.config['size'] if 'history' in self.config: history = self.config['history'] history.reverse() for h in history: self.fileHistory.AddFileToHistory(h) if 'view_white_space' in self.config: self.currentDocument.SetViewWhiteSpace(self.config['view_white_space']) self.menuBar.setChecked('menuViewWhitespace', self.config['view_white_space']) if 'indentation_guides' in self.config: self.currentDocument.SetIndentationGuides(self.config['indentation_guides']) self.menuBar.setChecked('menuViewIndentationGuides', self.config['indentation_guides']) if 'right_edge_guide' in self.config: self.currentDocument.SetEdgeMode(self.config['right_edge_guide']) self.menuBar.setChecked('menuViewRightEdgeIndicator', self.config['right_edge_guide']) if 'view_EOL' in self.config: self.currentDocument.SetViewEOL(self.config['view_EOL']) self.menuBar.setChecked('menuViewEndOfLineMarkers', self.config['view_EOL']) if 'line_numbers' in self.config: self.currentDocument.lineNumbersVisible = self.config['line_numbers'] self.menuBar.setChecked('menuViewLineNumbers', self.config['line_numbers']) if 'folding' in self.config: self.currentDocument.codeFoldingVisible = self.config['folding'] self.menuBar.setChecked('menuViewCodeFolding', self.config['folding']) if 'macros' in self.config: self.macros = self.config['macros'] # should match based on name instead m = self.menuBar.menus[4] rsrc = resource.Resource({'type':'MenuItem', 'name': 'scriptletSep2', 'label':'-'}) mi = menu.MenuItem(self, m, rsrc) m.appendMenuItem(mi) for macro in self.macros: #print 'm', macro if macro['key'] == '': key = '' else: key = '\t' + macro['key'] rsrc = resource.Resource({'type':'MenuItem', 'name': 'menuScriptlet' + macro['label'], 'label': macro['label'] + key, 'command':'runMacro'}) mi = menu.MenuItem(self, m, rsrc) m.appendMenuItem(mi) except: self.config = {} def saveConfig(self): self.config['position'] = self.GetRestoredPosition() self.config['size'] = self.GetRestoredSize() self.config['view_white_space'] = self.currentDocument.GetViewWhiteSpace() self.config['indentation_guides'] = self.currentDocument.GetIndentationGuides() self.config['right_edge_guide'] = self.currentDocument.GetEdgeMode() self.config['view_EOL'] = self.currentDocument.GetViewEOL() self.config['line_numbers'] = self.currentDocument.lineNumbersVisible self.config['folding'] = self.currentDocument.codeFoldingVisible history = [] for i in range(self.fileHistory.GetCount()): history.append(self.fileHistory.GetHistoryFile(i)) self.config['history'] = history try: path = os.path.join(self.configPath, USERCONFIG) f = open(path, "w") pprint.pprint(self.config, f) f.close() except: pass # argh def saveChanges(self, path): # save configuration info in the app directory #filename = os.path.basename(self.documentPath) if path is None: filename = self.resource.strings.untitled else: filename = path msg = self.resource.strings.documentChangedPrompt % filename result = dialog.messageDialog(self, msg, self.resource.strings.codeEditor, wx.ICON_EXCLAMATION | wx.YES_NO | wx.CANCEL) return result.returnedString def doExit(self): for page in self.pages: doc = page.components.document if doc.GetModify(): save = self.saveChanges(page.documentPath) if save == "Cancel": return False elif save == "No": continue else: if page.documentPath is None: if not page.saveAsFile(): return False else: page.saveFile(page.documentPath) continue else: continue return True def on_close(self, event): if self.doExit(): try: # KEA 2004-04-08 # if an exception occurs during on_initialize # then saveConfig could fail because some windows # might not exist, so in that situation just exit gracefully self.saveConfig() except: pass self.fileHistory = None self.printer = None event.skip() def on_menuFileSave_select(self, event): if self.currentPage: if self.currentPage.documentPath is None: # this a "new" document and needs to go through Save As... self.currentPage.saveAsFile() else: self.currentPage.saveFile(self.currentPage.documentPath) def on_menuFileSaveAs_select(self, event): if self.currentPage: return self.currentPage.saveAsFile() def on_menuFileCloseTab_select(self, event): # what do we do if there is only one tab? if self.currentPage: page = self.currentPage doc = page.components.document # logic borrowed from doExit if doc.GetModify(): save = self.saveChanges(page.documentPath) if save == "Cancel": #rint "Cancelled Save" return elif save == "No": #rint "Didn't Save" pass else: if page.documentPath is None: if not page.saveAsFile(): print "no path, Didn't Save" # this logic was borrowed from doExit # user chose Yes to save on previous dialog but then # cancelled the Save dialog # so don't close the tab else: page.saveFile(page.documentPath) #rint "Saved" self.closeTab() def closeTab(self): self.pageChangedFired = False del self.pages[self.currentPageNumber] self.components.notebook.DeletePage(self.currentPageNumber) # KEA 2004-10-10 # workaround pageChanged event not firing on Mac OS X # when it gets fixed, this code should be harmless if not self.pageChangedFired: selection = self.components.notebook.GetSelection() #print selection, len(self.pages) if selection != -1 and selection <= (len(self.pages) - 1): self.currentPageNumber = selection self.currentPage = self.pages[selection] self.currentDocument = self.currentPage.components.document self.currentPage.becomeFocus() self.updateStatusBar() self.updateTitleBar() self.setResourceFile() if len(self.pages) == 0: if NEVER_BLANK: self.newFile() else: self.currentPageNumber = -1 self.currentPage = None self.currentDocument = None def newFile(self): win = model.childWindow(self.components.notebook, codePage.CodePage) self.components.notebook.AddPage(win, "new ...", True) self.pages.append(win) wx.CallAfter(win.newFile) self.currentPageNumber = len(self.pages) - 1 wx.CallAfter(self.setResourceFile) size = self.pages[-1].size wx.CallAfter(self.pages[-1].SetSize, size) def openFile(self, path): # need a new tab page in notebook if # no current page - i.e. blank notebook # current page is a open on a file # untitled document has been modified if (not self.currentPage or self.currentPage.documentPath or self.currentDocument.GetModify()): win = model.childWindow(self.components.notebook, codePage.CodePage) self.components.notebook.AddPage(win, "opening ...", True) self.pages.append(win) self.currentPageNumber = len(self.pages)-1 size = self.pages[-1].size wx.CallAfter(self.pages[-1].SetSize, size) else: win = self.currentPage wx.CallAfter(win.openFile, path) wx.CallAfter(self.setResourceFile) # KEA 2003-01-06 # resource file support def setResourceFile(self): self.components.popComponentNames.items = [] self.components.popComponentEvents.items = [] if self.currentPageNumber >= 0: self.currentPage = self.pages[self.currentPageNumber] self.currentDocument = self.currentPage.components.document # KEA self.currentPage is always True, so why the if? #if self.currentPage: try: self.resourceFilename = getResourceFilename(self.currentPage.documentPath) self.rsrc = resource.ResourceFile(self.resourceFilename).getResource() self.rsrcComponents = {} if hasattr(self.rsrc, 'application'): components = self.rsrc.application.backgrounds[0].components else: # CustomDialog components = self.rsrc.components for c in components: self.rsrcComponents[c.name] = c.type items = self.rsrcComponents.keys() items.sort() self.components.popComponentNames.items = items self.components.popComponentNames.visible = True self.components.popComponentEvents.visible = False return except: pass # no page, or no components on page self.components.popComponentNames.visible = False self.components.popComponentEvents.visible = False def fillEventNames(self, componentName): self.components.popComponentEvents.visible = True r = registry.Registry.getInstance() componentType = self.rsrcComponents[componentName] spec = r.components[componentType]._spec tmp = spec.getEventNames() + ['command'] tmp.sort() text = self.currentDocument.text eventNames = [] for e in tmp: if handlerExists(text, componentName, e) != -1: eventNames.append('+ ' + e) else: eventNames.append(' ' + e) # should we try and save and restore the current selection? # AGT 2004-10-09 Changing between two components of same type # should reset the even selection ## if self.components.popComponentEvents.items != eventNames: ## self.components.popComponentEvents.items = eventNames self.components.popComponentEvents.items = eventNames def on_popComponentNames_select(self, event): if self.currentPage: self.fillEventNames(event.target.stringSelection) def on_popComponentEvents_select(self, event): document = self.currentDocument componentName = self.components.popComponentNames.stringSelection # this is tied to the ' ' and '+ ' used in fillEventNames # we just want the event name eventName = event.target.stringSelection.split(' ')[-1] eventText = 'def on_' + componentName + '_' + eventName + '(' offset = handlerExists(document.text, componentName, eventName) #print eventText, offset if offset != -1: document.SetSelection(offset, offset) else: # event handler doesn't exist? # so create one at the current selection? sel = document.GetSelection() start = document.LineFromPosition(sel[0]) # this could take into account the current indent eventText = eventText + 'self, event):\n pass\n' firstChar = document.PositionFromLine(start) document.BeginUndoAction() document.InsertText(firstChar, eventText) document.SetCurrentPos(document.PositionFromLine(start)) document.EndUndoAction() document.setFocus() ## # File menu ## ## # KEA 2002-05-04 ## # need to decide on UI for multiple windows ## # New Window, Open in New Window, New, Open, etc. ## # since we aren't doing MDI ## # we could have child windows, but what would the organization be?! def on_menuFileNew_select(self, event): # no need to save current file - just open new tab self.newFile() def on_menuFileOpen_select(self, event): # no need to save current file - just open new tab # split this method into several pieces to make it more flexible #wildcard = "Python scripts (*.py;*.pyw)|*.py;*.pyw|Text files (*.txt)|*.txt|All files (*.*)|*.*" wildcard = self.resource.strings.saveAsWildcard result = dialog.openFileDialog(None, self.resource.strings.openFile, '', '', wildcard) if result.accepted: path = result.paths[0] # an error will probably occur here if the text is too large # to fit in the wxTextCtrl (TextArea) or the file is actually # binary. Not sure what happens with CR/LF versus CR versus LF # line endings either self.openFile(path) def on_menuFilePrint_select(self, event): source = textToHtml(self.currentDocument.text) self.printer.PrintText(source) def on_menuFilePrintPreview_select(self, event): source = textToHtml(self.currentDocument.text) self.printer.PreviewText(source) def on_menuFilePageSetup_select(self, event): self.printer.PageSetup() # Edit menu def on_menuEditUndo_select(self, event): if self.currentPage: self.currentPage.on_menuEditUndo_select(event) def on_menuEditRedo_select(self, event): if self.currentPage: self.currentPage.on_menuEditRedo_select(event) def on_menuEditCut_select(self, event): if self.currentPage: self.currentPage.on_menuEditCut_select(event) def on_menuEditCopy_select(self, event): if self.currentPage: self.currentPage.on_menuEditCopy_select(event) def on_menuEditPaste_select(self, event): if self.currentPage: self.currentPage.on_menuEditPaste_select(event) def on_menuEditClear_select(self, event): if self.currentPage: self.currentPage.on_menuEditClear_select(event) def on_menuEditSelectAll_select(self, event): if self.currentPage: self.currentPage.on_menuEditSelectAll_select(event) def findNext(self, searchText, wholeWordsOnly, caseSensitive): if searchText == '': return -1 if not self.currentPage: return -1 doc = self.currentDocument current = doc.GetCurrentPos() last = doc.GetLength() if wx.VERSION >= (2, 3, 3): flags = 0 if caseSensitive: flags = flags + stc.STC_FIND_MATCHCASE if wholeWordsOnly: flags = flags + stc.STC_FIND_WHOLEWORD result = doc.FindText(current, last, searchText, flags) else: result = doc.FindText(current, last, searchText, caseSensitive, wholeWordsOnly) if result != -1: # update the selection, which also changes the cursor position n = len(searchText) doc.SetSelection(result, result + n) else: # should we beep or flash the screen or present an error dialog? pass return result def on_doEditFindReplace_command(self, event): if not self.currentPage: return data = wx.FindReplaceData() flags = data.GetFlags() data.SetFindString(self.lastFind['searchText']) data.SetReplaceString(self.lastFind['replaceText']) if self.lastFind['wholeWordsOnly']: flags = flags | wx.FR_WHOLEWORD if self.lastFind['caseSensitive']: flags = flags | wx.FR_MATCHCASE data.SetFlags(flags) dlg = wx.FindReplaceDialog(self, data, "Find & Replace", wx.FR_REPLACEDIALOG) dlg.data = data # save a reference to it... # KEA 2004-04-18 # can't use visible attribute # probably need to create a wrapper for FindReplaceDialog # to make it more like PythonCard #dlg.visible = True dlg.Show() def on_doEditReplaceTabs_command(self, event): self.replaceTabs() def on_doEditFind_command(self, event): # keep track of the last find and preload # the search text and radio buttons lastFind = self.lastFind result = dialog.findDialog(self, lastFind['searchText'], lastFind['wholeWordsOnly'], lastFind['caseSensitive']) if result.accepted: lastFind['searchText'] = result.searchText lastFind['wholeWordsOnly'] = result.wholeWordsOnly lastFind['caseSensitive'] = result.caseSensitive self.findNext(lastFind['searchText'], lastFind['wholeWordsOnly'], lastFind['caseSensitive']) def on_doEditFindNext_command(self, event): self.findNext(self.lastFind['searchText'], self.lastFind['wholeWordsOnly'], self.lastFind['caseSensitive']) def gotoLine(self, lineNumber): try: # GotoLine is zero based, but we ask the user # for a line number starting at 1 self.currentDocument.GotoLine(lineNumber - 1) except: pass def on_doEditGoTo_command(self, event): result = dialog.textEntryDialog(self, self.resource.strings.gotoLineNumber, self.resource.strings.gotoLine, '') # this version doesn't alert the user if the line number is out-of-range # it just fails quietly if result.accepted: try: self.gotoLine(int(result.text)) except: pass def on_indentRegion_command(self, event): if self.currentDocument: self.currentDocument.CmdKeyExecute(stc.STC_CMD_TAB) def on_dedentRegion_command(self, event): if self.currentDocument: self.currentDocument.CmdKeyExecute(stc.STC_CMD_BACKTAB) def on_commentRegion_command(self, event): if self.currentDocument: # need to do the equivelant of the IDLE # comment_region_event in AutoIndent.py doc = self.currentDocument sel = doc.GetSelection() start = doc.LineFromPosition(sel[0]) end = doc.LineFromPosition(sel[1]) if end > start and doc.GetColumn(sel[1]) == 0: end = end - 1 doc.BeginUndoAction() for lineNumber in range(start, end + 1): firstChar = doc.PositionFromLine(lineNumber) doc.InsertText(firstChar, '##') doc.SetCurrentPos(doc.PositionFromLine(start)) doc.SetAnchor(doc.GetLineEndPosition(end)) doc.EndUndoAction() def on_uncommentRegion_command(self, event): if self.currentDocument: # need to do the equivelant of the IDLE # uncomment_region_event in AutoIndent.py doc = self.currentDocument sel = doc.GetSelection() start = doc.LineFromPosition(sel[0]) end = doc.LineFromPosition(sel[1]) if end > start and doc.GetColumn(sel[1]) == 0: end = end - 1 doc.BeginUndoAction() for lineNumber in range(start, end + 1): firstChar = doc.PositionFromLine(lineNumber) if chr(doc.GetCharAt(firstChar)) == '#': if chr(doc.GetCharAt(firstChar + 1)) == '#': # line starts with ## doc.SetCurrentPos(firstChar + 2) else: # line starts with # doc.SetCurrentPos(firstChar + 1) doc.DelLineLeft() doc.SetCurrentPos(doc.PositionFromLine(start)) doc.SetAnchor(doc.GetLineEndPosition(end)) doc.EndUndoAction() # View menu # These are treated as "global" commands - apply to all existing pages def on_menuViewWhitespace_select(self, event): tBool = event.IsChecked() for page in self.pages: page.components.document.SetViewWhiteSpace(tBool) def on_menuViewIndentationGuides_select(self, event): tBool = event.IsChecked() for page in self.pages: page.components.document.SetIndentationGuides(tBool) def on_menuViewRightEdgeIndicator_select(self, event): if event.IsChecked(): for page in self.pages: page.components.document.SetEdgeMode(stc.STC_EDGE_LINE) #self.components.document.SetEdgeMode(stc.STC_EDGE_BACKGROUND) else: for page in self.pages: page.document.SetEdgeMode(stc.STC_EDGE_NONE) def on_menuViewEndOfLineMarkers_select(self, event): tBool = event.IsChecked() for page in self.pages: page.components.document.SetViewEOL(tBool) def on_menuViewFixedFont_select(self, event): pass def on_menuViewLineNumbers_select(self, event): tBool = event.IsChecked() for page in self.pages: page.components.document.lineNumbersVisible = tBool def on_menuViewCodeFolding_select(self, event): tBool = event.IsChecked() for page in self.pages: page.components.document.codeFoldingVisible = tBool # Format menu def on_doSetStyles_command(self, event): config = configuration.getStyleConfigPath() if config is None: return cwd = os.curdir os.chdir(os.path.dirname(config)) dlg = STCStyleEditor.STCStyleEditDlg(self, 'Python', 'python', #'HTML', 'html', #'XML', 'xml', #'C++', 'cpp', #'Text', 'text', #'Properties', 'prop', config) try: dlg.ShowModal() finally: dlg.Destroy() os.chdir(cwd) self.setDefaultStyles() def on_menuFormatWrap_select(self, event): tBool = event.IsChecked() for page in self.pages: page.components.document.SetWrapMode(tBool) def wordCount(self, text): chars = len(text) words = len(text.split()) # this doesn't always match the getNumberOfLines() method # so this should probably be changed lines = len(util.normalizeEOL(text).split('\n')) return chars, words, lines # Help menu def on_doHelpAbout_command(self, event): # once we have generic dialogs going, put a more interesting # About box here if self.currentPage.documentPath is None: filename = self.resource.strings.untitled else: filename = os.path.basename(self.currentPage.documentPath) countString = "%d " + self.resource.strings.chars + \ ", %d " + self.resource.strings.words + \ ", %d " + self.resource.strings.lines dialog.messageDialog(self, self.resource.strings.sample + "\n\n" + \ self.resource.strings.document + ": %s\n" % filename + \ countString \ % self.wordCount(self.currentDocument.text), self.resource.strings.about, wx.ICON_INFORMATION | wx.OK) def on_doHelpAboutPythonCard_command(self, event): about.aboutPythonCardDialog(self) def on_menuScriptletShell_select(self, event): self.loadShell() if self.application.shell is not None: self.application.shellFrame.visible = not self.application.shellFrame.visible def on_menuScriptletNamespace_select(self, event): self.loadNamespace() if self.application.namespace is not None: self.application.namespaceFrame.visible = not self.application.namespaceFrame.visible def on_menuScriptletSaveUserConfiguration_select(self, event): configuration.saveUserConfiguration(self.application) def on_menuShellChangeDirectory_select(self, event): try: if self.currentPage.documentPath: path = os.path.dirname(self.currentPage.documentPath) else: path = '' result = dialog.directoryDialog(self, 'Choose a directory', path) if result.accepted: path = result.path os.chdir(path) self.application.shell.run('os.getcwd()') except: pass def on_menuScriptletSaveShellSelection_select(self, event): if self.application.shell is not None: txt = self.application.shell.GetSelectedText() lines = [] for line in txt.splitlines(): lines.append(self.application.shell.lstripPrompt(line)) # this is the quick way to convert a list back into a string # appending to strings can be slow because it creates a new string # each time, so a list is used instead while building up the script script = '\n'.join(lines) try: #wildcard = "Python files (*.py)|*.py|All Files (*.*)|*.*" wildcard = self.resource.strings.scriptletWildcard scriptletsDir = os.path.join(self.application.applicationDirectory, 'scriptlets') result = dialog.saveFileDialog(None, self.resource.strings.saveAs, scriptletsDir, 'scriptlet.py', wildcard) if result.accepted: path = result.paths[0] f = open(path, 'w') f.write(script) f.close() except: pass def execScriptlet(self, filename): #try: command = 'execfile(%r)' % filename self.application.shell.run(command=command, prompt=0, verbose=0) #except: # pass def on_menuScriptletRunScriptlet_select(self, event): self.loadShell() #curDir = os.getcwd() if self.application.shell is not None: #wildcard = "Python files (*.py)|*.py|All Files (*.*)|*.*" wildcard = self.resource.strings.scriptletWildcard # wildcard = '*.py' scriptletsDir = os.path.join(self.application.applicationDirectory, 'scriptlets') result = dialog.openFileDialog(self, self.resource.strings.openFile, scriptletsDir, '', wildcard) if result.accepted: filename = result.paths[0] self.execScriptlet(filename) #os.chdir(curDir) """ >>> mb = bg.menuBar >>> m = mb.menus[4] >>> from PythonCard import menu, resource >>> rsrc = resource.Resource({'type':'MenuItem', 'name': 'scriptletSep2', 'label':'-'}) >>> mi = menu.MenuItem(bg, m, rsrc) >>> m.appendMenuItem(mi) >>> rsrc = resource.Resource({'type':'MenuItem', 'name': 'menuScriptletinsertDateAndTime', 'label':'insertDateAndTime\tCtrl+1', 'command':'runMacro'}) >>> mi = menu.MenuItem(bg, m, rsrc) >>> m.appendMenuItem(mi) """ """ Need to have a "Macros" dialog that let's the user select a script to run, a label for the script which will default to the script name, and a hot key. The dialog will prepend menuScriptlet on the front, add the item to the menu and store it in the config so it is remembered between loads. """ def on_runMacro_command(self, event): name = event.target.name[len('menuScriptlet'):] #scriptletsDir = os.path.join(self.application.applicationDirectory, 'scriptlets') #filename = os.path.join(scriptletsDir, name + '.py') for macro in self.macros: if macro['label'] == name: filename = macro['filename'] self.execScriptlet(filename) break def on_checkSyntax_command(self, event): if self.currentPage.documentPath is None: save = self.saveChanges(self.currentPage.documentPath) if save == "Cancel" or save == "No": # don't do anything, just go back to editing # we have to have a file on disk to check # if we used StringIO we could simulate a file # but I don't know if it is worth it pass else: if self.on_menuFileSaveAs_select(None): scriptutils.CheckFile(self.statusBar, self.currentDocument, self.currentPage.documentPath) self.lastPos = self.currentDocument.GetCurrentPos() else: if self.currentDocument.GetModify(): # auto-save self.currentPage.saveFile(self.currentPage.documentPath) scriptutils.CheckFile(self.statusBar, self.currentDocument, self.currentPage.documentPath) self.lastPos = self.currentDocument.GetCurrentPos() def on_fileRunOptions_command(self, event): result = runOptionsDialog.runOptionsDialog(self, self.cmdLineArgs) if result.accepted: self.cmdLineArgs['debugmenu'] = result.debugmenu self.cmdLineArgs['logging'] = result.logging self.cmdLineArgs['messagewatcher'] = result.messagewatcher self.cmdLineArgs['namespaceviewer'] = result.namespaceviewer self.cmdLineArgs['propertyeditor'] = result.propertyeditor self.cmdLineArgs['shell'] = result.shell self.cmdLineArgs['otherargs'] = result.otherargs # script running code def runScript(self, useInterpreter): if self.currentPage.documentPath is None: save = self.saveChanges(self.currentPage.documentPath) if save == "Cancel" or save == "No": # don't do anything, just go back to editing return else: if not self.on_menuFileSaveAs_select(None): # they didn't actually save, just go back # to editing return elif self.currentDocument.GetModify(): # auto-save self.currentPage.saveFile(self.currentPage.documentPath) # this algorithm, taken from samples.py assumes the rsrc.py file and the main # program file have the same basename # if that isn't the case then this doesn't work and we need a different solution path, filename = os.path.split(self.currentPage.documentPath) if wx.Platform == '__WXMAC__': filename = self.currentPage.documentPath else: if ' ' in self.currentPage.documentPath: filename = '"' + self.currentPage.documentPath + '"' else: filename = self.currentPage.documentPath # the args should come from a dialog or menu items that are checked/unchecked args = util.getCommandLineArgs(self.cmdLineArgs) # change to the script directory before attempting to run curdir = os.path.dirname(os.path.abspath(os.curdir)) os.chdir(os.path.dirname(self.currentPage.documentPath)) if wx.Platform == '__WXMAC__': # this is a bad hack to deal with the user starting # codeEditor.py from the Finder if sys.executable == '/': python = '/Applications/Python.app/Contents/MacOS/python' else: python = sys.executable elif wx.Platform == '__WXMSW__': # always launch with a console python = os.path.join(os.path.dirname(sys.executable), 'python.exe') else: python = sys.executable if ' ' in python: pythonQuoted = '"' + python + '"' else: pythonQuoted = python if useInterpreter: os.spawnv(os.P_NOWAIT, python, [pythonQuoted, '-i', filename] + args) else: os.spawnv(os.P_NOWAIT, python, [pythonQuoted, filename] + args) os.chdir(curdir) def on_fileRun_command(self, event): # KEA 2001-12-14 # we should prompt to save the file if needed # or in the case of a new file, do a save as before attempting # to do a run self.runScript(0) def on_fileRunWithInterpreter_command(self, event): # KEA 2001-12-14 # we should prompt to save the file if needed # or in the case of a new file, do a save as before attempting # to do a run self.runScript(1) def on_findFiles_command(self, event): fn = self.application.applicationDirectory fn = os.path.join(fn, os.pardir, "findfiles", "findfiles.py") fn = os.path.normpath(fn) if not os.path.isfile(fn): return if wx.Platform == '__WXMAC__': filename = fn else: filename = '"' + fn + '"' if wx.Platform == '__WXMAC__': # this is a bad hack to deal with the user starting # codeEditor.py from the Finder if sys.executable == '/': python = '/Applications/Python.app/Contents/MacOS/python' else: python = sys.executable elif wx.Platform == '__WXMSW__': python = os.path.join(os.path.dirname(sys.executable), 'pythonw.exe') else: python = sys.executable if ' ' in python: pythonQuoted = '"' + python + '"' else: pythonQuoted = python os.spawnv(os.P_NOWAIT, python, [pythonQuoted, filename]) def on_showShellDocumentation_command(self, event): global shell_url webbrowser.open(shell_url) def on_showPythonCardDocumentation_command(self, event): global pythoncard_url webbrowser.open(pythoncard_url) def on_showPythonDocumentation_command(self, event): global help_url if sys.platform.startswith("win"): # KEA 2003-10-15 AGT 2005-12-20 # BIG hack for Python 2.3 Windows help file or Python 2.4 # need to decide on a clean way of handling various doc options fn = os.path.dirname(os.__file__) chmfile = "Python" + sys.version[0] + sys.version[2] + ".chm" fn = os.path.join(fn, os.pardir, "Doc", chmfile) fn = os.path.normpath(fn) if os.path.isfile(fn): os.startfile(fn) else: webbrowser.open(help_url) def on_notebook_pageChanging(self, event): #rint "pageChanging - oldSelection: %d, selection: %d" % (event.oldSelection, event.selection) event.skip() def on_notebook_pageChanged(self, event): self.pageChangedFired = True #rint "pageChanged - oldSelection: %d, selection: %d" % (event.oldSelection, event.selection) if event.selection <= len(self.pages)-1: self.currentPageNumber = event.selection self.currentPage = self.pages[event.selection] self.currentDocument = self.currentPage.components.document self.currentPage.becomeFocus() self.updateStatusBar() self.updateTitleBar() self.setResourceFile() wx.CallAfter(self.currentPage.SetFocus) event.skip() # KEA 2004-08-18 # I'll probably move this functionality into model.Application # and just call a macOpenFile method in the current background class MyApplication(model.Application): # support drag and drop on the application icon on the Mac def MacOpenFile(self, filename): # code to load filename goes here self.backgrounds[0].openFile(filename) if __name__ == '__main__': app = MyApplication(TabCodeEditor) app.MainLoop() PythonCard-0.8.2/tools/oneEditor/tabcodeEditor.rsrc.py0000644000076500007650000003153010130366764022704 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'codeEditor', 'backgrounds': [ {'type':'Background', 'name':'bgCodeEditor', 'title':'tabbed Code Editor PythonCard Application', 'position':(22, 22), 'size':(400, 300), 'statusBar':1, 'visible':0, 'style':['resizeable'], 'menubar': {'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ {'type':'MenuItem', 'name':'menuFileNew', 'label':'&New\tCtrl+N', }, {'type':'MenuItem', 'name':'menuFileOpen', 'label':'&Open\tCtrl+O', }, {'type':'MenuItem', 'name':'menuFileSave', 'label':'&Save\tCtrl+S', }, {'type':'MenuItem', 'name':'menuFileSaveAs', 'label':'Save &As...', }, {'type':'MenuItem', 'name':'menuFileCloseTab', 'label':'Close &Tab\tCtrl+W', }, {'type':'MenuItem', 'name':'fileSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuFileCheckSyntax', 'label':'&Check Syntax (Module)\tAlt+F5', 'command':'checkSyntax', }, {'type':'MenuItem', 'name':'menuFileRun', 'label':'&Run\tCtrl+R', 'command':'fileRun', }, {'type':'MenuItem', 'name':'menuFileRunWithInterpreter', 'label':'Run with &interpreter\tCtrl+Shift+R', 'command':'fileRunWithInterpreter', }, {'type':'MenuItem', 'name':'menuFileRunOptions', 'label':'Run Options...', 'command':'fileRunOptions', }, {'type':'MenuItem', 'name':'fileSep2', 'label':'-', }, {'type':'MenuItem', 'name':'menuFilePageSetup', 'label':'Page Set&up...', }, {'type':'MenuItem', 'name':'menuFilePrint', 'label':'&Print...\tCtrl+P', }, {'type':'MenuItem', 'name':'menuFilePrintPreview', 'label':'Print Pre&view', }, {'type':'MenuItem', 'name':'fileSep2', 'label':'-', }, {'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit', }, ] }, {'type':'Menu', 'name':'Edit', 'label':'&Edit', 'items': [ {'type':'MenuItem', 'name':'menuEditUndo', 'label':'&Undo\tCtrl+Z', }, {'type':'MenuItem', 'name':'menuEditRedo', 'label':'&Redo\tCtrl+Y', }, {'type':'MenuItem', 'name':'editSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditCut', 'label':'Cu&t\tCtrl+X', }, {'type':'MenuItem', 'name':'menuEditCopy', 'label':'&Copy\tCtrl+C', }, {'type':'MenuItem', 'name':'menuEditPaste', 'label':'&Paste\tCtrl+V', }, {'type':'MenuItem', 'name':'editSep2', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditFind', 'label':'&Find...\tCtrl+F', 'command':'doEditFind', }, {'type':'MenuItem', 'name':'menuEditFindNext', 'label':'&Find Next\tF3', 'command':'doEditFindNext', }, {'type':'MenuItem', 'name':'menuEditFindFiles', 'label':'Find in Files...\tAlt+F3', 'command':'findFiles', }, {'type':'MenuItem', 'name':'menuEditReplace', 'label':'&Replace...\tCtrl+H', 'command':'doEditFindReplace', }, {'type':'MenuItem', 'name':'menuEditGoTo', 'label':'&Go To...\tCtrl+G', 'command':'doEditGoTo', }, {'type':'MenuItem', 'name':'editSep3', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditReplaceTabs', 'label':'&Replace tabs with spaces', 'command':'doEditReplaceTabs', }, {'type':'MenuItem', 'name':'editSep3', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditClear', 'label':'Cle&ar\tDel', }, {'type':'MenuItem', 'name':'menuEditSelectAll', 'label':'Select A&ll\tCtrl+A', }, {'type':'MenuItem', 'name':'editSep4', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditIndentRegion', 'label':'&Indent Region', 'command':'indentRegion', }, {'type':'MenuItem', 'name':'menuEditDedentRegion', 'label':'&Dedent Region', 'command':'dedentRegion', }, {'type':'MenuItem', 'name':'menuEditCommentRegion', 'label':'Comment &out region\tAlt+3', 'command':'commentRegion', }, {'type':'MenuItem', 'name':'menuEditUncommentRegion', 'label':'U&ncomment region\tShift+Alt+3', 'command':'uncommentRegion', }, ] }, {'type':'Menu', 'name':'menuView', 'label':'&View', 'items': [ {'type':'MenuItem', 'name':'menuViewWhitespace', 'label':'&Whitespace', 'checkable':1, }, {'type':'MenuItem', 'name':'menuViewIndentationGuides', 'label':'Indentation &guides', 'checkable':1, }, {'type':'MenuItem', 'name':'menuViewRightEdgeIndicator', 'label':'&Right edge indicator', 'checkable':1, }, {'type':'MenuItem', 'name':'menuViewEndOfLineMarkers', 'label':'&End-of-line markers', 'checkable':1, }, {'type':'MenuItem', 'name':'menuViewFixedFont', 'label':'&Fixed Font', 'enabled':0, 'checkable':1, }, {'type':'MenuItem', 'name':'viewSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuViewLineNumbers', 'label':'&Line Numbers', 'checkable':1, 'checked':1, }, {'type':'MenuItem', 'name':'menuViewCodeFolding', 'label':'&Code Folding', 'checkable':1, }, ] }, {'type':'Menu', 'name':'menuFormat', 'label':'F&ormat', 'items': [ {'type':'MenuItem', 'name':'menuFormatStyles', 'label':'&Styles...', 'command':'doSetStyles', }, {'type':'MenuItem', 'name':'menuFormatWrap', 'label':'&Wrap Lines', 'checkable':1, }, ] }, {'type':'Menu', 'name':'menuScriptlet', 'label':'&Shell', 'items': [ {'type':'MenuItem', 'name':'menuScriptletShell', 'label':'&Shell Window\tF5', }, {'type':'MenuItem', 'name':'menuScriptletNamespace', 'label':'&Namespace Window\tF6', }, {'type':'MenuItem', 'name':'menuScriptletSaveUserConfiguration', 'label':'Save &Configuration', }, {'type':'MenuItem', 'name':'menuShellChangeDirectory', 'label':'Change &Directory...', }, {'type':'MenuItem', 'name':'scriptletSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuScriptletSaveShellSelection', 'label':'Save Shell Selection...', }, {'type':'MenuItem', 'name':'menuScriptletRunScriptlet', 'label':'Run Scriptlet...', }, ] }, {'type':'Menu', 'name':'menuHelp', 'label':'&Help', 'items': [ {'type':'MenuItem', 'name':'menuShellDocumentation', 'label':'&Shell Documentation...', 'command':'showShellDocumentation', }, {'type':'MenuItem', 'name':'menuPythonCardDocumentation', 'label':'&PythonCard Documentation...\tF1', 'command':'showPythonCardDocumentation', }, {'type':'MenuItem', 'name':'menuPythonDocumentation', 'label':'Python &Documentation...', 'command':'showPythonDocumentation', }, {'type':'MenuItem', 'name':'helpSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuHelpAbout', 'label':'&About codeEditor...', 'command':'doHelpAbout', }, {'type':'MenuItem', 'name':'menuHelpAboutPythonCard', 'label':'About PythonCard...', 'command':'doHelpAboutPythonCard', }, ] }, ] }, 'strings': { 'saveAs':'Save As', 'openFile':'Open file', 'chars':'chars', 'gotoLine':'Goto line', 'gotoLineNumber':'Goto line number:', 'sample':'codeEditor sample', 'codeEditor':'codeEditor', 'words':'words', 'documentChangedPrompt':'The text in the %s file has changed.\n\nDo you want to save the changes?', 'saveAsWildcard':'All files (*.*)|*.*|Python scripts (*.py;*.pyw)|*.pyw;*.PY;*.PYW;*.py|Text files (*.txt;*.text)|*.text;*.TXT;*.TEXT;*.txt|HTML and XML files (*.htm;*.html;*.xml)|*.htm;*.xml;*.HTM;*.HTML;*.XML;*.html', 'about':'About codeEditor...', 'document':'Document', 'lines':'lines', 'untitled':'Untitled', 'replaced':'Replaced %d occurances', 'scriptletWildcard':'Python files (*.py)|*.py|All Files (*.*)|*.*', }, 'components': [ {'type':'Notebook', 'name':'notebook', 'position':(10, 30), 'size':(274, 105), }, {'type':'Choice', 'name':'popComponentNames', 'position':(6, 6), 'items':[], }, {'type':'Choice', 'name':'popComponentEvents', 'position':(152, 6), 'items':[], }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/tools/oneEditor/templates/0000755000076500007650000000000010434046773020610 5ustar alexalex00000000000000PythonCard-0.8.2/tools/oneEditor/templates/dialogTemplate.py0000644000076500007650000000130710130111012024062 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.1 $" __date__ = "$Date: 2004/10/03 23:58:02 $" """ from PythonCard import model class MyDialog(model.CustomDialog): def __init__(self, parent, txt=''): model.CustomDialog.__init__(self, parent) # if some special setup is necessary, do it here # example from samples/dialogs/minimalDialog.py # self.components.field1.text = txt #def myDialog(parent, txt): def myDialog(parent): dlg = MyDialog(parent, txt) result = dlg.showModal() # stick your results into the result dictionary here # example from samples/dialogs/minimalDialog.py # result.text = dlg.components.field1.text dlg.destroy() return result PythonCard-0.8.2/tools/oneEditor/templates/dialogTemplate.rsrc.py0000644000076500007650000000065610130111012025040 0ustar alexalex00000000000000{'type':'CustomDialog', 'name':'Template', 'title':'Dialog Template', 'size':(300, 100), 'style':['resizeable'], 'components': [ {'type':'Button', 'name':'btnOK', 'position':(10, 35), 'label':'OK', 'id':5100, 'default':1, }, {'type':'Button', 'name':'btnCancel', 'position':(100, 35), 'label':'Cancel', 'id':5101, }, ] # end components } # end CustomDialog PythonCard-0.8.2/tools/oneEditor/templates/template.py0000644000076500007650000000061410130111012022742 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.1 $" __date__ = "$Date: 2004/10/03 23:58:02 $" """ from PythonCard import model class MyBackground(model.Background): def on_initialize(self, event): # if you have any initialization # including sizer setup, do it here pass if __name__ == '__main__': app = model.Application(MyBackground) app.MainLoop() PythonCard-0.8.2/tools/oneEditor/templates/template.rsrc.py0000644000076500007650000000126310130111012023713 0ustar alexalex00000000000000 { 'application':{ 'type':'Application', 'name':'Template', 'backgrounds': [ { 'type':'Background', 'name':'bgTemplate', 'title':'Standard Template with File->Exit menu', 'size':( 400, 300 ), 'style':['resizeable'], 'statusBar':0, 'menubar': { 'type':'MenuBar', 'menus': [ { 'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ { 'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit', 'command':'exit', } ] } ] }, 'components': [ ] } ] } } PythonCard-0.8.2/tools/oneEditor/templates/templateFullMenus.py0000644000076500007650000002116410130111012024600 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.1 $" __date__ = "$Date: 2004/10/03 23:58:02 $" """ import os, sys import wx from wx.html import HtmlEasyPrinting from PythonCard import configuration, dialog, model def textToHtml(txt): # the wxHTML classes don't require valid HTML # so this is enough html = txt.replace('\n\n', '

') html = html.replace('\n', '
') return html class MyBackground(model.Background): def on_initialize(self, event): # if you have any initialization # including sizer setup, do it here self.printer = HtmlEasyPrinting() # self.loadConfig() self.startTitle = self.title self.newFile() def loadConfig(self): pass def saveConfig(self): pass def saveChanges(self): # save configuration info in the app directory #filename = os.path.basename(self.documentPath) if self.documentPath is None: filename = "Untitled" else: filename = self.documentPath msg = "The text in the %s file has changed.\n\nDo you want to save the changes?" % filename result = dialog.messageDialog(self, msg, 'textEditor', wx.ICON_EXCLAMATION | wx.YES_NO | wx.CANCEL) return result.returnedString def doExit(self): if self.documentChanged: save = self.saveChanges() if save == "Cancel": return False elif save == "No": return True else: if self.documentPath is None: return self.on_menuFileSaveAs_select(None) else: self.saveFile(self.documentPath) return True else: return 1 def on_close(self, event): if self.doExit(): # self.saveConfig() self.fileHistory = None self.printer = None event.skip() def on_menuFileSave_select(self, event): if self.documentPath is None: # this a "new" document and needs to go through Save As... self.on_menuFileSaveAs_select(None) else: self.saveFile(self.documentPath) def on_menuFileSaveAs_select(self, event): wildcard = "Text files (*.txt)|*.TXT;*.txt|All files (*.*)|*.*" if self.documentPath is None: dir = '' filename = '*.txt' else: dir = os.path.dirname(self.documentPath) filename = os.path.basename(self.documentPath) result = dialog.saveFileDialog(None, "Save As", dir, filename, wildcard) if result.accepted: path = result.paths[0] self.saveFile(path) return True else: return False def newFile(self): # change the code below for # creating a new document # the commented line is from the textEditor tool # self.components.fldDocument.text = '' self.documentPath = None self.documentChanged = 0 self.title = 'Untitled - ' + self.startTitle self.statusBar.text = 'Untitled' def openFile(self, path): # change the code below for # opening an existing document # the commented lines are from the textEditor tool try: # f = open(path) # self.components.fldDocument.text = f.read().replace('\r\n','\n') # f.close() self.documentPath = path self.documentChanged = 0 self.title = os.path.split(path)[-1] + ' - ' + self.startTitle self.statusBar.text = path except: pass def saveFile(self, path): # change the code below for # saving an existing document # the commented lines are from the textEditor tool try: # f = open(path, 'w') # f.write(self.components.fldDocument.text) # f.close() self.documentPath = path self.documentChanged = False self.title = os.path.split(path)[-1] + ' - ' + self.startTitle self.statusBar.text = path except: pass def on_menuFileNew_select(self, event): if self.documentChanged: save = self.saveChanges() if save == "Cancel": # don't do anything, just go back to editing pass elif save == "No": # any changes will be lost self.newFile() else: if self.documentPath is None: if self.on_menuFileSaveAs_select(None): self.newFile() else: self.saveFile(self.documentPath) self.newFile() else: # don't need to save self.newFile() def on_menuFileOpen_select(self, event): # should probably have an alert dialog here # warning about saving the current file before opening another one if self.documentChanged: save = self.saveChanges() if save == "Cancel": # don't do anything, just go back to editing return elif save == "No": # any changes will be lost pass else: if self.documentPath is None: # if the user cancels out of the Save As then go back to editing if not self.on_menuFileSaveAs_select(None): return else: self.saveFile(self.documentPath) # split this method into several pieces to make it more flexible wildcard = "Text files (*.txt)|*.txt;*.TXT|All files (*.*)|*.*" result = dialog.openFileDialog(wildcard=wildcard) if result.accepted: path = result.paths[0] # an error will probably occur here if the text is too large # to fit in the wxTextCtrl (TextArea) or the file is actually # binary. Not sure what happens with CR/LF versus CR versus LF # line endings either self.openFile(path) def on_menuFilePrint_select(self, event): # put your code here for print # the commented code below is from the textEditor tool # and is simply an example #source = textToHtml(self.components.fldDocument.text) #self.printer.PrintText(source) pass def on_menuFilePrintPreview_select(self, event): # put your code here for print preview # the commented code below is from the textEditor tool # and is simply an example #source = textToHtml(self.components.fldDocument.text) #self.printer.PreviewText(source) pass def on_menuFilePageSetup_select(self, event): self.printer.PageSetup() # the following was copied and pasted from the searchexplorer sample def on_menuEditUndo_select(self, event): widget = self.findFocus() if hasattr(widget, 'editable') and widget.canUndo(): widget.undo() def on_menuEditRedo_select(self, event): widget = self.findFocus() if hasattr(widget, 'editable') and widget.canRedo(): widget.redo() def on_menuEditCut_select(self, event): widget = self.findFocus() if hasattr(widget, 'editable') and widget.canCut(): widget.cut() def on_menuEditCopy_select(self, event): widget = self.findFocus() if hasattr(widget, 'editable') and widget.canCopy(): widget.copy() def on_menuEditPaste_select(self, event): widget = self.findFocus() if hasattr(widget, 'editable') and widget.canPaste(): widget.paste() def on_menuEditClear_select(self, event): widget = self.findFocus() if hasattr(widget, 'editable'): if widget.canCut(): # delete the current selection, # if we can't do a Cut we shouldn't be able to delete either # which is why i used the test above sel = widget.replaceSelection('') else: ins = widget.getInsertionPoint() try: widget.replace(ins, ins + 1, '') except: pass def on_menuEditSelectAll_select(self, event): widget = self.findFocus() if hasattr(widget, 'editable'): widget.setSelection(0, widget.getLastPosition()) def on_doHelpAbout_command(self, event): # put your About box here pass if __name__ == '__main__': app = model.Application(MyBackground) app.MainLoop() PythonCard-0.8.2/tools/oneEditor/templates/templateFullMenus.rsrc.py0000644000076500007650000000651010130111012025546 0ustar alexalex00000000000000 { 'application':{ 'type':'Application', 'name':'Template', 'backgrounds': [ { 'type':'Background', 'name':'bgTemplate', 'title':'Standard Template with full menus', 'size':( 400, 300 ), 'style':['resizeable'], 'statusBar':1, 'menubar': { 'type':'MenuBar', 'menus': [ { 'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ { 'type':'MenuItem', 'name':'menuFileNew', 'label':'&New\tCtrl+N' }, { 'type':'MenuItem', 'name':'menuFileOpen', 'label':'&Open\tCtrl+O' }, { 'type':'MenuItem', 'name':'menuFileSave', 'label':'&Save\tCtrl+S' }, { 'type':'MenuItem', 'name':'menuFileSaveAs', 'label':'Save &As...' }, { 'type':'MenuItem', 'name':'fileSep1', 'label':'-' }, { 'type':'MenuItem', 'name':'menuFilePageSetup', 'label':'Page Set&up...' }, { 'type':'MenuItem', 'name':'menuFilePrint', 'label':'&Print...\tCtrl+P' }, { 'type':'MenuItem', 'name':'menuFilePrintPreview', 'label':'Print Pre&view' }, { 'type':'MenuItem', 'name':'fileSep2', 'label':'-' }, { 'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit', } ] }, # most of the edit menu was copied from the searchexplorer sample {'type':'Menu', 'name':'Edit', 'label':'&Edit', 'items': [ { 'type':'MenuItem', 'name':'menuEditUndo', 'label':'&Undo\tCtrl+Z'}, { 'type':'MenuItem', 'name':'menuEditRedo', 'label':'&Redo\tCtrl+Y'}, { 'type':'MenuItem', 'name':'editSep1', 'label':'-' }, { 'type':'MenuItem', 'name':'menuEditCut', 'label':'Cu&t\tCtrl+X'}, { 'type':'MenuItem', 'name':'menuEditCopy', 'label':'&Copy\tCtrl+C'}, { 'type':'MenuItem', 'name':'menuEditPaste', 'label':'&Paste\tCtrl+V'}, { 'type':'MenuItem', 'name':'editSep2', 'label':'-' }, { 'type':'MenuItem', 'name':'menuEditClear', 'label':'Cle&ar\tDel'}, { 'type':'MenuItem', 'name':'menuEditSelectAll', 'label':'Select A&ll\tCtrl+A'} ] }, { 'type':'Menu', 'name':'menuHelp', 'label':'&Help', 'items': [ { 'type':'MenuItem', 'name':'menuHelpAbout', 'label':'&About ...', 'command':'doHelpAbout'}, ] }, ] }, 'components': [ ] } ] } } PythonCard-0.8.2/tools/oneEditor/templates/templateNoMenus.py0000644000076500007650000000061410130111012024247 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.1 $" __date__ = "$Date: 2004/10/03 23:58:02 $" """ from PythonCard import model class MyBackground(model.Background): def on_initialize(self, event): # if you have any initialization # including sizer setup, do it here pass if __name__ == '__main__': app = model.Application(MyBackground) app.MainLoop() PythonCard-0.8.2/tools/oneEditor/templates/templateNoMenus.rsrc.py0000644000076500007650000000040510130111012025215 0ustar alexalex00000000000000 { 'application':{ 'type':'Application', 'name':'Template', 'backgrounds': [ { 'type':'Background', 'name':'bgTemplate', 'title':'Standard Template with no menus', 'size':( 400, 300 ), 'components': [ ] } ] } } PythonCard-0.8.2/tools/oneEditor/todo.txt0000644000076500007650000000213010132346000020271 0ustar alexalex00000000000000 - figure out initial sizing issues DONE - close button / menu item to close current page DONE - add menu and command items to drop-downs - key / shortcut to take you to the drop-down (if possible) ? - statusBar and title mechanism. Problem with syntax check untitled doc which is then saved. syntax message goes into statusBar, but because the text has changed (new file name), on_idle overwrites the error message. - fix History, probably add document to history on closeTab as well as when closing application - on_menuFileOpen_select is currently broken, history selection works Traceback (most recent call last): File "/Users/altis/python/PythonCard/menu.py", line 205, in _dispatch handler(background, aWxEvent) File "/Users/altis/python/PythonCard/tools/oneEditor/tabcodeEditor.py", line 695, in on_menuFileOpen_select self.openFile(path) File "/Users/altis/python/PythonCard/tools/oneEditor/tabcodeEditor.py", line 570, in openFile if (not self.currentPage or AttributeError: 'NoneType' object has no attribute 'GetModify' PythonCard-0.8.2/tools/resourceEditor/0000755000076500007650000000000010434046773017660 5ustar alexalex00000000000000PythonCard-0.8.2/tools/resourceEditor/images/0000755000076500007650000000000010434046773021125 5ustar alexalex00000000000000PythonCard-0.8.2/tools/resourceEditor/images/align_bottom.png0000644000076500007650000000072110272005020024265 0ustar alexalex00000000000000‰PNG  IHDRàw=ø pHYs  šœgAMAœ@ äË cHRMz%€ƒóŽ„divð?EaYWŒàûGIDATxÚbüÿÿ?-@±ÀŒŒŒÄê)$ÊU DZ¦‚C}˵†€b„> #PíÿÏ¿cUËËÏ ó%X@±$ï} ÊçD(ˆ@>¤(—³QšŠˆW˜Ù HÿÄ¥ñÍË/DY@L¸"Ÿá¤€bÂ,ÔpsˆÍõDGèí‹ß ýo €XP“7ã?qBªÏ˜øH+@![vý¡·QTÚy¨’D`æ ‰^Gd´» YÄÄ@c@,$ºŒd@,äj|øäQꈅ\Ä€¢yz}ðŸ˜|ªˆÉÉ ³ˆ—’aL Œ%#ÔýÉh4ÀÙÄHëJ €Xˆô2Y´Ds|tƒ ™IEND®B`‚PythonCard-0.8.2/tools/resourceEditor/images/align_horiz_centres.png0000644000076500007650000000066410272005020025645 0ustar alexalex00000000000000‰PNG  IHDRàw=ø pHYs  šœgAMAœ@ äË cHRMz%€ƒóŽ„divð?EaYWŒàû*IDATxÚbüÿÿ?±€‘‘¨ü?# €X I±„ dG² ߀LeEv± €°)&f¿ ¸Å‹„Õ5×Î?Óo^~‹Ý¾øÎ~|÷#œýðÉ58{þ¶t ³ˆ‰Æ €hn@QÝ`*C1 €¨n0’ÿ!óˆæ> PÖgXåV í`Fö@± e¤ÿØÒ1©Eºˆ‰ÈÌE6 š'S€b"¥# –’Ð8"—8®¸ ¬…#Ô&ô2 VÁÊ"X9„\¡ç€ÂT‹t€¢y$-r2  €à9™Ò`‚E2r©„¯úcÄa)Ié €iݪ šG2@€ÓÈl;Ü ‹œIEND®B`‚PythonCard-0.8.2/tools/resourceEditor/images/align_left.png0000644000076500007650000000067610272005020023724 0ustar alexalex00000000000000‰PNG  IHDRàw=ø pHYs  šœgAMAœ@ äË cHRMz%€ƒóŽ„divð?EaYWŒàû4IDATxÚbüÿÿ?-@1FFFšÙ@,È EÄè)"ÊA Ð lâDhdd„¸† Z€ÂfC¢×L0-/£¦e•ùÁ´ª>'ƒ‡*Ì’ÿÄø €˜Ð½D* ¤ €˜(D Ø¡ñ‚Å}ðH±á² €A^%ShÄ,üKL$ãð JăÌ b5錈 &Zd.äˆ &€¢‰À â„E:@±`‘¤V¹¶ €ðædäÜŒœ£a¹DÄyj”xùr„ž“ÿQ;¸ˆ -x¨'DsÍ“)@ÑÜ€B)‹¨LAf¶*“‘@Å-ÿS£ ‰®ú5œh_#­›-,×W5»IEND®B`‚PythonCard-0.8.2/tools/resourceEditor/images/align_right.png0000644000076500007650000000071210272005020024076 0ustar alexalex00000000000000‰PNG  IHDRàw=ø pHYs  šœgAMAœ@ äË cHRMz%€ƒóŽ„divð?EaYWŒàû@IDATxÚbüÿÿ?-@1h# fþÑÄB‚Á µÌ@üЉ„lÁ*…Š/ÅŸ?~gx|ïœÿæå8ûöÅïpöã»áì‡O®ÁÙó·¥cX@L 4Ds ˆê022¢˜ @L4HöÿùDs#(3©–LAyä  ™ ŒÆ@,H‰ (ðÚ> &DÐQn86@4O¦Ä„ä5šX@,há‹øÿ8—˜„ÀŒÌ l¥éFˆMl@{~¢KÚq^.ÁÊ$Xy*‹Ðó@áŠKía§4ˆˆ ¦Äô© €˜¤irò  €ˆ­2aÕ ¥Ê b«ÌÿP—1‘Z¤ ‰?Éå@1ÒºÙ`þf~ 2ÍKIEND®B`‚PythonCard-0.8.2/tools/resourceEditor/images/align_top.png0000644000076500007650000000067710272005020023575 0ustar alexalex00000000000000‰PNG  IHDRàw=ø pHYs  šœgAMAœ@ äË cHRMz%€ƒóŽ„divð?EaYWŒàû5IDATxÚbüÿÿ?-@±€FFFšØt<#@1ÒÚóÌFI 8PìˆÆãÊHê‘ÅÁ4@± ˆá4MŒèê‘å‘¥` €bA—Iôš‰Õ¥ó·¥cGW® €˜h ˆ…Räe´ðÊ ©HD±d•ùñÊÍã €XÐÙ„\„Tõ9ñÊ Rº%+¸ì€Bvõb¼L0BL‡—„ÉÔ*õPÌ ª¤" £Ùу#bEÄyÈ1üŽB €¨áƒ_ø‚ €˜¨¡Ø@a‘¬’ÙŠ z-öŸæ©'¦š…© \5þP!Í+}€9²O¤IpÒ}IEND®B`‚PythonCard-0.8.2/tools/resourceEditor/images/align_vert_centres.png0000644000076500007650000000067010272005020025467 0ustar alexalex00000000000000‰PNG  IHDRàw=ø pHYs  šœgAMAœ@ äË cHRMz%€ƒóŽ„divð?EaYWŒàû.IDATxÚbüÿÿ?-@±ÀŒŒŒÄê)$ÊU Ç ± ‘¹D¹ê`€bb 1 r‚èºÿ| o€"dã©àÚùçX5hJ¢ðÝ‚ÿØÂÙE¤€bAŽHaè.Cw ¼yù…( ˆæ‘ @,二@…' €b!×Û¿røo €XГ6„’%ð –@ˆ9…à2=a!+PÏ €0‚èñÝD9Ÿ:áÐäÍ@4OE„ჇO®QÕ€";ë€Â°`þ¶tªú €Xð¥j€b$§Ê$¦¸†¥"€b!Â0l)jÐ?<ˆÆV›@1ÒºÒ šç€¢¹‰hk9âÍ_IEND®B`‚PythonCard-0.8.2/tools/resourceEditor/images/dist_horiz_edge.png0000644000076500007650000000066410272005177024774 0ustar alexalex00000000000000‰PNG  IHDRàw=ø pHYs  šœgAMAœ@ äË cHRMz%€ƒóŽ„divð?EaYWŒàû*IDATxÚbüÿÿ?-@11ÐQ022J‘k@1Ò:ˆˆæA@4· €hn@ÑÜ€bAJ)Xc˜q¤,¢Ô 2'Ñk&ƒ’†8ƒ¡©˜Ö2”Äë:zPV—`Ð7—gð0ÀP@Xƒè?ãR;#)€baÀnÁ @UŨAÊcÿˆ‹c jPˆK 0(ƒMY]œÁÉGMŠ›`q6 €˜°9†á?#n—/ „âƒùÛÒ¶áf8¦¶á¶ €XHIŽÈ!‡K=: ’2qF¢€"Xš’šÑ@Ѽ¸ š—ED’ÀàbA¦‰Dó  š@ÑÜ€>üH2ƒ IEND®B`‚PythonCard-0.8.2/tools/resourceEditor/images/dist_horiz_space.png0000644000076500007650000000063210272005177025156 0ustar alexalex00000000000000‰PNG  IHDRàw=ø pHYs  šœgAMAœ@ äË cHRMz%€ƒóŽ„divð?EaYWŒàûIDATxÚbüÿÿ?-@11ÐQ022J‘k@1Ò:ˆˆæA@4· €hn@ÑÜ€bAJ)Xc˜É•ÑÄ‚,˜è5“AICœÁÐTLkJ¢È)«K0˜Ë1(it9 ie %uq'M¸@a ¢ÿŒ¸’î¨Ã°Ê1€µ¡Êö8ÀaX˜—ñŒó¡$(ì@4@1aæ<Ý‘ 8¤1㬠€˜°™ËŒ ¸}S€. @ð¢‚V© €h^Í3@ÑÜ€¢¹Ds ˆ$ €)†™&ÍS@Ñ<ˆˆæëßFI×Á½´IEND®B`‚PythonCard-0.8.2/tools/resourceEditor/images/dist_vert_edge.png0000644000076500007650000000065510272005177024621 0ustar alexalex00000000000000‰PNG  IHDRàw=ø pHYs  šœgAMAœ@ äË cHRMz%€ƒóŽ„divð?EaYWŒàû#IDATxÚbüÿÿ?-@1‘¢˜Hµ €ií€bb 1 "‚§¾'dÄBŒ+6¯¸À6 hÌHߢ|@DYpñäC Wþƒ-ÙDJ¬Qܽù‚ì8 šG2@L¦”F2@‘”ˆ± ¨†Èþ R½¼oËu 1'Md‹þ ËÉܽùžš‘’-’/Q|@¤[pã%Ä ÜA…â€bA²Y (ùŒ/Ÿ~ ÉADõHFDó² €ˆŠƒkçŸcˆiJåk€"Ê‚{ÀˆýK2Ø’@DYpþô¤H#­° ¢}@. š—EDó: €h^\Ò€mï5“ø´IEND®B`‚PythonCard-0.8.2/tools/resourceEditor/images/dist_vert_space.png0000644000076500007650000000066510272005177025011 0ustar alexalex00000000000000‰PNG  IHDRàw=ø pHYs  šœgAMAœ@ äË cHRMz%€ƒóŽ„divð?EaYWŒàû+IDATxÚbüÿÿ?-@1‘¢˜Hµ €Xˆ0ô?Îúž …ÄBŒ+öm¹2d$Ä vôÑ$ÊD”÷n¾› ÷ @DYp÷ÆK°ëÿM&5ˆ( ^<ý@v* FBÉ=’‘1‘ @Œ´ÎDr2%ÕDT\;ÿCLËP—ƒX€ÿñˆÈdú‚ìXXVÀãndÃA €ˆ²àÂÉGd µ€¢ø €ˆË@ Ð}@ðT´Y È~FíH š'S€¢y2 ª'St@Ä%S`a÷äpR…ÒD€"Ê‚ó§ ER±M ¢}@. š—¦Dód @L 4ª\s“ôâÂhIEND®B`‚PythonCard-0.8.2/tools/resourceEditor/images/equal_both.png0000644000076500007650000000112510272005177023746 0ustar alexalex00000000000000‰PNG  IHDRàw=ø pHYs  šœgAMAœ@ äË cHRMz%€ƒóŽ„divð?EaYWŒàûËIDATxÚbüÿÿ?-@1addç!ÉV|ꈉ(¥Èõ@e0Ÿ‘k@1ÂâÛ¿¾o 7ªƒ~~a„±ˆ[$ƒä¢×L¢ÍŸ¿-äKFlrÄ‚ÓQlÌ «@îÙÈðî"ˆ0È]PY¼ €p[ÀÁ2bØPF¸¡ °ÁDØ@8-àâb…ó˜Bâ@íf`Äo@á´€“‡É`Ñ@ÀÂaÔàxcÆÃ?ts§ÜP P\Ë-¸Ráâoèæ RÊ¥(¸r. P·!ùDÿÿc„²0óˆ)3¡D’ Ð Bö fàÿ@Ëœ`…„;ˆxÙáŒdfÂa„ø›9„×ÔÏ ((”!þÃò@¸S7Ô ¨ùÿQò8€ Bn 8Ùɇ5¹0@#œ˜2 €pZÀÁÉÉÄŒÃÑÒëFÂN XÙX¨R£Í‹k€G:jøÍ8lP_Â1,y£«Çf žZì¹?Äz €˜h ˆ‘ÖÍ€ÍåÀ†¢Õ¥wIEND®B`‚PythonCard-0.8.2/tools/resourceEditor/images/equal_height.png0000644000076500007650000000114610272005177024265 0ustar alexalex00000000000000‰PNG  IHDRàw=ø pHYs  šœgAMAœ@ äË cHRMz%€ƒóŽ„divð?EaYWŒàûÜIDATxÚbüÿÿ?-@±€FFFšØt<#@±À@@H1Ô1œ@öw|j‘Í &"]‚ÌþNŠ/ˆÝ,\ŽBs!¡ …« t ®ŽÂ×2”Äjº:\êÂ߿þ@räFŠ# €0,øõó0œð?î;ä/Xþ?#D5”ƒ¡ €0,øñý7ÞÈ€Ÿ?~1€ãl6Ì L]„aÁ÷o¿ @}|ÿöÉÑÐ$ü%’Á<€Â°àÛ×_ `§1b$Tu_~‚’8 Ã5ñ€ƒ €XГX#àÛ—_à å)XP!ù€ˆA©å?@± ç˜ÿñºŸáË—ï`·ƒ­ƒIÿ™@Aôõ+q>øúù'¾xúc Ö°…¹‹Ÿ? q¦p¥j€ÂÉ?aå0Lq§¢¯À8€9öØò%@aM¦`£Ff2ýúOÿp§8€Â‘Ñ¡ÊñäƒïÐŒ‡ÿHº@a-*ˆ?¾ÿGðFXÑ‚i@1"U$8 ªÈ)®Af . $Ø@M3TÝ?ˆÆU£#­+}€¢y¥@4÷@€mÍȺôBBIEND®B`‚PythonCard-0.8.2/tools/resourceEditor/images/equal_width.png0000644000076500007650000000062510272005177024135 0ustar alexalex00000000000000‰PNG  IHDRàw=ø pHYs  šœgAMAœ@ äË cHRMz%€ƒóŽ„divð?EaYWŒàû IDATxÚbüÿÿ?-@1FFFªÛ3 €XÐ‰Ò ÄX„-4ˆ›: \ ²Å•„͆D¯™p¶¼Œœ-«Ìg«êsÂÙ"â<`ZËPÃ,€b"äEJ@11ÐÍ- FP°€’(r€dá_J „E2ÌL€bÁ¥€Z €hDDs ˆ&ÞIˆWBI$ñwX±@4ÏÉ„ž“ÿQ;¸ˆ -x¨'DsÍ“)@ÑÜ€B)‹¨•L‘Ë"€ÂVeâ+‹X T þA¯ý°Õ'ÄB¢ÿ@ 'Ú—ÄHëf @€ËKS'œ8ˆÊIEND®B`‚PythonCard-0.8.2/tools/resourceEditor/images/move_back.png0000644000076500007650000000130010272005350023535 0ustar alexalex00000000000000‰PNG  IHDRàw=ø pHYs  šœgAMAœ@ äË cHRMz%€ƒóŽ„divð?EaYWŒàû6IDATxÚbüÿÿ?-@±ÀŒŒŒÄê)$ÊU Ç Ža„:„ÿ@1A‹ˆ…ÃÙ€˜ˆ9ø;â_„, & çbQ ~ ¥ù âxà €Àá„'¢AšÙ¡j‚\«åýêjM¨8;.K@æ‘.âk@ÃLÜ|*ƒä¯AÅñú €˜H1\TI—‰™…ÁÓR›!¾{ ¯ AKˆ‰Ãa€›ƒ•ÁBCŠÁ£xAŸ©†ƒÀŸ¿ÿXY˜|ÌUÖâµ €˜°$[PRÄe8\!3 ƒŸ… CtÇ&˜%‚Pýðä@Lh®gbV ¾ 2œWL–áÇ—˜ÇñÅ¿ÿ8ÙY þ‚ Çš;¡Žóñ²%±© &\A®ÿûœDAÙ\¾ ¬Å50|ÿ#»žOLŽ…• Ìfãàbøüã70°³2£H D@1ÂlD‹4²ëQ0³@f .EH¾a"Âи䈑֕>@11ÐÍ-0E ¤½¬Jf/IEND®B`‚PythonCard-0.8.2/tools/resourceEditor/images/move_forward.png0000644000076500007650000000134110272005350024306 0ustar alexalex00000000000000‰PNG  IHDRàw=ø pHYs  šœgAMAœ@ äË cHRMz%€ƒóŽ„divð?EaYWŒàûWIDATxÚbüÿÿ?-@11ÐÍ- ÁÈÈH‰þa„=@±`“£ÀÁ. l0l;uL¿ùø Lÿüý—áÛ¯? ûÏßgøùõ#XìÏï_ Ÿ^=bøüê1˜mïR¬6¶ `ô2SF`eafàå`eøõã÷oÀd8 @ Ç΄7ŒEø¹ ®ýûŒ™˜Q= s=>@¸,`†ùfÉ?1u=3. ¯ƒŠ -@®ÇîÈ €˜°¤&(ANrx’²’ EÄ‚Æþ+M31¡º…WLÆ|ƒ¦œm0@1B]²™ˆ€øyÎÔÝ R ÌÀpùýç/ï?ÿÀA´îІϯûãËôà’bàÏÿМ@LH™ë/ÔêS²]¶Ÿ¾Ëðýço°ËY˜™°F2²áêPý‘3+@!ûä­/@üˆµ–Vø1l:q‡á0ƒ’(6ðúÞe˜áZP}_ƒˆ ­ˆøÄŸ áªµ¡!˜aËÉ;à`ùáo ú~¡5Ä„¥B±dGo ÉϾþøM²á @Œ8’ H€ ˆù ÉðšOåb†ÿþ1<8³‹(Ãa¥)@1à©Ñ`)Kˆ5Az´œ£ÿC Ò„Š³ã*ƒ@æ‚0@1¨2‘-Ñ€®AÈpd ˆ‘@.E. æâïÐÔò _Ýs8@cÌ(þÅx½³ €HlU0«DÄHëf @€àÇA-R‘øIEND®B`‚PythonCard-0.8.2/tools/resourceEditor/images/move_together.png0000644000076500007650000000150110272005350024461 0ustar alexalex00000000000000‰PNG  IHDRàw=ø pHYs  šœgAMAœ@ äË cHRMz%€ƒóŽ„divð?EaYWŒàû·IDATxÚbüÿÿ? 0222 ó¡bL PÏ?d3Ĉ› ¢ÿ $dCA\d@±àÒ´íÔ]0ýæã70ýó÷_†o¿þ0ì?Ÿáç×`±?¿1|zõˆáó«Ç`þµ½K1Ì ^fùf °²03ð212üúñáÛÇ7`±_>ÀåA†Cõ¡˜@L¼Ë ÂÏqíß`ÌÄŒê&˜ë±é€ÂÌ^fÊ(–üÃ3РaÆ&@Lx"ù/ˆ ³¬˜§á PõN ,á²äš¿Èqǰ@Ë9=ÿC`q€bÂf!(]ƒÔ€\ÿû×/œüþùáÿ¿páê@†Ã@,X,ø &Í þœí1‚èܺI0&ÌåH怃 €Ð}ð¨Nj8PýOƒ@8ÅS%’ή`€É¹| õŒ ŒĈVT€³1HÑ/ Ük\9$Hr¢ K€ø-(_BC‹ €˜H>UKIR@Ø"™ˆŸñ'¨«à®·Oí`€Å–òêT7rÜ Zð0C½¿ –€ ‚Ëh–p@Õÿ‡êñƒ$ˆ)LAÉër–7 tÎ+&‹âTPdÿ&OX>&çh¥(Ü€B¢?H ÿÃ2ŽÌˆ^òþG2n@a+MÿÃ’¬0¬À°€‰‰‰½(&O”Ô@¸R,>°ù9? 'Ì膃@1¡» †A®ÁD° «Œ –üEÖË_D0`Dðß? ,ÌL`Œl .@8ëdd×ó‰É1°°²Ùl\ Ÿüfàbca`geF *XAŠl@1¢·"È©ôÑ«[d>@aµ€’f :0„ 7³Y¯jÛIEND®B`‚PythonCard-0.8.2/tools/resourceEditor/images/nudge_down.png0000644000076500007650000000103710272005350023747 0ustar alexalex00000000000000‰PNG  IHDRàw=ø pHYs  šœgAMAœ@ äË cHRMz%€ƒóŽ„divð?EaYWŒàû•IDATxÚbüÿÿ?-@11ÐÍ- ÁÈÈæ Pœ €zþ!©GÓÄ‚®¨ˆ¤HA6&„Ì lšää4ðÒÝÀK#€¢yïR ˆæ> š[@L¸R,B‰øÔ²,ÿ¡‰—ñX‚‘Ä„$ÈŒd *XÀŽl @1‚ M=¬@ÌÄÂ@|3*ª§!ØÒû²e Jˆ?ñoXN ä úÄ_€ø=kA5 jÅ úÿ ˲`AÅõ È5×**à5¼£#f8Èå¿@ÅrY@è©è?THñO&L-D "äøÁe82 tàôÉ´i'PdeYà5æ€bÀS£1BS„(k‚ôlÙòŒ¡†‰¢§t @ €T™È–h@ &h8²„+ˆ°sñwhjÁæèA@ÄXψPüŠÿ¨éÀ4@1ت º<‡@1ÒºÙ`‡h™|DžpIEND®B`‚PythonCard-0.8.2/tools/resourceEditor/images/nudge_left.png0000644000076500007650000000105210272005350023727 0ustar alexalex00000000000000‰PNG  IHDRàw=ø pHYs  šœgAMAœ@ äË cHRMz%€ƒóŽ„divð?EaYWŒàû IDATxÚbüÿÿ?-@±€FFFbÕƒt²£ˆ…ƒAj™øˆ‰HÃÙ€˜ˆ€®ûCq12FÄD‚áÂ@üœ þAƒ ŒAb0Œn@±i¸_‹Šª`xôècØÄˆ‰TÃA@NNƒèT@,ÄŽ°Yr0˜˜€ñð&@Lø çà¼VQ±€¢|@,ø\^ÝOÐÕ„@1¡YÆM-צM;A•œ @,h‰ˆ¯oÙòž Ãhr@Á|ðš;¿S», ä8YðˆÅ||^‚–,q¥{b@!ÇÈ¿€øÈ’¬, ªø €AeZiŠœš^’)±>9rdˆbF΄-'£ø¤£#$#„ÍX}‚\Tàò H hŠa„¯4EñɲeðäJJ¤U&ÈEìÐ øŸŒR7¾ ÂU£ý$Tm"; €ˆ­2A:~Có I­€b¤u« €˜h  Ã_³PDIEND®B`‚PythonCard-0.8.2/tools/resourceEditor/images/nudge_right.png0000644000076500007650000000104210272005350024111 0ustar alexalex00000000000000‰PNG  IHDRàw=ø pHYs  šœgAMAœ@ äË cHRMz%€ƒóŽ„divð?EaYWŒàû˜IDATxÚbüÿÿ?-@11Ð 2‡‘‘‘= EDy:Dª@†³1+”M6 þãÁÿ€ø;ó11–#z$ƒé¿œœVÅ q^¶¬ÄâO@ü WÌ ¢ƒfé£G7¢¢*@ÌWÄø €°úÀÆ&€(Ëùd6@1¡NR¤WT, è€BñÔ‚¿Ð :Ø::°úd6@Q%£M›v§OˆŸËHñÅ–-||@–ˆ@}ò$@´(*8¡û €°ú”‰u=H-ˆº$¤ ͈`ñ@TñAV–ˆÒâ·@üjY>@Ž£ S a†¿Á–ˆ…—C“'NÃA €XÐrÞ?P‘Íè) š‹ñDtÀ,E*섵,"Â>u ~OLi @,XqÔp ÇüŠI@3Ñ|†Ã@¡—EÄT± ü9­ã«2ˆÔTôj8ÑM€b¤u³ ÀBøŸ(Ÿ¶9ßIEND®B`‚PythonCard-0.8.2/tools/resourceEditor/images/nudge_up.png0000644000076500007650000000102710272005350023423 0ustar alexalex00000000000000‰PNG  IHDRàw=ø pHYs  šœgAMAœ@ äË cHRMz%€ƒóŽ„divð?EaYWŒàûIDATxÚbüÿÿ?-@±ÀŒŒŒÄê)$ÊU Ç Ža„:„ÿ@1A‹ˆ…ÃÙ€˜ˆ9ø;â_„,  çâWP1M fâO„, p8á‰háì@, 2dË–` 5P*ÎU‡Õl€b„Ž%’Q\>mÚ ɬ, ¥Äopùd6@1, =º—±Ab¼‚×€\¨:6l> l>À0èèHÀéÙ„nŠáQQ(†ÉÉiÀ}€ –-ëÀj Èl€bÂ’ªx°Ž@Õ‚‚Kªž:ˆ -Ü™A®i¹†qd5PKn1+Ôp² °ú‰-ˆ0=À`yœË=ˆþSj#$2ÿÀĈ‰R Gv$ @ÑÜ€¢ºèå@ÑÜ„­¨øO¡afÌ |–B-f"Âи䈑֕>@Ñ<ˆæ­.¥Li®ä2IEND®B`‚PythonCard-0.8.2/tools/resourceEditor/images/relayer.png0000644000076500007650000000110710272005350023257 0ustar alexalex00000000000000‰PNG  IHDRàw=ø pHYs  šœgAMAœ@ äË cHRMz%€ƒóŽ„divð?EaYWŒàû½IDATxÚbüÿÿ?-@11Ð ˆ`dd$Ê@ß2’j@±ÀZÎÑ ‚¼¼ ’¢¢ ² r’’ ²ââ ’"" ‚|| Z†’ 0ÇÀ,Âç0˜€bAe„:¨‘á?NÈ–€J²2 &šZ ÆZZ ¾¾¦põÄ‚Û KÐìG¸Ýõpš»ˆ ÃTL5È@ˆEð&´P h2ýO FR+ Äì„Ô‚0@±š:"d ÿú‰˜ÿØÌ ¬q@l²ERS €X¨™æ±€¢yN š[@LøÂžÔ¸Àˆ½4E6”ñ@LXR#‚ ìÐ$I <ÁÌç ¶CO‰„’L7o>ÅpöÚu ¾Æp÷ɰص½KAÔ/˜%Ðâ‚áÚùç ï?}bxñæ ã/>Áðäå †ç¯_3¼ÿü¦ €Póî ÿ‡Ä~Œ52ÑKd( &lªÐíy<èÿÓL@(>@.DZ¸RÕËQKd Fr*}R" €iݪ šNâ²€ D¡ÆIEND®B`‚PythonCard-0.8.2/tools/resourceEditor/images/send_to_back.png0000644000076500007650000000127610272005350024236 0ustar alexalex00000000000000‰PNG  IHDRàw=ø pHYs  šœgAMAœ@ äË cHRMz%€ƒóŽ„divð?EaYWŒàû4IDATxÚbüÿÿ?-@±ÀŒŒŒ Šš¶1‚@L 4Ä‚n+u ‡ð±8 ñ ~ Ä_€ø’:¨1>YÊ Äì@Ì Ä§ 4;TÙQ_Ð5(œðD4#Ô Q ÖÅ‘–sôh\iBÅÙqùd.@1p9ó±_Π`âÆàS¹$ *ÎU‡Õ€b"ÅpQ%]&fOKm†øî- ¼‚- &R ‡nV )â9}@L¤þþc`eafð1WahX‹×€bÂ’lAIM—áp…ÌL l, ~* Ñ›`–BõÓ?@1¡¹žšôn‚ ç“eøñåfÄ1B|ñïß?NvVOSe†œ©»AR7¡ú™a¾ äŒJz€ø9Ø9{—Â%Ì#+8xàü@• ÃEøy¼Ì”Ñíµœö=ˆþ@Å`>…+ÃçW1Ò7´ì‚$—3À–ŠþC³?¿Á•Ð,xƒ¤%×Á¢Èà’ÛNÝÅ« €ðYðd8VMPÇ¿ùø Ù’¿ØÔA`¸þïpadKp€ÂeÁd×ó‰É1pñ‹€1Ãç¿~ÿAu0Ô¥&@1ÂJR´H£¤fcDN ÄBH‘uÆ?\ÄHëJ €h^'Í-0>v‘…pf)IEND®B`‚PythonCard-0.8.2/tools/resourceEditor/images/send_to_front.png0000644000076500007650000000132210272005350024456 0ustar alexalex00000000000000‰PNG  IHDRàw=ø pHYs  šœgAMAœ@ äË cHRMz%€ƒóŽ„divð?EaYWŒàûHIDATxÚbüÿÿ?-@11ÐÍ- ÁÈÈH‰þa„=@±`“£ÀÁ. l0l;uL¿ùø Lÿüý—áÛ¯? ûÏßgøùõ#XìÏï_ Ÿ^=bøüê1˜mïR¬6¶ `ô2SF`eafàå`eøõã÷oÀd8 @ Ç΄7ŒEø¹ ®ýûŒ™˜Q= s=>@¸,`†ùfÉ?1u=3. ¯ƒŠ -@®ÇîÈ €˜°¤&(ANrx’²’ EÄ‚Æþ+M31¡º…WLÆ|ƒ¦œm0@1B]²™ˆ€øyÎÔÝ R ÌÀpùýç/ï?ÿÀA´îІϯûãËôà’bàÏÿМ@LH™ë/ÔêS²]¶Ÿ¾Ëðýço°ËY˜™°F2²áêPý‘3+@!ûä­/@üˆµ–Vø1l:q‡á0ƒ’(6ðúÞe˜áZP}_ƒˆ ­ˆøÄŸ áªµ¡!˜aËÉ;à`ùáo ú~¡5Ä„¥B±dGo ÉϾþøM²á @Œ8’ H€ ˆù ÉðšOåb†ÿþ1<8³‹(Ãa¥)@1à©Ñ`)Kˆ5Az´œ£ÿC Ò„Š³ã*ƒ@æ‚0@1¨2‘-Ñ€®AÈpd [QÁƒ' Àÿ M~fPú'Tœ`Ý@,TªhpV<Dó: €iÝl0„ùõhdNIEND®B`‚PythonCard-0.8.2/tools/resourceEditor/images/sizingHandle.bmp0000644000076500007650000000033610030634451024232 0ustar alexalex00000000000000BMÞ6(¨ÔÔÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿPythonCard-0.8.2/tools/resourceEditor/layoutEditor.py0000644000076500007650000026467610361653273022741 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.1 $" __date__ = "$Date: 2006/01/13 07:28:59 $" """ # TODO: Start using exceptions! import os, sys, string, copy import pprint import webbrowser import wx import time from PythonCard import about, clipboard, configuration, dialog, graphic, log from PythonCard import menu, model, registry, resource, util from PythonCard.templates.dialogs import runOptionsDialog from modules import backgroundInfoDialog from modules import stackInfoDialog from modules import menuDialog from modules import newComponentDialog from modules import stringDialog from modules import dialogInfoDialog from modules.multipropertyEditor import PropertyEditor from modules import multiresourceOutput SIZING_HANDLE_SIZE = 7 NUM_SIZING_HANDLES = 8 RESOURCE_TEMPLATE = 'template.rsrc.py' RESOURCE_DIALOG_TEMPLATE = 'dialogTemplate.rsrc.py' USERCONFIG = 'user.config.txt' # KEA doc handling adapted from python_docs # method in IDLE EditorWindow.py pythoncard_url = util.documentationURL("documentation.html") resourceeditor_url = util.documentationURL("resource_editor_overview.html") def prefixSizingHandle(N): return ("_sh_%02d_" % N) def cursor(name): return name[7:] class DummyDialog(model.CustomDialog): def __init__(self, aBg, path): # load the resource aDialogRsrc = resource.ResourceFile(path).getResource() model.CustomDialog.__init__(self, aBg, aDialogRsrc) def on_mouseClick(self, event): event.skip() class ResourceEditor(model.Background): def on_initialize(self, event): self.filename = None self.documentChanged = False self.cmdLineArgs = {'debugmenu':False, 'logging':False, 'messagewatcher':False, 'namespaceviewer':False, 'propertyeditor':False, 'shell':False, 'otherargs':''} self.lastCaptured = None self.startName = None self.lastSelection = None self.marquee = False self.startPosition = (0, 0) self.startSize = (0, 0) self.offset = (0, 0) self.offsets = None self.startToolTip = '' try: self.readme = open('multireadme.txt').read() except: self.readme = '' # KEA 2002-06-27 # copied from codeEditor.py # wxFileHistory isn't wrapped, so use raw wxPython # also the file list gets appended to the File menu # rather than going in front of the Exit menu # I suspect I have to add the Exit menu after the file history # which means changing how the menus in resources are loaded # so I'll do that later self.fileHistory = wx.FileHistory() fileMenu = self.GetMenuBar().GetMenu(0) self.fileHistory.UseMenu(fileMenu) wx.EVT_MENU_RANGE(self, wx.ID_FILE1, wx.ID_FILE9, self.OnFileHistory) self.buildComponentsMenu() self.cursors = {} self.cursors['topRight'] = wx.StockCursor(wx.CURSOR_SIZENESW) self.cursors['bottomLeft'] = self.cursors['topRight'] self.cursors['topMiddle'] = wx.StockCursor(wx.CURSOR_SIZENS) self.cursors['bottomMiddle'] = self.cursors['topMiddle'] self.cursors['topLeft'] = wx.StockCursor(wx.CURSOR_SIZENWSE) self.cursors['bottomRight'] = self.cursors['topLeft'] self.cursors['middleLeft'] = wx.StockCursor(wx.CURSOR_SIZEWE) self.cursors['middleRight'] = self.cursors['middleLeft'] self.cursors['general'] = wx.StockCursor(wx.CURSOR_SIZING) self.cursors['null'] = wx.NullCursor self.sizingHandleNames = ['topLeft', 'topMiddle', 'topRight', 'middleLeft', 'middleRight', 'bottomLeft', 'bottomMiddle', 'bottomRight'] if wx.Platform == '__WXMSW__': path = os.path.join(self.application.applicationDirectory, 'images', 'sizingHandle.bmp') self.sizingHandleTemplate = {'type':'ImageButton', 'name':'topLeft', 'position':(3, 3), 'size':(SIZING_HANDLE_SIZE, SIZING_HANDLE_SIZE), 'file':path, 'border':'none', 'visible':0} elif wx.Platform == '__WXMAC__': #self.resizingHandleColor = (0,0,128) path = os.path.join(self.application.applicationDirectory, 'images', 'sizingHandle.bmp') self.sizingHandleTemplate = {'type':'Image', 'name':'topLeft', 'position':(3, 3), 'size':(SIZING_HANDLE_SIZE, SIZING_HANDLE_SIZE), 'file':path, #'backgroundColor':self.resizingHandleColor, 'border':'none', 'visible':0} else: self.resizingHandleColor = (0,0,128) self.sizingHandleTemplate = {'type':'ImageButton', 'name':'topLeft', 'position':(3, 3), 'size':(SIZING_HANDLE_SIZE, SIZING_HANDLE_SIZE), 'file':'', 'backgroundColor':self.resizingHandleColor, 'visible':0} for sizingHandle in self.sizingHandleNames: self.sizingHandleTemplate['name'] = sizingHandle self.components[sizingHandle] = self.sizingHandleTemplate self.multipleSelected = False self.multipleComponents = [] self.propertyEditorWindow = model.childWindow(self, PropertyEditor) self.xGridSize = 5 self.yGridSize = 5 self.alignToGrid = self.menuBar.getChecked('menuOptionsAlignToGrid') self.showGridLines = self.menuBar.getChecked('menuOptionsShowGridLines') path = os.path.join(self.application.applicationDirectory, 'templates', \ RESOURCE_TEMPLATE) self.rsrc = resource.ResourceFile(path).getResource() self.updatePanel(self.rsrc) # KEA 2004-05-14 # this actually should only occur once for the panel # so I'm moving it into initialize which should work as long as # the panel isn't destroyed while editing, opening new files, etc. # KEA link up events for new dragging code wx.EVT_LEFT_DOWN(self.panel, self.on_mouseDown) wx.EVT_LEFT_UP(self.panel, self.on_mouseUp) wx.EVT_MOTION(self.panel, self.on_mouseDrag) wx.EVT_LEAVE_WINDOW(self.panel, self.on_mouseLeaveWindow) wx.EVT_ENTER_WINDOW(self.panel, self.on_mouseEnterWindow) wx.EVT_CHAR(self.panel, self.on_keyPress) self.configPath = os.path.join(configuration.homedir, 'resourceeditor') self.loadConfig() """ # KEA 2002-03-03 # this doesn't appear to work, some additional accelerator table modification # must be messing up the bindings # setup acceleratortable for background acctbl = wx.AcceleratorTable([ (wx.ACCEL_CTRL, ord('C'), self.menuBar.getMenuId('menuEditCopy')), (wx.ACCEL_CTRL, ord('X'), self.menuBar.getMenuId('menuEditCut')), (wx.ACCEL_CTRL, ord('V'), self.menuBar.getMenuId('menuEditPaste')) ]) self.SetAcceleratorTable(acctbl) """ # KEA 2001-12-24 # once we can do dynamic menus we should load the component list dynamically # to build the first part of the Component menu # Add BitmapCanvas # Add Button # ... # perhaps there should be a framework function to return the list of files in # the components directory or list of components and then a method in the # resourceEditor can load each component module as it builds the menu # MRV 2002-08-08 # copied and changed from codeEditor to allow commandline argument for resource file # then can use from windows explorer rightclick... if len(sys.argv) > 1: # accept a file argument on the command-line filename = os.path.abspath(sys.argv[1]) log.info('resourceEditor filename: ' + filename) if not os.path.exists(filename): filename = os.path.abspath(os.path.join(self.application.startingDirectory, sys.argv[1])) if os.path.isfile(filename): if filename.endswith('rsrc.py'): self.filename = filename self.openFile(filename) self.resizingHandler = { 'topLeft':self.on_topLeft_mouseDrag, 'topMiddle':self.on_topMiddle_mouseDrag, 'topRight':self.on_topRight_mouseDrag, 'middleLeft':self.on_middleLeft_mouseDrag, 'middleRight':self.on_middleRight_mouseDrag, 'bottomLeft':self.on_bottomLeft_mouseDrag, 'bottomMiddle':self.on_bottomMiddle_mouseDrag, 'bottomRight':self.on_bottomRight_mouseDrag } self.createDC() def isSizingHandle(self, name): return (name[:4] == "_sh_") def prefixIndexForComp(self, name): for i in range(len(self.multipleComponents)): if self.multipleComponents[i][0] == name: return i return -1 def makeNewHandles(self, name): #print "make new", name for N in range(100): pre = prefixSizingHandle(N) #print name, N, pre if pre+"topLeft" in self.components: if self.components[pre+"topLeft"].visible: continue else: for sizingHandle in self.sizingHandleNames: fullname = pre + sizingHandle #print fullname if fullname in self.components.keys(): print "bad logic in makeNew", fullname return self.sizingHandleTemplate['name'] = fullname self.components[fullname] = self.sizingHandleTemplate for sizingHandle in self.sizingHandleNames: fullname = pre + sizingHandle self.components[fullname].visible = True #print name, N self.positionSizingHandles(self.components[name].position, self.components[name].size, pre) return pre return None def OnFileHistory(self, event): fileNum = event.GetId() - wx.ID_FILE1 path = self.fileHistory.GetHistoryFile(fileNum) if self.documentChanged: save = self.saveChanges() if save == "Cancel": # don't do anything, just go back to editing return elif save == "No": # any changes will be lost pass else: if self.filename is None: # if the user cancels out of the Save As then go back to editing if not self.on_menuFileSaveAs_select(None): return else: self.saveFile() self.openFile(path) # KEA 2004-05-12 # transition to dynamic component menu # and component addition def buildComponentsMenu(self): """ Dynamically build the menu for the components supported by the resourceEditor. Eventually this will be a list or some form of palette instead of a menu. """ # only built-in components are handled currently, so an appcomponents # directory or fully-qualified component paths are handled # theoretically when the user loads a resource file the menu should # be updated, but this is all highly dependent on how imports are # handled, registry updated, etc. # One idea would be for the resourceEditor to register itself as # a change listener and have the registry subclass Changeable so it could # notify the resourceEditor. In that case, the algorithm below would # have to be modified since each menu item would be added as it receives # a change notice from the registry and would need to check the existing # menu to prevent duplicates as well as insert into the menu in the correct # order. Or perhaps, the menu items could be wiped out and recreated which # is probably simpler. # get a list of all the modules in components moduleNames = registry.Registry.getInstance().findBuiltInComponents() # KEA 2004-05-12 # I know that IEHtmlWindow is platform specific and has problems # in the resourceEditor and Grid doesn't work right either so I'm # conditionally preventing them from being loaded here until I figure # out how to deal with them # Container is another one that isn't applicable yet if True: try: moduleNames.remove('iehtmlwindow') except ValueError: pass if True: try: moduleNames.remove('grid') except ValueError: pass if True: try: moduleNames.remove('container') except ValueError: pass # need to force an import of all of the modules in components for name in moduleNames: resource.loadComponentModule(name) # should match based on name instead # name to object or id like menubar helpers? m = self.menuBar.menus[2] names = registry.Registry.getInstance().components.keys() names.sort() for key in names: rsrc = resource.Resource({'type':'MenuItem', 'name': 'menuComponentAdd' + key, 'label': key, 'command':'componentAdd'}) mi = menu.MenuItem(self, m, rsrc) m.appendMenuItem(mi) def clearWidgets(self): for w in self.components.keys(): if w not in self.sizingHandleNames: del self.components[w] def switchToMultipleMode(self, name = None): if self.propertyEditorWindow.components.wComponentList.stringSelection: self.lastSelection = self.propertyEditorWindow.components.wComponentList.stringSelection if self.startName: # 'second' component - exactly one currently selected #print 'second ', self.startName self.multipleComponents.append( (self.startName, self.makeNewHandles(self.startName))) self.startName = None self.hideSizingHandles() if name: self.multipleComponents.append( (name, self.makeNewHandles(name))) self.propertyEditorWindow.statusBar.text = "Multiple Components" self.multipleSelected = True def positionSizingHandles(self, position, size, prefix = ""): x, y = position width, height = size halfHandleSize = SIZING_HANDLE_SIZE / 2 log.debug('positionSizingHandles prefix:' + prefix + ', position:' + str(position) + ", size:" + str(size)) self.components[prefix +'topLeft'].position = (x - SIZING_HANDLE_SIZE, y - SIZING_HANDLE_SIZE) self.components[prefix +'topMiddle'].position = (x + (width / 2) - halfHandleSize, y - SIZING_HANDLE_SIZE) self.components[prefix +'topRight'].position = (x + width, y - SIZING_HANDLE_SIZE) self.components[prefix +'middleLeft'].position = (x - SIZING_HANDLE_SIZE, y + (height / 2) - halfHandleSize) self.components[prefix +'middleRight'].position = (x + width, y + (height / 2) - halfHandleSize) self.components[prefix +'bottomLeft'].position = (x - SIZING_HANDLE_SIZE, y + height) self.components[prefix +'bottomMiddle'].position = (x + (width / 2) - halfHandleSize, y + height) self.components[prefix +'bottomRight'].position = (x + width, y + height) def showSizingHandles(self, name): self.startName = name self.positionSizingHandles(self.components[name].position, self.components[name].size) for sizingHandle in self.sizingHandleNames: self.components[sizingHandle].visible = True if wx.Platform == '__WXMAC__': pass #self.components[sizingHandle].backgroundColor = self.resizingHandleColor elif wx.Platform == '__WXGTK__': self.components[sizingHandle].backgroundColor = self.resizingHandleColor # overly conservative, but effective self.documentChanged = True def hideSizingHandles(self): if self.components.topLeft.visible: for sizingHandle in self.sizingHandleNames: self.components[sizingHandle].visible = False if wx.Platform == '__WXMAC__': self.panel.Refresh() def showMultiSizingHandles(self): if not self.multipleSelected: print "multi without multiple selected" return self.propertyEditorWindow.statusBar.text = "Multiple Components" for name, prefix in self.multipleComponents: self.positionSizingHandles(self.components[name].position, self.components[name].size, prefix) for sizingHandle in self.sizingHandleNames: self.components[prefix+sizingHandle].visible = True if wx.Platform == '__WXMAC__': pass #self.components[sizingHandle].backgroundColor = self.resizingHandleColor elif wx.Platform == '__WXGTK__': self.components[prefix+sizingHandle].backgroundColor = self.resizingHandleColor # overly conservative, but effective self.documentChanged = True def hideMultiSizingHandles(self): if not self.multipleSelected: return changes = 0 for name, prefix in self.multipleComponents: if self.components[prefix+"topLeft"].visible: changes += 1 for sizingHandle in self.sizingHandleNames: self.components[prefix+sizingHandle].visible = False if wx.Platform == '__WXMAC__' and changes > 0: self.panel.Refresh() ## AGT 04-2005 This is no longer called ! ## def gtkHideSizingHandles(self, name): ## for sizingHandle in self.sizingHandleNames: ## if sizingHandle == name: ## self.components[sizingHandle].backgroundColor = self.backgroundColor ## else: ## self.components[sizingHandle].visible = False ## def setToolTip(self, target): if self.multipleComponents: self.propertyEditorWindow.statusBar.text = "Multiple Components" else: self.propertyEditorWindow.statusBar.text = "Component: %s Pos: %s Size: %s" % (str(target.name), str(target.position), str(target.size)) """ x, y = target.position width, height = target.size tip = "name: " + target.name + " \n" + \ "position: " + str(x) + ", " + str(y) + " \n" + \ "size: " + str(width) + ", " + str(height) if tip != target.toolTip: target.toolTip = tip """ def setToolTipDrag(self, name, position, size): if self.multipleComponents: self.propertyEditorWindow.statusBar.text = "Multiple Components" else: self.propertyEditorWindow.statusBar.text = "Component: %s Pos: %s Size: %s" % (name, str(position), str(size)) def on_mouseEnter(self, event): if self.marquee: return name = event.target.name if name in self.sizingHandleNames: try: self.SetCursor(self.cursors[name]) except: # not all platforms have all cursors, but hopefully # the general sizing cursor is always available self.SetCursor(self.cursors['general']) else: # KEA 2003-05-05 # get rid of cursor change on wxTextCtrl self.SetCursor(wx.StockCursor(wx.CURSOR_ARROW)) self.setToolTip(event.target) def on_mouseLeave(self, event): if event.target.name in self.sizingHandleNames: self.SetCursor(self.cursors['null']) def pointInControl(self, position): #print 'pointInControl:' #position = self.panel.ClientToScreen( position ) #print ' position=', position globalPosition = self.panel.ScreenToClient(wx.GetMousePosition()) #print ' globalPosition=', globalPosition result = None for name in self.components.order: if name in self.sizingHandleNames: continue if self.isSizingHandle(name): continue control = self.components[name] r = control.GetRect() #print ' ', control, r if (r.Inside(globalPosition)): #print ' ', control result = control break #print "pointInControl", result return result def controlInRect(self, point, size): #print 'controlInRect:' #print ' p1, p2=', point, size result = [] if size[0] < 0: bx = point[0]+size[0] tx = point[0] else: bx = point[0] tx = point[0]+size[0] if size[1] < 0: by = point[1]+size[1] ty = point[1] else: by = point[1] ty = point[1]+size[1] for name in self.components.order: if name in self.sizingHandleNames: continue if self.isSizingHandle(name): continue control = self.components[name] r = control.GetRect() #print bx, by, tx, ty, " :: ", control.name, r if bx <= r[0] and bx <= r[0]+r[2] and tx >= r[0] and tx >= r[0]+r[2]: if by <= r[1] and by <= r[1]+r[3] and ty >= r[1] and ty >= r[1]+r[3]: #print ' ', control, r result.append(control.name) return result # KEA 2004-03-27 # the DC and lastPosition handling are basically a bunch # of hacks for event bugs in WXMAC and I'm sure I'm going to regret them def createDC(self): dc = wx.ClientDC(self.panel) dc.SetPen(wx.Pen('black', 1, wx.DOT)) dc.SetBrush(wx.TRANSPARENT_BRUSH) dc.SetLogicalFunction(wx.INVERT) self.dc = dc def on_size(self, event): self.createDC() event.skip() def drawTheRect(self): position = [self.startGlobalPosition[0], self.startGlobalPosition[1]] position[0] = position[0] - self.startGlobalOffset[0] position[1] = position[1] - self.startGlobalOffset[1] self.dc.DrawRectanglePointSize((position[0], position[1]), (self.startSize[0], self.startSize[1])) self.lastPosition = position def on_mouseDoubleClick(self, event): # AGT 2005-05-12 Should be unnecessary - but seems to prevent the problem where a double-click # was causing subsequent GetEventObjects to "stick" on the button ##print "dc", event.GetEventObject().GetName() pass def on_mouseDown(self, event): # KEA 2003-03-23 # protect against panel events #print "on_mouseDown" globalPosition = wx.GetMousePosition() cmdKey = event.CmdDown() control = event.GetEventObject() # mouseDown and already in marquee mode ? # can only be because of leaving the window issues !? if self.marquee: # erase the last rect self.dc.DrawRectanglePointSize((self.marqueeBase[0], self.marqueeBase[1]), (self.marqueeSize[0], self.marqueeSize[1])) self.marquee = False # overly conservative, but effective self.documentChanged = True # startGlobalPosition is the x,y where the initiating mouse event happened self.startGlobalPosition = self.panel.ScreenToClient(globalPosition) if control is self.panel: control = self.pointInControl(event.GetPosition()) if control is None: self.resizingHandleTarget = None self.marquee = True self.marqueeBase = self.startGlobalPosition self.marqueeSize = (0,0) return else: #print control.name, cmdKey clientPosition = self.panel.ScreenToClient(wx.GetMousePosition()) # AGT 04-2005 # protect against bad events - claim to be from a button # even though not inside it (after double-click button) # Seems to be prevented by having an empty on_mouseDoubleClick() r = control.GetRect() if (not r.Inside(clientPosition)): self.panel.SetFocus() junk = dialog.alertDialog(self, "You double-clicked - please don't", 'a title') return target = control if self.isSizingHandle(target.name): # click on a multi-sizing handle self.resizingHandleTarget = None return if target.name in self.sizingHandleNames: if not self.startName: return #print "res4 sizing handles", self.startName self.resizingHandleTarget = target.name self.hideSizingHandles() self.startPosition = self.components[self.startName].position self.startSize = self.components[self.startName].size self.offset = target.ScreenToClient(globalPosition) return # so we must have selected one of the user's components if cmdKey: if self.startName == target.name: return #print "ctl-select", target.name, self.multipleComponents if self.multipleSelected: index = self.prefixIndexForComp(target.name) if index <> -1: prefix = self.multipleComponents[index][1] for sizingHandle in self.sizingHandleNames: del self.components[prefix+sizingHandle] del self.multipleComponents[index] self.propertyEditorWindow.updateComponentList() return # need to add it self.multipleComponents.append( (target.name, self.makeNewHandles(target.name) ) ) else: self.switchToMultipleMode(target.name) self.propertyEditorWindow.updateComponentList() else: # plain mouse down if self.multipleSelected and self.prefixIndexForComp(target.name) <> -1: minx = None for c,pre in self.multipleComponents: px,py = self.components[c].position sx,sy = self.components[c].size if not minx: minx, miny = (px,py) maxx, maxy = (px+sx, py+sy) else: minx = min(minx, px) miny = min(miny, py) maxx = max(maxx, px+sx) maxy = max(maxy, py+sy) self.startPosition = (minx, miny) self.startSize = (maxx-minx, maxy-miny) self.startGlobalPosition = self.panel.ScreenToClient(globalPosition) self.startGlobalOffset = (self.startGlobalPosition[0]-minx, self.startGlobalPosition[1]-miny) self.offset = self.panel.ScreenToClient(globalPosition) else: self.clearMultipleComponentSelection() self.multipleSelected = False self.propertyEditorWindow.clearComponentList() self.propertyEditorWindow.displayComponents(self.components) self.startName = target.name if self.application.pw is not None: self.application.pw.selectComponentsList(target.name, target.__class__.__name__) # KEA 2002-02-23 self.propertyEditorWindow.selectComponentList(target.name, target.__class__.__name__) # startGlobalOffset is the initiating mouse x,y wrt. the component self.startGlobalOffset = target.ScreenToClient(globalPosition) # KEA 2003-05-05 # workaround for 3D border on Windows t = target.__class__.__name__ if wx.Platform == "__WXMSW__": if ['List', 'PasswordField', 'TextField', 'TextArea', 'Calendar'].count(t): self.startGlobalOffset = [self.startGlobalOffset[0] + wx.SystemSettings.GetMetric(wx.SYS_EDGE_X), self.startGlobalOffset[1] + wx.SystemSettings.GetMetric(wx.SYS_EDGE_Y)] elif ['Gauge', 'StaticLine'].count(t): self.startGlobalOffset = [self.startGlobalOffset[0] + wx.SystemSettings.GetMetric(wx.SYS_BORDER_X), self.startGlobalOffset[1] + wx.SystemSettings.GetMetric(wx.SYS_BORDER_Y)] elif t == 'Spinner': # compensate for width of TextCtrl portion of # compound control - width of arrow buttons self.startGlobalOffset[0] += target.size[0] - 16 elif wx.Platform == "__WXMAC__": # KEA 2004-07-27 # The SYS_EDGE and SYS_BORDER numbers don't seem to work on the Mac # so I just experimented to find the values below to prevent the components # from "hopping" when the user selects them if ['List'].count(t): self.startGlobalOffset = [self.startGlobalOffset[0] - 1, self.startGlobalOffset[1] - 1] elif ['PasswordField', 'TextField', 'TextArea', 'Calendar'].count(t): self.startGlobalOffset = [self.startGlobalOffset[0] + 3, self.startGlobalOffset[1] + 3] elif ['StaticBox'].count(t): # KEA 2004-08-16 # sigh, another complete behavior hack if target.label: self.startGlobalOffset = [self.startGlobalOffset[0] + 4, self.startGlobalOffset[1] + 18] else: self.startGlobalOffset = [self.startGlobalOffset[0] + 4, self.startGlobalOffset[1] + 3] self.hideSizingHandles() self.startPosition = self.components[self.startName].position self.startSize = self.components[self.startName].size self.offset = target.ScreenToClient(globalPosition) self.drawTheRect() self.movingComponent = True def on_mouseLeaveWindow(self, event): #print "leave" pass def on_mouseEnterWindow(self, event): if not self.marquee: return #rint "enter window", event.LeftIsDown() if not event.LeftIsDown(): # mouse has been released self.terminate_marquee(event.CmdDown(), event.m_shiftDown) def on_mouseDrag(self, event): # protect against double-clicks in the open file dialog # when switching rsrc.py files #if event.target.name not in self.sizingHandleNames and self.startName in self.components: if not event.Dragging(): return #print "on_mouseDrag" if wx.Platform == '__WXMAC__' and not hasattr(self, 'lastPosition'): self.on_mouseDown(event) if self.marquee: # erase the last rect self.dc.DrawRectanglePointSize((self.marqueeBase[0], self.marqueeBase[1]), (self.marqueeSize[0], self.marqueeSize[1])) # use the global mouse position and the initial offset and start # to figure out where to draw a rect in global coordinates x, y = self.panel.ScreenToClient(wx.GetMousePosition()) self.marqueeSize = (x-self.startGlobalPosition[0], y-self.startGlobalPosition[1]) self.dc.DrawRectanglePointSize((self.marqueeBase[0], self.marqueeBase[1]), (self.marqueeSize[0], self.marqueeSize[1])) return if self.resizingHandleTarget: if self.startName in self.components: self.resizingHandler[self.resizingHandleTarget](event) return else: log.debug('resizingHandle set but no good startname' + self.resizingHandle.name) pass if not self.movingComponent: return if self.multipleSelected: self.hideMultiSizingHandles() else: self.hideSizingHandles() # erase the last rect self.dc.DrawRectanglePointSize((self.lastPosition[0], self.lastPosition[1]), (self.startSize[0], self.startSize[1])) # use the global mouse position and the initial offset and start # to figure out where to draw a rect in global coordinates x, y = self.panel.ScreenToClient(wx.GetMousePosition()) xOffset = x - self.startGlobalOffset[0] yOffset = y - self.startGlobalOffset[1] if self.alignToGrid: xOffset = xOffset / self.xGridSize * self.xGridSize yOffset = yOffset / self.yGridSize * self.yGridSize self.lastPosition[0] = xOffset self.lastPosition[1] = yOffset self.dc.DrawRectanglePointSize((self.lastPosition[0], self.lastPosition[1]), (self.startSize[0], self.startSize[1])) if self.startName: # doesn't do anything if just drawing rects self.setToolTipDrag(self.startName, self.lastPosition, self.startSize) self.propertyEditorWindow.updateSingleProperty(self.startName, 'position', self.lastPosition) # KEA 2004-09-15 # support cursor keys to move components one pixel at a time # the event is coming from the panel so we have to use the wx methods def nudge(self, delta, step, grid=False): s = self.propertyEditorWindow.components.wComponentList.stringSelection if s: name = s.split(" : ")[0] if self.startName <> name: self.startName = name if self.startName: if not self.startName in self.components: return theList = [self.startName] elif self.multipleSelected: theList = [ x[0] for x in self.multipleComponents ] elif self.components.keys() == []: # no components exist #print "no components" return else: #print "Bug ??" return dx,dy = delta while step > 1: # one grid dx, dy = (dx * self.xGridSize, dy * self.yGridSize) step = step/2 rx,ry = (1,1) if grid or self.alignToGrid: rx, ry = (self.xGridSize, self.yGridSize) for name in theList: x, y = self.components[name].position # for now I'm only going to align to grid # in the direction of the cursor movement if dx: x = (x + dx) / rx * rx elif dy: y = (y + dy) / ry * ry else: print "no movement ??" self.components[name].position = (x, y) # make sure sizing handles follow component if self.multipleComponents: self.showMultiSizingHandles() else: ###self.startName = name self.showSizingHandles(name) # update the position on the propertyEditor status bar self.setToolTipDrag(name, (x, y), self.components[name].size) self.propertyEditorWindow.updateSingleProperty(self.startName, 'position', (x,y)) def on_keyPress(self, event): keyCode = event.GetKeyCode() cmdKey = event.CmdDown() shiftKey = event.ShiftDown() keyDeltas = {wx.WXK_LEFT: (-1,0), wx.WXK_UP: (0,-1), wx.WXK_RIGHT: (1,0), wx.WXK_DOWN: (0,1)} if not keyCode in keyDeltas.keys(): return dx,dy = keyDeltas[keyCode] grid = False step = 1 if cmdKey or self.alignToGrid: step = 2 grid = True if shiftKey: step = step*2 self.nudge((dx,dy),step, grid) def terminate_marquee(self, cmdKey, shiftKey): # erase the last rect ## print self.marqueeSize self.dc.DrawRectanglePointSize((self.marqueeBase[0], self.marqueeBase[1]), (self.marqueeSize[0], self.marqueeSize[1])) if self.marqueeSize == (0,0) and not shiftKey and not cmdKey: # just a click - deselect anything if self.multipleSelected: self.clearMultipleComponentSelection() # but remain in multi mode # self.multipleSelected = False ## and switch back to single-mode, with the last select comp if known. self.multipleSelected = False self.propertyEditorWindow.clearComponentList() self.propertyEditorWindow.displayComponents(self.components) if self.startName: name = self.startName else: s = self.lastSelection if s: name, klass = s.split(" : ") else: name = None if self.startName <> name: self.startName = name if self.application.pw is not None and name: self.application.pw.selectComponentsList(name, klass) # KEA 2002-02-23 if name: self.propertyEditorWindow.selectComponentList(name, klass) elif self.startName: self.hideSizingHandles() self.startName = None return #print "selct anything within", self.startGlobalPosition, self.marqueeSize res = self.controlInRect(self.startGlobalPosition, self.marqueeSize) self.marquee = False #print "we found", res if res == []: return self.switchToMultipleMode() # new selection - delete any existing selections if not shiftKey and not cmdKey: self.clearMultipleComponentSelection() for name in res: index = self.prefixIndexForComp(name) if index == -1: # not already there - add unless "remove only" if not (cmdKey and shiftKey): self.multipleComponents.append( (name, self.makeNewHandles(name))) else: # already there - remove if toggle or remove if cmdKey: prefix = self.multipleComponents[index][1] for sizingHandle in self.sizingHandleNames: del self.components[prefix+sizingHandle] del self.multipleComponents[index] self.propertyEditorWindow.updateComponentList() return def on_mouseUp(self, event): # protect against double-clicks in the open file dialog # when switching rsrc.py files ####print "on_mouseUp BEFORE", self.rect cmdKey = event.CmdDown() shiftKey = event.ShiftDown() if self.marquee: self.terminate_marquee(cmdKey, shiftKey) return # no marquee if self.startName in self.components: if self.movingComponent: self.dc.DrawRectanglePointSize((self.lastPosition[0], self.lastPosition[1]), (self.startSize[0], self.startSize[1])) self.components[self.startName].position = (self.lastPosition[0], self.lastPosition[1]) #print "on_mouseUp", self.lastPosition self.panel.Refresh() self.movingComponent = False if wx.Platform == '__WXMAC__': ##if self.lastCaptured is not None: ## self.lastCaptured.ReleaseMouse() ## self.lastCaptured = None #event.target.ReleaseMouse() # clear up drag artifacts self.Refresh() if wx.Platform == '__WXGTK__': ##if self.lastCaptured is not None: ## self.lastCaptured.ReleaseMouse() ## self.lastCaptured = None #event.target.ReleaseMouse() self.Refresh() self.showSizingHandles(self.startName) self.resizingHandleTarget = None #self.setToolTip(self.components[self.startName]) #self.components[self.startName].toolTip = self.startToolTip return if self.multipleSelected: if self.movingComponent: self.dc.DrawRectanglePointSize((self.lastPosition[0], self.lastPosition[1]), (self.startSize[0], self.startSize[1])) for c,pre in self.multipleComponents: x,y = self.components[c].position nx = x + self.lastPosition[0] - self.startPosition[0] ny = y + self.lastPosition[1] - self.startPosition[1] #print c, x,y, nx,ny self.components[c].position = nx,ny #print "on_mouseUp", self.lastPosition self.panel.Refresh() self.movingComponent = False if wx.Platform == '__WXMAC__': ##if self.lastCaptured is not None: ## self.lastCaptured.ReleaseMouse() ## self.lastCaptured = None #event.target.ReleaseMouse() # clear up drag artifacts self.Refresh() if wx.Platform == '__WXGTK__': ##if self.lastCaptured is not None: ## self.lastCaptured.ReleaseMouse() ## self.lastCaptured = None #event.target.ReleaseMouse() self.Refresh() self.showMultiSizingHandles() # KEA 2001-12-24 # I need to refactor the common elements of the resizing handle code # I also want to add a Component info window to show the component # name, position, size as the component is moved and resized # THe 2002-08-29 # Refactored the common elements of resizing handle code. def doResize(self, event, (n, w, s, e)): if not self.startName: return # AGT 2005-05-17 Removed obsolete Windows variant globalPosition = wx.GetMousePosition() x, y = self.components[self.resizingHandleTarget].ScreenToClient(globalPosition) xOffset = x - self.offset[0] yOffset = y - self.offset[1] xStartOffset = self.startPosition[0] + e * xOffset yStartOffset = self.startPosition[1] + n * yOffset if self.alignToGrid: xOffset = xOffset / self.xGridSize * self.xGridSize yOffset = yOffset / self.yGridSize * self.yGridSize xStartOffset = xStartOffset / self.xGridSize * self.xGridSize yStartOffset = yStartOffset / self.yGridSize * self.yGridSize width = self.startSize[0] + (w - e) * xOffset height = self.startSize[1] + (s - n) * yOffset self.components[self.startName].position = (xStartOffset, yStartOffset) self.components[self.startName].size = (width, height) self.setToolTip(self.components[self.startName]) self.propertyEditorWindow.updateSingleProperty(self.startName, 'position', (xStartOffset, yStartOffset)) self.propertyEditorWindow.updateSingleProperty(self.startName, 'size', (width, height)) def on_topLeft_mouseDrag(self, event): if self.marquee: self.on_mouseDrag(event) return self.doResize(event, (1, 0, 0, 1)) def on_topMiddle_mouseDrag(self, event): if self.marquee: self.on_mouseDrag(event) return self.doResize(event, (1, 0, 0, 0)) def on_topRight_mouseDrag(self, event): if self.marquee: self.on_mouseDrag(event) return self.doResize(event, (1, 1, 0, 0)) def on_middleLeft_mouseDrag(self, event): if self.marquee: self.on_mouseDrag(event) return self.doResize(event, (0, 0, 0, 1)) def on_middleRight_mouseDrag(self, event): if self.marquee: self.on_mouseDrag(event) return self.doResize(event, (0, 1, 0, 0)) def on_bottomLeft_mouseDrag(self, event): if self.marquee: self.on_mouseDrag(event) return self.doResize(event, (0, 0, 1, 1)) def on_bottomMiddle_mouseDrag(self, event): if self.marquee: self.on_mouseDrag(event) return self.doResize(event, (0, 0, 1, 0)) def on_bottomRight_mouseDrag(self, event): if self.marquee: self.on_mouseDrag(event) return self.doResize(event, (0, 1, 1, 0)) def saveChanges(self): if self.filename is None: filename = "Untitled" else: filename = self.filename msg = "The data in the %s file has changed.\n\nDo you want to save the changes?" % filename result = dialog.messageDialog(self, msg, 'resourceEditor', wx.ICON_EXCLAMATION | wx.YES_NO | wx.CANCEL) return result.returnedString def newFile(self, fullTemplatePath): """ KEA 2003-07-31 the logic of where templates come from, the user selecting a template, prompting to save, etc. should be refactored especially if we are going to support a pythoncard_config/resourceEditor/templates directory for user-specific resource/code templates for now we'll assume a single templates dir and put the save logic here also need to decide if resourceEditor should startup differently like not showing a new layout to begin with maybe have an option to start with a new project prompt, open resource dialog, or none so user can select from the history (always lots of UI decisions ;-) """ # prompt to save # user will probably end up creating a new dir # and changing the filename templatePath, templateFilename = os.path.split(fullTemplatePath) #print path, filename # have the user save the source or resource?! wildcard = "Python files (*.py)|*.py" # don't set the starting dir, let user navigate result = dialog.saveFileDialog(None, "Save As", "", templateFilename[:-8] + ".py", wildcard) if result.accepted: path = result.paths[0] if path.endswith('.rsrc.py'): basepath = os.path.splitext(os.path.splitext(path)[0])[0] elif path.endswith('.py'): basepath = os.path.splitext(path)[0] else: # user didn't use a .py extension? # should this be an error? basepath = path #print basepath # now we need to copy and rename the # template files to the user chosen location import shutil destPath, destFilename = os.path.split(basepath) # copy the .py file fname = os.path.join(templatePath, templateFilename[:-8] + ".py") tname = os.path.join(destPath, destFilename + ".py") #print "copying", tname shutil.copy(fname, tname) # copy the .rsrc.py file fname = os.path.join(templatePath, templateFilename) tname = os.path.join(destPath, destFilename + ".rsrc.py") #print "copying", tname shutil.copy(fname, tname) self.filename = tname #print self.filename else: # present a dialog instead?! return self.resetAndClearWidgets() path = os.path.join(self.filename) self.rsrc = resource.ResourceFile(path).getResource() ##self.filename = None self.updatePanel(self.rsrc) if self.editingDialog: comp = self.rsrc.components else: comp = self.rsrc.application.backgrounds[0].components for w in comp: self.components[w.name] = w self.rebindEventsForDragging() self.documentChanged = False # could change the resource and title bar # here to give the user more feedback def saveFile(self): if self.filename is None: return self.on_menuFileSaveAs_select(None) else: ##desc = self.resourceAttributes() desc = multiresourceOutput.resourceAttributes(self) try: f = open(self.filename, 'w') f.write(desc) f.close() self.documentChanged = False self.fileHistory.AddFileToHistory(self.filename) return True except Exception, e: message = 'The resource file could not be saved.\n' + str( e ) dialog.messageDialog(self, message, 'ResourceEditor Error', wx.ICON_EXCLAMATION | wx.OK) return False def revertFile(self): self.resetAndClearWidgets() if self.filename is None: path = os.path.join(self.application.applicationDirectory, 'templates', \ RESOURCE_TEMPLATE) self.rsrc = resource.ResourceFile(path).getResource() else: self.rsrc = resource.ResourceFile(self.filename).getResource() self.updatePanel(self.rsrc) # KEA 2002-03-24 # either we're editing a Background or a Dialog if self.editingDialog: comp = self.rsrc.components else: comp = self.rsrc.application.backgrounds[0].components for w in comp: self.components[w.name] = w self.rebindEventsForDragging() self.documentChanged = False def getNewFileTemplates(self): templatesDir = os.path.join(self.application.applicationDirectory, 'templates') fileList = os.listdir(templatesDir) #fileList.sort() templates = [] for filename in fileList: # get 'title' path = os.path.join(templatesDir, filename) if os.path.isfile(path): try: rsrc = resource.ResourceFile(path).getResource() try: templates.append((rsrc.application.backgrounds[0].title, path, 'background')) except: templates.append((rsrc.title, path, 'dialog')) except: # not a resource file pass templates.sort() return templates def doNewFile(self): templates = self.getNewFileTemplates() listX = [] for t in templates: #print t[0], t[2], t[1] listX.append(t[0]) result = dialog.singleChoiceDialog(self, "Choose a resource template", "Templates", listX) if result.accepted: name = result.selection for t in templates: if t[0] == name: filename = t[1] self.newFile(filename) def on_menuFileNew_select(self, event): if self.documentChanged: save = self.saveChanges() if save == "Cancel": # don't do anything, just go back to editing pass elif save == "No": # any changes will be lost #self.newFile(RESOURCE_TEMPLATE) self.doNewFile() else: if self.filename is None: if self.on_menuFileSaveAs_select(None): #self.newFile(RESOURCE_TEMPLATE) self.doNewFile() else: self.saveFile() #self.newFile(RESOURCE_TEMPLATE) self.doNewFile() else: #self.newFile(RESOURCE_TEMPLATE) self.doNewFile() def on_menuFileNewDialog_select(self, event): if self.documentChanged: save = self.saveChanges() if save == "Cancel": # don't do anything, just go back to editing pass elif save == "No": # any changes will be lost self.newFile(RESOURCE_DIALOG_TEMPLATE) else: if self.filename is None: if self.on_menuFileSaveAs_select(None): self.newFile(RESOURCE_DIALOG_TEMPLATE) else: self.saveFile() self.newFile(RESOURCE_DIALOG_TEMPLATE) else: self.newFile(RESOURCE_DIALOG_TEMPLATE) def on_menuFileSave_select(self, event): self.saveFile() def on_menuFileSaveAs_select(self, event): if self.filename is None: path = '' filename = '' else: path, filename = os.path.split(self.filename) wildcard = "resource files (*.rsrc.py)|*.rsrc.py" result = dialog.saveFileDialog(None, "Save As", path, filename, wildcard) if result.accepted: path = result.paths[0] # KEA 2002-06-01 # force .rsrc.py extension # the one problem with this is that # the user won't be prompted for an overwrite # of a .rsrc.py file if they didn't enter that # in the save as dialog if not path.endswith('.rsrc.py'): path = os.path.splitext(path)[0] + '.rsrc.py' ##desc = self.resourceAttributes() desc = multiresourceOutput.resourceAttributes(self) try: f = open(path, 'w') f.write(desc) f.close() self.filename = path self.documentChanged = False return True except: return False else: return False def on_menuFileRevert_select(self, event): if self.documentChanged: if self.filename is None: filename = "Untitled" else: filename = self.filename msg = "You will lose any changes you've made to %s.\n\nAre you sure you want to revert to the last saved version?" % filename result = dialog.messageDialog(self, msg, 'resourceEditor', wx.ICON_EXCLAMATION | wx.YES_NO | wx.CANCEL | wx.NO_DEFAULT) save = result.returnedString if save == "Cancel" or save == "No": # don't do anything, just go back to editing pass else: # any changes will be lost self.revertFile() else: self.revertFile() def resetAndClearWidgets(self): self.startName = None self.multipleSelected = False self.multipleComponents = [] self.startPosition = (0, 0) self.startSize = (0, 0) self.offset = (0, 0) if self.application.pw is not None: if wx.Platform == '__WXMAC__': self.application.pw.selectComponentsList('topLeft', 'Image') else: self.application.pw.selectComponentsList('topLeft', 'ImageButton') # KEA 2002-02-23 self.propertyEditorWindow.clearComponentList() self.propertyEditorWindow.clearPropertyList() self.hideSizingHandles() self.clearWidgets() def openFile(self, path): self.resetAndClearWidgets() os.chdir(os.path.dirname(path)) self.filename = path rsrc = resource.ResourceFile(path).getResource() self.rsrc = rsrc self.updatePanel(self.rsrc) # KEA 2002-03-24 # either we're editing a Background or a Dialog if self.editingDialog: comp = self.rsrc.components else: comp = self.rsrc.application.backgrounds[0].components for w in comp: self.components[w.name] = w self.rebindEventsForDragging() self.documentChanged = False self.fileHistory.AddFileToHistory(self.filename) def doOpenFile(self): wildcard = "resource files (*.rsrc.py)|*.rsrc.py" result = dialog.openFileDialog(None, "Import which resource file?", '', '', wildcard) if result.accepted: self.openFile(result.paths[0]) def on_menuFileOpen_select(self, event): if self.documentChanged: save = self.saveChanges() if save == "Cancel": # don't do anything, just go back to editing pass elif save == "No": # any changes will be lost self.doOpenFile() else: if self.filename is None: if self.on_menuFileSaveAs_select(None): self.doOpenFile() else: self.saveFile() self.doOpenFile() else: self.doOpenFile() def on_menuHelpAbout_select(self, event): dialog.scrolledMessageDialog(self, self.readme, 'About resourceEditor...') def on_doHelpAboutPythonCard_command(self, event): about.aboutPythonCardDialog(self) def clearMultipleComponentSelection(self): changes = 0 for c,prefix in self.multipleComponents: changes += 1 for sizingHandle in self.sizingHandleNames: del self.components[prefix+sizingHandle] self.multipleComponents = [] if wx.Platform == '__WXMAC__' and changes > 0: self.panel.Refresh() def fixComponentOrder(self, name): # KEA 2005-12-23 # Lower() doesn't appear to always work correctly, # so use Raise instead with a reversed list r = self.components.order[:] r.reverse() for c in r: self.components[c].Raise() if self.application.pw is not None: self.application.pw.clearComponentsList() self.application.pw.displayComponents(self.components) if name: self.application.pw.selectComponentsList(name, self.components[name].__class__.__name__) # KEA 2002-02-23 ##self.propertyEditorWindow.Freeze() if not self.multipleSelected: self.propertyEditorWindow.clearComponentList() self.propertyEditorWindow.displayComponents(self.components) if name: self.propertyEditorWindow.selectComponentList(name, self.components[name].__class__.__name__) ##self.propertyEditorWindow.Thaw() def generateUniqueName(self, name): i = 1 if name == "": name = "a" while True: if name + str(i) not in self.components: return name+str(i) i += 1 def convertToValidName(self, v): # and make it into a valid name parts = v.split(' ') if len(parts) > 1: newparts = [p.lower().capitalize() for p in parts] newparts[0] = newparts[0].lower() v = ''.join(newparts) newv = '' if v == "": v = "a" for c in v: if newv == '': if c in string.ascii_letters: newv += c elif c in string.ascii_letters or c in string.digits or c in '_': newv += c return newv def deriveNameFromLabel(self, desc): if 'label' in desc.keys(): v = desc['label'] elif 'text' in desc.keys(): v = desc['text'] else: v = "" newv = self.convertToValidName(v) desc['name'] = newv def deriveLabelFromName(self, desc): if 'label' in desc.keys(): desc['label'] = desc['name'] elif 'text' in desc.keys(): desc['text'] = desc['name'] def create_component(self, desc): optionalAttributes = registry.Registry.getInstance().components[desc['type']]._spec._optionalAttributes.keys() if 'label' in optionalAttributes: desc['label'] = desc['name'] elif 'text' in optionalAttributes: desc['text'] = desc['name'] self.deriveLabelFromName(desc) name = desc['name'] self.components[name] = desc # offset the widget so that it isn't underneath the original x, y = self.components[name].position dx, dy = self.components[name].size #rint x, y, dx, dy if self.offsets == 'horizontal': x += dx+30 elif self.offsets == 'vertical': y += dy+30 elif self.offsets == 'both': x += dx+30 y += dy+30 else: x += 10 y += 10 self.components[name].position = (x, y) self.clearMultipleComponentSelection() # KEA 2001-12-20 # hack to insert component so that it is the first one # in the list # a similar trick will be needed for re-ordering widgets self.components.order.remove(name) self.components.order.insert(NUM_SIZING_HANDLES, name) self.fixComponentOrder(name) self.startName = name self.startPosition = self.components[self.startName].position self.startSize = self.components[self.startName].size self.offset = (0, 0) self.showSizingHandles(name) self.documentChanged = True c = self.components[self.startName] wx.EVT_LEFT_DOWN(c, self.on_mouseDown) wx.EVT_LEFT_UP(c, self.on_mouseUp) wx.EVT_MOTION(c, self.on_mouseDrag) ## name = result.name ## if name in self.components: ## dialog.alertDialog(self, name + " already exists", 'Error: Unable to '+errString+' widget') ## return ## if 'label' in optionalAttributes: ## desc['label'] = result.labelortext ## elif 'text' in optionalAttributes: ## desc['text'] = result.labelortext ## ## desc['name'] = name ## self.components[name] = desc ## if offsets: ## # offset the widget so that it isn't underneath the original ## x, y = self.components[name].position ## dx, dy = self.components[name].size ## #rint x, y, dx, dy ## if result.horizontal: ## x += dx+30 ## if result.vertical: ## y += dy+30 ## else: ## if result.vertical: ## y += dy+30 ## else: ## x += 10 ## y += 10 ## #rint " => ", x, y ## self.components[name].position = (x, y) ## ## self.clearMultipleComponentSelection() ## # KEA 2001-12-20 ## # hack to insert component so that it is the first one ## # in the list ## # a similar trick will be needed for re-ordering widgets ## self.components.order.remove(name) ## self.components.order.insert(NUM_SIZING_HANDLES, name) ## self.fixComponentOrder(name) ## ## self.startName = name ## self.startPosition = self.components[self.startName].position ## self.startSize = self.components[self.startName].size ## self.offset = (0, 0) ## self.showSizingHandles(name) ## self.documentChanged = True ## ## c = self.components[self.startName] ## wx.EVT_LEFT_DOWN(c, self.on_mouseDown) ## wx.EVT_LEFT_UP(c, self.on_mouseUp) ## wx.EVT_MOTION(c, self.on_mouseDrag) def on_componentDuplicate_command(self, event): if self.startName in self.components: aWidget = self.components[self.startName] # now loop through the original widget and build a dictionary suitable # for making a copy d = {} d['type'] = aWidget.__class__.__name__ #for key in aWidget._getAttributeNames(): attributes = aWidget._spec.getAttributes().keys() attributes.sort() for key in attributes: # I'm not exactly sure why I have to special-case these tuples if key == 'bitmap': # this should get recreated from the file attribute pass elif key == "id": # must avoid duplicate IDs pass elif key in ['position', 'size']: d[key] = getattr(aWidget, key) elif getattr(aWidget, key) is not None: d[key] = getattr(aWidget, key) d['name'] = self.generateUniqueName(d['name']) #print d self.create_component(d) def on_componentDelete_command(self, event): if self.startName in self.components: aWidget = self.components[self.startName] msg = "Are you sure you want to delete %s %s?" % (aWidget.__class__.__name__, aWidget.name) elif self.multipleSelected: if len(self.multipleComponents) == 0: return nameList = [ x[0] for x in self.multipleComponents ] if len(self.multipleComponents) == 1: msg = "Are you sure you want to Delete this component ?" else: msg = "Are you sure you want to Delete %d components?" % (len(self.multipleComponents)) result = dialog.messageDialog(self, msg, 'Delete Component', wx.ICON_INFORMATION | wx.YES_NO | wx.NO_DEFAULT) if result.accepted: if self.multipleSelected: self.hideMultiSizingHandles() for name in nameList: del self.components[name] else: self.hideSizingHandles() del self.components[aWidget.name] self.documentChanged = True def on_componentAdd_command(self, event): # event.target.name will be something like # menuComponentAddButton, so the first 16 characters # can be thrown away to get the component name className = event.target.name[16:] # find a unique name # find a unique name name = self.generateUniqueName(className) desc = registry.Registry.getInstance().components[className]._spec.getMinimalResourceDict(name) desc['name'] = name desc['position'] = (10, 10) self.create_component(desc) def readingOrder(self, c1, c2): # compare two components to determine which is "earlier" in reading order ## print c1, self.components[c1].position, self.components[c1].size ## print c2, self.components[c2].position, self.components[c2].size if self.components[c1].position[1] + self.components[c1].size[1] < self.components[c2].position[1]: return -1 if self.components[c2].position[1] + self.components[c2].size[1] < self.components[c1].position[1]: return 1 if self.components[c1].position[0] < self.components[c2].position[0]: return -1 return 1 def moveList(self, tomove, dir, readingOrderFlag = False): list = copy.copy(self.components.order) # first remove all but the first (base) one of the tomove list from main list for x in tomove[1:]: if x in list: list.remove(x) # now we can get the proper relative index for the first one i = list.index(tomove[0]) # and then remove it if tomove[0] in list: list.remove(tomove[0]) j = i+dir if readingOrderFlag: sortlist = [ (x) for x in tomove ] #print sortlist sortlist.sort(self.readingOrder) #print sortlist newmove = [ name for name in sortlist ] tomove = newmove if j+len(tomove) > len(list): list = list + tomove elif j <= NUM_SIZING_HANDLES: j = NUM_SIZING_HANDLES list = list[:NUM_SIZING_HANDLES] + tomove + list[NUM_SIZING_HANDLES:] else: list = list[:j] + tomove + list[j:] if list <> self.components.order: while len(self.components.order): self.components.order.remove(self.components.order[0]) for c in list: self.components.order.append(c) self.fixComponentOrder(self.startName) def on_componentSendBack_command(self, event): self.on_componentMoveBack_command(event, len(self.components)) def on_componentMoveBack_command(self, event, distance = 1): if self.startName in self.components: self.moveList([self.startName], distance) elif self.multipleSelected: self.moveList([ x[0] for x in self.multipleComponents ], distance) def on_componentMoveTogether_command(self, event): # useful to re-order multiple components without changing relative to non-selected ones if self.multipleSelected: self.moveList([ x[0] for x in self.multipleComponents ], 0) def on_componentRelayer_command(self, event): # useful to re-order multiple components without changing relative to non-selected ones if self.multipleSelected: self.moveList([ x[0] for x in self.multipleComponents ], 0, True) def on_componentMoveForward_command(self, event): self.on_componentMoveBack_command(event, -1) def on_componentBringFront_command(self, event): self.on_componentMoveBack_command(event, -len(self.components)) def on_componentSelectAll_command(self, event): #Reset component list on the property editor self.clearMultipleComponentSelection() self.multipleSelected = False self.propertyEditorWindow.clearComponentList() self.propertyEditorWindow.displayComponents(self.components) res = self.propertyEditorWindow.components.wComponentList.items if res == []: return self.marquee = False self.switchToMultipleMode() self.clearMultipleComponentSelection() for ctrline in res: name = ctrline.split(" : ")[0] self.multipleComponents.append( (name, self.makeNewHandles(name))) self.propertyEditorWindow.updateComponentList() return def on_displayAttributes_command(self, event): ##desc = self.resourceAttributes() desc = multiresourceOutput.resourceAttributes(self) dialog.scrolledMessageDialog(self, desc, 'Resource') def on_menuViewPropertyEditor_select(self, event): self.propertyEditorWindow.visible = not self.propertyEditorWindow.visible def updatePanel(self, rsrc): # KEA 2002-03-24 # this will need to update different parameters # depending on whether we're editing a background or dialog self.editingDialog = False try: background = rsrc.application.backgrounds[0] except: dlg = self.rsrc self.editingDialog = True # unhook the grid drawing and then rebind later if necessary if self.showGridLines: self.panel.Unbind(wx.EVT_ERASE_BACKGROUND) if self.editingDialog: self.menuBar.setEnabled('menuFileRun', False) self.menuBar.setEnabled('menuFileRunWithInterpreter', False) self.menuBar.setEnabled('menuFilePreviewDialog', True) self.menuBar.setEnabled('menuEditBackgroundInfo', False) self.menuBar.setEnabled('menuEditMenubar', False) self.menuBar.setEnabled('menuEditDialogInfo', True) self.title = dlg.title self._createStatusBar(dlg) self.position = dlg.position #self.setSize((dlg.size[0], dlg.size[1] + 20)) self.size = dlg.size self.setImage('') self.setTiled(False) self.panel._imageFile = self.image self.panel._backgroundTiling = self.tiled defaultBgColor = wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DFACE) self.backgroundColor = defaultBgColor self.panel.Disconnect(-1, -1, wx.wxEVT_ERASE_BACKGROUND) self.panel._bitmap = None else: self.menuBar.setEnabled('menuFileRun', True) self.menuBar.setEnabled('menuFileRunWithInterpreter', True) self.menuBar.setEnabled('menuFilePreviewDialog', False) self.menuBar.setEnabled('menuEditBackgroundInfo', True) self.menuBar.setEnabled('menuEditMenubar', True) self.menuBar.setEnabled('menuEditDialogInfo', False) self.title = background.title self._createStatusBar(background) self.position = background.position if background.menubar is None: #self.setSize((background.size[0], background.size[1] + 20)) self.size = background.size else: self.size = background.size self.setImage(background.image) self.setTiled(background.tiled) self.panel._imageFile = self.image self.panel._backgroundTiling = self.tiled defaultBgColor = wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DFACE) self.backgroundColor = defaultBgColor self.foregroundColor = background.foregroundColor self.backgroundColor = background.backgroundColor if self.image is not None : self.panel._bitmap = graphic.Bitmap(self.image) wx.EVT_ERASE_BACKGROUND( self.panel, self.panel.onEraseBackground ) else: self.panel.Disconnect(-1, -1, wx.wxEVT_ERASE_BACKGROUND) self.panel._bitmap = None self.movingComponent = False self.resizingHandleTarget = None if self.showGridLines: self.panel.Bind(wx.EVT_ERASE_BACKGROUND, self.drawPanelGridLines) self.panel.Refresh() def drawPanelGridLines(self, event): dc = event.GetDC() if not dc : dc = wx.ClientDC(self.panel) r = self.panel.GetUpdateRegion().GetBox() dc.SetClippingRegion(r.x, r.y, r.width, r.height) # need to set the background color to the default panel color brush = dc.GetBackground() brush.SetColour(self.panel.GetBackgroundColour()) dc.SetBackground(brush) dc.Clear() # should the color be settable by the user and then save # that in the prefs? dc.SetPen(wx.Pen('darkgray', 1, wx.SOLID)) w, h = self.panel.size xgrid = self.xGridSize ygrid = self.yGridSize nx = w / xgrid ny = h / ygrid for x in range(1, nx + 1): dc.DrawLine(x * xgrid, 0, x * xgrid, h) for y in range(1, ny + 1): dc.DrawLine(0, y * ygrid, w, y * ygrid) def rebindEventsForDragging(self): for name in self.components.order: if name not in self.sizingHandleNames: #print name c = self.components[name] wx.EVT_LEFT_DOWN(c, self.on_mouseDown) wx.EVT_LEFT_UP(c, self.on_mouseUp) wx.EVT_MOTION(c, self.on_mouseDrag) # KEA 2004-08-12 # for each of the dialogs below, the code should be refactored # so that the dialog modules have a function wrapper and the # result contains whatever attributes would be needed # the function should probably not have side-effects def on_fileRunOptions_command(self, event): result = runOptionsDialog.runOptionsDialog(self, self.cmdLineArgs) if result.accepted: self.cmdLineArgs['debugmenu'] = result.debugmenu self.cmdLineArgs['logging'] = result.logging self.cmdLineArgs['messagewatcher'] = result.messagewatcher self.cmdLineArgs['namespaceviewer'] = result.namespaceviewer self.cmdLineArgs['propertyeditor'] = result.propertyeditor self.cmdLineArgs['shell'] = result.shell self.cmdLineArgs['otherargs'] = result.otherargs def on_editStackInfo_command(self, event): result = stackInfoDialog.stackInfoDialog(self, self.rsrc) if result.accepted: self.rsrc.application.name = result.text self.documentChanged = True # need to change the logic so that self.rsrc # and the current window are updated def on_editBackgroundInfo_command(self, event): background = self.rsrc.application.backgrounds[0] background.position = self.GetPositionTuple() background.size = self.GetSizeTuple() result = backgroundInfoDialog.backgroundInfoDialog(self, background) if result.accepted: background.name = result.name background.title = result.title background.position = result.position background.size = result.size background.statusBar = result.statusBar background.foregroundColor = result.foregroundColor background.backgroundColor = result.backgroundColor background.image = result.image background.tiled = result.tiled background.visible = result.visible background.style = result.style background.icon = result.icon self.updatePanel(self.rsrc) self.documentChanged = True # need to change the logic so that self.rsrc # and the current window are updated def on_editDialogInfo_command(self, event): background = self.rsrc background.position = self.GetPositionTuple() background.size = self.GetSizeTuple() result = dialogInfoDialog.dialogInfoDialog(self, background) if result.accepted: background.name = result.name background.title = result.title background.position = result.position background.size = result.size self.updatePanel(self.rsrc) self.documentChanged = True def on_editMenubar_command(self, event): try: menubar = self.rsrc.application.backgrounds[0].menubar except: menubar = None result = menuDialog.menuDialog(self, menubar) if result.accepted: self.rsrc.application.backgrounds[0].menubar = result.menubar self.documentChanged = True def on_editStrings_command(self, event): stringList = {} try: if self.editingDialog: strings = self.rsrc.strings else: strings = self.rsrc.application.backgrounds[0].strings for s in strings.__dict__: stringList[s] = strings.__dict__[s] except: stringList = {} result = stringDialog.stringDialog(self, stringList) if result.accepted: if self.editingDialog: self.rsrc.strings = result.stringList else: self.rsrc.application.backgrounds[0].strings = result.stringList self.documentChanged = True def on_optionGridSize_command(self, event): result = dialog.textEntryDialog(self, 'Enter the preferred grid size (e.g. 5):', 'Grid Size', str(self.xGridSize)) if result.accepted: try: size = int(result.text) self.xGridSize = size self.yGridSize = size if self.showGridLines: self.panel.Refresh() except: # should probably do an alert dialog here pass def on_menuOptionsAlignToGrid_select(self, event): self.alignToGrid = self.menuBar.getChecked('menuOptionsAlignToGrid') def on_menuOptionsShowGridLines_select(self, event): self.showGridLines = self.menuBar.getChecked('menuOptionsShowGridLines') if self.showGridLines: self.panel.Bind(wx.EVT_ERASE_BACKGROUND, self.drawPanelGridLines) else: self.panel.Unbind(wx.EVT_ERASE_BACKGROUND) self.panel.Refresh() def getCommandLineArgs(self): args = ' ' if self.cmdLineArgs['debugmenu']: args += '-d ' if self.cmdLineArgs['logging']: args += '-l ' if self.cmdLineArgs['messagewatcher']: args += '-m ' if self.cmdLineArgs['namespaceviewer']: args += '-n ' if self.cmdLineArgs['propertyeditor']: args += '-p ' if self.cmdLineArgs['shell']: args += '-s ' """ if self.menuBar.getChecked('menuOptionsLogging'): args += '-l ' if self.menuBar.getChecked('menuOptionsMessageWatcher'): args += '-m ' if self.menuBar.getChecked('menuOptionsNamespaceViewer'): args += '-n ' if self.menuBar.getChecked('menuOptionsPropertyEditor'): args += '-p ' if self.menuBar.getChecked('menuOptionsShell'): args += '-s ' """ return args def previewDialog(self): if self.filename is None: # KEA 2002-03-25 # should probably present an error dialog here return dlg = DummyDialog(self, self.filename) dlg.showModal() dlg.destroy() def on_filePreviewDialog_command(self, event): # we should prompt to save the .rsrc.py file if needed # or in the case of a new file, do a save as before attempting # to do a preview self.previewDialog() def runScript(self, useInterpreter): # KEA 2004-05-08 # auto-save code taken from codeEditor if self.filename is None: save = self.saveChanges() if save == "Cancel" or save == "No": # don't do anything, just go back to editing return else: if not self.on_menuFileSaveAs_select(None): # they didn't actually save, just go back # to editing return elif self.documentChanged: # auto-save self.saveFile() if self.filename is None: # KEA 2002-03-25 # should probably present an error dialog here return # this algorithm, taken from samples.py assumes the rsrc.py file and the main # program file have the same basename # if that isn't the case then this doesn't work and we need a different solution path, filename = os.path.split(self.filename) name = filename.split('.')[0] if os.path.exists(os.path.join(path, name + ".pyw")): filename = '"' + os.path.join(path, name + ".pyw") + '"' else: filename = '"' + os.path.join(path, name + ".py") + '"' # the args should come from a dialog or menu items that are checked/unchecked args = self.getCommandLineArgs() if useInterpreter: interp = ' -i ' else: interp = ' ' if sys.platform.startswith('win'): # KEA 2002-03-06 # always launch with console in the resourceEditor for debugging purposes python = os.path.join(os.path.dirname(sys.executable), 'python.exe') if ' ' in python: pythonQuoted = '"' + python + '"' else: pythonQuoted = python if useInterpreter and os.name != 'nt': os.spawnv(os.P_NOWAIT, python, [pythonQuoted, interp, filename, args]) else: os.spawnv(os.P_NOWAIT, python, [pythonQuoted, interp, filename, args]) else: if ' ' in sys.executable: python = '"' + sys.executable + '"' else: python = sys.executable os.system(python + interp + filename + args + ' &') def on_fileRun_command(self, event): self.runScript(False) def on_fileRunWithInterpreter_command(self, event): self.runScript(True) def copyWidgetDescriptionsToClipboard(self, nameList): desc = "" for name in nameList: widget = self.components[name] desc += multiresourceOutput.widgetAttributes(self, widget) if desc.endswith(',\n'): desc = desc[:-2] clipboard.setClipboard(desc) def on_menuEditCut_select(self, event): if self.components.topLeft.visible and self.startName in self.components: aWidget = self.components[self.startName] nameList = [self.startName] msg = "Are you sure you want to Cut %s %s?" % (aWidget.__class__.__name__, aWidget.name) result = dialog.messageDialog(self, msg, 'Cut Component', wx.ICON_INFORMATION | wx.YES_NO | wx.NO_DEFAULT) elif self.multipleSelected: nameList = [ x[0] for x in self.multipleComponents ] if len(self.multipleComponents) == 0: return if len(self.multipleComponents) == 1: msg = "Are you sure you want to Cut this component ?" else: msg = "Are you sure you want to Cut %d components ?" % (len(self.multipleComponents)) result = dialog.messageDialog(self, msg, 'Cut Component', wx.ICON_INFORMATION | wx.YES_NO | wx.NO_DEFAULT) else: return if result.accepted: self.copyWidgetDescriptionsToClipboard(nameList) if self.multipleSelected: self.hideMultiSizingHandles() else: self.hideSizingHandles() for name in nameList: del self.components[name] self.documentChanged = True def on_menuEditCopy_select(self, event): if self.components.topLeft.visible and self.startName in self.components: nameList = [self.startName] elif self.multipleSelected: nameList = [ x[0] for x in self.multipleComponents ] if len(self.multipleComponents) == 0: return else: return self.copyWidgetDescriptionsToClipboard(nameList) def on_menuEditPaste_select(self, event): # need to figure out the logic of checking the contents # of the clipboard to see if it is something we can use # then checking whether the component already exists # if it exists, prompt for a new name # create the widget desc = clipboard.getClipboard() if not isinstance(desc, str): return # KEA 2004-09-10 # the clipboard is converting newlines to returns # which causes eval to fail if wx.Platform == '__WXMAC__': desc = '\n'.join(desc.splitlines()) # this is VERY dangerous so we need a better way of converting # the text in the clipboard to a dictionary safely start = 0 while desc[start] == "{": end = desc[start:].find('},') if end < 0: if desc[-1] <> "}": break thisdesc = desc[start:] else: thisdesc = desc[start:start+end+1] thisdesc = eval(thisdesc) #print "pasting ", thisdesc['name'] name = thisdesc['name'] thisdesc['name'] = self.generateUniqueName(name) # AGT 2004-07-08 # give dialog to set name self.create_component(thisdesc) if end < 0: break start = start+end+3 def loadConfig(self): try: if not os.path.exists(self.configPath): os.mkdir(self.configPath) path = os.path.join(self.configPath, USERCONFIG) self.config = util.readAndEvalFile(path) if self.config != {}: if 'propertyEditorWindow.position' in self.config: self.propertyEditorWindow.SetPosition(self.config['propertyEditorWindow.position']) if 'history' in self.config: history = self.config['history'] history.reverse() for h in history: self.fileHistory.AddFileToHistory(h) except: self.config = {} def saveConfig(self): self.config['propertyEditorWindow.position'] = self.propertyEditorWindow.GetRestoredPosition() self.config['propertyEditorWindow.size'] = self.propertyEditorWindow.GetRestoredSize() history = [] for i in range(self.fileHistory.GetCount()): history.append(self.fileHistory.GetHistoryFile(i)) self.config['history'] = history try: path = os.path.join(self.configPath, USERCONFIG) f = open(path, "w") pprint.pprint(self.config, f) f.close() except: pass # argh def doExit(self): if self.documentChanged: save = self.saveChanges() if save == "Cancel": return False elif save == "No": return True else: if self.filename is None: return self.on_menuFileSaveAs_select(None) else: return self.saveFile() else: return True def doCleanup(self): # memory leak cleanup for k in self.cursors: self.cursors[k] = None def on_close(self, event): try: # KEA 2004-04-08 # if an exception occurs during on_initialize # then doCleanup and saveConfig could fail because some windows # might not exist, so in that situation just exit gracefully if self.doExit(): self.saveConfig() self.doCleanup() event.skip() except: event.skip() def on_showPythonCardDocumentation_command(self, event): global pythoncard_url webbrowser.open(pythoncard_url) def on_showResourceEditorDocumentation_command(self, event): global resourceeditor_url webbrowser.open(resourceeditor_url) if __name__ == '__main__': # now force the property editor to be enabled #configuration('showPropertyEditor', 1) #configuration('showShell', 1) app = model.Application(ResourceEditor) app.MainLoop() PythonCard-0.8.2/tools/resourceEditor/layoutEditor.rsrc.py0000644000076500007650000002055610361653273023674 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'ResEdit', 'backgrounds': [ {'type':'Background', 'name':'bgDrag', 'title':'Resource Editor', 'size':(316, 166), 'style':['resizeable'], 'menubar': {'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ {'type':'MenuItem', 'name':'menuFileNew', 'label':'&New...\tCtrl+N', }, {'type':'MenuItem', 'name':'menuFileOpen', 'label':'&Open...\tCtrl+O', }, {'type':'MenuItem', 'name':'menuFileSave', 'label':'Save\tCtrl+S', }, {'type':'MenuItem', 'name':'menuFileSaveAs', 'label':'Save &As...', }, {'type':'MenuItem', 'name':'menuFileRevert', 'label':'Revert', }, {'type':'MenuItem', 'name':'fileSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuFileRun', 'label':'&Run\tCtrl+R', 'command':'fileRun', }, {'type':'MenuItem', 'name':'menuFileRunWithInterpreter', 'label':'Run with &interpreter\tCtrl+Shift+R', 'command':'fileRunWithInterpreter', }, {'type':'MenuItem', 'name':'menuFileRunOptions', 'label':'Run Options...', 'command':'fileRunOptions', }, {'type':'MenuItem', 'name':'menuFilePreviewDialog', 'label':'Preview Dialog', 'command':'filePreviewDialog', }, {'type':'MenuItem', 'name':'fileSep2', 'label':'-', }, {'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit', }, ] }, {'type':'Menu', 'name':'menuEdit', 'label':'&Edit', 'items': [ {'type':'MenuItem', 'name':'menuEditCut', 'label':'Cu&t\tCtrl+X', }, {'type':'MenuItem', 'name':'menuEditCopy', 'label':'&Copy\tCtrl+C', }, {'type':'MenuItem', 'name':'menuEditPaste', 'label':'&Paste\tCtrl+V', }, {'type':'MenuItem', 'name':'editSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuComponentDuplicate', 'label':'&Duplicate\tCtrl+U', 'command':'componentDuplicate', }, {'type':'MenuItem', 'name':'menuComponentDelete', 'label':'Delete\tCtrl+D', 'command':'componentDelete', }, {'type':'MenuItem', 'name':'menuSelectAll', 'label':'Select All\tCtrl+A', 'command':'componentSelectAll', }, {'type':'MenuItem', 'name':'componentSep2', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditBackgroundInfo', 'label':'Background Info...', 'command':'editBackgroundInfo', }, {'type':'MenuItem', 'name':'menuEditMenubar', 'label':'Menu Editor...', 'command':'editMenubar', }, {'type':'MenuItem', 'name':'menuEditStrings', 'label':'String Editor...', 'command':'editStrings', }, {'type':'MenuItem', 'name':'menuEditDialogInfo', 'label':'Dialog Info...', 'command':'editDialogInfo', }, ] }, {'type':'Menu', 'name':'menuComponent', 'label':'&Component', 'items': [] }, {'type':'Menu', 'name':'menuOptions', 'label':'&Options', 'items': [ {'type':'MenuItem', 'name':'menuOptionsGridSize', 'label':'Grid Size...', 'command':'optionGridSize', }, {'type':'MenuItem', 'name':'menuOptionsAlignToGrid', 'label':'Align Components to Grid\tCtrl+G', 'checkable':1, }, {'type':'MenuItem', 'name':'menuOptionsShowGridLines', 'label':'Show Grid Lines', 'checkable':1, 'checked':0, }, {'type':'MenuItem', 'name':'componentSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuComponentSendBack', 'label':'Send to Back\tCtrl+1', 'command':'componentSendBack', }, {'type':'MenuItem', 'name':'menuComponentMoveBack', 'label':'Move Backward\tCtrl+2', 'command':'componentMoveBack', }, {'type':'MenuItem', 'name':'menuComponentMoveForward', 'label':'Move Forward\tCtrl+3', 'command':'componentMoveForward', }, {'type':'MenuItem', 'name':'menuComponentBringFront', 'label':'Bring to Front\tCtrl+4', 'command':'componentBringFront', }, ] }, {'type':'Menu', 'name':'menuView', 'label':'&View', 'items': [ {'type':'MenuItem', 'name':'menuViewAttributes', 'label':'&Resource...', 'command':'displayAttributes', }, {'type':'MenuItem', 'name':'menuViewSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuViewPropertyEditor', 'label':'Property Editor\tCtrl+P', 'checkable':1, 'checked':1, }, ] }, {'type':'Menu', 'name':'menuHelp', 'label':'&Help', 'items': [ {'type':'MenuItem', 'name':'menuResourceEditorDocumentation', 'label':'&resourceEditor Documentation...\tF1', 'command':'showResourceEditorDocumentation', }, {'type':'MenuItem', 'name':'menuPythonCardDocumentation', 'label':'&PythonCard Documentation...', 'command':'showPythonCardDocumentation', }, {'type':'MenuItem', 'name':'helpSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuHelpAbout', 'label':'&About resourceEditor...', }, {'type':'MenuItem', 'name':'menuHelpAboutPythonCard', 'label':'About PythonCard...', 'command':'doHelpAboutPythonCard', }, ] }, ] }, 'components': [ ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/tools/resourceEditor/modules/0000755000076500007650000000000010434046773021330 5ustar alexalex00000000000000PythonCard-0.8.2/tools/resourceEditor/modules/__init__.py0000644000076500007650000000003607435020166023433 0ustar alexalex00000000000000# turn modules into a package PythonCard-0.8.2/tools/resourceEditor/modules/backgroundInfoDialog.py0000644000076500007650000001334410332126651025751 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.17 $" __date__ = "$Date: 2005/11/02 12:14:33 $" """ from PythonCard import dialog, model, util, helpful import os import wx ### map wxWindowStyle constants to nice strings styleNames = [ ('wx.MINIMIZE_BOX', 'Include Minimize box'), ('wx.CAPTION', 'Include Caption'), ('wx.MAXIMIZE_BOX', 'Include Maximize box'), ('wx.CLOSE_BOX', 'Include Close box'), ('wx.STAY_ON_TOP', 'Stay on top'), ('wx.SYSTEM_MENU', 'Include System Menu'), ('wx.RESIZE_BORDER', 'Include resize border'), ('wx.FRAME_TOOL_WINDOW', 'Toolbar size frame'), ('wx.FRAME_SHAPED', 'Frame can be shaped') ] class BackgroundInfoDialog(model.CustomDialog): def __init__(self, aBg, rsrc): model.CustomDialog.__init__(self, aBg) self.parent = aBg # if some special setup is necessary, do it here self.components.fldName.text = rsrc.name self.components.fldTitle.text = rsrc.title self.components.fldPosition.text = str(rsrc.position) self.components.fldSize.text = str(rsrc.size) self.components.chkStatusBar.checked = rsrc.statusBar if rsrc.foregroundColor is not None: #self.components.fldForegroundColor.text = colorDescription(rsrc.foregroundColor) self.components.fldForegroundColor.text = str(rsrc.foregroundColor) if rsrc.backgroundColor is not None: #self.components.fldBackgroundColor.text = colorDescription(rsrc.backgroundColor) self.components.fldBackgroundColor.text = str(rsrc.backgroundColor) if rsrc.image is not None: self.components.fldImage.text = rsrc.image self.components.chkTiled.checked = rsrc.tiled self.components.chkVisible.checked = rsrc.visible self.components.btnCustomize.visible = False self.components.btnCustomize.enabled = False if rsrc.style == []: self.components.windowStyle.stringSelection = 'Static' elif rsrc.style == ['resizeable']: self.components.windowStyle.stringSelection = 'Resizeable' else: self.components.windowStyle.stringSelection = 'Custom' self.components.btnCustomize.visible = True self.components.btnCustomize.enabled = True self.style = rsrc.style if rsrc.icon is not None: self.components.fldIcon.text = rsrc.icon def on_windowStyle_select(self, event): if self.components.windowStyle.stringSelection <> 'Custom': self.components.btnCustomize.visible = False self.components.btnCustomize.enabled = False return self.components.btnCustomize.visible = True self.components.btnCustomize.enabled = True self.on_btnCustomize_mouseClick(event) def on_btnCustomize_mouseClick(self, event): styleBoxes = [] for s,text in styleNames: styleBoxes.append( (s, s in self.style, text) ) result = helpful.multiCheckBoxDialog(self, styleBoxes, "Define Custom Window Styles") if result.accepted: self.style = [] for s,val in result.boxes.iteritems(): if val: self.style.append( s ) def on_btnForegroundColor_mouseClick(self, event): result = dialog.colorDialog(self, color=util.colorFromString(self.components.fldForegroundColor.text)) if result.accepted: self.components.fldForegroundColor.text = str(result.color) def on_btnBackgroundColor_mouseClick(self, event): result = dialog.colorDialog(self, color=util.colorFromString(self.components.fldBackgroundColor.text)) if result.accepted: self.components.fldBackgroundColor.text = str(result.color) def on_btnFile_mouseClick(self, event): result = dialog.openFileDialog() if result.accepted: path = result.paths[0] filename = util.relativePath(self.parent.filename, path) self.components.fldImage.text = filename def on_btnIconFile_mouseClick(self, event): wildcard = "Icon Files (*.ico)|*.ico|XPM Files (*.xpm)|*.xpm|All Files (*.*)|*.*" result = dialog.openFileDialog(wildcard=wildcard) if result.accepted: path = result.paths[0] filename = util.relativePath(self.parent.filename, path) self.components.fldIcon.text = filename def backgroundInfoDialog(parent, rsrc): dlg = BackgroundInfoDialog(parent, rsrc) result = dlg.showModal() if result.accepted: result.name = dlg.components.fldName.text result.title = dlg.components.fldTitle.text result.position = eval(dlg.components.fldPosition.text) result.size = eval(dlg.components.fldSize.text) result.statusBar = dlg.components.chkStatusBar.checked result.foregroundColor = util.colorFromString(dlg.components.fldForegroundColor.text) result.backgroundColor = util.colorFromString(dlg.components.fldBackgroundColor.text) if dlg.components.fldImage.text != '': result.image = dlg.components.fldImage.text else: result.image = None result.tiled = dlg.components.chkTiled.checked result.visible = dlg.components.chkVisible.checked if dlg.components.windowStyle.stringSelection == 'Static': result.style = [] elif dlg.components.windowStyle.stringSelection == 'Resizeable': result.style = ['resizeable'] else: result.style = dlg.style if dlg.components.fldIcon.text != '': result.icon = dlg.components.fldIcon.text else: result.icon = None dlg.destroy() return result PythonCard-0.8.2/tools/resourceEditor/modules/backgroundInfoDialog.rsrc.py0000644000076500007650000000630410332126651026717 0ustar alexalex00000000000000{'type':'CustomDialog', 'name':'backgroundInfo', 'title':'Background Info', 'position':(53, 94), 'size':(370, 563), 'components': [ {'type':'Button', 'name':'btnCustomize', 'position':(247, 333), 'label':'Customize', }, {'type':'RadioGroup', 'name':'windowStyle', 'position':(76, 279), 'size':(281, -1), 'items':['Static', 'Resizeable', 'Custom'], 'label':'Window Style', 'layout':'horizontal', 'max':1, 'stringSelection':'Static', }, {'type':'StaticText', 'name':'stcName', 'position':(10, 10), 'text':'Name:', }, {'type':'StaticText', 'name':'stcTitle', 'position':(10, 35), 'text':'Title:', }, {'type':'StaticText', 'name':'stcPosition', 'position':(10, 60), 'text':'Position:', }, {'type':'StaticText', 'name':'stcSize', 'position':(10, 85), 'text':'Size:', }, {'type':'StaticText', 'name':'stcForegroundColor', 'position':(10, 110), 'text':'Foreground color:', }, {'type':'StaticText', 'name':'stcBackgroundColor', 'position':(10, 135), 'text':'Background color:', }, {'type':'StaticText', 'name':'stcImage', 'position':(10, 160), 'text':'Image:', }, {'type':'StaticText', 'name':'stcIcon', 'position':(10, 210), 'text':'Icon:', }, {'type':'TextField', 'name':'fldName', 'position':(130, 5), }, {'type':'TextField', 'name':'fldTitle', 'position':(130, 30), 'size':(188, -1), }, {'type':'TextField', 'name':'fldPosition', 'position':(130, 55), 'size':(80, -1), }, {'type':'TextField', 'name':'fldSize', 'position':(130, 80), 'size':(80, -1), }, {'type':'TextField', 'name':'fldForegroundColor', 'position':(130, 110), }, {'type':'Button', 'name':'btnForegroundColor', 'position':(250, 110), 'label':'Color...', }, {'type':'TextField', 'name':'fldBackgroundColor', 'position':(130, 135), }, {'type':'Button', 'name':'btnBackgroundColor', 'position':(250, 135), 'label':'Color...', }, {'type':'TextField', 'name':'fldImage', 'position':(130, 160), }, {'type':'Button', 'name':'btnFile', 'position':(250, 160), 'label':'File...', }, {'type':'CheckBox', 'name':'chkTiled', 'position':(130, 185), 'size':(135, -1), 'label':'Tile image', }, {'type':'TextField', 'name':'fldIcon', 'position':(130, 210), }, {'type':'Button', 'name':'btnIconFile', 'position':(250, 210), 'label':'File...', }, {'type':'CheckBox', 'name':'chkStatusBar', 'position':(130, 235), 'label':'Status bar on window', }, {'type':'CheckBox', 'name':'chkVisible', 'position':(130, 260), 'size':(135, -1), 'checked':True, 'label':'Visible at startup', }, {'type':'Button', 'id':5100, 'name':'btnOK', 'position':(9, 405), 'default':1, 'label':'OK', }, {'type':'Button', 'id':5101, 'name':'btnCancel', 'position':(114, 405), 'label':'Cancel', }, ] # end components } # end CustomDialog PythonCard-0.8.2/tools/resourceEditor/modules/dialogInfoDialog.py0000644000076500007650000000171510112167747025077 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.7 $" __date__ = "$Date: 2004/08/22 19:11:35 $" """ from PythonCard import dialog, model import os class DialogInfoDialog(model.CustomDialog): def __init__(self, aBg, rsrc): model.CustomDialog.__init__(self, aBg) self.parent = aBg # if some special setup is necessary, do it here self.components.fldName.text = rsrc.name self.components.fldTitle.text = rsrc.title self.components.fldPosition.text = str(rsrc.position) self.components.fldSize.text = str(rsrc.size) def dialogInfoDialog(parent, rsrc): dlg = DialogInfoDialog(parent, rsrc) result = dlg.showModal() if result.accepted: result.name = dlg.components.fldName.text result.title = dlg.components.fldTitle.text result.position = eval(dlg.components.fldPosition.text) result.size = eval(dlg.components.fldSize.text) dlg.destroy() return result PythonCard-0.8.2/tools/resourceEditor/modules/dialogInfoDialog.rsrc.py0000644000076500007650000000247607540432224026050 0ustar alexalex00000000000000{'type':'CustomDialog', 'name':'dialogInfo', 'title':'Dialog Info', 'size':(370, 170), 'components': [ {'type':'StaticText', 'name':'stcName', 'position':(10, 10), 'size':(45, -1), 'text':'Name:', }, {'type':'StaticText', 'name':'stcTitle', 'position':(10, 35), 'size':(45, -1), 'text':'Title:', }, {'type':'StaticText', 'name':'stcPosition', 'position':(10, 60), 'size':(45, -1), 'text':'Position:', }, {'type':'StaticText', 'name':'stcSize', 'position':(10, 85), 'size':(45, -1), 'text':'Size:', }, {'type':'TextField', 'name':'fldName', 'position':(110, 5), 'size':(188, -1), }, {'type':'TextField', 'name':'fldTitle', 'position':(110, 30), 'size':(188, -1), }, {'type':'TextField', 'name':'fldPosition', 'position':(110, 55), 'size':(68, -1), }, {'type':'TextField', 'name':'fldSize', 'position':(110, 80), 'size':(68, -1), }, {'type':'Button', 'name':'btnOK', 'position':(10, 110), 'label':'OK', 'default':1, 'id':5100, }, {'type':'Button', 'name':'btnCancel', 'position':(115, 110), 'label':'Cancel', 'id':5101, }, ] # end components } # end CustomDialog PythonCard-0.8.2/tools/resourceEditor/modules/menuDialog.py0000644000076500007650000003346710112167747024001 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.16 $" __date__ = "$Date: 2004/08/22 19:11:35 $" """ from PythonCard import log, model, resource import os import wx MENULIST_PADDING = '....' def menuItemAttributes(menuItem): desc = " {'type':'MenuItem',\n" desc += " 'name':'%s',\n" % menuItem['name'] # KEA 2002-05-16 # work on string repr to get strings with mixed ' and " to work correctly if menuItem['shortcut'] == '': desc += """ 'label':%s,\n""" % repr(menuItem['label']) else: desc += """ 'label':%s,\n""" % repr(menuItem['label'] + '\t' + menuItem['shortcut']) try: if menuItem['command'] is not None: desc += " 'command':'%s',\n" % menuItem['command'] except: pass try: if not menuItem['enabled']: desc += " 'enabled':0,\n" except: pass try: if menuItem['checkable']: desc += " 'checkable':1,\n" if menuItem['checked']: desc += " 'checked':1,\n" except: pass desc += " },\n" return desc def menuAttributes(menu): desc = " {'type':'Menu',\n" desc += " 'name':'%s',\n" % menu['name'] desc += """ 'label':%s,\n""" % repr(menu['label']) desc += " 'items': [\n" return desc def menuResourceFromList(menuList): #desc = " 'menubar': {'type':'MenuBar',\n" desc = "{'type':'MenuBar',\n" desc += " 'menus': [\n" inMenu = 0 for m in menuList: if m['type'] == 'Menu': if inMenu: # close Menu desc += " ]\n" desc += " },\n" desc += menuAttributes(m) inMenu = 1 else: desc += menuItemAttributes(m) # close Menu desc += " ]\n" desc += " },\n" # close MenuBar desc += " ]\n" desc += "}\n" d = eval(desc) return resource.Resource(d) class MenuDialog(model.CustomDialog): def __init__(self, aBg, rsrc): model.CustomDialog.__init__(self, aBg) self.parent = aBg # if some special setup is necessary, do it here if rsrc is not None: #aBg.printMenubar(rsrc) self.menuList = self.parseMenus(rsrc) else: self.menuList = [] for m in self.menuList: if m['type'] == 'Menu': self.components.listMenus.append(m['label']) else: self.components.listMenus.append(MENULIST_PADDING + m['label']) #self.components.listMenus.items = self.parseMenus(rsrc) # Esc doesn't seem to work, it ends up closing the dialog # so need to work on that self.keyCodes = {wx.WXK_ESCAPE:'ESC', wx.WXK_SPACE:'Space', wx.WXK_DELETE:'Del', wx.WXK_F1:'F1', wx.WXK_F2:'F2', wx.WXK_F3:'F3', wx.WXK_F4:'F4', wx.WXK_F5:'F5', wx.WXK_F6:'F6', wx.WXK_F7:'F7', wx.WXK_F8:'F8', wx.WXK_F9:'F9', wx.WXK_F10:'F10', wx.WXK_F11:'F11', wx.WXK_F12:'F12', } #self.components.fldName.text = rsrc.application.name #self.components.fldTitle.text = rsrc.application.title #self.components.fldPosition.text = str(rsrc.application.position) #self.components.fldSize.text = str(rsrc.application.size) #self.components.chkStatusBar.checked = rsrc.application.statusBar def buildMenu(self, name, label): m = {} m['type'] = 'Menu' m['name'] = name m['label'] = label return m def buildMenuItem(self, name, label, shortcut, command, enabled, checkable, checked): m = {} m['type'] = 'MenuItem' m['name'] = name m['label'] = label m['shortcut'] = shortcut m['command'] = command m['enabled'] = enabled m['checkable'] = checkable m['checked'] = checked return m def parseMenus(self, menubar): menuList = [] for menu in menubar.menus: #menuList.append(menu.label) #print menu.type, menu.name, menu.label menuList.append(self.buildMenu(menu.name, menu.label)) for menuItem in menu.items: itemParts = menuItem.label.split("\t") label = itemParts[0] try: shortcut = itemParts[1] except: shortcut = '' #menuList.append("....%s" % itemParts[0]) #print menuItem.type, menuItem.name, itemParts, menuItem.command, menuItem.enabled, menuItem.checkable, menuItem.checked menuList.append(self.buildMenuItem(menuItem.name, label, shortcut, menuItem.command, menuItem.enabled, menuItem.checkable, menuItem.checked)) return menuList def on_fldShortcut_keyDown(self, event): # this should handle the special key codes keyCode = event.keyCode if keyCode > 32 and keyCode < 127: keyStr = chr(keyCode).upper() elif keyCode in self.keyCodes: keyStr = self.keyCodes[keyCode] else: event.target.text = '' return if event.shiftDown: keyStr = 'Shift+' + keyStr if event.altDown: keyStr = 'Alt+' + keyStr if event.controlDown: keyStr = 'Ctrl+' + keyStr if len(keyStr) > 1: # don't allow just a number or letter # without a modifier # might also need a leading Ctrl or Alt event.target.text = keyStr def on_fldShortcut_keyPress(self, event): pass def on_fldName_loseFocus(self, event): sel = self.components.listMenus.selection try: self.menuList[sel]['name'] = event.target.text log.info(self.menuList[sel]) except: pass def on_fldLabel_loseFocus(self, event): def normalize(label): name = label.replace("&", "").replace(".", "").replace(" ", "") return name sel = self.components.listMenus.selection try: label = event.target.text if self.menuList[sel]['type'] == 'Menu' and self.menuList[sel]['label'] == 'New Menu': oldname = self.menuList[sel]['name'] if oldname == 'menuNewMenu': name = 'menu'+normalize(label) self.menuList[sel]['name'] = name self.components.fldName.text = name elif self.menuList[sel]['type'] == 'MenuItem' and self.menuList[sel]['label'] == 'New Item': oldname = self.menuList[sel]['name'] menuname = 'menuMenu' for i in range(sel+1): if self.menuList[sel-i]['type'] == 'Menu': menuname = self.menuList[sel-i]['name'] break if oldname == menuname+'NewItem': name = menuname+normalize(label) self.menuList[sel]['name'] = name self.components.fldName.text = name self.menuList[sel]['label'] = label if self.menuList[sel]['type'] == 'MenuItem': label = MENULIST_PADDING + label self.components.listMenus.setString(sel, label) log.info(self.menuList[sel]) except: pass def on_fldShortcut_loseFocus(self, event): sel = self.components.listMenus.selection try: if self.menuList[sel]['type'] == 'MenuItem': self.menuList[sel]['shortcut'] = event.target.text log.info(self.menuList[sel]) except: pass def on_fldCommand_loseFocus(self, event): sel = self.components.listMenus.selection try: if self.menuList[sel]['type'] == 'MenuItem': if event.target.text == '': self.menuList[sel]['command'] = None else: self.menuList[sel]['command'] = event.target.text log.info(self.menuList[sel]) except: pass def on_chkEnabled_mouseClick(self, event): sel = self.components.listMenus.selection try: if self.menuList[sel]['type'] == 'MenuItem': self.menuList[sel]['enabled'] = event.target.checked log.info(self.menuList[sel]) except: pass def on_chkCheckable_mouseClick(self, event): sel = self.components.listMenus.selection try: if self.menuList[sel]['type'] == 'MenuItem': self.menuList[sel]['checkable'] = event.target.checked log.info(self.menuList[sel]) except: pass def on_chkChecked_mouseClick(self, event): sel = self.components.listMenus.selection try: if self.menuList[sel]['type'] == 'MenuItem': self.menuList[sel]['checked'] = event.target.checked log.info(self.menuList[sel]) except: pass def displayItemAttributes(self, sel): m = self.menuList[sel] self.components.fldListIndex.text = str(sel) self.components.fldName.text = m['name'] self.components.fldLabel.text = m['label'] if m['type'] == 'MenuItem': self.components.fldShortcut.text = m['shortcut'] if m['command'] is None: self.components.fldCommand.text = '' else: self.components.fldCommand.text = m['command'] self.components.chkEnabled.checked = m['enabled'] self.components.chkCheckable.checked = m['checkable'] self.components.chkChecked.checked = m['checked'] self.components.stcShortcut.visible = 1 self.components.stcCommand.visible = 1 self.components.fldShortcut.visible = 1 self.components.fldCommand.visible = 1 self.components.chkEnabled.visible = 1 self.components.chkCheckable.visible = 1 self.components.chkChecked.visible = 1 else: self.components.stcShortcut.visible = 0 self.components.stcCommand.visible = 0 self.components.fldShortcut.visible = 0 self.components.fldCommand.visible = 0 self.components.chkEnabled.visible = 0 self.components.chkCheckable.visible = 0 self.components.chkChecked.visible = 0 def on_listMenus_select(self, event): self.displayItemAttributes(event.target.selection) def rebuildListMenus(self, sel=-1): self.components.listMenus.clear() for m in self.menuList: if m['type'] == 'Menu': self.components.listMenus.append(m['label']) else: self.components.listMenus.append(MENULIST_PADDING + m['label']) if sel != -1: self.components.listMenus.selection = sel def on_btnUp_mouseClick(self, event): sel = self.components.listMenus.selection # a selection of -1 means no selection # a selection of 0 is the first item in the list if sel > 0: temp = self.menuList[sel] self.menuList[sel] = self.menuList[sel - 1] self.menuList[sel - 1] = temp self.rebuildListMenus(sel - 1) def on_btnDown_mouseClick(self, event): sel = self.components.listMenus.selection if sel != -1 and sel < len(self.menuList) - 1: temp = self.menuList[sel] self.menuList[sel] = self.menuList[sel + 1] self.menuList[sel + 1] = temp self.rebuildListMenus(sel + 1) def on_btnDelete_mouseClick(self, event): sel = self.components.listMenus.selection if sel != -1: del self.menuList[sel] self.components.listMenus.delete(sel) if len(self.menuList) > 0: if sel > 0: sel = sel - 1 self.components.listMenus.selection = sel self.displayItemAttributes(sel) def on_btnNewMenu_mouseClick(self, event): sel = self.components.listMenus.selection self.menuList.append(" ") # extend list if sel == -1: sel = len(self.menuList) - 1 else: self.menuList[sel+1:] = self.menuList[sel:-1] sel = sel+1 self.menuList[sel] = self.buildMenu('menuNewMenu', 'New Menu') self.rebuildListMenus(sel) self.displayItemAttributes(sel) def on_btnNewMenuItem_mouseClick(self, event): sel = self.components.listMenus.selection self.menuList.append(" ") # extend list if sel == -1: sel = len(self.menuList) - 1 else: self.menuList[sel+1:] = self.menuList[sel:-1] sel = sel+1 name = 'menuMenu' for i in range(1, sel+1): if self.menuList[sel-i]['type'] == 'Menu': name = self.menuList[sel-i]['name'] break self.menuList[sel] = self.buildMenuItem(name+'NewItem', 'New Item', '', None, 1, 0, 0) self.rebuildListMenus(sel) self.displayItemAttributes(sel) def menuDialog(parent, rsrc): dlg = MenuDialog(parent, rsrc) result = dlg.showModal() if result.accepted: if len(dlg.menuList) == 0: result.menubar = None else: result.menubar = menuResourceFromList(dlg.menuList) dlg.destroy() return result PythonCard-0.8.2/tools/resourceEditor/modules/menuDialog.rsrc.py0000644000076500007650000000453510106001363024723 0ustar alexalex00000000000000{'type':'CustomDialog', 'name':'menuDialog', 'title':'Menu Editor', 'size':(480, 300), 'components': [ {'type':'List', 'name':'listMenus', 'position':(0, 0), 'size':(185, 185), 'items':[], }, {'type':'Button', 'name':'btnUp', 'position':(5, 190), 'size':(50, -1), 'label':'Up', }, {'type':'Button', 'name':'btnDown', 'position':(60, 190), 'size':(60, -1), 'label':'Down', }, {'type':'Button', 'name':'btnDelete', 'position':(125, 190), 'size':(60, -1), 'label':'Delete', }, {'type':'StaticText', 'name':'stcName', 'position':(200, 10), 'text':'Name:', }, {'type':'StaticText', 'name':'stcLabel', 'position':(200, 35), 'text':'Label:', }, {'type':'StaticText', 'name':'stcShortcut', 'position':(200, 60), 'text':'Shortcut:', }, {'type':'StaticText', 'name':'stcCommand', 'position':(200, 85), 'text':'Command:', }, {'type':'TextField', 'name':'fldListIndex', 'position':(460, 5), 'visible':False, }, {'type':'TextField', 'name':'fldName', 'position':(275, 5), 'size':(188, -1), }, {'type':'TextField', 'name':'fldLabel', 'position':(275, 30), 'size':(188, -1), }, {'type':'TextField', 'name':'fldShortcut', 'position':(275, 55), 'size':(188, -1), }, {'type':'TextField', 'name':'fldCommand', 'position':(275, 80), 'size':(188, -1), }, {'type':'CheckBox', 'name':'chkEnabled', 'position':(275, 110), 'checked':True, 'label':'Enabled', }, {'type':'CheckBox', 'name':'chkCheckable', 'position':(275, 135), 'label':'Checkable', }, {'type':'CheckBox', 'name':'chkChecked', 'position':(275, 160), 'label':'Checked', }, {'type':'Button', 'name':'btnNewMenu', 'position':(220, 190), 'label':'New Menu', }, {'type':'Button', 'name':'btnNewMenuItem', 'position':(320, 190), 'label':'New MenuItem', }, {'type':'Button', 'id':5100, 'name':'btnOK', 'position':(10, 240), 'default':1, 'label':'OK', }, {'type':'Button', 'id':5101, 'name':'btnCancel', 'position':(115, 240), 'label':'Cancel', }, ] # end components } # end CustomDialog PythonCard-0.8.2/tools/resourceEditor/modules/multiComponents.py0000644000076500007650000000676610272000565025106 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.1 $" __date__ = "$Date: 2005/07/27 21:49:41 $" """ from PythonCard import dialog, font, model, registry, util from PythonCard.event import ChangeListener import resourceOutput import time import os import string import wx class MultiComponents(model.Background, ChangeListener): def on_initialize(self, event): self._parent = self.GetParent() self._comp = self._parent.components self._updatingComponent = 0 ##self.components.addChangeEventListener(self) self._comp.addChangeEventListener(self) #self.displayComponents(self.components) self.displayComponents(self._comp) self.visible = True def on_componentSendBack_command(self, event): print "no re-layering yet" return self._parent.on_componentSendBack_command(event) def on_componentMoveBack_command(self, event): print "no re-layering yet" return self._parent.on_componentMoveBack_command(event) def on_componentMoveForward_command(self, event): print "no re-layering yet" return self._parent.on_componentMoveForward_command(event) def on_componentBringFront_command(self, event): print "no re-layering yet" return self._parent.on_componentBringFront_command(event) def addWidgetToComponentList(self, widget): wName = widget.name wClass = widget.__class__.__name__ self.components.wComponentList.Append(wName + " : " + wClass) # KEA 2002-02-23 # need to redo the logic below to avoid asserts in hybrid # versions of wxPython, but also be cleaner def deleteWidgetFromComponentList(self, wName, wClass): i = self.components.wComponentList.GetSelection() j = self.components.wComponentList.FindString(wName + " : " + wClass) if i == -1 or i != j: if j != -1: self.components.wComponentList.Delete(j) else: if j > 0: self.components.wComponentList.SetSelection(j - 1) if j != -1: self.components.wComponentList.Delete(j) if self.components.wComponentList.GetSelection() == -1: self.setValidProps("") else: wName, wClass = self.components.wComponentList.stringSelection.split(" : ") # deselect the name from properties list self.setValidProps(wClass) self.displayProperties(wName, wClass) def changed(self, event): print "multi changed", self._parent.multipleSelected, self._parent.multipleComponents def clearComponentList(self): self.components.wComponentList.Clear() self.statusBar.text = '' def displayComponents(self, components): self.components.wComponentList.Freeze() self.components.wComponentList.Clear() self._comp = components for c in components.order: #print "display", c, self._parent.isSizingHandle(c) if c not in self._parent.sizingHandleNames and not self._parent.isSizingHandle(c): self.addWidgetToComponentList(components[c]) self.components.wComponentList.Thaw() self.components.wComponentList.Refresh() self.components.wComponentList.Update() def on_close(self, event): self.visible = False parent = self.GetParent() parent.menuBar.setChecked('menuViewPropertyEditor', 0) PythonCard-0.8.2/tools/resourceEditor/modules/multiComponents.rsrc.py0000644000076500007650000000476110272000617026045 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'Template', 'backgrounds': [ {'type':'Background', 'name':'bgTemplate', 'title':'resourceEditor Multiple Components Editor', 'size':(480, 577), 'statusBar':1, 'components': [ {'type':'StaticText', 'name':'stcNames', 'position':(10, 10), 'size':(84, -1), 'text':'Name : Class', }, {'type':'List', 'name':'wComponentList', 'position':(7, 26), 'size':(163, 172), 'items':[], }, {'type':'CheckBox', 'name':'Visible', 'position':(288, 27), 'size':(57, -1), 'label':'visible', }, {'type':'CheckBox', 'name':'Enabled', 'position':(201, 27), 'label':'enabled', }, {'type':'Button', 'name':'HorizontalCentres', 'position':(339, 142), 'size':(85, 25), 'label':'Centres', }, {'type':'Button', 'name':'VerticalCentres', 'position':(364, 65), 'size':(42, 69), 'label':'Centres', }, {'type':'Button', 'name':'Bottom', 'position':(243, 132), 'size':(53, -1), 'label':'Bottom', }, {'type':'Button', 'name':'Top', 'position':(244, 78), 'size':(53, -1), 'label':'Top', }, {'type':'Button', 'name':'Right', 'position':(287, 103), 'size':(53, -1), 'label':'Right', }, {'type':'Button', 'name':'Left', 'position':(200, 104), 'size':(52, -1), 'label':'Left', }, {'type':'StaticBox', 'name':'Align', 'position':(194, 53), 'size':(234, 132), 'label':'ALIGN', }, {'type':'ImageButton', 'name':'SendToBack', 'position':(15, 255), 'size':(18, 24), 'border':'transparent', 'command':'componentSendBack', 'file':'images/send_to_back.png', }, {'type':'ImageButton', 'name':'MoveBack', 'position':(45, 255), 'size':(18, 24), 'border':'transparent', 'command':'componentMoveBack', 'file':'images/move_back.png', }, {'type':'ImageButton', 'name':'MoveForward', 'position':(75, 255), 'size':(18, 24), 'border':'transparent', 'command':'componentMoveForward', 'file':'images/move_forward.png', }, {'type':'ImageButton', 'name':'SendToFront', 'position':(105, 255), 'size':(18, 24), 'border':'transparent', 'command':'componentBringFront', 'file':'images/send_to_front.png', }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/tools/resourceEditor/modules/multipropertyEditor.py0000644000076500007650000012731610330255261026007 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.5 $" __date__ = "$Date: 2005/10/27 22:54:41 $" """ from PythonCard import dialog, font, model, registry, util from PythonCard.event import ChangeListener import multiresourceOutput import time import os import string import wx DO_TRICKY_NAME_DERIVATIONS = True # KEA this is a load of dingos' kidneys and needs to be rewritten # 2002-02-22 # now I'm compounding the problem by porting from the original # Property Editor to a PythonCard background class PropertyEditor(model.Background, ChangeListener): def on_initialize(self, event): self._parent = self.GetParent() self._comp = self._parent.components self._updatingComponent = 0 ##self.components.addChangeEventListener(self) self._comp.addChangeEventListener(self) self.checkItems = ['enabled', 'visible', 'editable', 'checked', 'default', \ 'allowNameLabelVariation', \ 'rules', 'labels', 'ticks', 'horizontalScrollbar'] self.popItems = ['layout', 'border', 'style', 'alignment', 'stringSelection'] self.cantModify = ['id', 'name', 'alignment', 'layout', 'style', 'border', \ 'horizontalScrollbar', 'min', 'max', 'columns', 'rules', 'labels', 'ticks'] self.standardProps = ['name', 'allowNameLabelVariation', \ 'enabled', 'visible', 'checked', 'backgroundColor', 'foregroundColor', 'font', 'position', 'size', 'label', 'text'] self.standardPrefixes = ["txt", "fld", "btn", "chk", "pop", "clr", "fnt"] self.compOrderControls = ['SendToBack', 'MoveBack', 'reLayer', 'MoveTogether', 'MoveForward', 'SendToFront'] self.multiCompControls = ['stbAlign', 'alignRight', 'alignLeft', 'alignTop', 'alignBottom', 'alignVerticalCentres','alignHorizontalCentres', 'stbEqualize', 'equalWidth', 'equalHeight', 'equalBoth', 'stbDistribute', 'distHorizFirstLast', 'distHorizEdge', 'distVertFirstLast', 'distVertEdge', ] ## 'stbNudge', 'nudgeDistance', ## 'nudgeLeft', 'nudgeRight', ## 'nudgeUp', 'nudgeDown' ## ] # KEA 2001-08-14 # this was causing an assertion error with the hybrid wxPython #self.components.wComponentList.SetSelection(0) if self.components.wComponentList.stringSelection == "": #multicol if self.components.wComponentList.getStringSelection() == []: wClass = "" else: wName, wClass = self.components.wComponentList.stringSelection.split(" : ") #multicol wName, wClass = self.components.wComponentList.getStringSelection()[0].split(" : ") self.setValidProps(wClass) #self.displayComponents(self.components) self.displayComponents(self._comp) self.visible = True # these functions for adding dynamically any property fields # not used for "standard" items, and used once only for others # thereafter, use hiding and repositioning. def add_field(self, pType, name, pos, siz, text, align): self.components[name] = {'type':pType, 'name':name, 'position':pos, 'size':siz, 'alignment':align, 'text':text} def add_chk(self, name, pos, siz): # NB - set the command option to trigger the event self.components[name] = {'type':"CheckBox", 'name':name, 'position':pos, 'command':'checkedProperty', 'size':siz} def add_pop(self, name, pos, siz): #rint "add_pop", name, pos, siz self.components[name] = {'type':"Choice", 'name':name, 'position':pos, 'size':siz} def add_btnFile(self, name, pos, siz): # NB - set the command option to trigger the event self.components[name] = {'type':"Button", 'name':name, 'position':pos, 'label':"File...", 'command':'btnFile', 'size':siz} def on_componentSendBack_command(self, event): self._parent.on_componentSendBack_command(event) def on_componentMoveBack_command(self, event): self._parent.on_componentMoveBack_command(event) def on_componentMoveTogether_command(self, event): self._parent.on_componentMoveTogether_command(event) def on_componentRelayer_command(self, event): self._parent.on_componentRelayer_command(event) def on_componentMoveForward_command(self, event): self._parent.on_componentMoveForward_command(event) def on_componentBringFront_command(self, event): self._parent.on_componentBringFront_command(event) # KEA 2004-08-23 # support updating of attributes without the need # for clicking the (no longer existent) Update button def on_closeField(self, event): which = event.target.name.replace("fld", "") self.updateComponent(which) def on_checkedProperty_command(self, event): which = event.target.name.replace("chk", "") self.updateComponent(which) def on_select(self, event): which = event.target.name.replace("pop", "") self.updateComponent(which) def on_color_command(self, event): which = event.target.name.replace("clr", "") result = dialog.colorDialog(self, color=util.colorFromString(self.components["fld"+which].text)) if result.accepted: self.components["fld"+which].text = str(result.color) self.components["clr"+which].backgroundColor = util.colorFromString(self.components["fld"+which].text) self.updateComponent(which) def on_changeFont_command(self, event): which = event.target.name.replace("fnt", "") wName, wClass = self.components.wComponentList.stringSelection.split(" : ") #multicol wName, wClass = self.components.wComponentList.getStringSelection()[0].split(" : ") widget = self._comp[wName] f = widget.font if f is None: desc = font.fontDescription(widget.GetFont()) f = font.Font(desc) result = dialog.fontDialog(self, f) if result.accepted: f = result.font self.components["fld"+which].text = "%s" % f self.updateComponent(which) def on_btnFile_command(self, event): which = event.target.name.replace("btn", "") path, filename = os.path.split(self.components["fld"+which].text) result = dialog.openFileDialog(self, directory=path, filename=filename) #rint result.paths[0] if result.accepted: self.components["fld"+which].text = util.relativePath(self._parent.filename, result.paths[0]) self.updateComponent(which) def addWidgetToComponentList(self, widget): wName = widget.name wClass = widget.__class__.__name__ self.components.wComponentList.Append(wName + " : " + wClass) # KEA 2002-02-23 # need to redo the logic below to avoid asserts in hybrid # versions of wxPython, but also be cleaner def deleteWidgetFromComponentList(self, wName, wClass): i = self.components.wComponentList.GetSelection() j = self.components.wComponentList.FindString(wName + " : " + wClass) if i == -1 or i != j: if j != -1: self.components.wComponentList.Delete(j) else: if j > 0: self.components.wComponentList.SetSelection(j - 1) if j != -1: self.components.wComponentList.Delete(j) if self.components.wComponentList.GetSelection() == -1: self.setValidProps("") else: wName, wClass = self.components.wComponentList.stringSelection.split(" : ") # deselect the name from properties list self.setValidProps(wClass) self.displayProperties(wName, wClass) def updateComponentList(self): if not self._parent.multipleSelected: return self.components.alphabetizeComponents.enabled = False ###### multicol ###### lastList = self.components.wComponentList.getStringSelection() ###### if lastList: ###### for last in lastList: ###### self.components.wComponentList.SetStringSelection(last, 0) ###### #print "un setting", self.components.wComponentList.SetStringSelection(last, 0) ###### self.components.wComponentList.SetStringSelection(wName + " : " + wClass) ###### #print "setting", self.components.wComponentList.SetStringSelection(wName + " : " + wClass) self.components.wComponentList.Clear() self.PropertyListClear() for c in self.multiCompControls: self.components[c].visible = True for c,pref in self._parent.multipleComponents: self.addWidgetToComponentList(self._comp[c]) def selectComponentList(self, wName, wClass): if self._parent.multipleSelected: for c in self.multiCompControls: self.components[c].visible = False self.components.wComponentList.stringSelection = wName + " : " + wClass ###### multicol ###### lastList = self.components.wComponentList.getStringSelection() ###### if lastList: ###### for last in lastList: ###### self.components.wComponentList.SetStringSelection(last, 0) ###### #print "un setting", self.components.wComponentList.SetStringSelection(last, 0) ###### self.components.wComponentList.SetStringSelection(wName + " : " + wClass) ###### #print "setting", self.components.wComponentList.SetStringSelection(wName + " : " + wClass) self.setValidProps(wClass) self.components.chkallowNameLabelVariation.checked = not DO_TRICKY_NAME_DERIVATIONS self.displayProperties(wName, wClass) c = self._parent.components[wName] self._parent.setToolTipDrag(wName, c.position, c.size) def changed(self, event): ##comp = self.components if self._updatingComponent: # KEA 2003-01-04 # hack to speed up updates in place return comp = self._comp wName, wClass = event.getOldValue().split(",") if wName in comp: # new item added if not self._parent.isSizingHandle(wName): self.addWidgetToComponentList(comp[wName]) else: # item deleted self.deleteWidgetFromComponentList(wName, wClass) """ def on_wCopy_mouseClick(self, event): wName, wClass = self.components.wComponentList.stringSelection.split(" : ") # what needs to happen here is to have a method for the Widget class that # will provide a valid resource description, each subclass of widget would # override the method to deal with their specific resource attributes # the Widget class should provide some ordering so that 'type', # 'position', 'size' comes before less commonly used items, the actual # ordering could just be defined in a list, so it is easy to change # also, if the current values match the defaults for a widget attribute # then that attribute should not be provided as part of the output print "this is just a placeholder method right now," print "the resource is not actually copied to the clipboard yet" pprint.pprint(self._comp[wName]) """ def on_chkallowNameLabelVariation_mouseClick(self, event): if not self.components.chkallowNameLabelVariation.checked: # no longer allow them to be different # should we allow user to choose which one to keep ? # resolve if they are currently different # or simply leave as is ? wName, wClass = self.components.wComponentList.stringSelection.split(" : ") if 'label' in self.propertyList: propName = 'label' deriveName = self._parent.convertToValidName(self._comp[wName].label) else: propName = 'text' deriveName = self._parent.convertToValidName(self._comp[wName].text) # do they already match ? if wName == deriveName: self.components.chkallowNameLabelVariation.checked = False return result = dialog.messageDialog(self, 'Do you want '+propName+' to revert to reflect the name: '+wName, 'Empty '+propName, wx.ICON_QUESTION | wx.YES_NO | wx.NO_DEFAULT) if result.accepted: self.components['fld'+propName].text = wName # temporarily allow diff name/label to allow update to happen, then revert self.components.chkallowNameLabelVariation.checked = True self.updateComponent(propName) self.components.chkallowNameLabelVariation.checked = False else: self.components.chkallowNameLabelVariation.checked = True def updateComponent(self, which): wName, wClass = self.components.wComponentList.stringSelection.split(" : ") propName = which if propName in self.checkItems: value = self.components["chk"+propName].checked elif propName in self.popItems: value = self.components["pop"+propName].stringSelection elif propName in ('items', 'userdata') or (wClass == 'TextArea' and propName == 'text'): value = self.components["fld"+propName].text else: value = self.components["fld"+propName].text if propName == "textArea": propName = 'text' if propName not in ['name', 'label', 'stringSelection', 'text', 'toolTip', 'userdata']: try: value = eval(value) except: pass # KEA 2004-05-10 # need to figure out where to stick validation code # but for now just need to make sure that if we're changing the name # attribute that it is valid, but similar checks will be necessary for # integer fields, a list of items, etc. # also maybe each attribute should have a doc or help string displayed # saying what the attribute does, example values, etc. if propName == 'name': badValue = False # if it isn't valid then display an alert and exit # must start with a letter and only contain alphanumeric characters if value == "" or value[0] not in string.ascii_letters: badValue = True else: alphanumeric = string.ascii_letters + string.digits for c in value: if c not in alphanumeric: badValue = True break if badValue: dialog.alertDialog(None, "Name must start with a letter and only contain letters and numbers.", 'Error: Name is invalid') self.components["fld"+which].text = wName self.components["fld"+which].setFocus() self.components["fld"+which].setSelection(-1, -1) return # check for duplicate names is done below ##widget = self.components[wName] widget = self._comp[wName] # KEA 2002-02-23 # I can't remember why this is actually necessary if propName == 'size': width, height = value if wClass not in ['BitmapCanvas', 'HtmlWindow']: bestWidth, bestHeight = widget.GetBestSize() if width == -1: width = bestWidth if height == -1: height = bestHeight widget.size = (width, height) else: if (propName in self.cantModify) or \ (propName == 'items' and wClass == 'RadioGroup') or \ (propName in ['label', 'text']): if (propName == 'layout'): xx,yy = widget.size widget.size = yy, xx order = self._comp.order.index(wName) desc = multiresourceOutput.widgetAttributes(self._parent, widget) if desc.endswith(',\n'): desc = eval(desc[:-2]) else: desc = eval(desc) if propName == 'name': if value == wName: # user didn't actually change the name return elif value in self._comp: # we already have a component with that name dialog.alertDialog(self, 'Another component already exists with the name ' + value, 'Error: unable to rename component') self.components["fldname"].text = wName self.components["fldname"].setFocus() self.components["fldname"].setSelection(-1, -1) return if propName in ['label', 'text']: if not self.components.chkallowNameLabelVariation.checked: if value == "": result = dialog.messageDialog(self, 'To set '+propName+' to be empty, you must allow Name and '+propName+' to differ.\n'+ 'Do you want to allow that ?', 'Empty '+propName, wx.ICON_QUESTION | wx.YES_NO | wx.NO_DEFAULT) if result.accepted: self.components.chkallowNameLabelVariation.checked = True desc[propName] = value else: # don't allow this change #self.components["fldname"].text = wName self.components["fld"+propName].text = desc[propName] self.components["fld"+propName].setFocus() self.components["fld"+propName].setSelection(-1, -1) return else: oldval = desc[propName] desc[propName] = value self._parent.deriveNameFromLabel(desc) if desc['name'] in self._comp: # we already have a component with that name dialog.alertDialog(self, 'Another component already exists with the name ' + value, 'Error: unable to rename component') desc['name'] = wName desc[propName] = oldval self.components["fldname"].text = wName self.components["fld"+propName].text = desc[propName] self.components["fld"+propName].setFocus() self.components["fld"+propName].setSelection(-1, -1) return if value is None: desc[propName] = 'none' elif propName in ['min', 'max']: desc[propName] = int(value) else: desc[propName] = value # need to experiment with freeze and thaw to avoid # a lot of update events startTime = time.time() # this is going to trigger a changed event # as we delete the old component self._updatingComponent = True del self._comp[wName] if propName in ['name']: if not self.components.chkallowNameLabelVariation.checked: self._parent.deriveLabelFromName(desc) wName = desc['name'] elif propName in ['label', 'text']: if not self.components.chkallowNameLabelVariation: self._parent.deriveNameFromLabel(desc) wName = desc['name'] # this is going to trigger another changed event # as we create a new component with the changed attribute self._comp[wName] = desc c = self._comp[wName] wx.EVT_LEFT_DOWN(c, self._parent.on_mouseDown) wx.EVT_LEFT_UP(c, self._parent.on_mouseUp) wx.EVT_MOTION(c, self._parent.on_mouseDrag) # now restore the order of the component # have to update the startName in case the name was updated if propName == 'name': self._parent.startName = wName self._comp.order.remove(wName) self._comp.order.insert(order, wName) self._parent.fixComponentOrder(wName) self._updatingComponent = False endTime = time.time() #print "attribute change took:", endTime - startTime else: if wClass in ['Image', 'ImageButton'] and propName == 'file': cwd = os.getcwd() try: os.chdir(self._parent.filename) except: pass setattr(widget, propName, value) os.chdir(cwd) else: setattr(widget, propName, value) #print propName, value # KEA 2002-02-23 self._parent.showSizingHandles(wName) # and check if we now have matching name/label, and if so, assume they now maintain derivation self.determineNameLabelState(wName) def determineNameLabelState(self, wName): if 'label' in self.propertyList: deriveName = self._parent.convertToValidName(self._comp[wName].label) #rint wName, (self._comp[wName].label) elif 'text' in self.propertyList: deriveName = self._parent.convertToValidName(self._comp[wName].text) #rint wName, (self._comp[wName].text) else: return if wName <> deriveName or not DO_TRICKY_NAME_DERIVATIONS: self.components["chkallowNameLabelVariation"].checked = True def setValidProps(self, wClass): if wClass == "": self.PropertyListClear() else: # get the property (attribute) list from the spec klass = registry.Registry.getInstance().getComponentClass(wClass) props = klass._spec.getAttributes().keys() # KEA 2002-03-24 # only show the 'id' attribute for Button # and only when displaying dialog properties if not (self._parent.editingDialog and wClass == 'Button'): props.remove('id') props.sort() ##print "spec props", specProps self.PropertyListClear() self.PropertyListInsertItems(props) def PropertyListClear(self): self.propertyList = [] for name, c in self.components.iteritems(): prefix = name[:3] if prefix in self.standardPrefixes: self.components[name].visible = False self.components[name].enabled = False def PropertyListInsertItems(self, props): self.propertyList = props def updateSingleProperty(self, wName, propName, newValue): wClass = wName.__class__.__name__ if propName in ['label', 'stringSelection', 'text', 'toolTip'] or propName in self.checkItems: newValue = newValue #getattr(widget, propName) else: newValue = str(newValue) #str(getattr(widget, propName)) if propName in self.checkItems: self.components["chk"+propName].checked = newValue elif propName in self.popItems: self.components["pop"+propName].Clear() if propName == 'stringSelection': for v in widget.items: self.components["pop"+propName].Append(v) else: for v in widget._spec.getAttributes()[propName].values: self.components["pop"+propName].Append(v) try: self.components["pop"+propName].stringSelection = newValue except: # if value is empty or doesn't already exist pass elif propName in ('items', 'userdata') or (wClass == 'TextArea' and propName == 'text'): self.components["fld"+propName].text = newValue else: self.components["fld"+propName].text = newValue def displayProperties(self, wName, wClass): maxy = 0 for theprop in self.standardProps: prop = theprop if prop == "text" and wClass == "TextArea": prop = "textArea" if prop in self.propertyList: vis = True else: vis = False for prefix in self.standardPrefixes: if prefix+prop in self.components.iterkeys(): self.components[prefix+prop].visible = vis self.components[prefix+prop].enabled = vis maxy = max(maxy, self.components[prefix+prop].position[1]) #rint self.components[prefix+prop].name, self.components[prefix+prop].position, self.components[prefix+prop].size, self.components[prefix+prop].GetBestSize() x,y = self.components.Properties.position # get values from one of the standard fields - use backgroundCcolor # for text, field and button sizes # get the size as defined in the resource file, adjust for BestSize tx, ty = self.components.txtbackgroundColor.position tdefx, tdefy = self.components.txtbackgroundColor.size tsx, tsy = self.components.txtbackgroundColor.GetBestSize() ## + (20,10) tx = tx + tdefx - tsx fx, fy = self.components.fldbackgroundColor.position fdefx, fdefy = self.components.fldbackgroundColor.size fsx, fsy = self.components.fldbackgroundColor.GetBestSize() ## + (20,10) fx = fx + fdefx - fsx #rint fx, fy, fsx, fsy # Color buttons are odd, so use the font button for button positioning bx, by = self.components.fntfont.position bdefx, bdefy = self.components.fntfont.size bsx, bsy = self.components.fntfont.GetBestSize() ## + (20,10) #rint bx, by, bdefx, bdefy, bsx, bsy # bx = bx + bdefx - bsx bsx = bdefx #rint bx, by, bsx, bsy y = maxy+fsy if DO_TRICKY_NAME_DERIVATIONS and ('label' in self.propertyList or 'text' in self.propertyList): self.components["chkallowNameLabelVariation"].visible = True self.components["chkallowNameLabelVariation"].enabled = True self.determineNameLabelState(wName) else: self.components["chkallowNameLabelVariation"].visible = False self.components["chkallowNameLabelVariation"].enabled = True self.determineNameLabelState(wName) for propName in self.propertyList: widget = self._comp[wName] if propName in ['label', 'stringSelection', 'text', 'toolTip'] or propName in self.checkItems: value = getattr(widget, propName) else: value = str(getattr(widget, propName)) if propName in self.checkItems: if not propName in self.standardProps: if not "chk"+propName in self.components.iterkeys(): self.add_chk("chk"+propName, (fx, y), (fsx,fsy)) else: self.components["chk"+propName].position = (fx, y) self.components["chk"+propName].size = (fsx, fsy) y += fsy + 5 self.components["chk"+propName].label = propName self.components["chk"+propName].visible = True self.components["chk"+propName].enabled = True self.components["chk"+propName].checked = value else: self.components["chk"+propName].visible = True self.components["chk"+propName].checked = value elif propName in self.popItems: if not propName in self.standardProps: if not "txt"+propName in self.components.iterkeys(): self.add_field("StaticText", "txt"+propName, (tx, y), (tsx,tsy), propName, "right") else: self.components["txt"+propName].position = (tx, y) self.components["txt"+propName].size = (tsx, tsy) if not "pop"+propName in self.components.iterkeys(): self.add_pop("pop"+propName, (fx, y), (fsx,fsy)) else: self.components["pop"+propName].position = (fx, y) self.components["pop"+propName].size = (fsx, fsy) y += max(tsy, fsy) + 5 self.components["txt"+propName].visible = True self.components["txt"+propName].enabled = True self.components["pop"+propName].visible = True self.components["pop"+propName].enabled = True self.components["pop"+propName].Clear() if propName == 'stringSelection': for v in widget.items: self.components["pop"+propName].Append(v) else: for v in widget._spec.getAttributes()[propName].values: self.components["pop"+propName].Append(v) try: self.components["pop"+propName].stringSelection = value except: # if value is empty or doesn't already exist pass elif propName in ('items', 'userdata') or (wClass == 'TextArea' and propName == 'text'): if not propName in self.standardProps: if not "txt"+propName in self.components.iterkeys(): self.add_field("StaticText", "txt"+propName, (tx, y), (tsx,tsy), propName, "right") else: self.components["txt"+propName].position = (tx, y) self.components["txt"+propName].size = (tsx, tsy) if not "fld"+propName in self.components.iterkeys(): self.add_field("TextArea", "fld"+propName, (fx, y), (fsx,fsy*3), value, "left") else: self.components["fld"+propName].position = (fx, y) self.components["fld"+propName].size = (fsx, fsy*3) y += 3*fsy+5 if wClass == 'TextArea' and propName == 'text': propName = 'textArea' self.components["txt"+propName].visible = True self.components["txt"+propName].enabled = True self.components["fld"+propName].visible = True self.components["fld"+propName].enabled = True self.components["fld"+propName].text = value else: if not propName in self.standardProps: if not "txt"+propName in self.components.iterkeys(): self.add_field("StaticText", "txt"+propName, (tx, y), (tsx,tsy), propName, "right") else: self.components["txt"+propName].position = (tx, y) self.components["txt"+propName].size = (tsx, tsy) if not "fld"+propName in self.components.iterkeys(): self.add_field("TextField", "fld"+propName, (fx, y), (fsx,fsy), value, "left") else: self.components["fld"+propName].position = (fx, y) self.components["fld"+propName].size = (fsx, fsy) if propName == 'file': if not "btn"+propName in self.components.iterkeys(): self.add_btnFile("btn"+propName, (bx, y), (bsx,bsy)) else: self.components["btn"+propName].position = (bx, y) self.components["btn"+propName].size = (bsx, bsy) print "btn"+propName, bx, y, bsx, bsy self.components["btn"+propName].visible = True self.components["btn"+propName].enabled = True # allow extra space for the "file" button y += max(tsy, fsy, bsy) - max(tsy,fsy) y += max(tsy, fsy) + 5 else: # all colors and fonts are "standard" items if propName == 'foregroundColor' or propName == 'backgroundColor': self.components["clr"+propName].visible = True #rint propName, self.components["fld"+propName].text, value self.components["clr"+propName].backgroundColor = util.colorFromString(value) self.components["txt"+propName].visible = True self.components["txt"+propName].enabled = True if propName == "font": self.components["fld"+propName].visible = False else: self.components["fld"+propName].visible = True self.components["fld"+propName].enabled = True self.components["fld"+propName].text = value ## self.components.wName.text = propName + ":" # KEA 2002-02-23 # I can't remember why this is actually necessary if propName == 'size': width, height = getattr(widget, propName) if wClass not in ['BitmapCanvas', 'HtmlWindow']: bestWidth, bestHeight = widget.GetBestSize() if width == bestWidth: width = -1 if height == bestHeight: height = -1 size = (width, height) value = str(size) self.components["fld"+propName].text = value # this should only display if the attribute is settable # so name, alignment, and others are read-only def on_wComponentList_select(self, event): #print 'selectComponentListEvent: %s\n' % event.GetString() #multicol print self.components.wComponentList.getStringSelection() #multicol print self.components.wComponentList.getStringSelection()[0] #multicol wName, wClass = self.components.wComponentList.getStringSelection()[0].split(" : ") wName, wClass = event.GetString().split(" : ") if self._parent.multipleSelected: return # cannot select from list while in multi-mode self.setValidProps(wClass) self.components.chkallowNameLabelVariation.checked = not DO_TRICKY_NAME_DERIVATIONS self.displayProperties(wName, wClass) self._parent.showSizingHandles(wName) c = self._parent.components[wName] self._parent.startName = wName self._parent.setToolTipDrag(wName, c.position, c.size) def clearComponentList(self): self.components.wComponentList.Clear() self.statusBar.text = '' def clearPropertyList(self): self.PropertyListClear() def on_alphabetizeComponents_mouseClick(self, event): self.displayComponents(self._comp) def displayComponents(self, components): self.components.wComponentList.Freeze() self.components.wComponentList.Clear() if self._parent.multipleSelected: self.components.alphabetizeComponents.enabled = False for c in self.multiCompControls: self.components[c].visible = True for c,pref in self._parent.multipleComponents: self.addWidgetToComponentList(self._comp[c]) else: self.components.alphabetizeComponents.enabled = True for c in self.multiCompControls: self.components[c].visible = False self._comp = components #rint "here ", self.components.alphabetizeComponents.checked if self.components.alphabetizeComponents.checked: for c in self.compOrderControls: self.components[c].enabled = False xxx = [] for c in components.order: #print "display", c, self._parent.isSizingHandle(c) if c not in self._parent.sizingHandleNames and not self._parent.isSizingHandle(c): xxx.append(components[c]) xxx.sort() for c in xxx: self.addWidgetToComponentList(c) else: for c in self.compOrderControls: self.components[c].enabled = True for c in components.order: #print "display", c, self._parent.isSizingHandle(c) if c not in self._parent.sizingHandleNames and not self._parent.isSizingHandle(c): self.addWidgetToComponentList(components[c]) self.components.wComponentList.Thaw() self.components.wComponentList.Refresh() self.components.wComponentList.Update() def on_close(self, event): self.visible = False parent = self.GetParent() parent.menuBar.setChecked('menuViewPropertyEditor', 0) def on_align_command(self, event): # offset is two x,y pairs # first pair is how far (whether) to move this dimension # second is how much of width to use # all numbers used to multiply the difference between moving comp and base # so (1,0,0,0) means make left X same as base, leave Y unchanged # (1,0,1,0) means make right X same as base, leave Y unchanged # (0,1,0,0.5) means make centre Y same as base, leave X unchanged alignOffsets = {'alignLeft': (1,0,0,0), 'alignRight': (1,0,1, 0), 'alignTop': (0,1,0,0), 'alignBottom': (0,1,0,1), 'alignHorizontalCentres': (1,0,0.5,0), 'alignVerticalCentres': (0,1,0,0.5)} if not self._parent.multipleComponents: return if not event.target.name in alignOffsets.keys(): return BX, BY, SX, SY = alignOffsets[event.target.name] count = 0 for c, pre in self._parent.multipleComponents: x,y = self._comp[c].position sx,sy = self._comp[c].size if count == 0: finalx = x + SX * sx finaly = y + SY * sy else: newx = x + BX * (finalx - SX*sx - x) newy = y + BY * (finaly - SY*sy - y) self._comp[c].position = (newx, newy) count += 1 if count > 0: self._parent.showMultiSizingHandles() def on_equal_command(self, event): # settings is a single X,Y pair # specifies how much of final result comes from base (remainder from original) # so (1,0) means make comp's X size (i.e. width) be same as base's equalSettings = {'equalWidth': (1,0), 'equalHeight': (0,1), 'equalBoth': (1,1)} if not self._parent.multipleComponents: return if not event.target.name in equalSettings.keys(): return # set up Base fraction and Own fraction BX, BY = equalSettings[event.target.name] OX, OY = (1-BX, 1-BY) count = 0 for c, pre in self._parent.multipleComponents: w,h = self._comp[c].size if count == 0: basew = w baseh = h else: neww,newh = (BX*basew + OX*w, BY*baseh+OY*h) self._comp[c].size = (neww, newh) count += 1 if count > 0: self._parent.showMultiSizingHandles() def on_nudge_command(self, event): # Offsets are distance to move in each of X,Y # distance = 1 = 1, 2(,3) = gridsize, 4 = gridsize * gridsize nudgeOffsets = {'nudgeUp': (0,-1), 'nudgeDown': (0,1), 'nudgeLeft': (-1,0), 'nudgeRight': (1,0)} # can be applied in single component mode ## if not self._parent.multipleComponents: ## return if not event.target.name in nudgeOffsets.keys(): return self._parent.nudge( nudgeOffsets[event.target.name], self.components.nudgeDistance.value) def on_distribute_command(self, event): # setting is x,y for which is to change, plus style distributeSettings = {'distHorizEdge': (1,0,'E'), 'distHorizFirstLast': (1,0,'F'), 'distVertEdge': (0,1,'E'), 'distVertFirstLast': (0,1,'F')} if not self._parent.multipleComponents: return if not event.target.name in distributeSettings.keys(): return BX, BY, style = distributeSettings[event.target.name] nameList = [ x[0] for x in self._parent.multipleComponents ] # Calculate First-to-Last. N = len(self._parent.multipleComponents) - 1 # number of gaps if style == "F": if N <= 1: return x1,y1 = self._comp[nameList[0]].position x2,y2 = self._comp[nameList[N]].position if BX*(x2-x1) + BY*(y2-y1) < 0: nameList.reverse() x1,y1 = self._comp[nameList[0]].position x2,y2 = self._comp[nameList[N]].position used = 0 for c in nameList: sx,sy = self._comp[c].size used = used + BX*sx + BY*sy gapSpace = BX*(x2-x1-used+sx) + BY*(y2-y1-used+sy) elif style == 'E': gapSpace = 0 else: return count = 0 for c in nameList: x,y = self._comp[c].position sx,sy = self._comp[c].size if count == 0: basex, basey = (x, y) nextx, nexty = (x+sx, y+sy) else: useup = gapSpace / N N = N-1 gapSpace = gapSpace - useup newx = BX * (nextx+useup) + (1-BX) * x newy = BY * (nexty+useup) + (1-BY) * y nextx, nexty = (newx+sx, newy+sy) self._comp[c].position = (newx, newy) count += 1 if count > 0: self._parent.showMultiSizingHandles() PythonCard-0.8.2/tools/resourceEditor/modules/multipropertyEditor.rsrc.py0000644000076500007650000002567210377071542026772 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'Template', 'backgrounds': [ {'type':'Background', 'name':'bgTemplate', 'title':'resourceEditor Property Editor', 'size':(416, 619), 'statusBar':1, 'visible':0, 'components': [ {'type':'CheckBox', 'name':'alphabetizeComponents', 'position':(5, 231), 'label':'Alphabetize Components', }, {'type':'CheckBox', 'name':'chkallowNameLabelVariation', 'position':(149, 24), 'size':(70, -1), 'label':'Vary', }, {'type':'ImageButton', 'name':'SendToBack', 'position':(8, 301), 'size':(24, 32), 'border':'3d', 'command':'componentSendBack', 'file':'images/send_to_back.png', 'toolTip':'Send component(s) to back', }, {'type':'ImageButton', 'name':'MoveBack', 'position':(32, 301), 'size':(24, 32), 'border':'3d', 'command':'componentMoveBack', 'file':'images/move_back.png', 'toolTip':'Move component(s) towards back', }, {'type':'ImageButton', 'name':'reLayer', 'position':(56, 333), 'size':(32, 32), 'border':'3d', 'command':'componentRelayer', 'file':'images/relayer.png', 'toolTip':'Re-layer components, top-left to bottom right', }, {'type':'ImageButton', 'name':'MoveTogether', 'position':(56, 301), 'size':(32, 32), 'border':'3d', 'command':'componentMoveTogether', 'file':'images/move_together.png', 'toolTip':'Gather components together', }, {'type':'ImageButton', 'name':'MoveForward', 'position':(88, 301), 'size':(24, 32), 'border':'3d', 'command':'componentMoveForward', 'file':'images/move_forward.png', 'toolTip':'Move component(s) towards front', }, {'type':'ImageButton', 'name':'SendToFront', 'position':(112, 301), 'size':(24, 32), 'border':'3d', 'command':'componentBringFront', 'file':'images/send_to_front.png', 'toolTip':'Send component(s) to front', }, {'type':'StaticText', 'name':'Properties', 'position':(214, 6), 'text':'Properties', }, {'type':'StaticText', 'name':'txtname', 'position':(160, 24), 'size':(84, -1), 'alignment':'right', 'text':'name', }, {'type':'TextField', 'name':'fldname', 'position':(250, 20), 'size':(148, -1), }, {'type':'StaticText', 'name':'txtlabel', 'position':(160, 56), 'size':(84, -1), 'alignment':'right', 'text':'Label', }, {'type':'StaticText', 'name':'txttextArea', 'position':(160, 56), 'size':(84, -1), 'alignment':'right', 'text':'Text', }, {'type':'StaticText', 'name':'txttext', 'position':(160, 56), 'size':(84, -1), 'alignment':'right', 'text':'Text', }, {'type':'StaticBox', 'name':'stbAlign', 'position':(194, 59), 'size':(166, 114), 'label':'ALIGN', }, {'type':'TextField', 'name':'fldtext', 'position':(250, 52), 'size':(148, -1), }, {'type':'TextField', 'name':'fldlabel', 'position':(250, 52), 'size':(148, -1), }, {'type':'ImageButton', 'name':'alignTop', 'position':(236, 79), 'size':(24, 24), 'border':'3d', 'command':'align', 'file':'images/align_top.png', 'toolTip':'Align component tops', }, {'type':'TextArea', 'name':'fldtextArea', 'position':(250, 52), 'size':(148, 55), }, {'type':'ImageButton', 'name':'alignVerticalCentres', 'position':(315, 81), 'size':(24, 24), 'border':'3d', 'command':'align', 'file':'images/align_vert_centres.png', 'toolTip':'Align component centres in a vertical stack', }, {'type':'CheckBox', 'name':'chkenabled', 'position':(150, 115), 'size':(80, -1), 'command':'checkedProperty', 'label':'Enabled', }, {'type':'ImageButton', 'name':'alignLeft', 'position':(200, 112), 'size':(24, 24), 'border':'3d', 'command':'align', 'file':'images/align_left.png', 'toolTip':'Align component left edges', }, {'type':'CheckBox', 'name':'chkvisible', 'position':(230, 115), 'size':(80, -1), 'command':'checkedProperty', 'label':'Visible', }, {'type':'ImageButton', 'name':'alignRight', 'position':(270, 112), 'size':(24, 24), 'border':'3d', 'command':'align', 'file':'images/align_right.png', 'toolTip':'Align component right edges', }, {'type':'CheckBox', 'name':'chkchecked', 'position':(310, 115), 'size':(80, -1), 'command':'checkedProperty', 'label':'Checked', }, {'type':'StaticText', 'name':'txtbackgroundColor', 'position':(160, 160), 'size':(84, -1), 'alignment':'right', 'text':'backgroundColor', }, {'type':'ImageButton', 'name':'alignBottom', 'position':(236, 140), 'size':(24, 24), 'border':'3d', 'command':'align', 'file':'images/align_bottom.png', 'toolTip':'Align component bottoms', }, {'type':'ImageButton', 'name':'alignHorizontalCentres', 'position':(314, 139), 'size':(24, 24), 'border':'3d', 'command':'align', 'file':'images/align_horiz_centres.png', 'toolTip':'Align component centres in a horizontal line', }, {'type':'TextField', 'name':'fldbackgroundColor', 'position':(250, 160), 'text':'backgroundColor', }, {'type':'TextField', 'name':'fldforegroundColor', 'position':(250, 135), 'text':'foregroundColor', }, {'type':'Button', 'name':'clrforegroundColor', 'position':(356, 135), 'size':(35, -1), 'command':'color', 'label':'...', }, {'type':'Button', 'name':'clrbackgroundColor', 'position':(356, 160), 'size':(35, -1), 'command':'color', 'label':'...', }, {'type':'StaticText', 'name':'txtforegroundColor', 'position':(160, 140), 'size':(84, -1), 'alignment':'right', 'text':'foregroundColor', }, {'type':'StaticText', 'name':'txtborder', 'position':(160, 215), 'size':(84, -1), 'alignment':'right', 'text':'Border', }, {'type':'Choice', 'name':'popborder', 'position':(238, 210), 'size':(160, -1), 'items':[], }, {'type':'StaticText', 'name':'txtfont', 'position':(160, 240), 'size':(84, -1), 'alignment':'right', 'text':'Font', }, {'type':'TextField', 'name':'fldfont', 'position':(250, 234), }, {'type':'Button', 'name':'fntfont', 'position':(350, 232), 'size':(55, -1), 'command':'changeFont', 'label':'Font...', }, {'type':'StaticText', 'name':'txtposition', 'position':(150, 265), 'size':(42, -1), 'alignment':'right', 'text':'Position', }, {'type':'StaticBox', 'name':'stbDistribute', 'position':(197, 179), 'size':(166, 101), 'label':'DISTRIBUTE', }, {'type':'ImageButton', 'name':'distHorizEdge', 'position':(215, 199), 'size':(32, 32), 'border':'3d', 'command':'distribute', 'file':'images/dist_horiz_edge.png', 'toolTip':'Distribute horizontally, edge-to-edge', }, {'type':'ImageButton', 'name':'distVertEdge', 'position':(295, 199), 'size':(32, 32), 'border':'3d', 'command':'distribute', 'file':'images/dist_vert_edge.png', 'toolTip':'Distribute vertically, edge-to-edge', }, {'type':'TextField', 'name':'fldposition', 'position':(205, 260), 'size':(68, -1), }, {'type':'ImageButton', 'name':'distHorizFirstLast', 'position':(215, 234), 'size':(32, 32), 'border':'3d', 'command':'distribute', 'file':'images/dist_horiz_space.png', 'toolTip':'Distribute horizontally, first to last', }, {'type':'StaticText', 'name':'txtsize', 'position':(290, 265), 'size':(31, -1), 'alignment':'right', 'text':'Size', }, {'type':'ImageButton', 'name':'distVertFirstLast', 'position':(296, 233), 'size':(32, 32), 'border':'3d', 'command':'distribute', 'file':'images/dist_vert_space.png', 'toolTip':'Distribute vertically, first to last', }, {'type':'TextField', 'name':'fldsize', 'position':(330, 260), 'size':(68, -1), }, {'type':'StaticBox', 'name':'stbEqualize', 'position':(197, 290), 'size':(166, 62), 'label':'EQUALIZE', }, {'type':'ImageButton', 'name':'equalWidth', 'position':(214, 312), 'border':'3d', 'command':'equal', 'file':'images/equal_width.png', 'toolTip':'Equalize heights to those of the first component', }, {'type':'ImageButton', 'name':'equalHeight', 'position':(265, 312), 'size':(32, 32), 'border':'3d', 'command':'equal', 'file':'images/equal_height.png', 'toolTip':'Equalize heights to that of the first component', }, {'type':'ImageButton', 'name':'equalBoth', 'position':(316, 312), 'size':(32, 32), 'border':'3d', 'command':'equal', 'file':'images/equal_both.png', 'toolTip':'Equalize width & height to those of the first component', }, {'type':'ImageButton', 'name':'nudgeDown', 'position':(60, 454), 'size':(18, 24), 'border':'none', 'command':'nudge', 'file':'images/nudge_down.png', 'toolTip':'Nudge components down by specified distance', }, {'type':'ImageButton', 'name':'nudgeUp', 'position':(60, 399), 'size':(18, 24), 'border':'none', 'command':'nudge', 'file':'images/nudge_up.png', 'toolTip':'Nudge components up by specified distance', }, {'type':'Spinner', 'name':'nudgeDistance', 'position':(51, 430), 'size':(41, -1), 'max':4, 'min':1, 'toolTip':'Distance to nudge components', 'value':1, }, {'type':'ImageButton', 'name':'nudgeRight', 'position':(100, 429), 'size':(18, 24), 'border':'none', 'command':'nudge', 'file':'images/nudge_right.png', 'toolTip':'Nudge components to right by specified distance', }, {'type':'ImageButton', 'name':'nudgeLeft', 'position':(23, 430), 'size':(18, 24), 'border':'none', 'command':'nudge', 'file':'images/nudge_left.png', 'toolTip':'Nudge components to left by specified distance', }, {'type':'StaticBox', 'name':'stbNudge', 'position':(3, 377), 'size':(141, 130), 'label':'NUDGE', }, {'type':'Button', 'name':'wUpdate', 'position':(10, 518), 'label':'Update', 'toolTip':'Update changes', }, {'type':'List', 'name':'wComponentList', 'position':(7, 21), 'size':(134, 204), 'items':[], }, {'type':'StaticText', 'name':'stcNameClass', 'position':(5, 3), 'text':'Name : Class', }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/tools/resourceEditor/modules/multiresourceOutput.py0000644000076500007650000002410110330255570026013 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.2 $" __date__ = "$Date: 2005/10/27 22:58:00 $" """ import wx SPACES = ' ' def colorDescription(color): if isinstance(color, str): return "'%s'" % color else: return "%s" % str(color) # this is a complete hack job in order to avoid # outputting defaults def widgetAttributes(background, aWidget): # this might be overly aggressive # it could be that the normal default of white might be different on these # various widgets rather than being the same, so the wxTextCtrl is # not a good comparison flds = ['TextField', 'PasswordField', 'TextArea'] txtWidgets = ['TextField', 'PasswordField', 'TextArea', 'Choice', 'List', 'Calendar', 'ComboBox'] imgWidgets = ['Image', 'ImageButton'] comp = background.propertyEditorWindow.components dFgC = comp.wUpdate.foregroundColor.Get() dBgC = comp.wUpdate.backgroundColor.Get() dFont = repr(comp.wUpdate.font) dTextBgC = comp.fldname.backgroundColor.Get() # make sure these primary attributes show up # at the beginning of the listing # the remaining ones will be in alphabetical order dStr = "{'type':'%s', \n" % aWidget.__class__.__name__ # KEA 2002-03-24 # only save the special ids if background.editingDialog and aWidget.__class__.__name__ == 'Button': if aWidget.id in [wx.ID_OK, wx.ID_CANCEL, wx.ID_YES, wx.ID_NO]: dStr += " 'id':%d, \n" % aWidget.id dStr += " 'name':'%s', \n" % aWidget.name dStr += " 'position':%s, \n" % str(aWidget.position) # try and determine default sizes width, height = aWidget.size if aWidget.__class__.__name__ in imgWidgets: width, height = aWidget._size elif aWidget.__class__.__name__ not in ['BitmapCanvas', 'HtmlWindow', 'IEHtmlWindow', 'Gauge', 'StaticBox', 'FloatCanvas']: bestWidth, bestHeight = aWidget.GetBestSize() if bestWidth == width: width = -1 if bestHeight == height: height = -1 if width != -1 or height != -1: dStr += " 'size':(%d, %d), \n" % (width, height) #for key in aWidget._getAttributeNames(): attributes = aWidget._spec.getAttributes().keys() attributes.sort() for key in attributes: if key in ['id', 'bitmap', 'name', 'position', 'selection', 'size']: pass elif getattr(aWidget, key) is not None: #print aWidget.__class__.__name__, key, getattr(aWidget, key) value = getattr(aWidget, key) if key == 'file' and aWidget.__class__.__name__ in imgWidgets and value == '': dStr += " 'file':'', \n" continue if key == 'alignment' and \ aWidget.__class__.__name__ in ['StaticText', 'PasswordField', 'TextField', 'TextArea'] \ and value == 'left': continue if key == 'border' and aWidget.__class__.__name__ in txtWidgets and value == '3d': continue if key == 'backgroundColor' and \ aWidget.__class__.__name__ in txtWidgets and \ value.Get() == dTextBgC: continue if key == 'foregroundColor' and value.Get() == dFgC: continue if key == 'backgroundColor' and value.Get() == dBgC: continue if key == 'font' and repr(value) == dFont: continue if key == 'actionBindings' and value == {}: continue # KEA 2002-07-07 # what other Unicode strings do we need to deal with above? #print key, value, type(value) if isinstance(value, (str, unicode)): if isinstance(value, unicode): value = value.encode('ascii', 'ignore') # need to escape strings #pprint.pprint(value) if value != '': dStr += """ %s:%s, \n""" % (repr(key), repr(value)) else: if (key in ['editable', 'enabled', 'visible'] and value == True) or \ (key in ['checked', 'default', 'horizontalScrollbar'] and value == False): # don't include default values pass else: dStr += " '%s':%s, \n" % (key, value) dStr += ' },\n' return dStr def resourceMenuItemAttributes(menuItem): desc = SPACES * 4 + " {'type':'MenuItem',\n" desc += SPACES * 4 + " 'name':'%s',\n" % menuItem.name desc += SPACES * 4 + """ 'label':%s,\n""" % repr(menuItem.label) try: if menuItem.command is not None: desc += SPACES * 4 + " 'command':'%s',\n" % menuItem.command except: pass try: if not menuItem.enabled: desc += SPACES * 4 + " 'enabled':0,\n" except: pass try: if menuItem.checkable: desc += SPACES * 4 + " 'checkable':1,\n" if menuItem.checked: desc += SPACES * 4 + " 'checked':1,\n" except: pass desc += SPACES * 4 + " },\n" return desc def resourceMenuAttributes(menu): desc = SPACES * 3 + " {'type':'Menu',\n" desc += SPACES * 3 + " 'name':'%s',\n" % menu.name desc += SPACES * 3 + """ 'label':%s,\n""" % repr(menu.label) desc += SPACES * 3 + " 'items': [\n" for m in menu.items: desc += resourceMenuItemAttributes(m) desc += SPACES * 3 + " ]\n" desc += SPACES * 3 + " },\n" return desc def resourceMenubarAttributes(menubar): desc = SPACES * 2 + "'menubar': {'type':'MenuBar',\n" desc += SPACES * 2 + " 'menus': [\n" for m in menubar.menus: desc += resourceMenuAttributes(m) desc += SPACES * 2 + " ]\n" desc += SPACES + " },\n" return desc def resourceBackgroundAttributes(background, bg): desc = " {'type':'Background',\n" desc += " 'name':'%s',\n" % bg.name desc += """ 'title':%s,\n""" % repr(bg.title) # KEA 2004-10-04 # need a more sophisticated way of specifying an optional position # but just saving the position the user is editing the window at # is bad, so turn it off for now ## desc += " 'position':%s,\n" % str(background.GetPositionTuple()) desc += " 'size':%s,\n" % str(background.GetSizeTuple()) if bg.statusBar is not None and bg.statusBar: desc += " 'statusBar':1,\n" if bg.foregroundColor is not None: desc += " 'foregroundColor':" + colorDescription(bg.foregroundColor) + ",\n" if bg.backgroundColor is not None: desc += " 'backgroundColor':" + colorDescription(bg.backgroundColor) + ",\n" if bg.icon is not None: desc += " 'icon':'%s',\n" % bg.icon if bg.image is not None: desc += " 'image':'%s',\n" % bg.image if bg.tiled: desc += " 'tiled':1,\n" if not bg.visible: desc += " 'visible':0,\n" if bg.style != []: desc += " 'style':%s,\n" % str(bg.style) desc += "\n" try: desc += resourceMenubarAttributes(bg.menubar) except: pass # KEA 2002-05-15 # strings if bg.strings != {}: desc += " 'strings': {\n" for s in bg.strings.__dict__: desc += """ %s:%s,\n""" % (repr(s), repr(bg.strings.__dict__[s])) desc += " },\n\n" desc += " 'components': [\n\n" return desc def resourceStackAttributes(background): if background.rsrc is None: print "no rsrc" # we should probably blow up here desc = "{'application':{'type':'Application',\n" desc += " 'name':'%s',\n" % background.rsrc.application.name desc += " 'backgrounds': [\n" desc += resourceBackgroundAttributes(background, background.rsrc.application.backgrounds[0]) return desc def resourceDialogAttributes(background, bg): desc = "{'type':'CustomDialog',\n" desc += " 'name':'%s',\n" % bg.name desc += " 'title':'%s',\n" % bg.title desc += " 'position':%s,\n" % str(background.GetPositionTuple()) desc += " 'size':%s,\n" % str(background.GetSizeTuple()) #if bg.statusBar is not None and bg.statusBar: # desc += " 'statusBar':1,\n" #desc += "\n" #if bg.foregroundColor is not None: # desc += " 'foregroundColor':" + colorDescription(bg.foregroundColor) + ",\n" #if bg.backgroundColor is not None: # desc += " 'backgroundColor':" + colorDescription(bg.backgroundColor) + ",\n" #if bg.image is not None: # desc += " 'image':'%s',\n" % bg.image #if bg.tiled != 0: # desc += " 'tiled':1,\n" # KEA 2002-09-12 # strings if bg.strings != {}: desc += "\n 'strings': {\n" for s in bg.strings.__dict__: desc += """ %s:%s,\n""" % (repr(s), repr(bg.strings.__dict__[s])) desc += " },\n\n" desc += " 'components': [\n\n" return desc def resourceAttributes(background): # KEA 2002-03-24 """ editingDialog = 0 try: name = background.rsrc.application.name except: editingDialog = 1 """ if background.editingDialog: desc = resourceDialogAttributes(background, background.rsrc) for w in background.components.order: if w not in background.sizingHandleNames: if not background.isSizingHandle(w): desc += widgetAttributes(background, background.components[w]) + "\n" desc += "] # end components\n" desc += "} # end CustomDialog\n" else: desc = resourceStackAttributes(background) for w in background.components.order: if w not in background.sizingHandleNames: if not background.isSizingHandle(w): desc += widgetAttributes(background, background.components[w]) + "\n" desc += "] # end components\n" desc += "} # end background\n" desc += "] # end backgrounds\n" desc += "} }\n" return desc PythonCard-0.8.2/tools/resourceEditor/modules/newComponentDialog.py0000644000076500007650000000356410110161506025465 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.3 $" __date__ = "$Date: 2004/08/16 16:39:34 $" """ from PythonCard import model class NewComponentDialog(model.CustomDialog): def __init__(self, aBg, original, attributes, offsets, title): model.CustomDialog.__init__(self, aBg) self.parent = aBg self.title = title if title.startswith("New"): add = "" else: add = "Copy" self.components.fldName.text = original['name'] + add if "label" in attributes: self.components.lblLabelOrText.text = "Label:" if "label" in original.keys(): self.components.fldLabelOrText.text = original['label'] + add else: self.components.fldLabelOrText.text = original['name'] + add elif "text" in attributes: self.components.lblLabelOrText.text = "Text:" if "text" in original.keys(): self.components.fldLabelOrText.text = original['text'] + add else: self.components.fldLabelOrText.text = original['name'] + add else: self.components.lblLabelOrText.visible = False self.components.fldLabelOrText.visible = False self.components.fldLabelOrText.enabled = False self.components.chkHorizontal.visible = offsets self.components.chkVertical.visible = offsets def newComponentDialog(aBg, original, attributes, offsets, title): dlg = NewComponentDialog(aBg, original, attributes, offsets, title) result = dlg.showModal() if result.accepted: result.name = dlg.components.fldName.text result.labelortext = dlg.components.fldLabelOrText.text result.horizontal = dlg.components.chkHorizontal.checked result.vertical = dlg.components.chkVertical.checked dlg.destroy() return result PythonCard-0.8.2/tools/resourceEditor/modules/newComponentDialog.rsrc.py0000644000076500007650000000216610112562605026441 0ustar alexalex00000000000000{'type':'CustomDialog', 'name':'Template', 'title':'Dialog Template', 'size':(300, 170), 'components': [ {'type':'TextField', 'name':'fldName', 'position':(60, 9), 'size':(230, -1), }, {'type':'TextField', 'name':'fldLabelOrText', 'position':(60, 40), 'size':(230, -1), }, {'type':'CheckBox', 'name':'chkHorizontal', 'position':(10, 80), 'label':'Offset Horizontally', }, {'type':'CheckBox', 'name':'chkVertical', 'position':(170, 80), 'label':'Offset Vertically', }, {'type':'Button', 'id':5100, 'name':'btnOK', 'position':(30, 110), 'label':'OK', }, {'type':'Button', 'id':5101, 'name':'btnCancel', 'position':(130, 110), 'label':'Cancel', }, {'type':'StaticText', 'name':'lblLabelOrText', 'position':(5, 40), 'size':(50, -1), 'alignment':'right', 'text':'Label:', }, {'type':'StaticText', 'name':'lblName', 'position':(5, 10), 'size':(50, -1), 'alignment':'right', 'text':'Name:', }, ] # end components } # end CustomDialog PythonCard-0.8.2/tools/resourceEditor/modules/propertyEditor.py0000644000076500007650000004647110130050476024735 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.56 $" __date__ = "$Date: 2004/10/03 19:21:34 $" """ from PythonCard import dialog, font, model, registry, util from PythonCard.event import ChangeListener import resourceOutput import time import os import string import wx # KEA this is a load of dingos' kidneys and needs to be rewritten # 2002-02-22 # now I'm compounding the problem by porting from the original # Property Editor to a PythonCard background class PropertyEditor(model.Background, ChangeListener): def on_initialize(self, event): self._parent = self.GetParent() self._comp = self._parent.components self._updatingComponent = 0 self.autoAttributeUpdate = True ##self.components.addChangeEventListener(self) self._comp.addChangeEventListener(self) self.checkItems = ['enabled', 'visible', 'editable', 'checked', 'default', \ 'rules', 'labels', 'ticks', 'horizontalScrollbar'] self.popItems = ['layout', 'border', 'style', 'alignment', 'stringSelection'] self.cantModify = ['id', 'name', 'alignment', 'layout', 'style', 'border', \ 'horizontalScrollbar', 'min', 'max', 'columns', 'rules', 'labels', 'ticks'] self.editItems = [self.components.wField, self.components.wColor, self.components.wFont, self.components.wTextArea, self.components.wChecked, self.components.wPop, self.components.wFile,] # KEA 2001-08-14 # this was causing an assertion error with the hybrid wxPython #self.components.wComponentList.SetSelection(0) if self.components.wComponentList.stringSelection == "": wClass = "" else: wName, wClass = self.components.wComponentList.stringSelection.split(" : ") self.setValidProps(wClass) #self.displayComponents(self.components) self.displayComponents(self._comp) self.visible = True # KEA 2004-08-23 # support updating of attributes without the need # for clicking the Update button def on_wField_closeField(self, event): if self.autoAttributeUpdate: self.updateComponent() def on_wTextArea_closeField(self, event): if self.autoAttributeUpdate: self.updateComponent() def on_wChecked_mouseClick(self, event): if self.autoAttributeUpdate: self.updateComponent() def on_wPop_select(self, event): if self.autoAttributeUpdate: self.updateComponent() def on_wColor_mouseClick(self, event): result = dialog.colorDialog(self, color=util.colorFromString(self.components.wField.text)) if result.accepted: self.components.wField.text = str(result.color) if self.autoAttributeUpdate: self.updateComponent() def on_wFont_mouseClick(self, event): wName, wClass = self.components.wComponentList.stringSelection.split(" : ") ##widget = self.components[wName] widget = self._comp[wName] f = widget.font if f is None: desc = font.fontDescription(widget.GetFont()) f = font.Font(desc) result = dialog.fontDialog(self, f) if result.accepted: #color = dlg.getColor() f = result.font #self.components.wField.SetValue("%s;%s" % (f, color)) self.components.wField.text = "%s" % f if self.autoAttributeUpdate: self.updateComponent() def on_wFile_mouseClick(self, event): path, filename = os.path.split(self.components.wField.text) result = dialog.openFileDialog(self, directory=path, filename=filename) if result.accepted: self.components.wField.text = util.relativePath(self._parent.filename, result.paths[0]) if self.autoAttributeUpdate: self.updateComponent() def addWidgetToComponentList(self, widget): wName = widget.name # KEA 2004-01-25 # just use __name__, the other code must have been something from wxPython 2.3 #wClass = str(widget.__class__).split('.') #self.components.wComponentList.Append(wName + " : " + wClass[len(wClass) - 1]) wClass = widget.__class__.__name__ self.components.wComponentList.Append(wName + " : " + wClass) # KEA 2002-02-23 # need to redo the logic below to avoid asserts in hybrid # versions of wxPython, but also be cleaner def deleteWidgetFromComponentList(self, wName, wClass): i = self.components.wComponentList.GetSelection() j = self.components.wComponentList.FindString(wName + " : " + wClass) if i == -1 or i != j: if j != -1: self.components.wComponentList.Delete(j) else: if j > 0: self.components.wComponentList.SetSelection(j - 1) if j != -1: self.components.wComponentList.Delete(j) if self.components.wComponentList.GetSelection() == -1: self.setValidProps("") self.hideAllBut(self.components.wField) else: wName, wClass = self.components.wComponentList.stringSelection.split(" : ") # deselect the name from properties list self.setValidProps(wClass) propName = self.components.wPropertyList.stringSelection if propName == "": propName = "name" self.components.wPropertyList.stringSelection = "name" self.displayProperty(wName, wClass, propName) def selectComponentList(self, wName, wClass): self.components.wComponentList.stringSelection = wName + " : " + wClass self.setValidProps(wClass) propName = self.components.wPropertyList.stringSelection #print propName if propName == "": propName = "name" self.components.wPropertyList.stringSelection = "name" self.displayProperty(wName, wClass, propName) c = self._parent.components[wName] self._parent.setToolTipDrag(wName, c.position, c.size) def changed(self, event): ##comp = self.components if self._updatingComponent: # KEA 2003-01-04 # hack to speed up updates in place return comp = self._comp wName, wClass = event.getOldValue().split(",") if wName in comp: # new item added self.addWidgetToComponentList(comp[wName]) else: # item deleted self.deleteWidgetFromComponentList(wName, wClass) """ def on_wCopy_mouseClick(self, event): wName, wClass = self.components.wComponentList.stringSelection.split(" : ") # what needs to happen here is to have a method for the Widget class that # will provide a valid resource description, each subclass of widget would # override the method to deal with their specific resource attributes # the Widget class should provide some ordering so that 'type', # 'position', 'size' comes before less commonly used items, the actual # ordering could just be defined in a list, so it is easy to change # also, if the current values match the defaults for a widget attribute # then that attribute should not be provided as part of the output print "this is just a placeholder method right now," print "the resource is not actually copied to the clipboard yet" pprint.pprint(self._comp[wName]) """ def on_wUpdate_mouseClick(self, event): self.updateComponent() def updateComponent(self): wName, wClass = self.components.wComponentList.stringSelection.split(" : ") propName = self.components.wPropertyList.stringSelection if propName in self.checkItems: value = self.components.wChecked.checked elif propName in self.popItems: value = self.components.wPop.stringSelection elif propName in ('items', 'userdata') or (wClass == 'TextArea' and propName == 'text'): value = self.components.wTextArea.text else: #value = self.components.wField.GetValue() value = self.components.wField.text if propName not in ['label', 'stringSelection', 'text', 'toolTip', 'userdata']: try: value = eval(value) except: pass # KEA 2004-05-10 # need to figure out where to stick validation code # but for now just need to make sure that if we're changing the name # attribute that it is valid, but similar checks will be necessary for # integer fields, a list of items, etc. # also maybe each attribute should have a doc or help string displayed # saying what the attribute does, example values, etc. if propName == 'name': badValue = False # if it isn't valid then display an alert and exit # must start with a letter and only contain alphanumeric characters if value == "" or value[0] not in string.ascii_letters: badValue = True else: alphanumeric = string.ascii_letters + string.digits for c in value: if c not in alphanumeric: badValue = True break if badValue: dialog.alertDialog(None, "Name must start with a letter and only contain letters and numbers.", 'Error: Name is invalid') self.components.wField.setFocus() self.components.wField.setSelection(-1, -1) return # check for duplicate names is done below ##widget = self.components[wName] widget = self._comp[wName] # KEA 2002-02-23 # I can't remember why this is actually necessary if propName == 'size': width, height = value if wClass not in ['BitmapCanvas', 'HtmlWindow']: bestWidth, bestHeight = widget.GetBestSize() if width == -1: width = bestWidth if height == -1: height = bestHeight widget.size = (width, height) #setattr(widget, propName, (width, height)) #print widget.size, propName, width, height else: if (propName in self.cantModify) or \ (propName == 'items' and wClass == 'RadioGroup'): order = self._comp.order.index(wName) desc = resourceOutput.widgetAttributes(self._parent, widget) if desc.endswith(',\n'): desc = eval(desc[:-2]) else: desc = eval(desc) if propName == 'name': if value == wName: # user didn't actually change the name return elif value in self._comp: # we already have a component with that name dialog.alertDialog(self, 'Another component already exists with the name ' + value, 'Error: unable to rename component') return if value is None: desc[propName] = 'none' elif propName in ['min', 'max']: desc[propName] = int(value) else: desc[propName] = value # need to experiment with freeze and thaw to avoid # a lot of update events startTime = time.time() # this is going to trigger a changed event # as we delete the old component self._updatingComponent = True del self._comp[wName] if propName == 'name': wName = value # this is going to trigger another changed event # as we create a new component with the changed attribute self._comp[wName] = desc c = self._comp[wName] wx.EVT_LEFT_DOWN(c, self._parent.on_mouseDown) wx.EVT_LEFT_UP(c, self._parent.on_mouseUp) wx.EVT_MOTION(c, self._parent.on_mouseDrag) # now restore the order of the component # have to update the startName in case the name was updated if propName == 'name': self._parent.startName = wName self._comp.order.remove(wName) self._comp.order.insert(order, wName) self._parent.fixComponentOrder(wName) self._updatingComponent = False endTime = time.time() #print "attribute change took:", endTime - startTime else: if wClass in ['Image', 'ImageButton'] and propName == 'file': cwd = os.getcwd() try: os.chdir(self._parent.filename) except: pass setattr(widget, propName, value) os.chdir(cwd) else: setattr(widget, propName, value) #print propName, value # KEA 2002-02-23 self._parent.showSizingHandles(wName) def setValidProps(self, wClass): #print "setValidProps", wClass oldProp = self.components.wPropertyList.stringSelection if wClass == "": self.components.wPropertyList.Clear() else: ##props = self.propList + self.optionalProps[wClass] ##props.sort() ##print "props", props # get the property (attribute) list from the spec klass = registry.Registry.getInstance().getComponentClass(wClass) props = klass._spec.getAttributes().keys() # KEA 2002-03-24 # only show the 'id' attribute for Button # and only when displaying dialog properties if not (self._parent.editingDialog and wClass == 'Button'): props.remove('id') props.sort() ##print "spec props", specProps self.components.wPropertyList.Clear() self.components.wPropertyList.InsertItems(props, 0) if oldProp in props: self.components.wPropertyList.stringSelection = oldProp def hideAllBut(self, widget): for w in self.editItems: if widget.id != w.id: w.visible = False def displayProperty(self, wName, wClass, propName): self.components.wName.text = propName + ":" ##widget = self.components[wName] widget = self._comp[wName] if propName in ['label', 'stringSelection', 'text', 'toolTip'] or propName in self.checkItems: value = getattr(widget, propName) else: value = str(getattr(widget, propName)) if propName in self.checkItems: self.hideAllBut(self.components.wChecked) self.components.wChecked.visible = True self.components.wChecked.checked = value elif propName in self.popItems: self.hideAllBut(self.components.wPop) self.components.wPop.visible = True self.components.wPop.Clear() if propName == 'stringSelection': for v in widget.items: self.components.wPop.Append(v) else: for v in widget._spec.getAttributes()[propName].values: self.components.wPop.Append(v) try: self.components.wPop.stringSelection = value except: # if value is empty or doesn't already exist pass elif propName in ('items', 'userdata') or (wClass == 'TextArea' and propName == 'text'): #print 'displaying TextArea' self.hideAllBut(self.components.wTextArea) self.components.wTextArea.visible = True self.components.wTextArea.text = value else: self.hideAllBut(self.components.wField) self.components.wField.visible = True if propName == 'foregroundColor' or propName == 'backgroundColor': self.components.wColor.visible = True elif propName == 'font': self.components.wFont.visible = True elif propName == 'file': self.components.wFile.visible = True self.components.wName.text = propName + ":" # KEA 2002-02-23 # I can't remember why this is actually necessary if propName == 'size': width, height = getattr(widget, propName) if wClass not in ['BitmapCanvas', 'HtmlWindow']: bestWidth, bestHeight = widget.GetBestSize() if width == bestWidth: width = -1 if height == bestHeight: height = -1 size = (width, height) value = str(size) self.components.wField.text = value # this should only display if the attribute is settable # so name, alignment, and others are read-only # KEA 2002-02-23 # wUpdate is always visible now self.components.wUpdate.visible = True def on_wComponentList_select(self, event): #print 'selectComponentListEvent: %s\n' % event.GetString() wName, wClass = event.GetString().split(" : ") # change the wPropertiesList to only show relevant properties # either display the name by default or try and preserve the # wPropertiesList selection and display that item, so for example # you could look at size for all widgets, simply by going up and down # the components list self.setValidProps(wClass) propName = self.components.wPropertyList.stringSelection #print propName if propName == "": propName = "name" self.components.wPropertyList.stringSelection = "name" self.displayProperty(wName, wClass, propName) self._parent.showSizingHandles(wName) c = self._parent.components[wName] self._parent.setToolTipDrag(wName, c.position, c.size) def on_wPropertyList_select(self, event): propName = event.GetString() wName, wClass = self.components.wComponentList.stringSelection.split(" : ") if wName != "": self.displayProperty(wName, wClass, propName) def clearComponentList(self): self.components.wComponentList.Clear() self.statusBar.text = '' def clearPropertyList(self): self.components.wPropertyList.Clear() def displayComponents(self, components): self.components.wComponentList.Freeze() self.components.wComponentList.Clear() self._comp = components for c in components.order: if c not in self._parent.sizingHandleNames: self.addWidgetToComponentList(components[c]) self.components.wComponentList.Thaw() self.components.wComponentList.Refresh() self.components.wComponentList.Update() def on_close(self, event): self.visible = False parent = self.GetParent() parent.menuBar.setChecked('menuViewPropertyEditor', 0) PythonCard-0.8.2/tools/resourceEditor/modules/propertyEditor.rsrc.py0000644000076500007650000000362410112710221025665 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'Template', 'backgrounds': [ {'type':'Background', 'name':'bgTemplate', 'title':'resourceEditor Property Editor', 'size':(405, 270), 'visible':0, 'statusBar':1, 'components': [ {'type':'Button', 'name':'wUpdate', 'position':(320, 195), 'label':'Update', 'visible':0, 'default':1, }, {'type':'Choice', 'name':'wPop', 'position':(130, 130), 'size':(-1, 21), 'items':[], 'visible':0, }, {'type':'CheckBox', 'name':'wChecked', 'position':(130, 132), 'visible':0, 'label':'', }, {'type':'TextArea', 'name':'wTextArea', 'position':(130, 130), 'size':(260, 50), 'visible':0, }, {'type':'Button', 'name':'wFont', 'position':(320, 130), 'label':'Font...', 'visible':0, }, {'type':'Button', 'name':'wColor', 'position':(320, 130), 'label':'Color...', 'visible':0, }, {'type':'Button', 'name':'wFile', 'position':(320, 130), 'label':'File...', 'visible':0, }, {'type':'TextField', 'name':'wField', 'position':(130, 130), 'size':(180, -1), }, {'type':'StaticText', 'name':'wName', 'position':(5, 135), 'size':(120, -1), 'alignment':'right', 'text':'name:', }, {'type':'List', 'name':'wPropertyList', 'position':(225, 20), 'size':(165, 100), 'items':[], }, {'type':'List', 'name':'wComponentList', 'position':(5, 20), 'size':(200, 100), 'items':[], }, {'type':'StaticText', 'name':'Properties', 'position':(228, 3), 'text':'Properties', }, {'type':'StaticText', 'name':'stcNameClass', 'position':(5, 3), 'text':'Name : Class', }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/tools/resourceEditor/modules/resourceOutput.py0000644000076500007650000002372310402012531024735 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.34 $" __date__ = "$Date: 2006/03/03 10:07:21 $" """ import wx SPACES = ' ' def colorDescription(color): if isinstance(color, str): return "'%s'" % color else: return "%s" % str(color) # this is a complete hack job in order to avoid # outputting defaults def widgetAttributes(background, aWidget): # this might be overly aggressive # it could be that the normal default of white might be different on these # various widgets rather than being the same, so the wxTextCtrl is # not a good comparison flds = ['TextField', 'PasswordField', 'TextArea'] txtWidgets = ['TextField', 'PasswordField', 'TextArea', 'Choice', 'List', 'Calendar', 'ComboBox'] imgWidgets = ['Image', 'ImageButton'] comp = background.propertyEditorWindow.components dFgC = comp.wUpdate.foregroundColor.Get() dBgC = comp.wUpdate.backgroundColor.Get() dFont = repr(comp.wUpdate.font) dTextBgC = comp.wField.backgroundColor.Get() # make sure these primary attributes show up # at the beginning of the listing # the remaining ones will be in alphabetical order dStr = "{'type':'%s', \n" % aWidget.__class__.__name__ # KEA 2002-03-24 # only save the special ids if background.editingDialog and aWidget.__class__.__name__ == 'Button': if aWidget.id in [wx.ID_OK, wx.ID_CANCEL, wx.ID_YES, wx.ID_NO]: dStr += " 'id':%d, \n" % aWidget.id dStr += " 'name':'%s', \n" % aWidget.name dStr += " 'position':%s, \n" % str(aWidget.position) # try and determine default sizes width, height = aWidget.size if aWidget.__class__.__name__ in imgWidgets: width, height = aWidget._size elif aWidget.__class__.__name__ not in ['BitmapCanvas', 'HtmlWindow', 'IEHtmlWindow', 'Gauge', 'StaticBox', 'FloatCanvas']: bestWidth, bestHeight = aWidget.GetBestSize() if bestWidth == width: width = -1 if bestHeight == height: height = -1 if width != -1 or height != -1: dStr += " 'size':(%d, %d), \n" % (width, height) #for key in aWidget._getAttributeNames(): attributes = aWidget._spec.getAttributes().keys() attributes.sort() for key in attributes: if key in ['id', 'bitmap', 'name', 'position', 'selection', 'size']: pass elif getattr(aWidget, key) is not None: #print aWidget.__class__.__name__, key, getattr(aWidget, key) value = getattr(aWidget, key) if key == 'file' and aWidget.__class__.__name__ in imgWidgets and value == '': dStr += " 'file':'', \n" continue if key == 'alignment' and \ aWidget.__class__.__name__ in ['StaticText', 'PasswordField', 'TextField', 'TextArea'] \ and value == 'left': continue if key == 'border' and aWidget.__class__.__name__ in txtWidgets and value == '3d': continue if key == 'backgroundColor' and \ aWidget.__class__.__name__ in txtWidgets and \ value.Get() == dTextBgC: continue if key == 'foregroundColor' and value.Get() == dFgC: continue if key == 'backgroundColor' and value.Get() == dBgC: continue if key == 'font' and repr(value) == dFont: continue if key == 'actionBindings' and value == {}: continue # KEA 2002-07-07 # what other Unicode strings do we need to deal with above? #print key, value, type(value) if isinstance(value, (str, unicode)): # if isinstance(value, unicode): # value = value.encode('ascii', 'ignore') # need to escape strings #pprint.pprint(value) if value != '': dStr += """ %s:%s, \n""" % (repr(key), repr(value)) else: if (key in ['editable', 'enabled', 'visible'] and value == True) or \ (key in ['checked', 'default', 'horizontalScrollbar'] and value == False): # don't include default values pass else: dStr += " '%s':%s, \n" % (key, value) dStr += ' },\n' return dStr def resourceMenuItemAttributes(menuItem): desc = SPACES * 4 + " {'type':'MenuItem',\n" desc += SPACES * 4 + " 'name':'%s',\n" % menuItem.name desc += SPACES * 4 + """ 'label':%s,\n""" % repr(menuItem.label) try: if menuItem.command is not None: desc += SPACES * 4 + " 'command':'%s',\n" % menuItem.command except: pass try: if not menuItem.enabled: desc += SPACES * 4 + " 'enabled':0,\n" except: pass try: if menuItem.checkable: desc += SPACES * 4 + " 'checkable':1,\n" if menuItem.checked: desc += SPACES * 4 + " 'checked':1,\n" except: pass desc += SPACES * 4 + " },\n" return desc def resourceMenuAttributes(menu): desc = SPACES * 3 + " {'type':'Menu',\n" desc += SPACES * 3 + " 'name':'%s',\n" % menu.name desc += SPACES * 3 + """ 'label':%s,\n""" % repr(menu.label) desc += SPACES * 3 + " 'items': [\n" for m in menu.items: desc += resourceMenuItemAttributes(m) desc += SPACES * 3 + " ]\n" desc += SPACES * 3 + " },\n" return desc def resourceMenubarAttributes(menubar): desc = SPACES * 2 + "'menubar': {'type':'MenuBar',\n" desc += SPACES * 2 + " 'menus': [\n" for m in menubar.menus: desc += resourceMenuAttributes(m) desc += SPACES * 2 + " ]\n" desc += SPACES + " },\n" return desc def resourceBackgroundAttributes(background, bg): desc = " {'type':'Background',\n" desc += " 'name':'%s',\n" % bg.name desc += """ 'title':%s,\n""" % repr(bg.title) # KEA 2004-10-04 # need a more sophisticated way of specifying an optional position # but just saving the position the user is editing the window at # is bad, so turn it off for now ## desc += " 'position':%s,\n" % str(background.GetPositionTuple()) desc += " 'size':%s,\n" % str(background.GetSizeTuple()) if bg.statusBar is not None and bg.statusBar: desc += " 'statusBar':1,\n" if bg.foregroundColor is not None: desc += " 'foregroundColor':" + colorDescription(bg.foregroundColor) + ",\n" if bg.backgroundColor is not None: desc += " 'backgroundColor':" + colorDescription(bg.backgroundColor) + ",\n" if bg.icon is not None: desc += " 'icon':'%s',\n" % bg.icon if bg.image is not None: desc += " 'image':'%s',\n" % bg.image if bg.tiled: desc += " 'tiled':1,\n" if not bg.visible: desc += " 'visible':0,\n" if bg.style != []: desc += " 'style':%s,\n" % str(bg.style) desc += "\n" try: desc += resourceMenubarAttributes(bg.menubar) except: pass # KEA 2002-05-15 # strings if bg.strings != {}: desc += " 'strings': {\n" for s in bg.strings.__dict__: desc += """ %s:%s,\n""" % (repr(s), repr(bg.strings.__dict__[s])) desc += " },\n\n" desc += " 'components': [\n\n" return desc def resourceStackAttributes(background): if background.rsrc is None: print "no rsrc" # we should probably blow up here desc = "{'application':{'type':'Application',\n" desc += " 'name':'%s',\n" % background.rsrc.application.name desc += " 'backgrounds': [\n" desc += resourceBackgroundAttributes(background, background.rsrc.application.backgrounds[0]) return desc def resourceDialogAttributes(background, bg): desc = "{'type':'CustomDialog',\n" desc += " 'name':'%s',\n" % bg.name desc += " 'title':'%s',\n" % bg.title desc += " 'position':%s,\n" % str(background.GetPositionTuple()) desc += " 'size':%s,\n" % str(background.GetSizeTuple()) #if bg.statusBar is not None and bg.statusBar: # desc += " 'statusBar':1,\n" #desc += "\n" #if bg.foregroundColor is not None: # desc += " 'foregroundColor':" + colorDescription(bg.foregroundColor) + ",\n" #if bg.backgroundColor is not None: # desc += " 'backgroundColor':" + colorDescription(bg.backgroundColor) + ",\n" #if bg.image is not None: # desc += " 'image':'%s',\n" % bg.image #if bg.tiled != 0: # desc += " 'tiled':1,\n" # KEA 2002-09-12 # strings if bg.strings != {}: desc += "\n 'strings': {\n" for s in bg.strings.__dict__: desc += """ %s:%s,\n""" % (repr(s), repr(bg.strings.__dict__[s])) desc += " },\n\n" desc += " 'components': [\n\n" return desc def resourceAttributes(background): # KEA 2002-03-24 """ editingDialog = 0 try: name = background.rsrc.application.name except: editingDialog = 1 """ if background.editingDialog: desc = resourceDialogAttributes(background, background.rsrc) for w in background.components.order: if w not in background.sizingHandleNames: desc += widgetAttributes(background, background.components[w]) + "\n" desc += "] # end components\n" desc += "} # end CustomDialog\n" else: desc = resourceStackAttributes(background) for w in background.components.order: if w not in background.sizingHandleNames: desc += widgetAttributes(background, background.components[w]) + "\n" desc += "] # end components\n" desc += "} # end background\n" desc += "] # end backgrounds\n" desc += "} }\n" return desc PythonCard-0.8.2/tools/resourceEditor/modules/stackInfoDialog.py0000644000076500007650000000114010106740617024731 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.9 $" __date__ = "$Date: 2004/08/12 19:14:23 $" """ from PythonCard import model import os class StackInfoDialog(model.CustomDialog): def __init__(self, aBg, rsrc): model.CustomDialog.__init__(self, aBg) self.parent = aBg # if some special setup is necessary, do it here self.components.fldName.text = rsrc.application.name def stackInfoDialog(parent): dlg = StackInfoDialog(parent, parent.rsrc) result = dlg.showModal() result.text = dlg.components.fldName.text dlg.destroy() return result PythonCard-0.8.2/tools/resourceEditor/modules/stackInfoDialog.rsrc.py0000644000076500007650000000120607540432225025705 0ustar alexalex00000000000000{'type':'CustomDialog', 'name':'stackInfo', 'title':'Stack Info', 'size':(270, 100), 'components': [ {'type':'StaticText', 'name':'stcName', 'position':(10, 10), 'size':(45, -1), 'text':'Name:', }, {'type':'TextField', 'name':'fldName', 'position':(60, 5), 'size':(188, -1), }, {'type':'Button', 'name':'btnOK', 'position':(10, 40), 'label':'OK', 'default':1, 'id':5100, }, {'type':'Button', 'name':'btnCancel', 'position':(115, 40), 'label':'Cancel', 'id':5101, }, ] # end components } # end CustomDialog PythonCard-0.8.2/tools/resourceEditor/modules/stringDialog.py0000644000076500007650000001144210112204202024302 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.12 $" __date__ = "$Date: 2004/08/22 20:56:34 $" """ from PythonCard import log, model, resource import os import wx NEWSTRING = 'newString' SPACER = ' : ' def stringResourceFromList(stringList): desc = " {\n" for s in stringList: desc += """ %s:%s,\n""" % (repr(s), repr(stringList[s])) # close strings desc += " }\n" d = eval(desc) return resource.Resource(d) class StringDialog(model.CustomDialog): def __init__(self, aBg, stringList): model.CustomDialog.__init__(self, aBg) self.parent = aBg """ # KEA 2004-08-22 # workaround/hack to make sure closeField message # is processed prior to the dialog being closed # this occurs when one of the fields are edited and then # the user clicks Ok # this hack works because we don't process on_close # the first time, but rather delay it by posting a second close message self.closeDialog = False """ # if some special setup is necessary, do it here self.stringList = stringList sortedStrings = self.stringList.keys() sortedStrings.sort() for s in sortedStrings: label = self.getLabelFromKey(s) self.components.listStrings.append(label) def parseStrings(self, rsrc): stringList = {} for s in rsrc.__dict__: stringList[s] = rsrc.__dict__[s] return stringList def getLabelFromKey(self, key): return key + SPACER + self.stringList[key].split('\n')[0] def updateItemLabel(self, n, key): label = self.getLabelFromKey(key) self.components.listStrings.setString(n, label) def getStringSelectionKey(self): return self.components.listStrings.stringSelection.split()[0] def on_fldName_closeField(self, event): print "closeField fldName", event.target.text newName = event.target.text previousName = self.getStringSelectionKey() # if the name changes then we have to check to see # if the dictionary already has a key with the new # name if newName in self.stringList: # replace? pass else: sel = self.components.listStrings.selection self.stringList[newName] = self.stringList[previousName] del self.stringList[previousName] #self.components.listStrings.setString(sel, newName) self.updateItemLabel(sel, newName) def on_fldValue_closeField(self, event): print "closeField fldValue", event.target.text sel = self.components.listStrings.selection name = self.getStringSelectionKey() self.stringList[name] = event.target.text self.updateItemLabel(sel, name) def displayItemAttributes(self, s): self.components.fldName.text = s self.components.fldValue.text = self.stringList[s] def on_listStrings_select(self, event): self.displayItemAttributes(self.getStringSelectionKey()) def on_btnDelete_mouseClick(self, event): sel = self.components.listStrings.selection name = self.getStringSelectionKey() if sel != -1: del self.stringList[name] self.components.listStrings.delete(sel) if len(self.stringList) > 0: if sel > len(self.stringList) - 1: sel = sel - 1 self.components.listStrings.selection = sel self.displayItemAttributes(self.getStringSelectionKey()) def on_btnNew_mouseClick(self, event): s = NEWSTRING if s in self.stringList: self.components.listStrings.stringSelection = self.getLabelFromKey(s) else: self.stringList[s] = '' sel = len(self.stringList) - 1 self.components.listStrings.append(s) self.components.listStrings.stringSelection = s self.updateItemLabel(sel, s) self.displayItemAttributes(self.getStringSelectionKey()) """ # KEA 2004-08-22 # experiment to workaround Mac closeField bug # ignore for now along with the extra debug print statements in closeField # event handlers above def on_mouseClick(self, event): try: print self.closeDialog print event.target.name print event.target.id except: pass if self.closeDialog: event.skip() else: self.closeDialog = True wx.PostEvent(self, event) """ def stringDialog(parent, rsrc): dlg = StringDialog(parent, rsrc) result = dlg.showModal() if result.accepted: result.stringList = stringResourceFromList(dlg.stringList) dlg.destroy() return result PythonCard-0.8.2/tools/resourceEditor/modules/stringDialog.rsrc.py0000644000076500007650000000232307474716104025302 0ustar alexalex00000000000000{'type':'CustomDialog', 'name':'stringDialog', 'title':'String Editor', 'size':(480, 300), 'components': [ {'type':'List', 'name':'listStrings', 'position':(0, 0), 'size':(185, 185), 'items':[], }, {'type':'Button', 'name':'btnNew', 'position':(5, 190), 'label':'New', }, {'type':'Button', 'name':'btnDelete', 'position':(108, 191), 'label':'Delete', }, {'type':'StaticText', 'name':'stcName', 'position':(200, 10), 'text':'Name:', }, {'type':'StaticText', 'name':'stcValue', 'position':(200, 35), 'text':'Value:', }, {'type':'TextField', 'name':'fldListIndex', 'position':(460, 5), 'visible':0, }, {'type':'TextField', 'name':'fldName', 'position':(260, 5), 'size':(188, -1), }, {'type':'TextArea', 'name':'fldValue', 'position':(260, 35), 'size':(188, 197), }, {'type':'Button', 'name':'btnOK', 'position':(10, 240), 'label':'OK', 'default':1, 'id':5100, }, {'type':'Button', 'name':'btnCancel', 'position':(115, 240), 'label':'Cancel', 'id':5101, }, ] # end components } # end CustomDialog PythonCard-0.8.2/tools/resourceEditor/readme.txt0000644000076500007650000000337410362235734021662 0ustar alexalex00000000000000Last updated: 2006-01-09 This represents the beginnings of a GUI resource (layout) editor for PythonCard. The layoutEditor is an experimental version that is intended to replace the existing resourceEditor and allows various operations to be performed on multiple selected components (eg. move, align, distribute, etc.) You can view the attributes for all components and menus by selecting the Resource... menu item in the View menu prior to doing a Save or Save As... under the File menu to output a new file. Known Bugs and Issues: There are no constraints applied when the shift key is held down, but there is a grid for the widgets to "snap to". Sizers and anchors are not supported. It is likely anchors will be supported before sizers. Some of the components don't move or resize correctly all the time, you should report problems to the mailing list. The Choice component seems prone to this movement problem. If a component is difficult to select or move, you can always select it via the Property Editor and then change its position attribute via the Property Editor rather than trying to drag the control itself; the sizing handles should also work. When editing a dialog or other window that doesn't have a menubar, you'll probably need to increase the vertical size of the window by 20 or 30 pixels to compensate for the resourceEditor menubar. Once your layout looks the way you want it you can subtract the pixel padding you added earlier. On Microsoft Windows, the menubar may wrap if the width of the window is not wide enough, in which case you'll need to add even more padding. Some future revision of the resourceEditor will use a separate window for doing layout so that the size of a window is always accurate and shows the menubar of the app you're editing. PythonCard-0.8.2/tools/resourceEditor/resourceEditor.py0000644000076500007650000021221310353151205023214 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.225 $" __date__ = "$Date: 2005/12/24 04:45:57 $" """ # TODO: Start using exceptions! import os, sys import pprint import webbrowser import wx from PythonCard import about, clipboard, configuration, dialog, graphic, log from PythonCard import menu, model, registry, resource, util from PythonCard.templates.dialogs import runOptionsDialog from modules import backgroundInfoDialog from modules import stackInfoDialog from modules import menuDialog from modules import newComponentDialog from modules import stringDialog from modules import dialogInfoDialog from modules.propertyEditor import PropertyEditor from modules import resourceOutput SIZING_HANDLE_SIZE = 7 NUM_SIZING_HANDLES = 8 RESOURCE_TEMPLATE = 'template.rsrc.py' RESOURCE_DIALOG_TEMPLATE = 'dialogTemplate.rsrc.py' USERCONFIG = 'user.config.txt' # KEA doc handling adapted from python_docs # method in IDLE EditorWindow.py pythoncard_url = util.documentationURL("documentation.html") resourceeditor_url = util.documentationURL("resource_editor_overview.html") class DummyDialog(model.CustomDialog): def __init__(self, aBg, path): # load the resource aDialogRsrc = resource.ResourceFile(path).getResource() model.CustomDialog.__init__(self, aBg, aDialogRsrc) def on_mouseClick(self, event): event.skip() class ResourceEditor(model.Background): def on_initialize(self, event): self.filename = None self.documentChanged = False self.cmdLineArgs = {'debugmenu':False, 'logging':False, 'messagewatcher':False, 'namespaceviewer':False, 'propertyeditor':False, 'shell':False, 'otherargs':''} self.lastCaptured = None self.startName = None self.startPosition = (0, 0) self.startSize = (0, 0) self.offset = (0, 0) self.startToolTip = '' try: self.readme = open('readme.txt').read() except: self.readme = '' # KEA 2002-06-27 # copied from codeEditor.py # wxFileHistory isn't wrapped, so use raw wxPython # also the file list gets appended to the File menu # rather than going in front of the Exit menu # I suspect I have to add the Exit menu after the file history # which means changing how the menus in resources are loaded # so I'll do that later self.fileHistory = wx.FileHistory() fileMenu = self.GetMenuBar().GetMenu(0) self.fileHistory.UseMenu(fileMenu) wx.EVT_MENU_RANGE(self, wx.ID_FILE1, wx.ID_FILE9, self.OnFileHistory) self.buildComponentsMenu() self.cursors = {} self.cursors['topRight'] = wx.StockCursor(wx.CURSOR_SIZENESW) self.cursors['bottomLeft'] = self.cursors['topRight'] self.cursors['topMiddle'] = wx.StockCursor(wx.CURSOR_SIZENS) self.cursors['bottomMiddle'] = self.cursors['topMiddle'] self.cursors['topLeft'] = wx.StockCursor(wx.CURSOR_SIZENWSE) self.cursors['bottomRight'] = self.cursors['topLeft'] self.cursors['middleLeft'] = wx.StockCursor(wx.CURSOR_SIZEWE) self.cursors['middleRight'] = self.cursors['middleLeft'] self.cursors['general'] = wx.StockCursor(wx.CURSOR_SIZING) self.cursors['null'] = wx.NullCursor self.sizingHandleNames = ['topLeft', 'topMiddle', 'topRight', 'middleLeft', 'middleRight', 'bottomLeft', 'bottomMiddle', 'bottomRight'] if wx.Platform == '__WXMSW__': path = os.path.join(self.application.applicationDirectory, 'images', 'sizingHandle.bmp') sizingHandleTemplate = {'type':'ImageButton', 'name':'topLeft', 'position':(3, 3), 'size':(SIZING_HANDLE_SIZE, SIZING_HANDLE_SIZE), 'file':path, 'border':'none', 'visible':0} elif wx.Platform == '__WXMAC__': #self.resizingHandleColor = (0,0,128) path = os.path.join(self.application.applicationDirectory, 'images', 'sizingHandle.bmp') sizingHandleTemplate = {'type':'Image', 'name':'topLeft', 'position':(3, 3), 'size':(SIZING_HANDLE_SIZE, SIZING_HANDLE_SIZE), 'file':path, #'backgroundColor':self.resizingHandleColor, 'border':'none', 'visible':0} else: self.resizingHandleColor = (0,0,128) sizingHandleTemplate = {'type':'ImageButton', 'name':'topLeft', 'position':(3, 3), 'size':(SIZING_HANDLE_SIZE, SIZING_HANDLE_SIZE), 'file':'', 'backgroundColor':self.resizingHandleColor, 'visible':0} for sizingHandle in self.sizingHandleNames: sizingHandleTemplate['name'] = sizingHandle self.components[sizingHandle] = sizingHandleTemplate self.propertyEditorWindow = model.childWindow(self, PropertyEditor) self.xGridSize = 5 self.yGridSize = 5 self.alignToGrid = self.menuBar.getChecked('menuOptionsAlignToGrid') self.showGridLines = self.menuBar.getChecked('menuOptionsShowGridLines') path = os.path.join(self.application.applicationDirectory, 'templates', \ RESOURCE_TEMPLATE) self.rsrc = resource.ResourceFile(path).getResource() self.updatePanel(self.rsrc) # KEA 2004-05-14 # this actually should only occur once for the panel # so I'm moving it into initialize which should work as long as # the panel isn't destroyed while editing, opening new files, etc. # KEA link up events for new dragging code wx.EVT_LEFT_DOWN(self.panel, self.on_mouseDown) wx.EVT_LEFT_UP(self.panel, self.on_mouseUp) wx.EVT_MOTION(self.panel, self.on_mouseDrag) wx.EVT_CHAR(self.panel, self.on_keyPress) self.configPath = os.path.join(configuration.homedir, 'resourceeditor') self.loadConfig() """ # KEA 2002-03-03 # this doesn't appear to work, some additional accelerator table modification # must be messing up the bindings # setup acceleratortable for background acctbl = wx.AcceleratorTable([ (wx.ACCEL_CTRL, ord('C'), self.menuBar.getMenuId('menuEditCopy')), (wx.ACCEL_CTRL, ord('X'), self.menuBar.getMenuId('menuEditCut')), (wx.ACCEL_CTRL, ord('V'), self.menuBar.getMenuId('menuEditPaste')) ]) self.SetAcceleratorTable(acctbl) """ # KEA 2001-12-24 # once we can do dynamic menus we should load the component list dynamically # to build the first part of the Component menu # Add BitmapCanvas # Add Button # ... # perhaps there should be a framework function to return the list of files in # the components directory or list of components and then a method in the # resourceEditor can load each component module as it builds the menu # MRV 2002-08-08 # copied and changed from codeEditor to allow commandline argument for resource file # then can use from windows explorer rightclick... if len(sys.argv) > 1: # accept a file argument on the command-line filename = os.path.abspath(sys.argv[1]) log.info('resourceEditor filename: ' + filename) if not os.path.exists(filename): filename = os.path.abspath(os.path.join(self.application.startingDirectory, sys.argv[1])) if os.path.isfile(filename): if filename.endswith('rsrc.py'): self.filename = filename self.openFile(filename) self.resizingHandler = { 'topLeft':self.on_topLeft_mouseDrag, 'topMiddle':self.on_topMiddle_mouseDrag, 'topRight':self.on_topRight_mouseDrag, 'middleLeft':self.on_middleLeft_mouseDrag, 'middleRight':self.on_middleRight_mouseDrag, 'bottomLeft':self.on_bottomLeft_mouseDrag, 'bottomMiddle':self.on_bottomMiddle_mouseDrag, 'bottomRight':self.on_bottomRight_mouseDrag } self.createDC() def OnFileHistory(self, event): fileNum = event.GetId() - wx.ID_FILE1 path = self.fileHistory.GetHistoryFile(fileNum) if self.documentChanged: save = self.saveChanges() if save == "Cancel": # don't do anything, just go back to editing return elif save == "No": # any changes will be lost pass else: if self.filename is None: # if the user cancels out of the Save As then go back to editing if not self.on_menuFileSaveAs_select(None): return else: self.saveFile() self.openFile(path) # KEA 2004-05-12 # transition to dynamic component menu # and component addition def buildComponentsMenu(self): """ Dynamically build the menu for the components supported by the resourceEditor. Eventually this will be a list or some form of palette instead of a menu. """ # only built-in components are handled currently, so an appcomponents # directory or fully-qualified component paths are handled # theoretically when the user loads a resource file the menu should # be updated, but this is all highly dependent on how imports are # handled, registry updated, etc. # One idea would be for the resourceEditor to register itself as # a change listener and have the registry subclass Changeable so it could # notify the resourceEditor. In that case, the algorithm below would # have to be modified since each menu item would be added as it receives # a change notice from the registry and would need to check the existing # menu to prevent duplicates as well as insert into the menu in the correct # order. Or perhaps, the menu items could be wiped out and recreated which # is probably simpler. # get a list of all the modules in components moduleNames = registry.Registry.getInstance().findBuiltInComponents() # KEA 2004-05-12 # I know that IEHtmlWindow is platform specific and has problems # in the resourceEditor and Grid doesn't work right either so I'm # conditionally preventing them from being loaded here until I figure # out how to deal with them # Container is another one that isn't applicable yet if True: try: moduleNames.remove('iehtmlwindow') except ValueError: pass if True: try: moduleNames.remove('grid') except ValueError: pass if True: try: moduleNames.remove('container') except ValueError: pass # need to force an import of all of the modules in components for name in moduleNames: resource.loadComponentModule(name) # should match based on name instead # name to object or id like menubar helpers? m = self.menuBar.menus[2] names = registry.Registry.getInstance().components.keys() names.sort() for key in names: rsrc = resource.Resource({'type':'MenuItem', 'name': 'menuComponentAdd' + key, 'label': key, 'command':'componentAdd'}) mi = menu.MenuItem(self, m, rsrc) m.appendMenuItem(mi) def clearWidgets(self): for w in self.components.keys(): if w not in self.sizingHandleNames: del self.components[w] def positionSizingHandles(self, position, size): x, y = position width, height = size halfHandleSize = SIZING_HANDLE_SIZE / 2 log.debug('positionSizingHandles position:' + str(position) + ", size:" + str(size)) self.components['topLeft'].position = (x - SIZING_HANDLE_SIZE, y - SIZING_HANDLE_SIZE) self.components['topMiddle'].position = (x + (width / 2) - halfHandleSize, y - SIZING_HANDLE_SIZE) self.components['topRight'].position = (x + width, y - SIZING_HANDLE_SIZE) self.components['middleLeft'].position = (x - SIZING_HANDLE_SIZE, y + (height / 2) - halfHandleSize) self.components['middleRight'].position = (x + width, y + (height / 2) - halfHandleSize) self.components['bottomLeft'].position = (x - SIZING_HANDLE_SIZE, y + height) self.components['bottomMiddle'].position = (x + (width / 2) - halfHandleSize, y + height) self.components['bottomRight'].position = (x + width, y + height) def showSizingHandles(self, name): self.startName = name self.positionSizingHandles(self.components[name].position, self.components[name].size) for sizingHandle in self.sizingHandleNames: self.components[sizingHandle].visible = True if wx.Platform == '__WXMAC__': pass #self.components[sizingHandle].backgroundColor = self.resizingHandleColor elif wx.Platform == '__WXGTK__': self.components[sizingHandle].backgroundColor = self.resizingHandleColor # overly conservative, but effective self.documentChanged = True def hideSizingHandles(self): if self.components.topLeft.visible: for sizingHandle in self.sizingHandleNames: self.components[sizingHandle].visible = False if wx.Platform == '__WXMAC__': self.panel.Refresh() def gtkHideSizingHandles(self, name): for sizingHandle in self.sizingHandleNames: if sizingHandle == name: self.components[sizingHandle].backgroundColor = self.backgroundColor else: self.components[sizingHandle].visible = False def setToolTip(self, target): self.propertyEditorWindow.statusBar.text = "Component: %s Pos: %s Size: %s" % (str(target.name), str(target.position), str(target.size)) """ x, y = target.position width, height = target.size tip = "name: " + target.name + " \n" + \ "position: " + str(x) + ", " + str(y) + " \n" + \ "size: " + str(width) + ", " + str(height) if tip != target.toolTip: target.toolTip = tip """ def setToolTipDrag(self, name, position, size): self.propertyEditorWindow.statusBar.text = "Component: %s Pos: %s Size: %s" % (name, str(position), str(size)) def on_mouseEnter(self, event): name = event.target.name if name in self.sizingHandleNames: try: self.SetCursor(self.cursors[name]) except: # not all platforms have all cursors, but hopefully # the general sizing cursor is always available self.SetCursor(self.cursors['general']) else: # KEA 2003-05-05 # get rid of cursor change on wxTextCtrl self.SetCursor(wx.StockCursor(wx.CURSOR_ARROW)) self.setToolTip(event.target) def on_mouseLeave(self, event): if event.target.name in self.sizingHandleNames: self.SetCursor(self.cursors['null']) def pointInControl(self, position): #print 'pointInControl:' #position = self.panel.ClientToScreen( position ) #print ' position=', position globalPosition = self.panel.ScreenToClient(wx.GetMousePosition()) #print ' globalPosition=', globalPosition result = None for name in self.components.order: if name in self.sizingHandleNames: continue control = self.components[name] r = control.GetRect() #print ' ', control, r if (r.Inside(globalPosition)): #print ' ', control result = control break #print "pointInControl", result return result # KEA 2004-03-27 # the DC and lastPosition handling are basically a bunch # of hacks for event bugs in WXMAC and I'm sure I'm going to regret them def createDC(self): dc = wx.ClientDC(self.panel) dc.SetPen(wx.Pen('black', 1, wx.DOT)) dc.SetBrush(wx.TRANSPARENT_BRUSH) dc.SetLogicalFunction(wx.INVERT) self.dc = dc def on_size(self, event): self.createDC() event.skip() def drawTheRect(self): position = [self.startGlobalPosition[0], self.startGlobalPosition[1]] position[0] = position[0] - self.startGlobalOffset[0] position[1] = position[1] - self.startGlobalOffset[1] ##rect = [self.startGlobalPosition[0], self.startGlobalPosition[1], self.startSize[0], self.startSize[1]] ##rect[0] = rect[0] - self.startGlobalOffset[0] ##rect[1] = rect[1] - self.startGlobalOffset[1] ##print "drawTheRect", rect ##dc.DrawRectangle(rect[0], rect[1], rect[2], rect[3]) self.dc.DrawRectanglePointSize((position[0], position[1]), (self.startSize[0], self.startSize[1])) ##self.rect = rect self.lastPosition = position #print " self.lastPosition", self.lastPosition def on_mouseDoubleClick(self, event): # AGT 2005-05-12 Should be unnecessary - but seems to prevent the problem where a double-click # was causing subsequent GetEventObjects to "stick" on the button ##print "dc", event.GetEventObject().GetName() pass def on_mouseDown(self, event): # KEA 2003-03-23 # protect against panel events #print "on_mouseDown" globalPosition = wx.GetMousePosition() control = event.GetEventObject() if control is self.panel: control = self.pointInControl(event.GetPosition()) if control is None: self.hideSizingHandles() self.startName = None return #target = event.target target = control if target.name not in self.sizingHandleNames: self.startName = target.name if self.application.pw is not None: self.application.pw.selectComponentsList(target.name, target.__class__.__name__) # KEA 2002-02-23 self.propertyEditorWindow.selectComponentList(target.name, target.__class__.__name__) # KEA 2003-03-23 # new drag code self.startGlobalPosition = self.panel.ScreenToClient(globalPosition) self.startGlobalOffset = target.ScreenToClient(globalPosition) # KEA 2003-05-05 # workaround for 3D border on Windows t = target.__class__.__name__ if wx.Platform == "__WXMSW__": if ['List', 'PasswordField', 'TextField', 'TextArea'].count(t): self.startGlobalOffset = [self.startGlobalOffset[0] + wx.SystemSettings.GetMetric(wx.SYS_EDGE_X), self.startGlobalOffset[1] + wx.SystemSettings.GetMetric(wx.SYS_EDGE_Y)] elif ['Gauge', 'StaticLine'].count(t): self.startGlobalOffset = [self.startGlobalOffset[0] + wx.SystemSettings.GetMetric(wx.SYS_BORDER_X), self.startGlobalOffset[1] + wx.SystemSettings.GetMetric(wx.SYS_BORDER_Y)] elif t == 'Spinner': # compensate for width of TextCtrl portion of # compound control - width of arrow buttons self.startGlobalOffset[0] += target.size[0] - 16 elif wx.Platform == "__WXMAC__": # KEA 2004-07-27 # The SYS_EDGE and SYS_BORDER numbers don't seem to work on the Mac # so I just experimented to find the values below to prevent the components # from "hopping" when the user selects them if ['List'].count(t): self.startGlobalOffset = [self.startGlobalOffset[0] - 1, self.startGlobalOffset[1] - 1] elif ['PasswordField', 'TextField', 'TextArea'].count(t): self.startGlobalOffset = [self.startGlobalOffset[0] + 3, self.startGlobalOffset[1] + 3] elif ['StaticBox'].count(t): # KEA 2004-08-16 # sigh, another complete behavior hack if target.label: self.startGlobalOffset = [self.startGlobalOffset[0] + 4, self.startGlobalOffset[1] + 18] else: self.startGlobalOffset = [self.startGlobalOffset[0] + 4, self.startGlobalOffset[1] + 3] #print "globalPosition", globalPosition #print "self.startGlobalPosition", self.startGlobalPosition #print "self.startGlobalOffset", self.startGlobalOffset ##self.startGlobalPosition[0] =- self.startGlobalOffset[0] ##self.startGlobalPosition[1] =- self.startGlobalOffset[1] self.hideSizingHandles() else: if not self.startName: return #print "res4 sizing handles", self.startName self.resizingHandleTarget = target.name if wx.Platform == '__WXMSW__': self.hideSizingHandles() elif wx.Platform == '__WXMAC__': self.hideSizingHandles() ##if self.lastCaptured is not None: ## self.lastCaptured.ReleaseMouse() ##target.CaptureMouse() ##self.lastCaptured = target else: #print "capturing mouse" #if self.lastCaptured is not None: # self.lastCaptured.ReleaseMouse() #self.gtkHideSizingHandles(target.name) self.hideSizingHandles() #target.CaptureMouse() #self.lastCaptured = target self.startPosition = self.components[self.startName].position self.startSize = self.components[self.startName].size self.offset = target.ScreenToClient(globalPosition) if target.name not in self.sizingHandleNames: self.drawTheRect() self.movingComponent = True #self.startToolTip = self.components[self.startName].toolTip ###print "capturing mouse" ###if self.lastCaptured is not None: ### self.lastCaptured.ReleaseMouse() #self.gtkHideSizingHandles(target.name) ###target.CaptureMouse() ###self.lastCaptured = targe ##event.skip() def on_mouseDrag(self, event): ##print "on_mouseDrag", event.Dragging() # protect against double-clicks in the open file dialog # when switching rsrc.py files #if event.target.name not in self.sizingHandleNames and self.startName in self.components: if not event.Dragging(): return #print "on_mouseDrag" if wx.Platform == '__WXMAC__' and not hasattr(self, 'lastPosition'): self.on_mouseDown(event) if self.startName in self.components: if not self.movingComponent and self.resizingHandleTarget: self.resizingHandler[self.resizingHandleTarget](event) return self.hideSizingHandles() # erase the last rect self.dc.DrawRectanglePointSize((self.lastPosition[0], self.lastPosition[1]), (self.startSize[0], self.startSize[1])) # use the global mouse position and the initial offset and start # to figure out where to draw a rect in global coordinates x, y = self.panel.ScreenToClient(wx.GetMousePosition()) xOffset = x - self.startGlobalOffset[0] yOffset = y - self.startGlobalOffset[1] if self.alignToGrid: xOffset = xOffset / self.xGridSize * self.xGridSize yOffset = yOffset / self.yGridSize * self.yGridSize self.lastPosition[0] = xOffset self.lastPosition[1] = yOffset self.dc.DrawRectanglePointSize((self.lastPosition[0], self.lastPosition[1]), (self.startSize[0], self.startSize[1])) # doesn't do anything if just drawing rects self.setToolTipDrag(self.startName, self.lastPosition, self.startSize) ##event.skip() # KEA 2004-09-15 # support cursor keys to move components one pixel at a time # the event is coming from the panel so we have to use the wx methods def on_keyPress(self, event): keyCode = event.GetKeyCode() if keyCode in (wx.WXK_LEFT, wx.WXK_UP, wx.WXK_RIGHT, wx.WXK_DOWN): # self.startName might not be set # that may actually be a bug, but this should always work s = self.propertyEditorWindow.components.wComponentList.stringSelection if s: name = s.split(" : ")[0] if name in self.components: x, y = self.components[name].position if self.alignToGrid: # for now I'm only going to align to grid # in the direction of the cursor movement if keyCode == wx.WXK_LEFT: x = (x - self.xGridSize) / self.xGridSize * self.xGridSize elif keyCode == wx.WXK_RIGHT: x = (x + self.xGridSize) / self.xGridSize * self.xGridSize elif keyCode == wx.WXK_UP: y = (y - self.yGridSize) / self.yGridSize * self.yGridSize elif keyCode == wx.WXK_DOWN: y = (y + self.yGridSize) / self.yGridSize * self.yGridSize else: if keyCode == wx.WXK_LEFT: x = x - 1 elif keyCode == wx.WXK_RIGHT: x = x + 1 elif keyCode == wx.WXK_UP: y = y - 1 elif keyCode == wx.WXK_DOWN: y = y + 1 self.components[name].position = (x, y) # make sure sizing handles follow component self.showSizingHandles(name) # update the position on the propertyEditor status bar self.setToolTipDrag(name, (x, y), self.components[name].size) def on_mouseUp(self, event): # protect against double-clicks in the open file dialog # when switching rsrc.py files ####print "on_mouseUp BEFORE", self.rect if self.startName in self.components: if self.movingComponent: self.dc.DrawRectanglePointSize((self.lastPosition[0], self.lastPosition[1]), (self.startSize[0], self.startSize[1])) self.components[self.startName].position = (self.lastPosition[0], self.lastPosition[1]) #print "on_mouseUp", self.lastPosition self.panel.Refresh() self.movingComponent = False if wx.Platform == '__WXMAC__': ##if self.lastCaptured is not None: ## self.lastCaptured.ReleaseMouse() ## self.lastCaptured = None #event.target.ReleaseMouse() # clear up drag artifacts self.Refresh() if wx.Platform == '__WXGTK__': ##if self.lastCaptured is not None: ## self.lastCaptured.ReleaseMouse() ## self.lastCaptured = None #event.target.ReleaseMouse() self.Refresh() self.showSizingHandles(self.startName) self.resizingHandleTarget = None #self.setToolTip(self.components[self.startName]) #self.components[self.startName].toolTip = self.startToolTip # KEA 2003-05-13 # these should no longer be needed ## # KEA 2002-04-30 ## # workaround for WXMAC ## def on_mouseClick(self, event): ## print "on_mouseClick" ## if wx.Platform == '__WXMAC__': ## self.on_mouseUp(event) ## ## # KEA 2002-04-30 ## # workaround for WXMAC ## def on_select(self, event): ## print "on_select" ## if wx.Platform == '__WXMAC__': ## self.on_mouseUp(event) # KEA 2001-12-24 # I need to refactor the common elements of the resizing handle code # I also want to add a Component info window to show the component # name, position, size as the component is moved and resized # THe 2002-08-29 # Refactored the common elements of resizing handle code. def doResize(self, event, (n, w, s, e)): if not self.startName: return # AGT 2005-05-17 Removed obsolete Windows variant globalPosition = wx.GetMousePosition() x, y = self.components[self.resizingHandleTarget].ScreenToClient(globalPosition) xOffset = x - self.offset[0] yOffset = y - self.offset[1] xStartOffset = self.startPosition[0] + e * xOffset yStartOffset = self.startPosition[1] + n * yOffset if self.alignToGrid: xOffset = xOffset / self.xGridSize * self.xGridSize yOffset = yOffset / self.yGridSize * self.yGridSize xStartOffset = xStartOffset / self.xGridSize * self.xGridSize yStartOffset = yStartOffset / self.yGridSize * self.yGridSize width = self.startSize[0] + (w - e) * xOffset height = self.startSize[1] + (s - n) * yOffset self.components[self.startName].position = (xStartOffset, yStartOffset) self.components[self.startName].size = (width, height) self.setToolTip(self.components[self.startName]) def on_topLeft_mouseDrag(self, event): self.doResize(event, (1, 0, 0, 1)) def on_topMiddle_mouseDrag(self, event): self.doResize(event, (1, 0, 0, 0)) def on_topRight_mouseDrag(self, event): self.doResize(event, (1, 1, 0, 0)) def on_middleLeft_mouseDrag(self, event): self.doResize(event, (0, 0, 0, 1)) def on_middleRight_mouseDrag(self, event): self.doResize(event, (0, 1, 0, 0)) def on_bottomLeft_mouseDrag(self, event): self.doResize(event, (0, 0, 1, 1)) def on_bottomMiddle_mouseDrag(self, event): self.doResize(event, (0, 0, 1, 0)) def on_bottomRight_mouseDrag(self, event): self.doResize(event, (0, 1, 1, 0)) def saveChanges(self): if self.filename is None: filename = "Untitled" else: filename = self.filename msg = "The data in the %s file has changed.\n\nDo you want to save the changes?" % filename result = dialog.messageDialog(self, msg, 'resourceEditor', wx.ICON_EXCLAMATION | wx.YES_NO | wx.CANCEL) return result.returnedString def newFile(self, fullTemplatePath): """ KEA 2003-07-31 the logic of where templates come from, the user selecting a template, prompting to save, etc. should be refactored especially if we are going to support a pythoncard_config/resourceEditor/templates directory for user-specific resource/code templates for now we'll assume a single templates dir and put the save logic here also need to decide if resourceEditor should startup differently like not showing a new layout to begin with maybe have an option to start with a new project prompt, open resource dialog, or none so user can select from the history (always lots of UI decisions ;-) """ # prompt to save # user will probably end up creating a new dir # and changing the filename templatePath, templateFilename = os.path.split(fullTemplatePath) #print path, filename # have the user save the source or resource?! wildcard = "Python files (*.py)|*.py" # don't set the starting dir, let user navigate result = dialog.saveFileDialog(None, "Save As", "", templateFilename[:-8] + ".py", wildcard) if result.accepted: path = result.paths[0] if path.endswith('.rsrc.py'): basepath = os.path.splitext(os.path.splitext(path)[0])[0] elif path.endswith('.py'): basepath = os.path.splitext(path)[0] else: # user didn't use a .py extension? # should this be an error? basepath = path #print basepath # now we need to copy and rename the # template files to the user chosen location import shutil destPath, destFilename = os.path.split(basepath) # copy the .py file fname = os.path.join(templatePath, templateFilename[:-8] + ".py") tname = os.path.join(destPath, destFilename + ".py") #print "copying", tname shutil.copy(fname, tname) # copy the .rsrc.py file fname = os.path.join(templatePath, templateFilename) tname = os.path.join(destPath, destFilename + ".rsrc.py") #print "copying", tname shutil.copy(fname, tname) self.filename = tname #print self.filename else: # present a dialog instead?! return self.resetAndClearWidgets() path = os.path.join(self.filename) self.rsrc = resource.ResourceFile(path).getResource() ##self.filename = None self.updatePanel(self.rsrc) if self.editingDialog: comp = self.rsrc.components else: comp = self.rsrc.application.backgrounds[0].components for w in comp: self.components[w.name] = w self.rebindEventsForDragging() self.documentChanged = False # could change the resource and title bar # here to give the user more feedback def saveFile(self): if self.filename is None: return self.on_menuFileSaveAs_select(None) else: ##desc = self.resourceAttributes() desc = resourceOutput.resourceAttributes(self) try: f = open(self.filename, 'w') f.write(desc) f.close() self.documentChanged = False self.fileHistory.AddFileToHistory(self.filename) return True except Exception, e: message = 'The resource file could not be saved.\n' + str( e ) dialog.messageDialog(self, message, 'ResourceEditor Error', wx.ICON_EXCLAMATION | wx.OK) return False def revertFile(self): self.resetAndClearWidgets() if self.filename is None: path = os.path.join(self.application.applicationDirectory, 'templates', \ RESOURCE_TEMPLATE) self.rsrc = resource.ResourceFile(path).getResource() else: self.rsrc = resource.ResourceFile(self.filename).getResource() self.updatePanel(self.rsrc) # KEA 2002-03-24 # either we're editing a Background or a Dialog if self.editingDialog: comp = self.rsrc.components else: comp = self.rsrc.application.backgrounds[0].components for w in comp: self.components[w.name] = w self.rebindEventsForDragging() self.documentChanged = False def getNewFileTemplates(self): templatesDir = os.path.join(self.application.applicationDirectory, 'templates') fileList = os.listdir(templatesDir) #fileList.sort() templates = [] for filename in fileList: # get 'title' path = os.path.join(templatesDir, filename) if os.path.isfile(path): try: rsrc = resource.ResourceFile(path).getResource() try: templates.append((rsrc.application.backgrounds[0].title, path, 'background')) except: templates.append((rsrc.title, path, 'dialog')) except: # not a resource file pass templates.sort() return templates def doNewFile(self): templates = self.getNewFileTemplates() listX = [] for t in templates: #print t[0], t[2], t[1] listX.append(t[0]) result = dialog.singleChoiceDialog(self, "Choose a resource template", "Templates", listX) if result.accepted: name = result.selection for t in templates: if t[0] == name: filename = t[1] self.newFile(filename) def on_menuFileNew_select(self, event): if self.documentChanged: save = self.saveChanges() if save == "Cancel": # don't do anything, just go back to editing pass elif save == "No": # any changes will be lost #self.newFile(RESOURCE_TEMPLATE) self.doNewFile() else: if self.filename is None: if self.on_menuFileSaveAs_select(None): #self.newFile(RESOURCE_TEMPLATE) self.doNewFile() else: self.saveFile() #self.newFile(RESOURCE_TEMPLATE) self.doNewFile() else: #self.newFile(RESOURCE_TEMPLATE) self.doNewFile() def on_menuFileNewDialog_select(self, event): if self.documentChanged: save = self.saveChanges() if save == "Cancel": # don't do anything, just go back to editing pass elif save == "No": # any changes will be lost self.newFile(RESOURCE_DIALOG_TEMPLATE) else: if self.filename is None: if self.on_menuFileSaveAs_select(None): self.newFile(RESOURCE_DIALOG_TEMPLATE) else: self.saveFile() self.newFile(RESOURCE_DIALOG_TEMPLATE) else: self.newFile(RESOURCE_DIALOG_TEMPLATE) def on_menuFileSave_select(self, event): self.saveFile() def on_menuFileSaveAs_select(self, event): if self.filename is None: path = '' filename = '' else: path, filename = os.path.split(self.filename) wildcard = "resource files (*.rsrc.py)|*.rsrc.py" result = dialog.saveFileDialog(None, "Save As", path, filename, wildcard) if result.accepted: path = result.paths[0] # KEA 2002-06-01 # force .rsrc.py extension # the one problem with this is that # the user won't be prompted for an overwrite # of a .rsrc.py file if they didn't enter that # in the save as dialog if not path.endswith('.rsrc.py'): path = os.path.splitext(path)[0] + '.rsrc.py' ##desc = self.resourceAttributes() desc = resourceOutput.resourceAttributes(self) try: f = open(path, 'w') f.write(desc) f.close() self.filename = path self.documentChanged = False return True except: return False else: return False def on_menuFileRevert_select(self, event): if self.documentChanged: if self.filename is None: filename = "Untitled" else: filename = self.filename msg = "You will lose any changes you've made to %s.\n\nAre you sure you want to revert to the last saved version?" % filename result = dialog.messageDialog(self, msg, 'resourceEditor', wx.ICON_EXCLAMATION | wx.YES_NO | wx.CANCEL | wx.NO_DEFAULT) save = result.returnedString if save == "Cancel" or save == "No": # don't do anything, just go back to editing pass else: # any changes will be lost self.revertFile() else: self.revertFile() def resetAndClearWidgets(self): self.startName = None self.startPosition = (0, 0) self.startSize = (0, 0) self.offset = (0, 0) if self.application.pw is not None: if wx.Platform == '__WXMAC__': self.application.pw.selectComponentsList('topLeft', 'Image') else: self.application.pw.selectComponentsList('topLeft', 'ImageButton') # KEA 2002-02-23 self.propertyEditorWindow.clearComponentList() self.propertyEditorWindow.clearPropertyList() self.hideSizingHandles() self.clearWidgets() def openFile(self, path): self.resetAndClearWidgets() os.chdir(os.path.dirname(path)) self.filename = path rsrc = resource.ResourceFile(path).getResource() self.rsrc = rsrc self.updatePanel(self.rsrc) # KEA 2002-03-24 # either we're editing a Background or a Dialog if self.editingDialog: comp = self.rsrc.components else: comp = self.rsrc.application.backgrounds[0].components for w in comp: self.components[w.name] = w self.rebindEventsForDragging() self.documentChanged = False self.fileHistory.AddFileToHistory(self.filename) def doOpenFile(self): wildcard = "resource files (*.rsrc.py)|*.rsrc.py" result = dialog.openFileDialog(None, "Import which resource file?", '', '', wildcard) if result.accepted: self.openFile(result.paths[0]) def on_menuFileOpen_select(self, event): if self.documentChanged: save = self.saveChanges() if save == "Cancel": # don't do anything, just go back to editing pass elif save == "No": # any changes will be lost self.doOpenFile() else: if self.filename is None: if self.on_menuFileSaveAs_select(None): self.doOpenFile() else: self.saveFile() self.doOpenFile() else: self.doOpenFile() def on_menuHelpAbout_select(self, event): dialog.scrolledMessageDialog(self, self.readme, 'About resourceEditor...') def on_doHelpAboutPythonCard_command(self, event): about.aboutPythonCardDialog(self) def fixComponentOrder(self, name): # KEA 2005-12-23 # Lower() doesn't appear to always work correctly, # so use Raise instead with a reversed list r = self.components.order[:] r.reverse() for c in r: self.components[c].Raise() if self.application.pw is not None: self.application.pw.clearComponentsList() self.application.pw.displayComponents(self.components) self.application.pw.selectComponentsList(name, self.components[name].__class__.__name__) # KEA 2002-02-23 ##self.propertyEditorWindow.Freeze() self.propertyEditorWindow.clearComponentList() self.propertyEditorWindow.displayComponents(self.components) self.propertyEditorWindow.selectComponentList(name, self.components[name].__class__.__name__) ##self.propertyEditorWindow.Thaw() def create_component(self, desc, offsets, promptString, errString): optionalAttributes = registry.Registry.getInstance().components[desc['type']]._spec._optionalAttributes.keys() result = newComponentDialog.newComponentDialog(self, desc, optionalAttributes, offsets, promptString) if result.accepted: name = result.name if name in self.components: dialog.alertDialog(self, name + " already exists", 'Error: Unable to '+errString+' widget') return if 'label' in optionalAttributes: desc['label'] = result.labelortext elif 'text' in optionalAttributes: desc['text'] = result.labelortext desc['name'] = name self.components[name] = desc if offsets: # offset the widget so that it isn't underneath the original x, y = self.components[name].position dx, dy = self.components[name].size #rint x, y, dx, dy if result.horizontal: x += dx+30 if result.vertical: y += dy+30 else: if result.vertical: y += dy+30 else: x += 10 y += 10 #rint " => ", x, y self.components[name].position = (x, y) # KEA 2001-12-20 # hack to insert component so that it is the first one # in the list # a similar trick will be needed for re-ordering widgets self.components.order.remove(name) self.components.order.insert(NUM_SIZING_HANDLES, name) self.fixComponentOrder(name) self.startName = name self.startPosition = self.components[self.startName].position self.startSize = self.components[self.startName].size self.offset = (0, 0) self.showSizingHandles(name) self.documentChanged = True c = self.components[self.startName] wx.EVT_LEFT_DOWN(c, self.on_mouseDown) wx.EVT_LEFT_UP(c, self.on_mouseUp) wx.EVT_MOTION(c, self.on_mouseDrag) def on_componentDuplicate_command(self, event): if self.startName in self.components: aWidget = self.components[self.startName] # now loop through the original widget and build a dictionary suitable # for making a copy d = {} d['type'] = aWidget.__class__.__name__ #for key in aWidget._getAttributeNames(): attributes = aWidget._spec.getAttributes().keys() attributes.sort() for key in attributes: # I'm not exactly sure why I have to special-case these tuples if key == 'bitmap': # this should get recreated from the file attribute pass elif key == "id": # must avoid duplicate IDs pass elif key in ['position', 'size']: d[key] = getattr(aWidget, key) elif getattr(aWidget, key) is not None: d[key] = getattr(aWidget, key) self.create_component(d, True, 'Duplicate ' + d['type'], "duplicate") def on_componentDelete_command(self, event): if self.startName in self.components: aWidget = self.components[self.startName] msg = "Are you sure you want to delete %s %s?" % (aWidget.__class__.__name__, aWidget.name) result = dialog.messageDialog(self, msg, 'Delete Component', wx.ICON_INFORMATION | wx.YES_NO | wx.NO_DEFAULT) if result.accepted: self.hideSizingHandles() del self.components[aWidget.name] self.documentChanged = True def on_componentAdd_command(self, event): # event.target.name will be something like # menuComponentAddButton, so the first 16 characters # can be thrown away to get the component name className = event.target.name[16:] # find a unique name i = 1 while True: if className + str(i) not in self.components: desc = registry.Registry.getInstance().components[className]._spec.getMinimalResourceDict(className + str(i)) break i += 1 desc['position'] = (10, 10) self.create_component(desc, False, "New"+className, "create") def on_componentSendBack_command(self, event): if self.startName in self.components and \ self.components.order.index(self.startName) != len(self.components.order) - 1: self.components.order.remove(self.startName) self.components.order.append(self.startName) self.fixComponentOrder(self.startName) def on_componentMoveBack_command(self, event): if self.startName in self.components: i = self.components.order.index(self.startName) ln = len(self.components.order) - 1 if i >= NUM_SIZING_HANDLES and i < ln: self.components.order.remove(self.startName) if i == ln - 1: self.components.order.append(self.startName) else: self.components.order.insert(i + 1, self.startName) self.fixComponentOrder(self.startName) def on_componentMoveForward_command(self, event): if self.startName in self.components: i = self.components.order.index(self.startName) if i > NUM_SIZING_HANDLES: self.components.order.remove(self.startName) self.components.order.insert(i - 1, self.startName) self.fixComponentOrder(self.startName) def on_componentBringFront_command(self, event): if self.startName in self.components and \ self.components.order.index(self.startName) != NUM_SIZING_HANDLES: self.components.order.remove(self.startName) self.components.order.insert(NUM_SIZING_HANDLES, self.startName) self.fixComponentOrder(self.startName) def on_displayAttributes_command(self, event): ##desc = self.resourceAttributes() desc = resourceOutput.resourceAttributes(self) dialog.scrolledMessageDialog(self, desc, 'Resource') def on_menuViewPropertyEditor_select(self, event): self.propertyEditorWindow.visible = not self.propertyEditorWindow.visible def updatePanel(self, rsrc): # KEA 2002-03-24 # this will need to update different parameters # depending on whether we're editing a background or dialog self.editingDialog = False try: background = rsrc.application.backgrounds[0] except: dlg = self.rsrc self.editingDialog = True # unhook the grid drawing and then rebind later if necessary if self.showGridLines: self.panel.Unbind(wx.EVT_ERASE_BACKGROUND) if self.editingDialog: self.menuBar.setEnabled('menuFileRun', False) self.menuBar.setEnabled('menuFileRunWithInterpreter', False) self.menuBar.setEnabled('menuFilePreviewDialog', True) self.menuBar.setEnabled('menuEditBackgroundInfo', False) self.menuBar.setEnabled('menuEditMenubar', False) self.menuBar.setEnabled('menuEditDialogInfo', True) self.title = dlg.title self._createStatusBar(dlg) self.position = dlg.position #self.setSize((dlg.size[0], dlg.size[1] + 20)) self.size = dlg.size self.setImage('') self.setTiled(False) self.panel._imageFile = self.image self.panel._backgroundTiling = self.tiled defaultBgColor = wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DFACE) self.backgroundColor = defaultBgColor self.panel.Disconnect(-1, -1, wx.wxEVT_ERASE_BACKGROUND) self.panel._bitmap = None else: self.menuBar.setEnabled('menuFileRun', True) self.menuBar.setEnabled('menuFileRunWithInterpreter', True) self.menuBar.setEnabled('menuFilePreviewDialog', False) self.menuBar.setEnabled('menuEditBackgroundInfo', True) self.menuBar.setEnabled('menuEditMenubar', True) self.menuBar.setEnabled('menuEditDialogInfo', False) self.title = background.title self._createStatusBar(background) self.position = background.position if background.menubar is None: #self.setSize((background.size[0], background.size[1] + 20)) self.size = background.size else: self.size = background.size self.setImage(background.image) self.setTiled(background.tiled) self.panel._imageFile = self.image self.panel._backgroundTiling = self.tiled defaultBgColor = wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DFACE) self.backgroundColor = defaultBgColor self.foregroundColor = background.foregroundColor self.backgroundColor = background.backgroundColor if self.image is not None : self.panel._bitmap = graphic.Bitmap(self.image) wx.EVT_ERASE_BACKGROUND( self.panel, self.panel.onEraseBackground ) else: self.panel.Disconnect(-1, -1, wx.wxEVT_ERASE_BACKGROUND) self.panel._bitmap = None self.movingComponent = False self.resizingHandleTarget = None if self.showGridLines: self.panel.Bind(wx.EVT_ERASE_BACKGROUND, self.drawPanelGridLines) self.panel.Refresh() def drawPanelGridLines(self, event): dc = event.GetDC() if not dc : dc = wx.ClientDC(self.panel) r = self.panel.GetUpdateRegion().GetBox() dc.SetClippingRegion(r.x, r.y, r.width, r.height) # need to set the background color to the default panel color brush = dc.GetBackground() brush.SetColour(self.panel.GetBackgroundColour()) dc.SetBackground(brush) dc.Clear() # should the color be settable by the user and then save # that in the prefs? dc.SetPen(wx.Pen('darkgray', 1, wx.SOLID)) w, h = self.panel.size xgrid = self.xGridSize ygrid = self.yGridSize nx = w / xgrid ny = h / ygrid for x in range(1, nx + 1): dc.DrawLine(x * xgrid, 0, x * xgrid, h) for y in range(1, ny + 1): dc.DrawLine(0, y * ygrid, w, y * ygrid) def rebindEventsForDragging(self): for name in self.components.order: if name not in self.sizingHandleNames: #print name c = self.components[name] wx.EVT_LEFT_DOWN(c, self.on_mouseDown) wx.EVT_LEFT_UP(c, self.on_mouseUp) wx.EVT_MOTION(c, self.on_mouseDrag) # KEA 2004-08-12 # for each of the dialogs below, the code should be refactored # so that the dialog modules have a function wrapper and the # result contains whatever attributes would be needed # the function should probably not have side-effects def on_fileRunOptions_command(self, event): result = runOptionsDialog.runOptionsDialog(self, self.cmdLineArgs) if result.accepted: self.cmdLineArgs['debugmenu'] = result.debugmenu self.cmdLineArgs['logging'] = result.logging self.cmdLineArgs['messagewatcher'] = result.messagewatcher self.cmdLineArgs['namespaceviewer'] = result.namespaceviewer self.cmdLineArgs['propertyeditor'] = result.propertyeditor self.cmdLineArgs['shell'] = result.shell self.cmdLineArgs['otherargs'] = result.otherargs def on_editStackInfo_command(self, event): result = stackInfoDialog.stackInfoDialog(self, self.rsrc) if result.accepted: self.rsrc.application.name = result.text self.documentChanged = True # need to change the logic so that self.rsrc # and the current window are updated def on_editBackgroundInfo_command(self, event): background = self.rsrc.application.backgrounds[0] background.position = self.GetPositionTuple() background.size = self.GetSizeTuple() result = backgroundInfoDialog.backgroundInfoDialog(self, background) if result.accepted: background.name = result.name background.title = result.title background.position = result.position background.size = result.size background.statusBar = result.statusBar background.foregroundColor = result.foregroundColor background.backgroundColor = result.backgroundColor background.image = result.image background.tiled = result.tiled background.visible = result.visible background.style = result.style background.icon = result.icon self.updatePanel(self.rsrc) self.documentChanged = True # need to change the logic so that self.rsrc # and the current window are updated def on_editDialogInfo_command(self, event): background = self.rsrc background.position = self.GetPositionTuple() background.size = self.GetSizeTuple() result = dialogInfoDialog.dialogInfoDialog(self, background) if result.accepted: background.name = result.name background.title = result.title background.position = result.position background.size = result.size self.updatePanel(self.rsrc) self.documentChanged = True def on_editMenubar_command(self, event): try: menubar = self.rsrc.application.backgrounds[0].menubar except: menubar = None result = menuDialog.menuDialog(self, menubar) if result.accepted: self.rsrc.application.backgrounds[0].menubar = result.menubar self.documentChanged = True def on_editStrings_command(self, event): stringList = {} try: if self.editingDialog: strings = self.rsrc.strings else: strings = self.rsrc.application.backgrounds[0].strings for s in strings.__dict__: stringList[s] = strings.__dict__[s] except: stringList = {} result = stringDialog.stringDialog(self, stringList) if result.accepted: if self.editingDialog: self.rsrc.strings = result.stringList else: self.rsrc.application.backgrounds[0].strings = result.stringList self.documentChanged = True def on_optionGridSize_command(self, event): result = dialog.textEntryDialog(self, 'Enter the preferred grid size (e.g. 5):', 'Grid Size', str(self.xGridSize)) if result.accepted: try: size = int(result.text) self.xGridSize = size self.yGridSize = size if self.showGridLines: self.panel.Refresh() except: # should probably do an alert dialog here pass def on_menuOptionsAlignToGrid_select(self, event): self.alignToGrid = self.menuBar.getChecked('menuOptionsAlignToGrid') def on_menuOptionsShowGridLines_select(self, event): self.showGridLines = self.menuBar.getChecked('menuOptionsShowGridLines') if self.showGridLines: self.panel.Bind(wx.EVT_ERASE_BACKGROUND, self.drawPanelGridLines) else: self.panel.Unbind(wx.EVT_ERASE_BACKGROUND) self.panel.Refresh() def getCommandLineArgs(self): args = ' ' if self.cmdLineArgs['debugmenu']: args += '-d ' if self.cmdLineArgs['logging']: args += '-l ' if self.cmdLineArgs['messagewatcher']: args += '-m ' if self.cmdLineArgs['namespaceviewer']: args += '-n ' if self.cmdLineArgs['propertyeditor']: args += '-p ' if self.cmdLineArgs['shell']: args += '-s ' """ if self.menuBar.getChecked('menuOptionsLogging'): args += '-l ' if self.menuBar.getChecked('menuOptionsMessageWatcher'): args += '-m ' if self.menuBar.getChecked('menuOptionsNamespaceViewer'): args += '-n ' if self.menuBar.getChecked('menuOptionsPropertyEditor'): args += '-p ' if self.menuBar.getChecked('menuOptionsShell'): args += '-s ' """ return args def previewDialog(self): if self.filename is None: # KEA 2002-03-25 # should probably present an error dialog here return dlg = DummyDialog(self, self.filename) dlg.showModal() dlg.destroy() def autoSaveFile(self): # KEA 2004-05-08 # auto-save code taken from codeEditor if self.filename is None: save = self.saveChanges() if save == "Cancel" or save == "No": # don't do anything, just go back to editing return False else: if not self.on_menuFileSaveAs_select(None): # they didn't actually save, just go back # to editing return False elif self.documentChanged: # auto-save self.saveFile() return True return True def on_filePreviewDialog_command(self, event): # we should prompt to save the .rsrc.py file if needed # or in the case of a new file, do a save as before attempting # to do a preview if not self.autoSaveFile(): return if self.filename is None: # KEA 2002-03-25 # should probably present an error dialog here return self.previewDialog() def runScript(self, useInterpreter): if not self.autoSaveFile(): return if self.filename is None: # KEA 2002-03-25 # should probably present an error dialog here return # this algorithm, taken from samples.py assumes the rsrc.py file and the main # program file have the same basename # if that isn't the case then this doesn't work and we need a different solution path, filename = os.path.split(self.filename) name = filename.split('.')[0] if os.path.exists(os.path.join(path, name + ".pyw")): filename = '"' + os.path.join(path, name + ".pyw") + '"' else: filename = '"' + os.path.join(path, name + ".py") + '"' # the args should come from a dialog or menu items that are checked/unchecked args = self.getCommandLineArgs() if useInterpreter: interp = ' -i ' else: interp = ' ' if sys.platform.startswith('win'): # KEA 2002-03-06 # always launch with console in the resourceEditor for debugging purposes python = os.path.join(os.path.dirname(sys.executable), 'python.exe') if ' ' in python: pythonQuoted = '"' + python + '"' else: pythonQuoted = python if useInterpreter and os.name != 'nt': os.spawnv(os.P_NOWAIT, python, [pythonQuoted, interp, filename, args]) else: os.spawnv(os.P_NOWAIT, python, [pythonQuoted, interp, filename, args]) else: if ' ' in sys.executable: python = '"' + sys.executable + '"' else: python = sys.executable os.system(python + interp + filename + args + ' &') def on_fileRun_command(self, event): self.runScript(False) def on_fileRunWithInterpreter_command(self, event): self.runScript(True) def copyWidgetDescriptionToClipboard(self, name): widget = self.components[name] desc = resourceOutput.widgetAttributes(self, widget) if desc.endswith(',\n'): desc = desc[:-2] clipboard.setClipboard(desc) def on_menuEditCut_select(self, event): if self.components.topLeft.visible and self.startName in self.components: aWidget = self.components[self.startName] msg = "Are you sure you want to Cut %s %s?" % (aWidget.__class__.__name__, aWidget.name) result = dialog.messageDialog(self, msg, 'Cut Component', wx.ICON_INFORMATION | wx.YES_NO | wx.NO_DEFAULT) if result.accepted: self.copyWidgetDescriptionToClipboard(self.startName) self.hideSizingHandles() del self.components[aWidget.name] self.documentChanged = True def on_menuEditCopy_select(self, event): if self.components.topLeft.visible and self.startName in self.components: self.copyWidgetDescriptionToClipboard(self.startName) def on_menuEditPaste_select(self, event): # need to figure out the logic of checking the contents # of the clipboard to see if it is something we can use # then checking whether the component already exists # if it exists, prompt for a new name # create the widget desc = clipboard.getClipboard() if not isinstance(desc, str): return # KEA 2004-09-10 # the clipboard is converting newlines to returns # which causes eval to fail if wx.Platform == '__WXMAC__': desc = '\n'.join(desc.splitlines()) # this is dangerous so we need a better way of converting # the text in the clipboard to a dictionary safely if desc[0] == '{' and desc[-1] == '}': desc = eval(desc) name = desc['name'] # AGT 2004-07-08 # give dialog to set name self.create_component(desc, True, 'Paste ' + desc['type'], "paste") def loadConfig(self): try: if not os.path.exists(self.configPath): os.mkdir(self.configPath) path = os.path.join(self.configPath, USERCONFIG) self.config = util.readAndEvalFile(path) if self.config != {}: if 'propertyEditorWindow.position' in self.config: self.propertyEditorWindow.SetPosition(self.config['propertyEditorWindow.position']) if 'history' in self.config: history = self.config['history'] history.reverse() for h in history: self.fileHistory.AddFileToHistory(h) except: self.config = {} def saveConfig(self): self.config['propertyEditorWindow.position'] = self.propertyEditorWindow.GetRestoredPosition() self.config['propertyEditorWindow.size'] = self.propertyEditorWindow.GetRestoredSize() history = [] for i in range(self.fileHistory.GetCount()): history.append(self.fileHistory.GetHistoryFile(i)) self.config['history'] = history try: path = os.path.join(self.configPath, USERCONFIG) f = open(path, "w") pprint.pprint(self.config, f) f.close() except: pass # argh def doExit(self): if self.documentChanged: save = self.saveChanges() if save == "Cancel": return False elif save == "No": return True else: if self.filename is None: return self.on_menuFileSaveAs_select(None) else: return self.saveFile() else: return True def doCleanup(self): # memory leak cleanup for k in self.cursors: self.cursors[k] = None def on_close(self, event): try: # KEA 2004-04-08 # if an exception occurs during on_initialize # then doCleanup and saveConfig could fail because some windows # might not exist, so in that situation just exit gracefully if self.doExit(): self.saveConfig() self.doCleanup() event.skip() except: event.skip() def on_showPythonCardDocumentation_command(self, event): global pythoncard_url webbrowser.open(pythoncard_url) def on_showResourceEditorDocumentation_command(self, event): global resourceeditor_url webbrowser.open(resourceeditor_url) if __name__ == '__main__': # now force the property editor to be enabled #configuration('showPropertyEditor', 1) #configuration('showShell', 1) app = model.Application(ResourceEditor) app.MainLoop() PythonCard-0.8.2/tools/resourceEditor/resourceEditor.rsrc.py0000644000076500007650000002024410223273337024174 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'ResEdit', 'backgrounds': [ {'type':'Background', 'name':'bgDrag', 'title':'Resource Editor', 'size':(316, 166), 'style':['resizeable'], 'menubar': {'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ {'type':'MenuItem', 'name':'menuFileNew', 'label':'&New...\tCtrl+N', }, {'type':'MenuItem', 'name':'menuFileOpen', 'label':'&Open...\tCtrl+O', }, {'type':'MenuItem', 'name':'menuFileSave', 'label':'Save\tCtrl+S', }, {'type':'MenuItem', 'name':'menuFileSaveAs', 'label':'Save &As...', }, {'type':'MenuItem', 'name':'menuFileRevert', 'label':'Revert', }, {'type':'MenuItem', 'name':'fileSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuFileRun', 'label':'&Run\tCtrl+R', 'command':'fileRun', }, {'type':'MenuItem', 'name':'menuFileRunWithInterpreter', 'label':'Run with &interpreter\tCtrl+Shift+R', 'command':'fileRunWithInterpreter', }, {'type':'MenuItem', 'name':'menuFileRunOptions', 'label':'Run Options...', 'command':'fileRunOptions', }, {'type':'MenuItem', 'name':'menuFilePreviewDialog', 'label':'Preview Dialog', 'command':'filePreviewDialog', }, {'type':'MenuItem', 'name':'fileSep2', 'label':'-', }, {'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit', }, ] }, {'type':'Menu', 'name':'menuEdit', 'label':'&Edit', 'items': [ {'type':'MenuItem', 'name':'menuEditCut', 'label':'Cu&t\tCtrl+X', }, {'type':'MenuItem', 'name':'menuEditCopy', 'label':'&Copy\tCtrl+C', }, {'type':'MenuItem', 'name':'menuEditPaste', 'label':'&Paste\tCtrl+V', }, {'type':'MenuItem', 'name':'editSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuComponentDuplicate', 'label':'&Duplicate\tCtrl+U', 'command':'componentDuplicate', }, {'type':'MenuItem', 'name':'menuComponentDelete', 'label':'Delete\tCtrl+D', 'command':'componentDelete', }, {'type':'MenuItem', 'name':'componentSep2', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditBackgroundInfo', 'label':'Background Info...', 'command':'editBackgroundInfo', }, {'type':'MenuItem', 'name':'menuEditMenubar', 'label':'Menu Editor...', 'command':'editMenubar', }, {'type':'MenuItem', 'name':'menuEditStrings', 'label':'String Editor...', 'command':'editStrings', }, {'type':'MenuItem', 'name':'menuEditDialogInfo', 'label':'Dialog Info...', 'command':'editDialogInfo', }, ] }, {'type':'Menu', 'name':'menuComponent', 'label':'&Component', 'items': [] }, {'type':'Menu', 'name':'menuOptions', 'label':'&Options', 'items': [ {'type':'MenuItem', 'name':'menuOptionsGridSize', 'label':'Grid Size...', 'command':'optionGridSize', }, {'type':'MenuItem', 'name':'menuOptionsAlignToGrid', 'label':'Align Components to Grid\tCtrl+G', 'checkable':1, }, {'type':'MenuItem', 'name':'menuOptionsShowGridLines', 'label':'Show Grid Lines', 'checkable':1, 'checked':0, }, {'type':'MenuItem', 'name':'componentSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuComponentSendBack', 'label':'Send to Back\tCtrl+1', 'command':'componentSendBack', }, {'type':'MenuItem', 'name':'menuComponentMoveBack', 'label':'Move Backward\tCtrl+2', 'command':'componentMoveBack', }, {'type':'MenuItem', 'name':'menuComponentMoveForward', 'label':'Move Forward\tCtrl+3', 'command':'componentMoveForward', }, {'type':'MenuItem', 'name':'menuComponentBringFront', 'label':'Bring to Front\tCtrl+4', 'command':'componentBringFront', }, ] }, {'type':'Menu', 'name':'menuView', 'label':'&View', 'items': [ {'type':'MenuItem', 'name':'menuViewAttributes', 'label':'&Resource...', 'command':'displayAttributes', }, {'type':'MenuItem', 'name':'menuViewSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuViewPropertyEditor', 'label':'Property Editor\tCtrl+P', 'checkable':1, 'checked':1, }, ] }, {'type':'Menu', 'name':'menuHelp', 'label':'&Help', 'items': [ {'type':'MenuItem', 'name':'menuResourceEditorDocumentation', 'label':'&resourceEditor Documentation...\tF1', 'command':'showResourceEditorDocumentation', }, {'type':'MenuItem', 'name':'menuPythonCardDocumentation', 'label':'&PythonCard Documentation...', 'command':'showPythonCardDocumentation', }, {'type':'MenuItem', 'name':'helpSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuHelpAbout', 'label':'&About resourceEditor...', }, {'type':'MenuItem', 'name':'menuHelpAboutPythonCard', 'label':'About PythonCard...', 'command':'doHelpAboutPythonCard', }, ] }, ] }, 'components': [ ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/tools/resourceEditor/templates/0000755000076500007650000000000010434046773021656 5ustar alexalex00000000000000PythonCard-0.8.2/tools/resourceEditor/templates/dialogTemplate.py0000644000076500007650000000130710106740617025156 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.3 $" __date__ = "$Date: 2004/08/12 19:14:23 $" """ from PythonCard import model class MyDialog(model.CustomDialog): def __init__(self, parent, txt=''): model.CustomDialog.__init__(self, parent) # if some special setup is necessary, do it here # example from samples/dialogs/minimalDialog.py # self.components.field1.text = txt #def myDialog(parent, txt): def myDialog(parent): dlg = MyDialog(parent, txt) result = dlg.showModal() # stick your results into the result dictionary here # example from samples/dialogs/minimalDialog.py # result.text = dlg.components.field1.text dlg.destroy() return result PythonCard-0.8.2/tools/resourceEditor/templates/dialogTemplate.rsrc.py0000644000076500007650000000065607463556361026151 0ustar alexalex00000000000000{'type':'CustomDialog', 'name':'Template', 'title':'Dialog Template', 'size':(300, 100), 'style':['resizeable'], 'components': [ {'type':'Button', 'name':'btnOK', 'position':(10, 35), 'label':'OK', 'id':5100, 'default':1, }, {'type':'Button', 'name':'btnCancel', 'position':(100, 35), 'label':'Cancel', 'id':5101, }, ] # end components } # end CustomDialog PythonCard-0.8.2/tools/resourceEditor/templates/template.py0000644000076500007650000000061410044477044024040 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.5 $" __date__ = "$Date: 2004/04/30 16:26:12 $" """ from PythonCard import model class MyBackground(model.Background): def on_initialize(self, event): # if you have any initialization # including sizer setup, do it here pass if __name__ == '__main__': app = model.Application(MyBackground) app.MainLoop() PythonCard-0.8.2/tools/resourceEditor/templates/template.rsrc.py0000644000076500007650000000126310047606372025012 0ustar alexalex00000000000000 { 'application':{ 'type':'Application', 'name':'Template', 'backgrounds': [ { 'type':'Background', 'name':'bgTemplate', 'title':'Standard Template with File->Exit menu', 'size':( 400, 300 ), 'style':['resizeable'], 'statusBar':0, 'menubar': { 'type':'MenuBar', 'menus': [ { 'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ { 'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit', 'command':'exit', } ] } ] }, 'components': [ ] } ] } } PythonCard-0.8.2/tools/resourceEditor/templates/templateFullMenus.py0000644000076500007650000002116510106740617025675 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.10 $" __date__ = "$Date: 2004/08/12 19:14:23 $" """ import os, sys import wx from wx.html import HtmlEasyPrinting from PythonCard import configuration, dialog, model def textToHtml(txt): # the wxHTML classes don't require valid HTML # so this is enough html = txt.replace('\n\n', '

') html = html.replace('\n', '
') return html class MyBackground(model.Background): def on_initialize(self, event): # if you have any initialization # including sizer setup, do it here self.printer = HtmlEasyPrinting() # self.loadConfig() self.startTitle = self.title self.newFile() def loadConfig(self): pass def saveConfig(self): pass def saveChanges(self): # save configuration info in the app directory #filename = os.path.basename(self.documentPath) if self.documentPath is None: filename = "Untitled" else: filename = self.documentPath msg = "The text in the %s file has changed.\n\nDo you want to save the changes?" % filename result = dialog.messageDialog(self, msg, 'textEditor', wx.ICON_EXCLAMATION | wx.YES_NO | wx.CANCEL) return result.returnedString def doExit(self): if self.documentChanged: save = self.saveChanges() if save == "Cancel": return False elif save == "No": return True else: if self.documentPath is None: return self.on_menuFileSaveAs_select(None) else: self.saveFile(self.documentPath) return True else: return 1 def on_close(self, event): if self.doExit(): # self.saveConfig() self.fileHistory = None self.printer = None event.skip() def on_menuFileSave_select(self, event): if self.documentPath is None: # this a "new" document and needs to go through Save As... self.on_menuFileSaveAs_select(None) else: self.saveFile(self.documentPath) def on_menuFileSaveAs_select(self, event): wildcard = "Text files (*.txt)|*.TXT;*.txt|All files (*.*)|*.*" if self.documentPath is None: dir = '' filename = '*.txt' else: dir = os.path.dirname(self.documentPath) filename = os.path.basename(self.documentPath) result = dialog.saveFileDialog(None, "Save As", dir, filename, wildcard) if result.accepted: path = result.paths[0] self.saveFile(path) return True else: return False def newFile(self): # change the code below for # creating a new document # the commented line is from the textEditor tool # self.components.fldDocument.text = '' self.documentPath = None self.documentChanged = 0 self.title = 'Untitled - ' + self.startTitle self.statusBar.text = 'Untitled' def openFile(self, path): # change the code below for # opening an existing document # the commented lines are from the textEditor tool try: # f = open(path) # self.components.fldDocument.text = f.read().replace('\r\n','\n') # f.close() self.documentPath = path self.documentChanged = 0 self.title = os.path.split(path)[-1] + ' - ' + self.startTitle self.statusBar.text = path except: pass def saveFile(self, path): # change the code below for # saving an existing document # the commented lines are from the textEditor tool try: # f = open(path, 'w') # f.write(self.components.fldDocument.text) # f.close() self.documentPath = path self.documentChanged = False self.title = os.path.split(path)[-1] + ' - ' + self.startTitle self.statusBar.text = path except: pass def on_menuFileNew_select(self, event): if self.documentChanged: save = self.saveChanges() if save == "Cancel": # don't do anything, just go back to editing pass elif save == "No": # any changes will be lost self.newFile() else: if self.documentPath is None: if self.on_menuFileSaveAs_select(None): self.newFile() else: self.saveFile(self.documentPath) self.newFile() else: # don't need to save self.newFile() def on_menuFileOpen_select(self, event): # should probably have an alert dialog here # warning about saving the current file before opening another one if self.documentChanged: save = self.saveChanges() if save == "Cancel": # don't do anything, just go back to editing return elif save == "No": # any changes will be lost pass else: if self.documentPath is None: # if the user cancels out of the Save As then go back to editing if not self.on_menuFileSaveAs_select(None): return else: self.saveFile(self.documentPath) # split this method into several pieces to make it more flexible wildcard = "Text files (*.txt)|*.txt;*.TXT|All files (*.*)|*.*" result = dialog.openFileDialog(wildcard=wildcard) if result.accepted: path = result.paths[0] # an error will probably occur here if the text is too large # to fit in the wxTextCtrl (TextArea) or the file is actually # binary. Not sure what happens with CR/LF versus CR versus LF # line endings either self.openFile(path) def on_menuFilePrint_select(self, event): # put your code here for print # the commented code below is from the textEditor tool # and is simply an example #source = textToHtml(self.components.fldDocument.text) #self.printer.PrintText(source) pass def on_menuFilePrintPreview_select(self, event): # put your code here for print preview # the commented code below is from the textEditor tool # and is simply an example #source = textToHtml(self.components.fldDocument.text) #self.printer.PreviewText(source) pass def on_menuFilePageSetup_select(self, event): self.printer.PageSetup() # the following was copied and pasted from the searchexplorer sample def on_menuEditUndo_select(self, event): widget = self.findFocus() if hasattr(widget, 'editable') and widget.canUndo(): widget.undo() def on_menuEditRedo_select(self, event): widget = self.findFocus() if hasattr(widget, 'editable') and widget.canRedo(): widget.redo() def on_menuEditCut_select(self, event): widget = self.findFocus() if hasattr(widget, 'editable') and widget.canCut(): widget.cut() def on_menuEditCopy_select(self, event): widget = self.findFocus() if hasattr(widget, 'editable') and widget.canCopy(): widget.copy() def on_menuEditPaste_select(self, event): widget = self.findFocus() if hasattr(widget, 'editable') and widget.canPaste(): widget.paste() def on_menuEditClear_select(self, event): widget = self.findFocus() if hasattr(widget, 'editable'): if widget.canCut(): # delete the current selection, # if we can't do a Cut we shouldn't be able to delete either # which is why i used the test above sel = widget.replaceSelection('') else: ins = widget.getInsertionPoint() try: widget.replace(ins, ins + 1, '') except: pass def on_menuEditSelectAll_select(self, event): widget = self.findFocus() if hasattr(widget, 'editable'): widget.setSelection(0, widget.getLastPosition()) def on_doHelpAbout_command(self, event): # put your About box here pass if __name__ == '__main__': app = model.Application(MyBackground) app.MainLoop() PythonCard-0.8.2/tools/resourceEditor/templates/templateFullMenus.rsrc.py0000644000076500007650000000651010047606372026645 0ustar alexalex00000000000000 { 'application':{ 'type':'Application', 'name':'Template', 'backgrounds': [ { 'type':'Background', 'name':'bgTemplate', 'title':'Standard Template with full menus', 'size':( 400, 300 ), 'style':['resizeable'], 'statusBar':1, 'menubar': { 'type':'MenuBar', 'menus': [ { 'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ { 'type':'MenuItem', 'name':'menuFileNew', 'label':'&New\tCtrl+N' }, { 'type':'MenuItem', 'name':'menuFileOpen', 'label':'&Open\tCtrl+O' }, { 'type':'MenuItem', 'name':'menuFileSave', 'label':'&Save\tCtrl+S' }, { 'type':'MenuItem', 'name':'menuFileSaveAs', 'label':'Save &As...' }, { 'type':'MenuItem', 'name':'fileSep1', 'label':'-' }, { 'type':'MenuItem', 'name':'menuFilePageSetup', 'label':'Page Set&up...' }, { 'type':'MenuItem', 'name':'menuFilePrint', 'label':'&Print...\tCtrl+P' }, { 'type':'MenuItem', 'name':'menuFilePrintPreview', 'label':'Print Pre&view' }, { 'type':'MenuItem', 'name':'fileSep2', 'label':'-' }, { 'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit', } ] }, # most of the edit menu was copied from the searchexplorer sample {'type':'Menu', 'name':'Edit', 'label':'&Edit', 'items': [ { 'type':'MenuItem', 'name':'menuEditUndo', 'label':'&Undo\tCtrl+Z'}, { 'type':'MenuItem', 'name':'menuEditRedo', 'label':'&Redo\tCtrl+Y'}, { 'type':'MenuItem', 'name':'editSep1', 'label':'-' }, { 'type':'MenuItem', 'name':'menuEditCut', 'label':'Cu&t\tCtrl+X'}, { 'type':'MenuItem', 'name':'menuEditCopy', 'label':'&Copy\tCtrl+C'}, { 'type':'MenuItem', 'name':'menuEditPaste', 'label':'&Paste\tCtrl+V'}, { 'type':'MenuItem', 'name':'editSep2', 'label':'-' }, { 'type':'MenuItem', 'name':'menuEditClear', 'label':'Cle&ar\tDel'}, { 'type':'MenuItem', 'name':'menuEditSelectAll', 'label':'Select A&ll\tCtrl+A'} ] }, { 'type':'Menu', 'name':'menuHelp', 'label':'&Help', 'items': [ { 'type':'MenuItem', 'name':'menuHelpAbout', 'label':'&About ...', 'command':'doHelpAbout'}, ] }, ] }, 'components': [ ] } ] } } PythonCard-0.8.2/tools/resourceEditor/templates/templateNoMenus.py0000644000076500007650000000061410037122067025337 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.3 $" __date__ = "$Date: 2004/04/14 02:38:47 $" """ from PythonCard import model class MyBackground(model.Background): def on_initialize(self, event): # if you have any initialization # including sizer setup, do it here pass if __name__ == '__main__': app = model.Application(MyBackground) app.MainLoop() PythonCard-0.8.2/tools/resourceEditor/templates/templateNoMenus.rsrc.py0000644000076500007650000000040510047606372026314 0ustar alexalex00000000000000 { 'application':{ 'type':'Application', 'name':'Template', 'backgrounds': [ { 'type':'Background', 'name':'bgTemplate', 'title':'Standard Template with no menus', 'size':( 400, 300 ), 'components': [ ] } ] } } PythonCard-0.8.2/tools/standaloneBuilder/0000755000076500007650000000000010434046773020321 5ustar alexalex00000000000000PythonCard-0.8.2/tools/standaloneBuilder/changelog.txt0000755000076500007650000001410710431133454023005 0ustar alexalex00000000000000standaloneBuilder Version 0.2.0 release date May 10 2006 -------------------------------------------------------- - Added a temporary fix to prevent projects being created outside the main projects directory specified in prefs. I shall fix this limitation in the next release! - Made the MacOS-specific error message slightly narrower so it looks neater standaloneBuilder Version 0.1.4 release date May 08 2006 -------------------------------------------------------- - Version number updated in the Help --> About dialog - GTK resource file for the output window was missing from the project file - Menu items now get enabled/disabled correctly when projects get opened/saved - File --> Exit menu item was not working :oops: - Fix bug in createProject routine which was not converting the project basepath correctly - Menu items now in synch with rest of the program - the licence text file was being created with lines of dashes at the end of the file due to a coding error - changelog files were not being created in the right format in new projects - Program now disables spec file edit button if py2exe is selected in prefs as the build mechanism - Fixed bug where Inno compile would abort if AppPublisher had not been set in preferences - Component import check function now lets the import line be copied to the Windows clipboard for easier pasting into the code standaloneBuilder Version 0.1.3 release date May 02 2006 -------------------------------------------------------- - Added new menu item to allow the component imports to be checked - Added function to check for PythonCard components import line - Program now copes with the scenario where the final executable name is different to the main script name - Entry for versionInfo.py was missing from the project file - Cosmetic changes to the preferences dialog - program now checks to see that Inno Setup is still in the same place it was the last time the program was run - prefs dialog does some better error checking when selecting the build mechanism - program now checks to see that pyInstaller and/or py2exe is still in the same place it was the last time the program was run - All 'edit' buttons now work when using the standard PythonCard codeEditor and resourceEditor tools - Made some cosmetic changes to the resource files to improve the layout slightly standaloneBuilder Version 0.1.2 release date April 11 2006 ---------------------------------------------------------- - fixed bug with Inno script file trying to include empty directories - program creates a new copy of setup.py when building with py2exe - fixed bug in pyInstaller build which was corrupting the executable by trying to set the version info twice in some cases - py2exe build routine was leaving some temporary files behind - added dropdown to prefsDialog to allow the preferred build mechanism to be selected - revamp to build mechanism to work with pyInstaller - program detects if win32 extensions are missing and aborts cleanly standaloneBuilder version Version 0.1.1 release date April 03 2006 ------------------------------------------------------------------- - Fixed bug caused by trying to import win32api under Linux - added code to ensure that the dist and build sub-directories get removed prior to a rebuild - added code to allow the py2exe setup script to build either a console app or a GUI app - path to project base directory is now saved correctly as a relative path - Can now build standalone apps using py2exe - Amended project creation code so that existing files are not silently overwritten - Added a button to allow the main script to be edited - Project base direcotry was not being saved correctly under certain circumstances - Now gives a warning message if you try to release a project with the console and/or debug options switched on - Project build number no longer gets updated if you rebuild a frozen project - Pressing cancel in the run options dialog would run the script anyway... :-( - Updated documentation to clarify why and when extra scripts might need to be added - Adding a script now pops up a dialog asking if you want to add the matching resource file if one exists - Updated copyright message and removed innacurate list of Pythoncard developers - Program now prevents invalid filenames being entered into any of the script, resource, pixmap or other files boxes - Added some error trapping to the rebuild routine to deal with the case where the main script has not been specified - Fixed a bug where the project licence file name was being added incorrectly when running the new project wizard - Moved the check for whether the project needs to be saved into a single function - Added a run button and stole the run options dialog from the resource editor :-) - Added a workaround for a GTK bug which affects the fileSaveDialog - Fixed an UnboundLocalError when rebuilding projects - Fixed bug in spec file generation which was causing an exception in McMillan Installer when no Windows icon file had been selected in the project - Fixed a bug which was causing an exception when creating a new project due to trying to incorrectly make a relative path out of a file name - Cosmetic fixes to button layouts and icons - Fixed a bug in the rebuild process which was causing the wrong text fields to be shown when doing more than one rebuild in a single session - rebuild process now working under Linux, just builds a tarball - Help --> About dialog now works - The rebuild process now works 100% reliably - the project changelog.txt file can now be maintained from within the standaloneBuilder app pitself PythonCard-0.8.2/tools/standaloneBuilder/customDialogs.py0000755000076500007650000006652110431133454023513 0ustar alexalex00000000000000#!/usr/bin/python # vim: ai et sw=4 ts=4 # # This file contains all the custom dialogs (each based on CustomDialog) used # by standaloneBuilder # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # Copyright (C)2003 Phil Edwards, phil@linux2000.com # vim: ts=4 sw=4 ai et # standard Python imports import os import sys import time import string from md5 import md5 import copy # PythonCard & wxPython imports from PythonCard import dialog, resource, graphic, model from PythonCard.model import CustomDialog import wx from wx.lib import dialogs def dirSize(start, follow_links, my_depth, max_depth): # work out how much space a directory is taking up, another handy one from the # ASPN website, http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/86554 total = 0L try: dir_list = os.listdir(start) except: if os.path.isdir(start): print 'Cannot list directory %s' % start return 0 for item in dir_list: path = '%s/%s' % (start, item) try: stats = os.stat(path) except: print 'Cannot stat %s' % path continue total += stats[6] if os.path.isdir(path) and (follow_links or (not follow_links and not os.path.islink(path))): bytes = dirSize(path, follow_links, my_depth + 1, max_depth) total += bytes return total def wrap_string(str, max, para = "\n\n"): paras = string.split(str, para) outStr = "" for paragraph in paras: paragraph = paragraph.replace("\n", " ") words = string.split(paragraph) outLine = "" lineCount = wordCount = 0 for i in range(len(words)): if (len(outLine) + len(words[i])) > max: if lineCount: outStr += "\n" outStr += outLine outLine = words[i] lineCount += 1 wordCount = 1 else: if wordCount: outLine += " " outLine += words[i] wordCount += 1 if lineCount: outStr += "\n" outStr += outLine outStr += para return outStr # supplemental function used when doing a recursive import def walkTree(arg, dirname, names): for item in names: file, ext = os.path.splitext(item) if ext.lower() == '.jpg' or ext.lower() == '.jpeg' and file[:1] != '.': arg.append(os.path.join(dirname,item)) class versionDialog(CustomDialog): """Displays a dialog for the next release version number""" def __init__(self, aBg, currentVersion): path = os.path.join(aBg.application.applicationDirectory, 'versionDialog') aDialogRsrc = resource.ResourceFile(model.internationalResourceName(path)).getResource() CustomDialog.__init__(self, aBg, aDialogRsrc) self.parent = aBg vstring = string.split(currentVersion, '.') self.components.majorVersion.value = int(vstring[0]) self.components.minorVersion.value = int(vstring[1]) self.components.fixLevel.value = int(vstring[2]) + 1 def getVersion(self): vstring = [] vstring.append(str(self.components.majorVersion.value)) vstring.append(str(self.components.minorVersion.value)) vstring.append(str(self.components.fixLevel.value)) return vstring def on_btnOK_mouseClick(self, event): event.Skip() def on_btnCancel_mouseClick(self, event): event.Skip() class HTMLHelp(CustomDialog): """Displays an HTML based about box""" def __init__(self, aBg, links=None): path = os.path.join(aBg.application.applicationDirectory, 'helpAbout') aDialogRsrc = resource.ResourceFile(model.internationalResourceName(path)).getResource() CustomDialog.__init__(self, aBg, aDialogRsrc) self.parent = aBg #self.components.versionText.text = 'Version %s' % self.parent.pimpversion # links is a 3-element list giving the HTML files to use for the About, Author # and License buttons if links is None: links = ['doc/about.html', 'doc/author.html', 'doc/license.html'] self.links = links self.components.HtmlWindow.text = self.links[0] def on_btnOK_mouseClick(self, event): event.Skip() def on_AboutBtn_mouseClick(self, event): self.components.HtmlWindow.text = self.links[0] def on_AuthorBtn_mouseClick(self, event): self.components.HtmlWindow.text = self.links[1] def on_LicenseBtn_mouseClick(self, event): self.components.HtmlWindow.text = self.links[2] class newProjectWizard(CustomDialog): """Displays a wizard for creating a new project""" def __init__(self, aBg): baseResourceName = 'newProjectWizard' path = os.path.join(aBg.application.applicationDirectory, baseResourceName) aDialogRsrc = resource.ResourceFile(model.internationalResourceName(path)).getResource() CustomDialog.__init__(self, aBg, aDialogRsrc) self.parent = aBg self.addWizardPage(baseResourceName, 'Page1') self.addWizardPage(baseResourceName, 'Page2') self.addWizardPage(baseResourceName, 'Page3') self.addWizardPage(baseResourceName, 'Page4') self.maxPages = 4 self.pgCnt = 0 self.accepted = False self.setPage(self.pgCnt) def addWizardPage(self, basename, pageref): r = basename + pageref resName = model.internationalResourceName(r) fd = open(resName, 'r') res = eval(fd.read()) for comp in res['components']: if comp.has_key('userdata') and comp['userdata'] == pageref.lower(): compname = comp['name'] self.components[compname] = comp def setPage(self, cnt, flag=True): # set the currently displayed page groupname = 'page' + str(cnt) for compname in self.components.keys(): if groupname in self.components[compname].userdata: self.components[compname].enabled = flag self.components[compname].visible = flag elif self.components[compname].userdata != '': self.components[compname].enabled = not(flag) self.components[compname].visible = not(flag) self.setButtons() def setButtons(self): # enable the 'next' button if we have enough information to move # on to the next page # back button is (almost) always enabled self.components.backBtn.enabled = True if self.pgCnt == 0: # initial page - the back button is always disabled, the next # button is always enabled self.components.nextBtn.enabled = True self.components.backBtn.enabled = False if self.pgCnt == 1: # first page - next button is enabled if we have something in the # project name field, back button is always enabled self.components.backBtn.enabled = True if self.components.projectName.text == '': self.components.nextBtn.enabled = False else: self.components.nextBtn.enabled = True self.components.projectName.SetFocus() if self.pgCnt == 2: # second page - next button is enabled if we have something in # the project descrption if self.components.projectDesc.text == '': self.components.nextBtn.enabled = False else: self.components.nextBtn.enabled = True self.components.projectDesc.SetFocus() if self.pgCnt == 3: # third page - next button is enabled if we have something in # the base directory if self.components.baseDir.text == '': self.components.nextBtn.enabled = False else: self.components.nextBtn.enabled = True self.components.baseDir.SetFocus() if self.pgCnt == self.maxPages: self.components.nextBtn.label = 'Create' else: self.components.nextBtn.label = 'Next >' self.components.nextBtn.SetFocus() def on_backBtn_mouseClick(self, event): # got to previous page self.pgCnt -= 1 self.setPage(self.pgCnt) def on_nextBtn_mouseClick(self, event): # go to next page if self.pgCnt < self.maxPages: self.pgCnt += 1 self.setPage(self.pgCnt) else: self.accepted = True self.Close() def on_projectName_keyUp(self, event): # can't move on to the next page until something is typed into the # project name if self.components.projectName.text != '': self.components.nextBtn.enabled = True else: self.components.nextBtn.enabled = False event.Skip() def on_projectDesc_keyUp(self, event): if self.components.projectDesc.text != '': self.components.nextBtn.enabled = True else: self.components.nextBtn.enabled = False event.Skip() def on_baseDir_keyUp(self, event): if self.components.baseDir.text != '': self.components.nextBtn.enabled = True else: self.components.nextBtn.enabled = False event.Skip() def on_baseDirBtn_mouseClick(self, event): title = 'Select project base directory' basepath = str(self.parent.cfg.get('ConfigData', 'projects')) result = dialog.directoryDialog(self, title, basepath, wx.DD_NEW_DIR_BUTTON) if result.accepted: # need an error here if the directory selected is not a subdirectory # of basepath... plist = [] plist.append(basepath) plist.append(str(result.path)) if os.path.commonprefix(plist) != basepath: title = 'Invalid project base directory' txt = 'This version of standaloneBuilder does not allow creation ' txt += 'of projects which reside outside of the projects directory ' txt += 'specified in your preferences. This issue will be addressed ' txt += 'in the next version. Yes, it\'s lame - sorry! :-(' bull = dialog.alertDialog(self, wrap_string(txt, 60), title) self.components.baseDir.SetFocus() else: self.components.baseDir.text = result.path self.components.nextBtn.enabled = True def getResult(self): d = dialogs.DialogResults d.accepted = self.accepted d.projectName = self.components.projectName.text d.projectDesc = self.components.projectDesc.text d.baseDir = self.components.baseDir.text return d def on_cancelBtn_mouseClick(self, event): event.Skip() class prefsDialog(CustomDialog): """Displays a preferences dialog""" def __init__(self, aBg, cfgfile): path = os.path.join(aBg.application.applicationDirectory, 'prefsDialog') aDialogRsrc = resource.ResourceFile(model.internationalResourceName(path)).getResource() CustomDialog.__init__(self, aBg, aDialogRsrc) self.parent = aBg self.CONFIG_FILE = cfgfile #if sys.platform.startswith('win'): self.fitToComponents(10,10) self.components.resEditPath.text = self.parent.cfg.get('ConfigData', 'reseditor') self.components.srcEditPath.text = self.parent.cfg.get('ConfigData', 'codeeditor') self.components.txtEditPath.text = self.parent.cfg.get('ConfigData', 'texteditor') self.components.pixmapEditPath.text = self.parent.cfg.get('ConfigData', 'pixmapeditor') self.components.installerPath.text = self.parent.cfg.get('ConfigData', 'installerpath') self.components.buildTool.stringSelection = self.parent.cfg.get('ConfigData', 'buildtool') if self.components.buildTool.stringSelection == 'py2exe': self.components.installerPath.enabled = False self.components.installerPathBtn.enabled = False self.components.installerPathHelpBtn.enabled = False else: self.components.installerPath.enabled = True self.components.installerPathBtn.enabled = True self.components.installerPathHelpBtn.enabled = True self.components.compilerPath.text = self.parent.cfg.get('ConfigData', 'compilerpath') self.components.appPublisher.text = self.parent.cfg.get('ConfigData', 'publisher') self.components.projectsPath.text = self.parent.cfg.get('ConfigData', 'projects') def on_buildTool_select(self, event): if self.components.buildTool.stringSelection == 'py2exe': try: from distutils.core import setup as wibble except ImportError: title = '*** ERROR ***' txt = 'You do not appear to have a copy of the distutils ' txt += 'package installed. This is required in order to allow ' txt += 'building with py2exe.' bull = dialog.alertDialog(self, wrap_string(txt, 60), title) self.components.buildTool.stringSelection = 'pyInstaller' else: try: import py2exe as wibble except ImportError: title = '*** ERROR ***' txt = 'You do not appear to have a ' txt += 'copy of the py2exe package installed. Please install ' txt += 'the package and then re-configure your preferences.' bull = dialog.alertDialog(self, wrap_string(txt, 60), title) self.components.buildTool.stringSelection = 'pyInstaller' else: self.components.installerPath.text = '' self.components.installerPath.enabled = False self.components.installerPathBtn.enabled = False self.components.installerPathHelpBtn.enabled = False else: self.components.installerPath.enabled = True self.components.installerPathBtn.enabled = True self.components.installerPathHelpBtn.enabled = True # see if we can find pyInstaller # C:\Python23\pyInstaller\Build.py want = os.path.join('pyInstaller', 'Build.py') installer = self.parent.lookFor(want) #self.parent.cfg.set('ConfigData', 'installerpath', installer) self.components.installerPath.text = installer def on_btnOK_mouseClick(self, event): if self.components.buildTool.stringSelection == 'pyInstaller': if self.components.installerPath.text == '': title = 'Preferences not saved!' txt = 'You must specify the directory where the pyInstaller components can be found' bull = dialog.alertDialog(self, wrap_string(txt, 60), title) return if self.components.compilerPath.text == '' and sys.platform.startswith('win'): title = 'Preferences not saved!' txt = 'You must specify the directory where the Inno Setup compiler can be found' bull = dialog.alertDialog(self, wrap_string(txt, 60), title) return if self.components.projectsPath.text == '': title = 'Preferences not saved!' txt = 'You must specify your base projects directory' bull = dialog.alertDialog(self, wrap_string(txt, 60), title) return self.parent.cfg.set('ConfigData', 'reseditor', self.components.resEditPath.text) self.parent.cfg.set('ConfigData', 'codeeditor', self.components.srcEditPath.text) self.parent.cfg.set('ConfigData', 'texteditor', self.components.txtEditPath.text) self.parent.cfg.set('ConfigData', 'pixmapeditor', self.components.pixmapEditPath.text) self.parent.cfg.set('ConfigData', 'installerpath', self.components.installerPath.text) self.parent.cfg.set('ConfigData', 'buildtool', self.components.buildTool.stringSelection) self.parent.cfg.set('ConfigData', 'compilerpath', self.components.compilerPath.text) self.parent.cfg.set('ConfigData', 'publisher', self.components.appPublisher.text) self.parent.cfg.set('ConfigData', 'projects', self.components.projectsPath.text) fd = open(self.CONFIG_FILE, 'w') self.parent.cfg.write(fd) fd.close() event.Skip() def on_btnCancel_mouseClick(self, event): event.Skip() def on_resEditPathBtn_mouseClick(self, event): result = dialog.fileDialog(self, self.components.StaticText3.text, self.components.resEditPath.text) if result.accepted: self.components.resEditPath.text = result.paths[0] def on_resEditPathHelpBtn_mouseClick(self, event): self.showHelp(self.components.resEditPath.userdata, self.components.StaticText3.text) def on_srcEditPathBtn_mouseClick(self, event): result = dialog.fileDialog(self, self.components.StaticText4.text, self.components.srcEditPath.text) if result.accepted: self.components.srcEditPath.text = result.paths[0] def on_srcEditPathHelpBtn_mouseClick(self, event): self.showHelp(self.components.srcEditPath.userdata, self.components.StaticText4.text) def on_pixmapEditPathBtn_mouseClick(self, event): result = dialog.fileDialog(self, self.components.StaticText5.text, self.components.pixmapEditPath.text) if result.accepted: self.components.pixmapEditPath.text = result.paths[0] def on_pixmapEditPathHelpBtn_mouseClick(self, event): self.showHelp(self.components.pixmapEditPath.userdata, self.components.StaticText5.text) def on_installerPathBtn_mouseClick(self, event): result = dialog.fileDialog(self, self.components.StaticText1.text, self.components.installerPath.text) if result.accepted: self.components.installerPath.text = result.paths[0] def on_installerPathHelpBtn_mouseClick(self, event): self.showHelp(self.components.installerPath.userdata, self.components.StaticText1.text) def on_buildToolHelpBtn_mouseClick(self, event): self.showHelp(self.components.buildTool.userdata, self.components.StaticText1.text) def on_compilerPathBtn_mouseClick(self, event): result = dialog.fileDialog(self, self.components.StaticText7.text, self.components.compilerPath.text) if result.accepted: self.components.compilerPath.text = result.paths[0] def on_compilerPathHelpBtn_mouseClick(self, event): self.showHelp(self.components.compilerPath.userdata, self.components.StaticText7.text) def on_appPublisherHelpBtn_mouseClick(self, event): self.showHelp(self.components.appPublisher.userdata, self.components.StaticText6.text) def on_projectsPathBtn_mouseClick(self, event): result = dialog.directoryDialog(self, self.components.StaticText2.text, self.components.projectsPath.text) if result.accepted: self.components.projectsPath.text = result.path def on_projectsPathHelpBtn_mouseClick(self, event): self.showHelp(self.components.projectsPath.userdata, self.components.StaticText2.text) def showHelp(self, text, label): text = string.replace(text, '\\n', '\n') #dlg = wx.MessageDialog(self, wrap_string(text, 50), label, wx.OK|wx.ICON_INFORMATION) dlg = wx.MessageDialog(self, wrap_string(text, 60), label, wx.OK) dlg.ShowModal() dlg.Destroy() class propertiesDialog(CustomDialog): """Displays the project properties dialog""" def __init__(self, aBg): path = os.path.join(aBg.application.applicationDirectory, 'propertiesDialog') aDialogRsrc = resource.ResourceFile(model.internationalResourceName(path)).getResource() CustomDialog.__init__(self, aBg, aDialogRsrc) self.parent = aBg #try: self.components.buildPath.text = self.parent.pathJoin(self.parent.project.get('Project', 'buildfilespath')) self.components.distPath.text = self.parent.pathJoin(self.parent.project.get('Project', 'distfilespath')) self.components.pixmapsPath.text = self.parent.pathJoin(self.parent.project.get('Project', 'pixmapspath')) self.components.tarballPath.text = self.parent.pathJoin(self.parent.project.get('Project', 'tarballspath')) self.components.appPublisher.text = self.parent.project.get('Project', 'publisher') self.components.appURL.text = self.parent.project.get('Project', 'appurl') self.components.appLicence.text = self.parent.pathJoin(self.parent.project.get('Project', 'applicence')) self.components.asciiChk.checked = self.parent.project.getboolean('Project', 'ascii') self.components.striplibsChk.checked = self.parent.project.getboolean('Project', 'striplib') self.components.consoleChk.checked = self.parent.project.getboolean('Project', 'console') # best to have a coonsole for new projects! self.components.optimizeChk.checked = self.parent.project.getboolean('Project', 'optimize') self.components.compressChk.checked = self.parent.project.getboolean('Project', 'compress') self.components.debugChk.checked = self.parent.project.getboolean('Project', 'debug') if self.parent.project.getboolean('Project', 'onedir'): self.components.buildType.stringSelection = 'Single directory' else: self.components.buildType.stringSelection = 'Single file' #except: # pass def on_buildPathBtn_mouseClick(self, event): basepath = os.path.join(self.parent.cfg.get('ConfigData', 'projects'), self.parent.components.baseDir.text) basepath = os.path.join(basepath, self.components.buildPath.text) refpath = os.path.join(self.parent.cfg.get('ConfigData', 'projects'), self.parent.components.baseDir.text) title = 'Select path to project build directory' result = dialog.directoryDialog(self, title, basepath) if result.accepted: path = self.parent.getRelativePath(refpath, result.path) self.components.buildPath.text = path def on_distPathBtn_mouseClick(self, event): basepath = os.path.join(self.parent.cfg.get('ConfigData', 'projects'), self.parent.components.baseDir.text) basepath = os.path.join(basepath, self.components.distPath.text) refpath = os.path.join(self.parent.cfg.get('ConfigData', 'projects'), self.parent.components.baseDir.text) title = 'Select path to project distribution directory' result = dialog.directoryDialog(self, title, basepath) if result.accepted: path = self.parent.getRelativePath(refpath, result.path) self.components.distPath.text = path def on_pixmapsPathBtn_mouseClick(self, event): basepath = os.path.join(self.parent.cfg.get('ConfigData', 'projects'), self.parent.components.baseDir.text) basepath = os.path.join(basepath, self.components.pixmapsPath.text) refpath = os.path.join(self.parent.cfg.get('ConfigData', 'projects'), self.parent.components.baseDir.text) title = 'Select path to project pixmaps directory' result = dialog.directoryDialog(self, title, basepath) if result.accepted: path = self.parent.getRelativePath(refpath, result.path) self.components.pixmapsPath.text = path def on_tarballsPathBtn_mouseClick(self, event): basepath = os.path.join(self.parent.cfg.get('ConfigData', 'projects'), self.parent.components.baseDir.text) basepath = os.path.join(basepath, self.components.tarballsPath.text) refpath = os.path.join(self.parent.cfg.get('ConfigData', 'projects'), self.parent.components.baseDir.text) title = 'Select path to project tarballs directory' result = dialog.directoryDialog(self, title, refpath) if result.accepted: path = self.parent.getRelativePath(refpath, result.path) self.components.tarballsPath.text = path def on_appLicenceBtn_mouseClick(self, event): basepath = os.path.join(self.parent.cfg.get('ConfigData', 'projects'), self.parent.components.baseDir.text) basepath = os.path.join(basepath, self.components.appLicence.text) refpath = os.path.join(self.parent.cfg.get('ConfigData', 'projects'), self.parent.components.baseDir.text) title = 'Select path to project licence file' result = dialog.openFileDialog(self, title, refpath) if result.accepted: path = self.parent.getRelativePath(refpath, result.paths[0]) self.components.appLicence.text = path def on_btnOK_mouseClick(self, event): old = copy.deepcopy(self.parent.project) self.parent.project.set('Project', 'buildfilespath', self.parent.pathSplit(self.components.buildPath.text)) self.parent.project.set('Project', 'distfilespath', self.parent.pathSplit(self.components.distPath.text)) self.parent.project.set('Project', 'pixmapspath', self.parent.pathSplit(self.components.pixmapsPath.text)) self.parent.project.set('Project', 'tarballspath', self.parent.pathSplit(self.components.tarballPath.text)) self.parent.project.set('Project', 'publisher', self.components.appPublisher.text) self.parent.project.set('Project', 'appurl', self.components.appURL.text) self.parent.project.set('Project', 'applicence', self.parent.pathSplit(self.components.appLicence.text)) self.parent.project.set('Project', 'ascii', str(int(self.components.asciiChk.checked))) self.parent.project.set('Project', 'striplib', str(int(self.components.striplibsChk.checked))) self.parent.project.set('Project', 'console', str(int(self.components.consoleChk.checked))) self.parent.project.set('Project', 'optimize', str(int(self.components.optimizeChk.checked))) self.parent.project.set('Project', 'compress', str(int(self.components.compressChk.checked))) self.parent.project.set('Project', 'debug', str(int(self.components.debugChk.checked))) if self.components.buildType.stringSelection == 'Single directory': self.parent.project.set('Project', 'onedir', '1') else: self.parent.project.set('Project', 'onedir', '0') if self.parent.project != old: self.parent.documentChanged = True event.Skip() def on_btnCancel_mouseClick(self, event): event.Skip() PythonCard-0.8.2/tools/standaloneBuilder/doc/0000755000076500007650000000000010434046773021066 5ustar alexalex00000000000000PythonCard-0.8.2/tools/standaloneBuilder/doc/about.html0000755000076500007650000000145510431133454023064 0ustar alexalex00000000000000
standaloneBuilder Version 0.1.4
  standaloneBuilder is designed to help simplify the process of getting a PythonCard applpication distributed in standalone form, without the end user being required to install PythonCard, wxPython or even Python itself.

Developed using the PythonCard GUI toolkit and wxPython, http://pythoncard.sourceforge.net

PythonCard-0.8.2/tools/standaloneBuilder/doc/author.html0000755000076500007650000000113210225720274023247 0ustar alexalex00000000000000

standaloneBuilder was developed by Phil Edwards <phil@linux2000.com> I would like to also extend my grateful thanks to the following:




Kevin Altis altis@semi-retired.com, without whose excellent work on PythonCard none of this would be possible.

PythonCard-0.8.2/tools/standaloneBuilder/doc/license.html0000755000076500007650000000300110431133454023361 0ustar alexalex00000000000000 PythonCard License
Copyright (c) 2001-2005 PythonCard developers
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
   notice, this list of conditions and the following disclaimer.
2. 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.
3. The name of the author may not be used to endorse or promote products
   derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.

PythonCard-0.8.2/tools/standaloneBuilder/doc/license.txt0000755000076500007650000000264010431133454023244 0ustar alexalex00000000000000Copyright (c) 2001-2005 PythonCard developers All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. 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. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. PythonCard-0.8.2/tools/standaloneBuilder/doc/pic1.jpg0000755000076500007650000016546110231140006022417 0ustar alexalex00000000000000ÿØÿàJFIFÿÛCÿÛCÿÀæp"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?û‡þ ÿƒý¥ÿàŸ?´ÏÃß‚þþÎ> ð‡ˆ?g…ßïµ‰ß õxŠ/x–÷Æš>©z¦âß A.Ÿ$~²¿/í¦¼[ËNIõ3g$)§~\Åÿ0~Þ2 ·ÁÿØÉ@Çü)ç¢üßׂXã€À/ï9±Cû‰âañþ"dý‹‚ÆÇÃ#þ ê£ã xWûth+ðäø+ö†þÌ¿²û<ø-¾-…¿ÙãÅ4/øX‹à3nâaáÖócö`ý‚¿goZwüÓÀµìù­êß´7üGYÿ‚«i¿µ·Ç/ˆ_hÝ/ö˜ð‡ÅOÙ«Ä_äð牴}+Tø£gðëGø›¤ø†Ò;[|Wø;ã˜õSEQâ 6­.¼÷ßÒ\1ƒð÷ Ù4³ÞÂãñ/‡°y¦#‡©ØÊò­‡âÜÇëá+VÂBœ0™ âjJtëשVx¬(aáÎæ¿;ÌêgÕqØŸ¨æµ0ðxê˜hQ©F”9keXzJa Ò“­_3¥S„b©U“©¥›¡ÿƒ–?n×ÂØÓ%>ø•1®FÄùŽÍË–J£†dRe‹f/ø9öçpw|#ýŽTä ”ñ'ã“»âBœrFmýàÄÑÛþ¿ôŸþÀ¿>ü;øQ­þÕ¾-Á?à‰_ô¿ÙƒÆÿ?i_Œž!øˆšíñ®ˆ‡Ãßø/âÞ•ñ§Ãÿ ~I®x[Äià¿‚>!ðWÂÿ‡÷:/ éˆµ=;ZùïÄ_±ÿˆOû5xóSðÖµñ×MøsÿUýƒ>(ê³Æ¦¿µíeñ÷Æþ*øÅñ?]ð}Ö½û;|ðŸíwû7x³Køgð²$¸ñ¦…់ø7ðFñ>˜š'Á»GÅ–š·†}êX §,KÄð& F†=`iÔŒÖ"uï€ËñTêûZ•Z~ÓŽx8óEÐn‹ª±-ÇG çÕŸÅQöYÝZ“Ö”\]5 W­Nqstå rÒêÎÖ©ï¨û8Þœêù ð_¿ø)+ü??Oì×û5ÿ«ÿ„½þÂ̳w¿á_ˆ+ 7Š?áÿ„Ìxá¼:|aÿèÿ„€øgûEu¯ì0uV³ŽÀ›¤È‹þ-ý·¤å¾þÈ 3ƒÿ_Ä98oˆ+A=v•Ú…9-þÿ‚­~Í ?d_ØöŽýŸ¾ Ùë:wÃÿÁh¼ªxKG×uiµûÝÇâüKÁ?î|;¯unÚþá½GÅ÷º'‡.5©µ?/‡´í-|Câs\Pñï£~À±–»ûþÉ?î´Sð߯0ý|ûM|@ý©ü-ûD|øÅ|~9ü[•>!üOý”þ0ø³â“û|Iðm¿Ãè$ñ/„t;à?ŽÇƒ?fýTø¯ñKÆÚoŽì¡Ò\6]áu|³›UàÊÂf™£Àeï „­Z¢¥W C…­Ž§Zö¤k”ù=¬V"téE·8·«ñ41pÐÎ'íp˜_oˆU*Âr…IS« 2ö_¼åtå(ó(>DäÒåmyìðq7í´Äƒð«öAá\œ|×ø*…ºˆLHÈÆvÁÜÑíÌ?ðp§í© Ë|-ý‘WæpOü)sŒÇÊN>`Äí!‡HÜÍ·éÀ¯?²ìÁÿ4ý›‚?eÚCöeÖ<'û_~Ñÿ4/Œÿþ|Iøaû+|NðŠ¿gÿŽ>øcà­â/ÆïÚ;ãå×ÅO‹ÚïômþG‹| ÿ Dø³áßëøMm¬[ønÒÓá?ÙëöðÇO‡ž»ñ/ìYªü=ý t¯ø*ßìïð¿öŠøàµý¥íµïƒß±Žþø[ZÕ5/xÇücñ'áÇÃk6º÷ŠWâÿŒomµï&Õm|1ã] Ú]‡‡ô.xá¼-©ÏV\ >9~]ކ&¯ÕãU¼~34Â:upÿÚ 4áKû>ŒÕxbkÅËJxaª{â*¥N'ŠŒcº•ÝzôeNÕÅ}^–§4f¨''/mQ8:tݨN¤X©{.MààßÛEºü.ý’‚N~ ë}†@ÿ‘ôd“òö˜¨ÝåíAÿüý³%¿ÂïÙ50Î>ë9b‡ñº@Șld!Â7š–ÿv§ü3ö=ÿ„“ে®eÅÓ¾üAø·ÿhðíûO~Ð1Ã0øöcø©ñ—ó片¯>'MðCáñÓ4¿ éú8Öþ6x;ÅÚG‹O…VmRÛSÕ½yü¥Ù¦ÕÏ”©‡“œa×,8¸‹;¶þóæYM»aòü«Ok á¿ x•b–„hQx>WWëT¡.l~g—{¿WÇbeíòœTÝ:®•UB¦»§b pfy—e‘¢ëfÓ—¶~ï²“ÒØ|.#_i‡¥uÉŠ¤¹¡ÏR5!{ÓgîšÿÁ}?ls×áì ?îŽjÞ™ó<÷çÓä»0ÁxÿlIðÏöT\nʯÁíW*ŽªX·Œ•I m*vx¤'KO„ìã¯'¨ùGû#ƒŒöÆÂã ÓÙ®ÖÆÄ]¦C´.3&73yòÛ0Wt{7WÉòôÿ ~ð,ãËwb·uÿO?ÏÕtó¥Ä¹ò‚k3Ħï­ãÒßôïÉvÛu²ý¾ð]¯Úðõøkû,û£Ú—û>¾3sßÈ0]kø._ío+0†ß²ê€å~jh àgw‹ÆI Èo/7Ü&[_Ä‚?dãîáÆnØúK%÷ɷhsò»–nÕ&ìɺÃ#/W—c“ðÓ€ùSÿV2ݺF¯xö­çÿlMN&Ï”SY¦%?XyuvþUêº~Õ/üö³=~þÌqÇ ìŽ@ÉÿŠ»§$v9S¸/Î#Õ·ÿ‚Ù~ÕÒçÌøqû2©Á$'Â;ÆØrÀ+â“ÏbB1É“‘0¶üYAÓƒÁì9 Éù>éÆãn:&ÌAÐÙ.Ñ,ǵÚ£~Ìœmcä·-³ØnÇäy[l³—†¼ eÿÎ]}>ÍTõåÿ§©õd™q>~¢šÍ17òp¿Oî>Ý¿»²ý–_ø-?íRNÃÏÙŸ¯o„—< ÄdÿÅSžœ†8Ä‚-8?à³_µ$¸ÝðóölRN nrŸ9_›>$Éî¹ÚõÎBùÿfürŒr>^ž:œrFÎøämaÛËžõ¢à òÊí?tŒìýàaäŒýݹØ>uVÜ<¬ØÄ¼6à^UÿÖ]ºû5¯Ñ¿ù{·Þ¼ÖÂ|OŸû4ÿµ1W¾üÑ_ûl{.½>GìÿÁciòp|û7õíðš^â2sâAØ`Ž0AÎ1'•¥üö›—¾~Ϋ“‚?áSË”ùÂ峯x%OnNHhŸ‘H9û¸ÁϾcÉùdýäcçg\“i;FîN4üÿâð7+êÖ]{'ðÕì¿éêëëóØ™ñ>~©Å¬Ó›{Þ íþÕ.7[­cþ ëûJž¾ý‡\ÿŨ<}ÿ]|FÑÜ $¨ÜcÓ¶ÿ‚´~Ò»À³à$ •øR@Pd*–ÖŽA‚ùYAfÎ-?'Ðcøqßøq¿¾Á’1×#•Ûº-ëá~Fãk}Ü*f`7ŸÜ Á¶a†NÓg+åÄ¿?ø‡Éõo/ºëË[ËÞ.ïwò•ÅAìïý«Š½Ö·ŠÿÜjÛ.ÛyY~ª¯üoöŒ nð?ìú§0ÿ…X‡æÈµ”Ý‚:ü¼Nß›ËÓ¶ÿ‚§þÐóc¾B’WáZü»¤dÉΦWng8*KQ9µü¶v…6¨lÀ# |¸ò1Ÿ—gäÛû­ÛåO–Ã3½?~ycöa¹Nܬ;p1ù;¬rÿˆuÁ­ÿ«™~ÿËW£Vÿ—¯»ë¯ŸAñG{6ÿµqWºÖð]À»wéÖÖ_§éÿBý H¼ð Á~Âvœ6FµFqŽ ÛvüÞ^…¯üßãìÌx7àG%A ðºWqpA'Q`NñŽÈÛ‚¯œö¿š *Œ*íav`òÆ@ÇË÷8îíýÖÕ€Ë/ pcTåx[ |ƒ¸ü›—“µP±ù^mŽñø'•¿õs/Ñ?³Wº_óò_‹_ä£ÅTÀ\á1˜õì2¯îÁıœã•äò’rNÞWåÚm«äù–YÄ=à®Y?õw/ºOìÕèÒ_òùþ—ëÙ(ñOò·ý«ŠÒÖÖÝÿ§«ü4ýOø(wÆâ2Þø(`¿ ì)ÚÄŒý¨äpH\€I 2Rí¿üãTÌCxSà²€Ê †šx§xÜÃí ¸‚P€Ž[j Þ×à× À»WS•ß*þìgùNÔùFp˜ÜšÖC÷€íQ¶HÎæXðÌw‘åão̹L/„ò<Û ¿âpg+êöúô«ÞßóõþO_?u\8£ˆ]ó\V‰ÛXôq·Ø×Gm>ÿOÛÛã#*“áoƒŠJ‚Gü+M7‚@8¥F#’2Ê„†U9ì?·oÆsŸ |\d³†ÚH1.Ý*«6WqÑBG#;Ç›5·ÂðŒGÀF íÛò/Ê•óÎ<‰«©h0ÙØ~^rÇh™AÄy“äëæ&Ääó!òþÓe—üCþ ´¿ãÀik]U¾ñïQyôï£Õ©‡ñS¾kŠÑiïCF¬—Ù]—W¯ÙoE÷l¶çŧUfðÏÂEÈøVúNA!OFØäýåV Ê­¹ì?¶§ÅyÃ_ Àɡ6å˜á²6–ù|ÒF›RMïo–‹ \FŸ.Ü*ŽF|±ð•ã¦ÄØ]‘ãËRÙx­µ¾S÷úð³žO–¿?˹_Í‹`Go6¾}¶k€x;_øÇð$ÕÕ_/ú{íÕwóåTø§ˆZ•ó\V—¶°ÒÖ·ü»_ʽm¯T¾ÖöÃøžàáÏ…ªxÈÿ…q¢ðX)ã|(Ä|Ø$ª• ‡ âDŽì?µßÄÙÃß ±žY~h@'É#sº¤ü¡†^4د½ÑwËȖ㣠1°`®Ý¿,\(ò"ù2~EØr›còü«}[Qóƒ·;Hù‡ É+uÚ>o—r·›ÅVo2-ž}¾K€¸?’Oû¢ÑµW²{º‘Öë»ëîêÐCŠxÊÏ5ÅlºÃ²þâìºtõ·×±~Õä·‡þ¡ÈOÃÍ qÏÍh¼r@ÎØ|Á‰c‚ì_µÄ78} á°X’¿<>Äm› ´9Áç`*§sF7<-Z®…pÆ\0ÀŒg>D||¸Qòùj»1—äZj[Œ08eÚ®r‹¸¦#c•[r1¹OÉ´.wÃ2(p…ò Î5{Eÿ:óëßWÑGŠx…´¿µq[tpíÒÿÚÚ¯ª¡ý¤|{ %´/‡jsŒ‡þàc9;´õ89ãåcıÁv?Ú'ÇNH:/ÃÓ…sòü?ðÞTvƜ䌮NUF·4csÇó…ªíR<²¸aÆ8*Œ‘ä§oÊ6 €Ä>W“i« òFÞ‰'nUÄnzyOÓjíÚNè¶ùåáÿ2ßËWùbÿÿW骨qG6×ö®+K[Xw÷?ÏÕ[O¥"øñãI>öà$üP^Èû¤6¤ƒ¹‡8*TU:;{KñÇÅí×JððIÏ€|/×àĨNŸ¼T+á6©Œ~ënR0Ã"ƒÈä}œŒ/–Qd~_“g¥ƒ ~òð>Và~ìrzµŽr›sPànr×"Á5éVÛGûïó]ux§ˆ6þÕÅ}ðòþíûwÙhì{ô?üS(Ëi~ O™Ï€ü*1‚mg0sAçHØÍ· h ñ~»¢®»&¡ðŸC³—UÔ4ˆ"Õüi%Ì÷:e¦•yvèš/õxÒ‹X²Uiå‚GÊ-±î?5Ú.¡pÌ2Ë‚¸1Œ©LÝáÆFÏ)Wd;<«.÷Åø6ÙÏÅÿ|/ÿ ·ÃéÅø|uà¿øA5_Š?ð–ø6Oø5ZÕTfœ=¬nÚÛÞVóÔ÷¸W6ÍóŒæ–›c½„¨b*IR« s楸{Ê ¥}×,oÙY[Úÿ´xŸÄ>ðm‡…cԵѣü9×<~ʾ*ý¨ÿgßÚ‡ÄðO»_k³Á4ÿg¿x–ç㟌¿àž2¿¹žoƒ¾'ý¸>xkáŸü&ßò$ÿii?³W޼{ñ+ãž•ÿìÒ¯í~üS×|?âÛ›‹ú·â·ü›ü¿þÎ âOþ¢Ÿ³õ~O—ã(æTóJ5²¼¢Ÿ°Êëâ©VÂa%J¬+S«F1jn½Et›æVµÛ³”Zoô<^®¦_Rža™Tö™†…JxŒJ«Jtª))FPöQß•4ï£]-eÿ”ÿ‚KþÑŸ·íOðûãÂ/üð7û6|#øo{gñ#Äž:Ñõ××4y|Wâ{«Ë;O |6ñ}Œš[ØøËJŽÞâM^ÎôÞ[j›;uŽÎúOʘ?àÜßÛj%Áø¡û,AãÇ‘2>Gòå ªà* @‚4Åößâÿù ZدàýBü?\½}QãOd9^%Ëñlp9u/«á£W/§V¢§ÊiN£šs—4›æjâÅðŽOÄUÅâ!ˆu«ÉN£yB<Ö[$´Zwïåoãø7Wö׌©??eµ#4~7ø°|°U”•VøË+d!£+°ídvY#؇þ æý´#?eñÊœüU ±ƒÓà„c© € Ac¶þȨ¯B^?ø‰-ñ9VÉÈ®’ÛÒð<ŽwÀÙÓÙbtµ¿Úe¥­ån»Øþ:cÿƒ{¿läëñ/ö`û¬¸4ø¨@Ü…xÝðHŒA@_£mdÙƒþ ÿý±¢Æ~#þÌ£‚¾3ø Yr#Èñe •<|¡|¸ÂA[_´R~>ø‡+_•iµ²ÊKòšõ Ó÷X¿Þ%ÿÈÿ_$" ÿý±äüHýšÊ@ð˜üO!r»xÝð`Œ í  †=ˆ?àƒ?µô@gâ'ìÖÉÊø¿âiÛ‘Êü)´|¼ãhZlXÓÊŽÛú×¢¥ø÷â·ÄåZÔ²’ÿÛÿàw¸¨ù ­ìñ[[ýæ~^^]4ò?™Á%¿à¢<øWðoàŸ‹~7~Íú·ÃÙü|Cü2u?ÙÂ">+xŠ×Åž>Ƴ¦ü±ñ½ý½â ;}C>&Õµƒ¥…¶‰ý›fíl<îÛþaûYÂ0|û9™ÈdñwÄ’Ê©ÀÇÁ؉ݟEòÂ'”–ÿÕ/¸ê„*ɨSukWp£”P¥[ZxœEWJ)ÕÄb*ÕÄV¨×=ZÕ*U›sœ›ªœ‘ÕiÔXÊFRž.r’…8F8&Ó|”éÂ0„v„#Å(¤åià‡_µ‚ÿÍAýþ¿ð–üHã É#d~ ±mÿJýª¡#w?g rx«â! ³)Ý‘ðŽ2IdŠ~PÀ¶ŸÔmOÇn?jßXÊÿðÙKïøÿ2_d-YÓÄÙmþÑ/þGþ üÀ¯üOö§ÿŠûàã·Š¾!žËÇü’ÇÊGl `´&­·ü‹ö …·7޾¯ÞgŠ~ ¹9Ü?âÔ§Ìx'iLÀù|•¶þšh©~:qóVúÎY¦Ÿò-¥ÿÉù/øa>ȳ§Š²Ûý¦KòVùïæ4ëÿmý§F3㯀üsljþ ±Ÿù¥¼Œ.à Z–ßðG¯ÚZñ·ÀµÂ•?øõ€q—øZ3¸€CòñÁ„[H”R~9ñëVúÆYnßÙ´­Ó§=º.‚| 5gOoû —ÿ#­º\þsSþ ûI. ñ¯ÀნøóxÿÉ2ä@n?'Jßþ %ûFÄüùN@%ñÉÀÞ‡’~(o”÷TîDl‚!û/ôAEKñÇZIârÍ-ÿ2ÚZÛ¿½ÿ°¨™¹}ž*ßö%ùEÏ¢ÿÁ(?h…#>2ø-ÁÈLjüqÇÍœÿÉ78úrÄ~V…¿ü¯öƒˆ(>/ø5ò¶F…þ¹ÂŒù|½ oø'¿ÆˆXñ/ÂâLlÖ|Qœ+† –ð6[T“±B„a –¿±tTÿÄiãúËm¶¹u'Õ=ܯӸ¨\<“^ÏgÿQRýcÿü‰öøÂª£þ/†k…"k>'(˜ÂçÁk1ò¯ 0•ÙzÛöø» «?ˆ>°­Æ±âRWi•Ýà¼}2«òŒma Û~´QSÿŸío¬eÖ{¯ìúzÞ×û~]-÷ZÉp$Ò§Š³ÿ¨™yuå¿D~XGûüWUQý½ðíp M[ÄeSå# Ÿ.B’6©Àà)ÚVõ¿ìQñR ÚïÃÒC«5_…Nw>û  ;F 8‚K_Ô*â2ñµ­íòë>ŸÙôÿù?ø=6²T¸ ‡ÕíOf¬ÓÄËËû·ÖËÈüÕö7øœˆŠuϨ«©ëØ\*‚«·Â‘¼uƒ„Q…[°~Èb`[[ð1Áàÿjkç`É;×FgåyÞ„ù9 3[~ŽÑKþ#ííòíwÿ„úzìÿŸÉ^Öü¬—pò½©âõßýªZí¥ùom6ùl’_Ÿq~Ê?ãDS¬x(P8Ôu£‚Œm%HáP**áä?²ÏÄÝYµ|¬0ÃQÖ²£çäøFÕ™Áe*D‘°Úvkqc3èãånn‰ˆA\ck9|¸‚* Š;k‰ð÷Z\¤é]1Ì×' yàày]¤.ßc¢¥x³ÅéÝVÀ_ÏMöï.¶õóÀ<<¿åÞ/k½O__wðÛÈó[jq ºD²’¹ò¸±L“1{41Gkäÿ~|Bø“&‹›ûFüjøK¡èK¨Koោºï¼?¥]꺳Y.§®j—zßÂïø‹QÔ.¬ô­OKkpèšu¶—ºF‘§_jZíæ­õÅŽñˆ³:ÂæÊñxyÊ•ØJ›•6œ$Òšw‹WZÛËkm…༟^8œñøjñŒ¡´±’RQ¹–±i'et’ZÿÃ|Gÿ£Üý°¿ðã|:ÿç+^ûMþÎÖß³÷ì!ûdA¼eñû↩ãïx›ÇÚŽ‡©x“Pñ&¤Ÿ|;<²Ïáß øCNkvÓ¼!§Jï.-ü÷òÞ]]^\µÈ~¸×Ä?ðR?ù1ŸÚKþÉûÿéëH¯¯V5éÓ¯‹u){Zi¨JPä\Ü·Ñ\ýñü…­?ìWð?þ¡~®^ºÿÈZÓþÅÿêáúåëæçñËüRüÙìÇeè¿ «ø~ø{Å–n¹ámOû>âÇKñ.Ÿi§ß_èú”кǨéú~µa©h÷×k‘sömSO½±¹ùRBUÁ|kQ:m‘’1ºêâh¬ìîî® Tù„S(òÐI66?•åd3­6ŸðXŸÛËþ 5û#ÁAÿa/€²wˆ-´/„¿<)àë^_‡~ñ-¯Æ‰ÏÇ SÀÞ=ðW‹µ½oFÕu­7Âzg„nü`!ðe÷„õ}2ÝjãZ}j? _hç/ÓüWãŸ|;ú)ýøû)ೌŸˆeŒÊë9IágB¤þ,F ¼U\!»ûÒ*Uä”b±”qTâ—²iQE~ÀpŸ—ºçü?U°ñ—í'§A ~ËÞðÏìÇàŸÚÇ¿¼+ñ?ö¯ñ—…ÿk/x7à&•âvøŸãoÙ3À²ÇÅŸxcàŸÄOižñ€¾!i^5ñ~«â?Ùïâ?Ãߌ¾ðN¹âohŸ¯þ†ÑnïÙoYñ‹ü;?ÄoÂ6þÖþ0xk[ñïÅ…?~üºñÀÿXüfðÿ…>>üSðƒ¾x÷[øtŸ>$ë>$Ò¼ ñÄwö¾økñƉ¾ð‹µ½ÄÿjØ›ãOí¢xïÀŸhO…ÚÃfÑ?h˜> i¿ g/xkÇñÆïÙçã—컡j¿¼aâÚ_ÇšÅÍÁ? ÿh/ÞêþðŸ€~ßøÏâá_Ùø—Á~ÓõkÇÄoø'‡>+üѾøÇâ–·„Wö†ý¼¾4ø§Qð׆¬4¯êþýº|'ûtø;\ðG‡îõMWÄg†õ¿‡šgí±u>•ã}GHñ]†¿ðâ nü ¦Ûø®K_kjM-Z}mwmº­u²²¶þW·ÛOøoø?wÈöÉÿn?€¶¾Ò¼EueûC[\kºßˆ4]ÀSþÆŸ¶$?u˜|'aá«ïø»Jø'À…øß¨ü.ðÓøÓÁÚ7ˆ>0Z|>›áVâÏxkÁzŒ­¼]®éz%ÑñÓöÆøðWDý˜¼mg§k¾~Òÿmü¡ø»à®ãwñøsUýž~4ü{ðßÄ/ø'à‚~(x»âÖ‰¯[ü'Ó´˜—ÁÚa°³ðç‹føu­¯‡jz†µiâí/èo~Ë—÷? ÿf |$ñî‰àoþȚ߆üAð[Äþ0øYáÏü?šÿEøñ öo¿ƒÇßþj_³¾ƒ>‰}ð¯â·¤Ñü5ð\ø/áÏ øá<%ªhºRx÷ µÕjzjßÅ̵²ß•§ÊŸg·É†¾š¯»K÷ó_ÕÏž|#ÿ*ð,_ ?hMwâpÿ„7âÁO~ßZf”þ0øWûFü1øãm öEø·û@i^Ò<7ñê„ß|ñÆÒüø8|uñ'ÿfø¿ñO¶ðßÅÏøwàôöŸ|Káý¯à¯Úá‡Ä_ˆÞ-ø_૟kúß‚·¡×¼Sið“âÜ_Uð¦»iá_øcAý nüoð#ÅÞ6ðŠî.ü)âßøKâ>·ã/ ø§Ã¾5ðÞ½¡iú߀ükc |Qñ¯þ ·ÿ ‡örŸàü.øG|ïŸðPŒ?ð–ÿºþ×Ûÿ ßà_ÛÇÁ_ðŽÿ`ÿÂu¦nÿ…Wÿ µý§ý¯ý²?á8ÿ…eö?ìÏÿÂgö¿ {_ÁoÙ+UøWûFüYøñ7<£hŸ?á<]?àÿÀ‡>2ø#ðç^Õ~!xëJñ–±ñ{ö„ð÷ÆÏ‰ß¾5þÔ0ZxkBð¼´o†<ð_ÆZö…©xÛLñÕŸŒ4K߇Z/²J›M§ïYkmôû;5¯u³`¯×ËòWünmøWöÐøE®ëzOƒ¦½Öõßë~)|8Aø9ðÓã÷Æ» Ãðÿö‡ø•û;i~$ø½¯x[॥¿ÀýÄ>.ø_âí:OüXµðŸÂ©¼GàŸŠ¶þ(|Qð7à sâUωþ×?·Üß³ÝÿíqðïÃÞÖõ‰?`ÝKö»øm⛟üUñ×­kÄkáÏÚ×TƒÂµÏøNßÂ? ´M2ãöf²›M¾ñßÅßüX›ÆW¾ð Ãâ? <š–.•ÿèÕtŸŠ^ñΟñ[Á>´ð¯ÆÏ‹?5ßøáŒ¾~Õ^+Ò¾$þØÿ¿l(gûÿÚ/Ãí4M[ö^Ÿ[ø££ø#â_ÀŸˆ¿¾$ø7âEžâ¯ØÛøâˆü â„~¡ûN~ƾ#øíûAÉá‹Z'ÃÝ3ö©ýõßÙãE§‰>_üD¿‹Ãšg‡?h‹_„~/ø_¨é>[ø;[𯋿iokŸì|W¥üH°ø•áÍ#žðË|%Ôìµëm{%-Û^wÓÞVé}c~Õn…~¾_¥úúÿÁëÛAûtþÎxsU×çÖ¾(é:ž•­øÃãáoˆÿfÿÚOÂÿ´>»â«ê¾ŸÁ_³ˆþi´WÄ ZÑü ñ'ZÓ¼Kà_…þ"ðåΉð—ã.²š©Ó>üOºðž'í û_è^ý“ni/„²Âai¬øÛá'ÃÏ7€~#x«Uð§Š~,þОý›u[Ÿü ðÖ¥ügñ7¾ øÇÆ:”þ:ýšl¬¼ñ[ñ—uß—3ü<øƒu=îåßµgü«ÃŸ´÷Å]Wâî¹­|.Öµ;}övƒÁß>:ü°øõð4øàT?¶ÎuªüVøowãß\|NÑ5ïþÛ^)ŸÂþÒüQðòÿÀ_>øâž%ñv™£àkŸQ´ý´­?öaøcû8húï‚|iàŸ¾7ÍqðÓ࿃~ü9‹UøMû[xö³×|àƒÞºÑ4Oø'_Öü)¨x¢û\ñŸŒ¼;¡j–'ø‹ã/?m|Oâ¯+S\®íûÑæO¤~Ö¼ºÛoÐ5òÙë祴ûÿÌÄøsûw|"¸ñg†~ |Løƒ¢þ%ÖôøCÃ^øSñûÁ~,ø“â8> ~Ê?üyw?Á/ø_|Öü7oûVø3Æ>%øWã?Šwÿ þ .«ñâoÄ=9>~Ð_ñ ø“ñ²Ûáþ8ðìãûPëUþ•¬|ý¡>5xkâOÀX¼?ð'ÄðÖ¾ ×áC¦šž$ýž.|kàÛø×JøµyãðJiSx¶ðGìyÿoíñö´ÿ…‰ý¥ÿ ßü.ø ?áûöWü-…¿ðN¿†Ÿò5ÂOuöïìø`_í¯ùìÿµálfÿÄ·þO·øËçŸÁ8|qðæ3Å^øÙð»Àß|ñGÂÿ> x á§À?ˆý…~_è¿ ¾<|ñ+è_±¥ïíIâk ë<#ûL|SÕ¾$j~:|ðç‹þ"hþ!ë^ ½ñ‡~)Ïñ±Ú–í»ò­:s;ßhè–ªìšÐ5¿—ü7üëÏŠ_µ…ð›öýŸ¾k¾ñ¶±ÿ àŸŒ>"Ñü[à¯üFø‡ÿÆ»ðÃÇ_³§‚´ý3źïø¿þ?øƒþÜÚž½ñ‡ÇZσ~ü;ÿ„JÒÏÄú¸ÿ„ºÆïLñ?‡ÿðS_Ù‡Æ^ðö¥6»ãmKÄÚ‚~x‡PÒ¾~Ïßµ·Å j¾)ø±ðsáßÇ­áßÂ/XþÎ>Ô>3øÚ?„´/‹ðÿóøÇ¥|³ñ7ÅO|(ð'†| ñüô?Ä¿‚Þ#ñ?ÆŸ‚¼ ã}Â^.øY¢|Aøi¯éÞ-ðEÿ<9â߂߼YðkÆ?4-ÓFñÏýOÂ?n5?€¾ƒÀ_/uxOÂV^0‹Ä?¼q¬è·^ùöjÿ‚mÿà ø?ÁÞ>ñ—À{}Wâž•¡k |1âOÚG¾Ö?gßøÛâ~“âïßü6ð/Œ>&h^2ñõ·Äÿ„oá- Xÿ…·ðÔx§¶ñçíðsá—ü.¯øMüaý‰ÿ ñðOJý¢¾0ÿÅ?âKþÿƒšßü-ŸìÏÄ£D¿ÿ„ƒí_ð£>)ÿÅ?áí¿Ãÿ¿úF‰ö߇µÿ5þ Á üðgÅŸõôÕ¿gŸÜ|;Ñ?e™¼Wñ+Çÿ±·Ãÿ~Ów>8ý•~ |ø/á™~ütñü&ñ¾*øzo†_4íKÁ°j ¾ Yøoèkˆ¾ Ôþ#x«á-ޱçüAðO‚|ñÄþþÏÕbþÌðoÅwâ_†¼ ¬jÍc‰{ý»­üø‹eýŸ§êWz®™ÿïÚu‹>ÓVЧÔÿ<üwÿÛÿ…©¥x¯áþ3ùŸ³¡ãoÚû⟄|àÿ‡_ðŽüxÐ~#~Û^ ý¥|ñ‚ãÄŸõ¯x¿á÷Šü¢Ú~Ø?/>x_Lýœ¼®è71|#_x߯ÑxÆCâ§Ðßþüið_ÆŸŒ_¾;|bø]ñCÅß>| øK§iß ~ø³à‡<5áÏþ,ý üci{{iãÚö‚ÔüC­ø‡Sý µx.n`Õü=a§Xx{MŠ-6îâîêéSTí¤í³¾®êßet»w{Ù&úšõ_Õ—ë~‡—~Æ¿·÷hßÙËáoÄ_ZxÛÃß5_Ù{Áþ!xÙÛöðoü$žg|/®üOÔÿfŸ xÛÀ’ø›öðO…|MâM+G¶¼ø }ñŸÊÿ„ËᆞúΫ¨|JðÞ*úá§íSð7â߈ô/ø3Å:Øñο¢|HñxÆ~&|4øáû„·ÿì¼u¼ ñ'ÁÞñwÃ=nÂßãßÁhþø‰£x_Ä~/ð?Ä¿ |Aðv•¯øVƒÄ'ä=Kþ ·ý¡ðsö\øQÿ ŸþM›ö(ºý‘>×wðëí¾ø¹ÿOìcâß¶üNðWü'VÿÛ?üsÿ ÿ ÿã¯ìÿÿ ü]σŸüsðïþ„ä=¨q>ÿ‚Ox6ßà‡Ä¿ƒ¾2Õþ éöŸjÏ£~ο³Æ«û8üðƒ|Eû?øöHøõð‹Áÿt¯Ž7—Hÿ…õû1XüoøwâKªøGÅ?õ¿‹~ Ѵψ> ðŽ©oMRw|Í]»+^Êí'²Ógm´ÜôÓ×ðíóû¯<)ûw~Ë~8¿øqká?ˆ:Þ·¦|SÑ>ë^ñ½§ÂŸŒ#áV7Æ¿xoÅŸ¼#ñã þ‹á_Š?´ü=»ð_Áÿ‹>1ðOÅ_Íñ7á^¦ø6}OâÃû?müXý³ÿf¯þ2ñÃ߉Ÿ°|mà‚z—íã/ Xø;ÇÞ)Õ|=ðEÒ¾*jº×Å}BßÂ>×¶x'Eÿ…7ã=XÖ‘žÛJñ•çïß›|dø?áÿ|ñâ¯ø''üCû\jÿ´òY~Ï7—/ø£ð·ãGŠõßþÉ¿þ)~ÓzŽ>øCᯃ<3¡|ý¤¼_â3áÂëí3àçgÕ¼=?Á_|@Ò5|_ñ/ÃoŠÿ<]ã/ø‹áG¶|Rý‘<9ñ‹Äµ×Œ|_­ÛxGö¶ýüû"x§CðÕ†›â? øsÂwÿµ\šç‹ü?âQµí2ã[×´ÏÚ‚êÓJ±Ô|5‡‡oü£vÞ%·×dÒô•jwZÊÖW]Sm]_–ÎÊïÎÝ. ým¿á§üO>»?lŸÙÿà_Œ­þxÿÄ^6Ÿâ ïü+ïìïü:ø)ñ¿ãGŒµ_øZ:WÇÍwÁ_Øþø5ðçǺޱý£¢~Ëÿ5Cû2Æïþ­+áíö¡âìkM[Ók·ü4WÁÏøSŸð¾ÿá0ÿ‹gÿŸoÿ„Å?ð”ÿÂSÿ Oü ð¬áZbÂÌÿ…Ùÿ 3þ-'ü(¯øD?áqÿÂãÿ‹?ÿ7ü,Ïø¥kä/~ÄßuŸÚ“ÁµWÇoÚáw|]àoá<úw†þþÎ^,øCá˯|*ø=ÿøai¥^ŸþÒÿõ6ÖõOöõÕüMsâ/`°µ°øk¦ør/ Kqâk¯èÞ£wû"Æ1|Nýž>ÛðOâü,?Ÿ~0ãöŠýŸÿáv|ÿ‹Ùû[xçö¢ÿ„wÆágø'þoøBá6ÿ„kÃú¿ü,/ÿÅSáýâ7öe·Ù¿á¡ª~í¤ßÃÌõ¶·æ²qOM-½ï³°+ßk-}zy¿0øsûpxâWíß4Ÿ‡ÿ4¯í_‚>0øKž(øûFø7Ìÿ„ËÇ_´ï‚µïüSÐ|kð_Ã_ðÏ_ØßðÍÒj~Õþ6k> ÿ…Ïÿ •½ŸÃ}3UþÊ´»ñ }ÿý˜tÍ+O¾Ôµ?š~·«xÛGð•ðÆûöJý­­>üZÔ4‰vߥøs©Üü.ø‹£Ùxª}oÁ>%Ó´Ï.ð7ì ãØjšv›ûVüQ»¸ø«û<ê³÷íñY»øâoŽRXZxö”ñ÷Ã?~Ì?¼eñ{Äþ9ø­ü%ñÏíSãë_ß|e¼ý¬üGÃ?|ðqñL.ðw‰~'xóËþÁ-¿áMþÐøõÿ /ì½à¯øF¼mðÃÅ¿ð¬¿d¿ØÏþkáεÿ Ûà‡íáðsízÖ‰ÿ ñkíž6ñü6çö®¥ã]é³BøAá¿ÿ`Üloè.Ô½çÌôK•kï5½ÛŽ—ß·ßd¯-4õòÛÏ^¿Öþ¡ûUÁHþ|ý™>,üYøQªë¾$è³ÏÅÏ‹^ð¶ð/ã÷Ä» xÀúGt½ËöžÐþx.M{ölÑâ§Ãß|=ñu·ÇíKà­þâ?†Ÿ<'¨êZˆþ|HÁý·íuûoxOö~øgûO/‡£Öì¾7üýž~5|TøsiñCà߯Ÿüøã†ÿ|Kñ§Ið_…>/ê~ð‡Â¿‹zØÐ|?â|<øSñ[Sømá? üG¿kM%>øÚÿÃ<ø÷þ ™ñóÀ¿´×‚¾þÒ> ðgü6‚hß…Ÿµ?ˆŸ³Þ»ñ;ìÿ~5~Ñ¿¶?Çÿ Ûü(³ð×í ð‹þÏxþwâ§„¼CâÝüMм}ÿ÷Ãý{MðGÃßìÏèÞ)âhø$ü/?|Cñ7ü-/‚zü'ðÕ×ðµ5_ÙGþ¿Ûçþ“ösý¡þÂãÏÚ—þ¶ÿ çÁ?ƒ_ðÐ[¾|,ÿ…UáßøGþüø-ð‹þ†ÿ„/þ‹ö•«ÉÙ9=›oáåOÝÙÙ­/½ôØzöíÿ¯O—ÌûËÅ·wì·à{ÿˆö¾,øƒ­èšgÂÍ↵âÝü)øÂ~j3|ðç‰0Áà~ü^ø£ð×AðGÄ+¿|øMã|Uðôß ¾*iÚ—ƒ`Ôþ|@³ðÙíÓû8MáÍW_ŸZø£¤êzV·áÿ…¾#ý›ÿi? þÐúíÿЬëÂ/|aÿ‚iøâ÷þ%|¾øù¢h¿5oöÓø—ðŸI´ø7uñWÁn‡ÿ´ç‚~"k¿þ#Mñ~/üPø]áKÛãv¯à¿†þøGð‡Å‘Ckð¯K×>.ë/àÿj»_Ú³þ ÕáÏÚ{⮫ñw\Ö¾kZ¾‰û;Aàï‡~Ø|zø|Gð*Ûg@ºÕ~+|7»ñï®>'hš÷„m¯Ïáé~(øyà/‰Ÿü ñOø»L‡Qð5ʵ-=éy¾Ú«iËÕ]îíkk¥Í|¿«Á鯑åÿ?à¬> ð'Å»xHø'ã ¯Á?‡ß ÒügûCê¿¿j‹¯Šþ'ü|ø_â_Ùÿöcý”-þÚß~|ñÆCãM]2Ë[ý¦|á™ßøÛöÛø§á]þÏzïˆþ1è¿¿n/ƒŸµçÃÿ\kßáý¡|;àŸø'ÁÞ6ý²þ"øÏÂ^ÓþøS]“ÂÞðW€µßêÖšïÄMyµEµ­’ÝûÚ«u÷tmöÒ×Õh‘¯åú^Úúîà§ß ?dßÚ[âeþý¹ûA|,ÿ‡ƒMàOøàŸÇ‹~ Ñô¯Ù—ö„ý¦~ ü ñ?Çé~é~.ÿ…AàŸˆ_ð¢Ñ5Ÿ|LñŸÂ¿ø»Uð×ÅÝCÁšî…¤øÅø7ëÏþÝß²ßïþ#Úø³â·¢iŸ 4OŠ׊ ðgü6‚hß…Ÿµ?ˆŸ³Þ»ñ;ìÿ~5~Ñ¿¶?Çÿ Ûü(³ð×í ð‹þÏxþwâ§„¼CâÝüMм}ÿ÷Ãý{MðGÃßìÏèÞ)Äñ·üÀþ(¿ý¥SFÕ¿gŸ [üxÑ?lI´ÏŠVŸ±·Ãý_ö¸Ò¼qûføsâî•ãi~!þÓº·&Ôüuð»ÁºŸÇ/Oà¿ü>ð/ÀïˆÂøWðÛÄ_µßè_­~-¢þÓZÉèžÎÖ_‰kmû»l ›òý/××·Ìý]øuñÁ¿|£üBø{¬ÂGàŸÿhMá¯çê¶W‰ô« VûJƒÄþ¸Õll?á#ðOˆþÀÚß|u¢-ÿƒ~"x6ÿBñç€õßø'Ä~ñ§ÛWŠ_ÿÂã¼ý£|+ý™ÿ¯Ù÷Ãßüÿ ¿Ûÿá“þ¿Œ~2ñ×ÃOøUŸðŠýŸûGÆÖð©üàOŒ?ðŸÿkÿÂámKþ?ÃOøGáejÚWŠ?áSû]dÿ=w»ZìôZÿ^C ø‡þ Gÿ&3ûIÙ?ý=iöõ|Cÿ#ÿ“ý¤¿ìŸ¿þž´Šº?Å¥ÿ_!ÿ¥!Kgèÿ#ôÅÿò´ÿ±_Àÿú…ø~¹zê<_ÿ!kOûüÿ¨_‡ë‚×_RDÖdÑa{b=+Q}&Þ6´I'Ô–Òf°…ýã±W–èDŠ×²Gh¬ÀÜ:‡&a‰– ÅÇ ‰ÆË C‰Ž u1˜¹P§:« „…Z´)O]ÅR¡ µ¨Ó•YÁN­8·5t`ªN•78RS” êTrTé©5:Žœ”!~i¸ÂRQNÑ“²|¥½ÔzÏŒäÔ›si^2ÅÚvÜënȬ€4q0)sÂážTTÓÞæ’c¿âŸÚ»öl×¾9~ÔðN¿ZF‹ý£eð ãgß⎠«kö‹O‡Z¯‚?áfxvâ[™^µµ¯ÇO„ -ã]9Öî+½rñM¤Í«Æüèý¸ÿfï‡QÞxÅþøgÄžÔïm¼M jþ;ð¶—¬iºô ºÓ5½/PÕmï´íGM‘ÖîÆö®¬nDöó[Ç*:/äí¿àÙcöÑý²ÿe¿ÚQý½<%àŸ ~Î~þ˶øm¤üMÑ´}oHñ¦“ã CÇ:Ä߆þ&ÒõGO²×õ]Zm KñÖ«éºtºÇ†ü¢éÚg‰t»ùíµŸÍ— p׎¾)ý*¸«Ån;|mà•n,ȼ_Àÿ¯y¯…^ ñž ‡²þ-ðËŠxÃX§†ðÔ3y8ðÖqáütêËû:µ 6µ,v"œp8Ÿë*øÍðFÑ~'Ä–~ø“]øûAéÑD±CƆæÒÇ]×l¾Ï£hzIÑþ"h·~ø©áØ´ItkøëIÓmnî$²œ¯†Cÿ$ý“íõc©Åñ»áoÍ4å¡?ü"kk¯9'µ(5¢¢†V‡`]¡ˆ@TðŸÙWãþ&ÿÁM>3ê?³ç‰í|gðÓŲ7„5ŸÚWðe­Ÿˆ<gñËÁÿ-¼;ðQu/Xé÷–PxëSøC­xêÎm Ç_²MWFð¬w—Ún³¨x~k­ úÓöNUñ3Ï<ã_8ï'àn#Èkx“fÙÇ g8<£…øÏ…á—å¸ÿoÄá)á2ìðÎ&ŽQŽ­>jøþ"árêR¥J­v|7Œ96MW Ïð¶S,^¼p5°´q¸zÕ±XLz­YѧO*•kÕÀæ¾±Bm*tèfy­I¸S§GörŠ(¯ö€ü ü¢ø»ûx|iø;Ç3RøG¢x‡Åß²~‰û_þÐÿiþ,ð·Ãÿ~Éÿ þxâOìŸèÞ›þ £?ì!¡ø¿Ä Òþ$ø/Ä~%Öôï†ÍkâíVÇNø‰á; gÇÏ5£hZ Ìz%¯Ï>8ý·m»‰÷ß²Ã?†ž ø·ûAxÆßì|qñGá×Â_^x7Ä øað“öø±¡£þÏ¿o?Ù»þŸ¶ÿÃzx3Áš†°ÿ¶ÄýV×UøO}®éÿµ-'âÜÐü ûËö~|iá?|$øGû7hžý~ |Q¾ðÿ'¶ø}ð‹Âÿ|KñWáÆŸ¿§øKðÛÃÚÜþ)ðÖ·ð;ö•øu­K©x—Æß þèüLÒì¾#ü$Õ|w£Ëeã¦õˆ¿³WìåñƒJÖ4/‹_~ üQÑišotÿ^Ã>»eàÝ>ÇÃ×ñh–XÆÔ£Ó‚µäÒi;^Ü©ê¾oÚîÏTºé¯GµþÿÀü¼ð'ü;ö²ø¡ñ?š׆ÿgé³î•ãoÙá_Å­Rˆÿ³ßŒ¼cã/Ú›á'ìÕñCRÔ¼1ûWÜþ×ÿ¿µ¿áÿ†¨ð¦‡à_|/ýŒþ>é_´†«àÝ IøqñcJÕ¾;ÙZ|Ûýš~%üiøïûX~Ã?´OÄýwáwü"?´/ü_ö§øÓð§á¿€þø³Ã#øGáωŸàš^9o|Bøâ‹¾9Ó>4kz.™â/h+ã ü5øa¨_èÞ¼| eoâk Ÿ¨Z¯Àÿ‚ÚïÅ_ |v×>|.Ö~7ø/DŸÃ^øÉªøÂzÅ_ ørê[ÝxÃ_îô™¼]¡h—6þ,ñLéZ^¯ka4>%ñR@ɬê+s‹à¯Ù«örømñÅ¿~|ø'à‹ž>þÞÿ„ë⟂¾xÂß¼kÿ N»iâÿÂ[ã} A°ñ7ˆÿá#ñ5…ˆµïíNóûc]³´Õõ´jðÜ!Ï ;E'ËmtÓÕ·Õß™kömmBÏ¿Tõò³ò¶Ïï¹ù¯ðãOía¤øNÃÃÖŸ¾xƒSý¥?ॷ_ìñð'ÄŸ>üIñµÿÀo|!øÓÿ øŸ«¿Ä±íáûz%Ï„fÝ;áOÂ/ ø:ÿöo°ø5áÍ[Bk«Ï‰g‚ ðæ¹ô7ü5§ÄoødOøZߨ¾ ÿ…¹ÿ Cÿ [ý¥ý›®ÿ¹ÿ…ÿ ùÿøÿ…ßÿ/ü$Ÿð“Âÿ 7ü_øR_ð³?·°¿âÐÿÂñþÐÿ‹·_Qx£öjýœ¼qÿ Oþ_€?üaÿ Ïþø]Ÿð”|*ð/ˆ?ápÿ²û?ü+øZÚÚ ßü,øWßd´ÿ„#þßíøE>Ëoýƒö&=½¯ü+O‡?ð®áOÂàŸøTð„ÿ´ÿ…Yÿ®…ÿ çþÏöü"ÿð€ÂöøFá ÿ„gþ)ßøE³?°¿°¿âQöìÿôzNQm>_´›Ñ-5ººõKþÝæÞMMu¿ô¿àýþGæÇÆÿÚ{ö°ø!añæ;¿þÏ>-ÔÿbÙGý²¾;]Û|ø“á»Ú+Þ+ñíMu¤|%øK§KûJxŠãöhÖôOþË:އ©|MñŽ©ûQØkÞ#ø‡eâ›_†~Ó<?ƒ¼eòïíMûeþÖìŸûIüDÕ|d½øÝqñÛÆúgu»3ö3’Âß þßé~,ø‡¦ø»Cñu…¿€Ã~3û^çTÿ‚]xrÿâ×¥øSû<é·ðI½MøÕãÛöe´[ÙÃâ?‡/h»_|%KO†-¦iÚ߉tÏÏñ'R—àKê¾#è–SêðÇâåÓ­ßê/øSödý¡~ x Å>øqð»âÁŠz&±ñ«ÀöºßÂý xs_°ý¤|'âÝGÅþ8ox¯Ãvwn·ñƒÂ?¾ Çñ ]gCÓüGâ{‰¾<Òüi ïâ¿Z^×2›ƒÝ;¸¥tãuo[©®Éò«Å+Ÿ?ÆûZûü×ÎûŸšú>-þÌ0ø³Ãñ|UðF­áÏ ßê^%¼ðTÚÄŸhZ„øžÿ‚uþÅš'ÁÏ…Ÿ|Qû7|ø½àŸƒßð›Ýø"Œ?¾xãû]ø£â›|S×¼;¡\x"ÓÁ?¿á`øÚîãÄz¿„¾xOÀŸtMºg†¼௠x'Ã~ðƈsA«ÉjÜ[ÓWoŠWÓI5ËÊ•›ßF[]6Z[¶ßð^½ÏüIûkþÙ«ðþ-oÁß þx«Åß¿o/ÚGö5ýŸ<9à?¿Œ¼G§xsöiñÇí¥{â‹_¼3ñWöˆý˜< â]oľý˜-|¿ ´ïŽÿ,<5g­üv´ø™ã‹èß²¯‚ûo‹?hoþÀžøÖ‰ðöŠÔkÏÙWàö¯s¢ëZ'Ž<9¡øHÿ‚š|#ýŸøƒá7Œ~|.ñg¿kz¯‰|SðÏľðž»ðÿľ#×|q?ÄÝsÄ ðn©¤ÝxsYÖõŸ‰7W_µ]WQÓnoõ\Ïâ˹æ×¦’ý¶ÿáZ|9ÿ…sÿ {þÿ£ÿ„'þ§ü*ÏøEt/øW?ð®°¿áÿ„þ°Â3ÿOü#?ñNÿÂ+ý™ý…ý…ÿ°gÿ£ÔóÇF¢•¦¥¶é=·¶ªÉ«Zê÷Õ ³êïøvÿƒ÷Ÿþø‰ûFüøÙûd|BÕ|eðOÆ¿®?à¡¿±Àÿ‹^Óþ øëÂ>2ñoÄoÚö^ÿ‚c~ÏZ—Äχ_îh/èŸ <á­o⟇ü{cð§Ä¿ >-kº†•ácÁ3ü^·»ñu—¼ê?°Gí™ûR~Òž#ð.¯ñ¯àމðÏá_í û<ÏûK|»žïà÷†|.ðÿ„W[ø{âUð¶‰à é^_ü$°ð—ð§Ä ¡Øi0iƒ[øe¦|,øa§|=ÕE¨¿ð]‡ÃÚxn}6ßÂNòÿé?³—ì…mâÏŒ>ø'àŸk>6| ðWÄÏ|#øoà_ xËâWÄo_<5ðwÁž-ø“«éñøfïÆ?Ù~6Oâ/kÞ Ôõ}vÇJÕ|a«éVšÆ·|úf¬ù£$×*rj1NÉl’[5g}o¯ò½6-çýißoO3ó_âçíÿûX|ø-ñOö‰Õöyñw„oþ(ÿÁN¾ |øoað›âO…¼Gà_þÃÞý»¼sðóÆÿ>#Ü~Ð)Ó>,hž,Ó?bI4ø#Âß ~ _Éñ=5íÇ:E¿‚@ñ‡¶|oý«k„¶oîâýžlu?ØãöCÑÿmŸŽÞ¶ðwÄŸX|XðçüGûSjZGì÷ð—â¿~Ü|3ÖüáÙwQðn¥ûFøÇá—Ä»Š#ñÅ—ÄË_Ù£á&™á¹þkßPü0ý„?dÿ…“|[Õ4¿ß ¼EâïßÇíCã'Ä/|3øm«ü@ø›áÏÚC⯉þ,üCøgãï[ø?NÔüið¹u?ÇámÁž)“X°ðÇ„´=qõÛu)ý¯ÇŸþ |SñÃßüOøAð»â?‹¾kmâ_…>)ñç€<'âÿü2ñ_蚣xƒáî¹â'QÔü­¶§á¯j-ªønëM¿7þÑ.ÌæãJ°’ÊÒ:]ëd®¯¢¶Û^7zëͺ m®»yv¿êÿòöý¿ÿk… üOûHø9ÿg™~·Åø(çÁo | ñ/Âo‰:¯Ä #İ·ÀßÛãĺüAñ§Ký £û]~ÙÿµWìÝàÛÝgÞðOÅoˆ?þ ø§ö§ý°>|:ø{g¬ø7Áß5MWâ­ð³Ãz?Æ¿‹?µwìé­èkÑ> |eð¡ñ{Á?iOø‡Uð÷ÅÝGöNøSi­xà—±5Oƒ_±7Äûÿ…_ðU?ˆµ¿ˆ:gíA¢~̺'ƒ~ø¯àŸì§o¤Cûrxsáìáeøâo ü4Ñ>2|JÑ%ðÇiü5ñCáïÅßÚ/ãg«kÞ$ºð¿€õíOÀÿm¼-õí)ìŸñcâ®™ðŸã·ì¢~ÕzŸÂ/…Ú§Æ_ëž ø ðÛ㥇ì÷ðÿÇ0øæ? ê0x[ÅãSø©âíoãž½ðÆ~ðׂ¿f‡üq©xÀ:T><ðç†4ÍOÀú¦µ^íãî]+óh·_gu~TÔotÜšjïFkm÷kUòò~o±ñG‹oÿÚÃÁºGÅß]?ìó«øGÀš'ü#ãÆ‡á>|IÒüG7Áoø%‡í6ßøíiàM?Âoü/â[-Gö|øÛoã=._ýåûaünøÇðûþßÃÙ›Gÿ„Ãö‚ñïü%Þ7°ðWü*o |Vû_Áφ_ðŒh?üQöOþØ?°ç‚toøG|mñ[àΓö‰¾6jþ)»ÿ„³ËÐ>xŸI‡Å^-ø}ô5ïÀÿ‚Ú•†¥¥ê?>_éšÎ‰ñkÃZ¾{à ÝXj¾øûâ;oüvðþ¥i>“%½ö‰ñ«ÅÖvž)øµ¥]G-‡ÄÚÛkž1ƒYÔàŠé|¿â&“û9~Òß¼eû,ülø'àŸŒßð©¼ð_ãýÞñ‡á¿~"|9‹þö»ûA|:ðV§áÝ?űëÛ™“¬êÛZõŽ—Ñm5#ÌÞ‰«7hÝh®“Úýîî÷¿ËÒÿ¯Þ|àø(wÆŸŠ_³¯ÇÛ‡CðÇÂï üý›¿g'â׌g]WEñgŠþ*üMñ»ÿøøAûsÚÙxkö“´ñ·„¼#ðÏD°¸ø÷áo†SÛjŸ³Äûûø~xƒÆêZ{ü@Ó¼3ðóèm{Æ¿¶ž‰ñáWìÙÿ wö^¹ø¹ñ7Á?¾8Âäÿ†Xø¯ÃáÏÀÍwöjðü+?øQßðÙ’ø›Rñ·Š½ñ×Åï—›ã÷íCû>~Õ_´wƒ!ñoÁ?|gø“ûPéžÔ>!ÿ´øÙáσ–:¯Ä;?ø7;ökÑõßøgÚ¦òÓ]ÿ„[á÷í=®ßùÞ'ø™¬øÉ|SáÍþñ×Ãoxëâ/‚¼Oû]¨xÿöUÕ¿e´Æ«aàOöbøÁðNûöŠøµâ}Cá¥åî•ñGàæ§ðOG›Rñ‡Ä_ÜøV_øÛûCàG‡|?áûïø—ºŸŠnü¡hþŸD’-2ËBƒ‰ømðö,ðÅ¿~ο ÿeO‚õ¿„~ øGñþøDþü(ð§ƒmÿáw|Oñ'ü#ZŸ†¿áÓ-®âñµŸÄØcÁž0ñãèšoÙõ_†ÿ|A§ë:¶·àý+þ¥wìÚ[5nÜ©¦ÞºKu×™_dƒ]5¿Ÿ}ºm¯~‡Ï>ý§¿k|rÖÿcMÄ¿³Ï‡~7ü:Öþ4OãÚ Uøñ'Ä¿ ¼eáÏ…? ÿ`¿‰–ºW†¿gOÚSÃ.ð.·¬ÛÿÁ@¼- Oâ Sö™ñý…œß¼A¬Çá©Óã¤|!Ä×¾8þÑ¿þÁ>*|:ñï‚~|\ý©!¾×ñeÏÃõý“äÑ"Õ?iï|G× × ÔÇņZŸÂÏ‹> ¶Õ|'¡^|6ð_Ž?iïø'7‡~!Nn>5x–M;Ô~'é?³—ìçªøÛö·»ø'à•øÏâïø@¾j_< ðßÀ¶ÿ>/k¿|eð÷áGÂ_„S|D½Ã·z‡ü&ßeøWàM þ!øç@øsáÛ› jž4ñ7„|á{Ÿè}·„¾iZÏÄkOÚG^Ñüm |Añ/Á?|:´ø{ãÍCÁºÇü)})uÝ{Çž5Ñü>¾¾ñ^‰ xÛÇšÞ·á-㦡ை>(ðoÄ/øQÅ¥ö«iðëAÖïSqß—K4¿Ä×­“I·ºÕêÃ^÷ùz_õûÏËÍ'þ ûFØøgöIñ׉tß‚zΉûux'ömøáðÏÚ|uáÍWà/ߊߵ÷ü÷àoŒþøëĺ‡Å¿Ú|xñ²|>ý¼ ›Ã¼?á€z‘ã/„ókº¯Âèž?O ø#Û4ÿÚÓöñíñâOÙGÁš/Á;‡Þñ·Å¿øI|_â}7ÇW2Óþü"ø1ÿ±ø±?ö›¥x’-Å6ñ~·ûl|Lø}ö„þ м%¥\xâcÿÂ]wð¯Ä þ;ý ñ#ÀŸ²ìëá?‰~1»ýœþY韵Å„_ ~;AàŸ„_ ­ïþ7øö˜øÓ¡| Ò/~4Å-ž‰oñ+D—ÅßµGÇ7>1ºñûøs^ñ½Ý®›¯jz¤úF±·û1|/ýtχ?>-~Éß~ ü?ø}ñÁ+ñá׈>|ðÏÂí?ünоø–ûX·Ò´ÿ xW[Ñ¿áaèžøS{â?TÓtÝWSÿ„ÁÞ&±û_ƒôx4ÇxY¾OæIÙZí&ºÚñÙ/µ¬ž·A¯éZúyëésê(¯Õh¯ƒš'ü'ŸÚ~0û/ü+/Ÿ ¿g_ÿÅ?♿±>1üsÿ…-ÿ ³Áÿèú$¿Ú_ð”ÃCüÿŠƒHû…´OøL?â¢ÖôøGüQý‰’Mì›ôõ·æÒõc=®ŠÄÒ¼Aa¬ßø—N´ƒ[†ãÂzÜÕ$Õ|5â= ÂêþçÞñLsøkT×4­;Lñ¦ˆºg‰tëYüKàë½wÖ¾#¶ñƒ®µX|]á?èz6ÝñüþLgö’ÿ²~ÿúzÒ+íêø‡þ Gÿ&3ûIÙ?ý=i¥âÒÿ¯ÿÒ¥³ô‘ú âÿù ZدàýBü?\½u/ÿµ§ýŠþÿÔ/ÃõËÔÏã—ø¥ù°ŽËÑ~GŽø·öwýŸü}¯^x§Ç>ø×Äú‚[Gâ?ü2ðWˆõëä²µ†ÊÍ/5}cD¼Ô.RÒÊÞ KešáİCoH£D^oþöPÿ£aýžðË|6ÿæj¾†¢½z\GÄ4)S£C=ÎhÑ£N¨Ò¥šc©Ò¥JœT)Ó§NÔ!NŒcE(Æ1QŠI$rË€œ¥9à°’œå)ÎRÃQ”¥9>iJRpnR”µ”›m½[¹óÏü2/ì¡ÿFÃû<ÿá–ømÿÌÕz'€¾ü(øV5QðÃáÃ߇]6'[ð_†ü5“¦}¬i§UÓtá¨Ûwäyi›¡QYâsìóBxlfsšâðÕ9}¦˜ã+ЩÉ8ÎôªÖ9rNœy¢ùgÉYÅ4éà°tg”°˜ZU#~YÓÃÒ„ãx¸¾YF Jñn.Í^-§£ (¢¼£¨þ^¯e_||ø9ûWZ~β/ü ÿ5ïŸð[üDý¨¼ßÙËÀßð×^øâŸø(¯Á‡ÿ³¯ü&ø™qñËÅ?cøåãï€ú÷ö'í ேÿ4oøPð–Ãã¨xá@ñ/Ô?¶ü£ÄÞ,ø·áTøeàÏšÇÃ=#àŸ…|ð"o„~,ýSUø ûB?Äÿ>8ø»ûEüIøÕûhü<øËûA|ñ·Åm[â/Â_ø“ö«ýtÿ‰?µ—‹üeðÛÆ>&i>5ø™à¯‚røƒëÏŽðTïÙ³özø»ñà¿Äˆu¸¼]ð“áwþ(? x÷öpñˆüsÃ_€:·í1âO xá‡><ê?ü­·Âo x³WÒ¼IñÏáÂ…Zÿ‡àÒíþ#›ü0>9Åøßÿný—¿gMWÁº?Æ+/|;Ô"êÿþxËÀõ?x˾ ø©¬|-øÁñ“áÿÅÏÂq§ü?ñŒ4ÿ‚¿<ñgö¡ð~•¦XøKâÇÀ‡;ø'À¾Ã_ø'wÆ;- ãÕΙgãoüL¸ÿ‚yi¿ÿcˆ¿þ3øZó]øñÅ?¿à¤:†‘%ÅìÝáŸü3øKão€ß ÿhƒþð¾­ð7á%ç…¿fÿ‡>*ñ¿ì÷û*|Hñ÷Ã;k9ýCøýûUx[àGŒ¾|,ƒÀþ6ø»ñŸã§ü'× ¾|:ÖþxkÆ^-оéZ6¯ñ'^Ñõ?~ ü>Õ?á´ñ7†®5 i^7¿ø¨iZ­÷Š(|#øCà}NÃÃóézÄs¬xßáAñÊR«%d—½y_­”µë𧦩èšÙ;;%o-5ù[ç¢>Cø=ÿÒŽóÄß´¯þÌ6?³m¿íCáüLøûShðMÛ?ÛÛxKöAýº¼ sñ>×öcý‡>h?³kÿm|FøÉû?xjˆWÞ ø‡ñãÇÚ¯…¼=oâ¯øáÏìýà?ø«Úþ ~ʾ:øyñŸÂºÇÇOÙþá÷‡¼m⯠þʰÃ/ìåã]+ö м#û|~Ø^:ðÄ¿ h_>&xR_„~ Õ¿f/‰±íl?eý?Æ¿¼?àßÙ»Bøuâ/x:ïá/Âo jŸCx³þ #¢|4ñÃøCâ‡Â¯Š> ñ÷ŠtOÙ«Gøaû7ø‚ÙçHø«âOŠ¿´ÄÚÿÃ~ð|í_¨þÍWúß‹ü-û,ëþ+ðׄµŸxl4¯ è¾>øŸñ“âç†þ ø#áßíUñ_SøÙûmxßâgþ6x'àÇì­à>ÒjßìYá¿„šf£ì½û4~Ô>%Ð~"øÓÄdøƒeûPèwIãoÚOO k¾~ÍÞ#ñÅÝgö…Ô~xsÄ#еÛ_ƒ±ø²ã\ð…¯ÝI'ͯzöÙÞÍ_âÙY»í£ `­¦»+/M7ü>óØSþ'í=ñsãWÄ‹ì?Nýµü-ñ‡Á_é_ÚŸð¶~h¿²OìöOÿćÅö3øûöÞý޾ üYþ×Õ´§ñN§ÿ Óÿšd¿þ2x·þŠ?gO؃ö€ð…¿fï xëöqßûAxKþ¹ªx?öºÿ„à†­ÿ £ðCövø9ûø[ö¢ý’?á`ˆ2~Ð^ÿ…•«|ý¬4/øA¾xÇ¿³ÿÄ/øj/;ÅÞ;²Ò~'ün½ð—èf—ÿøsâ]WÆ~ðGÀ¿Ú‡âŒ~|ñGƯˆ~ð/Ã- Äz¯„¿áñ—í9ðŸÆŸ ¦Ô­}EðÛãÿߌ2ñ‡…þêðœhžðOÂ?ÏñOÂwš‰¾kŸð¹´¯x£Ã^ð×ü?¬êvšŸ´Ï‡Úgƒ>)øA{{_±|0øÙð7Æú}Þ©¢|HÒ®#9ªE4Ö‰EYßD´[>·W½ï¶ÚÉëýtÿ$~x;öñ¤z'‡5?þÃz'Åß„ ?ho‡ÿ¼MðÓãÏïØzûöþý¯f·ýžkß…~+ñWí/ã¿übÔÿdÚk[ðÄßÚ;á§Äo‡_¾*xÛàçÅ[½7ÃuoˆGþ/ØøCâíú»ñÿDøŸáÚ7àGí#à_ƒž6øó¢x àŸí+ðCÄ~kÿ 4OˆÖú¯Ç~ÊÞ<ð׌­×ã—Ä߃_®ü¡Ú~Ξ'Ñ C4Su¦ï¤UÕ®“ºßTᄀʼú~ÿäWâ~^þÌ?³ï޼ûiþÐßçø/ý•àŸÂÚ¸Õ~>þÐ~ ýœµ_Ú«Æþ)ñ—Åë^ðGÁŸŽß~"x›ÆÞ&ýŠ<3àŸ Ý[ø[ágíMàücøSg¥|𿇼Qã/éIðóà7È_a?‰?¾,|yDý˜4O|6ø—ûC|ñGÄψߵG‚?dýö‡ø«á=;þ 7û4|_ñŸ€>üdøeñ+ÄÇÄ?Ø7³¯ÂßÏ¥üý¬¼ á¯>Ñ4ƒŸ ¼©üKðâØ|'ø'ûÿE%RIÝ%{%×ì»®£? ¼Gûjþ ø»ãHõ¯Ø—Dý£ÿa¯ |Qø±ÁسÁúìÉ{ðÿÃS|FøÿýŸÂ_¼ð/ã§ÄO…ß<¢x'âÏÂïÛ—CÖ&‡TðÿÅ];Ç´/‹|SáOëþøÓñ+Æ‹‰á?Ù¯öÇøaðçIøã†>6ý ¼mñ'ö¡ÿ‚Vüø‰ûNxWâoÂÝcáÎÿ ¯¡Á9<ûAjõO>þÐ^&ñ¶¡«~Çþ Ø^x_àÿ?á.мkà ‹e~Ðúünóöb×¾%ü^øp×ýŽøgà[ÿ‚‡í›áÿÚ_öˆø±ª]~Þ:ÏÅgZºý­,¼I¥~Ë>Õ>üWøUâ߇¾Ô ñ†±ñö€ÓuÿèÒŠ~ÚW»Iï½Ý®Ûv»ë}|¬«Ï§áoòüÏȂ߱^»áÿø%ÅŸØSÂÿüû<|\Öÿeï~Í~"ñÙ~èŸ~9üoÔ¿fÝ+àö¯ûRkü½ñ‡‰µüMñ46÷ßð–üSð‡…ÿh ý DûWþèš„Zf™uâ?`«?ˆzíWñáì àŸ€ž6°ÿ‚yx7À°g„µ ~ʾøû?~Õ^øÿñ¬÷ÿµï„~=ñ¯‚~xÚçÆßþ|WÓ>%øâ‡ìÆ»â?ø†ïÅV6ð‡Šm<%ûÉE/k+·¦²æ{ïtß]’Öú]+]…¶òVü¿ÈüQøûüWð?íá¯|rñ–‰ñ²çÄÏñ³ö•ñ7ÿn~ÅšÁψ>%ê?OÁ/ƒð™xOáv§ÿøÕÿ ËÂ3ø/áÏøQÿ´‹<û?ü?ñOÁ¿øI~øÏZðÏÀoÙÏÁ¾8?iOÙWÇ^4ý£uï^þÈ¿ð½¼mâÛ_öøÕð?ö´óg+ÿøe¿ÙË௎¿dKâ÷ÂoøI>+|Lð§íà}º·ÁïÚKâ_ü <ãOø‹þŸÛàÕn|mñân‹ þ×QGµ—75•ùTz¥dïÑ®¿+i`·æŸ}­ßÓÔþe~ÿÁ0þ3Zx./|Aø[ñGÇ>#Ôõ¿ØëBý­/þ-jÿ°M—ÁoÚÏ[ð7íÃû%üVøÝñvËÃß¾èÿ?jM<ð¯ãߊí¾%ÿÁB|q¦~ÐÖžø…©xgNøoñ#âOí ñ•¼õíû%|f¿ý¬> øÓá7ÀoCÓ> üQýü)ðÇ߳߄?`Ÿ|3øaûøâOÂëßÿ>,xïâe¶…ûrøO[‡Ã?´Ÿ‡aø_û'k6_|Sð7Ä_ ¾^xoZÔüañ÷ÃÚ¿îMý´›½£×K;kdô¿eo› +%Ú߆ÇóÍgû-þÖZ¾ÿøøGsû6xÛA´ý†> þÎ_ ƒíÙ/öe¹øÿæÖ¿f ?^6øñ¿õ/„Þ:Öÿf­Oà?Ãψß~-èü7ð÷Äÿ´÷Àh^4ƒD´ñ·ÅoI[¿…_hÙ>üOƒ]Ñ´gâ÷„¼ ie Ô*):’jÖIssi}îß~íþ€’_×’_¢?› {þ ññƒ_øsð«Jñ/ì½ýð#Â^6øýqoû4þÍ¿à–žøÇâWÅzìÕ üøùûR|ý /¾*Á85ïš›ð¯ö‚ð׋~0~ÏÞ Ñ!þØ:¯Ž¾9~Å —öZ“Dø½ªü8øQñkÂ_³Ï<9ð¶ÿÄ¿²Çü—áoà Y|4Ð5߈>ðÞ·áKÙö‘ømm?‚“Qðç‡ì<©A£x‚OxÓÀÚ§‹þ(¾ð.¯à_þÊ_ÿjÿ„š'Çø(_þ(ÿÁ"~(|>ø­­üDý™>/~Ðß~ü¿ý‰¼=ûKxQ—Æ¥ý®çÑ,>'üý±þ/üBñ'ìõðãâÀÙ´O‰^<ø³âŸˆñSãÅÿƒª (U¤·I¤’Zµk;÷{¿‹½•Âßÿ/òÓ±ù{ÿÛýŸ|uð+þ?ü$_ÿá[xgÄð®­ô/|dðoìåaûx|mñNÿ Ö«ñÆÿµçÅŸÙOâ'Ä?„´5éð¬þ)êð…|cÕuÿŠ?ð¸|/â?<_~/{'üþLgö’ÿ²~ÿúzÒ+íêø‡þ Gÿ&3ûIÙ?ý=iS“•zrv»©Om¾$é»'ù Þ/ÿµ§ýŠþÿÔ/ÃõË×Qâÿù ZدàýBü?\½Dþ9Š_›ì½äQEHŠ( Š( Í‹ðL†¡ñ…õߎ_´6‡ðo]ÖÿiŸXüðÕßÀØ~øWâísð«ö€ø]ñ»ÇÞñ>¹ð+^øßq­ëÏûP|kø¥hþ(ø»âOøwÇ,‚ #ÂVÞðï†ü ¤ýñOö[Ò¾$|F¸ø™¢ü_øÙðo[ñG‚|/ðÃâäµÿèð¹¾x#]ñ¿ˆ<àŸx—ÄžñoĆŸð]üSø®šGfÿüø·kÿ S¿›[ð¿ÃmWÀÿPÑUÏ-5Úý]]ôÕ·­ÝÝõßP²þ¿¯#åïÚ›öUð·íwàÛ_…Ÿ¼qãk/ƒŸŸiñSàö…¢|Ôüñ¿B“Uðö¯i øëSø‡ð›ÇŸ|)ý‰w  x·àoþüF𮫩Íâø×Lñއà¿x[ÄümÿÜøIñ]’ÏÆ_~6k%ñ·í ñÿeoí?†ÁÆñ—íSðçãÇßZÇü&:W«ÚtÂwí5ñ¿ÅŸÙãö‡W…üSãmž ±ðï…<7á h¡´P§$¬’¿mÞúÛKî–‰ØV_×—õ±ðo‰?agñe‡Ž›\ýª?hmKÅß~|=ø+ñgÇzǃc/_üOøUðãÄ´¿ˆtßøÃÀ>,ý’5ï‚&¼ŸµŠ|=âØ´¿…:TÚï‡<à &‚á¾!^ü@Ûð×ì ðÀÿ > üð+xÛ ñ—¾üEð²iþ"¶Õu_ƒÞ2ý˜~~Íÿ ÿgícáÖ¡â­'Ä?ÚŸð¬ᔾøâÇOø·Å-+Å~2Òµˆ¾"XøËÁ:õ÷ƒíz(ç—~ÏD–Ö¶Ë¥•»tùå¢Á=¬ü9®øƒâFûWþÔ6´Š|mãkß´wØÿe[ˆ×ú¾þο ü[ðÓþë¿ÙvÙö×Á:¶“û'|Õ¾ßgðNßâ5†»à3Lñýž“âŸèþ#íµ?؇ÂÒÿkÿÂ-ñ—ãgÃï±ülñíðoþwø9©Ã8ücøÿ ‡þ‡Œ>Â{ðsÆ¿ð”ÿÂõÿ†øÍÿ ¿‡ÿh?ø^ð¯ü'wð¥tO„ÿðŽø3þ¿µè£ž]ÿ·m¶Ý[k6¶m2Ëúþ¼—Ü|½ðöKøsûxgD‡F—‰ýž¿d¿øUß³W~êº×ü+¯ˆ76øqñ«âÖ±û=j_ðˆøzˆÞñ÷‚~"ê_ ¼ ¨\øoOÖåý—¼;¢x'Ãÿ²‡Ãø—NmwIý‰<#àŸSê¶öš•õ§ÚôQÍ'{½ÚmùÆöüÂ߆Ÿ×ÜQEHQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@|Cÿ#ÿ“ý¤¿ìŸ¿þž´Šûz¾!ÿ‚‘ÿÉŒþÒ_öOßÿOZEiGø´¿ëä?ô¤)lýä~ƒx¿þBÖŸö+øÿP¿×/]G‹ÿä-iÿb¿ÿõ ðýrõ3øåþ)~l#²ô_QE# (¢€ (¢€>Cñ/í“à xÄ ßþ(ë_<­ê¾ø¯ûXh¶¿äýž~x³Ã·óèþ0Ò<]¨j?ôߊš®‰ðã^[|`ø¥ðóáOŽ~ |Öãñ•‡ÆO‰^‚ÿÂQðWí+û9|Iøâ߃ß¾?|ñ÷ÅÏÿoÂuð³Á_| âŸˆÞ ÿ„[]´ð¿‰ÿá-ðF…¯_ø›ÃŸðŽxšþÇú÷öÆ™gý®ÞZi‡Ùõ ˆmßä/þÊ_u‡ÿ¿dËðºoÙ?ö•Öÿh­[Ç¿õ¯ø²Çö‡øoáÏÚ×Ç~#ü}ð„~Øü6Ôþ|BÖï|Gñ#â ‡Áÿ‹úÏÅ_‡– ôOx7þOÿï¾ ërþÑ~ ý’þ#xsþ«íÚׂeÿ…7ÿ ý¸?kOý“R×_íÿioøxGü º.ƒçxnµxÛIÿ†±øuÿ n›¨eèVؾ5þÇñ&½ý¡ÂG£P¶úëk=Õ›MïfÚåkK]?6µíÿm´×«ùX>2ÁJÿg/ƒú¯Ç/ j¾0ðMÄÙÇãgìÓðÏâׂ¼uñ;À¾Õt?‡?´Œ¿e=Rý£¡´¹Õu½n‚ ôOÚ³Ã÷zïŒ|K øcB½ñ—ƒø§Ç? µ¿‡þ9ÿ‚wüIñõ–«àQ«ßÉ~ß tÔž;øÎãÀm*nÚÙÚíÝ;û±ÒÎÉ>g+]ÛK=,ѯ“òÛ¯}v^_ä~¡xã‡Áo|*Ÿã·…¾/ü.ñ/Á ]ľ%ºøÉáÿøOYøUmáÏÍªÛøÇÄüCÓµkŸâxNãB× ñ.«&®¶Ú6«©=«é×k/†?i_ÙËÆÞ ×~"ø3ã÷Á?|>ð¿‚fø—â_xcâ¯uÿøwá;«ã­ ë¾'Òµë½IðLßÂ<Þ*Ô/­ô(µ_‡^:ÓÞýnü#âtÿž?~ËŸ<1âí [øo¤xWOð×ÅO‡Ÿ¾ßüUñÃm+Äú·ÃÏ…©ãcHðÏÏ:ßì«ñÆ~)ý•|ñ¿Ç6ø•ãox'â̶ŸÄÝ+Dð¶ð·âoìåàOŒ~øÇàÙ§âv·à?„ßüñgÆÚg¼Oà߀>¶ñ—Â/‡øÕûx»þ W¬† 7þÝÿ²ìÿ7‹ô¿|qø]‹¾ktÿŠl>&|6_ˆ ¼9ñ«â¯Â„ÚÄωžÖ¼a¢ê~ø]áÝOãGxâìkÿ *ïᆵà|2ø?âÚ'à†ƒªüo×~)øCázxÇáÆ¶¿´ û|Rñ_í+ªüañ–à›ÍâÏÆÏÙ¯öø…?¶Gíkàß„¾øöyЛáï†?e?Ø|+øûP}ŸÅ³~‹â/þÑ5?†øÃBÕü_ðÆz'Á á÷ćËNß½›Ý>‘¶š.²vR{rߘ5ü¿àÿM.ïCï/þ×_²Å[ÿ i ÿiïÙçâF§ãýoÆð&à_ ¼aã_ü=ðæãxÂVžñ.£qâMoÀþñâŸiZ4w·þðæ¹£ëšÔZf§eu?ÐÕøÙð÷þ ãñ§Â ¾ø;Qñ?Âéµ?þÏ?ðCß„º¼öZ׋$°¹ñüKö°ñgÇoŽ×ºl³ø&ÚâmÅž×m4ï„·7V¶wúïˆã¹´ñŽ›à=1"Õæû_K¶ñÇí5û#üUÐþ2|%Ñ.n>4hŸ´×ƒ4„Þ+Ô¾ |°ñ¿Àßx¿âw„þéÿõ(,¼SñgàηñKàÏÃÍS⃷…¡ø™ðËÄ~(ñ$w ü+âí _‡º<Ê1OÝ•Õìö¾ª÷éæ½Uﮂ¿]Í¿ønسþÏü.økïÙ{þü&ßð­?áiÿÂÿøQÿ çþ7öü%ð€Âoÿ oü#?ð›Â3ÿü"¿ÚÛ¿Ø_ñ7ûöúEywÄ_ø)'ìŸð£Ä|ã'†<]û7üQøðï⇅µ¿|6Ñ|G¤xsãÅÿìÑ¥è[CÖ¼u§jv³Ï„5?Ú›ÀšwÄ/Š>!µÐ¬4 ÿøòÒÊÇX¸Ò4hüCò½û þÖÞ$ÿ…Uñ#Ç>6ÿ…¥ão†ßð¿¼àÿƒðÝß´÷ìùÿ »àçÆ?øf©ü?áøoOÙ×à—ƒh/ÚCþ[öj»Õ¾Ïñ×à˜ñOŽÿávùŸ¾)øãÆßô?ˆ¿»o~Àßþü9ñÇÁ/‡MðNóáõ׿b/Ú7ÀºÇü$_üýñoöпaß xcöxÿ„]Ò~9ëzÁ?ˆú'ìScuÿ ÷XøçñKâÃOøYغ‡Á¿Œ×~›Æ>µky7Ý]Y{É=mÒ7{YßÝnÚšÿ^ºkÝôóºúóRý½c¿ Ãs¨øûö˜ýž~xrë[²Ò¼ âÏ~Ðßto|U°¾øUð—ã x—áíä/®/4Hü#ñ«À—Mˆm<7â9ì5Æ6^ºømã†Þ7ñ¯¨ø×ö•ýœ¾|Fð—Á¾ øâç¿°áøYã_оð·ÄoÿÂS®Ýø_Ãð‰x#]׬2Oªx/Áž1ñgŒ/ü=â?Šÿ¿à“ÿ£Ò¬5sá·€­üA¢h~.ý†¾2ñÆŸáëýGÚçÃ=a|5e©ëþ)ðïÿ<ü1û:~Ò³G‡?gÿØ{Eð‰ñ‚ãâÅø%?Ç?ŠŸ<5aûGé~øc7ìgaû|2ø·¢øÆRþËú§ìÕâ} ~ÂÏÄÝ*ëâ‡í=ð ⮳aã¨< |Ö¼]ËŒ)Bg­“z®»ëk{©]÷é`»ù_»ómú¼~øáð[⟈þ!x;á‡Åÿ…ßü]ð“[_ |Vð·€üá?øá—ˆÚÿ[Ò×Ãÿ´?jÚŽ§à½mµ? xN]+Ä–ºmù¿ðþ·h 7Uüp_> jVn©§|_ø]¦k:'Â_é—ü'uaªøsãïˆî|ð'ÄmÜ´–÷Ú'ƯYÝø[á.«k$¶üGks¡ø:}gS‚[Uù{öýŸþ4þÏ~ñ/ƒ¼s¨hž ø7£èŸ<û>~ÌþøÍâÏÚsß|9à» ~?]øöŠø«ðcà¿Æÿhž9}k@Ó´¯…-~"X|°øŸÃˆvÞñVð«ágËß ¿à—ž#ð=‡ÀM.ë⦷¨éŸ~(ü:ð×ôé|qwa¨þÉÿ±ÿˆþxÇöðÿ‡í$øiowñGÁÞ.ý“>ø§â&•«ÇcðÛÃÞ#ý«?঺çÁè<3©üsð]׆×,/%Íd­n·Òïm.­mWÑ6µeÞš_Ö½ôÚúC~Ïß·î•ûAþÐ ð_Bøký¢]x'Æþ:Ñüqÿ +Á¾3ûv•á_‚ðMßZ|>WïøK>jŸÛVŸðP¨t/íßüWñ׃[þ7ü$>ñ?Œ4Oˆv3xcÔf¿ÛGà·í!­üCø}¡ø÷áu‡Æÿ†hïøÇàN•ñ[Â~,ø«áß|ý¡ükð"×â‰|húw‹¼7¢xâßÃÞñ¤ ªxv+ ˆÑ£ÖõÔŸNÖõŠ?`ø'ÆŸÙSâOÃ/üCñ?ÂígLð_ìóð—TƒÁš×‹5ûÝ~ÉÿðH/1ÞØE®x'öòè‹âïø'ÿÆMEîn.­oLJør÷Æ?~/ü.øÕá7[¹ð֣⟄¾?ðŸÄXxŽÎÃMÕ.ü?{®x;VÖtË]n×LÖtFçJžê;ø,5]6îXÞúÖI~yø‘ÿý‹>kºN…âÚGàŸü–É>|EÖ,þ0ü(þÂøñþÏÆÏˆ¶:gÇýCPñ¾ÿ ³ûgþ޼ £Yë°ÿnê?¿³<1ÿ!‹íö5ýš¼_ðgľ"|Aðž‰á|HÑ>x,ØÁû_þ×·ˆî|9ð¶ÿâf¹£Ýê¿¿kð¾§¥h‡Søµâ(|?ð¯Á ü?aákø¼KâígâĈz†þü½ðÃö,ý¬>hŸ õ/\|.Ò<9û,üQðW‹eߨ»Ä´wÄŸ‹¿ ¼áÍ+öyý¤?goèð~Ú0ý˜tÚ+EÑ«âæÑ5+‡ðÌ ªYxjÀCñ7Ãþ#[NÑüA·ãÛCö^øM®ø£Ãÿþ<üøwáß\xOŒ?~ ø'þ WOøsð³âf±7‡l/¾"É­ÙaèŸ<¯¡xËJ𗌭´4Ï KðûÆ?¼gã?—¼+û-~ѾøÇðDþÏø'{û>üýµÿk?Ûþwü-[|cñ7ü5…¿m;¿øWð¢¿áHÜx'Fÿ„Æßµÿü#ÿð—ÃEjßð“x[áçü&ðŒxVñoü Þí~~ɼ#û||Qý©µ-kÁ3ü>ñ·ü/Ÿì­ÇR×eñ•¿ü-ƒðJ‡^þÐÓçðݶ‰Øõ¿ØcâÕÖ±öoÝýŸJñé쿴.õoØøEZßEôzÊ\ÎÝ-Õ´iµ×]C]tê¾í/ëmOÐÚ+çŸÙá/ˆþ~Éÿ³ÀŸÞèš—‹¾ þÏ?~ø§QðÕÍýç‡/üGðãá·†¼®^ø~ïTÓtmNëDºÔôk©ô«GHү簒 nôÛ†’Ö/¡ª¤î“z÷óQE€(¢Š(¢Š(¢Š(¢Š+âø)ü˜Ïí%ÿdýÿôõ¤WÛÕñüþLgö’ÿ²~ÿúzÒ+J?Å¥ÿ_!ÿ¥!Kgèÿ#ôÅÿò´ÿ±_Àÿú…ø~¹zê<_ÿ!kOûüÿ¨_‡ë—©ŸÇ/ñKóa—¢ü‚Š(©QEQEù{ãýCâßì%m㿌:ßÄ_~ÒÚÅÿÂ!áýâ=÷Äÿüý™ô­GãÇí§ûLê¿>6üSðÖûFê> ø;áÅþÎÚ·Å…ø=/ƒ|-mð/à§ü,-KáïÂ=R}càž'ÂÛ7ãN¤ÿ¶ÇÄŸEû<ø“à‡Ã oám¿ÁxS㟋(ü,ðÖ•«ü%øÁñûà¯ˆî¾ |UñÆðSᯇï|Qû8øËÁ9¾Ñ ~¾ø-ãïÚ];Dðÿì꿳Îãjß¼kñJø,¿¾xOÂ^6ðÆï‡ß~øŽŠ? ¼ ð³áÅÏÁ?Ú+á_„GÇïøOáÇÃM á'Ä7Gð‡‚ôÍ;TâÕåÜ®—œtVi^É­^·矅¿ðRÿüeáß„?¿e§Æ{_øhøZšÆÿŒ_´ìóàß ÂÒ¿cÚÂ7Ä?Øf/Žþ(ÿ„¿ÂŸ¶ÇÃKÁÿ #örø!ýŸªøwÆK¡Âgàçð_޼cÄüCý¼>#~Ò_ >üBý›¼ ÿwÀ†ý¨à•šÄ/‰^0øÇ®ü:øñ¦ÿÃHü[ý…¾;·‚¼7ðƒÀ¼yàïx'ÄŸ?i‡ß~$Ýë´?‚¾×s¯ü\ðÑð—Š<)áíÿâgÞ^ý–ÿe¿Ù^ÿŬW[ðÖ§ hŸ¼K㯌Ÿ¿hŒ?ïôÿxÓß­þ(øƒÇþ<üMñÀÑ-ü#û*|‚]WÄš»Xx'ß !‹CŸ@Ó5®­åÚ/ìmû ÿÂÆðßÁß øwÆÚ‰¿fßþÉâøYá_´Ï„>ÿa|9×u/ þÊ~?ø—à â6‘ð㯼9¨~Êþ°ñWÅ=3â7Äoì/‚ÞÒ>ú‡Lÿ‚xþɺOŠtÛxÆ×~ÿ„vø{Wø÷ûBkÿ~i^øÇð{ãç†<1ð{á6»ñOQø]ðsÁ:ÅÙûàÆ±¦xáwƒü#àÛM áׇ|„¿­æð´ÿ<ßè¿ðK/„~8ñ¿‚|iâíÀšŸÂ]oúÕý·Æ?ŒtŸ…_³ì?> ~Å´‡¼#ð‡]ø­ã$ø7û:ü.Ñü}ñ¿öÕ£ø?ðOSð¯L>|9¹ðoŠ4Ï„­á‰ÓvJvwjÍ»hžÒ¿Eø¥kÝõižþvùhÌOˆßðS|=×WàËþÌ¿ð‘þÓº¾#øcÇþ ðF»ûJü`ø9£i_ ¾þÌ_5wÂÿÿgoاãoÇ}íþý²~Û[ÍâïÙ7á·ƒl¼SÅ?ê¾:²—ß nþ4xŸ‡¿kÿÚ{Åß´Ž>"ÛÉûPü7ø'aûPþÄ_ ´ü`ðì“áÏÙÿᇅ¿iÏ‚°î»â/„_ü1¦iÚ§üNý¨eñoí-âÂà‹ísàçƒ~7øá&ŸñOÄÖü/ñ†mëÏè¿ðO‰ÿtÇâín?ŒŸ´F·àŒ¾ñïÀŒ´Wïü@‡ãWÀXø;Qð¿ÇßÙÿÆ^H~|Pø!ÿéÕ5OÁZÄ…^,¿ýŸ<ãOør÷Çן õ½w¶øuû+~ÅZÅ߉:ÿÃ_ kv^#ø;ñGáw‡þ!ü-Ñ>#|uðïìóῊ¿ þüÕ¾ ο³xÇMý—õ]oáÇÁUýµ¯‡¾%Ð~êpø[ð¯€õUÒ~$ü=·ºðð8¯áÉ7n®µkUw¢Ý)jõë{Ÿ}šëm,·²ùÛò—ðÃŶŸüñá÷íá/üIñG~=|=×|Gsâ¿‹šV±àDÑ´ËŸ‰?¤÷Ÿ°·ìUð÷[Ð~!xƒEÖô+} [øoáO‡v7ý¤>:Íð«á½üß´?À‰Ÿ þ|øeâï‹w ¾h—ßþ~Ïšo¾ü*ðŸ„ü9©Íá?|&Ѽ7sá˜|zx{öýŠ®¯ü-¡ø'EÖí-ÿfýoà‡åøwàÚC㮋à}dz—‡>x»à$ÿ>øGâݾ%üQðG¼7ð'TÒ|KñßÂÞ1ø¬ü?ðïÂõ½WXðމà˜mE*I|2ø¯{vz/‹¢ví{6žÁgÕÿZyy?¿§OüÿzñO¼ Äí#ö(øÙ«x'ÆßðÏzßÁ+» ã‚á6ð·íûFüøáŸø«Ç?´gìñû>þϺOÆÍ[Iý ¼;ãŸx?à÷Ç_Ú àç¿á ø—i©þÑ^ ðN“á?‰Þ6ý øóñSÆ_ > ü:ñŸˆ4ßøG¼m¯|lý‹þx·Eøuâý+ZÒ´}Wã‡íCð;àÿŒ4}Æ^>øOqÿ O‚lÿá>ÕtýCPŸáŸ|eâï¥òxjûàßµ]ÅÞ ÄÑ?aÙo@™d²ø}­Ý[Øku¯i÷ÅoŒ>)ðçˆ~|UðÆ¿øGàG…üMãí_ß³ÿÂí+âO¯…šåçÁÿ‚Z_€>x†Ãá‡Ã x—Áº¿„|áM Hõ~ο<}âsƾ-ðö·‰¼Gÿ ëý³©ÿÂAâ›¶Ã'|cñÇÿ€èzf·g§ÛÿÂñsÅ:÷‹Ñ- ÿ„§íÿØ>5ÿ„Ã6¶z5¼·Në–-$îï«kÝÓâ·ókmì¶Ù«õí¯©ù¯¡ÁG¾*ø—á·ì½âŸˆÿôO„µæ‰û&ühø"ß>>Cñ^ý¾|Mý¬?b?ƒ4/‹×¿e¿iž Öí´ÏÛ3á¼rx{ÀÚÄY¼iáÈþ*ézÅ‚^.ѼñQûËöPøñö|ð£á‰Ÿ´'¿hýn÷þO‘ã/G®ÇªØÿ¿ýš¾|ñ/’£6¡áˆ!·ñWÐÞ*øuàßk¿ ø£ã¯ÿgë°jzT_Û¿Ú°ØÇ­éš>¥§’”mh§ÛoKé¼,Ûo×^¯u •úïÿ Öߦ§çŸíŸñóâìáñãOø™¥|Añ¶­ðá·üËöúý©¼aû7XÛü$ÑüñKÆ_²uÏÀ!á+]Câ±ðÅÿ<'ÿ ŸñïÄ ¬Oá¯Á¥Cªø+áÕü}>×ÇÚ'Ä?¨~üpøã/ˆß~ üløgàŸ†¿>ø'áOÅ;»O…ŸµßŒÿu_‡?õß‹ÞðUÅ¿|[ð‡à?‰­¼mmâo€ÿ#ñG…äøo&…¥hRx#VÒ|oâCÄ:öƒàÓã?ìmû?þÐ~2—Ç_¼;ãoëwþ(þηv6?þ7øGÁ·ß>5éW:?ÅOê¼ñÿµøM­%ÓfÖ«¬§‚íí4$Ü\Rå÷’ÕÚÚó&¶vz6›j÷²ÿ×Eÿï??gÚ?þ ñ/þ›ã;¿üñ·ÄŒßðO/ŽŸ<[á­{ö£ø‡ðßáÏÄí*Oøv®« üwñ¬ ýµýÂÿ[ø‹ã[ O„ºÃ?x7À:Ž iÚÜ~.ýœµ¿ü½Ò5üaÖü9ðf^ý˜þ5ø‡áÃ? øïÄz¼ð¹¼ á¯ÙÃ\ðg€>év? ¾ØZ?…¾i>¸¼ñö…sÄꟲ·ìUû;X|*ñ}ÿ…µ¿øGáþ·û2ü ðW…m>#|uÕ>k8³ñÃÙçö]Õ¾!üÓ|cªü6øµñGÂþ#¼)࿎üã/ˆ›À¿ üMwãýßáƒõïÛ•6ìàïou$Ö²“’Ó›Uf’·åa%.ë¥÷}¯÷êb~Ñß¶—ÄoŸ¾9išÁøãáì·û/x ö´øÿã}_ãn»à¿ˆÖ¿|W®þÒ6ú΋ð{áeŸÀïøgâ7´/ þÌÞ-ÕôÍ7Æ¿~h^ ×uïøvïÄžÓÛSñE‡—ø»þ Mã ü?Ö|oì¹­Ü>¹û^|dý¾iðx«âæø«ã€¾8ý§´ÿˆ5_ ~Îþ?üdðwÂáàÙ¯T¼ðýÖ‡ð{â'Ä þ*Þø—Â~)øyàÿ‚Ó?i¿ý ñöøañƒöñ—ÇŠ:ϼK¢x¯àŸÁƒ|Ò>"|[ðÃsJøYã¯Ú ÆZì_|#à_‰~ø}ûCx'â §Ç(¼/©ü.øÏàø6ËBÐ8ý¦>"ü%ø£à¯€¿²Wì§þÒ?þk_~9|øà¿‹?à Þø‘­øGör×þü/Ó?jíã™û1ø:óàøý²À«ÿ†ž‡Á¿|#ðûáçÄOøçÂÖ>£áoø)GÆÿ\øÁ¯ûxÚßâÄžø=á }Vÿö€ø;ð“Pÿ„»à?í1ñ‚ÇÄIñö»ýeψ:¿ü+«¿Ù²üüzÒ<ðCÅßð„ü0ñç„|eðÏSøÝñFá¾Ëô5§‡ÿ`ƒÿÿhßÛOð»Wð7ƒg[ÃÿµM¬ž%Ô¾9Myð7áGŽ?jGƳücðuÆ«ñ^ñÖ·ª|TÖ¿lþ*ø—ÄÚˆ~&|fø«Åí/â6«ã¯è½¦›ê>ý¿gÿë¾ñn™áßxÆÞ ñµ¿ü;ñâŸÆ¿ÿ¾#Yë¶~)ü(Ò,.>"|aøã¯j¾ ð÷‚~8|a´ð¿ÃM_^¿øsámwâoükáß éž6ñ§âŠr§­á-­ Ý-ÏÞîîíºwݶË=5õõÓ˲ÖßøÛþ Ë­ø^ÿö•Ö4oÙ7â‹~üÑ?lHtÏZx{ö†Ò,5_~Æ^ø»{ãh¾!øïVý–aý–¼ ð»Æ^3øãO‡¾ ñÇÃïÚãÄâ?ü+Ó¼EðWB׵߈ÞøKíz§í³ñ§Âÿ-?g~Ï ­kk àøsá_~Ѿ,×gWßüûWüCÒu_|tÔÿf |Iðv·¦øsö!ý âÔ|?¡~Í?°:ÝÏÁ«oÍcãÏjß }³Å°ì·ã‹ÿˆ÷^,ø}­ëzgÅ=↋â]üVøÂ>iÓ|kðç‰<'ñwÅß>Aãè¾ü!ø£ñ+Añ¿Ä+O|`øMàïüUñ ß~*j:—Œ§Ôþ(ü@¼ñ'mñ/öVøñoÄzïø}ü}àÿˆß>|@ðý‡Â[ÿ‹·¾ŸÀ>;ømã x»áž·aoñïã?‡uü;Ö|/â?øâ_‹~xÇU×ü «Oáâ¯KKEí­ÛßK}¥u½ö¾–°kßúÓþ µëÔù_ø(_¬ÿi[oÙæ_ÙkÆÞ#ÿ„?Æß>üwñoà ö•ø›¥xâßÅßü.ñõåÇ‚|a þÈñþϾ!ø'ð×IøÏà}cÇ¿~5~П³gÄý7ÁºGÄ?Ãðoì߆ú?Åký?k]Wö§ÿ…‰>±à¿ü+»ðü"7Ðü"Ô¾#xÊãöªøy¥xÓþ{Í Oý­?g?|øS­þÍ~6Õ4MOÕ|7£Øø—âïƒ|{gq­xƒá×Ä_|>°ðÇŽüoÛCû~ÏñøËÃ:—þ6Ôu¿ ÿ vÖ:߯¿úÿƒ|m⟆:V…£ü=øñáÖ·ñPø}ñßãgƒ­<%ày´Ž¿¼1ãïŒz~«ðëá–»ŽW[øià=CøŸ ü?û8~ΟSàß‚§ø£âŒŸ4Kkú¿‹üKûIþÔž8Òüá¸|g? ø±ñÛâF«ñwSø9ðºãS±øª¿<5ñKâþø«âüb·ø=¥k>Ô~#Åt›¦ÓQŒ¹¬µÖ×_Ýéo-?Öúµoøk~¿Ýù¯âoÛ‹ãÇŠ~3þÅ?_¿ð¬gßÚ+àžƒâσú€~=ÜøÆ^>ðoí û|Á%~xGÄ¿¾øËöu þxÛÂ_ ÿhý;YðçƒI-”¾£¦Á<dÝ'Å:G‹m¼ ãk‹¿ ÿÂ;|=«ü{ý¡5ÿ‡? ´¯ücø=ñóÃø=ð›]ø§¨ü.ø9àâìýðcXÓ< ð»Áþðm¦…ðëþ‹B_‡ÖóxZ{椬ù%£ÓO>n²wµÖýöI« þ]?Kþ¿óΛÿ,ñðŸÂÏøƒà‰§iŸµÂï|ZýŒ`Ѿ2_ëwþ/ðçÅO?²çÀŸÙ~ÓÑ^ü ðõ¿ìó­·‹¿m?ÙóQñu·Â«¯Ú¾ÃÃþ‹ã%Þ©x·Sð‚t‹^~Ìß>#|`¹øûá‹_ üð»âìýñ²Çà÷ˆ4¯‡_µßŒ~ ×?µ¾üøõ¥x‹Gñw‰~üÖÓ~‰ñ¿Mе "÷À°}‹UÐo¦¶ÔõK¸>'Pý‚gûüEÐ| á?ì­oÅ ¾ð—ÃË¿xÛãÄßüû6«£ø·ÁvŸ|wñ“Ã׳w‚|ñÁß ¼k£x+öNñoìíý‘ªü"øEwàÍ{ÁzßÂO…z÷‚<»ö}ÿ‚zÍðwWøsâ?ühÖþ!ëÞý¡¾ ~Õ¾.»>*êóx«ãOˆ?fK_ØÛÁ1i^*ø÷ñÛö‹ø³¥ü.ð¯À ¯x;Çþ)x³Ä_oü5âO|Iøað¯Â|Õ¥û&¯­®›ó_i®;ßW}®{þð_NÖ=GöŠý°ÿážüSãj?ÿ·¼M¨üðÿŽf3þïì¿øhÏŒzׯ=àÏÀ¯¶AákOøCý›ñsã7ìá/øYÞ>»O ^ÃKoGi†~ üOÖt¿ž~0ÿÁKÂKÿ wü'Sjÿ¼aãxËà=¾«ñOJ×tOŠ^'ðßìÝâ¯ë³ïƒ|mñ?Iñw¬>$øëÁÿ ô/xúÛâÅÄñn»¬ÂÛø”|R“¦’æ‹nÚᆰ۫l›zêÚ¶Ö5üWÝ¥ÿTvÚÆí¿Ú7â¯ÀøG~Íÿ ËàŸÀŒ?ð–ÿkùßÛð¼üuûJø+þßììÈ¿³áÿ†xþÓþ×þÙ¿þÛÿ„ÃìÙšGü#ÿkÖþB²ý¹>&^~ÌšoíA/ÁŸ…Úw‡>4hŸ |[ûx~0|rñÏÅ_^ø©¤\ü@MÇŸ > þÆŸ|}ொ>ø7ÿ5¿ü ð¿í_ac‡~!]jþ0Ñ~xXø©'Ô_¿e¿„_¼Gãø~(ê^.ø¢x#Ã^.ñOůÚã÷íâ;ÿ|8¿ñΩàŸÙkŸþ&üKÔô @Ôþ%øïQ¶Ò¼=u¥XOâ}Jîö ›†ŠH¸˜?aoÙÂÏÚ¯„tý⎕áË­oÃþ ð¶—£~Ò´žÁ[ÿ Øx—CÐàý˜$Òþ-Ú\~Éš%§„|câ‡rxköd›á/‡/¾k7 õ *ëá±ÂѤéÝÝ6½Ûig¢÷¾Ö—{o¦Öèkùßð·OSâþ §ãxOâOÅ ~Ìú!øWû8~Ï7´íCwã‹ÿ>üUðŇƒ>4þØ?¾-xWà·Âþ̰ju¿j±WÄígÀÖ?õÿÙSÄ~'‡ÄÑ~#x[à¶½qâË ~É×È~ý„e¿ü?ø³ðÃHø}­ÜøGã¯Âïüø¼ž%ø­ñ‡Æ¾#ñÿÃÿxããçÄŸiÞ ñ׌¼}¯xæã[×¼sûP|vñ&«ãX¼GŽ/oü{8ŸÄoo¡xZ ëÊ&à߸šW{ïk+_W­ï·K _®á_ÿÁHÿäÆi/û'ïÿ§­"¾Þ¯ˆà¤òc?´—ý“÷ÿÓÖ‘Nñi×ÈéHRÙú?Èýñü…­?ìWð?þ¡~®^ºÿÈZÓþÅÿêáúåêgñËüRüØGeè¿ ¢Š*FQEQE~x×Ã^/ñe×4¿øö¼ñ/íKkûy|ñ.¯§]é_µÆ³û2[~Ë~ ÿ‚»|ñÁï|<´µ‚çö‡[ðŸì“¡|*ñO5_…±¯Æ HѾ*kŸgµñžñúê—¢ð×Ç_~Ã_¼ûKxöòñgíaâÏø&¼Þý¼-•ûjë¿üK¤k¿ðJŸé~?ðÿÆ­áä_³Ž³ûCk?µ¥×íC§M¥~Õ–·?´Þ£ã‹ŸÚiMc7ÀÛúj¢µUmÓ­÷ÛmšGK[¶—ê+måß^Ú¿=4gåïį‡_>#~ÅŸðPßÙÃÄZ?¼qûNüBø'ûCiZf¿y¨\Ù|øÁªüføQã_ü€ˆ¯¬¾|ðLvš‘à]gà.§®ZøËàÇŠtmOÄÿ|]ñ¢_‰GíûL|…㟃Z–£7íûAþÍ:wíåa¯|*ÿ‚kü-Ö¿d-[Æ5ý¿¼3ñÆŸ´7ÃÏŠ¿ðR¿Aá|9øåâ=/Ç?´Æ·áÿÞ|7¹ÑþþÒ>ø¥¢7üká- Hðlÿ þ&éšg‰褪5}7wµì¾ÍÕ»>[%Ñ6µOGoë~Ý~GâÀö¶ÿ†ð×µ¿ˆÿ~6Élý¥á5øcÿ öžÿ…9ÿ Ãý£ñVÓöeÿ‹ëãïÚWþ÷ÿ"—ü3gˆ?ãÿg_økoøJâøÁÿ7ãšý(øÅáKxãÆï„>CûEX|.ø±â øÇXø_â?ßëž8¹øá K8øCû[x£ágŽ¿füPøŸã²ø£Sø®ø‹[ñç‡åñ7µÿºñ‚ußÛ Ä¿ tÛ_LÖþ0xÛö=ø‹á[ßíÛn÷þ/ø'¶™ðçþ Ûð—ö˜Ö>Íâ ë»M'ö׃á÷ÂïÚ'ÃÿÙúŒgü^_ì/í_XÉ­ê~ÔµÞJ*½¯D¬®Ý¯£¼”ôÚé/M5ÜI[Ï×Òß׫î~|'øAñãWíá x‡Vý¼´oØ–ÃDý®|)ñ·Å/„?·åæ‰ã/‹^ý’|=¯j¿²gŽü1a4>¼½ñÌúÿÂo |vðõÏן±ï¿xgö¡ðÄÏÚRý¨|aâ~ËÞøuð;â=ç„?i_†^ ñ5·Ã/Ÿ·÷Šõ öø_¡üXøÇ¤ø[þoÙ÷ãÀ4øC¨ÁG|ðŽ¥­Üø—Qð·Â_xOáLJ/üGya¦éw~ ½Ðü¤èÚeÖ·u¦hÚFsªÏk%üöV›i,íock^£U*·N);4•Û\ÎÉ+¶•îÚ÷µ³•®®$»ÿÀ[l¾Zyëä~6kÿ¾&xWã—íwûDø Ný¡´Ÿ‰:ü£öÑ|#káÿür_…^4ýž|UðÏþ ±ð{öƒñtÿm¼Fß~#èšWýKãîƒâ_ŒßÃ_kæð^«¯XøËÃ^#ø;¡jþ ø£áOÃÏÛg]ðÿ„ÇÅÏþÐßürßàŸþ%ý¨¾꿳_íYá¯øOãׄÿࢱwŽ|iâ |Gý ÿhïŠ_ ü_¢|<Ð|?ûEjsê¿ðMƒ_ÿc¹¾éÞ ñ÷Žçð_´/Ùw@¹þš¨¡Uil¹uzé’Z¦í¥ìš´µé©oéiÛW÷†ßðIÿø¿Æžý”|cá?~מ,ð‹?`ÝÄ¿µÿŠiíWö¸×|9â_Ú“]°ý›5O„ž ø7®~׳ÝišÎ‰¬é—_µ†£¬ê¿²%ÕÏÁíFÂçÂ7'šÞo€’6'ÅoÁFeпhÝ Áž-ñ´Øþ6ý§ÿfëú÷ÇD×uOøxGÄo‰~~ÐÞ Ô4«CößþÃÿðµ¿`é?´hbÿ†iøsðÛþ }á xÆ¿ð‡|¾Ôr|5á¯x/Þðwƒ¼?¢xOÂ>Ñ4¯ x[ÂÞÒ¬4/xkÚ„^‡áÿèz\ºf¢hÚe­®¥iZu­µ†am¥¤ÛÃk·IÔ÷›QVoNm^íêýŽÚ+.€•»ôü-þ_Ÿsù•ø©ðWãˆtø(§Š~'øö¼ñ/ÄŸŒ_²üà¯ì¹k EûRx‹Ãž8¿ð_í7ÿ‡ÔtüFðwÃÙ¯¾Þh‘üøÕû9Çû(ÅûHhkáÏXx«Ã:_ì›6­â=;Q´Ó¿dþxÅ?¿hߎÿ 4kÿš¿ìûkðOöjñÿ€õ?Œ?þ1üsÝñÆ:ýª|;ñ¢Ãÿ~:x«â®þÉàŸ‡ß.5†–~7›ÂÞû~™â3¾Õ¾&øƒWñ_ÚôQ*ŽI«hú_E¬meÒÊ?{“ë`Jßçצýö?™[™¿m|XÔ<7¿µç…|9ñË[øGâOÚOáWƒüÿ$ð,?³Ç‹.¿à£°}‡Œ~øö¾ø¡ñ«ÆŸüe¢xWà/ÄOÚçÚÇÄø'ˆý> x¯áWƒ|[ñ>ç“|6ÒþµúóÅS~Ô?³×‰¼rßüOãmwþÿڇIJìµð·ö–ñ×ÆÏ‰¾ø©àßÚgöAý™þ%x{â Z¿ˆµÝ[ãíÿ ûûgi>/ñçÄ?‰š×Ä/ê¿?bM#öôÑ<ßð®|á_~×V&«á¯k·þÕ5ÏèšÎ§à½nø;QÕt« FÿÂ~#ºðçˆ<uâ ]ÝÁ5Æ…­ÜøGÅž)ð´ú®—%­üÞñ/ˆ49'm3YÔmn_µ¿ÙV³Ó{·eÙl—*{¨½ÛÕ–þ¾ïòÕþÒž ñOÃo‚²ßèü[ûPøûàŸ€|má/~Ôž:ð½ñÅ?µW~x[öø©¡xKÅ·þ'ýší,?iøÛĴŇì÷¬|K×¾ØÙø§X³¼ñV¡ãkK‚w!Ožaÿƒ_5ÚŸÇþ3iß´6œžýž~xkà6¹ãoür𕇊~7íƒÿEàï‡þ2ø[Pñcñ‹âƒÿdÿþκ¿ˆô¯ÚBñ§Çï†#ñnâ‰Ðxcã‰|Oª_þÉÑSÎù\m¾ïn·zw{>é%m5-ýtéþ_™ø7ûB~ηž"ø·ûfhú—ƒÿjüzýµÿàœü+7ï~ÕV? 5Ù‡Â?ÿà–¾ø•ãý]ø[­Úüøoñ³Àþ+ø3ñjûPñU¶¡áÚÛÁ? <}ñÊÿHø1o¤øž^+ãï‚jÝÇ^'øU¦üGý¨| û|3øÙñ?Gðo‹áÿ‚ŠþÕŸµ»gösýƒü}ð²ÇþÙö…øQûtüFðOü,~Þ1ÿÂÅñÆ?ˆü)®èŸð¨|k§Ãâ þΚ?€ÿ¡š*•V­¥ì­«½Ÿ,cutÒiGM®ÂËÓÓÖÿSó_ãtmfÏØî×â¶«ûCkº=¶·ðöÛ¿\ø5áÿxOö†Ö|9ìáñ69µ];Âß°÷‰|iñ?ÃZÞ£û]¯ÀÛ¿øöEñ‹,4moé×^%×g[oˆº¥×åî£â_Ž·^/øÛàëï~ÞW?´V…û!è¾%ÿ‚ux[Ã:¯í«7‡4oø³ö¸ÿ‚™é±çˆ?jí· ;[ñ/ÂþÈwÄmWþ _k þ³aá=~ÓöžçXо8Çký5V$ð寈õ_ÚøD¶ñv»¢xÃZçŠ`Ò¬!ñ³áÏ ßø—Tð·‡õ]r8SÔtO j~4ñŽ£áý*îêk ÿÅž%»Ó ¶¸×uI.”jY?wÏM÷ÚÝv}â”tµÂßÓ×·ùiæÛ?u߇_µÂï |@ð×ìµ£þÔ:íY©þÚÿðQ?ˆºõ•þ¡ñ³SýŸçÒ¾0|ÿ‚²üZý‹µ ÜüU¾Ô?bؼâ/xÛöpñôÿσtŸúŸÃM+ö›±Ó>0Yi:m§kcàüQøÙð›À¿ ïÿࡺgì-®ülø]ÿ }÷Ä_‰ðP߃ÿàñÖ™û/ÁHuŒ_Û~7ø«Á?¶‡~ Ëâ?ö‡OóüO¦~ÎZ·Äù,t/ý·â>§ñcO»ý䢟µzé«O[õzßþÝûÊ®®ïp·õ×K~Ú®§à߆¿á¦aøÏû?hþ*ÿ†¡ø­iá/Ÿ>øKà¶¡ÿ Éð#Jð?ÁÏ~ß´…|ûOüEý°¼Ÿ€_´×ØdÏ|$¾¾ýœ¿mÍCYñOÇïø;Gø‹àߊڇĚDžiÚïx×þí ÿ]ÿ„KÆÞ û¾%ø+ûÇúü#šíçü+oˆÞ*øuÿ m†Ÿö»Ï´x'ÇßðŠÿÂuðÓ^ó“þŸ‡>#ð¯‰þÉaý±ö~ÚŠ‰K›¥¾}ÛvKD—Êû¶Ýôi[ú×çÝ…QR_ÿÁHÿäÆi/û'ïÿ§­"¾Þ¯ˆà¤òc?´—ý“÷ÿÓÖ‘ZQþ-/úùý) [?Gù Þ/ÿµ§ýŠþÿÔ/ÃõË×Qâÿù ZدàýBü?\½Lþ9Š_›ì½äQEHŠ( Š( Šüòøà[oÚ'Å><øÍñÆß,¾+ü%ý¨~4ü:°ø]à¯ÚãÇÁ߇?<ð_ãˆ,~hþ-ø ð×â?ƒüã?ø[?-~þÑšö¡ñßõ_ŠúÇMFÂù¿g-gáÿ ~lÁ3¿hoÞ,øOðöVø5¬|.ø{â;Ùçàÿ‹­>%üZð§Åß^¶ð?Á¯ø''üTÔ|eð¢×ö„øMoá­oÅÞ.ý´N¯m­xƾ ø¡X|;Ô®5/ƒþ.ø“ñ[Æ?¡ÑSº•ž±·5ÖnÓ»m+tZôÿø oVF”Wåü·â׈õ?üaø5¨Ùhž ð熿hoø)Œ<7iâKkùüqñÒmGþ aûDÚëž>ø_¨ØêQøFÇáwÁ[‹ËOüGÑî‰~*Ü|@ø‹áMKÆ>øðÙ¾øÇö´â~ ø¯Çü ý¬ÿlY~#üQÒ?kÙ×âí1ðÿàçÁ]+â‡Ä áRë >&x£Â²Gìûâ_ÙJÇÄ–Þø¡­þÚ^½ø;âH.¼}áþÐßfý«¼?¯þ̾XßþÊ©ð±r>gìÒ^m¶—¢ÓW­¶Õè Ý/5ëúÔý“¢¿!ÿ`߉¾.üRø³ |gñÿ´øSµíý7ìùà ¿k¯ÿ ûá΋ûcütøi¨üf×¼ToÇü'> øý½mû3xKöfŠgоÿbø+ã7Å^ÿ…Éû_ü"5Ž?´oÃO‰ÿðPi^=ðO‰>iÿ¶¿ì—û1|%ð޼ã¯j¿ ~#~Òÿ ?àš¿ 4߈PøªÛã&‘¢_|ðF·ñëÄõßÙÓÃ^ð»ãïKâ{ø>>x&ïÆ—·úqìß3ÕÒ]õ¼”R_zôÕtïgÜýx¢¿!ÿiмuÿïÿ‚½|<øµqàoâìãðOö›ø=â|:ð¾»àüCþßý„üûBé^"Ñþx—Æÿ5¿ÿd蟴ßjEïÄÿlê¾ ¾ñµ¶§¡Úx®øWã?í‘ûfüø€Ÿ²Ý¯†¾~Ð_´WŒµ¿€óøÇ¿ ~¿ü9§øsãÿnojZUïìÿñ—öÓð®™ã=oÂgìã¹ñßí©ðŽÃP°ø½¦êzw†¯5„cš¦ÞÍußEËh¾kö´“iÙ®Û¤_úýÙ:+ðÛÆ·¯í›ð7öˆñ·…´OÙçáÄŸØÓöCñŸíñü$ÿ¬>)xÃ?m†žÑÀOÚ×Oðìû­Áqûkš×<1'ſښÿáçˆþ,·Â=S\¼ñÀÏxân&›ûp~Ô:6ûiøÏÂW_í~~Ä~ ý¦?høƾ øÙñâ7Æ+ÁŸ·‡üóáÝ߀<%ñ‹^ý¥a´ø-ý¥ðûö2Ðl4FïáŸÅŸü=×|kvž øc¥ü.ð„¾YÊZê´vÞú»[U£½Õ­u®­XWþ¾ïÊýuò?y(¯þ<|KøÒ¿~þÎßuß…ÞñwÄŸ…ß¾4ê?>-|7ñgÆOiÞøâÏÙóÀ×~²øqàï‹¿õ7Öü_©þÑšF½mãyþ%=‡†¬<©h2øÄw5µ×üðoÇ¿ø(?íð‹á'ÄÏÚ7JÓ~ 꿯|mÿøð—á^¡à_Gã/üFý…>~Û/Ó~&|Eø±mñm4OŠ ø“­þÃÞ [ï…>øCð‡]ð¾•ñƒG³ƒâö»wð¾÷Røš”­kk·ãå×–_s¾êå×õòÿ4~×Q_ƒµ6¯ûFüWøÙð3öøµâÙ{ÇúÞ§ñ³àïÄOx“[ý˜üu©þÍ_¾üPý—¿à¨ºÖ•ð£ãì—â_ڃķ¿áøƒûi¿ôÞü}Òô/øOµ?†^'¶ø¦k Ô¼tk·íCeð£öÝñÁ‹¯‚~»ý‰¼ûfþÑ'OŒ> øÙñïþ•á¯ÛOþ =ðÏÀ¾ðíüß´¯Ã½oáö>‰û\Ï«ê2ê¿üü,Ý3Ã_ ¾ü"ø}ð³Bðf¸ý“²³ZÛ½’“´]÷Õô¶lé×þò¿ù¼”Wãgí ÿøÓð—öO¹øíáÏ |.½ñt?´7ü'á*éÚÞ‹âËŸ~Ä ¿à¥¾1øSzÖ–6Óu3­øƒSý¾Añ äjâÃU°×|y†ôß Üjžºð¹ãßÚöÄðïíqà?ÙëIÖ?gŸüTøÁ¢~ÌÚwˆ|KªøSãׯo…^°ñÇ„?à¯ßoü9ᯇûB|Óü:Ÿã.™¥ü!ñÅi¯{9jÝ•¹ºÿ+´Ÿ{/+ú×åøÚßš?dè¯Ãoþßÿµ†¯ð‹ö¯ñ_Ãýž|âïØOöyøÛñkâµÏ>|Iø‘áÏÚľ?~Ý¿³âÙ|=м=û@|*ÔÿgíÄ:Ÿìâ?5·‰*Ö~*ü,^ÎI¥¥ÛjÚî’}µm5d®Ûvµô é~ŸÖ¿ðçÞTWãgߎÿ´ß‚¾üTÕ­~!hŸ¾$üYý¼¿lß‚¿±¿Ãçø)«üBøÿÃoÛö½Ö|]àø‹â/íð'áß´Mà/ÁŸê â¼øû-øsáWþØx'N›âψÓÁÞ ñ7—h_ðQOÚûÅý¡~-Â;ðOáî‰ûþËÞ#øßñ×á~ø›^øñwÆ_?hßø(Àÿ‰Þ ð—ü ûPj¿¿g¿øKm?a¶è#û7öºÒ¾k¿îí¿á2øç¢x6ÓVñ£öRÖÍhùz­[²Ò׳wöºzÛPºvó×òÿ5ú¼”Wá·ÆÚCÇ¿eÚ›ã~xöOø;ûy~Þ~ºðN•ðŸâ³ñWÁö²ìŸÿAøGãŠ%ø·§|OÖ´Ïèž"Ó> øßÇð|8ðŸìÛ øC‡Å¾ðŸŠüa}à˽kÇÿ<ülý»?i_ø»ÀZ—íMð+û?âìsãoþÖº>•ý‰à‚¿ð²üâ/ø&Oü2}?Áðü:ýª?oÍÃßgÖÿfoÛÂÆºøµ.«¨ÿÂ]ö)þ è6ž ±ñ/Äæ©IìÕìÛ^i´â¯dìÒM­2z­EÍåÕ/¾ßvÿý'Ñ_þ7ý¥¿m?þпcøN¿eíKâçŽümðzÿþ·ü3Å{?‡:Wß‹?࢟ÿáÿ…ÿ suâkïh&ývÂÿ g¡jºÅìïøVšn¡àOí¯xŸ‰ÿà¤ß¶=Íç‹´ÿ…Ÿ<ã_øf?üDñoí%âß |/ðçÆ¿ð¬?j¯Ûöc½»ÿ„ÏãŸíŸû=à x'Åßðľ7ø‹ÿ ­Æûsÿ´о$}‡Å¹ÿ r SãÊöR}c²wnÊÎü¯T·jË­÷Hw^~z~W[¼”Wó+®ütý¤ÿf¿|bý­SWÖîmßö†ÿ‚Âø{ÀšŸŒ?j¿Ú?öðçÅ™¿fÛø(ÇÄ¿†Ÿü}û |@ÿ„Cà‡ìÅð»Á©û2h7?ÅÙÓâˆ>*ÝX|$ð—à } Þø÷ñS[ð/µÿÁa?iOiZoíû5A¦h‡À×_²Ž<@uH5Oˆ7ˆÚÿâ×ìÿ³×d®¬ï®šr»=/Ý÷¿tÐ&ž¾Ÿ­ùŸ¿ôWàíWûVüiÑ[à·í—®Eð»Xø!û>~ןðQè<û>é^ñfƒñWTñìSûÁSþÝj¾%ý£®þ$ø‡Â7z'Å þ)×àðþ—û3h÷þ‡Ç¾Ѥñ/ÀZޝñÔt?Ûþ ޾|ñ¯Â‚~ø¹ñ7ãgü¦x—âž•à¯eü9øû9~ÛŸ/<[qû>üý¸¿m/ü+¯~Évšç…õïükø¡~ÒßÚ~7ø Ú|Ô<¬þÐ:röN×¼vmÝÚÖmIyòÙ]­5ÒëPæ_ð}R·¥î~×QXšW‰|9®ßø—KÐüA¢k:Ÿ‚õ¸<5ã;JÕl5ÿ øŽëÞñ¯‡üKii<×·sáx[Å0iZ¤v·óxsľ×#´ÍgNº¹Û¬ÆQEQEQEñüþLgö’ÿ²~ÿúzÒ+íêø‡þ Gÿ&3ûIÙ?ý=i¥âÒÿ¯ÿÒ¥³ô‘ú âÿù ZدàýBü?\½u/ÿµ§ýŠþÿÔ/ÃõËÔÏã—ø¥ù°ŽËÑ~AETŒ(¢Š(¢ŠñOþÍ_³—ÄŸˆÞøÃñàÁ?|\ðöü ¿ükð«À¾)øà¯øEµÛ¿xcþ/ëº ÿ‰¼9ÿ牯ï¼E ÿcêvØúíåÞ¯§ýŸP¸šáñ%ømk­økĶ¿|AðWá¶³à{oø/áþ•ð›ÁÞ ƒÂz†®tu¿ ü+д?†~Õc°[ý áþ¥x7Kž×Úu¦›ÐÔSæ–š½6ÕéèiðÓá͇öØ|à›?øE|mâ߉~û'…t+øG>#xûþ_øN¼ ù6 ýãoÿÂÉø‹ÿ oŠ´ÿ³ë¾#ÿ„ûÆ¿Û÷Ÿð”ë¿oÄÕ~ü×~*økã¶¹ðƒáv³ñ¿Áz$þðwÆMWÀÔ~*øO×Pø‚ÞëÃþø‡w¤Íâí D¹·ñgŠ`ŸJÒõ{[ ¡ñ/ˆ"’MgQ[ŸQ¢‹¾ïªß£Ý|úÄÚ|4øsaýƒöx&Ïþ_x·â_†>Éá] ßþψÞ>ÿ„×þ¯è>M‚cøÛÆ¿ð²~"ÿÂ[â­?ìúïˆÿá>ñ¯öÅýçü%:ïÛñ øâ†4M#á_Á]Yð‡¾øká'ìáyáÉ~ë¶Ño|áýÇß#øsľ#ø…ãøÇ–ƒIþ/ÑËÈ´ñ·‰aÔþCý¨ÿàœß³gímaà/üJðÆ‰§øÁzßÅ=oRð?‡þ~·ŒæøÝâ=7ÅZãÅÿ¾xóâ§ÂÍoÇúõ®«¬ø—âìãñàÅ]KÄ~%Õ|i?Ç:„üM᯼¨¡JI¦›Mlûn¿WnÝ«î|óâ_ÙöOñ§Ä|YñìÃû<ø³â§‹4MWÃ^)ø™â_‚¿ µßˆ%ðæ»àyþkžñŒµO ]xYÑ5Ÿ†×W_u]+QÔ®l5ÜÏá;¸&Ðf’Á½Bûá§ÃOÆZÄ]KÀ Ô> é?ØÿÙ^:¾ð®…wã-3þÝ+â.…áÿìÿÏa&·eý…¢|`øµ£èÿf¾‹û3Jø£ñO²ò-ÚŠ.û½­»Û·§þÔðNoÙ³ö¶°ð‡~%xcDÓü à½oâž·©xÃÿ ?g FÃÆs|nñ›â¿‹-qâÿˆ_<øð[⟈þøÇâÂ…ßü]ð“[oü)ñO<á?øá—ˆÚÿDÕÄuÏé:ާà½mµ? xsQmWÃwZmù¿ðþ‰vg7U„zsJÉ]é{y_¿¨Ykçúlx§Š?f¯ÙËÇð´ÿá5øðOÆð¼ÿáÿ…Ùÿ G¯øƒþü+/³ÿ·ÿ…§ý­ ÝÿÂÁÿ…}öKOøB?á-þ×ÿ„Sì¶ÿØ?`òcÚxcöjýœ¼àÝwá׃>üðÃïx&o†ž%ð/†>x@ðoˆ¾Üj¾:×gð»á+A´Ñ5oÏ­üQø™¬Má]BÆãB—Uø‹ã­AìïÅÞ ›Pöº(»ÚîÚiwÓE÷$’ôÅ?áš¿g/ø\ðÑ_ð ~ ÿÃAÑuÿ…Uà_ø\ò+ ÿ%;ûþoùâÿßüŠßñOÿÈ'ý±>þÈ¿²Á[ôÕ> þÌ?³ÏÂ]N=nÃıê? þ ü6ðü~#Ò¼9ã?i~ K¿ xkJ¸]oMðĈ~°ÕVAgáÏxÏC·ž=3Åå­÷ÐÔQÍ-®íd­w²Ùz.ˆøuû5~Î_ô­BøKðàŸÂíþ6Ô>%øGøuð«À¾ Ò´/ˆÚ·ƒo¾j¾?Ñôÿ h:e¦™ãmOáö§©xPñU”0k·¾ Ô/¼1s.‰w=Œ†»û5~Î^(Õ| ®ø—àÁ?k ¼m≠õwáWumWá×Äoxʈ¾3ñÿu CA¸»ð¼]ñÞxŸÅ^›O×uÿA‰õ[û½n$¾_k¢‹»Þîýîï×üßÞÀñO~Í_³—ÃoˆÞ-øÃðëàÁ?ü\ñ÷ö÷ü'_üð«À¾øã_øJuÛOxŸþßèZ ‡‰¼Gÿ ‰¬,|E¯ljwŸÛí¦¯¨}£P·†á8Ÿ ~Ãÿ±g‚t­wBðgìƒû/xGDñGÿ .ဠ4 +Ä_hðo޾Oý»§é^´´Õ¼ÿ‡ß~&xoín<ßüEñ׆v‰âïXêPÑG4¿™ëkêúm÷tÅ?áš¿g/ø\ðÑ_ð ~ ÿÃAÑuÿ…Uà_ø\ò+ ÿ%;ûþoùâÿßüŠßñOÿÈ'ý‡_³WìåðJÑô/„¿~ ü.Ñ<;ãmCâ_‡ô‡_ ¼ à+Bø«x6ûáÖ«ãýOðÖƒ¦Ziž6Ôþjz—uYC»{àÝBûÃ7òè—sØÉítQwÝímÞËeè®þð14¯ xsB¿ñ.©¡øDѵ?kpx—Æ:Ž•¥Xi×þ,ñ¯‡ð·… ÕuI.¯áð熼?¡Ç:éš6km·E€(¢Š(¢Š(¢Š+âø)ü˜Ïí%ÿdýÿôõ¤WÛÕñüþLgö’ÿ²~ÿúzÒ+J?Å¥ÿ_!ÿ¥!Kgèÿ#ôÅÿò´ÿ±_Àÿú…ø~¹zê<_ÿ!kOûüÿ¨_‡ë—©ŸÇ/ñKóa—¢ü‚Š(©QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWÄ?ðR?ù1ŸÚKþÉûÿéëH¯·«âø)ü˜Ïí%ÿdýÿôõ¤V”‹Kþ¾CÿJB–ÏÑþGè7‹ÿä-iÿb¿ÿõ ðýrõÔx¿þBÖŸö+øÿP¿×/S?Ž_â—æÂ;/EùQR0¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(òäü>ð/ŒüaûüSø£oûaüTÕþþ×þøGðÛá¯ÀÚëöÜøaåè7?°çìâ¿xÁ >~Òß¾èÛÿ¾4ø»]ñ/ÄÅáŸøkþmcÇþ"øCáç‡5ïh=f§û;|/°þ×û'ìÝÿÖÿ³á"ûögüOöÁ‹þìOø\?ÙŸÙÛ?ðUm#Éÿ„Ãþ—‚¿áþÞþÄû/ü4?ÁïøKáþÄøÿÿ 0ðþ™ý¯7íÛiý‘ý·åÁZÿeíOìðŽÿÂQäÿb~Ë¿ðGmgû_û3þ÷Ç?³Â?öíïøH¿á Ñ?áþÍÿ„·þìñý‰ÿ ÿá—èÕtN¤¡Ê•­ÉO¢ÿŸTÛûÛm’’zù¿ÏþûÎ]Oövø_aý¯öOÙ»þ 7­ÿfÿÂEö?ìÏø*Ÿíƒü$ØŸð¸³?²?¶àªÚG“ÿ ‡ü+/Â;ý½ý‰ö_øhƒßð–ÿÂ/ý‰ñÿþa©þÎß ì?µþÉû7ÁFõ¿ìßøH¾Çý™ÿSý°bÿ„ƒûþögöGöÏü[Hòá0ÿ…eà¯øG·¿±>Ëÿ ð{þßøEÿ±>?ÿÂŒý¢£ÛOËî—oëOòGç.§û;|/°þ×û'ìÝÿÖÿ³á"ûögüOöÁ‹þìOø\?ÙŸÙÛ?ðUm#Éÿ„Ãþ—‚¿áþÞþÄû/ü4?ÁïøKáþÄøÿÿ 0Ôÿgo…öÚÿdý›¿à£zßöoü$_cþÌÿ‚©þØ1ÂAý‰ÿ ‡û3û#ûgþ ­¤y?ð˜²ðWü#¿ÛߨŸeÿ†‡ø=ÿ oü"ÿØŸÿáF|kð§þÏöìåÿü!?ðù_øM¿fømì¯ì/øj¯±ÿÂÆøoÿ ëÿ åÿÄÃþ{þü-øRÿðÿÆ*ýþ[þ§þ'?ðÄõÛÁÿäÜÿeÏø^¿òsðÅ¿áQý§þD_øcøA~ÿÂ-ÿ ßçÝ1ÿ†Øû_ü]/øhßøDÿá9ÿŒgÿ† ­¦“|ËF•¹uw¾«_‡M%×]4Õ+]iÒûê­Ë¿žßw™ô¦§û;|/°þ×û'ìÝÿÖÿ³á"ûögüOöÁ‹þìOø\?ÙŸÙÛ?ðUm#Éÿ„Ãþ—‚¿áþÞþÄû/ü4?ÁïøKáþÄøÿÿ 0Ôÿgo…öÚÿdý›¿à£zßöoü$_cþÌÿ‚©þØ1ÂAý‰ÿ ‡û3û#ûgþ ­¤y?ð˜²ðWü#¿ÛߨŸeÿ†‡ø=ÿ oü"ÿØŸÿáF~QYûiù}òíýiþHüåÔÿgo…öÚÿdý›¿à£zßöoü$_cþÌÿ‚©þØ1ÂAý‰ÿ ‡û3û#ûgþ ­¤y?ð˜²ðWü#¿ÛߨŸeÿ†‡ø=ÿ oü"ÿØŸÿáF|“ûjÿðNŸ|N±øañŸãßí“ñ4Iâ½Câ§ìɨé>4ñ?l/Šßi:göü#¿ð‡ÿb}ƒÄ± §öGü"_ð§¿gøEÿ³|¯±ÿÂ;ÿ àgö'“ý™ÿ {á—Ù¿á Ñ4„Üá[šÎÔ›Z-ù£¯¯ù±5n[iï%òþ’?¢ (¢¹Š (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ ø‡þ Gÿ&3ûIÙ?ý=iöõ|Cÿ#ÿ“ý¤¿ìŸ¿þž´ŠÒñi×ÈéHRÙú?Èýñü…­?ìWð?þ¡~®^ºÿÈZÓþÅÿêáúåêgñËüRüØGeè¿ ¢Š*FQEQEQEQEQEQEQE=ß¿à¡ß±×ìåñþ û<ühøÝáÿ†¿u_Ûá_ǯZøƒádž>'éx?ö&ÿ‚fx‹áO‹üQàÿÜèº?ˆ|7¨üKøAªÙ]ZøGÅø›¤ÚøsUÖ<ñàçÄ(¾üLѨjð_?ÙB_íìoÚóàÕ‡ÿ ööŸìó­jÿÙ¿jÿ…Ãÿ—ö¿Ù?kÝûoûûoàü$_cÿ„þøV_³?áÿ…çà¯øg肊ßÚÓisRm¨Å7ΕùcÞÜŽ×QZ]“gÑõonîýÿ«ú[ùßÔÿྲ„¿ÚÿØßµçÁ«;þ/ìí?ÙçZÕÿ³~Õÿ ‡þ/í²~׺'ößö'ößÀøH¾Çÿÿü%ð¬¾0ÿfÂÿ ÏÁ_ðϧÿóý”%þ×þÆý¯> Xyßð‘`ÿiþÏ:Ö¯ý›ö¯ø\?ð‰ký“ö½Ñ?¶ÿ±?¶þÂEö?øGÿá(ÿ…eñ‡û3þÿø^~ ÿ†xþˆ(£ÚQÿŸ/ÿ/þV;Kù—Ýÿú»ò·ó¿©ÿÁ|ÿe µÿ±¿kσVwü$_Ø?ڳε«ÿfý«þü"_Úÿdý¯tOí¿ìOí¿€ð‘}þÿøJ?áY|aþÌÿ„?þŸ‚¿áž Oþ çû(Ký¯ýû^|°ó¿á"þÁþÓýžu­_û7í_ð¸áþ×û'í{¢mÿbmüÿ„‹ìðÿÂQÿ Ëãögü!ÿð¼üÿ ñýQG´£ÿ>_þ _ü¬-/æ_wüêïÊßÎþ§ÿóý”%þ×þÆý¯> Xyßð‘`ÿiþÏ:Ö¯ý›ö¯ø\?ð‰ký“ö½Ñ?¶ÿ±?¶þÂEö?øGÿá(ÿ…eñ‡û3þÿø^~ ÿ†x5?ø/Ÿì¡/ö¿ö7íyðjÃÎÿ„‹ûûOöyÖµìßµÂáÿ„Kû_쟵î‰ý·ý‰ý·ðþ/±ÿÂ?ÿ Gü+/Œ?ÙŸð‡ÿÂóðWü3ÇôAEÒüùø1ò°´¿™}ßð«¿+;úŸüÏöP—û_ûö¼ø5açÂEýƒý§û<ëZ¿öoÚ¿ápÿÂ%ý¯öOÚ÷DþÛþÄþÛøÿ Øÿáÿ„£þ—ÆìÏøCÿáyø+þãÉàÿg_ŽßðVÝ6óöeñæŸã¯‡?¿à˜^$øacq•à êVøâgìuáÕ<ð¿Cð¯ÃÏ }ºÛCv:?€ü'áoÙ[–Óü+áÍL°MLþž¨£ÚÓQš…'8ò·Î•ÓÛ‘_nâ³v»Ù§·oŸõ@¢Š+‚Š( Š( Š( Š( Š( Š( Š( ¾!ÿ‚‘ÿÉŒþÒ_öOßÿOZE}½_ÿÁHÿäÆi/û'ïÿ§­"´£üZ_õòúR¶~ò??üKÿ|Ôµ‰¦Óg߉O§[ÚézU„÷Þ'ð½¥íÝ–‰¥YhÖ·×–PG…ÕüÞÜiðêŒVÎöqê:‚@·“àÿÃý~ÿѽü@ÿȧüƒEê}ZƒÕÂíêýéîõhËšK¯à¿È?áþ¿ ÿèÞþ á]áÏþA£þëð¯þïâþÞÿä(£ê´?çßþM?þH9åßð_äðÿ_…ôo?ð®ðçÿ ÑÿõøWÿF÷ñÿ ïò QõZóïÿ&Ÿÿ$òïø/òø¯Â¿ú7¿ˆøWxsÿhÿ‡úü+ÿ£{øÿ…w‡?ùŠ(ú­ù÷ÿ“Oÿ’ywüùü?×á_ýßÄü+¼9ÿÈ4Ãý~ÿѽü@ÿȧüƒE}V‡üûÿɧÿÉ<»þ üƒþëð¯þïâþÞÿä?áþ¿ ÿèÞþ á]áÏþA¢Š>«Cþ}ÿäÓÿ䃞]ÿþAÿõøWÿF÷ñÿ ïò ðÿ_…ôo?ð®ðçÿ ÑEU¡ÿ>ÿòiÿòAÏ.ÿ‚ÿ ÿ‡úü+ÿ£{øÿ…w‡?ùø¯Â¿ú7¿ˆøWxsÿh¢ªÐÿŸù4ÿù ç—ÁÃý~ÿѽü@ÿȧüƒGü?×á_ýßÄü+¼9ÿÈ4QGÕhÏ¿üšüsË¿à¿È?áþ¿ ÿèÞþ á]áÏþA£þëð¯þïâþÞÿä(£ê´?çßþM?þH9åßð_äðÿ_…ôo?ð®ðçÿ ÑÿõøWÿF÷ñÿ ïò QõZóïÿ&Ÿÿ$òïø/òø¯Â¿ú7¿ˆøWxsÿhÿ‡úü+ÿ£{øÿ…w‡?ùŠ(ú­ù÷ÿ“Oÿ’ywüùü?×á_ýßÄü+¼9ÿÈ4Ãý~ÿѽü@ÿȧüƒE}V‡üûÿɧÿÉ<»þ üƒþëð¯þïâþÞÿä?áþ¿ ÿèÞþ á]áÏþA¢Š>«Cþ}ÿäÓÿ䃞]ÿþAÿõøWÿF÷ñÿ ïò ðÿ_…ôo?ð®ðçÿ ÑEU¡ÿ>ÿòiÿòAÏ.ÿ‚ÿ ÿ‡úü+ÿ£{øÿ…w‡?ùø¯Â¿ú7¿ˆøWxsÿh¢ªÐÿŸù4ÿù ç—ÁÃý~ÿѽü@ÿȧüƒGü?×á_ýßÄü+¼9ÿÈ4QGÕhÏ¿üšüsË¿à¿È?áþ¿ ÿèÞþ á]áÏþA£þëð¯þïâþÞÿä(£ê´?çßþM?þH9åßð_äðÿ_…ôo?ð®ðçÿ ÑÿõøWÿF÷ñÿ ïò QõZóïÿ&Ÿÿ$òïø/òø¯Â¿ú7¿ˆøWxsÿhÿ‡úü+ÿ£{øÿ…w‡?ùŠ(ú­ù÷ÿ“Oÿ’ywüùü?×á_ýßÄü+¼9ÿÈ4Ãý~ÿѽü@ÿȧüƒE}V‡üûÿɧÿÉ<»þ üƒþëð¯þïâþÞÿä?áþ¿ ÿèÞþ á]áÏþA¢Š>«Cþ}ÿäÓÿ䃞]ÿþAÿõøWÿF÷ñÿ ïò xGí;ÿ’ømû@üø§ðjÃàÇŽ<3}ñÂ÷%ž¹wâ RµÓîÅÍµí¼—6pÅi4¶òÍh–óièÓºzÊÛ÷i>¿‚ÿ#ÿÙPythonCard-0.8.2/tools/standaloneBuilder/doc/pic10.jpg0000755000076500007650000024114610231140006022472 0ustar alexalex00000000000000ÿØÿàJFIFÿÛCÿÛCÿÀ™3"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ýŸÿ‚«ÁU®¿à™—_ìl>øoã·Æ ëÓÿ¤kžðTÞŸÁøS¨]K5ÝçÂ_ˆwzôÞ »ñüò¼—éÍa%%¯#¼&Çòf?ø:WYsƒû x\Øb¿|Áx@ÍŸÙ‰Yz>C*”a±ö˜¯ §Ù?ðX¿~Êÿÿnÿø$m ¯f?Þüdºø™¡\x~óźR‰~|µðn»âo ióÅwâßøOâþñgŽ<)¯ˆ?á%ð†‰­è’x/Çq_?ƒµ¿„µ?ø&7ÂOÚUøgñ“Å_¶ÁoŠ¿±4_±í¿ûYxWâìóû ü1ÿ‚xxÃÄ:·ì§ã?‡? þ$x3â“ð¿öuñˆ´¿éž$ñgƒõË/ˆ:×ÂÏŽ>2‚ÇÃ?´?|²¸×´OkŸ¿ðG xsW„x{0âŽÆWÅfXlÚ´óuâzt1øœ6qÄ4(å˜e•–[ý£C”ÓL6"¶])áªSÄÐúÜ¡Œt¾9Ì3øæXÚ9ncJ:ÃEa,ºR¡Nxl 剬ñ1úÇÕåWÒ©N8…‘tçì“¥ÏØ/ü¬ ~ÃÞSÆ@ø­àÓ‚vôÏìʤ®Iä… YTîTÁѱÿ› ð¿¿ü]_‘Мqû3ûæp3T?eÏÙöNøû+ÁI?goØßö‹Ö¼yð¿ö‰Ö¿à‰~ñŒµß ø»Y½ø#ñKâŸíŸ­ü<ñ÷„­µ/|3ýš5?šƒµ)¡ñŸ†ü_¿ƒPø‡Ãž!Òü/y£è𿇬j’xõü¯þ ·ñWößøeû|ý­>'XüPµý­>:|øÓðêtñ/Äÿ¯Á¯‚¿~!xÚ÷ƺ_ÄOþÊ?²÷߇¥ñÂ}sᎽà½%hï iWÞ;ðç¼1ãoè~ Öô/ýU.ðr5ójXÎ Î0±ÊUJØ™`UÃ)ÆÆY‡•vmn/ü߬7~ÅSÆà>(x4÷AÁ?³R’98$)ãæ D‚?ˆ?dÿ þÃ>)ý‚à«_neï‰wžøQ£þÀpè¶¾/ø×ðƒÅÿü1â~пô?jß ¿h)?cý+NøW¤øŸOO iÞ.Ðí> k÷¾ Ò%x'ábø«þçÄÏ|:×?·¼Oã‚¿ ²è?Ùú>±¤ÿgxn(·ÔtëÀ õ¥æ‹é¿ü-‡ö³¯Á˜ü:ʳ|§%pyîkR¦'œÑɧ„¥ISâÓƒlóB¬êÖ¦ê,D¢ªª,|]yô­Kö”ý‚>xëZ𷈼¨ø{^Óu/Ùïã_ƒuk wÞ/øñ/@ñ_…ÃéÞ>'†ü£—ÏÅÊ1ÃTÄÚY¯.Jo'Âg˜:˜ˆÓÍkV£G0Àc°•0ÕU òÔ©:ˆQÄP¯BÐÇñœ«FƒÇÒRu!Në —¾i}r¦´i¹aa Ï^…UR<м`ªS”©Ê0“þUÕØ)?±—…Á ð²|òç¯ û8+pC 2©ãæ VAƒþQÕüÙ§…ǯü\ŸqÓ×örrN0FÈm¿5jÿðLOÙŠ†VºO†µ¿GÆ4ÿ‚3xoþ ©sã½sÇ_¼AðÑüAm&–|Wð^„¶¼)â›mY‚ f/xÒ_Œ²Þøb[í.mCÃ,MâßUðïø''ìð öÇø]ñ:[ψ?ð™þÕº‹ÅÃoÙÇãß‚ÿeï|@ð“ðçÄž5Õ|Kà|BøñëGø§âýXÑgðíŸôýÀz/Ã;ÃZ·Œþ(|BÑô/øeaíø8ð8ÜÅðÞ5aòúÔib9³N ‹„kÍž&¥WG ‡Â7 ²|^# 1§'YÓs¤¥Ì³Ž/úÅ,3Ìhº•ã9SåÃ`lÝ5 J”cõ7RuRqQ…:u\Ü—#|²qýþGր߱·…£á÷|Fðx)Ì€äÙÀWÊbÀ6e˜ªÇ9†úÁÇZ»¨'ö<ðºïø¸^ÂäÕ¿gTb9#%W`¬²ˆþÔ?aßÙ›À_à›|UÇ_|Jý¹þ~Ç?|IñKBø™ðûÁÞ øy¡~Ó¿ît_Áº'ÂMCà?õýkZðŸÃû+­ÃÆÆK;MGÅ÷xÆçÁ–šœÞ o³þÿÁ>d_øƒöæøðûÆõà—íCûþÍ^5×~ |?ýš­ü].½ñCþ ãÿÞ2“ῌn>üHñŸ„´ü*ƒÁiž+ð?‰~ÝüGñÍ—‰µoˆþo^è? |3Ïàïð”¡]ðÆ9Ò›ÃÎiÄ^Φ¾oC'Ž-JžmZTá,]nJT±0ÃÖ©$¹áJ›u©Õ<Û‹ªTpŽeEI)§†Ëù£VžXÇIÆXXó5J S•9JMr¹I(K¯_ø8×W=cß _ø¸^ ÏägqÇ\œŒócÄ_ðqn¯/OÙÂÀ o?ð°|vðçþÎás„c‚ÀùÝ‘#áôØÓþ ¿û%ÙþÖ¼eáÿ x»Åžøcÿý¯?`oˆ ?hë߆Ÿ<-ñD|0ý”þ-|Eð§Å‹h,~|2Ò<-ö}_ÂsK/5¯|Cê3èZ¾›ã2ëÃm­ù¿ÿ€ÒþøÛþ Õû5Åáo‡ú­—ȵëþðÅ_økâÆ½¢kÞøñĺFµâ;á·ÃMVÖ´ohVþ1ðŽ£aàM ÷Â×6zÚ½îµáôñ cð¢¶?Åax?Vø§ñƒUÓ<—¤M¬üXñˆ­tH´«}+ំþø8§ƒlÿ:ÿo?Ø›ö#ý‘tï‹_ ô_Ú;ÅšŸíWð€üÕ,üW¯éßÿá2ð¿‡u‰?kÐ-?gx+à_öE·ŠtïøAûJ~ÐcSð¶›{áMxé>/¼·—NÃ.á/ q¹œòªœŒ†.8¬NG›ñ>c,a¯_*xº_WÂ`ñÕ(R©‰—55 Ï)G J­xŒ×Š(aÖ.9Å)Qt©U½l.W†v¯‡úÖ5*sö•jÐ…IÆšq•éªj.¤áö_ðpž¯!Çü2O…”]¿á;ð^ p3û?($…ld¨3»$i#¦„_ðp&³'Þý“|.ƒø³ã:ýŸÐ~~¤Âeƒù°µ_Ÿ;Ê>ñ8Xøsòü«—ù~Sº=Н&øvyöý²cÊÛŽî0ëÂŽ?qTì镨Wl^_—eöóðoÃtÕ¸vKoùqxÿÔ×ÏòÛFü*œcÄqi,Å-üÁà/²ßýšý·Qé§Sú6ð_ý\Ÿù5 öÏüV¾ ã ÿ¢\ŽÝ  Žhÿà¿:»œÿÃ)x`(»x5¶á àøPC$ª¶2T|§qUËüè äqÓ±ŽTr6Ž8ÇA‚ ³l îàüê¹òÿt퀾QË|»Ôæ=¥æd2¼ðá­xv]?æuÄ—ýMÏôNc·æ]»ƒfmì ÁÁûËžÉÿLN7c Âì!NcÙ˜&>øvÿ柖öÿ‘ÎÚ/þ†ž½_]¾Ê‡q#NùŽËþ€ð¦}Ýðô_¾±ÿÁmµ— Ù£Âàƒ†#ľ e\°'þr·8aÊ®mm». ½Åÿ‚Ök ß³o…”ãæð‘ø0í?6FOÁÎ6žN8äí û­Ó,.Ö Ê&\uHûÛq÷d‹Ñ<œiúñ®ÐÀ»WGDÆÿ”-2WåÀü›soÂ?蟗Åÿ#ŒûªWÿ™¯¯ù.™¾4âU(¥™/ü"Ëÿù‘¾‹¢Û~ߺCþ S«ù¶ÿ õçþ*qÈ?ñdÇû]pAm»dòîÅÿœÖeÆg !ÎwÁÇgΩ“ÿP3¿œ•?-Á·ü)QÓŽ‡ 9Ÿ”qòãm+Ñ6bßjÑ1°yl6·Ý#˜ÿ{Ã~àn_“í:)Ü<Ÿø—¿ú¿+ÙoœgÝRïš/ËäúÜøÏ‰#Öb“ºWúž_ÛþÁmÑwÛ¦Ë÷$Ádu| ß³¿…Ôãæ\ðiÁÁÈü]Àm<¾àa¶È?౺¹ëû_ï8;L*~O+vµÄiò‘„îàq)qÓ lh廉øIáòzdéÿ3Œ÷ª¿ý ÿËÊëR'ƼM$³+.oúËö×þ Þš.û|]OÙaÿrÕ»üð¸=ÿâià¼wî~CqŒsŒ9KqÿÁYõ— 7ÀO Æ27—Ô| ̬p~%v9#pÀ¹EŽàÁøÐ8ãÇaÐry ÏŽ1·ø6æ[tÚÈ|±ÖS™S-Ù$ù‰û*neÙó 㠌هÉß`Ä$ðúßò –×ÿ‘Æ{Ú/þ†o»ÿÒßq*‹k2WKþ€²þŸ÷)¾‹¦ëáè~ÈGÿ[ÕÜe¾ø]qŒÿ§ø;(«| CÔ²”tù¶°‘c”ÁUõs×à_…Ç®o¼‘ɯÂ0;ãI\§ä5ºíCò„ÆÏáÂÝ Æ<ˆ¿»ò¥qû½ž\Ôc.1ê9'¾ÅäcûÔۘrÿˆMÀÿ‘ ºÌß=ëoú™/ë¾Ë8ñ¯6“Ì¿òË/ì¿ê vÿ†·»úïü?W“øáP7ÿ¦ø4”7¯Â5R~V ™Ê"\4ãÿ‚ ë/Ë|ðº÷³sà샅#ho„©¹N[œ‚¸•_ÌH¿"­‡C„;Jœ…ÚcÁ~KyK–ùxýâlQ»0ù>mŽíºmòöà–tÊGò§î"Ê6Üõ6"mg•m3ðŸ€Ù–‰ÿÈß<ìž·Ì×â£óÜ©ñ¯+Û2KT¿Ü²þñÿ¨Oó颲gêøÿ‚êýþ ø\zþÿÁ‡nÏüÒ‘Óiî9à‘‡)<_ðS]^Bø-áu\á›Îða 0NN~( çç(«´—dU•¢ü¨QŽÅq“œd® ò~AÈÇ<ŽGUÛû›¶«‡ ´­ãî§ rß»ÎÍÙÝ—°Ÿ2že¢ÿˆQÀ<·þ•ùo®ožwKþ†kò^½.4â[ÈÉh¿è /íÿ@‹ó_†Ÿ«QÁIu™[àß…ÐwËx;9*Œ0áZdÏÉÁ]ªVC$qN?हÿš?á~:óàÎ0 ÿ¢_×å>ÝI #òþÙ6®|°¸Ë 0ÌPüª<ˆ¾GÛÇM6G·É·¼£¯€yôáÿÙëÇ\Œ`œ®7& ®rKûVÿ±¶wÿÏ'úuóq•ƼMt¿´•¯ÿ@YuÿP¯²ëÑj~œ§ükWsÏ ÜÁ|Û@ ÇøV’¨ä*S½‘Rf†ü_ðP½bLð—Âê9÷^8+å×ázŒe߆*볋 ž;ÌH8a´“½va]³Ÿäܧ1m1±Ý—æYoÚ®6„`¸Î̲ŒgìËòcnôØ'••äYð«€ãkdrWÿ©¶wm¯ÿC+äÏÕn:œiÄÑZfV´WüÁeûò§× ½íÛeîÛSô”ÁA5r2~x\qÏî¼@8'ÿ…ißÔà‰SöÿÖ?ñj|.‚X˜<Æù&xÉ7R³²¢JÉùÌ£ Ð qÊ•¾_»Ôãå8\`ž:­¸W–;Êæ#„ùn?¹ûÿ.AÜ›B;n‹g›m0ð¯Sy¯ÿclïÿž+úû‘4âV•ó.Ÿô—ùÔ"íå·[Z?£‘þÞZĘáw…ƒn”Zø=Š©t@çþ-˜À$É€ÁJ´edÉsökcöéÕÏüÓ/ _ô?uÀNÍ7UG°é¼'Ê¿*åN9>  q…Åø]À··ö$­wÿ3\ïd×ýLš÷â"\kÄêVY–œÖÿrËöVÿ¨?/=¼¯¾—öåÕŽsðÓÂê$“eàÞÁŽ0>œ±Ú@ì ËUv[ÑþÚú˰SðÛÂàîÃÓüÁT¾ÀÇ?•‡Gʲ©FiŽðÚ|ƒ8 …~Ywùeè<³—ã xÚÃväÛ¾ËdÃåcl±ùS3Ǽ¶Ì:ùqì•@ýßÙ¶é.^p*ÖI+Þßò5μ¿êcþ~‹rçÆœJ”m™Zë_ö,¿¥»áe÷tÙ}Ü¿¶n°@ÝðïÂÀànMðiÁ!O¾©#$€H•pGÛ+W?óO|/ûx3Ó8ÿ’ì.qÎ>%plU¨ڣ…ùP`~î<§*ãhWb™G^;qÓåé¾ÙÏÇn«šð¿œ­ý‰+iÿ3\ë²ÿ©‹þ»l¢kÄÍ«æ]è /òíƒÛEßo‹ªûŠ/Ú÷Y“øá…9!‡öGƒNÀ§ÍŸ©å“9A\;¦µº¿µ–°@Ýà_ Æà4o:gø r98ÈSó!ÄÚ®-—k±ÛŽcýñæOÜ®OÉ‚v®0w¯Ù÷i{(¸Uà”•q³îŸ)xàa6€8n Î^ð:“K%•¹íÿ#\çkÅÐÅôoÏÓtKx™I¥™+/ú‚Ë¿»où„_/–öMýz?jý\õð7…ǯüI|@$qÏü ½ùÓœa¶Ü‹ö£Ö$*­àŸ FÄ€Á´|¿;.2ÞPÄyrávåˆT¸{”`1ŒvÈtû½ñ…àcÀÆcØ´\: Œ»X|޼§ïeþ/"=ïû¼9ÉÇ”)åyšpü1à…ÿbÊ÷KþF¹Ï—ýL>ý;ü?f¿×N&²ÿ…-lŸû–_åÿPkòKÍÚËëuý¥õv Oƒ¼. °ÿ„Á¿.@<†ðB°ïʧ™P‡È?i=[¿„<.=âŸð_^:gÁc#¯<`Œ·åø†1´Œ*ü»pW…ûÃÉŽ>Qå¦Ücd{q1Ø d»Ó…ùW#Œ“ÆÇwœ|3à—{äÒÓþ¦™Ï÷wÿ…7½½:)ñ3ò2__îY~׊ÿ Oóù[Ýú†?Ú+Xp ð—…Õp³áÏd.d¼¨Äylqæ,ì‰ÃA~?šÃŽ|/áujm@[|^OŸd¿âpU›þÆ–Ðÿ™¦q»µÿæ`»¾ÞIìõÓ‰¹oý¥¯ýeý-ÿPžŸ†«D}Æ-eÆ[@ðºu ø7=‚xI8 ¹çi] HÄéoÙhÞ%ñÞ¿§kiÞðÓÍíÆœ·•¿Â}̽´‚Êæê"×4Í:yüˆ5 '’Hbx—í«8“z/Í–é´«Ù‚~ðà ˆz~æ,+lÎ>O,"&Ø|¯*ÇÜü>1ðëEãñZxËû€ü>ÿexôãÆWã¸Ó…x[†ò:Ù¦ !¡^½:øZJž/1ÏgEƼÔdÚ£šÐŸ2Nñýå“Ý3Üáœÿ?Îóhà19½z4] µ\ðØ<ª5T©Å4“«—×…Ÿ[Âú+ms³ûÄ_úü/ÿÁ§ÀÏþ"¸ü^¿ñ÷‰>!xOÁö¿uícáVº|3ããgkðµtëÉ£xG]›KÜhðøoQºµ°ñ×…ã¾]#V¿[ VþãA¼h5Í'YÓ´ÿçÇö$ýƒ<-ð·þ Cãx¼âŸìö ðN¯a­üM>|Cý¯¿oˆß·¬z¿Æ?x«þ ­ü=›Bøƒ‚~ÝÙiÖßüñ—áv®øËÄÚ^•ñŸÃŸüA¢h- Wê?ì%ÿ#—üSþÎkÇúoý™«ó\·”cVdêpÎP¾¥”âqôýž3‰£ÍV#§ œÜC;Ó”ey(¸ËT¹¢ÓGÛãðùŽê\™þhþ³ÃagχÈ]©ÕmNPåÉci§u¾hé¬^‡è7Ûþ"ÿÐáþ >ñçZ߯—ðßÄ |/ևؼqâ¯kž1Ò´ *Ãá—‰/áðÞ·ák:åñðÛi6±jþ0Ðì´ôÖ.tùõÙdÔ°ãÔ#Ðué4Ïæ/ö¸ý ~":1T©BpŒ°ó’š(>g6Ô•âÒ²_ÄÇŽ?`ø.÷Å+éÛöø‰§xóEð‡"x\]ÿÂ5ãÏ n|~¿ÿ„{Æž7׿Ø^)Ò>Å®ilºþÏ¿¶ûD¥¿´š+ÙüON^àd©9:Kû0^ÍÊ:Rt휮G*T©R“¹©Ó§xÂ)q®Ë•ßöŽtïe.l]Ì£)N)ÿ²j£)JJûJM­]Ïã&/ØËþ ä>!'ÅÉ5ÿÚ`|V ?ÄÓûnxQþ!§Ã³¯?‰Oá|ÂHþâð°Ô—B:ëG«-š_®4ï+Ðà•ðVo ø?ÆŸ¼;ð§ÆðįøFácøCý¡þé~ññð^¦úׄ?á5ð݇ŻmÅkáMbk[Ã?Û¶7ŸØZ”Ï}¥‹+© ‘ÿqTS‡ÒŠé«Sáþ ¤¿sîÓʳ(Gý𣫆Ò9Òÿw¨ÝJiMóÓq–¤K2É·)có‰7Ϭ±Xy?Þ¥šËݪErÍ6Ô£îÊëCø­ñ'üÏþ MãOøYŸð˜è¿¼Wÿ «þÏø\Ÿð“~Õ¿õÿø[GáÇÙÿá^ÿÂÌþÔøÕuÿ çü d¶ÿ„,ø¤jŸð‹}šßûû?ÉËõ«ÏÙ{þ ý¬ßxoS×<}ûVjÚ‡„5™¼CáKÝ[öåÐõ;ï k×:ˆ¼)s®x~òçãÌ—>µqá?ø“Þ%½äÞñ³£4ÿÙú½ì0ÿ_Vu<|âjŒ'Ã|(Â.0Rɳ¡Q§†j ç E<=4ŠIÑ¥N“ýÜ#k‚2å{f9Êm¦ÚÅÐNMNUvÂjý¤§;ïÏ9KâmŸÆ„_ðOïø,ª*£ü_~¯ìóÇíOð÷ ðg?†>2 ?°0>„Or¤hH6¬x;öÿ‚Éü=ð‰þx Gø¿à…¾7þÚÿ„Óá·„?jo‡þð‹‰4[_ ø‹þè¿l|;ââÙZh:ßö®›uý©£ZÚéWÂ{!·‡û)¢«þ#ÿrò¼ƒƒ9¡>G•f..tÝéÏ—ûfÜðm¸JÜÑm¸´íiå‘|Ëœ)ZI?­a̯õ=¤¢“N÷[ŸÇç†boø-_„< ü0ð¬Ÿü/ðÏÃÆ™â |<пkoi>ðÞ½¢øËþ.®h¾Òþ2Zèn³¤ü@·´ñΩØXÛÞÙxÂoYÏm®C¡cÕü#ýŽ¿à°¾&GñOBð'‹µgQø¹ðçãwÄ- Å´7€u/ üfñ÷Â߈Vÿü+¨ühÓ,~4i7_þÏãˆ'×Þï[¾:Ô:ž¥¨êšf«¦j×o·þ¶(¬ªxóÄÕc^áÞ qĹK–U˜¯o)Î5%:­g7GR©íçö‘Œù¹ã'þ£eªTä³ á:I*íXwÈ’qJÁ¾Xò·XÚ6mZÍ£ùEøãû.Ág¿h_‹Kñ“â'‡¾"Oâ}â/‰¾&ü6±³ý¥ü>…ð?^ñ7‰­|Tö-µÏúÖ¡ð×GÑ5/A‡Ã¶ú«î™eᯠGöù§Ñ¬®-øha?ø+ÒüTÿ…ë&•ñ`ün#ð¸Ïí9à?øZª?á—Áç?‡ÅÓâçcá-¾ûmâ›dÐÃG§*EiýoëzΛáÍWñ³sö=AÒõ gV¼òn.>ɦév“__\ýžÒ)î§ò-`–_&Ú ®%Ù²¤‘•Æ¿ðò?ØgþŽKáÿý÷­ò¢«ã·Ò¡ >†ø64)aå„:yFeË5F¥Seœ[ØÕ’ç©Mûµ%ïMIê9ðN[99ÔÌ3yNUW9b°ÜάU£SýÏIÅi+8¯u4´?ŸÝöÿ‚¸è>²ð6¥|WѼ¦øKÇ^Óü!¥þÓ>±ðÆŸàO‰Ú†¯ñ+ÁV²ø±m¤ZøCâ6±¥éú·Ž|5¬:7е ?N½×,nî-mA¬~ÇðXŸü9ƒà÷ˆ§øÛ¯|$¶Òt ßánµûTxKUøso¡xR]2 è°x"ûãþ‹IðÜú6•7‡ôèôijѥÒôÙ4è-^ÊÔÛþñÃÈÿaŸú9/‡ÿ÷ÞµÿÊŠ?áä°Ïý—ÃÿûïZÿåESñÏ‹ãQðß:¬ñ›Éó'(×suxÉæüÊ·´rŸµMTs”¦ääîBà|­s%˜ç JÍÇëx{:vQöm}Sà´Räøl’µ’·óuü£ööF¾(À8?ð´~ ˜V?(_ˆ@—'j¡ÝÜäñÆ¿ðÚÛþeù¿KÔç˯ÊÖV•áîFŸ7Öó;ÿ×ü{ÿÐ×É«tÙ‚QÁ3mµÎï‚@¬?~~ïn0"ü%8ùÔîÏü&m’á”›X óÙv?áä°Ïý—ÃÿûïZÿåEðò?ØgþŽKáÿý÷­ò¢“ñóŽ¿á‡4wÿ‘~oÿÏŸø?{¼>É$’x¼ÏFŸñð}?îJßrOµÃ‘ÿÞý´üÑ9<ˆŸ 09'pÇŽå°3÷@;vì˜&Oø'íœÿ‹4£ûßþ7eÏü·®Òl;òð¦Üøyì3ÿG%ðÿþûÖ¿ùQGü<öÿ£’øÿ}ë_ü¨¤¼{ãuÿ2ŽÞÿò/Íû%ÿC/êÊÂðû$ŽØ¼Ïkk_ÿÌ_†ÞGâœ?ðNÛ îø6©ƒâ²‹†Éãþ!»p@F6¹ˆ€¡cZ)ÿðý°”(ÿ…<«…(øð¸„Æþ2Lã€ËÆ1°àÅû7ÿ#ý†èä¾ÿßz×ÿ*(ÿ‡‘þÃ?ôr_ÿï½kÿ•/Çž7ó(áÝÓÿpÍú$¿èqåþ] ~dm§õ¼ÏOúƒÿæ#ñ¬Á<ÿlŒü!Þ?ø_Ç#“ÿ˜È!FÆÒ|¾F¿üïö¹Œ&ï„[@9þï† °yŠØ$x·6ÇØ¸BsòÇö/Øøyì3ÿG%ðÿþûÖ¿ùQGü<öÿ£’øÿ}ë_ü¨¡øóÆí[û#‡v¶™~l¿,àrðû$”y^/3µÓÒ¾úiÿ@_×M‘ù$Ÿ°'íhª£þ2¦ /Žþ˜ ò©ÿ„¹r?/ðýÞ<¹×öý¬‡üÒp98ÿŠëá¡’râ¯è8çnÂù?¬ßðò?ØgþŽKáÿý÷­ò¢øyì3ÿG%ðÿþûÖ¿ùQR¼wãeøHáíê6òô8òë~Û >dqÛ™üëàÿù‹O—è­ùWmû~Õ‘”Ýð¨( ¿ðœü5m 6s”ñRnbwR»O–l4ãý…¿jeESð´ª7øq…*¨ùp¨ œlýAÿ‡‘þÃ?ôr_ÿï½kÿ•ÃÈÿaŸú9/‡ÿ÷ÞµÿÊŠ—ã§·w”p÷Où€ÍºÝ_þw©2ðë"“»Åæ›ßJø??ú}÷zùŸ˜Ãöý©GüÒà=‡¾c©äÅZ¼œOáÆÞ Wàý‡ÿiôd?ð«ÑpÀ‚þ4øtíבƒ|¾$È7Œ‚›LL#k/Ò¯øyì3ÿG%ðÿþûÖ¿ùQGü<öÿ£’øÿ}ë_ü¨£þ#§íý‘ÃÛ[ýÃ6òÿ©¿’)øy‘´ãõ¼ÎÍ[øø?þb·ÊÖékh~uÃûþÓ1®Ã5SòãoŒ¾cU# âXóÊá~Q€‹µ!°¿±oí,1ÿÔ zøËÀŒzŒž>aÛHSègü<öÿ£’øÿ}ë_ü¨£þGû ÿÑÉ|?ÿ¾õ¯þTTÿÄrãOúðÿþf«·lÝvý6JÒ¼:È“MbóM?éþ Ëþ |¿«+|ìeûI¦Òÿ ãà‚1âÿnLo9Èñ ,Ü(LH¸Ý L©%ž¬?±ßí˜ÏÃ…\ÿ„¿ÀlÉÄkµ ø…F)‘’6ªÄ"…Žßî¯øyì3ÿG%ðÿþûÖ¿ùQGü<öÿ£’øÿ}ë_ü¨¤üqã7¾Smm0²òÿ¡½—ÊÃ~än÷ÅæšÛlF£Oþ€|ºŸ¯ìƒûD żÛéÿoI¶üŒc'§qÎÜÀò¬Áû"þШà·Ãݤ1!‡‹|@À?±ÿ‡‘þÃ?ôr_ÿï½kÿ•ÃÈÿaŸú9/‡ÿ÷ÞµÿÊŠ…ão&ŸöVCuÿP9§ÿ=¿/ÑYÄ;ȯ­æ›ßýãÿÌ'Ë~ËÕ>*A$2ø£Á‡nrû—$!B x`¸hŽÉ-5íÿfŽãwÕq¸ÈËàâqû€1·W)È,`GùpÚ}!ÿ#ý†èä¾ÿßz×ÿ*+ê†<ñÀšgÄì>,ð·ªkZ>‹â›+]BÛKÖ/ü:öëk¥I¨ÚYI¨Úé×W±X\j6qͧ NCKK§Ôt­NÚÑOÆî0µç•äI­^4K²»y·ë{ìðï#–Ÿ[Í6KJø>ŠßôÛ¢Ó­ÍUýš>6øB@8ÀÿŠ“ÂEGÊFþÜõÀS޼uYãýš¾4©$ø$g ‚|Iá·å› `’ä” w.8ÃFÛe·ýZ¢³ŽËþ |¿«+~i'ìýñtù•~VÁm{à GË'Oø›œän6±VÜ„‹R€ßQ—w„•@°Ù®økbâ]ÛÈþÒ‹¬`•XÓa+°$#Mý¢‡ãwµg—ð÷þf_üö)øu’;_šiÚ¶ î‰ùñÀïŠ Â,«€[ðé …@BãRL¯Ëò¯pª0±Ê¿>'޾?Û^þî1íNçUÕ´"«¿t‹åãåùxL¸ òˆ¾Ú¢¥øÕÅ-ßê?½ÿÝsîŸ\×m>]:X~dmßëY­ÿëþËþ |¾zÞ÷>+_„Ÿ@ñOúŠèd9òç8xààpSJßá_Ž£1“ íPÀí:¦ˆÅ‘Ûï%Ú–bœ‘R¬#{°¨¤üiâ–­õÝ?÷\Ç¥¿êknŸ.–²±ÿç$²_ZÍtÓøØ?/ú·M÷>Rá§UP ª¥£ð@ò.òü¡Qùp©òˆgOîàÆÅ ¿ÐTR—ŒÜQ-ðM°¹‚Ù§ÿCO-¶ì¯¨?rGkâ³]?éöËþ |¿«+x2ø/Ä£þaƒ§üþiùŽ'Ÿ è0ä>ñ `¶œ™‚.¬w&§#Î[n‘0xÙRkOm¢øŒ¼Ok}C!Ù/÷\Ã¥­ÿ3O-zyþ!ÖIk}k5ÿÁøOþaüwé{S†u˜Ç6 ¸-ÏÚ¬Ù‡ú±ò•hÆ×1î+µVU‰DqÙù§Äÿ þÕ:ìZð{ã‚>ø_H}[R½²Õ¾ Ú|K×µ{Z].Öîæã\¿ø¡á>ÏG´Óô*-+J±ðÜ7ÝͬÝê:Ö©î—§h?PÑ^fgânmœáeÌòŒƒ„œ©ÎTeK6¤œé;Â\Ô3ŠU=×­¹ù_Tô:°<€Ë1+€Ì³|6!BTÕU<¶«Pš´—-|²¬5]yoÙ¦~gè_²÷ísáxëâ/†¿h>øƒñGþøYž:пb¿‡ºOŒ¾"ÿÂ¥M¡x3þ¯éÿ-õ¿Â#¢\O£øcþ íCûJžm?Jû%¤¯ w? ¾~Ó |ñ–ÃÂ_ü¿>8üP¹ø…âÿ‰:—Áïtë+;í+áõ®£¥xÀcã6z½þ§ðçJ¼›]¿ÖµM.7TÖôË Ú]É¥kZOÞôW…CŠ(á}¿°áާõœ=L-{KˆŸ´ÃÔåç¦ù¸‚VR厱´’VRWg«[#¯ˆö^Û?ÎgìkCK÷yy+S»„ýÜ•_–ïÝ•âú¦| ÿ £þ ÿGðÿÿWÃ_üùêÏÃÙËã¾—ñóJøçñ£ã?‡þ)jšGÃ]oᆛe¡|%°øköM'^ñŸƒ|a5íÕÍŸÄÛß}†ã“C²i×2ÿkM$ºƒ¥¥µ©ûÆŠšKG QWÂp×á±HÓ¯NYü§MÔ§*r”c[>«IÉFnÊ¥9Âön/aÖÉ+b)º8Œ÷7¯FR„§JpÉaŠœãQFR¥“Ó¨¢å~J•¶’?…oø(—üž÷í/ÿe?XÿÑ6”Qÿÿ“Þý¥ÿì§ëú&ÒŠä‡ÁðÇòG¬z>/ÿµ§ýŠþÿÔ/ÃõË×Qâÿù ZدàýBü?\½xsøåþ)~lÞ;/EùQR0¢Š(¯Ð~0ÿmþÑ¿~Â;öoøV_þüaÿ„·û_ÎþÛÿ…çã¯ÚWÁ_ðŽÿ`ÿfEý›ÿ¿ü3ÇöŸö¿öÍÿößü&cþÌÒ?áû^·íuðo<ûXx/ö°øñÛàOÃÙç⇄~(~Ï?³ÇÂ]GNøµûCüIøâ? xàÄŸÚŸÆ7w¶Vžý–?h-3Ä:'ˆtÏÚ H‚Úæ}_Ã×úuÿ‡µ(¥Óníîín–¢“ºÒöÒîÚÝum-¯¿æÔ:WÇ‚ÚïÅ_ü Ðþ/ü.Ö~7ø/DƒÄ¾1ø7¥xÿÂzÅ_ ørêÜZøƒÄ¿-5i¼]¡h—6þ,ð´ðjº¦‘ka4>%ðü±ÎɬéÍsâþÚ?¼a«þÎñü ñïÂïÚÂ?ho~Ï>üVðŸ|9àøcödøÛûJ]½íÿƒŸÅf«­3á.‘¡ÜøN}S@¿²°ñî›â™oÞÊ×J×>(ø­ÿñøÓñŸÀþ,ýš5Ïü.ðgÁþ(ÿÁ@>4ø;ã~•­x³Æu¿þÞ?ÿm]x#Ä¿³íß‚|á èŸ n?n?ßAã}/öñÿÄ~ x~)< àWø±¨·Âƒâçìñ§ö»ø»á´B|.øOoq­ü3ð¯>üø³âÏ‹§Ã?„¿à£~ ѼS§xÇâìÿðÏÞ;Öücñ'öíÑô¿~Ïß~ ëß|Gð«á·ˆô‰÷ß<#ñCÄ_Ôiõ—G÷ê“¶îÿ¾Í¹evůkmçÚúíÝyîÔ-kâ—‡ÃÿüIðwоxƒÂ>8ÖþÁáoë_¬<=ðÿÅø·ãøgCÕ|#ã/Hñn™â}oÄúg‹m_àÿ‡ôè ‡Å¯j> ð-§‰|7oâøüW¥bøwö•ýœ¼aý§ÿ—Çï‚~(þÄÿ…=ý³ÿïÅ_ëÙðÐÿÙð ?´ÿ³5믰Âóÿ„ƒAÿ…=ö¿+þoöÞ‘ÿWößö•Ÿåß~üiøÑðÀ^ ñïÂëOŠžý¡¿e_‰~)Õü5sâÍ;áÿˆ¼9û9~ØŸþ4kšï‡ô½SM×|Gá=oâÃo†Z¶•ðßQÔücaàox†‡7|q è’|\Ö¾yýš¿b߈߳6…ÿ÷Óü'¢|oøe¿Ø£Æ¿³OÅ A×5ßèZïÄoŒ?¿büTøŸà©´ß…×ÿð}§þgÇ/ˆ·sø—Gð¦»ñâ6½á+ÜøsþøëÁR”lîõæi+ôJ÷¿›\«E½ÞÖo^ßÕ×üò>óøÝÿ$câïý“ê)«W¸~ÍÿÓáÏüËö–]N?Úø«ökýžü=âçŽÚåü!¦iÿ³!ñÖ©®ÙØ^Áqa{©gx2ëIÒŽ¥ Ö™¥êZ¥¦½¨é&±Òn<+®xÆïù#ì˜xûÿQMZ¶ü-ð÷ÄÞ?ÿ‚\þÁíáÍ3V×`ðgÀÙ{Æ.ðÿ†b7ž1×¼ìómáŸi~ ÒŽÈõßM øšîM;Ak«Yõ”†ãOÓZóWŸOÒïþ?Ä\geÞq†;„èâ±C„ÊêWËh`iN¶2´éΜ«ÓÃS¤wZxU^0xkbàß>pÄÆ”ãêä4p8Œï,¡™N°Uq*z“pŒ)©E¨NN¯î­ŽÕ“¡+rÖN“šOi¼[¥ÚC?†¬>!üXÑõk{}B×Røð›ãGƒ5;5š0ñK¤k? ¿eísÃþ%ÐuKW¶¸³‚çá¤\Cwt|Eâ»-~ËOð‡¬|øñoñ~_h:§ƒ|KðûÇ^»´:C¤øŽÎÓPðæ·ªx›KðŸ¼+©x—Ã^Ôµ_ x’çÁþ'°Š=[Þñ&“¬øwZÓµŸYA•¨ëKû\x餑¡ý•ÿkØ!.æ(ìÿã†ÆX˜âX "5Â!Tp>’ýüãK+‰?~$è:—‡ò6™á}tø·ÅŸ|mu£[‰õ:/[é>(»·Õ´¦ðç‡?ðGÄO8“‹²œ‡3Âq øs–敳¼oeŠ3›tc< zYž'-¡‹ž6y”áN–¶6¥/¨UÅF4¿ÙpÞÇì8— Êrü£¨²úY…JØH`iàs\.*sní«†Á¸áãJž>j”èSr­sç¼ê*ŸBÿÂØøYÿ Oþ_ü,¿‡ÿð»á_ÿÂØÿ…;ÿ —‡?áiÿ¬ÿ„þÿøY𯴿á-ÿ…ÿ oüRßð™dÂ9ÿ üI?´¿´ÿÑkâ‰ðUØ¿Àþýž¾&ø{ö“ý˜<{û>|cý§õ¿ÙÇ_´fûL|)_ƒ_üU¥þËÿ?hÛ7ñgÄ WYðKøƒV¹øWàï[x/XñG„õ?ÅÏ ëÑ_\Ⱥ_‡üKÏüYý‘¿hï~Óþ$|$ñìÿðWÃþ2øã-o¿?áºøŸñÁ?´uçì÷©~Ï_ >0ÿÃ;xçH¸øe{û@|²Öü@ÿð×¾øÍàk¯Œ²Æ½ÿ ñ×öZø‰áÿ|ý¥þ|àÏø'/íáðÿö˜ðßíaᇳûxƒÀ¿?gwGø?ñ‹þ «û{~ÕŸð”hÿ g¿ø*÷Áê_´ïí!û!øóâoÃÏ2÷þ ðëVðÂßü;ñ'%ÿ„â±>§áx¾Iõ?ì“ó#÷ûþÇÂÏøUŸð½?áeü?ÿ…%ÿ ÿþÇü./øL¼9ÿ ³þgü#Ÿð˜ÂËÿ……ý¥ÿ—ü+ÿøD¿â©ÿ„Ëû_þÏøG?âwý¥ý™þ•_|4ÿ‚¨þÅþ8ðÿí ñ7Ä?´ŸìÁà/Ùóàçí?¢þËþý£5ŸÚcáK|øÙâ­Sö_øûFÞ?„þ _jº7‚SÄMÏÅOø çÁz?Šñ‹Jñe÷ì¼SðsCÓ¼TúÿãŸÛwö/øa⯉>ø•û]þÌ/ø;Ç?~øKÅ_ |+â}GÁ:?†¼Mñ'ÃÚÿ‹4ý_ÀÞñ¯ñ/áΗ¡ë>(³Òôí[Qñÿ‚ll.n.|U¡Eßë?´/À/|eðŸìçâŽ?ô/ÚǾ¹ñg~ë?ü¥üeñ§…làñ5Õ牼'ðÂûZƒÆÞ#ðý­·‚ücqs¬èúæñ4Òܬz¨Ö¿˜?³×ü?âÀ|M[ø?ÿ‚¿¶ÿÃOz^“á6ø™£AÁ¯‡ðB½þ ocáÏ øsÇZ—ÅOi> OŒš4^'Ѽ1ãŒßç±ø4-µügñ‡ÄH¯4GÇÿfßø&GíOðGàŸÂ_ÙcYÕ¿gýgá•ÿÄø%·í ñ¯ã™ñâ,^;ðÅ?ø'GÂ/ø'÷õ_„Ÿ ~ ]|Ãÿ¾üWñü×Ã/§üfñgÇþ#ð†ñÇ]¾¹ø!â+ß„:~•ñl÷úŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( ¾ý¨þ-ü=ø¥xŸâwÄï|0øcà}+ÄiŠ>!|V»ð.ƒáM ᆠC«x³Ç‹‘£E{¯x† +MŽ}BÑ/µ}^ÖÆ5íݼO÷}|9ûKøkÞ4²ñ'ƒ¼cáýÅžñeï‹<5⟠x—J°×|9â_k¿>ézç‡üA¡ê]išÎ‰¬é—WZv«¥j6·6…Ìö—pMo4‘·6-Ú•õVœuNϪv}®‹†ïÓõGÈŸ nŸÙ—ãïˆï|ð'ö“ý”~5x»MÑ.|K¨ø[á/Œ¾|Gñ‡‡,ïôÝ.ïĺƒ¦Öu;]×SÖt:çUžÖ;/õ]6ÒYÖâúÖ9|Çö¾½Ôÿb?†Ú–¥yu¨j:‡Ç/Úþúþþúâ[»ÛëÛ¿ÚÄÓÝ^^]NòOsus<’Mqq4,Ò»É#³³1å?bOø'·ì«ÿõðoüû0|<ÿ„FÓâ/µøÃ^Ö5KÏxËZûF««ÝøKÂWÞ-Ö}nïÁ? ´MZO |:Ðnîî?²ô¥Ô5ífï_øƒâïx×ÅüÓþL[áWý–ÚßÿW߈ë‚éÒ­g)EJ•œ÷ûwÒî×·~Šå­ÖËG¶ßdúÚ¸ïx® k-=$‰oïÕåS$3]y6ÑÉ9ŠÎÝ’kÛÛ©åK{ %–ÜLÂæc6ÛF†nƼâN¿©|5ñÇ…>)Aimy§iðC¦\Ûhç°²½·º½šÑo^N,ÓU‹Tº¶³ÔKEö=JÖÎ8gKëË(æŠ1Œª%-µvîÒº_?—©[&û-=v]Ów},šº&ñÞµñ#á¾§£¶£uavu9uuðέ%‡Û­,žW‰!Ô$Òt>çE¼¸hÝ y[Š%YXf¸†{x½SÂþ"°ñf¦x‡MóÓS·óD3ÚÜE#Û^ØÜ„,‚ëO½†âÊäF︷“Ê’Hö»xWÇÏÚ“LÔ´ødð­Þ‡sgãÜiÚöƒªxNÚçÄÕ§·þÈm:ÏYX¾Ñ«ß_,Žú2é±Ü_ R(áT’x-mûςռ1ðÇÚn½iö bwÖµ»û &°—Äzþ©â´û …£¶Ú”WÂ7’?¶A9YfÍ}ñ0§ÅÁ$ôÒV’µï¥•ö»IÞëWº˜¶ïu×ÏGÛVïóÕZÌìüI¨x¾×Añ•ç€>x‹â‡‰|)áÿGá?]h:uÞ§t-uGðö‡ m&Óíþ'Ôt›Í7OŽÑ¯§‰àžâêÞ(6—ñ—á/Ư۫á׎nôïøkÄß> x³âÜžñßìçã›ï ø_Pðfµ¬øóãÄ_¼_ªø‘t¿iZ?Ãxìµ] ÃZž«âMVÒN›d¶Z'‰5-_Ä ûW x·D𯎵ټUâ¤ð…eðÏ„§ÔîäÖ?°†³wo©xâÛMðÜ:”SÚß[ÝÞFëUŒé—j[è—vð:yí$|<ð­ÇŽÿhï_u‡ ¡x SñÿŠaø_¥ëºUÞºšÛÜø+áçÃGã.«®êÖóÛ¥î£á_ø‡Pðɪë~.ŸZø©«ê^)µÐeðæ—öÿâŽ(ñ'ŒñÞ)DzÌÎ¥äœI<.$Éë{,na‡©]åôÖ6›Ë3 ‰te¸¼ÃëÐÀWx¬ÂX*9tb©ðøáþq™KÌׇóN'ʹs|5\ë–J„rL>A_-Äã3Üfh±t^ša] .%ÁÖLhã#‡xã…rÌ&gˆÌእË •KBJPößÚ9všU!ˆÂÆ…Mi¹V¬©.]cR|—„|KøÅñÀþ%:6•ðkT×´­7Â‡Ä ]xJÆÚ hj/¯Ç£Oý§6âMoíRø^ÏEÑü7âMoY¹“TÖåÖ4} ×B²ŸÄõ¤j1kN™«À“G©§Yj0Çqowi:E}mÌi=­ýµõ´Ê’…’ÞöÎÖî Í´+ıüZ_ ü¼Ò_Ç t÷µÐãš(uC¡j:ÝíŒò n<>°é·ººGá­Jé-u[O»ÔD:”ú^ö—$bUBb·†+x"Ž !†‘cŠ(¢P‘Å( ‘ÆŠªˆ *¨ªðâ&m‡Î3Ž5Åc_Œ­BžC•æü;K‡s¼ÃÆk_„¥J”£…ÅT©á)âc,DaAÊSš’­_éøãÀÈ8K/ážþÊâ|¾†-q^a†Ì±9–_šN¬ã,$ቯœæTjâ"”å(à°5 %)G Rž>²xššðÿÁK~3øÈë ÿiÏÙ×ᧃþ%|Tý¡<ðsáÿ‰ü)¬]ø´ŸÙóâ7‹¾ëòjÚŒ_üwak{,~—_–mGÅíÿöˆl6„ÃæíwÇŸ·Ïƒ>øã ý¹?f/øgÇþøëñ+ᧆ¬~|@°¼ø«¡~Ì:6­â‹ú%¯ö—ìÅáðåÍ•‡‡õ qâÀÒëRº¯‡5i$x®ÓõKöný«>|1ð÷à ø»ãì­áû¯ ~Ð_·èø“ÄŠ 4‹ ¶ÿiŒú—ƒ¿áÑõÿiö‹ÿ ŒW¶í«nѮƧáÙôù×ȵ¹¶¸›â‹ÿ¶5—Š?b›ï |Qø‡û'Åû¿¿µ~…ãŸþΟü/}ájž)ðïŽôÿ‡ºGÁm>ûÇZ§ˆ–éwº,^-²_íyu?\^Åg Ék¿é–_™guq$Àx!°9wˆ\Â0ÌñåYÅlÇ…s,ûû36Íi(exLÃN9F+.©Œãgñ‡UÁæÙÖ7-âuá†ÁÿžÜQ‘á¨äØ÷ãw`s|Ç…³.)ÆåÕ jŸ >ò¯ãm,ÛÓ[«YöZ»¯==ë ¢Š)QEQEQEQEü+ÁD¿ä÷¿iû)úÇþ‰´¢ø(—üž÷í/ÿe?XÿÑ6”W½‚?áäŽsûÑñü…­?ìWð?þ¡~®^ºÿÈZÓþÅÿêáúüoý¤ÿnÏŽÿ ¿h_|øqðÿá'ˆ4øÀZëjÞ6Ö|c£êRÂi¥ß] Pš¦­kuö[­&ùŒæ-?m¼öˆg’9®ÇTåV¤ã ]9KWm­ú£dÒŠo²üÖŠ+ðÓþ5û]ÿÑ&ýœ?ð²ø›ÿÌÝðñ¯Úïþ‰7ìáÿ…—ÄßþfëO©Öíü <|þïëúOÊÿ¹tWá§ü§[´ð$ñóû¿¯é?+þåÑ_†Ÿðñ¯Úïþ‰7ìáÿ…—Äßþfèÿ‡~×ôI¿gü,¾&ÿó7GÔëvþƒž>wõý'åܺ+ðÓþ5û]ÿÑ&ýœ?ð²ø›ÿÌÝvoOÚÃÆ¾>ð?ƒoþþÏ-‹|aᯠÞk6ž ø“¬Ýé6šöµe¥\jvÚDÚn«qa ÛÝC¦Ë¬iQßIÚ¾¥b²›¨“ÂVI¶£d®ýî‹ä i÷×þõò~Wý‚ñ‡ôÏx]ð¶¶oÆâ]Sðþ®t«›{-PišÍ”úuùÓo.ìu;KKñis)³¹ºÓu x.<¹f±» =À7Ò¾xÁ? ¼ §ø£BðGïøoÀž Ñ?á%ðæ§ýá_èÖ^ðö•ý¥¬|?Ô5}Cû?HÓìí>ݪßßjW~OÚ/¯.n¤–gñߌú„ß¼?ñcUÑ+«hþ;Ô4„ÕUç†æo Yj·6 ©-£ØÉ4S=ŒBñmd³y¤½¹*ÉñçÃsöùø“à_ƒ^8µ¿ÿ‚oøQ¾;|:øyñ7À> ñÇÇŒú®ô‰ú=ޝákIü9‹ó>¯9¿]&[}ïX³—Z¶»±Ó¯õ$JøÊ¼p”ÝJتJN¬(ûLEzT!*Õ-:ju\c)Ô—»'Í)iÛ.0•WË s«.W+B›Qœ¤ÔSj)k&Õ’½ÏÕ?ø^Z·üõñGþ üÿÎÎø^Z·üõñGþ üÿÎξ!ÿ…ÿVÿ üçÿÇíÿÎ2øQðUoúÁ>ðì~Ñßüã+·ÙãŸÿ&_äexvü=?¯“ï¯Ûßð¼µoùëâüø/ÿð¼µoùëâüø/ÿ|Cÿ /þ ­ÿ@ø'ÏþÚ;ÿœeð¢ÿàªßôÿ‚|ÿáØý£¿ùÆQìñ¿Ïÿ“/ò ÷áéý|Ÿ}~Þÿ…å«Ï_àßÁüìèÿ…å«Ï_àßÁüìëâøQðUoúÁ>ðì~Ñßüã(ÿ…ÿVÿ üçÿÇíÿÎ2gþü™^¿Oëäûëö÷ü/-[þzø£ÿþ ÿçgGü/-[þzø£ÿþ ÿçg_ÿ‹ÿ‚«Ðþ óÿ‡cöŽÿçGü(¿ø*·ý?àŸ?øv?hïþq”{úý½ÿ ËVÿž¾(ÿÁ¿‚ÿùÙÑÿ ËVÿž¾(ÿÁ¿‚ÿùÙ×Ä?ð¢ÿàªßôÿ‚|ÿáØý£¿ùÆQÿ /þ ­ÿ@ø'ÏþÚ;ÿœeÏüÿù2ÿ ¼;~Ÿ×É÷×íïø^Z·üõñGþ üÿÎÎø^Z·üõñGþ üÿÎξ!ÿ…ÿVÿ üçÿÇíÿÎ2øQðUoúÁ>ðì~Ñßüã(öxßçÿÉ—ùáÛðôþ¾O¾¿oÂòտ篊?ðoà¿þvtÂòտ篊?ðoà¿þvuñü(¿ø*·ý?àŸ?øv?hïþq”‹ÿ‚«Ðþ óÿ‡cöŽÿçG³Æÿ?þL¿È/߇§õò}õû{þ–­ÿ=|Qÿƒÿó³£þ–­ÿ=|Qÿƒÿ󳯈áEÿÁU¿èÿùÿñûGóŒ£þ_ü[þ€ðOŸü;´wÿ8Ê=ž7ùÿòeþAxvü=?¯“ï¯Ûßð¼µoùëâüø/ÿð¼µoùëâüø/ÿ|Cÿ /þ ­ÿ@ø'ÏþÚ;ÿœeð¢ÿàªßôÿ‚|ÿáØý£¿ùÆQìñ¿Ïÿ“/ò ÷áéý|Ÿ}~Þÿ…å«Ï_àßÁüìèÿ…å«Ï_àßÁüìëâøQðUoúÁ>ðì~Ñßüã(ÿ…ÿVÿ üçÿÇíÿÎ2gþü™^¿Oëäûëö÷ü/-[þzø£ÿþ ÿçgGü/-[þzø£ÿþ ÿçg_ÿ‹ÿ‚«Ðþ óÿ‡cöŽÿçGü(¿ø*·ý?àŸ?øv?hïþq”{úý½ÿ ËVÿž¾(ÿÁ¿‚ÿùÙÑÿ ËVÿž¾(ÿÁ¿‚ÿùÙ×Ä?ð¢ÿàªßôÿ‚|ÿáØý£¿ùÆQÿ /þ ­ÿ@ø'ÏþÚ;ÿœeÏüÿù2ÿ ¼;~Ÿ×É÷×íïø^Z·üõñGþ üÿÎξ&øÓû0þÌ´/Ä Sâ‡ÅÏ|bñ75‹].ÆîúËö—ø©á-.-O·Ó4û=+ÂÞ ºð÷…4+XííÄ÷ú&‰§Å}©ÜjÕú\랣}uü(¿ø*·ý?àŸ?øv?hïþq”‹ÿ‚«Ðþ óÿ‡cöŽÿçG³Æÿ?þL¿È/߇§õò}õòÿøw§ì-ÿD«ãGþ%¿Ç¿þhë靸á§Â?†žøGðÂÚ¿…<áM_ÆZ厹ã-cÇ:ŒšŽuˆüA¯O>½âÛ[»{½m¯õ9eÔïõÚ}FhãšXmíãó_øQðUoúÁ>ðì~Ñßüã(ÿ…ÿVÿ üçÿÇíÿÎ2¦TqsN2’’}—M{iò(-´þ—õòo}ýš£–(®"– âŽh&âšQdŠX¤R’E,n$ŽDbŽŽ ²’¬$WŽÿ‹ÿ‚«Ðþ óÿ‡cöŽÿçGü(¿ø*·ý?àŸ?øv?hïþq•ŸÔëöþW<|þïëúOÊýnð¿á§‡u$Ö¼?ðïÀÚ±q­£øK@Ó5(Ä›„/¬´ø.Hƒ…”ÜÛ³“žæ¼gþ_ü[þ€ðOŸü;´wÿ8Ê?áEÿÁU¿èÿùÿñûGóŒ¦ð˜‡½Ÿ¬ïù‡:óþ¬¿->^‡­¶Ÿ`ש©µ›j1Ûý•5¶„Þ¥©vÛ%ÙC:ÛùŽïä‰{Ý›næ$Û¯ÿ…ÿVÿ üçÿÇíÿÎ2øQðUoúÁ>ðì~Ñßüã+yo±u4):ÕeZ³§SukM%:µ9b¹êÉF*U%yIE&Ý‘R­)òóÎs䊄9›—$º„nß,S“j*É;Ùk¯³Q^3ÿ /þ ­ÿ@ø'ÏþÚ;ÿœeð¢ÿàªßôÿ‚|ÿáØý£¿ùÆV¿S­Ú?ø'ž>wõý'åf¢¼gþ_ü[þ€ðOŸü;´wÿ8Ê?áEÿÁU¿èÿùÿñûGóŒ£êu»GÿAÏ?»úþ“ò¿³Q^3ÿ /þ ­ÿ@ø'ÏþÚ;ÿœeð¢ÿàªßôÿ‚|ÿáØý£¿ùÆQõ:Ý£ÿ çŸÝýIù_Ù¨¯ÿ…ÿVÿ üçÿÇíÿÎ2øQðUoúÁ>ðì~Ñßüã(únÑÿÀsÇÏîþ¿¤ü¯ìÔWŒÿ‹ÿ‚«Ðþ óÿ‡cöŽÿçGü(¿ø*·ý?àŸ?øv?hïþq”}N·hÿàH9ãç÷_Ò~Wöj+ÆáEÿÁU¿èÿùÿñûGóŒ£þ_ü[þ€ðOŸü;´wÿ8Ê>§[´ð$ñóû¿¯é?+û5ã?ð¢ÿàªßôÿ‚|ÿáØý£¿ùÆQÿ /þ ­ÿ@ø'ÏþÚ;ÿœeS­Ú?øxùýß×ôŸ•ýšŠñŸøQðUoúÁ>ðì~Ñßüã(ÿ…ÿVÿ üçÿÇíÿÎ2©Öíü <|þïëúOÊþÍExä¿à§|‰â­3öÓü1bëyâ;ÿüBý uýzÇA¶a6±y¢h: iúÞ¯m§¥ÄÚn‘â_YêW‰ Ö¹¤Á3ßÛûçˆôè4ëºM³JöÚ^³ªiÖï;#NðY_OmLѤQ´­JddŽ4.ITE!FU(Ε¹í¯g~ÿ䯤žßÖßæ¿ðQ/ù=ïÚ_þÊ~±ÿ¢m(£þ %ÿ'½ûKÿÙOÖ?ôM¥ìÃàøcù#ûÑñü…­?ìWð?þ¡~¯æ÷ö¹ÿ“æøõÿdÿà'þ™|c_Ò‹ÿä-iÿb¿ÿõ ðý7¿µÏüŸ7ǯû'ÿ?ôËãóðŸï?Ã?ý.&’ø#òü™ä4QEzFgè÷üºÓLÔk3NÕ­,õ ;ïøÒ&±¿¶†òÖåá¶³¼E’Þâ9aÆmÂyˆB¼*ë‡U5ý&j?~ꡆ¥ð¿À7jÇs‰¼)¢8UO˜ %òˆH%æ“þ ov-?lOÛ~ÕáïZrÅU·øvòM­‚ªÊ«ŸÙ-KÆúð6ÖºWˆüA¨jzå¾™¤ØEâ?¡½ÔoXGn·R¯ÇmHiö6ëGT’'µÓ4ènµ±äÛººÊ2œNk‚£*y­\³€Ë]jóŒkN%LË9•Zµ}•jQ¦©SÃÞrï [QƒgÆfÙ¥ «%,¶ža‰Çã]<:r£ ªTðYU8R§ÏN¤çí*VŠŒakNêÍÉ\ý­¾|ƒà׌ǃþiZö¹%œöñi¾ðí¥·‰®no!š )4Ãf-ˆŸNÕäÓµMò3ZÛ ×0ÏšÜÿ.~ Ðõß kú§†¼MáïxcZÒÚÝåÒ¼K¦ÿejŸc½‹Î±¼’ÈOsä¥Â Ëi™ÒXe4^LÓUš?Ã_‰~9ðÆ¡âmÅz•­¼ö·—Õ"¿´¸mut¿YͧiÑ~6þÛ¿¼'¥|Kñ%„ž?ðߊþ3è^°ñÿ,|7ªøªãYѼ·G@Òõoi*Ö/é«Ä5áßðMOøÓÆß±¿ÁO‡zOˆüáÛö{øWwãÿø ÷âL=µñu·Œ|£èzŒ_>B-<5à߆Zw†Q5›C©x\è¾¶µÑ4 ÛÛjãûRÿÈ™ûFرñ{ÿM^!¯0ý’¿c/ˆz·ì«û)øßà¯íqðcKñÏì‹û0^xŸÂ׿ ´?‰)7ˆm>~ëRÒõ½SÄÚ¡§é×ú·Ž|C«I£ÎšƒAªjÚˆƒR] ?øÃÏ~7ð¯q6S‘Ë‚0’Ìñvq‹žg•Ã;žESƒÅeõ¨ÑšÅÇ2Éù©á±Q¥R¤#™QªïXŠR¯LûÅäøiã©æøˆàý¾ðxÉàþ½N…z8º«ÍAPÅs:˜W^4ù°ó‚Ÿ,œ©Î4潧ǺGÄÿƒm¿ÅOüw´Öu/YxóÅ)áMM¿ixoÆ)¡ü$ø‰ª·†üO¥øßöÅñþ&1³]JÊê &ßQÒüA¥èºÅµÝ;Ÿw¢êÿ7xÛöëøûðÓãïíûIhÿ |?ãÏÙsáÇüƒöý²>;xÄŸ´o<'⯃þ½ñ§üÇ¿õ¿ÙËá¯Àß|;øÉñƒÅ_þÅ¢ßÛxÇdz.âíGá¯ø‡ÇöZÊë¾’×`ÿÚKÄÚuÞ“®~Û–Ú†Ÿ{§ëZ]ͼŸ³o†ãXø‡AÕ<3¬@$ƒâLSGöÍZÔìL±H“@.~Ñm$7pÁ<^»¯ÿÁ6ÿe/j¾× øƒsûÄÚ7†ücðÃÅÞð£ñ>ÚëÄ6´Þx{Çß|\ý·¿jø`Ÿø*ïºü%Ÿ~|?ÿ‚»|bø•ñëâOí1ñáŽþ ü,×oø*—ÁÿÙÆëöj»ð‡ÂŒþ øñàï‡ÿd_Á ø?_ñwìëáχZ?…>øwÀŸ®lµ^o…Ÿ¯ß?à—ÿ±gÆø£Ä¾|@Öl¼_ÿ ž}_áÍŸí%ûNøoàM¾±ûE|,ø¡ðgã§‹¼9û:ø[ã‹ðÁ¿>*øãoÆ%ñ¯Ä_ü8мw­øÇâþ']x‰¾&ø³[ñ}éñ3þ û|YðçŠ<'â‡_4øûþ<4ÿ…ÿ´—í;ðGþîû@|Sø¡ñ¯â‡„~3Ý|øÇàߌŸõ/‰¿þ3ø›Âÿ¾(\ø·ÀŸ ámüLѾøwÂñߊ4­Sú8øcïú(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€9È—âÿûüAÿ¦›ºø?Çò:x¿þÆéÚî¾ðñÇü‰~/ÿ±_Äúi»¯ƒüqÿ#§‹ÿìhñþ®ëÏÇ}Ÿ—þÞiþKÿm?‚ïø(—üž÷í/ÿe?XÿÑ6”Qÿÿ“Þý¥ÿì§ëú&ÒŠî‡ÁðÇòFg÷£âÿù ZدàýBü?_Íïísÿ'ÍñëþÉÿÀOý2øÆ¿¤/ÿÈZÓþÅÿêáúþokŸù>o_öOþé—Æ5çá?Þ*†ú\M%ðGåù3Èh¢ŠôŒÏ¶?àš‡öíƒð‘‹2 –ñ¥±em¸ÏÃÿÜ)fè^Ý]‰+´.àK(VýRøÃâ;½&ÆÆþâãQˆd|GÓlæšÆúÑ¢Ôu…Þ4°†(¦ºðö€>Õ²éÚzE7œ5+«O.O1’¿~|OÖþ |KðoÅOèö> Õ<¨j7躌òZÚê1ê¾Ö|9"ø×Æ:ïÀË­;á_Ž|=£|Gºð•›xCÅ¿cÓíôO¶3ÙÏk4÷š/Žt»¯t ÖP_M¡xªÊÆIÿµ“ÃÚŽ¯ö\ß“??e‹þþ×~ øÁñ›À_uŸü:ñŒ¾,|EŸá6µyâx¶úÚvÖô/x§Tø$ÿ#»ÑšO |?Ò´ÿøIðÚ[Y\ÚøZAsuỿŠ>~Þ?|£ëßµ3S´ðV³e«Úx~þ= Jøƒ«x2;¸ïÞ]P)ðuÞƒwi=â,eÓ¹°òhb²<„ÃSÄSœðÒÂKS7­^µó:X˜áÝ_×qت°Má±õj>iJº˜ÊU#$üú\=ÄÕ³(ãó,Ï,ÅÓŽi SÂÿbeþÏO U0r«‡«ƒx,>5ﲪ8uIΔ°ÊŒpµÞ"—ÉG,ø¡iÐÜ6›ñ+Äz5ýÅ´¦kYüI¡E§h¾6–Õ²PÄÞ9°ñ.Z=Ë4¢[ƒ5ÛÌ×·u‡á­ËÂú— iþcZé–«šy$šæîvfšòþòy^I®oµÉ'¾¾¹šI&¹¼¸žydy$f;•ñu§•ªÔ„y#R¤ç]>HÊNQÒŠ|©¥u´KcôT¬’ÞÉ+÷°W§üÿ’Ïð‹þÊ€õ+ÒkÌ+ÓþÿÉgøEÿe?À?ú•é5Œþ †_“*;¯UùŸÐíKÿ"gíÿbÇÅïý5x†¼'þ ï«Ý|Qý’ÿfÍ6Óá·Ã?øûÁ?³¯ÁáªxÓâW‰uk~ðø´×üð×Møkâ ü=ñ÷ˆü3uáí+áÅÍÄÒxjI£ëkã]6óVñ¯‰¼O®Ãîßµ/ü‰Ÿ´gý‹¿ôÕâðOØÿöiý¨<5û0þÌÞ(ýžuÿwžøû%þËúΩÅûŸiÞ%ÑõÈü «x³QÓl[Áú¯¥jZDš¿ÄfæÏQœi÷Ñéí¥èsiÒ\hwž$ñOóŸŽùGæ™6E> Ëq™ËÁ瘊™¾YƒÄûÕÃÔÀÖX:ò§õ¼ªÆ†2Œ*®¤!Zpœ%„­Š‹û>©”Ʀ>žg‹£©W Cê8¬Dkû(ÕŽ*Ö!9aíRÒÂÊ´ã(Âu)Óm¹Âš^ø³ÆµGÁè,~#kÞ.Ñ|cáo Aãø³Àú×ÅÜÿÂa xá§Ž5ét.ïð÷ÃM[FÖm/ôÍ;^°¿^žÖæM´JÆ-?Z¹Ö4Ÿý¿चÿÃoÙöñ/ì³ð³ã‡Ž>4xoþ áâÛ/x;NýžaÒ¿e üHøcñ‚ÿözø½ñ‡MøõñoÁšWtûüø›ª]ø/àLJ?hÙÛ|!ñ%¿‹< öoü8°ø‡µâïÙËþ ã]Pðþ±ª~ÈKa©i>%Ñç6~ øÇ Ëo⟠xƒÁ—óDÒxh…Õ¾•âKù¬$’c†ù-¥–)àY­§í¾1Á/|ñ—á]ÏÃ7ý£?hƒðž~Çþýˆ¿h­oà]§À›øhŸ>ðçÄÃ>ñN›ñóà¯í ÿ ûþïø\ß®ôMgàÕÿÃßÉÿ WWƒÅ¾,ñü"¿&ðaàf+ÅêÙ‡Sñ,Írü«Øà«åK7­O[ëÒJŽ"8lELn3ìgB„gWΰ”k'Z:5±u}¸º—SÃeÏ)Åeجbua‰ž[F¶“¤¥9ÃÚÑœU>x¹Æ1«wV¢æŒ¥*tágÂø)_ƒ¾#|bÓfÿ xâÆÏ²ü@ý£ŸÇ?€4ÿ? ÿáKü øEûv|qý‹t¯Œ¾5ð—ÆŸÚªÇÅ¿¾é^-ø/âÄž-ýž#ø»ãïøF,¼oãO‚?5?Ÿ> ê¾Áÿãý§~&~Ø¿±ìóûF|\ø/â‚~6ø©ðá/ŽuM/RŸáëøWÆóøãáOüu}ñ'á%~0|gÕôOƒþ%ÕüO©[øCøµ®xkã.›§i2CãÏè×&ÎóUóûßø&_ÂMgÄ ωþ)|`ñŸ„ß´ÿ¿m |ñ6“ûÛþÒ>ñ€>(üe¿Ò|'eðçãÇ‚|?«|3ð¦ðÛâVñÂÞ/øÍeñSêÙ£ö{ÑÿeÏ…šOÁOøóâ‹þx'ìø;៷.áJ|"ð߇4 ü>øà­gÁþðgˆ÷ú(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€9È—âÿûüAÿ¦›ºø?Çò:x¿þÆéÚî¾ðñÇü‰~/ÿ±_Äúi»¯ƒüqÿ#§‹ÿìhñþ®ëÏÇ}Ÿ—þÞiþKÿm?‚ïø(—üž÷í/ÿe?XÿÑ6”Qÿÿ“Þý¥ÿì§ëú&ÒŠî‡ÁðÇòFg÷£âÿù ZدàýBü?_Íïísÿ'ÍñëþÉÿÀOý2øÆ¿¤/ÿÈZÓþÅÿêáúþokŸù>o_öOþé—Æ5çá?Þ*†ú\M%ðGåù3ÈkÝüðoþß‚ß>#i·øñ'­{á§Ù|>×X—Ä~ñ6•ñCPñ—ö.“—y¬kÞ°ðeŸŒîü»í;OÑ>ø{∵_´C¤Äö¾^ÑðÓãF§ð¿@Ô4­#E°Ôîï¾%|6ñü­¬\\M jzg|7ñ[Âú߀¼OáûQk'ˆ|%ñ Fø§¢ø³OmbÆÞûÃpêšݵõ¦¿4–^‘™Öü[ýuφúW‚¥µ?Úº¯ü(;ãňSS´ò¼wªüiñÂvðܶ7Öz.«e¯xWU“Á¾ ñÏ…eƒU×<=ñ þÛYäþÊÒ¦m:ÿÂ/€×ï¾7ø+Æ¿¾%xÏÅÿ<%ªÞKðÓá>³¦CâýWÅú/Å¿‡ÿ µ½*R×Á­/,4OkúÍôš6¨¥Êh‹<”:wtw|%ñÇGÖ,ŸTø¡ya¯Zxw࿌~x£Á¾(¿ñÖ·âOÚ_ñoÅo‰?¼1«Ï®h:EÆ…a៌:瀟â sÌ´Ò~É®_ü^ðŽ[ÄÙš~š¶ÿh_ø*ãMþɲG´´þÚûe³¤:ri·`ç¾êþ2Ðü;àÍ^ð¥þ¥à1ãoøâߊ<1 ëŸ¼¿k~‡Lø¥ãØ|0ðÞ‡ÿ 6ñg‡/|Q øí–Ÿ< á­>Ó[¿Õ4-cÅ<•Ÿì÷ñnúãU´‡Ãv]é×ñéV6·Þ0ðN›qãmNãLÓu»7áD:ˆ­døËªhÚ熵}Ïá2øÒã[Ó,·Õ¼+iâ5:}߉-o<ñoŽcÒ<[«xËÀÒk?uûÝRçSÖÔ“Å~ºµ×$´ño†çÕ7­f¿ãüDÕÑ<áí D¹ð7Ãû×ðÇŒþ$øÀ>/½×[ÀÖ½~¾&Ðþ'Íj-ZËÅ6Vž¸ðwƒàõÚ—þDÏÚ3þÅ‹ßújñ |¿û|>ý©þþγ֯ð“à‚|hðÇįÙ?ö_×í|O¦|SðOÃé´y%ð·‹"|7:ŸÃ]+þMOâ èÞø]áÙx_Cð‹¼HúŸ†nàý·¾'C©Yjº6•-æ“yáØÒûÃßÛÙ×ÿÛ±én¥ÂþÝÿðS…ß²çì±ñ‡â·Ã{¯|Hø»¥þÈi¿„^ðßìÿûDükð®Ÿf¿¼aâO‚þ-ý£GÁojSüø?ñÄÞÕtûünñ7Á Ä:w‚¾*ÅöðÃâ¡á/*ø‰íáñÂú·†/cíNÒSBñ–çŸÚàåï’Þ-ðм.Ì2ø–# Ó‡‰Ž§öuš%½6KfòÁç-Õ¼¿ÿàš?>&|ñ¯ÃŸ†´_ÂÿƒÚßíÿðømÿôý§î¼uðÅ´&•wà†~øå¡xsÄÿgÐ>>~Ì÷~ñ…µßí9ñ¦MoZø…cñWEñE´? ÞÃÁ^ —ž,‡âàgø‹fI…âþ⬗)¡GŠËjqn1Ž2Xº©Q¯CŽÌ0x×øQ•j¸u ÿWªã8΄kÚ¾¼[€Ê0¸l¾¦ “âq“uiâK^ŒðþÎ.S„ªÑ¥V¯³©*qU³US’÷Ý;RûBÛ×öN°ñß‹¼®|Vÿ„OþøX°k|sà_‰>ýœnµƒº?ˆ¼Añ‡Â>ý«$ê_þxâ߈¼wðÖ×áÆÙ³ð«éÚTV:6¡àï~п´¦¯©x‚ßW‡\¾ºñ5¿Ž´:óNÔt­. ØÜèךƻý|1ìQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQErþ8ÿ‘/Åÿö+øƒÿM7uðŽ?ätñý ÿÓµÝ}áãùü_ÿb¿ˆ?ôÓw_øãþGOÿØÑâý;]ןŽû?/ý¼Òü—þÚßðQ/ù=ïÚ_þÊ~±ÿ¢m(£þ %ÿ'½ûKÿÙOÖ?ôM¥Ý‚?áäŒÏïGÅÿò´ÿ±_Àÿú…ø~¿›ßÚçþO›ã×ý“ÿ€ŸúeñH^/ÿµ§ýŠþÿÔ/ÃõüÞþ×?ò|ß¿ìŸüÿÓ/ŒkϼTÿ ÿô¸šKàËògר>ñßÅo þÎÿô…ºÿ‹m®ümûC|tÑïüáç½Ôôψ—Àÿ³ –‘áxc½Ñ¾!Øjj·šPðŸˆt]wLÖmõ{ýãK¼´Õní.~>®óBø§ñ;ÂÞÖ|ៈÞ<ðïƒ-iºŸñUñ4ýoÆZ>“a'tè~ @¾ùsÃÞ>ñׄtÏhžñ¯‹|1£xÎÀi^0Ò<=â=cEÓ¿ñ¯‹o¼¡_ɪèž¼ñ±sá S™õ)eÔ´¯ Mxú6Ÿ,šÆ¯$—––PÜ;꺓´…¯®Œ J|?øàQð&ïãĽâUí¤V5]+Eðïˆt[øŸLðÄÙgáÞ©hÚö¿ðûÆñ½„ZÏÆ¯Ûëw–Ún¥oyªxJËFµ“H»Óµ§ºô¹eo„:^¯ãkÿxÏ^мð^øÍàÍ®ëÚÂ[âƒ~7øðú_hÞ ð—¯ˆz¯ÃýÆZ¯Ç'RÓ¼ÿ þ,jÿ„RmPñ¦¥mâ·ñ_‚þ/×þ)üNñWö·ü%¼yâOíÿ7ûwûÅþ Ö?¶¼ïøD|ïíoíBãûKÍÿ„À~oÛ<ï3þŸîÏü#z7Ø‹/Š´ÍrßÄÚoÄoiþ$´×¼Mâ›_Yx¿Äšå·‰ükim§øËÄvú´„wðëÞ-°³³²ñ6¯Âêõ¥¥µ¶«qw "}‚¿³Àã¬|:Ðm|Mñ+Y»ø×ñ ü(ð©gj4 Ãúg‰¼ û=ø³Ãþ7ÕGü á¯xÎÃÂÆy¬#±‹Á¿íþ8xn=7Æz&µð~Ò+m3ÄÔ5¯… |Uã =9<1ãÍ6æ/²ÍµŸ‚‡àÓüEñ;Çß¼)â‹ÝCCK [éZŸ5=*ßP×|;ð/VÖ|?âÚÄúG¦ðÿÆŸøÎóÃ>ñÇÒxûÇSj–zܾ5ñlºÎŸâÝKÇÖ¼ž#ÖT±ñÖ±q¥]êþ5³¿kÃwmâÝVïBÑ.µ/Ã*k×>•5Õä²iö ¦øûÇZ=¼–šG|[¥ZMá-WÀ2Úé¾#Ö,måð.»ª^kzß‚¤†Öò(ßÂZƳ¨_êú¯‡N¨j—×—÷vs]ÜÍ+€rUéÿä³ü"ÿ²ŸàýJôšó ôÿ‚?òYþÙOðþ¥zMLþ †_“w^«ó? /Ú—þDÏÚ3þÅ‹ßújñ r°ÏÆÛíWö.ý‘g³ñ·Ä½RÐfïƒÚ Ÿ>ü!¸ø½¢XYx+Âv^ Óµ¯‰v¾øuâϵ·õ ëZ„)§ø·ádWú7>ðµÚëÞ×¼w©õŸµ/ü‰Ÿ´gý‹¿ôÕâøëöñÄßÙ»ö~øÒü øëñÏâì¥û/øƒÃž$øAðãQø‡á©t‹Ýâe¶½Ô¬ +W³‹â‘¦Þè×ö¶º”zŽ›ªÝÇ ¾ºðæ¹â/ç?ø‡Œxs&ȱœ+K<©‡«žb(çO ¥^xºtVµl\.Z¸ŠRÃÍÊ“¡SÛ(7 WÕ*Òû>˰9L},UL$q4ð´*`¡Œ­‡£J´¥Š£F¼9±0©I:tj¼Cjª£E¨Ú›«Ô3ûaøÃú¦‡qñàî¯á¯\\ëCÅž4Ñü9ûQjmà#Hð‰¼NÞ"Ô4Ÿþɬõ ]èºF¢l<@×úT:·ü$2hš>³ugë^(ý±ÿd?øûá¿ÂþÕ?³ƒþ)|dÓü«|!ømâŽ? |?ãWÄ=jãÃ~Ôþø;VñE§ˆ¼q§øãÄV—zƒï|1§j–Þ&Ö­n4½KÛèd7¾,þП>"ø'^ð¥¿ì·û`[6¯á¯èÈ×_³÷Šá¶7>'ømã/iŸh6v¬ÿdƒWñŸwzD3K´óZÇ-Ìq[\x¿eÛâGŠhoÙ‡Âß >èiø#ì'ûühøéñCâ7Ž|/ÿ {^›Qÿ‚ü=ø}ðcà ø#ñ3À_´ßÄ…:Å»x£á}÷Æïiöφz}×Ä=3Fø¥kâï žx•ÆÜs˜q&Š2|v—ÑÁb°ì~S[-®êâ£S̰8 %j/ØÏE*2ÅBrÄÆuëPTa‡Û‹²»(ÃeÕ°µ0ÑÄ×ui×Ãáscé8ÂS”j©9J¬*(Êœ*j©4é¨Â3S_Ùÿ þÓßüAáÏŠ&Ô¾"|?ðm—Á_øYšŸÅˆüGñSáçü+|0ø§ñŸá&¥ñKÇú—ƒ~ x·Ãþø¬xƒöø³sg¨xËYÐu  ã_ üKмñ7áßÄ¿x3Ÿ¶ý·bûÏk>³ý®ÿf ¯xsã†g¯ø:Ûãï™üU¡|}ñ¦£âÍÁßµŸEâÆÕô¿Œ,Õüã­/Ã? /¬àñ¦½¨ø/Å–:^‹usáÍb+?€-¿àŸ¿m“Áº‹Áû0jú¿ìùûOþÚ¿µßÂ+OGãO'ÆŸ~Óß·ŸÇ?Ús¿>.xˆø3M¹øCðÁÞ ×> üH:ï†øÓáOƯé~/ø?o«üGý˜?àáo‚多øÒ-:×Å_ðVoÛCÁ´gìç¨j³[ü?º¹ƒÃþ ðO‡/´¿wVvwÚ‡&üø¨|Xø×ðëSøÉðêÃÇþi>…â-Wâ_Å/ÝxŽ/|?ø¦xÅ×ux³OÒ<9e£ø‹BÔîu(¬µ}>{ŽFý·bÿüñgíáïÚïö`×gÏx‚ÛÂ~:øí£|}øSª|ð_Н'ðÍ­Ÿ†|Yñ>ÇÅ“ø'Þ º¹ñ§ƒ­í´mc\³ÔgŸÅž†+f“^ÒÖëð‡þ mÿðýµþ)øcö“ø«ÿ ¶ËÂÿà¤_<-¯éŸµÇíwâOüEðçÆø'ßíÁðàGìéð·þ }¥ü.Õ¿d_|@øi7íðÇáŸñwáÇÄ ¾)ühÑþk¿üAb¿~?øÿÂ5õÿÆØÃö¿øßã¿þÔ¾+øUû?øgöšOøf |ð¿ÂßÛóö€ððëömÑÿnÃ¥~Ózíkûjð±¾ x‡þ«Æ u?ÙGâ÷ìƒãÙÇ_ð&‡¨j_|4ðŸÅ/ˆ¿ð¸>&ø_áÿƒ|;ñâßü":?ÃÿøZ>;Ñ<9¦é¾.ø‹ÿ‡g¹ðÿ‚á6ñ¶¡âoøDt+›ÃÚØÚdòÙYA#zQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQErþ8ÿ‘/Åÿö+øƒÿM7uðŽ?ätñý ÿÓµÝ}áãùü_ÿb¿ˆ?ôÓw_øãþGOÿØÑâý;]ןŽû?/ý¼Òü—þÚßðQ/ù=ïÚ_þÊ~±ÿ¢m(£þ %ÿ'½ûKÿÙOÖ?ôM¥Ý‚?áäŒÏïGÅÿò´ÿ±_Àÿú…ø~¿›ßÚçþO›ã×ý“ÿ€ŸúeñH^/ÿµ§ýŠþÿÔ/ÃõüÞþ×?ò|ß¿ìŸüÿÓ/ŒkϼTÿ ÿô¸šKàËògÑEéš:&—yâè>Ӿ̺ˆo/m-f¾ºŠËO´LÐõojwÚ…Ô›ž;; CÔ¯eKH/uŸ!m4Í?PÔ.-¬æúÏáŸìAñ—âÖ¯u€±¼wáÍRLñ_Š<$÷0x~êkHo£³Ž/ŠàêÂÎ÷KÔ.´;OC«Yi­Ž©=¯•si ×É^škxR{gŽ+ˆ ø’öóK\Çãà—Å&v·YíLþD›e‹˜< ±ƒ¸\§áW‡¾~Ïž øOà[íoLÒ¬®=ä¸, Ãc3 fËå™–ž/XŠqÄJ­z¸Š¾ÆŠÃ×ü‡<͸ʷq6¥—p‡ ðu<ó1žŽ çxìÏO1ž„Äãpøú:–YŠ«_<gMªTéSœêJ¥ÈÿÁ#þ'ÛÝO«xÿÆžÒ¼ ¥À™¯¼Kkàé÷myv·×rZxwãW„æÓ#³.ÓYÿmXÝÜßÉ gožïÏ?hߨ›Ãÿ³'ÂÍÇr”øÕáx/^»ð‡Å+S×­lü âÉ4woi…Ÿ„õËMX¶Ô¯|‰üâÛÍ>ïGñN¬÷~Ö4Mþo ÚøŸö¿ãe÷ìÏð+òøëÆÞðŠOm{ga¦øƒ^Ñü{­øƒV™tÝCðö¥­C®x·\Ö5 ¦[{6Îîæy –y ¼»_É?~ÓÞ!´ý›>4üºð>•„lí>0ëôŸ é÷Ÿ¾(è_ |c¬ø“Æž*¼Öô¿\ÁðÃö~ÕôjºÍï†üSã_øÜ.«áøM§ƒÓP–Ê~ßã‹ÄUÁçÙG d™ÆY—çx,7åßêþU“âO‰Âbëâñ,MlÛ6Í*ã°uá•ÑÃàðµãK<Û Ã õOiUüã+aa‰ÉóN'ͲœÃ”âq6i‡Ïs ÎŒsL+ -u>M‘å”ðXì<ó â+Uºô©å¸©à±/Éñ«ÂºÙñ'†´/·ûkJ±ÕZ;Ij«}n— ¶ò;ÈÒB@#‘¤ré†Üsšß¯ ýŸ__ؾ£$“xqí4Tð,÷Wm{wákML±²Ô¦Óìl£M=cì§WD¸ÕüIy¦Í}uk.½¨C½Äžé_ÍЭ%üøq ÚþÍŸü/¤xo⩸Óõ¿ßü:ð†¼-â™ÓÅÉã}ËÂwºí…Οc%‡‚>&O£è£ø»Q·¿Ô5¹¼¢]ý©äLý£?ìXø½ÿ¦¯×ß°Gí àßÙCàgÂ-/âî¿qàm[Ʋ§ì½­xbÎÿGñ Ü:~-x¾×ZÒï4[;‹Ý<éÞ4ÐK\Åy"[ê—z¦8]М©ªøœ6…l6ÚÒ§·á½âÏúçˆÒËà/Žþ2Ö4]6ú= ]ËV¹ÑŽ›'ˆµ-Fšê ­^ÌIô¶›ñKÀš¿Å?|Óõß´|Møðÿá§Å/xgû3X‹û#ÀŸ|RÓÿ³4ÍV÷XÒ?áûV»§é–Z߇nuÇ¿ŽðP>ø£ÂšOÄû[‹_Â?t”·:?Šà7ZïŸxwG´2^éÍÝXÒlÌï,1[¤ï=ã­’ÜÍ O ~Ë|/ñƒáÏí%àïÙcáÄú‡üÃözýŸ¿f_¼9àgÒ¿b¿ÚKàgl-ÄiñßþxSöð/ÂÿWÿ´WÂÿ…ÚÊþÊzįkVÞø…£|VÑ~èW„õÿxÁŽñ'0âL·íñ”2š8,f3Ä`°Ùv"+•`«aðR©…©T¥Z½ ÉÒª”kS”k(§G^-á˜äxl¿ðÿR«ŠuiT¬D±Täé¹IV§ZiMICÙª´ýø®zmr_÷Ÿ¹õãÿþ5øWã÷‚õ¯x;Oñ›¤h_?h_‚—–þ&µÓ¬õ~Ä_ÿg?Ú·Ã?µÿü7ãïˆÿmo‹3~ÏzoÂÏÛágÇßþÞz¯ìðWâ_ŠÿfŸ‹^3ý±þ!|?‰ÿc¿‹2øqñƒá§€|9áo~Îú–¥¦k6Ÿ¾üÐßÄÞ+ð’ÿhü2ý™<{¡xwËÔ%û_Žõéš—öG‡ïõŸè_×ñ…ã?ø%í‹©øöƒøqðö^ý <ðÄ_ü_?€>ütŸþ 3ð;ÍøÙãŸø&üÏödñ׋¼-ðÏþ ïøörÓ?á5ñŸíû ü1Öþ"øËÃö|Qæé ã/_üø+¤Þ|?ý¿ýÿf_ˆ¿ o¯ÚãÇÀOì‡þ;ÿ…Õu¬~ÒŸ´ß€ÿecöÉøƒãühðÖ½à‡¿¿hÏٿ⇋~ x·öð—Ãÿ ^Zø;àïí‹ðûÀŸ¾ Øèÿ|áxïáþÃÙÀõúŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( _Çò%ø¿þÅé¦î¾ñÇüŽž/ÿ±£Äúv»¯¼|-ø©¥XÚC§xżG}ªÞxWEŠÖâ9<;¬§µ+­CÆÚ4l-Foªjúv¡§[‰4ïí©4ôÓíôÿÓêdqÏxÞ&Ëø„°¹Ï†%æØÜwgœC†És^%È3ð^k^YZx|]LÎÜ,é8Ò…W 8©c0ÿ½µfðwö–‹Áré~ ø¡âŸ†ž%»ñ€çO iŸ.4‹cIºðωcŽ]3IJèi¯øzúëKºÔ¬ãµ¾’6–·FÜÞý§Çj_ÚÂÿ°_ü“Ä>Ö¼#¥xgÇ߯þ3ü<øqðÚ;¼;m‘ãm{ÄcPñDš]œ‘Ia x[ÀúÝìQ)Y¿´î¼7áë³bדËcùKâ_Úãþ %ñÕlõOÚ‡Mø=¡JÉá_ÙÓá„|¢ïZ;oê¶¾&ñC¨¶„ÅG¨ZK˜^9#À~Z×¾xsǺ¤zÿÆ|EøçâHÍÀÿ„ƒãÄ/ü@¿xîˆk˜Þ=V»²y–S¤DˉWl£Ì®ŠÖÞÊÆÊÞ+[;;X’ k[hb†!‰V8¡Š5TŽ4P¨ f¿3Ì1+Æã5‹Åâq*›—3‚¯ZuT’JN*|®VWµì¶?bÂÑx|6ä¤èP£EÉ+):Tã$®ìŸ-íwkîéÿä³ü"ÿ²ŸàýJôšó ôÿ‚?òYþÙOðþ¥zMqOà—øeù3¢;¯UùŸÐíKÿ"gíÿbÇÅïý5x†¿ž_ÿÁVÿjÛï…Ÿ²7Ÿø'߯”ðÃÿ‚Ÿ±ìéà/ˆ7v¿ <)mâ_~Ñúf‘ã‡ÿü ¯]þп xŸáŸ€cðWÄ cÆÞ3±ŸÇ^7ÑdÓµO†_Ð×íKÿ"gíÿbÇÅïý5x†¿‰ßŠß?hÍVø]ð¯J´ðGÃO†^8øû?~ÑvÚIø«|MÒ´ß„þxBÒ/ŠÿƒŸàïuïÞ|oøñ¦|ÕôO‚^4øý«ø+áÿÄOü@ð‡~jŸ³‡¿gŸüSüÇ>"âžà,VoÃx¼—-¡†Î2éqmc3\rÜbc)Ï<Ÿ—ãqÌv9`rˆàp¸ü.?O1©‡Ë%,}J xÜMšã² ‡àp¹.:® ê8zXß;žS[ŽÎs,G•àò|5,§6«žfµóÇ °Ù-(á+æ2_SÁb*æxŒý¸ÿÁ0à§žý¼¾é~ñ߇ï¾~×þð6‡uñ¯àïˆtíö>#×ô=3ÃÅŸ‰­l>!|J¸ñ/À½âÖ±yàȆ·âoøYßžëÁÖŸ<+á+ø÷Æ_«üÿÁ:mO ~Á_5øñÛÄþ.øƒñàÿƒ¼ßuOÞÓê|/ÿ:Óõ„ÿðJ 3ÄŸ³ßÆ\øCán›àßYx¿öJðŽ·ëÿ ü3ñCöÞý¿~#êž8¹ÿ‚ø/ö/Ô´èõ~ΟðC¯|9¶›G°Öf¿ˆšo‡î>"Mûu^|=ðŸ‰lm|+âŸÞ:ð¦«ê0x£Ä1þ°u¿Ú7‹<+â=GÅš?‡¼MáýwWðˆ-¼'ã­/FÖtíSQð_Н<+áŸYøgÅ–673ÜøsÄ^ ñ§ƒ¼cm£kYê3øWÅžñ VͤkÚ]å×A_ÊÂo~ÚÿðÏ´ßÅ/Ù~×ÿà ÿµGÃÿø'?Æïø—þÚîo…Ÿðη߳?ü£á'íûâßøQ_ü1ø±¥þÖŸ?iOÛ{Rðý¿Åèjx5¿j?‹Ÿ>2üLÓ´?Œ? |áýþ ¹ªü]þ‡¨¯ÂÛ#ã_€|{ûW~ÈZ?Æ?þ ?ðÛàÞ¥ðþ •¦ê fË_ø(_ƒ¾&x³âgìéûU~Äß|ñoÄþ ÿ‚qê·Ÿµßƒú÷…¯>(øÇà·|mŸuO‡¿¼âãÐüIãÿéL|Óo=Oâgìáû9ünø·â |(ø?ûaþÒß¾\|?ø]¤hzÃßÚ áî“ÿ¥›CñvscðÆÏLýÞ¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(—ñÇü‰~/ÿ±_Äúi»¯ƒüqÿ#§‹ÿìhñþ®ëïÈ—âÿûüAÿ¦›ºø?Çò:x¿þÆéÚî¼üwÙùíæÿä¿öÓø.ÿ‚‰Éï~ÒÿöSõýiEðQ/ù=ïÚ_þÊ~±ÿ¢m(®è|ÿ $fz>/ÿµ§ýŠþÿÔ/ÃõüÞþ×?ò|ß¿ìŸüÿÓ/ŒkúBñü…­?ìWð?þ¡~¯æ÷ö¹ÿ“æøõÿdÿà'þ™|c^~ýâ§øgÿ¥ÄÒ_~_“<†Š(¯HÌúWGøásÃÿ¬l¼{¯ÂÝøß ÝjþðTÞÓãðEÞ¡ÿ ;Ç ´O j?ÛUÓuïê¾¹ƒF¸¸øqÿŦ¯®èV¾&ñ‡¼=ý¹âíÅìüã­C¯Äx¶ûÀZüzV·ã{?k>Ñõ9ŸMŠ-7Uñ,6o£i÷òɬiÇgw{ þ«¦¢ÆZúÔKô7‡¾-ü1ðþ•û>xÖ;Ÿ\üWýžô·Ðüþðü|Aâ}3ãOÄ_ŠÞÕõo¯[Äh:|Þ5Ò¥ñ‡,þ&¡â´CÃzoŠ|0úõ·Œ¼?{Bý¢4]7àÎ…àá5þ‘â |5øð²ÆËMøEðg^¸ñ.™ñZø©_k2|vñmž¥ñ3áÝ„V_uMUð'„ü3ª[ëZfƒxšgŒ<%©üCÔuŸ x¾›ðƒÄíáÿk¾&ÓõïÂ-ð›Ãßü?k®øoP²ÿ„ßÃ&øðÿáÆ“¨hÓê§nÐo¿á7¸ÖtïYC«iúöÚu²7Úžúĸøñ:ßÃG‰¿á×§þ×ø³â?ÿðÛè> —ÄúgÄïéþÔ?áÕôŸì•û½®ÿÂSö/h?h—Ħ¡áßÛdÁý‘¾ãé[oګßÄZç„£ñæµâ}ÀmÏãtÓÆŸ/µ‹ß¼i¨jºàðÿˆ­.n¼xž øXú'ˆ¿i†_þ!øŸNð¢ð7ߊ>Õ¾'k¼'…þ2|1𶛤xgM°ñä^ÒõïŽ_ešö×Ãú®¹gáÚoà6‰ðÆ_h’ SB°Öµïƒ×þ³½ðÏ—oáí?ãM¥åÍΫÿ :kh´Û€%ÓþüuÕµÏxgJø-ñgSñ'„¿²á*ðþŸðçÆšç†·­PÐÿá Òm´i/ôoí›ä½Ò´­í¿´m#{›?:gM_wMão^(ø ª|:Õ|sãÍ Ãõï‚:…u‹x?Uø…ã³ê_¶/5Ífçá•ÏÆÃÃÚ…ñ†? ^ê:oÄ/ùRÙøfúò¼hºVòoÅ?ÂËøñâ?ögö/ü'þ<ñ¿±¾Ûý¥ý“ÿ Wˆ5 wû3ûGì–oûÛþËöß°Ù}«ÊóþÉoæy(Á×§üÿ’Ïð‹þÊ€õ+ÒkÌ+ÓþÿÉgøEÿe?À?ú•é53ø%þ~LqÝz¯Ìþ€¿j_ù?hÏû>/é«Ä5üÏ~ÖßµÃoøöÐ> | ø ñûÄßàœ¿³¾'|oÒ>#|uºñ-Ljµí7ÅÞ׿f½WPý—?h¿ÙÂÃMñOìÁâ…w.ñgƒ¾-ø÷Æ*ðzü~Ö¬üៅþ"ñˆ­~4L?µ/ü‰Ÿ´gý‹¿ôÕâþüWáŸÿ¯|ð›á§ÂxGGñ¯ÃÏ…4¿xñþøKXÕ|ñà×ÃÏ럎-â%ˆÍ±X*Tý†_Ž• Ò¥Z­(Ò‹©êóþ gû5ÿÁÿlÙüx¿áÇìàoø¾ÛDøYuñßöyý¯u/޵®¹û5üOÕ¼!w­ßxOÁÖ·T>$»±ðÜ:Öµã?Cñ¯àÏ„¼3ðßã¶£à=XYë^$ŸáëéÞþ‹ëøJÿ‚TþØŸ³ÿì›ûSøÃãí/ñx{Aøqû5_ü ñ'Žì¾ üoñ¯þ3|cý¢~#|<ø‘âO|øuðá§ÄgQøG¢j?³ïŠ.~6x¿O–×áÿÃ|Gøðíu-K\ñm­¶›ýÛþÚzgÆOÚ7öe¼ñ7íQâOØgàgÆÙ³ö,ý¡¿f‡^1Ù{À^.ýµ¾'þÑþ;øµ/ÄßÙ‡ÅW<ñŽãÆþ$øSàÿ ~Íz¹àØûÆ~ ø—àÍOö”º—^øâ'ñ÷ÀýWÂÿWàÿÓãÊ3yäÙO cq«Š©åuhû*Xg™b¨ás(aU,>' K6£NžaxÌ-L^'–²s¼¥Ý”C²|ª¦7(†EŒ¯—àñ8üž”ãZŽY˜â°ôñ9†–"0±ÄÃŒ«^ÄK „­ˆŠU±<%yÕÃÒý’¢¿˜/ÁB?i‰ü%ðkƺGíQÿ KÄ"øû4üqÿ‚–x ~ÏwÚ?üƒÆ0þÜ_ðOo~Ñ_³—‹¬üðËÃÞ3ýš>éÿ³—ÆoÛöËâ.›ûsxâoÇo‡¾ý‘ ð×칤øƒöµÖ~|Jýì?bÿŠšw‰´ï‚³§üêÿIð—ÄoŠ?hÏ kÞðïÅoÛ3ö¡Ôuë)Їе˜¼1©ø™4?è¾Ò¿R=ú¢¿’/¿µÿí~~ØÿµÆñËÃÿ?j?Ú¯ÃÿðMïÚnÙ_Y¿øIðóà׃þ~ѱïüáGí%ÿ'ðÏþ |mý üðör“SøóáŸÚ#ÆúŸÇïØ÷à¬ÿ|M©ücøñg\øiñFÖ~¿ýŒ¿hßÛkãŸÇßÙ‹á^·ûeüñßÂKÃÿ¶ïÄïüRø¾ý¥ ý¡~þÏ4ÿ‚aKàïéµ$_²_ì}ð'Å Óþ$þÐßþøÿâ?ìÓû7ÏðÏGø57Š~Þ5¿í½ðëXý¢þ€~ÿ\øO·ž*ѼuyáŸÝxÛÞñ7„ü=ãNŸÅZ…|i¨øOXñ†toËlÚ¾—áÿjþð.©âmÆò ;^Ô|á;íRÚêçÚ<¶e·„ü+gâ­gÇV~ðý¯¼Gáÿ øOÄ>1¶Ñ´èÙÙü*Ñõøûǰoíwû~ϺÏïkßôX¯~ÿf|MñGÅ߆>5ñu‡üW£ø¿áf¯ãõøw‘ã­kà¯íð“óàgí•û]üxñoÀÏ…¾ý·á ñ×ÅïÚÿÁÿ þ9|øìQûXÿÁ>ôŸx—öÿ‚‹~Ð^7øiÿòø«àO„¾ø›gñÀ׿~뺯ƒn ?âGÅ?ÙÏÄñþϺŸŽ´ßÚÃà/Œõýkö©þŸh¯Èÿ¶Wƒ´oþØÿ?jÛwþŸþÎðÚ>&ø¡ûy?WþëöXý›~;x¯Ãß ÿj?øSþøKûv]ÂÊý›|ðÇã?ü$>,ø™ã‡_á ¿á(øYàk? xÓàLJü1óÿŒ¿l¯ˆº?íÙûG|8ð÷í»ý«ñkáÏíÿûüøEÿÑòe‹ïøNÿe`]wö‹øÕÿÂX¿m¯ÿ§ð×Ç¿Úãïü, üj±øuàOøRÿÛ>9ѵ_„¿~"xOXýþ¢¿0?b¯Š_µÄÏŠzÿß:î,¿b‡ú¯ìÕûCø›û3á±ÿ†ªý¬ußøWÅž øÝýáM>ÂoÞWì‹á߃Ÿµ7ü+oßx¯á³ÿÃÊÿáHjºô?cÛOú@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@¿Ž?äKñýŠþ ÿÓMÝ|ãù<_ÿcGˆ?ôíw_xxãþD¿ÿدâý4Ý×Áþ8ÿ‘ÓÅÿö4xƒÿN×uçã¾ÏËÿo4‡ÿ%ÿ¶ŸÁwüKþO{ö—ÿ²Ÿ¬è›J(ÿ‚‰Éï~ÒÿöSõýiEwCàøcù#3ûÑñü…­?ìWð?þ¡~¯æ÷ö¹ÿ“æøõÿdÿà'þ™|c_Ò‹ÿä-iÿb¿ÿõ ðý7¿µÏüŸ7ǯû'ÿ?ôËãóðŸï?Ã?ý.&’ø#òü™ä4QEzFaEPEPEP^ŸðGþK?Â/û)þÿÔ¯I¯0¯Oø#ÿ%Ÿáý”ÿÿêW¤ÔÏà—øeù1Çuê¿3úý©äLý£?ìXø½ÿ¦¯ׄü<ÿ‚]| ý°ÿf¯ØW㇊럇<áïéž4𠧉<;ñ_á§ÅoC¨ü8ñþ$_x_Uð¾—á»Ûññ^·ñ¬ž.ƒGð$~÷oÚ—þDÏÚ3þÅ‹ßújñ }aûÿɈ~Åöi³þ©ÏWÏæKĹ^a’qU€Î²|uJK–fxZ8Ü'êøŠXºÛ ^¥QÑÅP£ˆ¤åéÖ¥N¤m8E®LË.Àæ¸7̰´q¸J“ÃÕžR”ªá1qxjŽ/íáñT(â)IZTêÒ„âÔ¢™ùÕàoø7×ö"ÒôOEøÍã¿Ú¯öŸ±šëI½ðÙøñÀü$¿ðMÅ„ZÔ:‹i¿ì_á_ÙSVñ*xŽ=ZÙuH>&ßxú ;û J>ÃMq¯oö³Â~𯀼+áŸøÃ>ð_‚|áýÂ~ðw„ôm;ÞðŸ…|9§[hþðφ|=£ÛYé‡ô-"ÎÏKÑ´m.Î×NÒôë[kh- Š%è(®œ—‡8{†°óÂpîC“dJ“u'…Ér¼U‡œÜêTs å7R­ZŽN-¹Õ©&ù§&ö§J•¨R§N”bœcpŒ"¢êTªâ”RI:µjÔi+:•*O✛(¢ŠöMŠ( Š( ¼ÿÁ¿ | ðÿÄ|Yá û#Ä~ i¿¾)jÚzÅÿü%;Ò>|4ø)§ë¿eÔõ Û-ìÿ ¾ü:ðÏög‡m´_øG¶gÓåñ¯®êºŸ Q@ðÓáo>øsRðŸÃ­ þßêÿ>,üRÔ4ÿí=cWûGŽþ8üSñ—Æ¿ŠZïÚµÝCS½‹þ‰¿<]âoìÈ.bÑôOíìoéúG‡ì4Í*ËÐ(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€9È—âÿûüAÿ¦›ºø?Çò:x¿þÆéÚî¾ðñÇü‰~/ÿ±_Äúi»¯ƒüqÿ#§‹ÿìhñþ®ëÏÇ}Ÿ—þÞiþKÿm?‚ïø(—üž÷í/ÿe?XÿÑ6”Qÿÿ“Þý¥ÿì§ëú&ÒŠî‡ÁðÇòFg÷£âÿù ZدàýBü?_Íïísÿ'ÍñëþÉÿÀOý2øÆ¿¤/ÿÈZÓþÅÿêáúþokŸù>o_öOþé—Æ5çá?Þ*†ú\M%ðGåù3Èh¢ŠôŒÂº?øS\ñωôxjÌêÿ‰5KMH²$FæúöUŠƒÈB‚ÌÝ]¾ìhòFÉÓ­ÒóP°´”ºÇu{ko#F@p“Α9BÊÊ+¥•€8Ê‘Áþ›4Ù“áO쵩xgâÂßE©Íám6]Åšó^êþ.ŸO¿[)>áN ÏëÓÁÃ?~Ú¾7ŠX,-ÕŽ:žS‚X‰R«VγLö\±uå‡ÂeTëÿhbjÔ䥄ÄÖ?\?˜fxº˜šMÐÂR…b&ç‡x¼K£FU#—áq?[†««N8:nŠ©/é«Ä5õ‡ìÿ&!ûÙ¤~Íÿú§<_'þÔ¿ò&~ÑŸö,|^ÿÓWˆkëØþLCö(ÿ³Hý›ÿõNx2¹pŸòûþ¾?Ô©mOÑ[ÑEØ@QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEËøãþD¿ÿدâý4Ý×Áþ8ÿ‘ÓÅÿö4xƒÿN×u÷‡Ž?äKñýŠþ ÿÓMÝ|ãù<_ÿcGˆ?ôíw^~;ìü¿öóHò_ûiüÁD¿ä÷¿iû)úÇþ‰´¢ø(—üž÷í/ÿe?XÿÑ6”Wt>ÿ†?’3?½ÿÈZÓþÅÿêáúþokŸù>o_öOþé—Æ5ý!x¿þBÖŸö+øÿP¿×ó{û\ÿÉó|zÿ²ðÿL¾1¯? þñSü3ÿÒâi/‚?/ÉžCEW¤fjhòÑÿì)§ÿé\5ý_x4k®¼Toœâ_x—ˆÊ«å9–#‡ñxGƒ… N70¥…Ž.¶QJ2©†­–#¥‚Èòê§‚§‰žgòX¾á|§?ÄñFiG‰¡„¦°9mN_GJ¼+ή„•HáÞ:îXÕ:'[ŠŒªW­„ù5漺šêûRº–ûTÔ®îµ-VþáÌ·úüïu}yq1Uy¥žâY¤q½‰"’Š+û-˰yF_Êòú1Ãàrì% „Q¥‡ÃRPVJíB ïy;ÉêÙò˜ŠõqUëbkÍÔ­ˆ«:ÕfÝܪT“”ž½Ûv]^ŸðGþK?Â/û)þÿÔ¯I¯0¯Oø#ÿ%Ÿáý”ÿÿêW¤×\þ †_“2ŽëÕ~gôûRÿÈ™ûFرñ{ÿM^!¯¬?`ù1Ø£þÍ#öoÿÕ9àÊù?ö¥ÿ‘3öŒÿ±câ÷þš¼C_X~À?òb±GýšGìßÿªsÁ•Ë„ÿ—ßõñþ¥Khz~ˆúÞŠ(®ÂŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( _Çò%ø¿þÅé¦î¾ñÇüŽž/ÿ±£Äúv»¯¼ñoˆü«ÝiRÜO¦\ê~Ö/4KùôÙ®ílnæ°šîÆY,庲³¸’Ý£y­mä-}GeûEh~øQð¿Â–CûoÄžøM®¿‚oL»’†uŸŒ¿£»Õ´½JöóL}ÍøQñ+Lñý·ˆ<öT|^øyðS»Ô ?u=)=kÇßô8´Œ_Ó^_ ëßÿkËŸWW-Þ“§ülÐÿk?kß |Gâm"ïÄ+¢ßéÚÁiúLjî4Å×wÞ'ñÇ…¼â /Myÿ zFgǾø2þ%ð.Ÿã«Ï‰? |¿âßxÂZŒ¯|_¦êž(ñ'„ôk´Õƒ5OxfÂEñ÷†¬¢×¾ xÏÁÚ­ÅÍÕÞ±©éz6}ªÁä:–‡{áý_TÒu"ëD×´«ûÝ+ZÓ5->]7WÓu;™-µ7T²º†Ë;û;Èe·½³»Š;‹{˜¤ŠxÒXÙGÑzøqâ¯^ ð¿‰~+è>Õ|ñgâ狵 ÷Ã>×üO­xcÆ>ø§iÒø& Ã> Ôµén|âK;M'Æ<ðŸ& 4ÅÔõýJ½›Y²÷þÑ~Õ¼O­xïRñwü*» sö•ø‰ñŸãGÃMÞ2Ôÿá||&ñ®¡à­cOø)çøOÃ>ø…ý‰ñ3@þÃøÇ'¼ÿð²·ÛßEaâ6‹L= Ó¥R­ 5gBn¥ Ô§ ÎF¹\éJQnœÚÑÊ2¶—±q©8)Fœc5Ë58©Æ÷å’M)+ëgusóΊû÷Ãßü7áSà¿‹GÅ«ù~ø ÿörÔölÒ¼5¯êú¦‰â¯…×.>&xÃMÓ*Icâ‡Ú_ÄoÛÅ©ø×âìY¨ØÙøCÅŽ•áÏKa{à…>>VÔµÍ'ÁW ªi>!ðÙÒ¯4‹¯ kþ7؃à*+õßö“øQŒ¼_«i¾%Ð[[‡ÇŸ´g†þ ø»ÅvŸt=áwÂCÅŸõoƒZf¯ü)'Åÿx×Á^ø×áx?á”°Oá[¿ßè÷†´Ox×ÅRÝa?íAá1âÏ…ÖÃź ‡…oÿi]O[øú¾ðwŒ¬4?|,¿ðoìÏá_FçÅ—.ø‘ã¯üK¼ð?Ä}OÆúŠõëÿ|c»°°ñÇÅ¿ØxªÿCÐôpÏ?øg\ð–¡o¥x‚Ëû>þïAð·‰­àûM¥ß™¡ø×ÃGŒ¼3{æÙ\\ŸÚ~×´KìÏ"ÝÙý¯ìz…½¥ü6°ö?ä³ü"ÿ²ŸàýJôšú»Eøïá»Í`êWŸ¯ü7¤Ùçà¿ÃØô»Ï kúα¤Úü.ð-¿„üQà=(®Ÿ«øw]°ñ7ô9¼a'À¿ÛÜþÎ_ü ã½H|WñŸÂÏŠZ?‡õ? |£ðGþK?Â/û)þÿÔ¯I©ŸÁ/ðËòcŽëÕ~gôûRÿÈ™ûFرñ{ÿM^!¯¬?`ù1Ø£þÍ#öoÿÕ9àÊù?ö¥ÿ‘3öŒÿ±câ÷þš¼C_X~À?òb±GýšGìßÿªsÁ•Ë„ÿ—ßõñþ¥Khz~ˆúÞŠ(®ÂŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( _Çò%ø¿þÅé¦î¾ñÇüŽž/ÿ±£Äúv»¯¼·¢Š+°€¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(—ñÇü‰~/ÿ±_Äúi»¯ƒüqÿ#§‹ÿìhñþ®ëïÈ—âÿûüAÿ¦›ºø?Çò:x¿þÆéÚî¼üwÙùíæÿä¿öÓø.ÿ‚‰Éï~ÒÿöSõýiEðQ/ù=ïÚ_þÊ~±ÿ¢m(®è|ÿ $fz>/ÿµ§ýŠþÿÔ/ÃõüÞþ×?ò|ß¿ìŸüÿÓ/ŒkúBñü…­?ìWð?þ¡~¯æ÷ö¹ÿ“æøõÿdÿà'þ™|c^~ýâ§øgÿ¥ÄÒ_~_“<†Š(¯HÌì¼ ðûÆ5ÏøF¼  ]ø—^6’ß&•`öËw-´Á ¯w3À'd’æa„¼ÅY¤˜ã‘Óןö\ø…aj²xŸZø{àGðïŒ|ec£x‰|™ÌbÒÌSÉ~òæ9"L{ç)2#¬w ,Kû(ëRiÿBŠÆ;Öøƒà|:/,â°Å^¿µ—PÛÜyïq2Gò•žU’I8Þ ¿a~øçÀ¾Ólµx{ÃÚ ÜÛG2ÜYhÚm…ÛGuìÍ%¼)+M"HDæIY™ŒŒòÉ»yý„8&§åù†?ÖytèR­AJkžx‡^QåäŒ%ZtSsç­ê(òs|—xâvú¹%,v¶)g’ÇÆ…XV§B€X78Öœ¡VMÕúä}œaNíS¨ï¢¿äOŠ¿f©ü9ácÆúß‹õ7H°žòK¤øQâ]'EgŒ(Ž6ñ.³{e¡É y"ó§ÓnõGŠ'ݽÌí ´Þ%{ðÓâŸs%¥ßüWñË¢h:”ê±$ÉûÛ{ibbc‘KrQ‰G êÊ?v?i‰6Þ5øeãÍ\$Òj¾×´û|1Ø—é—"ÖO)%pŠé¢Çæ*JL’,bF¯ž~>þؼàÝxGøköß›5OkZ¯Ú´{y4‡Õ­®-ZïT¶ðäæÖÓÍ©hZ¤pÛÛEäÅK}Ž?ÂØË“*xY嘬u\d+J®2¤pÑ…xz‘Ibi×—º¥Uþê1“QåTªÊQQäðãÄê|yþ¤)Q¥£„¡Qr©9RÅRœ¡9ɸ§)N•X¤¡D¥gv~;QPxËÆž?ñ/Äí9!k“©'—¤Ÿ´Ðto†_ ômcT—PŸÁ7е8eû†5}Vê×Ã7ú<æ 9ä¶Öc–ð¤—-k§‹Ë³ùð[Å{)Ž9|âÓIð÷‰_¼SáÂzNâsiã.é¬tí*Æ÷RÓ5{ K^þΆþÒVÂëDšâáî$Žh'Ó¥€2¯©~Ó|Uá "WGðž»âš}Ý—ˆ¼Ca}£_i sa$w׺¦‡egz¶¢¦òmÚU§ü á”}ŽæîÝ„’Ô<@ñ«—b!V®çW-ÂË U•_…J£RR ãîÒr—:ŠK_ÙsvøqáG øoƒÆáxz†9×Ì¥„Y¦c˜ãªãq8ß©ûeƒ•Uû¬QŽ&¿»‚Âai·QÊP•—/„x¦ÊöˆþÔ%ðtþÓu¯xÖÿD¶šÔY BÂ-wÀZt·ÑÂì·S‡¾±ºóõ ÛkË«ÃsͤWÓÕª)­y¨K®øŸ_ÔXÕœê{´Ô!)ÉÃÚÊ2ª¨ÐŒÕ ¬Rƒ¥JÜ”œ9×4bâš•IÍ+6ÝÒ’‹–œÍ9(Å>TW§üÿ’Ïð‹þÊ€õ+ÒkÌ+ÓþÿÉgøEÿe?À?ú•é5óóø%þ~LÖ;¯UùŸÐíKÿ"gíÿbÇÅïý5x†¾°ý€äÄ?bû4Ù¿ÿTçƒ+äÿÚ—þDÏÚ3þÅ‹ßújñ }aûÿɈ~Åöi³þ©ÏW.þ_×Çú•-¡éú#ëz(¢» (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€9È—âÿûüAÿ¦›ºø?Çò:x¿þÆéÚî¾ðñÇü‰~/ÿ±_Äúi»¯ƒüqÿ#§‹ÿìhñþ®ëÏÇ}Ÿ—þÞiþKÿm?‚ïø(—üž÷í/ÿe?XÿÑ6”Qÿÿ“Þý¥ÿì§ëú&ÒŠî‡ÁðÇòFg÷£âÿù ZدàýBü?_Íïísÿ'ÍñëþÉÿÀOý2øÆ¿¤/ÿÈZÓþÅÿêáúþokŸù>o_öOþé—Æ5çá?Þ*†ú\M%ðGåù3Ïü-ásƾ'ðçƒ|3eý§âOëÚG†|?¦ý¦ÒÏûC\×µ }+I²ûf¡qiaiö»û»x>Ó{umi™æÜÜC <Ši×5í?Å:®“eö»h6þ&ñ4ÿi´ƒû3C»ñ?‡<o{å\ÜC5ç™âOøMû6ŸÝÚh}±íÖÂÒöêÛÒ¿fýWLпh€šÞ·©Xhú6ñ£án««êú­å¾Ÿ¦iZfŸã îÿRÔ¯îä†ÒÆÂÆÒn¯/.¥ŠÞÚÞ)&šD‡Òº—Çx—áía§ÞXi~.øÛð×Ã?þ/-åûÅqâŒÚǃDF•i©ØØÚM5¥Æ²[ø mt[]3ãv¥à©ô—Ó¾ iWðzFgÀUôÇ‹´ÿÚÏÂ>¼Õ®>+øÇÃöz5–§ø—@ð߯ø·ÄÞ ¶ŽM@±_ü-ïŒ ‡Ã.oøKu=É6ÿj4ø{¦jºWƒôO¿ñO×¼á¸5=KQðï†ä×|áøK¡³ð׉õKû¯ZégŽü'à]sö”×þ3xóÆ_ n¾øëö†\G¦üFÑõÿø›á¯~*G¬_Á'€>jÚ×Å__ÿ¿ÔuM{U‹ÅÚ‚¯ô$Ó/<==Õįø_WèÃbñ89º˜jÓ£&­'¤–éJ.ñ•Ÿ½dùd”£i$Ò²vºNÎêé5÷4×߹𶱫⫽;SñÏŠüaãí[L¼žþÒÿÅÞ%Õ5c¹’_:ÃöóÙøN°—ió[h\ZÊN“íme‚Õ~†\xAð—€ücâÛþÍW´Ÿà?ÿbÛøgÂß³W|'‡îþ,þËö^ û†|¤kßõ?&™sûD½Ï—¤ÝüN³ðšÜj ò=]ü'Óg›ß|>¿øïàï†×^"³øþÓþx?ãì¢|)ñ³7Ęÿá]ëWú†|gñ[HÑ~/xéµ/|C{ëÛ ügâ]ONÒb²x¬n/QUÆbkbjF œ%Z¤§ÉN? 8&í+¶¡¢›n×m‚I+$’»vI$›wvJÉ]öGåM_Ô´­OG¸ŽÓWÓoô«¹¬4­V+]JÎâÆâ]3]Ó,õ½Rލâ‘ì5P°Õô«ÅSo¨i—Öwö’Mis ¯ú7£h_¼Kñà›ÿlüÐtß|wð¦»ûB\뺃ô jPkÞý™íüS£hÖPÃ.ãÏê_¼5ñßIÓ´ï†Ú~½ð‡Àz~¯7ˆ.¦ðGÁ{Mñ4·¼3ã/†zýëëSé? |oâËo‚ÿ²§…|o­ø³ömøt–Þð_ÂKÁÿ—ÄZ—í ðçÇŸîü[¤üUð÷‡t{+ohÿu/&ªü:×$ø/ÀÕ9†~c×§üÿ’Ïð‹þÊ€õ+ÒkÑ¿h[áíݯÂÍ7᎟à=;ÃvÚÄÝZk_¤Zž¡iw¬~п`дÿxËYðÿ‡þ%x—ì? t‡‘øi>%YØk–ž}7UOè3x‹QŠïÎ~ÿÉgøEÿe?À?ú•é53ø%þ~LqÝz¯Ìþ€¿j_ù?hÏû>/é«Ä5õ‡ìÿ&!ûÙ¤~Íÿú§<_'þÔ¿ò&~ÑŸö,|^ÿÓWˆkëØþLCö(ÿ³Hý›ÿõNx2¹pŸòûþ¾?Ô©mOÑ[ÑEØ@QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEËøãþD¿ÿدâý4Ý×Áþ8ÿ‘ÓÅÿö4xƒÿN×u÷‡Ž?äKñýŠþ ÿÓMÝ|ãù<_ÿcGˆ?ôíw^~;ìü¿öóHò_ûiüÁD¿ä÷¿iû)úÇþ‰´¢ø(—üž÷í/ÿe?XÿÑ6”Wt>ÿ†?’3?½ÿÈZÓþÅÿêáúþokŸù>o_öOþé—Æ5ý!x¿þBÖŸö+øÿP¿×ó{û\ÿÉó|zÿ²ðÿL¾1¯? þñSü3ÿÒâi/‚?/ÉžCWô­WSеM7[Ñ5+ýYÑïìõ]#WÒ¯.4ýSJÔôûˆîì5-6þÒHnìoìnáŠêÎòÖX®-®"ŽhdIXP¢½#2þ«ªêzî©©kzÞ¥¬k:Åýæ««êú­åÆ¡ªjºž¡q%Ýþ¥©_ÝÉ5ÝõýõÜÒÝ^^]K-ÅÍIJM4#³Q@_³Õu=>ßU´°Ô¯ìm5Ûô­nÖÎòâÚßXÓ!Õ4Ýn-7U†=BÂ-gGÒ5xìîÖktÕ4­6ýcv6²ÅBŠ(¢Š+ÓþÿÉgøEÿe?À?ú•é5æéÿä³ü"ÿ²ŸàýJôš™üÿ ¿&8î½Wæ@_µ/ü‰Ÿ´gý‹¿ôÕâúö!Ö4Ÿ þÅß²…|UªiÞñ?†¿eÿ€>ñ‡¸¹¸ðæ¹½¼æ™4óÏ6™uPÃwM$²Ë#*G+;»PX_xãþGOÿØÑâý;]Ñÿ Ç?èoñGþõoþK®ry纞k›™¥¸¹¸–Iî.'‘æžyæs$³M,…¤–Ydfy$vgwbÌKkž½mm-kt¶×ó}ÊŒmøþ6ýQü(ÿÁD¿ä÷¿iû)úÇþ‰´¢ø(—üž÷í/ÿe?XÿÑ6”W­‚?áäŒOïGÅÿò´ÿ±_Àÿú…ø~¿›ßÚçþO›ã×ý“ÿ€ŸúeñH^/ÿµ§ýŠþÿÔ/ÃõüÞþ×?ò|ß¿ìŸüÿÓ/ŒkϼTÿ ÿô¸šKàËògÑEé–lìîõ»]?Oµ¹¾¿¾¹‚ÎÊÊÎ nnï.îeX-­mm WšâæâgH`‚ye•Ö8Õ€?cøkö2ñ>»àËÏKâ›9.maûSéÞÒ×Åtý’Öéà¾ñ ëU—Ûm‹ÞÅvtx5½1d$‡Z¸Yȇá|AÖ~x?Å^;ðýêéÚÆ“¤Ç§[_0Û[ø»UÓ|«,á¿pØO 3Nᥚp]˜ðGúÅBõ¨pçá§“RË0œE,jËòŒ§œÏ8Up8ÌNoÏŒ†Y™a0ôibaN©ü©ãW”øŠW G> Š–qŠÎe‚Âcjb*bªV<.Ž*ž*“XJ4=¶#ÚaeV¤ñ£MF)Ê®M·À ¾º‹Àþø‰â-.ÆÖK‹½{Pð=ç‡ôE,’Ë$:ã_j~šÐÂ"û<Ç]ŠæêáÞÞ"V).5áýžüX·0jïƒ-§¹ko¶išgˆ ñGˆôèæ0™„ÞðÂjº¤·ë2þê(ŒS>w>S ëôÃ៊>üaÂ_üI iþ)ƒ_ð?ÃÍGJ·ñR6¹ieŸàÝÂÚ„éwóßhðľ%ðïˆPÁglöË)xTË·÷ÿoËñ+Ã/†ÛIдB±(z>Ÿ§i–­„d­,a¶Š2eP@Æ@'qY÷æ˜YN7ÂO˜SÂÐÀçÃT©†…\Ï '†Ìq^ÂQ­õZ•±Têó`¨Ö«G âéÒ­R+õÐñë’a19~+Šâl~*ô³œÃ–d±Æá±”)c05!„ÊáZ‹¡,=js£US¡V­9ÅÔ£ )7üÎø»ÃËánÿFIïîNwq§Üͨè×:ÿmµe3"éwó>¥Bm¥_í+m>ð4ÍÖ0¼M»˜¯ ?j Öþ<–†ÒûS±Õ­Yq»þУ¹WÚˆ¤­íË71ûÒ$ ‰óý|'ä´8{‰³,£ ”èá Â&êN/—a1sNoV¹ëË•;¸ÆÑm´ÛþƒáŒæ·B4ôoÙ¹¸]¤ïtž^ŸðGþK?Â/û)þÿÔ¯I¯0¯Oø#ÿ%Ÿáý”ÿÿêW¤×ÉÏà—øeù3ÞŽëÕ~gô£ãù<_ÿcGˆ?ôíw\½u8ÿ‘ÓÅÿö4xƒÿN×uø¿ð×EÕ~%ÿÁ@k8ü[àÏÛ_Å'ÃOڇᮟொ> ý°|eàÙWáf• ~IJgÅ‹O‡^-ýžôÚïÀw~+þÛøƒ¯ëÚνciû0|Eðo‹o>'ZZx×XÔtFñl>ñ\o*šÛ•Éô×Þµµk¿¯dÍ–ÑôGëÅüåþÏðSoøsÃÃÁ~(üWñÇ=oáÅ…Ÿ ügãÚãã͇Á¿‚Úü?þ cãŸxSPøðgöký±þ=xƒ[‡â'íC£jiâO|Ò<'ãïëÿ<}ñâ?†¾$ø‡EÐ>$þ®üOý¬üeáþÈ~%ø{û;xÛÄÞ6ý°¼m¡xÃ_ þ(xƒJøã/…Z¯‰¿f¯Œ_´$|f‡U°ñgü#ð©oüeдH+øÛÃ>ø]ãÒTå®·Ù¶–Êï®–³»ÛM]~_­ù£íz+òâïüZÛáOà âgü)¯øK¿áÿ…ý7íUàê_> xËàÖ•û5ü[ñ÷Á_øŸÁ²ü#ý•¾&ø'SðOŒümðWã¢|ñ×íWã?Ø“Á¿t¯‡çPÕõßÿg|Y‡àéâø)ŸÄo Û|Kñ>·û7x$ü>ø{ÿ Ýñ=WJý¡5Ûßk?³—ükãÅßÀ_ÚÆOá¿ÙëLÑ4Ïšž·©ø]ø ð]|u¨øâ•¬øºˆ_´Á{¿hÉã¥ì§ü»¶–©]­Ò×Ëî×`æ]û~6·æ×Š+ò÷À¿ðP¿|Uøñão„_ e¯k~°ñ·í ðÀ5½ö•ðçƒfø·û<\üGðÞ·qñâ;~ÈúŸìÛðïàŸ‰þ#|&ñW4ˆ? hÏÚâ|:¯ˆþYêÿìû3üý¯?ioƒ>ø©áïø(ÏÁûM_Äžø]âxFý’ü)âýGáOо&ü$ðÆ{?‡ž,¼±øÿ§ÜÙø‚ËÁ?üâhuÃúŽ­á_xgÅqhÖšGˆô·›Ú¾7Éø»ÿdÃÇßúŠjÕÌÁä~ÑöR?bŸýrü†½ !(Ïš•¤­Íí§šdMµk6·ýãþ#öæÿ¤ˆü?ÿÄÑú!¨ÿ†ý¹¿é"?ÿñô_þˆjý~¢»=/ùõOÿùÝ÷{? á‚?noúHÃÿüAýÿ¢ø`Û›þ’#ðÿÿEÿ膯×ê(ö4¿çÕ?ü?ä}ßÞÏÈø`Û›þ’#ðÿÿEÿ膣þ#öæÿ¤ˆü?ÿÄÑú!«õúŠ=/ùõOÿùßw÷³òþ#öæÿ¤ˆü?ÿÄÑú!¨ÿ†ý¹¿é"?ÿñô_þˆjý~¢cKþ}SÿÀ#þAwÝýìüÿ†ý¹¿é"?ÿñô_þˆj?á‚?noúHÃÿüAýÿ¢¿_¨£ØÒÿŸTÿðÿ]÷{? á‚?noúHÃÿüAýÿ¢ø`Û›þ’#ðÿÿEÿ膯×ê(ö4¿çÕ?ü?ä}ßÞÏÈø`Û›þ’#ðÿÿEÿ膣þ#öæÿ¤ˆü?ÿÄÑú!«õúŠ=/ùõOÿùßw÷³òþ#öæÿ¤ˆü?ÿÄÑú!¨ÿ†ý¹¿é"?ÿñô_þˆjý~¢cKþ}SÿÀ#þAwÝýìüÿ†ý¹¿é"?ÿñô_þˆj?á‚?noúHÃÿüAýÿ¢¿_¨£ØÒÿŸTÿðÿ]÷{? á‚?noúHÃÿüAýÿ¢ø`Û›þ’#ðÿÿEÿ膯×ê(ö4¿çÕ?ü?ä}ßÞÏÈø`Û›þ’#ðÿÿEÿ膣þ#öæÿ¤ˆü?ÿÄÑú!«õúŠ=/ùõOÿùßw÷³òþ#öæÿ¤ˆü?ÿÄÑú!¨ÿ†ý¹¿é"?ÿñô_þˆjý~¢cKþ}SÿÀ#þAwÝýìüÿ†ý¹¿é"?ÿñô_þˆj?á‚?noúHÃÿüAýÿ¢¿_¨£ØÒÿŸTÿðÿ]÷{? á‚?noúHÃÿüAýÿ¢¼çÅß²?íÉáKÙ`Ÿþ ð­,áµÒ%’ûRýŒ£µÝs¬M¯¥µ¤6ºGÅÿÊû"ðõÜÒO)‚1¾8À-‚߸•ò'íAˆî¼9âË_jº&…âëÃx[\ñ/‡ïüYáÍÄsX|ZCÕ|Aám/ľ ÔüK¢iÚ›ZÝê¾Ó¼cá;ýfÂôëOèW1ꖸׅ8AÊ4馯½85³zû¾]5*-·«}:¾é~§æ'ü3×í¡ÿIø/ÿˆm­óuZÿ²ˆþ!ø¯Ãß´õŸÅ‰ßñ_ƒd¿ò„0ø>Çâ%Äù> ý»ûÿÈ7öüÿ´ƒjÿú¥¼\mÞ5£Fê7Nœ!Õ7ñ%¾‰èÿ«·Åóo¼Vß7ÿ cëj(¢¹K ùsöÀ×üu¡|%ð­ŸÃŸˆ øWâ_ˆ´ÿìCðROˆ>Ò| ­ø«Âþøûûi|ø!ãýCÃ:Äß|Aðx¼ñĶº5׉üâ];MÔn-µ#¥\ÍiQ×ʶ/ü“ÿ‚¿öÿðK_ýyì—WI'Vši4êA4õM9+¦º¦'³ôaÿ Ãñþ’ûÿàüCÿ¥—Gü3ÄúH_íÿÿ€ðMþ–]}_E?k.ÔÿðM/þ@,¼þ÷þgÊðÌ??é!·ÿþÿÁ4?úYtÃ0ü@ÿ¤…þßÿøÿÐÿéeÕ/ø(/‰|Gà¿Ø'öÝñƒ¼A­øOÅÞýÿiOø[Å>Õoô/økÄzÁŸjšˆGàŸøM¿á ÿ„ÛâáëËÛèuß è_¾ iþÖt/øKõ¹®î2”­ü;¶Ò^Æ•½Ô›»äÓ}4 i.ÿøêÒ]O¿ÿá˜~ ÒBÿoÿüÿ‚hô²èÿ†aøÿI ý¿ÿðþ ¡ÿÒ˯†þ3þÙ¶oÁˆ û-ÚøkáwíûExË[ø?€|{ð—àëøÚ‡>1xöæñ楥^þÏÿm? éž3Öü!¦~Àþ1[Ÿ]þÚŸì5 ‹Ún§§xjóXøFêk‹Ïë,Û·3†iäÔuq¥\ë:æ“t'µMoÂz熵kfký>ÞæÏKK-ÇòoöÜøáÍÅZ‰´–ÒâKN¸–òâk‹Ë¨o´í ]Ð5+»‹‰®¦½•¤Ôõí ×PºžK«¶ðúÄÏ; ý+Þ:pFi:Y]NþÃÆKšc1Uå%ŽÀà'Í+׆_„‚¥—J·%LKTkÔ§jΛÁé(Ãñ¬ãè«O7âÌFwŽâìeþËÈ2ì.G•a!†Æ×y.KÊ}¾'1ÄÖÆR£J¥,.|=,j•yªTXº5Z‘ó|N|_â{­i#há{[{`f‹™g¶–é%šA “CäÉ·6¬&’VˆnœC!6ñqÕêÿ4-@ñ]Õž† €$òÇs§Û¸ÛbSÛ+ÃÑ´‘\±WdФLÛî…ÔÒùE x™æyÇgY–p°+0ÅUÂʲ˩ʎ B -,2¥Jr”¡%…§AVR“~ßÚ;»ŸÕÜ1‘e¼3e\?”B½<³)ÂCƒ†&½\UxѤ䒩^¼çV«ærjR“²iE(¥W§üÿ’Ïð‹þÊ€õ+ÒkÌ+ÓþÿÉgøEÿe?À?ú•é5ñsø%þ~L÷£ºõ_™ý(øãþGOÿØÑâý;]×øWá׃|®üKñ/†4ìÍoã¬>"üE½þÐÕoá"ñ–™ðçÀ lu³j×všO‘ðûáw|?ýŸ¡A¦iRÿajÍc&·©ë–¡ëÞ8ÿ‘ÓÅÿö4xƒÿN×uËׇ?Š~r•üõ¿æm—¢üŠ4Ïø'ì›áß iðo|mðêÓAÿ„vÄ? >=þП þ#iúW…þ|ø§øbßâÏïŠ~ø¢¾ ¾ø]û>|ÑüQàSãðoµß…~ñ-{âc☾†—à¯Â¦‡à­¥¯ôMLý5¸|AðGCðÔSxWß/í~xãàŒð߆æÒ´Ñ4ß…ücàí+ÃWšuׇ4« R ­;JµÔômûMõ)9Iï&ý[{èþõ ì»|@ÿ‚xþÉ¿ô/økÄ>ñ¶—¢xÓþ¼?,¾ü{ý¡>ÂÎÒ¾6|Fø‰ñkâ'†>+Üü(ø§à»¿Šž ¿øƒñw⿈<=à_ˆ“ø›Á¾ÿ…›ñJø¡x_DñˆtÝG¶Ö¿cÙ«ÄZ‰<5¬|6ûf‰âïþÖŸ¼Ceÿ ­ÿ´<ûsüFÓ~-~ÔÚ?Úm|Sݧü-ˆ:NŸâí íµ_ýŸû+áÕ÷„tIgÓeú†Š|Òþihîµz7»ßv+.Ëî>^›ö6ýŸäñ—‰üu‡|m§k~(ÿ„êíltOôø'Å?´­wGø…ñ;àçíâ6ŸðûàGÆÏÚx·Çkÿ~ øcÀ?õ Wâ/ÄÝvo¶·ñ/Çš‡ˆ¾¡¢ŠM·»nÛ]Þà (¢Q@ñgJÔõß…4MM¿Ö5cáÿŒ´­#HÒ¬î5 SUÔõjV–n›ai×w×÷×sEkggk·7Ç 1¼Žª}?þ ¹ðUý”þê>;¹ñCøßâݯìáãŸx;þ׈×þwоþÁß²ì‘âÂC£¿ˆ´yZ¿ìÏyâ¯øJt§Ót×ÿ„«ûÆÓPµÐâñ&½ÎkzΛáÍWñ³sö=AÒõ gV¼òn.>ɦév“__\ýžÒ)î§ò-`–_&Ú ®%Ù²¤‘•Æ¿ðò?ØgþŽKáÿý÷­ò¢º°õjSŒ•:N¥ÝÛJNÚh´L™$íwoé¾ßð—é?óéâü!üiÿÊ ?á/ÒçÓÅøCøÓÿ”øÿ#ý†èä¾ÿßz×ÿ*(ÿ‡‘þÃ?ôr_ÿï½kÿ•ÑõŒGýËÿŸùËæ_zþ»ÿK_ßoøKôŸùôñGþþ4ÿåð—é?óéâü!üiÿÊ ü ÿ‡‘þÃ?ôr_ÿï½kÿ•ÃÈÿaŸú9/‡ÿ÷ÞµÿÊŠ>±ˆÿ yà3ÿ åó/½]ÿ¥¯ï·ü%úOüúx£ÿò‚øKôŸùôñGþþ4ÿå~ÿÃÈÿaŸú9/‡ÿ÷ÞµÿÊŠ?áä°Ïý—ÃÿûïZÿåEXÄÐ<¿ðÿrÇù—Þ¿®ÿÒ×÷Ûþý'þ}ž(ÿÂÆŸü £þý'þ}ž(ÿÂÆŸü ¯ÀŸøyì3ÿG%ðÿþûÖ¿ùQGü<öÿ£’øÿ}ë_ü¨£ëú—þ?òXÿ2û×õßúZþûÂ_¤ÿϧŠ?ð‡ñ§ÿ((ÿ„¿IÿŸOáãOþPWàOü<öÿ£’øÿ}ë_ü¨£þGû ÿÑÉ|?ÿ¾õ¯þTQõŒGýËÿŸù,™}ëúïý-}¿á/ÒçÓÅøCøÓÿ”Â_¤ÿϧŠ?ð‡ñ§ÿ(+ð'þGû ÿÑÉ|?ÿ¾õ¯þTQÿ#ý†èä¾ÿßz×ÿ*(úÆ#þåÿ€Ïüƒ–?̾õýwþ–¿¾ßð—é?óéâü!üiÿÊ ?á/ÒçÓÅøCøÓÿ”øÿ#ý†èä¾ÿßz×ÿ*(ÿ‡‘þÃ?ôr_ÿï½kÿ•}cÿ@òÿÀgþAËæ_zþ»ÿK_ßoøKôŸùôñGþþ4ÿåð—é?óéâü!üiÿÊ ü ÿ‡‘þÃ?ôr_ÿï½kÿ•ÃÈÿaŸú9/‡ÿ÷ÞµÿÊŠ>±ˆÿ yà3ÿ åó/½]ÿ¥¯ï·ü%úOüúx£ÿò‚øKôŸùôñGþþ4ÿå~ÿÃÈÿaŸú9/‡ÿ÷ÞµÿÊŠ?áä°Ïý—ÃÿûïZÿåEXÄÐ<¿ðÿrÇù—Þ¿®ÿÒ×÷Ûþý'þ}ž(ÿÂÆŸü £þý'þ}6|#ñ'Ácãív>)xwÂ^'Õ<1­ß§‡µ_„ÚŠd:§„5wEŸÈÖ´-^È(½†øÃooys§ÙG}låÿðò?ØgþŽKáÿý÷­ò¢¾‹ø;ñ³áoíá½wÆ?üacãï xk\±ðγâ×SHµñ£asª[è±ßj6v÷º”zm©¾¾´°{©´»[­2mMmWÒææŒel4©¦¬åûÎÍkÍu¥ïÓÔz6½äþîéôôþºúQ\Å…|sûrøƒAðŸÂ†*ñV·¤xkÃýº?à˜þ ñˆüA©YèÚ‡ôþ Eû(ê:Æ·­ëŒÖÚ~•¤iZ}µÅþ¥©_ÜAgcg×WSENëö5axŸáÃ/ŽþÖ>|cðWƒ¾"|6׬.5ø7ÇÞ ðÿÄ? kPxA4õÔ¼â˜åÐu™lµiú––º‚±Õìì58+«(%K¦íR×´âít¯i'k½û½õOÑŸÃÈÿaŸú9/‡ÿ÷ÞµÿÊŠ?áä°Ïý—ÃÿûïZÿåEuÿðì¯ø%—ýì¡ÿˆOû:ÿñº?áÙ_ðK/ú2/ÙCÿŸöuÿãu¯-Õ?ðmòåå÷KËüÿ[rðò?ØgþŽKáÿý÷­ò¢¾C¿ñ§üª×à·íð'ᇈfïÙëÂ?´ÏÂïü%ø­¨þÏ ¼!ð›ÄzχÖ~ xNÃĺ_…¾jº~]3Qø]á­3Æž1Ó¼?à »Y¼'£Xx³Ä¶šv“mo®ê‘Ý}ÿÊÿ‚YÑ‘~Êø„ÿ³¯ÿ£þ•ÿ²ÿ£"ý”?ñ ÿg_þ7Gîéî÷þ5-ûí¾‹î{Ëî~_çøzÛÿ‡‘þÃ?ôr_ÿï½kÿ•ÃÈÿaŸú9/‡ÿ÷ÞµÿÊŠëÿáÙ_ðK/ú2/ÙCÿŸöuÿãtò¿à–_ôd_²‡þ!?ìëÿÆérÐíSÿÑÿ ¼¼¾éyŸáëoˆ¿noÛ›öHø¡û$|wð€¾;øÄž/ñ'î-4- Òâþ ½Nî û ×¶¶{Û [v¸k{YšZe’æE[{u–âX¢­àš¿òŽoØ þÌ£öVÿÕàJµâŸø'_ü—Â>ñŠõ/ØwöZŸNðÆƒ«ø†þØ“öp–ök-O¸Ô®¢³Žw¶‚K© ¶‘-Òk›xžR‹$ñ!iÚÿg}sÞ&ýŸ¾ø“ÁÞ Ñ>xGÄ~kžøqá¨l-ü9ðÿÚ·‚´KýÁ>·Òô½LƒDð¦™qk¡iPéÚ&a…„ i¥éöë¤*£Š¤£ÉGÚ6ܧ j╽Ë[Dž«æ {½íµšÓG×Ôþ.?à¢_ò{ß´¿ý”ýcÿDÚQGüKþO{ö—ÿ²Ÿ¬è›J+ׇÁðÇòF'÷£âÿù ZدàýBü?_Íïísÿ'ÍñëþÉÿÀOý2øÆ¿¤/ÿÈZÓþÅÿêáúþokŸù>o_öOþé—Æ5çá?Þ*†ú\M%ðGåù3Èky<-ây5Í'Ã1øs^“Äš÷ü#ÿØ~M#P}sYÿ„¶ÓOÔ<+ý“¤­¹¿Ôá&°Õ´«ßýŽÞoí›MOO¹Ó~Ó å³Éƒ_°~×~§ÇïÙkÄÚ¦ ¿Äh?±7Â}#ÃòéÞm?Åÿð´þüÔ<9ñ+\Òn&ö¿¯|9ÐuŒ–Wž2µ¸´ÿ„CÄö?²}µ†¨ÙÚø¥ßÒ3?+zÛÂÞ'¼»ðΟgáÍzîÿÆ¿gÿ„6ÊÛHÔ'»ñoÚõËß ÚÿÂ3m»Í¯}§Äšf¥áû줻óµÍ>÷Iuý¤öñý 'þÃðÏâL¶Ö^ê u/Ø^I¯_¦©}ûIhÿ´•¯jöÖ~mLj6Wì¹®è’êZô:3ü3±¸Ö4­>ëS‹âf¡ik7Ö_u]3Åš¯ü¯á^¿©Xh·zþñ_áψ5{Ë{ËS²ýª>8ÉñÁ­æZI%ÿÅ]ÁÞ ƒÂWÓÿoÜ[øëÀ¾ðf¢é–ŸøûB×¼k¦ø3ÁÏÅïžøoà¿íK?x UÔ|⃾:øâ?ÇðÚx\—^øƒðæÃÃ>•ñc¿|Yñ+ãOÄO-‡ƒ´Åý¡¾*èúÖ·¥[|AÖ´ÍO@øáaàxgo‰zlVúæ¡&±`ú4_¿j›9ü2óøoÇÖþÀÁ¼?áˆß -aõð¹îi‚‡&N›åäö¯ ƒ©ˆQååQXš˜yâŒt‚UW&ð³3t¡-ã~¶æ’_rvüÌ—w–If–I%ši$ši¥w–i¦•‹É,²ÈZI$‘Ég‘Ù™˜’Äš»•©Í¦^kqi·òèÚ}þ›¥_êñÙÜ>™c©ëú­Þ‘¦Þ_¬fÒÚÿU´Ðµ»­6ÎiRâúßGÕfµŽXôû¶‡ôoJø ðãþ Ã6ß á'¶µñç†~þÓ þÓñõßü3 øcðOOø¥ñ+û[ÃÞ$²ðÇ…·|Q×~?ÞÿÂeñ>߯¿o¿áV}§ÁÚsø3ÃÞ!Md ,>ø«ÃW:ƒ¡XAÿ â ?LÔ¼Eâ-#þ)øÏöZøÝñ Óâg5oÝÍà]Ä~$ñeí…þ¡á“áOÁ§éú'‡®5o…·ˆ>5x?Ì«V­z“­Z¥JÕjIÎ¥Z³•J•''yNs›rœ›ÕÊM¶õl´’I$’Z$•’]’[šµéÿä³ü"ÿ²ŸàýJôšóýWJÔô-SRÑ5½6ÿGÖt{ûÍ+WÒ5[;?TÒµ=>âKKý7R°»Ž»û¸eµ¼³ºŠ+‹kˆ¤†hÒDeðGþK?Â/û)þÿÔ¯I¬gðKü2ü™QÝz¯Ìþ”|qÿ#§‹ÿìhñþ®ëòWÃÿµgÄo~ÜŸfËÚ›ö(øeÿ §ãg€üáٯƿ õßþÕ_~Íû3| ý¡¼uâß j°þ׿¾Éö¿øX?|= ëÚìùâý –~»×5‹Odk¶ úÕãù<_ÿcGˆ?ôíw_6|*ø=ÿ ËÇ_´¯á"þÛÿ†‡øÙ üaþÌþÈþÍÿ„?ûörøðþß¶ißÿÂAöŸøQŸð–ÿký“Dòá(þÁþÌ—ûûgWñ[JU.®ýå·æ]Ó[_·“LÙmEýn¿®‡ÅÿࣞñG‡¼s¬|BñWü,[K|1Ò> _þÎ_³gíâï|]øsâØ“ö7ý¥5Úx6o…sGâæü¼Ð?à‹žðׄ>X]xËöyøÕâï†ú'†¼%¡ÅûVþÇ–~ /‡,ÿdØ_öcñN±ÁÙ>7ø+S±ø£©j°—ƒ¼gàïZ|MŽÃÁ~ø—ñ'ឣàÿÜ_i~>Ó¾òøiû#ë¿ >1øÇøÅ³áÏÃÿ‚~ø7oàk„¿|âŸè^ 𵇅|/àÏxƒáe€~Þ|ð¶¡o«ü[ð€´ÏÙïGøð“ãŽ>%Û|øãðÿömø“ãÙŸ]rT·Œìôµ•Ößg®ïe~À¯×Ëô¿__ø=}GĵOÀß |UƒàÞ³ân6·á¯ jz½§ÃŸ‰š¯Â¯ xãÆ°éSø'áÇÄ?ŽÚOƒ¯¾|4ø£ãtñ'‚×Á þ üCðÏÄÍñá]¿‡|7©\|Uøs‰þ]ðwí÷4¿ðO‚?·W‹<­êvÿµ¿ÙÖ{¿‡¾ðÅ]Ä~ðçí3ûE|>øM§i^ðׄüYñ'ã·ðŸÃŸ,äÒ¼Aà[Ø~Õ÷þƒÆŸ¼5àÿüYðv›¡öÞ5ý|G⟊¾4Õì~-hšOÁ‹_´7ÀÚ·âÇÃË¿†Wú¯Å[ÿ?³\?áÜ_>2Cñ3Ið‚~j²¿Á|iàï| ø‘âÍ^ñR âO…߯Þ¸øa·§~ÇŸÙŸ±'À¯Ùˆ›õ¿ÙóÁ?²…‡ƒ>'ÍáÚV§ñö;ñŸü3ñW‰þ§‰ã»½ðN¹ñàÿ†¯|uà +â‹®ê~ ¾×|-áÿ‰~Öîtÿi‰{4£«mÊÛè¬ù–Ë«é}“MÞÈÖþZþ–ëëÛõ6üiûw~Ë~Ò-5¯|AÖä·Ôu¿ŠžÒl<5ð§ãŽñŠuýoHý¥~+ü>ø_¥iZ6}ã ÿA¯ø.øFÏSñ‘?íÓû8CáÍ+_ƒZø£«jz®·âŸ…¾ý›ÿi?~Ðúÿ…l<5ªø’~Ì^øIª~Ñ_ôMGñ×ÃmkQñ/޾øwÖÚ'ůƒZËê£LøÅðÂëÅŸž^'ýŠ~9x÷Á~*xOÁzßÉ:§íyðcÇß²·Áo‹ºÃ?Ãû0ü*ñgíÃû~Ö¿¶G‹~$i¿ ~'[èÿu¿‹´WÁ¿‰´Ž»àûÚ‹âÖß ´?†Ÿ >k|G®øÓá¸õˆßðKoøZºêü^ø‘â_Ù{ãí­xÛâ?‹|j~>þÆð¹?eY¿ácü9ý˜¾]Ýü<ý›õïÚÇÆÞñ¶‡àŸØëàž‹ã][öñß“y¯|vi4Ò~%xKEøU\´´¼žîöiôN;GÎÍÝ«§ÊšÔW—nߥúß»Jݯ®‡ê~"ø7ân•7ˆ<¬ÂMáŸø‘M¥x·OÓõ_øC|_¥x›Á¾ñ÷‡üOðëÆØÃ៉¾ Õü3âý{|=Õ|MàÙµ_í .»ÿ 7†|K£éµywÁÿ‡·ÿ <¢ü7Þ‰¬øGÀº'ƒ|ðÚ=+À~ø¤xÁÿü#áh4ÿé~]áµÖ·uâ=ÄšüðÃáÇÁ߇ú‡5¯øß ô» >¹âQ¬¯¦ß×’((¢Š@y‡Æïù#ì˜xûÿQMZ¶~~пü û1ÿÁ3gÿÙÿá'Ãÿ‹~,~ÁøÅeeñ‹ã7ˆþ|,Ñþ|ø}û.ø+Ç÷W^?ðWÁÚ;Å·_.¼[ûG|)‹Áþ‹áL^Ö<9Ä-kZø…áOÃðçŽñ¾7Éø»ÿdÃÇßúŠjÕ‡þx«ãÏü›þ ááË?Ùsö ý²¼£þÍ5¿ü ý·¿´t Úx¨| ð]ƒ¾,xâ _?j]#Hñƒt‹¿xCQðm÷À GÆwÄÅÖô¿Œ?­¼¬x+ã¥ø*‰~Fu:|ÿCô_[ý§¾ ü?ÿ…£|uø‰ðÿönø›ûEdiŸ ~ |tø©ð‹ÂüQã½Gþk]Cáo…´­3âˆ5ø×Ä¿µïë ~)ü*ñßÀ¯j¾ñ‡.¼ßØÂ;âŽ>ðçÅ»ÏxÿÁ¾#øSã¿ü ðUÏ‚¼K{ñ·O¼ð·Èÿ±OíOðËìG†õÿÙÿöÁÿ…·û~Ê_°7í/ñ öÌÕ~"Ûý·þ£þ"×^ý üEðvß?á®?á|ÃRx×[ø›û?xÿã§ìùößøAâðµçí ­ÿÂÜÕ¼aðËãÿÚöý©üá‚ß~xáÿÅßü2ý¯þ>x×Oø}¤ø‡â-—ößü6oüsÿùÿ‚‚|-½×µÍ àÿu?ü?øoðKà׋§ý¥ü„|Oÿ “ìWþ"ðï‡>&øKGÔõ»~ã3õÿAý»ÿeüSýšþøãÃÿˆÿð×?ÿhÏþÏÿ~|Aøuâÿ…Ÿ¿á–üGðÃÿ¼àÿh¾0ºÿ„Çâ‡ü,«Ýv×Þ ÓüKö_|*øÅ©øŽ÷ÃßðƒKÿËÿ´7ü#¿öô‹ÃÚÁÿjÿ°‡õŸ|;ñ×í§|1øËñ7ÅV?°gÅoÛÎÏFøYðÒÇá·Ä;SÃþ'ðO…|áïx›XÖ4}GÄxcöÉñŒ^·Ò?d½.ÏãÑðö2øûáOÛ OÛ‡âTßô|ZñímñàŸ¼uãOøWáo…~0| ÿ‚w|+ðÖ³ðÛã¿ð£áæ¯ñ›Ä¿ü#áÎ¥®xgÅþiÖÚwí%ãaaâÍJçözСý¡|öÝÿ‚_ü}ý¥<7û]èþñÁý&çã÷í?ñ÷ã_ƒ¤ñf¿ãK4ß üTÿ‚x³þ ]áí?ÄÍ£ü?פ³ñŸí®ÙøÇYµÒâÖtëƒQÜø†ÇUÔ|l‘|<˜õûFý¡~xã/‹?g?|qø?®þÐ~ðý·‹ê¾ø¯~Ñ¿´gìÿûUø[ÀÞðoÄ;¯ˆþ#Öõ~η_þ x/âÇíkñ_Áß¼AûL|@Òü?áÏü=Óh?>øîßáf‹ðÓá÷Æ?ü_ñŸÃ~Ó>¿øSñûãgŠþ;k_>%þÎßð¯ì¼5ðþ/j¿<9⋾3øY­xî/~ÏúÞ¿ðëÀ2ñ_ìÝð§Ãþ)ÿ„[ļe§Þx»RÕ|/£ø»ÃžðU×Âx>$|MÓ?moƒß°oA¦þÛ¿±~³â¯‹~Ñÿk¿ÙƒVñ·Àø÷ÅŸ¼¦ü}øS}⯂¾øW¨Ç£üOñ7Å¿Zø²]_áLJþjòÅ¥ø÷Yñž§x?Q’;Üé×.±_ƒÅÚÇŠ¼ á|6ðïöü%ÿð®µÛmâ”;ø-¬iÞñV±áÛŸjï†|MðëQøá_ˆø¨ëšæ™ð·ÆÞ𮱨øïIÓþxçSø]ý£¬ø³Â¿Ï·û-|[øÅû<|Fð'íqð×Ä?cχ_¶ÿü#ÇÑx§àn›ûCüxý¶¾-øWöÊø·ÿ*ý“t{-öFðwìƒ¯Üø#Ãú‡‚nmOã‡>2xGÆ´~©xÀÞñn©ð¾/üFñ‰þ~ßøïö ð¯‚þ7ü øEfžñ·ÅïŒ7ýœ|Cªø[Æšv¥â¯„_t?Ù«_ý°|áø+Kðÿ‹?gÏxëÅZ¦¯}â­7ÆžÔuÏKøkãü^Ö<ðÏéúüAøSû<~ÑÐøßþ õñGã—…¼ßÚŸãíâø('íÓ¢ü>ð¥Ö‰ð'౦Á#þ!þÁ·ß¼â|iñKÃëÿ‡ˆ)ø ¡xGÂz$7:~‘«â}wH°Ô?ëü]ûFüý›¼ ñÆß´Oüý¥~7øâÂÍá&·ñãUøã¯Ù[À~ðm»|røeñ—áõ§‚uËOÚ/Äúߊ?‡Œ®5ß x è^2Ð4HMCãÚ÷ìÕð›UÁ¿õ]Gñw‰þxÏãoÿ|Yñ¶™àŸè7>:Ò¿d„¿5_øËL×o|ðáßü' þËô?ÆŸÙî‹^#ðG¼9ñcâÀŸŠŸôOø?Ãÿ>Ãð«Tñøñ*ÿÀÚ×ü{ |pø]ñ›áµÎ‰âŸü-øaâ`x/iWþÓl¼7âÝAÖüi£x£ç‹ðNÏ |Wðo‹ü%7í#ûPø>ïâçÁ=Kàíã] Ä?0ø'ÂZ‡|Câ/Š>3û/ÂïÙçâŸÅÍǾøo«|$Ôô/Ýü4¸ø…§þѶ:¿Á 0ø§ÿðÀ?‡79ý¢~ ülýŸ5»x_À¾ðÆköjðü'ú¯‹´/ø£J›Ã¿öŠ»ý4Ÿ#Ãß ¾'jš¾…ãÿÚSÁ^2Ñ¿áÓ4ÍGÃúßů€ºgÅnÛŰ7À|9Ñ~øÝ¼mâ‡ÚgÆÏÚÃã~§áû¿[iŸð•ê¿¶f…ûVøkãƒuíWúN‹­Ûx%4OÛâ—„‡…õ/ øËDþÌðUÍÇŒµ;½'WŸ_/¿cwJÓï<_ûU~Ô>2ø¹áohþ:øcñç]Ô>ÛøËá&«£ø7â/ó~xwà&ƒû+¿ö×€þ2|`ðŸ‰õß~Ï.ñ—‰t¯Bú׉ï5†o¾ºì÷êßwmUôkâÒëN]nù~/ç}íÓ¹ÄþÉ?¶&•ûZüoø¬|6ñ_ößÀˆ¿eïÙ‹Ç^ Ñ|¿êðüO×ÿhÛïàÿÆøá2ðm爴Oý—[ýž|7àÿíßøûÇ¿ 5¯øBá-øGâxSÅcÅÞ)ý ¯ž~~ÎøIãüIƒÇ_~ xçÆÿ ¾|/ñ‰>&xžÃÄ—þ ‡á‡Äßí|VâÓCÑíô]oÄ^.ý¤> >¡á¿ Á¡|*ð‡‡,|à_„_>xÂzw‡ÐÕ2qr|ªÑÒß$——^º_qžañ»þHÇÅßû&>ÿÔSV¯?ýŽäÑ?eû7ÿú¬|/^ñ»þHÇÅßû&>ÿÔSV¯?ýŽäÑ?eû7ÿú¬|/Uÿ.¿î'þÚ.«Ñþq?Ž_ø(—üž÷í/ÿe?XÿÑ6”Qÿÿ“Þý¥ÿì§ëú&ÒŠö¡ðGü1ü‘ýèø¿þBÖŸö+øÿP¿×ó{û\ÿÉó|zÿ²ðÿL¾1¯é Åÿò´ÿ±_Àÿú…ø~¿›ßÚçþO›ã×ý“ÿ€ŸúeñyøO÷ŠŸáŸþ—I|ù~Lò(¢½#3Ýü º‡ÆßxgÀ>0ñGü"¾ ðG€þ$x’ð€ü0ßÙúÃφ:çŽuÝN? hמҼUãÏi^Ó4=[Æ#Öâñ?ˆ~àø—Q¶Ð´è­÷¯þøbÿáÇŠ>,øǺöµàÏè:ýÄ1ø»Àz„þÓÀ4-SðÌÿd×4ø×á7¼á]fÊõo´é¬?±üIâ-+S¹Ôlî×PÓí-./tØnïà¶´Ÿ¼ðoíwq©x÷Uøï{ãÏ¿ð”xÁÞOñ75ËÛ½SCð÷ÇŸ…?u_ ^ø»RÔîµï è:¶ƒàïé¶×úw÷z^¹®ÛÞ[iËö‹Ëëp4¼ø1ñ‡Oñ~•ðúÿá?Ä«ë¶jº'‚/< â‹oëd)©K.¥¥xjm)5BÂ(ô}^I/-,¦·DÒµ'iØÝ¨Ù|,ø©ÂmýðçÇ—ÿð­>×ÿ ì^ñ×ü `þÓûwü&ÞFŸ'ü"¿bþÅÖ~×ý»ö³ÿdê~vϰ]y_`øöˆøE­ø?…sjž-¸Ñ¼CañMñ7Œü;û8üøCqáËø«ömñ¶&ð³á¯Ä;? øâüên´]kUÖüWáN 3ÅvW‘^køRÓA¿¡àÚwÂ> Ò4íËWñâÿ¸ñäž6ð‰-[DÖl/4­gJž{ëX5=+Q·’ÏQÓæºÒîì5+h¯-&šÚIôëë+èRC%¥ÝµÂÇ2zG‡ün|' èžð¯‡4 xcÃZF›áÿxsÃúÏ´mÃúg£èš&§xÒÛOÒ´+O¶·°ÓtÛ x,ìlà†ÖÖ ‰~wøÝÿ$câïý“ê)«W/û ÿÁ/b¿Š?²gì½ñ7Ǿ k¾7ø‹û;|ñߌµ¿øi?ÚwLþØñW‹¾øgÄ!Õ³tŒz~‘§ÿhjú…åߨt« 6ÓÎû=µ¬qBxjR©8ÔäI­9¯u¾­X™4­¥þvêŸùcÿÂ××ÿçÛÿ.¿‰_üÝQÿ __ÿŸoüºþ%óu\•ÏÁ/†_³×…4ÿ…ßü;7†|£øËÅwÖ–7¾ ñ7‹uI¯uŸ ü;Ôõ ÍWÅ>4Ö|Câ½vêK‹ƒ½Æ·­êØé–ú~‹`öÚ>™§XÚþ2~Ðß?h /ÁK>>x7ãß¾ZÁ=á'ÿ…{ðSÃ^ø!ª|$øÁÿ ëö$ø#û^¯ü/+ß|$ñŸÆ{¯øLù 4_[øGþ?ˆ1kõÙ“©’¦ª'Êíw¯v–ÉK«ýA%díÛ¯§§e÷uëû‘ÿ __ÿŸoüºþ%óuGü-}þ}¿òëø•ÿÍÕ~lj¿¶÷…´OŒ~<øc©üøÙkàŸ†_>~ξ7ý¢¶|›àæ‰ñ㟅¾ xƒágƒÿ±-þ1ËûAj_ð”jß´?ÁïÂA¤| ¿ð¶‰âŸ}¯ÄZÞ‘àŸø£Æ'ËÞÿ‚ÙþÅž:¶ñ%÷…îümâ‹M/þ¶«á{o‡Sü(øÙã/ˆ^ø›ñãáì÷¦xóGøIðâ¿ÅŒþþÉñÇo…:†¡ð›ã¯Ã¯„_´n³¥xšûGð'ÁoüAð_üáYR®ö»Ûe¾Û-í­·¶­XvŠò·+’?r?ákëÿóíÿ—_įþn¨ÿ…¯¯ÿÏ·þ]¿ùº¯‘>|oÒ¾6i^2eðo¾xÛá—ïŠ_ ~"Íã/‡ž2›Á¾ ø•¤èúƯðׯ_¾ë¿Û¿ þ#|=ñ柨xâŒ4«m+Åö:&·}¤xÛHñW…|?ñGÃoø+ì÷ñsÁ¾0×>xSÆÞ4ñ·ƒümðÀ³|(ð/ÄOÙ7ân«¨j¿µ_h_ æ›ãGÂïÚgÆß²?‚á6ñ‚|iá Bø©ûGü?ñ–¡ã-#ôðÄÞ6øÕû=ø{ââS¬ïgµ¯¤t¾ÎöÙ÷Û­ìZyí¿K’þ®~ÉÂ××ÿçÛÿ.¿‰_üÝQÿ __ÿŸoüºþ%óu_øëöðç‚áýš$µð/Å\~Õ|7ð¿À:E‡†,<â? M®ü*ø…ñ¯Rñ_ÄÏ üe×>xÁ:'‚~|.ñ޹ã? Ýéw?tëý=<-§|8Õ¼]0Зä?‚ßðW?Ù'ã÷ü-ŸøVÚ×ö·ü+/‚~<ý¢´øº_³ ßð±>|:þÊÿ„‹Æñ,ý u/øg+þÿÅ?ûnÃ+ø¦ÇþøžhšGü á[ Ušº½–úG»]»§÷>Ì,¿§éþKúgì—ü-}þ}¿òëø•ÿÍÕðµõÿùöÿ˯âWÿ7UùðÓþ }ð{ã—‡4+€ >(ü{ø“ªë4­Kà¿Â_þË~(ñ†l>Ø|"Õ<}â[ß‹‡ö’²ý“üO¢h?´/À¹ƒá¯íã¿ý¿âÖ› ÿÂ>6Ôµ› 9«Z÷ê–ѽÞÝ=>ô;-=.¾\¿ä¾ãöKþ¾¿ÿ>ßùuüJÿæêøZúÿüûå×ñ+ÿ›ªòú*=­Oæü#þAeÛúÓü‘êðµõÿùöÿ˯âWÿ7TÂ××ÿçÛÿ.¿‰_üÝW—ÑGµ©üß„È,»Z’=Cþ¾¿ÿ>ßùuüJÿæêøZúÿüûå×ñ+ÿ›ªòú(öµ?›ðù—oëOòG¨Â××ÿçÛÿ.¿‰_üÝQÿ __ÿŸoüºþ%óu^_EÖ§ó~ÿ ²íýiþHõøZúÿüûå×ñ+ÿ›ª?ákëÿóíÿ—_įþn«Ëè£ÚÔþoÂ?ä]¿­?É¡ÿ __ÿŸoüºþ%óuGü-}þ}¿òëø•ÿÍÕy}{ZŸÍøGü‚Ë·õ§ù#Ô?ákëÿóíÿ—_įþn¨ÿ…¯¯ÿÏ·þ]¿ùº¯/¢kSù¿ÿYvþ´ÿ$z‡ü-}þ}¿òëø•ÿÍÕxoÄ߆ÿ>5kÖž*øÉû8| øµâ{ "Øxâo„/økðÛÂ—Þ øKð‹á‡Â jž!·ñV©£ü2ðÏü"ºv£¯[é²é ©Ýéö·’iò^ɧÉ­ÅâÚ%åÄvMpðYAiÑIÔ›VrÑù/ò .ß֟䂊(¨W7ã Wñ/…µÿè~9ñwÃmC^ÒîôøM<|2ž.Ñì58šÏW]økÅÚ•Ö§¤Í}¤>£.ƒs¨é¶ú„×ú Ö“¯[išÅ‡IE4Úi­i§æ¶âøc/ÿÑî~Ûßøq¾ÿó•£þËÄô{Ÿ¶÷þo…üåkíê*ý­Oæü#þB²íýiþHø‡þËÄô{Ÿ¶÷þo…üåhÿ†2ñýçí½ÿ‡á_ÿ9ZûzŠ=­Oæü#þAeÛúÓü‘ñü1—ˆÿè÷?mïü8ß ÿùÊÑÿ eâ?ú=ÏÛ{ÿ7¿þrµöõ{ZŸÍøGü‚Ë·õ§ù#âøc/ÿÑî~Ûßøq¾ÿó•£þËÄô{Ÿ¶÷þo…üåkíê(öµ?›ðù—oëOòGÂ÷ß±&­©Ù^iº—í£ûjjv¡kqca}ãï„×vWÖWq<Vw–³ü’ ›[˜$’‹y£x¦‰Þ9‘™OÖ_ |¤|,øsà†>¹Ô¯4‡> ð¯€ô;½fk[^ëHð†…aáí6çU¸²³Ó¬§Ô§²Ó –úkM>ÆÖ[¦•íìí¢d;j*e9IZNé;ÚÉkòHKeýHþ¿à¢_ò{ß´¿ý”ýcÿDÚQGüKþO{ö—ÿ²Ÿ¬è›J+܇ÁðÇòF÷£âÿù ZدàýBü?_Íïísÿ'ÍñëþÉÿÀOý2øÆ¿¤/ÿÈZÓþÅÿêáúø‡Æ?°ŸÀ߉ÿ¼oñ“Ç?>+Øx¯Ç>Ñî4o èÞ_i:G‚´Ë› .8n5‹»KQÔ¯.5 RÿP¾qaj°ÜXi–Úb¾™qªëe ‘§Z¤¤ìššé¿<_Vº&jÓqŠ^_‘ø{E~Ùÿúÿf?ú(ßÿðUðÿÿ‹£þ×û1ÿÑFøïÿ‚¯‡ÿü]výj—Æ?ü‘¯ú¿——Ÿàû‰”WíŸü;¯öcÿ¢ñßÿ_ÿøº?áݳýoŽÿø*øÿÅÑõª]ÿÿòAÊÿ«ùyyþ±ø™E~Ùÿúÿf?ú(ßÿðUðÿÿ‹£þ×û1ÿÑFøïÿ‚¯‡ÿü]Z¥ßñÿ$¯ú¿——Ÿàû‰”WíŸü;¯öcÿ¢ñßÿ_ÿøº?áݳýoŽÿø*øÿÅÑõª]ÿÿòAÊÿ«ùyyþ±ø™^ŸðGþK?Â/û)þÿÔ¯I¯ÖOøw_ìÇÿEã¿þ ¾ÿñu½áoØ3öpð‰ü9â½7âÆÙõ kÚGˆl!¾Ñ¼ -”׺.¡o©ZÅy6ÓÉk$öÑ¥ÂCso+Ä]cž'+"©bi8É'«M-cÕˆj-4ü×/óücìÿÈéâÿûÙðçÃ?üUÿ oˆøkSø‹¢A©üøgà™üiûCjß~4éôižø©ám{â7ÄïøÏï*)sËMmkZÉ}•dýl¬ÞíhÝ´ _×ä|ówû0|*ÖtOÚ¿ÂÞ)´ÖüYáÛ;[Õ5_~Õu™´û « wöyø_û2k¾ðÖ¡áxü=â=DÕþ|(ÐäžxõËŸÚøVñ©¥øƒO·›HÓôož/ÿàžÖ~#ÿ…¿©øûö¯ý¨~#øÛã'‚~ü4×|oâÛ?ÙU>Áðçá¯ü/{x|wð³Ã²ï†ÿgߊ ñŽ“ûJ|]ÒÝžÖïè¯ÞÊ÷°)­|ðn·sû8O>«ãoøÅß|=}CÅÚ¯‹u]oUÿ…ñ_öxX~"ø³Çâ¿xãw‚~0ø—U¾×u_ÿÂe­øÊËGñˆøöwðMÿŠ>Ùxsö[°ø=ãüFø5?Ã=3ß tŠßÂ|%øIàÏþ×+ûKø,<þ×u]sß¾9é?>ò¢…).¿ÒmþmýílÀüòÑ?àžÖ~×|Añ#Fý«ÿj?Ú Å>6ñ‡ŠµïÚ;ì²­ÇÄký Çßg_†~-øiÿußì»?ìûkà[Iý“¾jßo³ø'oñÃ]ð™¦xþÏIñOtúˆý¼§|ý›¾xCâÅÜ~É:'Ãí+à'Æ?Ý|?Ô¾*ø.ÿáÿÂ-oà$^%žÓÆß<[ðƒÄú߉þx·Ç ñ,+øM­xqañž«â øÃ^.Òü#â }yEòv×o%æ­¶Öm[k6­« /ëúò_qðm§üÇ൯ÃÿÚ7áññ?śگöyÕ¿g¿Œž$ŸZð˜ñ³‹_ÚßCñoÇ¿i~øcà]ö.øÉâßcöGðŠ5/Ú2 ÿãßtcáOÅÿG«xŸô¢Š9宯_ÎÖ¿­´ÿƒf‹/ëúòAET€QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEy?‰¾%}›ÄñøOÃz®ƒ¤Ûè^1ðç…~&ü@ñ ¯ö–‡¡x—YÔ"‹Løà½9a¸ÿ„«ão6Éaâck͇Á/ ¶³®krZøÃN¾¹ømp§)·m’»}ÿ7Ñnýi6•¼Ý‘üWÁD¿ä÷¿iû)úÇþ‰´¢ø(—üž÷í/ÿe?XÿÑ6”W·‚?áäŒîÆÿþZx¬n¾+ü5¶½Óto iZÇŽ¼/ Õ†§¥ø_FÓµ=6öÞMUfµ¿Óµ k›û9Ò;‹;Ëyí®#Žh¤Eä¿áw|ÿ¢»ðÃÿ ï òÚ¿ÏZŠäx(¶Ûœµm캖¦ÒJÛÀÿƒý-ЧþwÁú+¿ ?ð¾ð§ÿ-¨ÿ…ÝðcþŠïÃü/¼)ÿËjÿ=j)}Fóò_r´}—õý?ékþ…?𻾠Ñ]øaÿ…÷…?ùmGü.ïƒôW~á}áOþ[WùëQGÔaÿ?%÷ ö²þ¿§ý-ЧþwÁú+¿ ?ð¾ð§ÿ-¨ÿ…ÝðcþŠïÃü/¼)ÿËjÿ=j(úŒ?çä¾äÑö_×ôÿ¥¯úÿÂîø1ÿEwá‡þÞÿåµ𻾠Ñ]øaÿ…÷…?ùm_ç­EQ‡üü—܃Ú>ËúþŸôµÿBŸø]ß?è®ü0ÿÂûŸü¶£þwÁú+¿ ?ð¾ð§ÿ-«üõ¨£ê0ÿŸ’û{GÙ_Óþ–¿èSÿ »àÇý߆ø_xSÿ–ÔÂîø1ÿEwá‡þÞÿ嵞µ}Fóò_rhû/ëúÒ×ý áw|ÿ¢»ðÃÿ ï òÚø]ß?è®ü0ÿÂûŸü¶¯óÖ¢¨Ãþ~KîAíeýOúZÿ¡Oü.ïƒôW~á}áOþ[Qÿ »àÇý߆ø_xSÿ–ÕþzÔQõÏÉ}È=£ì¿¯éÿK_ô)ÿ…ÝðcþŠïÃü/¼)ÿËj?áw|ÿ¢»ðÃÿ ï òÚ¿ÏZŠ>£ùù/¹´}—õý?ékþ…?𻾠Ñ]øaÿ…÷…?ùmGü.ïƒôW~á}áOþ[WùëQGÔaÿ?%÷ ö²þ¿§ý-ЧþwÁú+¿ ?ð¾ð§ÿ-¨ÿ…ÝðcþŠïÃü/¼)ÿËjÿ=j(úŒ?çä¾äÑö_×ôÿ¥¯úÿÂîø1ÿEwá‡þÞÿåµ𻾠Ñ]øaÿ…÷…?ùm_ç­EQ‡üü—܃Ú>ËúþŸôµÿBŸø]ß?è®ü0ÿÂûŸü¶£þwÁú+¿ ?ð¾ð§ÿ-«üõ¨£ê0ÿŸ’û{GÙ_Óþ–¿èSÿ »àÇý߆ø_xSÿ–ÔÂîø1ÿEwá‡þÞÿ嵞µ}Fóò_rhû/ëúÒ×ý áw|ÿ¢»ðÃÿ ï òÚø]ß?è®ü0ÿÂûŸü¶¯óÖ¢¨Ãþ~KîAíeýOúZÿ¡Oü.ïƒôW~á}áOþ[Qÿ »àÇý߆ø_xSÿ–ÕþzÔQõÏÉ}È=£ì¿¯éÿK_ô)ÿ…ÝðcþŠïÃü/¼)ÿËj?áw|ÿ¢»ðÃÿ ï òÚ¿ÏZŠ>£ùù/¹´}—õý?ékþ…?𻾠Ñ]øaÿ…÷…?ùmGü.ïƒôW~á}áOþ[WùëQGÔaÿ?%÷ ö²þ¿§ý-ЧþwÁú+¿ ?ð¾ð§ÿ-¨ÿ…ÝðcþŠïÃü/¼)ÿËjÿ=j(úŒ?çä¾äÑö_×ôÿ¥¯úÿÂîø1ÿEwá‡þÞÿåµ𻾠Ñ]øaÿ…÷…?ùm_ç­EQ‡üü—܃Ú>ËúþŸôµÿBŸø]ß?è®ü0ÿÂûŸü¶£þwÁú+¿ ?ð¾ð§ÿ-«üõ¨£ê0ÿŸ’û{GÙ_Óþ–¿èSÿ »àÇý߆ø_xSÿ–ÔÂîø1ÿEwá‡þÞÿ嵞µ}Fóò_rhû/ëúÒ×ý áw|ÿ¢»ðÃÿ ï òÚø]ß?è®ü0ÿÂûŸü¶¯óÖ¢¨Ãþ~KîAíeýOúZÿ¡Oü.ïƒôW~á}áOþ[Qÿ »àÇý߆ø_xSÿ–ÕþzÔQõÏÉ}È=£ì¿¯éÿK_ô)ÿ…ÝðcþŠïÃü/¼)ÿËj?áw|ÿ¢»ðÃÿ ï òÚ¿ÏZŠ>£ùù/¹´}—õý?ékþ…?𻾠Ñ]øaÿ…÷…?ùmGü.ïƒôW~á}áOþ[WùëQGÔaÿ?%÷ ö²þ¿§ý-ЧþwÁú+¿ ?ð¾ð§ÿ-¨ÿ…ÝðcþŠïÃü/¼)ÿËjÿ=j(úŒ?çä¾äÑö_×ôÿ¥¯úÿÂîø1ÿEwá‡þÞÿåµ𻾠Ñ]øaÿ…÷…?ùm_ç­EQ‡üü—܃Ú>ËúþŸôµÿBŸø]ß?è®ü0ÿÂûŸü¶£þwÁú+¿ ?ð¾ð§ÿ-«üõ¨£ê0ÿŸ’û{GÙ_Óþ–¿èSÿ »àÇý߆ø_xSÿ–ÔÂîø1ÿEwá‡þÞÿ嵞µ}Fóò_rhû/ëúÒ×ý áw|ÿ¢»ðÃÿ ï òÚø]ß?è®ü0ÿÂûŸü¶¯óÖ¢¨Ãþ~KîAíeýOúZÿ¡Oü.ïƒôW~á}áOþ[Qÿ »àÇý߆ø_xSÿ–ÕþzÔQõÏÉ}È=£ì¿¯éÿK_ô)ÿ…ÝðcþŠïÃü/¼)ÿËj?áw|ÿ¢»ðÃÿ ï òÚ¿ÏZŠ>£ùù/¹´}—õý?ékþ€^-øÅàMRËJÑ|#ñ÷ᇃF³ª=¯Œ ü)2ÛÜjúoÃÛ=Ylá7øÇñŸÉ6?¾7øÆ YÒ4ùnbð†„û<:¾þ(­c‡å$ge­ýØÝÞ÷o»õì–ÚÍwvµÓ¯k“ûü±à —ÖZŸí£ûEêZm审§ju ë ûˆ®ì¯¬®ììgµ¼³ºä‚æÖæ #šÞâ)¢t’7debWÇTWBVIvI}ÄŸÿÙPythonCard-0.8.2/tools/standaloneBuilder/doc/pic11.jpg0000755000076500007650000016356510240730043022511 0ustar alexalex00000000000000ÿØÿàJFIFHHÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀR "ÿÄÿÄ^  !“Ñ1QST’Ò"3ARUr”•³Ó256Vst±²#Baq‘£Á$4buCáD¡%F´W‚ƒ¢Ô&'Ee„…¤ÂâÿÄÿÄ&QA!"1a2#BRÿÚ ?ÐåÎ\ÛY9”töe•KfIè£Æ©€É ÷ÅÀx‚ÍÿŠY_вÿÉñÂSÿïæÇ¶Gö‘}FáȲ3ÒÓÇË ™ŽÞyL²šÊŸÏ5¥¼«¥`|¶}‹€›±2bþBZóqÔ’ƒügÊ>ƒdz³»KyúFús’Cÿæ4žñË%”9M`Í”&ƶ⫵)à·ª%¨ž¬˜ôXMñæ¢-sœXÓßÜ0߀ :õuÆt²üÓO¼G̸‡é—(ú ‘êÎí)äý,åd4ÐTËdÙÑÓÔbÌÊê7†É„Üì'Æã¨ÝÄ®,ûÈÉ{zÓÉÊ(Ù_iÇ“õm¨{³5²¼µì„F}â1ûò â!~ÙöUµdäE…jYL‰µnµXà+$£s^ç\ËÝÆ¿ù?ÆôÎÿÇÁ÷íAþ2eB²=YÝ¥ú?L™EЬŸVwitw)bw3¤h_å»Óø[:ÿõ¸îÌb¿7ÇÞàË÷ß­[Õd¾LÒå ³³ié)ìJë1͑ҽ͒9žÜà—8ç4¶âN 8µ›¯VÿŸÖ'ßµý1eB²}YÝ¥ûþ0åB²}Xö”–½—”v×éöu«5tVDö¼§u¢f¤bqk[¬KA ›î_x¸vFdó(hTYpâ±ëª_Jüå3›$/`kƒ\ù Ik+‹d,Œ=¯p[ÆýX÷ê êÁ‰´–xŠÉ³­ºzné"¾œ¸Å,1˜˜Nt\ëâñ¯ore–ŒGÆ$o÷,ý+ÛÝËõsÚ]þ’ò–jyª#³(s²6‘űâ7 Fû…çP½YPdkZö,±QEWM5] ËBZ2ñÂçf¾KˆŒ]„´¬Æ»[gÑœ•}=DòÇMSfØÆy$œœÛ];ƒˆ/$4âÔÑÈ™e£ñX¯ßµø•”º&—Á´6s5žÑƒ×áÅ}×Ý®åø§ntK3ÕÏijc°h$¢†Ç®³¸:Î9I##f)Ÿca~‰ä“Œ€ÛÛuþ+Ф†À°¦}Kç°m:\Å•SPöOéš÷±Ì-txžóx Þ\8ÉŽZ3ûŠNþÜ_â¹Ñ,ÏW=¥ÕGúBÊ{Bc “GS n"ÈhÜò÷_pZئlo†·5#\ˆíW¯ì씡¢m=AƒüÕUžöV@ǶŒäŒÂç=ÂAßqµ¬¸â7.YN„ëò±¾}©eý%[ðJø¥¡³ã‘Ž-{LAi`‹õûé&ÞžVE žùàÖ±´Ä—¨/ÖT¹[eYíeM¡_O%›S%±<@ÄÇ9Õ݈J#ÅýõÂöÞû‹‰~ä“g¹”Ö…4–Lv¼+×SÃv,écnﯸ–÷¼\jÿáÙ»iyÝZ9?Höô2¾)hløäc‹\ÇSZG"ýE~‰v×E³}\ïW5–#ê+&³kíªkë[Ph¢t¯„‰h<5†âß5×ßâ.1aØâãàØñ7'›js²b| ‹Ú{ë°›® uê#UÙŒ´+þO¿n/ñ.Úè¶o«ëô~’­ž‹gz¹Þ»dÉ»0QÍYKgi5³)*á³ÃäsqHòÙ Z×c ?hÝ‹_ŠïÚ|¢v_˜OŸ°´§Ó_Ÿ¾éBËÁÅÞŸÂâI½j'Boê}ûqÒE²ô¶w«ë÷üG¶:-êÿù]Ôù?eŠ&UÕÙM‚°YuuRйò´1ÑÈn-.Æ/ñ›Ú—‰l+*H¥c([ Ÿ`‹Q¯d&95w­½Ä`ÔxÁ:ξ+¥èò}ûrÿˆÖÇF³½_ÿ*q—9D[NáfRÔ’Øˆë¥ ÜCu÷ÆýZ•fZQÙ¶e½5gQ:sÌÅáØ˜Âˆ ~3}çÅpm<«žÓ±©ì÷ÓGo9Ž@MïÄðñûõ]¯v#ßÜâÃ(‰ÇÔß”\L­ê²ã(heVY´”òˆ6ZG0‘ËqŸG&]µC/m^A°ÿÊô2îÕ?úz ‡þVPìñôú92íªîêÔèô;ü§wV§G¡ØåfýOO£“>ÚnîmNC°ÿÊô2âÓ?úzÿàåeÂöÇÓèä˶œeµ§Ñèvù_½ÚÚ]‹aÿ•š õN >ŽLûi;µ´¹Š-‡þW®í-.b‹`³KÐþ ãéôreÛIÝ•£ÌQìïv61E±YпSƒO¤ä϶‹»G˜£Ø/Ñ–1G±YÕúƒO¥ä˶ˆeu¡ÌQìW®ëmfbxܽ…84ú93í}Ým3G± ÷ºÊþfb +Á§ÑÉ—mʺóÿF“bèÊšãÿF“b^ÇðSƒO£“.×Ô×s4›ÔWs4›©êpiôreÚðe=w5I± ×tµ¼Í.Ä*0½àœ}™öºî’·š¥Ø„î’·š¥Ø…Lêœ}¹ö¹GYÌÒìBô2г𦨅J±üƒO£“.×ÐUóTÛ¿{ «æ©¶!T…úœ}'.}­x~¯š¦Ø…뇪ùªmU Ðþ Á§ÒògÚÜ[•\Õ>È/ÞªæéöAUà¿TàÓèåϵŸ Õstû ¿EµRéÓ사^‚piôrgÚÌ[5<Ý>È/Þ¨æàÙZ°œ:}¹ö°ázŽn AkTspl‚¯_¡8tú92íb-ZŽn ܽ R" Ü«Çö8”áã—>ݼ'?‘É»—ï ÏäA²nåÄŠðéôreÛ»„fò!Ù7rô+æ?±É»—þ Aüáã—>Ýz|ÞD;&î]!óái2R4–‡\bâ¼_äªÅQe•“40VÛZ5;óq5ù·>÷^Íñ4ÿ%çþŒqÂ#l:èå–Só+Ig|1>Y'¤ cKœs'PýÕÏ ©”4µrUQS²ªMf`k®sC‡Šëî#ˆªj<¢²²›'+ëlz­&’'?6æ\àËȹÀ'楳FË2Äun€YàÒKqa‡‹«î¿ÿuæßþ;íÿVÂ̯҅̑³ž#i{°3 fàÔ³ëä´lè+£4ñÅ;CØ$ˆb¸€uÜ(U•QIn†)Ötø´v°~Ôw_‡þëòÇ‚¡Pç©Í ÎÅš2ãni—ŒëÆ«€7ñ\µ}fi™Çæ"׸åç¨ö_ÿÊËå5¯¥äͽ .gùp`{Ùmææ’ºû®ußÏIJ6•hÓÛTÖ½›iI“âCÀÔr¿<û5Çä:¡·ü›Ã s³\Dƒß Zï£ù]÷¹?,iŒÝü,ÅWÊ\¶É, µr®–ذí(hŸ pã3>7ƒßqkN«Ê©û–ý%ýnÿüéû+êuz ü¡`FVÚ-e©U4ìdn­6X•/`2œùFãÞF«Íí¼cQýDUGÁ:q3lå£ú<Ëk]¶•¹IVAz‰E×ñËüesQ~вžÏ®§¬¦¯³#¨§‘²Äüo8\Óx7î:ÀãZöþ,û)ކ׍Å8©ª/v8£ÍBÊ™caÂç4¾æÆEч»½Ö/"ý²ß™©_ ŋ㕢̦¯®ž²ª¾Ì’¢¢GK+ñ¼bsäÜ#»Œž%øEoô»3k'a}+*-z»&+8R9ŒuU^aÏuµE­ÍHûÄqçØ® Iñ*ëo)+¬ü™®ÌÇ5]©šú·ÏOLØLš{ã™ø‡Èuíxoð ?³WÑË þ[ý.ÌÚIØ_£ôGoô»7hþÂú“”•6ŽPÕYâ‘òÓDÒt†1¬8OSBH9†€Z æòCAiSÍÕ8q|h~‰mî—fíØ_£ôMot»7hþÂú5»UlÓZV\6uUPÖÎiȨ¤|®k„RÉŠöÊÛÅÑuÞ;ïñ$¹[ALù_S L4,tÑŠç5¦7¾ó#CZL—´E.²Ðq7¶÷›ªpâù×øOnô»7hþÂÑ=»ÒìÝ£û oheh¥ª¢0ÔÙ‚)Ý%l5 cÝ£èÕ¾2ñv(N qwœW}ý•h›R…µz$ÔÌ}Æ1,‘?8Òiïii¿V¿ðO7TáÅò±ú)·GþªÎÚ?°½ÑU¹Òìí£û ëëK—Ñ>˰ªêcš*<ít ¨dL`¥’g˜ÜæÜîù‚닯m÷_Æžn©Ã‹/þÛ*ÎÚ?°Ÿá]¹Ò¬í£û K?é†héê©^ñ4ïul,’ œèE-D‚çF÷2òèx±Þë¸~¢Îµ…|óÓKESEU Y#à¨À]åÁ®½Žsn%_{¬Eï7TáÅó1ú,¶úU´az¢ëlê¬ý£û ëhžn©Ã‹ä¿á}·Ò¬ý£û ÷ü/¶úUŸ´a}eÍÕ8q|˜~Œ-®•gíØ^‡èÆÚúš £û êè§›ªpâùPýÛ=&ƒhþ†vÏI Ú?°¾ª‰æêœ8¾Wþ[=&ƒhþÂï³2/)lyf–жÎc¦‰ÐÈ3Ì$^Ò‚ú*$ÿf¤ÅIËæ2~Ží©e|ލ³ƒžââ\Ð ä€û†¥çü7¶:MÑý•õO3PáÅòÿðâØé4=wöW¡ú9µÇþ¢‡®þÊúr'›ªpâùýÚãÿQC×wezÿ-n‘E×e}-ÌÔN_4ÿ-n‘E×euYÙ”Mtu´U´QTE~Þ]uàƒ¨°Ž"WÐQ'úõ&*W‡͇èúÕé]wvW®à-^‘E×we}ÌÔN_9îÕé]wvW¨²ÖŠVHÙè ˜ààK†®PYq¸¯¢"yš‹Ã‹ _’¶ý©,RUÕнÑD!Œ4` `¾àXÂò¹FAÚœý]Ý•ô4R?¯R" eóÞá-N~®îÊýîÓçèúî쯠¢¾fªpâùøÈkLף뻲½ ‡´‡ýzN»»+|‰æjœ0]ÄZ\ý']Ý”î&Òçé:îì­ê'™ªpbÁ÷isÔwvW¡‘vˆÿ­K×wen‘<ÍS‡¸ËGž¥ë»²ÆÚ<õ/YÝ•¸E<ÍCƒ#¸ÛGž¥ë;²¿FGÚþµ/YÝ•¶E|ÍCƒ,d… ?êÒõÙ_½È×óÔÝgvVÍòõ Îä«ùên³»+ôdxÿ«MÖwel‘<½Cƒ,*¯.æw'Õypÿ3¹h<½CƒÔùpÿ3¹z-Hý¸¿™Ü¯Q<½CƒTyq3¹~ð=G—ó;•Ú)åj)8£Ë‹ùËôYùQ3¹]"yZ‡*eN?j?æw'ÏåGüÎån‰åj*x.*?æw/ÑfL?j?æw+TO+PàÁX,é‡íGüÎåûÁòùLþgr²Dòµ Ü/”Ïæw  —Êgó;•Š'•¨p`à2?Ÿþ¡G%ÜmþkµÊÔ80qhrr·ù¯ÝNVÿ5؉åj9+Ç¿Ízï6®”O+PàÁϘw(Uµ6%]MCå6å¥.&G#Ö¨0x‚ºEœµòËõcK÷dÕCØXûzÔs\. ÊÂê/Qdõ\ å«#±0G+Z@ÔÎ@ò,rlÿTRX5ÓFèåÊ;añ¸\æºvGï§X3ht´ZµÔÐSF#ca{÷/'$ÜîÕÅÆ®Ñ^YèÙþ¨;ªóý­¶gap[V@²r>Ù¢iÝ02½ó\\pHZåG–?Dm/²þá9'ò G„ƒ?(Tϰi_`רæI´zÝ'8àF1ŸsÜû×j/7j>+ïW5z ü¡~šiH&0F¢ Þ¹¶Í·%iá–I)këéŒÎÔf^Àgk¥’\–’Ð,€ºç|¢@"ùK£¿ÊjÝ飿ÊjÝè*mk$Z¢ŠÚš9©'ÏÅ5>àìaÔö¸…îñ*êü“m£K43[6}M1¤«™‚úˆ¯y pÍág`iïµßp»CVøè(æ«©–(à……ïvp€ýÀÞ€R¶½˜†Ûî½ÏñAIE“Ôöuy«¥©©cžé;/alÁòI(½·€×M!KN¾øºån¥ÑßåGµnôÑßåGµnôtVTÐÏ#žG9ž0Ò..1¾;îºCÉ®åW.IPT¾VTÍS5 Ý4‚…Îh˜@l‘ÜWk¹h4wùQí[½sÔK,´ñK,bJ‡–DÐðââ\x¿p:÷„«g$d´ìZªwÚµ•u®ŽQ•OcXè%ˆØØúçCqW’·³¬‘A<õ2ÖÔÖÕLÖFùê0`aqkncZÛ{Í÷_ßk$uŠ ""€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆ½²'H n†¢\à?à½hïò£Ú·z¢$Rèïò£Ú·zhïò£Ú·z‘GŸˆÖKH%c§‰|i¿u÷^F­xN­áH€Š]K%‚ð¹?ºhïò£Ú·z‘K£¿ÊjÝëñÑ0½ï‰­h¼“+@ù QåÑK쿸WõUÓES±E+ŒuÄ^Ò/ãû•>Xý´¾Ëû„¡¨ðƒÐgå ¢Ü´ªl» ÓѶ#S%dTÑ™,k¦¨lAÄ ÷^/ºëÇç¨ðƒÐgå ÎU}ƒþfƒÿ¯‰XDºXyöÃö4ßþ©pZv½±“Æ9-{'[ÚâÑ5+¨Û#‡ì ;€'Ñä¯ÚT{’“ 9DÌÓ­5wÙžzcò¹råfPÓÙv}E,Vµ%Ÿi: ärÔ›£ˆp.y±—\àÒûÁ Ü×á-]Vg„˜ü®Pe‡OY}¦mI¬©©á8ë"{8Ž,`¶á¬ÞF«Î±zÜ~#‡$­êúºÙ,ËO<ù48+`šx›…:9Þ÷8ÂImÃõ€\.¼ôÚ9aOCm²Ïm9™‚¥”“<>ç¶gµ¯ c.%à1Áî:ƒZA®~–Û9TÚz˜b²m¹íˆ\×SÚ§4³˜¤79’G$Aph ÃÅx221.×ôqKeO §¨­Ê8[†±³7õ±‡]é:ÌNuîóˆâ/&BòhèÿçÜ û*OÊõd«ù÷(>Ê“ò½Y,Oꯨ< ÿîþF¬½±•“eSr{'«¬ÆÖSÓÍ5sjéß+£-Ìö\''±Þ‘Æ Õ¿¤Jéh2zÎ’:š¸kNsE¨|.{[E3À.cšnÄÖ›¯ñòH2Ò ­>ÕÇVduL¯tÏ}íkHy{ÉsHcAmþ!uÄ5ÃëF0ö7ðêFž3 ¶X~‘òï$(t¹b°jbÎ2Žfwñþ»Wêý~‘íÒ•|-MCƒJÜވǶüm–ûñ9Þ@äñ¬Æ_ÖÚÎF¶J›)ÔpL!¶WŒm¹×·%ÀÎ/¯¼6OЕ0¥²2á€]}ÿËPºÄ¼SûO¤d÷Ñ«+îpþ@¹rÇè¥ö_Ü.¬žú5e}ÎÈ.Xý´¾Ëû…ŸjÐÔxAè3ò…WÈØrj)CXË^…Î'ÄtJJ=~P«*²†¾¦žz9ò:JªIKÙ=L=¤“sšI>-jÂ-Í­IÒàÚ ê­JN—ÐoY ±¿û)³ºÔÉÁv7ÿe6wZ™UGBàÿЕ°æAª¬ ù·­}§gÍkä¯fÓ‰êèj©ã/77ã Ý⼬å«UhÕä¥MƒA’¡†HðF#ª‡. ‹šÕ©_ÍlÖÙ´v4Õ÷‡9³Ç[}×øÞO{Éãö#,ꬡ„©2FÔl@¹Ú䦹ĹÎ?­iêna–7T3‰×JÂ/ã×u÷¸i­¬›vRÔÂÊü›ŽÄÌ´@d–”û™y¼÷þWÝ;+m‡ ’S‘Èk¡Þ¼÷QjýO—×aÞ·9\RDTÛãÙU]cMÝ5[IRÙéãŽSH×g^]¦ñ›Ëµ޾Õ>ä¯ÚT{’ÔZ¿SåõØw® ÊËVÜ·lyç°ä¡†ò¹ïuDrhÔÓÞ/™epF4ºDEÍ¡}™á¦?+–;+íÆÔZ–tÑSÒÙNŠHéå76kØ$Ò}ØÚÓ{ZÎ,l.$Ü0^ÏiÕYc©,¹kÞçÞZÉYheÇ÷øâ<^:»F½Ö¼ðOi~㫚œß “T@çFuôcˆqr.˜LC3®ÈÜž“(ë$·mjwèrS>–ž †ât±<‡9ò?h´\5\/¿Žæþå6Oå%%¡Bû)ªjiq +Enq#TUîñƒuä9ÍÆ6‡¿@Ì«¶#`c2Ff´q]õûÝ}µõN^‡zNW6DTS—ÿŸrƒì©?+Õ’§³uVPZ¶ežú&Ô²²7JǛض“Ê?š¸XŸÖ–MY9Se²ŠØ¥uE2šÃ}ì ñ9Âî-kæOÈ; #¿I&º°ÓÇc>šZ‹>šIüÌ‘hÍÄâòq8ºYî¸;€ß;)mJI¤ŠŸ&ê*"i²š¨™Šæ}×ñjñëþ ºÓ´]mæ¸Wô{~füÞ•54¸/ºû±_u÷.@­D¬g–1Q/啼2ŽÔ4òhùÖÈj$ïo»qÿ;•¯èºœÓRe¤gƒiÏþÕ+A¡Ù?ý”Y]JMË¢*‡PÐWRÙY›¦Dc‘Ô²ÓG‹QÛ¯»þe+æØ©»vä÷Ñ«+îpþ@¹rÇè¥ö_Ü.ûžZKϦ¸eŠš8ÞÛÁ¹Á xýëƒ,~ˆÚ_eýžÚhj< ôùBám¡D÷µŒ¬§sœnJ 'ù®ê=~P ¤šQfQ0HðÍ„8ÝàÚƒ9[”•ô²Û3²Ì¦’βuD¦±Í™Í²gG› ×Üx¼Ž0­&·ìjh$ž{^‚(cœÓ>GÔ±­l ^c$Nöx×6KÐpå¥j×Yô3U²ziß _$Ml10 D^sEÇÆå†Äµ,é©ëiGSQ•àÃ,:Š0v0Ç@5 · Ýñ׫X[Ô[T¢KF¾‚’ç‡ÉTÖ÷Åø]Šì.¸“†óÞÜ|w ä´è"´b³¤®¦et­Ç3¥h‘í׬6ûÈïN¿Üy‡#+©¦{aœÐ8R³dôvJ6™‘b$@FbòuÞÝwÖfOVÙÐ`†ÍšÏ’Zyžù1ß Š(£ dGþ¥®2^ÒëîvùP-¬‹zζì¸+èêc1ËNÚ‚Òö⮿å€MļÞ×]%AÓi¶­Þ¹²~Юɲ(¬Ù³E´TÑÁÑÈI“íÄZZ0ÞÖ±Üfââ?d9×Lüürƒƒ„¨:m6Õ»Ó„¨:m6Õ»×~“??'\¦“??'\ àá*›Mµnôá*›MµnõߤÏÏÉ×)¤ÏÏÉ×(88Jƒ¦Óm[½8Jƒ¦Óm[½wé3óòuÊi3óòuÊ é´ÛVïN é´ÛVï]úLüüršLüürƒƒ„¨:m6Õ»Ó„¨:m6Õ»×~“??'\¦“??'\ àá*›Mµnôá*›MµnõߤÏÏÉ×)¤ÏÏÉ×(88Jƒ¦Óm[½8Jƒ¦Óm[½wé3óòuÊi3óòuÊ é´ÛVïN é´ÛVï]úLüüršLüürƒƒ„¨:m6Õ»Ó„¨:m6Õ»×~“??'\¦“??'\ àá*›Mµnôá*›MµnõߤÏÏÉ×)¤ÏÏÉ×(88Jƒ¦Óm[½8Jƒ¦Óm[½wé3óòuÊi3óòuÊ é´ÛVïN é´ÛVï]úLüüršLüürƒƒ„¨:m6Õ»Ó„¨:m6Õ»×~“??'\¦“??'\ àá*›Mµnôá*›MµnõߤÏÏÉ×)¤ÏÏÉ×(88Jƒ¦Óm[½8Jƒ¦Óm[½wé3óòuÊi3óòuÊ é´ÛVïN é´ÛVï]úLüüršLüürƒƒ„¨:m6Õ»Ó„¨:m6Õ»×~“??'\¦“??'\ àá*›Mµnôá*›MµnõߤÏÏÉ×)¤ÏÏÉ×(88Jƒ¦Óm[½8Jƒ¦Óm[½wé3óòuÊi3óòuÊ é´ÛVïN é´ÛVï]úLüüršLüürƒƒ„¨:m6Õ»Ó„¨:m6Õ»×~“??'\¦“??'\ àá*›Mµnôá*›MµnõߤÏÏÉ×)¤ÏÏÉ×(88Jƒ¦Óm[½8Jƒ¦Óm[½wé3óòuÊi3óòuÊ é´ÛVïN é´ÛVï]úLüüršLüürƒƒ„¨:m6Õ»Ó„¨:m6Õ»×~“??'\¦“??'\ àá*›Mµnôá*›MµnõߤÏÏÉ×)¤ÏÏÉ×(88Jƒ¦Óm[½8Jƒ¦Óm[½wé3óòuÊi3óòuÊ é´ÛVïN é´ÛVï]úLüüršLüürƒƒ„¨:m6Õ»Ó„¨:m6Õ»×~“??'\¦“??'\ àá*›Mµnôá*›MµnõߤÏÏÉ×)¤ÏÏÉ×(88Jƒ¦Óm[½8Jƒ¦Óm[½wé3óòuÊi3óòuÊ é´ÛVïN é´ÛVï]úLüüršLüürƒƒ„¨:m6Õ»Ó„¨:m6Õ»×~“??'\¦“??'\ àá*›Mµnôá*›MµnõߤÏÏÉ×)¤ÏÏÉ×(88Jƒ¦Óm[½8Jƒ¦Óm[½wé3óòuÊi3óòuÊ é´ÛVïN é´ÛVï]úLüüršLüürƒƒ„¨:m6Õ»Ó„¨:m6Õ»×~“??'\¦“??'\ àá*›Mµnôá*›MµnõߤÏÏÉ×)¤ÏÏÉ×(88Jƒ¦Óm[½8Jƒ¦Óm[½wé3óòuÊi3óòuÊ é´ÛVïN é´ÛVï]úLüüršLüürƒƒ„¨:m6Õ»Ó„¨:m6Õ»×~“??'\¦“??'\ àá*›Mµnôá*›MµnõߤÏÏÉ×)¤ÏÏÉ×(88Jƒ¦Óm[½8Jƒ¦Óm[½wé3óòuÊi3óòuÊ é´ÛVïN é´ÛVï]úLüüršLüürƒƒ„¨:m6Õ»Ó„¨:m6Õ»×~“??'\¦“??'\ çŠh§9 Œ‘—áÄÇ/ä¼üÕ6Xý´¾Ëû…q œý)ÎqsQ¼“ý(•>Xý´¾Ëû„ö45z ü¡rÒüßE÷X}ÛWUG„ƒ?(\´¿7Ñ}ÖvÔ¢¨6üLÊÓ`IÚçR2¦:‚F8¹ã7é]pï yÕ‡Zƒ(è*l«®®¦šŠkR傞YÚç=­8}؈.PñŽTè«…¿c:wÀ-z3'm3£,ÄÙ\H‘~§×\Þ=G‘O§A-£-u3ë¢n9)›+LŒn­e·Þ|5þñʃ©D@DDUìP×ÍE £U,!®“E¥t¡¡ÃUøx¯¸ñòç‡]æ;wÙÒn^ì»J"ÚÊ«B¡²:()éàÀ/â“ÆH ®q h¼¸€ –Î]Ù™?GCUjC=$u9Ìby!‰ð` >ö>@é.¿þ“×¶ðæâÝ"£‡_æ;wÙÒnN˜íßgI¹wع^ZÙ™mÅ=<Äû„íªÄ ¿¿Ìvﳤܜ:ÿ1۾ΓrߢµÀpëüÇnû:MÉïó»ìé7-ú%@ÀpëüÇnû:MÉïó»ìé7-ú%@ÀpëüÇnû:MÉïó»ìé7-ú%@ÀpëüÇnû:MÉïó»ìé7-ú%@ÀpëüÇnû:MÉïó»ìé7-ú%@ÀpëüÇnû:MÉïó»ìé7-ú%@ÀpëüÇnû:MÉïó»ìé7-ú%@ÀpëüÇnû:MÉïó»ìé7-ú%@ÀpëüÇnû:MÉïó»ìé7-ú%@ÀpëüÇnû:MÉïó»ìé7-ú%@ÀpëüÇnû:MÉïó»ìé7-ú%@ÀpëüÇnû:MÉïó»ìé7-ú%@ÀpëüÇnû:MÉïó»ìé7-ú%@ÀpëüÇnû:MËÓ-·½í`±m¶—/}ÚÑüIÔï:–õESþ–oAß‚T  Ϻ"æ‚Ûï'‹Wà¿sLéÿ'nRŸõóÿøŸ\«*—4ΑòvåÆÚÈ$´j(c~9iØÇÈ@!£+†¿{ÿ¸ý÷N¨ìï¥ÖçÙRþAoMòj¾ô}ÔJ£,~ˆÚ_eý·¦ù5_z>ê%Q–?Dm/²þá= G„ƒ?(\´¿7Ñ}ÖvÕÕQá ÏÊ-/Íô_u‡Ýµ5}-m«hV6vA$”GG;AséçÓœåÚ¯J×ÜቧQ7ÐÚY!mTd­%ÐË›²YB[§ÍMR†ºK£iÏ5×·½x½Ëx‰cW’UóÐUÀÙ©ƒ¦¤µ i.uÁÕS‰#¿W¾ä¦HžÛÙ$Õ,ªÆ;Û‰d±°´EÂç^¿t‡ù1웹4‡ù1웹7 ;&Ée•ÿægª¨©—=QS>r¿ X kZ.cÞõ£äÞo$“`³šCü˜öMÜšCü˜öMÜ›†sH“É»“H“É»“pÑ¢ÎiòcÙ7riòcÙ7rn4YÍ!þL{&îM!þL{&îMÃF‹9¤?ÉdÝɤ?ÉdÝɸhÑg4‡ù1웹4‡ù1웹7 ,æÿ&=“w&ÿ&=“w&á£EœÒäDznäÒäDznäÜ4h³šCü˜öMÜšCü˜öMÜ›†sH“É»“H“É»“pÑ¢ÎiòcÙ7riòcÙ7rn4YÍ!þL{&îM!þL{&îMÃF©­?}3ùZ¹t‡ù1웹y|®ì7 È h‚L«Â",‚" """ "" ë~‚[W'-K:1³UÒKòCCœÂÐMÀê¼®. ¯Š×¬1ÃA5 m\U’IPçÄæ26álxnqýH!øÆëðœ=õò*0ÏÈÚúº 2‚±´¦³ †‘€½Ò ¸›=;Þç´°Ú{°^ðKî.^m-K²K+á…¬–kU²:š6ºâI¥Ž 7K˜|w\Fµ¥D±š¯ÉÖÛU­ªŽ¦¦š†® äÌŒ˜dÏ–Å&ÝNä’îø:.»âµ²J¾Ñɘ©ÔÜ#+ª'¬•ÎvK-4Ñ\Óuå­t¬koÖ#`îì‘,dí{VWQÀÁ®²à†X@´õ/•äÜ0µ¡‡V½daËAÖ" å´¾j¬ûþR®òWè}‰÷=ÛUiÀµÍkšu¸^î ñ©´‡ù1웹Xš4YÍ!þL{&îM!þL{&îMÈÑ¢ÎiòcÙ7riòcÙ7rn4YÍ!þL{&îM!þL{&îMÃF‹9¤?ÉdÝɤ?ÉdÝɸhÑg4‡ù1웹4‡ù1웹7 ,æÿ&=“w&ÿ&=“w&á£EœÒäDznäÒäDznäÜ4h³šCü˜öMÜšCü˜öMÜ›†sH“É»“H“É»“pÑ¢ÎiòcÙ7riòcÙ7rn4YÍ!þL{&îM!þL{&îMÃF‹9¤?ÉdÝɤ?ÉdÝɸhÑg4‡ù1웹4‡ù1웹7 ,æÿ&=“w&ÿ&=“w&á£QTÿ¥›Ðwà¨t‡ù1웹4‡ù1웹,J×Ïÿâ~qH%/ˆÆö5¡×ÈÂK›qÔ âã}Æýzk¼*›-LR±µ2ÀùAX°âñÝx _¬qxõ*nçeóý³¶gaEZÀʦݤM Ÿ«`9¸‹/_‰ÚÜ{Óªæñ‹Ž³~ª«;éu¹öT¿ƒÓ¹Ù|ÿlí™Ø]VeŒË2¢¦}.ª¦Z€Æ½õi76û®¹£Ê(;i¾MWÞº‰TeÑK쿸Vôß&«ïGÝDª2Çè¥ö_Ü'±¡¨ðƒÐgå –—æú/ºÃîÚºª< ôùBå¥ù¾‹î°û¶ •')­ªêr¾:zúÈt[6*šx#¥kà’Ré¯ÏÈc9¶Û%ìb7‹‰v–TÙöU¹IeUœÕ` ~z.7¸±£78opðÂúÈ¡v‹5S–öm%œêÚˆjaŒÏ˜„M›ˆL{î'½áŒ#6ûÚ÷5í-¹Í´èr’‚§'£¶`/–žGØÆas)“48I2w¸±añâí([¢ÄÖÓÚ–ƒké-&½µ9ªzÚrà hÚœv,uŽþëžëøšs¿H v¥Uµ4lð|¸Øíq5ÎfÚã(¸1úÜÀDân% B,ôùEVÊË.¬§}Mh§–*vlÅ+ñµÍyf£±ˆ¸{Þù·Æì´¤m4sð}ymCc’ˆõŒ|‘ÆÎÿ½Í©0Ũܡ¥EWGoRÖÖEKsË¥\\ßåæl/ñøÜàGî㻉Z ¨lÖå¡m×ÐÙqYÅ”Œ‰ÎuTi8Áºì ù'“ĺ¸3,y» o7arPÖTPÚÙS=€Õf¨™ gxk\÷µ ^ZâH isq:æâmø‚×Ë{RŽÇmmŸ „”4¬´™=ÍÍ5Ï ¼É,n…Ç3(s0ÌèÜÒ%£¢×Á™cÍØ[y» Á™cÍØ[y» ’Á´íK%¬¼A[C]mÚ”ðRà ØöËU-ùÇIטœÐ YòÁ.ïMëzÓµ-f¾á ·eÓÍK48ç{Ý-,·ç&ÜekH È$;¾*_e7amæì'e7amæì*Š\¹ÊŠ«:–­öu%-FSKBú†0ˆÛ-DÝ•óÙïÅt7¶ñßÜÞÎí-ˆ qLÊ$«–ZZw²°C$U±Q9îç\é³ ´´7'Œ*_e7amæì'e7amæì+ÛЬ«u¥I^`’ªÎ«ÏšÌl–ø£”80¹Å· CnÄoÃ~«î P1\–<Ý…·›°œ–<Ý…·›°¶¨•Á™cÍØ[y» Á™cÍØ[y» j‰P1\–<Ý…·›°œ–<Ý…·›°¶¨•Á™cÍØ[y» Á™cÍØ[y» j‰P1\–<Ý…·›°œ–<Ý…·›°¶¨•Á™cÍØ[y» Á™cÍØ[y» j‰P1\–<Ý…·›°œ–<Ý…·›°¶¨•Á™cÍØ[y» Á™cÍØ[y» j‰P1\–<Ý…·›°œ–<Ý…·›°¶¨•Á™cÍØ[y» Á™cÍØ[y» j‰P1\–<Ý…·›°œ–<Ý…·›°¶¨•Á™cÍØ[y» ²zØ)Z-JÆàáN\XÀ‹‹€'s©TÖŸ…>™ü­R`s¼C ,‘Ç I!àq€yœPsrme*< ôùB‰EqÛ6‹lø) $¾z¸`½ï¼49àp]×Ýûÿ’ìTyMà,Ïù:oÎâ"«ÊZ¹ìü•¶+i_›¨§¢šXŸp8\Ö ÇQÖ DXØ-Ú›:WO¶íZ-â²…´Ò6wËp¶yCƒ\ÜÎ=k®Òùª³ìùJŠÊ¶k(è2^’'ж‘ô‚s)%ø¤¬ƒú«ð»-sdsLwÆì%Ö zà̱æì-¼Ý„à̱æì-¼Ý…IWÛ¶V@صpŽª¤±"´­;éÁ&0¹…Ò>vâ#ÊIivxk¬*òÞØ²ìê‹b²–†jÕÚ4°ÓÂ^Ù£ —µîy$ Å1ahiÖqâýj×Á™cÍØ[y» Á™cÍØ[y» ‚jûjÈÊ«^9ji+-Šª+>&ÒÙå­yÇXòÒÇÔHc%uæVCQ7qÙYMjWå3ŒpAGiÚSÙÏtñç á–Ò.q¯×‹G#áÇòŸ‡¾T ¾ ËnÂÛÍØN ËnÂÛÍØ\Ë[xÅlNÈ,ÜʼnDúª¢æ?C¢žª'±ƒÌ؃‰vnûˆ’ûÅ~SeE¹_`å$rÙ‘ÇcËOiÐÅ+ŒL8¡Žvâk³Åòawx!mÁÄâ!—¹P/ø3,y» o7a83,y» o7apQM6LZŒPYvm˜÷>Êa³èI}+[=[át †Çú×6ð{ÍB(ûç|–ñåRp¦R=±ÐË %« ÔÆÜR77Ue¹ÌÅy»¿™áÖ6xÚoT ¾ ËnÂÛÍØN ËnÂÛÍØTYKm2®ÂÊ7GIPûFÇ‘Ô4p@Zè EE Z×¹ÒÝ)nu¼Ðv­¸¯n‚ÃÊ;~»((ì«Fš’•íeSêcLŠrË›ÒOùaÎy!€÷¸ÅÊùÁ™cÍØ[y» Á™cÍØ[y» ¥¯´­ ª"ŠZHlû:ݳ)e‰Ð9òÌã5,¸Û&0?ZÑ„±ß$ëï»Úú\¹ÊŠ«:š­öu%-FSKBú†0ˆÛ-DÝ•óÙïÅt7¶ñßÜÕ@·à̱æì-¼Ý„à̱æì-¼Ý…ÉÝ¥±Ž)™C$•rËKNöBödж*'=À¼ãk6p4–†àÄâqŽˆ²‡)*rŒäì/²…T:@¨®}<˜RH×6%üUX Lž,xµ`*ïƒ2Ç›°¶óvƒ2Ç›°¶óvE­––•¡’uÕ°>’Š › JˆDs8ÍÆÏp”\­§6ZÒXsyÂæ6âl¢¶¡6µ.r’jø«a³è#‚ˆ“4º4u’;[qk¤ ·gɪçe7amæì'e7amæì*JL¦µ-BzªÈ ÇÁ´³PÔG­Ÿ…&§t­å¬wêË®÷8GßËÝØüµ·¢³¬šÆÁfÎûnž º8 §kê)c1ÈüNÆpÕü5·_×Ü¿ƒ2Ç›°¶óvƒ2Ç›°¶óvLùEiQd¾UTÎ)&´,&JŒ‰ÌŠw6™“´à.%£õ¤c7á&ñ}Ãöý½G”ô9?Q5›4óT@é*£¤|m̾:§–Ì®!÷Ò|¼D~³ä÷ºÕóƒ2Ç›°¶óvƒ2Ç›°¶óv²¶ÒšŽÃš¶žÍ¨‚Ûe%u4:;†ŠÓUHÌ.%äHð*AkÀeÎŽü&û„vv]eM =]U•46¤PI@ésc7žš›Þ¶w¾v´T5ÅØaù Ó Â¨|–<Ý…·›°œ–<Ý…·›°¥§¬¶—6] M¥C.f’»Km#^-ƲøËÎjAñ—÷¤‘vræì b¸3,y» o7a83,y» o7amQ*+ƒ2Ç›°¶óvƒ2Ç›°¶óvÕ b¸3,y» o7a~‹;+XqL˱ o,–W87Çp-ŸÝxþ+h¢©ÿK7 ïÁ(gæ`Ži/¹® _üW…-Oú©½7~*%•A7ɪûÑ÷Q*Œ±ú#i}—÷ Þ›äÕ}èû¨•FXý´¾Ëû…} G„ƒ?(\´¿7Ñ}ÖvÕÕQá ÏÊ-/Íô_u‡ÝµM§“PÚ•ÕWVEU3)*©¢Íæç‰¥ç ‰ap¿8ðK\ÓqÕq¥fMCW\ê]YRTÃW=4Y¼ÜÒÄXZç0¸x(Á p7”’nÑ,PŒ•§h{Ù_^ÚœûgФ½Ž|D0Æ.ÄÒלs žò½Äµ¥½²ØñOd >jŠ™.sdx2 Zñ#dÖ0ÞƒnÂ.õX¢ Ór.Õéu6…}UIœNée1çS¸^Æ‹¿ÊÆ5"ïu;&)dÒ¡–ª±ö}Nx¾ƒ8òâÎÚÍåï79ÄëÀ[†íÅDvÇ ÕV}]L¶h§™Ì—7cÖ\ZùND;Žö´·’<¢ciØúºÉb¤Í6Ž7¹€SFÉcFÒ šL1‚^\뛨‚I:$K–%Œú:ªËF²(YWU#œØ¡•ÒGLÒ‰¬$7彦GÖâsµß„vˆ‚ Ï&Ù·ß[Fd ­†@’,l˜¼=¤\o8~£yªÚ²ÂÉëBž–ž¶Ã¢©‚‘˜)㚀=°¶à.`-¹¢æp䋱gKdØ”6Œö‘KO]>,õL4A’Iˆâv'Þo J«&Ä®´`´k,ŠZŠè0æjf¢’<'p¸¶ñq$‹¸Š¬DÜ,á²lJyje†È¥ŽJ©[=CÙDe‘®Æ×¸†÷Îï:Áׯ¤} •#ÇÙ°¹d¬sM%á͕إ½Öá{‡ífõP‰¸]ÐÁAfQÇGAFÊJXïÁ Æ66òI¹ \/$Ÿû®!žL›'nYÄMÃG¤3É“díɤ3É“díË8‰¸hô†y2l¹4†y2l¹g7 Ï&M“·&Ï&M“·,â&á£ÒäɲväÒäɲvåœDÜ4zC<™6NÜšC<™6Nܳˆ›†Hg“&ÉÛ“Hg“&ÉÛ–qpÑé òdÙ;ri òdÙ;rÎ"n=!žL›'nM!žL›'nYÄMÃG¤3É“díɤ3É“díË8‰¸hô†y2l¹4†y2l¹g7 Ï&M“·&Ï&M“·,â&á£ÒäɲvåUhœN¹À9äŒM#ö[ʸQ&GšÊêHj3rÕ@dž2öº@ïG‰VµöSÖ‹CS[EõÏ&èÍí¼—^I?(nxÔ¤’²&•òËeP¾G’ç=Ôì%Äñ’nÖWžç¬O3Ùþ¬ÍÊ ü¡¬¦¨ŽÍd5HáiSðMØÇ"Ñ*øì+"Y,VU $akÛNÀZGíEX .[N‚+Vʬ³§sÛ \îaÁ®ii"ûõÜWR å´("´©™Î{ZÉáœ(älüW°_û¯âT6ÆG2ºÍ´`§«›õÑTº–šW4C ó2FºKÃq›Ì²^ œ3pÔÛµ‚‘Ù1K&• µU³êsÅôÀد—pÞÐo/y¹Î ^ÂÜ2G` pÍUi×ÕÔÁ;fŠyœÀYpsp†1eů‘¤áÄC¸ïkKmÑ%µ“PÛZOùêÊ=.›DªÑ³g=}sN6:ë³ÖÛ|o¾át‘äôQO1m}{idt² FL#c!q{ƒš—’÷›‹È×€ [†ÝP³%£…‘¾ R¾Æ:WÆf±¸HZçŒ3±„á`7‚o½Î.å¶r6 ëЦ¥žaQ>rXŒò—7:êCJ18‚âÜ$Mî¿]ç‰j,RE“P¶©•µÕ•UñÉÙU.l<€Ì,cY†ée½¿õ‡]ᥰQä} tÐCWY¢C˜s鋘Y4µŽG8ƒ†j=MsZp Æ·_¢D±WA`ÒÙÜ™’gpm¨aÆAÅÍëuÃ[¿TÞ+†³«’Ñ={-UlsÞèžÖµ¢òIಱlêhl{×Ð0Úu#"d§Æøc xk®7_uÆã­r¢DÐï­°²zÒdl¯°èª™ä{=xkžìO"öê.v²|gY]‚™¼4lnjWÏÔÄ`‘ø±´¯ŒRw®… †ÆF‹s€oÄyTo²lI+*«$²)]UW‚¦gQù£ Ç» îmÀ Ž­AV"nt¶M‰CgOgQÙ´ô3âÏSCD˜†bhmÆð7ñ„ŽÉ±"Á›²)Y›Ãƒ pæðÝÞê»3Ü™¶y"êÄMý–OGQWPˉ³Ö±ìª‘´:v¼Þðó†÷dïñ®Š:*Îd ¡³a¥d {!l˜m{ƒžu8@ã ª7 :«&Ä®´`´k,ŠZŠè0æjf¢’<'p¸¶ñq$‹¸ŠCdØ”òÔË ‘K•R¶z‡²ˆ4Ë#]¯q ïœßuƒ¯V"n¤cØû61앎i¤¼9²» ÷ºÃÜ/pý£¬Þ”t6UœÈCfÃJÈöBØ)0Ú÷<4êpÆ@%T"nðPÙTµTSٰ×YŽWÉP!8È$_ lwq~»ÔÅ “]jÙ¹5MAG.l>¶½Ò;Dk³­eT‚I0™¢k{ç³V#òµ/!Cx‹ce=©mÚ,ŠÍ¥³h´ØÍT’K¤sn§£x$4·8ï×–q·Piýœ.º–Þª¨É[2Ô£Žg¯Ž)Dr3˜Ìãƒ#¦W‚p‚ ÁÄå ,Õ·__S%DsÙQPÓÏ<Œ/sÄÎ’8ŸŠ9ïï×Ñ€â-Û½¤ Ê;f¶¦ÈdbʆºÔ¤£–J“F÷¶HêåÁ‡8 Í;î7<øî @E“ÉËR¾ÓÊk@Ï30R2ÄÖ» ¥eMTFFîð8Eyn³­£{¯=4ò‰ ŽfSJê›fyDù£žkcµibk É7‹®CS#±­C騲y-”V½³<¯³ÙOI[I¦Sckƒogz•î] ½å±Ýp½½ðX‚šŠË–ÝÊk^ -[F–*XéÝ)dkEï¾üM>HâýêÛ¸fýb·vñü5D4Í?)ô,þ/þžÑïÎhùÇgðaï±f³—`ïïù=õË¢lä±÷WÜçùŽ—¤ç¿S›ðæ³ê|&«ÿÛšZ„Z÷ ϬVîÞ?†£›#©é˜>T[Q0½¬}LMÎpkF¶q—ñ’¦¦ªÊš{9”V=«-¯ShYsÉ$ .Ž(@¤mA/gxÖç8so¹ÅØpå^ûÛ~MXU>Ü«5V}5]­ž–S#$†¢÷4 Œr63=Á€=å·œoª5½Ã3ë»·á§pÌúÅníãøk%iÕyü¡–:ëWNÍZ)éèêpæ°K£`”˘Åà̳;‹Qÿ¨V“+g¦¥ŽÀ¢|¶Ë(ÙiŠjÕyùZ(æ{@t­”^Kv¶›ÍíuÁÓÜ3>±[»xþw ϬVîÞ?†¨¨ÎPJŽÓ× ?75.vg4ÁIK^ç¸ÊCñIO5J›>vUÆØÚ\÷5º¥kûNtN‘€†°n"‚{VºKkY´ºME¯ZÚ:ak®§Š)„½{\æÎöœböÊÓy¸1ZdXÚ\¥¶ªEc] 3SÒGú—¹¤º¡õÂ;á)`?ªÕ/–àà ¸¹GQVÏlCILÛ4UÖGB´@óqÿ8ㄵڴr3dƒ¤x%×kPÛ"í¶LV¬Ì†ƒ3dR>¢ –¿îŽj˜ÜÖ ûÀñOx$»÷]%÷Ê"Ãd”1A>LÏ LŽkBÂ’¦¶F4TÊ 1HGËuò?¾7žýÜ¥åvÌ¤Ž—.-¼Û¦vvŠ’Wgf|—%MḉÂÞF‹€ñû-$pþ¨jé‹ç³jñ‡Ì÷0a’˜ -' ?~/ã7 Ð¢"€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆ"¦ù5_z>ê%Q–?Dm/²þá[Ó|š¯½u¨Ë¢6—Ùp¯±¡¨ðƒÐgå –—æú/ºÃîÚºª< ôùBå¥ù¾‹î°û¶ ô!‰³¾qÏkXéF'5¤ ñ€\ë‡ï<«–ªÆ²ë©E-]›GQN$3¥¯f2I.¸‹±çxõžUÚˆ9i¬Ê 7µô´4Ð9­À×EZCnkn+£Œ]ÈÆò–Ì žÎtÔ4ÒP†µ‚™ñ4ÆÛ°Œ$]p¸\³»)Âlå¬îʦD¹<&ÎXúÎì§ ³–>³»*™ä\ð›9cë;²œ&ÎXúÎìªdK‘sÂlå¬îÊp›9cë;²©‘.EÏ ³–>³»)Âlå¬îʦD¹<&ÎXúÎì§ ³–>³»*™ä\ð›9cë;²œ&ÎXúÎìªdK‘sÂlå¬îÊp›9cë;²©‘.EÏ ³–>³»)Âlå¬îʦD¹<&ÎXúÎì§ ³–>³»*™ä\ð›9cë;²œ&ÎXúÎìªdK‘sÂlå¬îÊá­™³湤—CoÕ©£Æ"äE,`é²²¦ÅŽ{8ä͹Pè«keŽŠBÇÕJö–ÒÂöëRÿˆ?TmÿQ—°¶è–>am[U¹MiØ1Ç“–Í6iÓÊ÷ÍE(hh•„’K@~µôôD™DPrËfPOg :ji(CZÁLøšc mØF.¸\.+‚êD¢Ì l€PÓ_i‰¸]A2.ÖÐë›Å¬ò¯XÖ\Ô®¥–Í£};¢d&'@Òà ,i]…¤’¿RíEG(³(à4ÂÀÚgF"nDÐ@Œ‹µ´:æñk<«©qEcYpI<‘Y´q¾¢FÍ3™A–F»\ãv·këZíDKGK>=M ™øÄ3cŒäbþõ×ñ·¾v£«¾<ªC N“˜˜fc\ÆÈZ15® ˆÖÞ?pä^ÑD@DDD@DDD@DDD@DDD@DDD@DDD@DDDA7ɪûÑ÷Q*Œ±ú#i}—÷ Þ›äÕ}èû¨•FXý´¾Ëû…} G„ƒ?(\´¿7Ñ}ÖvÕÕQá ÏÊQVEO_äŽj&G~zMxZþ÷ Xk9(¶ò|4ÃYÉE·“ᥠQE†³’‹o'ÃL5œ”[y>P•Xk9(¶ò|4ÃYÉE·“ᥠQE†³’‹o'ÃL5œ”[y>P•Xk9(¶ò|4ÃYÉE·“ᥠQE†³’‹o'ÃL5œ”[y>P•Xk9(¶ò|4ÃYÉE·“ᥠQE†³’‹o'ÃL5œ”[y>P•Xk9(¶ò|4ÃYÉE·“ᥠQE†³’‹o'ÃL5œ”[y>P•Xk9(¶ò|4ÃYÉE·“ᥠQE†³’‹o'ÃL5œ”[y>P•Xk9(¶ò|4ÃYÉE·“ᥠQE†³’‹o'ÃL5œ”[y>P•Xk9(¶ò|4ÃYÉE·“ᥠQE†³’‹o'ÃL5œ”[y>P•Xk9(¶ò|4ÃYÉE·“ᥠQE†³’‹o'ÃL5œ”[y>P•Xk9(¶ò|4ÃYÉE·“ᥠQE†³’‹o'ÃL5œ”[y>P•Xk9(¶ò|4ÃYÉE·“ᥠQE†³’‹o'ÃL5œ”[y>P•Xk9(¶ò|4ÃYÉE·“ᥠQE†³’‹o'ÃL5œ”[y>P•Xk9(¶ò|4ÃYÉE·“ᥠQE†³’‹o'ÃL5œ”[y>P•Xk9(¶ò|4ÃYÉE·“ᥠQE†³’‹o'ÃL5œ”[y>P•Xk9(¶ò|4ÃYÉE·“ᥠQE†³’‹o'ÃL5œ”[y>P•Xk9(¶ò|4ÃYÉE·“ᥠQE†³’‹o'ÃL5œ”[y>P•Xk9(¶ò|4ÃYÉE·“ᥠQE†³’‹o'ÃL5œ”[y>P•Xk9(¶ò|4ÃYÉE·“ᥠQE†³’‹o'ÃL5œ”[y>P•Xk9(¶ò|4ÃYÉE·“ᥠQE†³’‹o'ÃL5œ”[y>P•Xk9(¶ò|4ÃYÉE·“ᥠQE†³’‹o'ÃL5œ”[y>P•Xk9(¶ò|4ÃYÉE·“ᥠQE†³’‹o'ÃL5œ”[y>P•Xk9(¶ò|4ÃYÉE·“ᥠQE†³’‹o'ÃL5œ”[y>P•Xk9(¶ò|4ÃYÉE·“ᥠQE†³’‹o'ÃL5œ”[y>P•Xk9(¶ò|4ÃYÉE·“ᥠQE†³’‹o'ÃL5œ”[y>PS|š¯½u¨Ë¢6—Ùp®`ñE&uÑÉ1’èœâÀÆñ<“âTÙcôFÒû/îØÐÔxAè3ò…ÇꦂœÊV2V6L9ç—à‘u÷_û®Ê=~P¹i~o¢û¬>í¨3•‚zL¢uUy´›Nú˜YIUMR5Ø"’,]ó!xÅ›uÂFœMÃ{=Ôå5du§jGe2[:µX^*®¾ aؘ[sZ]€!Î:ÚKEçåi²» •ÜjUUÂc–VÒG,‘]Þ=ñ´às†sœÛÆÜ{Ñw<ô–UKêLÙ5”mCdkâ4µ±œ=ÍeøXç:÷4N×ßèõPZN·g²é,ªgÖb{§ÏÚ2ÚY )8iÚ¯œ ƒZ;Òî7º²ZÜžÞ}§UuÔÈIŒ#Zúhd-s@»Q}÷â:ÜF õ•´4•¶Û-#de4' ¹ÖÓÓTÂéñ C±±À€F#ÇÆ5ÚRUÒÐ=î¤É»jö±®dVleÌ[s@¸Û›xÜÖŽ&‹”2t™QQGCaVÚNq´‘Z®Š©ò †>šºKƒ Íøñ\5ZѪ6•¡‡+«ŸgUO-ˆø$Ñß$ÆxiÚÇ_{œù!kÀnøˆÜ‰¤1ym%Ž;NJ[Om< § ™Íͱ’FÖu8ašA®ûñk¾ápRÙ¢Ær)œç9®Ï¾*§NÒ ÅÙÆ€ñpp=þS¯ 5<•SB^úf@ça,ŽYo ‚Cð‚.4¸jýz½á¬ä¢ÛÉðÕ=-¥f*kÝŽ-Xc|¸CCZÞ&´BáÆn¼•7¿Ìvﳤܥ ,5œ”[y>a¬ä¢ÛÉðÕo¿Ìvﳤܜ:ÿ1۾Γr´,°ÖrQmäøi†³’‹o'ÃU¼:ÿ1۾ΓrpëüÇnû:MÉBË g%ÞO†˜k9(¶ò|5[ïó»ìé7'¿Ìvﳤܔ,°ÖrQmäøi†³’‹o'ÃU¼:ÿ1۾ΓrpëüÇnû:MÉBË g%ÞO†˜k9(¶ò|5[ïó»ìé7'¿Ìvﳤܔ,°ÖrQmäøi†³’‹o'ÃU¼:ÿ1۾ΓrpëüÇnû:MÉBË g%ÞO†˜k9(¶ò|5[ïó»ìé7'¿Ìvﳤܔ,°ÖrQmäøi†³’‹o'ÃU¼:ÿ1۾ΓrpëüÇnû:MÉBË g%ÞO†˜k9(¶ò|5[ïó»ìé7'¿Ìvﳤܔ,°ÖrQmäøi†³’‹o'ÃU¼:ÿ1۾ΓrpëüÇnû:MÉBË g%ÞO†˜k9(¶ò|5[ïó»ìé7'¿Ìvﳤܔ,°ÖrQmäøi†³’‹o'ÃU¼:ÿ1۾ΓrpëüÇnû:MÉBË g%ÞO†˜k9(¶ò|5[ïó»ìé7'¿Ìvﳤܔ,°ÖrQmäøi†³’‹o'ÃU¼:ÿ1۾ΓrpëüÇnû:MÉBË g%ÞO†˜k9(¶ò|5[ïó»ìé7'¿Ìvﳤܔ,°ÖrQmäøi†³’‹o'ÃU¼:ÿ1۾ΓrpëüÇnû:MÉBË g%ÞO†˜k9(¶ò|5[ïó»ìé7'¿Ìvﳤܔ,°ÖrQmäøi†³’‹o'ÃU¼:ÿ1۾ΓrpëüÇnû:MÉBË g%ÞO†˜k9(¶ò|5[ïó»ìé7+‚×47KIhvÆ/Ýÿº‚(^÷²Là`tr˜ÎÞµ×Þ@?µÉâR(©¾MWÞº‰J€ õSA Îe++&óË€pȺû/ýÔê*_›è¾ë»j ±=S+r¦©‘Û襾 ØëËii.¥‰à¾èÄÖ¸—¸ßx7\î%}>UÉR¾Ë†Ë©žgŽžiãŠW½íkc1áF’]#HÝé¸b÷[5™Ÿµì³eZ5f°W6– $ŒG¬´÷·±€j»ä“Ç­E)¡žÑÒdîP±5îh£œF÷¶ì/tc¼s…͹Ä0¶ãÞ‹¨ô̦¬›e1•’ÕšX"–« Cƒ!l¤4¹Ž Œ›ƒ^ÓŽ2×9®Ä<7,o³íšƒAsìª'TÈÁ6§½¨ìÉÅNnu×àKG„RYMñ3&²‚0\×5ñÒÔ5ña5±¼Q´8°†€÷.q¾:«:Ŭ¥Õ+n¾‰ìÐêtMò\Xàç9Áμ‡8¸âJPí‡)+ë%ô–e3ªdž­±6jÇ1†*yDNsœ#$8¹Âæ€EלWê^WÌmág²Å¬,d‘CPìÜŽ|O‘¬wè°´HÜDʹÄsqxš;>h[sÙG %•¯§§©†@dy|ƒv8Þ[}׫P¸"³UìÉ›v<Ö 0ÇE;!%€¹ŽsC[q-$`mǽ(~Z¶•E6ULÉùhá‚ÏkXÊ—Ä[$õf;îhïÅÌi7ž&–tŽUù7–52ÑØÔ&Ϭ¬ºš’*ª¬=ùÙ!ø¯–#K‹¤k¾Q¸êÅqQ5UCê&ÉËuÒɘÄía~fC$|\$þþ#x\°RYTϦ0äÖP1´í¬ˆRÔfÎlÇ9—á{šÛœà\0·_z.P·²­jËIò‡Ùì§Nc:¢÷0\MÎnÄ€à%¿ µís^ð¬Èª¼áx|X¦x7~û£?ŠÎQ=øé2w("!ÁÂê9î°ÅC†?ÒojÇ_æ;wÙÒnJXk9(¶ò|4ÃYÉE·“áªÞ˜íßgI¹8uþc·}&ä¡e†³’‹o'ÃL5œ”[y>­á×ùŽÝöt›“‡_æ;wÙÒnJXk9(¶ò|4ÃYÉE·“áªÞ˜íßgI¹8uþc·}&ä¡e†³’‹o'ÃL5œ”[y>­á×ùŽÝöt›“‡_æ;wÙÒnJXk9(¶ò|4ÃYÉE·“áªÞ˜íßgI¹8uþc·}&ä¡e†³’‹o'ÃL5œ”[y>­á×ùŽÝöt›“‡_æ;wÙÒnJXk9(¶ò|4ÃYÉE·“áªÞ˜íßgI¹8uþc·}&ä¡e†³’‹o'ÃL5œ”[y>­á×ùŽÝöt›“‡_æ;wÙÒnJXk9(¶ò|4ÃYÉE·“áªÞ˜íßgI¹8uþc·}&ä¡e†³’‹o'ÃL5œ”[y>­á×ùŽÝöt›“‡_æ;wÙÒnJXk9(¶ò|4ÃYÉE·“áªÞ˜íßgI¹8uþc·}&ä¡e†³’‹o'ÃL5œ”[y>­á×ùŽÝöt›“‡_æ;wÙÒnJXk9(¶ò|4ÃYÉE·“áªÞ˜íßgI¹8uþc·}&ä¡e†³’‹o'ÃL5œ”[y>­á×ùŽÝöt›“‡_æ;wÙÒnJXk9(¶ò|4ÃYÉE·“áªÞ˜íßgI¹8uþc·}&ä¡e†³’‹o'ÃL5œ”[y>­á×ùŽÝöt›“‡_æ;wÙÒnJXk9(¶ò|4ÃYÉE·“áªÞ˜íßgI¹8uþc·}&ä¡e†³’‹o'ÃL5œ”[y>­á×ùŽÝöt›•Ákš‰¥¤´; ã‹îÿÝA/{Ù&p0:9Lg‹ïZëï Úäñ*|±ú#i}—÷ Þ›äÕ}èû¨•FXý´¾Ëû„ö45z ü¡rÒüßE÷X}ÛWUG„ƒ?(\´¿7Ñ}ÖvÔ2[évQ}•'á"Ø,~K}.Ê/²¤ü$[¸Ar£ÂAŸ”-ÎTxAè3ò…$rÓ|š¯½u•EMòj¾ô}ÔJU•T¿7Ñ}ÖvÕ*Š—æú/ºÃîÚƒÆK}.Ê/²¤ü$[Éo¥ÙEöTŸ„‹`·""" """ """ """ """ """ """ """ """ """ ""ÎTxAè3ò…£YÊ=~P¤ŽZo“U÷£î¢UcôFÒû/î½7ɪûÑ÷Q*Œ±ú#i}—÷ >Õ¡¨ðƒÐgå –—æú/ºÃîÚºª< ôùBå¥ù¾‹î°û¶ ñ’ßK²‹ì©? Ácò[évQ}•'á"Ø-ˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€³•z ü¡hÖr£ÂAŸ”)#–›äÕ}èû¨”ª*o“U÷£î¢R¬¨¢¥ù¾‹î°û¶©TT¿7Ñ}ÖvÔ2[évQ}•'á"Ø,~K}.Ê/²¤ü$[¸Ar£ÂAŸ”-ÎTxAè3ò…$rÓ|š¯½u¨Ë¢6—Ùp­é¾MWÞº‰TeÑK쿸Yö­ G„ƒ?(\´¿7Ñ}ÖvÕÕQá ÏÊ-/Íô_u‡ÝµŒ–ú]”_eIøH¶ ’ßK²‹ì©? ÁnDDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDœ¨ðƒÐgå F³•z ü¡I´ß&«ïGÝD¥QS|š¯½u•eE/Íô_u‡ÝµJ¢¥ù¾‹î°û¶ ñ’ßK²‹ì©? Ácò[évQ}•'á"Ø-ˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€³•z ü¡hÖr£ÂAŸ”)#–›äÕ}èû¨•FXý´¾Ëû…oMòj¾ô}ÔJ£,~ˆÚ_eýÂϵhj< ôùBå¥ù¾‹î°û¶®ª=~P¹i~o¢û¬>í¨ê%*Š›äÕ}èû¨”«*(©~o¢û¬>íªU/Íô_u‡ÝµŒ–ú]”_eIøH¶ ’ßK²‹ì©? ÁnDDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDœ¨ðƒÐgå F³•z ü¡I´ß&«ïGÝDª2Çè¥ö_Ü+zo“U÷£î¢UcôFÒû/î}«CQá ÏÊ-/Íô_u‡ÝµuTxAè3ò…ËKó}Ýa÷mAã%¾—eÙR~-‚Çä·Òì¢û*OÂE°[„g*< ôùBѬåG„ƒ?(RG-7ɪûÑ÷Q)TTß&«ïGÝD¥YQEKó}Ýa÷mR¨©~o¢û¬>í¨ê%Q–?Dm/²þá[Ó|š¯½u¨Ë¢6—Ùp³íZ=~P¹i~o¢û¬>í«ª£ÂAŸ”.Z_›è¾ë»j-ô»(¾Ê“ð‘l?&Žk*r‚Y;Èß+Z÷j >ð(¼0µzLü}pµ•ZLü}pšLü}p¨•ZLü}pšLü}p‚TQi0sñõÂi0sñõ QE¤ÁÏÇ× ¤ÁÏÇ×%E“?\&“?\ •ZLü}pšLü}p‚TQi0sñõÂi0sñõ QE¤ÁÏÇ× ¤ÁÏÇ×%E“?\&“?\ •ZLü}pšLü}p‚TQi0sñõÂi0sñõ QE¤ÁÏÇ× ¤ÁÏÇ×%E“?\&“?\ •ZLü}pšLü}p‚TQi0sñõÂi0sñõ QE¤ÁÏÇ× ¤ÁÏÇ×%E“?\&“?\ •ZLü}pšLü}p‚TQi0sñõÂi0sñõ QE¤ÁÏÇ× ¤ÁÏÇ×%E“?\&“?\ •g*< ôùB¾Ò`çãë…CQá ÏÊdrÓ|š¯½u•EMòj¾ô}ÔJUQRüßE÷X}ÛTª*_›è¾ë»j-ô»(¾Ê“ð‘l?&Žk*r‚Y;Èß+Z÷j >ð(¼0µzLü}pµ•ZLü}pšLü}p¨•ZLü}pšLü}p‚TQi0sñõÂi0sñõ QE¤ÁÏÇ× ¤ÁÏÇ×%E“?\&“?\ •ZLü}pšLü}p‚TQi0sñõÂi0sñõ QE¤ÁÏÇ× ¤ÁÏÇ×%E“?\&“?\ •ZLü}pšLü}p‚TQi0sñõÂi0sñõ QE¤ÁÏÇ× ¤ÁÏÇ×%E“?\&“?\ •ZLü}pšLü}p‚TQi0sñõÂi0sñõ QE¤ÁÏÇ× ¤ÁÏÇ×%E“?\&“?\ •ZLü}pšLü}p‚TQi0sñõÂi0sñõ QE¤ÁÏÇ× ¤ÁÏÇ×%E“?\&“?\ •g*< ôùB¾Ò`çãë…CQá ÏÊdrÓ|š¯½u¨Ë¢6—Ùp­é¾MWÞº‰TeÑK쿸SÚ´5z ü¡rÒüßE÷X}ÛWUG„ƒ?(\´¿7Ñ}ÖvÔ±é"6à”±‡XÐß%ëÖ*¾‘ýq½E/ƒƒÐ?™Ê$XªúGõÆôÅWÒ?®7®UW=¹EMc¸wóF\_yï\qÛuÚñ6)Í÷êÍ\~So ìU}#úãzb«é×Öz«(è)íÚ:ši«ª'1Ignrˆ_.2Î;»À<_(â²òŽ‚Ùµk),êšj¸i †SQO;ditŽ`ïxˆƒÇû_Ì48ªúGõÆôÅWÒ?®7®TAÕŠ¯¤\o\òWº*ÆR:¬çߥk.#„ 7ZÜ8øÿìW•Fÿ§PÿÆIïXƒDÙê^ðÖÍ!$Ü2¤ÅWÒ?®7¨©¿ÕCé·ñQ êÅWÒ?®7¥õ}#úãzåY¨²’¼ƒW5™LË3„B%ec6- ÓµÙ³mÅ÷ßêd\C_Н¤\oLU}#úãz¨}³eÇUSJûJµ±§ˆÎÐø£ç ïkn Þuk GlÙv„ŒŽŠÒ£©{ã31°Î×—F„¸u·"þ+ÅÈ-ñUôë銯¤\oU–Í—hFÉ(­*:–>C  íxsÃq‚·aÝÇp½%¶l¸$‚9m*8ßQ#¡…¯ Ë#]…Íh¿[ƒµ5ƒ©¾*¾‘ýq½/«é××* SÚF®,í=[䙉¯7×›¹uƒ¯ˆ®†IU %³¾áp%ÒÝøŸÜ³y#ônµŸß=h[þ–OM¿ƒKН¤\oLU}#úãzåDXªúGõÆôÅWÒ?®7ªfÓª³ÝgÃEI MEmIšs tRHIpcd]w{}«›gESoTPY®s°U`Ç‹]À=á—’÷\<|— »ÅWÒ?®7¦*¾‘ýq½e,l­¥´ÝfE(† ‹F›H†&NuÑC#˜í@‡Ý5àokqj¾å¡AÕŠ¯¤\oLU}#úãzåDêë_Ed¨¬À×ÈØ›úëÉsˆhþëÖ“??'\¬öSx 3þN›ó…x‚]&~~N¹M&~~N¹Q" t™ùù:åHVæ‡gܵŒSø•Ì¥—ÁÁèÌäâ«é×Ó_Hþ¸Þ¹W­hpežjY׺H¡…ØA’I/7›‰Âóq ^@ê%*Š›äÕ}èû¨”¨ *_›è¾ë»j•EKó}Ýa÷mAÛ’#n Ku ñò^½b«é×ÔRø8=ùœ¢AÕŠ¯¤\oLU}#úãzåUvõ¹ƒB橮 én¼‹š|ŽÔÉ’>ï †²__WÒ?®7¦*¾‘ýq½g²(è2nʨ««©¦dÍ‚I`§–vÆê‡1·àmüd›† xÂUå=»CcÇSM5uDæ) líÎBÑ åÆYÇwx‹åƒüCCН¤\oLU}#úãzåDXªúGõÆõÏ%{¢¬e#ªÎ}ñºV±²â8A“qÕ­ÃþÅyToúuüdžõˆ4Mž¥ï lÒMÀc*LU}#úãzŠ›ýT>›¬U}#úãz_WÒ?®7®Uš‹)+È5sY”̳8AÔ"VV9ÓbÒ ;]›1†Ü_q=þ IÖEÄ5øªúGõÆôÅWÒ?®7ª‡Û6\uU4¯´¨ÛQKšxŒíŠ0.p¾ö¶â çV°”vÍ—hHÈè­*:—¾33 íytaØK€[q/â¼\‚ß_Hþ¸Þ˜ªúGõÆõQIlÙv„l’ŠÒ£©cä0±ÐÎׇ<7h ëvMÜw Ò[fË‚H#–Ò£õ:ZùÚ ²5Ø\Ö‹õ¸;QX:[â«é×Òú¾‘ýq½r¢=¤jâÎÓÕ¾Hñ¹˜šóq-qi»—X:øŠèd•R[;î]-߉ýË7’?FàûYýóÖ…¿édôÛø9¸ªúGõÆôÅWÒ?®7®TAÕŠ¯¤\oLU}#úãz¡¶m:«=Ö|4TÔÔVÔ˜Ù§0±·E$„—8ñFE×x×·Ú±Y¶tU6õEšç;ÅV xµÜÞy _uÃÇÉz ¼U}#úãzb«é×ÖRÆÊÚ[MÖdRˆ`¨´i´ˆbdá÷]29ŽÔ}Ó^ö·«îZXªúGõÆôÅWÒ?®7®TAôQ6JŠÌ |‰¿®¼—8†€7ñŸî½i3óòuÊÏe7€³?äé¿8Wˆ%Ògçäë”Ògçäë• —IŸŸ“®TÕnhv}À;XÅ0‰\ÊY|üÎA.*¾‘ýq½1Uôëë•qZÖ‡Yæ E{¤ŠØ]„$‘±²óq¹¸œ/7äÄ‚ß_Hþ¸Þ—Õtëë4Û^ѧ¬¡¥´lÈa}]Ne²SÕgc5,—ÞX×b«ˆÂÏ8ë©–ý--£¯@ú‚J–Ô°ÆÇjÔ]}À÷ÃWï¨.ñUôë銯¤\oUpÚt3ÇÔÒÍ$¥‘²V¹Îˆ›„€­¤þ×âµrŽ‚Í¤µ u4ÕÖu$•RQ6v‰0µ¸µe Þ5ÝûA‡_Hþ¸Þ˜ªúGõÆõQeZ'G%Fk7‚¦x0â¾üÔ¯Žþ!Ç‚û¼WÝ­v õ%{¢¬e#ªÎ}ñºV±²â8A“qÕ­ÃþÅ~9Î{‹œâç7ª'ý:‡þ2OzÅx‚*o“U÷£î¢UcôFÒû/î½7ɪûÑ÷Q*Œ±ú#i}—÷ ìhj< ôùBå¥ù¾‹î°û¶®ª=~P¹i~o¢û¬>í¨:¥ðpzó9D«ké­šš€imX) kp¶3GŒò’\_¯Y>!âþ+—ƒ²‡ëÏ´‹'W’Ö…K- ¦ÚŽªz±Y#ph®’"ÜÆ2c2tPã wuÚŠ°àì¡úÁ³Çm8;(~°AìñÛAKid©hS›'vy©­ŸKθËþb:vkÝëª8ñë ¿U÷ ‹6–ÙýU£]KA j ‚Ÿo”µ±™œ]®&ÞI‘¢îKÍú€>¸;(~°AìñÛNʬ{ʬ{Oþè/©¿ÕCé·ñQ!tŒ¡s(ÖÂöâh>+À"ñû¯ ƒ²‡ëÏ´‹'GE&¦Zísj:¬Ö²0$1:¬Èæçq^b%„qȾåaÁÙCõ‚gŽÚpvPý`ƒÙ㶃?]õ•1Útì̸M¦Ëò×Ô8 *(1àã»A/ùŠy¨™E1ž¾x§H],†áPç™\\Yy_~Hºàì¡úÁ³Çm8;(~°AìñÛAxŠƒ²‡ëÏ´àì¡úÁ³Çm@É£p}¬þùëBßô²zmüªìk9ÖM—¦9Ž{‹Ã0‚\òî+ÍÜ|ªKB;FhtTö'¹ôùÒ놠;àåñqxíeÖ=ž;iÁÙCõ‚gŽÚ9QcKlEgè¨+›KWŸ’–¹Å±ÈÜÔŒãÀý`¼“âQºÏµ"’Ì®¤ ³c¨¤¦šÐЧ2F÷FAl‚+õš0à¾:ûÝspvPý`ƒÙã¶œ”?X öxí ¥ÉÜ“µ,ÓÔ㣞x©Œ¬ëšÓþZ•—âÀO„¥ºë¾KñqŒ'_Š«=vfÖrìYÓ‹7‚üWaùXõa¾ëµßzª¸;(~°AìñÛNʬ{Oþè/©¿ÕCé·ñQ!tŒ¡s(ÖÂöâh>+À"ñû¯ ƒ²‡ëÏ´‹'GE&¦Zísj:¬Ö²0$1:¬Èæçq^b%„qȾåaÁÙCõ‚gŽÚpvPý`ƒÙ㶃?]õ•1Útì̸M¦Ëò×Ô8 *(1àã»A/ùŠy¨™E1ž¾x§H],†áPç™\\Yy_~Hºàì¡úÁ³Çm8;(~°AìñÛAxŠƒ²‡ëÏ´àì¡úÁ³Çm@É£p}¬þùëBßô²zmüªìk9ÖM—¦9Ž{‹Ã0‚\òî+ÍÜ|ªKB;FhtTö'¹ôùÒ놠;àåñqxíeÖ=ž;iÁÙCõ‚gŽÚ9QcKlEgè¨+›KWŸ’–¹Å±ÈÜÔŒãÀý`¼“âQºÏµ"’Ì®¤ ³c¨¤¦šÐЧ2F÷FAl‚+õš0à¾:ûÝspvPý`ƒÙã¶œ”?X öxí ¥ÉÜ“µ,ÓÔ㣞x©Œ¬ëšÓþZ•—âÀO„¥ºë¾KñqŒ'_Š«=vfÖrìYÓ‹7‚üWaùXõa¾ëµßzª¸;(~°AìñÛNʬ{í¨3–¥‰jNËvŠ•´n¤¶¯ÎÏ,îd”ø d' a„>àÀá{›y7jºóî|›–{y•OÒÒ Q–‘_ˆ9´®€Ûˆ¼9±¼:ñÆuÐ]×fØ6u»•–Ûm¤•°ELc žHÀ.¿ä¸_òG"祃ô{W[i6*ŠGYôôòËh6ÚÄ+ån;9sHÍ·ŒëÆ5©³ä=d“Õ¹Ù™Ù[žŠVšúˆQ< –GvzöÏqc‹@Â@w|Hº–Áª~FÛ8’"·O͸“€gä•̼Ý~ ñ~£ãºõi&Nä:v¦øBí ­ Òoºìßë;ûñ7Šÿ”9Tv~Md­UmU]”BŠ¢xª¶”Ã4ØÞëžò^0‡F ¿ö^ ä\J†nÖÈÚÛFØ®¬lð¶)¥3FÑ+ãy#B-isEì¼Ò¾ž¢X­[R‹¢|MÀ×g.q9ÇqX£â¸“%²&R.WÆËBfcБ֤¢W·^¶³9yëµâ<‰C¦žZ†4¹àDüN7!7¶ó„ßpÖEÄÕyºó6“??'\ªKRÈÈ;"̆ѩ7ÒÍštr2Ó’çFù#: 2°—qx½iØYcÚÔÔµôú5,´“Ô¾®{RhÙnHXo}Ýñœk¼q]®ýR…Þ“??'\¦“??'\ª ,ÿÑí5U¥O]4t/³ê#§˜ÕÚ²D ŸeaËÄZHÝycîâ½I5…‘⺂šŽŸLÒm ,ù ©3´y ’¸8žøfÀ-7ŠÿÜT.ô™ùù:å4™ùù:åxî&úþ»?m;€É¾…?®ÏÛJô™ùù:å4™ùù:åxî&úþ»?m;€É¾…?®ÏÛJô™ùù:å4™ùù:åxî&úþ»?m;€É¾…?®ÏÛJô™ùù:å4™ùù:åxî&úþ»?m;€É¾…?®ÏÛJô™ùù:å4™ùù:åxî&úþ»?m;€É¾…?®ÏÛJô™ùù:å4™ùù:åxî&úþ»?m;€É¾…?®ÏÛJô™ùù:å4™ùù:åxî&úþ»?m;€É¾…?®ÏÛJô™ùù:å4™ùù:åxî&úþ»?m;€É¾…?®ÏÛJô™ùù:å4™ùù:åxî&úþ»?m;€É¾…?®ÏÛJô™ùù:å4™ùù:åxî&úþ»?m;€É¾…?®ÏÛJô™ùù:å4™ùù:åxî&úþ»?m;€É¾…?®ÏÛJô™ùù:å4™ùù:åxî&úþ»?m;€É¾…?®ÏÛJô™ùù:å4™ùù:åxî&úþ»?m;€É¾…?®ÏÛJô™ùù:å4™ùù:åxî&úþ»?m;€É¾…?®ÏÛJô™ùù:å4™ùù:åxî&úþ»?m;€É¾…?®ÏÛJô™ùù:å4™ùù:åxî&úþ»?m;€É¾…?®ÏÛJô™ùù:å4™ùù:åxî&úþ»?m;€É¾…?®ÏÛJô™ùù:å4™ùù:åxî&úþ»?mz•­c˜Ö45­€.a 1Jç…Î~”ç8¸š£¬›ÿéD©òÇè¥ö_Ü+zo“U÷£î¢UcôFÒû/îö45z ü¡rÒüßE÷X}ÛWUG„ƒ?(\´¿7Ñ}ÖvÔ2[évQ}•'á"Ø,~K}.Ê/²¤ü$[¸Ar£ÂAŸ”-ÎTxAè3ò…$rÓ|š¯½u•EMòj¾ô}ÔJU•T¿7Ñ}ÖvÕ*Š—æú/ºÃîÚ‚²ŽÌáºÜµ²sÙ:φ›;‡ qÊÜW^/ºûî¼.‰l¤«Ê1”3RÙQUShú=#+¤{%Àʶ;†Yª®ñs~ µ_xŽÌ´¡±­\°µ*# ¢¢‚¢FÆqk+ˆ/¸r„nP[Ô™cWEWAI¦USÑÅGI¢÷S‡2G=Ï1Â[ ˜ëËX/»[w’%­‹9õŠ+*¯…¢|u±Õ½æ:|U›ƒõíÿ4æá&,B1¬cïm-{Ò–¶¶{"ª:vVÓ´T°ÈèËåíÅͰɒ7Ê/{Cb-âç¤ÊêëNgÁgXÑÏ=# «ã}fšhK`%—HqSËv3»ä^pÉMk¾Æ‚ݤ­›;UE+ª`tò;õñT=î…£qþ8Ðãš7¾kPQÙ-”¶-¶ûZž’Í™ò>¤z‹f¢RÖÈÊFƒž|.{ÍôÎÔ@¸9 W.‹;"­+.Š )é'³ôŠ ©k÷2Vº•”íÀذàí½ñ]œ:ŽúÃ'rÐÛ–£,Ù,Ù)jʃ>,ãCŽ@kd ¶¥¦÷5·›8æè²¾Ý¶j,Úêz\PÏjÀ)é[TÞËd™‡¾6½áø»çw2ö´ìnE[Æ+Ïfæ,J&RÒ†½øªô²±ï8n`x¦ÂZ³wÞ —Ü5ØóVeU—lUAIu=dL‹Ü×Hø°=¤´\Lq¼;“\/*ùw6‹YQ •™eSÉQjÕ˜ÚÉf‰ÂðçN*iˆÅ›¼`âÄCdµ­ÊÊïÑÖUÚ1Ç¡IK£ 4ÎKÿQœŒI~àv&¾íZïâ<È«JÆm‹³ÒHÊ:Šz©œÇºüL³˜Ñ‡XÄÖ88‘xs…ÃIJ2*ҳ휨–zG2Ì¢¢§˜1î½Î†ž²'÷ºÁuK¾íAÜWz*r¢×9EdYZtu2ÖÄé¡}@xu,U8bpaÃ+]NâZÛÛ{Z„8‘——µ•PTUØðA LTUf«LŽŽ:Çæà¸Û‰ØÃ±‹Àk@ ¼œ 7¨ò.yª²'ª*%’iå³)Ÿ$’8¹Ïq‰¤’N²I×z¼@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@YÊ=~P´k9Qá ÏÊ‘ËMòj¾ô}ÔJ£,~ˆÚ_eý·¦ù5_z>ê%Q–?Dm/²þágÚ´5z ü¡rÒüßE÷X}ÛWUG„ƒ?(\´¿7Ñ}ÖvÔ2[évQ}•'á"Ø,~K}.Ê/²¤ü$[¸Ar£ÂAŸ”-ÎTxAè3ò…$rÓ|š¯½u•EMòj¾ô}ÔJU•T¿7Ñ}ÖvÕ*Š—æú/ºÃîÚ‚ ‚¬¦Êzzˆ£š iéY$r49¯il ‚¢Õrì‡&2pÚ5´M5ÒWˆ©æ–Im §Í/™±Jç—3þ¸ï59Àêvºz>Órׂ>sàøt?“á³ràù]ïÊ»W*«l nPUÔPE”âÃ{(Ù_$­¯ÒÖŠÃteÿ¯ HêrD|AÆþô½n¸“$,9Y I dlÀö²¢VІ—=Îýx.sÉb¼½äß×É% ”­Òß‘šÏѶ@ç°°¶V‰0ñá$ !ãX,¤q¬|'œ-Ýg4îгÙÌZDø3×w¸³:'ú®öüXµçU¥³¥eÍhÒÙÑUš÷ÅZçRµØ hÛXÆá¸´¾'|ŽyÀâ‚љ`¶'FêYåÇ)–WÏY4¯”¹¬cš÷¹åÏÍŽ0cq,8x7—’ôGÓ2:vXo²9ò½ŒÑÓakˆá$A0æûÆOx0àé+è¤Ê©¨ç«Ê·Y –¯3 $´Œíp†Ï#[úì É)»ÞÿWWTí^Fem™hÒNmÛNê1†²Y¸:š7Üð3bùIX ®ÔÓpj+r_'c‚Zš¨sìÎÍRãW$QÈ×=ò¼Lƒdä8_{@{…Àd™=fKAQ@è$Ñ*YRÉ¡ÈñPòùoÜeÄÜxÛy ¸Ý¡¶í8m: 2;VK"ª’Xi™Pé[3ª@C̼TŤ_¾Ò8ük鮦Ìgó9¦`Ò1ç0Ü.Çœïñ]Ç‹¾¿ZyìK:¦Ñá iï«›¦s\ÜÑye×^@nùM{šoi¹sÅ’Ö4E txcŠ*HX3¯72™æH츓ûüw…pˆ9è(iìË:š‚Ž<Ý-,M†b' h¼ë78×B"" """ """ """ """ """ """ """ ""ÎTxAè3ò…£YÊ=~P¤ŽZo“U÷£î¢UcôFÒû/î½7ɪûÑ÷Q*Œ±ú#i}—÷ >Õ¡¨ðƒÐgå –—æú/ºÃîÚºª< ôùBå¥ù¾‹î°û¶ ñ’ßK²‹ì©? Ácò[évQ}•'á"Ø-ˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€³•z ü¡hÖr£ÂAŸ”)#–›äÕ}èû¨”ª*o“U÷£î¢R¬¨¢¥ù¾‹î°û¶©TT¿7Ñ}ÖvÔdìðÒå6SÔTK0EOJù$‘Á­cCe$’u»×DqG%³hC#*㤂ž™Ð²K:¡•Ë#§ÄÖÄæcx „õ¦àI¸«ìË6fÕË .¡Ò6 Ú()ätd½’´H"û!]ŽÉ;b¢Ø6ÕMµBëN,ÆŠè¬ç²fÛPÆbçÞÚ©8žÛˆi׬Â-$Êû&B÷UÈY#1½Ì§•¡ŤÏsPšðL˜n,x7`uÜü#ChØ–¬9IMI$t•²STS> ë1‡SŒ7º7Àày.xw£ž“$k¬ÉŸ=lÇõl-¯‘ôxÉ&i¦.€ÝÅQ-ØÄ¢ìƒqÅ&TX2Õ>[JŒO%Fji c餆¡“S¸çÆác³¸šÒæÈ{àCPsÑe&HPf)ìúà’ ô1SSXu ’ú©%¶Å‰9Ø\uK›ÆT•9W7sÙ]jQšIÙd±ï¢{os&h£Šv—{à]!ÖÕwñTvMƒ–.Ê>‘ô4U:SåtôxÙEbeA¹ÇF{¯<\5Ü]p¸§È] &í‹–Ѻ†Ð¤4ÁÒÁŠH™Ž¼8\"sˆ¸^\.ǾÉ2ÖÌuU› ’¨VÖ¶¹‘H Zè¥{%hÃ{âqˆ ïÄìW4©(2ÖÁ´´cMU>œ'KG4M!÷fÜKØZòp±Æà÷Ö’A [“:VTEn¶³Ðèù¸ÌX›ú±R×_¬_‰•O‹ šÓß ÚkérF¡¤¦áZ=%•M‹1v- c.+±jÇ}×~Ï}Ä‚ó&­)­œ•²-J†ÆÙëh¡¨‘±‚ö$Ýyå*ÑWØVgdõ™dç³Ú $TÙÜ8qà`n+¯7_u÷^U‚" """ """ """ """ """ """ """ """ ,åG„ƒ?(Z5œ¨ðƒÐgå Hå¦ù5_z>ê%Q–?Dm/²þá[Ó|š¯½u¨Ë¢6—Ùp³íZ=~P¹i~o¢û¬>í«ª£ÂAŸ”.Z_›è¾ë»j-ô»(¾Ê“ð‘l?%¾—eÙR~-‚Ü ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆ 9Qá ÏÊg*< ôùB’9i¾MWÞº‰J¢¦ù5_z>ê%*ÊŠ*_›è¾ë»j•EKó}Ýa÷mAYGið%nZÚÙœöƒgÃSšÅ‡åvî7_u×ÜT–Ô¶ómŒŸ¢–¶Æ©´i‡Äøã|"6¾’­·¾o$ .-!ã½æG³%¾—eÙR~- …cÙ‘G•CIr™ØÈ)Ùl…¥…à©Å¤¶þ;ÜKpŒ]¥—v½=“-]uSÙl©’ÔŠ83KxsæaŒ<ÓÊnbß7 rUå½±eÙÕÅe- Ô-«´ia§„½²;F/kÜòHŠbÂÐÓ¬ãÅûY[“V ¤ÈÙ_bYµLò=ž• s݉ä^5;Y>3¬¨à‹­*X4Y¬ê·°LÈc¾)äˆHéc¼ˆŠƒy#Y.¼u†^ÓÊl©²m‡Ø¸(m*éômJJ# ãjžëã’ Ü)yÆ|¢uÝ„ñÐe¯Q•XD4”–¥£OKBçItñÂèŸi9Î,ŽK‰"0 ;Âû‹€ß¤±²À±èë©‘×fÅCg¤¬‘¬$°â‘›‹œo-ůY 4 Û?'㊚ͬ³¨L5Ø(¢§}+\ÉM|¬Œ‹®ÂÐ׸¨xµ”:¼²·¥²m©è›öÕ&jgÊÚ§G5LW0 bÒ—k/ð€~Íî¸ÊZÛJ“)hu%3cÚ3¼W ræ|yC\ë˵ÜÜ`]ŠñSdkÏdQÚrféù*JR@èÍÌsÜÖ¸ÄçÅ|q‘{˃Ä:â´’Ù6lôú<Ö}$c‘ù·ÂÒÜR›ˆº÷ yñãuüe>ÆÊ+K(2ÆÍ™¢J 7S×ÙõQ9• k4@Ñ31\Éq=Ïi×ú··P/¼o>GŸÏèg³¹üælbÎ`Íã¿ÊÁÞßLJWè@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDœ¨ðƒÐgå F³•z ü¡I´ß&«ïGÝDª2Çè¥ö_Ü+zo“U÷£î¢UcôFÒû/î}«CQá ÏÊ-/Íô_u‡ÝµuTxAè3ò…ËKó}Ýa÷mAã%¾—eÙR~-‚Çä·Òì¢û*OÂE°[„g*< ôùBѬåG„ƒ?(RG-7ɪûÑ÷Q)TTß&«ïGÝD¥YQEKó}Ýa÷mR¨©~o¢û¬>í¨)CQiÇ—Ôqç*ª¬¨á…˜€Ä÷E0h¼ÜäŽ5$ùRÜ·edTµm‚:ŠwPËJi#‚’š6F×B\æØ d¿«‹¼p[äZd·Òì¢û*OÂE°[„|™+”µ*g6dñég-XÚ(⦮TÁ#ÙŽçÈ×ÆÚ–·H×t—8Œo¾92"²¢[bª‹%£³Y£×ÉeÓ»Gk©ª]a{3o-åðÊC]y"õõÄAòûg"ªä®š(ìÙÝ`CW)¥³¨#£sZ 6¶*bkCÙS}À?„sÜV’{®¦“&bª£’¨ØÕ°É1©™“ºk©Ýu¯7c-’@âç8æÜàÛð‡kÌ쌴લ'´,ØæŽŽ¢’¢8œøÜi`lUÇJÑ}ÒgJ×ç‰xq"÷0ôÄDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDœ¨ðƒÐgå F³•z ü¡I´ß&«ïGÝDª2Çè¥ö_Ü+zo“U÷£î¢UcôFÒû/î}«CQá ÏÊ-/Íô_u‡ÝµuTxAè3ò…ËKó}Ýa÷mAã%¾—eÙR~-‚ÌP² ºª¸› ¨ª »¸† Ýuçùÿ »¸Mü²u›ÙZ´\¢¦á7òÉÖoe8Mü²u›ÙKrŠ›„ßË'Y½”á7òÉÖoe.Ê*n,föS„ßË'Y½”¸(©¸Mü²u›ÙN,föRà\¢¦á7òÉÖoe8Mü²u›ÙKrŠ›„ßË'Y½”á7òÉÖoe.Ê*n,föS„ßË'Y½”¸(©¸Mü²u›ÙN,föRà\¢¦á7òÉÖoe8Mü²u›ÙKrŠ›„ßË'Y½”á7òÉÖoe.Ê*n,föS„ßË'Y½”¸(©¸Mü²u›ÙN,föRà\¢¦á7òÉÖoe8Mü²u›ÙKrŠ›„ßË'Y½”á7òÉÖoe.Ê*n,föS„ßË'Y½”¸(©¸Mü²u›ÙN,föRà\¢¦á7òÉÖoe8Mü²u›ÙKrŠ›„ßË'Y½”á7òÉÖoe.Ê*n,föS„ßË'Y½”¸(©¸Mü²u›ÙN,föRà\¢¦á7òÉÖoe8Mü²u›ÙKr³•z ü¡up›ùdë7²¸åx‘ø€ \ßÄ.Re\ôß&«ïGÝD¥QS|š¯½u•@QRüßE÷X}ÛTª*_›è¾ë»j-ô»(¾Ê“ð‘lb…PUÕUÄÙEP`•ØÅÄ0Ðë¯?Ïø]ÝÂo哬ÞÊÕ¢å7 ¿–N³{)Âo哬ÞÊ\ ”TÜ&þY:Íì§ ¿–N³{)p.QSp›ùdë7²œ&þY:Íì¥À¹EMÂo哬ÞÊp›ùdë7²—å7 ¿–N³{)Âo哬ÞÊ\ ”TÜ&þY:Íì§ ¿–N³{)p.QSp›ùdë7²œ&þY:Íì¥À¹EMÂo哬ÞÊp›ùdë7²—å7 ¿–N³{)Âo哬ÞÊ\ ”TÜ&þY:Íì§ ¿–N³{)p.QSp›ùdë7²œ&þY:Íì¥À¹EMÂo哬ÞÊp›ùdë7²—å7 ¿–N³{)Âo哬ÞÊ\ ”TÜ&þY:Íì§ ¿–N³{)p.QSp›ùdë7²œ&þY:Íì¥À¹EMÂo哬ÞÊp›ùdë7²—å7 ¿–N³{)Âo哬ÞÊ\ ”TÜ&þY:Íì§ ¿–N³{)p.QSp›ùdë7²œ&þY:Íì¥À¹EMÂo哬ÞÊp›ùdë7²—å7 ¿–N³{)Âo哬ÞÊ\ •œ¨ðƒÐgå «„ßË'Y½•Ç+ÄÄà&þ!r“*ç¦ù5_z>ê%Q–?Dm/²þá[Ó|š¯½u¨Ë¢6—Ùp§±¡¨ðƒÐgå –—æú/ºÃîÚºª< ôùBå¥ù¾‹î°û¶ ìt†8¡ k5°“{'¾<¡yÒäDznä—ÁÁèÌå t‡ù1웹x5Íl쀾3Úç¶2ÆbsZ@$ µ€\ÛÏï«ÊÁÚ_ U[̤¬}%Hµl’1NÊXïmV6‰ ƒŒ¤†¶ç 7:Ã}%sb|L‘ð1Ò»ms ÝquÃV³sI»DÍtï€>3׺0Æbk\H‹µZëî<‹æv͵WÂ4óÇhçíŠZÚã ‰†3„GOT"~l éÆÐí׿«m×7]C&VÚ™œ¢e®$¤¤“ºXKê\c¦´ ®ºû¯B¨w캶ٷ,©k[MW5¥-=L´PÁ4,9â(MS\Dmi/Çs.ßÙÅß+Cè:Cü˜öMÜšCü˜öMܰ‘[•éuT–× Ù~f¢¢¯õ.ÆÇg[31ÄÐßÕ´G5ÀŸ“Äñw«me5EIŽbÏ›h—DXãŠûï{pÊHÒäDznäÒäDznå ©Éª™«,8ê*$2Jù§Äãö¯~à S  £xsÃq‚8Ý„wÂõÛ¤?ÉdÝË”vÕC¨m,žu5£]O<…¯§nu²½´unާsga|/‚F‡9…Ìci-pÔ8Áâ ¯zCü˜öMܳù+óDÿòUÿý\ªíTÕ“É–SÝ ’LÛZ ³Œ›¸ÍܼWžR­UþCÿ'½b¼A7ɪûÑ÷Q)TTß&«ïGÝD¥@QRüßE÷X}ÛTª*_›è¾ë»jÇHcŠÖ³[ 7°{ãÊ!þL{&îI|üÎQ —H“É»—ƒ\ÖÎÈ à=®{c,f'5¤@»Xͼþñʼ¬¡hÕðÅU¼ÊJÇÒPTˆÛVÉ#쥎öÕcax¸8ÊHknq‚qì7ÒW6'ÄÉ+°F×1€½×\5k74›¹äA\×Nøà31­{£ f&µÄ€H»P%®¸þãȾglÛU|#Oƒ¤?ÉdÝɤ?ÉdÝË ¹Q—UImp½‘gæj**ÿRìlvu³3M ý[Ds\yù&µ ’x€”t™AgZ²J+BÏ©cå0±Ðº7‡<7h#ØA7qÜ/]ºCü˜öMܰ9GmQÔ:†ÒÉçSZ5ÔóÈZúvç[+ÛGVèãÄÏ”o'¼ñň_ËQZM±ëL–ÝC,LŠÑ†¶7ÇNãÎÎÏ£šÛ˜Ö›s±H#´>‘¤?ÉdÝËÄÕͦ‚Iç|CKß#ØÆµ­òI#PƱymÚÝtΪ®d°ÁHÐÖÀXøåv“Swh.%°3XÂÓy!¢ðWe%[ŸlP¶²OQM[Lê ª#ÏÄM+³‚{Zã!ΑÀµàá†CêqW6vÂø$hs˜\Æ0€æ’× CŒA" ÷¤?ÉdÝË?’¿4Oÿ%_ÿÕÊ®ÐUMY<™a1}Ð $͵¡ »8Áy»ŒÝËÅyå*ÕQ¿éÔ?ñ’{Ö+ÄS|š¯½u¨Ë¢6—Ùp­é¾MWÞº‰TeÑK쿸OcCQá ÏÊ-/Íô_u‡ÝµuTxAè3ò…Å•- ýÊßOA“mm1Ôô6ÐöÐTwMš­ŸP~äîš/5[> ýÊßOA“mm1Ôô6ÐöÐTwMš­ŸP~äîš/5[> ýÊßOA“mm1Ôô6ÐöÐTwMš­ŸP~äîš/5[> ýÊßOA“mm1Ôô6ÐöÐTwMš­ŸP~åÏETûG+™VÊ*Ø!eã.¨§tc‘„ È»Šÿä¯ñÔô6ÐöÓOA“mmÌ™”ïlÒbÁÆì-.7 fà/$þá­QwMš­ŸP~åoާ É¶‡¶˜êz ›h{h*;¦‹ÍVϨ?rwMš­ŸP~åoާ É¶‡¶˜êz ›h{h*;¦‹ÍVϨ?rwMš­ŸP~åoާ É¶‡¶˜êz ›h{h*;¦‹ÍVϨ?rwMš­ŸP~åoާ É¶‡¶˜êz ›h{h*;¦‹ÍVϨ?rwMš­ŸP~åoާ É¶‡¶˜êz ›h{h*òV)aÉØ4RDüäÎÁ# \•Ä^±¨‚¬+íH¬ÚPOW;¤x¹´Ô¼›…ÃŒqñÿØ©1Ôô6ÐöÓOA“mmGtÑyªÙõîNé¢óU³êÜ­ñÔô6ÐöÓOA“mmGtÑyªÙõîNé¢óU³êÜ­ñÔô6ÐöÓOA“mmGtÑyªÙõîNé¢óU³êÜ­ñÔô6ÐöÓOA“mmGtÑyªÙõîNé¢óU³êÜ­ñÔô6ÐöÓOA“mmfӴͬë>,ÛMŽe|9Òѽ­ ’nÕʵj,u=M´=´ÇSÐdÛCÛA*(±Ôô6ÐöÓOA“mm(J«íz9£§Ð­ÜÆw΂ïh$“v+®:ˆâüW^:žƒ&ÚÚc©è2m¡í ¨îš/5[> ýÉÝ4^j¶}Aû•¾:žƒ&ÚÚc©è2m¡í ¨îš/5[> ýÉÝ4^j¶}Aû•¾:žƒ&ÚÚc©è2m¡í ¨îš/5[> ýÉÝ4^j¶}Aû•¾:žƒ&ÚÚc©è2m¡í ¨îš/5[> ýÉÝ4^j¶}Aû•¾:žƒ&ÚÚc©è2m¡í  ¢ª}£•Ì«el²ñ—TSº1ˆÈÂä]ÅòZE:žƒ&ÚÚc©è2m¡í S|š¯½u•GNÉ®–<Û¤œ¼4½®7`·œ$Ž6•"Š—æú/ºÃîÚ¥\ðéQÒÓÄhdÅ1Ænž¯k@?·ûsÚ6ô4sGO¡Z3¹ŒïÞÐI&ìW\uÅø®>é¢óU³êÜ­ñÔô6ÐöÓOA“mmGtÑyªÙõîNé¢óU³êÜ­ñÔô6ÐöÓOA“mmGtÑyªÙõîNé¢óU³êÜ­ñÔô6ÐöÓOA“mmGtÑyªÙõîNé¢óU³êÜ­ñÔô6ÐöÓOA“mmGtÑyªÙõî\ôUO´r¹•l¢­‚P>2êŠwF1@¼‹¸¯þJÿOA“mm1Ôô6ÐöÐLÉ™NöÍ&,œnÂÒãpÖnòOîÕtÑyªÙõîVøêz ›h{iާ É¶‡¶‚£ºh¼Õlúƒ÷'tÑyªÙõîVøêz ›h{iާ É¶‡¶‚£ºh¼Õlúƒ÷'tÑyªÙõîVøêz ›h{iާ É¶‡¶‚£ºh¼Õlúƒ÷'tÑyªÙõîVøêz ›h{iާ É¶‡¶‚£ºh¼Õlúƒ÷'tÑyªÙõîVøêz ›h{iާ É¶‡¶‚¯%b–“E$OÎLì0µÀ\Eàëˆ*¾ԊͥôõsºG‹›MNéHɸ\8ÇýŠ“OA“mm1Ôô6ÐöÐTwMš­ŸP~äîš/5[> ýÊßOA“mm1Ôô6ÐöÐTwMš­ŸP~äîš/5[> ýÊßOA“mm1Ôô6ÐöÐTwMš­ŸP~äîš/5[> ýÊßOA“mm1Ôô6ÐöÐTwMš­ŸP~äîš/5[> ýÊßOA“mm1Ôô6ÐöÐfm;LÚγà‚Í´ØæWÁ#-ÚÐÐñy&í\«V¢ÇSÐdÛCÛLu=M´=´¢‹OA“mm1Ôô6ÐöÒ„ª¾Ñ·¡£š:} ÑÌg|è(Þö‚I7bºã¨Ž/Åuã©è2m¡í¦:žƒ&ÚÚ Žé¢óU³êÜÓEæ«gÔ¹[ã©è2m¡í¦:žƒ&ÚÚ Žé¢óU³êÜÓEæ«gÔ¹[ã©è2m¡í¦:žƒ&ÚÚ Žé¢óU³êÜÓEæ«gÔ¹[ã©è2m¡í¦:žƒ&ÚÚ Žé¢óU³êÜÓEæ«gÔ¹[ã©è2m¡í¦:žƒ&ÚÚ *§Ú9\ʶQVÁ (uE;£ŒŒ ^EÜWÿ%¤Qc©è2m¡í¦:žƒ&ÚÚ7ɪûÑ÷Q*Œ±ú#i}—÷ â’2)],y·I9xi{\nÁo8Im*Ÿ,~ˆÚ_eýÂ{=~P¢RÔxAè3ò… ³q5Œsäx.ÜÖã#—÷/Ì0s’lÇi%ðpzó9d²–ÑžšÜ³)hZTtóSTÈógÑŠ™æ:ÛÆjBsÝ®á®í|H5¸`ç$ÙŽÒaƒœ“f;K%C”òSSºžÒ¥¬}DQ¶A!Œ2¶Yß3KI²È ­kI7àâ÷X×U2ŠÒš¿õ™ÚVáÀ"' a¼M\ï•®â l0s’lÇi0ÁÎI³¥’n_Ø2Z”´QTcÒs!’ãcuÊÖº1›s„¦ðökkµ‘…Ø`§Ë_ƒ†rM˜í&9É6c´¸èêà´(iëi_œ§¨‰²ÄûˆÄ× Á¸ëNƒšÔ¯‚͆$®š¢*v·hîòoYYÔö}™Zø+ V…3*blqcxk¤…€‚Iuõ ÔÛøuæàmlÛM–”s~¢jyéäÍOØqÆì-p´¹¦ö½®ÔOÊå¼²Ã9&Ìv“ ä›1ÚQ" pÁÎI³¥_EhG]5s"cšÚZƒO‰Ün!­$ÝâÖë¿íŽåÖ¨òwÃÛŸòr~F ¼DEM›‰¬cŸ#Áp¾æ°¿¹B¥—ÁÁèÌåC ä›1ÚL0s’lÇiD©2²¶{?'Ý==DÔï54Ñ™`ˆK#Xùãc°´µØ…Æá„ëñ Ðaƒœ“f;I†rM˜í,]R2͆Ԟº¾²¦‚–8ÙkéÛM>rG½˜ K#—ˆî{š{Ÿ{îiÃâŸ-xNÕ¡6M%Mt‚©µÔòS¹Ì‘ާ-8ó˜ —ö^~]Ä^ ¾9É6c´˜`ç$ÙŽÒÏÁ•6uU ëióÒS¶¦š™¯ »œBXà  Ó²ûî"ã«–¢ÂÊ×ÕG(ŽûNI]”°†Âɳ-3Üç’æ2üs À7ÞýBá¨6ø`ç$ÙŽÒaƒœ“f;J›&ªç´2VÇ­ª~r¢¢Še}Àbs˜ 7 CYñ+D²×ÂÛj+66½Î};ê÷Íh^o¿þxïÕÔ¨ßôêøÉ=ëâ£Ë¢6—Ùp¯Xý´¾Ëû„¡¨ðƒÐgå %-G„ƒ?(Q –_ 1\PE%«Oh—?=ÀÖ‚0–ÈèÜIý÷ÆÛ¿‰ÿ·5ugZU&¢­“¾KƒEÕR´<@?íÊW7r6/GŸÖæí è­°ikª*ª$’fËQ ÄÂ?Va‘ÒFöÞ>P{ï×x8@"ëï«~IÔ6ا­¦¶k!xŠ£Jª4Ò?0{Lf0ÐØ@ïZÓÞ·Ž÷ÙÜ‹Ñçõ¹»iÜ‹Ñçõ¹»h?i2b–Ïš=ª²–¹²ê8¤¹ lk\â š›`€ðn°ouþ#É*©¨àŽj–¶š X/ÄÛäm4’,Z¸Áâºð÷_ÄÜ>»‘±z<þ·7m;‘±z<þ·7m,~ÒäÛ))M4V¥¤ Ž1#­h¥kH- ÂÑŽì-¬ÇxÜÕCd‹:Š*JzÊ–ÃckZp°¸¸ÝÞê h¹­h—.Näl^?­ÍÛNäl^?­ÍÛAsn…®•ò’ç;À¼IP€7À^I¼ªgý:‡þ2OzÄîFÅèóúÜݵÕA`Y¶eI©¥†FÊXcÄùÞþôH¹Î>0?’ zoõPúmüWe$… ES3”õ:)YyšáqcQñ)óYÿÔ‡9¹Î÷^ZEú¯k÷j£¸Ë ýþµQ½g'Lͺش«pɌΘ˜c•’ö64ÝA.x·›ÓäÔ/´'´)««(ëf•Ï3Ûq̉Ž`c›„æ#*›"¡òZ.tލ¯ž©ÈðánãÉEÔÆ‘›Î'_kÜe…þÿZ¨ÞÆX_ïõªè=ØÖD–E“gÐp„Ò¶’8ãù k^ ×HÇÇ}ú¯Ã©Xâ‚8ß+æsZdxÏ qœ Ï îU}ÆX_ïõªéÜe…þÿZ¨Þ ‹$~Áö³ûç­ ÒÉé·ðr©±4 `³ZæÒ6IZÌD’H‘ÁÆ÷uN½zü\K¦¶Ç¥µà±ÏFëÃDÒ0AÖC¾#ÇÅyåAЪÛb3…#¬–º²fC#¦‚šW´Ç Žkš\Ó‡Ô÷€âÐpæÝã¸Ë ýþµQ½;Œ°¿ßëUÐUY9 ±()­;B¦¦ª–’("x, ¥sLo¾+˜ÜCQ‘œùþ7bü.ÍL-‹Iµñãmñ:B×áÄÌ.a­ý\%ƒ[oãs‹¤î2Âÿ­ToNã,/÷úÕFõGT–\ºÍ%óðù3‘_!qqÍ>>ùμ»½y7ßy7x泥ȺK6(…ŸhWÒÏ[jbs𡈶簶â)â$á¾ðn wq–ûýj£zwa¿Öª7¨;a£t62²¤Ç {ƒïhfÎÄ_ßÞIqwŽíJxctPGå|ÎkCL9ä3„yãÔýʯ¸Ë ýþµQ½;Œ°¿ßëUÐE”ÞÌÿ“¦üá^* ¬ŸÉû ÓT¹²=úLL‰¢¢g~°¼›œn¸zù<|Jýµ?ê¦ôÝø¨•+òRÈ–GI$U/{‰sœêɉ$ñ’q¯=ÈØ½[›¶‚ñUÓØ4´Ôv-+$˜²Èã’Eîà ¡µkï^N«µÝü?r6/GŸÖæí§r6/GŸÖæí æfDÐ2ZWšÊ÷¶¬Žš'JÜDÉb•‘‡ˆZ1ÜA8œnim£,‘ M|ðVTÂê×$ !¯1ÇsoiÖѸÅîuà껓¹£ÏësvÓ¹£ÏësvÐ\ǘù\é^ð÷bk\Ìp¸ W‚uÞo']×íQ÷#bôyýnnÚw#bôyýnnÚ ÅG“¾Üÿ““ò1;‘±z<þ·7mXÙÖe%• á£Ìcßœv)ò]pÞâO:Ñ@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@RËààôær‰pÖäÕ›iLÚªÇHdsnI™ H¸›†»ø¹oñª;—-¡A¥LÈ&sÚÖO à°€qG#dh×⽂ÿÝâî2Âÿ­ToNã,/÷úÕFôëlZꊪ‰$™²ÔG10Õ˜dt‘½·”ûõÞºûùdÉ—¾zz¦Û¶«+!l¬5 Âç=²ï®Œ± f™pk[ÄI¼’LýÆX_ïõªéÜe…þÿZ¨Þƒ“¸Û9™˜é笧¤ŠJy›K¿«2A› s‰ÎïbcH' Âû±wËÅEÒY±D,ûB¾–xÚØÛP߀E E·=…·O' ÷ƒq»»Œ°¿ßëUÓ¸Ë ýþµQ½QÛfPEeYTvt{¡¤1Ï ¸µ­ Ýv»‚êUÆX_ïõªéÜe…þÿZ¨Þ ‰ÿN¡ÿŒ“Þ±^*j[2Ʋ-ÖAFךÉ)žüFYsùã&î/$ñxîPXý´¾Ëû…x¨òÇè¥ö_Ü$ G„ƒ?(Q)j< ôùB‰D@DDD@DDÓª‡Óoâ¢RÓª‡Óoâ¢Tbm<­ª£µ­ˆiØí}m=—$dÕV~¦9Xs£¾sžXÛ˜íc‰ÜKº+vª§+kl¦Û=6RÈÙE,%Õ3G™ŽG9§:<§p0øõ®Ú¼ŸÒ¬ü¢¤Ò°ðÎ>û7~g;!⿾ù¼\w~ôŠÊµ)mšÚª[F´••,žX%£s¤Gd5âPâ0A-7ã@¦·³ùE5 ŽêC|4õ{Ù'\­¾ã©À5ß ÷ü…Åa[v¤ÔvUªê9YlÆÃ¥ÑatØ]‰îÄÜ-pÄ0@ÔqßtÙ +(çemI´`µ¨t²:7ÈIÏ8@_›a:Q¨w¹ÂG’ÄÉʪ {2žÐ´!«ŠÊ¬£l4ƈŒÇ÷½Ø€¸ °ŽùÄ‚pá| ª\¼Ò²^Á®lüBÑ©¦§š Ø$yn+ÚÌ/ii7øX¯ùKºÁ·j­kZ¦[9Ñêjc}'IdqÊèÚç;:n¾æ’p]ß]ã)ò&–šÏ£…“ÿ˜§Ž†7Mš;G‘. ãFƸÞu2><vÙVU©fTIÑÉg¾¦yóZ„£;#ä»9#SŸÇƒX.5~Ú.VÇ^ÐêšbàØÃˆ§pÀþ°PpÔѯ ÖK¸—R‚$~Áö³ûç­ ÒÉé·ðrÏdѸ>Ö|õ¡oúY=6þOb¦Ò¯–Ž¾È‚6°¶²­ÐH\ ᢠd¼kã¾1˪õÅZdô´Zh´˜ÚBÖgÊ÷Î׳6qss:Û‡p¾þ#w‹O$b´[ä’šWKh6º8êéDЇ vÁ…ìÄ1‹pÖÛ‰oÚø¦È yXÎþÆ6Å›‚K9†”=¦ ›á^Ûª]p¾ðZÒ\ã}ï}.PÙ°ÒÁTùfÑæÅúÖÓHYs³¤6è°›Ádžë}ØMÇå••1ºªçSß‹õnïÈpalfïÖ8<†ÌD9Á¤b ,í§ú?e}–(™5šÐiŸY|tåÎ{‹éØ×4BëÞu÷ĆGy%¤ºÆ¿%h›Iµ5Ì’ ·G#au0-sØö½¦a}Ò…¬ÔLc ‹ˆkšøt5¥¥¦sÈk°=’FèÞÇ\ Îc€sMĈ‚u*»Æe‰BøÚ6™%29´t¦ˆ€ïX Ú¤\ºTÞo©ëGÛM*o7Ôõ£í êEË¥Mæúž´}´Ò¦ó}OZ>Ú¤\ºTÞo©ëGÛM*o7Ôõ£í êEË¥Mæúž´}´Ò¦ó}OZ>Ú¤\ºTÞo©ëGÛM*o7Ôõ£í év<'7#¢}Ýì–Ÿ‚/¼©;—ÏöÎÙ…e¥Mæúž´}´Ò¦ó}OZ>Ú Þçeóý³¶ga;—ÏöÎÙ…e¥Mæúž´}´Ò¦ó}OZ>Ú Þçeóý³¶ga;—ÏöÎÙ…e¥Mæúž´}´Ò¦ó}OZ>Ú Þçeóý³¶ga;—ÏöÎÙ…e¥Mæúž´}´Ò¦ó}OZ>Ú Þçeóý³¶ga;—ÏöÎÙ…e¥Mæúž´}´Ò¦ó}OZ>ÚË2Ίʳ㣆I$c ŠB1çîq“âKBŠZè™- ºF‡b:3šÒãâ¼–“ªóÅwð_ºTÞo©ëGÛM*o7Ôõ£í ­îv_?Û;fv¹Ù|ÿlí™ØVZTÞo©ëGÛM*o7Ôõ£í ­îv_?Û;fv¹Ù|ÿlí™ØVZTÞo©ëGÛM*o7Ôõ£í ­îv_?Û;fv¹Ù|ÿlí™ØVZTÞo©ëGÛM*o7Ôõ£í ­îv_?Û;fv¹Ù|ÿlí™ØVZTÞo©ëGÛM*o7Ôõ£í ¬îd:h=¯iÔ6Y3c–F—4‚/ï?r½\ºTÞo©ëGÛM*o7Ôõ£í êEË¥Mæúž´}´Ò¦ó}OZ>Ú¤\ºTÞo©ëGÛM*o7Ôõ£í êEË¥Mæúž´}´Ò¦ó}OZ>Ú¤\ºTÞo©ëGÛM*o7Ôõ£í êEË¥Mæúž´}´Ò¦ó}OZ>Ú¤\ºTÞo©ëGÛM*o7Ôõ£í êEË¥Mæúž´}´Ò¦ó}OZ>Ú¤\ºTÞo©ëGÛM*o7Ôõ£í êEË¥Mæúž´}´Ò¦ó}OZ>Ú¤\ºTÞo©ëGÛM*o7Ôõ£í êEË¥Mæúž´}´Ò¦ó}OZ>Ú¤\ºTÞo©ëGÛM*o7Ôõ£í êEË¥Mæúž´}´Ò¦ó}OZ>Ú¤\ºTÞo©ëGÛM*o7Ôõ£í êEË¥Mæúž´}´Ò¦ó}OZ>Ú¤\ºTÞo©ëGÛM*o7Ôõ£í êEË¥Mæúž´}´Ò¦ó}OZ>Ú¤\ºTÞo©ëGÛM*o7Ôõ£í êEË¥Mæúž´}´Ò¦ó}OZ>Ú¤\ºTÞo©ëGÛM*o7Ôõ£í êEË¥Mæúž´}´Ò¦ó}OZ>Ú¤\ºTÞo©ëGÛM*o7Ôõ£í êEË¥Mæúž´}´Ò¦ó}OZ>Ú¤\ºTÞo©ëGÛM*o7Ôõ£í êEË¥Mæúž´}´Ò¦ó}OZ>Ú¤\ºTÞo©ëGÛM*o7Ôõ£í êUµÖLÕÕÞ´iÚØ {ÖŽ¡ÚiSy¾§­mR£Ë¢6—Ùp¬´©¼ßSÖ¶ª²©ÒK‘¶«ß†Æ~Zo¼ø®'‘ M”V»ìj·ÎÊlñ|Tñâysbˆ]!/•ík‹O}„€H¾áy倂º‚-šzŒÃ&žŽIflRÌZÄY²Þý†÷=®-p!ºÚhØÍµ*ßž|ÑÙƒ  ­};‹€uâö9®"ç \_ÉsI’\“Ã(§Û ŽŠèËseѱáŽ-ÀÀ SZ8€ ŒþLå\6ŽËf™îtö\u1OLùjä™­5Î{aÁÄÊëí^EןvŽ[VÐÛ: Õ$•Ï$φ`_,-`ÖÒÉZÓ‰Í:ÜÕ¯Aedµ‹‡Bc†Ä1ç«]6j=]ë1¼àn¦Þp8[¹W’Եͬ™ŽÎ‰#˜¶:×GäaŽ{ð׸an·nkG3Ù{SYG¤ÁaÍ‚|Á¤|¹è£p–Xãh‘î„5®ýhuÑ™ v½@ž±–R°Ïf±²JçÃLP\+*LðòX0·;#np%—¸µ§½7ä…—½´à€æ:6¾±Îl8ÙØÁ}Ñ·p¶æœ \R?%lÙs©£7g°&âÓ,¢Wq^œk\ÖÒqÑå|Ϥ®¤š*ØêtiKµ11àçÁ…¸ef·†ëÅÆê¿'-;B¦{JªÇÔ6ײß^øÞÆÓ¼{Øð´?®pïËzÝ|wé¨,hlØ09ØÞù*s{®÷=Î.q¸y&àâ.d…–È* Ñá©ôÎõŽsY…ÎŽ0_ú¦‘wzÌ#½o’.‚9ª«#Ë*A34¬ú‰LB>û8É!Å×ñ]!æ²#·Ý¼È0ÜÆKoÝÚ–;íV1“G D26jy±´æÞÓxÕx%¤^×A-s…âõËHYqÏ4¦œJ&t¯t3Ö:XC¤.ÎÆ÷–4»Á Npâ$3yq”sÐÁ_gSg¡•´O‘µJou=c‡ì’.4à‚7‘®àCºå¶kë­ËÃ!³jTSK³’º(jæº0Ü8qÆHïÏÉi¸+'d- ˜M µVà{ª-)eqn #º÷HHf”\<«øî+©¹-@ËR;E¬pž93+]šlŽkšç±à!î¼á¼—ÆIAÏ5UdycEH&fƒ5ŸQ)ˆGßg$ 8ºþ+¤ Žûõ]Xø)íJZ‡Í8²ê]–çI#ã1²V‹…îsšÙ?iÎ,¿×+9ly­ˆ-WâÒà‰ÑFáXàÀ×| X„ßpã²ß$\²ìwÙÔ¯cæŽj‰¥tÕchÎHãyñ’Íh$Ö´^nPSe°öd°´(f¬¥ÎTÓÇŒR8LÖº¡‘¾è¤a8°—\ Mú®R®‹*j(lc>›LMh:’‚I {$”62ç™YEÍ-{&f¨¯ïxº÷­…]™l-Š¡±½’9@Ïß1áí:‰ÍþË–«&è«3åŒ6I\×¹ðÕœÐZ×1ÀµØNáq-¹¤AvXÔÁiKPë>³;SMK4R2`.:²÷aº@ÒØo7ˆ€ËÃEø{kòáÔ6]=sì¹µFù«)ÜÉİ1®#hˆÜ×ayi—4.û áÉ ,°Nì,nv:Ç2A„¼‡‡‡,·¸NÆìDÞWЬвjéE49±ÌRkß™¤’D…¯KËž{òu½ÇÆûð*jòÐÒKh (˜ÝÙ¸ |¯R¸ÊØšüÎl“ sµHÂûÅ×4ºö‹6ßš®Ã«´*,ªÈ¥¥ÇŠÉŠl-ýP‘Œs¯¿¶·¾kóØü– –J™&c¦|÷Þé«\óîýQsÎk¾ =æ‹d]=5ƒOIC5$8šÉ±g$5Žt¯$]ˆÊ]Œºà7ÞpPf(rŽÔ´­Ë6xì×E$u:T1V9Ù¼§ºøC›+sŽ"ǬƒÅË_–µrHúZf6gϨç\ÍLFª{ß9²¶çGœAù8µQdµ9‡FÇ a”Ê'Ó\ey7^&+õGdåU­ ïŠÏ…²Ç$ Ò:¤¶¦Þû‹¦ìnmÁ—¸6÷\p’.'¾L‘³¥žžÙK¢tO»„d ‘ñ––>FãºG ïž 8EäÜäµ0º<—±JçÔVºi áñŒoyv¸^}ד«Y¾­;Nªžº–‚‚’йã’`*'0Æ`w|óŠùpÃu×ëiè²ÊZð+b³X,“=,çT>*†Bæ~«€÷üAÄ_¨%¡`ÓÚy³Q‰¯ŽüÓÖ: 7^Üq¹®Ân‹î% Ý¨*ê<‹¢¥´êk l“Ç,4ͨ,‚È£ƒ4›q0àKo ß$TÙ{SYI¤ÁaÍ‚|Á¤|¹è£p–Xãh‘î„5®ýhuÑ™ v½@-“hË^*â©§dTsæ'dr™ˆ±’ .-i# ãh×xÖçÌy!eÄom8 9ޝ¬s›¶F¶0_tmÄÆ-¹§AŒdtÓTË ckê¤ÌsÀâpcY~³«½cF®D‘K£¿ÊjÝ飿ÊjÝè"E.Žÿ*=«w¦Žÿ*=«w ‰º;ü¨ö­Þš;ü¨ö­Þ‚$Rèïò£Ú·zhïò£Ú·z‘K£¿ÊjÝ飿ÊjÝè"E.Žÿ*=«w¦Žÿ*=«w ‰º;ü¨ö­Þš;ü¨ö­Þ‚$Rèïò£Ú·zhïò£Ú·z‘K£¿ÊjÝ飿ÊjÝè"E.Žÿ*=«w¦Žÿ*=«w ‰º;ü¨ö­Þš;ü¨ö­Þ‚$Rèïò£Ú·zhïò£Ú·z‘K£¿ÊjÝ飿ÊjÝè"E.Žÿ*=«w¦Žÿ*=«w ‰º;ü¨ö­Þš;ü¨ö­Þ‚$Rèïò£Ú·zhïò£Ú·z‘K£¿ÊjÝ飿ÊjÝè"E.Žÿ*=«w¦Žÿ*=«w ‰º;ü¨ö­Þš;ü¨ö­Þ‚$Rèïò£Ú·zhïò£Ú·z‘K£¿ÊjÝ飿ÊjÝè"E.Žÿ*=«w¦Žÿ*=«w ‰º;ü¨ö­Þš;ü¨ö­Þ‚$Rèïò£Ú·zhïò£Ú·z‘K£¿ÊjÝ飿ÊjÝè"E.Žÿ*=«w¦Žÿ*=«w ‰º;ü¨ö­Þš;ü¨ö­Þ‚$Rèïò£Ú·zhïò£Ú·z‘K£¿ÊjÝ飿ÊjÝè"E.Žÿ*=«w¦Žÿ*=«w ‰º;ü¨ö­Þš;ü¨ö­Þ‚$Rèïò£Ú·zhïò£Ú·z‘K£¿ÊjÝ飿ÊjÝè"E.Žÿ*=«w¦Žÿ*=«w ‰TeÐ{[Ño÷Wš;ü¨ö­Þ©rɆ<ˆµCœËËZ@kÁåäþ)£áδkžò÷ÖT9Î7’eq$ÿ5ù§Öt¹ö…m >³¥Ï´)§Öt¹ö…O¬ésí iõ.}¡D@Óë:\ûBš}gKŸhQ4úΗ>ЦŸYÒçÚD >³¥Ï´)§Öt¹ö…O¬ésí iõ.}¡D@Óë:\ûBš}gKŸhQ4úΗ>ЦŸYÒçÚD >³¥Ï´)§Öt¹ö…O¬ésí iõ.}¡D@Óë:\ûBš}gKŸhQ4úΗ>ЦŸYÒçÚD >³¥Ï´)§Öt¹ö…O¬ésí iõ.}¡D@Óë:\ûBš}gKŸhQ4úΗ>ЦŸYÒçÚD >³¥Ï´)§Öt¹ö…O¬ésí iõ.}¡D@Óë:\ûBš}gKŸhQ4úΗ>ЦŸYÒçÚD >³¥Ï´)§Öt¹ö…O¬ésí iõ.}¡D@Óë:\ûBš}gKŸhQ4úΗ>ЦŸYÒçÚD >³¥Ï´)§Öt¹ö…O¬ésí iõ.}¡D@Óë:\ûBš}gKŸhQ4úΗ>ЦŸYÒçÚD >³¥Ï´)§Öt¹ö…O¬ésí iõ.}¡D@Óë:\ûBš}gKŸhQ4úΗ>ЦŸYÒçÚD >³¥Ï´)§Öt¹ö…O¬ésí iõ.}¡D@Óë:\ûBš}gKŸhQ4úΗ>ЦŸYÒçÚD >³¥Ï´)§Öt¹ö…O¬ésí iõ.}¡D@Óë:\ûBš}gKŸhQ4úΗ>ЦŸYÒçÚD >³¥Ï´)§Öt¹ö…O¬ésí iõ.}¡D@Óë:\ûBš}gKŸhQ4úΗ>ЦŸYÒçÚD >³¥Ï´)§Öt¹ö…O¬ésí iõ.}¡D@Óë:\ûBš}gKŸhQ4úΗ>ЦŸYÒçÚD >³¥Ï´+ñÕµOikªf-"â †âÿÙPythonCard-0.8.2/tools/standaloneBuilder/doc/pic12.jpg0000755000076500007650000016524210240730043022504 0ustar alexalex00000000000000ÿØÿàJFIFHHÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀR "ÿÄÿÄ^ !“Ñ1QST’Ò"3ARU”•²³Ó256Varst#Bq‘£±Á$4buCáD¡%´&7FW‚ƒ¢Ô'Ee…¤ÂâÿÄÿÄ&QA!"1a2#BRÿÚ ?ÐåÎ\ÛY9”töe•KfIè£Æ©€É ÷ÅÀx‚ÍÿŠY_вÿÑñÂSÿñæÇ¶Gö‘~£pä ÙéiãŒe…ÌÇo<ƦYMeOçšÒÞUÒ°>[>ÅÀMØ™1!-y¸ê?ÁAþ3åA²=Ý¥¼ý#}9É!ÿõOxå’ʦ°fÊc[qUÚ”ð[ÕÔOVLz,&øóQ¹Î,iïîoÀzºã:Y~i§Þ#æ\CôË”}Èôgv”ò~–r²h*e²lèéê1feuÃdÂnvŠãqÔnâW}dd½½iäål¯´ãÉú¶Ô=ÙÆšÙ^ZöB#¾ñýƒyñ¾ÙöUµdäE…jYL‰µnµXà+$£s^ç\ËÝÆ¿ù?¾ôÎÿÇÁ÷íAþ2eB²=Ý¥ô~™2‹¡Y>ŒîÒèîRÄîgHпËw;§ð¶uÿëqݘÅ~o½Á‡Û~µoU’ù3K”6Ìbͧ¤§±+¬Ç6GJ÷6Hæ{s‚\ãœÒÛ‰:€âÖn½[þXŸ~ÔCôÅ”= Éôgv—ßñ‡(z“èÇ´¤µì¼£¶¿H³­Y«¢²'µäm;­0¥#‹ZÝ`Zhißp"ûÅò3'™@ËB¢È«‡]RúWç)œÙ!{\çÈZHyãsšu>$™Ðˆ‹Çõ>ýª©J¹U_RÊj;*Ψ÷áŠ7=θ^n×@•ý0eB²}ö–ƒ lË8ZY=lYVF-.¢¸ÔËœ’^ Eà†‹ÚF·‚N+ÇŠì—èò³-êªè+éj%— m§SË,¹ÎלÍ9®¨—Žøž ­hý¦qø‚óøùwÒöPý•èÇ´½‹¶ÿC²½ö”öݫȌŸ¢¦‚Ï’8k*éæ®ŠY 5-ÂqßpcÞ Ãqõ­.@ØRZ{*l¹bºÔšŠV哱°=áí•î#ÎÞA–ft".qí~ý³?âå¿Ðì¯F=¥4ÿ¥¨¤Íi6]Ÿv1,yÊ77…îÖ*–ÎÉ«ѲìËWƒ˜Úš«:¾hìø¥Ç<ð¼4ã!$HkµáZï²¶l6Z´UP0š,ž¤¾Ìd2Ë6'HæÜÈĬq â$¸Ýx¼orЉ­¤o¯ÕOø¡”ú™Áv~‹œÍg´G`Çuøq_u÷k¹Gþ,ÛÝËôsÚZÙrZÆ€ Ÿ”¾;,å#Hkå¸ë£ ÅÇqq ;úÕ6LØâÏemmŒÊzñcÖÕËg>I˜Øß<´»8w®7jºå#-x“¿µø±ot;/ÑÏi}ÿíî‡eú9í+8²RÁ1IX(%–y,š:جøCæ¹Ò¸¶BÈÃÚ÷…¼oÕˆß~ ®¬›Igˆ¬›:Û§¦î’+éËŒRÉ„çEξ!ºñ†÷&YhÄ|bFÿrÉÒ½½Ðì¿G=¥Ñé/)f§š¢;2ðA‡;#i[#pÄo¸^u Õ•IØöµ¯bËUtÓUÚ ´%£/Œ.vkä¸ˆÅØK@:Ákµ¶}ÉWÓÔO,tÕ6mŒg’IÉ͵Ӹ8‚òC@-M‰–Z?ŠýûPÿ‰YK¢i|A£g3YíØ1Ý~WÝ}ÚîQŠvçD³=ö–¦;‚J(lzë;ƒ¬ã”’26b‘™ö6à8žI8È ½·_⸪Hl gÔ¾{Ó¥ÌYU5dñ¾™¯{Â×G‰ï7€â åÈܘå£?¸¤ïíÅþ)ÛÌôsÚ]T¤,§´&0ÑY4u2â,†Ï _u÷Ŭ,S QhÔ>\ý #œçDÈc–u7¾soxï¿W½Z<Œ¶l¦¹ÎŒXµXöá$^Û‰›Ùyý붦––8ÜbÌg”ÏëºOÒ]¿ ¯ŠZ>9â×±ôÄ‘Æ'QH¿IVüó2(¨lù${ƒXÆS\N ¿YQÙ¶›SsÚ"Ÿt,–GË[ÍàÖæ¤kƒ/ñàâ]ªàý’”4M§¨0š¢ª³ÞÊÈöÃQœ‘Ø\ç¸H;î6µ—‰Ù~`e>~ÂÒŸM~~û¤ /z¥Ä“zÔN„ßÔûö㤋dÿélïG;×ßñØè¶w£ÿåwSäý–(™WWe6 ÁeÕÕKBçÊÐÇG ¸´»¼_Æn7j^%°¬©"•Œ¡l.}‚-F½’<˜äÕÞ¶÷ƒQãë:ø®—¡ÿÉ÷íËþ#[Îôü©Æ\åm;…™H[RK`:#®”ƒq ×ßõjU™iGfÙ–ôÖuDèÏ3‡bc 5øÍ÷ŸÀy´ò®{NƧ³ßMy¼æ97¿ÃÇÛªíx‹±øÞàßDN8þ¦ü¢âeoU—CC(Š²Í¤§ŒA²Ò9„Ž[‰âÔ‚‹üCµú5Ÿ°ÿÊäÊÿÿÿÃÓÿþË:´ôtòÆæË<¢jÚßñ ×èÖ~Ãÿ+ïø…kôk?aÿ•’_Vü}>““.ÚßñÖèÖ~Ãÿ+ÐËû[£Pl?ò²C÷/a<}>ŽL»jû¾µz5Ãÿ)Ýõ«Ñè6ùYdSÇÓèä˶¨eí«Ñ¨6ù^†]Ú§ÿOA°ÿÊÊܽܞ>ŸG&]µ]ÝZ‡aÿ”îêÔèô;ü¬À_SÇÓèä϶›»›S£Ðì?ò½ ¸´Ïþž„ùùYp½„ñôú92í§miôz‡þWÞím.E°ÿÊÍõN >ŽLûi;µ´¹Š-‡þW®í-.b‹`³KÐýÉãéôreÛIÝ•£ÌQìÞìmb‹b³¡}N >““>Ú.ìmb`¾Œ°´yŠ=ŠÎ¯¡84ú^L»h†WZÅÅzî¶Ðæhö!g€û°§ŸG&}¯»­¯æhö!}™£Ø…BŠðiôreÛ@2®¼ÿѤ؅ôeMqÿ£I± „/c÷)Á§ÑÉ—kÎêk¹šMˆNê+¹šMˆT‹êpiôreÚðe=w5I± ×tµ¼Í.Ä*0½Üœ}™öºî’·š¥Ø„î’·š¥Ø…LÕ84ú9sír2޳™¥Ø…èeg5M± ”/c÷'ŸG&]®; «æ©¶!}î‚¯š¦Ø…RÔàÓé9síkÃõ|Õ6Ä/\=WÍSl‚¨^‡îN >—“>Öâܪæ©öA}áÊ®nŸdXýËêœ}¹ö³áº®nŸdÑmTŸútû « œ}™ö³ÍO7O² ï Ôspl‚­ ØN>Ž\ûXp½G7È µª9¸6AW¯¡8tú92íb-ZŽn ܽ R" Ü«Çö8”áã—>ݼ'?‘É»—ޟȃdÝˉáÓèäË·wÍäC²nåèWÌb“w.û”ƒ÷)ÇG.}ºôù¼ˆvMܺCçÂÒd¤i-¸ÅÅx¿ÉUŠ<¢Ê++&h`­¶*´jwæâkón}î,¼ š âiþ Ïýã„FØuÑË,§æV’Îøb|²OHÆ—8æN ?ü+žR9(ij䪢§eT,š6ÌÀ×\æ‡×ÜGTÔyEee6NWÖØõZM;$N~m̹Á—‘s€ºž²š¾ÌŽ¢žFËñ¼ásMàÜc¸ëkÛú@³ì¦:^£⦨½Øâ5 *e‡ œÒû›Fî÷X¼‹öË~f¤E|'/Ç*ÿE™M_]=eU}™%EDŽ–WãxÄçɸGwW5Â)dÅ{emâèÀºï÷ø’\­ ¦|¯©†¦:hÅsšÓßy‘¡­&KÚ"—Yh¸›Û{ÍÕ8q~uþÛ½.ÍÚ?°ƒôOnô»7hþÂÛÚZ)j¨…L56`ŠwI[ CX÷hú5C]Ѝ]çÄ_eZ&Ô¡m^‰53qŒK$OÎ4€CÚc{ÚZoÕ¯Åû“ÍÕ8q~V?E6èÿÕYÛGö¡ú*·:]´a~¾±4¹}ì» ®¦9¡Ò£Î×Hú †DÆ Y&yÎmÎï˜.¸ºößuüiæêœ8²ÿá]¹Ò¬í£û þÛ*ÎÚ?°´³þèfŽžª•ïÓN÷VÂÉ ™Î„RÔH.tos/.‡‹=î»ê,ëXWÏ=4´U4UPµ’> ŒØ\ëØç6âXñu÷÷ºÀ^óuN_™Ñe·Ò¬í£û Ðý[cÿUgíØ_­¢yº§/ÉÂûo¥YûGößð¾ÛéV~Ñý…úÊ'›ªpâü˜~Œ-®•gíØ^‡èÆÚúš £û õtSÍÕ8q~T?FvÏI Ú?°Ÿá³Òh6ì/ÕQ<ÝS‡åᥳÒh6ì.û3"ò–Ç–ih«læ:h Ã8ÂEí!Ñ‘q¸/ÑQ'û5&*N_˜Éú;¶¥•ò:¢Î{‹ˆas@'Ø5/?á½±Òhvì¯Ô<ÍC‡åÿáűÒhzïì¯CôskýE]ý•úr'›ªpâüÈ~Žíqÿ¨¡ë»²½‡–·H¢ë¿²¿KDó5‡æŸáå­Ò(ºï쮫;#r‚ɮ޶жŠ*ˆ¯ÀûË®¼uÄJý¯Rb¥xq~l?GÖ¯H¢ë»²½wjôŠ.»»+ôtO3Q8q~sÜ«Ò(ºîì¯Qd%­¬‘³Ð1ÁÀ8— \ ²â>¿DDó5‡¿%mûRX¤««¡{¢ˆChÀÁ}À° …årŒƒµ9ú>»»+ô4R?¯R" eùïp–§?G×we}îÓçèúîì¯ÐQ_3U8q~~2Óõèúîì¯C!í!ÿ^“®îÊß"yš§ q—?I×we;‰´¹úN»»+z‰æjœ°}ÄÚ\õ']Ý•èd]¢?ëRõÝÙ[¤O3TáŇî2Ñç©zîì§q¶=KÖwenO3PàÁˆî6Ñç©zÎ쯣#íÿZ—¬îÊÛ"¾f¡Áƒ2BÐõizÎ쯽È×óÔÝgvVÍòõ Îä«ùên³»+èÉ:ñÿV›¬îÊÙ"yz‡,xÉJáÿVŸ¬{+ïrµÜí?YÛ–½ËÔ80d{–®çiúÎÜËVó´ýc¹k‘<½CƒLdÅo9OÖ;—®æk9Ê~±ÜµHž^¡Áƒ+ÜÕg9Xî_{š¬ç ëËR‰åê³'+ýH:Çrú2v¬Ôƒ¬w-2'—¨p`Íw=WÎAÖ;—ÞçªùÈ:ÇrÒ"yz‡ àÉú±ÿR±Ü¾‹«Ë‡¬w-'—¨p`Ï‹ «Ë‡øÉÀu^\?ÄîZO/PàÁAÀu>\?Äî^…‹R?n/âw+ÔO/PàÁGÀÕ\_Äî_x£Ë‹øÊíòµ œQåÅüNåôYùQ¹]"yZ‡*eN?j?âw'ÏåGüNån‰åj*x.*?âw/¢Ì˜~ÔÄîV¨žV¡Á‚°YÓÚøËïËå3øÊÉÊÔ80Wp|¾S?‰Ü‚‚_)ŸÄîV(žV¡Áƒ€PÈÑzuƒ6‡KI«]M4b66°_pòpMÀ}š¸¸ÕÚ+Ë=?Õsµ^µ¶Ìì. jÈNGÛ TM;¦W¾b ‹ŽâÉ \¨òÇè¥ø_Ü'$þQ±¡¨ðƒî3Ù ™ö +ìûÉ6[¤çÆ3î{ŸqºíEæíGÅ}êæ£Â¸Ïd/¦šF’ Œ¨ƒ#w®m³mÉZxe’JZúúc3¤5—°Úéd—%¤´K …®¹ß(¾Rèïò£Ú·zhïò£Ú·z ›Zɨ¤"¶¦ŽjIóñMO€¸;Øu=®a{¼Jº¿$ÛhÒÍ ÖͤSLi*æ`€>¢+ÞC\3xEÙÇ€X{íwÜ.ÐÕ¾: 9ªêeŠ8!a{Ýœà>Ào?¸)[ ÞÌCm÷^çýPRQdõ=^jéjjXçºGNËØ[0|’J¯mà5ÓHFÓ¯¾.¹[©twùQí[½4wùQí[½]U•43Èç‡QÎgŒ4‹‹ŒoŽãö]!ä×r«—$¨*_+*f©š…îšABç4FÇÌ$ps@’÷ eÔ\@ÆnæÝ£ÑßåGµnõÏO,uSÏ 2GÀó˜\.kƒCˆ¿‹ˆéÆ‚d´n©edÖ¥|Õñ¸9•oÍ´åcFÆssò8^Ûï"ò@¹vØö5=ì…ï’J™ÝQQ3ÚÆºY.!kA¸ /ºóy$›mþT{VïMþT{VïA¤“%¬éì[6ÈŸ=-%y¦4¾ã#s€‡$wÚîZ þT{Vï\õÅK-Xý´¿ û„¡¨ðƒî3Ù ¢Ü´ªl» ÓѶ#S%dTÑ™,k¦¨lAÄ ÷^/ºëÇç¨ðƒî3Ù ÎU}ƒþfƒÿŸ‰XDºXyöÃõ4ßþépZv½±“Æ9-{'[ÚâÑ5+¨Û#‡ì ;€'îž"nZ§K¯V¥]iÃlâlÿp¾å¡C•6½%½ú,¯´¨dSÏ- ƒq‹Á ÜA‚F­D«û5Ícq8†´’I¸Þ/Ï(AoèBÖe÷†TÕ´~áVðµA+ ÈL ™„‡ÇfV9¤""Iœ¸¦T¹=kÕR¹™Èæ‰ÔÀH˯ |ÍuÄk€~Å£ ®§´ìúzêI3”õ¶HÝu×´‹Çî_š:K~²ª­ödM¥†¡ôí5uEˆ²ïh¼ ïãx— , £Š&Ç L¿ pet,›ÍÍd`Î5;°¬.O|í”òuí«›$ík^Å«ŠÈ¶L5,®«si_|Õ/¹»ð¸ÊÀç6ö8Þ\HÆ× ]9=ó¶QÿÉÔ{¶­ÜL| r£)­šxÙ¶V†Á4Ò8ÏJùÝ!šICdeØsDøïÅâ»_#­¬¶m÷h‡ÿì3ÿû•ϔҶÒ ’8œ,¦³^믾á=Qã=£ÊùME#ÈkkÐ¹Äø€®‰IQáÜg²eVP×ÔÓÏG>GIUI)xs'©€‡´’nsI#ÇÅ­XE¹µ©:\A½C5©IÒàÚ ë!Áv7ÿu6wZ™8.Æÿî¦ÎëS*¨è\ú¶Ò5U„ãÿ6õ¯´ìù­|“µìÚbÑ=] U_M‡zବµmËvÇž{Jhß+ž÷TG !Ñ–M7ñÝâñ©–WcK¤D\ÚwÙž}ñì¹c²¾ÜmE©iÑWM=-”褎žSsf½‚M!÷Ý­7µ¬âÆÂâMÃìöU˜Ö:’Ë–½î}嬕‘†€Ö\~ß@G틆«…÷ñÜß¹M“ùIIhP¾ÇŠjšš\BŠÑcÛœcHÕA{|`ÝyÎsF±¡ïÐ3*íˆØÌ‘™­@WC½}î¾Úú§?§C½'+›"*)ËÿÛÜ ü*OeêÉSÙÆº«(-[N²Ï}jYY¥cÍì[IåÅ\,OëN‹K&¬œ©²ÙElRº¢ž9Y3ÙŸÍa¾öxœáwµù“òÂÈïÒI®¬4ñØÏ¦–¢Ï¦’G¿3$Z3q8¼œN.–B»®Žà7ÎÊ[R’i"§ÉºŠˆš@l¦ª&b¹ _uüZ¼zÿr®´í[y®ýÁ_™¿7¥MM. î¾ìWÝ}Ë+Q+åŒTKó¼²·†QÓº†‚žM:Ù Dí÷r?ãrµýSšjL´Œñðm9ÿÚ¥h4;'ÿº‹+©I¹tEPê ê[+ ³tÈŒr:–Zhñj u÷b?Ä¥|Û7nÜžú5e~N`.\±ú#i~÷ ¾Æ§–’óé§nb¦Ž7¶ðnph^>ÕÁ–?Dm/ÂþáOm45}Æ{!p¶Ð¢{ÚÆVS¹Î7%“üWuG„qžÈPRM(³(˜$xf‹ÂnðmAœ­ÊJúYm™ÙfSIgYº¢SXæÌæˆY3‹#ÍHkî¼^GV“[ö54O=¯A1ÎiŸ#êXÖ¶P/1’N§û;„òZtZ1YÒWS2ºV㎙ҴHöëÖ}äw§_Øy‡#+©¦{aœÐ8R³dôvJ6™‘b$@FbòuÞÝwÖfOVÙÐ`†ÍšÏ’Zyžù1ß Š(£ dGþ¥®2^ÒëîvùP-¬‹zζì¸+èêc1ËNÚ‚Òö⮿å€Mļµ®"º8Jƒ¦Óm[½sdý]“dQY³f‹h©£‚9£“& Ûˆ´´a½­c¸ÍÅÄ~Ès®4™ùù:å PtÚm«w§ PtÚm«w®ý&~~N¹M&~~N¹AÁÂT6›jÝéÂT6›jÝë¿IŸŸ“®SIŸŸ“®Ppp•M¦Ú·zp•M¦Ú·zïÒgçäë”Ògçäë”%AÓi¶­Þœ%AÓi¶­Þ»ô™ùù:å4™ùù:å PtÚm«w§ PtÚm«w®ý&~~N¹M&~~N¹AÁÂT6›jÝéÂT6›jÝë¿IŸŸ“®SIŸŸ“®Ppp•M¦Ú·zp•M¦Ú·zïÒgçäë”Ògçäë”%AÓi¶­Þœ%AÓi¶­Þ»ô™ùù:å4™ùù:å PtÚm«w§ PtÚm«w®ý&~~N¹M&~~N¹AÁÂT6›jÝéÂT6›jÝë¿IŸŸ“®SIŸŸ“®Ppp•M¦Ú·zp•M¦Ú·zïÒgçäë”Ògçäë”%AÓi¶­Þœ%AÓi¶­Þ»ô™ùù:å4™ùù:å PtÚm«w§ PtÚm«w®ý&~~N¹M&~~N¹AÁÂT6›jÝéÂT6›jÝë¿IŸŸ“®SIŸŸ“®Ppp•M¦Ú·zp•M¦Ú·zïÒgçäë”Ògçäë”%AÓi¶­Þœ%AÓi¶­Þ»ô™ùù:å4™ùù:å PtÚm«w§ PtÚm«w®ý&~~N¹M&~~N¹AÁÂT6›jÝéÂT6›jÝë¿IŸŸ“®SIŸŸ“®Ppp•M¦Ú·zp•M¦Ú·zïÒgçäë”Ògçäë”%AÓi¶­Þœ%AÓi¶­Þ»ô™ùù:å4™ùù:å PtÚm«w§ PtÚm«w®ý&~~N¹M&~~N¹AÁÂT6›jÝéÂT6›jÝë¿IŸŸ“®SIŸŸ“®Ppp•M¦Ú·zp•M¦Ú·zïÒgçäë”Ògçäë”%AÓi¶­Þœ%AÓi¶­Þ»ô™ùù:å4™ùù:å PtÚm«w§ PtÚm«w®ý&~~N¹M&~~N¹AÁÂT6›jÝéÂT6›jÝë¿IŸŸ“®SIŸŸ“®Ppp•M¦Ú·zp•M¦Ú·zïÒgçäë”Ògçäë”%AÓi¶­Þœ%AÓi¶­Þ»ô™ùù:å4™ùù:å PtÚm«w§ PtÚm«w®ý&~~N¹M&~~N¹AÁÂT6›jÝéÂT6›jÝë¿IŸŸ“®SIŸŸ“®Ppp•M¦Ú·zp•M¦Ú·zïÒgçäë”Ògçäë”%AÓi¶­Þœ%AÓi¶­Þ»ô™ùù:å4™ùù:å PtÚm«w§ PtÚm«w®ý&~~N¹M&~~N¹AÁÂT6›jÝéÂT6›jÝë¿IŸŸ“®SIŸŸ“®Ppp•M¦Ú·zp•M¦Ú·zïÒgçäë”Ògçäë”%AÓi¶­Þœ%AÓi¶­Þ»ô™ùù:å4™ùù:å PtÚm«w§ PtÚm«w®ý&~~N¹M&~~N¹AÁÂT6›jÝéÂT6›jÝë¿IŸŸ“®SIŸŸ“®Ppp•M¦Ú·zp•M¦Ú·zïÒgçäë”Ògçäë”%AÓi¶­Þœ%AÓi¶­Þ»ô™ùù:å4™ùù:å PtÚm«w§ PtÚm«w®ý&~~N¹M&~~N¹AÁÂT6›jÝéÂT6›jÝë¿IŸŸ“®SIŸŸ“®Ppp•M¦Ú·zp•M¦Ú·zïÒgçäë”Ògçäë”%AÓi¶­Þœ%AÓi¶­Þ»ô™ùù:å4™ùù:å PtÚm«w§ PtÚm«w®ý&~~N¹M&~~N¹AÏÑOr#/ÉŽ_Éxýãøªl±ú#i~÷ â9úSœâç£y&ÿúQ*|±ú#i~÷ ìhj< ûŒöBå¥ù¾‹ò°û¶®ª>ã=¹i~o¢ü¬>í¨%EPmø™•¦À’µÎ¤eLuŒqsÆoï]pï yÕ‡Zƒ(è*l«®®¦šŠkR傞YÚç=­8}؈.PñŽTè«…¿c:wÀ-z3'm3£,ÄÙ\H‘~§×\Þ=G‘O§A-£-u3ë¢n9)›+LŒn­e·Þ|5ý£•R"(ˆ€ˆˆ*ª-Ø¡¯šŠ:FªXC]&‹JéCC†«ðñ_qãä+Ï»Ìv﫤ܽÙv”6Eµ•V…CdtPSÒ9Á€_Å'Œ9\âÑyq--œ»³2~ކªÔ†zHês˜ÄòCàÀ@}ì|Ò]ý!&+¯máÍźEG¿Ìv﫤ܜ:ÿ1Û¾®“rï±r¼µ³2ÛŠzxxB¾mŒ-âf!½ë±7 Q:÷=­«:É"õµ•åÍ…–$SÔCÂMhÂat K -ï‰Ø¢•·9pý`Ö7*¿Ìv﫤ܜ:ÿ1Û¾®“rž›ô©`W6]“ÕÈ3f –¾¡¯–8š@þ¯¾–=RæÝßq^×`̺ -vvŠº›ÛoldÔJÙYânÙ¤dd¼µ¤ºðâÀ\£‡_æ;wÕÒnN˜íßWI¹kì›Y–¬Sÿ–ž–¢š\ÍE4øqÄü-x±Îi½c»×•q¸‚‚T ¿Ìv﫤ܜ:ÿ1Û¾®“rߢT ¿Ìv﫤ܜ:ÿ1Û¾®“rߢT ¿Ìv﫤ܜ:ÿ1Û¾®“rߢT ¿Ìv﫤ܜ:ÿ1Û¾®“rߢT ¿Ìv﫤ܜ:ÿ1Û¾®“rߢT ¿Ìv﫤ܜ:ÿ1Û¾®“rߢT ¿Ìv﫤ܜ:ÿ1Û¾®“rߢT ¿Ìv﫤ܜ:ÿ1Û¾®“rߢT ¿Ìv﫤ܜ:ÿ1Û¾®“rߢT ¿Ìv﫤ܜ:ÿ1Û¾®“rߢT ¿Ìv﫤ܜ:ÿ1Û¾®“rߢT ¿Ìv﫤ܬ©fuU#jMQNâÑDf7ê»YiÖ8ü{–µSZ~ýóìµI…p""È""" """ "â¶m °í K5Ñ)¤Ÿ7‹< .ºû×ÝÇr÷%§A£%u3+¥n8é+Dn½a·ÞGzuý‡‘QÔ‹Š+fËžIãŠÒ£‘ôò6šÉÚLR9ØZ× õ8»PY:”sÛtX6Ü3²®†$œÉJöÈÖ\A¸žôŽ>4(ª(­Ö¾ŠY-(ÙGSOVÚ9âcÌ­lsDw;¼8I¯¸]Žãqä–ôQÚu0<ÓEKJæÇ5Lõ;Ÿš|®kZF²ÖÜMàa{÷°„èªêíÚXalÔòCU+c¢¨ÌÊ ¡‘ï€@ý ÷²ö’dmG<ͧ§’g‚[ Èwz©‹(›<,šÛ’)DzϵÀë5…ai|ÕYøöJ»É_¡ö'ä ÷mV eøuþc·}]&äá×ùŽÝõt›–ý¨F‡_æ;wÕÒnN˜íßWI¹oÑ*‡_æ;wÕÒnN˜íßWI¹oÑ*‡_æ;wÕÒnN˜íßWI¹oÑ*‡_æ;wÕÒnN˜íßWI¹oÑ*‡_æ;wÕÒnN˜íßWI¹oÑ*‡_æ;wÕÒnN˜íßWI¹oÑ*‡_æ;wÕÒnN˜íßWI¹oÑ*‡_æ;wÕÒnN˜íßWI¹oÑ*‡_æ;wÕÒnN˜íßWI¹oÑ*‡_æ;wÕÒnN˜íßWI¹oÑ*‡_æ;wÕÒnN˜íßWI¹oÑ*‡_æ;wÕÒnN˜íßWI¹oÑ*‡_æ;wÕÒnN˜íßWI¹oÑ*‡_æ;wÕÒn^™m½ïk‹m´¸{èÖÞN >Ó©oTU?éfûŽþ‰P('>苚 o¼ž-\Ñ}Í3¤Gü¹J×ÏÿæB¹VU.i"?àí˵IhÔPÆürÓ±€CF÷ÿqöÝ:£³¾—[Ÿ…Ký‚Þ›äÕ~hû¨•FXý´¿ û…oMòj¿4}ÔJ£,~ˆÚ_…ýÂ{>ã=¹i~o¢ü¬>í«ª£Â¸Ïd.Z_›è¿+»j jûZÛVЬlì‚I) ŽŽv‚çÓϧ9˵^.” ¯¹ÃN¢o¡´²BÚ¨ÉZK)¡—7d²„·Ošš8¥ -t—FÓžk¯ozð ÿ{–ñÆ6¯$«ç «³SMIk@Ò\냪§G~® }Èx¯SYÙ-=¾*d ’ªê*ã™ÕÓ¸â”ÈpŠ{ÄL#:F;Ýx½÷·X‰`ˆŠ" "" û—MÊ,¦§Ó¹ÑQ–Íð½ŽÂñˆˆ- NÒ£Šj-¨Àb&¢þæøÜvK„a€\ hlÌ“6k#›ÉÍ´’~Óv¿÷¤?ÉdÝËVt' ¢Ú—Z5ÕÅW=m=$Ù¡Ld/sKXuK Îp¹ÜW€B¿$à®´]RÛFºžjà­¨¤‡4cžhLeŽqs ƨ£5Í7ŠòIñ¤?ÉdÝɤ?ÉdÝɸ|ƒ#i¡¥†Ö•¥%3à4”Α”̆VHÆ45€¼_ŠB÷\ ÎÎ%6EY³Éž­¯‰õ2DðöÞÉ&©eV1ÞÜK%… ‚.8:õ÷H“É»“H“É»“p³²l–YQOþfzªŠ™sÕ3áÇ+ðµ€Æµ¢æ1ïZ>MæòI6 9¤?ÉdÝɤ?ÉdÝɸhÑg4‡ù1웹4‡ù1웹7 ,æÿ&=“w&ÿ&=“w&á£EœÒäDznäÒäDznäÜ4h³šCü˜öMÜšCü˜öMÜ›†sH“É»“H“É»“pÑ¢ÎiòcÙ7riòcÙ7rn4YÍ!þL{&îM!þL{&îMÃF‹9¤?ÉdÝɤ?ÉdÝɸhÑg4‡ù1웹4‡ù1웹7 ,æÿ&=“w&ÿ&=“w&á£EœÒäDznäÒäDznäÜ4jšÓð‡ïŸe«—H“É»——ÊéÃp¼€Öýe^dW[ôÚ¹9jYÐ9š®’Xç’æ‚nUåqp]|V½aŽ ¨kj⬒J‡8¾'1‘· cÃsêAÆ0—_„á﯑Q†~F×ÕÐY” u5™4ŒîUÄÙéÞ÷=¥€0–ÓÝ‚÷‚_qpóijXµ’Xy_ -d³Z­‘Ôѵ×M,qI¸\Ããºâ5­*%ŒÕ~N¶Ú­mTu54Ô5pg&ddÃ&x4¶)0–êp$—wÁÐÁuØ­’UöŽLÅH&¦á]Q=d®s°ºYi¦Šæ›¯-k¥c[~±×pd‰c'kØ’²¸:Ž%u—0ÂÂm§©|¯&á…­ :µë#ÖZ±-¥óUgà?Ù*ï%~‡ØŸƒÝµV \Ö¹§Qk…àý„56ÿ&=“w+CF‹9¤?ÉdÝɤ?ÉdÝɹ4YÍ!þL{&îM!þL{&îMÃF‹9¤?ÉdÝɤ?ÉdÝɸhÑg4‡ù1웹4‡ù1웹7 ,æÿ&=“w&ÿ&=“w&á£EœÒäDznäÒäDznäÜ4h³šCü˜öMÜšCü˜öMÜ›†sH“É»“H“É»“pÑ¢ÎiòcÙ7riòcÙ7rn4YÍ!þL{&îM!þL{&îMÃF‹9¤?ÉdÝɤ?ÉdÝɸhÑg4‡ù1웹4‡ù1웹7 ,æÿ&=“w&ÿ&=“w&á£EœÒäDznäÒäDznäÜ4j*Ÿô³}ÇEC¤?ÉdÝɤ?ÉdÝÉbSþ¾ÿ3úÅ ”¾#ØÖ‡_ s .mÇP7‹÷õê]®ðªlµ1JÆÔËåbÈ_Çuà~±ÅãÔ©»—ÏöÎÙ…k*›v‘42~­€æâ,¾A~'kqïN«›Æ.:Íúª¬ï¥ÖçáRÿG§s²ùþÙÛ3°º¬Ë–eELú]ULµ{êÒnm÷]sG”PvÓ|š¯Íu¨Ë¢6—áp­é¾MW溉TeÑKð¿¸OcCQáÜg²-/Íô_•‡ÝµuTxA÷ì…ËKó}åa÷mA*,NS[UÔ6å|tõõè¶lU4ðGJ×Á$¥Ó_ŸÆsl9¶KØÄo.í,©³ì«r’Ê«8%ªÀüô\oqcFopÞàá„ õ!Bíj§-ìÚK9ÕµÔß1›7˜÷ÜO{ÃFm÷µîkÚ[sš h=Ðå%NOGlÀ_-<ޱŒÂç:S&h0p’dïqbÃãŇZP·E‰‡,%§µ-×ÒZM{jsTô´åÀÑ´8:ìXê/ý×=×ñ4ç~,íJª)j0hÙàùq±Úâk ͵ÆQpcõ¹€:‰ÄÜJ„YéòŠ­•–\YNúšÑO,U2ìÙŠWãkšòÍF=cp÷½óoÙiHÚhçàúòÚ†Ç%+ëù#Œ9ÿz/š-R`7;‹Q¹CJŠ®ŽÞ¥­¬Š–(æ—J¸¸ ¿ËÌØ_ãñ¹À³Žî%h‚¡³[–…·_CeÅgR2'9ÕR=¤ãë°ƒäžOêà̱æì-¼Ý…ÉCYQCkeLôbUš¢d-á­sÜ^Öyhs‰ 5¥ÍÄ뛉·â _-íJ;µ¶|0ZPÒ>²Òd÷74×<6ó$±ºÌ¡ÌÃ3£sH –ŒzˆG_e7amæì'e7amæì.KÓµ,–²ñm u·jSÁK 8'cÛ-T·ç&^bs@-gË»½7­ëNÔµšû„T46Ý—O5,Ðãït´²ßœl˜q•­ 5ÿ îø\¨|–<Ý…·›°œ–<Ý…·›°ª)rç**¬êZ·ÙÔ”lµM- êÂ#lµGvTÌg¿ÐÜZÛÇs{;´¶ 1Å3(d’®YiiÞÈ^Á ‘VÅD縜ms¦Î‚ÒÐÜœN0¨|–<Ý…·›°œ–<Ý…·›°¯lB²­Ö•%y‚J«:¬S>h#1²[âŽPàÂçÜ% »¿ ú¯¸\%@ÅpfXóvÞnÂpfXóvÞnÂÚ¢T We7amæì'e7amæì-ª%@ÅpfXóvÞnÂpfXóvÞnÂÚ¢T We7amæì'e7amæì-ª%@ÅpfXóvÞnÂpfXóvÞnÂÚ¢T We7amæì'e7amæì-ª%@ÅpfXóvÞnÂpfXóvÞnÂÚ¢T We7amæì'e7amæì-ª%@ÅpfXóvÞnÂpfXóvÞnÂÚ¢T We7amæì'e7amæì-ª%@ÅpfXóvÞnÂpfXóvÞnÂÚ¢T We7amæì.Èië`¥h´t}+ƒ…9q`..ž>AýÎ¥SZ~ýóìµIÎñ d4²G-$‡Æä^qAÍÉ´”¨ðƒî3Ù %ÇlÚ-³à¦t0’ùêá‚÷¾ðÐç€MÀ w_wÛüb£ÊofÉÓ{a^ "*¼¥«žÏÉ[b¶•ùºŠz)¥‰÷…Ía Üu`q ´E‚Ý©³¥tùÛnÕ¡ÂØÞ+([M#g|±Ç cÅ!ÁØßˆ›ÀÂÝm¿¾í´²¶’š’µï†¾f6¢8ë¢lD>XZó#ckœN&椸½¡¤³Œ‚/PҢ˻ô`ÇjUQKQƒFÏËŽ×\ém®2‹ƒ­ÌáÔN&âž|¢«ee—ÖS¾¦´SË@Œ»6b•øÚæ¼³QXÄ\=ï|ÛÔ4(³Y[”SYVU«ŸMS5u=žú“$B<4Àµøìã†!{nhqïMãX½\ØÒÛsYm{Ý4n–0XY#žøÃ‹Ú"kŒ·ŒÖXèœMÄ¡¥ECTG<ƞ˯ž¦¡®‘”ÌÍb1´0™Ì‚'7õ‘ëkÏÊ»®ÃË_–TT¢iŸ¥rò"csÄR>¤°µçn`XiÅ„qbJ„Y©r¢aiÙÔ"Ë©‚¦z¶E=<ù²öÂø¦sdid…—b…׋ɹ®ïo-½fåm%M%Ù |ÔÏm‚Ne$¿€5€U~`%®lŽiŽøÝ„ºÄ\–<Ý…·›°œ–<Ý…·›°© ÊûvÊÈ®µT–$V•§}8$Âæ0ºGÎÒDràÙI-.À/ u…^[Û]QlVRÐÍBÚ»F–xKÛ#´aRö½Ï$x¦,- :Î<_°-B:ø3,y» o7a83,y» o7apM_mYUkÇ-M%e±UEgÃDÚ[<µ¯8ëZXú€ d®¼ÊѨj&àî;+)­Jü¦qŽ(í;B*{9îž<ã!|2ÚEÎ1µúñhäa8þSð÷ÊwÁ™cÍØ[y» Á™cÍØ[y» Ùko­‰Ù›˜±(ŸUT\Çâ¨tSÕDö0b¹â›q.Íßq_x¯Êl¨·+줎[28ìyií:¥q‰‡1ÎÜMvx¾BL.ï-¸8œD2÷*ÿe7amæì'e7amæì. )¦É‹BÑŠ .ͳçÙL6} /¥kg«|.”ØÿZæÞy¨E|ï’Þ< ÊNÊCg¶:a¤µa‚:˜ÛŠFæê¬·9˜¯7wó<8rÆÏMêwÁ™cÍØ[y» Á™cÍØ[y» ‚«)m¦UØYFèé*hØò:†Ž ]¨¨¡kZ÷:[¥-ηšÂu·íÐXyGo×e•hÓRR½¬ª}P,i‘â1NYscšA ÿ3¬9Ï$0÷¹P>pfXóvÞnÂpfXóvÞnƒ)kí+Bjˆ¢–’>ηlÊYbt|³8ÍK.6Ɍִa,wÉ:ûîö¾—.r¢ªÎ¦«}IFËQ”Òо¡Œ"6ËQw`eA|À6{ñ] Å­¼w÷5P-ø3,y» o7a83,y» o7arwil@cŠfPÉ%\²ÒÓ½½‚"­Š‰Ïp/8ÚçMœ ¥¡¸18œc¢,¡ÊJœ£9; ì¡U*+ŸO&”’5Í„IVÓ'‹-X  {à̱æì-¼Ý„à̱æì-¼Ý…Qke¥¥hdul¤¢‚¦Â’¢Î3G1¤3Ü%+AiÍ–´–ã^p¹¸›(­¨M­Kœ¤š¾*Ølúà¢$Í.D¤‡ÎÖÜZéíÂÆò@*óƒ2Ç›°¶óvƒ2Ç›°¶óv%&SZ–¡=UdãàÚY¨j#ÆÖÏ“SºV€òÖ;õe×ûœ#ïÈeîì~ZÛÑYÖMc`³g}·O]ˆSµõ±˜ä~'c8j‡~Û‹/Àëî ßÁ™cÍØ[y» Á™cÍØ[y» ¦|¢´¨²_*ªg“Z%FDæE;›LÉÚpÑúÀÒ1›ð“x¾áÎû~Þ£ÊzŸ¨šÍšyª t•QÒ>6æ_SËfWûé>^"?Yò{Ýjóƒ2Ç›°¶óvƒ2Ç›°¶óv²¶ÒšŽÃš¶žÍ¨‚Ûe%u4:;†ŠÓUHÌ.%äHð*AkÀeÎŽü&û„vv]eM =]U•46¤PI@ésc7žš›Þ¶w¾v´T5ÅØaù Ó Â¨|–<Ý…·›°œ–<Ý…·›°¥§¬¶—6] M¥C.f’»Km#^-ƲøËÎjAñ—÷¤‘vræì b¸3,y» o7a83,y» o7amQ*+ƒ2Ç›°¶óvƒ2Ç›°¶óvÕ b¸3,y» o7a}vV°â™–#bÞY,®poŽàZ/?eã÷­¢Š§ý,ßqßÑ(gæ`Ži/¹® _û×…-Oú©¾û¿ª‰eDDPEMòj¿4}ÔJ£,~ˆÚ_…ý·¦ù5_š>ê%Q–?Dm/Âþá_cCQáÜg²-/Íô_•‡ÝµuTxA÷ì…ËKó}åa÷mASiäÔ6¥uED•Õ‘EULÊJªh³y¹âiyÂâX\/Î<×4Üu\EéY“PÕ×: WVA•0ÕÏMo74±¹ÅÌ. 0C\Íå$›´K#%iÚöW×¶§>Ùâ©/cŸ 1‹±4µçœÂç‡<‚/q-iol¶®²X©3M£î`ѲXä´†‚æ“ `——:æê ’N‰Å%‰c>Žª²Ñ¬ŠUÕHç6(et‘Ó4†âk ùoi‘Ä5¸œíwá]¢ ‚ijɶm÷ÖÑ™(+a‚$‹&¯iÅÎߨÞG*¶¬°²zЧ¥§­°èª`¤f xæ l-¸ ˜ nh¹ \9"àElYÒÙ6% £=£GdRÓ×O‹=S d’b8‰Á·›È߯RªÉ±+­-Ë"–¢º 9š™¨ƒä ÄÜ.-¼\I"î"«7 8l›žZ™a²)c’ªVÏPöQ™dk±µî!½óƒ»àN°uñ©CeHDZöl.cÙ+ÓIxsev)Aïu‡¸^áûGY½T"nt0PY”qÑÐQ²’–;ðC1¼’nh É'þë£Hg“&ÉÛ–qpÑé òdÙ;ri òdÙ;rÎ"n=!žL›'nM!žL›'nYÄMÃG¤3É“díɤ3É“díË8‰¸hô†y2l¹4†y2l¹g7 Ï&M“·&Ï&M“·,â&á£ÒäɲväÒäɲvåœDÜ4zC<™6NÜšC<™6Nܳˆ›†Hg“&ÉÛ“Hg“&ÉÛ–qpÑé òdÙ;ri òdÙ;rÎ"n=!žL›'nM!žL›'nYÄMÃG¤3É“díɤ3É“díË8‰¸hô†y2l¹UZ'ƒ®py#Hý–ò®I‘沺’ŒÜµP1ጽ®;ÑâU­}”Æ5¢ÐÔÖÆÑ}sɺ3{o%×’OÊ'[†§^5)$°¬‰¥|²ÙT/‘ä¹Ïu; qІ:h!«¬Ñ!Ì9ôÅÌ,šHZÆÇ#ŽAÃ5¦¹­8ã[¯Ñ"X« °ilî ÌÉ3¸6‰Ô0ã âŒæõºá­ßªoÃYÕÉhˆƒž½–ΪŽ69ïtOkZÑy$ƒpYX¶u46=„kèm :‘‘2GÓã|1†¼5ׯºãqÖ¹Q"hwÖØY=i26WØtULò=ž€<5Ïv'‘{u;Y>3¬®ÆÁ@ÌÞ675+çŽêb0HüXž5jqÆûÏÄîR©]î›ÉŠz:š8rvÎŽ–«‘ ,æ†K„ÞÜM ¹×bþ% °²y´ m‡D(ÞÆ±ôâ€fÜÖ¼½ · Ä9ÎÄ\O\›…¸¡²›NúvÙ°ˆNÚWÆ);×BÐCc# Å€9À7ˆb<ª7Ù6$••U’Y®ª«ˆÁS3¨|Ñc݆÷6àÇV «7 :[&Ä¡³§³¨ìŠZzñg©¡¢ ŽLC ±46ãxøÂGdØ‘`ÍÙ¬ÍáÁ†ˆ 8sxnïu]™ŠîLÛ<‘ub&áÞË '£¨«¨e‡DÙëXöUHÚ;^oxyÃ{ƒŽ² ÷ø×E •g2PÙ°Ò²=¶ L6½ÁÏ ºƒœ q U›…U“bWZ0Z5–E-Ets53Qɉ¸\[x¸’EÜE!²lJyje†È¥ŽJ©[=CÙDe‘®Æ×¸†÷Îï:Áׯ«7 wÐÙR1ì}› ˜öJÇ4Ò^Ù]ŠP{Ýaî¸~ÑÖoJ:*Îd ¡³a¥d {!l˜m{ƒžu8@ã ª7 x(lªZˆª)ìØaž*qK‘Òas!ñ!·†¯ÖMˆû:K9ÖE+¨eÁœ¦4@Æü­míÃq¸1€r·*ÄMÂÎ&ħ‚ž,ŠX¡¦¿1(ƒ[ïl‡ ï{ö5Ú¿i ñ€Ù6%<µ2ÃdRÇ%T­ž¡ì¢ 2È×ckÜC{çwÀ`ëãUˆ›…¥gPZvM©gÉÇiÄøªd†×»y²ëðëphÉ ”6M‰fETE-$qÊgc ¢†ÈZX^n§’Ûøî7q*ÄMî|Ÿ±$lÙšRIQWeD´´¢7Í$R‰Z^C{îøk¿_|u‚o]Y6$:vjÈ¥„/ÓpѤß}ùÎ÷¿¿¸ïùG•V"nôÔ6U=5=%› R¼¾ž8©0¶àKmÍ$=à‘åR»4†y2l¹g7 Ï&M“·&Ï&M“·,â&á£ÒäɲväÒäɲvåœDÜ4zC<™6NÜ£žf¾žFµ²mÜŸ¹P"X–§ýTß}ßÕDˆ ""‚*o“Uù£î¢UcôFÒü/î½7ɪüÑ÷Q*Œ±ú#i~÷ û>ã=¹i~o¢ü¬>í«ª£Â¸Ïd.Z_›è¿+»j Qbm{BºÈËŠÚêh´˜86–Òâk1Êù*'‹ä Žî/×b:˜¡²k­[7&©¨(åÓ­‡Ö׺Ghvu¬ªI&4Mo|öjÄ~V Eä(o`ìl§µ-»E‘Y´¶m›ª’IctŽmÔôo†–çúòÎ6ê ?³…×RÛÕU+fZ”qà õñÅ(Ž@fs™œpd`´ÊàÐNA¸8€â¡¢Eš£¶ëëêd¨Ž{**yà§‘…îx™ÒGñG=à]úà0E£[q÷´”GlÖÔÙ ŒYP×Z””rÉRhÞàÖÉ\¸0ç!¹ }ÆçŸÁCôY<œµ+í<¦´ ó0C#!|Mk°ºVTÕDd`.ï„W–ë:Ú1wºóÓO(’æe4®©¶g”Oš9æ¶;V–&°¼“xºáÄ521ûÔ?ME“Él¢µí™à}}žÊzJÚM2˜“\{;Яt‚éï-Žë…íï€ÄÔV\¶îSZðIjÚ4±RÇNèÙK#Z/x}÷âiòGÚ­»†oÖ+woÃTCLÓòŸBÏâÿá¹íüæœvûk9vþÿ“ß\º&ÁþKu}ΘézN{õ9¿þk7þ§Âj¿ý¹¥¨E¯pÌúÅníãøj9²:ž™óåEµ ÚÀçÔÄÐ\ç´kgq *jj¬©§³™EiÓÚ²Úõ6…—<’@Âèâ„ FÔöwnq“‡1¦ûœ]‡.Uï±í·äÕSíʳUgÓUÚÙée22Hj(ßs@¸Ç#c3ÜÞ[yÆñz£[Ü3>±[»xþw ϬVîÞ?†²Vœ9WŸÊc®µtìÕ¡‚žžŽ§kº6 L¹Œ^ŒË3¸µú…i2¶zjXì 'Ël²–˜¦¨ÑWŸ•¢Žg´GúÙEᄸki¼Þ×\=Ã3ë»·á§pÌúÅníãøjŠŒå´¨è=pÓósRçfsL”µî{Œ¡Ä?”óSǬ9î7‰.¸•úB §pÌúÅníãøiÜ3>±[»xþÕ¢ §pÌúÅníãøiÜ3>±[»xþÕ¢ §pÌúÅníãøiÜ3>±[»xþÕ¢ §pÌúÅníãøiÜ3>±[»xþÕ¢ §pÌúÅníãøiÜ3>±[»xþÕ¢ §pÌúÅníãøiÜ3>±[»xþÕ¢ §pÌúÅníãøiÜ3>±[»xþÕ¢ §pÌúÅníãøiÜ3>±[»xþÕ¢ §pÌúÅníãøiÜ3>±[»xþÕ¢ §pÌúÅníãøiÜ3>±[»xþÕ¢ §pÌúÅníãøiÜ3>±[»xþÕ¢ §pÌúÅníãøjQg6˦m3j**KduóT<9îÔÓ¬€«ü@U¦TÖŸ…?|û-RDÊcsZÖÇvq´þÈû!þL{&îJ>ã=¸iÐ={k©œ×¶7µÂV[!Ãøœu4øÏë*æÊ*êˆi¨[ÄyÚúxÞXÀÒZ^/}ÇÇöjVj)¼™ÿ'Mí…x€ˆŠ" """ "¨Ê8e6tu´Ñ>J›>vUÆØÚ\÷5º¥kûNtN‘€†°n"‚{VºKkY´ºME¯ZÚ:ak®§Š)„½{\æÎöœböÊÓy¸1ZdXÚ\¥¶ªEc] 3SÒGú—¹¤º¡õÂ;á)`?ªÕ/–àà ¸¹GQVÏlCILÛ4UÖGB´@óqÿ8ㄵڴr3dƒ¤x%×kPÛ"í¶LV¬Ì†ƒ3dR>¢ –¿îŽj˜ÜÖ ûÀñOx$»÷]%÷Ê"Ãd”1A>LÏ LŽkBÂ’¦¶F4TÊ 1HGËuò?¾7žýÜ¥åvÌ¤Ž—.-¼Û¦vvŠ’Wgf|—%MḉÂÞF‹€ñöZHáý!PÔ5ÓÏfÕã™î`Ã%0ZN}¸@¿ŒÞƒBˆŠ" """ """ """ """ """ """ """ Š›äÕ~hû¨•FXý´¿ û…oMòj¿4}ÔJ£,~ˆÚ_…ý¾Ɔ£Â¸Ïd.Z_›è¿+»jê¨ðƒî3Ù –—æú/ÊÃîڃІ&ÎùÄL=­c¤ œÖ’@'Æs®iå\µV5—]J)jìÚ:Šq!˜E, {1’IuÄ]ˆ—8“Ǭò®ÔAËMfPQ½¯¥¡¦Ínº(šÒs[p¸q]bîF7$¶eöp³¦¡¦’„5¬ω¦0ÖÝ„a"ë…Âáâ¸.¤AË%™A-££% 3ë¢nê]LŒn½A×^|u}§•qWä½hŠ6TYôΆ‘Í,‡2ÂÇ5¬‘ŒcšF¶´Jâˆñxï·DEGKc3M yˆÌ0àŒ Üfîõ·q7½n¡«½‹Á³(XM 1,sžÒbozç³»)Âlå¬îʦD¹<&ÎXúÎì§ ³–>³»*™ä\ð›9cë;²œ&ÎXúÎìªdK‘sÂlå¬îÊp›9cë;²©‘.EÏ ³–>³»)Âlå¬îʦD¹<&ÎXúÎì§ ³–>³»*™ä\ð›9cë;²œ&ÎXúÎìªdK‘sÂlå¬îÊp›9cë;²©‘.EÏ ³–>³»)Âlå¬îʦD¹<&ÎXúÎì§ ³–>³»*™ä\ð›9cë;²¸kflÄ9®i%ÄÛõjhñȹK•ÙE 5‰¶}©.l5…ñQHZHÚÅþ>.EÍÝ4^j¶}û•â ÊZv™µgÁ›i±Ì¯‚G:Z7µ¡¡âòMÚ¹V­D@DDD@\²Ù”ÙÂΚ†šJÖ°S>&˜Ã[v„‹® ‡Šàº‘(³(à4ÂÀÚgF"nDÐ@Œ‹µ´:æñk<«Ä–5—5+©e³hßNè™ ‰Ð4°ÆÂKE×ai$Ä/Ô»QQÊ,ÊÀø 0…ð6™Ñˆ›…Ñ4#"ímι¼ZÏ*êD@\QXÖ\O$Vmo¨‘³Læ@Ðe‘®Ä×8Ý­ÁÚÁ:ÁÖ»QÑÒÏŸÏSC&~1 Øã9¿½uümï¨êï*çdæ&˜×1²ŒMkˆ$âµ·°r/h€ˆŠ" """ """ """ """ """ """ """ Š›äÕ~hû¨•FXý´¿ û…oMòj¿4}ÔJ£,~ˆÚ_…ý¾Ɔ£Â¸Ïd.Z_›è¿+»jê¨ðƒî3Ù Ž(«"§‚/òG5#¿=&¼-ÿö Xk9(¶ò|4ÃYÉE·“ᥠQE†³’‹o'ÃL5œ”[y>P•Xk9(¶ò|4ÃYÉE·“ᥠQE†³’‹o'ÃL5œ”[y>P•Xk9(¶ò|4ÃYÉE·“ᥠQE†³’‹o'ÃL5œ”[y>P•Xk9(¶ò|4ÃYÉE·“ᥠQE†³’‹o'ÃL5œ”[y>P•Xk9(¶ò|4ÃYÉE·“ᥠQE†³’‹o'ÃL5œ”[y>P•Xk9(¶ò|4ÃYÉE·“ᥠQE†³’‹o'ÃL5œ”[y>P•Xk9(¶ò|4ÃYÉE·“ᥠQE†³’‹o'ÃL5œ”[y>P•Xk9(¶ò|4ÃYÉE·“ᥠQE†³’‹o'ÃL5œ”[y>P•Xk9(¶ò|4ÃYÉE·“ᥠQE†³’‹o'ÃL5œ”[y>P•Xk9(¶ò|4ÃYÉE·“ᥠQE†³’‹o'ÃL5œ”[y>P•Xk9(¶ò|4ÃYÉE·“ᥠQE†³’‹o'ÃL5œ”[y>P•Xk9(¶ò|4ÃYÉE·“ᥠQE†³’‹o'ÃL5œ”[y>P•Xk9(¶ò|4ÃYÉE·“ᥠQE†³’‹o'ÃL5œ”[y>P•Xk9(¶ò|4ÃYÉE·“ᥠQE†³’‹o'ÃL5œ”[y>P•Xk9(¶ò|4ÃYÉE·“ᥠQE†³’‹o'ÃL5œ”[y>P•Xk9(¶ò|4ÃYÉE·“ᥠQE†³’‹o'ÃL5œ”[y>P•Xk9(¶ò|4ÃYÉE·“ᥠQE†³’‹o'ÃL5œ”[y>P•Xk9(¶ò|4ÃYÉE·“ᥠQE†³’‹o'ÃL5œ”[y>P•Xk9(¶ò|4ÃYÉE·“ᥠQE†³’‹o'ÃL5œ”[y>P•Xk9(¶ò|4ÃYÉE·“ᥠQE†³’‹o'ÃL5œ”[y>P•Xk9(¶ò|4ÃYÉE·“ᥠQE†³’‹o'ÃL5œ”[y>P•Xk9(¶ò|4ÃYÉE·“ᥠQE†³’‹o'ÃL5œ”[y>P•Xk9(¶ò|4ÃYÉE·“ᥠQE†³’‹o'ÃL5œ”[y>P•Xk9(¶ò|4ÃYÉE·“ᥠQE†³’‹o'ÃL5œ”[y>PS|š¯Íu¨Ë¢6—áp®`ñE&uÑÉ1’èœâÀÆñ<“âTÙcôFÒü/îØÐÔxA÷ì…ÇꦂœÊV2V6L9ç—à‘u÷_û®Ê>ã=¹i~o¢ü¬>í¨3•‚zL¢uUy´›Nú˜YIUMR5Ø"’,]ó!xÅ›uÂFœMÃ{=Ôå5du§jGe2[:µX^*®¾ aؘ[sZ]€!Î:ÚKEçÊÓewA+¸.Ôª«„Ç,­¤ŽY".»¼{ãiÀç "ç9·Œ ¸÷¢îyé,ª—Ô™²k(Ú†È×Äij3c8{šËð±Îuîh8¯¾7Ñê< ´nÏeÒYTϬÄ÷OŸ´d´²RpÓµ_8´w¥Ün!udµ¹=¼ûNªë¨3:“FµôÐÈZæv¢ûïÄu¸@ ë+hi+m¶ZFÈÊhNs­§¦©…Ò=â‡cc6ŒÎªž[ðI£¾IŒðӵ޾÷9òB×€Ü=ñ¸7I b,òÚK vœ”¶žÚxOA3››c$­ êpÃ4ƒ]÷â×}ÂॳDŒäþS9Îs]Ÿ|UN¤‹³9âàà.{ü§^jy*¦„½ôÌÎÂY²Þ@-‡á\.ipÔ úõ{ÃYÉE·“áªz[J*(ÌTÖ»Z°Æ,ùp0††µ¼Mh …ÃŒÝy*n˜íßWI¹JXk9(¶ò|4ÃYÉE·“áªÞ˜íßWI¹8uþc·}]&åhYa¬ä¢ÛÉðÓ g%ÞO†«xuþc·}]&äá×ùŽÝõt›’…–ÎJ-¼Ÿ 0ÖrQmäøj·‡_æ;wÕÒnN˜íßWI¹(Ya¬ä¢ÛÉðÓ g%ÞO†«xuþc·}]&äá×ùŽÝõt›’…–ÎJ-¼Ÿ 0ÖrQmäøj·‡_æ;wÕÒnN˜íßWI¹(Ya¬ä¢ÛÉðÓ g%ÞO†«xuþc·}]&äá×ùŽÝõt›’…–ÎJ-¼Ÿ 0ÖrQmäøj·‡_æ;wÕÒnN˜íßWI¹(Ya¬ä¢ÛÉðÓ g%ÞO†«xuþc·}]&äá×ùŽÝõt›’…–ÎJ-¼Ÿ 0ÖrQmäøj·‡_æ;wÕÒnN˜íßWI¹(Ya¬ä¢ÛÉðÓ g%ÞO†«xuþc·}]&äá×ùŽÝõt›’…–ÎJ-¼Ÿ 0ÖrQmäøj·‡_æ;wÕÒnN˜íßWI¹(Ya¬ä¢ÛÉðÓ g%ÞO†«xuþc·}]&äá×ùŽÝõt›’…–ÎJ-¼Ÿ 0ÖrQmäøj·‡_æ;wÕÒnN˜íßWI¹(Ya¬ä¢ÛÉðÓ g%ÞO†«xuþc·}]&äá×ùŽÝõt›’…–ÎJ-¼Ÿ 0ÖrQmäøj·‡_æ;wÕÒnN˜íßWI¹(Ya¬ä¢ÛÉðÓ g%ÞO†«xuþc·}]&äá×ùŽÝõt›’…–ÎJ-¼Ÿ 0ÖrQmäøj·‡_æ;wÕÒnN˜íßWI¹(Ya¬ä¢ÛÉðÓ g%ÞO†«xuþc·}]&äá×ùŽÝõt›’…–ÎJ-¼Ÿ 0ÖrQmäøj·‡_æ;wÕÒnW®hn&–’Ðì'Œ^/»ÿuP½ïd™ÀÀèå1œ.½k¯¼€k“ĤQS|š¯Íu•AꦂœÊV2V6L9ç—à‘u÷_û©ÔT¿7Ñ~VvÔbz¦VåMS#¶1ÑK|±×–ÒÒ]KÁ|9щ­q/p¾ðn¹ÜJú|«’<¥}— —S<0Ï<ÓÇ®-{Ú×0ÆcÂ$ºF»ÓpÅî¶k3?kÙfÊ´jÍ`®m,HYiïocÕwÉ'ZŠSC=¢+¤ÉÜ 3bkÜÑG8ïmØ^èÇxç ›sˆ$amǽQé™MY 6Êc+%«4°E-V‡>BÙHis7½§e®s]ˆxnXßgÛ5‚çÙTN©‘‚mO{QØ“ŠœÜë¯!À–Ž%¤²›âfMe`¹®k㥨kâÂkcx8£hp a î\ã|uVu‹YJ)ª2VÝ|&3Ù¡Ô è$›ä¸þ±ÁÎsƒyqp!Ä”¡ÛRWÖJ)é,ÊgTÉ=[blÕŽc Tòˆœç8FHqs…Í‹¯8¯Ô¼¯˜ÛÂÏe‹XXÉ"†¡Ù¹øŸ#Xî61Ñah‘¸‰”sˆæâñ4v|ж>粎,K+_OOS €Èòù6ì.q¼¶û¯V¡pEf6ª)Ù“6ìy¬aŽŠvBK &!s憶âZHÀÛz.PùjÚUÙU3$k壆 =­c*_l“՘﹣¿1¤ÞxšZÒ9WäÞXÔËGcP›>²²êjHªª°L÷çd†7â¼FXZ..‘®ùFã«ÅDÔuU¨›'-×K&c´ …ù™ ‘ñr<“öñÂ傒ʦ}1‡&²§lmdB–£6s`9Ì¿ ÜÐÖÜçá…ºûÑr…½•kVZO”>Ïe8ŠsÕ¹‚ânspÞ$-ù¯kš÷…fEUç£ÃâÅ3Á»íº3ýVrˆÐÙïÇI“¹AQÏp85€(Úì1ü†“xëV:ÿ1Û¾®“rP²ÃYÉE·“á¦ÎJ-¼Ÿ VðëüÇnúºMÉïó»êé7% ,5œ”[y>a¬ä¢ÛÉðÕo¿Ìv﫤ܜ:ÿ1Û¾®“rP²ÃYÉE·“á¦ÎJ-¼Ÿ VðëüÇnúºMÉïó»êé7% ,5œ”[y>a¬ä¢ÛÉðÕo¿Ìv﫤ܜ:ÿ1Û¾®“rP²ÃYÉE·“á¦ÎJ-¼Ÿ VðëüÇnúºMÉïó»êé7% ,5œ”[y>a¬ä¢ÛÉðÕo¿Ìv﫤ܜ:ÿ1Û¾®“rP²ÃYÉE·“á¦ÎJ-¼Ÿ VðëüÇnúºMÉïó»êé7% ,5œ”[y>a¬ä¢ÛÉðÕo¿Ìv﫤ܜ:ÿ1Û¾®“rP²ÃYÉE·“á¦ÎJ-¼Ÿ VðëüÇnúºMÉïó»êé7% ,5œ”[y>a¬ä¢ÛÉðÕo¿Ìv﫤ܜ:ÿ1Û¾®“rP²ÃYÉE·“á¦ÎJ-¼Ÿ VðëüÇnúºMÉïó»êé7% ,5œ”[y>a¬ä¢ÛÉðÕo¿Ìv﫤ܜ:ÿ1Û¾®“rP²ÃYÉE·“á¦ÎJ-¼Ÿ VðëüÇnúºMÉïó»êé7% ,5œ”[y>a¬ä¢ÛÉðÕo¿Ìv﫤ܜ:ÿ1Û¾®“rP²ÃYÉE·“á¦ÎJ-¼Ÿ VðëüÇnúºMÉïó»êé7% ,5œ”[y>a¬ä¢ÛÉðÕo¿Ìv﫤ܜ:ÿ1Û¾®“rP²ÃYÉE·“á¦ÎJ-¼Ÿ VðëüÇnúºMÉïó»êé7% ,5œ”[y>a¬ä¢ÛÉðÕo¿Ìv﫤ܮ \ÐÜM-%¡ØO¼_wþê¡{ÞÉ3ÑÊc8\z×_yþ×'‰SåÑKð¿¸Vôß&«óGÝDª2Çè¥ø_Ü'±¡¨ðƒî3Ù –—æú/ÊÃîÚºª< ûŒöBå¥ù¾‹ò°û¶ ñ’ßK²‹ð©?¤‹`±ù-ô»(¿ “úH¶ p‚" """ """ """ """ """ """ """ """ """ """ ,åG„qžÈZ5œ¨ðƒî3Ù Hå¦ù5_š>ê%*Š›äÕ~hû¨”«*(©~o¢ü¬>íªU/Íô_•‡Ýµ™iCcZ¹ajT6GAEEDŒâÖ2W _på â{vÚ£ôÕV-#m Ê ޼ºç7$‡™ öØŸÿL‹Üˉ½Ø+òvj²›)éê"Žh%§¥d‘ÈÐæ½¥²‚:ˆ#UÊàdŽ)ߎ­ï{Úý&JéßPÒÐ@Ã9y‘ <\×sÞ?m×îV̺Åf[ÕFκKÏ}T±‰ïHÉ*c{ì?'+®qàKA*ûs.­2zÕ«ŠÎÐÚ8F’Š«>Ùj)™;ƒóxnÍ‘µ“~.÷o~t™“µôb’¦ÏÎ@bt23= 4’ëå¹ß­psœðçÞà÷9à‡WcòrÈ–ž:yhc–ê'©ÈKšd˜H$$sƒ„ÒŒ&ñßqjËZ¦å² ‡<¹™a¦¬–™³Ê"–F1Ç „9³D%Ï|n¸8àù!Ý ÊšÉ2ÎÊfA¥W蹪CVp7H•Œf)3wê4›˜xˆñ«’öH¬†¨Ã;¤‹¹õr¹’9€I# °É ÂÛžðçw7ÞÑt‘äõ™=`“D¦e3!„Ï!k;Ãâ¸q‡yãuÀ:ðAOheuuÖ„,±£sਧ§…²ÖfËŒÓ2&ºA€–±ÅåÍs3€ˆÞí,Veµ]iÖ½ÑÙ‘ðX¨ž™µ"¦ùCâ{£q|E Fà ^ã­„´^ì2;%¬gÕIPê;ä’VMá_…l­–ö6û™ŠF5îÂ74b(r^É5“Ugl’ã72®V²7<ù#`vä8{ØîýÆûÜo ù²¦² b¶'Y2ŽÐ§³ä¨gí¨ã=´k9QáÜg²‘ËMòj¿4}ÔJU7ɪüÑ÷Q)VTQRüßEùX}ÛTª*_›è¿+»j-ô»(¿ “úH¶ ’ßK²‹ð©?¤‹`·""" """ """ """ """ """ """ """ """ """ ""ÎTxA÷ì…£YÊ>ã=¤ŽZo“Uù£î¢UcôFÒü/î½7ɪüÑ÷Q*Œ±ú#i~÷ >Õ¡¨ðƒî3Ù –—æú/ÊÃîÚºª< ûŒöBå¥ù¾‹ò°û¶ ñ’ßK²‹ð©?¤‹`±ù-ô»(¿ “úH¶ p‚" """ """ """ """ """ """ """ """ """ """ ,åG„qžÈZ5œ¨ðƒî3Ù Hå¦ù5_š>ê%*Š›äÕ~hû¨”«*(©~o¢ü¬>íªU/Íô_•‡ÝµŒ–ú]”_…Iý$[Éo¥ÙEøTŸÒE°[„g*< ûŒöBѬåG„qžÈRG-7ɪüÑ÷Q*Œ±ú#i~÷ Þ›äÕ~hû¨•FXý´¿ û…ŸjÐÔxA÷ì…ËKó}åa÷m]U}Æ{!rÒüßEùX}ÛPxÉo¥ÙEøTŸÒE°Xüš9¬©Ê dï#|t­kݨ8€ûÀ<¢ñüBÕé0sñõÂÔ"TQi0sñõÂi0sñõ¢TQi0sñõÂi0sñõ QE¤ÁÏÇ× ¤ÁÏÇ×%E“?\&“?\ •ZLü}pšLü}p‚TQi0sñõÂi0sñõ QE¤ÁÏÇ× ¤ÁÏÇ×%E“?\&“?\ •ZLü}pšLü}p‚TQi0sñõÂi0sñõ QE¤ÁÏÇ× ¤ÁÏÇ×%E“?\&“?\ •ZLü}pšLü}p‚TQi0sñõÂi0sñõ QE¤ÁÏÇ× ¤ÁÏÇ×%E“?\&“?\ •ZLü}pšLü}p‚TQi0sñõÂi0sñõ QE¤ÁÏÇ× ¤ÁÏÇ×%E“?\&“?\ •ZLü}pšLü}p‚Uœ¨ðƒî3Ù ûIƒŸ® G„qžÈY‘ËMòj¿4}ÔJU7ɪüÑ÷Q)TQEKó}åa÷mR¨©~o¢ü¬>í¨¸M&~>¸A*(´˜9øúá4˜9øúᨢÒ`çãë„Ò`çãë„¢‹IƒŸ®IƒŸ®JŠ-&~>¸M&~>¸A*(´˜9øúá4˜9øúᨢÒ`çãë„Ò`çãë„¢‹IƒŸ®IƒŸ®JŠ-&~>¸M&~>¸A*(´˜9øúá4˜9øúᨢÒ`çãë„Ò`çãë„¢‹IƒŸ®IƒŸ®JŠ-&~>¸M&~>¸A*(´˜9øúá4˜9øúᨢÒ`çãë„Ò`çãë„¢‹IƒŸ®IƒŸ®JŠ-&~>¸M&~>¸A*ÎTxA÷ì…}¤ÁÏÇ× †£Â¸Ïd,Èå¦ù5_š>ê%Q–?Dm/Âþá[Ó|š¯Íu¨Ë¢6—áp§µhj< ûŒöBå¥ù¾‹ò°û¶®ª>ã=¹i~o¢ü¬>í¨;cÒDmÁ)c°3¡¾>K׬U}#ùãzŠ_Ü>Ó”H:±Uôç銯¤ٲ㪩¥}¥FÚŠXŒÓÄgh|Q€ s…÷µ·o:µ„£¶l»BFGEiQÔ½ñ™˜ØgkË£Â\:ÛˆâäøªúGóÆôÅWÒ?ž7ªŠKfË´#d”V•K!…ކv¼9ḋA[°‚nã¸^’Û6\A¶•o¨‘ÐÂ×ÎÐe‘®Âæ´_­ÁÚˆÁÔ‚ß_HþxÞ—Õôçë•)í#Wvž­òGÌÄ×›‰k‹MܺÁ×ÄWC$ªÙßp¸énþ§ìY¼‘ú7âÏïž´-ÿK'ßoôr qUôç銯¤áöœ‚\U}#ùãzb«éÏ×*âµ­ ³Í@‹:÷I1°»2I#ceæãsq8^n$ ȉ¾*¾‘üñ½/ªéÏÖi¶½£OYCKhÙÂúºœËd§ªÎÆjY/¼±®Ä3W„ žqÖS-û[:[F;^ô1;•-©aŽÕ¨ºû´r »ÅWÒ?ž7¦*¾‘üñ½UÃiÐTÏWSK4 –FÉZç:"n¶“û\KŠÕÊ: 6’Ô1ÔÓTWYÔ’UIDÙÚ$ÂÖâÖ5–ƒx×wíU}#ùãzb«éÏÕE•hp•¬Þ ™àÊûóR¾;ø‡ îñ_vµÚƒÔ•”Ž«9÷ÆéZÆËˆáMÇV·>?ûñÎsÜ\ç8øÉ½Q?éÔ?ñ’{Ö+ÄS|š¯Íu•EMòj¿4}ÔJT/Íô_•‡ÝµJ¢¥ù¾‹ò°û¶ ã~SÁOU=bÕ•ôÏ ”RYõ31Ž-»l-¿ šn¿ÆÕ7£å©«~ŠÅÿ[”?ò£ÿ“¥VÈ+»ªoGÊSVü$(}M[𕊫·­È,UN1Huä\Ð äv ~Ll‘÷xð\5ƒßuMèùCêjß„Õ7£å©«~‡(òŽƒ&쪊ººšfLØ$– ygln¨s~߯I¸jŒ%VQÐSÛ´6KÐ]â«éÏÓ_HþxÞ²–6VÒÚn³"”CE£M¤C'ºè¡‘Ìv Cîšð7µ¸µ_rРêÅWÒ?ž7¦*¾‘üñ½r¢uu¯¢‰²TV`kälMýuä¹Ä4¿ŒÿuëIŸŸ“®V{)¼™ÿ'Mí…x‚]&~~N¹M&~~N¹Q" t™ùù:åHVæ‡gܵŒSýJæRËààû‡Úr qUôç銯¤ê%Q–?Dm/Âþá= G„qžÈ\´¿7Ñ~VvÕÕQáÜg²-/Íô_•‡ÝµT¾¸}§(•m}5³SP -«4 nÆhñžRK‹õë'Ä<_½rðvPý`ƒÕã¶‚ñdêòZЩe¡TÛQñÕOV+#¤n ÒD[˜ÆLf@.Ša®ã»QV”?X õxí§eÖ=^;h)m,“µ- sd㣎Ï55³éy×ÌGP.Í`»½uG=a·ê¾áqfÒÛ"ߪ´k©h!mDSà‚­ò–¶33‹µÄÛÉ24]Éy¿P×eÖ=^;iÁÙCõ‚WŽÚ XTë´ˆaõl'7)}Ï7ân¶Žôj¹Üfó¨]®uGÁÙCõ‚WŽÚpvPý`ƒÕã¶‚ñQ¿éÔ?ñ’{Ö'eÖ=^;kÝ ] °-ëJ:§Šw@Ö²›7p.k¯ùGÉÿÝõ7ú¨~ûª‰ ¤`Å ˜ÙF¶·Añ^²ð¨ø;(~°AêñÛAx²qdtPBja¥ Ž×6£ªÍk#CªÌŽnp7æ"XG¼‹îV”?X õxí§eÖ=^;h3õÙYS§NÌË„Úl°O-}C€’¡²€3;³ÄŒD€N]{{mœ‘ªµ¡“ QVVÉ6=ns#}žixµ^àó}×ÝwŽýJσ²‡ë¯´àì¡úÁ«ÇmQÇ=‡jWÉ]iNÚ:[PÅ£dSºV1ðºGµÎ±® ~uÌsCoÁˆ_ß\8m ‡säÒÿ˜§š‰”Sëç€êt…ÒÈØny•ÅÁÅ—u÷䋮ʬz¼vÓƒ²‡ë¯´ˆ¨ø;(~°AêñÛNʬz¼vÔ ‘ú7âÏïž´-ÿK'ßoôr«±¬çY6\tn˜Læ9î/  s˸¯7qò©-í lTÑRwØžçÓçK®€ï€g—ÅÅã´T|”?X õxí§eÖ=^;h<åE-±œ#¢ ®m-^~JZçÇ#sR3õ‚ð~O‰Fë>ÔŠK2º’‚ÍŽ¢’šjCB*œÈYݲ¯Ô"hÀøëïuÍÁÙCõ‚WŽÚpvPý`ƒÕã¶‚—'rNÔ°OSŽŽyâ¦0f³®kOùjV_‹>–ë®ù/ÅÆ0~*¬õÙ˜sY˱gN,Þ ñ]‡åcÕ†û®×}ýêªàì¡úÁ«Çm8;(~°AêñÛAxŠƒ²‡ë¯´àì¡úÁ«Çm)¼™ÿ'Mí…x³òØvµ\´ÚmµÑCQøE€’Çuøõq-"( Y|pûNQ*Úúkf¦ [V hÜ-ŒÑã<¤—ëÖOˆx¿z¢ÉW[tÚ6ff0MðÔ0<×:)[ i"û,ºû×ßqºãÉÁÙCõ‚WŽÚpvPý`ƒÕã¶‚¾Ú°­œ¦¡e=q ¡ht­Ãœµ¯¦ž"ìE¬Äo•½íÂàÒqÀÇ“6£ ¨š6²åtM’lUHéã`’æš— q€é1Æ~Áó†Ûƒ²‡ë¯´àì¡úÁ«ÇmQÇ’Y;[bOU-[¡ý|A¡Œó"¦[‹Þw{;#¬oûjíü¶­‰êz‡iX*%¯˜ ¤‚hØÍ4ÆÌ9Æ‚ðo!„ñ¸… àì¡úÁ«Çm8;(~°AêñÛPuشٴÁ3˜ç:®¦pXIdò4kw<_öÞ¬UeÖ=^;iÁÙCõ‚WŽÚþCÿ'½b¼TÔ6=t6À´k­(êž)ÝZÊlÝÀ¹®¿å'ÿur‚*o“Uù£î¢R¨©¾MW溉J€¢¥ù¾‹ò°û¶©TT¿7Ñ~VvÔÖ/úÜ¡ÿ•ü*¶Y+G%íéíZÚ›7*5TÂsN(±–¿5dâ ï·Å©r÷'•¿^ Šƒn©- ®Ð·#­e¥5 )éŒP¾”Fdq{€~*3ä­³‰YgQh ›/‚C§ñæ¢ŒÌØŸª7cqd£ï@sM׃«¸X¶Í=m# Š‚ZZ;BªÐd¯©{#¥lä0°FC@t÷bÄu6û¯7>äò·ëÁôñS¹<­úð}üUFÒ3)|¢F1­º2×’\Û†².ïkÔ¿]ÃÚÄw'•¿^ ŠÉåo׃èâ¨6ëÿ\ÓÿÄ?Û…;“Ê߯ÐÅ]VHÚ6fR:Ú´­ÆÚ2šWS)sFâæ:òqºû°]ÅãA²¦ÿUßoõQ!tŒ¡s(ÖÂöâh>+À"ñö^eÖ=^;h/N,ŽŠML4´ÚæÔuY­d`HbuY‘ÍÎâ¼ÄKâ7‘}Êò‡ë¯´àì¡úÁ«Çm~»!ë*c´éÙ™p›M– 寨pT6PcÁÇvx‚ñˆ  ¯om³’5V±´#ÒaŠ*ÊÙ&Ç­Îdo³Í/«Üoºû®ñß©YðvPý`ƒÕã¶œ”?X õxíª8ç°íJù+­)ÛGKj lŠwJÆ>Hö¹Ò5Á¯Î¹Žhmø1 ûë‡ ¡î|‚:_óóQ2Šc=|ðNºY ¡Ï2¸¸8²ò¾ü‘uÁÙCõ‚WŽÚpvPý`ƒÕã¶‚ñeÖ=^;iÁÙCõ‚WŽÚ’?FàüYýóÖ…¿édûíþŽUv5œë&ËŽÓ œÇ=Åá˜A.ywæî>U%¡£4 Š‚º*NûÜú|éuÃPðŒòø¸¼aÖŠƒ²‡ë¯´àì¡úÁ«Çmœ¨±¥¶"³„tTÍ¥«ÏÉK\âØänjFqà~°^Éñ(ÝgÚ‘IfWRPY±ÔRSMHhES™ #{£ ¶Aú„Mpß};(~°AêñÛNʬz¼vÐRäîIÚ–éêqÑÏê%Q–?Dm/Âþá= G„qžÈ\Œ¤c#dm«­ c1E¨p.º>ã=¸[hQ=íc+)Ü瀂Iþ($чK­ëEðÓF.·­ÃYúܤ¯¤–Ù–e4–uëª%5ŽlÎh…“8²<Ù†¾à Åäq…q ©JöÈ%«£kÙ&6:€ë¯•Ѳþ+œç4¶ï(‚nAÑ£—[֋ᦌ:]oZ/†¸émû¹ð²’× ¨tÎs"l5,y‘ÍÎ ¸ë H@„6ýŒÖU½Ö½mƒ*œjYt'×Þ›Áµ ìчK­ëEðÓF.·­Ã\sÛtX6Ü3²®†$œÉJöÈÖ\A¸žôŽ>5ÅO”±>¶(g}…Ô’Õ>¦ Á$qµÇ-mÀ‰ïÉ wí\çF.·­ÃMtºÞ´_ s²Ù²ä¥¦ªe¥Fêz©4ò‰ÚY,„Ó}Îuà‹†½EM¦Òf³ºT9¬np]‰¤‡6þPAxˆ(=hÃ¥Öõ¢øi£—[֋ᨸJƒ¦Óm[½8Jƒ¦Óm[½º0éu½h¾hÃ¥Öõ¢øj. é´ÛVïN é´ÛVïA.Œ:]oZ/†š0éu½h¾‹„¨:m6Õ»Ó„¨:m6Õ»ÐK£—[֋ᦌ:]oZ/†¢á*›Mµnôá*›MµnôèÃ¥Öõ¢øi£—[֋ᨸJƒ¦Óm[½8Jƒ¦Óm[½º0éu½h¾hÃ¥Öõ¢øj. é´ÛVïN é´ÛVïA.Œ:]oZ/†š0éu½h¾‹„¨:m6Õ»Ó„¨:m6Õ»ÐK£—[֋ᦌ:]oZ/†¢á*›Mµnôá*›MµnôèÃ¥Öõ¢øi£—[֋ᨸJƒ¦Óm[½8Jƒ¦Óm[½º0éu½h¾hÃ¥Öõ¢øj. é´ÛVïN é´ÛVïA.Œ:]oZ/†š0éu½h¾‹„¨:m6Õ»Ó„¨:m6Õ»ÐK£—[֋ᦌ:]oZ/†¢á*›Mµnôá*›MµnôèÃ¥Öõ¢øi£—[֋ᨸJƒ¦Óm[½8Jƒ¦Óm[½º0éu½h¾hÃ¥Öõ¢øj. é´ÛVïN é´ÛVïA.Œ:]oZ/†š0éu½h¾‹„¨:m6Õ»Ó„¨:m6Õ»ÐK£—[֋ᦌ:]oZ/†¢á*›Mµnôá*›MµnôèÃ¥Öõ¢øi£—[֋ᨸJƒ¦Óm[½8Jƒ¦Óm[½º0éu½h¾hÃ¥Öõ¢øj. é´ÛVïN é´ÛVïA.Œ:]oZ/†š0éu½h¾‹„¨:m6Õ»Ó„¨:m6Õ»ÐtG!Ìc¥yt†G:W4’KZß@âh^—ˆ¦ŠxóÈÉ~Lp"þKÇïÅ{@P²‘Œ‘¶®´5Œ hÅ Àx>@¦\Í´(žö±•”îsÀ A$ÿhÃ¥Öõ¢øi£—[Ö‹áª+G(ê¨ÝjOŸ ´Múd©,—TM•Ù¶îñíº÷6÷^5 fJŒ¬ §µBç1®†¯Fªt²µ‚èΨöÜÂÛÍÚüas£—[֋ᦌ:]oZ/†¹ä¶l¸´<å¥FÍ6ííE÷]ƒ_}~&ñ_Æ9TuVÝ5•hÚ,•0ÙÍ”Ô6í{šèÛ‰ÌãÔàEÏKèö®¶ÒlU޳è)éå–Ðmµ!ˆ:WÊÜvræ‘›o׌j=R)gÈzÉ'«s³3²·=­5õ26:¢yA,ŽìõížâÇ„€îø‘u-ƒTü¶,q$:EnŸ›q'ÏÉ+™yºýAâýGÇuêÒLÈ8tíLð…Ú+ZA¤ßuÙ¿Öw÷âoÿ(r¨ìüšÉZª Úªº)(…DñT m)†i±½×=ä¼aŒ2Aì¼ȸ• Ý­‘µ¶±]XÙálSJf¢WÆòF„ZÒæ‹Ùy¤xÄÛËq4€N¡ ÉZæÒ Ô ¨šwºq5Lõ$1Íc$—™š[ÎŒµ€‚ÛœÇFl* ýÒVÙ­–¢‘¶}}=D±Z¶¤Dø›®Î\âsŽâ:°GÅq&KdL6¤6\¯–„ÌÇ#­ID¯n½mfrò;×kÄy‡M<µ isÀ‰øœnBomç ¾á¬‹‰#ªóuæm&~~N¹T–¥‘vE™ £Ro¥›4èäe§%ÎòGt 0ea.âý¢õ§ad}kSR×ÓèÔ²ÒORú¹íI£dy¹!`i½÷wÆq®ñÅv»õJzLüüršLüür¨$³ÿG´ÕV•=tÑÐ¾Ï¨ŽžcWjÉ.|M•„_/i _u廊õ$ÖGŠê j:}3I´$³æt6¤ÎÑäd2Jàà{á›´ÜF+þ¡w¤ÏÏÉ×)¤ÏÏÉ×+Çp7ЧôÙûiÜMô)ý6~ÚP÷¤ÏÏÉ×)¤ÏÏÉ×+Çp7ЧôÙûiÜMô)ý6~ÚP÷¤ÏÏÉ×)¤ÏÏÉ×+Çp7ЧôÙûiÜMô)ý6~ÚP÷¤ÏÏÉ×)¤ÏÏÉ×+Çp7ЧôÙûiÜMô)ý6~ÚP÷¤ÏÏÉ×)¤ÏÏÉ×+Çp7ЧôÙûiÜMô)ý6~ÚP÷¤ÏÏÉ×)¤ÏÏÉ×+Çp7ЧôÙûiÜMô)ý6~ÚP÷¤ÏÏÉ×)¤ÏÏÉ×+Çp7ЧôÙûiÜMô)ý6~ÚP÷¤ÏÏÉ×)¤ÏÏÉ×+Çp7ЧôÙûiÜMô)ý6~ÚP÷¤ÏÏÉ×)¤ÏÏÉ×+Çp7ЧôÙûiÜMô)ý6~ÚP÷¤ÏÏÉ×)¤ÏÏÉ×+Çp7ЧôÙûiÜMô)ý6~ÚP÷¤ÏÏÉ×)¤ÏÏÉ×+Çp7ЧôÙûiÜMô)ý6~ÚP÷¤ÏÏÉ×)¤ÏÏÉ×+Çp7ЧôÙûiÜMô)ý6~ÚP÷¤ÏÏÉ×)¤ÏÏÉ×+Çp7ЧôÙûiÜMô)ý6~ÚP÷¤ÏÏÉ×)¤ÏÏÉ×+Çp7ЧôÙûiÜMô)ý6~ÚP÷¤ÏÏÉ×)¤ÏÏÉ×+Çp7ЧôÙûiÜMô)ý6~ÚP÷¤ÏÏÉ×)¤ÏÏÉ×+Çp7ЧôÙûiÜMô)ý6~ÚP÷¤ÏÏÉ×)¤ÏÏÉ×+Çp7ЧôÙûiÜMô)ý6~ÚP÷¤ÏÏÉ×)¤ÏÏÉ×+Çp7ЧôÙûkÔ­kƱ¡­llpIŠW<.sô§9ÅÄÕdßÿJ%O–?Dm/Âþá[Ó|š¯Íu¨Ë¢6—áp§±¡¨ðƒî3Ù –—æú/ÊÃîÚºª< ûŒöBå¥ù¾‹ò°û¶ ñ’ßK²‹ð©?¤‹`±ù-ô»(¿ “úH¶ p‚" """ """ """ """ """ """ """ """ """ """ ,åG„qžÈZ5œ¨ðƒî3Ù Hå¦ù5_š>ê%*Š›äÕ~hû¨”«*(©~o¢ü¬>íªU/Íô_•‡Ýµe™Ãu¹kdç³:uŸ 6w,㕸®¼_u÷Ýx]Ø9IW”c(f¥²¢ª¦ÑôzFWHöK•lv) ³U]âæ:üj¾ñ™iCcZ¹ajT6GAEEDŒâÖ2W _påÜ ·©2Æ®Š®‚“Lª§£ŠŽ’;Eî§:dŽ{žb„¶51×–°_v¶î%K[sëVU_ Døëc«{Ìtøª*&77ëÛþiÍÂLX„cXÇÞÚZö¥-mlöETtì­§h©a‘Ñ—ËÛ‡ š/a’#$o”^ö†ÄZ;ÅÏI•Õ֜ςα£žzFWÆúÌ4ЖÀK.â§–ìf!v ȼᒚ×}»I[6vªŠWTÀéäwëâ¨{Ý Fâ;üp5 9Ç4o|Ö £²2[)l[möµ=%›3ä}H4õÍD¥­‘”<ø\÷›é¨ps@:®]vEZV],SÒOgéRÖ9îd­u+)Û±a!ÁÚ+{ã »8u=õ†Nå¡·-FY²Y²RÔ5•|YƆ:-€ÖÉAmKMîkn-7qÍÑe}»lÔYµÔô¸¡žÕ€SÒ¶¨3½–É3:9|m{ÃñwÎ:îeíh!ØÜŠ·ŒV<žÍÌX”L¥¥ {ñT:)éecÞpÜÀñM„´fï¼/¸j%±æ¬Ê«.ت‚’ê zȘ1¹®‘ñ`{Ih¸˜ãxw&< ¸^U;òîm²¢*72ʧ’¢Ôª-1µ’Í„áΜTÓ‹7xÁň†Ék[••ߣ¬«´cB’–+Fi!œ—þ£9’ü-ÀìL$}ÚµßÄy;‘V•ŒÛ9g¤‘”uõS9uø™g71£±‰¬pq"ðç †‰ddU¥gÚ99Q,ôŽe™EEO0cÝ{ =dN-ïu‚ê–}Úƒ¸®ôTåE®rŠÈ²´èêe­‰ÓBú€ðêY ªpÄàÆVºÄµ·¶ö´ q";//k+  ¨«±à‚˜¨ª$ÍV™uÍÁp1·±‡c€Ö€Ay8@nQä\óUd.OTTK$ÓËfS>I$qsžãI$d“®õx€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€³•}Æ{!hÖr£Â¸Ïd)#–›äÕ~hû¨•FXý´¿ û…oMòj¿4}ÔJ£,~ˆÚ_…ýÂϵhj< ûŒöBå¥ù¾‹ò°û¶®ª>ã=¹i~o¢ü¬>í¨ê%*ÊŠ*_›è¿+»j•EKó}åa÷mANÁ VSe==DQÍ´ô¬’9×´¶PAQj¹vC“8mÚ&šé+ÄTóK$¶…Sæ—ÌØ‹%sË™ÿ\wŽœàu;]=é¹kÁ9ð|:ÉðÙ¹p|®÷å]Ç«•U¶·(*ê("Êqa½”l¯’V×ékEaº2ÿ×$u9"> ãz^·ÜI’¬…ޤ26`{YQ+ECK‹ˆžç~¼9ä‰1^^òoÆëä’†ÆÊVéoHÍgèÛ sØX[+D˜xˆp’ñ¬Ò8Ö>ÆÎî3šwèYìæ-"|ë»ÜYýW{~,ZóªÒÙ‚Ò²æ´ilèªÍ {â­s©ZìP4m¬cpÜZ_ŒŒ ¾G<ÎàqaAhÌŠ°[£u,òã”Ë+笚WÊ\Ö1Í{ÜòçÆæÇ1¸– ¼‚ŽŠËÉz#é™;,7ÆÙù^Æ@èé°µÎÄp’ ˜ó}ã'¼pt•ôReTÔsÕå[¬†KW™…’ZFv¸Cg‘‰­ývd”Œ]頻+Š* v¯#2¶Ì´i'6í§HuÃY,ÜMîx±|¤¬…×ji¸5¹/“±Á-MT9Švgf©q«’(äkžù^&Á²G‰ò/½ =Âà ²Lž³% ¨ th•,©dЉä x¨y|·€î2ân$Í4ÅÐû£8ª%»”]‚ðn8¤Ê‹Z§ËiQ‰ä¨ÍB 4 c4Ô2jwãØÜ,vwCš\Ù|jz,¤É Å=ŸC<Až†*jk¡²B?U$£6ر1§; Ž  sxÊ’§*æî{+­J3I;,–=ôOmîdÍqNÒâ| ¤:Á®ýêŽÉ°rÅÙGÃR>†Š¢§J|®ž`s(£c L¨78èÏuâG‹†»‹®ù ¡dݱ`RÚ7PÚ†˜:X1IÔ°Ó1ׇë„Nq Ë…Øp÷ÁÙ&ZÙŽª³a£2U ÚÖÒ2)k]¯d­o|N1$áŠæ•%ZØ6–Œiª§ÃS€Äéh扤>ìÛ‰{k^N8ÜàZÒH!+rgJʈ­ÖÖ`š7‹V*Zëõ‹ñ2©àqasZ{á{M}.BèÔ4”Ü#‹G¤²©±f.Å¡LeÅv-XïºïÙãï¸^dÕ¥5³’¶E©PØÛ=m560CCžÀâ$›¯<¥Z*û ÌàLž³,œö{A¤Š›;‡< Åuæëî¾ëʰ@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDœ¨ðƒî3Ù F³•}Æ{!I´ß&«óGÝDª2Çè¥ø_Ü+zo“Uù£î¢UcôFÒü/î}«CQáÜg²-/Íô_•‡ÝµuTxA÷ì…ËKó}åa÷mAã%¾—eáRIÁcò[évQ~'ô‘láD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@YÊ>ã=´k9QáÜg²‘ËMòj¿4}ÔJU7ɪüÑ÷Q)VTQRüßEùX}ÛTª*_›è¿+»j Ê;O+rÖÖÌç´>œÖ,8ðG+°ßqºû®¾â¤¶¥·›ldýµ¶5M ÛL>'Çáµô•m½ðãy aqiÈ-ï0â=™-ô»(¿ “úH´6fETU $qÊgc §da²–€§’Ûøî7q-Â1v–]ÚôöLµtTqÕOe²¦KR(àLpÍ,AáÏ™†0óO)¸ ‹|`Ü1ÉW–öÅ—gT[”´3P¶®Ñ¥†žöÈíT½¯sÉ ^)‹ CN³ì enMX6“#e}‰fÕ27Èö6zV<5Ïv'‘xÔ\ídøÎ²£€PZ.´h©`Ñf³ªÞÁ3!Žø§’!#¥ŽðF"* ädºðAÖ{O)²¦É¶bà¡´«§Ñ´i)(Œx3ª{¯ŽJ€p¥çò‰×vÇA”½FUaÒRZ–=- %ÓÇ ¢}¤ç8²9.$ˆÀ$ï î.v~’ÆÈ Ç£®¦4pVG]› ž’²F°’ÀcŠ6Fn.q¼·½d€Ð,+lüŸŽ*k6²Î¡0×`¢Šô­s$5ò²2.» C^à¡âÖPdêòÊޖɶ§¢6lØtSTT™©Ÿ+jÕ1\À$iˆJ]¬¿Âû7ºã)km*L¥¢4Ô”ÌehÎñ\\)˘ið9ä8a s¯.×sqv+ÄyM’6¯=‘GiÉ›¤?ä©(I£71ÏsZãŸñÆEì{. ëŠÒKdÙ³ÓèóYô’AŽGæß KqHn"ëÜ$}çÇ×ñ”û(­, Ë6f‰((ÝO\_gÕDæT5¬ÑDÌÅs%Ä÷=§_êÞÝ@¾ñ¼\ú?¢AžÎç󙱋9ƒ7Žÿ+{\K¡r£Â¸Ïd-ÎTxA÷ì…$rÓ|š¯Íu¨Ë¢6—áp­é¾MW溉TeÑKð¿¸Yö­ G„qžÈ\´¿7Ñ~VvÕÕQáÜg²-/Íô_•‡ÝµŒ–ú]”_…Iý$[Éo¥ÙEøTŸÒE°[„g*< ûŒöBѬåG„qžÈRG-7ɪüÑ÷Q)TTß&«óGÝD¥YQEKó}åa÷mR¨©~o¢ü¬>í¨)CQiÇ—Ôqç*ª¬¨á…˜€Ä÷E0h¼ÜäŽ5$ùRÜ·edTµm‚:ŠwPËJi#‚’š6F×B\æØ d¿«‹¼p[äZd·Òì¢ü*Oé"Ø-Â?'fJå­J™Í™ê%*€¢¥ù¾‹ò°û¶©TT¿7Ñ~VvÔ2[évQ~'ô‘lb…PUÕUÄÙEP`•ØÅÄ0Ðë¯?Ç÷]ÝÂo哬ÞÊÕ¢å7 ¿–N³{)Âo哬ÞÊ\ ”TÜ&þY:Íì§ ¿–N³{)p.QSp›ùdë7²œ&þY:Íì¥À¹EMÂo哬ÞÊp›ùdë7²—å7 ¿–N³{)Âo哬ÞÊ\ ”TÜ&þY:Íì§ ¿–N³{)p.QSp›ùdë7²œ&þY:Íì¥À¹EMÂo哬ÞÊp›ùdë7²—å7 ¿–N³{)Âo哬ÞÊ\ ”TÜ&þY:Íì§ ¿–N³{)p.QSp›ùdë7²œ&þY:Íì¥À¹EMÂo哬ÞÊp›ùdë7²—å7 ¿–N³{)Âo哬ÞÊ\ ”TÜ&þY:Íì§ ¿–N³{)p.QSp›ùdë7²œ&þY:Íì¥À¹EMÂo哬ÞÊp›ùdë7²—å7 ¿–N³{)Âo哬ÞÊ\ ”TÜ&þY:Íì§ ¿–N³{)p.QSp›ùdë7²œ&þY:Íì¥À¹EMÂo哬ÞÊp›ùdë7²—å7 ¿–N³{)Âo哬ÞÊ\ •œ¨ðƒî3Ù «„ßË'Y½•Ç+ÄÄà&þ!r“*ç¦ù5_š>ê%Q–?Dm/Âþá[Ó|š¯Íu¨Ë¢6—áp§±¡¨ðƒî3Ù –—æú/ÊÃîÚºª< ûŒöBå¥ù¾‹ò°û¶ ìt†8¡ k5°“{'¾<¡yÒäDznä—ÁÁ÷´å t‡ù1웹x5Íl쀾3Úç¶2ÆbsZ@$ µ€\ÛÏÚ9W•ƒ´-¾ª·™IXúJ ‘jÙ$b”±ÞÚ¬l/I mÎ0@n8u†úJæÄø™#àc¥vÚæ0ºâ놭fæ“w <ˆ+šéß|f5¯taŒÄÖ¸ jµ×°ò/Ìí›j¯„içŽÑÏÛµµÆ gŽž¨DüØÓ¡‡[®9ÍWÛ®2nº†L­µ39DË\III't°8—‡T¸Æ3Mh$4]u÷^x’†ßH“É»“H“É»—”µWhõ0Í|l˜fÞ{~jý“q¸ñ"ºCü˜öMÜ©f¬žL°‚˜¾è’fÚÐÐ]œ`¼ÝÆnåâ¼ò•j¨ßôêøÉ=ëh)ÀuL@€AxÞ¾éòcÙ7rSª‡ï·ú¨K¤?ÉdÝʺ,§²g´M «fI\æfI9·âF»ÅÆñ⸮ÅùüQ׋É5M3ìÎèœ;)ÜÙ±p™ 9ÒòÛƒî$`ÖmàœAô]!þL{&îM!þL{&î_˜ZKoÁ5·#- 8ŸMqmp>XY$ÍK™Ìâeø#v'ÈXCõý€wVÛ6å•-kiªæ´¥§©–Š&…‡'ÅxìjÄänÁO#€iv6‹ÜÐ|G•grGèÜ‹?¾zзý,Ÿ}¿ÑÉì4‡ù1웹4‡ù1웹Dˆ"¯¶¨ì¨=£YEG €IPc¥×uî»]ÀêûºKR B••TSÒÔÓ¾üÂö:ãq¸GX#þË3–uZì >Žƒ¤ÌÖ¶ø™}4ã¾›Ç}þÈãâQÚ6äoe”ã”tÔvtðJémZWDØß3 #k¤ÆÀ|§·~¯½u᪥µ ®ŒÉI=-C׺ ÇmÇ+\Ò>ÂO¤?ÉdÝËò¬Ž®“I±'­­Ñè¨,×@׿#¸ÑÐË›sˆüY8Á¹‡^¿IÓ)sÙ&îs3ƒ81g0cÃw•ƒ¾»Ží|I#³H“É»“H“É»”H‚³(«ª!¦¡lOçkéãycIix¼^÷Ù©Yª<¦ðgü7¶â"( wHcŠÖ³[ 7°{ãÊ Y|pûNT4‡ù1웹xš¹´ÐI<ï‚(ci{ä{Öµ ^I$jxוI•z¬FÈu2*Ú9¤qâdl©‰Ïq>&µ ’x€”t™AgZ²J+BÏ©cå0±Ðº7‡<7h#ØA7qÜ/]ºCü˜öMܰ9GmQÔ:†ÒÉçSZ5ÔóÈZúvç[+ÛGVèãÄÏ”o'¼ñň_ËQZM±ëL–ÝC,LŠÑ†¶7ÇNãÎÎÏ£šÛ˜Ö›s±H#´?HÒäDznåâjæÓA$󾡥ï‘ìcZÖy$‘¨ãX¼Œ¶í nºgUW2X`¤hk`,|r»I©;Œ4جai¼Ñxƒ+²’­Ï¶([Y§¨¦­¦uÕçâ ¦•ÙÁŒ=­qŒçHàZðpŒC ¡úœUÍ…ð¾ æ1Œ 9¤µÃPãGˆ‚½éòcÙ7rÏä¯ÍÿÉWÿór«´SVO&XAL_t‚I3mhh.Î0^nã7rñ^yJµToúuüdžõŠñTß&«óGÝD¥QS|š¯Íu•EKó}åa÷mR¨©~o¢ü¬>í¨;!Ž(CZÍl$ÞÀIï(^t‡ù1웹%ðp}Ãí9D‚]!þL{&î^ s[; /€Lö¹íŒ±˜œÖ í`6óöŽUå`í F¯†*­æRV>’‚¤FÚ¶I§e,w¶« Ä…ÁÆRC[sŒŽa¾’¹±>&Høé]‚6¹Œá«Y¹¤ÝÈ" æºwÀ™kÝc15®$EÚ-uÇì<‹ó;fÚ«áyã´söÅ-mq†ÄÃÂ#§ª?6tãhaÖëŽsUÀ¶ëŒ›®¡“+mLÎQ2×RRFÉÝ,%áÕ.1ŒÓZ ×]}מ$¡·ÒäDznäÒäDznåÇe-UÚ=L3_&·‡^Çß…Ú¿dÜnm¢6]cŽ+ï½íÃ(~‘¤?ÉdÝɤ?ÉdÝÊ$AS“U3VXqÔTHd•óO‰Çñ^û€ñy°SÈà]¢÷4åYÜ‘ú7âÏïž´-ÿK'ßoôr{ !þL{&îM!þL{&îQ"«íª;*ÏhÖQQÂç`TãiuÄÝ{®×p:¾Åî’Ô‚Ð¥eUôµ4ï¿°†=ޏÜn#QÖÿ²ÌåV„û£O£ Áió5­¾&_M8ï†&ñßp8ø”v¹Ùe8å5<º[V•Ñ67ÌÂÆˆÚé1°_)í߫ãï]xj©mH+£2ROKPÁuîˆ1ã[C†±Ê×4°ƒãSéòcÙ7rü«#«¤ÒlIëktz* 5Ð5ïÀÈî4t2æÜâ?N0na×…¤/ÒtÊ\ögI‡;œÌàÎ YÌðÝå`ï®ã»_HìÒäDznäÒäDznå ¬Ê*êˆi¨[ÄyÚúxÞXÀÒZ^/}ÇÇöjVj)¼™ÿ'Mí…x€ˆŠÒâ„5¬ÖÂMìžøò…–_Ü>Ó• !þL{&î^&®m4O;àŠÚ^ùÆ5­h’I€5åRe^«²LжŽix™*bsÜO‰­h$ž %&PYÖ„l’ŠÐ³êXùL,t.áÏ ÄZãvMÜw ×nÿ&=“w,QÛTu¡´²yÔÖu<ò¾¹ÖÊöÑÕº8ñ3åÉï¼cñbòÁ”V“lzÓ%·GPÇK"´a­ñÓ¸ãs³³èÂ&¶æ5 fÜìRHÆÂ-Ò4‡ù1웹xš¹´ÐI<ï‚(ci{ä{Öµ ^I$jxÖ/#-»BÛ®™ÕUÌ–)Ø ®ÒjcÎã ĶkZo$4^ Ê줫síŠÖB)ê)«iA5Dyøƒ)¥vpB#k\c9Ò8¼#Ã(~§sga|/‚F‡9…Ìci-pÔ8Áâ ¯zCü˜öMܳù+óDÿòUÿüܪíTÕ“É–SÝ ’LÛZ ³Œ›¸ÍܼWžR­UþCÿ'½b¼A7ɪüÑ÷Q*Œ±ú#i~÷ Þ›äÕ~hû¨•FXý´¿ û„ö45}Æ{!rÒüßEùX}ÛWUG„qžÈ\PéQÒÓÄhdÅ1Ænž¯k@?·ö ç´mèh掟B´gsß: 7½ ’MØ®¸ê#‹ú®>é¢óU³èÜ­ñÔô6ÐöÓOA“mmGtÑyªÙôîNé¢óU³èÜ­ñÔô6ÐöÓOA“mmGtÑyªÙôîNé¢óU³èÜ­ñÔô6ÐöÓOA“mmGtÑyªÙôîNé¢óU³èÜ­ñÔô6ÐöÓOA“mmGtÑyªÙôî\ôUO´r¹•l¢­‚P>2êŠwF1@¼‹¸¯þ ÿOA“mm1Ôô6ÐöÐLÉ™NöÍ&,œnÂÒãpÖnòOØ5ª.é¢óU³èÜ­ñÔô6ÐöÓOA“mmGtÑyªÙôîNé¢óU³èÜ­ñÔô6ÐöÓOA“mmGtÑyªÙôîNé¢óU³èÜ­ñÔô6ÐöÓOA“mmGtÑyªÙôîNé¢óU³èÜ­ñÔô6ÐöÓOA“mmGtÑyªÙôîNé¢óU³èÜ­ñÔô6ÐöÓOA“mm^JÅ,9;&ŠHŸœ™Ø$ak€2¸‹ÁÖ5U…}©›Jéêçt6šÒ7“p¸qŽ>?û&:žƒ&ÚÚc©è2m¡í ¨îš/5[>€ýÉÝ4^j¶}û•¾:žƒ&ÚÚc©è2m¡í ¨îš/5[>€ýÉÝ4^j¶}û•¾:žƒ&ÚÚc©è2m¡í ¨îš/5[>€ýÉÝ4^j¶}û•¾:žƒ&ÚÚc©è2m¡í ¨îš/5[>€ýÉÝ4^j¶}û•¾:žƒ&ÚÚc©è2m¡í ÌÚv™µgÁ›i±Ì¯‚G:Z7µ¡¡âòMÚ¹V­Eާ É¶‡¶˜êz ›h{h%E:žƒ&ÚÚc©è2m¡í¥ U}£oCG4tú£;˜ÎùÐQ½í’nÅuÇQ_Õuã©è2m¡í¦:žƒ&ÚÚ Žé¢óU³èÜÓEæ«gй[ã©è2m¡í¦:žƒ&ÚÚ Žé¢óU³èÜÓEæ«gй[ã©è2m¡í¦:žƒ&ÚÚ Žé¢óU³èÜÓEæ«gй[ã©è2m¡í¦:žƒ&ÚÚ Žé¢óU³èÜÓEæ«gй[ã©è2m¡í¦:žƒ&ÚÚ *§Ú9\ʶQVÁ (uE;£ŒŒ ^EÜWÿ¤Qc©è2m¡í¦:žƒ&ÚÚ7ɪüÑ÷Q)Ttì‘‘JécͺIËÃKÚãvÛyÂHãiR (©~o¢ü¬>íªUÏ•-€ýÊßOA“mm1Ôô6ÐöÐTwMš­Ÿ@~äîš/5[>€ýÊßOA“mm1Ôô6ÐöÐTwMš­Ÿ@~äîš/5[>€ýÊßOA“mm1Ôô6ÐöÐTwMš­Ÿ@~äîš/5[>€ýÊßOA“mm1Ôô6ÐöÐTwMš­Ÿ@~åÏETûG+™VÊ*Ø!eã.¨§tc‘„ È»Šÿà¯ñÔô6ÐöÓOA“mmÌ™”ïlÒbÁÆì-.7 fà/$ýƒZ¢îš/5[>€ýÊßOA“mm1Ôô6ÐöÐTwMš­Ÿ@~äîš/5[>€ýÊßOA“mm1Ôô6ÐöÐTwMš­Ÿ@~äîš/5[>€ýÊßOA“mm1Ôô6ÐöÐTwMš­Ÿ@~äîš/5[>€ýÊßOA“mm1Ôô6ÐöÐTwMš­Ÿ@~äîš/5[>€ýÊßOA“mm1Ôô6ÐöÐUä¬RÓ°2h¤‰ùÉ‚F¸+ˆ¼cQXWÚ‘Y´ >ž®wHñsi©Ý)y7 ‡ããÿ±Rc©è2m¡í¦:žƒ&ÚÚ Žé¢óU³èÜÓEæ«gй[ã©è2m¡í¦:žƒ&ÚÚ Žé¢óU³èÜÓEæ«gй[ã©è2m¡í¦:žƒ&ÚÚ Žé¢óU³èÜÓEæ«gй[ã©è2m¡í¦:žƒ&ÚÚ Žé¢óU³èÜÓEæ«gй[ã©è2m¡í¦:žƒ&ÚÚ Í§i›YÖ|Y¶›Êø$s¥£{Z/$Ý«•jÔXêz ›h{iާ É¶‡¶‚TQc©è2m¡í¦:žƒ&ÚÚP•WÚ6ô4sGO¡Z3¹ŒïÞÐI&ìW\uÅýW^:žƒ&ÚÚc©è2m¡í ¨îš/5[>€ýÉÝ4^j¶}û•¾:žƒ&ÚÚc©è2m¡í ¨îš/5[>€ýÉÝ4^j¶}û•¾:žƒ&ÚÚc©è2m¡í ¨îš/5[>€ýÉÝ4^j¶}û•¾:žƒ&ÚÚc©è2m¡í ¨îš/5[>€ýÉÝ4^j¶}û•¾:žƒ&ÚÚc©è2m¡í  ¢ª}£•Ì«el²ñ—TSº1ˆÈÂä]ÅðZE:žƒ&ÚÚc©è2m¡í S|š¯Íu¨Ë¢6—áp®)Ù#"•ÒÇ›t“—†—µÆì¶ó„‘ÆÒ©òÇè¥ø_Ü'±¡¨ðƒî3Ù %-G„qžÈQ ›7XÇ>G‚á}Í`>29~Åó ä›1ÚI|pûNY,¥´g¦·,ÊFÚ•<ÔÕ2<Ùôb¦G9Ž„6ñš†Ü÷k¸k»_ n9É6c´˜`ç$ÙŽÒÉPå<”Ôî§´©kQmHcc ­–wÅLÒÒAl²‚AkZÒMø8„ýÖ5ÕL¢†Æ´¦¯ýfv•†øp‰ÄçHoFF;åk¸‚†› ä›1ÚL0s’lÇid›—ö –¥-UôœÈd¸ØÝrµ®ŒfÜá)¼=šÚÂ-dav)òÀ×ÏôJÊjé¨*a6# 5­|á…À4ê†ãÖ„% ¦9É6c´˜`ç$ÙŽÒÇQþì:öU:ïx‚PÜDó$`Šæ¼æ…îmùÜÝÀ’n qn–’§K¥dÙ™ .¼:)›…ì ÜAñ`ëƒÆ ˜`ç$ÙŽÒà–¾ÛQY±µîséßPç¸k@ó}ø%×xïÕÔ¨ßôêøÉ=ë_DÌä¬e÷bpò/x`ç$ÙŽÒSª‡ï·úª›~¾[+'-KF±ÓRRK;ðKKšÂà Äj¼ ¶Ã9&Ìv“ ä›1ÚY+\ÚY=gi¦Û¬¬‹I¥cÛ5,oTF×`1·ÞÇ<…Ä’Ü$®j̰£ ³_WUK4/ФRÍO4ôñ>'–g.|¢3{KOzâ{ï°Ü|0s’lÇi0ÁÎI³¥˜¦Ë+:²oòðVIKœ‚7Vf°Ä ÌÑqã‹:ÆÜ-?(4L2eÕŸ"¢¦Ž² IiU5L¦!C1ÆÆ–÷÷³š;³€{°Ün n9É6c´˜`ç$ÙŽÒÄC—4••ô³R½î¥ÌTG-; R9ÕJfÄÐö8°“Ÿðü#|AiºÐeDox¦ŠË¯–Ñ{d nhIhc‰.2ȺXާ“ßZphðÁÎI³¤Ã9&Ìv—™_«eQÚ05톮NƼà×48uúî+©—h2Ô¡q±Ìc¤‘:îkÜÐOïÃ}Þ+üjÂ8ØèÜ÷½Í w­¿Žÿ´r,þHýƒñg÷ÏZÿ¥“ï·ú9 ä›1ÚL0s’lÇiD³V}uc­÷Å]_SΞf6ŠZK©ß.͘¥Â/°5äcýA„]Þ« ä›1ÚL0s’lÇid™—Vx²ÙhVQÖPÁ53j©IˆgØ\Æ‚ ^C{ébùhïâ#ÝZÐÚpFlÚJšê—:FºšžHæyÌÙ;Éy=ý×^…CU†rM˜í&9É6c´³öµ©õ{€æ´/7߈þë¼wêêToúuüdžõŠñQåÑKð¿¸WŠ,~ˆÚ_…ýÂ@ÐÔxA÷ì…–£Â¸Ïd(K/ƒƒîh® ("’Õ§´KŸž‚ `kAKdtn$ý·ÆÛ¿yÿ·5ugZU&¢­“¾KƒEÕR´<@?íÊW7r6/GŸÒæí è­°ikª*ª$’fËQ ÄÂ?Va‘ÒFöÞ>P{ï×x8@"ëï«~IÔ6ا­¦¶k!xŠ£Jª4Ò?0{Lf0ÐØ@ïZÓÞ·Ž÷ÙÜ‹Ñçô¹»iÜ‹Ñçô¹»h>ÒdÅ-Ÿ4zUe-seÔqH3rØÖ0¹Ä568ÁàÝ`ÞëüG’TSQÁÕ-m4°_‰·ÈÚi$Xµq‚Åuá¸}w#bôyý.nÚw#bôyý.nÚXûK“l¤¥4ÑZ–‚8ÄTŒµ¢•­ ´7 F;°´~³àopwU ’,ê(©)ë*[ M­iÀnÂâãw{¨8%¢æµ \¹;‘±z<þ—7m;‘±z<þ—7mÌQº6ºWÊKœìOð $ @jÜŸ1GIM˜¡§‚¥³èÿ¬ŠF¸Ãï ¸?9‹ÇÄq_÷a¿Òª7§q–ûý*£z¢ ²Vž¤Ç%]}}ELmpmDf âøž×†††×A44Üq5ÅÄžüœ´ |U6ECä´\éQ_=S!‘áÂ6݇G’2Š1©#65œN¾×¸Ë ýþ•Q½;Œ°¿ßéUÐ{±¬‰,‹&Ï á ¥m$qÇòÖ¼2!®$4‘Žûõ_‡R±†7Eq¾WÌæ´4Èðž@ã8@ž=@±U÷a¿Òª7§q–ûý*£z‚,‘ú7âÏïž´-ÿK'ßoôr©±4 `³ZæÒ6IZÌD’H‘ÁÆ÷uN½zü\K¦¶Ç¥µà±ÏFëÃDÒ0AÖC¾#ÇÅyåAЪÛb3…#¬–º²fC#¦‚šW´Ç Žkš\Ó‡Ô÷€âÐpæÝã¸Ë ýþ•Q½;Œ°¿ßéUÐUY9 ±()­;B¦¦ª–’("x, ¥sLo¾+˜ÜCQ‘œùþ7bü.ÍL-‹Iµñãmñ:B×áÄÌ.a­ý\%ƒ[oãs‹¤î2Âÿ¥ToNã,/÷úUFõGT–\ºÍ%óðù3‘_!qqÍ>>ùμ»½y7ßy7x泥ȺK6(…ŸhWÒÏ[jbs𡈶簶â)â$á¾ðn wq–ûý*£zwa¿Òª7¨;a£t62²¤Ç {ƒïhfÎÄ_ßÞIqwŽíJxctPGå|ÎkCL9ä3„yãÔû_q–ûý*£zwa¿Òª7 ‹)¼™ÿ'Mí…¡§ð‡î?Ù+7U“ù?dj—6G¿I‰‘4TLïÖ€Ósׯ_'‰]TÓÇWM%<¥ù¹`‘Ì$r^Òþ$¢£îFÅèóú\Ý´îFÅèóú\Ý´V…V•3 ™Ïk[<3‚ÂÅ‘£_Šö þË×-mƒK]QUQ$“6Zˆàf&ú³ Ž’7¶ñòƒß~»ÁÂ_?r6/GŸÒæí§r6/GŸÒæí ûfäÅ-™j>ÑmUeEL™Â÷Ï v##a¡ÒÈèß!'<á~m†@éF¡Þç JK'*¨)ìÊ{BІ®+*6²°Ón"37Þ÷bvà.Â;ç Ã…ð*©róJÉ{¹°ñ F¦šžh0xo`‘帯k0½¥¤ßáb¿å.ëݪµ­j˜]lXçG©©ötP%‘Ç+£kœìéºûšIÁw}wŒ§ÈšZk>ŽOþbž:Ý6h\íF<¸7Œ:AãyÔÈøðÛeYV¥™Q$|#G%žú™çÍhnŒì’ìætN `x¸Õøh¹[xcCªi‹ƒc"ÀúÂ=AÃSF¼'Y.â]J <‘ú7âÏïž´-ÿK'ßoôrÏdѸ?|õ¡oúY>û£“Ø©´«å£¯² ¬-¬«txh‚Y/øïŒrê½qE–™=-š-&6µÉØÇ5Îk/p€çµ®#äs°•c]géµ–eFw…RgÆüwÅ$wqêð—߯Šï¤9}ƒŸóM4PbÌø\ÓÉÊïoÑ®»_˿Ŭ,NSÙbH$©sœç70Ê9;HœP†gs å \öyM¿ª¦×¡¥¡†±Óç žìɧc¦t׋ưþôw êñUT¹9UµSkÐZÅW4 TSck sni.¾„:û€$\u=FOôf’Å¢ªÍ²–(âóÇœÄivÇ ƒƒ˜ææ´ƒªâøŒ¢²U ªÎgpaš8ÜøAx2€X×89·àN6Ü;á 2ÆÉvjvÕM$1Äêx£³çt®Ç!×’ZæÂâ;Ñpa7æ©éìZê;BI`µ¿ËÔIÕYÊvºi$kÍO1­p·ŒëuÅ·Œ4ÉF‚¢Á}›Y ¥¢Žš•òÍO‰Œd0U38Z$i8ŒàaW±z| ú ¡¦´­™h)Ø÷5”‘Ô¶l¾’F9޽ãšc» ˆuø…ÝéVê†ÌÉÙlš§ÔÓÖ±ÓT4 ¬ä$µÎÏÉ1,þi€ºëÙ¬á8íãeP‘¦Y¡s;ûÃb-&÷ ñ®màê‡‰VSx 3þN›Û ñQå7€³?äé½°¯@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DD,¾¸}§(”²ø8>áöœ¨‰PåE³-œc­ ¡mU^bJªæ—GsR?‹5’À>W_.*ë?M¬³*3¸4*“>7ã¾)#»W„¾ý|WxÐUY¹K¬Ùªkj!©c*sTÐB÷²·¼kïŠ6—¹×^öÒïóªâ™WIÂU,t˜©MO$"8d|Ï•ï¯flâææu·&á}üFïžHÅi·É%4®–ÐmtqÕÒ‰¡íƒ Ùˆcá­·Þ;µñMò±ýŒm‹7–s ({MA7½·Tºá}൤¹Æûßú\¡³a¥‚©òͣ͋õ­¦²,&çgHmÑa7ƒ ×:û°›Ê+*9*cuUΧ¿êÝßàÂØÍ߬py !˜ˆsƒHÄ@YÛOô~Êû,Q2k5 Ó>&³øéËœ÷Ó±®h…×¼ëï‰ ŽòKIu~J:Ñ6“jk™$nŽFÂê`Zç±í{LÂû¤ Y¨0˜Æ×5ð.è-kJKLç×`{$Ñ½Ž¸œÇ曈7/" êUv ŒË…ð5´m2JdshéM7Þ°xš/.s÷ëà-Q¿éÔ?ñ’{Ö+ÅFÿ§PÿÆIïX¯Xý´¿ û…x¨òÇè¥ø_Ü$ G„qžÈQ(ë*Ë+3,¦–W6ÞK @‹‡…C¥Mæúž´}´H¹t©¼ßSÖ¶šTÞo©ëGÛAÔ‹—J›Íõ=hûi¥Mæúž´}´H¹t©¼ßSÖ¶šTÞo©ëGÛAÔ‹—J›Íõ=hûi¥Mæúž´}´H¹t©¼ßSÖ¶šTÞo©ëGÛAÒìxNnGDû»Ù->"/^>ÐB¤îv_?Û;fv–•7›êzÑöÓJ›Íõ=hûh+{—ÏöÎÙ„îv_?Û;fv–•7›êzÑöÓJ›Íõ=hûh+{—ÏöÎÙ„îv_?Û;fv–•7›êzÑöÓJ›Íõ=hûh+{—ÏöÎÙ„îv_?Û;fv–•7›êzÑöÓJ›Íõ=hûh+{—ÏöÎÙ„îv_?Û;fv–•7›êzÑöÓJ›Íõ=hûh>Y–tVUŸ2I#\ìRˆ—8¸ßpŒŸZR×DÈ™hUÒ4;ќ֗ä´Wž+¸ÿrû¥Mæúž´}´Ò¦ó}OZ>Ú Þçeóý³¶ga;—ÏöÎÙ…e¥Mæúž´}´Ò¦ó}OZ>Ú Þçeóý³¶ga;—ÏöÎÙ…e¥Mæúž´}´Ò¦ó}OZ>Ú Þçeóý³¶ga;—ÏöÎÙ…e¥Mæúž´}´Ò¦ó}OZ>Ú Þçeóý³¶ga;—ÏöÎÙ…e¥Mæúž´}´Ò¦ó}OZ>Ú ÎæC¦óÚöCa•“69daisH"þóìW«—J›Íõ=hûi¥Mæúž´}´H¹t©¼ßSÖ¶šTÞo©ëGÛAÔ‹—J›Íõ=hûi¥Mæúž´}´H¹t©¼ßSÖ¶šTÞo©ëGÛAÔ‹—J›Íõ=hûi¥Mæúž´}´H¹t©¼ßSÖ¶šTÞo©ëGÛAÔ‹—J›Íõ=hûi¥Mæúž´}´H¹t©¼ßSÖ¶šTÞo©ëGÛAÔ‹—J›Íõ=hûi¥Mæúž´}´H¹t©¼ßSÖ¶šTÞo©ëGÛAÔ‹—J›Íõ=hûi¥Mæúž´}´H¹t©¼ßSÖ¶šTÞo©ëGÛAÔ‹—J›Íõ=hûi¥Mæúž´}´H¹t©¼ßSÖ¶šTÞo©ëGÛAÔ‹—J›Íõ=hûi¥Mæúž´}´H¹t©¼ßSÖ¶šTÞo©ëGÛAÔ‹—J›Íõ=hûi¥Mæúž´}´H¹t©¼ßSÖ¶šTÞo©ëGÛAÔ‹—J›Íõ=hûi¥Mæúž´}´H¹t©¼ßSÖ¶šTÞo©ëGÛAÔ‹—J›Íõ=hûi¥Mæúž´}´H¹t©¼ßSÖ¶šTÞo©ëGÛAÔ‹—J›Íõ=hûi¥Mæúž´}´H¹t©¼ßSÖ¶šTÞo©ëGÛAÔ‹—J›Íõ=hûi¥Mæúž´}´H¹t©¼ßSÖ¶šTÞo©ëGÛAÔ‹—J›Íõ=hûi¥Mæúž´}´J¶ºÉšº£;Ã;CC[cZÑÔ'Œ“¬ž>EÑ¥Mæúž´}´Ò¦ó}OZ>Ú Þçeóý³¶ga;—ÏöÎÙ…e¥Mæúž´}´Ò¦ó}OZ>Ú Þçeóý³¶ga;—ÏöÎÙ…e¥Mæúž´}´Ò¦ó}OZ>Ú Þçeóý³¶ga;—ÏöÎÙ…e¥Mæúž´}´Ò¦ó}OZ>Ú Þçeóý³¶ga;—ÏöÎÙ…e¥Mæúž´}´Ò¦ó}OZ>Ú: ”VŽœúúÚ©³F¤=®¤‚xšB¶\ºTÞo©ëGÛM*o7Ôõ£í êTycôFÒü/î–•7›êzÑöÕVU:Ir6Õ{à’ØÀïËM÷ŸÄò$ ²Š×}VùÙMž/Šž™Ñ¾±Îk"p¹ÑÆ ÿTÒ.ïY„w­òEÐG5UdycEH&fƒ5ŸQ)ˆGßg$ 8ºþ+¤ Žûõ\Ê:ªÊ: Y¨ædDÚ‘KŠ2C@¹­’Ö‹ÍÊ l ¶Ì–… Õ”¹ÊšxñŠG š×T27ÝŒ'ëi¿UÀêUÑeME ŒgÃSi‰­RPI4d’†Æ\ó+#ˆ¹¥¯dÌÕýão^õ°«³#­…±T67±²G(à;æ<=§Qñ9 ÿÙrÕdÝcæ|±†É+š÷>£ƒÚ CÚæ8» Â\.%·4’1î˘-)jgÖgji©b†ŠFL%ÇV^ì"7H[ àæñxh¿m~\:†Ë§®}—6¨ß5e;™8–5Äb šì/-2æÅßa¼9!e–)Ã…ÎÇXæH0—àððàâe–÷‰ØÝˆ›ÊñU‘VM](¦’6#ŠA {â34’HµàÉysÏ~N·¸ñ¸ß~M^ZIm%£;7•âªW[_™Í’a.v©_xºæ—^ÑcfÛóUØuv…E•Y´¸ñS²1M…¡ßª1Žu÷áÖÖ÷À`^{’ÔÉS$ÌtÏžûÝ5kžc½Áߪ.yÍwÁ§¼ÃqcOì‹§¦°ié(f¤‡Y6,䆱Ε䋱K±—\ûÀ. ÅQÚ–•¹fÃOšè¤Ž§J†*Ç;7Ôâ÷_senqÀÄCxõx¹kòÖ®IKCLÆÌùàuàË™©ˆÕC¯{áç6VÜèó‚âH?'ª,– ‡0èØá,2™DúkŒ¯&ëÃäljí8X \H!\Ñt È«%’9âã11®¯yd-.k®‰¥÷Es˜Â0áÂÛ®¸*9ÎQKfz&6j[B–…ìdÅÍ.˜A{-šgäׇÅ~¨ìœ£ªµ¡ñYð¶Xä„GT–ÔÃßqtѽ͸2÷ÞàëŽEÄ÷É’6t³Ã3Û)tN‰÷pŒ²>2ÒÇÈÜwHá½óÁ'¼›‚’– †GÒã–)\úŠ×M!1¼>1ï.Â× Ãoºòuk7Á§iÕS×RÐPRCQWЦŸYÒçÚD >³¥Ï´)§Öt¹ö…O¬ésí iõ.}¡D@Óë:\ûBš}gKŸhQ4úΗ>ЦŸYÒçÚD >³¥Ï´)§Öt¹ö…O¬ésí iõ.}¡D@Óë:\ûBš}gKŸhQ4úΗ>ЦŸYÒçÚD >³¥Ï´)§Öt¹ö…O¬ésí iõ.}¡D@Óë:\ûBš}gKŸhQ4úΗ>ЦŸYÒçÚD >³¥Ï´)§Öt¹ö…O¬ésí iõ.}¡D@Óë:\ûBš}gKŸhQ4úΗ>ЦŸYÒçÚD >³¥Ï´)§Öt¹ö…O¬ésí iõ.}¡D@Óë:\ûBš}gKŸhQ4úΗ>ЦŸYÒçÚD >³¥Ï´)§Öt¹ö…O¬ésí iõ.}¡D@Óë:\ûBš}gKŸhQ4úΗ>ЦŸYÒçÚD >³¥Ï´)§Öt¹ö…O¬ésí iõ.}¡D@Óë:\ûBš}gKŸhQ4úΗ>ЦŸYÒçÚD >³¥Ï´)§Öt¹ö…O¬ésí iõ.}¡D@Óë:\ûBš}gKŸhQ4úΗ>ЦŸYÒçÚD >³¥Ï´)§Öt¹ö…O¬ésí iõ.}¡D@Óë:\ûBš}gKŸhQ4úΗ>ЦŸYÒçÚD >³¥Ï´)§Öt¹ö…O¬ésí iõ.}¡D@Óë:\ûBš}gKŸhQ4úΗ>ЦŸYÒçÚD >³¥Ï´)§Öt¹ö…O¬ésí iõ.}¡D@Óë:\ûBš}gKŸhQ4úΗ>ЦŸYÒçÚD >³¥Ï´)§Öt¹ö…O¬ésí iõ.}¡D@Óë:\ûB¾:¶©í-uLŤ\AÜB"ÿÙPythonCard-0.8.2/tools/standaloneBuilder/doc/pic13.jpg0000755000076500007650000023554210231140007022501 0ustar alexalex00000000000000ÿØÿàJFIFÿÛCÿÛCÿÀ‹®"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ûƒþ ÿ„ý¥¿àŸ´ÇÃï‚?þþÎ^ ð†¿û7ü.ø¡¨|Mø]¨ø—Äqx‹Ä—¾4ÑõH¢Ô´_xb¬$–WñÇ}m=輸Ôä›RkI M;òâ/ø9‡öò“ï|ýŒgÂ’ñNååpHo‰k•;˜ )@Qüøí¿q¿hmwþoø)çíâøLümðßþ¿ø6Û↻ÿ á­¯Û¾"xû'â5®£ÿ Ÿ€¬¿á+ðÛ i–~ ðׇ¼áŸÚO ~xÆw¾+ñ.âÏÜh±\}&# á-õÊœqÕ0jGMÊ£W B©Ã0r´êb¢êB¬¨×ÃR§RxªT¯J5<øÔâ‰A%%7F5âI.h:u*5ÌèCUVŒ£‘©7Ó”—7/Áéÿ!þÜìï„¿±Âžà|ñÁã¡?Ô‘Éä…< ªë¨àãÏÛ’Lçá7ìw€2\|ñ ò9†ø†bWxù‘B#—d]òÃÖx«ö/ýžm¾þÓÿ?e?ø'§ÇÏ_ô?Ûƒáßà #ö/ý§4/ÚO?³WìÝãÙþ,ÛøÃÄ¿ÿf?Šžø±¢hž-ø¯w­x[á÷>*xÏÇZNµðã¾²ŠêoÿÂc®ëSÿ^’OþÎðKÏxgàÞâ?‡¶ŸðNßÙÀµ¾‡ÄíZÆÓâ/ƒ´ŒZ‹¿fI¼U§øÊ€1k~Õ´Mc_ñ…ÁQ|hÐ5íV¶ÔüQaáý>ëE³ìÁä^cñ˜ ‚0±XÊòÃT«‰©‡£<5_ìøf¢ðñÇÕ©?iNR¦¹¥MÕtêTÁ,m(JQ¦;ˆèáëÖ©TnŒ#R1§“Hýcêójn…8Ç–QRÚ|ŠQU½Œå¿A‹þ-ý·d·ÂÙ0qøRÞ È§wÄ'Ó`‡âhíì/üOûm¿ ¿dÙÿ‹-¯qŸ¯Ä0{ã äpC÷Á>?eý/öfÓüYª~Í?ð­| 'ü?áßí™íƒÿ gÇkÔnRëÃ)£ü>&ñ¯Ä=[ötsñRK½>À| ´øoiãËåñrEðþóÃ÷3xiôž‡âÇìUûéßðQ_Ú»öOøiû1ëë_³Wì³ñ¿ã‡Â߆šŸÇ‰Þ/±ý©þ7Ü~Î_¼kðà‡| ¥\øwãhÞ{ÿŠ?æð€~+ë¼}â ísP“ÅúgÃ_ iß4_>ŽŠÕjŸÔ©|Ë^jŽ Ó£C+žyÔ“ÍìJÙ–”)ëR—<«c#…ÃE׎ÞÓŠ £ÏEsÔÃR¦œësN¦&5§õKµaªÎR³ŒÒŒ(º•=Åóì?ðpÏí­#ÿ ¿de?wàÆ¼JæFUÎﯠ»fÓ– ­ÂZ_ðpí¢zü-ý’G®~ ëyúŸ}óÔtçoÏåý;­ÿÁ<ÿgMágí)㿆Ÿ±˜ø½ûHx3öDÿ‚f|]›öI÷í9âCð;ãÏíâ_ˆz7íðÅ~|;ø¯áïÚÉlü áÿüK> ø§ã?øËÁ¿häš­·‚.-ôk~óWÿ‚|ÿÁ;þxËö³Ô|ðWâßíƒkð«öåøuð’çà¯Á;?þÒ<ø_ðgUø£üKñ†›§xwàçíû>x¯Á£þÍßÄ¿ƒ6Ÿ~,ø‹ã ¿„uŸ…:O‚µ/x›ÆúÄ-në•Sð•Ê­¸*¬½Ÿ'»6NN¥,–´R¶jÕ88ç¸E Õ¥Kˆ•ÖœíŒmÿààÛ>\†ø]û$¨qðoZÚ€¬‡'þ+¶Ý‚¡ˆ%>DrÛPK-¾Äð_Û!À'á‡ì ð¦õ‚@?ÇãtblUH`U‚°‘bôÝá/ìQû+ZÁ/þ,EðGâ‚üyñgöËøµ¦ÝüXøññVÿáÞ½ðg³_ü?áÆŸ§xƒãçÃ6ïÀ°üEðÏÁ}Røuâë}Vømà¯^j¾9ñ_ˆô_kš_…õ¯}â¿€Þñ÷à­Öß~x³öWð]ÿíeûi÷Þ$Ñü}ñÓá?…¾ ü%ø¯ÿø“á_þÒÞ0Ñþ)ü@ñ¯løYõ=c@ñ†«á=Cூõ/Ëâ?‡~ðµÜì÷OðÞS\a"XZuê:1«ˆ«G‰pü1‰– KZ¥Z4±ugV>ôq2§OßÂÑ…Z5f{n#|©g²uU?i:qSä§–K3¦ªU•F3((ëû¨¶¹jÎP©|d¿ð_/Ûºü2ý”`ž~jý@$ Ân2Iù{~ñQ»f¼ð^?ÛRCü3ý•²«ð{UÊ#ª–-ã%RHJ…^)‰ÒÓÞþ*þDZG‡i…¿ õØcöîð„t¯ÛÇþñˆ¾|øáoðÃâÇÁ-/Âþ6Ô4 CÕ¼Mñ¿ö‰ø‰ñcWÒ5[xÓVñçÁK…z¯‹¿gËŠ~%ð×Ã]'Åú„eÓ?5¿à£Ÿ<û8þÑ:oÃß[ü'³ðýןxÖ×Oøg¢|pðf³¦/a¿×a¶øÃðËö„ø›ñwâOŠÂÊ{G»ð©âû_³ø øÄWžðö¹¯k:f›èåy'…ùÎ/‚Ãpr¡[€©˜Ñ–' £IáéW• ©U¡¯ÖMB~ɾgN¬$¬ÕXÒåÇcxŸB­z™Ãœ(â#†Ÿ²¨Ü•ISU#hÏ 8Y4å¢RƒM¤àçõÒÿÁvÿkÓ×á¯ì¯ôÿ…=©ärý~äsŽTä¹cзÿ‚èþ×2íßðÛö[\íÉ_ƒú–LÀŸN#`·Ü}ÛSÍ{oÄtÃŒvärƒû>\vÁ\aq¶‹%ÁO—êÆBäžcŒù1ù2§scfï“Ëól¾Ÿþ!§òßýXËou¼jõ_õö?›ùÚñògÞÍ¿íLMÒÞðóþç’ê­n–¼mþ ‡ûZ½ðãö^¸oˆ°ûÇÅéœcœª‘´î ûÏ&Ô_ð[ßÚÅó»á¿ìÄg,¿oŽÜFÏ÷O‹9'Œ² ! S,Ñ~1F6€6„À*}Åäô;#þï#jmÚ8gú5ûeÁݵ—nxJ~èž”9;w)Ü›<¼fËîÛ¢ý¤‹þ ]ûV?-ðëöfQÎâÑÞn_—p[Å pX|Ë…8G2,6—þ OûT“ƒðóögëÛá%Ïq?ñTç§`aÎ1 ‹ñÖÙpØWn~m¿:|€à~á3»‡Ì»1Ï.ÛB1Èùz6xè>qÉ;ã‘´a‡o/ò¼6à[ÿÉ3—à5{¥¯ïŸžê?.™Óâ|ýÊßÚ˜–½`ûv]»ôò÷c ÿ‚ÍþÔ’œ7ÿٵNFà>\ü™¯,Þ$±‚§h2ä ÂÛEà±ÿµ7ÃÿÙ¹OñøTÓ§çÈÉñ"†ÁQÏË ;Fããíšà²A´¯ÈW?ÞÉû:oû›[ƒ†D9_/ýv5Úl ´´ËýúöøP~Q’9ÿ‰ÿ\xƒœ|þVœðVoÚFBøö|\‘¿ òcð çYÏ•a´m‘$bålÿ(sÓ=‡Ýù'äëÇ<.6~ãrÑ0PyEv•8”ùã“÷#$ìÃü«¶T+ämÓeøqÀúÆ7—à5|¿éóþ¾äçÅú„mšb“o{Á=-ýÄú.¦«gú¤?à«´Yÿ™ö~¹øV™{×ZPqŽyHù¼»pÿÁTÿh™ gÁÏüZÄAW99ÕÊž@` G…G.Q²[þ_ Çðã¼÷»ìLž0~aŒg+·1hÚ¯$í)S–dáŽàÞPçåÈýä[Yó•çÙåÿë‚9[ÿW2ûßùj÷ý<}ßoÂéGŠ8ƒÙ¶ó\UôÕ¸òíølíîþ£GÿDý r|ð ð²,)+»mQY‡l•^Uƒ!Ävþ }û@σ~¯^OÂØùŠƒ“ŒrÅG˜büÖ·@6‘µTcn?v>ULyg;k\G³l7£àÿðܲä—Ó`äã®Ñµ€9M™·ÍxwÁ:/õs¿òÖ¾ëûéõþWꉧÅ@ï|×ímÜ|¿éÚíøyY~˜Áÿ/ø÷)!üð)q¿å í÷.åݺùGÌ ;YZ7 ¡üØ­ï/ü›ã¹Î|ð4`ò?áXZeGÍÁÿ‰€ÉqÐç9óŠÍpHØ«7å †\”cäG÷ö}ܦƣؾ_‘g®ƒã=‡Ìœ·û,1펿.ÌÚð÷‚ý£_êî×Û–¯Wÿ_<»÷·[ Š8‚ÿò5ÅlŸÅËû‹ü´ßNeú+oÿøç3 oü¶ä¯Ã A÷žE?zìô Ûv 6à«ç›=5ÿ‚ˆ|neøK࢒¹#þ•ÊpNÞn•³žäSýà¼íüí²_ž?—þys·%n¿¸g«í1ƒˆüúwAÄh0Œp¸CòãËLÃ÷qíþêc ”ü>àÄôáìÕ}š¶ëÓÚ[§Ÿ_7\QÄ VþÕÅ[Oµ'ü«²ê­¶ˆûî?ø(WÆÇ$ |9#þ•†FÑ!Ÿ´œà¯ÌP±g|ǃbÛëã4‹¹¼)ðmFX|5Ó³Ÿ“h Ò.GÌêÍT ‘Èe†ϨGͧ…àŒíÂÉóª?0Ûó.Ý»¼È¶y–Ý5¢ás° 3.â0ãå€lQäGò6Ì7#ËòÒ?.ŸfµU<>àÄ¡nÀ+½}Ú·ÿÓ—ü>]\QÄ )¬×´]ao…?ä¶ë¿Kt´~è·ŸÆ3Ÿø¥¾ñŸù¦š_V88˜óÆ{ œrWRßöçø½+m ü$ ¿ ´¿Ý©™ãÉ««¶D%ˆ_´‹/„ÀëÁà7nÊçå<ñxÀ‘÷—vÉ0Ê<¹×S³oËúI¤?g‰òö¸Ú6É6WÈΙ›ðÿƒyoþ¯`/å«åÿO?Ëå¬Cýhâ[ÿj⮟óGËûžKüúo¯í·ñh€[Ã?Ôàd‡AÁ*§pB@$Œà@$ªÛ‹öÔø¯!ÁðÏÂp9ˇ0 òÌpÙIùrñ¦Ô“{Æ›åƒã—j¨Ø«…Q… òF6¯îãÊñº1´ «÷FÙ~um‡å'æ<ÂÎ~cå¯ÏòîæÅ±QÛ͇oŸm—úƒÁÖoý_Àh®´«ÙÓÝòn¾vTø§ˆZ“y®)ÚöÖ-k{žK«½ºëoµcý±~)8Ëxkáb‡?´lõx8kuÊÌy*Ë´T“ÎŽÞÂþ×ÿˆçÃß :s‡ZÚN?ÕsÏ~88ä¯ÈÖÉ´ålÁêÃæý?Ñãùnvü¾XDd^_“g ƒ»ÐcŽƒäé÷=¸8 ÛªÄx ƒî—öWmªÞÚÓÆþv]uÞÊmºÐü}ñ¤ŒÁô®3÷|á¢@óW;´¥>ÎG°Æåˆ"á,þn^;Àú¨ÿÇÀÁÁùvüªícòìÁoºŸw2>ÏÒû6ËÄ[0Êù^2à^Qü à®÷÷jßt¿žÿù.ýo£ˆtÍqWÓiBûCoqþ úu^ú>9øÀŒ'Àcþä ðqÇÙ}\öæÁÜä¼].wi~}çð¸XÁYyqýC°9”W,UD²[xr:ïŽF@ãît8ëü òãéÚ˜6#ù ì¿,Xó›sþäîo—qùׂۓÊó¬ó\ Â\­ÿa`¶VÒ¯hõöÏí>»lõ§ˆyoý«Š½¯¼/ÿ¦ü—ÙÝot÷Eø¹â‚›Ž™à vîÀð'…>S×Ú*7äFa‚맥ÞÂk¿|Óæ¿Òô]l®|$·6öÚÖ™i«Y%ÃØ|:½³óþÇ{J¶÷wÇ!hĬTšùz5Ä@mÆ#·o Õ|¨ñÓ‘åǵ€fÈ>yÿ‚¬øGÁ¾9ý–bðÖ»ðãgíñPÿ…¿³—‡gTÕ|;ñÀß´ªø?D?~/x?㕞•¨hŸ²Ïü+]lÍâ~Ѿ:¸±ð¼-¹¥xžÏÆÖž'_†>9üçÄ<·&áœ[ˆË2L©TÅãªáê¼E •ãìáET\±uà¢Ô–¯šÖnï©õ|ŽÍ3Ìf2†?5Ì<>iª5£IóºÜ™ªMÉr¤­m-¥š²ýÖüS©xsEÕüC¬ø×àž éz†³«^¶Õî>ɦév“__\ýžÓá\÷Sù°K/“m×ìÙ RHʇù¶ÿ‚Ò|mºøáû*~É<°Œé>øâ)<}¦h‘èš'†¦kM{áÆ‘¬è2ø‹Mðé“N¹×4­;ÄW–ˆíy©Ç¦=ö«™xÐ_]KuÖ~Ç þ<|3ÔmGÿ‚€xCÆßà š¿ìõ©5Çí³g¦ÜøÃöjø™û5CáÛ¸ü5ð‡örñ_‡þü0ðOìíÿ’þóâ÷ì嫸OÂ>ø™ãé›ö‡[ω¾Õô©¾ü«ÿÿ”xÁ:¿ìLðgþ¨ÿWç4q4s«5©S.Ë0õ°sËÝ ø,4¨Ë÷Õ' ‰ÉÖ¨¥E-ÒwÖÉè¾âT*às<¶œ1ØúôñQÇ*´±UÕX?cFœ©´½œ-%'{¯M¬}kÿ•ÿ‚KþÑŸ·‡íMðûãÂ|ð߆ü7û5ü#øm{iñÄž9Ò5æ×4y|Wâk«Û+O ü5ñ„ºcXøËJŽÚâ]ZÒñ¯-¯ãk(;KÙ)áÿƒrÿm¸ñŸ‰ÿ²¯‚|>ð'ìçáoøÁº ’Í-Ÿ…üáŸèŸÚ×z¦»%›ëzÍö¥_Ö5Û/xúuiWœòYס°£^Y>Ö¥ þÏÛB•W.zp­ì©{XÂQU=>kòFÙ. É5b§'8,]E ¸_‘Î)(ÉÇš\­§ngmÏãŽ?ø7«öÏEQÿ /ö^\Âø×â© Âü«ÿI2¼`|ªU¨ڱڇþ ñý³#`Íñ+öa$pxÓâ§È0A!áJ Íœw«(##˜ä‡û¢¯þ#ïˆv·Ör«Ø®—ÿ'rd)YSÅáLü­Ó[Yo;ŸË7ÅŸø#ïüƒã°ø\>,ütý™üUÿ _àÿþü3 «x¯DøKðåuàï á¯ÙóC]_ûêú™þÜ×—Sñ& n7jzÍØŠÑ,üà€ß¶(?fŽ1ÀñÅ c¦> Û==06…þ¼h¬hxëǘhF–y- Pæä¥G'ÃÒ¥i9Ë–œ%GšnS•’¼¤äîõ*\’NNu2¤åniORR•’мšmÙE%vì•‘ü¿øþ ÿøwð«ã/Á |pý›4o…ß´ øx~.ø^=WÅZ‡ü%§áG‰®|_àý³©ü¹×ô&еûÛ«æ>Õt3©‰ ¦®u =m-,¼ÈÁÿk±ø¸¿³ná/ø˜HåOñgLqÓ Æß“Ëþ³h©§ãŸÒj´ªdÔêbjªø‰Ã(ÃÂuë*4pê­iFJUj¬>…RnSThQ¦¤¡J $¸'$š‚’ÆJ4¢áN/6©ÁÎu š|u*Nn1²sœä×4¤ßòyoÿ&ý®! ·Ä/Ù¼ÊA.ø–Á0­ðwæ9 à2 )ÁI<©`؇þkûYFªÄÙÛ€¼/‹~#áp»~F;Iû‹Î6…QCýUÑW/<@•¯‰Êô¶Ùe.Ÿöÿ’ÚÞD¾È[MÓÄÝ$¯õ‰tÛìŸÊâÁÿk?òP?g~„gþ¿ˆäŒ¨Sÿ ˆ ú!Jà…Ù­mÿJýª¡#w?g rx«â! ³)Ý‘ðŽ2IdŠ~PÀ¶ŸÔm?ü@’Iâ2½6ÿ„Ê_ü´è²¬éâð¢WÿÒOåýàŠµ8ëãßÙû·OüDÈûŸõIÇ.1Ðc¨Žý¿üsö£„©oüùv—Å?OÙ_„êI”©f8(1µ¼™-ÿ{¿j¿‹ú×À/Ùëâ—Æ?iz^·¬|?ðüZíž“¬ý¬iº†ÍWOµ¸µ¹{í®¢ómngXgŠSä\yS<71ÆöòþS|Jÿ‚¶Gðƒâ7þüEý¢¿àŸ>øƒð»ÆÞ*øuã¯ÿcÿÁGuoì?ø']¿ð׉ôí]ö,ÔôMOû3[Ó/¬¿´4}KPÒ¯|´é÷×v’C<ž®S⯋9ë«O%ÁC5§Zž]TÆT¥ÒŒêG ’„$ß*”ÒNZ't­Ë‰á.ÁÆ?[­,4&ùa,F>4TšÕ¨Ê§-ÚZÙ6ÒÖÛ?§ü«öUQÿ ÏÀTÀ"x£âÕÁw ?‚¨ùWh_Ýù6aÿ‚8~Óq°'Ç?A|QãâÉ” Jƒð±rCˆB»R¹S ÿÃì<ÿGEÿùÿÂ_þ eÿÐ=]·Ã_ø+dþ#xá/ïÚ+þ óâˆ?|má_‡^ðÿö?üwIþÜñµÛ xcGþÕ×?bÍ3DÓ?´õ½NÆËûCXÔ´ý*ËÏûN¡}iiÓÇëOŒüu¥Nu*pÞaN•(Ê¥J“á|!Nç9ÎXuÆ1å)4£Ûi&rC‡ø!µf%)5›P”¤äÒQK¶ÛvInôKcÇ¡ÿ‚?þÒ±‘Ÿ| Î|Mã²ë•P@ÿ‹\™ù†G+µcE@Š#X-§üö’\ã_Ã8%ñæ>ð9ÿ’dÈ€Ü0~Oîgü(¿ø*·ý?àŸ?øv?hïþq”‹ÿ‚«Ðþ óÿ‡cöŽÿç_3ÿ›Ä?úÊ¿ðßJÝ:si·CÐ\ ÃÉÝSÅßÏ7Û¼_ô½ÄKø$í7xÓàžTx—Ç._øV(_*0wóGb/³i'ü{ö‰P£þ‚ŠñŽÌnáHøl„íÈü™§aö§þ_ü[þ€ðOŸü;´wÿ8Ê?áEÿÁU¿èÿùÿñûGóŒ¥ÿ“Ä=þ±•Þ÷¿ö}%ùI_çwæ'ÀÜ:ÝÝ<]ï÷™~\¶ëÓ³·Kþ0Áÿ¥ý¡£ucãƒ)ÎWÄ~68àü7RN@#kÆT.‘Œm¬ðK?Ú%Ú|]ðp8_øÌû´R>GÀa…ù@TUvGìOü(¿ø*·ý?àŸ?øv?hïþq”‹ÿ‚«Ðþ óÿ‡cöŽÿçRücñ Ùî¯âL²?ó%®F1Äócaíg©ì=ñaûáØÚp5o•\`cÁèˆDÆ>U^û«þ_ü[þ€ðOŸü;´wÿ8Ê?áEÿÁU¿èÿùÿñûGóŒ©~,ñãÞ¶Yºî4ºÛß×ÉY¾áÖïìñwÓþbeåýßë[t>OØâª‘áévö·ˆŽÜ‚ øC“ÈΟ”to-¡×·ýŒþ'Ä:߀3Ïκ¦¾YAXFÁ Gò,ƒÈG#d6ÿeÿ‹ÿ‚«Ðþ óÿ‡cöŽÿçGü(¿ø*·ý?àŸ?øv?hïþq”?xòVN¾Xí·û /Ò_ðð/µgOÓþbe}’ÝFû~Z}“ãñû|Lÿ‰ç;ÿM¸#œøXä䃞Ç8+¥oû#|F„‚ÚÏ‚p¬UuMl‰‘÷|(¡ÙaUâ”®-Í—Õßð¢ÿàªßôÿ‚|ÿáØý£¿ùÆQÿ /þ ­ÿ@ø'ÏþÚ;ÿœe/øŠüwk{l²ßöKËûßÒvÚÖ?Ô^µ½ž.ßö//îß¿ãä|Åì¥ñ UAÕ¼¸P0ºŽ·…¢í\xf?—åÀáxUÂ…KpþË?#ufÕüv‘‚5k*0üãþµf`YH"HØm;71ÉÒ_ð¢ÿàªßôÿ‚|ÿáØý£¿ùÆQÿ /þ ­ÿ@ø'ÏþÚ;ÿœeOüE^:³^Û-×GþÅO]·÷¼¿­¸‡"šTñzï|L¯­¯¯-ÿ§äx?³?Ž£ÀþÓðˆÇ9þÐÕ˜ƒˆ2<7ÊLg´(H•Eµ¥ý›¼p:§„úc‹í[åÆüHÆ1‘·Ü¿áEÿÁU¿èÿùÿñûGóŒ£þ_ü[þ€ðOŸü;´wÿ8ÊKÅ>9Výö[§ýASÿäºõ·ÊÚàNNþËû –›wúw}ƒözñ”@gQðÇÊĨ[íLûÕl¶tvŽFÔ;ãBbØÙi¯Àùˆxh}/5.8_Mr9éÐchÓáEÿÁU¿èÿùÿñûGóŒ£þ_ü[þ€ðOŸü;´wÿ8ÊŸøŠáÖÓtñ}ÿÞefôÕ®[tèº?+ùì¼WɾðáåpâïQ/ ˰Ü:Hœ.T¤‚mõ£ø;âdU }¡¡pÍî  ·G@TmÈùW|¡ËXzÏøQðUoúÁ>ðì~Ñßüã(ÿ…ÿVÿ üçÿÇíÿÎ2¥ø¡ÆòÕÖ˯ßêTü¿½ä¿| Ãzx¿ü)——N[}ݽ/ͯÂ??Ót!ÇAs|@ÿÊ`ü8€F0»umþkÑ›yn#¸¹;rÊÙñ*ŒeÀÚûDx6¢Ý,ïÿ‹ÿ‚«Ðþ óÿ‡cöŽÿç]¯Ãÿ„¶æ‰âAwûFÛ~ÊÚOÃÑ¡øªX›àŸ‹~-ø³Æw¾$Ó|1«ëZ%ŒxëÀ>Ðô­ ÛK¸¹Õ5UºÖoÙmaÒ-4hάúö†¥â‡(ÞU²ëGþ ©ùtæïþ[h?õ‡d­ìñzÙ¼ËËû¶è¾ïKñKðïZòó¥}D÷Yè2?ä8$~¸B\ƒÀzÄL O¥¤>lçn ÅNŸ—l°<ºð¸VWÉoôe¢ÿbêÚÆ±mª^ý‹TÐôÛ{}7S´Òÿä)i¯ÝM4Ó]húÇ™åÿcÅqÇ?ë¤f‘¶ªÑö¿ÿÐÅøWé?üÃ×2ñ_‹ì¯ˆË—2ÙàbÝ“¶­7ü¶ßnƒÿP¸zÎ>ËÖßï2òþê[>Û]mdx’xGQX™l ,¸ ?†ÉŽ;"ÕQ±bùÓÆÿ²÷Äÿx£Uñ=Çí‡ûOxpj/kŸ‡|â߆z†×à¿úx£ÿ ý'ÿ˜zù«ÄQjüÐ|4Ö£û?xÿã·®júÐÖu{_DøðÛÁ~Ò´´²Ò4-3M·²ñ‰o5—»‡XºÕ®®41c.‡~šÿ˜qþy›Ò…,Æ–Q§Br­Nòõ% ´£)GÞŽ®*Îîí6u`¸C+ËjN®¶c„XÆIQŸ¹EIJ1~ãÑIßåÚÇÍß±'޵;+Í7Rý´kCNÔ-n,oì/¼}ðÖîÊúÊî'‚êÎòÖ‚RAsks’Cqo4oÑ;Ç"23)ü¼ÿ‚Ê|7±øAû0þÈÿ t›«»íÀZÅ߃ô[½Fxnu;#Âß|;áý:}RâÚÇLµ›Rš×LŽ[Ùm4û;Y.Þ [xÙaúG¯À?ø/¯ü’¿ÙïþÊ‹ÿõ±¯'ý`ÄâiOY„£‰”%Yàðj…JžÁJtÓŸ<Ÿ*–­[VÙéÒÊ(ѯK,V?V„jF’Åb}¬!ícM¨òGW•ï¡ýx¿þBÖŸö+øÿP¿×/]G‹ÿä-iÿb¿ÿõ ðýrõósøåþ)~lõã²ô_QE#?|UûOücÒ?lÓ>6|loøWß¶¿ì™ð+Áu_€¾´ýŽ&ø9ñ‡áoìY¨|S»ñçíKqû=XÂ?ñ²ÛþŸÆ|&ð6¯ûaøSÅ>0ø¥ið[áׇ~üAÿ„ãÂÿ ¾&ýCñÛöùøIà?ÙËÄ¿¯×ãg†4MOÆß¶ßÁ |?ðïà Oâ7…¹ßiûüK½øP|U¦ø“JÖõÝOáÝ·ü¦hš·Š Ð;mWö!ð¶·ñÇŸµ?Œ¿.¼ñ7ãgÂoÚ+Æÿ³®ÿƒüÖþ1ü ð·Áoü,ñ‡öÝ¿ÁÈ¿h-7þ}[öxø=ãŸøGô޶ÖüSàÿ²x‹DÕüâx?[òï‹ðKÏ‚ßañ‹â_ŠŸ´6™àW[ý¦|Kᯅ¾ñÇ„ô߇ÿ|Gûc|*ý >~Ò ðþ—sðÿPÔüW­üAÔÿiˆ4­Wâþ³ñ:ÿáOŽ à´ÿ> ëž=øQã=¯MòßK%{-í5²»æ×[éy¶’Zþ=o嶯¥ûkÒÇËßÿà¡ß|)û~Úw^ðÇÅŠ¿´WÁþ Cãñ÷€ô_€:o‡?fï‡ÿjÛoàÏì±ãïˆZoÅŸ|7ÓøOñGã·ÅOˆ'üaáÿ…ÿ føU¥øŒü?økàmÇþ>½×þ8|Qø3ðÚÛDð·ˆþ)|0ðõÎŽÖåø¯ð+âu¿„ôOx»öªøó§xXø]kàxåmw{}Ûþ6ë÷õ?5ÿdø)÷…¯~ |1¾øñ«|lñ§Œeý—¬ÿh¯Ú+â½÷ƒ~iÿ >è_¿`ØOöøÝã ?Eø}qáoˆ:ׂ|AwûZøPÑü?á‡_~#IñoÆßt}3DðïÁ ø8h^Ùð¯þ Çû=üjÒµ+?…Þñ·Ä‹øÛÂð÷Ào‡_?dߊ¾2ñž«ãüXø‰¡M£üQøQûLøçöWÐsà?€|Y¨h_?høËLÒ¾_%÷†!Ô> |±ø›µðÇþ Yû2|4Ñ5 5ÿÅxG]ýž|iû0x›Ã3ñV‘ ‡‰>|@ýžbŸÙ“Åvš†¡à ø+Äv:Þ¥ðÛöøS"k>×4Y¬|Gâωš¥„vÖú§„4ÿz÷ìcs®éZ}ç‹ÿj¯Ú‡Æ_<-ãmÇ_ ~<뺇À{|$ÕtüEøvað/ÂïüÐewþÚðÆOŒñ>»ã/ÙãÅÞ2ñ.•ãè_Zñ=æ¡ðÃàm÷ÂÆÝ'{'wê’wì–Ý%fšV廸—6šÿZuÞûÛ3Ë›öþ¿Ñ¾0üMðß‹þ üQÐ<á?Ùçö[ñ®‹¤j>ðæ…ñV×öý¡jOÚöVÑ¿gÛëÿ¬¼9©ë>$ü=ð?‡> |Cð ½ý›.¡¶ñ·Äÿ~Òüñ?Âÿë'‹?à§ ü ‹m|[ð7ö†Ñ|]ð·áwíOñkã§€^ÓàmÿˆþøsöOøUðOã7Šì¼g©i?ux¯[øƒàoÚGà-çÃ;oƒ1ø©a5ÿÄÛ ;â¥ðòãÂßǃ}GXý…¾ëö××ÇÄš§Œu¿ü:ðÿŠ~#ë/еÿx£Ç_þøSBøwðLðoˆ´-Q±øáoÅ~9ñÄËT½›{yZítI]·d›»oü=9†ïÓúÕ~—·ü1õç€>-xsâ?‹>8x;C²Öíu?€_tŸ„¾1ŸU¶°‚ÃRñ³ð[áÇk[ß Ki©_\^h‘øGãW…´éîuK]ý|Gaâ HôÙtË];WÕ}F¾yý–¿gëÙ§à·ƒ~Éâ­oâ_ŽmtOÜü^ø×ã ïë?>;üU±ðŸ‡¼/âo‹^>×|eâŸx»QÖüCoá½.ÃGÓuÏø’xFð—Ã/ ^ÚøÁÒ4ß¡«7k»mß¿Ÿ•Þ¶è3âø)ü˜Ïí%ÿdýÿôõ¤Wó©ÿ>øið[ãgíªü3×4/Š?Æí;áüÃãGƒ¾*é_<(ß ô¿~ÎßðPoø+_íuàü»øG?‹¼K­øÖßáWŠ|´¿ÚÂ6›Æžñ,žñ*x#QðïŽÿ¦?Ûgá·Žþ0þÊÿþü1ð¾©ã?xãÃ6Þð·†tx’KýWT½×4•Ž%y¤†ÖÒÖÖK½GS¿¸µÓ4:ÞëSÕ/,ôëK›¨«|oÿ‚'üøù7Åí/Æ?¶wü;MøWñ§â‡þ-x§özð×Å«›?ÙæÃľ*jßuË/ü&Õ>k>µÑ-~$k7^)Ò­µõ[ø5¸à×.õ+íydÕeýk®'Êøc‹ÅfXºØ7*”¥†­B5ç8Tއu} 1Áâá_ꘇ.1S–¼ã ¹/šâL»˜Ñ¥KJl¦ªBnšR‹©F|¼ÓÖŸ?²pö´ïR“’œ’Iÿ ¾ÿ‚yxsÁþ4ÿ‚jš‰ÿhoxGö^ý¡¿l¯ÙoàÿÄZ°Ð!ñÿ‡>þÃÿðS‹>7ðo‹¼Ygà›]3ÅZÞ©¦~Ο<-ñÃÞ“Ãö¿ þ2xËDÕü=§ÛüC𞥡þ»~È_ > |-ÿƒ…|®ëzÅüný¤hoø)ÿÆxÃJø‘áO |+øgáÍ ãüàׂ"ü:ý»à­?òZìþ?øëÀº·Æý_þÏÆŸˆßÛº6¹â}Kã_†4?ü,oøXߨV:?Ä‹ÍbûûwÅú™§êÏú™¡ýS<ñ7‡³\eJYþ.µL^CÉãIà±xe/­eË êT¯MÊnÅž>¶_¹¯8Ï7 ªHù¼ã°Õ°òX*P,u[—¶¥U¯g]TåŒ%dš¥)P„׿¸ÔŠ”ã~êQ\¿ü%úOüúx£ÿò‚øKôŸùôñGþþ4ÿå7sÃù£ÿ/ó?B³ìÿ¯øu÷EËÿÂ_¤ÿϧŠ?ð‡ñ§ÿ((ÿ„¿IÿŸOáãOþPQÏæþ¿Ì,û?ëþ}çQErÿð—é?óéâü!üiÿÊ ?á/ÒçÓÅøCøÓÿ”sÃù£ÿ/ó >Ïúÿ‡_yÔQ\¿ü%úOüúx£ÿò‚øKôŸùôñGþþ4ÿåðþhÿàKüÂϳþ¿á×ÞuW/ÿ ~“ÿ>ž(ÿÂÆŸü £þý'þ}Ïúÿ‡_yÔQ\¿ü%úOüúx£ÿò‚øKôŸùôñGþþ4ÿåðþhÿàKüÂϳþ¿á×ÞuW/ÿ ~“ÿ>ž(ÿÂÆŸü £þý'þ}Ïúÿ‡_yÔQ\¿ü%úOüúx£ÿò‚øKôŸùôñGþþ4ÿåðþhÿàKüÂϳþ¿á×ÞuW/ÿ ~“ÿ>ž(ÿÂÆŸü £þý'þ}ñ…¤ƒÄº^‡â½;Lñ¦ˆºg‰u¨<5ãMwÖ¾#¶ðÿŒmt¨|]á? kš7ã& Ôd×+Õ&þÔ–ï×ô‰íUñ¥ÿ)"ðoý™Ä¿ý_ «Ö|%âïÙïÁ_dþÇøÙ£^}Á> ð?ð–þÑ:ç·è^þÞþ¿»ÿ„ëâˆþßãkÿøHõøM~%ß}£â7ÄŸ³è?ð±|UâŸøE¼1ýá)ðÇ‹¿à¢¾Ô¼)â=Äút±_Äû¯ü=«éúÕ”7±|søA<–rÝi·0Gu6Ó=»È%H® ‘$±³\#%íRKÙËVšì ­5[¯Í~Wàü×þI_ì÷ÿeÅÿúŽX×ïå~ÿÁ}ä•þÏöP<_ÿ¨åVýâŸý¿ÿ¤HSø_ËóGôIâÿù ZدàýBü?\½u/ÿµ§ýŠþÿÔ/ÃõËÖ3øåþ)~lqÙz/È(¢Š‘…Q@Q@Q@Q@Q@ÈxûÇÞø_á oǾ=Öíü7á ÛÃw®ë·pÝÏk¦ZOwod—7)eoup¶ëqu Í2ÂÑÛFÍqpÑ[Å,©ò‡ü<öÿ£’øÿ}ë_ü¨ª9É^0œ•íxŵ~×IëªÒÝ¥ó>Þ¢¾!ÿ‡‘þÃ?ôr_ÿï½kÿ•ÃÈÿaŸú9/‡ÿ÷ÞµÿÊŠ¯cWþ}TÿÀ%þAuÝ}èûzŠø‡þGû ÿÑÉ|?ÿ¾õ¯þTQÿ#ý†èä¾ÿßz×ÿ*(ö5çÕOü_ä]×Þ·¨¯ˆáä°Ïý—ÃÿûïZÿåEðò?ØgþŽKáÿý÷­ò¢cWþ}TÿÀ%þAuÝ}èûzŠø‡þGû ÿÑÉ|?ÿ¾õ¯þTQÿ#ý†èä¾ÿßz×ÿ*(ö5çÕOü_ä]×Þ·¨¯ˆáä°Ïý—ÃÿûïZÿåEðò?ØgþŽKáÿý÷­ò¢cWþ}TÿÀ%þAuÝ}èûzŠø‡þGû ÿÑÉ|?ÿ¾õ¯þTQÿ#ý†èä¾ÿßz×ÿ*(ö5çÕOü_ä]×Þ·¨¯ˆáä°Ïý—ÃÿûïZÿåEðò?ØgþŽKáÿý÷­ò¢cWþ}TÿÀ%þAuÝ}èûzŠø‡þGû ÿÑÉ|?ÿ¾õ¯þTQÿ#ý†èä¾ÿßz×ÿ*(ö5çÕOü_ä]×Þ·¨¯ˆáä°Ïý—ÃÿûïZÿåEðò?ØgþŽKáÿý÷­ò¢cWþ}TÿÀ%þAuÝ}èûzŠø‡þGû ÿÑÉ|?ÿ¾õ¯þTQÿ#ý†èä¾ÿßz×ÿ*(ö5çÕOü_ä]×Þ·¨¯ˆáä°Ïý—ÃÿûïZÿåEðò?ØgþŽKáÿý÷­ò¢cWþ}TÿÀ%þAuÝ}èûzŠø‡þGû ÿÑÉ|?ÿ¾õ¯þTQÿ#ý†èä¾ÿßz×ÿ*(ö5çÕOü_ä]×Þ·¨¯ˆáä°Ïý—ÃÿûïZÿåEðò?ØgþŽKáÿý÷­ò¢cWþ}TÿÀ%þAuÝ}èûzŠø‡þGû ÿÑÉ|?ÿ¾õ¯þTQÿ#ý†èä¾ÿßz×ÿ*(ö5çÕOü_ä]×Þ·¨¯ˆáä°Ïý—ÃÿûïZÿåEðò?ØgþŽKáÿý÷­ò¢cWþ}TÿÀ%þAuÝ}èûzŠø‡þGû ÿÑÉ|?ÿ¾õ¯þTW©üý­g?ÚÅïà/ƒ4ˆ¾-‹CÖ¼Ms£xrÛY¸–ÇÃÞ´7𯵩\˦Ce¦é¶q˜mþ×sm Æ£y§i6­>©©éöw#¥UjéÔK»„¿È.»¯½‰ñàçÂ/‹_Ùðµ~ü7ø™ÿÿÛÿ°á`øÃ3þÄþÕûö§öGü$z^¥ý›ý¥ý›§}¿ì~OÛ>Áeö3ì°y~oÿ sû"Ñ«þÎøcþó/_Tiz£«Áusgö¶²–Ö ›GXÒ4x{Ô»’Ö—W¾±ŽifŽÆíÖ8ZG ³P ¿ÿ†­ÿ?~ÿÂãÁü¿¤½¥—/=º[šÛëki½þa§—õoø‡‘òGü1Ïì‰ÿF¯û8áøeÿ̽vÞøð+áf¯sâ†?¾|9×ï4Ù´k½sÀ|á ^ëH¸º³½¸Ò®u/èÚuìúl÷ºvŸw5Œ³µ¬·V6wKm§Ð?ðˆjßó÷áü.<ÿËúóÝgÄžÐ|y¢|1¿ñƒ'œñ·Æ?†üUðãÁöx#ã¾&x'þo‰ž ñ…~xƒãÃO†~ñ·Šáð™­ÿÂÌø™ð³Á>6ûÿÅÿò´ÿ±_Àÿú…ø~¿üðö€ñg„oÿeï|ñ·Âï èŸðP߉µ¥ÿí â¯üÖþøŸáφÿà¦Þ*ýº>h¿ <'à‹~/ø¹«øÛânŸ€<¦üKð ÀZ·ãÿ_ø“[ñ7<+ð«â´5)ÞßWf•åv•ÕÚ²Ó_@[Gµ¿Êß›?W|?ªßë6Ýê>Öü'q·â]*=/ÄøræþêÃBñ«¡é~%‚O xƒÄºbèž4Ó4ëOøj ­FÛÄv¾×t«_øÂ~.‡\ð¶ÄøSâׇ>#ü*øqñ›áM–·ñ7ÀßôO…þ0ðMç‡í¬4 ýKáÿÅ9¼7u¦xú};â6¥à{;Dð÷„|H¾>ñ.~ ñÂøsHÕtßxKÄ>9:Oƒµ_Ê/þÉ¿ôŒÿãMñŸñGàG¼cð»Å¿ ¯4{Ùâ?Ššíàß|EýŽÿà¡? >|>Ð~ü`øW⟿àœßþøGániû;ø'Ãþ+ø?ðOþÅðBh3|$²þÖÕd¯ø)·Ä·Œ¼©éúÔݧ‚~(èšO‚¿iû³¯Zx[Æ_?·|%'‹|Ç}Ä~ð¡É }õº¶Ö³“Oí_Mû1¦ßKiþ_æþã÷#àů|}ø-ðƒã·ƒ¬µ½7Â?¾xâ×…´ïÛXYøŽÃßü'¤øÇC²ñ¦—©k:e®·k¦k6°j¶Úv¯ªØAñZjWÖëÔ§>-xsÁþ#´ð Zß‹~*k¿ ¾*|Zð?Âÿ [XCâ?øsàíÿÃÍÅö^×üW©x_á¶•­ŸüZømáí*ÛÇ^;ð}…íÿ‹ ½}JÛAѼM¬è€??ažø'û5é^ý‹á–üMû=|ý•¦ý§|+«û/xkUý·þ<~ϵì#û@ÛøŸÃßþ-x×Ã?¼m¡xgöfý¦ü5à_~ÔÞ øCs§xËö‘Р‡]Ѽ3ñãOŠ| ·ñ¯ö(ý©>:øƒöÑøÓâoÙsD³ñOƯ…ßðPÿüð-ïÄ/ƒÞ.ñÇ€¼GûLÁ;?`ƒ¿~!j^#Ô5Í'Â> Öõ Ù_â÷ìóñi|â¯_ø+âÅKmÂÚßÅOÙ«Tñ?íÙÙûë—Þ¶±éðý­S½îžË£zvZk§éºý{Ñ¥üó~ÑŸ±íãï ~Ò>ð/ìã³ö‚ñoüøËàŸìÕw£}ŸÄÚ¿ðœ~ѺWŽ¿jŸø_ÿ¼oý§­ê¾6ñ—ÆÏx'Uýž?áiüuøý«ã¯Œ?Ù^ÿ„—Ç>2Õ¼yý‹Jêi»^ÊÝÒþg½î´½“ºL>Vÿ†_Öýlñ·Æý+Á¿þ|ƒÁ¾6ñ‡¾&ø'Ç_ttðÀðl:V•à߆_ÿg¯†~>Ö5ÝCž2ð¯•ÿßü4w†¼q6Ÿ¥C«êº¯ƒ|㨼?c«øÚø3Æ^×_͇‡?a–Þ5ý–eÒ¿bßøA¾(üðOÀ_ ~×_µ?ö¯ì½eÿ ‰ñoÀßðPßø%ÏÆÏˆ¿á-ð·Å­Sã¿Åoí¯ ~Í´§Æ¯øK?hoøâ~µý»äßør?Š>9½ð›âOÿÃøÍoð«ö7ð]çÂߊ:]ÇÃÏØ7öløGáO~ÏÚ¿ìáûÙöÄÑfø‰âOÚ?ã_о'þП ~-xçà&·ãßøïῈ¯¿ioø'žñãÖ½â?…¾)øƒâ Åþ.ð/ÀC¯_³…—ï"ž©í®úé-:Y}îú ï·oý·üßÜFŸþ"ø7àÿßüZø‹¬Â;ðûáw‚|UñÇ^ þÏÕuoì/ø'B¿ñ/‰õì­ ÇSÖõ?ìÍL¾½þÏÑôÝCU½ò>ͧØÝÝË vÕømãÏØ£âÄ_~ן [ö\Ñ-¿h¯º'íÿ¡Gÿ ñ/Ä/øWÞ1øgûIX|z°ýþxƒÄ_õÏ~Ô¿4O„þ ø™ð;áV«ð_ãÁïü øqað^ü0ñŠ5€Ÿ³}Ÿvî¿e_]ücÓuï þÈ¿ð‚x›QøÙûüIýŸ>?ù¿³–—ÿ ;û$üð·ì¹gñ«öþÙð·ÄÍOâçÿøIôÿ„ß´ç‚¿áT~Ëþø•û0ø¯þ[ìš¿ÄX¼3ñã6§áYäó«ëü¶éoµ~­÷²øodÝü»~Ÿ×UçÛöºŠþrÿfÿÙ‚ÿÚßì«û"xBÓáw‡¼]á/Ùþ £ªþÛ¾ð޳áËûÿÙâ¯üÃö‡ð÷í‹cá¯h £ñ/‡ü`ý¡ü3âwÞxAÿ£JSŠ‹ÒW¾Ú[M,÷{»ÛÉ&®šcZùÿÁHÿäÆi/û'ïÿ§­"¾ÿý®ÿà þ øâ ü+øwˆüCø5ðïNý¥¿j€_ ¼g |PøñðóÂMð;àçÆ oß$ø‡à|Wø­áoK?о ø’ãÁ'ðßÄŸé>9øþ Gÿ&3ûIÙ?ý=iöÿÆOØ⟎þ)ø×Wø{ûAü?ðGÁ/µÿì{ûk|tø}ã/Ùûľ)ëÿdOþÊZFðŸã‰ûC|0ð—Ã_‡þ6ð—ìcðwDÔ´¯| øÃâ=Äz¯Ä¿Úø®ûLñ…¼àOGü)×Çÿ¤ÀÊ{¯OÕœÿ‹?ଳÇ?e|dÑþ#øöƒø‰àߨƒYý«ô¿øDþü[øð—ãˆ<;û*ÜþÖ6? <3ã/hü7ðsãįƒvq|sÑ¿eøÿÇŸµÃßÙãZ¶øÃâx£áÞ‘yã[ïÓÿ ø›Nñ§…|3ãÛÄzG‹7´ÿ‘/Äö4xCÿM>8®^º‹OùüAÿcG„?ôÓãŠóÍVÃá¨ô=+DÔtË­nxÉÿ ×…|áÍþ ðUý÷ü"^?×|köˆ×ÿÛßð±|+iý±ðÓÀ?lðO…¾ÏáøB¼7Ø5ßlkßÛ¿ >Â9§ÿÂUò¾¥ÿ)"ðoý™Ä¿ý_ ª©ý¿ú÷/>Ýíóæ·«ðþ ëÿ$¯ö{ÿ²âÿýG,k÷ò¿ÿ྿òJÿg¿û(/ÿÔrÆ´Âÿ¼Sÿ·ÿô‰  ù~hþ‰<_ÿ!kOûüÿ¨_‡ë—®£Åÿò´ÿ±_Àÿú…ø~¹zÆ¿Å/ÍŽ;/EùQR0¢Š(¢Š(¢Š(¢Š(¢Š(Ä~ð‡´k¿ x÷ÂzŽ|%©µ©Ö|%âh®î|=®Åeyo¨ÛYëVVw–2j:oÛm-¦»Òî'm;T†&Óõk[í.æòÆãÛ?ákëÿóíÿ—_įþn«Ë諌çh»+ÞÖO];§Ù Ëë{þhõøZúÿüûå×ñ+ÿ›ª?ákëÿóíÿ—_įþn«Ëè§íj7áò .ßÖŸäPÿ…¯¯ÿÏ·þ]¿ùº£þ¾¿ÿ>ßùuüJÿæê¼¾Š=­Oæü#þAeÛúÓü‘êðµõÿùöÿ˯âWÿ7TÂ××ÿçÛÿ.¿‰_üÝW—ÑGµ©üß„È,»Z’=Cþ¾¿ÿ>ßùuüJÿæêøZúÿüûå×ñ+ÿ›ªòú(öµ?›ðù—oëOòG¨Â××ÿçÛÿ.¿‰_üÝQÿ __ÿŸoüºþ%óu^_EÖ§ó~ÿ ²íýiþHõøZúÿüûå×ñ+ÿ›ª?ákëÿóíÿ—_įþn«Ëè£ÚÔþoÂ?ä]¿­?É¡ÿ __ÿŸoüºþ%óuGü-}þ}¿òëø•ÿÍÕy}{ZŸÍøGü‚Ë·õ§ù#Ô?ákëÿóíÿ—_įþn¨ÿ…¯¯ÿÏ·þ]¿ùº¯/¢kSù¿ÿYvþ´ÿ$z‡ü-}þ}¿òëø•ÿÍÕðµõÿùöÿ˯âWÿ7UåôQíj7áò .ßÖŸäPÿ…¯¯ÿÏ·þ]¿ùº£þ¾¿ÿ>ßùuüJÿæê¼¾Š=­Oæü#þAeÛúÓü‘êðµõÿùöÿ˯âWÿ7TÂ××ÿçÛÿ.¿‰_üÝW—ÑGµ©üß„È,»Z’=Cþ¾¿ÿ>ßùuüJÿæêøZúÿüûå×ñ+ÿ›ªòú(öµ?›ðù—oëOòG¨Â××ÿçÛÿ.¿‰_üÝQÿ __ÿŸoüºþ%óu^_EÖ§ó~ÿ ²íýiþHõøZúÿüûå×ñ+ÿ›ª?ákëÿóíÿ—_įþn«Ëè£ÚÔþoÂ?ä]¿­?É¡ÿ __ÿŸoüºþ%óuGü-}þ}¿òëø•ÿÍÕy}{ZŸÍøGü‚Ë·õ§ù#Ô?ákëÿóíÿ—_įþnª­çĽ^úÞh'°µ—͵Ô-c’ëZñ¾§ö_í=2÷H¹¸·¶Õü]¨X‹¡c¨]Å ÒÚMåùÌBœ|æŠ=­Oæüù’þŸ—ù#Ê~/h¿þÎ_|9ñÞ/Žßþ>øâæ±að“Ä¿ t7Bø/Âÿ²i¾$ñ—‚üb÷×W–¿ü]k}ö¯Ëo²é—ÿlM,Ú“Ggoj~Ê¢›«&š÷ÕŸ-:qvíxÅ?¹…—ŸÞÿÌ+ðþ ëÿ$¯ö{ÿ²âÿýG,k÷ò¿ÿ྿òJÿg¿û(/ÿÔrÆ´Âÿ¼Sÿ·ÿô‰  ù~hþ‰<_ÿ!kOûüÿ¨_‡ë—®£Åÿò´ÿ±_Àÿú…ø~¹zÆ¿Å/ÍŽ;/Eùø£ûD|ÿ…ÙÿøËÿYû~×ÿðŒþű‡üžŠ¿áÿ…yý³ñÓþ ÿ$ïþ13ö¢ûoü%¿Ù?ñWÈöoøF|1ÿ#7Ú?âŸòãûVüiýŒ4߈ÿ-bø]ñoÅß5»oÙ¿\øÝ¬x;Å‹ñÆ¿|!ûÿÁ9¼Iáoø(?íÇ}Ä›ÝOLýþê¼c¤~Ü´Þ»â|+ð>¥û,ø_NºÕn©®k©ÞÉ;¶”­¦Í'ݽ.·JýWh¿õ÷Ÿšó?è¯Ãoþßÿµ‡ƒt‹¾>ºÙçWð4Oø*GÇÂ0|&ø“¥øŽo‚ßðKÚm¾x§àî«ãi?h SLºø£ûEéž*ðwˆ|?ñÚÓÀš„þßø_ĶZìùñ¶ßÆz\¾?j_ø)Oí ðGWøÅ㿇 ôOþζÚ'í‡àƒÿ¼KðÓDðŸ‡4ÿÚöBý™?hÿ‹>7Ój¾›ö@ýœôMBÂkøGãÆ»£ø_Âz—ÆãÙIöÖým¬wZ­÷Ó­®]û~6ÿ4~äÑ_”^<ý§¿k…ž#øð_ñ/ìóã_ŒžÑ?gˆúÄÏüø“§CwðÿãMÿíNž)ð߀cI?iO|Iý¤~(ü,ðçì…㟉Ç…>~Ò¾ñÇŠþx‡Å¾"øoð¿Ç>ø¥ü%ý¢~†øŸñÿâ4žýíþêì¾ þØ^6мáÿˆðÞk¿´GÀùŸ³WÆ/ÚwUño†ÃZÏÀ]oãׂuí஥àëÖ^(ø?ý¡mãm âͤ–šÿ|D¹›Yë}v·5ö½­wµôz^×ð?íz+ùËýŽ¿h>øíáÙóKÓÿg–ñwÄŸÚó⿆¾2|i?|Yoâ?xsUýµàோÿü?áÛ Œé©øsDMOöDŽÛàn•âŸ|G°ø5ñ“âv»®AñbãR[I=Cágü›öÇñ_|ñ Ç_<ðûÃ?µG‚~x·ögÕ|Zß tŸøAÿá£hßÙkà/…nîü#àoÛ?ãÅÏÚÇÁ>Óÿk x÷ƾ5›á‡ì!»þ Á:îƒðëÄß´o‡Óàõ:RM¤Óµ­wfîݬŸ£vÞ˽“I§oë·ù£÷’ŠüQøßûNþÑ¿þ1Ûø·Æ¿þ üUÿ†[ýŠ?à§~6|?ø<Þ:ð_…¾1ÿ™ð·ì ñ_ῇ|EðïVøñþãf‹ÿ jÒÓHÕü[¯~Óxø9¯j~5ÐtÏÃEGáï…¾£©~Óßµ‡€ÿjOƒÿ²Œ|Kû<ø¿ÅÞ2ø£ð'VñOÅ¿ |ø“àIð[â—Áïø(gÄ}sÀøWª~Òž>ÔôŠ6:Ÿìua¥|_Ô~*øƒÂqØ|^ƒíï.>I/³vNêÖrë²m7·k>ú­.‹ÿ—ÍÛüÏÕÚ+óËöý­>#~Ô;ÿá0Ñ|gÿ·ì½û%kÿ¿á ÓuÛøW?¶Ÿ¿ávÿÃXþÌÞ-þÔñ'ˆ?áñ·ÀOøDþÿo|ñ'Ùþ+ü-ÿ„úÓþLןð•xgìß¡µ‹‹iî¿Uqî|‹ûzxÃÅ?ÿdŽþ4ðN½ªx_Å~ð|z®…¯è×rÙjZeý¾·¤˜ç¶¸ˆ†RñMn†æÞIm®#– dþ¤ÿ‡Vi¿ô~ðPoü:¿ú«ãø)ü˜Ïí%ÿdýÿôõ¤Q¬ø³Ç#ý¿k­ᇉ¿mýwö–ðüö"ðŸÃm/FÖm­Sö%ð_ì{yû:Á7üuû\xgÅ–3\ÏÿÔðçˆ.¾ xÓö¶ñ¶ñ:+?ŽsøãÅžñ›føÓ¯| ¼ºô°Q‹¥&â›ötŸÙ‡s)·u¯O×þûª<'ÿÑðç<+áŸèÿ·?üšÏHñg‡ôoiv~,ñ?Ãÿxª×N×tëmRÆÛÄÞñ×ìÃáÏx/Ä[]E³á?ø{BñW‡5¹ÑüC£iz½åŒü:³Mÿ£ðÿ‚ƒáÓø-ÿÐõ_‹ñ´ßøcÏù¿ÿù0ú¸¯øl?øzoü8£ÿXÿ6+þ¯_ÏáoÚÿöpøåâï|ð_íñßLøkû_üEøð«á?Å/Úö€ñ>,þÉÑÿÁüEû]xoúïÄ¿Ú7żaÿ üê†Zgí¿ñkÿ|¬_éÿ²œ?­~ xrÃàe§_$?–?ø ÿ"nû¿ëþ}ÇÕðêÍ7þÃþ ÿ‡Oà·ÿCÕðêÍ7þÃþ ÿ‡Oà·ÿCÕ~h¾7ø¿àŸŠß þükøÑÿñ§ì_âOÚöziµ†ß³ßü{öbøËâÿxö/ÿ‚Áø‡â§ÃÅñ³ã§í ÿø±áý ^ø#û|CñχþüVºøá,4?IðÇÂ:ŒÿücãoÑÿ†ðÔñ|IýŠ'ñ§ü7ýî•/ÄŒÚoÃM1?ábéš=‡ìÏqûXüeÔ>xËㆻ­kø_Wø¤~ÃGÀoþÔÿ ?ஞÑ?hOxâÄ_ØwâÇ…ÿટÿh_…¿NH,ðþAwÝÿ_ðËî>¨ÿ‡Vi¿ô~ðPoü:¿ú¨ÿ‡Vi¿ô~ðPoü:¿ú«õZŠ9!ü±ÿÀWùßwýÃ/¸ü©ÿ‡Vi¿ô~ðPoü:¿ú¨ÿ‡Vi¿ô~ðPoü:¿ú«õZŠ9!ü±ÿÀWùßwýÃ/¸ü©ÿ‡Vi¿ô~ðPoü:¿ú¨ÿ‡Vi¿ô~ðPoü:¿ú«õZŠ9!ü±ÿÀWùßwýÃ/¸ü©ÿ‡Vi¿ô~ðPoü:¿ú¨ÿ‡Vi¿ô~ðPoü:¿ú«õZŠ9!ü±ÿÀWùßwýÃ/¸ü©ÿ‡Vi¿ô~ðPoü:¿ú¨ÿ‡Vi¿ô~ðPoü:¿ú«õZŠ9!ü±ÿÀWùßwýÃ/¸ü©ÿ‡Vi¿ô~ðPoü:¿ú¨ÿ‡Vi¿ô~ðPoü:¿ú«õZŠ9!ü±ÿÀWùßwýÃ/¸ü©ÿ‡Vi¿ô~ðPoü:¿ú¨ÿ‡Vi¿ô~ðPoü:¿ú«õZŠ9!ü±ÿÀWùßwýÃ/¸ü©ÿ‡Vi¿ô~ðPoü:¿ú¨ÿ‡Vi¿ô~ðPoü:¿ú«õZŠ9!ü±ÿÀWùßwýÃ/¸ü©ÿ‡Vi¿ô~ðPoü:¿ú¨ÿ‡Vi¿ô~ðPoü:¿ú«õZŠ9!ü±ÿÀWùßwýÃ/¸ü©ÿ‡Vi¿ô~ðPoü:¿ú¨ÿ‡Vi¿ô~ðPoü:¿ú«õZŠ9!ü±ÿÀWùßwýÃ/¸ü©ÿ‡Vi¿ô~ðPoü:¿ú¨ÿ‡Vi¿ô~ðPoü:¿ú«õZŠ9!ü±ÿÀWùßwýÃ/¸ü©ÿ‡Vi¿ô~ðPoü:¿ú¨ÿ‡Vi¿ô~ðPoü:¿ú«õZŠ9!ü±ÿÀWùßwýÃ/¸ü©ÿ‡Vi¿ô~ðPoü:¿ú¨ÿ‡Vi¿ô~ðPoü:¿ú«õZŠ9!ü±ÿÀWùßwýÃ/¸ü©ÿ‡Vi¿ô~ðPoü:¿ú«¡ð§ì1¤|×ÇRþÒµOÆ–}Æš=¿„þ6xûÀúïƒ,®§ð7‰uÞ¯À?ø/¯ü’¿ÙïþÊ‹ÿõ±¯ßÊüÿ‚úÿÉ+ýžÿì x¿ÿQ˼/ûÅ?ûÿH§ð¿—æè“Åÿò´ÿ±_Àÿú…ø~¹zê<_ÿ!kOûüÿ¨_‡ë—¬gñËüRüØã²ô_‘‰†¼9kâ=WÆ6¾Ñ-¼]®èžðÖ¹â˜4«|G¬øsÂwþ%Õ<-áýW\ŽÔõÃZŸÏý“öO'þÅ?/oü,ÿkšGìÕû9xþöÀ‚z'ü4?öŸü/ÿì…^ÓáyÿmÿÂEý³ÿ ‡ìz ?ð³µÿá0ñoöŸü&¿Ûoÿ„£Ä_kó¶õ?µ{]]÷zï«×[þzúåÞøð[áï‡<àïü ø]àü*Öõü/ð·ƒüá? øsῈüCaâÝ/_ñ€t=I²Ó<­ëšgüw§k¯‡­tëýNÃÆ¾-´½ž{k1Þñ^ý•~ü=ð<þø#ð›áwìõom­ø—ÆÞÖ~ ü#øEá;ÿ†ÿ|OðÿUø_uñ—Àú-瀵ŸZüQµð6³}ᘼG®xC_‡SðäÓxSÄšv»áÝG@½úŠ.û½w×}÷ï»ß»˾ |%ðçÁ‡úwÃï Þëz½¼:ß¼a¯ø“Ä·6>#ñŸÄ‰þ8ñÄÿŠ>ñÑ´ÝÖZßþ$øÃÅ~4ÕtxwÂÞÐïõÙôoøKÂ~°Ñ|9¥úRní·»Õâ´Á[Ú/à‡Ä/‚6þ)Òüßô›oÍâÝfÃRÕl³ñ7‹/¬~Asâ?Zø'Á~ðu¶³¬Ky¨Áá_ øgÃÑ\®‘ évv¿+Ñ[SÄT¥Z͹;«»´—è‰qMÝÿZŸdÂòÒ篅ÿðoãOþvtÂòÒ篅ÿðoãOþvuñ½§×+wþƒ’>õý7åoª5Ÿˆ¾ñ£á=cÄ>øo®êþñÏ‹< ªk+â=SQð_Н<+âoÞx›Âw×ß §¹ðçˆ.¼ãOø:çYÑå³Ôgð¯‹õý7åo²?áyi?ó×Âÿø7ñ§ÿ;:?áyi?ó×Âÿø7ñ§ÿ;:øÞŠ>¹[¼ð‘óûÿ¯é¿+}‘ÿ ËIÿž¾ÿÁ¿?ùÙÑÿ ËIÿž¾ÿÁ¿?ùÙׯôQõÊÝãÿ€ äŸßýMù[ìø^ZOüõð¿þ üiÿÎÎø^ZOüõð¿þ üiÿÎξ7¢®Vïü$|þÿëúoÊßdÂòÒ篅ÿðoãOþvtÂòÒ篅ÿðoãOþvuñ½}r·xÿà(9#ç÷ÿ_Ó~Vû#þ–“ÿ=|/ÿƒó³£þ–“ÿ=|/ÿƒó³¯è£ë•»ÇÿAÉ?¿úþ›ò·Ùð¼´ŸùëáüøÓÿð¼´ŸùëáüøÓÿ|oE\­Þ?ø Hùýÿ×ôß•¾Èÿ…å¤ÿÏ_ ÿà߯Ÿüìèÿ…å¤ÿÏ_ ÿà߯Ÿüìëãz(úånñÿÀPrGÏïþ¿¦ü­öGü/-'þzø_ÿþ4ÿçgGü/-'þzø_ÿþ4ÿçg_ÑG×+wþƒ’>õý7åo²?áyi?ó×Âÿø7ñ§ÿ;:?áyi?ó×Âÿø7ñ§ÿ;:øÞŠ>¹[¼ð‘óûÿ¯é¿+}‘ÿ ËIÿž¾ÿÁ¿?ùÙÑÿ ËIÿž¾ÿÁ¿?ùÙׯôQõÊÝãÿ€ äŸßýMù[ìø^ZOüõð¿þ üiÿÎιüPÑ|I¦=´—Ú ·Ù­|A,Keuâ»ë›»›ïø‹A´´Š+Ïèö±ù—ZÄ.óÏ}qG’r>_¢“ÅÕ’iò´ÿ»óèÁA.úÀþ¾oÊÞqñkãLJþ ø.85Oüeñþ§âŸiéÚ?Áß„>;ø¥{ma é>#MWR×.<)£Þé>µ†ã\Ò-láÖõ;GZ–ògЬu;m_¸Ò¾hÿ†æðçýWí½ÿˆñSÿ•uöõ’”l”¡v“Wæk«{/QÙÝ뻾ޟäþÿ#âønoѵ~Ûßø‰ß?ùW\Âÿê¿nMâf™ð“ã¿€ü! þʼ }ªü]ø9㟆–¯âKÿ‹ÿ µý?O±¾ñ.•m¥ßÜ_évڕ͵¥­ü—í“©Í%œvöë4Ÿ£´QÏ¥Ë 9EÆüÍÙ?&}_n‹¥¿TßÌ+ðþ ëÿ$¯ö{ÿ²âÿýG,k÷ò¿ÿ྿òJÿg¿û(/ÿÔrÆ´Âÿ¼Sÿ·ÿô‰  ù~hþ‰<_ÿ!kOûüÿ¨_‡ë—®£Åÿò´ÿ±_Àÿú…ø~¹zÆ¿Å/ÍŽ;/Eùðoí_ãÏÚÃÁeß | øû<øOÂ?´'ÅWà¶£mñköxø“ñcÄ~ñ…ðöý îüoe®ø;ö§ø#¦j&¡¦|Ò<mà‰ü3m§_ëZ—‹åñÎ¥o ¯„WèþП >|Fð—ÂÿÜøÛ@Öümýƒƒâ›¿„Ÿåø8º¯ŠõÛ¿ øKÃ÷íià{ñ·‹¼WoiáO xÅ¿ôOx£Å>"ðW†ô PÖüyà«|åz[[¦ì®ÚIµ®Óï°ï¿“·åþgµÑ_—¾ÿ‚¡üñŽA%½ñ´?³oˆÿeïÙÏö…øgñ€þÌßµ †•a¥|UøŸûVø7Æ~:øßâíCá²øgàOÁ;O üð?ŒüñãVŸð«Á·þ ¿ñ—ÄÈ|mâ?‡0¦µáÏPý®¿mï þÏß ÿiåðôzÝ—Æÿƒ¿³ÏÆ¯ŠŸm>(|øÓá߂߼qðßào‰~4é> ð§ÅýOÃ>øWño[‡ïüCâO‡Ÿ ~+j-¼'á_ˆ÷íi¤§Ãß_øaòNér»¿'å¿¥Õû=Âë¹÷•ðoÁoÛ“áÿ‰ÖßÃ?\üPñ_‚,><|iµñ_þ éºÏˆìeðV~Ýÿ¶÷„ÿdo‚ßuÍ=oÅŸü û<üLøÁàïh?þ4üeðæ‡¡xOÆõ¯Ž÷_<3¬Ûüø]ãxKYÒìüeñCÅ? <9â+üH“@ñtiðÿÆz†×$¹¹lîÝ–]mKõÕ¯}¼¨¯Š<=ûsþÏñ^|Dð׈þ+ÂGâo†ßð°%ñ×ÂÿørÛDøµðkY}TiŸ¾]x°ä—ò˶Ïü»j;®ç×”WÁ¾ÿ‚…ü ÖõÐ^O­ÜøsáÅ„Ÿ~øŸá„>&|t‡ö°øÍû2|0ý¦ü'­ü Óþ|;ñ5ÇÅ]nø×Åš¿ˆ¼ðz_Š^#ðw¯ŸŽÞ7_ |6ñN›¨ZvÖ_·wì·¨ëzo‡¬¾ ësêzމð—Zœ/ŸŒ+aá¹¾8þÐ÷?²ÃoøóX®ðã⎫ûEi¾!øS­üñõÿ†¾*øÄ~ ø„Þ;ðo†´Ï‡^:Ô<\òD¶ï-²Ên"æ?á ý¿ÿéÿ?ñ'?eþyõåÿðR?ù1ŸÚKþÉûÿéëH¯¨5ßÛãgÂÿÁL&×4O‡ÿtσ_µÿÀ_±ïÃÝC^ø»Žü}¬xÇöý“þ>|[øI¦|>ý™ÿdÚKão‰¿á ÓÅáÏþÅðmÅO‡±kü?ÅoìïøUßðÒß¼yâà‡>8|S²ÿ……ñÑg¯…?þ-|Fµøwñ7úøñ;QøÏðkáïÅ=SÃþðåÏü?¹¿ƒ>#øWãÃÝoNž{ˆôü+ø¯àæ‹Høðâ>‘Ä„>6¼Ñ|â¯ü3ñ7…5o|6ø_ãk¯ü;ðÁõZóïÿ&Ÿÿ$òïø/ò?$á ý¿ÿéÿ?ñ'?eþyôÂAûÿÒ5þ âN~Êüóë÷:Š>«Cþ}ÿäÓÿ䃞]ÿþGáü$·ÿý#_âþ$çì¡ÿÏ>øH?oÿúF¿ÄüIÏÙCÿž}~çQGÕhÏ¿üšüsË¿à¿Èü1ÿ„ƒöÿÿ¤kü@ÿÄœý”?ùçÑÿ íÿÿH×øÿ‰9û(óϯÜê(ú­ù÷ÿ“Oÿ’ywüù†?ð~ßÿôˆø“Ÿ²‡ÿ<ú?á ý¿ÿéÿ?ñ'?eþyõûEU¡ÿ>ÿòiÿòAÏ.ÿ‚ÿ#ðÇþÛÿþ‘¯ñÿsöPÿçŸGü$·ÿý#_âþ$çì¡ÿÏ>¿s¨£ê´?çßþM?þH9åßð_ä~ÿÂAûÿÒ5þ âN~Êüóèÿ„ƒöÿÿ¤kü@ÿÄœý”?ùç×îu}V‡üûÿɧÿÉ<»þ üÃøH?oÿúF¿ÄüIÏÙCÿž}ð~ßÿôˆø“Ÿ²‡ÿ<úý΢ªÐÿŸù4ÿù ç—Á‘øcÿ íÿÿH×øÿ‰9û(óÏ£þÛÿþ‘¯ñÿsöPÿçŸ_¹ÔQõZóïÿ&Ÿÿ$òïø/ò? á ý¿ÿéÿ?ñ'?eþyôÂAûÿÒ5þ âN~Êüóë÷:Š>«Cþ}ÿäÓÿ䃞]ÿþGáü$·ÿý#_âþ$çì¡ÿÏ>øH?oÿúF¿ÄüIÏÙCÿž}~çQGÕhÏ¿üšüsË¿à¿Èü1ÿ„ƒöÿÿ¤kü@ÿÄœý”?ùçÑÿ íÿÿH×øÿ‰9û(óϯÜê(ú­ù÷ÿ“Oÿ’ywüù†?ð~ßÿôˆø“Ÿ²‡ÿ<ú?á ý¿ÿéÿ?ñ'?eþyõûEU¡ÿ>ÿòiÿòAÏ.ÿ‚ÿ#ðÇþÛÿþ‘¯ñÿsöPÿçŸGü$·ÿý#_âþ$çì¡ÿÏ>¿s¨£ê´?çßþM?þH9åßð_ä~ÿÂAûÿÒ5þ âN~Êüóë¿øi'íYâ;ã쉯|ðrh~$ÔÛÇ#øÓð_DZ\êz&ƒ¨k6>Ó|;ðËÄþ(Ö¥Ôµ°LßlÔ£Ò4M?N´Ôn¦Õ&ÔãÒ´=kö>¼¿â¿ü€-¿îkÿÕk㪊˜jƒj«}©õi0Ô¤Úתè¿ÈøËIÒt»­/RÕµmJþÂÚÂÿIÓ‘4í&ßUžyõ[}båYÖçXÑã†(cÑä ÂIÞdUš¥û'‚ÿè?âü$4Ÿþn(´ÿ‘/Äö4xCÿM>8®^¼Û¤£î¦Úm¶åüÒ]$–Ét4êõÙþ‰ÿ^¾‡QöOÿÐÅøHi?üÜWƒkß<1cûBxcöÑ,õíOQÖþ xÛã§âMVÏOÑl´Ë/ xßÀ> Ò´;>ÓU×çÕ®µ™ü[«ßê—…ñÏÂZÏ>xÖÏö…Ñ|3ð{ÆÞ7ðÏÇïǦEã_†ÿ4/ëºW‡uk½?ÆZ}¶§ ê¼Oíÿÿ…ç㯈~&ÿ…¥ðOAÿ„ãþºãþ¦«û(ÿÂWûcÜÿÃR~δ?ÀoøB(|ðìÁûAxÃ_tsö»ý‹~#|ÿ…ùÿ Ÿã‚~ÃSþËÖß²_Ç/øXŸµß9øs¡Âóÿ„OZøQÿ×ÇŸðƒxÚËþCâ§ü$:—‹ÿáièZ÷‘ðÿû7Ã~ÿ„kÄðœþ†ÑSÏ+ÞêëÉwæÚÖzë¯P²Ûõ~Ÿ¡ùE{ÿµðæµáÿÚoÃÞ)ø¢xÇLý õ¿x¶×ÃÞ+øKa¯xKñïø(ŸísÿðvñÂŒî-þ,ü.Ôü]ûLè ~(x;ÿ_øëáÿ€¼HÚ_Œ<©üG´“áþßÿø'ߌ¾Â㟀~=ý—¾|gðïü.R³ðGìG¥x'öUürÿ†}Øø_öxøWñÏá¯Ä?ÆÂïöYø?ª[üEøƒûJ|UÕ^óPø§¦\iòø;[øOá?‚¨TSö“×]Ýފ׷.Öì¬Zi¶Ÿv¿¡ùå¬~Ä2³ñ5÷Ä/üßñ2ÏãgïÚc¾.øÇð«JñõµÇÇöAÔ?a/‰^ ø›á¿…¾,ýŸ´Ÿø'âìútMoDð7ÃÕø7sàúÿÅ^)øg­i?¼-óÏÄ/Ø3âÃ_†ß¤ø_>·ñ£ãí ¢|2¶ðε¥i>ðþþÖ ý¬?lOÛןµ—‰müqñQ¯¤ýž~þÖ´ž®AðgFÒþ?üIÑ>ü<ðÿ…µ¯þÓ‰®x½eý“¢…RKªi[K/³ªZYÙ>—ïÝŽÝ®Ÿä.ø5ð—ß~éß¼3{­êöðë~6ñ†¿âOÜØ\øÆ>'øãÄþ(xûÄFÓt?Yk~?ø“ãøÓUÑü!áß xC¿×gѼá/ øFÃEðæ—ê4QPÝÛow«ã?ø(^«ø‹ö1øûáÿéZ–»¯ë¾´Ñ´MF±ºÕ5}gWÕ3øAñÀÞ)øiñƒPøSâÿ‚>9ø½ðçWð¯Äωÿ­ô?€Ÿ¼Wâ߃~ð×ôŸ²¾½Ónb½Ó¯.¬/!ßäÝÙ\Kks™Å'•<±ù‘Hñ>×£wFʱ{þÐßâüêßü—]T1Æ6½äå{_uü˱2Ýü­øÿ•þv(i¿ðOoø'¾‘ðëÆ_ ôý'X·ðÿÄøV“ø»]ÿ†±ý¡åø§«ëÿj‹?¶ÏïÂïŸãt¿ì> xwö§øãñKã'ü,]3ÇÖ^;ÕüGâ±k¾"Ôü?¢xwGÒ: ŸØö!ŸÂº7†­õhº¾âx˜üað·í•ûLx?ö ñ£ã-;Âz/Š­¼û]xWã¾ûQüLðþ¿¡ü:øQ jžø‰ñźðÿÁ_š1Ò>ü"³ð^wü'4ÿ¡¿Åø?Õ¿ù.øN)ü7ñßÀïüRð'Œ¼;ñ7Wñg‹¼AõÿÂÝà‡Áh_ ¾j^ðÿ„¼?ý§=µ´þ3k®±â cPñ7‹<]âïx›[Ö<[㿈;ñn±®xÛâ/Ä_kž ñßÄoøƒÄ^9ñψ¼Aâßk:Í÷ÉÿðœxÓþ†ÿàÿVÿäº?á8ñ§ý þ(ÿÁþ­ÿÉt}wû¿‡ÿnžÖž^¿‡™÷‡ü' ÿ¡¿Âÿø?Òù.øN<ÿC…ÿð¤ÿò]|ÿ Ç?èoñGþõoþK£þÐßâüêßü—G×»øöáÉçýiåëøyŸxÂqà¿úü/ÿƒý'ÿ’èÿ„ãÁô7ø_ÿúOÿ%×ÁÿðœxÓþ†ÿàÿVÿäº?á8ñ§ý þ(ÿÁþ­ÿÉt}wû¿‡ÿnžÖž^¿‡™÷‡ü' ÿ¡¿Âÿø?Òù.øN<ÿC…ÿð¤ÿò]|ÿ Ç?èoñGþõoþK£þÐßâüêßü—G×»øöáÉçýiåëøyŸxÂqà¿úü/ÿƒý'ÿ’èÿ„ãÁô7ø_ÿúOÿ%×ÁÿðœxÓþ†ÿàÿVÿäº?á8ñ§ý þ(ÿÁþ­ÿÉt}wû¿‡ÿnžÖž^¿‡™÷‡ü' ÿ¡¿Âÿø?Òù.øN<ÿC…ÿð¤ÿò]|ÿ Ç?èoñGþõoþK£þÐßâüêßü—G×»øöáÉçýiåëøyŸxÂqà¿úü/ÿƒý'ÿ’èÿ„ãÁô7ø_ÿúOÿ%×ÁÿðœxÓþ†ÿàÿVÿäº?á8ñ§ý þ(ÿÁþ­ÿÉt}wû¿‡ÿnžÖž^¿‡™÷‡ü' ÿ¡¿Âÿø?Òù.øN<ÿC…ÿð¤ÿò]|ÿ Ç?èoñGþõoþK£þÐßâüêßü—G×»øöáÉçýiåëøyŸxÂqà¿úü/ÿƒý'ÿ’èÿ„ãÁô7ø_ÿúOÿ%×ÁÿðœxÓþ†ÿàÿVÿäº?á8ñ§ý þ(ÿÁþ­ÿÉt}wû¿‡ÿnžÖž^¿‡™÷‡ü' ÿ¡¿Âÿø?Òù.øN<ÿC…ÿð¤ÿò]|ÿ Ç?èoñGþõoþK£þÐßâüêßü—G×»øöáÉçýiåëøyŸxÂqà¿úü/ÿƒý'ÿ’èÿ„ãÁô7ø_ÿúOÿ%×ÁÿðœxÓþ†ÿàÿVÿäº?á8ñ§ý þ(ÿÁþ­ÿÉt}wû¿‡ÿnžÖž^¿‡™÷‡ü' ÿ¡¿Âÿø?Òù.øN<ÿC…ÿð¤ÿò]|ÿ Ç?èoñGþõoþK£þÐßâüêßü—G×»øöáÉçýiåëøyŸxÂqà¿úü/ÿƒý'ÿ’èÿ„ãÁô7ø_ÿúOÿ%×ÁÿðœxÓþ†ÿàÿVÿäº?á8ñ§ý þ(ÿÁþ­ÿÉt}wû¿‡ÿnžÖž^¿‡™÷‡ü' ÿ¡¿Âÿø?Òù.øN<ÿC…ÿð¤ÿò]|ÿ Ç?èoñGþõoþK£þÐßâüêßü—G×»øöáÉçýiåëøyŸxÂqà¿úü/ÿƒý'ÿ’ëϾ#xÃÚ¾ ¶“®èÚ¥ÊEâÉÞßNÕ,ogHáÇãiž+iå‘bY%B¡ÈŠHgP~Pÿ„ãÆŸô7ø£ÿú·ÿ%ÔSøÇÅ×PMmsâŸÜ[\E$óëšœÐOÈc–¢’飖)cfI#udtb¬ ’*eŒæ‹.öéÙßùŸnÃP³O·ü/_À–ÓþD¿ØÑáý4øâ¼óUÒ¯õÿ ]Úx—[Эô-n}WTÒô¨<95‡,&ðçˆ48ü5âY5Ïë:®‰k©ë:wŒ`ŸÁÚ„üFÞ#ðŸ‡ín¼AsáŸø[ľuñ‡àOÃf¢|M¶ñ~§£hwój¶:G‡¾(|Pø}¦K©Ënm#Ôµk‡~1𭦿ai%Ý®y®Å©\hvúžµ%„zî°·Þÿéý’¿èIøÿ‰ûHóÛ®UìÚ4¦šM4©ÆKâ“Ѻ‘èûhÊÖïm]÷·D»>ÇÕð®»áϲl|Kñ·¾ÏàŸxVoøKl>Ùý¿]ð·ö÷öïÄ»¿øA|à­ž6ø“ý±§ÿÂkacö?‡6ð‹h?ð®¼à´xŸþ?•õ/ùIƒìÈ~%ÿêøøMGü;§öJÿ¡'âþ$Gí!ÿÏn½/á'ìðàw‹çñçÃo xƒKñ]džõ?¾«®üOø­ã¿/ÃÚÆ§ ë:¦ŸkcãïxŸM²ûn¥áæ{»;8/›û6EÈæŠV8©5)·(¸¤éÆ+[kuRVù w}ë«èïØúN¿ÿ྿òJÿg¿û(/ÿÔrÆ¿+ðþ ëÿ$¯ö{ÿ²âÿýG,jð¿ïÿíÿý"BŸÂþ_š?¢OÿÈZÓþÅÿêáúåë¨ñü…­?ìWð?þ¡~®^±ŸÇ/ñKócŽËÑ~AETŒ(®&ÿâ/ƒtψÞøK}¬y|màŸüEðLJÿ³õY´üð»]øiá¯kÚ°ØÉ¢Yak>Ygꕦ«©ÿÂEöÇP´ÒuÙôÎÚ×` (¢€ +‰¿ø‹àÝ3â7…~ßkGÄx'Çÿ|1áÿìýV_í?ü.×~xkÇZÇö¬62h–_ØZ߯‡V_Ùú†¥iªêð‘}§G±Ô-4v}3ß~ø·â¾xsQÖõ_|8Öõ xé ðWŽÞñ›àƒ__Ãú¯Ž§ðä^ƒ[¿ð7Ç߆$ðþ”§ÛRþ¾ý€(¢ŠËÖu½Úmγâ_KÐt{?'íš¶³¨Zizm¯Ú."´·ûMõôÐZÁçÝO´>l©æÜM)ºIO ÿ »àÇý߆ø_xSÿ–Õó‡üþLgö’ÿ²~ÿúzÒ*ÇÅù>ü4ÖÿnÏhÿðHÏø'G‰ÿeÏø'‡ˆ%¶øíñRÕü!៾!ð¯…d‚¶?Äýgá'À_ØkÄÿüKâ á߯x¼;à/ øÇöœøy§xçÆž’ÓÄ>,øo¡ê‹®éýx|4kAÉÉÆÒq²Iì¢ï¯©•­Òÿõýoô?ü.ïƒôW~á}áOþ[Qÿ »àÇý߆ø_xSÿ–ÕÌxÿà—¾>øuñ»Pÿ†Wÿ‚d|>øÛð‡þZÿ…/ñb?ÙçÁ_ÂÏØ×ö§øíû*ÿÃ@|K×ÿáRjÞ-ø]û?ø¿Å¿¿´üeñ[þoŒ<9ð£ûsRмßj~Î¹Ïø²Çö9³ý’üMûDøþ }ûxÆÖ¿¶þ³ûø;á—‹<ð·Á~×|Uüòçþ ­áïx›âvû9x÷WðŸ‡õM]lþ.ë:v—ð³ÆšŽ…§OsàËñͬ^$¼ßê0ÿŸ’û½£ì¿¯éÿK_Gÿ…ÝðcþŠïÃü/¼)ÿËj?áw|ÿ¢»ðÃÿ ï òÚ»ötýŽ~üñgÅßÛÛö(ÿ‚TþÉzG„üAmm¨ø—FÔþø÷àÖ“á]b è^Ö|Yñã7ì³û*[x[ÄÿµÉü+má™ü+}§<ïá“§ø³TÕüLúçÿ²Ô?ðI?ÚwáM÷Å}/öpÿ‚thZBü`øðãC]?¿³G‹4ïxVÏöÐøßû~δ­rßÂEµÏ‡ÿko|¾“à¢ÙÛÞiÞ.ñV©uðïÀ¾ ñͩߟQ‡üü—܃Ú>ËúþŸôµŸþwÁú+¿ ?ð¾ð§ÿ-¨ÿ…ÝðcþŠïÃü/¼)ÿËjõŸ|2ÿ‚4øCXøuáß|>ÿ‚dx_Ä> x»á?ÂM Ä^ý•ôMcâÅ?‡þ;ƒáo~|:Ó5+ kß|@ðOÄÛ›o‡^.ðo†`ÔüGá¿ÜAágM²ñ±éíÏø³ÃßðDxWÄÞ:ñÖ‡ÿ©ð_‚|ñƒYýž¼cãiŸ²7‡<+á?¾Ó®uüñ7ˆuˆ,ôã…¤YÞjšÏÃMRòׯš^ks}}¢Ám²©õÏÉ}È=£ì¿¯éÿK^þwÁú+¿ ?ð¾ð§ÿ-¨ÿ…ÝðcþŠïÃü/¼)ÿËjÙý“¼ÿ½ý¨>~Í>#ÿ†Jý‚<ñ·öˆý> þÙŸðÍð¯?gŸ|SðÂÏ‹~ðåÿü$_Ø?ðƒøž øáÿøƒþøY¿ð…hžÕ|Giö?+MÔî?²a÷ÿ~ÊðM_ øïá×ÃgöDý’âÅøK§ð7„ôÿÙsᦹ¬j:?€tx5Ÿx»S¶Ðþj?ðŠü?ð¯ö†|?®üEñch~Ó¼wãï…¿.|DŸ>+ü6ðÏŠ¨Ãþ~KîAíeýOúZüÏÿ »àÇý߆ø_xSÿ–ÔÂîø1ÿEwá‡þÞÿåµs"ñ?ü§Yøu7ÿf‚¿ðLÚãûö€ýŒþø×Iø§~Êþ;ÿ„þö§øeû4xsÅ>)¿ð†|wýýÿ Þ½ã]DÕ¬ôßøNÿáÕü9a«èûï5íø¬ÿðKß xKàoÄ¿‚Ÿ²¿ü#öŒøeñÇâÂÏxg_øìó¬xƒþ?íÅû)þÅ:Ï~i^øIã¿üOøð‹Ä´v«©|^ñŸã-þÏøwá¿Âk«)o~/Üø¯á¹õÏÉ}È=£ì¿¯éÿK^ŸþwÁú+¿ ?ð¾ð§ÿ-¨ÿ…ÝðcþŠïÃü/¼)ÿËjùgÄ_ÿc)5‡Z÷¿à™ŸðL3àÿÅïˆ.ðÀý¤~,þÉ?³íûo ã¸<%qã_ø'ŸÁ¾ |GøeûF|?ø¿e­x&ÿö\ñÄŸÚ_örÿ…Ñuã¿êÚå—Ãþ5ø{ñ—ÆÿÃψ_ðK߈ž;Ó´ûŸØ‹öø3ðÊßöøñ÷Çž.ý¤|/û<üñßÿøYZ?ü2‹|CðêO†%ðý—íû(øƒöñf™ûDü8Ö~)h_ð®ô{/Ú÷ökÔ¼;ñúŒ?çä¾äÑö_×ôÿ¥¯³ÿÂîø1ÿEwá‡þÞÿåµ𻾠Ñ]øaÿ…÷…?ùm^ñៀßðI?j7:?ƒ¾ Á:$ý¨?dÿÙFðŸíw©é¿³fŸáoÙÛÄ_ÅoÛ“öt—Æ÷?³ïˆn? é>±øï¬x;Äß®~ü8Ó>8š<Ÿ|añ2÷öUðOü3þ Ñyûhx/Äí¾)ø7Å:¿„<9û0hÞø9ð÷ö/ø¡­k>ý¢tŸØkÅß¼uâ WÂßðPÙŽ/Ã>"ý“>éÃÄ¿ôû¿A§|8ø}­|j>£ùù/¹´}—õý?ékô?ü.ïƒôW~á}áOþ[Qÿ »àÇý߆ø_xSÿ–ÕòÏß‹¿°‡ÆMÁ¿>ÿÁ+¿d‰?d]Oâì=ðwÆþ;ñÏ€>x_öŽðßÅ?ø(?dï| µð¯ì÷ |ñÇÃ/ü?Ð,¿n_ÙÆÇ⿌5ÚŸÀ~#ðÝÔ__Â~ CðóÀñ“ô{â?Àoø$ŸÁÏ|1ð/Å߃ðN…~6øÙâðŸÁŸ|Gøuû4xÅ_ÿ‚di~|?Ô>,|køu©øOöW°ñßÁÿ…šF¡x‹Uø—ñKÂ7VxƒáÿÃý3Ãþ(ðλ¨xËÅš~‘áË-ÄZ§s©Ee«éóÜsþð¿ücǺuÍÿÂφ¿ðN—1üñgÇí;Âÿ~üøýñ ÅŸ¼â­gÀ^'ø…ð÷á—ÁŸ øçâ'Ä¿éÿ<=­|5†o‡Þñ,ú§ÄÍ:ãáΓo}ã`š Q‡üü—܃Ú>ËúþŸôµá¿áw|ÿ¢»ðÃÿ ï òÚø]ß?è®ü0ÿÂûŸü¶¯®<'ûÿÁ9¼{á_ øëÀ¿²oìQãOøÓÃú7‹<ã üøâ? ø³Â¾#Ó­µx›Ã>!Ñü+y¤kÞ×t‹Ë=SFÖt»Ë­;TÓ®­¯¬ng¶ž)[ ÿ†ý„?èÊ?düFÿƒŸüÆQõÏÉ}È=£ì¿¯éÿK_‰ÿáw|ÿ¢»ðÃÿ ï òÚø]ß?è®ü0ÿÂûŸü¶¯¶?á€aú2Ù#ÿ¿àçÿ1”ÃþÂôe²Gþ#ÁÏþc(úŒ?çä¾äÑö_×ôÿ¥¯Äÿ𻾠Ñ]øaÿ…÷…?ùmGü.ïƒôW~á}áOþ[WÛðÀ?°‡ýGì‘ÿˆßðsÿ˜Ê?á€aú2Ù#ÿ¿àçÿ1”}Fóò_rhû/ëúÒ×âø]ß?è®ü0ÿÂûŸü¶£þwÁú+¿ ?ð¾ð§ÿ-«íø`ØCþŒ£öHÿÄoø9ÿÌeðÀ?°‡ýGì‘ÿˆßðsÿ˜Ê>£ùù/¹´}—õý?ékñ?ü.ïƒôW~á}áOþ[Qÿ »àÇý߆ø_xSÿ–ÕöÇü0ì!ÿFQû$â7üÿæ2ø`ØCþŒ£öHÿÄoø9ÿÌeQ‡üü—܃Ú>ËúþŸôµøŸþwÁú+¿ ?ð¾ð§ÿ-«g@ø—ðãÅz­¾…áoˆ ñ.·uìöº6â½ YÕn`ÓlnuMFk};N¿¹»š+ 6ÊóQ½’8Y-lm.nç1ÛÁ,‰õÿü0ì!ÿFQû$â7üÿæ2ª]~̳WÁPþ*ø7û<| øKâ}CHñ—‡ïüGðËá/€|¯^è7^ñ^£u¢]ëðþ•¨\é:†•¥ßÜi³\=œ×šm…Ô´övïÏÅËžNÖÒË«Kõ6ÚVZ´¿/ø?Ò×Àh¢ŠóÍŠ( ¿ÿ྿òJÿg¿û(/ÿÔrÆ¿+ðþ ëÿ$¯ö{ÿ²âÿýG,k£ þñOþßÿÒ$LþòüÑýx¿þBÖŸö+øÿP¿×/]G‹ÿä-iÿb¿ÿõ ðýrõŒþ9Š_›v^‹ò (¢¤gá·Å¿þÖ×Å_Œ_¶O‡>hšÆ™ð¯ö†ð/Œ¾kº§~$èÿµÆ—û<þÅ0üDøIñ_àÿ¯ÙKøâ…u¿Ú?Aøû~]þ̾.ñ?Ç [ñׄ?lÿ†>*—ZðV§à/…°ü?ùâ—Ä¿ŠVÿÿlˆ¿üûkÁñŸÁ>6ÿ‚ÔÂÿñ׉|UûcÅðÂ?³ÿÂëoø(>…ð?þo‰þ*_¯ì¥ xÛáׯ þÈz?„ÿá“ï­>7øFÛþ#ÓÇöƒ´ŸŽÛÿPµÄÍðÓáÍǃ|Oðêx&‡Þ6ÿ„ëþ?Íá] _ø»þŽ«®ë¿?á'ðÃØ6‰¯ÿÂÅÖüQâ]cÇ_Ú¶7ð—j¾"×uh]êڄת©ZñÚËGöRµï{n’²æ×}ÕµßúÓü¿âØ·íŸð±¾7ÿ¹ÿ†¡ÿ†Wÿ„'à—ü+ÿøkOøj¯øXßðÐÛ¿ábÿÃpÆIÂÿ ëþ‹û7oüYíßøI?á\Åyÿ ¢¿(¿f?üuñoìáû%üIø âÛËźbþÏ?²Æ_ÛŸÄŸu_ÛWÄ·þ0øáÚOö øŸâmGàý¤ç¿Ö>'èž)ýtÛÝüSà¯Øføã‡5ø\ðç5?þξÖ¦ªÄð׆¼9à¿xÁÞðþ‰á?øODÒ¼5áo xkJ°Ð¼9á¯hViz‡ü?¡épZéš6‰£i–¶ºv•¥iÖ¶Öu…´–Co qªU,Ûµî㻺÷S^öš·tï§¼¯äÛÉtÓªü4Øþy¼I¨j_ÿm]kã/íðÏþ Qá/Ù鵿ڿDø-yðÏÁŸ·÷†¼q¤xsÄÿ¿à×^TÓ¿bçºø©à…ßõïþÐþ>°ø{ãá‹ ˆwŒôß‹^ð_í á/ø;ÂØŸ ¼%ûxiž&ø±wñžÓö¡ðOŠüyðOÅZ÷ÇÏü!ðV£­éZŸÆø¿dø ‡‚¼Sã[=á6½à]âö6·á_ÚïA[OÙkƾý 5?øSöð—ì9âÝ㾟áë½3úO¢Ÿµµ—*Ò<º»Ù^úi¥úïv“èÕê÷¿åþ_‹?žmSágí¬h_µÇÿ [þÚþ øðïþ yðcÅŸ³—„®üQã­O]ñ—íðÛâ7üÆ¿|3¯kÖ~ð7ÅÏÚkþ^Ÿ®|<Ó<%ðKö’Ñ“Ç_þüYðUçü+ösñ?í%¬-§„xŸŒ:íùý»ûmëz/Å_Ú‡þçü!?ðQOì/†? >þר_ðª?á\þÐ6Ÿ±wü uoÚWþ‡þo#þgÄÿ†%ýá´ÿác}ƒÁÿâaÿ }ãšþ“è£Ú»ü+ðzY+jžš_½ì瑩޿տËó1<5áû øsÃþÒçÖî´Ï hšW‡ôë¯ø—Ä~4ñ͆ai?ˆ+|Vø—ûOü/ø×ðâ׉¾ø/Ç?~øWá‡ì£û(|#ðæŸmãÏøø“Àþ ðׯO‚|{á;_xŽÿNÑ ñâ›WOñN­­éºO“üHøgàOŒ~ ×~|NÓ5MoÀ>,†ÖËÅ:.­?‡oõ.ÛP´ÔdÒ—[†ÒöëNµÔd²ŽÏQ¸°ŠLiÓ]&—¨iz‹ÛjvŸWÿÂòտ篊?ðoà¿þvu݆¯N•7·w6ôMéËù¦D¢ÛÓ·ê~dþÐßðI/Š?dü øksû?øKâoÄOÚÿþ ýûKøßÅ3Íâ=GñŸü7Ïìÿÿ?øð7Vñv· |6¾ñˆ¾ x?Ãÿµßìãáoˆ·ú¾‘}ÿÿ>x‹Dð†½ã+/xHñ/Ð`oŠ~1ÿ‚üKý—áýŸþ+ø·Å_·ÿŒ¿k/øWß|Câ=;àOį…šçüûRÿ‚‚¡ø—®Ÿø•©ØÂcðJëþ¯Œ­ÿáQøûÖ¾1Ôu-/ìž*ð’mßýmÿ ËVÿž¾(ÿÁ¿‚ÿùÙÑÿ ËVÿž¾(ÿÁ¿‚ÿùÙ×G×(÷—þÉä——ßýIù_æˆ?eÿºÂ_Ùzçá¯ì¿û~Í~6ýŠÿiÿ|køAû*üøÝãKÙƒÇ>ñïìñû@üñ.Ÿ¨|WÐ?b†š¿ÀÿI«þÕ?¾+ÝZø_öWø«§x‡ÄÒ´kýVÊçâλâÿ†Ÿ0|?ÿ‚DüSñmõΫñçâ_ü*Ïø\_ðÖÞ5øù£þÌ|uñ?>xáo€¼â/†’|okÚÇ|]ªé¿,ì¾hÖß¾¶ÿ…å«Ï_àßÁüìèÿ…å«Ï_àßÁüìèúåòÿÀXrKËïþ¿¤ü¯ñOìEÿýøûû3ë²&‘ã?f Ïü ý˜>xGâf½á8üi®ë~.øûðsöGðŸì§oâ¿ xÅþ ³Ò4Œ‘gã½Fý½¼%ñ á¯>#þÈþ5¶ý‰~8~ÇÞ9¶øqðCöˆøE÷ý·ÁOx+ö Ö~;|>Ô<|9ãü^Ö<#ãOˆþðÿÃɵïý?ñ«þ ñ÷â?í¡ãOÚ3CñÁû_øöŸøcñ®ÇKÕuÿA⨼+࿊ßðoO޵M>êÆÏáýöž ¸Ò?à“?´e¾Ÿk¹>.£ãO‚Üj¶¶Þ#ñÕçÃÑoø^Z·üõñGþ üÿÎÎø^Z·üõñGþ üÿÎήQï/ü‡$¼¾ÿëúOÊÿ‘7_±gÆ„¾ø}ðkZý™?kÿˆšgÁ/‡ÿ~ü5øµû|hýu?|ZýžÿaÏŠ~0ñ×üûÅ?´ž‡û}x«àw‹|û_þÉ>-¿‹ãw‹4OÙÿÂW?³?ůŠzš¿Åm_ãoÁ-zOÙ[á/?ûIÁþ2øªŠ>ø/ñ«Ãþ2Ò<{ðâÎqã¯Ú;Ä0i~κïˆ|GðSÀš¿ü(O†ßðU¯€~)ð¡âo|ø›eðKáÿ†~ÁE<âÏ…·žøcñ;û_XøG©ü,Ô|ðûÃúö—ñHùÿáüÛö§ðÿþ|Pø‹ñ#ö×ü[ð‡ö€ñgÆ-CCð?|ð_öŸÿ…ïÿ?ý¨jŸŠW_´ÿÂ]wKñÖ§â¿øe‚_ü#ñŸþ àùþ&xþöú×~+ø£Ä_¼yá)4ÏxƒôÛþ–­ÿ=|Qÿƒÿó³£þ–­ÿ=|Qÿƒÿó³£ë”{ËÿaÉ//¿úþ“ò¿Á:ì›û}|Føuã«_Úá×ìcû@x—âì­ûGøƒãß‚¿j¿ÿáküSýŒ¿j„¿´×ÂOÙŽÏÀ~%ý‰>Ã3~Èþ¯|=ðžñ‡Ç/ü ÿ„çļWðÿö¤ý >&üuø¡ñS ð¿ì‰ûh|=ý¡üAûxø{³Š?h?Š^ øùmã¯Ù—Yý¡~+xSà×<+ñ›á'ü{á%ž³á?Ú¢ÇöPñw¾"xƒA¶ÿ‚fø;Ä·>Ö?dŸ†šuôÿ´/‰´(¼YmÀÝ/\øßö·ü/-[þzø£ÿþ ÿçgGü/-[þzø£ÿþ ÿçgG×(÷—þÃ’^_õý'åΟƒ?ðKÿ¿~ø+öLð÷‹þøóö|—ãüCã玿hMg_ñ§¾2øÅ_ðN/†°?€¬þøOöe±øã¯øËÃÿ®àž^Ô.~ ëµW€õ†P|xñ41|<ø‹'Ám-þ3ý?ñCözý©üEñOÇŸ¼9ðßö@ñ—ü5ÏìðöVý¥þ|tñçÄ_ü,ø'ÿ ŸÄ´×ˆµísÂÞ°øü7?ÃÿÿÃ]x×BÖþøÿPýˆÿá,ðç­#L¼ñׇ¿ásêÓü÷ø^Z·üõñGþ üÿÎÎø^Z·üõñGþ üÿÎήQï/ü‡$¼¾ÿëúOÊÿ™?´—ü#ö§øÝðOâ×ì±£jß³þðÊÃâü'ö…ø)ñSø‹ñ_øûâŸü_áüÀúWÂOŠ_­~ Éáÿ„?þxƒþ âgÔ>3xOã‡Çø¿Gø¡_[|ðíïÅíCJøIôÿ‹?c/¶´‰¾?øoƒþ#¹µÿ‚ë?¶÷ƒ¼âÏxÓÁpk¾ƒþ›sÿíð÷üMâmáGdðŸˆ5OÚ lõ½gQÒü9ãM;Bø5=Ï‹ìWÄ~6µ‹á…çÒÿð¼µoùëâüø/ÿð¼µoùëâüø/ÿ\£Þ_ø Iy}ÿ×ôŸ•ý'öoøÿ À𯅍x§þ/ø÷âþ1|Pñ™¢ àKÿŠõ‰¹G¼¿ð’òûÿ¯é?+ý‘E|oÿ ËVÿž¾(ÿÁ¿‚ÿùÙÑÿ ËVÿž¾(ÿÁ¿‚ÿùÙÑõÊ=åÿ€°ä——ßýIù_ìŠ+ãø^Z·üõñGþ üÿÎÎø^Z·üõñGþ üÿÎήQï/ü‡$¼¾ÿëúOÊÿdW—üWÿ·ýÍú­|u^ÿ ËVÿž¾(ÿÁ¿‚ÿùÙÖ^¯ñn}fÒ[kè5ëßô]Z+U½Ö|9ök{SCÕ4w,Z_t›«³Úê×N ècy6?("'Š£(¸§+»om` ÓO³_§õòô¿ÑEæ…Q@~ÿÁ}ä•þÏöP<_ÿ¨å~þWàü×þI_ì÷ÿeÅÿúŽX×FýâŸý¿ÿ¤H™ü/åù£ú$ñü…­?ìWð?þ¡~®^ºÿÈZÓþÅÿêáúåëürÿ¿68ì½äQEHŠ( Š( Š( Š( Š( Šù‡öÏø›âÿƒ?²ïÆOŠ^¾·Ó¼_àŸ Ç­èWwvšª]ìi‘¥Wù©ýòÿäv‡ùõÀÿÃ~Üßô‘‡ÿøƒú/ÿD5ðÁ·7ý$Gáÿþ þ‹ÿÑ GÔªÿ5?¾_ü€s®Ïðÿ3¾¢¸ø`Û›þ’#ðÿÿEÿ膣þ#öæÿ¤ˆü?ÿÄÑú!¨ú•_æ§÷ËÿuÙþæwÔWÿ ûsÒD~ÿâè¿ýÔÃ~Üßô‘‡ÿøƒú/ÿD5R«üÔþùòλ?ÃüÎúŠàá‚?noúHÃÿüAýÿ¢ø`Û›þ’#ðÿÿEÿ膣êUšŸß/þ@9×gø™ßQ\ü0GíÍÿIøÿˆ?¢ÿôCQÿ ûsÒD~ÿâè¿ýÔ}J¯óSûåÿÈ:ìÿó;ê+ÿ†ý¹¿é"?ÿñô_þˆj?á‚?noúHÃÿüAýÿ¢©Uþj|¿ùç]Ÿáþg}Ep?ðÁ·7ý$Gáÿþ þ‹ÿÑ Gü0GíÍÿIøÿˆ?¢ÿôCQõ*¿ÍOï—ÿ ë³ü?Ì郞þ#öæÿ¤ˆü?ÿÄÑú!¨ÿ†ý¹¿é"?ÿñô_þˆj>¥Wù©ýòÿäv‡ùõÀÿÃ~Üßô‘‡ÿøƒú/ÿD5ðÁ·7ý$Gáÿþ þ‹ÿÑ GÔªÿ5?¾_ü€s®Ïðÿ3¾¢¸ø`Û›þ’#ðÿÿEÿ膣þ#öæÿ¤ˆü?ÿÄÑú!¨ú•_æ§÷ËÿuÙþæwÔWÿ ûsÒD~ÿâè¿ýÔÃ~Üßô‘‡ÿøƒú/ÿD5R«üÔþùòλ?ÃüÎúŠàá‚?noúHÃÿüAýÿ¢º¿~Ê´gÂß/‰¾3þÖšÆß Åö¶Þ ðçìç£| ”ø†ëÚ¾¬ê^(‹â_¯nôÝ*M*i°ì,ty¯µÓ®.µ£¥Ùj¶¥ƒ«äåN˳—§òšm-uôÿ3NŠ(®BŠ( ¿ÿ྿òJÿg¿û(/ÿÔrÆ¿+ðþ ëÿ$¯ö{ÿ²âÿýG,k£ þñOþßÿÒ$LþòüÑýx¿þBÖŸö+øÿP¿×/]G‹ÿä-iÿb¿ÿõ ðýrõŒþ9Š_›v^‹ò üø ÿQðäþý©¾5éÿþ~Ñvþ,ýþ7ÿÁI| ðGáïÆ; wÅÿ¼9ðÃGðÚ~Îßl`×ø£àŸ|:ñׇÿ´5]'ûwÁ¾6Яü5â}ûWB¾Ó5½3ûODÔ﬿´4}KOÕl¼ÿ´é÷Ö—qC<~)û_þË> ý¯~xÓá/‰î¿°õ½OÁ?ô/‡^:ò5]Oþ¯Œ¾0~Ïÿg ïÂ1§ø‡Ã6ž1þËø}ñ³ÇV_ðŒkº”zU÷öŸÚa›LÖì´}sIppWRMÝ«¾Ékêîí{Y¤´½ì=zZ¯ÒçËÞ)ý¸hßüOðwìÙ©~Ìßçý§|mão†ÖVcûVxê_€öÿ~(ü$ý³þ&øÅZ‡Æ9ÿd;oˆ1xÚÎïöøµáícÀß³åÞ…omâ/‡Zå—ĽB][ĺ'„~BñüŽÃÁ¿´?‹þ.|Mð§Åð7€þh:W‹~xâÿˆäðçÃ¿Š¿²Þ‰ÿñ?´¯‰|áÏ´x#Â?tO\~Äþ ðD4_†ÐøÒÂ?‚ßügáÿøçáo…|7á_¼¼qÿÚø'⫟„¥x£ãfƒÿÆËo‹ž0ñu÷íûPø«ãÇ´­à?í ðoÂ_ ´ÿÚ{Xøì?h/‡ž ð–­û@øƒÇš?†ü5ñ üosyñDƒÁöÿð¹<}¬ÞzŒ°_ìŽ/ômF÷ྉ®ÜhÚ%§‡äÅzß‹üaaâ‹|9ûOø[TŸâ>—âŸkgÅMoƺgíŸûPÝ|Pñ/Ä»Oxâ׈þ1x“Æ?µ_øºÛC×4«æ¤“÷^±³µÖ·×y;^ËkÙhÛ»B÷¿¯——¯c‰ñ÷í?ñûàç¯ø‹ãÀ…Þø©·àýàÿƒ¼ñÃâïÆ¯üm¿ñ$ÚÅæ¹àÿ ]|2ýuÏÚ–÷â€<àÿüHñ‡„¼'ûøãÖŸìtÙøúóAÓ¾2ê?>(ðü?Çý ƒöýœ!ðæ« O¢üQÕµ=W[ðÿˆÅ/þÒ´ŸŠ?h} ÿ¶%Ò¼7‚¿ißü[Õ?h¯‡ú&‹£øëâN‹§xkÀ¿<;áËmâׯ]4¡¦|bøŸkâÃÃ_°ì·á-#Ãú.‹ðû[þÖô¯‹ý_â·ÆxÄþ#ðÿí7í‘á¿|Jñoˆü}ªø§âÖ·áÚTk?<+ªüPÖ|_á‹ÿ|RÐ4 ôïü[øŸáÿ¥*I?uÞë]’ŽÛßm=4wêõ¶®žšúéåëÛÐùûþ ƒã-À¿ ~#ê²÷öö‰ûPx'àïÆÙOÂÿþ6iZÇÄo|$ø©ûFþÈÿå·ø¯¦|Aøð«á÷Áï–Ÿ¶¯Áïx{áö‘ñCâ§Ã ]Ó¾ xSÄ_<¢h:üWÛ~Ð?´wÄo~ÀðS[ëíþŸíû.üý£¼â{Ÿ…_5ßè^ømû"h_´'|[ð‹âÜÞøGãmCû?Á?>j¯j¾k¾øeâmG´Õ´Ÿè^8ñ7ÐÚ'ì#û-è,–_µ»«{ oáîµá #^ø­ñ‡Å>øQÂÏŠ¾ø×àü𿉼}«øsöø]¥|IøUð³\¼ø?ðKKð¯Ø|0øoáoø7Wð€ü)¡i×Á_…KÆ«K¯èšÎ™ûEësxƒãv‡âX¦ñW‡>#ßÝ|*ð?ÁèÿŠw[Ò<ŸøL?áYx#þ* +Å>þÄÿŠ_[Ñ?´µ·ÒœRгi^îÖoªÓšÎÏ½íº³ =ÿ¥µõß§’}QítWŠ|øà_Ÿð‘¯|lÖÿá(þÈþÓÿ…ÃûJþÑ¿´?Ù¿±?´þÇÿïü/ÿŠ¿áó¿µîÿµÿáþÄÿ„ƒÊÓ?·¿´¿±4o°{]bí}.ך³û®ÿ1ŸÿÁHÿäÆi/û'ïÿ§­"¿¡êü4ý­~x¿ö€ýœþ*|ðèqx·â.ƒmáÍçÄÚÕ§‡¼=c-Ƴ¦Ks©kZÅá1Úiºm”77÷g†óQ¸†Ù­t;SÕ'³Óî^ÿákèóíÿ—_Ã_þn«ÒÁÎ1¥%'gíÙ¿³É™Í6×§ëoÕ¡Eyü-}þ}¿òëøkÿÍÕðµôùöÿ˯á¯ÿ7UÕíiÿ7á/ò"Ï·õ§ù£Ô(¯/ÿ…¯ Ï·þ] ùº£þ¾ÿ>ßùuü5ÿæêkOù¿ Yöþ´ÿ4z…åÿðµôùöÿ˯á¯ÿ7TÂ×Ð?çÛÿ.¿†¿üÝQíiÿ7á/ò >ßÖŸæP¢¼¿þ¾ÿ>ßùuü5ÿæêøZúüûå×ð×ÿ›ª=­?æü%þAgÛúÓüÑêW—ÿÂ×Ð?çÛÿ.¿†¿üÝQÿ _@ÿŸoüºþÿóuGµ§üß„¿È,ûZš=BŠòÿøZúüûå×ð×ÿ›ª?ákèóíÿ—_Ã_þn¨ö´ÿ›ð—ùŸoëOóG¨Q^_ÿ _@ÿŸoüºþÿóuGü-}þ}¿òëøkÿÍÕÖŸó~ÿ ³íýiþhõ +Ëÿákèóíÿ—_Ã_þn¨ÿ…¯ Ï·þ] ùº£ÚÓþoÂ_ä}¿­?Í¡Eyü-}þ}¿òëøkÿÍÕðµôùöÿ˯á¯ÿ7T{ZÍøKü‚Ï·õ§ù£Ô(¯/ÿ…¯ Ï·þ] ùº£þ¾ÿ>ßùuü5ÿæêkOù¿ Yöþ´ÿ4z…åÿðµôùöÿ˯á¯ÿ7TÂ×Ð?çÛÿ.¿†¿üÝQíiÿ7á/ò >ßÖŸæP¢¼¿þ¾ÿ>ßùuü5ÿæêøZúüûå×ð×ÿ›ª=­?æü%þAgÛúÓüÑêW—ÿÂ×Ð?çÛÿ.¿†¿üÝQÿ _@ÿŸoüºþÿóuGµ§üß„¿È,ûZš=BŠòÿøZúüûå×ð×ÿ›ª?ákèóíÿ—_Ã_þn¨ö´ÿ›ð—ùŸoëOóG¨Q^_ÿ _@ÿŸoüºþÿóuGü-}þ}¿òëøkÿÍÕÖŸó~ÿ ³íýiþhõ òÿŠÿò¶ÿ¹¯ÿU¯Ž¨ÿ…¯ Ï·þ] ùº®7Ç7ÒëÈqNëÕ>ž_æh¢Šñ‚Š( ¿ÿ྿òJÿg¿û(/ÿÔrÆ¿+ðþ ëÿ$¯ö{ÿ²âÿýG,k£ þñOþßÿÒ$LþòüÑýx¿þBÖŸö+øÿP¿×/]G‹ÿä-iÿb¿ÿõ ðýrõŒþ9Š_›v^‹ò (¢¤aEPEPEPEPEPEy§Æ/ŠþøðÏÅß¶¢¾Iÿ†¯Ô¿èÎÿà ßø…ÿùAGü5~¥ÿFwÿÿÄ/øÓÿÊ >¯[þ}Ëðÿ0æuýÃþ}™õµòOü5~¥ÿFwÿÿÄ/øÓÿÊ ?á«õ/ú3¿ø(7þ!ÆŸþPQõzßóî_‡ù‡4{¯ëþóìÏ­¨¯’á«õ/ú3¿ø(7þ!ÆŸþPQÿ _©ÑÿÁA¿ñ þ4ÿò‚«ÖÿŸrü?Ì9£Ý_ðÿŸf}mE|“ÿ _©ÑÿÁA¿ñ þ4ÿò‚øjýKþŒïþ ÿˆ_ñ§ÿ”}^·üû—áþaÍëúÿ‡üû3ëj+äŸøjýKþŒïþ ÿˆ_ñ§ÿ”ÃWê_ôgðPoüBÿ?ü £êõ¿çÜ¿óh÷_×ü?çÙŸ[Q_$ÿÃWê_ôgðPoüBÿ?ü £þ¿Rÿ£;ÿ‚ƒâüiÿåW­ÿ>åø˜sGºþ¿áÿ>ÌúÚŠù'þ¿Rÿ£;ÿ‚ƒâüiÿåðÕú—ýßüÿ¿ãOÿ((ú½où÷/ÃüÚ=×õÿùögÖÔWÉ?ðÕú—ýßüÿ¿ãOÿ((ÿ†¯Ô¿èÎÿà ßø…ÿùAGÕëϹ~æÑøϳ>¶¢¾Iÿ†¯Ô¿èÎÿà ßø…ÿùAGü5~¥ÿFwÿÿÄ/øÓÿÊ >¯[þ}Ëðÿ0æuýÃþ}™õµòOü5~¥ÿFwÿÿÄ/øÓÿÊ ?á«õ/ú3¿ø(7þ!ÆŸþPQõzßóî_‡ù‡4{¯ëþóìÏ­¨¯’á«õ/ú3¿ø(7þ!ÆŸþPQÿ _©ÑÿÁA¿ñ þ4ÿò‚«ÖÿŸrü?Ì9£Ý_ðÿŸf}mE|“ÿ _©ÑÿÁA¿ñ þ4ÿò‚øjýKþŒïþ ÿˆ_ñ§ÿ”}^·üû—áþaÍëúÿ‡üû3ëj+äŸøjýKþŒïþ ÿˆ_ñ§ÿ”ÃWê_ôgðPoüBÿ?ü £êõ¿çÜ¿óh÷_×ü?çÙŸ[Q_$ÿÃWê_ôgðPoüBÿ?ü ¯IøSñ“Wø¯â¶ð¬_³ÏíSðÕbÐõý~ãÅ?>øãá'ƒ!µðö—qªOeˆ|gi¦Ûj:åú[ýŸKÐttÔu{¦iµ³ƒCÓ5­[LN…d®éÉ%ÕÛüÙwþ´ÿ?êÌöÚ+{JЗR²¾ÔgÕô½ÎÂëO²’mI5i<ÛJ-J{h¡HÒµYN"Ò®ÞG•!q‡fp¯ì 'þ‡ ÿà'?ù¨Qm'¦»^Q]m³iî‡ëîÿ?êÌå讣ûIÿ¡ãÂÿø ãOþd+ÈµÏˆÞ Ñþ0x{à…¾¸º÷¼AðÛÅŸGöF¬E¤iðŸŠ<á?µ/õÍ;EvÔµ½_ÆqcYé6Úª‹] \›ZŸF'B\9%«ÑÙ]ÚQzw²m…ÿ­¿­ÎÖ¿ÿ྿òJÿg¿û(/ÿÔrÆ¿+ðþ ëÿ$¯ö{ÿ²âÿýG,kl/ûÅ?ûÿH‘3ø_ËóGôIâÿù ZدàýBü?\½u/ÿµ§ýŠþÿÔ/ÃõËÖ3øåþ)~lqÙz/È+Å?h¯Œ?ð¡¾xÃâ]§‡á5ñ5‡ü#þøoàíøG?áeücø“âá§Á?…Ÿð•I¦kƒáh|\ñw‚¼ÿ ¾½`þðWü$ð•x¶âÃÃ:>­míuòí'û=ü@øûñö}ºÐ¾,k|#ðW[ø‹ñj|4‡À÷Ÿl>4Þxƒ?ì´-7âïÂï‹ÿ5?…ڟ‹ÿ´•ŸÄ‹ox:OAâÉ>j> Ô¬mì|PeQµÕöÝÞý5¶šëµÖªû1›z¿íµû ø_áÏÁï‹^:ý¥þ ü.ø}û@ø'Lø‹ðcÄ~"xgàçü,_êÚ‡|Km¬xwJø£¨xG[¸û>‰âï ^êú|Úl®ý½¦[k¶:uÝÜP7mÿ +û9Âãÿ†uÿ…ýðOþ þˆWü-_ÿÂãÿ‘[þŸù&?Ûßð›È“ÿ‡ü?äVÿŠƒþA?éuùyáï€?µ÷ìÓûPüÓ~xKÁ?´Ÿ†t_ÿÁH5â7Æß‰~&ø7s.•ûMülýh/_|køðöVñ÷Û?ž)ý¤®?hËŸ‡¼ ð—Àþ Ô~è:Míž ž&ð'‹­uN'öjý‹hßÙüDý’?±<?gß…ÿµü§Å¿ðÒ~*×(ðOÄ~Ìð­ïükÿ ;eÿ ÿ]Ö<~ŸØ>2Õ¾ÿÂ=ã9!kótmj¶æå½­{¥fã¼›´mf$ßUÛò_ðuÙXýC½ý£¾ÏûU]~ÌÿØþ Ó~ÁàŸþ5ÿ„ŸÅ_?á×|Sÿ šÏöÔ›þ/†žÿ„;Rÿ„߯Þÿ†Cÿ„‚ÿAÿ„«EûgßøÿÇ?k°ÿ…Cý…ãí½+öºý“õß…^%øí¡þÓ߳γðCÁzÜñÆM+ãWÃmGáW„üGu7‡íí|?â_ˆvž%›Â:·sqâÏ A•ªjö·óMâ_Å úΜ·?þÛ_ðN¯ˆßµ¯ÆÏxŸMñç‚|ðûÇŸü7ð{UÕo¢×u¿xËý—¿à®ß|Aâ-?Â0iún‰â°kðP/„ºî¤\øëÿÛZW…>"Ã{©èz†“Å;¿eÚOö—‡Â_> ü<ýž~|Tø[ñGÀÞ-ðß~ ~Ó¿´ÃÏüNðç…>~ÓŸ ŽãÛëá‡Â„¿þèšCþÕ>"ñ—‚|à¿ÙÿÄ–5ÿ„ §}&÷ëm¬íÖ×·*woTì˜ÏÐÏ„¿> |}ðåïŒ~ü_ø]ñ«Â:n·sá­GÅ? |á?ˆþ°ñ†›ª]ø~÷\ðv­¬é–ºÝ®™¬éΕ=ÔwðXjºmܰ-½õ¬’üQð[þ +áÏŽ0þÈšÿƒ´_…ÚÇ„l-oIƒÂÐx[ãŇ‹þ&|5ð爾~Û¿t=WâÏÃý/ÀI¦xs[M3öDµøqâéÞ9Ö¬4ŽWß>Úx—Z·ý›ãñGÅÞÛö5ýš¼_ðgľ"|Aðž‰á|HÑ>x,ØÁû_þ×·ˆî|9ð¶ÿâf¹£Ýê¿¿kð¾§¥h‡Søµâ(|?ð¯Á ü?aákø¼KâígâĈz†þþykÿðI>8øwð?ᆿñ+áw†ôÏ ~Á¿³ì‰ãïhïâÏßéÞ#øiû ÿÁTe_ø¿Áþ½ðï…-üU¢EâïÛ§á‰<%c­xÁþ!ðç†<|5–ð–§cáë/4©Þi½­ÊÞ¯Tï¤]¶zÛÌZéøýë¾»\ý®øKñÃà·Çß^øÇàOÅÿ…ß¼#¦ëw>Ô|Sð—ÇþøáËÙØiº¥ß‡ïuÏjÚΙk­ÚéšÎ‘¨ÜéSÝG†«¦ÝËÛßZÉ/¨×Á¿±¯ìÕâÿƒ>#øµñâ„ôOx»âF‰ðËÁfÆÚÿö¸ý¸¼GsáÏ…·ÿ5ÍïUøÝûX?…õ=+D:ŸÅ¯Cáÿ…~ øOáû _Åâ_k?þ Ü|CÓü7ð·ï*ÎI&Ô[kÎ×Û]›Z=.·Û_ëï>!ÿ‚‘ÿÉŒþÒ_öOßÿOZEÿißÚ~_ÚGþ !á?„_¿mû~0x;Àß±¿ì³ð»ö!ðÿÄߨ¿â?еØ[öQø×à†ß´‡íAmû xêO†þø¥ûAüTñVñƒ\ñWí»ðQøqð§Ä‰G¾ xn=âGüþLgö’ÿ²~ÿúzÒ+öûá§ÁO ü+ñ§í ã¯j ¼ÕÿiOŒ/Æ¿[ë7ZuƤø«Aøð?ös³Óü' Ž•§\Øø~Oüðv©sk¬^kÚ‹ø«Rñ5ôZ¬:Eæ—¡èÞžøRÿ¯ÿI”÷^Ÿ«<âgÆ¿‰Ÿ¾>þË~$ñVŸâ‡Ÿ³wÄ~Ð_³ü=â+_‡·séÿ|OãOËûühñwŒtMWÄZG‚þüLÒ>|]øWðêñKñ§Šþ2þן²·ÂŸ|?|Us£ü&íßðôj?µe¼Ÿ >0iúì›áÿ‰ºÏŠ"øóâ¯eñþ)ôÿ‰6-àMâŸÂ­cWñŽ¥ãŸ…¾.øE®h^Ó¼?ሳ'ˆÂ:§ìéñ jþ;ðoˆþ|;ñÿˆ¼Eã/‰ºF§ãmkçÿÁ:þxëÆ?¼qâ_ŠŸ´£­|Mÿ…}yà׺ñLJ/áBøáOÇk_ڟᧈþ_j^½Ö¾&ÿ²ý¦¬ øÇðwÁ_µ®«ûK|,ø öß|ø à†_³/Å‹?üuØAñ‚à¯/ûCü}ýž.¿d„ß?i/‡z×ÁÿÛ¯Føåðà§Ž?`Ïx«Â_~ xÓþ Á«ü>ñf¡ñºûö­°ý›¼]áÿ ü.ý§o^êÛàíKñíZW†üsá‘ñá¿t?„¿oÝÁK¿ex;áö·ðÅŸðÕ_>-ÿÂÿ…gû?| ×~[üvñü/Ÿ>0ý©¾ÿÂSá/Œþ<ø=¢üÿ„¯öeøsñ㦉ÿ ⟄ðx;Àú¾‘áŸí¿ˆ…üâÑÿà•áω—¿¼9û~~Ûú'í®øƒâþ³ãöÚGìyâ¯ißþþÅÿ üCá=gÂÇì3©üÓ|?¢øoö øÞ¹ð‡Ã xª FÏÅ—Z߉µØüK-½¯Ô+ýŠ~_üýž> |/×þ ~Ï–_²'ü!ðË<ø[ªøsÄ^;øÿ7Â/þÏz_öüyð§Æ¯øçíŸ|{ãï…Ÿü.O|Kótj*²ûÄÝ'ž;ðèåÿà»ß>xO±ýµuoxOâ¶¡ñƒöÜñ7<;âÏþÇ¿¼Uû=~ÏࡵÇìùð–ÛÄÞÔ¿h\þÑ ð‚~øƒÀºÏ„ÿa]/öÂø·¬j? ®o/´oø§âŸÂ=Gã×ú·üËá'‡§ø‰yâ/ÙãöŸÑ|ð×ĵ„ú×Ä››Ùâóº‡ÁØ/ã.±ðöÚý¨tm'Hý¢õ/ˆ“|ýšþ"[øRÇÄÞÔ| ¦~Ò¿ôïˆþÕ?gÏÙûã¶™ñø ð'üçÁß -WþÚ·ö¿ð¿ˆ<_ÿ åŸíãŸøŸàO†üwûTxsÇÿ´wí ûQßøsâ/‰¼7û>é¿°~&þÖ´oü">5ýŠá”þ)ø{Gø¥?Ù|~Þ ð/¯ø  ñüÿà<ñÀº§‹þ0[éþÿÁP> k—~¿à¸µ_ ÿÁY¾>è´gí¨iS\|?º¶ƒÄ ñ·‡,t¿‚—W–wÚw‡<+-ÕŽ´¯ˆú»Ã®@ÏüSýµ¼Gñ[Gø­ð?öjÐ> |*ø›ñ[þ³ö\ý‹ÿl_ˆºWÂËÏÙÇÅ?·gÁ/|r·Ö< †,¼Wñ/ãÖ‘ÿ ƒÇ_þ6_x‹ÄßeàïŠm~ø¹ø/ã.‰ñ>Ûâ_Æ cÁ>øÁñ‡öŠøMû:k7Ÿ ÏÁ¯„_´?íň~3üf𞹤|/Ò?h?xƒÇ’~дEÕÏ„>*üvøð“óülñ2ø/áφ­¼ðzßáŸ?â_ø'¿ƒ¥ñ߈>*|$øñû@~Îuˆüe¢ø»á ü Õí~øsö„ÑþOûBü'øðëãÀ¯Œ¿ô‡ÿþ0~Ïý§¾$jR|;¾ø§©þÑÚ¿ÄÿˆoĽ"Ëâ÷Ä¿ø æØ£þ ¿f¯Øç\ø·áŒ?ÕüQðöð7í?ûXèÚÁ­à×€ÿl/Ûà‡ìçã/|6ñg‚­> xGã%߈>)ø“ö™ø5¶¹ð7ösñŸÀÏOñÓÃ6þ!ñ·ƒt|Zÿ…_ßøËöèø™ñ›öxÖþ.þÌ_iÿi‡þ~Öß¼{yð»áïÄ;öÒý|ñoá?Äߎ~ý´ø»âþ¹áŒ´/ì¹{«xWö}ø9ûPøWöcøçã_|YÐO…t/ jÿ ¾2x£àAð³þ MðOàöð§À^ø·û@/Á/‡?ðÊ~ ñGÀOVøE}àOŽb¯| ðìïñ×â—ŠGÁ¨~6é_<¦~Ëÿ³f¥¨xkà·Å¿„üW¬|Фñ?ÂMWLñŸÅÍ/â7гGì{£þÌÙ:7†~8þÐ9øeðÿáý‡Â€_<â_Eð³öxøE¤ÿ`Úèßü¥|8øqðïÄÿ°|?àßxOß?j?~Ð<3áÏ ÞÛx{â~™{ñ/ãV¡ñ4Çÿhïø)§ÂO€þñ޼ð·ãíiàŸ†³‘ûh|Yñì¿«~ÏÇ…~~Ì-Ó¾%k~/¿ˆ~2|~ø+¤|NðÿÄí#à¯Æ=SÁv_¯>-x‚];áÕõö¿£èÞ-øi/Ž~`ý¬¿à«7^ý–?lÿü8øIû@| ñ„>ÿÁI>þËŸ´ÏôŸÙÇÄŸ >$~Ö?°ßïڗQñ…à¯øgã/ů‰¶_ÙW¿²—ƯøsSøûð#À_ ¼KáÏ…·º^³¨/ˆ<]àoxÏÏÿjïø%?ÇoxsÆ?cß—ø%ñßöñ¿ìËñ·âv­ñûÁÑøNø㯊´—‹< ðAý—¼Uÿðøéá-KöýŽ<%ûM|GðwìÑà?ß´ßìWãGáf¿aðÄ¿<9¦|2øQñO¾Á ÿÁ#`ø‡ðÏã‡Ã_ÚŸö‡øÁãoüLøÁÿ1ñÏÿ„¾ø5£ü3øíññ ö½Ð#ø“ðÛĶÿ³§†~4ë,fŸÚÓâ'…õÍã_Äo?´ˆ_|m¡x'_¶ðŸÂwÂÀOþÓ¿¶ŽÿgÚ;áÃàwÄŽ?ü[û ~Þß´‡Žto‚ÞÑü[ñ²ÓXý’n¿e›ŸèþðιñÁ_ð—ÂÈÿ…Ëâo†:W‚<'áÿxïÄß|[ðqm£ð—Ãû‰>,Ó|ÿÀðQ½ãí“ðGà·ì÷áŸø[¿³—ćÿ¶6§©þÑÞ½ð'ˆ>x‹Xýœl`Ý_Bø¥ðwâVŸñeø³àÇÄÃ6?<7â?ÙËá}ÏŠ~'øÖËÄ_4ÿŒœÿÂoø'ïÀ/€ÿ<9ñ'༠ø]mà¿|U›À ü ‚ü9ðCá×Ã?Ž~øoâ×À†ß tßAáo‡_üwñ[öxø]ûUë–þ ´Ð~!KûJÚøÛÅ|BƒÁ?þ.|<ñÈÛôQEQEQEQEQEQEQEQEåÿÿämÿs_þ«_W¨W—üWÿ·ýÍú­|uYÕþ¾_úRw^«ó>7´ÿ‘/Äö4xCÿM>8®^º‹OùüAÿcG„?ôÓãŠóÍVÍá©4=WDÓ´Ë]nyüciªø~ÿY¿×|8Þñ­®•á­FÓĺ¿„õ¸|]sámrjš_,.|9£xƒÂÑøj×Sñ.ã ø¯h…ÿéR6[Ë×ôFÝ|C©ÊH¼ÿfCñ/ÿWÇÂjú£ÂV¬þÉÿ ׊¼â=ž ðU…÷ü"^×|öˆÖÛßð±|Uiý±ñ/ÇßcðOŠ~ÑáøB¼7ÛõßÿcëßÛ¿þ$ÿÂG§ÿÂ+ò¾¥ÿ)"ðoý™Ä¿ý_ ª©ý¾¿»—éÜß8þhûz¿ÿ྿òJÿg¿û(/ÿÔrÆ¿+ðþ ëÿ$¯ö{ÿ²âÿýG,kL/ûÅ?ûÿH§ð¿—æè“Åÿò´ÿ±_Àÿú…ø~¹zê<_ÿ!kOûüÿ¨_‡ë—¬gñËüRüØã²ô_QE# (¢€ (¢€ (¢€ (¢€ (¢€¶æH$¸±Òõ¶º´¾†ÛYÒtÝnÁotû˜¯tûÆÓµ{KÛ .´ëû{mCN¸’Ùå°ÔmmoíË[yãê?á/Õ¿çÓÂÿøCø/ÿ”ËÑMJIYI¥½“i_¾žˆ,»Gü%ú·üúx_ÿÿò‚øKõoùôð¿þþ ÿårôSçŸóKÿæ]—õÿ ¾ã¨ÿ„¿VÿŸO ÿáà¿þPQÿ ~­ÿ>žÿÂÁü ®^Š9çüÒÿÀŸù…—eýÃ/¸ê?á/Õ¿çÓÂÿøCø/ÿ”Â_«ϧ…ÿð‡ð_ÿ(+—¢Žyÿ4¿ð'þaeÙ_ðËî:øKõoùôð¿þþ ÿåð—êßóéáü!üÿÊ å裞Í/ü ÿ˜Yv_×ü2ûŽ£þý[þ}žÿÂÁü ®^Š9çüÒÿÀŸù…—eýÃ/¸ê?á/Õ¿çÓÂÿøCø/ÿ”Â_«ϧ…ÿð‡ð_ÿ(+—¢Žyÿ4¿ð'þaeÙ_ðËî:øKõoùôð¿þþ ÿåð—êßóéáü!üÿÊ å裞Í/ü ÿ˜Yv_×ü2ûŽ£þý[þ}žÿÂÁü ®^Š9çüÒÿÀŸù…—eýÃ/¸ê?á/Õ¿çÓÂÿøCø/ÿ”Â_«ϧ…ÿð‡ð_ÿ(+—¢Žyÿ4¿ð'þaeÙ_ðËî:øKõoùôð¿þþ ÿåð—êßóéáü!üÿÊ å裞Í/ü ÿ˜Yv_×ü2ûŽ£þý[þ}žÿÂÁü ®^Š9çüÒÿÀŸù…—eýÃ/¸ê?á/Õ¿çÓÂÿøCø/ÿ”Â_«ϧ…ÿð‡ð_ÿ(+—¢Žyÿ4¿ð'þaeÙ_ðËî:øKõoùôð¿þþ ÿåÆ×—+hº_‡ô¿Ž~ é–:§öÆ¢¿u/h—¾$¿‚ÒâËJmsVñ_€!ÿ†2ñýçí½ÿ‡á_ÿ9Zì>~ÉúgÂÿŠgã§ñ¯ã¿ÅïÇðÿ\økc'Åßø\µÓ<7âx[Å‚X¿†¾øGTTðŽšÖËu©ÝX[Gq©˜ìÅë\'ÕÔPêͦœ´jÏD®¾H,»mÿüWàü×þI_ì÷ÿeÅÿúŽX×ïå~ÿÁ}ä•þÏöP<_ÿ¨åk…ÿx§ÿoÿéþòüÑýx¿þBÖŸö+øÿP¿×/]G‹ÿä-iÿb¿ÿõ ðýrõŒþ9Š_›v^‹òڦݭ£i?{Dî®ùté³ß£ ÛúÛe¯ßCúñ/‰|9à¿xƒÆ>1ñ‰á?øODÕ|KâŸø—U°Ð¼9á¯hVêšçˆcà¯ÇÙ/Êýœ¯ÿá–ÿg/‚¾ý¾tß„?áøSðÏŸ´öêß¿f߆Ÿðž|sñÿ< â/ø^`ŸJ¹ñ·Ä†zÖƒõÄÚkö²ñ»ñKÁŸ>:ÿÂKûaø“Æß·ÇÂk_Ø›û3ö{ðÍÞøYðçö±“ö6ý§¿á×|añŸÁð·|cð¯öBÔ?ádþÒß<[û5x×þ§~ƒá-Ãßþ ÅàãØ´–«­ït’]võÕ鶺 ºóéøÛü×â~òQ_Ï7ÅßÛgö•×®~(~Ðÿ>3øÛÃ_³m‡ì½ûsþÝß²®•¨|"ð‡4¯ÿ ?e¯€ÿðMyüáÿˆ¾ø¹ð…>9hÿükñËâOíP÷×z]ç‹~9ðoˆô|9ø—aðæãá7‰Iñ÷ö«ý¬¾xëÄÿSö ðO€~|$øÙñ?ÀZßí‹ûE|SýžÿemwÅ®û9þÁÿ¾|0ñ‡Åö$ý¢?f)7øËñã‰koð×ö¼ÿ‚p~Ï_|+ðIüðÿS›ö¿øUÿáÒ>??Šn¾0øSNý¥l4Ox§ö¦ñÇ¿gï êƒàçÅ_†þ8ŠÿMý¡o>/xFm#à÷ÃÜMºí§üö<ðÅçÄ¿iZßÃøvßü-ˆ³X|9ƒÆ_³oü(¿ÚçöpÔ><ÿÂOc}à >x3þ–ÓÀÞ;мuÿ wÀºÇü+=+঻7íÿ .·á¯ˆšÆ¤½›ÒòZÊ1ÒîÜÊúè¶V½·¾@¾¶·~Ý-ùß­ÞJ+ðã·íuûRxZÓÇš^£ñ»[ø) üý¡¼að—ö©øÉ?þiø3áÏÚ/þ ‹û[þÆ÷ºWÄ?Š_ ¼Cðg_Öôø&ň^)ñÎ,>ØxŸÃZçíG¦è_5­Ïñ7öÑý£í!Ò<5ð÷öÀø]ìÕÅŒú?‚ࢾ4~ÍŸ³ß‡>8Xx7áWì{âŸø>ËöŒ—ö+ý¥dkwß~7þÖ¾¶ð—ÃÙ¿À¾#ñ ‡ì•©[[øúÃÅ?~=ÁñAª2v³Ž­õ}5½ímSN:ݦšVeçÓ·V—{èÝŸšhþ(¯.øâx³à·ÂüMƒDµø“â_…ÞñÄ+_ xkâ‚ü9mãgÂzN£âÈ'|Añ–ƒàOé>%ñ>µáͧ~þÃÿðJ?Œº>…¬øáí}ý±ñSø[©xÄ5ÿ‚xÇ üw¥xPø&…ñ×áÇ|[ៈ³¿ö—ÃûM/ÅžÔþ;øgáÎâíÇ .|-¨kðº>/|ßöuðŸ…|cû3ÁH,|c៌%Ò4ø)1ø‹g?ÀNñOÆ_ø«á=‡ìƒñGÀ¿>ø'T¶Ö-¾#xƒö~ñ·ƒü=ñÎ…Ñx+âÆ£ñF‡—´5Øüñß‹~Ö>2ÿ‚…øÓö+ñÏÁoößñÅÎñƒö×ѾüYÿ…=ãïÙûö¸ø»ðhÁlm_À^,øçðcáwÂÙó^ðˆ<;ÿÕÓáWÀËmGöwø'?ˆµ¿‡?²ç<1áŸxÛľøÃñ3Þ‡ÁðÇòG9úaÿƒý€?è’ü@ÿÄ ý«ÿù÷ןé¿ðMOø&6¯ñOÆ_4ÿ|@¸ø›ðÿáÿÃOŠ^.ðÏü4oíöG>0xâÏ„þk¿Û3ü_‹Ã÷ÿð‘xƒàwÅ-?û3LÕou#þµkº~™e­øvçWù¿ã€?hOƒ¿µ_…·Þ5ý¿þ&~Âoÿ —ñ_ö¤ø‹àÿþÓ>øíâÏüBðwü÷ÿµ/ƒ¾.ý™¬­h}¿ö‡økÿÕ×~!~Î_°Ÿð÷ágÁ?k—Zžð;áGìÛñ3ãœ"üÀøy¦þÖ¾>Òþ#üBø;ã/Úÿ@ýŸõÿˆ7‰úçõŸø%ü_Ú„ôø/įãß\øOÀº^³û\þÓÚ^£ãOYøWÄÞ:¼ðÏ„ìo¾ÿáŒ|Mÿ¿û.ÃSÿÂcÿ7í1ÿ_øoˆ•ïðü-ð—Ĉ¿±¯‹>è_ðSý_örøûü%ø¥ãíCöœÔÿn+ø_ź¿ì±ûnü³×~ÚþÖ:…—üS[øqñWãì±áŸÚ?L¾¶ÕÿaؾxŠMe4ø¼¤ÁBu]0íøtìÿD—âþ%í_ÿϾøtìÿD—âþ%í_ÿϾ¿$,<3ûcxÓÀ?¼¥ÜÿÁGìþ"x³Ãÿ±ç†à¬÷šÇ‹?n_AkûUkßðP¿ø&î—ñFçöOñ׈µŸxoÁàø7uÿ-—â'‹?à•ž!пe|]'XñF³¥ü;³ýš¯ ýýŽ'ý£¼Gû_ü]ð§‹ü]ñWøûü@ÿ‚ƒü-ø¯­x‹â-ÖµàOŠ~;ý¶ÿhÙ»öòýŒ´/‡^›ÄZ‡‰u¯øcÿؗƺGÂj¼ðûGøY¬|Kƒá_ìã¨|Rø~ž:×ü8êðè?Øþ‰/ÄüJÚ¿ÿŸ}ðè?Øþ‰/ÄüJÚ¿ÿŸ}~—Q@š?ðè?Øþ‰/ÄüJÚ¿ÿŸ}yWÄÏø%Gì%á¨íï,þ|O·¶·ÑµmFæÛNý¨¿ixg½žwÁúEª½Ö¯ñS^Ž ^»™–EyQY€Gìx?Ç/ùËÿb¾¯ÿ©§Ã:Ê»q¥6›M+¦´i¦¿¯=†·^¨üÿ‡z~ÂßôJ¾4â[ü{ÿ掹/ÙáÇß…ÿµ?íáào†~Õ´ xCàŸì²4 OøëÆ¿µËYücâÿk>*¹ÿ„—ÇšÖ·¨Úÿn]éš7¶(Ñ´yí<5áÓs¦Üjvj—Ÿ|ÿ‚ þÁÿÿo~Ü>ðgýx"îøE¾ ø§þø*ßþI™ðOïÙëþOCþ -ÿd_ö6ÿÓߎëT”•UígQ{/yrÚ\ÐV²nöM¦öí}£Irè“æKG}?¥ý6Ï­¨¢Šã,(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ðþ ëÿ$¯ö{ÿ²âÿýG,k÷ò¿ÿ྿òJÿg¿û(/ÿÔrƺ0¿ïÿíÿý"DÏá/ÍÑ'‹ÿä-iÿb¿ÿõ ðýrõÔx¿þBÖŸö+øÿP¿×/XÏã—ø¥ù±Çeè¿ ¢Š*Fq>øuàß…Úÿ†¼ £ÿahšŸ¾%üE¾²þÐÕu??Æ_>#x«â×Ä]cí:Åö¡wü$_|mâgÃónôø!Ô?áñ>™ý­¥I}¡j¿mÑ5=KO»í¨¢î÷»½ï~·ï~àbxkÃ^ð_‡*ü(ñÇ€þ!|9ñǾ,øÛÆ> ø©ñ[ð†½ð·áµ†/޼eâað?€ü%ðÉá“ᶦxNÛèj(¦Û{¶úêï¯Á}ÀQE 4fÝ'ó†™ñ^ ĺæ±{ñŸã?Š~9x¯ûcÁvºW‰5Úüý¥<+§øöŒø5ðã÷‚tŸZø³KðwÆ¿ÙãÁ<+¦øªÇNÕt{iþñ׎5í"ÏÄzF»®ivºÍ½œz¾¬ê¶0Ü¥¶£yÞá?‰þð…|3à_è¾ð_‚|áýÂ~ðw„þiÞð¯„ü+áÍ:ÛGð÷†|3áíâMž‘ øBÒ,ìô½FÒìítí/Nµ¶±±¶‚Ú¢_Ÿè£ëU{þ2ÿ䃕Vòòòü_sêø_ôùÿ–ÿ*?á}ÿÓçþXþ4«åú(úÕ^ÿŒ¿ù å_Õ¼¼¼¿Üúƒþßý>å‡ÿãJø_ôùÿ–ÿ*ù~Š>µW¿ã/þH9Wõo///Å÷> ÿ…÷ÿOŸùaÿøÒ¯?ø[â?…Ÿ¼ ¡|-ø)à‡ÿþx_ûOþŸ‡_ ~øsáÿ<;ý·¬j"Ö°¼#á?ˆ:G‡ôíjú®»©ÿgéöÿoÖ5=CSºóoong—Çè£ëU{þ2ÿ䃕Vòòòü_sêø_ôùÿ–ÿ*?á}ÿÓçþXþ4«åú(úÕ^ÿŒ¿ù å_Õ¼¼¼¿Üúƒþßý>å‡ÿãJ¾cý¥47ý¤tÿ é‡ö‡øýð>ÓÃ’êòÝÿ‡Ðü᫯ Té ·ŠuÜøöþâÃG›H[7MÒ.tm>k˹/u«m^ïOÐ&Ñ㢓ÄÕjͦ»7&¿ô åKú^_åø¾çÉ?ðÄúoýçüÿÿ¿ùŒ¯Uøû9xö|Ôþ3x·LøÃñçã/þ3xoá÷†5Íoã<žæÚÃáο©jú¶Ô|§èS¾È5ÝbÖc©Zj³IéVö÷6¶M¾ÃEK­6š´m$Óµö?é‡*ÓËô·ù~aEVEQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@~ÿÁ}ä•þÏöP<_ÿ¨å~þWàü×þI_ì÷ÿeÅÿúŽX×FýâŸý¿ÿ¤H™ü/åù£ú$ñü…­?ìWð?þ¡~®^ºÿÈZÓþÅÿêáúåëürÿ¿68ì½äQEHÏŠ5_Û{ÂÚ'Æ?|1Ôþ |lµðOÃ/Ÿ ¿g_þÑ[>MðsDøÇñÏÂß¼Að³ÁÿØ–ÿåý µ/øJ5oÚà÷¿á Ò>_ø[DñOŒ>×â-oHðO‡üQã ëÏê·ú‡7j¿¼-wûCðsà÷Âߨ³Oø§iãÏÙjãö…¿ÿ„ƒãeÏü(ÏŒ>øMã_ö<ñ_Š|ñJïà·Ä_üNø}ÿ?…þ(ü2ñOÚ¯öMý±þ |ñGìÓà/Ùóþ-?AøÙÿ^øÂŸdø±ð·Eмqÿ ¹û?ÿÁMà/‡~øgUñ&ºþÉñ7ícàŸ†5‰öß áøŒúLÿtÏŒŸï<]ñwáþÜ|¶”V‰»µü·oâß›K]=~kµwÛ¯ê—eæú­7?^5ÚÓáΙû5|uý©§Ñ|lÿ¿gÏøjÿøLôxtÝ ¼e©ÿÃøûâ·Ã¯‰ŸðŒiïâHôKßíÍoàÿ‰n¼ ý«âûOJ¾Ð§ñü#w:…Ž™õ 6až$øQû]økÆÿ±oü5f·ñ›Á?·†¿dÛ/í_Ù{ÄŸðÊßþ,þÚðP¿‹Z?Ç/´ü|øµà;O…ßð»¾~Ð_²§ˆ?á,ø?Œ>'ŸøRßÙ_¼9á=oá¿Ã½7XýBý´¾ \üEøðCÆ2ý—á¶¾x;Á?|5âßÙ¯ìŸüM»âߎußÚ§ÂoŽ_ðƒ~ÓÞ>øcðcQÿ…iàïüoðü%ƒÅ²|Oð¿ü.ÏìøsTð§Œþ$êzp…ÒRZ¹ëtì’N+â[ê®ùnöºÔ}»wë¿Nž¯ÎÇèmywÂß‹^øËáÏ øûáõ–·«ü+øð»á¯Å¯‡?'¶°Òü9ã¯|O°Õõ­&ËJÐ5=J×âN­èÞµðïˆ|AmãOxZÂ;xjËFÔµ­zÃÆÚ7ƒÿf¯Ù—â{|Wø‰áàWü,ÛàçíCÿéÓþ%ÁK?´þj?ØWÁسþ Ÿâ_Ú{á×ü./øÓJý´µø^žðׯ?ý‡Dø?©x7â/ü4ö/ÄÝcAð÷Œ>,ßx_oá¿üïâïÂÿ| ðω?e-âGÁ_‚¿³ÏìAð—ãçìçá«ï€7žý¬|Gð Ãþ ‘áŠw¾ð'|uá„Þ7Ñ5ÿ´OìïûnéW?´&­ðÒÿ\°’êZmíAàËÏ…Úktâ“÷Õí¶Õ5wo{Í%{uºJÌ.ûwý=Wµöѳú4¢¿žcÿëøÇ«xö¹ñF¯ð{þ.gü1F³¥~À~¸øƒáoøÇߌðÑ¿ðSŒ?³€ü¤YxÞO† >6~Ç¿ þ8~Ëÿ >|Yð½Çü"ß³ïüUý˜þ4ÿ³ÿ„ÃSÕ¿C?gŸ‚^2ð/í}ûJ|FÔ¾ ÂáÿjßOñjûâ>•âWâV«¬xšÂçÃZ~Ÿ©xVO|dðNƒàÂëGÑÿj¿‡þñ—ì'ã-Wâ/ìûûüEøáû#üOÒ¬¾ Ë„Uí4íé¯Ã·½çø1­|ÐÚùãwÄ/úWÅ_ÙÏà¿ÀMáV¯ã¾ ø“¡ZOñ{Wñvƒá]+þ÷ÃWâT÷W¿ƒ4ŸêöÿhÒ<9¬ØÅ~ÔþÓ©\éŠóiÖ©ur~œ¯¸ð¼Aûf~Ãÿ´ ëÚׂþx›ãïˆ>$øƒJÓ.µ / i~*øãør[ák·Ýk^+ñ&•¦éúe„7zÄGQÕRÏûCÖïôêÃÆ2­4œ_5ÓÛHÉ«üÐ¥{;o¥¾ô2?‚ßðS>D¿ñV™ûiþ±u¼ñÿ‡þ!~Ð:þ½c Û0›X¼Ñ4GáG†4ýoW¶ÓÒâm7H¿ñ/‡¬õ+ĆÎë\Ò`™ïíú¿ÚOâO…f¿†ß>0x¢ÓÄ·‚~øâŸÄŸXè0i×Þ*Ô¼+ð¯A×|Q«Zh¶Ú…þƒ¤^x‚óHЮ!Ó ¾Ôôm:ãQ’îoôëg{ˆL¼Uâ+=KÃ#Ó¬´ÿMy ëVÿÂãüÛ›­>â"ó%УŠ?2Y7Êéçsº¨$~FÁEþxËãìÁûvü%øu£ÿÂEñâÀoÚ{á×|?ý¡¥i?Û¾2ñ·ÃßxkÃ?ö®»}¦hšgöž·©ØÙhk–Ÿ¥YyÿiÔ/­-"šx÷Ä”\9RrŠn-uæ½ß¢^„Å·¿ŸþÛoÌ¥à¿ÚáWÄüÐü w­ø—Lý¦?gŸþÓÿ |c6—áÍKáW‚ïþZ5Þ«kâ4hºßˆ­ÿiêžѯ|,³-…Ÿ‰cñ žÔôë ;Uú¿>/þÅ´Ü?¾/Eû:x‹DðGÁ¿~Á¿ðQoüñÌÞ7Õü=ã_·í©ñwà—ÄO.¿ Ø7Žtï…Þ%ñÏ‚î>;xĺ ?ñ§ÃψÆ­!5_ øÙçᾋô7ì[ðjçá×Äoþ0ðoì»ÿ Kð#Æ> ø%ᯠ~Ídøá¿ü ®üqÕ>,ürÿ„öañ÷Äïƒwü,¿xûà‡€¿á,>-âŠ?áIÿcøËÚ_…<ðÛS×ù¥òÝIm{i}e¢z«;5{&®ŸK^•úþ½—êßõsô6Šþe~ÿÁ2~=iž ‹Âþ$ð§í þ>¼Öÿcöœø…¨|QýŽþøsö…ñ€¿nÙ/âÏÅïÚ់?dßøö¥øÁ­øwÁŸ ~:ü@ðgí ûg|]ðWíqàk<𧌾2|uø¯©xêþÆ¿‚þ.øÒ=kö%Ñ?hÿØkÃ~,Eð_ö,ð~Ÿû2^ü?ðÔß¾ÿÁ?gð—Æ¯ü øéñáwÀèž ø³ð»öåÐõ‰¡Õ4üJñ¢·N7·´O~ÖvKfäµmÙ'm›¿@»ÓNÞªÿ.‡îMx§¾7é^ ø·ðãଠñ·Œ:ø‹£§†ƒaÒ´¯ü2øŸû=|3ñö±®ê-ñ—…|¯øFÿ᣼5㉴ý*_UÕ|àÿEáû_ÆÐø?Áž2ü¼ºý“~1ÿÂãÓu=Gö|þÒø¹qñ³ö1øƒð·öÇÿ…±áo‹ÿðËß³—ÁŸ ~Ëšwíû)ÿÃBüañ†¿míwþœÿ ?j#Êð§ÁíkÀ¿?á©á"øË®økPø½û@§‚~^ðçì!ñ²ÛÆ¿²ÌºWì[ÿ7Ńþ ø á¯Úëö§þÕý—¬¿á±>-øþ ÿ¹øÙñã—ü%¾øµª|wø­ýµáOÙ¯ö”øÕÿ gí à|OÖ¿·|›ÿGñGÇ7¾qB^km´ê›×ÞÙ=µ¿DµßoêëüßÜIôWóa«þÆÚïì¡û&þÊz¶·áßüð§„¿b„^ÿ‚Œ_|Aø×ðçÃZWÆß|>ý¡?àœÁý~0|Eøñ×Áßá3ø1àÿÛöTø¢|Iñ¼¿³—ƒ¼ñ.ãöt·ñ‡ÂÏm´ùþòÿ‚NKðÏYð‡íy㿟tO€ÿ~#þ׉â_ƒž ð|?[áýׇ4ÙöKø}â¿xYý™¼qñ/à‰4Kï‹>øe¬j¿ |}â{ _i¾-ð÷ŠçÒ¾"h^2ðîŒ4¢ä¥t›[./æ{î·ÓVÕÁ;ô¶~_ç÷Ÿ«´QEf0®;â/ˆo|#ðûÇ^+ÓbµŸQðǃ¼Oâo’Yl¦½ÑtKíJÖ+ÈàžÚy-džÚ4¸Hnmåx‹¬sÄåd^ƼÿâΕ©ë¿ þ&hš&›¬k:ÇÃÿiZF‘¥YÜj¦«©êÔ­,4Ý6ÂÒ9®ï¯ï®æŠÖÎÎÖ)n.n%ŽcyTÔUåörKñç_KÿñoìùáOÚ{P‹þ áðóቾ h_o¼Gñ3ãWÇ Yøá¾µà›_ˆ7:×Ä ^„—>ðÍ·†|1r÷Þ+Ô¦×î4++û©5‰tûczß@|ñˆ~"þÏ?þ3ø“_øsâY>2hZÄO êÿ `ñüÔ¾ø×ÁžñïÃ=_Kü9à߈-¯xOÆV:Þ¯‰üàíCHºÔÓøz;ãVÖ?.®ÿà„ž>øëâÚgÆÏÚ¯öˆð‡ì3ñOà·ìƒãø(oü×K°ñ¥¾ñ+ö§ýgß„¾xoÂÞ:ð.—Ž‹ðÆ^ðF•sñÝômnãÄZ·Š¾ øUðψ|EªÞ|ñçìŸûÅãÏ x[Á~ðŸ…<á;À~ðÓ·†¼àý‹àxkÁþð'Ã? è^ð¿…"Ót‹=ÃZ žš&‰¥iºmž—§XiÐÙiÐEiok߉§F4›§s]k›Jþ®Ýþ]LâÝõom/òý?Ï©ùáãÚæâ¼áÙïö†øÍ üÖô |nø—ð—GøU¬øsáGˆõ/øKâ¥÷‡ï| âO‹žøÿñ?[о|@ðÄK+öø1ñ‚ÿÄ6-Ó|à(6~Õ¯àßÙ‹Æßm?ižøÃð÷ÇþøðCÁ <ä~Ëß³Ÿìì¾øå¨øóâ>ñŸÃ_Ù^1ø­x»Åš¿Áÿ€¿~ÃðÃÄžÕ|#¦xïâÖþéž´gìAû@xûÂß´†< û8ìý ¼[ÿ#ÕÞø·B.Þôb¬µºwm&¬ôû´Ñ²þ÷ªý?áþýOèfŠüQøõûkº«ñ×Ã??gøX?¼EàŸÙ#Æ:Ãuñßi_?hßxËö¿“ã7ÄÏ‹ßÿhˆ>ø}û`øÛÅöš×쮟´n±ûNüUøg㯊ž Óìþ.ü<ý£¢ý¬ÿgƒ¶‚]~É¿ÿáq麞£û>i|\¸øÙûüAø[ûcÿÂØð·ÅÿøeïÙËàÏ…¿eÍ;ö‹ý”ÿá¡~0øÃ_¶ö»ÿ N„ŸµF‘åxSàöµà_ŸðÔ¿ð‘|e×|5¨|^ý SÁ+’?ζ¾¶]#¿½æï»÷]“vCÿýmýy«¿þ-xsãïÁo„¼e­é¾øÕð»À¼-§x–ÚÂÏÄvøá='Æ:—ˆ-4½KYÓ-u»]3YµƒU¶Óµ}V øçŠÓR¾·Xî¥õþl?fŸø'GíàŸ~Ê ø±àσâÃþÁ6þñÏ‚¼Yû Zü9ýŸüðösý<ñ·à‹~4ø³áçğۧßð‘üGømûAϯ|ý“uYÿf¯ŽÆkO x“âí>8þÑž7ð×ôŸJqŒ_»%$õÓ§–âMµª·ü2 (¢ a_>~Õõ¯€_³×Å/Œ~Òô½oXøáøµÛ='YûXÓu š®Ÿkqkrö3Û]EæÚÜΰϧȸò¦xncíåú¾Yý¶~xïãì¯ñŸáà êž3ñ÷Ž<3máÿ xgG‰$¿ÕuKÝsIXâWšHmm-`d»Ôu;û‹]3IÓ­îµ=RòÏN´¹ºŠé¤êSOTçÓÚÎI;ü„ôOÑžÿ /þ ­ÿ@ø'ÏþÚ;ÿœe{E¯‡|cᯠøBÓâ,Þ›âúܾ8_QükâK?ø‹E¾±ð¤úìpk—Ú’é0ÛZjº½®Ÿ¬´rêóhÚ¾MLýÿ„¿IÿŸOáãOþPWÆÿ„ŸÛz|’Aumö›_^Åí¥ÍÏÙ¯¾ øÖòÒYm/"‚ê>ÖxgDžäòäBPf»10¥^œbŸWzÅ.¯»" ·­öÿ/Óóó?<ü?û\ÃâÏO£ø[ö{ý¡¼Kðš×â‰~ ]~Ò~Ñþk? ­¾ x/â«ðsÆ:tþÓ¾.\þÔèžøÕ¡kŸ …6ªüQÕ Á>¾|7ŸÃV³ÿˆ¾#xsà®·ã‰? ?kw%ý˜õÃ¥øsâˆ5ßêºGÅOŠ>(ðDdz¯í¯%²û?öõõé¦ÚîÒ ¾Ï§~¶ò¶—õÑè~ÿÑ_Ï7…?`ßxWà?Æ]Âÿ²ßÆËÿx›ÆßuëÙ¿ã9ÿ‚dézV³âŸ‡vß.u/ËûþÊžø3ûüiðO‰5O|)ðÿÅOŽ¿´Wþ1üCðoƒ®|aàOüøÏû#þÇþ,ñ×Úÿ ?g¯ˆÞý±üñ+Wø ö4ß‚~ð׊>2ßþÑšïÆoì+?|-°ð¥¿Ãß üfñ¼Þýª<}ö^x‹þÿÙããÃ_þÊ¿ÿ±~~ߺgÄo„?¶õ‡Å?…ÿÓ„Uí4ìžÜºÙ'üÝn×W£Ð/¢ví§¯õÿ ~¡QE˜ÂŠ( ¿ÿ྿òJÿg¿û(/ÿÔrÆ¿+ðþ ëÿ$¯ö{ÿ²âÿýG,k£ þñOþßÿÒ$LþòüÑýx¿þBÖŸö+øÿP¿×/]G‹ÿä-iÿb¿ÿõ ðýrõŒþ9Š_›v^‹ò (¢¤aEPEPEPEP\lj•ñW]ðWí¡ü ñ.‰à¿úÏ…¾/é_ücâX!ºðç„þ*ê:Oˆlþx—Ä·ñe½Î‰¡xºm#TÕ`ŸÂÞ%†k Yã—ÃúÊ3i×:ס\©I»µ¬¬’½ûv°£+ôïø[üΦŠüQÖ~.øËàw‰ºÀ­ö¡ø[ñßIøÙÿçOøgŸÛ‡ãö•ñÛoƒi_ÛOŸá.Óþ=Â}ûtk~ðOí ¢i_¾xJ´ø‘ã-Wá/ü*ù¾%øà/€üWâŸøLþ1mø×þ )ã#ÄþÖtïÙÛDÕ<]âŠ?µgìýðkM¹ýª~ xoÀþ!°ø]ÿ0ý‹?àCÅ_´7à~­áÏë~*ø“ñŠïâ›}k࿌>#øQðÿÀ÷¾ðwŠuŽ>Ó4 ½œžÚ¦ìµIß•Iuµš{¦ÖŽë¯kìý;w~¾Gìù{û@þÑß¼MûÿÁMo¯´øR´ì»ðOöŽðW‰î~|L×|[¡xgâ5·ì‰¡~ОñoÂ/‹sx;áµìÿü\øu¨>½¨|:øy®øgâ5—‰´}ÓVÒ|?¡xãÄß.øgö×ø·àŸŒÿ¶·Åÿ |7ÿ„¯ömýž> ëÞ6øÑá/~Ôÿõ/x'Jøû|ÁZ¼ñ_âÀø‡áWü3ã|VðÏÀiõmᇈ<ð#Á¾ Ò¼/ð‹à~•ãØ¾øSBÖ<*ri½4vµÖ·å¶·¶¼Úwù«»þ?ð?Ìý䢾^ø]ñûÆ^>øññŸàþ»ð‹þ­'á‡Ù¦ÒµëŸiZŒ¯4«›˜¬ü?â|7ŸFѰ|ñ“gˆu¯ÙïÇ_ <]ñçÁ¾*Ò¾|[ðoÆwö{ý ¾x—àE¿Å³Ä¿ˆÞ.ý«~Íâ_øÛZ´ñ·ü>Ûþ/ßx«]—Á·ðÍðQ_ÙgögøýŸàa~¾Ð?á]|ð¼Ñÿáд¿´j¾"ø‹ã­WûCâÅo‰Þ*ñt¨=oee~ûÅÉmÝEþ »^i~§ëÅù{}ûcüF´ý¬¾,þËß¿g/øYn<óþ-øFÇÆšç‚­í>7|Zø§ð»káÏüwßþ k?¼ð·[‹Â+ûC~Á¿¼-§x—ĶWˆõ~Ý>ý…¼c¡øßÄš^•â 3ÃzßÃÍ3öصƒUðF«ø®Ã_¿øq~ü`¹Ò¾!ßêöý©>*~ÖýŸ?n/ØëĺèÐ~,èŸ~üVÓt˜>,3Åß¼}â?оøðfçJø“ðWDñw‡?déJ.;èîÕ¼ÒO¦›5ø†áUo¯¬´Ë+ÍKR¼µÓôí>Öâúþþúâ+K++Hž{«ËË©Þ8-­m ŽI®.&‘"†$y$uEf«Ì>7Éø»ÿdÃÇßúŠjÔ¢®ÒîÒûØü.ïƒôW~á}áOþ[WmáÿxÅšaÖü-®èÞ%Ñ…ýΔuêvZΘ5;+{»Í4ßéÓÜÚ ûKMOMº¹³2ý¢ }BÆicHîài?ž;ïÛÇöWø?ð×á—ì3ðËþñðûöÿ‚¢xçöýˆ£ý¼?âÿÙ›áÖ¯ðãö¸³øùû'x;â'‹¿j|OÕü'á©ì¾|ø¦|Wð×ÇÙ/|N"Ö5OǨÿÂÛðÆ?Ç_þÍÑÄÞ)øû6þÏß <kðÆßâg|áâÝÇÁ xÀ¿ õÏŒ£áGÂK¿Œ>,ð/„¼+à߇~Ñ+ñm¥¶—à/Á'öÓÜ·†tY§“Oƒ®¾4©¹©I»¥f’Z²#&Ý­Óü¿àš´Wâí-wâWÁ_ðWÚ|NøÙ¡|Lý†¿á4ÿ†g øëñÀ|ÿ çþ åû<~Ô^ÿ„·à¼sáï‚ü¿Ÿ¼eâ]{þÃ߈ßð™hZ§ÃŸo|3м?àý+ê~Ú_¼9ñâÖ‰}ðCÁ2þÏ¿ÿjÙçöKñ?ÄëOºëüc¿øûKx[öa»ð.µ ü ›àt ºðN“ãoÚÇáׇü[©j´V—®Øx[Eñ¯Œ4 ëÚ¶¡xÄ|ÜŽÊÚév´]"ô»×ãK½ï§Rÿ®ÿðÇèmø7û:~ßß´n·áoØ×@Ô> ø'â—íQûN~Ëß°®½®øÅ¿µ޾üÖÿáqüÿ‚Š|r‡Æ·~ðÇìáã ü7ñµ÷†d-c[ñ­§Ã¯ƒƒûoÅ?´†WÞ-Ö¼ðÀ¾,Öý³ÂðPÍWã7‰¿gDøö/|iÿ…sñ¯öy²¸ý¢¼eá?ê_ ?iÙöõøµû=êß.|)ðÖ²øÛVÿ†Nñç„~0|oüsøað‡UñgÃïŒ~#üiñ·´}7En”Óz-Û¼v×]öÑÙþuýyÛüÑúñE~6jßðSÿŒ:7‡<’~Ê'ˆ¼sñs[ø¿®|#ºø[ãÏÚ“ã¿Áo‰¿~ Ø|Ó¼CñǾ1øû|Løõý‰âoˆŸ´¿ ü5Ô5ÏÙcEøEñÂ~Õþ,ø[ã~¡àoü »ø¿ú»ðÓÆ¿ð²~øâ/ü"^6ðü'Þ ð¯áø— ÿÂ-ñÁ_ð•hVïü"^?ðÇÚïÿáñ·‡>ßýâ­íןØúíþŸö»³ùÏ2„¢“jÉÝ-SÛG³{4רÓOoë¯êvÔQEHeë:Þ‹áÍ6çYñ¯¥è:=Ÿ“öÍ[YÔ-4½6×íZ[ý¦úúh-`óî§‚Ú6Tón&ŠÝ$ˆ§R¾!ÿ‚‘ÿÉŒþÒ_öOßÿOZET#Í8E»sJ1¿k´® Ù7Ù\ú?þwÁú+¿ ?ð¾ð§ÿ-«Ð4­WL×´­?]Ðõ gDÕ¢ž}+YÒ¯-õ+S‚ÖúïKº›OÔläšÒò+mJÂûNžKi¤Ho¬®í$+qm4iôÇü0ì!ÿFQû$â7üÿæ2¼¿ÆþÐ|&|9á_ èšG†¼1á­#Yðÿ‡<9áý6ÏFÐ|? èÞ>ñ¦£èš&§Cm§éZF•§Û[Øiºm…¼v6pCkk PDˆ½5ðÑ£e&ßšKª_©“nÖéþ_ðNŠüQðߊ~ü4¿ý­4‰ß5߉šïüâ_ìëâøÿã¯Æ?ˆß5߃Ÿ¿à¯ž*ý­üaðSÆþ9×~ü9ÿ…sðÏ]ðîµðÓļ7ðçÅ:Š~øWMÔõ½wáž»ñOáÏÄn'ö¦ÿ‚”øûÅ ?o?ü5øñ³ÂðoÁ?ø('ÃßþÒžðçí+¥j¾ø·û0ü0øç¥ë~=ñ'Ž[ötð§ìÛà¯ÄoƒÞ*Ð>xÛáoíñKâ{xËUøG§jÿ <âm{â™ð{e&íRn-íf­~º­nºµÐ«­{~6ÿ4~òQ_žZí¥ñDý >~Ëß>x'Â<{ãoØ]Ü|,øÛ®üVøs¢|9ø›ðCöÜø§à¯[ø£Å¿¾ x›Wñ±ñ7ì+ñ#ÁÞ(ðžÒ4-Bñg‚¡6½àÅ<{ÿ3øgà_ÚkÆ¿ ÿfïøÏþ÷Á?´oÅ?ŽZgÄOÚ]øcö‡?hßÛà„î>^xközø»ÿ Ÿ¼yÿ EñSž!ð¿‹í>h^ÿ„‡áþƒ¦øßâöŸˆõŸ /g;ÚË§Ú½ë¥­í­´×óAuý'åþhýx¢Š*QEQEøÿõÿ’Wû=ÿÙ@ñþ£–5ûù_€ð__ù%³ßý”ÿê9c]_÷Šöÿþ‘"gð¿—æè“Åÿò´ÿ±_Àÿú…ø~¹zê<_ÿ!kOûüÿ¨_‡ë—¬gñËüRüØã²ô_QE# (¢€ (¢€ (¢€ (¢€ Æ·ð‚gø›ðÏâæ½¦ë×Þ4ø97‹ï~]é^ µÒ,´=SÇ^ºð_ˆõ[í>ëAÖ­õË©|)¨jº&Ÿo~™c³¨ß¾Ÿu¬C¢j:.ÍQ”¡%(»I^Ítºiþ ƒWÜöëïŒ·š••æ{ÿ DÖwö·Wpÿmx:?6Úê'‚x¼È¾G,~dR:o‰ÒEÎäu`ð¯ˆ:g‡>&ÛxßFñ†tOøGâ %Óy°ý•¾Ø|ø™û?Éámo\ømñ£DñŸ‡þ/|Fø™ãŸˆì<á4ð‰§ñ÷Æ_xÇ]øÉâÍnoÛi~ÑüK®xö÷Ä~ð?‡|%á jº/‡<ám3HòíOþ ãû&êÞ)Õü[sà_[Ýø£þ(|uáí#ãßí  |9ø£¥x»ãÆž'ðÇÆ„ÚÅ=;áwÆ?ëßhŒúƧà_Š>ñwƒnô/ˆ¾"ðº|>¸‡ÂÐ}¯EÒ[JZêõz¾û…—cÅ<û:üøyñÅ¿ü!àÿì¯xËû{í×rxƒÅ:®…áÿøLµÛOüEÿ…oà­c[Ô<ðþç´ý7âÆÏøU~ðoü.ψÚV“ñâÇü&^6Ò´ýzÛç‹Oø'×Â+Ù¤“Æ> ø£}qáߊ?´ÿ>x—áÆŸß³ÄøsöÂø«£~Ð>ø¯Æ?³÷Ƈ¯ñ#DÔþ7Ù]kžmGKÑl4?èÿ<-w¢k^.ð‡ˆ¾&xÿï*(æ’ûNýﮉ­÷Z6½[óÏÃïÙ[àoÈⷄ|-­¯Ä™4MoÃ÷¾6ñ/Äo‰ž<ñ¯aâ_þÍß|C?ˆ5?øÇÄ—"ÖõÏþÈ߳冫â]uµßßøÜê²xÆž>Õ¼SåÖŸðN¿ØâÃþŒvŸ¼­?àßü(«¿†úü,ŠOáox§öiÿ„ÓàŸÄïøD¤ñ»øgXøÙ௠ü6ðWÃø^ºö“ª|cñÁÍþŸ‹|s¯|#Ôuo_ý¯EÒþivÝì¶[ô .ß×ô—Ü|Q­þŸBø]á/‡V?ð­ü3àøbß ê‘Ú]x§Å:î±ðsþ ûñ\øÙû1ü,Ðuox¾ÿOðçü#Ÿ/ìnü[ã}cAñ§Š|kðæóƾ Ô.-üM­x3âGÃoµè¢“mîÛõù’û€+Ä^Ó©©èeݵßxÀx¬[3[_¥Ê_ê忣¨i÷³ÝÏ{§è:b*¦™ è–Ñ[Zhʪ¶Ò<¯#»¸aóqV’­ViÆSrO£·M{iòŠ[+_×ç¹ò÷Ä_ØÛöø©ã-cÆÞ2ð糧ñ_öü,/ økã_Æÿü$ø»ýŸ¥Xøq¿áy| ðÄo |øéý±àí+Eø{âÏø\ñ·ü&Ÿ 4|0ñwößÃïèž°â|?û ü0·ý >4þО5Ö|mã­oâÆÏügÐ| wñâÞ“ðsÂ:¯ÃŸ‚þøJ]{àU§Ä¹þ|Nñ·†¼WðRÓâÇ„¾(ø·áwü&^ñLþ ›A¹´Öþx+ÅÿkÑSÍ%§3ÚÛ½´v]–‹nòíçóî|½á_ØÃöjðOŒ¼ ãï |6þÈñ7Ã/øGáøy<>1ñôÚW‚t¯é_´Ç‡üá xjïÅ7Ѽào þ×ÿ´„¼ à[ø'Á¾0мá] HðÏÃ/…zW‚xsþ ×ûxÂÞðV³ð{ížð·Á?þκ™ÿ â•¿Ø>xàçíðÂ^ûe§àÔ.¿²~þÖ?ü%ÿ åÝÇŠoÿá>þÞÔõ»Ïx[ÁZχ>×¢Ži4¾÷þ~l,»/ëþ}ÇÈsþßn¼9¥xvê÷ö†¹¸Ðµ¿kZgý²ÿlI¾4èÐø²ÃÃV>)ðŽ•ñöOŽíñ¿Nø]âWð_ƒµŸ|´øƒ­gÅžð×5Üø»BÒõ»_¨|5á¯x/Þðwƒ¼?¢xOÂ>Ñ4¯ x[ÂÞÒ¬4/xkÚ„^‡áÿèz\ºf¢hÚe­®¥iZu­µ†am¥¤ÛÃk·E&ÛÝ·êÛ¢Š)Wñ#áŸ>1ø']øiñ;LÕ5¿ø²[/èº>´þ¿Ö4»mBÓQ“J]nKÛ­:×Q’Ê;=FâÂ(u1§Mtš^¡¥ê/m©ÚvôSMÅ©'fšiöiÝ?¼7=ãþ–­ÿ=|Qÿƒÿó³¯/ñ_ˆ£ñ%åÌv·VßfµºŠV½½¶¾¹»¹¾×5zîîYlô½Ö?2ëX™,cŽ(ã@ Î/E\ªÔš´¦ä¼íëÛÉ $¶_×ô—¼û~Ïÿ ¾#_üSð¯‡|lÞ&»ñ·Ä¿‰vgо5üoøƒðçÁÿ¾0ë¾*ñÄ¿ü4ø=ãÿˆÞ'øGð§ÆÞ,Ô<{ãû{ÿ|4ðG…5Øt/ˆ>?ð½…ý§†|qâ­#WÄñ_ì#û-øâÿâ=׋>kzÞ™ñODø¡¢ø£Á¾0…Ztßü9âO ü]ñwÃσÐxú/…~(üJÐ|oñ ÓÆŸ>x;Á?|C7ÄߊšŽ¥ã)õ?Š?/üñ‚f/Ù·UðOŽ~ü@ðÂoþѾ øâ |Wøñ;âÄOi^6øQû`ü#øG¨x'OÔ>.xòóà·ÂŽŸ³—íðsàž»ã//‡þê¿|uâ†?¯SU&ÔŸ}]õÚöwWó“éýH(¢Š…Q@Q@~ÿÁ}ä•þÏöP<_ÿ¨å~þWàü×þI_ì÷ÿeÅÿúŽX×FýâŸý¿ÿ¤H™ü/åù£ú$ñü…­?ìWð?þ¡~®^ºÿÈZÓþÅÿêáú<7‡‘â[ëí6×UþÊÐb½µµ½›Q†Ûí3xÃÚY–S¥ßi×O²×Qº‚écóÑöYI^rWKÞ“»½¬®Þɽ—a­ô_‘ËÑ]Göþ“ÿB?…ÿð/ÆŸü×Ñý¿¤ÿÐáü ñ§ÿ5ô¹WóÇîŸÿ"?“ü?Ïú³ò¿/EuÛúOýþÿÀ¿ó_Göþ“ÿB?…ÿð/ÆŸü×ÑÊ¿ž?tÿùù?Ãüÿ«?+òôWQý¿¤ÿÐáü ñ§ÿ5ôoé?ô#ø_ÿüiÿÍ}«ùã÷Oÿ‘“ü?Ïú³ò¿/EuÛúOýþÿÀ¿ó_Göþ“ÿB?…ÿð/ÆŸü×ÑÊ¿ž?tÿùù?Ãüÿ«?+òôW‚þÚßµ¿ƒß²—Ço‰?¼5á-ÆÞð©sárXüKªW½’ßJµ×-´Ý[Ä÷º=íþŒ÷ßÚzm¶³§êš,º…­²êúN«¦›­:çÞ¨q´T®šnQV¾ñQn÷K¤•¾b¿OOÇþ(®Þyô#HðÃ7†4mRçTÑ®µËÍFëÄ«;ξ%ñ˜Š©¦xƒM´Ž(í4ÛeU[`åû»³ñCûIÿ¡ÂÿøãOþkèåJ×”V‰ÛÞê“é1üŸáþg/EuÛúOýþÿÀ¿ó_Göþ“ÿB?…ÿð/ÆŸü×ÑÊ¿ž?tÿùù?Ãüÿ«?+òôWQý¿¤ÿÐáü ñ§ÿ5ôoé?ô#ø_ÿüiÿÍ}«ùã÷Oÿ‘“ü?Ïú³ò¿/EuÛúOýþÿÀ¿ó_Göþ“ÿB?…ÿð/ÆŸü×ÑÊ¿ž?tÿùù?Ãüÿ«?+òôWQý¿¤ÿÐáü ñ§ÿ5õòwˆ¾/øŽïöÍð_Á‹ ;AÐ</ìÅñ#â~§a¥[jSÞë>.³ø«ð¯Âš-Ýö¥®êºÕݽ®£_ëÐéö:Cév÷Rø‹Q¸×X–Ï@:+P½í(»'&½í—kÅ/ÄWò};u·Ÿ™ôMQP0¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯À?ø/¯ü’¿ÙïþÊ‹ÿõ±¯ßÊüÿ‚úÿÉ+ýžÿì x¿ÿQËèÂÿ¼Sÿ·ÿô‰?…ü¿4Dž/ÿµ§ýŠþÿÔ/ÃôxþA>8ÿ±^ÓÿSOQâÿù ZدàýBü?Ypëz/‡ÌíßÍtW˜Âîø1ÿEwá‡þÞÿåµ𻾠Ñ]øaÿ…÷…?ùmSÉ?å—þÿÈ«®ëúÿ‡_yéõùåûG|4øsñÏöÓý—¾ülð‚~0ü#»ý—¿mO‰w >)øWBøƒðæëâ7þ+þÁžðWî<âÛ _Ã3xÛÁþø›ñ#þñTšck¾о øßHÒoí4ÿëÖ÷ÿ_Âîø1ÿEwá‡þÞÿåµywÅ¥ý‹¾>ørËÁß—ö_øÕá7[¶ñ.áo‹CáOÄXxŽÎÃRÒíðÇìa§þѺOÀ;ègá§ü+ŸøW>ÿ…=ÿOü*?øB|+ÿ ³þ§öü+ŸøW?ØVð„Âÿ¿üS?ð„ÿÂ3ý™ÿ¯ü#¿ñ"þÂûöGüKþÏ^a øöQð¯ü!_ðŒkׇ߳?á[x&ïá§Ã¯ìSá¾ÿÛÿøD¾ÝàgÏoÿ·‚o?áð/Úü+¡}ƒB¸ÿ„+Â^uƒÿÂ9£ýoÃÿ?g_ ØO¥ø[Ç¿|5¦]k~%ñ-ÖáÿøF°¹ñ žÓN¾¶·›[ñg‹µÝsÅ>%Õd¯õßë:®¹ªOu©ê7wS9óJÞä•›èõ¼¥-tÝ] V]SÛòKü¾óÚ¨¯0ÿ…ÝðcþŠïÃü/¼)ÿËj?áw|ÿ¢»ðÃÿ ï òÚ£’Ë/üÿëþ}çÎðR?ù1ŸÚKþÉûÿéëH¯·«ó›þ ñKá—ˆÿbÏÚ'Fð÷ÄokÚÅçÃûŸ±é:7‹ü?ªjW_gÔ´Û»³XØêÝOäZÁ=ÌÞTOå[Ã,϶8݇èÍ\“T šiûJ»«}š]Ä·~‹õ:È'Àÿö+Ýÿêiâúåê·Äˆ¿¼#mà=7Å~:ðw†5üq} ‡ˆ|O¢h·³YKã¯AäVº•õ´òZÉ=µÌ)p‘˜ž[yãW/оsÿ »àÇý߆ø_xSÿ–Ô¥6šŒšå†©?äÓëñ³ö:ð×ìeðö&ýÿnŸ‹ø]ð·ã'ˆd?|eø³ûCXiIá¿?üGû)ê~;ê?5ïAoñ'ö Öõïh?>9øÏÁ^.âmÿ‰|YàtøÍ7‡5|<ðÿŠ´ÔOø]ß?è®ü0ÿÂûŸü¶¯ðW…ÿ`¿†ß¼[ñ‡áׇdOü\ñ÷ö÷ü'_ü¤üð·ÄoÿÂS®Úx£Äÿð–øßB·°ñ7ˆÿá#ñ5…ˆµïíNóûc]³´Õõ´jðÜ!$šqž¶Ù5t®¬üû=¶§uÿf¿O½žý¹oé>.ø/ö[ñÁÿ…ÞøßãOŠ? ô¨<_ñkÀºo€¼9cð«ã/Àø(Žâñ-—Âï?¶oí—o®k ¼]ûÝx‚Ú Gö†ð|߬5íKá߇ÿgÄHý£/=GÀŸ¶—íñZó↟ ë²÷Âßødø»Å¿üQñ‡Cñ՗ߌ¿ð~Õ_¶·ìÇ¬ÝøwÆvtßøcoßà ø·â.¯ã_èÿµÿü+­ ã™cw øÛþ¶§ª|búáŸÃ/ø'GÁ[ôÕ> ü>ýоêqëv%Qøgá?~¿ÄzW‡…©xâ/‰îmåÖümàCDðï‡ô{ï ø–ûSЮô­ GÓç°’ÓL²†kÿ…ÝðcþŠïÃü/¼)ÿËj™§%©Ê6¾Ñ}mëv­fô¾öNãOÎÿw—ùþ>‡§×Ä:—ü¤‹Á¿öd?ÿõ||&¯£ÿáw|ÿ¢»ðÃÿ ï òÚ¾R°ñO†<]ÿð–¥áOè>'Ó ýŠþ'ØÍáí_OÖ¬¡½‹ãŸÂ ä³–ëM¸¹‚;¨à¹¶™íÞA*EqŒ%˜„d¹Û‹KÙËVšì ­5[¯Í~QEŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ¿ÿ྿òJÿg¿û(/ÿÔrÆ¿+ðþ ëÿ$¯ö{ÿ²âÿýG,k£ þñOþßÿÒ$LþòüÑýx¿þBÖŸö+øÿP¿×øóá¯ÃŸŠzE·‡þ'xÁ?´ =JfÓCñç…t/麽½­å•¾«m¦ø‚ÃQ²ƒR‚ËQÔ-!¾ŠºŠÖúòÝ%X®gGþ&õOø)'íÓ¬jZÿí5ñ)îï%2Ëö{í:ÆÖ H­¬´û :ÚÃN°µ…c¶°Ótûk]?O³Š +k{H!…(ÃÄ¿mïú9‰ÿø8‡ÿ‘+w‚›“’©ÛoDô»îJšI+=_—üééýÃþÈŸôjÿ³‡þÿ†_üËÑÿ sû"Ñ«þÎøcþó/_Ç/ü øcð[á7Ã~óM›F»×<ðçÁþÕî´‹‹«;Û*çRðþ§^ϦÏ{§i÷sXË;ZËucgpñ4¶Ð:ÿðñ/Û{þŽ_âþ!ÿäJ?áâ_¶÷ý¿ÄÿüCÿÈ”<W£«uÙó˜s®ß——õò_/þ¿áâ_¶÷ý¿ÄÿüCÿÈ”ÃÄ¿mïú9‰ÿø8‡ÿ‘*~£?ùù¹Ú.ÏúþŸôôþêh¯á[þ%ûoÑËüOÿÁÄ?ü‰Gü£?ùù¹‡´]Ÿõý?ééýÔÑ_·ü0|SñGÄ-3DÔUÑí¼I=µçömü¶ÒZM=”ÂÖ;‹´[Èc¸Š9V.ž9ÚÝ¢ÒŽTªFnqj7Ñ'}b×êKši«oÿþõ·ÿÙPythonCard-0.8.2/tools/standaloneBuilder/doc/pic14.jpg0000755000076500007650000020043710231140007022475 0ustar alexalex00000000000000ÿØÿàJFIFÿÛCÿÛCÿÀ%*"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ý²ÿ‚žÁN¼Mÿññìéá/~Í6?´©ñ×B×LÑ4«ÍÃúîŸ௠ü)Ôn–ÞøCñ'WñUçˆ.<srà}Žk¦»¶¥Þ,¿5$ÿƒˆ¿i(ƒà”þ7Œ RÆMH PÌQKý’PάªN`Td‚+éÿø*Ÿ‡<3ãø)ü'Â^3ðîƒâï xŸâ¯ˆ|?âO ø£GÓ¼AáÏhÚLJf ?PÒ5½V¶¼Ó5]2þÚâKkËûYín!‘£š&BEBðï/ØþŒoö=ÿÄfø-ÿÌM~Õ‘Qð›$àž̸¿„3Œ÷8Ï£ŸU«‰ËsÌvœhåÙæ/AN„qô¨Æ^Ʀ½EÆ’”ùªJrf•xó͇slŸ/ËòúcK3Ëå‹©:øÌ<ªUTåIEòARŒß´œ¤åVÉÆŠ?’ÿÁË_|ikã?ø&½÷„,o§{[+ßxËIÐ-/.£å{k[WöSµ†âá#ŠGhbwuDwe ŒÃ—‹þ—Ö$ÆaŸ !ÜCø[> ;ý™lþÌJAÊÉ@ Ë‚ÀGvÖŸiÁÉ?³ìíð+öDЯ~ |ø+ðwPñ Æ£m®ß|,øYà_‡×ºÕÄ?‚óÚÚê×^Ð4«FÖÚâæ[ˆ`»y¡†ydXäc øóö"ý–¿gOØ[þý¿c¿‡:wÆ¿üWø9ÿ !ñÇÇO|Oð3|;ñøñ§üÏÇß|J|+ðBø#¢x“á×™âÚE¡ÿk~Ð?×MÐôYôëáâûèµ ý®!ðo4á¬OåÜ ˜ÆTðI™aòÜOg^Ú¦†©agŒ©ˆÅC4 •\ÇJ•,V!ûoORœ+FañÙù¦u€öñÇeØ9â°Yu‡æÌiÆT}• ÔgVr\˜‰>yÓ‚T•7QIÂUàè½`€[öðºž2Åoœ·¦fU%rO$)ʧr£Çü«‘ÿ&Aá~œãâ·‚Èã?ðÌþÇÓ'8ø‹Â¿ðKŸƒ_¾þÆÿ´ï«/‰šì÷ñ—ö}ý¹>>þÑ~ø«ñó–ž!øà/ØÆ£À¾#øƒañïÀŸ²_е/h~&Ô¼Uðù­|áOØËÆþ7³¼PÒážïH×§ñgßmøÇÿŸý‰þüý¢¿iíCÅ¿´ÆO…þý’àœßµ7Âoü?ø¯àß^ßXþÚŸ>%ü'ñ6¬üWñïì§y©x»EÑ5/ZxóÀž&¹ýœ¾ xŠoë+áOü;ÒµÛiõ¨½Ipw‚°­O .ÇÏWýŸ 4ó\ún9¢ÎÿÕùe•jG=ö4qQÌ/ïV« $ðËëT±5(Ê‘K5ã EÔyN4–!Íá°QO ðkDÔTçIáí¤"êÆ§î¥MM5 #ÿƒžu—8?±'…Á Š^ m«¿nãŸÙ¡?+åX.Ö\¯•xm.'ü߬7~ÅSÆ@ø¡àÆÁ8éŸÙ­I'’€à§xO9ñßüWö[øñcÄ>ø‘ãÏ¿¼)âŸø*Oìãÿöø[mà_|;øEâxã÷Àßü}“âµ­{áGÆ=7â~³áM7âo‡|<;á ü(Óõ­GÂ:Ç‹ÛVЭ|O¦xSáÿ;ñ'þ kÿåý<-¥k_´¯íYñ+á>™ñgãçüá_Âï]Çâ-~ûÀ>ý“þ1øƒàW˽CáoÃ/Ù_â•·Ç_QñN‹¤x—â¥ÅÿÆ?ÙÆøšÛIð›©ê&£~¼á«¼'Õ8g6Æ,t)Ï&'б±Šx*™EC O5–-ΆjµiË ËØÎu^r§Üó3¦êûLË GØ9*έ<²œ(¸×…º•e…T’YÓŒdª8¥(¹ºqŒ¥mOø9«Wù²¯ Œ+1ÿ‹àÖj#Ù¬žB·$1–*¡ŠèEÿ.jïß±‡…”‚râWƒßpU'?³j¸‰7Úc(Á˜î¾gí‰û/üø“û4|ý«¾5Éñ'_ð·ìÿWÿ‚OC§ü+øYâ¿ ü6×üu¯þÐ~*|?·Ôîþ%ø³áÇÆ;Ãú?‚ôÍV¾›Dƒá~©{â[íONhüGá{}å5ŒÁÿf/€¿ÏÏïø)Ç‚~|?ðüÃOðÂðGÄÿÁ:?d¿‰¾4ñ‡„µøgÀž+>$Ñ<{oâKÄ¿ ôo…Úwˆuÿˆ4û=O\øµªüR”êz-ž…}à‰om¢ñ%¿ç·Šþx7Ã~ðÇ‹ô¿ <}â wûûWáo„ô_~=ðOö¦>©}ÿ 6£ã¿þ øcv|7}o‡5ŸøC~#ø³ÎÖní§ðïö燢»×´ÿ[*ðÃÃ,υƪ˜ÊÅÕ¯J•9f¼G^Þ¬é{J•0Ù¥ZtiMÓ”£Y(»3ƒÄÜM†ÄV¢óZU=ŒiÊMarø0—,cS NqºMSçÚé5·ô#ü_¬Jäϼ.ª¼»ÂÂðY Á8Éýžd…b7+;²F’¼z1ÿÁÄËòß²…йñÑH 7ìò™çÎJ” L|)ût_i³wÃØ‹á_Á=áŒßðMo€¿>%jú×ìýð;Çߵω?dø“sñÅðüdø‰ðïÅ_ô bþH “Ã^:Сð¶Ÿe#ð­¶•`úoÖ>0ÿ‚B| :ý¡>xâ/Åâgì·ñkþ Ùð¿ÅßüY?ƒüaàoŠCöÝÕ|#àßë¾øI£x?ÀZÿÃàOxºÏÄ:F—¨üeø§­£hÓxZïRÓï5 h^5N ð—C ‹ÇpÍ\&íêaeëˆñ5#…Ãæ˜žXœd!˜ÅQrÇæy}G,T×Ö•[º4q)v¼ã‹*N­,6eµ(*Qªž.¦Z˜ZøÏgFS¡ïÛ„ÄT稨¯Ýr[žTã/AðpÖ®æÑ¼.=â»ðo·ý[ç¹ÆqÓ¸m¶cÿƒ„µy9ÿ†Jð¨Ïü'~ ùrã'ö}T-ˆÉ²€§{²$s´^ßàØ£àgÆ€V°§ï¾,|<øiáïø-¿Æ†/ñ_Šü_àï‰9ñ/ü(ŸÙâf±¯ëž¸Ò>ü1ðÿƒÇŽ´YèÚ6™©è>7ÿ„W¿¸×ï5YÆWð[ö¦ðì…àû?…Z§ì¯ñ›Sø®é>)‡âׂµãoY|8×4mkþ)]KÃÿügû;þËsøÓLñφµä—Fá&‘{àkÃÚ]øƒ\Óµ]ÿLœ“‚¼+Îqu0øC2¥‰…O‰f\Iˆ¡K R8©`ñÜM ÆX|Ƭ24iÔ©8ª”cFU}µzæñ™Ïà¨G,Ú„ à·ÃåÔç*±tUjtiÏ §YPöô\ä£ã75Ju%ؤÿƒ€õwþÉÞRÈÿ„×Áè9ýçìÿë¸c~}Œ²¬3ø/î®æÔ|.=âµðgû=?âÁr9>9î ÙþÔ³Gìóñ÷þ ‰£~ÀþÔ´¯ƒ>¸øƒá-k^ðW¿ػögøgeá? h³×ÅoÃáÚ3ÂZÌ_¼cªx¼Áöh´?xþï ëž+ŸZ{CðÓÃ:V¹·§ü.øQñ£þ áû:ÝxgFñW‚üðãöÿ‚¹|[ðfƒãi> ükñ=¿ˆ<ñÇàôkk©x»Åÿ¬4­<_ê·Ú¥í—‹>x+á‡Äï éÓYéžñÖs©«k?ú»ájÃ䵟â"óxeøŠ‘žyÄ´ãÁæ¹nqËêÔ•LD%‰­ˆžK‹ éáiTÃAFuþ¹*~ÃëÌ8©ÕÇSþØ„–UèÁÇ–¿o_ ˆÀañŠ6©BŸ×©TR«8ÔzCØÆ^ÑQóØ¿à¾ZÄ„ý”ü/8>1ðyÚŤR§þ,)úÈù¶¢NðßOø/.®Àû,ø]I°ÿ„¿Á (çûÿ‘¸!²PŒ|ÁvÉåç~ÕŸ²/ì½ãÿø(wí•à­À(øIàßÙcö[ñWí)㟠ü+Ö¾xSÂß×Á_þjÞðOÂíÏàÒé?Þ­â¹õOx“Y‡ãoü$ú„Z…î™ xf÷Róô¾KRÿ‚uþÈþ øQã¯Ú â¿hÝ/án‘û8~À´Æ‹á†^-ñÿ‡´oÚŸÇ/ðŽþêš–µ¡|=ð÷õKI¼Ëá?Úéÿ -O—W­Âù æ8\£K ³,ûQTΧ„Ž â~Ò­Hã(ÖN)ARšŒå J–8U̸Æ5±éf¸ià WNuJ<˜(Õ•z­ÕÁÇ–t' k.x6“¤ãTô1ÿáÕÏ_ÙoÂãþæïÿ³Ïü~Ÿ1<ã|ÁNð—aÿ‚êk2€Oì»á„9ÃøJüÁâ¸'þH<•p>P B¬íÊ?°…¼sû#ÁB¾!k‘üð÷Œ~7ì—ÿ7ÅOŸ4ŸŒÞøp<[ñ3Åú'‰¾ÏáûÏ„uH‡Œ4´‡Ã’ÿcøWÍôÚ5î¡ý—o¤¦±£}áÏÙWöý¼>5þÐþ'ýœü`~x?á¯Çx÷źG‹|Cáß…ßö5ÿ„VÚßãOÄ?„¾Õ|5âÏx{Äú_ĽÄÞ!ÒÓÅÖÞøWàøËáÖ“¬hþ»‘<1áÝq|ᆚÑÅðŽ>ž («N†+4§™ñ|4+TÂ个têòæŒ%Z9Õ(P„*UªÞ:Ôðôþ¯*ÓO8âªø|ðù½ b1‘s¥…ž-…WN51´¥8©aÓj›ÀNU£N)T¢¡)ËÚFŸb¿ð\`ãwìÇáe8ù‡ü%> àå·ÀÄO]¼rÛB¹IGüW8ÿŒeð¸éÿ3?ƒxÎÞä†ô98Î0RËœ5íXt›~·_ý€>~Ö¿´oмk¥x“âoÃOøJ¿à¦?´¿ìïñgMÔu ø÷þøD¼ ãoÚRñûÛøü=Ñðž¿á+x’Ûâ§ö ×ômv}sZ>¼ÑgÆÝÀ"ý’?kßð«Wâ€ïü]aã/ÙOℼ"tÏøZ¿ð¥¬t; xÿEñ7˜,[ឯá=WOûXÕ|Ek$Zn›è·?³?¯ÙÏöný¢þ<øÃúgŠ|AªþË?°WÆï„Ñ|jð¯ÃÿŒ7?í¿hÿ‰þ Ñ>!xV{/ø1>øãQuðRŧxæïág‡µ/F¿m'J´Ò¤:¾§­éW…ü(U c'Šy ¦4ªæ¹å*k1«›QɪaªVŽm[•añu':ÕéÓ­FThÔ–uç*4êc׌ZIæ´cGêÕ1’œ0˜ Ïê°ÁK±„°pæuhÂ1§MÊU'ÕT’œ¡}?à´ú»œÃ7ø\ ø¨<pÎH‰€ÜÇÎP,¦;ñÁfuy>÷ìëád<ä.»à÷#æU\ÿÅ“\bÀîÚSc’e‡åŸÙwötðçí=t¿h(ôßxâÇß…Ÿ³‡„µß‡¿„þ []üKñçjð׆_²ßÅ? Ýj0ø^-VKÝbÞ ›X¹’M[ƺ–­¬ëzŸ…}{Æ¿°/ÀχÚOÀjþ+¿Æ?þ2~ÏžÖ4ÿ x6ûá­¾«ðÃöµðÏÀùüs¬éRjºw‰ô 8|>}cWOYk*¹×|a©é¡¼aàí ×ÚïN'ƒü'Áã!—br Lq~Òj}_3â,^Ú¬#ŠtëÓ̧KOˆX§:4jÓ”StmÍÉšÎxÆ®ë43~Ë—{\6[F«‹ÄQÃÑæ§S e,DëRö\³”%¯¾šJ^¦?à±ú¹ëû;ø\zç[ðg{Ž~ Ÿ”÷©$b³Gÿ‰ÕÜóû<øa@åÈÖ<ÅF tÉUr¡Š”—dU•£å¿i|;øqû|GøiðÏLñ†ƒðÏþ ã/‡—W~:ñv‡âý_Ä·ƒ> øƒÃóø’Ú}Àìô]?U³°°’Éa­\éw)y#øžþ+ˆc°ö€u¯ØÿŸõo |,—öý¡þ|aøÿáyuüöƒ¶ñ­Ž±àMköcð¿Âû½^ò/éß ~&xÁ¾2Ö¼m·¼])£ñ•®©â¯\Ëw§Ûyµ8kà  Y†#…ëQ¥[7«–Æ2Ïói 5?ÖëæUÿáO’8hÊs‚””jJUάTv¥šqmJÓÃSÍáR¬04ñNK/Á(ºµgTð´íƒ¼êN«Œa'xÆsö|°iqqÿÁ^u‡·ìýátõVðnA€ß×*rÜœ0‡U1"°?à®z¹ëðÂã×:¯ƒ}~Æ~;‘‡ÛçW¿±/Á7ðU½Ž‹¨üQÓþ!ø'F‘ûtÏâSÅÕ¼uh›NþÞøm€­~h:ìZf¥:Ši>#“â+ÜèOq§µÖ‡¯E¦ÉoyôfƒûüøkûJxž‡—Å MsöHý¤`ùnµøŸÂ~+Ò¾"é?ü{á4žÎßGÐ~øïÁš‡†o5KâÕ$×¼ak«[X]Z>•¦Ëî•5¸{ÂzQ¨ãÃØÉTŒ*Ô9fYä"ãVFSœsjŽñ8ìφƒŒ*U¦êNµj0¡NU¥™q´êBù¥JR§(áröÔN&¤T^ .S£†Á×­+Êä¡têN¤£€‹þ Ù¬HØÿ…ápß?Ú~ ùF3Î~’ fƉ3Å¡üwXq–øátõÚ Îp¤`7ÂÈ9nNÀªþjEé??d5oüKñN©âôýÿà§ÿ<[¢ø_HøeásÄgà‡íºƒákˆvßîüb|mâ/Å¿¾ ø³ã_ÀŸï5?Œ¶W2oˆ>'ÒSP×´SòÿŠíJ‘åÍ$œ&ã4“j¢p|ð‚pæòñ|KŸ)RUó*mUƒ”<&^ÒqpS„¯ƒMJ<Ñm¥ÈÔ—,Ÿ/êÜ?ðRýbV ~ x] */àòT—(rÂ…é²N$Ä pÖ÷—þ G«²‚~x\Ã> à‘’>o…¨Ç¥Tÿx)ÊÛ5Ĉ6à Á_™q3pÇìÉ»^ù¶´[¶ÅäîÓ·b1„Q· „û yqôÿq1ÈÚ˜Ú¾„ü*à$ôÈ¥ÓþfÙç_û¨¿Ïþ¸×‰“IfJÚÌ]ü©ÿÐ+껽ºtý:ðQí\õø?áqëÏ‚øäƒ×áxùNr@䀲½üGY—þ†T–‡—àã°y‹,?áW‚0wŽ@P .ͧæŒ1ëÁ/Îv§#ò1‚r›7Aµfœ òÜmppG1âty³oÜ\:)Ü¿gÿ‰Y? ¸ 1ºÈ¤Ÿý³¾Ë¾e¿ÜÿºÆøÓ‰TbÖd®ßýeý#ÿ@û'ÓUdÓÿ‚ƒjä ß <,à#ða° OÃ5ܼŸ› œ}Ðr£þ «ž¿ |.=sƒ°=~‘´ÿ’H å9aTmUÚ¡v¯ÝLùìL ÆÂô(è¶Ð`ýÜcûÜ2àÉßbe†0NဠÊíÝpð¯¬ò95§üͳ¾¶ÿ©Šþ¶¾áK8–R³Ì®®—û–^º®ØO.ý<¬¿G£ý¼õ™/ü*Ï ƒ¸+kàÖ „ÜÃþ¨aÈpC*•`ö˜ï>Çqn\»á—…Àܧƒ €p¤ü8]Ëɰ½TBþy['ïygåu8Aò§ï”nuòz˜+åDzD}—f‘¯à(Ú«µBí_ºŸ*|‰û´Ê uÂôhû©“ð·n­’Kúç_üñz\ˬ>5âdôÌ–ÿô—ó#ì»í¿U÷âþÜš»ÿÏÂã ÌÐ|H®Ä`|9<áû#’̨®É¡í­«Èpß|.¤.›à÷*7ª)9øt˜¼ÀCm(Q•´wBÛóþ!Ë|§„ýÜ•Äsÿªl°ÆsÆÝ¥·Å·Í‡~Ôa±€¸f;cL•ÌÑŒ±û:à>Í®¸ËhÜm‹ÈòôÕ/ ¸+¬’_øuοùåþª¹ñ§EFÙ•¯kÿ±eþõ ¶‹¢Z|Kcî±ûfêçño<.=âYàÎËÓ?†G'“Œc¸,éûcjíÉø{á…Q’äi> b b¶#b*8%™Qddø‰GŽ€Fá8"ðqžØ#Â]„`îÚë´½Fãc•W2 »îLlfßß6^ð5›þÄ•ÔSÿ‘®u»_ö0_-=&Ÿñ4“o2NËþ€²ôºvÂ%Ó¿N–´~á‹ö¶ÖdûÞðºc®td}Ü7€S üýpW\+‰Ò ×ö°ÕÏüÈÞ÷ðg·cà@{œúƒÎàŸZ¦ßùe·òGιòùÈ*Û:|»6"m‹Êò¬¯ ÿd±Ž¶Åàãžnس^ðCibËkÿÈ×9þïýLwÛ¯¬aq·ÿÐÍtÿ˜,»´êôíª²>¿‹ö¨Ö$<øÂê«Ë±Ñ<•b@ àe°¬pY@ Î쑤¯„_´Î³'_x];øx8‘Âp|§/×p…q2Aò ªá‹lû£;ÉÁÎWäMÒ|¹zlTwßÏ>×~Õ1ÿ,¶àžHår#íä'ÊÛsŒ/—±l~_•g3ðË‚VÉd¶ÿ™¦sÞ?õ1óü¶Ñ½%ƼLš¶d¶ÿ ,¿û»ÿ²~‘ôvÓêaûJj範<.=âŸðg =ü¾ùéŒsƒ¸-¨ÿh½^Náð°ÿâðqdûäŽ|¨X*Á‘@S¹Ù9Ú—”c°öÆ8>DëŽzc|¸ÄzVþä#¸x±ç7-ä®dÜœ›cÃo‹Éó¬—üC. åoûZrÿÌÓ9ê•ÿæ?¿ãÒþêñ7*ÚKúËÿ»ÿP¶ü+¯§ãøù¬8çÂþSòä ø8ã*§??ƒcn #îðFk R)‡Ç}\õð×…Àïÿǃ3Ó=ƒÆ{ý1Îà¿=Û®6à§v„Œd"/Lc`ÚFßÝù~UµÄ팸ÃO‘sÓŸLvÆ#ÍxiÁWkûVQOþF™Æö‹×þ<Þí}Ú©ñ3jù—Uÿ0Y—ýA¯ëµ¬¾„‹ãf±#oxb3 x<•;äV ƒÔeDNHà˜ªÇpö÷Óâþ®áIм. <%àÓŒã³xM‚H;•H# ‰~ h»d#&F eÓNpçì˹×fO'=ß»ò|Ý?vÂF6ã œŒ}ÑÊùQàq‚<¸ö‘©³lKÃn NË'—Où™çWž`´ü?¼ãn&SIfI+ÿÐ]ÿ̲í·þôž›®ü@ÕtÛ ^×ã°Ôâž{5øSÚ<÷[ÞÝiÒ̶ZµêÄ·¶7vë#ÛªHð9ŒºÆçÛþ"ÿÐáþ >ñä?>%ü9ø?ð{Â~-xÿÁ? ¾xwÂïÿ ޾"ø«BðOƒt/íoŠž)д¯íø–ÿLÑ4Ïí=oSÓt}?í·Ð}·UÔ,tûo6îîdóïƒß´¯ìåûCÿÂEÿ ã÷Á?ŽðˆdÂ[ÿ {â¯~&ÿÂ/ÿ öŸöü$_ð…kÚßö'ößö&³ý‘ý§öoí/ìOì~wØ.ü¯Á3ÌnU–g9¾_C…²‰ÐËó,n •J¸Þ'u%O ‰©FœªÊA:Ž0‹›Œ!&ÜcÒ_«åX\Ç–e¸Ú¼AšF®3ƒÅT<6Cqž#J¬ãMK%œ”#)5)I¥Ëy6®ýÇÀ¿u¿‰^ƒÆ^µø_®ø^óZñ–c­G?ÁÛ+-KPð¼GðëÅ/¥¾§adú¦—eã xƒJ²×tô¹Ðõ謭áýGTÑnìuž»íÿèð¿ÿŸ?øŠþtü{û:üý¬doø$ÇÀþÿ„ûá¿nÿÚ¿þß ÂA⟠kÂ-áOø+_tøŸx+[ð牬>ÁâohÚŸüK5›?µ}ìwŸhÓî.í'Ô´ÿ‚SþÀÿ°Çíwÿïøµû,üÿ…]ñÄ_µÄ߇ZLj?áhügñ·Û<«~À¶Ï‰u û+â/Ä_h–ÿhÖü#áëßí ]6 V/ìÿ³A}¥Ýô<3Íò¸JQÿUòk¥&—Ö¸¦¢žòÿYSWå{EÛÌíYn;õƒ7ÝËŒƒ¯/ýHúzô]ÝŸ†ÿ¯þ.躷‰>Úü9ñ‡t_kþ½×ãµø[§h²ë¾ñ?‰¼«Ûiz®±£éö:å¬~ ðwˆílµm}CHÖ-4á«è÷×ú5冡ußý¿â/ý~ÿàÓàgÿ_Ÿ?ðLÿù3 Ÿû-õx~Òµø-ÿ ñþ7ü!ßðÕ?µü8Óþ‡ûþý«®ÿÂÆÿ…ý»æÃ.ÿÃoÿÂèÿ…åÿòÿ…åÿü7—ü!Û¿Û¿ñ‹ßðÑð¬?âóW§œbrœ¿ 5Ê% e¹65Ê®7‰Ü\Ç)ÁcëB<œAÔkb*FŒæöqŠ”ç(ÊràËpùŽ3Rµ\ÿ4Œ¡Í0©SÃä*>Ï™â°t¤Ô²Y>gK U•Ô]FÜcÚ ú¨‡ãjIñ#]øPÇáôþ6ð¶áx›JÑ´o‡^"‘ãI¶6µ^9Æu‚ç¦ñø¼n"<Ô0t£íÜ9âåÇ™£·,ž'Úf¸lN.¶7êYœpôkW§…§WØÏ*Êñ|“X<>Œ¹kbªòËØ©r¸ÆR—*gõCÿ¤ýŸmÿ‰¿ÿ`ï_°×‚¢ñ7ÄoÙ¥¼Cã?í¹üAðŸJ‡Â~ Õ<+û?^x6ê]'âLj4}'Ä1ÞÍá=s}¬6Z½¼ dF£±¹²3ü¢?h/ø:è /1õ6?°&OýóªíÀüä×ôÛâÿù ZدàýBü?_’º¯üS쟶??e_´~Åÿ„ ãgÂoƒßføÕûu©ý£~ ÿÂÍø[ð[âü$_ ¿fŸøgOÿÂq»þü þÒ?áléð°|uá=WDþÓðÇçÚ{9_‰8Ü»'˲¼+Á™Þ&XèàñæS‹ÆãaOÄcëÅÕŽi‡¦£íñSQ*4×$`¤§5)Ë,OQÄbñØæY¾®3Ø:ÐÁb©Ð¥'BŒ(ÓÓêó›´!wÍ9{Ò•¬—âÏíYð¿þ#ý¶üß?iŸ…~ø‰á˜ciQEâ/ÙÁךók~×®n´û¿xóÃq=Õׄ4«iSZMZÚ;I/¬·2ÅwoáGìMÿhÚWí M×ÿií/DøBl‡Â}Oý¹|#i¥|/M/ÂZßÃÝ0|>°µøý Ÿƒ³þxƒÄ²_ A¥ý“Âþ©á›f‡EÔ®lí?¡ß€ÿðR¯øóÃÞ9ñgÄ!ö«K¯|1·ø5áÙËá_íûCxËÅ|gû~Æÿ´çˆün¾ ðWÂkÏŒúï‚|-ãÚy|5yñO[øð›BÑ4¯|!ðç0Ó´½ôŸÃ^%ðç<9áÿø;Ä'‹<#âÍJñ/…¼Sá­VÃ]ðç‰|9®ØAªh~ ðþ¹¥Ïu¦k:&³¦]Zê:V«§]\Øj60]ÚO5¼ÑÈßE†ñÇ>Ëð‹„áÃ`ÕZ•ㆥ’æQíjQ¥Zté<éÓ„ªÓŠ…^H¯iïsÝÊMñTàÜyº•sLî¥Y(ÆUeŒ êÉEÞ U>©Í%gfùRIh’_ÄÇ…?àœ_ð[¿¯ÂÑàÝã7ƒÿáG‚ãÂÿµ·Ãm| |ßøXËð·û+ãmð xüÜÝÿÂh<(4øJVæoíżóWÇ_°Güo╊ôωÍû@|EÓ¼y¢xKÃ~9Ó¼wûexÅö3ð÷€’ü;ý˜¾ÿÁr?fŠ:øÎ>ë?>'üC×>ëþ'ñÆ/ÛOÇ2^ë—¿ "Õl¼!m¾þÛ ´Ï‹ú<:Uõ¾/†þ7iÿ¼=o éÖ~Ò4Í#Ãú—ˆtËÏ)ÓeOø/¶‡âˆÞ&ð¦³ñóáÞ§ñsâ_‹þ1üG¶øWûZ|5øWáï|Pñíôz‡Œñ„>þ¼Wñ¿ˆ!ˆ­‰— ðD«b)aèÔ•L¯4«C OF*¹äéQ¥J0Š:0§ãI9F2Zÿ©˜BYžr¡NU'V-N³æ©7(à”¥9ßYI·fÒjìþ2<1û Áq|â ž^ñW…¾éßü1âoþØÑuÿ|Ñ.bÔ´O„Ú³¦ünƒQÒ>é:¥µ­þ•à]>{_ é÷ÖÖ÷vše­ÄQÏÒ²OÀ_ø,Ÿìãïˆ<3û;'Ä|KñŸ†¾ x·\øƒûZx«M>#ñw…õ¿ø„k>9Ó~ þÙ?toŒÄš¿‰õ+ïØ|mÓ¾$iº‰–îÚ+++/øªÓVþˆ~(þÐþø;ñWá׃~!¦‰àφÞ7ø]ñïÇš§Æïø²ÃÂ>ð—ˆþÃðÛÄ‘ü=Ô/µË;mmoÅŸ õߌŸ‘®ü5ý£ho×|Gû5~Îÿ´4ü-ø{û<Û|AÒ¿áR]þÑ>ðW¼[¢øKÄt Ÿ|0´ñ—|ñGâK|ð¥âütâl~¶Ã|:8šté×<·6¥*Ô©Õö°§9ÑÏ!UÓXóró[týÙ4Õ> ËéNœá˜æêt¤åM¼FJqårŠž QRq•“µö¶Êß‚:ïì{ÿÀñôߊëñ‚ËÇZŒ>+ø÷Âzç‡?i…ž>ñgÇMkTñÆ=[á®›á/‹:‘ðÔ|LÖ5­ZóÆ6°ðÞ›­‹ù­ï,šÕ’ÞûØþ ]ˆ<%â¿7ã¼~)ð¯ñÄñ2~× þÞðN½ñzëPÔ~,ë~ÕÿátGú×Å OSÔ5ˆžs§ÞøÒöþúëÄ·7ד\/õ á¯Ú¿öyñ¦¯áýÁß4O\x³âŽ•ðkÂ×þ´Öõßx—â»û2Aûdhzw‡ü[¥éw^ÖtMgöjºµø¡¥x×NÖn|¨Ø\Á ZxŽoM‡ÛÔ>|EðoƇ>øµðëXÿ„‹á÷ÅøWâ/|AýŸªé?Û¾ ñ¶…aâ_ kÙZ펙­éŸÚz&§c{ýŸ¬iº~«eçý›P±´»Šh#¸øõÄôâ¡à˜ÁS•(¥“fQ¥QWS§³„•9¬F%J rIW®œZ©4çýH˯ÿ#å·%&Þ.ƒnQö|²wÂk(û:m=×$?–6þDïàðV}[ᯇ¾ ë> ø‰ª|ð–±?ˆ<)ð£Rý£þê ¼/¯O.·5Æ·áÏÜ|X>ѵ[«xšâ]GNÒí/OëeFÕ¯QxUÿ‚GÿÁB?ã@úüWø HÁƒÿ ýž9mÆÜ/•ý]þÙ?´wü2wìÿâ/ÿØþ Ö¿±|mðSÁ^WÄ¿‰Ÿð¦þé?ð¹>7ü9ø1ÿ oþ(ÿÂñþøþü&^*׿á ׾ˡh7ã쉿í0xŸÂÏø(WÃ|9·ñŸŽ¼SðOÆzÞ¯ãoxcÞÿ‚||Dø·ÿ(þÐÒ¼¡x#Uñ.»©Að7ömÐ> èŸðŠ]øóÃ:šo†w^ ðOü' ]ñÔ:ßÅŸ ø~]é} ¸Î’”¨ä¼'N3«R¤Õ<¿4=jN¥I(çiÊ¤Ûæœþ)I¹I¹jc.Éå+˚ɨÆ+›†vŒmÅ7‚ºŠI%ì–‰ZÇáo‡?c/ø,Ï…¾ÍðsÃÒ|qð÷Â+ÄŸáf‰ûXxCJøk&ƒâ·Õ.ø¥ñŸìð¿¿áK„þÊÿ…IàÿÂSÿ ×þá§ü)oøE¶¿ályž<ÿ„þøSß?áí¼ûdþÏÿÿá-Â"ñ¶«¨x7Á:÷ï´> |oÒ¼Sâ Á¿d´ø‹aðßÂZÇÃ?Äß.Ÿ i ‰ÿ´§‚<~|7ý²-N³ý„|UñcTm.M\éZ@ÔZÂKO¶?LûK±´–Ã÷Zßþ ð‹VøÓð/á7†ü?ñG^·øÕ¢|iKËè¾ |~³øð—âÂ~ÌZàÏ_n¾¯ÄŸ‚š'‹|9ûKèfø™ñ»Mø_à ø?ø²ûP¾ðůxýåQOÇn(úR¥Ã¼FT¹Ý Ã(ÇÓ.{Ƨ³”sxº~Ñ9F§-¹ÓjWLràŒ¶¤eæÌã55,] )¨ÙÙ<%Ÿ.Ž?ËÒÇòñâoÙ“þ +ã‘áÏøN¼EñûÆGÁÞ+ÑüwáøJ¿k/ø‹þ_øyn?°|gᳪü_›ûÅZ+]ÞÿcøƒLš¾™ö¹Í寞é þ"ý™¿à²0ûAñwˆ~>ø¤ÝøWÅ^»ÿ„ö°Ð5ÃsàþÎu?Œ7>…6°øÃ»ãgŽ?á+þÞø]ð³þ¨á4ð/ïÞ-ÿ„£Iÿ…eý“â>'á/íÍmyñ³ãwÀÚFÿ…qãoüløOðŸÃZ§ƒþüxñOÀ{}WâWì½û2|PƒÂ$ý«õ_†šÁ7ñ¶µñ³ã'Š~ü6Ó|UyðÆ^>¶¼øG Øü+·ñ·Žü?i☇üIMÆø**—;¥Ë“ã—³æj55ÞðæoßåI;¶úú‘—^mæYÓçåSæÆP|ܶåNøKÊÖN7nÝ-eoÈ{Ù;þ Ûgyðâþ ŒÖ·¿ô›Ýá%ä_´ï…Vïáf…©èÑxoSÑ>ÜÅñUfðV—¨xjÇOðõ퇆ŸM³»Ñlì´©à66ÖñØšçìsÿJñHñçü%V?iþñŸü"Úƒj¾>+Ьþ"Ã¥øˆxwT’}KAþ×µ»þǾ•îôákpåÓØ~~ÊßðPŸƒ¿ ~9ü8ðwÀ ØŸþðç‚|SãÇñߨ¾#øsÁZ6¾Úö½àÿx£Jø¡¦/Ã?–;=âv…¨iÚÆ™ã OÒôûËxE¬SZ~à~ÔŸ´?‡?eŸ„Mñ—Æ)¢Gá;âìÿà?êþ%ñe‡ü9á|jøýðËহñ Ä(Õ,ïtÍ3Døo¦|Bºñöªºˆ±°¿°ðÝÆ™w­øzÞòMwNùãAÿ‚›~ʾ)øñWÂþ ø›àŸ‹~ øoàŸ€:¾™ãÙ×Ä7Ÿ´æ»ãïˆßõßÚVÞóà÷ƒþ|ðÿÄOxÆßüû:ÝüSñ™á+ë¶ÿuÍoÆú÷‡|/àŸë>(¼+xéÅxªS§W$áZ”§^†"¢ú†j•JøZ˜z”*TåΗ<éΆÜ×¼i›½8¨§Ê âáŽÍ£(Ó©J-b0·:°© û»Æ­Kò¥g9IZNçå„¿doø)§<4þ ðMįxB_é^5—Â~ý |#áÿ ¿Œ´+ýUÑ!øÓñ?ÅŸ·Õ‡ÅO†~$øSðãÁ~1ø“áýoះ?bÝhx¯Ášÿà x³áG‹<-ñCÃÃ^°‹ÃÚÞ_¾"ø7âǃtxXþÛðηý¡ ͧêº&«§jº&«}áÿøcÄþñŽ•âoøÛÁ¾&Òµ xëÀ¾-ÑôOxÆZ&»àÿhZ'‰´MWJ³RñÏŠT§9d<#ÍR~Ò¤å•æ.Sœ¢“”äó{Î\±I¹7++7¢´Ã€ò¨%æÃŒcËõ¬5£ùb– Z>óvZ{ÞgàN«û5ÿÁP¼G­jž#ñ-ßÅÍ{Ä:ï‚u†Z潬þÑžÕµmcá¶«y5ö«ðûVÔïþ&O}©øT»š{Ëÿ ÝÈú ÝåÃ\ϧ´ŽÎö‡û7ÁN|5«i ðõ×Å_Ð| aðËCÖ´_Ú#Ãúf¯¡ü7ÒîVûLø{¤êv?í¯l<¦ÞÁou§øVÎk}Òæn-ì š8ÞèzŠÅøáÄnÏûƒýŸ*'ö^?“‘%N_í~^K+rÛ–Ú%kýCË9”ÿ´s¥$ù¹¾·‡¿5ï{ýN÷¾·ÞúÞçóû¤| ÿ‚¦è~#ñG‹´|kÒP©ÀyeH:sÌ3™Aݸ<^ŹOÚI¸¼W•D§-5’Rݾ8ýŸटô‹mâeïÅoˆzž£±i¢øëãþ‡âí&ÓW·¶¾²ƒT¶Óµÿˆ÷öpêpYêÖpßE\Åm}wL‘ÜÊ{ÙŸþ aâ ø®Òˆ–^(ð‡ ð¼Mkñ¿ÃøƒÁ^³°ÔtË_ øOW‹Çë¨ø{ÃÖÚ~«©ØYèz=ÖŸ¦[ÙjWö‘A7³y¿TTÃÆþ$§MQ†E¤•Xû(åxåNÕ¢£Y{5›(Z¬W-D’U#îÏ™hêYÍÌóêS÷y,^ÏÜwƒæúýÆ“‡H´šZ+~7üNðGüSâÇ‚¼ðÛ[ð¥ÿ‡¾øág€þCà/üTÑt¿øŸJøtë&â?øVãâuþƒ­x¾Ia°–óWO°¶fÑt),ô½=ì!X6~9hðROÞ8¼¼»¹ñ]æ=¥Çˆ®/.gÖ&¸žá®!é´¯…?ðQ=[ñ‰ôÏ|\ÒüMã¥7‹¼E§ü}±µ×¼PÚ‘Ót#â^×â½þ¶4{šËGþÓ¸¸:eŒŸd²[[wû<³WDüiâ©)d Ô¡ìäžWŽiÓößXpiæ¶px߸¿uÖýí¹õ3| –¶Ÿö–xš’šåÆÐVš¦©)/ö=%ì’§uoÝûŸ‡ã —ÁÛëN¶Õlì/þ&XÚkÞ.â¹kiñ»I·ƒYñä:®®CãmV#µD´Ö¯5uº¸ÕmŒP_Í"¤mgû#E?ø\Dï|‹„_4£9_+Ç{Ó‡',ßü*üqä‡,·,mk+ €òÔ’Y–w¢åOëx{¨»Þ+ýH»»­ÝÖ§ã¤_mtPþ¯ÂåQñoC!>„ü:]¾1ˆ xKØäiè6¤\zþÈ?´@ ÿ¼ÔÛàlŒ=¼H2qÔuR ¦Ûº*éøáÅ4oì²®§v›äÀf0½¶¿.l¯k»_k»?ry4åÍçm¹ñ8YZü··6 Úüªö·Þ•¿m¿dÚ 7Bß•Tÿ™¯ÀÌÊBß1]tnUq÷¾aUŒˆÚÇZ?ÙKã⢩ð@0(ðiÛ‰U²ØÖˆ’00ÞAvÄ4ï׊(—Ž|[%g—pïË ™¯ýëéè´òáÖHÒ_ZÍlÿ„ì—ýùzü´?&“öføÚª£þ…\(WÄž*˜ 6'üO(1Á*¼òŽ‚ÂþÍ_Æü!CÛ>#ð‘aËž£[\·ÝÜ:Œ 4_«´TÇÇ,‹ºËøw¦øL˧¦l¿à„|:É"î±Y®÷Ö¾ÿ˜oøþJß—þÎ_Ñ×wƒ€à¾"ð¦Á‰Cn#û[æcjƘcQHWLÒOÙëâúªøCÑp m]ÂûS £bcWL Ç…è>P0«úkEKñ»ŠÛ¿öo÷LËõÍŸß¿˜Ÿ‡ÿ˜¬×{ÿ úà?]õ?4ãýŸ¾.sá>W{Âä‚RM¸ÿ‰«e²TÇ$ñ$‡bßàGÅXÏÍádŒ|õ¿ ~ñIþÑ\‰1•Qß“j òc°ý¢“ñ»ŠÚ³Ëø{ÿ 3/þ{^d’I—àÅø¦òðïwLpv“Û À-CðOâbO†Ju¯–O–LÚ\È M‡r`ã猕–¾è©^6qRMgðþªßß,×þ꘣áÎI±Y¯Î¾óXÿ¯%o‡mþüDðÒ® ÁþØÐY—î ·¨ ¾Ìòí«„ŽÒÚü#ø„:øxq«h|}ÑÛP^ßAÑpÀíz*â4ñJwú‡è­þë˜ùÔ×û«oò²^äkþb³^ŸòÿÒßõåþV>4ƒáGc`[ÃÀ8oím²`1Ê…¾RÒ)Þ˜Ïl–ßbßácûÚ® `ÿièä¸8Ûr «ìÈ] D¢„Ž×ë:(—'ó\Ám§LÓñßÌ%áÆG'wŠÍoÿ_ðŸ®ÿ^Šß ~ÑßÿhÚF¸øs¨ø÷àSü—FÒti>|Ný–|'ñÃD×—âY|q¡ãFñ×Äÿì/_ÛøÊuÕôa„ôm?E‹Iðá†Â}wJ¹ñ©àÿ¿a?޳Çü$_ð > þÊ?á/þÈÿ„·þ÷ìðƒá—ü%ðÿiÿ`ÿÂEÿWÄûoûûoYþÈþÓûOöoö¾§ö?'í÷~oë-ò8®(£Äâqx®áÚ¸Œ]z¸œMG."µ¯^¤ªÕ¨á Œ"å99rÂ1ŒohÅ$’ú >G_ ‡¡…ÃçùÍ:j4°ô!ìò9rQ£Ó§i䲜¹a®iÊRv¼›wgäv¿û|hñ‡Áß|ñçÄ?ÙŸâ_Ÿ‡z׊üQáÿ|Xý‰¼ñkH_x¿âÄψWÞ,—Oø—ñ“Åz|"°ºø±â¯ húŽ•i¦½„ä‡M+5åÖ¹©ë¯Ã¯ø&O‹~øËGø‹ð•¿aï…ß|;ý¡ÿÿ޾Á5þø'ÆZö¶•}¡j¿Øþ'ð׎´ÍoLþÓÑ5=KGÔ>Å}Ût­BûO¹óm.ç†OÙº+Ä7{ð¯;ïz¼Hï}ïÿ¦ßÙXÏú(sŸüÿóŒø#áÿÀÚcàÿÀ |øKñ¿Á¼µñ‹¼gã/jßcñUψ¯,Õ5‰4ý æÏTÐ!·Õlu–¨ÿ‚€Ñà|?ÿÄUð×ÿ>zûêŠÛÅ1•c[Âü;V¤hapÑœ¥Ä)ª<5,&E?e‡¡JŸ3Nsåç©)NR“ƆG_ S¡Ÿç4á*ØŒD£ìò9^¶+W^w–K'ûÊõªO•>XórÁF 1_~Ï¿³ïŇ_þ'üZøµñ?Gø¡â¯Š?ýúûDøwkðâÓM´øqkã«}>I4ûxÆë‹è|c«½¬zTvñéQI$WsÝÏ:äª|Kÿ²ã/ýHõ*ÿCŠÿ<‹?òU>%ÿÙ@ñ—þ¤z•c[5–i*ìx<ž †ÀýmÑ…‹Çcdܱ¸¼myNUñµ›n·*$!¨ëÙƒÀ,Ä·ŠÄã*ã1?Z¯_õeRU „ŠQÂa°´cÑÂÒI*\Î\Ò”¤å§ú0x¿þBÖŸö+øÿP¿×ÍŸ ¾²ñ×í+ã_øH¿¶ÿá¡þ6h?³?²?³áþÄýœ¾üÿ„wíŸÚwÿð}§þgü%¿ÚÿdÑ<ŸøJ?°³%þÄþÙÕüóöÕñ§Æ‹Œß²¯Â¯ƒ_t†7ß?¶tMsĺ߀t––ž ýŸ­> YɇïuoM-ijxzm-ß_°Ž(õYn®"¾k[xÿ göæÿ£Þøÿˆƒ¢ÿóê¯P³mÔ„yÜš›vSk^XI/z­ôó=ôZ7d»vO«]Ï…4ø"ç‡<5ᇖ^2ýž~5x»á¾‰á¯ hq~Õ¿±å‡Çß‚ËáË?Ùöý˜üS¬EðvOþ Ôì~(êZŸì%àïø;ÇÖŸc°ð_„þ%üIøg¨ø?ÆwÚ_´ïÙ?†žÒ¾|9ðÃ= o´hŸ¼á_èóÿax7Âþ~•á ÃÃú|ßð|:ðÇ‚~xwÍ´Óáì/ø3Â> Òw}ƒÃÐ4K{*ÓåøS?·7ý÷ÃÿüDÿŸUð¦noú=ï‡ÿøˆ:/ÿ>ª%ïYJ½7m½Ú‹ò¤5¦Ñ‡§#Ö?jO‚Þ#øûð‰¼àïèŸ|]¦üQýŸþ-x[ÅÞ%ðEÿÄXxö~øýðËãÞ‡eâé~9øi©ëú&¿©ü4µðö«m§xïÃðXj·¶š’Ü[G¾'«~ϵ†³â?|bºý£?g˜ÿh¯‡'Åÿ†š‰ ý’¾$¯Ák¯‚߯þø§Å:«ð†OÛ:_ÏñFÃÇ?¼¨xâE§Ç› ÚøORñ/†5„Z®±y¥øËFÔÿ…3ûsÑï|?ÿÄAÑùõWQàÏÙ×öæñ‰tßÿÃuü?Óÿ´>Ùþ™ÿ q¢Ýù?d°º¾ÿø^6Þg™öo+ýzlß¿æÛ±œcwF­&ܬ“MåhÚî–ÏE«°›êÓÓÍt×kŸ,~ÌðM?þÊz¿Â¯øã扮ø»À'ƒ¾k÷>-ø7uáÏ|‡ödÿ‚~ÏŸ4-BѾ/躟…¾(ø³Sÿ‚|xÇø‘{âoxOá͇ ý­þè¿üeuýŸi¤xÛM×^÷ÈÕnþ×àßh^$øKñëÀ¿fÒ¼Cá©`ÿ…×û1|Nøßðþq}.«ðãþü-ÃÄøGR°ùã·ü÷ß¾.øóã…Ö¡û<øëÅÞ+ø£ãh~ý«e;Úsà·…|9ñàìkðcÅ6‘|;“âßÂýN÷â¶§ûø;Äø©iãMÃþøƒñ'ÀÃÏ\jš_ŒôŸÑÿø`Û›þ’#ðÿÿEÿ膣þ#öæÿ¤ˆü?ÿÄÑú!¨Ž§MZék'£µÖ°ëoêì9ãÙ÷éÓçä~}ê¿ðK߇)ÿ å÷ƒø¥­Ëáý¡¿`ß>Ô|Ká« WÄzG‡?ao þÂÞÐüâ ½/Uðþ™âMoâ™ûÚϪøßNÒ<)a _üGž[OjVþŽ×Ä8¾)ÿ‚mÿÂI§Cgÿ ŸÈûü7Çö}ßïí/ x«þSöðøGûpÿÂñ;ßðYÿÂwðONÿ…Oÿ ã¯ÂÏí=þ;àçŽüs£ÂQðŸûcÉ‹ôþ#öæÿ¤ˆü?ÿÄÑú!¨ÿ†ý¹¿é"?ÿñô_þˆj¯ªâ7ç§½÷{Û–ÿm?ÅÏÏOø¿’?8?fÏø&߈ÿfˆ|Xð'Ä_ÙçÂ^.¼ø£ñV×üðöH¿øCû<ÙüøÅàØßÂ<ðßàöûDkŸ€¾(ëŸìSàh_ï~"xÃÂz^·ã‰sx‡àŒ®5óÃÿ«µÀÿÃ~Üßô‘‡ÿøƒú/ÿD5ðÁ·7ý$Gáÿþ þ‹ÿÑ JXJòw”é·¶í~PCSŠÙ?ëNþG%ñ‡Aý£u¿øGá@|Uø'ðËìßÚÿð–ÿÂáø㯎Û~wögöü#¿ð…~Ò¿³Çü"ÿÙ¾V³ý¯ý§ÿ ößÛôϱÿÂ?ý‘wý·òßø'‡>|Ö~ø;â–·/„[ö†ýƒ~4ø[Qñ/†¬5_éý…¼'û x;CðGˆ.ô½WÃúg‰5¿ˆzgìOk>«ã};Hð¥†ñym< ©[øR;_ýÕÿ ûsÒD~ÿâè¿ýÔÃ~Üßô‘‡ÿøƒú/ÿD5 ]+)Ó[>½Õß%Ýž×ôØ9ãÙþçä~U|$ÿ‚Aøá‘áÏ øSVýž|!¦|:Öÿfh| ⯅Ÿ±·Ãÿ‡|oàÙÏö›ýŸÿhd‹ö£øÓ5ï|oø£ã+Ù×Ã>Ô¼qàqðáü¾,ñ~'ø¿à¯u4øm ü5ý(ýš¾Ã<~Î_~ÂEÿ ‡ü(Ï‚ ¾Â[ý‘ÿÿü%𬼠 ø+þ/ìí=oûûoûûOû#ûgWþÍûOØÿ´ïüŸµËÖÿÃ~Üßô‘‡ÿøƒú/ÿD5ðÁ·7ý$Gáÿþ þ‹ÿÑ D°¸‰|S¦õ¾ï{ZúC°sÇMŠËÓïò9/ß¿áyøAðWü$_ð‹ÿb|lýš¾0ÿiÿdmý§þãöøUñÿþß±ÿiéOü&ð¬¿áþ×û\¿ðÿmÿofkÙ¿Ø×ÿ!~ÕŸðN¯~Óßu_‹ºæµð»ZÔíôOÙÚ|8øëðÃã×ÀÓâ?PþÛ:Ö«ñ[á½ß| qñ;D×¼#ûmx¦ øKñGÃËÿ|LøwàOˆx—ÅÚd:®~êÿ†ý¹¿é"?ÿñô_þˆj?á‚?noúHÃÿüAýÿ¢…„¯§MoÖ]m±ä¿¦Ãž=Ÿáþgä~¹ÿãøÇð¯âì¹ãßÙ›Åÿü;­ø;Æßl¥Wù©ýòÿäv‡ùõÀÿÃ~Üßô‘‡ÿøƒú/ÿD5ðÁ·7ý$Gáÿþ þ‹ÿÑ GÔªÿ5?¾_ü€s®Ïðÿ3¾¢¸ø`Û›þ’#ðÿÿEÿ膣þ#öæÿ¤ˆü?ÿÄÑú!¨ú•_æ§÷ËÿuÙþæwÔWÿ ûsÒD~ÿâè¿ýÔÃ~Üßô‘‡ÿøƒú/ÿD5R«üÔþùòλ?ÃüÎúŠàá‚?noúHÃÿüAýÿ¢ø`Û›þ’#ðÿÿEÿ膣êUšŸß/þ@9×gø™ßQ\ü0GíÍÿIøÿˆ?¢ÿôCQÿ ûsÒD~ÿâè¿ýÔ}J¯óSûåÿÈ:ìÿó;ê+ÿ†ý¹¿é"?ÿñô_þˆj?á‚?noúHÃÿüAýÿ¢©Uþj|¿ùç]Ÿáþg}Ep?ðÁ·7ý$Gáÿþ þ‹ÿÑ Gü0GíÍÿIøÿˆ?¢ÿôCQõ*¿ÍOï—ÿ ë³ü?Ì郞þ#öæÿ¤ˆü?ÿÄÑú!¨ÿ†ý¹¿é"?ÿñô_þˆj>¥Wù©ýòÿäv‡ùõÀÿÃ~Üßô‘‡ÿøƒú/ÿD5ðÁ·7ý$Gáÿþ þ‹ÿÑ GÔªÿ5?¾_ü€s®Ïðÿ3¾¢¸ø`Û›þ’#ðÿÿEÿ膣þ#öæÿ¤ˆü?ÿÄÑú!¨ú•_æ§÷ËÿuÙþæwÔWÿ ûsÒD~ÿâè¿ýÔÃ~Üßô‘‡ÿøƒú/ÿD5R«üÔþùòλ?ÃüÎúŠàá‚?noúHÃÿüAýÿ¢ø`Û›þ’#ðÿÿEÿ膣êUšŸß/þ@9×gø™ßWùãüYÿ’©ñ/þÊŒ¿õ#Ô«ý |û7üoø6ž,Ô~7~ÒZOǵ¿ðºKá-?ÃÿôŸƒ^¿±ño…,µ]KRkOxúÿÄ×WÖÚÙi°‹íNÒbþÔ–îÇ[¼½Òî´óÒø³ÿ%Sâ_ý”êG©WFœ©J¬$Óv¦ýÛµ¯?t¿"dÓI¯?Ðþà¿k_ù<¯ø'ý†>&ÿëëuõµ|“ûZÿÉåÁ;ÿì1ñ7ÿXï[¯­«†¶ðÿ ÿôõRã·Ýÿ¤Ä(¢ŠÄ£ò÷þ )wðrÓþ ÍûQÿÂáøÿ Ëí?þ6Ú|,ÿ‹ë⟟ð°~1Íð/â‡ü! â—ñÏÿápÿÂW·Sÿ‹â/øKü-ñìñ7ð7ˆ?²-þÉú¹û*|KøsñƒXðÄ_„¾?ðOŇÞ"ÿ„£þÿ|:ñV…ãoë¿Ù6¾"е_ìøjÿSÑ5?ìÍoLÔ´}CìWÓý‹UÓï´ûŸ*îÒxcůPø1ÿ%+Ã÷ÿÓ«[R~ýë¥X»ßMek[M–·ù [?Gëשù#ûþÚ¿ÿhoÛ ö}ŸÃðRŸƒÿµoÁ¿‰þ ø…âÏü(ý˜¾&þÍ_ç¶øg©| ø­âÿx›ãGì«ìð#ö±ÿ‚y|ѼbŸ- Ö~*~Û?µ¯Ä/…¿u/ƒÿ±ßÅkŸŒ^$øË¬|wð§€|:ÿ‚›xÒ/ÿô?Ûgö®ý˜ÿ[´W´`0_ðHOÚWÄð§à‘Ÿ <ûhÂýño?gÿ„? ÿhÿØþßÂÏÿà ~Ï~ ý„üoã‡ÿÿáYÇà‹_ÛÁßoø‘ð×ömøoÿ ñÇâ÷?fÚþKþÁ?øgÂ_f;~ß|-ñ¯íõ«øïBÓþ5þÍ?²Ãÿ†WÚð“x»áoíÃñ£ãŽô+GÔ'Ñ¿°¾x³þ íð;Ãþ"ûˆ"Ò´ÍOûCâ—…ÿ²4{ÝC]µþÛ½Ó-¼;«ýE(^ý¥|ñKö¢ÿ‚(|eøçûh|?øûFë´ˆ´ÿÚöñwÿ6ZÇüËö„ý ¿à¿µ^‹­~ÇÞø­ðÓÁñ×ìÃÿ OÇ«»o‚0~Èÿ¶¯‹~0~Ó´/Žþü:Oø®ãƳ/Ç|kÐ~Æß·wíUñCÆžºý¥ÿि±ÁkŸˆ_þ)ø›öœýŸ/mßÙFûö‡ýµo€^:ø‘ãko…ÿ²gˆ¿àšŸ¾"| øÁû&|DЬŸÇÞý²ÿj_ÚÛ¿>xã'†þ9èßüm¤Z|RÐÿ©Ú(ùBý“?à§ŸµŒ|%û'ë>,ý´ÿgÿÚ×?gÿø#§í ãè_ ~h^'ø•¬~Þÿ·¿ðN?ÚgÀz{x;Ç3cü?ý“²í¼YñI|3á”ñݯüÆúeγ㿄?³,wìõÿìkûe|Eø—ñö"Vý·á ?hÚÎÿ†þý€|ŸÙbïþßö¿Ùcâ×Åÿˆßñn~|%ðwíið'þOíiàï…_²/üe×Å_ŠðÿÂÐÿ…YñOþoÚÄÞ ñ¶“ûýEsþ,ðŸ…|{á_xÇ^ðÿ<ãOë>ñƒ¼Y£iÞ#ð¯‹<+â=:çGñ†|MáíbÚóH×¼?®é—š^³£j–wZv©§]\Øß[Om<±7óƒûþÏ_¼sñ÷öKýƒo¾|º¹ÿ‚xƒöñgŠøià³ã†ž*ñ§¿ðL?x£ÅWÚ,Þñ¯ˆ?lÿÙ;Ä>5ý¾ÿh}gàm”ŽŸûm|øGñâ ÏÀøsMøEâézŠþhà›ß¶ßí…ñ¯ö‡øañ×öÓýˆ.þÆþÿ‚xþÏ_´ÁÿŒ>(èúg…¼}à/ÚöÊý¥5„? <5ñ“Â_dø±ñ[MÑ>0øsèø%oí,ÿµWˆ5kí[þ ûáÿÚ‹Æß þ0~ÙÞÒ¿f¯†—°bj>?ýš¾þÔþ üøÝûBé ~^|V×|A¯xZóá·Ž´_‹?õOÙ“à‡‰¼+«|³ µ››ÿxçãîõüÐþ͝ÆÿÚöÂýŸgðßü§àÿí[ðoâˆ>!x³Ä? ?f/‰¿³WŹí¾ê_>+x¿ÁÞ&øÑû*Åû|ý¬àž_ôo§ÃËH5ŸŠŸ¶Ïíkñ áoÆ]KàÿìwñZçã‰>2ëü)öìÍûR| ?ðUÿÛSö|?·7ÁÿŽÞ6ñÁÿÙ¸|?ð.³âoØöŒ¾ø…áoŒðQkŸ„ï> |>ømñ[ÇÞý˜ü-áÏ øŠçá—ÅÝGâ¿ÄÏ‚°xÓÄÞ+ñWˆ-n~$ëú¦³û=E~þÆ¿¶WÄ_‰b%oÛwþö€ý <ïøoïØÉý–.ÿáÝÿký–>-|_øÿçáÂ_~ÖŸáDþÖžøUû"ÿÆ]|Uø¡ÿßü-øUŸÿá&ý ?ûÿÁFu¶ñWì…¬xÿþ ƒðöšðßí%ÿýºÿ` ¬ÿ²?†`Õ>|Ôküø½u­üÐü!«øÛöŸñ¶¯áØûÁÚŠ| /ÃÿÙãÅŸ¿jß‚žÒ¿eÛ¿ŒŸ<ñÿÇ¿ÒõWóûÿÃ,jÁÿáGÃ?ÿÃÆâIÿ`ÿ…Qÿ ëþ_þQÇûIÿÃCÿÃÃáÿ‹ëÿ'éÿ Oþ?ü4—üÝßü*ßøN?âòÿÂ%_Óíàÿj??þ;~ѳG€ ðü)_Þx]ñwìéðÇOð׃¾húÔšü;ðm—ˆ&žÿöúŠð‡µÀŸŠÿ¿h¿Ù£À9þßøÛû&ÿ¢ÿ†€ðWü#>1Òÿáÿ…ïàëïü)ÿŠZðöá/ÂUá-:óVÿŠ+^ñö“öÿcêrEdÿ˜²ïÆoØÛÿðXÛ·áoÃÚ£áÿŒþ&üUýŸÿd‹‡^"ý¯o¾6øî_Žß þ9ÁP¼EñûáïüBø«ãŸx þ¯‡ï©û2|ñ7…uoöcáV³sãOüoýÞ¢€?šø&÷í·ûa|ký¡þØ|uý´ÿb üXðÿˆu/ÿ°ïí›ð3Ä¿´?ÁoMð“Å=ñÂO…ÿ±¿„?àž?³×í#ðãÀÏŠ:>™áox ö†ý²¿iMGáÂO |dð—ÄY>,|VÓtOŒ>ûàí ûËÿ™ý¹< ðçãìÁ'ÆOŠŸ³ì9á?ø;Á?þ¿Äψÿ~üHÿ‚”èÿü3®x{BÖŠ|añƒà¯Âá®—ñ'F¿³Ô|iðãáî“àkÛhÞ±Ð"‹özŠþhà›ß¶ßí…ñ¯ö‡øañ×öÓýˆ.þÆþÿ‚xþÏ_´ÁÿŒ>(èúg…¼}à/ÚöÊý¥5„? <5ñ“Â_dø±ñ[MÑ>0øs€ý˜à¦ß´<_¶ì‘¡üeý«¾ø×áßíYñƒ_ø/ñ[á·ñcá#x«öPø…ã?Ÿþ*|+ø?ñcàÃÏØCáo‰?a/ÚZøÉð×Aø àßÙ‹ö›ÿ‚—~Ø?Q_Œ?|3íYñÀ$ý¤>ÿS´PóCûþÚ¿ÿhoÛ ö}ŸÃðRŸƒÿµoÁ¿‰þ ø…âÏü(ý˜¾&þÍ_ç¶øg©| ø­âÿx›ãGì«ìð#ö±ÿ‚y|ѼbŸ- Ö~*~Û?µ¯Ä/…¿u/ƒÿ±ßÅkŸŒ^$øË¬|wð¡ÿÞý¶ÿl/´?À;Ž¿¶ŸìAq⟋ñ¥ñÿö½ý³~x—ö‡ø-⩾x£Ç¾#øIð¿ö7ð‡üÇözý¤~ü`øñGGÓ<-ãï~Ðß¶Wí)¨ü!øIᯌžø‹'ÅŠÚn‰ñ‡ÃŸÒõWò…àÚWÁß¿j/ø"‡Æ_޶‡Ãÿˆÿ´n·û@x‹Oý¡gÿ|;øe¬Á<¿hOÚ þ ÛûUèº×ì}áßŠß <à?~Ì?ð”üz»¶ø#ìûjø·ãí1ûBøïàÿäðoŠîüø±ðáçì!ð·ÄŸ°—í?­|døk üðoìÅûMÿÁK¿l‰¨¯Æ‚¾ƒö¬ø‰à~Ò ~ßÿ‚lüFºðwÄŸ| øéÿý ?hOÚj?Úöèð¤ÿ±çÅèÿgøïá¯Ãmö±øÑâ‚ÿ´?Ä |ýš¼û@|!øãÏÙÿBøu¯ü7ñ§ÅøcöNºÑþ;ü0ð'Á? h/Ä_Ù‹Àv·ÔPóCÿÞý¶ÿl/´?À;Ž¿¶ŸìAq⟋ñ¥ñÿö½ý³~x—ö‡ø-⩾x£Ç¾#øIð¿ö7ð‡üÇözý¤~ü`øñGGÓ<-ãï~Ðß¶Wí)¨ü!øIᯌžø‹'ÅŠÚn‰ñ‡ÃŸÒõPóƒû?~ÀðHÿÁS~7þÍ?g¿ÙJñoì¯û Á-þ,|-ðW„¬üÇo…Ÿþ þÑ_µÏõ‰oâM2ÿþoü,ìÏøcÝ[ãwŒ¼K¯_x⟃¼WðjÃ㎥ã/ |FЬ¼Gòü·Mý–,j„Z¿ì•ã/ØÄÿÛ·ÿüMÔ¾~ >xö§øsû,Eñþ uðŸÆ_µ÷Æ/†Ÿ>#Âèý€/¿²¾hŸ>Oð/à'í+â/Žÿ`ÏøkâÆ±ÿ ŸÁ¾øÑý~Ñ@Ìì·ûwþÏw¿ðW¯Œ_¼5ñ‡ö´ýœ¿n¯ˆ;ý“þ|tðÇÄÙœhÿµoÇoÙ‡á?ìC¢|øEo¤xGƯ~ |ñÖ·ÿµ³ø·ñ?á÷…¼ñkÀŸ´Oìuàÿ ü_øÇàÏ~ÂþÒ¿§Ú( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( øåÿ ™ìWÕÿõ4øg_åÿñgþJ§Ä¿û(2ÿÔR¯õøåÿ ™ìWÕÿõ4øg_åÿñgþJ§Ä¿û(2ÿÔR¬aüjßá¥ùL}«ü¢p_µ¯üžWü¿þÃõŽõºúÚ¾Iý­äò¿àÿöø›ÿ¬w­×ÖÕåÖÞáŸþžªk¾ïý&!EV%—¿ðRO~È:7ü)‡¿´Ä?²ö¡ãˆ¿ð±OÁø¿mÍwÃ1~ʾ¶ðïü °üFøßãŸüHñ?‡>|Iñ·ÃkOøWDømàß´_jü¨xâ×Ä»íWSøñGÁ·¿ ­®|1ñÇú–»£øw[Ô0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêÿ_ÑEQEQEQEQEQEQEQEQEQEQEQEx?Ç/ùËÿb¾¯ÿ©§Ã:ÿ/ÿ‹?òU>%ÿÙ@ñ—þ¤z•¨Ç/ùËÿb¾¯ÿ©§Ã:ÿ/ÿ‹?òU>%ÿÙ@ñ—þ¤z•cãVÿ /Êcè½_åû‚ý­äò¿àÿöø›ÿ¬w­×ÖÕòOíkÿ'•ÿïÿ°ÇÄßýc½n¾¶¯.¶ðÿ ÿôõSXí÷é1 (¢±(üòÿ‚„X~ʺŸƒ|'cûLø«ö^ðMÜÿÛßð©¼Oûuxóâ샦x¦-WÁsx‡þø§â_ÁÿƒïÆËßG¬iÿ¿·>"øwã™á›¿Œ:ÇÂÏío‡ÚÇÍ Sû_þ ½?ˆî¾ þÇ·^1Ò¾(è^.¹ýž~Ïâ㇈/üYñ§Fñß4é5Í+âÿŠuO x/Sñ/Å;Sk«?øƒQðw„ïõŸC«j7~Ю.dÒí{jõƒòR¼7ÿqý0jµµ){ôc®•`õÞ[+iç«×Uk»§´½ä}áEW´`QE|ð·Æ¿·Ö¯ã½ Oø×û4þÈþ\iÿÂMâï…¿·ÆŒ;Ò<­PŸFþÂøuâÏø'·Àïø‹íþ ‹JÓ5?íŠ^þÈÑïu v×ûn÷L¶ðî¯õýPâügâ5׃¾$øóàoÇOø(ÏíûB~ÓQþзG…'ý>/Gû8øÇ ~hßµÆ|ý¡þ xcàÿìÕàÚáÃÿ~Ïúíá¿>(øßòuÖñßá‡> ø[@Ñ~"þÌ^°øƒþ éûZü$ø?ì©á/„ÿ¶—ìÁ?ìÝûIÁWÿ਱ÿ¿ÙWáå×ìñោ¿þZüeý¸¿h?…>)ø}¨xoQ¼ø‰¯|`×~"^~˾ø{/‡þÆþÿ‚xþÏ_´ÁÿŒ>(èúg…¼}à/ÚöÊý¥5„? <5ñ“Â_dø±ñ[MÑ>0øsú^¢Šþ`¿àžóþÆ_?à¦?>-êßðTï‡ÿ¶gíðÃö€‡_²¥·Œµÿø%·ÄOŠþ ÜÁ=þx›Å“ü'ñgÃÙ{Ã_¼?ðÿÁž:ø‘ûEÇ©xwöHñïÂ_„_ð‘ø7â^¥ãßëÞ3ñí¬üE÷ÿØ×öÊø‹ñ/â/ìD­ûnÿÃ@~дÿ ýûù?²Åßü;¿í²Çů‹ÿ¿âÜü øKàïÚÓàOü(ŸÚÓÁß ¿d_øË¯Š¿?áÿ…¡ÿ ³âŸü$ß´‰¼ãm'÷úŠþhcÿø(ζÞ*ýµÿÁP~þÓ^ý¤¿à£ÿ·_ì xCUŸöGð̧ÂO‚Zíaâ?€ß®µ¿ƒš„5~Óþ6Õü!ûx;OñO¥øû?ø÷êø&ÏÄk¯|IñçÀߎŸðQŸÚö„ý¦£ý ?n Oû|^öqñŽþü6Ñ¿k(ø/ûCü@ðÇÁÿÙ«Á´Â‡þ<ýŸô/‡ZÿÃ|Qñ¿†?dë­ã¿Ã|ð¶¢üEý˜¼aû}EüÐþ͝ÆÿÚöÂýŸgðßü§àÿí[ðoâˆ>!x³Ä? ?f/‰¿³WŹí¾ê_>+x¿ÁÞ&øÑû*Åû|ý¬àž_ôo§ÃËH5ŸŠŸ¶Ïíkñ áoÆ]KàÿìwñZçã‰>2ëü)ý/Q@Œ?³7íIð0ÿÁWÿmOÙðþÜßþ;xÛÄÿfáðÿÀºÏ‰¿cØ>2ø?â…¾0ÁE¯¾6~Ê~¼ø%ðûá·Åoxöcð·‡<+â+Ÿ†_uŠÿ> ÁãOx¯Å^ µ¹ø“¯êšÏþÍ?µÝŒÿࣞ#øa­ÿÁ]?áei–¿´ícðGÁÿ±ü#±µ‡Œ|}ñOÁÚ§ÆOÝxKþŸÃï÷ßµoÀßÙÿö2ø[ðËÅ? ÿárütø½aâ?Û ã·ƒ¿á`i ð×à•×ÁÛÛ3÷úŠþhà›ß¶ßí…ñ¯ö‡øañ×öÓýˆ.þÆþÿ‚xþÏ_´ÁÿŒ>(èúg…¼}à/ÚöÊý¥5„? <5ñ“Â_dø±ñ[MÑ>0øsú^¢Šüaý™¿jO‡þ ¿ûj~χöæø?ñÛÆÞ#ø?û7‡þÖ|MûÁñ—Áÿ¼-ñƒþ -}ñ³öSðçÁ/‡ß ¾+xûÃÿ³…¼9á_\ü2ø»¨üWø™ðVx›Å~*ñ­ÏÄTÖ~?ýÿà£:Ûx«öBÖ<ÿAø?ûMxoö’ÿ‚þݰá VÙÃ0jŸ > j?µ‡ˆþ|^ºÖþh~ÕümûOøÛWð‡ì}àí?Å>—áÿìñâσ_µoÁOi_²í߯O‰øÿãßézŠ+ñþ ³ñëÁß|yð7ã§ügö€ý¡?i¨ÿhۣ“þÇŸ£ýœ|G㿆¿ ´oÚÇãGŠ> þÐÿ<1ðöjðGíð‡áÿ?gý áÖ¿ð߯Ÿ|oáÙ:ëGøïðÃÀŸü- h¿f/Ø~ßQ@ËüÓöµøIðÙSÂ_ ÿm/قٻö’ÿ‚¯ÿÁPÿcÿ…²¯Ã˯ÙãÃ? ~ü$µøËûq~Ð |SðûPðÞ£yñ^øÁ®üD¼ý—|ðö_xÏ߳Ŀ³Çí[ðáç†ÿf«¿Š>4øyñçÇ=ÿü{öÛý°¾5þÐÿì>:þڱNJ~,xÄ:—ÇÿØF÷öÍøâ_Úà·Š¦øIâøá'ÂÿØßÂðOÙëö‘ø?ñƒàgÅLð·¼ûC~Ù_´¦£ð‡á'†¾2xKâ,Ÿ>+iº'ÆKÔP_ˆ?ðMŸˆ×^ø“ãÏ¿?à£?´í ûMGû@~ÝŸö<ø½ìãâ?ü5øm£~Ö?þÆþÿ‚xþÏ_´ÁÿŒ>(èúg…¼}à/ÚöÊý¥5„? <5ñ“Â_dø±ñ[MÑ>0øsØ?b/Û+â/ſڟá/¯~Û¿ð°?gÿøÌ¯ødŽžOì±ÿšÿ…ñâOüJ<ð—Ãßð¨ÿáÙ>e×ÂÏø³«ðÿþÏþNëáïücÿÃÿx[Výþ¢€?à›?®¼ñ'ÇŸ~:ÁFhÚöšö€ýº<)?ìyñz?ÙÇÄ~;økðÛFý¬~4x£à¿íñÃÿf¯~Ð~øóöоkÿ üiñGÆþý“®´Žÿ < ðOÂÚ‹ñöbð‡íõPóÿ÷Ÿö2øÑÿ1øññoVÿ‚§|?ý³?h߆´ü:ý•-¼e¯ÿÁ-¾"|Sø§ðNãþ ïð+ÄÞ,Ÿá?‹>þËÞøõáÿ‡þ ñ×ÄÚ.=Kÿ²G~ü"ÿ„Á¿õ/øG^ñŸˆ?hÍgâ/Ûÿ³7íIð0ÿÁWÿmOÙðþÜßþ;xÛÄÿfáðÿÀºÏ‰¿cØ>2ø?â…¾0ÁE¯¾6~Ê~¼ø%ðûá·Åoxöcð·‡<+â+Ÿ†_uŠÿ> ÁãOx¯Å^ µ¹ø“¯êšÏìõüÐÿÁ7¿m¿Û ã_íðÃã¯í§û\x§âLJüC©|ý„olßž%ý¡þ xªo„ž(ñïˆþ|/ýü!ÿñýž¿iƒÿ>|QÑôÏ xûÀ_´7í•ûJj?~xkã'„¾"Éñcâ¶›¢|aðçØÿh_ؾ_ø,ÏíÉà_‡?f >2|Tý˜?aÏ ø—ÁÞ ø—ð¥þ&|GøûðâGü§Gø¿ásÃÚ´|SãŒ~èß t¿‰:5ýž£ãO‡tŸXøžÛFðÝŽ_³ÔPò…àÚWÁß¿j/ø"‡Æ_޶‡Ãÿˆÿ´n·û@x‹Oý¡gÿ|;øe¬Á<¿hOÚ þ ÛûUèº×ì}áßŠß <à?~Ì?ð”üz»¶ø#ìûjø·ãí1ûBøïàÿäðoŠî:~ÆZÆ—À~Ì?ðSoÚ/Û öHÐþ2þÕßükðïö¬øÁ¯üø­ðƒ[ø±ð‘¼Uû(|BñŸÀÏŒ>üø±ðáçì!ð·ÄŸ°—í?­|døk üðoìÅûMÿÁK¿l‰¨¯Æ‚¾ƒö¬ø‰à~Ò ©Ú(ù¡ýˆÿm_ÿ´7í…û>Ïá¿ø)OÁÿÚ·àßÄÿ|Bñgˆ~~Ì_f¯‹sÛ|3Ô¾|Vñƒ¼Mñ£öU‹ö øûXÿÁ<¾èÞ1O‡–k??mŸÚ×âÂߌº—ÁÿØïâµÏÆ/|eÖ>;øSú^¢Šþhb?ÛWãí ûa~ϳøoþ Sðö­ø7ñ?ļYâ…³ÄßÙ«âÜöß õ/Ÿ¼_àï|hý•bý‚¾~Ö?ðO/ƒú7ŒSáå¤ÏÅOÛgöµø…ð·ã.¥ðö;ø­sñ‹ÄŸuŽþ?à›ß¶ßí…ñ¯ö‡øañ×öÓýˆ.þÆþÿ‚xþÏ_´ÁÿŒ>(èúg…¼}à/ÚöÊý¥5„? <5ñ“Â_dø±ñ[MÑ>0øsú^¢€?à›?®¼ñ'ÇŸ~:ÁFhÚöšö€ýº<)?ìyñz?ÙÇÄ~;økðÛFý¬~4x£à¿íñÃÿf¯~Ð~øóöоkÿ üiñGÆþý“®´Žÿ < ðOÂÚ‹ñöbð‡íõPâügâ5׃¾$øóàoÇOø(ÏíûB~ÓQþзG…'ý>/Gû8øÇ ~hßµÆ|ý¡þ xcàÿìÕàÚáÃÿ~Ïúíá¿>(øßòuÖñßá‡> ø[@Ñ~"þÌ^°óÿØ×öÊø‹ñ/â/ìD­ûnÿÃ@~дÿ ýûù?²Åßü;¿í²Çů‹ÿ¿âÜü øKàïÚÓàOü(ŸÚÓÁß ¿d_øË¯Š¿?áÿ…¡ÿ ³âŸü$ß´‰¼ãm'÷úŠüýl¯ˆ¿þ"þÄJß¶ïü4íû@yßðßß°“û,]ÿûþ×û,|Zø¿ñþ-Ï„¾ý­>ÿ‰ý­<ð«öEÿŒºø«ñCþ¿øZð«>)ÿÂMû@x›Á>6Ò¨¢€?~þп±|¿ðYŸÛ“À¿~8þÌ|dø©û0~Þñ/ƒ¼ñ/áKüLøñ÷àÄø)NñÃ:燴-hø§Æ> ü)Ѿétkû=GÆŸ>é>±ñ=¶á»(¾ý˜à¦ß´<_¶ì‘¡üeý«¾ø×áßíYñƒ_ø/ñ[á·ñcá#x«öPø…ã?Ÿþ*|+ø?ñcàÃÏØCáo‰?a/ÚZøÉð×Aø àßÙ‹ö›ÿ‚—~Ø?Q_Œ?|3íYñÀ$ý¤>ÿS´Páü·ö–ګĵö­ÿ}ðÿíEão…?lïi_³WÃKØ15þÍ_ j‹ÿþ üný¡t¿†? />+k¾ ×¼-yðÛÇZ/ÅŸ€ú§ìÉðCÄÞÕ¾Ù…ZÍÍÿ³ÿ‚Œøƒ^ø­ûN|`Ò¯ÿà ÿ²†~þÍ^#ÔcŸx[ö/ý£?i?þÈ>-ðÿÁ9|Iû(x}~2|1Ö~ ø³à·íu¨üCý¶¼}á_†ÚËüøåàüý¤¼Qãéz¾`ðÏì{ðCÃn~=øÁâÿˆ‡Ä,ñf„Ÿ?iÚWãWÃ߇ž*ñ´ίø›à÷ÁŸ‹ÿüqðoàŸˆ†üKâ¯hšÏÂ/x'Qð¯Ã?xËáw…nto‡~/ñ/†5@Äø&÷í·ûa|ký¡þØ|uý´ÿb üXðÿˆu/ÿ°ïí›ð3Ä¿´?ÁoMð“Å=ñÂO…ÿ±¿„?àž?³×í#ðãÀÏŠ:>™áox ö†ý²¿iMGáÂO |dð—ÄY>,|VÓtOŒ>þ—¨¢€ (¢€ (¢€ (¢€<ã—ü‚eÿ±_WÿÔÓá—ÿÅŸù*Ÿÿì xËÿR=J¿Ôã—ü‚eÿ±_WÿÔÓá—ÿÅŸù*Ÿÿì xËÿR=J±‡ñ«†—å1ô^¯ò‰ýÁ~Ö¿òy_ðNÿû |MÿÖ;Öëëjù'öµÿ“Êÿ‚wÿØcâoþ±Þ·_[W—[x†úz©¬vû¿ô˜…QX”|û{h|Cà/‚ôÏÙçVøáoÅ~<ý°4?Ú3ãï‹?gÿøãà·…~øšKo‡¾$ñO†~üj·áu狯´oˆ›ÄWðŸ‰>ü1Ô~ üAÑó¼ã_øO´$ÿ„á“øì—úïö‡>ÁãkøG>Ãñ/Á_Ù÷ð­¾#[ø«á×ö÷Šáÿ„ŸXúö½CàÇü”¯ ÿÜcÿL­mJ^ý(Ûþ^Ów»þgºÚúï½’Z“%£~OñKü¿ï (¢½£¢Š(ä…¾5ý¾µèZƿ٧ö@øðÊãûOþo|-ý¸~4|`ñÞ‘åhú„ú7öïÁ=¾xÄ_oñZV™©ÿh|Rð¿öF{¨k¶¿Ûwºe·‡u¯è¢€?˜/ø'¼ÿ±—Æø)Ç‹z·ü;áÿí™ûFü0ý á×ì©mã-þ mñâŸÅ?‚wðO^&ñdÿ üYðÇö^ð×ǯü?ðg޾$~Ñqê^ý’<{ð—áü$~ ø—©x÷Â:÷ŒüAûFk?~ßý™¿jO‡þ ¿ûj~χöæø?ñÛÆÞ#ø?û7‡þÖ|MûÁñ—Áÿ¼-ñƒþ -}ñ³öSðçÁ/‡ß ¾+xûÃÿ³…¼9á_\ü2ø»¨üWø™ðVx›Å~*ñ­ÏÄTÖg¨ ÀØ‹öÊø‹ñoö§øKð«Æ¶ïü,Ùÿþ3+þã§“û,Ææ¿á_üE‡Dø“ÿ|%ð÷ü*?øvO™uð³þ,êü?ÿ†óÿ“ºø{ÿÿðÿÇ^Õ¼þ ½ûmþØ_ÿh€vm?Ø‚ãÅ?ðïÅo†žðŽ¿føJ~=]Û|ƒöGýµ|[ñƒö˜ý¡|wðáÒx7Åw3ý™~8Ëã_êöŠ(ùbý˜à¦ß´<_¶ì‘¡üeý«¾ø×áßíYñƒ_ø/ñ[á·ñcá#x«öPø…ã?Ÿþ*|+ø?ñcàÃÏØCáo‰?a/ÚZøÉð×Aø àßÙ‹ö›ÿ‚—~Ø?Q_Œ?|3íYñÀ$ý¤>ÿS´Q@ÍìGûjüoý¡¿l/Ùö ÿÁJ~þÕ¿þ'øƒâ‹ütÿ‚Œþд'í5íûtxRØóâô³ˆüwð×á¶ûXühñGÁÚâ†>þÍ^ý >ü?ñçìÿ¡|:×þøÓâü1û']hÿþxàŸ…´ â/ìÅà;Ûê(ð‡þ [ûK?íUâ ZûVÿ‚¾øö¢ñ·Â¿Œ¶w‡4¯Ù«á¥Çìšÿf¯…¿µÅÿ‚ÿ~7~к_Ã…ŸµßkÞ¼ømã­âÏÀ}Södø!âo êßìÇ­fæÿÆž9øßòìÃÿ6ý¡âý°¿dã/í]ðÆ¿ÿjÏŒÿÁŠß5¿‹ Å_²‡Ä/ü øÇñSá_Áÿ‹~~ |Iû ~ÓúׯO†ºÀoþÌ_´ßü»öÁø˜ÚŠüaø+á˜?jψžñ'í!ðÇú¢€?šØÿþ 3­·Š¿d-cÇÿðTƒÿ´×†ÿi/ø(ÿí×ûhÕgý‘ü3©ð“à–£ûXxà7Åë­oàæ‡á _Æß´ÿµ~ÇÞÓüSài~þÏ,ø5ûVüðö•û.Ýüdø‘àþ=>þÙ¿þ+üVÿ‚`øbÏþ 3â {â·í9ñƒJ¿ÿ‚ƒþÈ^ø?û5xQýŽ|qáoØ¿öŒý¤üWû \ø·Ãÿåñ'ì¡áõøÉðÇYø3âςߵ֣ñöÚñ÷…~k/ð{ã—€|Sðö’ñGŒ?¥êùƒÃ?±ïÁ |e¹øôã‹þ"x³Åš|Xý¦?i__~x«ÆÐk:v¿âoƒß~/ü[ñÇÁ¿‚~ >ñ/м ¢k?¼àG¿ üaã/…޹Ѿø¿Ä¾Õ??à›ß¶ßí…ñ¯ö‡øañ×öÓýˆ.þÆþÿ‚xþÏ_´ÁÿŒ>(èúg…¼}à/ÚöÊý¥5„? <5ñ“Â_dø±ñ[MÑ>0øsúø³ÿ ³þgÄ¿ø^Ÿð¯ÿáI¿ñ—ü./ø[?ðެÿ…Yÿæ¥ÿ þ_ü&ñI¿ÿ„Kû_þ/øJâœÿ„sûKûoþ%Ÿj¯@¢€?˜/ø$'í+â?øS¿ðHφý´?á~ø·ÆŸ³ÿ†ÿ´ìGÿ ïágÿá?g¿þÂ~7ñÃÿŽÿð¬ãðE¯íàï·üHøkû6ü7ÿ†…øãñ{ÆŸ³?íÿ %ÿ àŸ€ü3á/¿³‡€=À·<ñ—öýŸ>2þÚž ¾øÈ?à£ÿ·OìŸûLøâ'ƒ~xkQñŸÁ­FÛ®ûþ ÷«~Ñwžøà½#àoÆGÂ_Ù_Ä_²6àýGà ÿ¶…|qãoü>øwñ³ÃqÞêž þ‡¨ æ‡àoí›ñ¿â¿Åoø&†,ÿà£> ×¾+~ÓŸ4«ÿø(?ì…ៃÿ³WˆõØçÇý‹ÿhÏÚOŲϋ|?ðN_~Ê_ŒŸ uŸƒ>,ø-û]j?ÿm¯xWá¶²ÿ¾9xÅ?ÿi/xÃú^¯˜<3ûüðÇÆ[ŸA~0x¿â!ñ‹þÇ6ºÄ?ÙƒÁºßíñ<ãŸxkö)ðµÏÃoø#Á?³OüSâ?¾-øCYð¿ˆ4øyñçÇ?ÔíWâügâ5׃¾$øóàoÇOø(ÏíûB~ÓQþзG…'ý>/Gû8øÇ ~hßµÆ|ý¡þ xcàÿìÕàÚáÃÿ~Ïúíá¿>(øßòuÖñßá‡> ø[@Ñ~"þÌ^°ý¾¢€?–/ø'§íkð“à<ÿ²§„¾þÚ_³ÿ³wí%ÿ_ÿ‚¡þÇÿ ÿe_‡—_³Ç†~ü;øIkñ—öâý þø§áö¡á½Fóâ&½ñƒ]ø‰yû.øáì¾ñŸ‡?g‰gÚ·àÃÏ þÍW|iðóãÏŽ{ÿø&÷í·ûa|ký¡þØ|uý´ÿb üXðÿˆu/ÿ°ïí›ð3Ä¿´?ÁoMð“Å=ñÂO…ÿ±¿„?àž?³×í#ðãÀÏŠ:>™áox ö†ý²¿iMGáÂO |dð—ÄY>,|VÓtOŒ>þ—¨ ¿foÚ“àaÿ‚¯þÚŸ³áý¹¾üvñ·ˆþþÍÃáÿuŸ~ǰ|eðÄ/ |`ÿ‚‹_|lý”ü'yðKá÷ÃoŠÞ>ðÿìÇáoxWÄW? ¾.ê?þ&|ƒÆž&ñ_мAksñ'_Õ5ŸÙê(ù¡ýÿà£:Ûx«öBÖ<ÿAø?ûMxoö’ÿ‚þݰá VÙÃ0jŸ > j?µ‡ˆþ|^ºÖþh~ÕümûOøÛWð‡ì}àí?Å>—áÿìñâσ_µoÁOi_²í߯O‰øÿãß ?aÏÚÆŸ|iû'\ëŸðS¿ø·ã·<>Ÿÿmø&í¿Â_€^>ø…û?|B¸øãKŸ~ÏP¯Áß xCãìMðàÇ®‡ñ Zý´aøËñ2÷âgÂÿ€?³ž§ñÇÁß|ã ãÿîõøCÿ­ý¥Ÿöªñ­}«Á_|?ûQxÛá_ÆÛ;ÚWìÕðÒãö MGÇÿ³WÂßÚƒâÿÁ‚¿¿h]/á‹ϊÚïˆ5ï ^|6ñÖ‹ñgà>©û2|ñ7…uoöcáV³sãOüoùö6ý»¿j¯Š4ðu×í/ÿ%ýˆ> \üBø?ñOÄß´çìù{ûnþÊ7ß´?ìm¨Û|ñ×Ä[|/ý“ðŸí—ûRþÖÞø)ð“ÀŸ<7ñÏFøßãm"Óâ–‡ýNÑ@Êì™ÿ<ý¬|cá/Ù?Yñgí§û?ünÖ¼yû?ÿÁ?hOxGBø[ðÛBñ?Ä­cö÷ý¸¥ÿ‚qþÓ>ÓÛÁÞ9›ûáÿì›ý—mâÏŠK០§Žíà ž7Ó.uŸü!ý™`Ó¿`»ÿ_ÿ‚o~Û¶Æ¿Úà‡Ç_ÛOö ¸ñOÅø‡RøÿûÞþÙ¿?ø÷êø&ÏÄk¯|IñçÀߎŸðQŸÚö„ý¦£ý ?n Oû|^öqñŽþü6Ñ¿k(ø/ûCü@ðÇÁÿÙ«Á´Â‡þ<ýŸô/‡ZÿÃ|Qñ¿†?dë­ã¿Ã|ð¶¢üEý˜¼aû}EyÿÅŸøUŸð«>%ÿÂôÿ…ÿ KþÿŒ¿áqÂÙÿ„sþgü*ÏøG5/øX?ð²ÿá0ÿŠKþÿü"_Úÿð™ÂSÿçü#ŸÚ_Ûñ,ûU8_ðHOÚWÄð§à‘Ÿ <ûhÂýño?gÿ„? ÿhÿØþßÂÏÿà ~Ï~ ý„üoã‡ÿÿáYÇà‹_ÛÁßoø‘ð×ömøoÿ ñÇâ÷?fÚþKþÁ?øgÂ_f;O´PóÃà?Û¿ÆžøËûþÏŸmO_|dðQÿÛ§öOý¦| ñÁ¿¼5¨øÏàÖ£í×}ÿûÕ¿h»Ï | ð^‘ð7ãÆ#á/ì¯â/ÙGð~£ðÛ¾8ñ·Šþ|;øÙá¸ïuO{ügâ5׃¾$øóàoÇOø(ÏíûB~ÓQþзG…'ý>/Gû8øÇ ~hßµÆ|ý¡þ xcàÿìÕàÚáÃÿ~Ïúíá¿>(øßòuÖñßá‡> ø[@Ñ~"þÌ^°ý¾¢€?à›?®¼ñ'ÇŸ~:ÁFhÚöšö€ýº<)?ìyñz?ÙÇÄ~;økðÛFý¬~4x£à¿íñÃÿf¯~Ð~øóöоkÿ üiñGÆþý“®´Žÿ < ðOÂÚ‹ñöbð‡ŸþÆ¿¶WÄ_‰b%oÛwþö€ý <ïøoïØÉý–.ÿáÝÿký–>-|_øÿçáÂ_~ÖŸáDþÖžøUû"ÿÆ]|Uø¡ÿßü-øUŸÿá&ý |Ôküø½u­üÐü!«øÛöŸñ¶¯áØûÁÚŠ| /ÃÿÙãÅŸ¿jß‚žÒ¿eÛ¿ŒŸ<ñÿÇ¿ÒõPEPEPEPEPEPƒürÿL¿ö+êÿúš|3¯òÿø³ÿ%Sâ_ý”êG©Wú€|rÿL¿ö+êÿúš|3¯òÿø³ÿ%Sâ_ý”êG©V0þ5oðÒü¦>‹ÕþQ?¸/Ú×þO+þ ßÿa‰¿úÇzÝ}m_$þÖ¿òy_ðNÿû |MÿÖ;ÖëëjòëoðÏÿOU5Žßwþ“¢Š+Ëßø*…>øëÂ߳Ƒñëã/ì½ð_Dð_ÆÍSâæ…{ûn|¶ø»û*üCÕtoƒŸ>ÍðÛÇÞ'ø¡ðCáòxÙí>7¿Ä¯†ÞÕ~)YxËY¼øe®x«Â>ñF‰ð÷ÇZ—…~Öÿ‚UjÔ~ü|3ø]ð«Â6߯íÂÚ7ÀÿX|<ø-ãOxgâÅ?èþx/K{Í3Ãÿ ¿i3Kµý¢üg§kÞ5°o üRÒn->$|M·ž?ˆ>%öÊõƒòR¼7ÿqý0jµµ)^tc®•`÷Vø»Ywêß•®KZIù?É—õcï (¢½£¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(Áþ9È&_ûõýM>×ùüYÿ’©ñ/þÊŒ¿õ#Ô«ý@>9È&_ûõýM>×ùüYÿ’©ñ/þÊŒ¿õ#Ô«·øi~SEêÿ(ŸÜíkÿ'•ÿïÿ°ÇÄßýc½n¾¶¯’k_ù<¯ø'ý†>&ÿëëuõµyu·‡øgÿ§ªšÇo»ÿIˆQE‰A^¡ðcþJW†ÿî1ÿ¦ V¼¾½CàÇü”¯ ÿÜcÿL­iGø´¿ëä?ô¤)lýä}áEW¸`QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEx?Ç/ùËÿb¾¯ÿ©§Ã:ÿ/ÿ‹?òU>%ÿÙ@ñ—þ¤z•¨Ç/ùËÿb¾¯ÿ©§Ã:ÿ/ÿ‹?òU>%ÿÙ@ñ—þ¤z•cãVÿ /Êcè½_åû‚ý­äò¿àÿöø›ÿ¬w­×ÖÕòOíkÿ'•ÿïÿ°ÇÄßýc½n¾¶¯.¶ðÿ ÿôõSXí÷é1 (¢±(+Ô> ÉJðßýÆ?ôÁª×—ר|ÿ’•á¿ûŒéƒU­(ÿ—ý|‡þ”…-Ÿ£ü¼(¢Š÷ Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( øåÿ ™ìWÕÿõ4øg_åÿñgþJ§Ä¿û(2ÿÔR¯õøåÿ ™ìWÕÿõ4øg_åÿñgþJ§Ä¿û(2ÿÔR¬aüjßá¥ùL}«ü¢p_µ¯üžWü¿þÃõŽõºúÚ¾Iý­äò¿àÿöø›ÿ¬w­×ÖÕåÖÞáŸþžªk¾ïý&!EV%z‡Áù)^ÿ¸Çþ˜5ZòúõƒòR¼7ÿqý0jµ¥âÒÿ¯ÿÒ¥³ô‘÷…Q^á€QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEàÿ¿ä/ýŠú¿þ¦Ÿ ëü¿þ,ÿÉTø—ÿeÆ_ú‘êUþ ¿ä/ýŠú¿þ¦Ÿ ëü¿þ,ÿÉTø—ÿeÆ_ú‘êUŒ?[ü4¿)¢õ”Oî öµÿ“Êÿ‚wÿØcâoþ±Þ·_[WÉ?µ¯üžWü¿þÃõŽõºúÚ¼ºÛÃü3ÿÓÕMc·Ýÿ¤Ä(¢ŠÄ ¯Pø1ÿ%+Ã÷ÿÓ«^_^¡ðcþJW†ÿî1ÿ¦ V´£üZ_õòúR¶~ò>ð¢Š+Ü0 (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€<ã—ü‚eÿ±_WÿÔÓá—ÿÅŸù*Ÿÿì xËÿR=J¿Ôã—ü‚eÿ±_WÿÔÓá—ÿÅŸù*Ÿÿì xËÿR=J±‡ñ«†—å1ô^¯ò‰ýÁ~Ö¿òy_ðNÿû |MÿÖ;Öëëjù'öµÿ“Êÿ‚wÿØcâoþ±Þ·_[W—[x†úz©¬vû¿ô˜…QX”ê?ä¥xoþãú`ÕkËëÔ> ÉJðßýÆ?ôÁªÖ”‹Kþ¾CÿJB–ÏÑþGÞQE{†EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPƒürÿL¿ö+êÿúš|3¯òÿø³ÿ%Sâ_ý”êG©Wú€|rÿL¿ö+êÿúš|3¯òÿø³ÿ%Sâ_ý”êG©V0þ5oðÒü¦>‹ÕþQ?¸/Ú×þO+þ ßÿa‰¿úÇzÝ}m_$þÖ¿òy_ðNÿû |MÿÖ;ÖëëjòëoðÏÿOU5Žßwþ“¢Š+‚½CàÇü”¯ ÿÜcÿL­y}z‡Áù)^ÿ¸Çþ˜5ZÒñi×ÈéHRÙú?ÈûŠ(¯pÀ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠðŽ_ò —þÅ}_ÿSO†uþ_ÿäª|Kÿ²ã/ýHõ*ÿPŽ_ò —þÅ}_ÿSO†uþ_ÿäª|Kÿ²ã/ýHõ*ÆÆ­þ_”ÇÑz¿Ê'÷ûZÿÉåÁ;ÿì1ñ7ÿXï[¯­«äŸÚ×þO+þ ßÿa‰¿úÇzÝ}m^]máþÿéꦱÛîÿÒbQEbPW¨|ÿ’•á¿ûŒéƒU¯/¯Pø1ÿ%+Ã÷ÿÓ«ZQþ-/úùý) [?GùxQEîQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ñËþA2ÿد«ÿêiðοËÿâÏü•O‰öP&ÿëëuõµ|»ûMi¿Û?·'ücGó¾Íý«âÏé¿hòüï³ý»öEÕ­|ï'Ì‹Íò¼Ýþ_›ý»|ÄÎáõˆ5¯…°ƒTñOï|5¦]k~ðÕ®£â Ãz5…ψüiâ=+ÁÞðüzí­æÖüYâíwCð·†´¨äkýwÄzΕ¡ép]jz¥¬ÞmX·ìÚ¶ÓZÉ+¿mWkµ}Ѭvû¿ô˜”¨¯&ø‘ñ!<5ñûöFø1áRÚ…—í ñÇžñN»â Y]xwHð¯øÆÍô -;Ä—±]êZ†¿a¤ ›­Fámmt‹=JÆ+ ‹ÝbÛUÐ~û'‚ÿè?âü$4Ÿþn+'NI&ùm$Ú|ñÖͧףC¿õgåþkúLåëÔ> ÉJðßýÆ?ôÁª×/öOÿÐÅøHi?üÜV÷†u xS\±×ôío^šòÃí>LW¾ Óä¶oµZ\YIæ¤>¶•¶Årì›fLH¶å©®Z“q´g?~)&þÐ=S]×g×åçùögßTWËÿð¾ÿéóÿ,?ÿTÂûÿ§Ïü°ÿüiW§õª]ÿÿòF\¯ú¿——ŸàûPQ_/ÿÂûÿ§Ïü°ÿüiQÿ ïþŸ?òÃÿñ¥GÖ©wücÿÉ+þ¯ååçø>ÇÔWËÿð¾ÿéóÿ,?ÿTÂûÿ§Ïü°ÿüiQõª]ÿÿòAÊÿ«ùyyþ±õòÿü/¿ú|ÿËÿÆ•ð¾ÿéóÿ,?ÿT}j—Æ?ür¿êþ^^ƒì}AE|¿ÿ ïþŸ?òÃÿñ¥Gü/¿ú|ÿËÿÆ•Z¥ßñÿ$¯ú¿——ŸàûPQ_/ÿÂûÿ§Ïü°ÿüiQÿ ïþŸ?òÃÿñ¥GÖ©wücÿÉ+þ¯ååçø>ÇÔWçÄOÛ?Å~øóû+|!ðî‘áíWLøïâß‹O‹u½kÃú–•yáÝáçÁ|C²“A†ÏÇŒ··ž Ñ´vÔ/õë› ËA±ÕlîæÓ†®¾,ð§×|CÖ—ÌÍ®—ß;>d¸Ùý¥Ÿ3íwºoüzýžO;í¿ÙXþÁÔ¿µ?áÛãŸøT–«A¤õ³W[=.×FÖé‹•ÿ_/óG²Q^7'Ä=i|ÌÚépíó³æAwûŸÚYó>×{¦ÿǯÙäó¾Ûý•ìKûSþý¾9ÿ…HIñZ_36º\;|ìù]þãgö–|ϵÞé¿ñëöy<ï¶ÿecûRþÔÿ„oŽáRÚpYöþ´ÿ4{%ãr|CÖ—ÌÍ®—ß;>d¸Ùý¥Ÿ3íwºoüzýžO;í¿ÙXþÁÔ¿µ?áÛãŸøT„Ÿõ¥ó3k¥Ã·ÎÏ™ßî6igÌû]î›ÿ¿g“ÎûoöV?°u/íOøGöøçþ!í¡ç÷ŸoëOóG²Q^7'Ä=i|ÌÚépíó³æAwûŸÚYó>×{¦ÿǯÙäó¾Ûý•ìKûSþý¾9ÿ…HIñZ_36º\;|ìù]þãgö–|ϵÞé¿ñëöy<ï¶ÿecûRþÔÿ„oŽáRÚpYöþ´ÿ4{%ãr|CÖ—ÌÍ®—ß;>d¸Ùý¥Ÿ3íwºoüzýžO;í¿ÙXþÁÔ¿µ?áÛãŸøT„Ÿõ¥ó3k¥Ã·ÎÏ™ßî6igÌû]î›ÿ¿g“ÎûoöV?°u/íOøGöøçþ!í¡ç÷ŸoëOóG²Q^7'Ä=i|ÌÚépíó³æAwûŸÚYó>×{¦ÿǯÙäó¾Ûý•ìKûSþý¾9ÿ…HIñZ_36º\;|ìù]þãgö–|ϵÞé¿ñëöy<ï¶ÿecûRþÔÿ„oŽáRÚpYöþ´ÿ4{%ãr|CÖ—ÌÍ®—ß;>d¸Ùý¥Ÿ3íwºoüzýžO;í¿ÙXþÁÔ¿µ?áÛãŸøT„Ÿõ¥ó3k¥Ã·ÎÏ™ßî6igÌû]î›ÿ¿g“ÎûoöV?°u/íOøGöøçþ!í¡ç÷ŸoëOóG²Q^7'Ä=i|ÌÚépíó³æAwûŸÚYó>×{¦ÿǯÙäó¾Ûý•ìKûSþý¾9ÿ…HIñZ_36º\;|ìù]þãgö–|ϵÞé¿ñëöy<ï¶ÿecûRþÔÿ„oŽáRÚpYöþ´ÿ4{%ãr|CÖ—ÌÍ®—ß;>d¸Ùý¥Ÿ3íwºoüzýžO;í¿ÙXþÁÔ¿µ?áÛãŸøT„Ÿõ¥ó3k¥Ã·ÎÏ™ßî6igÌû]î›ÿ¿g“ÎûoöV?°u/íOøGöøçþ!í¡ç÷ŸoëOóG²Q^7'Ä=i|ÌÚépíó³æAwûŸÚYó>×{¦ÿǯÙäó¾Ûý•ìKûSþý¾9ÿ…HIñZ_36º\;|ìù]þãgö–|ϵÞé¿ñëöy<ï¶ÿecûRþÔÿ„oŽáRÚpYöþ´ÿ4{%ãr|CÖ—ÌÍ®—ß;>d¸Ùý¥Ÿ3íwºoüzýžO;í¿ÙXþÁÔ¿µ?áÛãŸøT„Ÿõ¥ó3k¥Ã·ÎÏ™ßî6igÌû]î›ÿ¿g“ÎûoöV?°u/íOøGöøçþ!í¡ç÷ŸoëOóG²Q^7'Ä=i|ÌÚépíó³æAwûŸÚYó>×{¦ÿǯÙäó¾Ûý•ìKûSþý¾9ÿ…HIñZ_36º\;|ìù]þãgö–|ϵÞé¿ñëöy<ï¶ÿecûRþÔÿ„oŽáRÚpYöþ´ÿ4{%ãr|CÖ—ÌÍ®—ß;>d¸Ùý¥Ÿ3íwºoüzýžO;í¿ÙXþÁÔ¿µ?áÛãŸøT„Ÿõ¥ó3k¥Ã·ÎÏ™ßî6igÌû]î›ÿ¿g“ÎûoöV?°u/íOøGöøçþ!í¡ç÷ŸoëOóG²Q^7'Ä=i|ÌÚépíó³æAwûŸÚYó>×{¦ÿǯÙäó¾Ûý•ìKûSþý¾9ÿ…HIñZ_36º\;|ìù]þãgö–|ϵÞé¿ñëöy<ï¶ÿecûRþÔÿ„oŽáRÚpYöþ´ÿ4{%ãr|CÖ—ÌÍ®—ß;>d¸Ùý¥Ÿ3íwºoüzýžO;í¿ÙXþÁÔ¿µ?áÛãŸøT„Ÿõ¥ó3k¥Ã·ÎÏ™ßî6igÌû]î›ÿ¿g“ÎûoöV?°u/íOøGöøçþ!í¡ç÷ŸoëOóG²Q^7'Ä=i|ÌÚépíó³æAwûŸÚYó>×{¦ÿǯÙäó¾Ûý•ìKûSþý¾9ÿ…HIñZ_36º\;|ìù]þãgö–|ϵÞé¿ñëöy<ï¶ÿecûRþÔÿ„oŽáRÚpYöþ´ÿ4{%ãr|CÖ—ÌÍ®—ß;>d¸Ùý¥Ÿ3íwºoüzýžO;í¿ÙXþÁÔ¿µ?áÛãŸøT„Ÿõ¥ó3k¥Ã·ÎÏ™ßî6igÌû]î›ÿ¿g“ÎûoöV?°u/íOøGöøçþ!í¡ç÷ŸoëOóG²Q^7'Ä=i|ÌÚépíó³æAwûŸÚYó>×{¦ÿǯÙäó¾Ûý•ìKûSþý¾9ÿ…HIñZ_36º\;|ìù]þãgö–|ϵÞé¿ñëöy<ï¶ÿecûRþÔÿ„oŽáRÚpYöþ´ÿ4{%ãr|CÖ—ÌÍ®—ß;>d¸Ùý¥Ÿ3íwºoüzýžO;í¿ÙXþÁÔ¿µ?áÛãŸøT„Ÿõ¥ó3k¥Ã·ÎÏ™ßî6igÌû]î›ÿ¿g“ÎûoöV?°u/íOøGöøçþ!í¡ç÷ŸoëOóG²Q^7'Ä=i|ÌÚépíó³æAwûŸÚYó>×{¦ÿǯÙäó¾Ûý•ìKûSþý¾9ÿ…HIñZ_36º\;|ìù]þãgö–|ϵÞé¿ñëöy<ï¶ÿecûRþÔÿ„oŽáRÚpYöþ´ÿ4{%ãr|CÖ—ÌÍ®—ß;>d¸Ùý¥Ÿ3íwºoüzýžO;í¿ÙXþÁÔ¿µ?áÛãŸøT„Ÿõ¥ó3k¥Ã·ÎÏ™ßî6igÌû]î›ÿ¿g“ÎûoöV?°u/íOøGöøçþ!í¡ç÷ŸoëOóG²Q^7'Ä=i|ÌÚépíó³æAwûŸÚYó>×{¦ÿǯÙäó¾Ûý•ìKûSþý¾9ÿ…HIñZ_36º\;|ìù]þãgö–|ϵÞé¿ñëöy<ï¶ÿecûRþÔÿ„oŽáRÚpYöþ´ÿ4{%ãr|CÖ—ÌÍ®—ß;>d¸Ùý¥Ÿ3íwºoüzýžO;í¿ÙXþÁÔ¿µ?áÛãŸøT„Ÿõ¥ó3k¥Ã·ÎÏ™ßî6igÌû]î›ÿ¿g“ÎûoöV?°u/íOøGöøçþ!í¡ç÷ŸoëOóG²Q^7'Ä=i|ÌÚépíó³æAwûŸÚYó>×{¦ÿǯÙäó¾Ûý•ìKûSþý¾9ÿ…HIñZ_36º\;|ìù]þãgö–|ϵÞé¿ñëöy<ï¶ÿecûRþÔÿ„oŽáRÚpYöþ´ÿ4{%àúŸÅ jÉ®¦—û.ÆÒÇK»Ô®Õt[½V÷÷~ Ò´Ha†ÚãÄÞ|¹õskq%ݽ®Ù´«¥ž;|ëžð—ži_µ‡5Ûÿéz‹4MgSð^·†¼c§i^°Ôoü'â;¯xÆ6¾ñ-¥§Å©®4-nçÂ>,ð·Š`ÒµHíoæðç‰|?®GišÎus/M;6×]l´ï«]t‹×§ùßï=ã—ü‚eÿ±_WÿÔÓá—ÿÅŸù*Ÿÿì xËÿR=J¿Ð—Ký¨ÒVkü:¿³_ÿ(«ŽÍò8´œ=ªÖ7Oš¤ïÕt{­uÒÆ‰éoðþPÿ3Óþ'ÿÉôÿÁ2ÿì´|eÿÕ ã úÚ¿9eýÿf™üOá]ÁOiëßøï]Ô<â ÿˆ?²åþ§áMCÄžÕü¬ê Í熧}2þïÃÚæ£f—¶¾]ÕÃZj–2ÛjÚf™}g«ÿ Sà7ý%gö·ÿëû5ÿòЦT¹¡N<ÖäRMÛ~i¹wéq§å»OïQ_©ú E~}”ø ÿIYý­ÿðêþÍü¢£þ§ÀoúJÏíoÿ‡WökÿåG°þÿþKÿÛ7—oÇ—ÿ’üÐZ+óëþ§ÀoúJÏíoÿ‡Wökÿåð¥>ÒVkü:¿³_ÿ(¨ößÿÉû`æòíøòÿò_ú E~}”ø ÿIYý­ÿðêþÍü¢£þ§ÀoúJÏíoÿ‡WökÿåÃûÿù/ÿlÞ]¿_þKð?Ah¯Ï¯øRŸ¿é+?µ¿þ_Ù¯ÿ”T”ø ÿIYý­ÿðêþÍü¢£Øÿ%ÿ탛˷ãËÿÉ~è-ùõÿ Sà7ý%gö·ÿëû5ÿòŠøRŸ¿é+?µ¿þ_Ù¯ÿ”T{ïÿä¿ý°syvüyù/Àý¢¿>¿áJ|ÿ¤¬þÖÿøuf¿þQQÿ Sà7ý%gö·ÿëû5ÿòŠaýÿü—ÿ¶o.ß/ÿ%ø ´Wç×ü)O€ßô•ŸÚßÿ¯ì×ÿÊ*?áJ|ÿ¤¬þÖÿøuf¿þQQì?¿ÿ’ÿöÁÍåÛñåÿä¿Óþ)ñûmÁ:_§•ñöŸO'ìÿ³ÄYþÓæþïìßfòþÑöß·h¿aò¾Ùÿ '†<øHtÏÕoõ_ôÇÉÿ·o#ìßø%û'Ù?±êýŸýÿ2ü"?ñŸ¿þ~Ë~ø½ðÃã.¹ÿøÏñs^øEªøZð~‡ñcÆÿ³ö¹á»]CÅ> ñ5[†ü"þ"´”èž$¾’Ú}ÄzMÕ¶©m¥êqÏö2Ñ£ûÞ?Ú›ö~ËÇÇ?~ïÉÇ—sà›oõ?Ù¸òþÉñnßì¿ò ÉûÙ³ñ¦ÿeý‡þ?Â-º\±„Uß*i½ó”»öbÝßmSÿÒ¢ÿÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>ê¿é“ÿnÞGÙ¿ðKöO²bÿÔû?ûþeøDã>tö¦ýŸ£òññÏÀŸ»òqåÜø&ÛýOön<¿²|[·û/üƒcò~Åö_ìüi¿Ùaÿ„OÀßð‹þÔß³ô~^>9ø÷~N<»ŸÛ©þÍÇ—öO‹vÿeÿl~OؾËýŸ7û/ì?ð‰øþbï³ü?ÌMWNÿÜòþ¯ëo¢ÿÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>ê¿é“ÿnÞGÙ¿ðKöO²bÿÔû?ûþeøDã>tö¦ýŸ£òññÏÀŸ»òqåÜø&ÛýOön<¿²|[·û/üƒcò~Åö_ìüi¿Ùaÿ„OÀßð‹þÔß³ô~^>9ø÷~N<»ŸÛ©þÍÇ—öO‹vÿeÿl~OؾËýŸ7û/ì?ð‰øþbï³ü?ÌMWNÿÜòþ¯ëo¢ÿÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>ê¿é“ÿnÞGÙ¿ðKöO²bÿÔû?ûþeøDã>tö¦ýŸ£òññÏÀŸ»òqåÜø&ÛýOön<¿²|[·û/üƒcò~Åö_ìüi¿Ùaÿ„OÀßð‹þÔß³ô~^>9ø÷~N<»ŸÛ©þÍÇ—öO‹vÿeÿl~OؾËýŸ7û/ì?ð‰øþbï³ü?ÌMWNÿÜòþ¯ëo¢ÿÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>ê¿é“ÿnÞGÙ¿ðKöO²bÿÔû?ûþeøDã>tö¦ýŸ£òññÏÀŸ»òqåÜø&ÛýOön<¿²|[·û/üƒcò~Åö_ìüi¿Ùaÿ„OÀßð‹þÔß³ô~^>9ø÷~N<»ŸÛ©þÍÇ—öO‹vÿeÿl~OؾËýŸ7û/ì?ð‰øþbï³ü?ÌMWNÿÜòþ¯ëo¢ÿÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>ê¿é“ÿnÞGÙ¿ðKöO²bÿÔû?ûþeøDã>tö¦ýŸ£òññÏÀŸ»òqåÜø&ÛýOön<¿²|[·û/üƒcò~Åö_ìüi¿Ùaÿ„OÀßð‹þÔß³ô~^>9ø÷~N<»ŸÛ©þÍÇ—öO‹vÿeÿl~OؾËýŸ7û/ì?ð‰øþbï³ü?ÌMWNÿÜòþ¯ëo¢ÿÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>ê¿é“ÿnÞGÙ¿ðKöO²bÿÔû?ûþeøDã>tö¦ýŸ£òññÏÀŸ»òqåÜø&ÛýOön<¿²|[·û/üƒcò~Åö_ìüi¿Ùaÿ„OÀßð‹þÔß³ô~^>9ø÷~N<»ŸÛ©þÍÇ—öO‹vÿeÿl~OؾËýŸ7û/ì?ð‰øþbï³ü?ÌMWNÿÜòþ¯ëo¢ÿÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>ê¿é“ÿnÞGÙ¿ðKöO²bÿÔû?ûþeøDã>tö¦ýŸ£òññÏÀŸ»òqåÜø&ÛýOön<¿²|[·û/üƒcò~Åö_ìüi¿Ùaÿ„OÀßð‹þÔß³ô~^>9ø÷~N<»ŸÛ©þÍÇ—öO‹vÿeÿl~OؾËýŸ7û/ì?ð‰øþbï³ü?ÌMWNÿÜòþ¯ëo¢ÿÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>ê¿é“ÿnÞGÙ¿ðKöO²bÿÔû?ûþeøDã>tö¦ýŸ£òññÏÀŸ»òqåÜø&ÛýOön<¿²|[·û/üƒcò~Åö_ìüi¿Ùaÿ„OÀßð‹þÔß³ô~^>9ø÷~N<»ŸÛ©þÍÇ—öO‹vÿeÿl~OؾËýŸ7û/ì?ð‰øþbï³ü?ÌMWNÿÜòþ¯ëo¢ÿÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>ê¿é“ÿnÞGÙ¿ðKöO²bÿÔû?ûþeøDã>tö¦ýŸ£òññÏÀŸ»òqåÜø&ÛýOön<¿²|[·û/üƒcò~Åö_ìüi¿Ùaÿ„OÀßð‹þÔß³ô~^>9ø÷~N<»ŸÛ©þÍÇ—öO‹vÿeÿl~OؾËýŸ7û/ì?ð‰øþbï³ü?ÌMWNÿÜòþ¯ëo¢ÿÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>ê¿é“ÿnÞGÙ¿ðKöO²bÿÔû?ûþeøDã>tö¦ýŸ£òññÏÀŸ»òqåÜø&ÛýOön<¿²|[·û/üƒcò~Åö_ìüi¿Ùaÿ„OÀßð‹þÔß³ô~^>9ø÷~N<»ŸÛ©þÍÇ—öO‹vÿeÿl~OؾËýŸ7û/ì?ð‰øþbï³ü?ÌMWNÿÜòþ¯ëo¢ÿÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>ê¿é“ÿnÞGÙ¿ðKöO²bÿÔû?ûþeøDã>tö¦ýŸ£òññÏÀŸ»òqåÜø&ÛýOön<¿²|[·û/üƒcò~Åö_ìüi¿Ùaÿ„OÀßð‹þÔß³ô~^>9ø÷~N<»ŸÛ©þÍÇ—öO‹vÿeÿl~OؾËýŸ7û/ì?ð‰øþbï³ü?ÌMWNÿÜòþ¯ëo¢ÿÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>ê¿é“ÿnÞGÙ¿ðKöO²bÿÔû?ûþeøDã>tö¦ýŸ£òññÏÀŸ»òqåÜø&ÛýOön<¿²|[·û/üƒcò~Åö_ìüi¿Ùaÿ„OÀßð‹þÔß³ô~^>9ø÷~N<»ŸÛ©þÍÇ—öO‹vÿeÿl~OؾËýŸ7û/ì?ð‰øþbï³ü?ÌMWNÿÜòþ¯ëo¢ÿÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>ê¿é“ÿnÞGÙ¿ðKöO²bÿÔû?ûþeøDã>tö¦ýŸ£òññÏÀŸ»òqåÜø&ÛýOön<¿²|[·û/üƒcò~Åö_ìüi¿Ùaÿ„OÀßð‹þÔß³ô~^>9ø÷~N<»ŸÛ©þÍÇ—öO‹vÿeÿl~OؾËýŸ7û/ì?ð‰øþbï³ü?ÌMWNÿÜòþ¯ëo¢ÿÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>ê¿é“ÿnÞGÙ¿ðKöO²bÿÔû?ûþeøDã>tö¦ýŸ£òññÏÀŸ»òqåÜø&ÛýOön<¿²|[·û/üƒcò~Åö_ìüi¿Ùaÿ„OÀßð‹þÔß³ô~^>9ø÷~N<»ŸÛ©þÍÇ—öO‹vÿeÿl~OؾËýŸ7û/ì?ð‰øþbï³ü?ÌMWNÿÜòþ¯ëo¢ÿÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>ê¿é“ÿnÞGÙ¿ðKöO²bÿÔû?ûþeøDã>tö¦ýŸ£òññÏÀŸ»òqåÜø&ÛýOön<¿²|[·û/üƒcò~Åö_ìüi¿Ùaÿ„OÀßð‹þÔß³ô~^>9ø÷~N<»ŸÛ©þÍÇ—öO‹vÿeÿl~OؾËýŸ7û/ì?ð‰øþbï³ü?ÌMWNÿÜòþ¯ëo¢ÿÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>ê¿é“ÿnÞGÙ¿ðKöO²bÿÔû?ûþeøDã>tö¦ýŸ£òññÏÀŸ»òqåÜø&ÛýOön<¿²|[·û/üƒcò~Åö_ìüi¿Ùaÿ„OÀßð‹þÔß³ô~^>9ø÷~N<»ŸÛ©þÍÇ—öO‹vÿeÿl~OؾËýŸ7û/ì?ð‰øþbï³ü?ÌMWNÿÜòþ¯ëo¢ÿÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>ê¿é“ÿnÞGÙ¿ðKöO²bÿÔû?ûþeøDã>tö¦ýŸ£òññÏÀŸ»òqåÜø&ÛýOön<¿²|[·û/üƒcò~Åö_ìüi¿Ùaÿ„OÀßð‹þÔß³ô~^>9ø÷~N<»ŸÛ©þÍÇ—öO‹vÿeÿl~OؾËýŸ7û/ì?ð‰øþbï³ü?ÌMWNÿÜòþ¯ëo¢ÿÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>ê¿é“ÿnÞGÙ¿ðKöO²bÿÔû?ûþeøDã>tö¦ýŸ£òññÏÀŸ»òqåÜø&ÛýOön<¿²|[·û/üƒcò~Åö_ìüi¿Ùaÿ„OÀßð‹þÔß³ô~^>9ø÷~N<»ŸÛ©þÍÇ—öO‹vÿeÿl~OؾËýŸ7û/ì?ð‰øþbï³ü?ÌMWNÿÜòþ¯ëo¢ÿÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>ê¿é“ÿnÞGÙ¿ðKöO²bÿÔû?ûþeøDã>tö¦ýŸ£òññÏÀŸ»òqåÜø&ÛýOön<¿²|[·û/üƒcò~Åö_ìüi¿Ùaÿ„OÀßð‹þÔß³ô~^>9ø÷~N<»ŸÛ©þÍÇ—öO‹vÿeÿl~OؾËýŸ7û/ì?ð‰øþbï³ü?ÌMWNÿÜòþ¯ëo¢ÿÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>ê¿é“ÿnÞGÙ¿ðKöO²bÿÔû?ûþeøDã>tö¦ýŸ£òññÏÀŸ»òqåÜø&ÛýOön<¿²|[·û/üƒcò~Åö_ìüi¿Ùaÿ„OÀßð‹þÔß³ô~^>9ø÷~N<»ŸÛ©þÍÇ—öO‹vÿeÿl~OؾËýŸ7û/ì?ð‰øþbï³ü?ÌMWNÿÜòþ¯ëo¢ÿÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>ê¿é“ÿnÞGÙ¿ðKöO²bÿÔû?ûþeøDã>tö¦ýŸ£òññÏÀŸ»òqåÜø&ÛýOön<¿²|[·û/üƒcò~Åö_ìüi¿Ùaÿ„OÀßð‹þÔß³ô~^>9ø÷~N<»ŸÛ©þÍÇ—öO‹vÿeÿl~OؾËýŸ7û/ì?ð‰øþbï³ü?ÌMWNÿÜòþ¯ëo¢ÿÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>ê¿é“ÿnÞGÙ¿ðKöO²bÿÔû?ûþeøDã>tö¦ýŸ£òññÏÀŸ»òqåÜø&ÛýOön<¿²|[·û/üƒcò~Åö_ìüi¿Ùaÿ„OÀßð‹þÔß³ô~^>9ø÷~N<»ŸÛ©þÍÇ—öO‹vÿeÿl~OؾËýŸ7û/ì?ð‰øþbï³ü?ÌMWNÿÜòþ¯ëo¢ÿÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>ê¿é“ÿnÞGÙ¿ðKöO²bÿÔû?ûþeøDã>tö¦ýŸ£òññÏÀŸ»òqåÜø&ÛýOön<¿²|[·û/üƒcò~Åö_ìüi¿Ùaÿ„OÀßð‹þÔß³ô~^>9ø÷~N<»ŸÛ©þÍÇ—öO‹vÿeÿl~OؾËýŸ7û/ì?ð‰øþbï³ü?ÌMWNÿÜòþ¯ëocñOɤëÐýÍž›÷꼿+Æž²ÿ_ô/+Êûöü€ì>Ïöìø”d¼ø{üú|ýƒÿhoÿÁ_ÿn_Û×\ø¹­øàÅ­à߀üðGÃz†‰ªØ|›Áÿ³ïÂÏ Ý|Bø¡cwm«Ûø[Døaâëè¿K]â®§â3⻉5¿ ü&½Ôt?Ž¥_üað;㎙áý"ÓöéñÏÁ;M[éo¿áGx—à‡†fñXº·Ñ µ¶ñ$Þ'Ö|fía¤I¢­Î™¦ègCÓÃÜÁkm}¦xcÀ¶ùþ§ÀoúJÏíoÿ‡WökÿåK‹nM>^hr4⥧2–šÙ=§MvOTûtŠýOOýž¿äô?à¢ßöEÿcoý=øî¿‡ß‹?òU>%ÿÙ@ñ—þ¤z•u³'Ã€ß õߎ:ÿÃÏÚWâoí!ñâ·ƒ<¦ø²ÿâ¹ð£Äšž‘á߆Þ+š}QkŸ‡Qé—XEsâùô{‹ÍbÇRW¸½ðöåŠG?§şù*Ÿÿì xËÿR=Jºpÿ×jt#ÿ€©Å¿ˆ—æÛûÔ_ênðPïÚ;þ:? üoþÇðNµý‹ðûáׂ¼¯‰?áMü9Òár|fý‹> Â[ãÿŠ?ð‡|@ÿ„Á>ÿ…ÿ —еïøCuï²èZ øû"oûL'ÿÃË5]_Ã? gðÖ­ûxËÄÞ?øÙð×Àªÿ³—íKã/ÚßÁ°ø7Uý¯¿`/ÙãâËâÍà'ÁO éþ6Ѽ3ûgOªÞh^ ñ.•ªø?U?|A¥xcâÿ†|eãË?†_s~Ø¿áyüCø1à¯øH¿áþijøñ‡ûOû#ûoí_ðÏ´ì;ñÿþß±ÿiéOü&ð¬¿áþ×û\¿ðÿmÿofkÙ¿Ø×þuûN~ÇŸðÑß¾üKÿ…‰ÿoü)ìø’ÿÂ#ÿ ü$ŸÙ_¶?ì+ûZÈKþ}ûÏÿ†+ÿ„þ<5_+þWü%_¼ÿ„7þ¿pÉÓ¼T–¼ÓmÝè”åee£»¿Ÿrã~ŸÝÓå»úv·wì·¨øsâgŒSâ·aá…_ ¼gñÃYñN½ð§ã†|9ãO‚ß,Tñ§Åÿ爼¥éŸ´ÇÂïé—š£yãÿÙÒëâ—„ÚÃÆ¿ îíõiíþ&ü>“Ä»´ÏLjßî~xcá/Ã?üQøƒû@ül¾ø=áý+â/Åmwàçƒt?쟀ÿ~=j¾"Ö<]ᯄ?õ·Ù¢|Ô´-?H²ð,ÿmÕuë®u=:ÒÒw“ä?ÙÃþ ‘ì­áÏiü]û<ü'ñu·ìóâÙïà_ÆO…Ÿ±7¯ üiÒ!Ô¬4; üXý¨þ!êÞ&ñn§ûQüQð¦§à¯ø§R‡ÃñþÏ ¾"x²oëž?ø]®Ük_á/ן´Ïì§ðçö¬¹ø§üZмão‡ß~6_|añÃ/ˆ¿´/‰ ø™æ|øãðsJðî±¢x–Y4K/ì=oã›ñOÕïty:¯ìlm´Ë[½B DͪjZ6ã®÷¾Úh”zÿ{ÖËWZÙwÒÿz¿êyt_µßˆþ"| ñ\¼!¢ÃeÞü.ý¶gøOð3Ä×úçüUñ§ö&ø™'ìéñJƒâËðãGÔ¾7íªø#Cð׈ü.ñWÃÕøá¯øsLðåÍü—ÿ bøS­øW°[;èŸ|#àßø;Jð‡´èü9®Ø|H‚êõlŸÀ~‚o̓_°/Äh-¿e×ñ¹àŸƒVŸ²_Ù> xoÄ>ðN»¦~×ß¿g/ÙwãÇ­f øÛö¦ø{ñçJðv±ðOã§Á |ñwí û9øÛà/Œ< âOxâ>«§xgá7ÄßÏðP\;ûº»YÝëÍdôÙZ;_ww­‘®ÛùýÞ~oîûý¯öý¿¼ ð›Ã>'ÿ„NÓÆßð°|ñ³öxðWˆüãïÙÛöÑ5_|9ñ×í}ðKöuøËâ߀>Ô| ámoö•ÿ„7Dø¤ŸØÚ÷ìñÿ _Bµñ—Šþ}²Ó_´øàÆ^|%øËðÿãw‡/|MðûQÖæ·Ò5»Ÿ x“@ñ‡‚¼qðÃâƒø_ñ?Þø“à n÷Úç‡|_£é^4𦅮xÅ>ñÆÿ„|YáÍkTü‡_ø#׈ô¯ØøÛÁßÿgŸ x»Â'„4ÿ |J¶ýŒoÏÆŸ‹^#ð'íqû"~ÕšÄÏۋ⦗ûMèzŸícñGYÔÿd»]'Çž3Ó´Ï‚Wþ(ñgÅ¿‰Ÿ­Ã÷¤~y|7ý‰¾îêß?hß üý¡ÿh-oãdáø“yð'BÑ4/†_´ß‡?þèZŸÀ øëÄ_¼mðÈðOìéð‡RÖoâÇŠ5Ý_â6‰©ø¾ÏYÑ4™|1àÿ9*J:I·wÑߥ•šJÛëÍuÙ†½­ý+ë÷ôé¹å×?ðR?„W_¼!àí UÖäø!uû<üwøµ®üLÖ~ü~Ѭ<}â?ü]ý’¾|²ý˜|g«ø/Jðí?¢|Y¸øù¯iÞ¶ý­~2ßüSñ³ðnÏᮥtþ:ð½‡=Fÿþ û&é?ðŠ¦µã¯h7~(ÿ„þkí+Ä?hM]ø]¥|+ÿ…i?Ä_þÑ^Ö>Yk²ï‚|¢|eøQã=oÇ_´}‡Â¿Ú|9ø‹àÿ‰‡]o‡ÚöŸâYþCÖÿà”þ#ñ¯„þ|'øñÇáwþ~Î߳Ϳìñû;xTý™¯îïçðç„~4þÇß~¿íQ©kß|CáÚD[سῄ~1øOÀßÿgkоñ_Äht Ï…¬h#Ã;cþ Q¥7߈ž ÓükðOá…ßÄÿÙ{öäýõÝ#öuý’üðàæªþÙZìÉáX|àÿ…¾ñåö¶áÑ?f]PññâgÄŸ|EñOŒµ·±øðóá÷‡ü ð×ÂîÔt÷¥Õ;_mZwåßk«m¦»‹Þìº~—ý{ÿŸ×“þÝ?³„>Òµø5¯Š:¶§ªë~ ðùø[áÏÙ¿ö“ñGí¡_øVÃÃZ¯‰'ñ·ìÅáÏ„š§íðÿDÑt|6Öµøëá‡|9m¢|Zø5¬¾ª4ÏŒ_ .¼Y‰áÛÁ¿Û¿´ÏÄ/ø&‡ß?áB|Oøâ_‡ñê¾:ÿ…¯û5~Ñÿ|-¥|ñ·‡§ðeç"ø›ão‹¿´ï…ÿh„¿ <ðæÉü}ã¯øE~é¾ø{¬Ýü@ðˆ>#q:çì[ñDý >$þÔ?þ7ø'Â<{ão_Ú[üSø%®üVøs¢|9ø›ðCö#øYã_ Üx_Â_~ x›Wñ±ñ7ì+ð߯>ñü~>Ò4-Bñgü«|4ñ>¡6ƒã}ËõOø'ýÿ†5¿…? ~júݗ¿~ȳ/Ã6ø§ã¦ð狯ü%ñWþ ûCü1øÍû&¹áÿáÖ§ãâ>§ãߎ÷ÿ´~ŸáõÐ!ño‡<áx+ÆuíBß[ñ:JŸwªW¿MS—ÙZ¤šV¿3{-.õëýmÓ^·ôüNÖÛþ ;ðÛNøýâÿøÛLø£à߃vß³ÏÀŒñ·‰ÿeÚÃÂwþ ¿ñÇÅßÚ×áÏÄýköÔüIð¾ÏLýœ>xsLøáh~2ø÷£|!ðâøro|A—ÅÚï€lέᯡþ%þÙ?³ÿÁ½wÇúÅ_xÛáÿü+oø«Çú÷‰¼UðSã~ðçZмðæÿâï‹l>|U»ørŸ þ2xÛAøg¢ø›Æ·ÿ >x·Ç“BðWîÓ¯ÿ ÿÆ© øŸŒÿb߈ß|û]ØüZøßàCâíqûh¿±çˆ‰ðçÆº–…åßµgì¿ñç⮫ûdü¿ÖüSñ¿ÀZ'ìíÂ/…ºW€<ã ¼Gð¶Ûgá§Š5_é?h¿Ù‹Añ¦‰­ü+ý¾>!ÝÁáõøáðfÿÂ~#øqáÿ[ø—â*\Ïð£]ùÀðIwâ/†tˆ¿´Ÿû/^|gøÿ þ-¯ÆØûáÏíªü>ð·ÄÿÚûö¤ý©¼9ÿ Ý~*xçá÷ìõñ³L´ýªüS£üHÿ„ªûöÛø9/Œ¼%ðçO°ÿ…¯àï‡:ˆ~1Š4­w&µJ×»Ù·§.ÉÙsuÚÝC]?®«îÝé®ÇÚÿÿà  !ðα?Çsþßi_?k/kà†?üeà߆_ >þ×ß?güTøýâÏ h<ðÏìûàÃ?µ WYø±ñ¿Ä¿>jú¯ƒ~.øƒCÔ´¯ ü>ñ…Ÿƒý²ÓöÉýŸïþ1è?¬|EãkÏx«ÆÞ-øiánÓà§Æûƒž#øà xׯ:ðƒûECðåÿgÝcÆÞ Ò~|E´ño…tÿ‰×ï‡;ü4ý¦íµïƒwþ"ñ£ð[ã/í7û`~Ðz~…ð#]Óþ/ø[LøOñGÂzgí·ñwÀ÷Ÿ> xgãÏ„üK¡ü7ñ|¼7o¡øŸÂ>4ÄðÿìéûJèÿ¶?Â_ h:OÙÿcϵí ûaZxÏÆ¾ðŸ®ø—Æ_´ÏÂßÚyüká_ |Lð—íWâÿø¯ûã?íƒâØô ø×ö&ø¥i_|%w߯Ÿø‡Â:¡ñÐj›æj]$Ò½–‹D¯úZú­nž­—Ëô¾ß>އמ$ý°<'àÏÚoÇ_³‰<ñFæãÂ_³ÏÃßÚÃÆ?~|iøÅaªXx³Wý¥í±ñ‰añÆïøÁ|ðÃÂÚÏ‹´%ÓµÎ'âÇü/àoý_àìŸ[øãáω_|!ð÷Ä'øá‰Ÿað­‡Ä_Ù“ãí7à oÂúÀÿ‡.>-kz÷„~øgWÔüàygñƒ~|]ðÇo®ðÛľ Ô0ø“ð çZÒ¾(xËà~•ñXø]ñwÁþøwñ“á>Ÿð¯íß>;xóÆŸ<×~:Ò¼eàÔðßÃχºÏÁ½CJ¾ñö±Ä¿ìAã/ i^¶ø_ñÿÉÕ¾|lÕiƒÚ§Æ?…ZWÄKm3ãÇÅ_üzð7í9≺gÃ_|ÿ„ÿÁ?ÿá¢>#üZÑ< áKß…W? ¾ý«¡_jz&§ý™­é—Ö_Ú>¥¨iW¾GÚtûë»IažHÓ•÷¼mÞÖ•ÿKüƒªígú[õ1ðÍ׆m¼9kâ=wJðoŒ~#xOÂ0ëŸ4lOÿÁC¿d߈ž ›ÇÚ޼m¦xfoè_|)?¾~П µ_‹> ñ>«áøoXøᯊ <âoÚ/ûÄÞ<øoá-Oø£üDÕu?|UøEàû;¼MñgáÆ•â.Ò¿bo0øÄ¿ uÏÚáv£ðBëö¼ƒö»ðvƒ¥~Î^,Ѿ*è^#_ø(Ÿ‡ÿoÛ¯x—â]ßí/®øGÅš$×Þ)øUö—ð{ÁwöÐë>ñ¬‹tþÔ|+âÎ+Æ_ðK_xóàoì«ðSÅ?ôO韲ç쇡þÍ6°x¯á-‡‰|ñOÄ~ ø™û|]ðw‹~#ü?Ô|fmõO…×¾.ýˆô=#â‡ÁHõÕ¿ñ÷ÃÿˆÞ$ð¾—ñ_Àúžiâ‹­-JúÉ«ÉÙ«é ]h㫾›õ¾¨5ÓK鯮Ÿð~ãíþÕ?|q€N‹ânËSø‘ñGXø+áï øÃáÏÄχ¿4¯üs½ð?¾øûÁÞñ÷­nƒ~ Ö~'èñ|Pð߃áñï|%â=mOLñÿ..xƒâ'Š>$üYøâ?ø[ð}¿ˆt„~'ðïÃ߇}·ÇÏÿ¾+üOý“|uàωž ð.‰û8|lÖ>0ø—Þ'øS®ü@Õ~#lü$ø‰ð6è^%Ò¾/|:´ø}å|>øÅñ2hu}CÃÿâ²›Àºëé¢xWÄñÔÚÚ;ÆÒÕß{K—džöî»étmç§é~¯ÏúÔú†¾yý‘~-xãïìŸû0üvñ–‰¦ø»ãWìóðWâ׊tï [_ÙørÃÄþxkÆ:å—‡í5MKYÔítK]OYºƒJ¶Ôu}Vþ àŠïR¾¸Y.¥ú¾^ý‡þxËàÿìYû ü%ø‹£ÿÂ;ñáwì½ðá׎¼?ý¡¥jߨ^2ðO økÄú?ö®…}©èšŸöf·¦_Yhhú–¡¥^ùiÓï®í%†y'NWÞñ·{ZWý/ò«µŸéoÔÄðÿÇ?üq<ÿþü.ñOÀ üQñ/Â_|Xø•ñÛÅŸ “©_|&¶ðÁ¿|½¤Á4üFºGÀ_ x£ã扫xGöFÑ>|4ý™-´ƒwþñð[à×í7ûþÐz†…ñß]Ô>/ø§Lø±ñGÅšgìIð‹Àö>øgà7„ü5®|Hñ|ÿ¼Io®xcÂ> Ñ{;êì“V·5ÚÖü×M_kò´µm^É¿çømå¾ÿõŠnïÙoÁÿþ|OÕþ ëw>øëð»Ãß~¿†¾üañ¯ˆüðÿÅž8øðÛÃ:‡ü àßëÞ9¸ÖõïþÔ|7¥x*_Cã‹ÛÿÀ`ðãÛè^)ŸCÄ»ÿ‚‡~ɶ:½â¿xÚÞÓ@ÿ„Jìé>~ЋâŸê¾.øà¯ƒ_ðŒ|7ðOü*ÏøL~+øÛÀ¿þ#xà¿ÆÏü1м]ã/ÙóãŠ4Ÿ…t/‡_n?á_—´ÿø&gÄo¶~Î׿iêÿdü'øYðÃZGì÷®èß¿á\ü#ýª¿a¯ÚF·øÃñóö…×ü3ãÿj~ý†¼%ðïSñG‚¾|#п·|sâ/ˆž·Óôý3áívÚ÷üoûoXøU«Âçû7ü+/Ÿ¾0ýŸþ×ý·ÿ Ïþ §û5ÁLÿáóá:‹û7þøgøRÚþ]ÿößü&ð²?³4øGÿáÖËRÓÞ–îö¾‘ÖÛÃ{Y?7{Yj½îËþž~ºyo©õçƒÿjŸ¾8‡À'EñN·e©üHø£¬|ð÷„üaðçâgÃ߈wÅ]áW‹~9ÞøÇß ü}àï øûáV·?Á¿k?ôx¾(xoÁðø‡À÷¾ñ6§¦xÿÀ—$>.|w¿ø[ñwöUø_Ã}oĺgí1ñGÇ¿ îþ!Á¯xsKðçÃ+ÿüø³ñÓNMWIº¼ŸÅÞ&Öükoð«TѼ?§èzørÂÂÏĺ׊|gáýONðw…>!âxWàŒ¼ñ_â_ÄO |]þÌÑ>0~Ô6¾"ø7þ*÷þ/韱g€?e«„_ð‘jÍÝÞ“ä|Aø]à_?ðŸhV:f«/öü*é´i4MOXñ ||øñâ¿ÄÿÙ7Ç^ ø™àŸ蟳‡ÆÍcã‰|9â…:ïÄ Wâ7öÏÂOˆŸgðî…â]+â÷ëO‡ÞWÃïŒ_&‡WÔ<1ñþ+)¼ ®¾˜ú'…|Aá?O¹}ôå{ßIr»-ÙÛk§»Ñ´ž¿Šû´¿Wçýjþ¡¢Š*QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ^Oñ+âWü"¿Ú¾ðî« é^*Ò´_ø×ƾ'µþÒðGÀOj^Jéþ9ñΞ°ÜÿÂEã}¦Þƒÿà¶¼Õü{«Þiz¶­¥ÜøVçEÑ~ Ý:r©.XüßD»¿É%«vI6Òinz}Ž´ ø‡áÔr]j-¾ðmŽ©¬ZXÛ4ÖÑîõßjÚø¯SV0iZ÷‹à´{ÿøaÕõ]SÃVz§ŠïWJÑ›Ãx¯üô>,ÿÉTø—ÿeÆ_ú‘êUýÒü›ì'¾ðÿÚ¼e yÚ ×Œ¿á^ë+ý¯âÛ¯øKu .ÿþ/íWâß´OŸÚâïü†¼ à´ßÂðÞÛ^L[ÿnÿmø¿øZø³ÿ%Sâ_ý”êG©W¥†Š„êEj£Z½Ýý£oNíÝ[Klä­'œÒ}Û‚þ¿Ëeûµ{ÿ|{]Vú÷ÿ<áË)âÓ¬m¬í|oã?µ 3D±‡KÑ¢Ôï¬[K‡S¿·ÓàŒ]ÞǧØ[Ü^Iuqk§iÐζqEÿ~ÓŸôM¼1ÿ…çÄþYQEoìiÿ/âúïÔ›¾ÿÖŸäƒþ"(ý§?è›xcÿ ψü²£þ"(ý§?è›xcÿ ψü²¢Š=•?åüeþawßúÓüÄE´çýo áyñÿ–TÄE´çýo áyñÿ–TQG²§ü¿Œ¿Ì.ûÿZ’øˆ£öœÿ¢máü/> òÊøˆ£öœÿ¢máü/> òÊŠ(öTÿ—ñ—ù…ßëOòAÿ~ÓŸôM¼1ÿ…çÄþYQÿ~ÓŸôM¼1ÿ…çÄþYQEÊŸòþ2ÿ0»ïýiþH?â"Úsþ‰·†?ð¼øÿË*?â"Úsþ‰·†?ð¼øÿË*(£ÙSþ_Æ_æ}ÿ­?ÉüDQûNÑ6ðÇþŸ?ùeGüDQûNÑ6ðÇþŸ?ùeE{*ËøËüÂï¿õ§ù ÿˆŠ?iÏú&ÞÿÂóâÿ,¨ÿˆŠ?iÏú&ÞÿÂóâÿ,¨¢eOù˜]÷þ´ÿ$ñGí9ÿDÛÃø^|@ÿå•ñGí9ÿDÛÃø^|@ÿå•Qì©ÿ/ã/ó ¾ÿÖŸäƒþ"(ý§?è›xcÿ ψü²£þ"(ý§?è›xcÿ ψü²¢Š=•?åüeþawßúÓüÄE´çýo áyñÿ–TÄE´çýo áyñÿ–TQG²§ü¿Œ¿Ì.ûÿZ’øˆ£öœÿ¢máü/> òÊøˆ£öœÿ¢máü/> òÊŠ(öTÿ—ñ—ù…ßëOòAÿ~ÓŸôM¼1ÿ…çÄþYQÿ~ÓŸôM¼1ÿ…çÄþYQEÊŸòþ2ÿ0»ïýiþH?â"Úsþ‰·†?ð¼øÿË*?â"Úsþ‰·†?ð¼øÿË*(£ÙSþ_Æ_æ}ÿ­?ÉüDQûNÑ6ðÇþŸ?ùeGüDQûNÑ6ðÇþŸ?ùeE{*ËøËüÂï¿õ§ù ÿˆŠ?iÏú&ÞÿÂóâÿ,¨ÿˆŠ?iÏú&ÞÿÂóâÿ,¨¢eOù˜]÷þ´ÿ$ñGí9ÿDÛÃø^|@ÿå•ñGí9ÿDÛÃø^|@ÿå•Qì©ÿ/ã/ó ¾ÿÖŸäƒþ"(ý§?è›xcÿ ψü²£þ"(ý§?è›xcÿ ψü²¢Š=•?åüeþawßúÓüÄE´çýo áyñÿ–TÄE´çýo áyñÿ–TQG²§ü¿Œ¿Ì.ûÿZ’øˆ£öœÿ¢máü/> òÊøˆ£öœÿ¢máü/> òÊŠ(öTÿ—ñ—ù…ßëOòAÿ~ÓŸôM¼1ÿ…çÄþYQÿ~ÓŸôM¼1ÿ…çÄþYQEÊŸòþ2ÿ0»ïýiþH?â"Úsþ‰·†?ð¼øÿË*?â"Úsþ‰·†?ð¼øÿË*(£ÙSþ_Æ_æ}ÿ­?ÉüDQûNÑ6ðÇþŸ?ùeGüDQûNÑ6ðÇþŸ?ùeE{*ËøËüÂï¿õ§ù ÿˆŠ?iÏú&ÞÿÂóâÿ,¨ÿˆŠ?iÏú&ÞÿÂóâÿ,¨¢eOù˜]÷þ´ÿ$ñGí9ÿDÛÃø^|@ÿå•ñGí9ÿDÛÃø^|@ÿå•Qì©ÿ/ã/ó ¾ÿÖŸäƒþ"(ý§?è›xcÿ ψü²£þ"(ý§?è›xcÿ ψü²¢Š=•?åüeþawßúÓüÄE´çýo áyñÿ–TÄE´çýo áyñÿ–TQG²§ü¿Œ¿Ì.ûÿZ’øˆ£öœÿ¢máü/> òÊøˆ£öœÿ¢máü/> òÊŠ(öTÿ—ñ—ù…ßëOòAÿ~ÓŸôM¼1ÿ…çÄþYQÿ~ÓŸôM¼1ÿ…çÄþYQEÊŸòþ2ÿ0»ïýiþH?â"Úsþ‰·†?ð¼øÿË*?â"Úsþ‰·†?ð¼øÿË*(£ÙSþ_Æ_æ}ÿ­?ÉüDQûNÑ6ðÇþŸ?ùeGüDQûNÑ6ðÇþŸ?ùeE{*ËøËüÂï¿õ§ù ÿˆŠ?iÏú&ÞÿÂóâÿ,¨ÿˆŠ?iÏú&ÞÿÂóâÿ,¨¢eOù˜]÷þ´ÿ$ñGí9ÿDÛÃø^|@ÿå•ñGí9ÿDÛÃø^|@ÿå•Qì©ÿ/ã/ó ¾ÿÖŸäƒþ"(ý§?è›xcÿ ψü²®rø/ÇÆë©æ¹¹øðÖâæâY'¸¸ŸÄ>.šyç™Ì’Í4²\4’Ë,ŒÏ$ŽÌîìY‰bMRti=àŸ«oóaÌ×_ëOò_Ód_ðÿŒÿôAþà÷Åü~¿ ¼Y®ÿÂQâ¯x›ì¿aÿ„‹Äλö/?í_cþ×Ônu²ý§É·ûGÙþÑäùÿgƒÍÙæy1nØ¥P§ wäŠí{uµí÷]ƒmîïýÀ?ÿÙPythonCard-0.8.2/tools/standaloneBuilder/doc/pic15.jpg0000755000076500007650000011216410231140007022475 0ustar alexalex00000000000000ÿØÿàJFIFÿÛCÿÛCÿÀºP"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?û‡þ ÿƒý¥ÿàŸ?´ÏÃß‚þþÎ> ð‡ˆ?g…ßïµ‰ß õxŠ/x–÷Æš>©z¦âß A.Ÿ$~²¿/í¦¼[ËNIõ3g$)§~]Çÿ/þÞ?c8\ƒðGÅ ‚U[ÿЕù%T‚¥]Uä»ÿ¦ñ·ü‹ö¤ºð†‘ñG^ñe·ü§ã™¼/¢üñ÷„þ3k"â¶›&‰¤|#ñV™á¿j^ø£©êImiðÿÄ…¼M}£xªM/Q´ðÞ»qm7åÃ_ÙÃàÇÄü:øËû[~É?¼gñÿã·üwörý„~ Aû~|wý¦üSûHx3àoÄÙ·àþ¾í­x—ÀÚ¿ì uo[™Ž½ðÓÄ>.øRÖú?uý ÷ÚGŠ4­E¿_é.ÀðáÜ­ç…Çâ)åX ØŒ}M ˜ìn'íê.l|N’•*T䧉UåOš0§Ê§Rüï6«¼uo©çhBXšñÓ©©Ñöi¿o Uï)IÆÔœ!+^I¸¦Ï ƒþTý»e$7Â?ØÉ#s‚~'Y²H?ˆb¥ˆÞŸ"HÌR1,Öû1ÿÁÈ·3¨-ð—ö9\€Hÿ…)âN ôoˆèØä™U†0Ê­½cú{öªýŸ>[þÌ?ðO?Ùa|¾5ýšÿgïø(íÝû,|ý¬u{ÄíãØáÑÿ‚Žø7Ú×ÄøWUÑg¯†3øŸð»]еKýGöˆøa®è“éWšGŠ<áß Åxº£ûÿáý‚¼Gûy|ýµoØö­øoáFý«¿iŸ‡ŸŒ¼SðßãÿÁÏÙsâïÁß |øß⟇Ú&‘ñgÆ_µ?ÆŸ|Dø“¤xÏáNãüBøiª| ð·Ä¯‡wž*½×>ÙÁ§i¶Vžû£áM<4ñxŽP…5Äu”pð¥]KÃØŒM7^N®7 *uñØz±p“¦ªRxˆ)ÉáeG_…ËŠ%Z4©çZËû:¼”©¿mŽ¥F|‹“UJg)Buc.Yªrq^ÕN•?„­¿àãÛ†f¾~Çc•oÁ_‚¹2‚¤·ÄM¥€@ÿ)#hmÛPM-·£§üŸþ 4ÞÛöqýœáü%ÿð¯OÄøg/ÿbÂ/νÿ×ö€Öÿ±@ÕM‚Ùš?œà_¾ ø,¯ìµâŸøD|øWr¾ ðO‡|/ãïŠPxïT_ßþË6ømš¿Ä]Oì|Aã/Œæ}bÇDÑü-áí0x¯ÇV^ðG…í¬-t-6Óô3öðW‡®¿aß…?h_دÁßt‹_ð]ÏŸ<]û7ø¹ÿjŸ‡ëð§Mø›û,|5Òn|WádÖþ6i´ÿ_øgP¸ñ†~#xÛÆžqãB M£ Yè]YæAÀY>cøeƒÉqõ£*´^&4³,FmG…Ž…b° -„¥VŽ.¾rÄòNµ+a¥‹Ã ŽÏ1TUžÖW­‹ÃÃÜš§Í†¥ƒ©J£ŸÕÜ•:ïãË*0ª•>hƼT~e¶ÿƒ‡?my€Ýð§öF€[õàe¼}†û¤©,ÁLæÓQààïÛDõø[û$/×àÖµŸ×ÇÀÌcàî ôÆÿíý…>ü9¶³“öqý®¿l¹ÿiø(Á‰šÿìãàüsøÏðp|ø§©ü(ø%auªü9øÕðsá7ÁEáøC>1ÅmñsàÇ&ø§s®kW1i>ð¿†ì-¿4c…¿uسþ +ûFüMø+á/ŒÞ8ý›ÿá‘¿áWi~<ñ?ÅíÂÚwü.Šþ(ð'¿µ,¾|KøY«ëïHO¹±û^¸F¨éVRÁ²Ú]NÆöðÙ7…ØÊÌ^‚ÝJ8\Ç.Ë9e‡§J¦#™ç?Øxo«Æ®aM*KËR¥Jòï«N5)ª’æ„b¦/‰¨×£F¦qË*Ø|F'ø’œiÒÂàã©Îã†~ó¥xÆ4ÔŸµ‹Œ¬’™õm¿üÿö̘ÿ dèøbTüÖC.$t·xáA<`ä¨ÌnA8mtþ éûc‘ÏÃÙ@ÝÕ½3ßÇ# óéÀä¿nx«þ ½ûüñïíRšoìýñ»ö›Ÿá§í‘ðÀÿð¢þhŸ>;üGøqû?|Bý›ü1ñÊk#¿ ¾:~Îþ0ðžâoxÆ|-ñ»âž¿ñ‹LÓaø{á}ü!âïCão]ù§ÂØWöøû<è~!‹EÕ¼ ã¿|Aý±ÿaoAû@\þÐ>ø¯¦~ÜÞ6ø¤_~Â:?Å_ |8ѵ?ø{UøðnËPO‹×ZF“iðÞÇÄzüoˆ´okº}í¯‡<ˆÃÂj”éâ©pN&xj³ÁF3†^¦â±ùtó*'J9„«F’£ÒGO•ׯF4ÝJsuaÑ~+iSžuJ2Ьù%ˆµþ¯ˆ†j2xnG'99Æ*wä§7>IEDð˜?à¼?¶  —øeû*®ÁÇÁýS `¼?Œ“$‡åJ²0`ç%µÕÿ‚ìþ××á·ì®¼ÏÁíK¨\€1ã<üÇ€HnÛómõoÙÓBýšþÿÁÀ:‚>¶à‚øƒãŸ…žµÕõߥ¦ñ~Î%øy⯠[ë_o&ñ«ªjŸæ×ü'¢E>«©C¯ë—znàùu-2÷A‰aýšÿeo€šÇŸ‰¿>8~ĵoŒ¾ý©¾ü8ñ¯ìƒð{áßíãß|%ø#{ðbÓÆÖ¾#Óþ^þÓ þ2ü?ÿ…èu¬¾0|\ñ¿ÅŸ Xën“§ø7á±Ó¥ÔáµÞ¾Wá¾Â¥~QÃÖɲã” ±ç¸Œeà«á*ã)F…lÃRxŠ«V„'ˆTjJ”ÖëxÑÄñ%iJ0ϧ vaƒŸ¼ýŠY}<=G^hЛœ+{Y*pöp›.xÆqöއüö¶½ðÛö^Œsßu ޏ8o #©<©P¸pŒf[kÐÿÁok)+|9ý˜Ù?ð¨oAMÀüÞ.’wP£Ë´~ûðöý“¼]¡|Õ|GðsÇšõÿÁ@´/„³‡Å]ÆZ'Å/Û¯Cø)k¬ÜxIø“ã x‹CðGìuñáµk7<]¥ÞiºmŸ‰µß _j×6÷:Mý¥¥¿ÎðQ‡—Ä?àžþ/Ð>éZß‚m¿b/Ù¯Á“þÒzD^?Ô­müqá3âv“âO€RøŽËÄò|‡Sðö¥¤jšÖ»áÇð¤4}kK¿·¿ñ –‹es¤[˜L§ÃlvkC+Âðm Ô­ˆÃÖÄb9(S¥RLÆ…?b¾¹Wëq«S+Å^td”$¥†Ny†3ÁeñSÄÔ0u±us©Ú4iÕ§N›u%(Ξ£ç~Æ.„¡]Ë5v’ªÔpÕ°˜Šþ¥âø+¿í»àñ ü øàóâ¿ é>5ð²øŸà/ˆ4âOëÂäè~.Ð?µõÛ­xgYû%ÉÒuí8ÜiZ‚ÚÜ›{¶hnVÚ?Áaÿlë:W‡|=ð—ö|×uý{S°Ñt=Eø-©j𯳬ê·YizN“¥ÙøŽkÝOSÔ¯® µ°°´ŠK«©Ý Š#$‡Êú‡ãŸÁüRø ðËľbøGáücàçÄ~ÓFóâ‡NøåáyìSÀ¿N¿{â(þêŸð—¾¸Ö‡Áwþ—ân²|[kÚ}ËxvM+Rý˜eŸƒ> iÿþ~Ðz¤^ý a=ká?íUáßxÃWøâÝÄ~1øTþ+Õþ üqÔþ1xÃá‡Ä 3Çéâ讼?}ð§à¯ÁÛ?üB²Ó¼-§ÍªøzK©&ò)Qðåáœjpe]„aJš©‚Up•0Ð\ø‡‹‚kFs¤ÔqQŒk?«¾ZJ¯S—*’k<šÃ¯`ù§7üµ•GhÒxuy'Bj2Rö-ºkÚ|jŸË·üßö¸ðþ­ªxÄ_ ¾hþ…¨ßhúüÔ4½cDÖ4Ë›‹-OIÕtÍC_µ½Óõ=6öÞk;û Ø-®­.`ž ˜ –9V&ÚÿÁaiÙØðìâõS„ò‚äâÉã8à€¬YB‰Zßí-SöEýž~%|_¸×¼Yðôx»Ãÿi/ø)ýª~=ŸxÞËþP|)ñGŒ®þ‘¬økÄšO†FêÆ/Æyøéáo{ûoíqùž¸ÒôëL_‚±_ìMñ;Á_²Åõ¦á¦ñ_í#ðßà+x/NÔ|AñúÎÿÄgßkÏüí2Ú[Máíëß"‡Â^ŽîûLÑn¼A£Ý]xxfi⛼ÒðÆžV¯Á•\  «¼6 W¥N~×0§]ó}ž4°ôòœËQÖ:±ÊðÏéº2‹"+‹*JP†yÍwKÚ×tç(¸a'EºÙά±¸\<=œ§‹©õ~nxµ—×þ ëûK7xövS˜…,Bœ>@'_]Ø+ÔíÈ NѸǩmÿhý¤fÆÿþÏ`aI+𨀻¤dÜwk$ÀìĆ_˜¨óþËñOíð”x;Z›â‡ü<4ßÙÃâ÷ÄOönשö¡¯ü?ø}ãûÿÆ—«_ÜøïG:E¥Îf,4½jø1¹&îHî®aý‡ð·ìð>é¶~.ð2êú×þ ~Â6üXðñOþ9è_|uà¿ |B·ðwÄoügø£ü\ðåÆã›Qñ_Ã| ¹ð牬´›*ÞÏHÔÿ°t¯g3ɼ1ʰxV#†°õ>¬èÒ§‡¢êÕ¥Z–+ ÄQÄÿµÂ*ØLf&\UUÔ£^5iÊÔjryø#ñ—†to‹êÞ}fÛÅz†—¤iÖþ#¸ðÞ¥¢x?í‘¥êú7ì£ûiú÷¶ø'ªÛÚ”]|4þÎñÞšÞüMðźý‡âf±â_Û®µk$ûo\¸óTûFš–ºCX[Øùxl·Ãì~a•åØN¡ ¸ÌS§‰x¸F›£EåÙÞ.›¤¨ãkûj®®P•Og”iQÄSujB­JTÞÕ±\O†Ác1u󺲎”gIД¤ªÏëYm)9á©{8(c¯%Î¥)(EÓ„ä·¼/ÿýª»td°ª¥G5R¬aìéJ5œi*2—9äß·÷í9¥èº‰5O…¿ ´Ïx¬ê£ÂúýÿÁ©,ô_ÿa^ oûU¹¸ŠÃY:5ô‘Yj£N¸Ÿû:íÖÞóÈ•ŠFÁDþ8J¥›ÂÔÀãá €¤èdrÀ’U@#ÉD…¾ñ§ì¥û>xû_⟴OÛQømû*¯x[þ¿Çñž_é?Ú:Úøþõ¾ éOâø]gâH~'xðéb·×Yô_¿œdEñøû^…é­ãFø*¾>[áñTxlüIŒxý|"|=x¸h~Bx|x½t`,Ñ“ZKtŽÊÚߦŽSÀõð8ìLxOªåù×öUXÔ©*4+qL›Šu}­y¼=*1Ž+Š`Üã‰Ãá«Ö«…ÅG ÏWÄTëàè¼ïÉ‹ËÞ62„J¼Ô²šyZÏ’”UYÔn©ê2£V­*p­AÔÔ‹þ ñ­Û á?‚àa‰ÇÃ+ÊHs´à•Ú ¢ü­¹â_1áÚ‹öøøË"å¼)ðr>@Áøk¦ç•FÈ"ÇÀ:¤¾dQ~„èGÁãÂ_[âoü!ƒÄßðËÿ°ë|K?T}5~:Sâ/ü!ò~Ð"Ão‰wGâAðí¼lþ*Ùrž[Vñ'†•ÊþcüZðÇÅð_ücñ£áŽ´>(Âÿ—Ã^/øË¯øÒ¿kÿø@-5K†¶ÿìÚ=1ôGÓ…ŸŠ¼7ãMØøy|:4óE¡®Ÿg6W—pNi‰«†|!—`ýl%ÎXØÉ⥋Âà±QžÞëhýk–»£*•£ ˜ ”èOëÎẕ\E¡J´sìe~zuªJ1ÃÉ*Q¡^½Δkû•=‚•/iÒn¨Nµ5†R­ßEûw|aàøWàúŒœ·ü+m,ùf<î)#Ë óImI ¼i¾[}¨ÿmß‹N Ÿ ü%C~i#ª·Â>b3€AYV@èŸ[.$VØFÓǘžO–Ÿ8ÛÞl[;ù°ìóíz«q„i 0Ë´¯îâùPy0å3÷FÂ<½±íòaúùð¦­Ãø“~í]î¿¿åå×M[_=>(âãl×´Mëëþ¾Ëù3íH?m/ŠÒ“»ÃŸ P71øq£ŠVl’ íb¥ˆÞŸ"ÈÌV1,ÖÛ1þØ_A>øX¤€Hÿ…s¢äôhTã’>eV~eVÜ‘üWd0Û¶ ØÈwÈ9‹yÜ”72íË50äÌ~WÚlúx#A·U+‚>XÆ1åGÇM‘íÚd{|¸³ŸðrjÙkíW}?éó¿ÝßMì¥Å ¸wPí-A?.*2ŽA'ÎK]øåã×Iðý|álþºXóÇ8;‚|ý§®Óþ¬¦Ðü8ùÓ÷Œ0O“[äÚÇrça›ÊÙc»Çðã¿x}>EàãÔ`0»q¨¼#Ì×ö É.•»ÿOÏñ}Iñ=¿µqV÷zÂÝ6ýÞ›t}<´÷ø>0x®PKé^L3‚|+¼>ˆ€œd?*U‘ƒ„o5-ý@ñ‹õÝuÙ5„úœº®¡¤A¯à+I.g¹Ó-4«Ë·DÑ|«Æ$ZÅ’«O,<†P±mqù¢Í6¯ú¤\;óŒ2üáû<\¶Ïœn_-“n"òü»?@ñD> ŸösñE¿Ä_ ÿÂmðúcñ~x/þMWâü%¾ “À¾ Oø_þ–… ø›[ø‰ý½¢5ö•ÿ&áj¾.û_ü#ú~ƒ«]êé÷Ç9CÃù#2˲<µbiâ0´£í¨Ô­O–µe §l®í·½»X÷øW6Î3Œêž›cý„¨â*5J¬iËš”bái*m¥}×];#Úÿ´xŸÄ>ðm‡…cԵѣü9×<~ʾ*ý¨ÿgßÚ‡ÄðO»_k³Á4ÿg¿x–ç㟌¿àž2¿¹žoƒ¾'ý¸>xkáŸü&ßò$ÿii?³W޼{ñ+ãž•ÿìÒ¯í~üS×|?âÛ›‹ú·â·ü›ü¿þÎ âOþ¢Ÿ³õ~O—ã(æTóJ5²¼¢Ÿ°Êëâ©VÂa%J¬+S«F1jn½Et›æVµÛ³”ZoôL^®¦_Rža™Tö™†…JxŒJ«Jtª))FPöQß•4ï£]-eÿ”ÿ‚KþÑŸ·íOðûãÂ/üð7û6|#øo{gñ#Äž:Ñõ××4y|Wâ{«Ë;O |6ñ}Œš[ØøËJŽÞâM^ÎôÞ[j›;uŽÎúOʸ¿àÜÿÛj5U?eŽFþ,¸XÁU+ð.1·(HùWUdqm¾/ÿµ§ýŠþÿÔ/ÃõË׿”xÓÇW‚ÉrüF[[KêøXÕ˩ժ©)ÎIN£šsw“»k·abøG'Çâ*bñÄJµisÍÆ»ŒyšKH¨è´èïæ6ÿðnÏí­ ?eƒ†R§þ_ŠìSnþ@?”±—é IäËÌ_ðoWퟢŸ‰Ÿ²øÚ |¾4ø¨p@@@ÇÁÆ8=Ú»UWjÇýŽÑ^‹ñÿÄFÓxœ¦êßó*£Óþßÿ€`ø!nîž'ÿ %ÒÚ|;hãÒÛþ õý³!`[âWìÄ@)¾2ø¤H ìÇŸøRjXÙ˜ò€ ްKm­üöÅEQÿ öf\0¾2ø¢Bð¿*ŸøS •ÀáxU¨Ú#þ½h©~>ø†ß3ÄåWòË)¯ÁT·õèê>C{û,Néÿ¼JÚyrÛ§©üŽÛÁlvîøû6¤üMùH1aÿaY‰^fÎbŒ«)5¦²ÿÁÿk¥ÿš‰û7ýá/øšHàtÇÁåþc `m ýfQSÿëÄó}g*½ïÿ"º=íðÿQòßÙânÿÞ%å§Ã¶Ÿæ)6¿ðBïÚÒ3ñötÀÜ<]ñ%™ráÝÿ v2NRARv ’<…µÑOø!Ïí`¿óPg~¼[ñ ã€0?âÑŽ2=°€¿Õ-/ǹž'+¿ý‹)òר—d)ó*x›ÿØD¿ùø?qü¹ÛÁÿj˜FdzÐùœ‚ž+øˆJ†e9øÜxŸÇå†UGø\Ï Œ6®ÆŒí1ÿJtRÿˆçÇßô–á¶“én³vÓµ„¸ WµGç?±÷ĨÝXë^ùXa†©¯£çäádbÃrVHØm;71KÔ?²‡ÄHÕTë á@ãQÖŽÜ$jUvøb!´•'î€0ª¦Øãý¢¥øÅƎׯ—iÿRú{à^WÓü¬>áçféâ¶ÿi—ÿ#ù•¾ ·ý–þ BᎫàÆR­ý¡¬³G´¿Ì ømK0Ü8ó H!šßf/Ù¯Ç(ˆ§TðÚª8¿ÕŽðôcoË…@®ÔEÚ‘ý»EKñƒõòþßîòþÿ—õedø‡›»¥Š¾Ÿó.ŸöîŸ+Û~Îþ5…}K¤˜Û{ªdvc’t,FàA-ü Ž šÛ^?€Þ.EQöÿ ®áou2…ùWþ$‰•ãåP®FÕëZ)?¸É»ûl¿ÿ)ùkño¢À<:Ýý–+ÿ eåýß%çæ|»mðKÅ0…ßáó´®»¾Â‘&âÃþ$ŠX• ÄÆ„2°­uWá‰éº×íWÄŽLiKר ¸ÀÚèÚ*_‹œbÝÝl}Øa®©ÿ=º-­ä?õ‡¯gнïþó//îù™áŸ õër3s£à‹›¶eË#Kˆ“Œ+©;$¯’¶ºKðïZ_ùxÒ¾¾}Ñ#Ózÿ1€06„öZ*â-q…ïíðÿ°ü——pòwTñwÿ°©tÿ·O3·ðf§¾š>f ¬Ó]ÅOiñ[7*EòÂ'”–þSñGà7Ä/‰2h°é¿´oƯ„º„º„¶þøK®øÃúUÞ««5’êzæ©w­ü.ñ/ˆµBêÏJÑ´ô¶¸×‰§[iqˤiuö¥®ÞjßQQ\8ï8‹3¡,.a ¯†”¡9Q­€„©¹S—4$Òšw‹Ù^Þ[áx+'À×XœñøjñRŠ«K%%Û™]Áèì®| ÿ eñþsöÂÿÃðëÿœ­xGí7û;[~Ïß°‡í‘6ñ—Ä ïˆ§¼Mâoj:¥âMCÄš’|=ðìòË?‡|'á 9­ÛNð†+¼ºt·óßËyuuyr× Eúã_ÿÁHÿäÆi/û'ïÿ§­"¼xñ&&Q©‡¥€Ê0«OêÕªáp*•gF¤àçÏÚ>^nEwg×¹ê,–’©F­Lneˆú½X×§N¾-Ô¥íi¦¡)C‘srßEsôÅÿò´ÿ±_Àÿú…ø~¾lý¢¾0ÿ†ø9ã‰vžÿ„×ÄÖðø_á¿€?µÿáÿ…—ñâOŠtO†ŸþÂU&™¬iþ ÿ…¡ñsÅÞ ðü&úõƒø[Á_ð‘ÿÂUâÛ‹ èúµý·Ò~/ÿµ§ýŠþÿÔ/ÃõógÆÿ€h+Á¾øµ¦Â]ðûÂþ65ñÂÍnÏB×þ|Zû?ƒ|eá}+Â_üâ][ÑþÌzÇÆo|UÐþxÿþËOÙÇÄ~Ôôÿ°~Ò:®­ÿ SÄZ¯‹,|I/Œ|©|JûÊoø'_Àþ]Oà_ößì«q§k~ñ·Ãí7öoðÿÂ/øáGÅ_ øsãWÃß|eðWÂmgáoŠþj~.| øï⯃?;‡Ä?ü7ðÀi:w‡¼]ðÇÁ~,Ò<¿Yÿ‚YxRøaãï†zgí/ûPø[þg‚~.ü:ý£üq¡Iû5\øËö‡ðoÆ?‹¾5kš?Ž¢ñ?ìÕâ?ø/ûÆßµ'Ç×ðÆ¡ðÁŸ5X´¯ˆsiúý÷ˆ?áð,Þ´éoeñE꟟2²ºQ³Ñ&ß2Wn*â³ÓÒÚ|·¾ýzmæ{_Çýoâ‹¿hß³w~1øÛà6‰ãß‚´¯ÆÿüBøY |$Öþ#\j¿¼uû+xÃ^ ·oŽ_ ¾2ü>´ðN¹iûEøŸ[ñ@‡áðñ•Æ»áO ÆZ‰‹4O|óªþÖÿ?e¯ß>|xÖ~(ü}ømðwöCýŸ~8ø£â7‚>øö ¾ÏñwöâÓ>.þПuh5O h7úÞ‘ð¯á‡ÁdñÏ€þÏ㊞#ð¯üuû+~ÉZO‡"øàŸ}¯ñ§ö{‡â׈üãï|Xø£ð'â§ÃýÆþðÿÅ„°ü*ÕüJ¿ð6µãÿÞè>|føms¢x§Ä ~x†çX‹ÇUÿtÛ/ ø·EÐu¿hÞ(òíWöøsâ/þÐÞñWÄž.»ý¨?eëÙWâ×|Oâý Xñ–¡ák}Wö”×µ/hWw>:'†üm¬kµOÄ«¸tM'A·ø9à+Nð/‚¾ü&ðÃïÙxJYNIÛk5ozü÷¿5¯ðè•ü¬>ÿ‡Ü¿TywÇø*wìÙû=|]ø¿ð_âD:Ü^.øIð»Çÿ Ÿ†¼{û8x¿Ä~9‡á¯À[ö˜ñ'…ƒ¾ ðÏÄ…~ñ÷‰¾xGÇ\OÅ¿ø&?Ã?ŒPøÂúïÇ/ÚCø7®ë´ÏŒ,~xjïàl?ü+ñö¹øUû@|.øÝãïøŸ\ø¯|o¸Öõçý¨>5ü@Ò´|]ñ'ü;ãA‘á+oøwÃ~Òvÿk?Ù3Æ^;ñ—ü/ï€?/í$¿ð¥´/ x—]øÓ¥|Ò¾é_´¯ÚÏJƒÇ^¸ÕdÏÚûÃ>&ñ·‰¼3û_|[øaâ |OøIâ¿Þx7ÅpøŸÃxâ7ü?â EþéÙ-í«m¥ÍukÞÖM]ÊÍÛh· kåºû´¿ëcÅ2ø3¡|*øññsöuñV½¬xWý¢à»øãˆ?¾/gøKö8ÿ†›øu¥xFÇÌðU¾·ñán‰ã¿‡?ðPè|)࿊—_|1ñGâ­ÇÁŸŠ?¶oŒ>;øûÀz/­7ß³wì·ðçöáý¯~ ü&ñ÷Ä-7Ä6øoâ?hšOÃoÙ¯ÇVk£üðwÆÏŒ:…‡ÁýoQñ?„¯<]âÿˆ;àšï€| ¢Íâ¿ÚGãg†~.xËþŸ´·ˆ>x‡áÎÿ ¿BøûFü}ý¦-¾ø‹Ç3üÐüMáøW&ý§>2øcHøÙû+è_±ÇÄoÿÂ]©øëNÒ~jà ü$íuŸø&çÂMJÛÇÚV™ñ7ãg…¼3ñ³þî‰ûGøWBÔþ\é_´?ÃŒ>?~Ð:çÁÏ_xŸáWˆüMà¿è>&ý©>>økÃÿÀ_|ø·ƒ~!Í¿ñ7Ä&ð·|Sávý–©6ú»¥$Öݳw÷\­i _¯o-ôù[=íÐí´¯Û{ÂÚ߯?ü1Ó> |lºðOÄߟg_~Ñ[>Cðs[øÇð3Âß¼AñOÁÿØ—âý ´ßøEõoÙãã¿á ÕþXx[[ñOƒþ×áÝoWðOˆ ƒÃÚž¹à»ÍTðWìoûCAû\x/Çú·‰tO‡²×ÁÏÚãÿí#ðûá‡þ1hŸl?ø7ÄZÜþÖbσß>ë~:׿i?ˆß øµñ'à·‡ô¯Ù“UøUâÏø?áŸÂ¿„ÙOã¯Ù¿Æ4mžø;á #ĶÞø¹¡ßÃ1ÕuO j^ÔïRîÙ{‰»[Xiö­.m/¤—7*ÖÖWm&‡¯^ëoE~«­÷¿£Ðù{ãüÞø-ûGøçÀ? þ(é:Çà öáð/Âÿˆ¼aað[Çÿµ'ìcá?ÚÅÿÂK(4_ˆ¿|U¢jžýîëÀ¿ük¨?ü+o„z>Ÿáßø‚ÇL¼ðµÿÄoè:GíoÇÞ·ñ?‹ü8x¯öøãχ:/Â_·¼OðûLøÙûX|oÔü?wâ+m3þ½WöÌпjß |aðn½ªøwIÑu»o¦‰ûb|S²ðð¾¥á¿hŸÙž ¹¸ñ–§w¤êóëþ]ñGöñ‰!‡Â>ñ–·«[üUý¡¾þÐÿ?hÿüO¿øsûCø#ľ~Ï5Tøcû>ü+ølš.·ûO|ø-⿃?üYኯþhŸ>'ë~³ñ„uȾ ØŸ»zY¯‹W}5V{ëh¦ÚÝ·evÃ^¶éµü¯øßÓ©ö¿Àÿ‹^øûð[áÇoYkzo„~5|.ðů iÞ%¶°³ñ‡‡>#øOIñއeâ M/RÖtË]n×LÖm`Õm´í_U°‚þ9â´Ô¯­Ö;©}F±<5á¯x/Þðwƒ¼?¢xOÂ>Ñ4¯ x[ÂÞÒ¬4/xkÚ„^‡áÿèz\ºf¢hÚe­®¥iZu­µ†am¥¤ÛÃk·Y;]Ûkéè0¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯ˆà¤òc?´—ý“÷ÿÓÖ‘_oWÄ?ðR?ù1ŸÚKþÉûÿéëH­(ÿ—ý|‡þ”…-Ÿ£üÐoÿÈZÓþÅÿêáúåë¨ñü…­?ìWð?þ¡~®^¦¿Å/Í„v^‹ò8Mgâ—Ã/jW:7ˆ~#xAÖ,üŸ¶i:Ï‹ü?¥êV¿h·Šîßí67Ú„Pyö³Ás›y¶óE2nŽDc—ÿ »àÇý߆ø_xSÿ–Õâ¿>~ËÞ6ý¯?à£>:ý©¾üñw‚~üý’üYwãþøy¯xWá…mü)ñÿXñ׉®0xgözñƒ­´ÏÙh_|i¨ø³GðwÀígÃÑ@Ú¾—ñƒÅš¿€¼u¥øgá¥õœ4×µø²ÇKÑn®|9¬Egçÿ´Ä?ðI?€?l+Ï~ÎðNŠß´ìuû0|[ý¨ñÕÏ<om£k垣<þ,ðÌ1[4šö–·^?ûfxŸþÓûþË"ý¥üGðWþ ‘¬l~Ïÿ~:~Í ÖôïÙ_ÀŸð×ð‚|:‹Çú…¾øŽÿÃ:Çü'ðÿlx+IÒ5¿h>;Ùÿ ß…¯ìôcûcI³Ô¨Ãþ~KîAíeýOúZôÿ𻾠Ñ]øaÿ…÷…?ùmGü.ïƒôW~á}áOþ[WÓìµÿ½ñF±§øwÃ?³Ÿìâ/jÿð´¿²´- áìó«ëŸü(ïéŸ ~5ÿg隇®/oáOüMÖôo‡_¾Í¿ð¯üw«éžñgöGˆ/ítù|öiðoü÷öˆ¾ñ‚¿á’¿`ümðÿÄÚÇDÿ…ÿ óöyñÅ;¿…Ÿ²ÿí“ñ“ö8ÿ…éÿgü ú'‹mþøãÅ¿ >Ùý¯ÿäÞðψüAÿü%> Ôô¯í]HúŒ?çä¾äÑö_×ôÿ¥®7ü.ïƒôW~á}áOþ[Qÿ »àÇý߆ø_xSÿ–ÕÜèÞÿ‚ xà׋?hÏhðJwö|ðˆ-¼'㯎Ú6™û#jŸ¼â«Éü3kgáŸ|O±‚øsÄW>4ðu½¶¬k–zŒóø³Ã0ÅlÒkÚZÝyÿÀ Á9¿hÙ»Ký¥| ûÿÁ:-|â?ÚÇÿüâ-BøÃ?øWÁ·OŠc¿|BðGÅàÞ·¤xŸÄô YøçàoÃí/KŸNø‹ñ Æžø/cñÖÛÄq|Q€úŒ?çä¾äÑö_×ôÿ¥¬ÿ𻾠Ñ]øaÿ…÷…?ùmGü.ïƒôW~á}áOþ[Tõïø"Æ~+ø¹/Âïø'G޼ðóIJf›ñ?TøqàŸÙÄð|)ð¯í©ñ áß~ü[ø|ÓiúG¾ø‡Hø—£üZ_ø‡R²ÓµoƒZ_ˆ'xOáý÷„5Ox«Ãÿ-¼OãÜ®áy´í~†~&Ðeñ‡c·ÕËúþŸôµðø]ß?è®ü0ÿÂûŸü¶£þwÁú+¿ ?ð¾ð§ÿ-«¹Ö|=ÿ@ðçÁ¯ þÑž!Ðÿà•:ìùãß\øOÀ¿µ3öFÒþ xÓÅVsøšÖóÃ>øŸ} ñˆ-n|ã{G×/5'🉡–ÙdÐuEµóÿÚ¾ø$Ÿì©â† ¼Cû8Á:5/ÚâïÆÙ_áÇg=g¿³G‚þ2ø§Â¿´§íAàÙÊóâw„þßxCTñ·Š¼?ðòÛÄþ1ñíÊèþ›N×àøgâm_xv;}SÄõÏÉ}È=£ì¿¯éÿKYÿáw|ÿ¢»ðÃÿ ï òÚø]ß?è®ü0ÿÂûŸü¶¯xøðþ 'ðsÅ_ | ñwàÇü£á_¾6x¼'ðgÁßþ~ÍñWÅÏ&£áýü3ðÇÃÞ'Ñô½_Ǿ ]_ÅžÒÛFð­ž­¨®£â_Ø›as¬éÑ\ô?ý–¿à—¿ ?á ÿ…¥û9þÁ áe|@ðç‡_ðŸü!ýž|ÿ ÷Å?ý·þ†ž ÿ„‹ÃÚwü%_Á{ý™¦Ý}–}‡Ôaÿ?%÷ ö²þ¿§ý-~gÿ…ÝðcþŠïÃü/¼)ÿËj?áw|ÿ¢»ðÃÿ ï òÚ¶~ ØÁ~8ëÁþøûh_eý ?j¯Ù£Jø;â¾™ñwÄ_ÿcëþø×¤øwáîžš¿ˆ5ìé7Æ(,-­Oˆì> ü@øuñ Åš…ì¼WkkAáŸÁÙøƒÅž¼øá3öF×¾Úø«À_ õŸ^:ðÍÏ4¸.¼7ˆ<ðoÞ!øµâÍ]Iu|3еŸkÖ~ÒïµX¨Ãþ~KîAíeýOúZðß𻾠Ñ]øaÿ…÷…?ùmGü.ïƒôW~á}áOþ[WsñÃßðDƒžøc㯋ºü§á_‚~6x}¼YðgÆ?ôÏÙÀþø¹áTÓ¼?¬?‰¾ø‡ÄðizG|>ºG‹<+ª6³á[Í[N];ľ¾7"ÛYÓ¥¹ïôo€ßðI?üeñgìçáïƒðNwöƒð‡í¼Yã¯:7ï٣TøËà¿ ÞA᛫?x³á…Ž?¼9áû«ox:âÛYÖ4;=:xüÿ‚^øãág…þ"ê³ÿü!þÛÿ cÞ.Ô>è³ÏÄß…š'Å?Ž~ø_®ü:ð…þ)OðïÁ_ð—ÂÈÿ…Ë𶃚Ÿ„|â?‹~ø›ð¿ÄZ‚¬¿áaxwL¸>£ùù/¹´}—õý?ékäß𻾠Ñ]øaÿ…÷…?ùmGü.ïƒôW~á}áOþ[Wœ|WñüOà÷‚ÿf[þÏŸðJŸ~дçˆ?b]7À¿üªþÍ#Ô|oá_ÚûãïÂÿ÷Ÿþj7ß 4/|tø?àkoøÇâ'…¼{£ü(ðÞñC¿ µI%À1Üê—¾úÿáÇÀoø$ŸÆ?|Nð/Â/ƒðNŠž6ø'âðŸÆo|8øuû4xãÅ_üTúˆ4tðÏÄïxcGÕ5xµ ø«K]ÅVzN¢Ú†¼Ab-ΨÅl}Fóò_rhû/ëúÒ×Áÿáw|ÿ¢»ðÃÿ ï òÚø]ß?è®ü0ÿÂûŸü¶®cö|ñ?ü§ãm¯Ç]3Yø+ÿÈøsñ7önøû`èŸþjzw쯨øïáWÂÏÙ#öŽø‘ð+UøéñKÃ÷^ðÿˆ>ü?ñ/‡ü៊Z†¯âÍ OðçƒtˆZŸsânÈéþ%Ö¾¿Ôÿe¯ø%üRñ³û9þÁG‡þhÂë×u?„?³Í†ðû#ÀšÅ-Wþ–§uá謾ÿf|2ñG†~"êð–O¤}‹Àž"м]såxWÓõ ƒê0ÿŸ’û{GÙ_Óþ–¿3ÿÂîø1ÿEwá‡þÞÿåµ𻾠Ñ]øaÿ…÷…?ùm[?lÿ‚ ¬ÿ…éö¯ø$Oü)/øXð©ÿáqyÿ±§ü*ÏøZðŽÂaÿ ÓþïøD¿á`Â%ÿOü!¿Úÿð‘ÿÂ9ÿ¿ìßìÏôªô|2ÿ‚4ü=ÿ…Åÿ ÿÃïø&Gÿáÿá_Ã@Âaá?Ù_Ã?ð£?ámý—þOü./í« /øV_ð³~Ûeÿ ûþ_ìOøLþ×kÿçö—Ú"Þ}Fóò_rhû/ëúÒ×É¿áw|ÿ¢»ðÃÿ ï òÚø]ß?è®ü0ÿÂûŸü¶¯¦?á–¿à—¿ð«?ázÃ9þÁð¤¿á_ÿÂØÿ…Åÿ ‡öyÿ…Yÿ ³þÏøL?áeÿÂÂÿ„{þ/øWÿð‰ÅSÿ —ö¿ü#ŸðŽÄïûKû3ý*¼‚?Á%𯀼u‡ÿ©“Á?ižý•ïüwñƒáf¯£ë¾"Ò¾%ü-ð­„¾ øðÿSðÿ…üM®éþ2𞟫ør÷GðÛjRÙi„öäÿà—¾3øEáß?gÿø&Gņ^6øðëÁ^ø™û<Û|"ñ/ü%ÿ<;ðcY²ðÅ ü;øáÿ|@‹Äž«á/‡^ÓÑád|l¶ðïÁ«¯ø&÷Ä—>(ðùõÏÉ}È=£ì¿¯éÿK_&ÿ…ÝðcþŠïÃü/¼)ÿËj?áw|ÿ¢»ðÃÿ ï òÚ½ãáÀoø$ŸÆÍGÄ?ÁŸƒðN‹š¿„ü?ðãÅž*Òþü:ýš<{¨øk¿ü*¾:øEâoXøWGÕ®toüTðK§Œ~k:ŒVÚwŽ<*Ëâ \êšC ÃÅ¿ØcöÑ ·¾µý‹e/ô-Y½[X¾ü8Òí®.á#ð.—·gAÐ4›«³Úê×Â{¯-$˜¹Fäž„¦ç&¢®ô[_çù›m+-Z_—üéká𻾠Ñ]øaÿ…÷…?ùm]†¼}à_Ý^Xø?ÆžñeîŸ`Ú­ýŸ†¼G£ë·V:b^YiÍ©^[éw—S[X.¡¨éö-y2%ºÞ_Ù[×P$žtŸ³7ìE%íÆ›ìWû>£ikg}u`Ÿt½¶²Ô%¾‚ÂòâÕnŒðÚßO¦jPÙÜIÅs.Ÿ}.ïi:Çä_²×…¼ à¯Úßþ á‡þü.ð–—ðWö>„¾xKGð‡­å½ñ?Ä=FúòK-&Þ)5 Júöîy®uMV{ýE¡û6ž—I¥éÚeŸ:§NJn2“pƒžš].±]ÑWj×KV—åÿúßìêø‡þ Gÿ&3ûIÙ?ý=iöõ|Cÿ#ÿ“ý¤¿ìŸ¿þž´ŠŠ?Å¥ÿ_!ÿ¥!Ëgèÿ#ôÅÿò´ÿ±_Àÿú…ø~¹zê<_ÿ!kOûüÿ¨_‡ë—©ŸÇ/ñKóa—¢ü¾|-Ö>3|pÿ‚¥|=ðî…ðÿľ ÔþÿÁ>u Cø—©øïÂþÔ5jÿ¼m¦G¦üIø[¨X|Møñ+ßÁqðŸöøuˆ é´eßÃÏÙëÀ5‹~ üTÿ‚xãàž?¯>/ÿÁ þx{Nñf¥ƒá_éß¿lø> øÇÁ>&ñ<¾ø¡sàïøóÁ>>ñƒ5ŸèŸ1x÷Gý¬¼£IðÿP²ø‘ÿ7øðSãÄ_ÛKöìñgñOþ àOÚÛÃúW†`ý­e‡öEýœ?á[Íû`ø›Á^"ý¢¼'{û@øÇ>ðg‹¼ImðÃ_hCÄ?OÿaÛ'âOíYÿ GJø¥û2|@ýŸüAðßþBÏYÔ¼ûXøágŽ´ÿÂ]mo¦x7Äß¶/ìyû |M×þ x2÷Àú…׼ Bø)¬xÂþñŸÂ}CLø¥â_x·ÄþðÈgü³âŸÛ¿e_xöSø¦|ý¸þüøÅû4x³Dý§3Z|GøÕñ[áO…f|sý¥à£?´âj |EáÙŸã&¯ûLxÿü“Å_ëÅ^ý—õgNøáÿ +K¹øÑ¨ø'àß×ÿ¿à¥~ øg­üyðß‚Þøñ[àÇí?¦ü Ò¾\øƒö ñ/о"ü=‹öGý™ÿiüpѼû~Ä?¶ŸÆM+Ãÿ|IûS|5øGâioþËðÏGÔu¿ ê^'øËáüGðÃ}€øAÿtÔ~7ÁÅoþË> Ò¿dè~0~¿ 5Œ>1øµá]7âeö£ÿø5ûøûö|Áÿ<=áÿ[jÞ ðÿmxoö™Ó|[ñSÀð'ÃÛ};âÀÿþÒž1Ô|WðoáèAûüÖ5Ÿ?i[˜~ xoà—ƒ¾ ~Ùý‹¼5ñ7àÿŽþ |]ñW?o‹¿¿lïÛ â/Ç/ |Z´ð¯Ä;û;öÇð¯‹>~ÍžÖ~ üÖ<+ðOáµ×‹üM?í ¦|[øñSNçÏüoã.…ð÷Àº_Áßüøñ“Mÿ‚ÿÁL¿nüoðσ ñŽ£g¨þØ ÿि þ|L¹ð†·á-HøËñƒá&‘ûSþÍ–~,ð¯Ä‹í3·žøC¬øÇÇZç†ü5á }{Ïÿeïø*ÆX¿àžž"øáûAü1ðÿþ2~Ï_ðFÙþ aã­cÃ?`²Ó¾ ñN‘û'iÞ0ñbøwÂ^&ð¯üUñYð'…4ßxoá~—㈽‰¿à­ŸükñgÅÞ ý”þŸ†_ áã"Ö4ÚsÄwþ;׿eø%'í{û7þמ<“Á¿³‘áý#ö€ÕüA«ü8ñìßð~"꿾'èú÷àøûM|½ðFƒÄ@øgÿÜý±¼ ûCÜ~Ö¶>ø?¦øÛáψ?f|-ø#ñ'þ _ûrþÙZwĽGá‡ÂOø)ÇÀ¿ˆVÞ6ý¬iïÙ¿Yø­ð#Ãéáoø(n—ãxOÀ¿þ1xWPñWÂ-sE¼Ñ¼sñoXøƒáï¯ü'û|}¼ýŠ|3ð_ÇS|ðçÆK¯ø(þûoxÇO🎼iãO†z…gÿ‚ÇÛÁGø«Â>|ýŸ¼ ðKâ—†o¾è“êÿ|AàM_ö‡ñV£|3ñWŠüð÷KÔ|cmûA‹ÍKã'ìûðNÍ~Ÿñ?ü'Çkð³áç‹>þÍ?ð´>&üYý¯ÿà ß±×ð¹tÿÂIã¿Ø“ßðPÍKÂ7Ÿðžø‹Á_ðèÿð¾¼Aû éþû>»m¦èÿ áqÿlê~'ñe—ÃÙãñxÈ_üK⟄?gÿø&ÃOÜþÏþñì!û xKÂ^,Ð4)¼GáŸ|Qý©þþ×ÿðKOÛZåôýWFømöÝáÿǯ‰¿°ŸÅ½7â—ÆíKÁºŸÄ_ ë´Ï‹2|ø¯â |MáFúÂ?±ßíOðÄÿ þ4ü$Ó?gÿ‹| ñþ Ó¦Üü2ø‹ñƒâ/Á__ü,ÿ‚ÿÁA4Û?Â~2ƒâ׆gÏŽ¾ ‡âÃ/ü-ðüEðÒOƒáÍ{Xñ]7âÅ—ÃÛâqãOø(¿ü/¿ø%—üöïý‘u쯇ÿgÿگƱŸíöO·ÂØÿ…/û:ÝkRübÿ…Sñ7Àú>µàOøA?i­âŸÁïøW¿|}ÿ ?ü)øX+kªü?øáØ¥ùÿZÿ‚“øŸö\ñoŠ?fþË_>#~Ðø€¾ñ‡¨|{ÿ‚‚~Ø~GøûÿÁ6ÿ‚d~Ôÿ³×ÂÏ~Ê? uoÙÿâ×Á)ÿhø%ÇOˆ¿¼ñâ/Á¯Š~ÿ‡wxsþ ÝðßÅÞðWìõáß‚¼%ãßøYÿ‚|éþ1ðæ·®þÒ_ ÿ±¼Gñ–÷Áž‘>™ðÒ|Eçíà—ÿ¶…Ɖûx3XñìÀž ÿ‚xþÌ>ü ´ÓuÿŠÏâ¯~*ý™¿kø&í9ðÃâÅ¿]|?M#àŸ‡ÿi=#þ û/ÃÏü>ðw„¾6j?².£­Çã|Cý´í¼TÞ øqè³çíáñ÷Çÿi‡?> øƒÅŸ¾2|`µøéðçàÏí§ñsÆŸ³>û:|ðüoþñâ‰_ ¼PþøKûSx“áïÆ +ã'í©á«û¿‚zÃUð\ž*Ö~<ø£_ø‹¢x§K°Ó¾$ûìÍûTüSð—üSþ #¨iúü4í5û`~Ïÿ²¿€<#wñ—â׈üáÏüS»ýˆ¼GûNüEñ¯ÆïxãoÄ 3ûOáÿÁ/ŠZšxLø[ñCÄ~-ø§¨xKB×l´]ÄÞ"ø…á ?øëû ~Ó¿|wðßöžÖ~~ÏúÆÝ#þþ1øû=þÜß¶ŸìI£êz?ƽö>д<ý½fo„úÆßÚ/â…´ÏØ¿Ã:xGÅŸ³Âÿj~øƒàOÜÎúŸìàÿümçô¿ø'í+ðwº?ìåðWHý˜5ÏÙóÄ¿´ÿüóöñu/‰¿þø«á&ûéßðOx‡áWÂO€ºÇßڊçâ?‡üKàŸØJÖ|âO‰ß¶‡â­7Qø±'ƒKñGâ°~×?ðTOþÇ>ð‡‹¾#~Í_Ú¾ ðŸÃÿüXý®¾øÅ?¾1øïà‡ÂÏk¾™mñ/Àš‡ìëû#|oøe©|?øÉeà‹ž"ýžüeûi|Eÿ‚{øsÆú?‚Zê_ ¼AáϺìýçÿ²—í•ûGkr|`øCð¿à÷ü4ï‹~ þзÄÿŒú‡ÄŸÚ"ëáÏŽíþ ø³þ ¯ÿø)ðá¿ìÕkâ?‡Þ?ð—Å?ˆð—ì•ãïh?þ2|Tý•>xGÒ¾øRËâõ„µïê¿ :ø*×ì9ûW~Ù~ø£à_ƒþ$ðÿˆ¼ñKö`ñ·Àÿ ø;ÅŸ¶íUûøWàwÄÏißtüeñ7‡¿eφÿ´ÛƒÃÿ´|:ÒõŸ?´}ž‰ð÷áÞð*æÇÂ2ëVß´ň´§ÿnÙ£âŸíÿ º„úOìÿw©èÿð›x ÆZŸÆ«Íö?…ŸáÓþ%èzÎ…¦è>4ð—í%û?øãÂ^Ô¼#ñ÷öø—áßxsöŒþÔøqñÁ¿µgì›ñ·öpøOñI~ ÿ‚‚ÁDüU§ÿÁ6þ<øëÀ¾ñÿ|LñüöDðwŒ|'ñ?QÑüUð›Å_°çÀoø)ƱáïŽþñá­+W> ñ6¯ûYêš6…¥ÞxoQø}¨üE¶¾±ñ¾¿sà8¥ñ_?û~ÿÁ]þÍõÏÚ¶×âˆußhÿm?‹¶³®ð‡ö@ÿ‚eøÛâÞ¡ðßâLŸ³/Å?øKû7Å¿·gÂü?ø[áOÙ¿À~ø•kàï‹ß´_Œõ?†¿¼o©xÆ<ÿÂø+¦£ñ¾~+x?öYñ•û'CñƒöøI¨üañů é¿/µø(ÏÁ¯Ø§Çß³ä~øáïø²ÛVñ€¼oûlxôΛâߊžð¯>Ûéßþø÷ö”ñŽ£â¿ƒ@?8?kÙÿöý¼%ûw|øGð³þ?â×ü³öý¯>A¢è^ý´ôÏ|1Ñþ;~Ü_ðUŽ?u]?ö…ø{û|ký™o¾ x§Eÿ‚‚|Rð?íñŸöJð'Àícán™â|iÔþüO‡â_‚GþÁ6üqð£ö¸¶ø›â?ø›áß‚iÿÚëö±ð/ĽgöÈý¶¼_¨Íâ¯ÚÇ[ý¢µ«ÏxOþ ó}­xoö/ýŸÓ>€øáûþÔúçÅ?‹:GÂÝ3öñÁ/Ú?öÿý‚?nˆ¿|ñƒâ/€>)ü(ÿ†Iñì#kâï…Þ ø;áßÙóâw„¾.ÿÂQá/ØgOÖü9ãmwã§ÁÏ/Äo|-©øFÓLøwŒ<}ÏþÌðKÿ|ƒöÑügâÿÜø'àoìÁû/i¿µÃkúŒß þ.~Ú±OÁ¯üýž>-Øø/Uø¥é=ðúi,ñoŒ|mã߈qi—âìeÿ¼ñãð¥·ìí©éW'‰?à¬~*ø]ãO‰øÇû6xGÕÿeσÿ·Æ¿Û*ãáŸÇ}Gâàï þÇ?¿bïÚ2ÃOý™&ñOÀï…W?´7ˆ>'x'öòø'¥ÞZüT³ý”tïø«Cø§c«ã}#Þ×<}ëþý¾~)øö˜øSû ~гçÃÿümø‘ñáæ›{uðwöñÆ_…žøYñoö{ÿ‚‚übðŒ­|aã_Ùçà‹uψÅ¿ðNŸŠÞñ‡ÃI~hžðÿ‡ Á4?m€ÿ¾~Ëš<³ü©|`ÿ‚E||øíñ[RøÕñ[ÁÞ*øuâ¯ø'¯‚ÿàœ¿>'ü=øIð®×ögñ†‘ñ§Ãþ4Ò?àŸqx“À_|cñcà£.£ñzOx‡áæ‡mðù|I㟠?à›_ðM¿~Æþ*øu/Žìü?ªÛ~Îß³ÇìðÛâ}Ïí‘ûm~ÒÞ*ø«á[íGà»jÞ5ѾüxÖ´?Ùóö ðÿˆãýŸ¼â|ø£üzÓ¦Ôuo ø;Â_üàŸ¢×ãoÃÿø§ñöˆøéc¬ü:óg/‡?aƒo„ô/޾#øwã¿ üvñüÃöÄÿ‚hÇñ3O×|ð»IñŽ~üKðÿìù់¿¾ø³â%‡ƒ¢Ñþ音¥Ï…þ"x3ãÅ¿i•ÿ¢ñV—û<|øÿñoö7ñÃèÿjŸÙƒá¿íû+øŸõŽ4ñTþ7ø·ûþÎ÷:ÅíáGÁ­Äžðþ¡ñ“öæø­ü+¼øáÏÚã/Ä?€RøÏÅþ!ýŸ~~Ðzû)øœÇþ.þÈþ1ñ'>'~͵f¡ðÿIýœ¾þÐðP¯Ú§\Õc¯üvýªn/ü,ÿ‚ªëðRO€ÿ ´;ÏØãÁ?±ö¥â…_bðÿí³ñ7V·øµáý{öŒðâø·öiñ=€ð.¯àËøÏáoèÿìÅð“ö¸ð'ì£ñ£â·Š#ø?¥ÿÁGkOÁûFüCðWˆ4ÝoGý˜>þ× û*üøà…McàÏüWñ´ßþ[|øeΈÞ$Ð~*x÷[ñ÷ˆ,~#üCðÿ†txKá÷ƒ¾`ÿ‚qþÓ~1ýª?o¯ÛŸÆž?ø ñöño„¿dø'G€5oøËÁß¼%áÏý“ãGüßÅÖ5øO?í/ðöWøÛ⿇óiž2³ð¦¥â?þÏ üŸŠ~ø—áoYx·Â^Ð~"øËöú€?|Gÿåý§|Yÿ oã»ðïáû|zøyÿ -á‰Z?ƒિ¶ŸÀoþÑW_´‡ü2v»ª~ÓmŸÙwöCøñ6÷⇯e­3áv›û(éÿ³}·ìã¡|,¼øi§ü-ñŸþÏ?þhÞðÏþ ±ñ³örм/©|oÙÿÅ øû_üý¡>ü.½ñGÅß„ ý‹o®ø›ã/ÆÃÓ|“ö|ý£mÿØÓöðñ×ÄýgÇ^4Ó>2ü/ñWìyìTÖ|'ð&ÇáFµàŸŠ^ø•sû x:Ÿ‹šÇíð£Qð<|MqÂ_Ið{KµøÃÐxwö)ø§¤Á6?aØêç_ø~ÿfOøu/ü'ºì¯ˆÛÀš¿ü0¿Ç¯Ù[â—Å¿øDu9<)ˆ/ÿá"ðÿÀïYü:þÙðÆý¯¬j>·ñ7ü"6Wz–¡¤~ŸÑ@”±Gü÷Å_²¦ÿÏÑÒƒú&‘ûÁ8>5~Êßt¿†Ñê:n⟿üUûøëÅ_|b<áÛmoÃþ.ñ·ìáñ›Æ>9ñw‰âðÇ5ÿxßCñ£áÝWWñ/Н4?±?ixKÁž‚ûÆ)ðç„ìµ UÒ¬/‘âÓ¿µ¯4½+ï°h—Úw6Z>Ÿqý·,–_¼w•d9§{4“¶ú´5ºõ_™ùAáþÉÞøŠ>,ÃFx·SñÝÜ¢OßÝþÐ?×Lñ$2­ºÞèúŽŸ ŒiáÉãµ·‚ËF·¸4;{M7ûâÂëIÓ.í*þÌ:Þ‹â?Úûþ ¬ø{WÒõíóà¿ìyö=[FÔ-5M6ïìþ"øiqökë§µŸÈº‚{i¼©_ʸ†X_l‘º±ãý‡b¯Ýù_±ÿì¸ßê|Ÿ/öøO6ïùýŸËÛá-gíó£ù;·¾×ö­7Ëÿ„·þ _ø_ÝW‡>|ø3¢øÛþçÁÿ…¿ bñ'…ì?·ÛáŸÃÿ ø"?cø¯ÀçDþØŸÂÚEºëÙ–z¬òé_mÖõo³ÛjÓjŸÚQkñâþ·''ìœãÚ7Oì¤Ý¹l¯µÙ}´KTÞ­ÿ/ñVט¯ˆà¤òc?´—ý“÷ÿÓÖ‘_oWÄ?ðR?ù1ŸÚKþÉûÿéëH®J?Å¥ÿ_!ÿ¥"å³ô‘ú âÿù ZدàýBü?\½u/ÿµ§ýŠþÿÔ/ÃõËÔÏã—ø¥ù°ŽËÑ~G€þË_ | ñ£ö«ÿ‚—|6ø“¡ÂAá/|?ýƒ'¹¶ƒSÖøÁûAüwÓ¼âËßx«Â·Ÿ?j½;ö†Ñÿh=SÄÞñ±©é3ðÿÄÝ#ö­øÿ¥ë>ñ}ž¹ðöÏNø‡sc¢x[K¶Ð<)ƒñìÿ'Íÿÿ²ûÿé—ö†¯×êö¨ÿ —ý{‡þ’Œe»õ™àÿf/„_³¯ü%7?­> j~ ñ¯ö$)ñïÆ/Ÿ?hߊzÎáíy<)ᯋ´?Ä/Š_Wáÿ„/|IâígÁÿ ñd^ðŸˆüuñ ÄÞðî™âˆ4ÔµßÏüwög¶øÙ |EÑÏÄ ?†Zgìÿñ£à[|Õ>2~О(ð'‚áaü]ý•~0|1ñOì»iâW¾ý‰áüAû/é3ü#Ñ?dÿü)ÿ„#X—ᯈ¾êÿï~|8†ÛôþŠÐGÀüÿö,Ð4}OKðoïˆ u=wâ»ñKÄþ~Ò_´ïž#ñߌ| ð·áïÄ}wÄ¿>ücðŸÆßÂâÓ> ü'ñOÇ]3[ñýþñßâï€ü?ñßãŸã¶­ñO@øû~Éß ~GðSÀŸ °¾Eñöcø¥†á:ø“©íñßìoáÏÙó~»ý³¬xÇPñÿ…sáÿÙ#ö{Óÿ³U:?‹ÿá_ý«ÇšŠ/|Wã{Ÿ}E|ñþ qû üXð$ |wð3û_á”_üEðžçáÕŸÄߌ^ð&µð³WÖ<]â/ ü4ñ?„|3ñGðÿ‹~þÏþ ñ׊5ߨëÁ¾'Óõ~ÃúÅý¾§ûi¿¯t}?Ð5ÿØ+öNñG‡ÿ„þ(ÿøûW[þÒùÿâgüãöøÅâ?x§âGÀÏøIµ?Âçó-eø›ñ‹Nðç„ÿ᤾|Pø;ûH©ð~ñNð—Áoøh¿ |dø«þÐð¨tOÿÂìø§¨è¿>'ÿÂUñ·Á~ø…áß¿è ñ7ì¹ð'Æ>ý¨üâ?høKöÑÿ„‡þ_Iÿ„›Æ6ð²¿á*øàoÙ£^ÿO°ñ ®§àï·üøkà¯Å{á_²ÿbÿÂGeöê:¶½çÿ¿aÙŸâWˆüaã]_Âÿ<+ñÇŸ.¾%ø§âgÁßÿ´'ÀŠwþ#Ô~|ø1­é¶¿>üSøuñFøâ‡ÿ³ßÀ»/|'ÑñÿŠ|«ü@ð®‘â‹_¯è ˆ5_ø''ì{yÔ^øeâ„77 Óõû}oöqøÍñÏö^ñVƒ›ðkà§À|áþξx§Á?î¾þÍß<=«ü ð†±¡ü×uƒ? |c­øPñ·ƒ´?Ùú¥û~Ï—À/„Ÿ³<^ñ‡¾üðÿ€¼3ðéß <'Ão \ü6øñàOxsã·‚üAÃk­cáÆ¹âÏ|HÓüUㇾ)ñ·üc¬ëÞñÏŒ4séú(àˆ¿ðKÿØ³â ømâO‡_4Ÿ OðÿÄ_ |gmðÛö’ý§~ k| âýcÅÞ&ñ^…ûJø³áÆ?x·ö¤ÿ„—Å¿þ*øÛ^ÔÿhÝs⎱«xïã/Æïßêø·ãOÅMgÅýˆ?àœŸ±ï‰giu†^ ³¶Ô¼Añ;_ñƉῌßüá_Œð|cøËñãÿÄ?~Ѿð—Ä­Âß´ÇÁýgâ·ÆOŒ^!°øû@èÿ¾ xcNø½ñWÁÞð&‡àŸˆþ3ðæ·öýðÄÏø%Çì'ñ‹Ä~(ñOÄŸð“j~*ÿ…ÏæZËñ7ãáÏ ÿÃI|,ø¡ðwöÿ…Sàýâá/‚ßðÑ~øÉñWý ?áPèžÿ…ÙñOQÑ~:|Oÿ„«ão‚üñ ýˆ?àœŸ±ï‹>&7Å|2ñ‰n_ļXÿ |Añ›ãž³û07о6|=øð»ã7‰›ö;Ô~%\þÉÍ⋞øÇñv‰ÚÉø.uøƒâ§ÄxªçVñ¿Ž,x'ö«ý«¾|}Öu?ƒ_>_[kŸ´W~6xwã¶·áÿ|6ýœ>ÛüIðž­ñó¿xÂÞ ñ?ÆÙóã¾£àï ÞøƒÂ¾³ø™û*iß³Îû>jžð÷‡u3Hðg‡þi²—À /Fð„,ô?‡·šwÃËkoÂÚ¥¶¿â¸µï§è ñÿì¹ð'â‡Å?|gñÇ¿¶> xþÏìûؼMãÞ&ÿ„Äw¾5ø[ÿ [ÀˆtχÿáI|@Ôõ_‰Ÿ³ÿü.? øïþÿâž±­|Pø-ÿ'Ä cSñßËú¯üOöÖ'º¾›à¯ˆ4ý]¼?§ø3Añ‡><þÑ~ñW߇¾øËðSöƒð¿ƒ+ð¿Å­ÄŸ>üøÉû=|+ñ×ÀO„?5O|3ýŸµ/Äöü)à-#â_ÄÝ;Æ£ôPÈý‚¿dïo‘>ÿÂk{ðÿãwÂßë?|uñ'ã߈þ)xöÿ…5mñ—BøÝâoÞ1øƒâŽÿð˜xöyø#à$Ôþ2ê^:Ö<7ð³á„¾xKPÐ~i‰á6çí¿à²¬Ö|5q |`Öµ}gÄñ0øÃâŸÚ¯ö®ñ‡íAáÍGÁºw‹4_ ÛxöºñWÆÍcö£øgáýCø‹ñ_@Òü'ðïâÿ…ü+káÿ_ô(ôa¤|tø»gãO·è ˆ<'ÿÞý‰|¢xgÂÿ¾øá÷…¼!â ÄÚ…<âx'¶ú…?k‹oÛ«ÀV×¾ð¿Š4Yðÿ¿Ú5oˆßü'­Xjø5§xÛâ‡Ã_…š7„>üYø›àô°Wì{àOƒÿ ®>ÿÅ%û?þÏó~Ì_- ñ×Ä›Mcá—Â/퀾&Ò­<#âË_ÃâÝ+âƒü[û/üñ·Ã¯ëŸð»>xïá‡|sð÷â†|[ý¡¬ÞýE|Aû8þŸ ÿeÏ¿>5|2Õ|A%·Çoƒÿ³ŸÃiÞ9ñ'Ä/Šß5Ï|ñ§í9â!ñ;âOíñwâÄŠßßý±ÿíøX¸gðKü2ü™k§Ëÿqž_ÿÁHÿäÆi/û'ïÿ§­"¾Þ¯ˆà¤òc?´—ý“÷ÿÓÖ‘\´‹Kþ¾CÿJEËgèÿ#ôÅÿò´ÿ±_Àÿú…ø~¹zê<_ÿ!kOûüÿ¨_‡ë—©ŸÇ/ñKóa—¢üŽöÿ“æÿ‚ˆÿÙ?ý‡ÿôËûCWëõ~@þÁò|ßðQû'ÿ°ÿþ™hjý~¯jð©׸é(Æ[¿Wù…QZ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+Ëþ$üÿذýýÿÚ?¸ÿ[æy¿`²ÿ_ôß7Íûoöü€ïþÑöÿìø›ÿkÿ¼ø…êå_¥->…cµýäÓÅ«Î-¬´ÝCSßJ°¹šx,­µXÒ$TÜIq£]¡Óî/á”êš|º‡|q_áËåÿ¥!Çuê4ÿ[ÿM¼ïûyóþÓÿƒ¯µý¯ûkþ£ÿÚÛÿó7Â]ÿËø§çÒué¾þÿ Íûÿõ¾g›ãOÞÿÇ×úo›æý·ûCþC—ÿhûöÇüMÿµÿáaüBê<»ù>þ…âƒæýÿ?Â~%9ûGúß´ùúV­»wöµ÷Û~Ñýµ»Íñ'Û?á(óüEÿ ÃÇõ/ˆþ ×üQñOᦛ¬ùÿ~|=ðˆ!üJáŸÁ?ðËò-tù퇟×Ä?ðR?ù1ŸÚKþÉûÿéëH¯·«âø)ü˜Ïí%ÿdýÿôõ¤W-âÒÿ¯ÿÒ‘rÙú?Èýñü…­?ìWð?þ¡~®^ºÿÈZÓþÅÿêáúåêgñËüRüØGeè¿#ý‚?äù¿à¢?öOÿaÿý2þÐÕúý_”¿±—ƒ|aà¿Ú£öÖø¡âO x¢ÃÀ?¼3û+øÀ>&‹ÃÚ¾¥aâSᶇñq¼mšš]íÓZè2x×ö“js[Ŧ]ê77ÚfŸyw¨èzí®›úeÿ ~“ÿ>ž(ÿÂÆŸü ¯b”¢©RNQOÙÃF×ò¯3Þ_çÿEËÿÂ_¤ÿϧŠ?ð‡ñ§ÿ((ÿ„¿IÿŸOáãOþPVœðþhÿàKüÂϳþ¿á×ÞuW/ÿ ~“ÿ>ž(ÿÂÆŸü £þý'þ}Ïúÿ‡_yÔQ\¿ü%úOüúx£ÿò‚øKôŸùôñGþþ4ÿåðþhÿàKüÂϳþ¿á×ÞuW/ÿ ~“ÿ>ž(ÿÂÆŸü £þý'þ}Ïúÿ‡_yÔQ\¿ü%úOüúx£ÿò‚øKôŸùôñGþþ4ÿåðþhÿàKüÂϳþ¿á×ÞuW/ÿ ~“ÿ>ž(ÿÂÆŸü £þý'þ}Ïúÿ‡_yÔQ\¿ü%úOüúx£ÿò‚øKôŸùôñGþþ4ÿåðþhÿàKüÂϳþ¿á×ÞuW/ÿ ~“ÿ>ž(ÿÂÆŸü £þý'þ}Ïúÿ‡_yÔWƒürÿL¿ö+êÿúš|3¯Pÿ„¿IÿŸOáãOþPWÆßµÿÄá˜~þÌ?¿hG\µñ•¯Aáûÿ |8²ðm”Z¯ƒ5›;íJ÷⎥á©õk­b}&[-7OðþŸ©EVڥ注èï‘g¯eY©Rœc(¶Õ’æŽ®ë»·Þ u£Ýtôÿ5÷Ÿ|?ø“ñ—Æÿ5¿†W-|/§xBÖ oÆŸµOˆ7’ø#Cð­ä×0i:å•ô?–}zëÅÙÝiþðí„+®jú½µý…妚Šn´'özÿ“Ðÿ‚‹Ùý¿ô÷㺔|Vý»Ö -—þ £ñµm¦–å·~ˆ%žÝ'ŽÞi"1òÞX#º¹Hde/\N¨Uf5ÏÙ_áïí oñ‡öÎøÝñ¯ö|ñÀM'âÃOÙËþÒ¼YâøžKíGáçŠ|Qm®¬:‚5ýrÙ-µÍî1©G¥Ï3^\ÃiÜz}ÍÍqrrÆ£öq‡îejŠ|Òæ‹º\òiY7å­ÞÅ·{jß¼žÖ²û—u÷£êZø‡þ Gÿ&3ûIÙ?ý=iöõ|Cÿ#ÿ“ý¤¿ìŸ¿þž´Šç£üZ_õòúR.[?Gù Þ/ÿµ§ýŠþÿÔ/ÃõË×Qâÿù ZدàýBü?\F¡¦GªÂ¶òk¾-ðò¤«0½ðmׄ-5IJ£ÇöYäñ§ü}¥µƒ‰ ²¥¾m¨ˆ-Z-Neºµ¼RWœ“i.ijïe«ÞÉ¿¹0_ ë¢þµ/Ñ\Çü!–¿ôS¾;ÿàçàÿC]ð†ZÿÑNøïÿƒŸ€_ý tù#ÿ?©ýÕùP]ö‡ù=ÌÂkÿE;ã¿þ~ô5Ñÿe¯ýïŽÿø9øÿÐ×G$çõ?º¯ÿ* ¾Ïðÿ3§¢¹øC-è§|wÿÁÏÀ/þ†º?á µÿ¢ñßÿ?¿úèäüþ§÷UÿåAwÙþætôW1ÿe¯ýïŽÿø9øÿÐ×Gü!–¿ôS¾;ÿàçàÿC]‘ÿŸÔþê¿ü¨.û?ÃüÎžŠæ?á µÿ¢ñßÿ?¿úèÿ„2×þŠwÇüüÿèk£’?óúŸÝWÿ•ßgø™ÓÑ\Çü!–¿ôS¾;ÿàçàÿC]ð†ZÿÑNøïÿƒŸ€_ý trGþSûªÿò »ìÿó:z+˜ÿ„2×þŠwÇüüÿèk£þË_ú)ßÿðsð ÿ¡®ŽHÿÏêu_þT}ŸáþgOEsð†ZÿÑNøïÿƒŸ€_ý tÂkÿE;ã¿þ~ô5ÑÉùýOî«ÿÊ‚ï³ü?Ìéè®cþË_ú)ßÿðsð ÿ¡®øC-è§|wÿÁÏÀ/þ†º9#ÿ?©ýÕùP]ö‡ù=ÌÂkÿE;ã¿þ~ô5Ñÿe¯ýïŽÿø9øÿÐ×G$çõ?º¯ÿ* ¾Ïðÿ3§¢¹øC-è§|wÿÁÏÀ/þ†º?á µÿ¢ñßÿ?¿úèäüþ§÷UÿåAwÙþætôW1ÿe¯ýïŽÿø9øÿÐ×Gü!–¿ôS¾;ÿàçàÿC]‘ÿŸÔþê¿ü¨.û?ÃüÎžŠæ?á µÿ¢ñßÿ?¿úèÿ„2×þŠwÇüüÿèk£’?óúŸÝWÿ•ßgø™ÓÑ\Çü!–¿ôS¾;ÿàçàÿC]ð†ZÿÑNøïÿƒŸ€_ý trGþSûªÿò »ìÿó:z+˜ÿ„2×þŠwÇüüÿèk£þË_ú)ßÿðsð ÿ¡®ŽHÿÏêu_þT}ŸáþgOEsð†ZÿÑNøïÿƒŸ€_ý tÂkÿE;ã¿þ~ô5ÑÉùýOî«ÿÊ‚ï³ü?Ìéè®cþË_ú)ßÿðsð ÿ¡®øC-è§|wÿÁÏÀ/þ†º9#ÿ?©ýÕùP]ö‡ù=ÌÂkÿE;ã¿þ~ô5Ñÿe¯ýïŽÿø9øÿÐ×G$çõ?º¯ÿ* ¾Ïðÿ3§¢¹øC-è§|wÿÁÏÀ/þ†º?á µÿ¢ñßÿ?¿úèäüþ§÷UÿåAwÙþætõñüþLgö’ÿ²~ÿúzÒ+íè­ìììtÛ [{Q{+Y¢¼Ö0ÿ‹øasã¨<;ÿ n·¨xÛá'ÂÏxrm_þÝ+Uøñßâßþü3·ñ?‰SL×îü/à•øƒñÃSxëÅW†|1ñwÂMoö)Õüiyá/Ú ÿÅÿ´_‚ß¶í7¨þÌú7Ä­câïÄ‚¿5=[ø]©ø'â—Ž|}á][ᵯ„áðŸ‡üö¿Ç‹|D>RT媧QëoâÂ÷º[{+ï%å¨kÝ}ÏüÏyÿ†ÅøÿDWöÿÿÅZÿÁKÿúèÿ†ÅøÿDWöÿÿÅZÿÁKÿúë×¾øóÄü9{ãgáî·ðãAÕu»—øs¦øÁ¯ô߈ÿÃõ°ÓF“ã?xSÑ4Oá.·âLëZŽðÏ_ºÔ¼q x¼%yñCOøqñSUñ·ÁŸ†ž£RÝ%§%OüþT÷_sÿ3åøl_‡ÿôEoÿüU¯ü¿ÿ¡.øl_‡ÿôEoÿüU¯ü¿ÿ¡.¾¯¯0øÝÿ$câïý“ê)«S^É´¹*jÒþ,z»Ϡ׺ûŸù™Ÿ¾>ü'ý§þøgãÁ\ø¿áŸ‹î|Oe k÷¾ñwƒ/.o<âí{À~'´»ðÇ4 x³H¹Òé_~ k¿|%ã[‹øKáÇ\øÚçÄß>Çá ÇðÞ= UУñ¾­«xßÃÚ‡‡´Æ[vß´güað—Cý¤®ÿ„CVÿŸ¿ ÿáqà¿þ_Ñÿ†­ÿ?~ÿÂãÁü¿¯ðÿÇ‚Þ,ñÄÿ ¼-ñáw‰~$Úèž%ñ-×ÃßøÿÂzÏŽ-¼9࿈¯Âoø‚ éڵν‰á?Šš¹ðÏ嬖 a¡|@ѵ_ê“ÚøN»Óaâ´¯ÚëöO×~x—㶇ûO~Ï:ÏÁëpxkÆ?4¯_ µ…^ñÔÞ·µðÿ‰~!Úx–oèZÝÍÇ‹<-V©«ÚßÍ7‰|?p3ë:rÜ–_É>ŸiuÛìuéÜ5î¾ïO?êëçõwü"·üýø_ÿ ÿòþøD5oùûð¿þ ÿåý|£ðóö‡ðçÄÿ>5øaàäÑ¡¨òs$Óæå³i«Zý"…­í¦Ï§kyùŸGÑE (¢€ (¢€ (¢€ ø‡þ Gÿ&3ûIÙ?ý=iöõ|Cÿ#ÿ“ý¤¿ìŸ¿þž´ŠÒñi×ÈéHRÙú?Èýñü…­?ìWð?þ¡~®^ºÿÈZÓþÅÿêáúåêgñËüRüØGeè¿ ¢Š*FQEQEQE|Qÿ*ÿ”s~ß¿öeµOþ¨¿×ßþ8ÿ‘ÓÅÿö4xƒÿN×uòíuð—ÄdÿÚ{àOƒ¯tM7Åß¿gŸ_ |-¨ø–æþÏÖ#øðÛľÐï|Aw¥éºÎ§k¢Zêzͬú­Î¤j·ðXG<¶šmõÂÇk/çOˆôßø8Ä^!×|@Þ%ÿ‚lé-®ë:¦²t­+âƦÓ4éßOztý5µoÙ7UÕ …‘ŸìÖgRÕ5-@Ûż¿¼¹ó.$Ú J›‹œ Ôïï¶®¹m¥“Ñ­ÑíæÑû9E~%Â+ÿÿÿ¡×þ Ñÿ…ÿÅ¿þƒê?áÿ‚ÿÿÐëÿèÿÂÿâßÿAõÅÏê?øÿù¿÷eøŸŸçÙŸ¥ÿµ'Â_ühøDÞðuî‰iâï üQýŸþ4øZÛÄ·7úw‡ªPåZV¡£º|ÓºÖ/ù;Å}Úuÿ»/¹yyÿZßm?R¾x+â7ÃoøH¼ â/ÿÂÁøg¢dIð{ÅÞ(×µÝo㎅wý¦šŸÃŠz®¯iwÿ þ÷Ù4ˆ|ñ³Sñ=ßÄoˆžÖíô/Œ:N·ñ3á÷ˆ¾=|~öºüJÿ„Wþ ÿÿC¯ü£ÿ ÿ‹ýÔÂ+ÿÿÿ¡×þ Ñÿ…ÿÅ¿þƒê—I7mGÿŸÿ ;ÿv_‡ùùþ}™ûk^añ»þHÇÅßû&>ÿÔSV¯ÉŸøEà¿ÿô:ÿÁ:?ð¿ø·ÿÐ}Yzßÿø/gˆô]_ÃÚÏ‹?àš>½¥ê6­gÿ ã¿ÚôÝRÒkëo´Z~Èp]AçÚÏ,^u´ðÜE¿|2Ç"«‡II7ZŽ?Š}øÿÝ—áþ~Ÿf{üóþQ¡ðKþÊGíuÿ­™ûAWìw„?ä-wÿb¿Ž?õ ñ~wÁ6?fψ߲/ìmðÃàÅ«ÿê_|)âO¾!ñÏíg]ñƒWþ‡Ç¯‰ÿô«=Zñ/…|­ê?ÙÚ'ôÝ?P¸½ð®VÖù- šÑ`ºŸìÿk><Ð|9âÿ†:'„|CãÉ4gJðÞ™ãÏë>ð‹^ëÚmÎ…%ö¹­xÂþ1ÖcµÒ-5+]4û YuË‹t6Ôtµ5ý2dÓ¯)&¹]VÓég;ßÒÚ‚Ùz/ÈÚ¢¾!þÒÿ‚‘ЛûÿáËøñÿΚí/ø)ý ¿±þ¿üé©{?ïÓÿÀ¿àüŸÝéþƒìt_>|io?hŸ:Âïø»á·ÂïŽßµ†ÿ¾$x³à߇5|uñgìù㛿Ù|GðwÂ/šk~Ôÿg=#A¶ðDÿ RÃĶ>Ôµé|sáËZè4ø£ößý?mŸÚ·áW‹|)s¯|.Ö5?Š³Ï¾·|?ûX~ÕŸ²¯Â¯€?0øgàøoö†ðÏÃ/ÝÍðUñƒþxLý¦¾!ü6ð'Ö¿Ú_ðR/úbü9?ùÓQý¥ÿ"ÿ¡7ö!ÿ×ñãÿ5\Sš+ÇgÌï»vºµµok_gu ´}¶¾žÿ­c䯉ŸðLOüGø}ðRÇ]ø]ðóSø…û^ÁK~<|Xñ÷‡ôKýNÿRðçí±ð‹þ ðkáߊ'Ó!Ñü/qñ â¼#ûP|Ò!øƒñ;í7µ—‡í&ø»â]{L×~+xËKñßgøUð[DÔü;ð÷Ký ¯ˆ´¿à¤_ô&þÄ?ørþ<ó¦£ûKþ EÿBoìCÿ‡/ãÇÿ:j™EɶêS»ßÞò·aßÉýÞŸçø>ÇÑÿ¿äŒ|]ÿ²aãïýE5jóÿØçþMöWÿ³pøÿªÇÂõâ^)°ÿ‚Šø»Ã#ð¦¥áØ® ;Äú¯áëù¬~'üsŠö-kO¸Ón¥³’„0Gu2=»ÍmqJ¤‚T }GðÀz¿ÂÏ_¾ø‚çM¼×þü&øsà=rïFšêãHºÕü!àýÃڕΕq{g§^ϦÏ{§O-Œ×z}Ô¶­ÜYÛJÏJ4ùy£'ÏußN[j»Ù­þvg¬ÑEŠ( Š( Š( ¾!ÿ‚‘ÿÉŒþÒ_öOßÿOZE}½_ÿÁHÿäÆi/û'ïÿ§­"´£üZ_õòúR¶~ò?A¼_ÿ!kOûüÿ¨_‡ë—¯óѾøÏñ‡S½¼Ôµ/Šÿµ GPº¸¾¿¿¾ñ׊.ïo¯nåyî¯/.§Õ$žæêæy$šââiY¥w’GgfcWþÏÅOú)?ð²ñÿ,«±à¹›—µ·3½¹/këoŒ…;$­²¶ÿðô8¢¿ÏþÏÅOú)?ð²ñÿ,¨ÿ…³ñSþŠ_Äü,¼GÿË*>¡ÿOòOþÜ=§—ãÿÿCŠ+üñÿálüTÿ¢—ñÿ /ÿòÊø[??è¥ü@ÿÂËÄü²£êô÷ÿ$ÿíÃÚy~?ðô8¢¿ÏþÏÅOú)?ð²ñÿ,¨ÿ…³ñSþŠ_Äü,¼GÿË*>¡ÿOòOþÜ=§—ãÿÿCŠ+üñÿálüTÿ¢—ñÿ /ÿòÊø[??è¥ü@ÿÂËÄü²£êô÷ÿ$ÿíÃÚy~?ðô8¢¿ÏþÏÅOú)?ð²ñÿ,¨ÿ…³ñSþŠ_Äü,¼GÿË*>¡ÿOòOþÜ=§—ãÿÿCŠ+üñÿálüTÿ¢—ñÿ /ÿòÊø[??è¥ü@ÿÂËÄü²£êô÷ÿ$ÿíÃÚy~?ðô8¢¿ÏþÏÅOú)?ð²ñÿ,¨ÿ…³ñSþŠ_Äü,¼GÿË*>¡ÿOòOþÜ=§—ãÿÿCŠ+üñÿálüTÿ¢—ñÿ /ÿòÊø[??è¥ü@ÿÂËÄü²£êô÷ÿ$ÿíÃÚy~?ðô8¢¿ÏþÏÅOú)?ð²ñÿ,¨ÿ…³ñSþŠ_Äü,¼GÿË*>¡ÿOòOþÜ=§—ãÿÿCŠ+üñÿálüTÿ¢—ñÿ /ÿòÊø[??è¥ü@ÿÂËÄü²£êô÷ÿ$ÿíÃÚy~?ðô8¢¿ÏþÏÅOú)?ð²ñÿ,¨ÿ…³ñSþŠ_Äü,¼GÿË*>¡ÿOòOþÜ=§—ãÿÿCŠ+üñÿálüTÿ¢—ñÿ /ÿòÊø[??è¥ü@ÿÂËÄü²£êô÷ÿ$ÿíÃÚy~?ðô8¢¿ÏþÏÅOú)?ð²ñÿ,¨ÿ…³ñSþŠ_Äü,¼GÿË*>¡ÿOòOþÜ=§—ãÿÿCŠ+üñÿálüTÿ¢—ñÿ /ÿòÊø[??è¥ü@ÿÂËÄü²£êô÷ÿ$ÿíÃÚy~?ðô8¢¿ÏþÏÅOú)?ð²ñÿ,¨ÿ…³ñSþŠ_Äü,¼GÿË*>¡ÿOòOþÜ=§—ãÿÿCŠ+üñÿálüTÿ¢—ñÿ /ÿòÊø[??è¥ü@ÿÂËÄü²£êô÷ÿ$ÿíÃÚy~?ðô8¢¿ÏþÏÅOú)?ð²ñÿ,¨ÿ…³ñSþŠ_Äü,¼GÿË*>¡ÿOòOþÜ=§—ãÿÿCŠ+üñÿálüTÿ¢—ñÿ /ÿòÊø[??è¥ü@ÿÂËÄü²£êô÷ÿ$ÿíÃÚy~?ðô8¢¿ÏþÏÅOú)?ð²ñÿ,¨ÿ…³ñSþŠ_Äü,¼GÿË*>¡ÿOòOþÜ=§—ãÿÿCŠø‡þ Gÿ&3ûIÙ?ý=iüRÿÂÙø©ÿE/âþ^#ÿå•W»øñ&þÖæÂÿâŽ/lomæ´¼³»ñf½skwisCqmso6 ðÏo<.ñM ¨ñ˲:²±¡‚äœeíoË(ÊÜ–¿+N×çv½»ÓVÝ[øÿÙPythonCard-0.8.2/tools/standaloneBuilder/doc/pic16.jpg0000755000076500007650000023070410231140007022477 0ustar alexalex00000000000000ÿØÿàJFIFÿÛCÿÛCÿÀR\"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ý²ÿ‚žÁN¼Mÿññìéá/~Í6?´©ñ×B×LÑ4«ÍÃúîŸ௠ü)Ôn–ÞøCñ'WñUçˆ.<srà}Žk¦»¶¥Þ,¿5$ÿƒˆ¿i(ƒà”þ7Œ RÆMH PÌQKý’PάªN`Td‚+éÿø*Ÿ‡<3ãø)ü'Â^3ðîƒâï xŸâ¯ˆ|?âO ø£GÓ¼AáÏhÚLJf ?PÒ5½V¶¼Ó5]2þÚâKkËûYín!‘£š&BEBðï/ØþŒoö=ÿÄfø-ÿÌM~Õ‘Qð›$àž̸¿„3Œ÷8Ï£ŸU«‰ËsÌvœhåÙæ/AN„qô¨Æ^Ʀ½EÆ’”ùªJrf•xó͇slŸ/ËòúcK3Ëå‹©:øÌ<ªUTåIEòARŒß´œ¤åVÉÆŠ?’ÿÁË_|ikã?ø&½÷„,o§{[+ßxËIÐ-/.£å{k[WöSµ†âá#ŠGhbwuDwe ŒÃ–‹þ™Õä![öðÂ6pÀüXðveêß³ÃÊ”²¹´o*©tö¿iÿÁÉ?³ìíð+öDЯ~ |ø+ðwPñ Æ£m®ß|,øYà_‡×ºÕÄ?‚óÚÚê×^Ð4«FÖÚâæ[ˆ`»y¡†ydXäc øçö#ý–ÿgOØ[þý¿c¯‡6üYñ_àèññÇÇ/üMð3|9ø€<¾'ñ…¬z0Õÿh?ŠK¥è:Ú}ôzýþ£µá¯¶Áä æ¼5Šâ»sÊ–_Ä™ž-Äñ&wíªaxf–xʘŒT3EB„%W0ÀáÒ§Kˆ~ßÛÓ¡Rœ+F añÙù¦s€öñÇeØ9â°Yu‡æÌiÆT}•ÔgVr^Ï'Ï:pJ’¦ê)8JbÁÑš»*“ûx]K$ÂÖðwÛýïÙ‘N>cÊ­ÇΨD‚9Gü«¿±…ǯü]o3€á™ùÏ88‡8øƒÂŸðKŸƒ_þ~Æ¿´ï«?‰Úì÷ñ—ö{ý¸þ?~Ñ~ø¯ñï–^"øà/ØÆ«à_|B³øõà_Ù+Å—‰tOj^*øzö¿ü)ûø×ÆöwÑê\2Ýiìþ,øoíÿÿà“ÿ±?À‚?´Wí?¨ø·ö€øÇð¿Àÿ²Oü›ö¦øKà¿|Wðo€¯o¬m_‰¾ø›@Ö>+ø÷öS¼Ô¼]¢èšŸ€­”¸;ÁhW§†— ã爫‹þÎ…y®})G3Yßú¿,²­Ežû8¨æ÷ëU†¦}j–&te O5ã )ÔyJ•w9a°QO ðK±1_QS'‡³åŒ}¬j~êTã4ù}æ?ø:X|ûxYWlüTðh*3(8-û3*Kõ@Ë;¢EpðßþrÕÜsûø]NFGü-p ©'çýšc<1eÆ26áö2Ìù·ŽÿàŠ?²Ïìÿñg_ð¿ÄŸü}ø«áOÁRgø'ŸÂËxŸá×Âøÿ~x7ãóüOñæ»®ü&øÇcñG\ðž—ñCÃþ_xkÿ ìu›ßë^2mgCƒÅ…| ÏüHÿ‚YÿÁ9gO iz×í+ûW|KøS¦üZøûÿøYð¿Å·‘xƒ^½ð‡ÿdߌ:ÿÀ‡šÂï…ÿ²¯Å o:ΣâGñ/ÅKCã'ìc‡¼Mo¥|?Óuý þú>UÃ×ú³ÁðÎm‹XèÓža1%kþý¿à‹?ðI«}?á_¿ø[ᧈ ÏÃ> T¡zü/Œ¡‹æÄÓúµ<㈫©ÖÁ¬¶®&*òͰôå:8Lã,ÅNUcF”£Št°ó¯^…zt®y‡Á¾LΔéÚ”•YapÚ…g^å*V”—=\&”T\ä%9Â6z$ðr¾²ü·ìaát;³ñ+ÁÙ^‚C~ÍÊp~~¸+€+‰’ Çü¥«žOìgáqÛþJOƒ3ÛÙÈq×9Æ1ó`‡ óïìûøáí!ÿUðçÅ/ø…û9|(ýà¥Vßü[ñ+Âúž§ã/øf_Œø}uã/„¼Kð¿\ðÅïÚÃ.‘qñ'ÁžÖáçŠõv/á¨âfðÈ¥û*ÿÁ1f?Ú[áÀïÚ õ¿Žþ𾿬~ÛsøóöÔüwðúûöœý ´ž¸ñ¿Â}/þ ßáæø;¦iß´6¯¢i·:o‚þ8ëšÎ™áË;¿ˆ‹¬<5áÏÃkmmi­nðwñ5kðÎ+êtc…äÅÒÎsÚЫW—ã3áý•<éÖ…hSÀÖ£5(òCju'NÓpÆžmÅÕÃ2¤êÔöœÔe„ÁBQ,FêsK É(I×§8Ù©:w”S\¬úV?ø93Wsÿ&iá£;˜|Fðkc ÏŒ/ìåÔª9PÅGÊK²*»&Œðqî°ÄýŽ|.œsñÁÜ`!-û9¢œå¸fVP¸eWYÒÎÏø*‚~|>ðüªÃÀ_[Àÿð¿‹ôo¿ü{â utsªü,ð–‰ñæÇÇžþÕÐßT¾ÿ„“RñçÀ¯|1ºÿ„rúÞ? ëKà߉>*k76Òøu5¿Áu­i>Þ_ᆎ ‡ ã0ñÆT­N•9fÜGˆþ j”J•pÙ¥jtiÔönQ•yQÑòÊ1voļK…«V’ÍiTt£ JK —Ãã„'ËÕÂÆSœy’jš©¢º²\Ëúðq¶¯ßö<ð¸úüBðo·ý[·×®:sŒ>ÉWþ1ÕØÿ }áq€I#âƒ+62?g~¤#c ‚Xª«”øgöòÔ4Ù³á·ìAð«àïÃ_¾ðÇÆŸø&¯Ào‹µMoö{øñâOˆ>$üf›â4ÿ<_ÆOˆß|Yñ{Ãú½ó¤ áù<5ã/Ãc¦Áà(<1o¥iÉeõG?à_ßÇ¿´GÀ/|Hø·áÿ‰¿²¿ÅŸø'7ÂßüTñeσ¼gà?ŠƒöãÕ|+àÏëÞø?£xCÀ¾ ø[ÿ ÿÄ>1³ñ&¦jŸþ)cFÑî|1{©Ø_jø»EñøIC †Åæ3W ‡Ç}bxIG:âLMHápù¦&–'Nž> ‹y†i—PTpóÆM}iUÖEJ]±Íø®¤êÒ¡™F­J¤ª§„ËéÅÕ©…«ŒTéJX~Ø|."\óÞ—-”çN2ôÈ¿àâMbN¿²…”ç ¿ðŸx@•Õ2sû;(ýáÃÚQ–B†;³ÛðpÞ¬xÿ†Gð¿lÿÅy೎@ÿ£}Ï\õ§ û=³áßìGð+ãGìÿkûx÷â¿Ã¯†^ÿ‚à|cøaâÿø¯Åþ ø“㯀¿²7ÄÍgÄÿ†®t…ÿ ¼;àóãÍ Àš>¦j:Ž€õBç]ºÔügkk…áüý«þþÈ´øO©þÊ¿5oˆú‡ˆ4ŸCñsÁ‰ñljlþkº.»øWQÐ~(øÓöxý—&ñ¦‘ã j1¼Ú,_´»ÏëÞÖ¡»×µý?XÑ'²Ï&à¿ óœu\>ÌhׄäÕ³.$ÄP¥†šÄ¼#‰¡™K‚xÕÆF•:•eÔ¥2«í«Ð…HÆç¨µÕ<]ã€:~“¦KW¼ÕoìüUðÓÁ? þ(xNÂkm+Ã>8Ó®íõMcUóxX°ùypv"8§—âjBy÷B8k—g8ü¾­ITÄÓ–&¶"Y&/éá)ÔÃC–Uþºéý]bºå˜qJ–6Î þ¦ñâã‚Ëeíëa18,>"Q¤Õ(SXÚUªÉT–ö1—´ö^~¿ðp®@Ýû(xYO±ão¼€NOÀ8òUO0R$¼Áur2e û|y8ÇüÐ!Ç'ž0 …­ûY~È_²ÏÄø(‡íàÀ)øEà¿ÙOöWñí1ã¯ü)×~xGÂßÇþüÕ¼-àŸ…~³ø64Ÿ€ÂëUñlÚ—üI¬Úümÿ„§PP½Ót/ Ýj&ÁêßðNØÿÁ? |}ûDüCñÏí%¥|)Òfßø'Ïí;¢x_ÁmðÃÆ_¼=¢~Õþ;ñƒ<}ðãTÕ5Í á÷‡ü:oØ´xJÚßãgÄo„Õ<7âßøwÅ:WÄÝľ!ÓSÆxOáGÃÏxÓáέhž»|/ màÏ òü~mCÂ8úx ž¤(â³*YŸWÃÆµL.IЧN§.b£ VŽwJ! µjÉá±R­N…?«Ê¾óž*¯G:ÆUñªS¥„–-…WNq´§8óa¯(Óú„åRR„"•J1§:’öŠ—\?à¼:¹Æe¯ û›|þÏýP~Ÿ1<àà|Àá-Gÿ×ր߲÷…£é¼·‹<òráºü•1¶y³T”ÇSÂþý˜¼7áÏø#wŠ~|0ñM¶¹ñ#öÇø¡ÿÄ‹ëï‡Þñ®£à¿þÝÓ¼,hk áÖ³yñOÅŸ¦°ÐtA£xûÁšOuC©Ë§.½¡MoÚkßðOƒµÏí'â¯i>$ø›ðÌø³þ {ûO~Î_ôÍKYð—¿á!ÿ„;À¾>ý õ?ü7½ƒÀþ?[[o x‡Â>ñ-·ÅŸì4ñ¯Ï®ëoá[½Äœ/†ü*¡*³Çð–7‚£áÔÅÔγÊÒRÊ3v]UK C5uÓËëºo—ÚF¢ös¤©òWŸOöÔ„V7£_?©(QŽþ»†Ãâ!jµ0±§x,E5+Ú.>ôdä%ŠŸð\­]—'öbðÂàÀøŸÁÀŽ ø›ˆÁ°A ´¤%ð\mXœÃ2x_ÜÿÂQàÃ2âÇdsž `Œ/•æ ?`Ù§ÇŸü-ûG™þ:i¼Eû~Ø_ÿáUˆŸï¼i§xËöLøá,|Y´íãÃ^>Ñ  ¼u©J¾Xôï]ü&ðæ³¥hÚƒiE¦—'ö¾§­iS…ü&U>¯K†±•1OG)*™¶yJšÌªæôrYáªÖŽm[–8l\êN½jp«EУRXz˜™ÊŒ*aK4ã•J™¥Ñú´ñŽQÂà'?ªÃ,tjÆNþÖŒ`©Ó“…E9Æ5U4§*z±Áoµyyÿ†gð²ßñSø7+N>o¨¤à~ppÎUVc øÿà¶ËŒ·ìÕátÆwgÄ~È`¡€Áø¿{æÁà€ð¯æ$_%þÊ_³‡†¿jK¤øÇûDG¤ø7À¿h/„ß³W„~Ç?µ¯Ø×Âõ |'›ö‡ý£þ|fý¡ü+.µâ_‚1~Ñ6þ8Óõ¯k²ß„þÞj÷Ñx«MøMñGáß‚üi­øê³Þ $§-5_|;º–ïM¶óçÃ>PËèæ8ž¯F•|â¦[Ï?Î=¤0´0Ë_2¯ÿ ЍQÃ)T©:œ³.ª©V)tÃ4âʕ熥›B¥H`iâ›Y~•Ö©R4iá¡þÈœêN«Œa&¡t§>NX;q±ÿÁeu—oÙÓÂè:ë¾ÎâªÀß!²Ø'Õ\È‘N?à±ú¹ëû$é¾ øI'²¶ÑxCý¾jµïÚ‹ã¯Âï‹~Ó>hMâ?þ×zÃëgâ7ƒÙþÎ^#ñFáé5¿†úGÃÈ´ß~ÿB—PÔ´ïëŸô=&Âò Ú>—™ëcð¡SöÕøwJŒå›º3Y®{RUðù5lÍb±Q„s5ÉEarŒv+’«§Šj“£ <ê·¶¸æ\dä©Ã4¥R¢Ž ÔÕ2ø*u1ÔðR£EÉá-)û\v‹”¨®oi*±„j{*ÑÿÁXµ—8?¼.9èø8í‚‚C|Fê@*Ãkm)sök‹ÿYÕÈøápqóbÿÁŒÆHÏü*0Hàà•2Bá¶ðŸ±ÁwðŒ:6¡ñ7Oø€¿ðO}#öߟÄÚ—‰|'ªx8êÑK`uχqø×áÖ…­Ã§êI¢º_ˆ¦øƒö­K‹¸ÑuÕÒš¿3#m •\)à|0§jà.p¸ý×·–xážn«<&C]<=E ‘«šg“ŒÔ½HÛ5šp›„ÒMª‰Áó ÁËÉÆñ?`]%[2…«EÊL¾Ir¸sAßš”T¡v”¡ªå›qvývðU][¿ÀÏ û~ð_õøH¿íg8Æ0q‰<»ÑÁR5™1ŸÞRHÜ>ÕàæØ *å±ð“ƒËä6²íb».M·ä"Œv¯N=?ÙLtÉû¸+ü;?q¹j˜Ø<¦]¬§oÞÙûÈù“÷ ’vr0»]:ÇäcMõ%á?(¦²]·ÿ3|ókEÿÐÏ»{_סÍ.4âU¬É'§üÁeýâºáWåÛÉ?Öµÿ‚žêäß<,ì\ø1”€ÇáBç@ʯL¸m²ø)Ö®züð¸õÌþ È#¿Â;ãÔà+”ü©AµTmTÚ m^cO•†ÕùÓ p˜8\~îu#åÆ1ׂ¼·9ع鎣'+³0L|(à{äRø’ÿ‘¾yßþÆ«ë¦ü±5âgË|Ë¥ßû_ýÞØ7úz»iú·ü¿Y‘‚ŸƒBJ‚ ø?+–*rÂ…é¶CÁ$ù‚*\5½Ôÿ‚’jî?|.៨l)o…ˆX`‘»hÁ0_ÊûDĈ<¶\4+/θ”ýãödÜ>NŸ6ÓvÇäïÓö¡P0~UQ‚»B~í>DýÌyN3£ ¹p›vGŒü*à4Õ²9koù›güñz|íýáÏ8™7lÊÖåÿ˜,¿ªWÿ˜GÛºÛ¥´ý<ÿ‡jýþø\zÿÈ™ìõø\~CÁ#ÈÚû,ÇÿÖ$Á?¼,£‚Ç ùT³®ì·ÂåSþ­Ï,Á.ȱ\µ¿æ(ìW=9\yœƒ°|Ãü˽WnaÒ·\m;m ÛˆÆÌ<¿¼Ï“~ç#Ì]Ko‹ìþf›OžQ¿ö¯{ÈÛ<ÿç’ýzè¶V¸Ï‰lŸö’Ûþ€²þÑzÿ²ÿò?;]~›EÿÖdo„¾Aß1ø;9Û ø`™S¹ùÈ+µC*ÈdŽ)‡üW9ÿ‹Qá~3ŸÜø3ŒpqðÐòBŸnä€ ›öÉ´gË Œ°Ã®cƒåAäC˜ÛnOM›#bmò-ï׃ÀnÜ•ÎÊyã ñ€#ï.?ñ 8™¯ì9ZéÈÛ;ÿç“þ¯¢ÕÆñ3’_ÚJ×ÿ ,¿ôÂ>Ëîß©ú7íù«ÈN~øYB‘¸ù áNó[áª&à#rU™6€YÊGÄ_öíÖ_¾x];lü¸dFA¾®U·¹À*‰$ó’Î[a†cµFÖS“ò„âS½[dxs³,<ض2f'íÖé€?tW}á󌭷OôhÿvÛr«òùj‰È|¿&Îjx[À‘vY$–±_ò6κ¥ù™?ë¢èTã^&ùs$¬—üÁeÛÙÔ+òí²Ó¡ú?nXõøgáaÇ?è~ #8Îü[®}À÷Ç8™?n-]Ï? ü0ª2]…‡ƒX®ŒF?á]»ln@,«Á.è‰#§À‹Æ8ê…ùG‡1ÅÈ »k›¾p2cÂNç—2 »•·¦ÐŒÞd[|ëi^ð+‹Ø’ºÛþs¿þxï÷½ýÝÔ\8Ó‰š×2éÿ@Y—ýByv[lí§ßñ~Úš¼„ŹðºýàOöoƒŽ ”¯ÃÅæ.0Å]JmuWK”¶°?lÝ\ãþ-ç…ǯüK<ÁùzgáðÈäòqŒ`€wøbÕy/Bã!qŒ4+ƒû•Æ6mÛ˜ö”ÛåEäùvŠŽŒÂp>Eàã=°F01„Íø_Àɵý‰-ÿ™®uýßú˜y¾Þ ¿×n'ºÿ…>¯þ`²î[þ`ü¼öÝZëí¥ý²5v$½ð¸ 1#û/ÁÇUœŽ>Êyà¬B‡+~?ÚëXrAð…”©ù±¤x=‚0&Oü[ðTà9!Õv•ØÄ4w_eø~1Ë ½N6ä®"ãýKçÉl `Ñíó"ݶ\v¶p«Ÿ¿3³ðN̸Ù×B¹ìû4Å? 8ZÙ,–ßó5λùæ?£ô[-q2µ³.ßó—ÿ2Zÿ²vKùvû=>ÎµŽ®y>ð¸íÿ og¶8>uÎqŒ|Ø!Â<~ÕÚ¹ÿ™Âã×þ$¾ qž¿ð‚ýq:dã ·äE6óéÏðÿ²¼sÓh|›q è8û¸Àì2ËÓîL»€?‡I†<÷Ée²ÿ™®uÙ?úy÷ù5âgË|Ëú‚ËûG¶úï§»ö~Ô˧Á^8lh^ `ª[hcŸ)ÏÊùVU(Ãk•1Ý}šâþÒºÁ·ƒ¼.§#þÿÁÿ„ duÁ!Ṅ òt †Ëk†Â•?z~r<•å¶a×d{å—Ùñ¦k¢áTl €Ð2xÉ_”cåápá6⟆|¿±¥Óþf™Ï÷êaæÿàèÙþºñ7ý —Où‚Ëû/ú„òÿ†µ—ÓÃö“Õ»øGÂÀ÷ÿŠÁdü²Ç¿aïŒ6Û°þÐṲ́á/ ¡ÈÞ†¼ò!$Ÿ($“ )qU[†¶ùppc°è?Aǃ§A“jÍ0Ê<¹ÖSµ×˜ÿÒnfû2ïo“kr6˜Õ÷GäïÓ”¼3à• ¬šWÓþf™ÏV—\Åw}ÏeO8›þ†]üÁeý£ÿP¯m´¿Ò©ñïW`¤øcÂà¤øF|ò“Œýï+pr>eVãæU!ÄrŽú¹ëᯠßþ)g¦zŒ÷úcœÁ~~„a#q…A€0F1妯1åÇ‚ÙͰYAŽØÀëŒ0àtù=9ôÇlb<ãá¯6ï“KEÿCLãû»ÿ‡›ß—Ñn¦\c?ñIx;„“¿ÂQ‘‚Ì9^6á¶ºÌø µÁòÂl9Ì«Ÿ'qÌŸèɽ×gÏó *3n‹Éßa¹n»WîíÁC÷v„„d">\´m+·÷^_•i3ðÛ‚ã¶O%¢ÿ™žqÕǾ`»¿ø!.5âe'lÊÉÔ_m×ýB>ß̶éºú@ñ‡ÃAµz›>~ܱgÆhÿ¾þ×ß²÷ň>"þÐÿ„À¿¾?ü(ñ·Œµßì*û]Õ±ü1á¯êzÞ§ý™¢i𖱍}ŠÆ±iZ}ö¡såZZO4Šñö7q?)ÁðÆY_ „†P©‰Çq,ë?¬`pØ™ûIQÏhÓÒ¥i¨òÓ ¢Úr¤ðßö¦s“a3N}˜Ò¯^x¥8PÃdq¤• e|<9#W'«5xRƒ—4åy¶Õ•¢¾§Òþ$ëzß Kí`Ø ûS[¼Ytš:ŒºåŽ›ag«jzu–™®hzŸ]öÿˆ¿ôø_ÿƒOŸüE~~×_òEÿà¿_öbÿõ–ÿmÊø÷öàÿ‚ÿÁ(þþÅŸµ÷ů‡_²·ü#¿~~Ëßþ"øÄð¼i [û Æ^ øQâßøcXþÊ×~0jz&§ý™­é–7¿ÙúÆ›¨iW¾GÙµ »If‚OŸy¾V¹/Âù2猶+‰å¬£ï~%’æVÜöÖYŽwÿŒ‡6ѵü moú‘¾ß—cúDÓþ/_êßu߃ºU¯ÃSâ'†<7 x·Äz›kð¶úßBмQ‹çÐîuoZèòøjÂêòÓÀž&¿}&çXW²Óm,u;û[ w@¹Ôûÿ·üEÿ Âÿü| ÿâ+óçöyÿ”ŠþÙöEþÿê¦ý¡«òãþ ñÇöªømûU|CÑÿàš>=øÙñ“âä¿ô½Göåø!¤ø2Ïö–øsû'ü9K5 ?hO‚~ ø‰ñ“á·†|ûkëß|7ý޼!¨kZía¡iqüEøð¯NÔ4Æ_},~+)Âá²:Ô¸c'sÌòª˜úþÓÄü”êÃ6Ìð 4ùx8Ótpt¥ï¹ÉÖ”Ú’Œ£pàðÙŽ#šÒžš(às xJ<˜l…Jtå–e¸×*—Édœý¦.¤SŠ„U8ÓN.Q”¥ýøçã-ÏÃOÀÚ'‹ãøia¬üI×õ/ ø'H±‡áWˆ5MwWÑü-¯xÓVH¬<9¤j×v–o‡<5ªÞÞëZŒVz-µÀÓ´©µÕõÍÃQþBය֥­~Ý:üšÏœ¶? ~XéöÑCoga§Yg]Þµž›§YEoa§ZÉ{}¨MoemSj7×Ú„¨÷—·SËú×á][àæ»aÿ˜Ö>|lñ·íðQºøåwá/ÿþ$x§âÇÄoˆÞoÀoˆ^×¼ã/Éÿ 7ü&ßð“lØø«ÂZžŸá¿øW:íÿë?xO𭧃t/Èø-üŸ7Š?ìŸü;ÿÓ+W>.8*ù^U˜á²Ì6[[ŽÏpuá…¯™Õ§Rž–ES)G2Çãç ‘–;¤éNš”e(·άÅQ̳ |~#J–*ÅR–&–)ÔÅVÍéVQ–ƒŒ¡(àè4ªBr‹‹´’“Gìü“ö}ý·þ&ükýƒ¾5~Ã^ ‹Äß¿f–ñŒÿ¶çñÂ}* øƒTð¯ìýyàÛ©tŸ‹ ÑôŸÇ{7„õÍö°Ùjöð-‘ŒvÆæÈÏòˆý ¿àë 0l¼8ÇÔØþÀ™?÷Ϊ·{ó“_Óo‹ÿä-iÿb¿ÿõ ðý~Jê¿ðQO²~Øþ<ý•~Ñûx?þ/Ÿ ¾}›ãWíÕÿ §öøƒÿ 7áoÁo‰ÿð‘|&ýšá¯9»B|Ó—½)ZÉÙ~,þÕŸ ÿàâ?ÛoÀmðãö™øWá߈ž†9•^"ý<y¡Ï6·á}zæëO»ð7<8×Ý]xCJ¶•5¤Õ­£´’ðZÁks,Wvþ ¤~Ä¿ðpN¥ü:ÐôßþÓú^‡ðˆØ¯ÂÃöäð…®“ð¹4¿ k¿tÏøW–¿ µða±ø{â-{À¶cÃpé‹iàýsSðů‘£jwV–ŸÐÿÀø)W|yáïø³âûU¥×¾Ûüð¿ìåð¯öý¡¼e⿇>3ý‰?cÚsÄ~7_x+á5çÆ}wÁ>ñí<¾¼ø§­ü øM¡hšWˆ¾øsÇžðgÄiÚ^¿úOá¯øsÆžðÿŒ|â Åžñf‰¥x—ÂÞ)ðÖ«a®øsľ×l Õ4?x\ÒçºÓ5YÓ.­u+UÓ®®l5 ˜.í'šÞhäo¢ÃxãŸåøE€Âpa°j­JñÃSÉs‡…ZÔ£J´éÒyÓ§ U§ ¼‘\þ÷=ܤßN ÁV›©S4ÎêU’ŒeVXÊ«(ÇX)TxNi(èãÌß-¢•’IÞÿ‚pÿÁo<Ÿ ÁºÆÂ_/ÁqáÚÛᮃÿ „|IóGÄqð¼é,‡€SÇÿi¼ÿ„Í|$º0ñH¹›ûq.ÄÎ©Ðøëöÿ‚íüR±ñ^™ñ9¿hˆºwt_øoÇ:ŽÿlŸx¾ÃÆ^ðˆuø@ñ]§ˆ>;êxEðW‹ÿ…ÿ —еïøCuï²èZ øû"oûL]àÛ—Âr|*ð—ÄŠ×? µ«‰zߌáf—ûø»ãOü^ÃÇžð,Ú>‡âïi’|ý™¼5ã–Ñ<ãE¼ ñ[°øoª|?ðˆõ?h!ø…oâïˆ'…£ë^?ñc¨±êçʪ›qªòŒÅÕŒý»Å·ms§õ™Ktÿ'ZþÓÞXÇòȧ˜g<­+ÃëXu¹œV /á¥I/äJ$—á—ìÁðwþ ›û3|OñÏÆ”ø¬|jø¡ñXøc¯x£Åÿ¿mO˨ëwßàÖ­<­~~Û ´ÏŒ:E¾›¨Zh’xoã¿ÄßÁáí:ÛÚFŸ¤hZ—ˆìu/-Ó?eø/Î…âˆþ'ð¦µñóáæ§ñwâo‹¾1üG¶øWûZ|4øUáÿ|OñíÜWÞ0ñµ÷„þ|bð—…aÖuÉà·Šy,4K8¢±²ÓtÛ8lôÍ;N±Ó¿feø*=·Æ ŸÙCÁŸ¼ ö~Ð?ôx—Zø!á/ô¯|O¼øÿðøÁ?†üeàÝ+áˆ?áYø'Wÿ†í]@üIÖþ&x§á'ÃøKÁ¯ãÏ‹ƒÆÞ>ñ„>þ¼Wüp∯ˆŸ ðC­Š¥‡£VSʳJ‘t0‘<=têg“¥F(Â*4¨Âœ,$âåJ:¾ ÀÊà³,åBœªN 8œ4=i)Ôœ¥”å7¼¦äÒm&“hþ1<7û Áq¼â ž~ñW…¾iŸü3âo~Ø>ÑöÞÞêÓJ†x¢xþ…ý‘þÁf¿d?ˆ~)x_ös_ˆž;ø™ã/ øÿÅÚïÄ_ÚãÅZcx‹Å¾ÕüUâ«xçLø5ûfü#Ѿ1k^*Ôoë¿>/#\x§K¿Ñ¾þÎß=ø[ð÷öy¶øƒ¥¤»ý¢|#à¯x·Eð—ˆþè>"øaiã/ø3âÄ–ø=áM1>:ñ67 ˆÂ×á¾ ]:t±§–æÔeZ•*ª¬)Ît3Úu8Õ‡7'7&÷¥ª¥Áy} Â¥<Ã7S§'*r–# 5 Ê<®QSÁ8©8»^×Úß mø¬þÇð\OxÿMø£¨Çñ~ËÇzŒ>-x÷ÂZ÷‡i¿…~ox³ã¶·©ø‹ã&«ðÛMðÅ} Gøl¿õ­kW¿ñ–Ÿà?ÃZnµö÷·»±6Œ––tcýˆà¶qëþñZIñÞ?øXø‹âx•?kŸx+_ø½}{©|Y×<#¬¯ÆÅÔ|7«üRÔµ-OPø‰©h×67¾5½Ôo.¼I6£=ÜÎ?¨Ï ~Õÿ³Ï5è¾ø¡¢x²ãÅŸt¯ƒ^¿ðÕ¦·®øsÄ¿5ßÙ’Û#CÓ¼?âÝ/Kºð¶³¢k?³UկŠ+ƺv³sà}FÂæ ÓÄsxºhü>Þ¡ðÓâ/ƒ~0|9ðů‡ZÇü$_¾(ø'¿| âìýWIþÝðo´+øcXþÊ×ltÍoLþÓÑ5;ßìýcMÓõ[/?ìÚ…¥ÜSA^<ñ<K†¸&19RŒ±³Ò¨«)ÓŠþØ\´ê,F%J Ü’¯]4ÕYÞ?Ô|¶÷yŽrÝÔñtr‹¦ÔŸû&²N6¥ºäƒM8ÆßÇÝïü‹þ ã¬|6ð÷ÁkÁŸuOƒÞÖ.øKXøs§ø›âç¾ø›PÓ~üløið¯Iñ—Äo‚õ]'àŸÅ ø7âæ«§ø*çž><ñ\&êLJx65W_Ú¬£2Söò^õ~uœ){i)>j—æ’“»išÿ¨ùc#Ì3‡f©ò¼V¥M5h(ýRÊ ÉrÛ•ZÖ?žþÊßð[ x‡öƒñ ðg‹ôx=|[û^øsħÂ~:ðÜ· áïxiµŒwŸØ~-ÐÖîðèž"Ò–±¤›ËìûÛ?´bÓâì;ÿnøÜt#ñ§Lø±ñ{þí/øFÿáh~Òþñÿü#ßÛGO:Ïöü%5oì¡«diÚ_`ßo:nšn„Ÿbµß¼¶ÿðP_„Z·ÆŸ ¼7áÿŠ:õ¿Æ­ãJ^_Eð[ãõŸÄ„¿>ø³öbÐôï|jø#uð}~$üÑ<[áÏÚ_Cøƒ7ÄÏÚoÂÿø_ÀñøÅ—Ú…÷„~-x;ćï*Î;q= Ò.àʤ§ìeO(Ì)Ê—´¼j:N9•75ÍòµÌœ”®˜¥ÀÙeE%,Ã9š›:–+(Ï—•ÁM<RQ²q½ùl¬î•¿•¯~ËðZoÿÂ7ÿ ψ¿h/Ââ­#Ǿ>-ý®<=âOøE9q*Tåà˜ª*n—&OŽNš“J£¦£›ÞÍûü¼·»¾åK‚ré))fYÓæ²•ñ”/+YÅI¼'½m,íÒÖ?ídø+µ¥×Ã{ûiþ3Ú_üÒot„W–ßµ…c¹øU¡êz%§†u=áÅÌã›Á:>¡á« /Þé¾:MÞ‡gg¤Ï°·‚ÚÛ?^ý‹?à«>+?á*Óþ*x“þÑð¡ø«ý¿ûGø+Z?€þÏÿ?ü,íŠ×ð™}šøE?á#þÑ>AýŽ,¼¨Ä³Ÿ?à  &ðÎ?Àísþ/j¿?dßhïãï†?üà߉¿ >8~×ßÿg|TøâÏèðÏíàÃ?týWFø±ðCÄ¿þi¯Œ¾xƒ\Ôµ_ üAð}ŸŒ>‡ý‘~-xãïìŸû0üvñ–‰¦ø»ãWìóðWâ׊tï [_ÙørÃÄþxkÆ:å—‡í5MKYÔítK]OYºƒJ¶Ôu}Vþ àŠïR¾¸Y.¥qñ׊iµQpÿBQ´#%•fœTk¬\Rk7RIbRĤ–#÷É{Ox•ÀÙe¬ó æIÝÙâ°í;ÓT[ÿsµÝ+R¾î¡~T’þq4ø'ÇügþñW‚´_‡Þ*ÐüãÓ øCIøÛðÎÃÃ1>Ô®5 7‹t+/ˆé~&jSI¨è'X´¼þÇÔeûvœÖ·OçÚ{'¯Ù?þ 'ðsá§Ç†Þ ýŸ|+cÿ áo øÅ~<><øqÄ ø+D×Û^×¼!àé?tŸìŸ |Lòìô_Š>Ôtý_Jñ–§išmÝ¥¸´ŠX?uÿjOÚß²ÏÂ&øËãÑ#ðŽñGöðŠuø²ÃÀþð‡‡>5|~øeðS\ø…âj–wºf™¢|7Ó>!]xûU]DXØ_ØxnãL»Öü=oy&»§|ñ ÿÁM¿e_üFø«á|MðOÅ¿ü7ðOÀ_Lñ¿ìëâÏÚs]ñ÷Äoúïí+oyð{Áÿ >xâ'¼Gão‡þ ýnþ)øƒLð•¿ŠuÛ‡:æ·ã}{þðO€uŸ^¼uâÌT'Ù U§:ô1#õ ×–¥|-L5J*rçIÎtç‡Ãr¹^ñ¥;Â<ª#ÀyU9ÆPÇfМaRœZÄa/ucR5#ðO–2J—µµœ¤š“æ?#|%ûÁQ|á™<à{‰þ ðtÞ)Ò|q7„ü)ûCø7ÃÞ—Æš¡áýWCñ|šñ>ÏKèÚ§…|7©iûZÿki·ÞÐnìî­î49ìïEûÿÁOÁ]Ö?ÿ… >7ÿ´/ƒäÙñŸ2“ñxñ0>(`ªŸ’ü~øŸñ§Ä?~'ø³öú°ø©ðÏÄŸ ~x/Æ?|?­ü3ðçì[­ø3_øaáo|(ñg…¾(xoâƒØkÖx{@ûËá×Ä_üXðnãïëÛ~Öÿ´!‚y´ýWDÕtíWDÕo¼?â_ xŸÃ^ ±Ò¼Màßx7ÄÚV±á/xź>‰ã/xËD×|ã Dñ6‰ªéVj^:ñJr”²朹ç7•æ<Ó›Š\Ó—ö¿½;$›~ö–nÉZ¿Ô\­ÅAcó~XÇ–)b°ÖŒV©E}NÉ.f앵zj=š¿ìÃÿPñ±«xÄ·Ÿ|Aâ/xûá~½¯k´‡†µ}oXøkª]\_jŸõ]V÷â|—º§µ+éæ½¿ðìòè·—Üϧ™d-ÚìÇÿLðÖµ¤x÷_ôxÀÖ ôwDý£ü9¥k'ÃM*î+í3áæ“©ØüR‚÷Nð.yo 凄l¦·Ð-.â‚âÛO†X¢koéŠÅxãÄŠÏý_àïgÉÉÉý•ää²//ö·*ŠŠQ²V¶¬£À™dd¦³ë™K™Këx{ó^÷ºÁ­o­÷½î•¿½àüAñŠ|a¤ø‡ãv“âßaÿÂoâ/ö›Ñìi¥7y$Ïç—ÇŸ³‡üãâ¦má¾#èzœ:Íž‡ãÏÚ@ñ†‘i¬[[_Y[jÖÚoˆ>&ßÙA©Áe¨ßÚC}1ÝEmwoÑÅs*ÇWNý–à£zwˆü!âëK_‰^*ø}á»øÄö¿ü+ˆ<àë+ CL´ðŸ„uˆ~"¦§áÏ ÛéÚ¶«§ÚhZ%Þ¦[XêwöÛÁìÂ?è’ŠPñˉiÒT!ð|(¥R*”r¼|iòÖŠ…hòG7QµX®ZŠÖšÒWZ ð&Xäæó æS|¾ûÅáÜýÇx>o©ó'¯}ת±ø•ñOá÷ü£âï¾ü1×ÿ‚~пÇÞ-ÑüCáï³x‹Âþ0ðÏ‚¼ñ›LÒ~øžÑmô]Å>ðæ¥ñgY>ñ_g¸ÕN¹azšœzÖ¯¬_ÚÝZ÷ŽÙÊ+Š—Œ9Õ Ð©K‡8>Ã,R Ö[™?fñ³¡£ã»Û뻿^é³Z\ø’êòæãZšêk‡š—Hø9ÿ,Ñuÿx«LñÆ-+Äþ3:CxÃÄzoí ¦ÙøƒÅMáëOìÝø“Y¶ø‹¡¯.‹¦¼Ú~Œu;™Î—c+ÚØ¥­¼«miû‹EtKÆÎ!š´²iÁÓwÊq®ôÝo¬:m<Õ§¬~ÿ–ÖöÍÕ·;r!ð&\Úk2ÎâÔ”ÓŽ3šš¦©)/ö7i*KÙ¦¬Õ?q{©%øocð'þ ¦ÛjöZ}÷Å ?xÂ?ˆšõ­—ÇmÚßZø«¦ë°øëV‚ˆ1E©øÊ-sEÑu˜¼Oz³kIªé:^¢—Ëyai5´¶_ÿà¡¶:_‹´+Kÿ‰öz'Ä CÄ:¿4{Žš4:Oµ_ÚýÅŸ‹´è¾ Oj^&³U´×oµ‹{»Z:„ÓDª ýâøœG­ò|ÒS•ò¼sæœy9dÿá[YGÙÖOÞ\±³\ªÊ<–FÖÌs§Ë|^Ú.÷Ký‹Dù¥t´|Îçáü?³ßíÞ¬¥ãñèÙà/øTêWã7‡ÈO…›¹ølñ²Å¿eSŸ*§‡Ah¶é¨kaÈ'ìWûL(ü3 …ñ—Ãý«Œø©ù)Ú½ Ç—ûßEi¸ªý–SÂôîÓ~ϘÚ׷7.n¯k»_Uwk]˜ÏÃÌž¥¹ñ¹Äí·6' +m·6 Ûeç¡ø0?bïÚXÍ5¯OøÛ¦]-ù[ñZÛöHý ct-ðø*‚|Wàfe åŽâºêîUÇÞù„[U¬u#ý”~>"¨>((ðVÔÂ*ìMºòer¹ÉUç UÚ©û+ECñË‹dîòîÒßó ™tõÍßß¿˜åáÖI'wŠÍzËü'M·À¿ëkY[ñÈ~Ê¿†?âƒÆ=EÀ#?ð’ø<²ü©UÙ¬F<·1’#j¤@".Ø`¶?füØãþ*OñÃpâxrIÆõ2þ°QQÿË/ìþÿÂL˧ýÕ¿®›+/ø‡9%ïõ¬×{ÿ ÿÌ?ðOʸ?fßIo¨Ã1â/ åp$;Ón´­½ˆA2 B¦&Ïe­ìíñσUpO'Ä>fòÁ]QG–æ"Qr»aP‘(H­O¨¥/ø®Nï/áî›a3.–·üÍŸoò¶/rIoŠÍv¶•ð=p/ü¼ÌÅýŸ>/ Å"Çö÷†tñ9éèp0pxífÙÿâÚ°'ÂEq’¬5ÿ –O–\`jå¤ÜScLbHŽÙmÿJ¨¤¼nâ´šþÏáíê1ÿç·àôòÑX^d‰Yb³]­­lÿ0Ûð·~‡çl~)ÆAo ¨Áqƹá®cÔÚD\P"Äq(Š«ð?â€ÇüSù xw»ÀƦ8;IíÐ`€Ÿ ´T?8©»ÿgðþÖÿtÌ|¿êk¦Ý ÿˆo‘ÿÐVk»ÇÁõiÿЗ_ò·À)ðGâp'>P68ë>8Ê8QŸíÉÜF;pÑà@MSFØ¸à µÉe@J„ b+°,COÒO†¾4UQýˆ«€Ñ©i.1Ÿµ”mùx^à'/ªè¨~3ñC×êþæ>_õ5ò_VñrOú Íð~¢Kþ€|¿¥d|´>xÌÿ`1Øj:Qéþš8ãÐvàq³NÛáÿŠãØ[H*êKĬû‰YAv*ª=D%Yck¤¨¡øÏÅ rýC ·–1]¿êkn‡ÿç$óšÿàüKÔ—õsÀ#ðG‰ÕQN–ÕQ{§mp8ÅÂÜ FƒîáXg_ø”Ì0:ý³OÈà1:úzöÇ=⊕ã/­°ÖÿuÌ<¿êi¦Ý-ß{1/25ªÅf»ßøø?þam¥ÜðÉû7E|ÆcÆÚØÊÙ†cÃ|=‰Æb(Ö¬ÞMÔThÂ…4áG>§IrÒ§{°íÌï&Ûöð<8òÜ-< <Î(a¨ºŽ% –¢ƒ«VuªZu²j•5Z’—½7kÙZ)%ùˆÿ²wí_wÿ Äë_´ÁßÃE迼/ñjÛÅŸ²†âMÅ>øw üOðÍ—„ï¼)«üsºð}߇|I¡üW×´ïiÚ‡‡ï“[´Ó´{`Ö–ï¯E®üÓÿ~ÑèBÿ‚tâ«?foþjë÷FŠâÿX0ôJðöɉ6Z%ÿ%Éh—C«û+ÿEsÿ‚rþqŸ|0øûL|9ñ_Ç/ŠsüoðG‰¾2üaðw‚¼cã+¿‚1é¾ðŸ„ôÏø~]RX|bø‹W›Ãþ?½ƒHe×4-/LÕt+SÕô¿ÚGIÔÿ £þ ÿGðÿÿWÃ_üùëïª+jÜQCO J· ðíJx<°¸X¹q öT%‰ÄbÝ4ãÄ É|ÿ…eã¯ÚWÆ¿ð‘mÿÃCülÐ~0ÿfdfÿÂý‰û9|øÿïÛ?´ïÿá ûOü(ÏøKµþÉ¢y?ð”`ÿfKý‰ý³«ùçí«ãO¿e_…_¾"èÿ o¾4lèšç‰u¿éßm--<û?Z|@³’?ÞêÞš[‰fðôÚZ=¾¿aQê²Ý\E|Ö¶ð?þÏíÍÿG½ðÿÿEÿçÕ^¡fÛ©ó¹;56ì¦Ö¼°’^ô[éæz‰è´nÉvìŸV»Ÿ hðEÏxkÂ,.¼eû<üjñwÃ}Ã^Ðâý«cË¿—Ö²?ì/û1ø§X‹àìŸü©ØüQÔµ?ØKÁÞ3ðw­>&Çaà¿ üKø“ðÏQðŒî/´¿iß² < ¥|.øsà†zßhÑ>x'¾ÑçþÂðo…üý+Â:‡‡ôù¿áøuáü>ðï›i§ÂÿØ^ðg„|¤îû†<1 h–ö:U§Êÿð¦noú=ï‡ÿøˆ:/ÿ>ª?áLþÜßô{ßÿñt_þ}TKÞ²•znÛ{µåHkM¢ÿNþG¬~ÔŸ¼Gñ÷áxÁÞ7Ñ>ø»Mø£û?üZð·‹¼Kà‹ÿˆþ°ñìýñûá—ǽËÄ ÒüsðÓS×ôMSøikáíVÛNñ߆/à°Õn/m5%¸¶Ž)|OVýž?k gÄ~øÅuûF~Ï1þÑ_4O‹ÿ 4?Aû%|I_‚×_¾5_üñOŠt-Wá Ÿ¶t¾9Ÿâ‡Ž~x;PðÿÄ‹O6>µðž¥â_ j?µ]bóKñ–©ÿ göæÿ£Þøÿˆƒ¢ÿóê¯(øý¤þÜßgßÚã·ü6Ãÿ‡ýŸþ8|tÿ„[þSEÑ?á*ÿ…3ð¯Å¿?áþÜÿ…µ«ÿaÿÂIÿ·ö'ößöF±ýöïí/ìSì¿`¸qÜa´›r²N57•£kº[=®Âo«OO5Ó]®rÿ³üOIJž¯ð«Å~øù¢k¾.ð‰àýÏ‹~ ßÝxsÄß¡ý™?àŸß³çÅ Gдo‹ú.§áoŠ>,ÔÿàŸñÇ€~$^ø›ÅžøsaãÏxCÄ?¾)Ü[h¾.´ý]®þ#öæÿ¤ˆü?ÿÄÑú!¨ÿ†ý¹¿é"?ÿñô_þˆjÞXJòw”é·¶í~PBSŠÙ?ëNþGŽ~ÖŸ²Ïƒk‡:/ÿ]gÚi6Óu×½ò5[¿µø7ÄZ‰>üzð/Ù´¯øjX?áuþÌ_¾7üÿ„œ_Kªü8ÿ…£ÿ GÁ°ÁñÁ>Ô¬>Cøíÿ½ðçÆ/‹¾<øáu¨~Ï>:ñwŠþ(øÃÆšƒ¿jßÙNÃöœø-á_|@øûüñM¤_äø·ð¿S½ø£m©þžñƒ¾*ZxÓE°ðï„þ üIð£ðóÄ—¦—ã='ôþ#öæÿ¤ˆü?ÿÄÑú!¨ÿ†ý¹¿é"?ÿñô_þˆj#…ÄGiÓVºZÉèíu¬:Ûú»xö}útùùŸz¯ü÷áÊÂy}àÏÂ-âk¯‚ ¼!ð[Äÿð‚èP›ý >–›Jý¤ÿáðïß„~&þÐÔ?cØPÿ… £|:ðÁ þ;ûÃ^Ò|3ñ¿âÎ…­~†|4øuà߃ÿ|ð—áÖÿïÃï…Þ ð¯Ã¯øûCUÕ¿°¼à ÃÃ^ÑÿµuÛíO[Ôÿ³4M2ÆËûCXÔµ V÷ÈûN¡}ww,ÓÉ_þ#öæÿ¤ˆü?ÿÄÑú!¨ÿ†ý¹¿é"?ÿñô_þˆj¼•œé´º^VÚßÉÛõîÞ=ŸÜ¿Ìä¾?|ÿ…çà]Á_ð‘Â/ý‰ñ³öjøÃý§ý‘ý·öŸøgÚ7áWÇÿøG~Çý§¤y?ð˜²ÿ„Kû_írÿÂ?ý·ý½ý™­ÿfÿc_ñ?>üFñ—Äo†_> üLðOÃ_‹Ÿ |ñ[áe¥ßÅ?…:ïÆ‡:¯ÃŸŒúïÂøÖÞãÁ^ø½ðÄÖÞ6¶ñ7À†òx_ÅüH“BÒ´)Çÿ çqýŸwðëûKÂÞ*ÿ†Ôý¼>þÜ?ð„|Nðçü'VðüÓ¿áSÿ€øëð³ûOCÿ†Žø9ã¿èßð”|'þØòbýÿ†ý¹¿é"?ÿñô_þˆj?á‚?noúHÃÿüAýÿ¢«ê¸ùéï}Þöå¿ÁÛOÇqsdzÓþïäÎÙ³þ ·â?ÙŸâ< ñöy𗋯>(üDÕµÿ|#ý’/þþÏ6¾1xö7ðŸÅ|7ø=£~ÑƧà/Š:ƧûøÅÚÅû߈ž0ðž—­øãâ\Þ!øã+gE¼ðÿêíp?ðÁ·7ý$Gáÿþ þ‹ÿÑ Gü0GíÍÿIøÿˆ?¢ÿôCR–¼å:mí»_”Ôâ¶OúÓ¿‘É|aÐhÝoþßøP~ ü2û7ö¿ü%¿ð¸~øëãŸößý™ýƒÿïü!_´¯ìñÿ¿öo•¬ÿkÿiÿÂ_ý·öý3ìðÿd]ÿmü…ðçþ ÅáÏ…µŸ>ø¥­Ëáý¡¿`ß>Ô|Ká« WÄzG‡?ao þÂÞÐüâ ½/Uðþ™âMoâ™ûÚϪøßNÒ<)a _üGž[OjVþŽ×Ä?uÃ~Üßô‘‡ÿøƒú/ÿD5ðÁ·7ý$Gáÿþ þ‹ÿÑ BÂWJÊtÖϯGuwÉwgµý6xö‡ùù•_ ?à~øC¤xsÃ~Õ¿gŸiŸµ¿Ùšx«ágìmðÿáÇÆŸøösý¦ÿgÿÚ"ý¨þ4ÁãM{Åßþ(øÊßöuðχ5/x|ø/‹h? J?f¯ƒßðϳ—À€ð‘Âaÿ 3àŸÂ¯ƒßð–ÿdÂ?ÿ Gü+/è> ÿ„‹ûûO[þÄþÛþÄþÓþÈþÙÕÿ³~Óö?í;ÿ'írõ¿ðÁ·7ý$Gáÿþ þ‹ÿÑ Gü0GíÍÿIøÿˆ?¢ÿôCQ,."_é½o»ÞÖ¾ìñÓG¢²ôûüŽKã÷Áïø^~Ð|ÿ ü"ÿØŸ?f¯Œ?ÚÙÛiÿ†xý£~|ÿ„wìÚzG“ÿ ‡ü+/øD¿µþ×/ü#ÿÛÛßÙšßöoö5ÿÈ_µgü«ÃŸ´÷Å]Wâî¹­|.Öµ;}övƒÁß>:ü°øõð4øàT?¶ÎuªüVøowãß\|NÑ5ïþÛ^)ŸÂþÒüQðòÿÀ_>øâž%ñv™£àkŸº¿á‚?noúHÃÿüAýÿ¢ø`Û›þ’#ðÿÿEÿ膡a+ÇiÓ[õ—[_ìy/é°çgø™ù®Á8þ1ü+øŸû.x÷öfñÁ?ë~ñ·ÃÛ¤?³G…¼%ðá…àŸ„ŸðVWÄž*ðÇÀ_…ÿþ Ýßø'ÅŸomá‡|¡øÛPøà»m?Bø‡ñOâ_Ç}n_ˆþ.¿ýCýžþ‹øamàYüEÿ n·¨xÛâßÅ?øŽ#þÝ+Uøñßâߎ>9|L¸ðdžŸS×îü/à•øƒñİøÂú¯‰üc®økÁ±hZˆ¥Wù©ýòÿäv‡ùõÀÿÃ~Üßô‘‡ÿøƒú/ÿD5ðÁ·7ý$Gáÿþ þ‹ÿÑ GÔªÿ5?¾_ü€s®Ïðÿ3¾¢¸ø`Û›þ’#ðÿÿEÿ膣þ#öæÿ¤ˆü?ÿÄÑú!¨ú•_æ§÷ËÿuÙþæwÔWÿ ûsÒD~ÿâè¿ýÔÃ~Üßô‘‡ÿøƒú/ÿD5R«üÔþùòλ?ÃüÎúŠàá‚?noúHÃÿüAýÿ¢ø`Û›þ’#ðÿÿEÿ膣êUšŸß/þ@9×gø™ßQ\ü0GíÍÿIøÿˆ?¢ÿôCQÿ ûsÒD~ÿâè¿ýÔ}J¯óSûåÿÈ:ìÿó;ê+ÿ†ý¹¿é"?ÿñô_þˆj?á‚?noúHÃÿüAýÿ¢©Uþj|¿ùç]Ÿáþg}Ep?ðÁ·7ý$Gáÿþ þ‹ÿÑ Gü0GíÍÿIøÿˆ?¢ÿôCQõ*¿ÍOï—ÿ ë³ü?Ì郞þ#öæÿ¤ˆü?ÿÄÑú!¨ÿ†ý¹¿é"?ÿñô_þˆj>¥Wù©ýòÿäv‡ùõÀÿÃ~Üßô‘‡ÿøƒú/ÿD5ðÁ·7ý$Gáÿþ þ‹ÿÑ GÔªÿ5?¾_ü€s®Ïðÿ3¾¢¸ø`Û›þ’#ðÿÿEÿ膣þ#öæÿ¤ˆü?ÿÄÑú!¨ú•_æ§÷ËÿuÙþæwÔWÿ ûsÒD~ÿâè¿ýÔÃ~Üßô‘‡ÿøƒú/ÿD5R«üÔþùòλ?ÃüÎúŠàá‚?noúHÃÿüAýÿ¢ø`Û›þ’#ðÿÿEÿ膣êUšŸß/þ@9×gø™ßQ\ü0GíÍÿIøÿˆ?¢ÿôCQÿ ûsÒD~ÿâè¿ýÔ}J¯óSûåÿÈ:ìÿó;ê+ÿ†ý¹¿é"?ÿñô_þˆj?á‚?noúHÃÿüAýÿ¢©Uþj|¿ùç]Ÿáþg}Ep?ðÁ·7ý$Gáÿþ þ‹ÿÑ Gü0GíÍÿIøÿˆ?¢ÿôCQõ*¿ÍOï—ÿ ë³ü?Ì郞þ#öæÿ¤ˆü?ÿÄÑú!¨ÿ†ý¹¿é"?ÿñô_þˆj>¥Wù©ýòÿäv‡ùõÀÿÃ~Üßô‘‡ÿøƒú/ÿD5ðÁ·7ý$Gáÿþ þ‹ÿÑ GÔªÿ5?¾_ü€s®Ïðÿ3¾¢¸ø`Û›þ’#ðÿÿEÿ膣þ#öæÿ¤ˆü?ÿÄÑú!¨ú•_æ§÷ËÿuÙþæwÔWÿ ûsÒD~ÿâè¿ýÔÃ~Üßô‘‡ÿøƒú/ÿD5R«üÔþùòλ?ÃüÎúŠàá‚?noúHÃÿüAýÿ¢ø`Û›þ’#ðÿÿEÿ膣êUšŸß/þ@9×gø™ßQ\ü0GíÍÿIøÿˆ?¢ÿôCQÿ ûsÒD~ÿâè¿ýÔ}J¯óSûåÿÈ:ìÿó;êþ9à´?ò|Þ(ÿ²ðïÿL­_؃cÚ£Á~0ð—‰>(~ÚÞøàxz/xÃÿ²¾…ðÛTñE†¥«Ùéi¦Åãfø¹ãY4Vº½·›SšÓ÷:Þ™柦_hzÝ®»¦ÿÿðZù>oÙ?øwÿ¦V­pôeF³RqnT¤×+oiÃ{¤);ÇKï×ÑŸÓ'íkÿ'•ÿïÿ°ÇÄßýc½n¾¶¯’k_ù<¯ø'ý†>&ÿëëuõµrVÞáŸþžªTvû¿ô˜…QX”~^ÿÁe.þZÁ9¿j?ø\?¿áY}§àŸÆÛO…Ÿñ}|Sð3þÆ9¾üPÿ„#áüRþ9ð?ü.øJöêñb¼Eÿ …¾ ýƒþ&þñöE¿Ù=wö¶ø—ðçãü+öðø‹ð—Çþ ø£ðûÄ_°íãÿÿ޾x«Bñ·ƒußìŸÙ¯ãN…ªÿcøŸÃWúž‰©ÿfkzf¥£êb¾ŸìZ®Ÿ}§ÜùWv“ÃܵÈ|Jøÿ Að‹ã—ìÑÿ Oü ÿðѳÿÇÏðšÿbÂMÿü-¿ƒ~8ðü%?ðŽkøþøGÿá þÖþÄþÞÑ?µ~Éöí}7íl‡jOߣt«{鬢­ki²Öÿ!Kgèýzõ>ýˆÿm_ÿ´7í…û>Ïá¿ø)OÁÿÚ·àßÄÿ|Bñgˆ~~Ì_f¯‹sÛ|3Ô¾|Vñƒ¼Mñ£öU‹ö øûXÿÁ<¾èÞ1O‡–k??mŸÚ×âÂߌº—ÁÿØïâµÏÆ/|eÖ>;øSÀ>ÁM¼iÆÿ‚zí³ûW~Ì5ý“ÿjÏ|Qø/û\| øçñcàxWöPÓ¼gû5|tø©¦|ý¨þé°‡ÂÛoØKãµã†°|ÿ†bý±?à¥ß¶Š›N_Žm ý«2üsý´>üGý£u¿ÚÄZí û?ø»áßÀ›-cþ åûB~Ð_ðNßÚ¯EÖ¿cïüVøiàøëöaÿ„§ãÕÝ·Á?dÛWÅ¿?iÚÇþ'ƒ|Wqã?ٗ㌾5è?coÛ»öªø¡ãO]~ÒÿðR_؃àµÏÄ/ƒÿüMûN~Ï—¿¶ïì£}ûCþÆÚ·À/|Hñµ·ÂÿÙ3Ä_ðMO„_>|`ý“>"hVOãï þÙµ/ímá_‚Ÿ < ñ“Ãôoþ6Ò->)hÔíü¡~ÉŸðSÏÚÇÆ>ý“õŸ~Ú³ÿÆíkÇŸ³ÿüÓö„ñ‡„t/…¿ ´/üJÖ?oÛŠ_ø'í3à==¼㙿±þþÉ¿ÙvÞ,ø¤¾ðÊxî×þ ã}2çYñßÂÙ– ;ö ¿úÿö5ý²¾"üKø‹û+~Û¿ðдíçÃ~À>Oì±wÿïû_ì±ñkâÿÄoø·?>ø;ö´øÿ 'ö´ðw¯Ùþ2ëâ¯ÅøFÿáh¬ø§ÿ 7íâoøÛIýþ¢€9ÿxO¾=𯉼 㯠øÆž ñ§‡õŸ øÇÁÞ,Ñ´ïøWÅžñs£ø‡Ã>&ðö±my¤kÞ×t‹ËÍ/YѵK;­;TÓ®®lo­§¶žX›ùÁýg¯€^9øûû%þÁ·ß¾Ý\ÿÁ ¼AûFø³Å|4ðYñÇÃOxÓÆ‹á_ø&‰¼Qâ«íox×Ķìâþß´>³ð6Ê GOý¶¾|#ø‡ñçà?ü9¦ü"ñô½E4?ðMïÛoöÂø×ûCü°øëûiþÄ)ø±áÿê_ÿaßÛ7àg‰h‚Þ*›á'Š<{â?„Ÿ ÿcÁ<g¯ÚGàÿÆŸt}3ÂÞ>ðí ûe~Қ„žøÉá/ˆ²|Xø­¦èŸ|9ôü·ö–ګĵö­ÿ}ðÿíEão…?lïi_³WÃKØ15þÍ_ j‹ÿþ üný¡t¿†? />+k¾ ×¼-yðÛÇZ/ÅŸ€ú§ìÉðCÄÞÕ¾Ù…ZÍÍÿø*ÿí©û>Û›àÿÇoxàÿìÜ>øYñ7ì{Æ_üBð·Æø(µ÷ÆÏÙOÂwŸ¾|6ø­ãïþÌ~ðç…|EsðËâî£ñ_âgÁX j?µ‡ˆþ|^ºÖþh~ÕümûOøÛWð‡ì}àí?Å>—áÿìñâσ_µoÁOi_²í߯O‰øÿãßézŠ+ù‚ýƒÿá–?µ?àÿð£¿áŸÿáã?ñ$ÿ‡°¨ÿ…uÿ ¯ÿ(ãý¤ÿá¡ÿáá¿ðˆÅõÿ“ôÿ…'ÿ ŸþKþnïþoü'ñyá¯éöŠð‡µÀŸŠÿ¿h¿Ù£À9þßøÛû&ÿ¢ÿ†€ðWü#>1Òÿáÿ…ïàëïü)ÿŠZðöá/ÂUá-:óVÿŠ+^ñö“öÿcêrEdÿ˜²ïÆoØÛÿðXÛ·áoÃÚ£áÿŒþ&üUýŸÿd‹‡^"ý¯o¾6øî_Žß þ9ÁP¼EñûáïüBø«ãŸx þ¯‡ïµ¦¿üeâ §¿ý¾¢€ ü!ÿ‚VþÒÏûUxƒV¾Õ¿à¯¾ý¨¼mð¯ãíáÍ+öjøiqû&£ãÿÙ«áoíAñà¿Á_ß´.—ðÇáEçÅmwÄ÷…¯>xëEø³ðTý™>x›Âº·Àû1ð«Y¹¿ñ§Ž~7þïQ@Íü{öÛý°¾5þÐÿì>:þڱNJ~,xÄ:—ÇÿØF÷öÍøâ_Úà·Š¦øIâøá'ÂÿØßÂðOÙëö‘ø?ñƒàgÅLð·¼ûC~Ù_´¦£ð‡á'†¾2xKâ,Ÿ>+iº'Æ}ðö…ý‹åÿ‚ÌþÜžøsñÇö`“ã'ÅOÙƒöðŸ‰|àŸ‰ _âgÄ¿~$ÁJt‹þ×<=¡kGÅ>0øÁðWáNð×Kø“£_Ùê>4øqð÷Ið5‰í´o ØèEû=E4?ðMïÛoöÂø×ûCü°øëûiþÄ)ø±áÿê_ÿaßÛ7àg‰h‚Þ*›á'Š<{â?„Ÿ ÿcÁ<g¯ÚGàÿÆŸt}3ÂÞ>ðí ûe~Қ„žøÉá/ˆ²|Xø­¦èŸ|9À~Ì?ðSoÚ/Û öHÐþ2þÕßükðïö¬øÁ¯üø­ðƒ[ø±ð‘¼Uû(|BñŸÀÏŒ>üø±ðáçì!ð·ÄŸ°—í?­|døk üðoìÅûMÿÁK¿l‰¨¯Æ‚¾ƒö¬ø‰à~Ò ©Ú(ù¡ýˆÿm_ÿ´7í…û>Ïá¿ø)OÁÿÚ·àßÄÿ|Bñgˆ~~Ì_f¯‹sÛ|3Ô¾|Vñƒ¼Mñ£öU‹ö øûXÿÁ<¾èÞ1O‡–k??mŸÚ×âÂߌº—ÁÿØïâµÏÆ/|eÖ>;øPÿ‚o~Û¶Æ¿Úà‡Ç_ÛOö ¸ñOÅø‡RøÿûÞþÙ¿ðïÅo†žðŽ¿føJ~=]Û|ƒöGýµ|[ñƒö˜ý¡|wðáÒx7Åw3ý™~8Ëã_êöŠþX¿fø)·íí…û$hjïƒþ5øwûV|`×þ üVøA­üXøHÞ*ý”>!xÏàgÆ?ŠŸ þüXøðóöø[âOØKöŸÖ¾2|5Ð~x7öbý¦ÿà¥ß¶ÄÆÔWãÁ_ ÁûV|Dð‰?i†?oÿÁ6~#]x;âO>ütÿ‚Œþд'í5íûtxRØóâô³ˆüwð×á¶ûXühñGÁÚâ†>þÍ^ý >ü?ñçìÿ¡|:×þøÓâü1û']hÿþxàŸ…´ â/ìÅà;Ûê(ù¡ÿ‚o~Û¶Æ¿Úà‡Ç_ÛOö ¸ñOÅø‡RøÿûÞþÙ¿ø+ÂV~‡ã·ÂÏŠÿh¯ÚçÇú‡Ä·ñ&™ÿ ·þögü1î­ñ»Æ^%ׯ¼GñOÁÞ+ø5añÇRñ—„¾#hV^#ùþ [¦þË?µ?Â-_öJñ—ìâíÛÿþ ƒ¦ê_¿a†Ÿ¼ ûSü9ý–"ø‹ÿºøOã/ÚûãÃO‹¿át~ÀßÙ_´Oƒ 'øðáÖ•ñǰgŠ|5ñcXÿ…Oàßühþ¿h æ ö[ý»ÿg»ßø+ׯ/Œ^øÃû?Ú~Î_·WÄþÉÿ ¾:xcâìÎ4Ú·ã·ìÃðŸö!Ñ>ü"·Ò<#ã W¿>øë[ÿ‚‰ÚÙü[øŸðûÂÞøµàOÚ'ö:ð„þ/ücðg?a i_ÓíPEPEPEPEPEPEPEPEPEPEPEPEPEPEP/âÿùÚØÑàýM|Iñ·ÃkOøWDømàß´_jü¨xâ×Ä»íWSøñGÁ·¿ ­®|1ñÇú–»£øw[Ô0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêÿ_ÑEQEQEQEQEQEQEQEQEQEQEQEQEQEQErþ/ÿM§ýÿÔÓÃõþy¿ðZù>oÙ?øwÿ¦V¯ô2ñü‚m?ìhð?þ¦ž¯óÍÿ‚ÐÿÉóx£þÉÿÿý2µbÿÞ#ÿ^eÿ¥À¯±ÿo~‡ôÉûZÿÉåÁ;ÿì1ñ7ÿXï[¯­«äŸÚ×þO+þ ßÿa‰¿úÇzÝ}m^]máþÿéꦑÛîÿÒbQEbQùåÿ°ý•u?øNÇö™ñWì½à›¹ÿ·¿áSxŸöêðçÅÙLñLZ¯‚æñü%ñOÄ¿ƒÿ5ß—¾XÓþn|EðïÆ=3Ã7u…ŸÚß´ÿš§ö¿üzÝ|ýn¼c¥|Qм]sû<ü-ŸÅ:Ç_ø³ãNâ9¾ iÒkšWÅÿêžð^§â_Š:v¦×V~?ñ£àï ßë>,‡VÔnü5¡\\É¥ÚöÕê?ä¥xoþãú`ÕkjR÷èÇ]*Áêÿ¼¶VÓÏW®ª×wOiz?ÈûŠ(¯hÀ(¢Šùáoo­_ÇzŸñ¯öiý>ü2¸þÓÿ„›Åß n¡>ý…ðëÅŸðOoÞñÛüA•¦jÚ¼/ý‘£Þêí¯öÝî™máÝ_ëú( æ‡ö#ýµ~7þÐß¶ìû?†ÿà¥?ÿj߃üAñ Åž!øQû1|Mýš¾-ÏmðÏRøñ[Åþñ7ÆÙV/Ø+àGícÿòø?£xÅ>ZA¬üTý¶k_ˆ_ ~2ê_ÿc¿Š×?¼Iñ—XøïáNƒàwí»âߨþͺ¿‰?à¥ÿoøÁñ«áÿŽ5?ø(ßìÙö¯ØvÏþ£Åû|løÓñgâ—ü!ö_-¾3þÎßðÉ?µ?‚~þÎ?ÚðPüqð'ƒ¿á9ÿ…kû@è^=øÁâ/ øžÃú>¢€?”/Ù3þ yûXøÇÂ_²~³âÏÛOöøÝ­xóöÿ‚:~О0ðŽ…ð·á¶…â‰ZÇíïûqKÿãý¦|§·ƒ¼s7ö?ÃÿÙ7û.ÛÅŸ—Ã>OÚÿÁA;øCû2Á§~Áwýìmûmüoø×ãOX~ݶŸü‚ãáßŃÿõ/Û‡öøËûfþÍ^%ñ§Áo Íð Ç^=øÉð’/Øßþãû=|dø?âž$Ñäð·Ç~Õß¶Wí)§|!øᯎÞøÁ'ňšn›ñ‡ÃŸÔíüÁÁ!?i_ÿÂÿ‚F|0ð?í¡ÿ ÷ž4ýŸþü7ý£ÿb?øW <ÿ û=ø/öñ¿Œ~üwÿ…g‚-l}¿âGÃ_Ù·á¿ü4/Ç‹Þ4ý™ÿhøi/øXü០|}ý˜ì<ïÿ±¯í•ñâ_Ä_؉[öÝÿ†€ý ?h;þûöòe‹¿øwÚÿe‹_þ#ŹøAð—Áßµ§ÀŸøQ?µ§ƒ¾~È¿ñ—_~(Â7ÿ CþgÅ?øI¿hx'ÆÚOïõü¡x#ö•ðwÅ/Ú‹þ¡ñ—ãŸí¡ðÿâ?í­þÐ"Óÿh_ÙÿÅßþÙkðO/Úö‚ÿ‚vþÕz.µûxwâ·ÃOxÇ_³ü%?®í¾Áû#þÚ¾-øÁûL~о;ø?ðé<â»þÌ¿eñ¯Ûÿu?Û“Pý¨>þÊ^(ý±iÿxÛà7í?ûE|^ý§ücâ/ƒŸ±Î•ðÏâÏì7‡ü!¬~Ǿ Ò|CáŸÙÃÚ¾Ÿâ‰z¿Ž~xx¯AðçÂtøƒñ àoü ÂÞø©}sû9ü—Ÿ»Õà ÿf/„_þ)ügø×àÛOˆ?~?ÿÂ/Ä¿xÿãgÆÏ‹ŸhÑüâ?‰ž,ðo„|£|Xø…ãoü&øá?|cø—¨xsá×Â}+Á>Ñ?á+½µÓ|;mem¦ÛY{ý,_ðOOÚ×á'ÀyÿeO |'ý´¿f ÿfïÚKþ ¿ÿCýþþÊ¿.¿g ü%øwð’×ã/íÅûAü)ñOÃíCÃzçÄM{ã»ñóö]ð?ÃÙ|9ã?~ÏþϵoÀ?‡žýš®þ(øÓáçÇŸÿS´PòÅû0ÿÁM¿hx¿l/Ù#CøËûW|ñ¯Ã¿Ú³ã¿ð_â·Â oâÇÂFñWì¡ñ Æ>1üTøWðâÇÀ‡Ÿ°‡Âß~Â_´þµñ“ᮃðÁ¿³í7ÿ.ý°~&6¢¿~ øfÚ³â'€ ~Õ¿<=¥~Ë·>$x#ãÿ~ ÿ‚lüFºðwÄŸ| øéÿý ?hOÚj?Úöèð¤ÿ±çÅèÿgøïá¯Ãmö±øÑâ‚ÿ´?Ä |ýš¼û@|!øãÏÙÿBøu¯ü7ñ§ÅøcöNºÑþ;ü0ð'Á? h/Ä_Ù‹Àv·ÔPáü·ö–ګĵö­ÿ}ðÿíEão…?lïi_³WÃKØ15þÍ_ j‹ÿþ üný¡t¿†? />+k¾ ×¼-yðÛÇZ/ÅŸ€ú§ìÉðCÄÞÕ¾Ù…ZÍÍÿÿ‰ý­<ð«öEÿŒºø«ñCþ¿øZð«>)ÿÂMû@x›Á>6Ò¨ å Á´¯ƒ¾)~Ô_ðEŒ¿ÿm‡ÿÿhÝoö€ñŸûBþÏþ.øwð&ËXÿ‚y~П´ü·ö«Ñu¯Øûÿ¾x#À~:ý˜á)øõwmðFÙöÕñoÆÚcö…ñßÁÿ‡IàßÜxÏöeøã/~ŸðíßãO|eýÿgÏŒ¿¶§ˆ/¾2ø(ÿíÓû'þÓ>ø‰à߀^Ô|gðkQƒöë¾ÿ‚}êß´]焾x/HøñƒãF‘ð—öWñì£ø?Qø?íƒá_xÛžülðÜwº§‚¿¡ê(ð‡öý§üiñׯŸ²uιÿ;ðÿ‹~;xóÃéñ/ö×ÿ‚nÛü%øãïˆ_³÷Ä+€^4¹ñ§ìõ üðÇ„>8þÄßþ|qñZ赯ÛFŒ¿/~&|/øû9ê|ñ'Çþ0Ð~?üÿÿÞý¶ÿl/´?À;Ž¿¶ŸìAq⟋ñ¥ñÿö½ý³~x—ö‡ø-⩾x£Ç¾#øIð¿ö7ð‡üÇözý¤~ü`øñGGÓ<-ãï~Ðß¶Wí)¨ü!øIᯌžø‹'ÅŠÚn‰ñ‡ÃŸÒõü¡x#ö•ðwÅ/Ú‹þ¡ñ—ãŸí¡ðÿâ?í­þÐ"Óÿh_ÙÿÅßþÙkðO/Úö‚ÿ‚vþÕz.µûxwâ·ÃOxÇ_³ü%?®í¾Áû#þÚ¾-øÁûL~о;ø?ðé<â»þÌ¿eñ¯õ{Eü±~Ì?ðSoÚ/Û öHÐþ2þÕßükðïö¬øÁ¯üø­ðƒ[ø±ð‘¼Uû(|BñŸÀÏŒ>üø±ðáçì!ð·ÄŸ°—í?­|døk üðoìÅûMÿÁK¿l‰¨¯Æ‚¾ƒö¬ø‰à~Ò ©Ú( æ‡ö#ýµ~7þÐß¶ìû?†ÿà¥?ÿj߃üAñ Åž!øQû1|Mýš¾-ÏmðÏRøñ[Åþñ7ÆÙV/Ø+àGícÿòø?£xÅ>ZA¬üTý¶k_ˆ_ ~2ê_ÿc¿Š×?¼Iñ—XøïáO¨?à›?®¼ñ'ÇŸ~:ÁFhÚöšö€ýº<)?ìyñz?ÙÇÄ~;økðÛFý¬~4x£à¿íñÃÿf¯~Ð~øóöоkÿ üiñGÆþý“®´Žÿ < ðOÂÚ‹ñöbð‡íõøCÿ­ý¥Ÿöªñ­}«Á_|?ûQxÛá_ÆÛ;ÚWìÕðÒãö MGÇÿ³WÂßÚƒâÿÁ‚¿¿h]/á‹ϊÚïˆ5ï ^|6ñÖ‹ñgà>©û2|ñ7…uoöcáV³sãOüoùöaÿ‚›~Ðñ~Ø_²F‡ñ—ö®ø?ã_‡µgÆ à¿Åo„ßÅ„â¯ÙCâŒþ|cø©ð¯àÿÅ€??a…¾$ý„¿iýkã'Ã]à7ƒf/Úoþ ]û`üLmE~0üð̵gÄOx“öøcýNÑ@ÍìÿÖÛÅ_²±ãÿø*ÁÿÚkô—üöëý€4j³þÈþƒTøIðKQý¬8ð·ì_ûF~Ò~+ý.|[áÿ‚rø“öPðúüdøc¬üñgÁoÚëQø‡ûmxû¿ µ—ø=ñËÀ>)øûIx£ÆÒõ|ÁáŸØ÷à‡†>2Üüz ñƒÅÿˆ,~Ó´¯Æ¯‡¿ðí ûe~Қ„žøÉá/ˆ²|Xø­¦èŸ|9ý/QE(^ý¥|ñKö¢ÿ‚(|eøçûh|?øûFë´ˆ´ÿÚöñwÿ6ZÇüËö„ý ¿à¿µ^‹­~ÇÞø­ðÓÁñ×ìÃÿ OÇ«»o‚0~Èÿ¶¯‹~0~Ó´/Žþü:Oø®ãƳ/Ç|k÷ÿÁ/Ú/àï‰?ি·×칤ÁD¾øçâoÄÙÿà>‹ð¯û3^ý„åý£¾ üSÒ~'ÿÁGÿáo~Ïÿ á ø3¥xƒâOü2‡ô?xçOøSûGx{öƒñÁ»¯k¾&ø•§eñ/Åð’~ßQ@„?³'ÅÚ«ãGÇß…¿±Ö«û_|`_?ðOO|LÖà¨~+¶ø}û(ÇÇ=;Åž4³ÔaÏ ë>?³u·†üáÿÛ/àØÔÿh¿ ÜþËÞ1Õ:þڱNJ~,xÄ:—ÇÿØF÷öÍøâ_Úà·Š¦øIâøá'ÂÿØßÂðOÙëö‘ø?ñƒàgÅLð·¼ûC~Ù_´¦£ð‡á'†¾2xKâ,Ÿ>+iº'ÆKÔPŸüYÿ…Yÿ ³â_ü/OøWÿð¤¿á_øËþü-ŸøG?áV¬ÿ„sRÿ…ƒÿ /þø¤¿á_ÿÂ%ý¯ÿ —ü%?ñNÂ9ý¥ý·ÿϵWó…ÿ„ý¥|Gÿ wþ ðÃÀÿ¶‡ü/ßøÓöøCðßöýˆÿá]ü,ð?ü2ì÷à¿ØOÆþ1øñßþœ~µý±üöÿ‰ f߆ÿðп~/xÓögý ?᤿á`|ð†|%ñ÷öc°ðôûE~üÔÿnMCö øsû)x£öÅý§üAão€ß´ÿíñ{öŸñˆ¾~Ç:WÃ?‹?°dÞð†±ûø3Iñ†djúˆ>%êþ9øeà!â½ß ÓâÄ/¿ðX/ x â¥õÏìçð:_ ~ïW€|/ý˜¾|ø§ñŸã_ƒm> \üMøÿÿ¼üMãÿŸ>.}£GðOˆþ&x³Á¾ðVñcâ¼?ð›áÿ„üAñâ^¡áχ_ ô¯øDÿ„®ö×Mðíµ•¶›meïôøû4þ×v>3ÿ‚Žxᆷÿtÿ…•¦ZþеÁþÄðþÆÖ1ñ÷Å?jŸxëEø³ðTý™>x›Âº·Àû1ð«Y¹¿ñ§Ž~7óÿ±¯í•ñâ_Ä_؉[öÝÿ†€ý ?h;þûöòe‹¿øwÚÿe‹_þ#ŹøAð—Áßµ§ÀŸøQ?µ§ƒ¾~È¿ñ—_~(Â7ÿ CþgÅ?øI¿hx'ÆÚOïõWóCÿÞý¶ÿl/´?À;Ž¿¶ŸìAq⟋ñ¥ñÿö½ý³~x—ö‡ø-⩾x£Ç¾#øIð¿ö7ð‡üÇözý¤~ü`øñGGÓ<-ãï~Ðß¶Wí)¨ü!øIᯌžø‹'ÅŠÚn‰ñ‡ÃŸÒõøCÿ­ý¥Ÿöªñ­}«Á_|?ûQxÛá_ÆÛ;ÚWìÕðÒãö MGÇÿ³WÂßÚƒâÿÁ‚¿¿h]/á‹ϊÚïˆ5ï ^|6ñÖ‹ñgà>©û2|ñ7…uoöcáV³sãOüo?à•¿´³þÕ^ Õ¯µoø+ï‡ÿj/|+øÁûgxsJýš¾\~Á‰¨øÿöjø[ûP|_ø/ðWãwí ¥ü1øQyñ[]ñ½ákφÞ:Ñ~,üÕ?fO‚&ð®­ð>Ì|*ÖnoüiãŸÿ»ÔPàìkûe|Eø—ñö"Vý·á ?hÚÎÿ†þý€|ŸÙbïþßö¿Ùcâ×Åÿˆßñn~|%ðwíið'þOíiàï…_²/üe×Å_ŠðÿÂÐÿ…YñOþoÚÄÞ ñ¶“ÐÁ+igýª¼A«_jßðWßþÔ^6øWñƒöÎðæ•û5|4¸ýƒQñÿìÕð·ö ø¿ð_à¯ÆïÚKøcð¢óâ¶»â {Âן ¼u¢üYøª~ÌŸðÿìÇáoxWÄW? ¾.ê?þ&|ƒÆž&ñ_мAksñ'_Õ5ŸÙê(ù¡ýÿà£:Ûx«öBÖ<ÿAø?ûMxoö’ÿ‚þݰá VÙÃ0jŸ > j?µ‡ˆþ|^ºÖþh~ÕümûOøÛWð‡ì}àí?Å>—áÿìñâσ_µoÁOi_²í߯O‰øÿãßézŠ(ñþ ³ñëÁß|yð7ã§ügö€ý¡?i¨ÿhۣ“þÇŸ£ýœ|G㿆¿ ´oÚÇãGŠ> þÐÿ<1ðöjðGíð‡áÿ?gý áÖ¿ð߯Ÿ|oáÙ:ëGøïðÃÀŸü- h¿f/Ø|Aÿôý­~|ŸöTð—ÂÛKö`Ÿöný¤¿à«ÿðT?Øÿá_ì«ðòëöxðÏÂ_‡ -~2þÜ_´Ÿü>Ô<7¨Þ|D×¾0k¿/?eßü=—Þ3ðçìñ/ìñûVüøyá¿Ùªïâ>|yñÏõ;E4?ðMïÛoöÂø×ûCü°øëûiþÄ)ø±áÿê_ÿaßÛ7àg‰h‚Þ*›á'Š<{â?„Ÿ ÿcÁ<g¯ÚGàÿÆŸt}3ÂÞ>ðí ûe~Қ„žøÉá/ˆ²|Xø­¦èŸ|9ý/QErþ/ÿM§ýÿÔÓÃõþy¿ðZù>oÙ?øwÿ¦V¯ô2ñü‚m?ìhð?þ¦ž¯óÍÿ‚ÐÿÉóx£þÉÿÿý2µbÿÞ#ÿ^eÿ¥À¯±ÿo~‡ôÉûZÿÉåÁ;ÿì1ñ7ÿXï[¯­«äŸÚ×þO+þ ßÿa‰¿úÇzÝ}m^]máþÿéꦑÛîÿÒbQEbQðoíí |iñü¾ Ó?g[à†5¿øóöÀÐÿhϾ,ýŸüã‚Þøâi-¾ø“Å>ø ñªÞ?…מ.¾Ñ¾!üfo\xwÂ~$øðÇQø7ñDñçÂoŒ_´½;µÿ‚ø·þ_ØOþ Û¬}¯Á7Ÿcý—¾øKÎðá>Гþ†Oà_²_ë¿Ø>û¬?áûÄ¿gܶøo⯇_ÛÞ)ÿ„Wþ}cëÚõƒòR¼7ÿqý0jµµ){ô£où{MÞïùžëkë¾öIjL–ù?Å/òüO¼(¢ŠöŒBŠ( Š( æ‡àoí›ñ¿â¿Åoø&†,ÿà£> ×¾+~ÓŸ4«ÿø(?ì…ៃÿ³WˆõØçÇý‹ÿhÏÚOŲϋ|?ðN_~Ê_ŒŸ uŸƒ>,ø-û]j?ÿm¯xWá¶²ÿ¾9xÅ?ÿi/xÃÐ<ûwøÓÀ`Ùóã/í©â þ ?ûtþÉÿ´Ï~"x7à†µüÔ`ýºï¿àŸz·íyá/ž Ò>ü`øÑ¤|%ý•üEû#hþÔ~Ïû`øWÇ6ñ_Ãï‡<7î©à¯ÙÿŒ³Â/Žþ;ø ñ'â=§Ä ¯þÌß.þ)|¹ðÆÏŸ 4}Çwú<Þ½×|Eá?…ÿ¼á/‰_jð•ÿˆ<>™ñ;CñŽ'ðvŸâŸKðÿöxñgÁ¯Ú·à§‡´¯Ùvïã'Ä|ñïô½E~ ÿÁ6~#]x;âO>ütÿ‚Œþд'í5íûtxRØóâô³ˆüwð×á¶ûXühñGÁÚâ†>þÍ^ý >ü?ñçìÿ¡|:×þøÓâü1û']hÿþxàŸ…´ â/ìÅà;—õÏø(·ð—Qý”¾ þÐÿðRo|ø‰¤~ÛÿðQ¿Ù‹ö¶ñÄOþÈþÔ|%ð ¼+û~k°wÆÚ/Ä>%ý›ì¾ þÏ_-êßðTï‡ÿ¶gíðÃö€‡_²¥·Œµÿø%·ÄOŠþ ÜÁ=þx›Å“ü'ñgÃÙ{Ã_¼?ðÿÁž:ø‘ûEÇ©xwöHñïÂ_„_ð‘ø7â^¥ãßëÞ3ñí¬üEûàí ûËÿ™ý¹< ðçãìÁ'ÆOŠŸ³ì9á?ø;Á?þ¿Äψÿ~üHÿ‚”èÿü3®x{BÖŠ|añƒà¯Âá®—ñ'F¿³Ô|iðãáî“àkÛhÞ±Ð"‹özŠþx|ûwøÓÀ`Ùóã/í©â þ ?ûtþÉÿ´Ï~"x7à†µüÔ`ýºï¿àŸz·íyá/ž Ò>ü`øÑ¤|%ý•üEû#hþÔ~Ïû`øWÇ6ñ_Ãï‡<7î©à®ƒö"ý²¾"ü[ý©þü*ñ‡í»ÿ öÿŒÊÿ†@øéäþËñ¹¯øWÿaÑ>$ÿÄ£À_ |=ÿ þ“æ]|,ÿ‹:¿ÿá¼ÿäî¾ÿÆ?ü?ñ×…µoßê(¯æ þ ï?ìeñ£þ cñãâÞ­ÿNøûf~Ñ¿ ?høuû*[xË_ÿ‚[|Dø§ñOàÇüßàW‰¼Y?Â|1ý—¼5ñëÃÿü㯉´\z—‡dü%øEÿ ƒ~%ê^=ð޽ã?~ÑšÏÄ_éöŠüaý™¿jO‡þ ¿ûj~χöæø?ñÛÆÞ#ø?û7‡þÖ|MûÁñ—Áÿ¼-ñƒþ -}ñ³öSðçÁ/‡ß ¾+xûÃÿ³…¼9á_\ü2ø»¨üWø™ðVx›Å~*ñ­ÏÄTÖ~?ÿ‚o~Û¶Æ¿Úà‡Ç_ÛOö ¸ñOÅø‡RøÿûÞþÙ¿ðïÅo†žðŽ¿føJ~=]Û|ƒöGýµ|[ñƒö˜ý¡|wðáÒx7Åw3ý™~8Ëã_êöŠ+ð‡öý§üiñׯŸ²uιÿ;ðÿ‹~;xóÃéñ/ö×ÿ‚nÛü%øãïˆ_³÷Ä+€^4¹ñ§ìõ üðÇ„>8þÄßþ|qñZ赯ÛFŒ¿/~&|/øû9ê|ñ'Çþ0Ð~?þïQ@ËìÃÿ6ý¡âý°¿dã/í]ðÆ¿ÿjÏŒÿÁŠß5¿‹ Å_²‡Ä/ü øÇñSá_Áÿ‹~~ |Iû ~ÓúׯO†ºÀoþÌ_´ßü»öÁø˜ÚŠüaø+á˜?jψžñ'í!ðÇïÿ€´/ì_/ügöäð/ߎ?³Ÿ>*~̰ç„üKàïüKøRÿ>#ü}øñ#þ S£ü_ðιáí Z>)ñ‡Æ‚¿ to†º_ÄþÏQñ§Ã‡ºO¬|Om£xnÇ@Š/Ùê(ð‡öý§üiñׯŸ²uιÿ;ðÿ‹~;xóÃéñ/ö×ÿ‚nÛü%øãïˆ_³÷Ä+€^4¹ñ§ìõ üðÇ„>8þÄßþ|qñZ赯ÛFŒ¿/~&|/øû9ê|ñ'Çþ0Ð~?ùÿ€ÿnÿxã/ìû>|eýµ2|Tý˜?aÏ ø—ÁÞ ø—ð¥þ&|GøûðâGü§Gø¿ásÃÚ´|SãŒ~èß t¿‰:5ýž£ãO‡tŸXøžÛFðÝŽ_~Ì?ðSoÚ/Û öHÐþ2þÕßükðïö¬øÁ¯üø­ðƒ[ø±ð‘¼Uû(|BñŸÀÏŒ>üø±ðáçì!ð·ÄŸ°—í?­|døk üðoìÅûMÿÁK¿l‰¨¯Æ‚¾ƒö¬ø‰à~Ò ©Ú(ñþ ³ñëÁß|yð7ã§ügö€ý¡?i¨ÿhۣ“þÇŸ£ýœ|G㿆¿ ´oÚÇãGŠ> þÐÿ<1ðöjðGíð‡áÿ?gý áÖ¿ð߯Ÿ|oáÙ:ëGøïðÃÀŸü- h¿f/Øt³7íIð0ÿÁWÿmOÙðþÜßþ;xÛÄÿfáðÿÀºÏ‰¿cØ>2ø?â…¾0ÁE¯¾6~Ê~¼ø%ðûá·Åoxöcð·‡<+â+Ÿ†_uŠÿ> ÁãOx¯Å^ µ¹ø“¯êšÏìõøûþÙ_~%üEýˆ•¿mßøhÚö€ó¿á¿¿`'öX»ÿ‡wý¯öXøµñâ7ü[Ÿ„ |ûZ| ÿ…ûZx;áWì‹ÿuñWâ‡ü#ð´?áV|Sÿ„›ö€ñ7‚|m¤øÿìÿÖÛÅ_²±ãÿø*ÁÿÚkô—üöëý€4j³þÈþƒTøIðKQý¬ý¿/¿cÍ[öÖ¼ž øwð7Ä>ü%ý›¼Eûü`øÑ¤|%ý•üEû#hþÔ~Ïû`øWÇ6ñ_Ãï‡<7î©à¯`ÿ‚lüFºðwÄŸ| øéÿý ?hOÚj?Úöèð¤ÿ±çÅèÿgøïá¯Ãmö±øÑâ‚ÿ´?Ä |ýš¼û@|!øãÏÙÿBøu¯ü7ñ§ÅøcöNºÑþ;ü0ð'Á? h/Ä_Ù‹Àv·ÔPãìÍûR| ?ðUÿÛSö|?·7ÁÿŽÞ6ñÁÿÙ¸|?ð.³âoØöŒ¾ø…áoŒðQkŸ„ï> |>ømñ[ÇÞý˜ü-áÏ øŠçá—ÅÝGâ¿ÄÏ‚°xÓÄÞ+ñWˆ-n~$ëú¦³ñÿìÿÖÛÅ_²±ãÿø*ÁÿÚkô—üöëý€4j³þÈþƒTøIðKQý¬(|%›á·Ž-¼OñCà‡Ãäñ³Ú|o‰_ ¼7ªüR²ñ–³yðË\ñW„|âá/ ý­ÿªÔ<9¨ü%ø4þøgð»áW„l5¿Ú…´oþ °øyð[ÆžðÏÄ/Š~Ðþ;ü ð^–÷šg‡þ~Óf—kûEøÏN×¼k`Þø¥¤ÜZ|Hø›o<|Kí•ê?ä¥xoþãú`ÕkjR¼èÇ]*Áî­ñv²ïÕ¿+\–´“ò’ÿ/êÇÞQE{F!EPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêÿ_ÑE~ ÿÁ6~#]x;âO>ütÿ‚Œþд'í5íûtxRØóâô³ˆüwð×á¶ûXühñGÁÚâ†>þÍ^ý >ü?ñçìÿ¡|:×þøÓâü1û']hÿþxàŸ…´ â/ìÅà;ˆ?àžŸµ¯ÂO€óþÊžøOûi~ÌþÍß´—üþ ‡ûü+ý•~]~ÏøKðïá%¯Æ_Û‹öƒøS⟇ڇ†õψš÷Æ wâ%çì»à‡²øsÆ~ýž%ýž?j߀<7û5]üQñ§ÃÏ>9þ§h æ‡þ ½ûmþØ_ÿh€vm?Ø‚ãÅ?ÿ‰ý­<ð«öEÿŒºø«ñCþ¿øZð«>)ÿÂMû@x›Á>6Ò¨ æ‡ö?ÿ‚Œëmâ¯Ù Xñÿüàÿí5á¿ÚKþ ?ûuþÀ„5Yÿd Áª|$ø%¨þÖ#ø ñzë[ø9¡øCWñ·í?ãm_±÷ƒ´ÿø_‡ÿ³Ç‹> ~Õ¿<=¥~Ë·>$x#ãÿ~ ÿ‚lüFºðwÄŸ| øéÿý ?hOÚj?Úöèð¤ÿ±çÅèÿgøïá¯Ãmö±øÑâ‚ÿ´?Ä |ýš¼û@|!øãÏÙÿBøu¯ü7ñ§ÅøcöNºÑþ;ü0ð'Á? h/Ä_Ù‹Àv·ÔP_ÍìGûjüoý¡¿l/Ùö ÿÁJ~þÕ¿þ'øƒâ‹ø}ûVü ýŸÿc/…¿ ¼Sðßþ/ÇO‹Ö#ý°¾;x;þŸ ~ ]|°ý³?¨ æ‡þ ½ûmþØ_ÿh€vm?Ø‚ãÅ?|QÑôÏ xûÀ_´7í•ûJj?~xkã'„¾"Éñcâ¶›¢|aðçô½EøƒÿÙøuàï‰><øñÓþ 3û@~П´Ô´íÑáIÿcÏ‹ÑþÎ>#ñßÃ_†Ú7ícñ£Åÿhˆø?û5x#ö€øCðÿÇŸ³þ…ðë_øoãOŠ>7ðÇìu£üwøaàO‚~Ð4_ˆ¿³€ì?o¨ æ‡þ ½ûmþØ_ÿh€vm?Ø‚ãÅ?$ÿÄ£À_ |=ÿ þ“æ]|,ÿ‹:¿ÿá¼ÿäî¾ÿÆ?ü?ñ×…µoßê(ñþ ³ñëÁß|yð7ã§ügö€ý¡?i¨ÿhۣ“þÇŸ£ýœ|G㿆¿ ´oÚÇãGŠ> þÐÿ<1ðöjðGíð‡áÿ?gý áÖ¿ð߯Ÿ|oáÙ:ëGøïðÃÀŸü- h¿f/Ø~ßQE0_ðOyÿc/ðSõoø*wÃÿÛ3öøaû@?ïÙRÛÆZÿüÛâ'Å?Šî?àžÿ¼MâÉþø³áì½á¯^øàÏ|Hý¢ãÔ¼;û$x÷á/Â/øHüñ/Rñï„uïøƒöŒÖ~"ý¿û3~ÔŸüöÔýŸíÍðã·¼Gðönü ¬ø›ö=ƒã/ƒþ!x[ãüZûãgì§á;Ï‚_¾|Vñ÷‡ÿf? xs¾"¹øeñwQø¯ñ3à¬4ñ7ŠüUâ [Ÿ‰:þ©¬þÏQ@Íü{öÛý°¾5þÐÿì>:þڱNJ~,xÄ:—ÇÿØF÷öÍøâ_Úà·Š¦øIâøá'ÂÿØßÂðOÙëö‘ø?ñƒàgÅLð·¼ûC~Ù_´¦£ð‡á'†¾2xKâ,Ÿ>+iº'Æ}ðö…ý‹åÿ‚ÌþÜžøsñÇö`“ã'ÅOÙƒöðŸ‰|àŸ‰ _âgÄ¿~$ÁJt‹þ×<=¡kGÅ>0øÁðWáNð×Kø“£_Ùê>4øqð÷Ið5‰í´o ØèEû=E(^ý¥|ñKö¢ÿ‚(|eøçûh|?øûFë´ˆ´ÿÚöñwÿ6ZÇüËö„ý ¿à¿µ^‹­~ÇÞø­ðÓÁñ×ìÃÿ OÇ«»o‚0~Èÿ¶¯‹~0~Ó´/Žþü:Oø®ãƳ/Ç|ký^ÑE4?³ÿíûrxŸö¸ø#û(x«öœý§õ­_À?¶ÿíÇëŸ ÿc›]GâìÁàÝoöø‹Àžñσ¼5ûøZçá·‡üàŸÙ§þ ©ñÆßü!¬ø_Ä*ð¯üûá¶¥¥àÍ#ã§ìe¬i|ìÃÿ6ý¡âý°¿dã/í]ðÆ¿ÿjÏŒÿÁŠß5¿‹ Å_²‡Ä/ü øÇñSá_Áÿ‹~~ |Iû ~ÓúׯO†ºÀoþÌ_´ßü»öÁø˜ÚŠüaø+á˜?jψžñ'í!ðÇú¢€?šØöÕøßûC~Ø_³ìþÿ‚”üý«~ üOñÄ/x‡áGìÅñ7öjø·=·Ã=KàgÅoø;Äß?eX¿`¯µüËàþãøyi³ñSöÙý­~!|-øË©|ýŽþ+\übñ'Æ]cã¿…?¥ê( æ‡ö#ýµ~7þÐß¶ìû?†ÿà¥?ÿj߃üAñ Åž!øQû1|Mýš¾-ÏmðÏRøñ[Åþñ7ÆÙV/Ø+àGícÿòø?£xÅ>ZA¬üTý¶k_ˆ_ ~2ê_ÿc¿Š×?¼Iñ—XøïáCþ ½ûmþØ_ÿh€vm?Ø‚ãÅ? þÐÿ<1ðöjðGíð‡áÿ?gý áÖ¿ð߯Ÿ|oáÙ:ëGøïðÃÀŸü- h¿f/Ø~ßQE~ ÿÁ6~#]x;âO>ütÿ‚Œþд'í5íûtxRØóâô³ˆüwð×á¶ûXühñGÁÚâ†>þÍ^ý >ü?ñçìÿ¡|:×þøÓâü1û']hÿþxàŸ…´ â/ìÅà;?ýl¯ˆ¿þ"þÄJß¶ïü4íû@yßðßß°“û,]ÿûþ×û,|Zø¿ñþ-Ï„¾ý­>ÿ‰ý­<ð«öEÿŒºø«ñCþ¿øZð«>)ÿÂMû@x›Á>6Ò¨ ÀØ×öÊø‹ñ/â/ìD­ûnÿÃ@~дÿ ýûù?²Åßü;¿í²Çů‹ÿ¿âÜü øKàïÚÓàOü(ŸÚÓÁß ¿d_øË¯Š¿?áÿ…¡ÿ ³âŸü$ß´‰¼ãm'÷úŠ(ñ‡àí ûËÿ™ý¹< ðçãìÁ'ÆOŠŸ³ì9á?ø;Á?þ¿Äψÿ~üHÿ‚”èÿü3®x{BÖŠ|añƒà¯Âá®—ñ'F¿³Ô|iðãáî“àkÛhÞ±Ð"‹àÙ‡þ mûCÅûa~ÉÆ_Ú»àÿ~þÕŸ5ÿ‚ÿ¾k>7Š¿eˆ^3øñâ§Â¿ƒÿ>ü<ý„>ø“öý§õ¯ŒŸ t€Þ ý˜¿i¿ø)wíƒñ1µøÃðWÃ0~ÕŸ<âOÚCáõ;E~ÿÁ+igýª¼A«_jßðWßþÔ^6øWñƒöÎðæ•û5|4¸ýƒQñÿìÕð·ö ø¿ð_à¯ÆïÚKøcð¢óâ¶»â {Âן ¼u¢üYøª~ÌŸ ~×ZÄ?ÛkÇÞøm¬¿ÁïŽ^ñOÀ?ÚKÅ0þ—«æ þÇ¿<1ñ–çãÐ_Œ/øˆ|AâÏhIñcö˜ý¥~5|=øyâ¯A¬éÚÿ‰¾|ø¿ñoÇþ ø€øoľ*ð&‰¬ü"ð‚u ü3ñ‡Œ¾xVçFøwâÿøcTü@ÿ‚o~Û¶Æ¿Úà‡Ç_ÛOö ¸ñOÅø‡RøÿûÞþÙ¿$|M·ž?ˆ>%öÊõƒòR¼7ÿqý0jµµ){ôcmªÁß¿½Õ[}R»{$’ZÞZÑ¿'ù/ò>ð¢Š+Ú1 (¢€>@ø[ã_ÛëWñÞ…§ükýšd‡ÿ ®?´ÿá&ñwÂßÛ‡ãGÆéV¨O£a|:ñgüÛàw‡üEöÿE¥išŸö‡Å/ ÿdh÷º†»ký·{¦[xwWúþŠ(ù‚ÿ‚{Ïû|hÿ‚˜üxø·«ÁS¾þÙŸ´oÃÚþ~Ê–Þ2×ÿà–ß>)üSø'qÿ÷øâoOðŸÅŸ eï |zðÿÃÿxëâGí¥áßÙ#Ç¿ ~ÂGà߉z—|#¯xÏÄ´f³ñíÿÙ›ö¤øà«ÿ¶§ìønoƒÿ¼mâ?ƒÿ³pøà]gÄß±ì|ñ Âß?à¢×ß?e? Þ|ø}ðÛâ·¼?û1ø[ÞñÏÃ/‹ºÅ‰Ÿ`ñ§‰¼Wâ¯ZÜüI×õMgözŠüýˆ¿l¯ˆ¿ÿj„¿ ¼aûnÿÂÀýŸÿã2¿á>:y?²ÇünkþÿÄXtO‰?ñ(ðÂ_£ÿ‡dù—_ ?âίÃÿøo?ù;¯‡¿ñÿüuám[Çÿà›ß¶ßí…ñ¯ö‡øañ×öÓýˆ.þÆþÿ‚xþÏ_´ÁÿŒ>(èúg…¼}à/ÚöÊý¥5„? <5ñ“Â_dø±ñ[MÑ>0øsú^¢€?”/~Ò¾ø¥ûQÁ>2üsý´>üGý£u¿ÚÄZí û?ø»áßÀ›-cþ åûB~Ð_ðNßÚ¯EÖ¿cïüVøiàøëöaÿ„§ãÕÝ·Á?dÛWÅ¿?iÚÇþ'ƒ|Wqã?ٗ㌾5þ¯h¢€?–/Ù‡þ mûCÅûa~ÉÆ_Ú»àÿ~þÕŸ5ÿ‚ÿ¾k>7Š¿eˆ^3øñâ§Â¿ƒÿ>ü<ý„>ø“öý§õ¯ŒŸ t€Þ ý˜¿i¿ø)wíƒñ1µøÃðWÃ0~ÕŸ<âOÚCáõ;EüÐþ͝ÆÿÚöÂýŸgðßü§àÿí[ðoâˆ>!x³Ä? ?f/‰¿³WŹí¾ê_>+x¿ÁÞ&øÑû*Åû|ý¬àž_ôo§ÃËH5ŸŠŸ¶Ïíkñ áoÆ]KàÿìwñZçã‰>2ëü)õügâ5׃¾$øóàoÇOø(ÏíûB~ÓQþзG…'ý>/Gû8øÇ ~hßµÆ|ý¡þ xcàÿìÕàÚáÃÿ~Ïúíá¿>(øßòuÖñßá‡> ø[@Ñ~"þÌ^°ý¾¢€?à•¿´³þÕ^ Õ¯µoø+ï‡ÿj/|+øÁûgxsJýš¾\~Á‰¨øÿöjø[ûP|_ø/ðWãwí ¥ü1øQyñ[]ñ½ákφÞ:Ñ~,üÕ?fO‚&ð®­ð>Ì|*ÖnoüiãŸÿ ~Ì?ðSoÚ/Û öHÐþ2þÕßükðïö¬øÁ¯üø­ðƒ[ø±ð‘¼Uû(|BñŸÀÏŒ>üø±ðáçì!ð·ÄŸ°—í?­|døk üðoìÅûMÿÁK¿l‰¨¯Æ‚¾ƒö¬ø‰à~Ò ©Ú(ù¡ýÿà£:Ûx«öBÖ<ÿAø?ûMxoö’ÿ‚þݰá VÙÃ0jŸ > j?µ‡ˆþ|^ºÖþh~ÕümûOøÛWð‡ì}àí?Å>—áÿìñâσ_µoÁOi_²í߯O‰øÿãÓàoí›ñ¿â¿Åoø&†,ÿà£> ×¾+~ÓŸ4«ÿø(?ì…ៃÿ³WˆõØçÇý‹ÿhÏÚOŲϋ|?ðN_~Ê_ŒŸ uŸƒ>,ø-û]j?ÿm¯xWá¶²ÿ¾9xÅ?ÿi/xÃú^¯˜<3ûüðÇÆ[ŸA~0x¿â!ñ‹ øÃ>øûû1Øx×üûwøÓÀ`Ùóã/í©â þ ?ûtþÉÿ´Ï~"x7à†µüÔ`ýºï¿àŸz·íyá/ž Ò>ü`øÑ¤|%ý•üEû#hþÔ~Ïû`øWÇ6ñ_Ãï‡<7î©à¯èzŠþh~þÙ¿þ+üVÿ‚`øbÏþ 3â {â·í9ñƒJ¿ÿ‚ƒþÈ^ø?û5xQýŽ|qáoØ¿öŒý¤üWû \ø·Ãÿåñ'ì¡áõøÉðÇYø3âςߵ֣ñöÚñ÷…~k/ð{ã—€|Sðö’ñGŒ?¥êùƒÃ?±ïÁ |e¹øôã‹þ"x³Åš|Xý¦?i__~x«ÆÐk:v¿âoƒß~/ü[ñÇÁ¿‚~ >ñ/м ¢k?¼àG¿ üaã/…޹Ѿø¿Ä¾Õ>Ÿ æ‡öý¡ÿnOþ×e~ÓŸ´þµ«øößý£cøïâsá¿ìsk¨üCý˜<­þßxÀ^9ðw†¿bŸ \ü6ðÿ‚<û4ÿÁ5>#øÛâß„5Ÿ øƒÅ^ÿ‚¿|6Ô¢Ô¼¤|týŒµ/ìÙ›ö¤øà«ÿ¶§ìønoƒÿ¼mâ?ƒÿ³pøà]gÄß±ì|ñ Âß?à¢×ß?e? Þ|ø}ðÛâ·¼?û1ø[ÞñÏÃ/‹ºÅ‰Ÿ`ñ§‰¼Wâ¯ZÜüI×õMgözŠüAÿ‚lüFºðwÄŸ| øéÿý ?hOÚj?Úöèð¤ÿ±çÅèÿgøïá¯Ãmö±øÑâ‚ÿ´?Ä |ýš¼û@|!øãÏÙÿBøu¯ü7ñ§ÅøcöNºÑþ;ü0ð'Á? h/Ä_Ù‹ÀvÁ=?k_„Ÿçý•<%ðŸöÒý˜'ý›¿i/ø*ÿüö?øWû*ü<ºýž<3ð—áßÂK_Œ¿·íð§Å?µ ê7Ÿ5ïŒïÄKÏÙwÀÿeðçŒü9ûütÿ‚Œþд'í5íûtxRØóâô³ˆüwð×á¶ûXühñGÁÚâ†>þÍ^ý >ü?ñçìÿ¡|:×þøÓâü1û']hÿþxàŸ…´ â/ìÅà;Ûê(ùbÿ‚z~Ö¿ >Ïû*xKá?í¥û0Oû7~Ò_ðUÿø*ìð¯öUøyuû"kß5߈—Ÿ²ïþËáÏøsöx—öxý«~ü<ðßìÕwñGÆŸ><øç¿ÿ‚o~Û¶Æ¿Úà‡Ç_ÛOö ¸ñOÅø‡RøÿûÞþÙ¿ø*ÿí©û>Û›àÿÇoxàÿìÜ>øYñ7ì{Æ_üBð·Æø(µ÷ÆÏÙOÂwŸ¾|6ø­ãïþÌ~ðç…|EsðËâî£ñ_âgÁX8þÄßþ|qñZ赯ÛFŒ¿/~&|/øû9ê|ñ'Çþ0Ð~?þïQ@„?ðJßÚYÿj¯j×Ú·ü÷Ãÿµ¾ü`ý³¼9¥~Í_ .?`ÄÔ|û5|-ý¨>/üø+ñ»ö…Òþü(¼ø­®øƒ^ðµçÃoh¿~ꟳ'ÁxWVøf>k77þ4ñÏÆÿ?coÛ»öªø¡ãO]~ÒÿðR_؃àµÏÄ/ƒÿüMûN~Ï—¿¶ïì£}ûCþÆÚ·À/|Hñµ·ÂÿÙ3Ä_ðMO„_>|`ý“>"hVOãï þÙµ/ímá_‚Ÿ < ñ“Ãôoþ6Ò->)hÔíü¡~ÉŸðSÏÚÇÆ>ý“õŸ~Ú³ÿÆíkÇŸ³ÿüÓö„ñ‡„t/…¿ ´/üJÖ?oÛŠ_ø'í3à==¼㙿±þþÉ¿ÙvÞ,ø¤¾ðÊxî×þ ã}2çYñßÂÙ– ;ö ¿õÿø&÷í·ûa|ký¡þØ|uý´ÿb üXðÿˆu/ÿ°ïí›ð3Ä¿´?ÁoMð“Å=ñÂO…ÿ±¿„?àž?³×í#ðãÀÏŠ:>™áox ö†ý²¿iMGáÂO |dð—ÄY>,|VÓtOŒ>þ—¨ æ‡ö?ÿ‚Œëmâ¯Ù Xñÿüàÿí5á¿ÚKþ ?ûuþÀ„5Yÿd Áª|$ø%¨þÖ#ø ñzë[ø9¡øCWñ·í?ãm_±÷ƒ´ÿø_‡ÿ³Ç‹> ~Õ¿<=¥~Ë·>$x#ãÿ~ ÿ‚lüFºðwÄŸ| øéÿý ?hOÚj?Úöèð¤ÿ±çÅèÿgøïá¯Ãmö±øÑâ‚ÿ´?Ä |ýš¼û@|!øãÏÙÿBøu¯ü7ñ§ÅøcöNºÑþ;ü0ð'Á? h/Ä_Ù‹Àv·ÔPŸüYÿ…Yÿ ³â_ü/OøWÿð¤¿á_øËþü-ŸøG?áV¬ÿ„sRÿ…ƒÿ /þø¤¿á_ÿÂ%ý¯ÿ —ü%?ñNÂ9ý¥ý·ÿϵWó…ÿ„ý¥|Gÿ wþ ðÃÀÿ¶‡ü/ßøÓöøCðßöýˆÿá]ü,ð?ü2ì÷à¿ØOÆþ1øñßþœ~µý±üöÿ‰ f߆ÿðп~/xÓögý ?᤿á`|ð†|%ñ÷öc°ðôûE<>ý»üiàŒ¿°?ìùñ—öÔñ÷ÆAÿýºdÿÚgÀ¿<ð ÃZŒþ j0~ÝwßðO½[ö‹¼ð—ÀÏé~0|hÒ>þÊþ"ý‘´ê?gý°|+ãx¯á÷ÿžŽ÷TðW°Á6~#]x;âO>ütÿ‚Œþд'í5íûtxRØóâô³ˆüwð×á¶ûXühñGÁÚâ†>þÍ^ý >ü?ñçìÿ¡|:×þøÓâü1û']hÿþxàŸ…´ â/ìÅà;Ûê(ñþ ³ñëÁß|yð7ã§ügö€ý¡?i¨ÿhۣ“þÇŸ£ýœ|G㿆¿ ´oÚÇãGŠ> þÐÿ<1ðöjðGíð‡áÿ?gý áÖ¿ð߯Ÿ|oáÙ:ëGøïðÃÀŸü- h¿f/Øyÿìkûe|Eø—ñö"Vý·á ?hÚÎÿ†þý€|ŸÙbïþßö¿Ùcâ×Åÿˆßñn~|%ðwíið'þOíiàï…_²/üe×Å_ŠðÿÂÐÿ…YñOþoÚÄÞ ñ¶“ûýE4?±ÿüg[o~ÈZÇÿà¨?ÿi¯ þÒ_ðQÿÛ¯öÐoÙ?øwÿ¦V¯ô2ñü‚m?ìhð?þ¦ž¯óÍÿ‚ÐÿÉóx£þÉÿÿý2µbÿÞ#ÿ^eÿ¥À¯±ÿo~‡ôÉûZÿÉåÁ;ÿì1ñ7ÿXï[¯­«äŸÚ×þO+þ ßÿa‰¿úÇzÝ}m^]máþÿéꦑÛîÿÒbQEbQñGí³ð“öAÔþø£öŸý­?g¿þÐz'ì›ðOã·Ž¬4OøÃ?¿³<º‡~!|K‡Â^ñý̯|m®Ú|ðݦƒ®ëQØêºgÙ®ôm7ÄþÑoÙ?øwÿ¦V¬_ûÄëÌ¿ô¸ö?íïÐþ™?k_ù<¯ø'ý†>&ÿëëuõµ|“ûZÿÉåÁ;ÿì1ñ7ÿXï[¯­«Ë­¼?Ã?ý=TÒ;}ßúLBŠ(¬J õƒòR¼7ÿqý0jµåõê?ä¥xoþãú`ÕkJ?Å¥ÿ_!ÿ¥!Kgèÿ#ï (¢½Ã¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(—ñü‚m?ìhð?þ¦ž¯óÍÿ‚ÐÿÉóx£þÉÿÿý2µ¡—‹ÿäiÿcGÿõ4ðýžoü‡þO›ÅöOþÿé•«þñúó/ý.}û{ô?¦OÚ×þO+þ ßÿa‰¿úÇzÝ}m_$þÖ¿òy_ðNÿû |MÿÖ;ÖëëjòëoðÏÿOU4Žßwþ“¢Š+‚½CàÇü”¯ ÿÜcÿL­y}z‡Áù)^ÿ¸Çþ˜5ZÒñi×ÈéHRÙú?ÈûŠ(¯pÀ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šåü_ÿ ›Oû<ÿ©§‡ëüóà´?ò|Þ(ÿ²ðïÿL­_èeâÿùÚØÑàýMð¢Š+Ü0 (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€9ÿÈ&ÓþÆÿêiáúÿ<ßø-üŸ7Š?ìŸü;ÿÓ+Wúx¿þA6Ÿö4xÿSO×ùæÿÁhäù¼Qÿdÿáßþ™Z±ïÿ¯2ÿÒàWØÿ·¿Cúdý­äò¿àÿöø›ÿ¬w­×ÖÕòOíkÿ'•ÿïÿ°ÇÄßýc½n¾¶¯.¶ðÿ ÿôõSHí÷é1 (¢±(+Ô> ÉJðßýÆ?ôÁª×—ר|ÿ’•á¿ûŒéƒU­(ÿ—ý|‡þ”…-Ÿ£ü¼(¢Š÷ Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( _Åÿò ´ÿ±£Àÿúšx~¿Ï7þ Cÿ'Íâû'ÿÿôÊÕþ†^/ÿM§ýÿÔÓÃõþy¿ðZù>oÙ?øwÿ¦V¬_ûÄëÌ¿ô¸ö?íïÐþ™?k_ù<¯ø'ý†>&ÿëëuõµ|“ûZÿÉåÁ;ÿì1ñ7ÿXï[¯­«Ë­¼?Ã?ý=TÒ;}ßúLBŠ(¬J õƒòR¼7ÿqý0jµåõê?ä¥xoþãú`ÕkJ?Å¥ÿ_!ÿ¥!Kgèÿ#ï (¢½Ã¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(—ñü‚m?ìhð?þ¦ž¯óÍÿ‚ÐÿÉóx£þÉÿÿý2µ¡—‹ÿäiÿcGÿõ4ðýžoü‡þO›ÅöOþÿé•«þñúó/ý.}û{ô?¦OÚ×þO+þ ßÿa‰¿úÇzÝ}m_$þÖ¿òy_ðNÿû |MÿÖ;ÖëëjòëoðÏÿOU4Žßwþ“¢Š+‚½CàÇü”¯ ÿÜcÿL­y}z‡Áù)^ÿ¸Çþ˜5ZÒñi×ÈéHRÙú?ÈûŠ(¯pÀ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šåü_ÿ ›Oû<ÿ©§‡ëüóà´?ò|Þ(ÿ²ðïÿL­_èeâÿùÚØÑàýMð¢Š+Ü0 (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€9ÿÈ&ÓþÆÿêiáúÿ<ßø-üŸ7Š?ìŸü;ÿÓ+Wúx¿þA6Ÿö4xÿSO×ùæÿÁhäù¼Qÿdÿáßþ™Z±ïÿ¯2ÿÒàWØÿ·¿Cúdý­äò¿àÿöø›ÿ¬w­×ÖÕòOíkÿ'•ÿïÿ°ÇÄßýc½n¾¶¯.¶ðÿ ÿôõSHí÷é1 (¢±(+Ô> ÉJðßýÆ?ôÁª×—ר|ÿ’•á¿ûŒéƒU­(ÿ—ý|‡þ”…-Ÿ£ü¼(¢Š÷ Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( _Åÿò ´ÿ±£Àÿúšx~¿Ï7þ Cÿ'Íâû'ÿÿôÊÕþ†^/ÿM§ýÿÔÓÃõþy¿ðZù>oÙ?øwÿ¦V¬_ûÄëÌ¿ô¸ö?íïÐþ™?k_ù<¯ø'ý†>&ÿëëuõµ|ÙûBÁ×íñÿƶ¹†+‹køÊ ‹yãI ž ¿díF9aš)G,RÆÌ’FêÈèÅX$W–þØ¿ðU_ƒ¿±ïÅ¿Ùsöxñx_Æ¿´ícñ³áÂïü+м7à+]WÃÞ ø“ñ?Døy­ügñÕÛxbÿþÏøsíúªxbÚ{7Õ~'xËI›Â~Š 'Gø…ãO‡¾uHs{=îÕD”R j­·y+$ŸçsHí÷~Q>墾bøË¯j:ßí«ÿÓÑ/þÁýyñ·ã÷ÚEŽ£é:f¥4?³çŽí-æÕ,4«+MR[[MGRµ³“PŠåìíõ=NS zêÏö/ü%ú·üúx_ÿÿò‚²”#ÂNNÓM¯u]ZN.þ÷––oä;½tÛÏÉ>ÞÕôåëÔ> ÉJðßýÆ?ôÁª×/ÿ ~­ÿ>žÿÂÁü £þý[þ}žÿÂÁü £ëÐÿŸrûÐ{7Ý_ÓþžŸ£Wç?ü%ú·üúx_ÿÿò‚øKõoùôð¿þþ ÿå^‡üû—ÞƒÙ¾ëúþŸôôý¢¿9ÿá/Õ¿çÓÂÿøCø/ÿ”Â_«ϧ…ÿð‡ð_ÿ((úô?çܾôÍ÷_×ôÿ§§èÅùÏÿ ~­ÿ>žÿÂÁü ¯ˆा1×Gì-ûMGnú^œ×? o¬f¹Ñü;áÝý¬µ GN²Ô,×QÒ4«+øíu ‹?Q·Žå"¿Ó®®´û´šÎêâ *8ÈÊQŠ„“””SmZíÛQ84›ºÑ_úü§§ïµòÿú¯úcäÿÛ·‘öoüý“ìŸØ¿õþÏþÀÿ™GþøÇÃýWý1òíÛÈû7þ ~ÉöOì_ú€gÿ`Ì£ÿücæžßûŸù7ÿj._>ß/ÿ%øPQ_/ÿªÿ¦>Oý»yfÿÁ/Ù>Éý‹ÿPìÿìù”áÿŒ|?ÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>ßûŸù7ÿj¾}¿_þKð> ¢¾_ÿUÿL|Ÿûvò>Íÿ‚_²}“ûþ ÙÿØó(ÿÂ#ÿøªÿ¦>Oý»yfÿÁ/Ù>Éý‹ÿPìÿìù”áÿŒ|=¿÷?òoþÔ9|û~<¿ü—à}AE|¿þ«þ˜ù?öíä}›ÿ¿dû'ö/ý@?³ÿ°?æQÿ„Gþ1ðÿUÿL|Ÿûvò>Íÿ‚_²}“ûþ ÙÿØó(ÿÂ#ÿø{îäßý¨rùöüyù/Àú‚ŠùýWý1òíÛÈû7þ ~ÉöOì_ú€gÿ`Ì£ÿücáþ«þ˜ù?öíä}›ÿ¿dû'ö/ý@?³ÿ°?æQÿ„Gþ1ðöÿÜÿÉ¿ûPåóíøòÿò_õòÿú¯úcäÿÛ·‘öoüý“ìŸØ¿õþÏþÀÿ™GþøÇÃýWý1òíÛÈû7þ ~ÉöOì_ú€gÿ`Ì£ÿücáíÿ¹ÿ“ö¡ËçÛñåÿä¿ê +åÿõ_ôÇÉÿ·o#ìßø%û'Ù?±êýŸýÿ2ü"?ñ‡ú¯úcäÿÛ·‘öoüý“ìŸØ¿õþÏþÀÿ™GþøÇÃÛÿsÿ&ÿíC—Ï·ãËÿÉ~ÔWËÿê¿é“ÿnÞGÙ¿ðKöO²bÿÔû?ûþeøDãõ_ôÇÉÿ·o#ìßø%û'Ù?±êýŸýÿ2ü"?ñ‡·þçþMÿÚ‡/ŸoÇ—ÿ’ü¨(¯—ÿÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>ê¿é“ÿnÞGÙ¿ðKöO²bÿÔû?ûþeøDãoýÏü›ÿµ_>ß/ÿ%øPQ_/ÿªÿ¦>Oý»yfÿÁ/Ù>Éý‹ÿPìÿìù”áÿŒ|?ÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>ßûŸù7ÿj¾}¿_þKð> ¢¾_ÿUÿL|Ÿûvò>Íÿ‚_²}“ûþ ÙÿØó(ÿÂ#ÿøªÿ¦>Oý»yfÿÁ/Ù>Éý‹ÿPìÿìù”áÿŒ|=¿÷?òoþÔ9|û~<¿ü—à}AE|¿þ«þ˜ù?öíä}›ÿ¿dû'ö/ý@?³ÿ°?æQÿ„Gþ1ðÿUÿL|Ÿûvò>Íÿ‚_²}“ûþ ÙÿØó(ÿÂ#ÿø{îäßý¨rùöüyù/Àú‚ŠùýWý1òíÛÈû7þ ~ÉöOì_ú€gÿ`Ì£ÿücáþ«þ˜ù?öíä}›ÿ¿dû'ö/ý@?³ÿ°?æQÿ„Gþ1ðöÿÜÿÉ¿ûPåóíøòÿò_õòÿú¯úcäÿÛ·‘öoüý“ìŸØ¿õþÏþÀÿ™GþøÇÃýWý1òíÛÈû7þ ~ÉöOì_ú€gÿ`Ì£ÿücáíÿ¹ÿ“ö¡ËçÛñåÿä¿ê +åÿõ_ôÇÉÿ·o#ìßø%û'Ù?±êýŸýÿ2ü"?ñ‡ú¯úcäÿÛ·‘öoüý“ìŸØ¿õþÏþÀÿ™GþøÇÃÛÿsÿ&ÿíC—Ï·ãËÿÉ~ÔWËÿê¿é“ÿnÞGÙ¿ðKöO²bÿÔû?ûþeøDãõ_ôÇÉÿ·o#ìßø%û'Ù?±êýŸýÿ2ü"?ñ‡·þçþMÿÚ‡/ŸoÇ—ÿ’ü¨(¯—ÿÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>ê¿é“ÿnÞGÙ¿ðKöO²bÿÔû?ûþeøDãoýÏü›ÿµ_>ß/ÿ%øPQ_/ÿªÿ¦>Oý»yfÿÁ/Ù>Éý‹ÿPìÿìù”áÿŒ|?ÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>ßûŸù7ÿj¾}¿_þKð> ¢¾_ÿUÿL|Ÿûvò>Íÿ‚_²}“ûþ ÙÿØó(ÿÂ#ÿøªÿ¦>Oý»yfÿÁ/Ù>Éý‹ÿPìÿìù”áÿŒ|=¿÷?òoþÔ9|û~<¿ü—à}AE|¿þ«þ˜ù?öíä}›ÿ¿dû'ö/ý@?³ÿ°?æQÿ„Gþ1ðÿUÿL|Ÿûvò>Íÿ‚_²}“ûþ ÙÿØó(ÿÂ#ÿø{îäßý¨rùöüyù/Àú‚ŠùýWý1òíÛÈû7þ ~ÉöOì_ú€gÿ`Ì£ÿücáþ«þ˜ù?öíä}›ÿ¿dû'ö/ý@?³ÿ°?æQÿ„Gþ1ðöÿÜÿÉ¿ûPåóíøòÿò_õòÿú¯úcäÿÛ·‘öoüý“ìŸØ¿õþÏþÀÿ™GþøÇÃýWý1òíÛÈû7þ ~ÉöOì_ú€gÿ`Ì£ÿücáíÿ¹ÿ“ö¡ËçÛñåÿä¿ê +åÿõ_ôÇÉÿ·o#ìßø%û'Ù?±êýŸýÿ2ü"?ñ‡ú¯úcäÿÛ·‘öoüý“ìŸØ¿õþÏþÀÿ™GþøÇÃÛÿsÿ&ÿíC—Ï·ãËÿÉ~ÔWËÿê¿é“ÿnÞGÙ¿ðKöO²bÿÔû?ûþeøDãõ_ôÇÉÿ·o#ìßø%û'Ù?±êýŸýÿ2ü"?ñ‡·þçþMÿÚ‡/ŸoÇ—ÿ’ü¨(¯—ÿÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>ê¿é“ÿnÞGÙ¿ðKöO²bÿÔû?ûþeøDãoýÏü›ÿµ_>ß/ÿ%øPQ_-<Ks¤YÜÃÛOâ? ØÜZO,A'ˆ´»Ilfµiq¼O–Ö’iϧ¢Ñ‹xfðÉðïÀÿÇÿÛ þ «ðwöøñû%ü%ý¡ÓÂþ ðOícÿ GÒ¾5jð¯ƒ~øËáµÏÂh¼?cñü0ŸØþ ñ¯ü,›Ë+©&•ðÿUÒt{Ÿiðx'Xñ/Ž</f’¦äÚm(´ßº®ôitÚ×oî¹Ë¥ïe§ãoóþº~þø¿þA6Ÿö4xÿSO×ùæÿÁhäù¼Qÿdÿáßþ™Z¿¨/‹Þ%Ö5/Ûsþ ›¦Í5­¾œÿ¾/_Oa¥izV‰ew{iû?øê +Ëë]Ê û«/õtû‹Øç–Â-GQŽÍàMBñgþ_à´?ò|Þ(ÿ²ðïÿL­E:Š­XM+)Q“ßJ‘_šV¿½ÿ¶ŸÒ§íñ+À_¿lOø'GÄïŠ,Ñ|àx³ÆZlj¼Sâ ´²Òô«ÿe;ÈQ¥‘ƒI=ÕÝÔÖöfiÆ£«jwVz^™kw¨^ZÛKò7í#ñþ CûUj¿|KñkãGÃûÏ~Í?>|zø+ãí}GNñ—‚ÿÑ6øÿ…-¯ÿC•r9CÝæSN¥œjSÔªM½%wåӮ锯m-ÓtßHÿÃÿNߘ>6ý¹ÿdO~×°‡ô¯ßgðwÂo‰ŸÿÑ6øÿ…-¯ÿC•ð±~>ÿÑ6øÿ…-¯ÿC•´;TÿÁ´È///º^_çøzÛäøyì3ÿG%ðÿþûÖ¿ùQGü<öÿ£’øÿ}ë_ü¨¯­ÿábü}ÿ¢mð#ÿ [_þ‡*?ábü}ÿ¢mð#ÿ [_þ‡*9hv©ÿƒhÿ^^_t¼¿Ïðõ·Éðò?ØgþŽKáÿý÷­ò¢¾Qý¹¿noÙ#â‡ì‘ñßÀ^øïàx¿Äž¸´Ð´+K‹ø.õ;¸/ì/^ÚÙïl-mÚá­ífhai–K™míÖ[‰b‰ÿYábü}ÿ¢mð#ÿ [_þ‡*?ábü}ÿ¢mð#ÿ [_þ‡*qö1”d•KÆJJõhÚéÝ_E {Í[M|Ÿ[Ÿáëo±ÿÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>ê¿é“ÿnÞGÙ¿ðKöO²bÿÔû?ûþeøDã>8ÿ…‹ñ÷þ‰·Àü)mú¨ÿ…‹ñ÷þ‰·Àü)múªý¤©SÿäÄ–ß.ûž^_Õ¾ÇÿUÿL|Ÿûvò>Íÿ‚_²}“ûþ ÙÿØó(ÿÂ#ÿøªÿ¦>Oý»yfÿÁ/Ù>Éý‹ÿPìÿìù”áÿŒ|øãþ/Çßú&ß?ð¥µÿèr£þ/Çßú&ß?ð¥µÿèr£ÚGú•?þLÛåÑÿsËËú³·Øÿê¿é“ÿnÞGÙ¿ðKöO²bÿÔû?ûþeøDãõ_ôÇÉÿ·o#ìßø%û'Ù?±êýŸýÿ2ü"?ñŸÂÅøûÿDÛàGþ¶¿ýTÂÅøûÿDÛàGþ¶¿ýT{HÿR§ÿÉ‚[|º?îyyVvûýWý1òíÛÈû7þ ~ÉöOì_ú€gÿ`Ì£ÿücáþ«þ˜ù?öíä}›ÿ¿dû'ö/ý@?³ÿ°?æQÿ„Gþ1óãøX¿è›|ÿ–×ÿ¡ÊøX¿è›|ÿ–×ÿ¡ÊiêTÿù0Ko—GýÏ//êÎßcÿªÿ¦>Oý»yfÿÁ/Ù>Éý‹ÿPìÿìù”áÿŒ|?ÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>|qÿ ãïýoøRÚÿô9Qÿ ãïýoøRÚÿô9Qí#ýJŸÿ& mòèÿ¹ååýYÛìõ_ôÇÉÿ·o#ìßø%û'Ù?±êýŸýÿ2ü"?ñ‡ú¯úcäÿÛ·‘öoüý“ìŸØ¿õþÏþÀÿ™GþøÇÏŽ?ábü}ÿ¢mð#ÿ [_þ‡*?ábü}ÿ¢mð#ÿ [_þ‡*=¤©SÿäÁ-¾]÷<¼¿«;}þ«þ˜ù?öíä}›ÿ¿dû'ö/ý@?³ÿ°?æQÿ„Gþ1ðÿUÿL|Ÿûvò>Íÿ‚_²}“ûþ ÙÿØó(ÿÂ#ÿùñÇü,_¿ôM¾áKkÿÐåGü,_¿ôM¾áKkÿÐåG´õ*ü˜%·Ë£þç——õgo±ÿÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>ê¿é“ÿnÞGÙ¿ðKöO²bÿÔû?ûþeøDã>8ÿ…‹ñ÷þ‰·Àü)mú¨ÿ…‹ñ÷þ‰·Àü)mú¨ö‘þ¥Oÿ“¶ùtÜòòþ¬íö?ú¯úcäÿÛ·‘öoüý“ìŸØ¿õþÏþÀÿ™GþøÇÃýWý1òíÛÈû7þ ~ÉöOì_ú€gÿ`Ì£ÿücçÇð±~>ÿÑ6øÿ…-¯ÿC•ð±~>ÿÑ6øÿ…-¯ÿC•Ò?Ô©ÿò`–ß.ûž^_Õ¾ÇÿUÿL|Ÿûvò>Íÿ‚_²}“ûþ ÙÿØó(ÿÂ#ÿøªÿ¦>Oý»yfÿÁ/Ù>Éý‹ÿPìÿìù”áÿŒ|øãþ/Çßú&ß?ð¥µÿèr£þ/Çßú&ß?ð¥µÿèr£ÚGú•?þLÛåÑÿsËËú³·Øÿê¿é“ÿnÞGÙ¿ðKöO²bÿÔû?ûþeøDãõ_ôÇÉÿ·o#ìßø%û'Ù?±êýŸýÿ2ü"?ñŸÂÅøûÿDÛàGþ¶¿ýTÂÅøûÿDÛàGþ¶¿ýT{HÿR§ÿÉ‚[|º?îyyVvûýWý1òíÛÈû7þ ~ÉöOì_ú€gÿ`Ì£ÿücáþ«þ˜ù?öíä}›ÿ¿dû'ö/ý@?³ÿ°?æQÿ„Gþ1óãøX¿è›|ÿ–×ÿ¡ÊøX¿è›|ÿ–×ÿ¡ÊiêTÿù0Ko—GýÏ//êÎßcÿªÿ¦>Oý»yfÿÁ/Ù>Éý‹ÿPìÿìù”áÿŒ|?ÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>|qÿ ãïýoøRÚÿô9Qÿ ãïýoøRÚÿô9Qí#ýJŸÿ& mòèÿ¹ååýYÛìõ_ôÇÉÿ·o#ìßø%û'Ù?±êýŸýÿ2ü"?ñ‡ú¯úcäÿÛ·‘öoüý“ìŸØ¿õþÏþÀÿ™GþøÇÏŽ?ábü}ÿ¢mð#ÿ [_þ‡*?ábü}ÿ¢mð#ÿ [_þ‡*=¤©SÿäÁ-¾]÷<¼¿«;}þ«þ˜ù?öíä}›ÿ¿dû'ö/ý@?³ÿ°?æQÿ„Gþ1ðÿUÿL|Ÿûvò>Íÿ‚_²}“ûþ ÙÿØó(ÿÂ#ÿùñÇü,_¿ôM¾áKkÿÐåGü,_¿ôM¾áKkÿÐåG´õ*ü˜%·Ë£þç——õgo±ÿÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>ê¿é“ÿnÞGÙ¿ðKöO²bÿÔû?ûþeøDã>8ÿ…‹ñ÷þ‰·Àü)mú¨ÿ…‹ñ÷þ‰·Àü)mú¨ö‘þ¥Oÿ“¶ùtÜòòþ¬íö?ú¯úcäÿÛ·‘öoüý“ìŸØ¿õþÏþÀÿ™GþøÇÃýWý1òíÛÈû7þ ~ÉöOì_ú€gÿ`Ì£ÿücçÇð±~>ÿÑ6øÿ…-¯ÿC•ð±~>ÿÑ6øÿ…-¯ÿC•Ò?Ô©ÿò`–ß.ûž^_Õ¾ÇÿUÿL|Ÿûvò>Íÿ‚_²}“ûþ ÙÿØó(ÿÂ#ÿøªÿ¦>Oý»yfÿÁ/Ù>Éý‹ÿPìÿìù”áÿŒ|øãþ/Çßú&ß?ð¥µÿèr£þ/Çßú&ß?ð¥µÿèr£ÚGú•?þLÛåÑÿsËËú³·Øÿê¿é“ÿnÞGÙ¿ðKöO²bÿÔû?ûþeøDãõ_ôÇÉÿ·o#ìßø%û'Ù?±êýŸýÿ2ü"?ñŸÂÅøûÿDÛàGþ¶¿ýTÂÅøûÿDÛàGþ¶¿ýT{HÿR§ÿÉ‚[|º?îyyVvûýWý1òíÛÈû7þ ~ÉöOì_ú€gÿ`Ì£ÿücáþ«þ˜ù?öíä}›ÿ¿dû'ö/ý@?³ÿ°?æQÿ„Gþ1óãøX¿è›|ÿ–×ÿ¡ÊøX¿è›|ÿ–×ÿ¡ÊiêTÿù0Ko—GýÏ//êÎßcÿªÿ¦>Oý»yfÿÁ/Ù>Éý‹ÿPìÿìù”áÿŒ|?ÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>|qÿ ãïýoøRÚÿô9Qÿ ãïýoøRÚÿô9Qí#ýJŸÿ& mòèÿ¹ååýYÛìõ_ôÇÉÿ·o#ìßø%û'Ù?±êýŸýÿ2ü"?ñ‡ú¯úcäÿÛ·‘öoüý“ìŸØ¿õþÏþÀÿ™GþøÇÏŽ?ábü}ÿ¢mð#ÿ [_þ‡*?ábü}ÿ¢mð#ÿ [_þ‡*=¤©SÿäÁ-¾]÷<¼¿«;}þ«þ˜ù?öíä}›ÿ¿dû'ö/ý@?³ÿ°?æQÿ„Gþ1ðÿUÿL|Ÿûvò>Íÿ‚_²}“ûþ ÙÿØó(ÿÂ#ÿùñÇü,_¿ôM¾áKkÿÐåGü,_¿ôM¾áKkÿÐåG´õ*ü˜%·Ë£þç——õgo±ÿÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>ê¿é“ÿnÞGÙ¿ðKöO²bÿÔû?ûþeøDã>8ÿ…‹ñ÷þ‰·Àü)mú¨ÿ…‹ñ÷þ‰·Àü)mú¨ö‘þ¥Oÿ“¶ùtÜòòþ¬íö?ú¯úcäÿÛ·‘öoüý“ìŸØ¿õþÏþÀÿ™GþøÇÃýWý1òíÛÈû7þ ~ÉöOì_ú€gÿ`Ì£ÿücçÇð±~>ÿÑ6øÿ…-¯ÿC•ð±~>ÿÑ6øÿ…-¯ÿC•Ò?Ô©ÿò`–ß.ûž^_Õ¾ø‹ñ+À_|'wñ/⇋4_øÁz§†5x›Äi¥izM„>(Ñ¬Ò C *In®®´û}#LЭ4×Ôu=OO³ðþ™á 5ן?>0|_ÿ‚Pü{øñû7~Ðÿ¾4|?ñ¯¿dïøY‡Á]+XŸQºðo‡üeñ&çáÌó|E¾ðü¾íx+þ¶šÿ¯¯oJðž««j,¶Ñçñ¶àøCõcþ/Çßú&ß?ð¥µÿèr£þ/Çßú&ß?ð¥µÿèr¤å Y¾tÕÒq©J:IY§w-Ö4lk·MÓ袼¿¯¿>t¿ÚwàíûyÿÁ:,> |Sð¿Ä ï ü`ø¯w®Yè—"ïO´Ô¾øâ;™-ïm­&–ÞY­&‰æ·Ic‚O).&¹·þ Áhäù¼Qÿdÿáßþ™Z¿±oøßã¾§âï i·> ø/¡Ûê#Ñ,n5­+Z³ÔuM½NÖÞ]SMÓäø ¢Ç}§¤wgfúÆ’—7ÇjvÍÔ_ÇOü‡þO›ÅöOþÿé•«|;‹œTSQ*‰^P“w© =bÿ½Õ--¾¶R½µêÓÙ®ž~Ÿçcúÿ‚¶Þøâ׳øs©kzo‹¼Oû%xÀxâ×Ä€÷ú͇ÄÛ?þ ÛàøJãã7›kï‰? 4OøsÄš·ƒ¼KãéÚ¯ˆôokº­Ö™£ê÷ºe×çÿÇ[Š_µÙàŸü!ÿŸü'_>|SšÓþ¯öÇý·÷ÂÿSÿ‚)øK@¸ÿ„×ö™µø}öOµÿÂÁñTð‹ßü7ñ?ü ÿÙßÚß »ðß…¼á‰Hñ®‘¨ë«'Œ-n¾|Cð‰4>ßÃ> °‹QðG‰þÙøŸJÖ.e°Õ‡âÿìñûy~Øÿ>ø—âG޾üø់?±GÄoÚïögñ¯Ç|-øwðçÀŸØZÃÝ{¶_®ü ûb|uø¹ñ·àž•§ü^ðÆ­ñö€›àŸìqÿ ãBðÅ„šïà 3Äß*üGðæû~Ø^9µðý§Ä{OŽ?³•½¦‰¢x»ÁÞø¬éZ§Åß Xj°ø.8#ƒ^Ô×NÐ5/¹tÙ+ö]ðÿü.쇳^‰ÿ ý§ÿ ÿû#àü:oü/?í¿øH¿¶ápýá”?ð³µÿá0ñoöŸü&¿Ûoÿ„£Ä_kó¶õ?µz†«ðëÀÚíÿ†µMsXøy¬ê~ Öçñ/ƒµWÃþ&Ôoü'â;¯xƒÁ×^ ðÕÝß‚&¸Ðµ»Ÿø³Å>ŸUÒ䵿›Ãž%ñ‡$í¦k:­Ì;ssEAZú)Ån¬¾Ýôîšn×Ѳ¾o§GåùÿŸcó+ß þ*üKøkû ~Ñ~4Ñ4oþÐ?³ÏíÉá_xS\ø‡ˆÿlO ü*ñ‡ÄÏ xCö|Ò4\ÝøïÂÞ=Öþ~Í_­þ~Ó?µíOã×ߟáf¶ÿ¾-Ûø·]ñÇü¿Áß¶×íâoþÀüe¡x'áÁÚGàŸìiâÿˆ_aø!㯎ž ñíûSê¾ÒölðÆ™à?>øƒû+bïXÑmü ñïã‚>6üÕ5_‰z…ü]⟠xÇÂ'‡~6~ÂÏðëÀ×^#Ò¼cu¬|<¹ñv…¢xƒÃZŠgðÿ‰¦ñáÏ_økTñO‡ô­rO6§§hž%ÔüàíGÄU¥Ô6Íÿ„ü5w¨Ásq¡irZüóð×öý—~x¦Ãâ-Ž‹ð‡Å4O|wñ¯†>5ø×áì:߯?ÿÃCücø¿ñ·Ç^ð—Äx~Xx›Ãþ µñ7Ç?ˆº>ƒ é÷Ñy>Öîôýbï[Ô5-wVÕÅk;¨Þí¤¥ 潯+/²®Óµ´M¤··ïÓ]¾ÿÇ­¿>>þÙ´7ÆëO ü>ƒÃZ&‘ð¯ö…ø£ûþÒ?±ÇßüÑ<1áÍCáÿ‚ਿðNýÀ߈<áŸÛOâÏÄŸ‹ú'м9ûGü6ñ¦ªŒÿ¬µïjÖ?P¾~Ò_®¼Yã¿„>9ø/­üoñwÂ_ÚÏàGÄ?_³ö›ðÏá­Ã^ø-û9üzÒ~$x«áwÇOÚZëâO…tM/ß´ZxZÿAømâoÚ+ÄzÌß üSã(,ôxSáů¼ê°ì/«j¿uÝWöyýµ=oãÛ¿ámk‡ìëáËÝWâöŸŒ´ˆº—ü,]Bçá·~6þÐøƒáßøêûþYµ?µøËBÑüO?™­é–WÐ{_ï‚¿þø7Gøuð–ßáÂï‡ÞþÐÿ„À¿¼«ø'Áºö¶«}®ê¿Øþð×€tÍLþÓÖõ=KXÔ>ÅcÛu]BûP¹ónîçšG.W(Çvõ”»²½Ôït•­¢oÞi=ïûšíÓm{î¶èíüìøÏöºý¦ì<_ûþÚZWÂïê´ìãÍWöoøà?†Ú¿‡üGð¶ÿöÈý®?à‘žð׆¾!xÓÇ¿´vŸáÚ/[ðÇÆ¿L³ÚMûøsâÿ‚µ»GÄtÏÛxƒá—¨x›þ ûmøJñ@ñçÃÿ‚~ ñ7ìñðOößý¢>7øSÄþðö¥ã/‹ ý’¼ûüPÐü¡xoàwí«ñÿÃ?±ÿ¾"xgö«Öü;£ñ âwí?ªÙé^ð/Ç&øc†~&éÿ4ïØkØ—ö:Ò¼Gñ3Æ:_ÁÙGMñwÆ­Æ~øÉâ›ZUŸˆþ-xsâ=újŸü?ñ3\·øW§ãÍÇšœqê>3Ò¼SuªØx¢þ4»× ¾¸Umèÿ²Wì»áߨü:ðÿÃÙ¯Bø}¦x'â/ÃM7Àº?ÁøtÏéÿ~0jº~»ñkÀ>²øe‰iàŸŠ:Þ“¥k|+Œzµ]3OÔ0iÚGÂøSû]øŽÂÃâïÆ_‡žÑ4OöÌø]ÿvý«t½Æw×þ5°ø[ñ§þ Wâ;Ø*Hµ ~\|Aø]ðcÂ?¾ øù<n<âψ~#¶ø™¦7ÄŸiž7ð³|2ý†ø‹û%~Ë¿4­cBøµðãökø£¢x‹ÆÚÄ¿hÿ~Ããm+]ø¤ø6ÇáÖ•ãýcOñ/Ã-NÓSñ¶™ðûLÓ| §øªöõÛ/éö>¶¿‹D´‚Æ3ÇŸ³Â?‰¿¼?ñÇ^%ð¿Š?±> ütø}à]{HÕõ¿‡>0øsûCë¿õ߈ºg|1¬|7¿ÿ„ƒí_ð£<1£ÚYÍ}…6…­ø·O×tmoûKO›HK—´uJþô7MIí-¤ÒVÑEj·h£O˯ß÷ë±øóñGÇŸµ‡ìëñûöÍø÷wñöyñ¶§û:Á5ÿf?¼=mû<|Ið­‡Æÿ|7ø»ÿ;ñö‘à„·²þÔþ'¸ýžµ»ßè„u/øÆ/ÚRÁüGªYxÚ×ÀÖºf“?5ƒö¥ÿ‚”þÐßuŒ^;øwðßDñïìëm¢~Ø~ø?ñ Ä¿ 4O øsOý¡¿d/Ù“öø³ã}3Ä,³ý°5Ï‹ÿ4M7âÿìñcáF«áy¿dÙÏDÔ,&¸ñO„~,øÇàÇì£âÏŠž,Ñ5_ x§âg‰~iZïÄøs]ð<ÿ µÏøƒÆZ§Â»¯ë:&³ðÚêëáî«¥j:•͆£à{™ü'wÚ ÒX0œoyF/K|TÕÕ¢–ŠJÎé»ÝÙ>[5±éåÝöêü¿ÏK3à~Óßµ‡þ9hŸ±¦¹â_ÙçÄ_þ"ëçðwí¥|ø“ᯅ^ ðçÅo†·§ÄË­+Ä¿³ßí)âxë[Ñ­ÿàŸ¾)Ð ñ—ûLøÂòoŽ>ÖdðÔ ðQÒ>/|»?üöê)ã]/Âß¾|NÔÿf]ãW?høAøwðËáW‹ü9ðëöÍý¶?fß ÚOâ/ÚöôøMqû$hš„b½sÅ>%ø©$¶í‡‡æñ¾«®jŸ4}3á®›¡|[ý¡ý ¿d_ƒ¿´_ÃÿˆÞñ_ˆþi´O‡þñw øMàˆ~#Õ<9ðÃÇ_|áýWFø÷û=|bømâ­þ#Õ¼M{áý+ÇñM‡…oü_â_øBøºþ/Zñ? àž±×Çÿ~[øà7Œ­ÿg-oÄ^0ø=âO|(Òµ¿ü?øãO‰þ7ñ÷ÃÑgðƒJðçÂ]oÅJøÑ´ƒ~øwà ßÚhš7ÃÏ x;Â>ðŸ‡4!rÚî0nëKâ|ÒÒKI]%ì­ÌµÑ­{»|ÿ»äï×~íw·ä§ÃoÚ·ãOÂ?…ß¶e×þ[xGö.Öÿà _¶WÅmÇžñg‹|GñßÞ'ÿ‚”ÁPd_„¿|Sáï‰>Ó>ëvgì­â;Fø›âO~Ð6wÿ´MD|3µ·øs¥üEú÷¿µ/íâoŒõ¿í‚v_³ïÆÏÛ_ö³ý?áXÿ®ñÕÏÆ? ÿÃ.ø[öÓ´ÿ…‰ÿ ×þu¿‚uŸøN|mû ÂAÿü3®“ÿÏ…¾!ÿÂÿ ?ˆ5o Âsâo¿õßÙ+ö]ñF«à]wÄ¿?f¿k ¼m≠õwàü:¶«ðëâ7¼eÄ_øÿÀº†¡ðÊâïÂ>6ñwÄx'Õoîõ¸’ù|Oþ×û=\~ØÿðÛÚ¿Œ#ÝØé~(¿øáðÿÃ^ð¶‰ãO‡O¥hÞ1´ùç]ý§hßÚOQý|OðOâ?Á?ƒð”~Úú·ÁëM&ɼuûCø[Rÿ„;öý´~$x×Ä_ãð—ÄoÙ¿þ‡Á?ŒßaøoñsöDÒ#ÿ„àä_³ÿ훫jz—ü.}àŸÂ/Ö½wöJý—|Q¥xBñ/ÃÙ¯ÄZ'ÂïøŸá§Ã=]ø?­¥|:øsãoÃðëÆ~ð.Ÿ¨|2¸´ð‚|]ðúÞøŸÂ¾‡OеÿÁ†5[ ½$±]¯~Î>*Øx·Kø¡á€ß4Ïèžð׎ôï|5¹ñ…‡|9ð÷ÄzÇŒ|áÿÚx‡áÖ£oâMÀþ.ñ¿âŸéZÌw¶ñ¹¬kš,Zž§{u:Ó´vI{ÔôÒ×ø­&þ-vk—gqýënËîíoVögS_Á5åß°ý™Gì­ÿª/À•÷ÿö“ÿCÇ…ÿðÆŸüÈW—|ø ào€_¾| ðwÄ[-KÂ?~xá/…µ¯‰¯»ÿÉÕ~iz,ß…¼]᯶‰à¿†Ú§‡|5àÛ­fçáýׇ4-+á÷Œ|#âÏ…skžÖ~xÓÿ࢟µ÷‚ÿgÿÙÃâ?޼;ðOã/ÄÛOö^øOñ¿àÇ…þ|-ñ7ÂÏøU~2ø¡ñ¿öømàßiŸjèŸ<½oöððlj47ÅÙOJ¿ÿ…A©øS]ñ—…m>*Åãÿ„_°ÚWìKûh^8ñ/ÄÝàÇ죣|Iñ¦·‰|cñ Jø¥iÞ8ñgˆí~ xâͯˆ]xsJðu׆>\øGBø]âú…§øks7‡4o‚Þ,°ð֗⟄V‡'æÓ4ï…Þ%Ó<àí;Ä´µ‡Âz͇„ü5i¨é76ú—®žíÝ㜜å£_ ÷´ÖÚ¦®´}…ÛWµ¶~ZëúíwÙŸ þο´í+ã«?èô?‚ > 蟵ˆ> |Ið÷мCàÇ_üÿ «­ü|ðÜ_ >|#ý¤ÿjÍáŸÆÈu½oÁºÿÂï|zøªë?³Ÿ€üñô[xRÓÇ^ð·…{oÚoPñ–ûDÿÁ9nøsÀ>ð†>xÂ? µ½cÄ¿ ü-àÿ†·>ðçÃø†Ãź^¿âèz/ë-3ÁúÞ¹¦xÿÇzv±ªøz×N¿Ôì2x߯~_Úê´OŒšŸíª|wøgàÆ¿ oþXxrÃá7Š|sû@Ü_\|Q‡õ¯Jý‰c­ Ç%ø›¡üý”to‰>4Öàñ/Œ~!i_´­;Ç,ñ¯ÄüYµñ‰|Yið®{]Öí¾*xOÂß ÕuKû«ø~ xkÃþ2Žuñ§jVݬÿ³‡À ©´«‹¯ |¹¸Ðµ¿x—Cž†·3M£xÅŸ|5ñÛÅ> Ò¥“áÓ>­ø—ã‚üñ“Ä­£C¬üU🆾!ê3Üø»BÒõ{SÝV÷bõmÞTõNí/‰ìíê—fÐkÝôééÿÒï±ñ·Â_uÏ^ü(ñ÷Š?g–ñwÂ_Úòçöxø¡âˆtÏ|/‡ãw‡5_Ø{Mý­´ýþë^?ø—©èt Oâ_4¿xOÄ?þ#ØjŸ ¾ümø¥ey ÜjZ7„ü·ûMê2ÑÿhŸø'-LJþ"øÛÞñíCñSÀ¾<ø{¡_iV ø“¥_þõÇ4I¼t«£¿‰µøB¼MðÛJÕ|1¡Aâ[¾«7ˆÌå讣ûIÿ¡ãÂÿø ãOþd(þÀÒèxð¿þxÓÿ™ 9_xÿàpÿä‚þ¿sþºþ}™ËÑ]Gö“ÿCÇ…ÿðÆŸüÈQý¤ÿÐñáüñ§ÿ2r¾ñÿÀáÿÉý~çýuüû3—¢ºì 'þ‡ ÿà'?ù£ûIÿ¡ãÂÿø ãOþd(å}ãÿÃÿ’ úýÏúëùög/EuØOýÿÀOó!Gö“ÿCÇ…ÿðÆŸüÈQÊûÇÿ‡ÿ$õûŸõ×óìÎ^Šê?°4ŸúÌå讣ûIÿ¡ãÂÿø ãOþd(þÀÒèxð¿þxÓÿ™ 9_xÿàpÿä‚þ¿sþºþ}™ËÑ]Gö“ÿCÇ…ÿðÆŸüÈQý¤ÿÐñáüñ§ÿ2r¾ñÿÀáÿÉý~çýuüû3—¢ºì 'þ‡ ÿà'?ù£ûIÿ¡ãÂÿø ãOþd(å}ãÿÃÿ’ úýÏúëùög/EuØOýÿÀOó!Gö“ÿCÇ…ÿðÆŸüÈQÊûÇÿ‡ÿ$õûŸõ×óìÎ^Šê?°4ŸúÌå讣ûIÿ¡ãÂÿø ãOþd+Ïü}£ø’xtÁ4°Ñ"ÖïÌ1ø‰ ¦¯ÿ _ƒ<*¨¿h_†zn±¤iVòüAÖXËekâ­VóOµøeÿÏA­ø¶ïKÔ|Ô.ÒrŒWWÍeè›mö]ûn+öMü½?ÏóìÎÄgÓ<[káÏëz6‚|3ão xsâ/Äj½Ò|7â½SS€hÿ< g sIâ_Ž^/’7³ñ¶QOgð?ÃÛö³-§ŒtÛÛ¯†ßÉÇü‡þO›ÅöOþÿé•«úðï¯èW¾ Ô´ë?hðj—ú‡<;luxcà¿Â“-½Æ¯¦ü=³Õ´{øMþ1ügòMÅoþ1‡BÖt>[˜¼!¡>ϯ…–ÿø-üŸ7Š?ìŸü;ÿÓ+W~Ùªª4ÚiR•íÕ¹ÃVí«vû­d•Œå~]wæü-ýßwßþ0êw·š–¥ñ_âV¡¨êW×÷÷Þ:ñEÝíõíܯ=ÕååÔú¤“ÜÝ\Ï$“\\M#Ë4®òHììÌjÿÂÙø©ÿE/âþ^#ÿå•Wlv^‹ò ?álüTÿ¢—ñÿ /ÿòÊø[??è¥ü@ÿÂËÄü²¢Š`ð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQEð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQEð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQEð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQEð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQEð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQEð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQEð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQEð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQEð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQEð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQEð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQEð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQEð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQEð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQEð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQEð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQEð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQEð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQEð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQEð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQEð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQEð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQEð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQEð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQEð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQEð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQEð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQEð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQEð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQEð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQEð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQEð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQEð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQEð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQEð¶~*ÑKøÿ…—ˆÿùe\¾·âÄ·qßø\ÖÑ®iÖQÂWáíßÛZåïÄ¿Ø'öÕø%ûdþÛ?¿f‰ß´×ìðþ Gð|x߯ßõÙÿã—íIãWø‘â‡þ/|dÔ|¨|^Ó,5¯‹še§†<â&ñ6µñ«Ç¶ÿ ¼¦ |Sø{ãKOÔ|ý)ÁÙ_χ²if<K6©M fi‡¬ž'Ïs ~œ¨âçÀÇÚbq”©JO1U!N®è*Q”—ç9Î#6Ž3õlòXKÕÆJ–¤_³… â+ÉJ’­YòÒ£)%õg'))5ðrßíÞFOÂ/ØÄtÉÿ…%â|ŒãþJp'=9q©üûuI÷¾þÇ rAð¤üM˜Ç›"e‹|H .a@xØ–UûI±î×þ ïû Ùxçþ ÿáÌ_ðÙ?ðÞŸðŸ|NÀÿ‚†ÿÂÎþÇ?²˜ñ‡ü&cöOÿ÷üY¡ð7þJüpþËÿ„ŸþOüTƒì_þDzWÅŸ øK⯋>|Nø§ñÃðH?ø&×Å²ƒ¼GûNþÕ7Ö ñËã'Äý â¥ÿÂ?ÚŸíuð×ö„×þ|Ó,üá¯x7Ã?´Ÿ„þüðÿŒï|Wâ]Åž!¸Ñb¸úLFÂZ*ÿê3•8ãª`+TŽ›”+Æ®„-N9Œ¥iÔÅEÔ…YQ¯†¥N¥LM*7¥ œ©Å‚K:µGF5âI.h:u*5Í*ÕF—»(F¤jMÆ4å$åËð‚ÿÁÈ_·1ëð—ö9÷EñïÅOøëJÖþxWÂ6Q]MãŸøLuÝcʿ૲ÉâÙËþ {㯠üÑøÑ£xãµ—Ä¿xWYý¤¼;­øŸã÷įü4øƒ¤|-Ñ"ñ?‹µ …:W„5ï‡vž“Rñ†¿&¤x¢Ï*­ )U |ëbñTiSö4c•ðØÌ³/öo—1©]:˜œÛ åJZ¸Ì>8ŒN# J’—EqT¢§<éF©NRç›q…JUñÊøhA¨ÒÂU´HÑ©9R¥N¬å&áùÝü/ûjÊH…Ÿ²*‘¿*> ëÙP‚’_Ǩ #*AØU¢L–·‡üûhž¿ d‘õø3­gÛƒãáÇ©ÈÀ6>`Ÿfø£àƒ|ñþ iûB|:ñgì›àCö¼ý‹l/üI¢üAøõð‹Âß>ü\ÿ‚Š|QðŸ‹?j/hÿþ"x‹á??·¼&uMgþ2Õ¼%¨üðF¥á¹|Mðß»ƒ^–ã¹ðü3ö=ñ/í ð×Áß?eÁðOûGþ 'ûa~ÏøQÿ ÏíáSûE~ÉŸ f_|Eð/Ç1į‰Þ øƒâøGþ x{Á‘‰ŸüEᆚñHѵ½Q:®… 4£áUbjb¸"1úµ â'*Ãâ£:t²¿>ª¨ÏûB’«(ÑǪ¥ÏJ“«ŠžŒÔãq|S:”ãK;rUgqö¾Ò›RxüF.QXiû4å†u=éC™>ZJ¬ãeð=¿ü ûfÊT7ÂßÙ3nJüր奯ŽXtLð[î>í©ç=¦ªÁ}¿l“ß ?dðxÜàî¬Bœö'Ç Hí’ªr9çú‡À?Øëö4ø·áŸØC㯋ÿgoˆz?´ŸÀÿÛv_|7ýžü!ûN||ø=á?ˆÿ¾.iþüLñÿ€<1ã¿~Õ2ü=’ÛÆQÙxÎÇÀ¿´¸µ_ˆ_ -!›ÀþÔê(×þ]h 4+}Bëâ/¾.xcÅrü]Ô¼!¥|JÐoþ'kúoÃÿ‰ƒÅ¾Ô üZƒöMÒ§‡â×üëàOì[.“ñã?Æ¿ë~ø[â?ÿ ߯Zý§ˆ~x·à–‰ãïxæßľ>·Õ.|‡tK¿ÞøvË¿ðèú›¥ý•¨~Åÿ³·…~ XèÞ(𗊾/è?³·Àø,׌| áï‰ÿ~1Üx`ø—ö_ý­|á†ú”¾ðO< x]µ- ¯cñåŸÃ;/‡ö7Ôo¥×µ«+zÃFÕ4zÆa<2ÁW§…¯ÀÕ!^XÙà§Mà Ï”°xÜUU RÍjRœ©TÁ<4ùêÒƒhÔ¥R¥(É©§S‰ëÑu©ç±ä×RR¬“„«P¥e,$'(ÖUchJIAÆq„šGÄ ÿÂý¬ÉÁøqû/õíð†û»?ñWç§ãmCÿ»ý¬¤'??fV¯\¡8Ãø´n9çï Ž\¢‡x½»[ý‰g«_x³â·ÃO€ðµ>0x‹öý‡?i?†ÿ²UŸ‰¾1x—Ã2ø›ãÇÄ]OÁß6~ÌŸ<âoø_ÂðQo‡0ðî˜tŠZï‚ôÝ']ý‚ü}«Z§ÅïÚjþ»ñE׊5­OSÿ„&÷Ç·>4µÒ.[W¶Ñ,ü/mo{ja°ã±øL·ÁP©ˆÅWöu%Z¥ 5*qÊ别%Kˆ­/e,ß ËÙ¬-j”ñp§ŠoÔ¦¥~'Ãá+bkçn0¥Oš’s•YIâ•%:4`¹Ö¬­ÎëB.‹•ª%þ WûU¸Éøuû3'LƒðŽð•bÖxž,•#>V,P‰þ MûTÿ$÷ögíÇü*;¬Œ2â©èrqTîÇÎ"üx·]£îmÆÏ¼»Já1×ȃ,6í'?(SÌ^^ÛkÊ98Ç#”äþïî¿(ÂíÛÑvâ·^ð.ŸñŒåßø nÑÿ§¯»ÿºùú|OŸ·®i‰é»‡oð.߆Ú{¿±ðÁe¿j92á÷ìÖ Ÿ nNÜ·%¼FÜ8ä! €€ÂD‚ðÿ‚ÆþÓ節fåäõøM/-ÉωG@2Gu³ŒHaü†³\dmEÚ$ùQxLã©ò†ÙÀýÞÖŽEÚ»<»Me#€¸9ç·-ÉùWž2zciû»3oŠðß¹íþ­eÖÓNZÝ×ý=}oó!q?s[ûSm:ÿøeצïuúåoÿƒý¦æ(À?³ ·;~ÌÌÎ8ݯã)û¥È(Û‚8Úê¯ü×ö– nðìê§0ÿ…RÄóduôÝ‚:ü¹“·æÙùb¿4ghÿ–|ìÁÿXéÝw“=_iŒ'•ºÃ¢v…mm†ì!q€~^?&ßÝDü8àu+.Ë’ºû5z¤ßü¾ïæíÑtJ\QÄ £K5ÅZû^;~ïÉmÛum?Uâÿ‚¸~ÒnNïþÏ8å—áC€,‡‘ýºw— Aû·Þc_1íõâÿ‚°~ÑÎ2ÞýŸS±ÿ‹V88R8:Âä6Xv‘´Us"Cù?n>`v¸ÚIÞ«“ÎHòŽXlÊ|Ñì1±ÝÏ2Ó¥¶L(ýØ\q’9\¤chB|·å/—±Wd{<«lçáÏ$šá¼½?ðÕ펪]•ü·j§qµ³\RÓù¡ÙwÉuÒËá?Q?áë_´W~ÏÀÿÙ+ŒŽýζ¾œƒŒ`çoÌcÔƒþ ›ûCË÷¼ ð9 ¯ü*ØÃ'ï å·jƒ<’@û@´ü¸qŒc°è9<ƒ…çŽGÛüsí’`(òv¿F4½çýÂî&Òp0ȧrù?ñ.‡á×YÆ9—ýÕ»EÿÏÞ털£ˆWü*â–¶ø¡ÓþÜò]¶Ùl~/ü ö‚ nð_ÀPp mø[ pIäê£wL©Âä»oͲÜðS¯òÁ0:²ü/¶Ï×v©Éà€rìˆ%’ÍXÆ ¡v¨áB`îÆ@ÇÈp¸ >æ?u£j¿>v}Òàp±òNqµrÇnG1ì ïº//δŸø‡|Ë7þ®eúmîÕ]RÿŸ«óº(qG5®kŠéÖy»÷jü¹­hþ˜Gÿ+øðã-àïˆF2Âûn¥7ßFN Û1w`ëÿ&øìOü‰ÿ‡¨? -29a“@ÓÔt$•Ì_–ãj‘´.pWh…÷çÚß”Œf=ž\7T`—Ç^ òÜçbç¦:Œ`œ®ÌÁ”|<à§¿à7Žñ«ÖËþ~/׫µþ(â ÛûWÿEô÷%oü—ðÓôvø(·Ç á‚J~o•~Ù’¸`’×*0ÁˆÁØÊѸe&ŠÞèÿ‚‡|m9ÿŠKà¯~áYiüpÇŸô¾¼g¨ ’Y?>¬×iÆÕLyŸ*§#-Éo³¦íÆÜǰ£§–¾_‘gª£¯€yôáÿÙëÇ\Œ`œ®7&_ñ¸3žßêöݹkòz|žßø.)âd¿µq_gíC­¿¸»+iÓF÷>ÿ¶ÿ‚üj™Õ[ŸÈ,¶|4°3¯9™n1€¬[ ³µ®¢~ÞßTŸ |RT?áZi¼ÀÝ*1‘–T Œ2©ÈØ®däFÛ$g…å?xÇ'ýîc·8ãjŒüžFý?¡„b8ÆÄj0Wnß‘~P<¨°8ÿžqàŒlLmX©áÿ)iÃØ¬ŸÃVÚ½oûßÍÇüÉñG&’ÍqKáëÉÿϵÙtz.‹U÷"~Þ˜|-ðxa\Ÿø¶ºfFÕ”ÿ|ƒ´ -Ê®x×{õí¿ñqùo ü$N€ƒðßJÝÈŒ‚Eʶö#%YB"¤žtp| üÇåè’˜|Ë…˜ç>WÞ\rr»@/æC³Í·ê-“~ì®ûëóŒ‹nŸèɈÛfU~_-Q#Ù—äÙÄøƒW-¸®õÒ¯—ý=_—Èu8£ˆ#ÖkŠNÝáýÞð]—O—Cíý¶~,‘φ¾gãᾎ@;IÆs“Èààpp9°~ÙŸ%8o ü+\¶tlÆ<ç/˜rpÓò¨ÞŒK?bø¥‘Ç*>Và|§Óå8Æ~_¼»öi‚£Êq¶LíÇ1ÿ¤c2~àn?&Ö;W mãìùÒò—ðrŠk‡ð7ºOJ½¿ëï—e}oÕ⎠ä‹þÕÅ^ö½áÛþ½®Ëîéª>Æ_Ûâw‡~©ÀÈ´C‚B“‚aRFI§åäYRä?µÏÄÙ Ãß ”Y¿á]è (Äœa¡›*ÑB¤ŒíbI`ù%¨ث…Q´åŒatŸ/*à(WcÓµ_Ÿ;Ê3¹Žx>TÌŸ/ÌMˆ²I¾/í°ø ƒí'ýÑ&´«»·ý>_s—ýºö8§ˆZwÍq]-¬<­oÝù+Y¿.c븿j¿ˆò[Ãÿ #<|§áæƒ7Ífœ €@Sæyn%Ž +ûR|D#á¯áðóÃøgþ}ÔgœrWåÛeÚ¤l)‚§k®|±Ùò#ùNß`yj»1—äÚh ãîã°È/O¸}2>îþe3‡ð†·È0?8Õíüëϯ}_B)ñ‰¬õ]@\|/Ðìô‹­*ÊyuŸéŽfºÖ!Õn-b¶Eðv±+b-õåyã·D% Ï!UÝþÐñ/ý ¿ÿðÞ_ÿó°¯=ð' ñÆ?â§ðŸñ(øƒì8ôW þT¿áž~#ÂÆÿ„Çþ[ö¡ÿ‡ÃPÿmÿÿ?²µßøXß𱿷|¿øj/øbøRÿð¼¿áÞ_ð¼¿â¾ÿ† ÿ„Óûwûwþ2‡þßþ‡üYšü/Œ±L‰3 ¯“d‘Âáa•%_:µ¯€Ââ*'7‰‡4J“p¶m6­¯ê1G›d˜<~/4Í^"¼ñj~Ë©ÂÔqµèBÐT½Ô©Ò‚o¾¶»Vþþ+~Ñ’Í?íðwAÕ|/wâï†_—ÅÞ ñ…< e A¢Ü|@ð·ÄÉü1g¡k·þÐ5ø¼M¦Eài5»½CK±ŠÏL‡WÐ[J×®5¨õk=ø¯ì¿Wÿ“˜ÿ‚ŽÿÙ¸|ÿÕañò¿ ñ³Oc:.– „ž;%úÎ"ž›¥FUáœçXEQAÎ|­ÐÂÑ„­-\/»gµ•{XUÍðÕ1ñ0Âf‘¡Bx™ª•cJyFS‰psQÒ­ˆ«%¦œÖÙ#ú†ÿ‚ÊÿÁ%ÿhÏÛÃö¦ø}ñ‡á> xoÃ~ýšþü6½´øâOéókš<¾+ñ5Õí•§†~øÆÂ]1¬|e¥Gmq.­ix×–×ñµ” ¥ì¿”ðÿÁ¹¶ÜxÏÄÿÙ[ŒGŽ>,–‚£ù òªˆâبžTv¿Û—‹ÿä-iÿb¿ÿõ ðýrõô™G~˾)Ö|;àß ü8𕎬x»Á¾ð/ÿØE¥xGÀŸ¾xötð·€|àí Éf–ÏÂþ ðχôOík½S]’Íõ½fûQ¯ëŠì—<}:´«Îy,ëÐXQ¯,ŸëR…ogí¡J«—´§ ÞÊ—µŒ%?gOšü¶K‚²E SQŪrqs‚ÅÔP›‡7#œRJN<ÒåºvævÜþ9Wþ ëý³×þjgìÁÿ…§Å\Žù"cŽ=€Ú¸mXíAÿù~Ù±[â_ìÂy\8ñŸÅ=Ñà0ÊÿÅ”V-–bHþïÊVA°ÿbUÿÄ~ñÍ}g*³ÿ©].÷þ"d)YSÅtÿ˜™­­m’ìä/ø 팊 üIý™ø €È¿³Å_þÂeÿÈŸÊü_ðCßÚ½Iøƒû<‚8 ¾,øŽL|•áÉ«+ò•b´?ðDÏÚ¢"3ãÏÙóŽÿ gÄFeá2ãÈÊãPh"ˆ’ÛúŠ¢“ñßÄ Zøœ¯M¿á2’¶ßß·Dr½0üñ·üiª>±âOjþ,ñã^^]´0ÛCöß m,tí3M²¶´Òô=J·Óôoè–6&…a¦év}­—ô+Es¯¸Ö5Þ)<•b'AâVQ‡X‡EÊttÕWIÊ9:nnPƒqn1µÿ©Y/²T/Žö*J~Ëë•=Ÿ:RJ|–åæJR\ÖºR’½›Gó‹ü ö”Œ`ø×à`û¸Ç‰¼vHÚs”ø]Hè:TÇûµ†Ðÿ‚D~ÒCñ[|ÀÁÿ‘“ÇyÎPžáYr>^ `lFV¿ñ¸õÌNYÿ†Ú^_ßòFk2µoüQ‡ÂÇâ?¥¶÷ÿ…f„ƒ´p+ò®Ó[ß_ø%í1ÿ—ÁQƒŸù¼pqÎsÿ$árzÓ‘Á»1A”TÿÄoãËßëeÿì[I®û9¾Ýþ¡ðúwTñIÿØL¾ÿ†÷?m¿à•?´,,¥¼_ð`íÙÊø‡Æ™;]Xù&É‘€Ü[˜×O’Öº©ÿ¸øþ¡Gü%¿«â˜Ï Gô$ €àpíÙûÓE'ãwÉÝâ2Ûéÿ2ê}?íÿÁè€ø}¾gO{ßýæ_üüÌü ‹þ }ñõIñw‚eñŒ²œ`°áçÌËò•Ã& |žßVø&oÇhÀÅ?¨×ü^Jåc £þ-êer¸t(HÂ*®ÈàýÊ¢“ñ³Žš³Äe¶]²êK·iô·æ'À\?-éâö·ûÔ¿ùéÓ¢?GüSã ÿ™¯á(öïŒ09ê1à5ç×û£~S¿üãt;Añ?œ+dc^ñcó£ráMß(ÇE;£Œ†ƒìŸµ´TÿÄkã—ÿ1nŸõ.¥ä¿›²C|Ãí$é⬿ê*_üåo#ñ?àÔ(>'øX»@&·â¼/ÿ2ä)û¼.Œmùv[ƒþ åñž6 Þ%ø\H#u¿üœä°ð„.[¦0PŒŒåIì¿â5qοímžëû:Ÿ—^{ôï¶› p-©âÿðª^_Ýò^½n~BÃû|bp|GðÈ}ÞXñ1ª6ø".„ Àv ‰•ý‚>0?â£økŒÄçÄäŽzäx1IüÇN †?×*Wp¶Äeßøn¥ÒÖû^]Eap'g‹ùâ¤ûwŽ›-¬~R[þÂÿ¢Æuÿ‡ ~#Õ¼DH,b'ŸøC#$0L6*íWaŠ;kÃö ø¬?æ`øyíÿoñÁÿ©G“Èç ðpAÚWõ6Š_ñxÛ››Ûå·ÿ±u/þKú½÷µõ‡¯g‹¿ý…KNÚrÛüúÜü¿·ýŠ~)ÄèÏ®|=`®Œ6êž Ê…}ÄŒø?æcž2T  ¥mÞ×Z?Øßâr")×< ¢®§¯apª ®ß F6ñÔ"FJ¨¤üdãi;ºùsö/§Ók{ú|¾`ø‡¯K¥¶ÄÉmmÒ¿®ökóu?c߉hÙ:×Ãÿ=x‘à0'¼‘¸sÜùoÄ?²oÄHð?µ¼Æ´µ–`qo¸<*Ÿ)1œ´*¤JЉåÇmúEKñ‹]¯_/Ók`)®Ý¥å¶ß…‡À<=%gOm¿Þ¤»v—âÏ€öTø„ÿ‰Ç‚ÇÀÔu¼Àφûqƒ€F8ÁÁvÿ³!Û»Tð†÷(]GW8ýê¾I>Pç`çåS¾4`Ãm±²û²ŠOÆ4i'_/²w·Ô)ÿò}|¿ÊÇú…ÃÖ·²ÅYtúÌ¿Hÿ_u¾#ölñʪí?®FÿV!p¨ ©L¨Ûò¯ ¸ 0±Ü‡ötñ¬Lê^8#_êÄ ù²Ê‚„¸ÊàïBbžT°ý¡EOüEþ3×÷ù~ªßî¿N¼÷émímúàŽÔñZïþÓ+¿ü—¯^ýO‘aøã†?´<2Tñ{¨±,a¹ |¤ UPžZyQÁi~ø´ÿ ôè/5,À΋؎:`0pWë )/xÉm_/ÿ ~KùºÙ\ðòwöx«ùâ¤í¶Þï‘ó%¿ÁDro|<œœ º7C£ ùÀÃíXðTmÂýlï/Â/ü¾h__µ_81¥/óchO£h©ÿˆ·Æ7¿¶Ëÿð‚Ÿ—÷¼—é`ÿPxzéû<]Õ¿æ*]-Þ>KoÌð …^!‰ÔµÖ†ÁYaqu½–$‚tœ»å¸,Àm ®°Io«ÃmÜé#j¨ÂÏs€ 9\"€UlX½ªŠOÅ®0nî¾þXk·ii·N ø‡ŸüºÅ|±SéåËoøeÙ<Ÿµ•ëq¥ýÒóîHV^7iç8$FÖÊ”m¬›ø;RË`:œ‰¥%r"È]¶|¤¡àm "ˆ Eò–ÛÒh©~,q{VöØ–í¦ŸÚZX|ÃÒµéâôVÓ5ø$—è|éñ;à׎þ!hÖZ…ñÏâ‡ÁÝ.N-cTO„š¯ƒôkßßÙYÝØé'YÕ¼OðïÅÚªZhÐjzÈ´Ó´[ÝN¼—V–ç[´ÕntÝ]Ä?ጾ#ÿÑî~Ø_øq¾󕯾¨¯ Æ8üÇSŽËòLV*ª¦ªW«—FU&©S§JŸ3U÷iÓ„‹Dzx^ÂàhC „Ææ¸|=77N.ÿÙ0ñ÷þ¢šµžµsÕÍkæ¾ÆU©a¨G‡ŽG EP£N‡Ö18¶”¥yJ¾.¼å&õs¶‰#¿ €¥€eN¥zÒÄ×xšÕq5}­YÕX|>7+GHÑÃQ‚VÓ–û¶¥‹ÿä-iÿb¿ÿõ ðýrõÔx¿þBÖŸö+øÿP¿×/_9?Ž_â—æÏF;/EùXÃóø·ÃÞ,°ÓuËÿ jÙ÷:_‰tûM>úÿGÔ¦…Ö=GOÓõ« KG¾¸Ó\‹Ÿ³jš}íÈÊ’® àëZ‰ÓlŒ‘×WEgd‡pßupJ§Ì"™G–‚I°é±ü¯+!kù´ÿ‚ÄþÞ_ðQ¯Ùþ û |ý“¼Am¡|%øáOøŸZðâü;ð—‰m~0|HÖ~8jžñ]­ëz6«­i¾Ó<#wà‹ƒ/¼'«é“øÎëWÓëQøjû@ÿ9~˜â¿ø›áßÑOèçÇÙOøœdüAâÇqFaÄX®¥•ð×e9†s–dͲìoZLÚYfcžæ™el:8œ³%ËpÙĪp¾{›R­÷7”ác—bóÌÓ[„•hex<5*^Ò¥lEyS…jÑ‹+*J­*ªÂ§!xZð_Å”¹ÖŸ„|}¡é—šÞ§«Xj3Ÿ£«àÿEû2þÛ >>ØÂ¶Ÿ ÿkè¼û1|t{{a$gÆ=>]ROÙ/âUãYi:¾¨N»u{ãÙÛUH§Ñti/üWðËSñ¡åxOŒýá_×Gß²¯¤‚žxÅ•RÃagÅù$aĹVþㇸó%Ÿö_pý8sTž†Ï(VÌøz†"­Lmn Íø_4Å5,Î-ü¶i—UÉó,fWYÊO 8º'ñb0Uâªà± ßÞ”èÉR¯$£Œ£Š§½“H¢Š+ö„üløÍÿ,øÓðÓà·ÇŒSüø]¡øGMÖÿà¡ß gOEñ“ÅŸüGâO?°×„ÿkŸÛÞüjøBÿ>iž ø]ã3ö8ø“¨Msào>=ñeþ«à &š–þ ×¼eàÐßþÕ?|OñVƒz7Šu¹ü\ºß‰|)¦j÷~&i_ ¼[ãCªÏão‡>;jÞ±ø!ñ/â‚Ã~4_|/ø}ñÄß<%7Ê–þ"ðÞ›qð«â4^ùu¿à™Ÿ­¾þØ>Ðô_…Þøßû`蟷†¼cûQé_¼'gñV~Ù?>)üBµðÿ‰u‹MF×ÅÞ?Ñ>[øóÂÞƒJÕ0|*ýšþø7öþðïŽ?j¨~'?µ ?n-[Vñ†§‰à]Oã//>§Ãïƒß ~ xWMð¯ÁÏ ø‹âg<#á?ˆÚ'Æ-_²iÙ¸µÍk'®Ö½ï§ÝÕé{ [wz_Ëkþ¯üϨ`ýºg ¼9ªëóë_tOJÖü?áñð·Ä³í'áÚ]¿ñU‡‰u_ Ïà¯Ù‹Ä 4¿Ú+≭hþø“­iÞ%ð/ÂÿxrçDøKñ—YMTéŸ~'ÝxOnÛ'ö“Æ^ð,¾"ñ¶­ø£þ[F¾Öþ |oÐ<àŸüNÒ´-cáïÃŒu¿‡:Ãïÿ‚XxÂÿ¼-ñe|Dñ´¯i^ ð¿Ä¿êzGÁOþ2øsð×áÏŒµßøwAñÿÆŒ> øsâ„<&¡ð×âƧ⯊þ7ðn…áí Á¾"ñGˆoô¯ éWz¼~]ñÛþ ð7àÿÿhmsFŸ[ñ·‹¾|.øõã}3J»ð‡ÄÏ|*ø­ãÙ÷áÿŒüyão‚ß?iM[áÝïÁ|QÐÓÀ4Òüiào‡Þ)ñçÄMà/Š’x‹Á qðâ5‡‡vþ<~ÇŸð»?á´ÿââÂ3ÿ ûxWö<ÿ‘Gûgþçü#?ðÖñq?ägÒá-ûoü5üŠ?ñLý›þoùî?á&ÿŠÅx_Lýœ¼®è71|#_x߯ÑxÆCâ¢J–—o¥×}v´{ÝZû+óms_ëåÿü™ô6«ûtþ·†µk_|3oâê‘øŸöoý¤ü7ð£ÀðxÄâ?í¥ëŸ ,5?Ùgáv£©øCÆwZÅÚJÓáWÃÿøsÀþ:ñŽ…âMGÂ> ñN¹¤müRý¨t/„ß´oìýð]ðwµøhüañâßx/â7Ä?øF5߆:ý<§éž-Ð~xÅÿð‰ø'Äð¾æÔõïŒ>:Ö|ðçáßü"V–~'ÕÇü%Ö7zgÈ?àš×ÿ´OŽ4/ŠßuïÙâOÅM_áw‡¾ üSñ_Žÿ`ï|O°Ñüைü_áwöNðÏÆo´ÏÙóâˆÓ>2x–ÃÆ~!ø¦ßµ?ÃÿøÂß ¼C{ð¢ÃAð¶·à}¯ñ/à·ˆüOñ§àŸÇoxßDð—‹¾hŸ~kúw‹|ãÏx·à·Æ/|ñÅ G´Ñ¼sðïSðÅOà/€`ðÄ‹Ý_Æð•…׌"ñÂ/Ük:-׆ SMY·¤¯¾ŽÞíŸ*ëåê–Á¯â¾í/ÕùŸ<~Æ¿·÷hßÙËáoÄ_ZxÛÃß5_Ù{Áþ!xÙÛöðoü$žg|/®üOÔÿfŸ xÛÀ’ø›öðO…|MâM+G¶¼ø }ñŸÊÿ„ËᆞúΫ¨|JðÞ*Û·ÿ‚‚ü"Õ¾4ü øMá¿üQ×­þ5hŸRòú/‚߬þ |%øðŸÅŸ³‡§x3ãWÁ¯ƒëñ'উâß~Òúľ&|nÓ~øÂþÀþ,¾Ô/¼#ñkÁÞ$>_©Á6ÿ´>~ËŸ ?ásÿɳ~Å_²'Úîþ}·Âß?â©ýŒ|[öß‰Þ ÿ„êßûgàŸŽá?á_üuýŸÿá!ÿ‹¹ðsâÿŽ~ÿÂÏðü‡µ OÙ³þ ·â?ÙŸâ< ñöy𗋯>(üDÕµÿ|#ý’/þþÏ6¾1xö7ðŸÅ|7ø=£~ÑƧà/Š:ƧûøÅÚÅû߈ž0ðž—­øãâ\Þ!øã+gE¼ðûµ/yÝý«G_5T}–Îâ÷´Óµöò¿ë÷yxóöŠø9ðËþWü&þ0þÄÿ†xø'¥~Ñ_âŸñN¥ÿÁÍoþÏögŒ?âQ¢_ÿÂAö¯øQŸÿâŸð¿öߊaÿ„_ý#D‹ûoÿÚþ]â¿Û»ö[ð=ÿÄ{_|AÖôM3áf‰ñCZñGîþüa? µ¾ xsÄž,ø»á‡Ÿ`ð ¿ þ/|Qøk ø#âß>ü&ñ¾*øzo†_4íKÁ°j ¾ Yøoö‡ýáyþÑ¿²Ž¿©ø?ÍðOÂ_øX~9ñ¿ÿá òþÓÿ¿Ž¿gÿ‰ >Â+o­é´?ð—þÐ_ ¾~Ó?ð³´ˆu/øGÿááLøŠÒãÁ?´?Š,/üSÇðM¿øZšWŠþøÿã?™û1j6ý¯¾)øGÁ¾øuÿïÇâ7íµàßÚWÁ¿.*$©Ùs6›Wv¶›«lõº½´k]5zöê¿OóqúañÁºŸÄo|%±Ö<ÿˆ> ðO€>"øŸÃÿÙú¬_Ùž ø£®üKð×uíY¬cÑ/·u¿ƒÿl¿³ôýJïUÓ?áûN±c§ÚjÚúŸŠx#öÉýŸþ"k¾Ð|+â/\Â}ãk|4ñ6¯ðSã…~üY×o>üSø»að{⯊¾è¿ þ/x'RøgðgÇþ5Ó>%ü4ñoŠ~êzŸ‡nì| øK§iß ~ø³à‡<5áÏþ,ý üci{{iãÚö‚ÔüC­ø‡Sý µx.n`Õü=a§Xx{MŠ-6îâîêé|OÂÿ±7ÆŸü3øðÛÃß´'Âãoûë~Ÿö/ÕuŸÙËÅš„Þðçƒ>üVý˜¦Ò¿iû[Ú_HOÚ[Õ~|U¿HüAð¦ÙRÃNø«¤Úxé¼5¨xFâo…ª­ }îŠÏ[]­~Íì¥eÓKÚýMtÓÖþ«³ísÔuŸø(§ìq j¾>е/Œ8Öþx'âïÄ¿èö?¾)jÚ¯…þüñ—Çï‡_ü¨iúO‚/®Ï‚| ñöeøµà]cÅVÐÏ¡7Œ øuá‹+û½oãÀûˆ»z¯íÝû-éÖføƒ­ê>ñ>‰qãü_á¿…?|[à |3_øƒÃ:_ÆïŠ8ð·€uŸüýž|aqá/kÿ?h¯‹ׂþüOøá/üPøwñÄÿ ¼5®x®Ãåï ÿÁ4üG§|"ý´|ãš'ˆ<]ûhþÏ?¾ x§ÅÞø7á/x/Äþ?Á@>=ëž7ðÿ‚uO‹þ5Ôï´M7Sý»n¼=¥x#QñÙ¿[†0^ÝøæêãÅòEá®×ö­ÿ‚rxöœøÓÆMNËöyÔõ={áwƒ¾ øÒOÚöMøûPxžð7‹>$ø§F×fmSâˆtßüø£yqñƒÆÍâ?üFøyûBü?ñ%þƒð’ãVøQq¦xÄZĵ+ÛšV×^ú+iÊš»oîÛ] tÛ¥×Ý~½5þ·Ûø­ÿ*ýŸü ðçöño…G¼[âo€> ý§õ{ Å_ þ7üøsñcâ7죡|HÔþ%üøiñÿÇÿ ¬þøïÆÚn¡ðŸÇö—úgÃM{â»g¡xÇþ5°ðîµáŸøªóNÛøûoxOÆŸ´Üÿ®ãÖü+áü.øªüµñ÷Á¿? ¾*ø—â¯ÄM_þ ¨ü@ð׋|ñ;Ã>ñƒ´M7á·ìC¨ø³ÁóøÇÁ ‡Q† bò×Ä&·ñ—€m‰øÿâðçÅ‚Ú7ÀŸüRÖâðŠþÐß·—ÆŸê>ðÕ†•â=_ß·O„ÿnŸkžðýÞ©ªøƒLðÞ·ðóLý¶.§Ò¼o¨é+°×ïþA-ß´ÛÉkáì_Œß²WÇøgâ÷µ_x'â‡íñsÁ?±7ÂZøuðæçàïƒ~xËöoý¯¾.ü`ðí_£ø7âÆÏŠŸð™ÿÃ=ÂóðÿÆCàW‰|o}¥|cÕgKïO¨Ï¤üf_øXµ+Y7vívö¼’OáJÉ''¶Ž×oXŠýtþ—Ÿ¯õ¿µþПµþ…ðëöv¹øÿð¾OøM´Mö¡øIðÅ1ÃàˆÞ+ÕWÍý¹üû ~Ð:g†<á]:ß⋼mỈúglü)£x‹þhšç†ôohš…Ž¯ößðØåøsÿ CO‡ãf¿¢[øÛþÖ»áo þË_µ‹¾1ø'ÆM¡ÂUñ/ö~ðÇÁÝ[ã¿ÂïµøR}Åv‡Ä_‡Òµ x»À$±¾¸Ñ>"øûÄG?eŸê³ÿÂ/ÙÃáÕ×ü+_‡ßümû k¾²ò5_ÿfx7öBøßðsâ׆< öwÄ1ëw¿Ûš'ÁûÿÂO¬k𶫦jÂO¨Câk»´ÝOåïßðN?ø[:ø£ãÿøKþ øËþGÆÍCâÏü*OÚ—öhÿ†–ýœôïí_ÙÏöZø ý«¨|ÿ…Çð·û{ãg„?á˜~ßð»ãWü%ZWü žøÛñ»á§ü zßü&_ð—Ù¥ìÞµïI߯/»dìž»ë²íª |º_õwíåcëÍ?ö¯ýžuŸkž1о(hž"ð‡¾(üø5}⟠Zk~$ðå×ÄÚBÃàv©ðGNðþ¹¡éz†™â½â™ûHüÔt¯ø^ëXð=­‡Ž »ÕüG§[è¾$“F>þÕ?~8xŽ÷Âß üS­êzœz%ÏŠü=u¯|9ø™à?|Pð=•þ›§^üGøãx;Ãý¡~Y\kþ’óâ‡ÀÍsâÃûK|7Õ.!|;ðßí¢|ñÏÃïøÛÀÖžñÇü,Ÿ‡ÿáq|cð-·Ã‹žwÂ[[øKãÏèß<êŸðS­";ÿ†²CðË⎙¦ÛËöƒý‘>.ÚiŸ³Çí7ñjþûß<9ûuÚø_Åÿõ‡ÿ b·øÁ­ø“Åß²—„uÏØü'Òþ/Ø|ðçŠü6ñÆ­wÂ:Äk_‹_Pøcö5ñ†¾ |:Ô£øµ¢]ü+øCû^|gý®þx5þ_Åñ|GûFøöİøÉáüL_‰áÏèñ'ö»Õ4ÕÿhØÛáÿí â?øâwíqûO~Õ:4_³5ÇÄKáƒÿ|7qûVøÛž#ñÇÄoþÐþ"_øá'‰µo‚ºf™áx+Æ_¥~ÂŒð.½à¯øH¿á(þÛøÙûJüaþÓþÈþÄû7ü4?íñWãÿü#¿cþÓÕüïøCÿáfÿÂ%ý¯ö¸¿á þÄþÞþÌÑ?´¿±¬&Jš^ì¤Ýú駇_¿­ü_ªþ¬¼ûßî?<¾ÁV|3ñþ߯w þ6xwá÷í)û/|_ø»âß h?²Ÿí}ñ[â7…~'ø'þ»UÐtoAூ‰­ü@ø'‰ûGøÖÂïãöƒðÏPøIã­wEð’xKÇÚ]Ü·~Ö~ׇöÏýš¯ðw¼eðßUø§¥hZßÂß x“ö‘𯅵Ù÷Á¾6øŸ¤ø»À7ÿ ¼ ㉚Œ¼}mñ?áøKBÖ?ámü5)òïÙãö5ñÀïþÏZ§Å­Æ^ý•gŸ‹¿²—Á½Ãá•ÿ„üG?Áo_þÉ2|<—âgŠn>&x¯LñoÅiŸ²ä–ž3ñ…¼ðïÂoüvšŽ‡ðÛá¿…[Kñ/Ëß?à~ø3âÏ‚úúj߳ώî>蟲ÌÞ+ø•ãÿØÛáÿŒ¿i»Ÿ~Ê¿¾ üðÌ¿þ:x¿Æž#Ó>ü.ñN™ðÀºÖ­àyþüNøám_Å_õŸ†ß¼âïxÅ¿ [TõjÉÚ×w|Òµï«F×ïòb\Ý»vò¿ëýXú‡öïý·¼'û#|øã®h±ë~,øßà_ÙçâgÆx;Aø7ñ§ã/‡4;ý Â~0»øw­|wºø1áfßàïÂïx»ÂZΗgã/Š)øaáÏXx?âDš‹£O‡þ3Ô|7‰ûMÿÁ@þ|)øIûRê_ uÏퟋŸþ þÑþ/ðÞ0øcñnÛà?~-üøaã¯k ü7ñ©´ |#ø«ão êñU·ÄŸ„ÿ ~-j?ü1mðóâå–¯¦øPøYñ _ Ÿµßì[ñãÿü/ÏøTÿüð“þŸö^¶ý’þ9ÂÄø%®üiÏà þŸü"z×ÂøF¾8ü ÿ„ÆÖ_ðÒ?á!Ô¼_ÿ OB×¼‡ÿÙ¾ðÇü#^#ÿ„ççŸÁ üâ‹ÿÚU4m[öyð•¿ÇöÄ›Lø¥iû|?Õÿk+Ƕo‡>.é^6—âí;«xÒmOÇ_ ¼©ürñ¤þ ð?Ãïüø€7üøy®ßü9ø§ñ_H¿¸øwñ‡áÏ|m¥x'Ä> øñ†ïÂÿõ}ÃáÏŠu߆^7ðW‡|U©øÛÚŸ‡­øŸˆðPïÙ7ᦅâø‡Ç^6Õ4OÿÂ×›âïÿ€Ÿ´'ÅßøV:WÁ?ˆß>üDñ?Å{o… <þÁµÇþ|Xø_ðÄ:'Å¿‰?·'ÂïÚ;à¿í+ñãà„4_‚Þ °ø»ñûö¬øéá-wJÒ|Uûrxâ§ÁMF׿nïŒZ7ˆøŽ;û« KQŠ{ß| ðÄiº"ÛéWQÜø—QÐí|9g.›¥Ýê°jzΑi}âš'íÝû-ø—âü;ðçÄoÄ ­ü=ðÒüEÑ>üaÕg–ñÅ¿øâ/Ÿ¯íKaàÿf£­üMð·Å?†|=҇ŃãMoâ?€ü#á¸5/x¿ÃÚ£‰ûaþÈŸðÔŸð®îþÛðOWÿ„þëøVÿµ/ìÿÿ Qû9kßð—ÿÂ1'ü&ú‡Á?øYÿ¶ülð?ü"ŸØ? ¾)ÿÂk7ü!~ø‹ñ»Â_ð‹êßð³µ¼9âŸ?à›ð§¿g(>Âçÿ„‹ÉøÙÿøøÃÿ oü+¯ìßðÂýƒ¼ÿïöü'ZžßøZŸðÄ¿ÚÚÿÛ'þøY¿cþÌñ‡ü!ŸkñZJŸ-å'ÍÙlµµþ{+»_]´ oúýßð~ï3jûþ Gð‰¾4ÛézN«­§ìëá?Ùö±ý©~(|d×¾ü~м9¨øsö~ñgìÏo xËàGÄ=kÁzG¿h…Ú¯¾*üCñM爾ÇñnÃĶß õÏ ø†Äz2øÓÔ~þ×ú®•ðgá¿í'ü ¿´î·àŸƒZOÇ}Áþø¯üøMûFüFðo…5;Ï‚~$øÿ éÞ:øðóÆÚÏŠüU¡é? ¾øëãgü'^3¶ñçÂ8ü1Šåø¯ðÞóÆ|@ÿ‚t|x°øaáo…WÅoüRøGà¯Ùz÷þ ¹àè_®~|[ðçìƒûGü[ý‘~üxø›ã¯Œ^(øÿâŸøûãgÂOÙ_à‡ˆüHñf¯ ø©‡ñ'ÂïãoÜ|0mR²³ï®·ºz}žªO¥›Š\Êͱ_¯–šy_îwë÷èmêß·_ÁÍwö,øÙûn|¾ÿ…áðÏá?Á?‰t+‹K_øBøÿ ûáDŸæðîƒâøCýÏø·WÒ´?¹ø¦ø×á·‹´Ë?‰Ÿ ø7mû<üøÁáÏxŸöQý¬<'à»ÿ|]ý­~üOÖ¿hýOÄŸ ìôÏÙÃáw‡4Ï€þñ‡ã/z7Â/‡&ñ×Ä|]®øÌêÞöÏ ~Èžµý‚|?ûxÇÅúÞ»áoÙJý‘ ý®ì~-|oðN¡ñö¸ýŠ4_ØóÄ'øuðK]ð?ƒ|ÿî«û`Í¥|DÑü â_Ž?µ½C:'íM¦éú‡„o~"Åö­WáÝö±mâ{ OA¡x1/gï'ŠÉÝß–ñ³ømt“oDúYßC]=5õÓÏ׿ùýáÿÚ§ào‰þ*ÏðoFñN·?‹—[ñ/…4Í^ïáÏÄÍ+áW‹|qà¨uYümðãáçÇm[ÁÖ?>%üQðBxoÆ‹ãO…ÿ¾!ø›â„¦øqñRßÄ^Ón>|F‹Ã‰jŸ¾øâ‡!ñN·e©ø/DÕ|AñÆ|9ø™¨üøIa¡ø‰š´¿hm3Áן~ ëv?ã°ñÌÞø­ñ#Áþ#ñ/õõÒ›Lñÿ‚n|AòïÂø''þ~Óz·ÇÍËöy{y¾(üpøÑ¦x–ÓöMømû\j~8ý uëþ6о!þ×z·ˆ|C©ëÿ ´Oâ¿,üáï‡ß >|@Óø¥|_í¾#~ƾ#ñæ¯ûTøF‹Z&û:þÛš'Œ`ý¢ü /Ã+ýSãL~#ñ‡ìÉáoÙ^ãUø+ñ©>&ižø{¢Yxá¿Ãmvøëö|øÅ'‹,¼qrþ%?‹tÀe©ßâvå½úó_Uðö×µôæ[†¿Šû´¿o?ò6ï¿à¡³™¥i÷Ú–§ñ³OÖõohþÒ¾ß~É_µµ§ÇO]ñƒ~"øÿÃ÷úìï?Àøþ;Þø']ð§Áÿ‹Z†ñ.ÛáÔ¿u;Ÿ…ßt{/O­ø'ĺv™Ûiÿ¶Oìÿ­ê¿´/ x‹ÆÞ4Öþ%ý‡ì?€~ |oñö«à?·øËXøtŸð¿´ÿ|9×nÿf±üA𷎼 ¬ÿÃGÃð¯ûÆ_ ~.øc\þÎÖþ|L±ð§‰è±oÄmoö€ømûPüløßàŸü\ð¼woð³à–»ð§áηðçá—ÁÛság‚¼+oáüqøÓâm#ÆÃÄß·WÄø£ÇòxûWе½ Â~ð^“ðÓÄ:÷õ¾+Jÿ‚tjºOÅ/øçOø­àŸZxWãgÅŸŒšïüð‹Æ_?j¯é_l_¶?³ýÿíáöš&­û/O­üQÑüñ/àOÄ_‚ß|ñ"ÏFñWìmü ñÄ~ñÂ2Ô¿š[zëg§À¶ikÖý,öþ´óõû¾þ×â'üá„ÞÑçø®ÂEâmWãgì›á ü}ðÇâ߃|ñ7á'ÇÚûàìñã|YâÝÀ~ý ¼ xgã.Ÿªèß>x—â?à #Uñ—Â/kš–«áŸˆ>³ñ‡Ðÿ jŸ¿(xÊÿMÓ¯~#üñ¼áþп ¬®5ÿ ÉyñCàf¹ñ áý¥‡>ê—$Lø‘àK¿üQ¤Á4üFºGÀ_ x£ã扫xGöFÑ>|4ý™-´ƒwþñð[à×í7ûþÐz†…ñß]Ô>/ø§Lø±ñGÅšgìIð‹Àö>øgà7„ü5®|Hñ|ÿ¼Io®xcÂ> íboø''ÿbïŨøRËöyƒLð¯Âèþ øWøYû&ü?ø;ñ§ÅÞŠÿ“¦»ûQüvƒÄ>5ñwÇ_Š/oà/ Ýj^!ð=§À/‡þ%ñf­ãßø¿áGˆµ;ÿ†Ñ|&mRåv“æMÛG®Û¾UÛËVõz6+éuÓ_]?à÷õ>ÙøÝÿ$câïý“ê)«WùëWúünÿ’1ñwþɇ¿õÕ«üõ«·ðTÿüˆ©ÓçúéAâÿù ZدàýBü?\½u/ÿµ§ýŠþÿÔ/ÃõÁk¯©G¢k2h°½Æ±•¨¾“oZ$“êKi3XB~ñØ«Ët"EkÙ#´V`naÃÆÌ12Ááq¸¸á±8Ùahbq1Áà¡N¦3*çUa°«V…)âk¸ªT!Vµr«8)Õ§æ¶£Rt©¹Â’œ¡R£’§MI¨¹ÔpŒä¡ óMÆ’ŠvŒ“å-î£Ö|g&¤Û›JðA–(ÆÓ¶ç[vEd£‰K˜Ö ò¢¦ž÷0|“ÿþÕß³f½ñËö ÿ‚uüjÒ4_í/€_<~ÿu[_´Z|:Õ|ÿ 3÷ÜÈ¢õ­­~:| øQoéηq]뇊m&m^7çGíÇû7|:ŽóÀ+ø§ðÿÃ>$ðþ§{mâmWñß…´½cM× qÖ™­éz†«o}§j:lˆö·v7°Eucr'·šÞ9QÑ#ÿmÿþ˶í—û-þÔzíéá/øSösð·ö]·Ãm'ân£ëzG4Ÿj9Ð~&ü7ñ6—¬ê:}–¿ªêÓhZ_Ž´í_MÓ¥Ö<7àíNÓÀå<7†¡›Édž³ˆðçã§V_ÙÕ¨`1µ©c±ãÄÿYãrìƒ,álY•Tʳïª×Ê0´ó̯*ÐÃãhbëcjV«]Q“«Šö˜ºôV•#/gÍ¥8ÿGÿþxgöžýŸþ(üñœ“E¥ø¯Âú®œo ùµ;³Ö›â½!V& ¬x ÅvšŒ´§bëÖ.XÃG^kû|iñWÆo‚6‹ñ>$³øëðÄšïÀßÚNŠ%о0ü76–:î»eö}CÒNñE»ðïÅOÅ ÚK£XøwÇZN›kwq%”å|2ø)'ìŸo«N/ß ~i§- øà‘[]yÉ=©A­<2´;íìB 7„þÊ¿|ñ7þ iñŸQýŸ~Û/Ó~&|Eø±mñm4OŠ ø“­þÃÞ [ï…>øCð‡]ð¾•ñƒG³ƒâö»wð¾÷Røš|aøÅûiÛþÓß³§ì©ÿ Ÿàž›ñrÃãgÂ߈Ÿð·¼+ð7⿇>x§áÏÆoÙ'þ ¦¿ðª>%þÎ_ðÕÚ—‰¼oÿ§‰¿d?øMì|Zøëà_xBøñ®ü9ñçƒm¼ ©i“|N¹ð¾§­êÙš&™áÿì+?ÿoèVW>ðÇŸ£^Zh–V‘íé_²/쟡|*ñ/Àöaýžto‚4Öàñ/Œ~ é_~iß ¼Yâ;Y¼?qkâü<´ðÔ>×u»k øZx5]SHº¿†o x~XçWÑ´æ¶×ž iu_ v¾Ï]ùU՟ż¬Ågß·—nžv~—±ùykûsü~Ò<û_x§Á6Ÿ ´ÿ~ÃÚ'íqûH|PÐëpxGö(ÔãoêÚLJúÿÅ-Køsð3áÿÃo„z7ß?oÿÚÃà×ÁoŠ´N¨ÿ³Ï‹¼#ñGþ uð[àßÃ{„ß|-â?øöðŸíÝ㟇ž7ø™ñãö€ñN™ñcDñf™ûI øÏÁøkðZþKÿ‰é¯h~9Ò-üÚŒ?WµßÙ«örñF«à]wÄ¿~ ø‹[ø]ãoüKøg¬k¿ ¼ «j¿¾#xÛÆPüEñŸü ¨j Åß„|mâïˆ6ðxëÄþ*ðüÚ~»¯øÊ|OªßÝëq%òö¶Ÿ >Ø`ý‡À ³ÿ„WÆÞ-ø—á²xWB·ÿ„sâ7¿á5ÿ„ëÇú“`ŸØþ6ñ¯ü,Ÿˆ¿ð–ø«Oû>»â?øO¼ký±yÿ N»öóžÉÕ»;mg¥õ÷_ËRÏ¿ü¾íž‹½ÏÏ=Äß¿c?þÌßü.Ÿð†~Êö_ð¦| â/Úsâ_Â-wöñOÇïÚãWÆ9¼«øÇú§Á üMð'ãgÅ_[üAñWíoñOàÿÄß‚>1üs¿¸ñ¾©àoišg…þ5v¿³Þ»ã/…žýº~|%ð/ü,ÿød?ž;ðì×ð¦_é^¹ñ.•âïÙ«àŸímào€¶Þ,Õ! øyàŸ xÛöÔ¾üK/hþ øI🠼-s¥j_ð†êzö»íŸ ¿c_ÙËá'ü*-CGø[àŸøÛà‚_áWÁ‹5ðGuïŒ >XÂM¦ø7ᄾ* ÙøÚßÁ>ðOе‡Z ßkþ)×|,nï¾"ø›Ç>6ñŒ¼_â^ÛÀ>øàåÿÀÛ½3þ‚|Mÿ .ïâD?ìô/ÂØ×~6x§Å^:øÙ¯xÿBFÓ|yÿ cÆÞ;ñ¯ˆüUá-Â~øsgÿ 5ÿ†¼%௠ø&ÛIðÆœœ£g×U{«]ݾmïk¯‹í;r¥¨½õm´Ûü¼ÏËË/ÛËö¡µû/€-ì<ñã?ˆ?áx|M*ïöLøÙð Ïá7í·ü1\ÿ~ |Nðþ«ûDüp´ñ·‚|5ðûö€øÉûN|uøð'âWÄxÏöUø?㟌?³þ­âo|ñw‰|aóÏÇÛŸã÷Æßø&/…¶šßÀ-3ÅŸ~hÿøÝðÃÂ_xÂ? µ½cÄ¿ ü-àÿxOÃ>øoâ?Øx·K×üAàEÒl´Ïëzæ™ãÿéÚÆ«áë]:ÿS°ñ¯‹m/gžßÄšÌw¥ïÀÿ‚Ú•†¥¥ê?>_éšÎ‰ñkÃZ¾{à ÝXj¾øûâ;oüvðþ¥i>“%½ö‰ñ«ÅÖvž)øµ¥]G-‡ÄÚÛkž1ƒYÔàŠéZœO’ö¾º.¯¢Óµ—k§}ÂÏ¿õ¦—ûõß_#ò‹öÆø‰ûFüHý”¿à©¾Õ|eðNÇá÷ìËû/|~øñkJÓþ øèxËã7Äm_þ ÕáOZ—Äχ^.¹ý §Ñ>x$ë|?¡Xü)ñ/~=k¶ºW5‰§ø½}wã{'ð>߯Û#öÍø#ñ?e»_ |.ý ¿h¯kçð~üøsOðçÆ/þÜÞ<Ô´«ßÙÿã/í§á]3Æzß„4ÏØÆ+sâ ¿ÛSᆡañ{MÔôï ^kÇ„>7~†ê¿²/ìŸ®ßøkT×?fÙçYÔüðºþÔu_‚¿ µÿ üºðçˆ<uðƒÃWw~šãBø]sáx§ÂÓøK’×Âsxsľ ÐäÒ[LÖu[ž×Çßþ |U°ñn—ñCáÂï‰gôOøkÇzw¼á?Xx×ß|G¬xÇÀ>ñm§ˆtFßÄš'ü]âÅ>Òµ˜ïl<3â=sX×4X,µ=Nöêsž6K–ékª[ûºèõÙ¶®¯~W¢L?¯Êú]úŸ†ÿ´ÿí7ûU~ÑŸ±'íÏðþâÇàŸÁ oà÷üËã—hÍ3]ðÝŸÇ-Wâü$~!ý¹¾j>ð-çÁŸÚŽçá÷ìçãm:Óö@ñ/ˆ|O ê¿?k¿øV¾2ø«Â]ëzßÀ¯k?¿W~<|KøÒ¿~þÎßuß…ÞñwÄŸ…ß¾4ê?>-|7ñgÆOiÞøâÏÙóÀ×~²øqàï‹¿õ7Öü_©þÑšF½mãyþ%=‡†¬<©h2øÄw5µ×üÛxóöEý“þ)øsá'þÌ?³ÏÄü$ÑÃ_ |-ãÏ‚¿ ¼_áφ^k Koü=ÐüCá­GLð^ˆÚg†¼9§6•á»]6ÀØxD´0}*Â8;_‹_þ |}ðå—ƒ¾;| ø]ñ«Â:n·mâ];Âß¼á?ˆþ°ñ†¥¥Úx‚ËCñŽ“¬é–ºÝ®™¬êúu¶«¬wðXjº•¤S­½õÔr§8»Z6IÉÚɥ̒[¿zÍ^Òz|7²¸[ôóÛËe/Sò‹à§üöøÃáh?i¿ìß‚~ýŸføÙÿøø=ÿ þ_jÿ×þ¿àçìâŸøH¿á¤ÿáméž oøU~6ý¶¾Ýý‘ÿ ¸?á8ð·Ã/øFÿ´ü«xÏþÿ zíûC|~ðßíÕá¿ÙÓà~±ð»ÂZŸÅmöVðùñ·Å¯ |]øÁáÏXxŸáßüÃâç‰'²øIáÏÚàç„aÖî®?dè6Þ%ðýdžѮøsþcßÙÿÂ-¡}€¾øiðçSñ–ŸñRð‚uˆ:Oö?öWޝ¼+¡]øËLÿ„wJø‹¡xû?ÄóØI­ÙahŸ>-hú?Ù¯¢þÌÒ¾(üEÓ켋Ox–L玭BÚ4–-#k÷³M¶îÝõØ>zéwùú\üØø¿ñããOÄØgIñ·…¼Q¢|2øß§~Þ_ÿf›¯xLñcxRñÂÏø+/€?dø¶iÞ?ðÿ‹‡Âï‹vþ×5¯ü“âÜ÷ëðÿÆš¯Â=S⿉P]øãUòï|Dý£~|lý²>!j¾2ø'ã_‡×ðPߨ‡àůéÿüuáx·â7íû/Á1¿g­Kâgïˆ÷?´‹tO†ž ðÖ·ñOÃþ=±øSâ_†µÝCJðޱà™þ/[ÝøºËÆÞýx›á§Ã›øŸáÔþðLÿ¼mÿ ×ü&~›Âº¾ ñwü-W]×~&ÂOᇰm_ÿ…‹­ø£ÄºÇŽ¿µlnÿá.Õ|E®ê þлյ ®14Oÿ¼5áÅðw‡>|.ðÿ„W[ø{âUð¶‰à é^_ü$°ð—ð§Ä ¡Øi0iƒ[øe¦|,øa§|=ÕE¨¿ð]‡ÃÚxn}6ßÂNâ“\º6ô²ø[ƒµ÷VQi[fî¬ÂÝü¼¿óÏöý³?jOÚSÄ~Õþ5üÑ>ü+ý¡g™ÿio‚7sÝüðLjôŸ}¿á=Õ„´­;õïÇÿ‰?´.‰'‡>4èRøƒã^¯ð'öA°ðMþá¨.ðÿÅø)×Áoƒ ì>|Ið·ˆü â?Ø{·wŽ~xßâgÄ{ÚÅ:gÅÅšgìI&ƒã?x[á¯Ákù/þ'¦½¡øçH·ðCh0ýxðÀÿ‚ß |.øqâï‹zÚø—â·Š|à øCÄ|F·úÞ¨¾ ø…®x{IÓµ?kk©ø—ÄzŠê¾$ºÔ¯Åÿˆ5»±8¸ÕoäŸÅ>~²Âɾ-êš_Àï…Þ"ñwÇoãö¡ñ“âŒ>ü6Õþ |Mðçí!ñWÄÿ~!ü3ñ÷‹-ü§j~4ø\ºŸ‰cð¶àÏɬXøcÂZ¸úíÆŠº”ïšo•[K$ºYßvíöuZ»l®ÂÏM}Ï_¼ù{ãí[ûX|%°øówìóc©þDzûlüv𷃾$øÒÃâLJ&øÛãG|uñ®ïÁ‡ãŠ?áyücñÆßøK^ø¡x_Dñ6·àÄÚÝŽá-X¾¿þÍð·ƒü§êz¾¡áøuiE([XëÚË]Õ÷Zû×Ý_•hƒ[ÿO·ÝÕ~'ç–‡ûbÿÁCbñ×Ão€¾5øOðOÀÿ>&ülð?‚´ÏüSÒ¼àÏ쿇??g/Ûsâeç‹n?g߀·í£âeÿ…uâoÙ.Ó\ð¾½âßô/Ú[ûOÆÿ4O‚º‡õŸÚNòíkö²øýû7|½ý ¼}â-ㇴ?ÛËþ ¾Þø~÷?|ñIð?ìÉá?ø+¯Ä´ðŒþ*Añ›Å¾ø™¢_Ü|ð'ƒ>èž!ø!Ãÿƒ^²°[/‡¾0ñσ~xïÁ?²Ÿ¿f¯ÙËàþ•£è_ ~üø]¢xwÆÚ‡Ä¿èÿ¾xÁ:V…ñVðm÷íWÇú>Ÿá­L´ÓÔõ/ê*²† v÷Áº…÷†.oåÑ.籓jÿ­~ j¿m~|.¶ø©®ë~ñ.¹ñ2xNˆψü'àü2ð·ˆ5_G¤¯ˆõoÃ_ ¼iㇾÕnõ)¯ôoø³Ä¾Ó§¶ÐuÝRÂè熾⵵²µÞ«»qNéèÝ­mž‚O¿õ§¥özÚúŸ—ºOí[ÿ·ðçü%âÏÙßDÓþ$øO[øAâ-_Æð|<øO®øá·À߈6$ñGÄíWöø)ÿ ý¡>*|]Ñ<)¯|³ð¯‡Ï‚?i_ |Lø±ñ?Ä¿ð§¾ü@ñìÝ®ø/ã&ßí]sªþÕ?à™šGƒüqðOâ†jOžÖÛö¿ü0ÿìYÿ çþ÷ü2ì½ÿ þoøYð«?á@|(ÿ…sÿ û þøOÿáÿ„KþŸøM¿áÿŠwþ¯ìÏíßì/ø”}¿û?ý¾†Õ|5áÍvÿÃZ¦¹áýYÔü­Ïâ_j:®•a¨ßøOÄw^ñƒ®¼Aá«»¸&¸Ðµ»Ÿø³Å>ŸUÒ䵿›Ãž%ñ‡$í¦k:­ÊçŠwŒRjû$•ùl›—]mt—fÝÂÎÛöý4¾ž{÷?>=ÿÁAÿhß„_ >&~ѺV›ðOUø}{ãoø(¯Àÿ„¿ õøê?x/â7ì)ðÃöØñ~›ñ3â/Å‹o‹i¢|PðOÄoöñß|)ðׄ:ï…ô¯Œ=œµÛ¿…÷º—Äߨkí{öðÿì‰á=Cþ_ü8ý µïÚ‡öз|iã­káÏ„?áe~ߟ<1ÿUü?ð–ü;ñ·ÅŸéž ñ?ü+¯‰wÛÿá}èIâ«ïøD¾ é>;ÿ„ÂQj³Wìå«xËâ/Ä]WàÁ=OâÆß|4øµã­CáWo|eñGáΧ¥hú¥àˆ¾'¹ÐeÖümàCDðï‡ô{ï ø–ûSЮô­ GÓç°’ÓL²†Pñ/†¼9ãOxƒÁÞ1ðþ‰âÏø³DÕ|5⟠x—J°×|9â_k¶ézç‡üA¡ê]išÎ‰¬é—WZv«¥j6·6…Ìö—pMo4‘±ÍŨÚÎïEªNéyÙiwñnõl=]ÿž_yøÙàOˆŸ´oÀŸ¶GÄ-WÆ_ükðúãþ ûüøµà]?࿎¼#ã/üFý ÿeïø&7ìõ©|Løuñçö‚ñn‰ðÓÁ>Öþ)øǶ? |KðÃâÖ»¨i^Ö<?Åë{¿YxÛÁÛ±§íuñûÆûi?ô­à￳ÏÀ‰¾¾«ðÛâïÇ‹ÿÚ‡ÇÇìeeû@üD—Ã_µ$ß´w‹µ?€ºßýNßÅ:eÇÿkÿ‡>-øñß |Aão|jø«¯xÃÅËð{õ Døð[Ã^_xsáÂïøEu¿‡¾%_ hžðž•áÅñÂKé |@º†“˜5¿†ZgÂφwÃÝTZ‹ÿØ|8ð§†çÓmü!áèôì_þÍ_³—ÂïMñáŸÀ‚¾ Üx'Bøi?޼ ð«À¾ñ”ÿ|/¥xcBð×€&ñ?‡ô?[—Á>Ñ<àÍBð«ß6…¤é^ðÆŸ§Ø[ÚhT6Î-4ã­’NÉm–›'{»Ù»;+;Ióóü¾ïE§ËGñGŠ¿j_Ú7Ã?þÒ¡ÕüwðvÃãïÁoø(7íñDñ/„>'~Õÿ³_ÁŒÚÞ†Ÿ²¯‰´¸ñW׿³§í7ûU~Ñž>Ò~ÏcðOà†·ð{Á>ñ¯í¦k¾³øåªüCÿ„ö•ýªþj>ð-çÁŸÚŽçá÷ìçãm:Óö@ñ/ˆ|O ê¿?k¿øV¾2ø«Â]ëzßÀ¯k?¾¼ñìµð[Çž#øÑâ‹ Ñ>4[üuÑ>x?Æ~øµáß ø×áüþ _ë¾&øgà/ßøy|9¨èžø“ãOˆŸ­µXx£ÇxãǺ’Íâ×ð…~xSÀ{z¿ìÕû9xƒþ÷ö÷À‚zßü3Çögü(í…^Ô¿áFbÂ;ýÿ {íš ß𬿲?áð—ögü!_ØŸ`ÿ„_ÿdò¿±4ϲ·85e´ZÚíh—WfºY­>$îì}ï·—nß7ó±òïükÇŸ®?aا]ý¤~4ø'ÇŸ~6|ø!ð÷X›J×|ã/mþÎÚÄUð¯‰õ|Yø­ükøÙ‰á¯ˆ>:ñßôI¼)ÿ v•¥ë¾' <3i kwסµåÞøð[ÂwóêžøAð»ÃZ×ÅüpºÔ|?à è×÷?|iáÍWÁÞ1ø¿=Þ¤Û\MñGÅž×uÏ x—ÇòHÞ,×|9¬êº©«]išÝ¬Þ£Q&œ›Z]·k%k½’Zl5²êQEHQ@Q@Q@Q@añ»þHÇÅßû&>ÿÔSV¯óÖ¯ô)øÝÿ$câïý“ê)«WùëW¥ø*‰~Fu:|ÿCý(<_ÿ!kOûüÿ¨_‡ë—®£Åÿò´ÿ±_Àÿú…ø~¹zóçñËüRüÙqÙz/ÈñßþÎÿ³ÿµëÏøïàgÁßøŸPKhïüGâ߆^ ñ½|–V°ÙY¥æ¯¬h—š…ÊZY[Áil³\8‚Ömâ h‹ÍÿÃ"þÊôl?³Ïþo†ßüÍWÐÔW¯Kˆø†…*thg¹Í4i•T³Lu:T©SŠ…:t麄)ÂŒa¥Æ*1I$ŽY`0”§<Sœ¥9ÊXj2”§'Í)JN ÊR–²“m·«w>yÿ†Eý”?èØgŸü2ß ¿ùš¯DðÂ?… ƪ>|1ø{ðàk¦ÄëcÀ^ ð߃Ʋtϵ4ê£ÃÚnœ5§Bÿì&ïÎû'Ûnü/í3oô*+$|@½ø¢þÃÞð>©ã¯8øq>•­x»Tø£ã«ˆ <3s.©á <ñDz×ügŸ aºÔþ xQ5OQð·í½ámOâ¾xÿà×ÆÏ‚üyãoøWNømñ>kz®™¡xÇá'í1ñsÁ_õ|øÇñcáòx'Å–Ÿ²'ÇéögŒµOˆÚgŒ¼)b|Qà ÁÞ&ðçŒ5:p–öºµôíßî³òM_tþ¿¯Síz+ä?þÛ?¼û8|Gý¨¼].·á¿†ß >(üPø5ªIá=ÿQøðÓö“ñ'쟱®x¯Nð†ôO|dðô:o†¼kñƾð?‡¼9¯é^0ø±â?†ž±ñN¡á¿—µ_ÛÏâOßß/>+þο´7†>ü?ýÿgߎ¿4»™dýRÿöS°½ø»ûpè>+|Z“Â?´µâ?èž"ømð_Áþ1Ó|/ðQý¡|GiáÏÞÚéÞÑ~"kóx[Ä„ôÙµ«Jí4š]ÚºûÒݤ˯ëúþ¾Gêíùåñþ Gð“áv•ñ#Æ~)øeñ±~øþGDðïÆ]?Løayàß‹ßÿdÏü`ñ¯Ç/ƒŸ¼8~*ÅñsMñ·…ôÿÙããæŸc¯üYøgð¿á'‰5_„úÂx{ân¥§ø¯áŽ£ã¼OÚÏöäðçÀ/_¾jž#Öüáëvÿ¿i¿Oákørÿöyñìwÿ<øŸ§ÙiCOµñŽdÖü-ãŸØzOx‚ÛÂÞÓµ¹ì4ï hÚ¥âKxŸÃ‘5 >û·Zu¾–Þú; ëòümþgéEðoìóûB|]øµûX~Ñžñ÷Š?|#ðÿöyý’¼aá…ÿ¦øªxŒxâWÄŸÛ;Eñ·¬µÿ€Ÿ~3i—:'ŠtÏ…¾ðõ¶âÅ¥_øR½²ð–‹o­Ë¬ø£Ëôoø*ÇÂGøaà‹^;ø ûPü,ðÏÆü"øŸðKN×|ðÃâ?Œ¾2|0ø·ñoàÁ¨|mà_þÎÿ>6x›þ(Ÿ~Ô?¯|Oà/i¾ø·¯i^;†ÛáOÃ߉^&мMáÍä•ì•ß»³OâWIwÓ{^Ö}ÂëÓ×OÏÔýB¢¾(—öÞ𵌭¼1®|øÙáýHñ·Áƒÿ~"ê ðrïÁ¿hºWÂíCá§ÀOˆ¶:Æ=câ‰|mªÝütø!¡_x¿àw~0|Ò5_Š:<ڇŸ4O üHÖ<óÏì{ÿÕüWû'üñí!ðë⃾*_þÁºGí_qâŸj³'…¼9ûHøsáÇÃo†Z§Ç?ŠuÏ üj? ¾hxâoÃýE­?h‹¯Ù¦ÃO°øŸ¢]Ç¥é…~$Iðøä•¯nÝUÝÓzz%wÙ4öw ëoë§ùŸ«´Wãg„à§ÏñËãOÀÛÙ—á§Å~Õ~~ØÚWÆ‚ÿ |_ûx£Ä~ø«ð—ÅŸ°n©àÞü\¼ý¤¬¾øŸDÐ>þзosÁOÚ/Çpý¿âÖ› øÃÃãÇ>ñf‘ðÏÔgÿø(Oß|Cøãyâÿˆ~_ÀøÚ_þÏ|Y¥è_ ¾xwàæ‡ÿûýƒÿj‹Ï x—Å~,_kz¼[¢|wøÁñÿÚŒ´ËßÅðÃá·Ç-gZ»ðç…>¾§Žœ×M“vÝèíÓѵѥtØ&ŸõéþhýB¢¾Cø‰ûdøá‡Áo€ßüWðÿ⎑â?ÚW[ø]àŸ„2ñìåð{ö‡UñE÷†>%øŸDoØë´ÀßÙ–ãÅÞÕøâ7ÁÍ ïà‡üëãg‚¼Qã}[Å¿´ÑðÏŒüáß þÝþ!»ø§qðÿA»øŒuÖð¿‚¾ü,ñ^Ÿðû^ø‘ñKoÇ¿·ŸÄŸ¿ìuñàwìëûCk þ5~ÐÚ~•á•¶—öO³¿ý®þøÇö2ý¯>2xSÄ¿ müqûA隟ÃÝËSøoðÃâî¥Çÿg/‰‰áÈì¼.¾¾×®ü_ðñ³—[-/«K¾Žû?uý×ÛQ]~_¿Í«´WÁ¿ÿl›ýöSÒh߃õ¿kÓ~Ðßþjÿ +ø—ÆÚ¯íñÒm ûÅþð/Ƈ:F«ñGGš_‹p|.ðα¬x P“Mé¥Õ®¯tâšK«¼•»ìµÐwþ·ÜýB¢¿!ü+ÿ¸ý†<[¡|Kñ-Œ¼À¾ °ø‹á«ßøX_³¶³ÿ /ÁºßÄo|%ðæ±öo üsñßìçý¹ñâ÷ÂÿgþÜP~Êz¯†¿áaÿjøâǺ'Ã?ŽZ—ÂÎÛãüö{ý™µ_økö‹ð§¾øÛ[ðHøŸãÏüEø‰û&èž2øAðÂëÆ^2ð~‰ãmcG_Úfçþgü$ð¯øKÅdzíÊïÛåw÷]_³i=ZBºïý=Ô*+çŸ?´$? |Gàøsá?ÅŽß> hž7ñ‡‡þü%›áV—â3ðÿá­ÿ´_øú÷_øáñGàÏÃkmÂÞ#ø¥ðÃÃ×:8ñܾ8Õoüu¦ÞøoÂZÖƒ¢xÓYð¿åoŸž<ÿ†•øµð~6xŸàÆ™ão؃à‡ì÷â‡þý—´Ï‡>+ð÷í™ÿ÷ñ,~2ðö•ñãVÑ~;Û~ÚéáOÛÅ÷¿ Ž7ñ&‰¡iŸí¾0x7SñŽ“ãh5ò0”¶²ZjÝ–²Q_{zw³¶Ìw_Ö¿×ü7s÷’ŠùÇ_´&¯ð áŸìÑk¯ü'ý¡¾5|TøÕ­øoá.‡à ¿fK?7ÿ,þüBøÍâ›ß‰š”Ÿ~~ÍZf·¦x[áŽnügsðãÆ1øFšwÃ}6ûA¾ÒÄ_<øßþ wðæ/üsxãd1ø'û/|Rý¡þ!êÚ‡Â} Æ> ø)ÿ »UýªþøÓÃ_d´øÍà xÇÆß~;þÉÞ7øU}ðçÀßm?ánjº¦âo‚ß¼MðcHø©ñ³áBP“Ù]wùÚýìÚvÓ[;ú…E~y|Fÿ‚‘ü$ø]¥|HñŸŠ~|l_„~ÿ†‘Ñ<;ñ—OÓ>^x7â÷ÄÿÙ3Á¿°žø›©iþ+øc¨øï¶øýûRxËáïìÅ þÐ?¾xÚ÷[×þ6~Í^оøÿ@Ò¼)ñÅ^ øÑû[|*ø4Öñ?< iàoxçá÷Žn×¢¾(—öÞ𵌭¼1®|øÙáýHñ·Áƒÿ~"ê ðrïÁ¿hºWÂíCá§ÀOˆ¶:Æ=câ‰|mªÝütø!¡_x¿àw~0|Ò5_Š:<ڇŸ4O üHÖ<åß¿lŸ|ý¬>>h~2øñGÇ?³WÂÏÙömøëãø×à±ðçìéa­|Iýµ,þ0|Vø…kâψ~øÉã-óÀ?|-ª/…þø[ãGˆà°øe­ÇáŸAâŸYéÞ6$útºÕkªV]/ªvݦ­º¸~”Q_ž_¿à ÿ~~Î^%øÙc¦øÛOßãoÛoà÷†.îü ¡x×ûâ7ìQà_Úóž:ñ½à¨~-ü9ÿ„›Á:‡ü1ÇÄY<%¤iÿ<%®ø»ûcÁZN±©ü6þÜ×uïü‡ñ?þ ñwŸ±÷í§uào |Qø«ûE|Ñ?à¤>0xEø¦øsönøðçö§ý¶þ þË>ø…¦üYñ·Ã}3ÆÚ&“¦~Ízý¢èÿ üñ³Ç…‡ÁýoQøá+ÍcÅþ?Z§'m-yr릷kWµ“Võ²KT+¯øm{võGîMù{cÿ1ð¶•yñjÓ[øEñ³Çø ÿ ‹Æÿ¾3x+Ÿ<'ðçàÁχÿµWíqû>'Š<[áo~ÓZ—ÅÏÿÂ)§þÈuízãà炾 x§ÇZ‡í<[ |,ð‡‰¼q¥|ð÷µé_¶÷…µ¿Œ~øc¦|øÙuàŸ‰¿>,þξý¢¶|‡àæ·ñàg…¾5xƒâŸƒÿ±.>1ÅûAi¿ð‹êß³ÇÆÂA«ü °ð¶·âŸý¯ÃºÞ¯àŸx_ÆÚp’¾›_ªè¯÷Û[omm`ºþ¾_æµ>×¢¿!þ<þÛß´…õ_ڻà ø5ãkÛOÙóö×ýƒþø/â/Sàƒi_|-ñ£Æ_ðN­CâÀI¬~*|c±ÖÇÆÏ蟴×ÄÍ Bñ~¡à_‡¿4ßxbgø·áˆ:5Þ°Ý·ÅOø+ì÷ðWJÓlþ(øSÆßþ.MãoøÄ?¾"üDý“~xËÁš¯üðŸâ&»6±ñGâ¿í3àoÙ_^Ç€þ?üñfŸ¡|;ý¡üqã-OJø«b–>›Pøñ¢Çá“örv²NýMü*Wk¢´•ÛÙèí¥Ýÿ¯Ô*+ó_ö©ý§üY¬üý¼Sû*]üQñfƒûg|QðΕá¿ü Ѿ iÿ®¾k¿²ßÇOÚo@ñ/Â?öÅ“Ãß4 oWO…Å|lÐîfµøg«xïKÐ|?§üT›Â†‹cÿ1ð¶•yñjÓ[øEñ³Çø ÿ ‹Æÿ¾3x+Ÿ<'ðçàÁχÿµWíqû>'Š<[áo~ÓZ—ÅÏÿÂ)§þÈuízãà炾 x§ÇZ‡í<[ |,ð‡‰¼q¥|ðñìåkÛå{5«Z§µÚi-ÛÑ!]_/óZŸ¨TWä?íÁÿ9ðÁ{?Úûö{ðŽ¿ÿ7í;ð÷ö^øÿ㯃ž%ÿ„×öjñ×Û~'øöUñoí Cÿ gDøµãߎþþÄð¦ªø¯ûwã×ìóào„šÏü"¿Øéâ}f_ü2Ó¾!~¼RqqIµe-WšÓ_M~ôî0¢Š*@(¢Š(¢ŠóßòF>.ÿÙ0ñ÷þ¢šµžµ¡OÆïù#ì˜xûÿQMZ¿ÏZ½,ÁSüKò3©ÓçúéAâÿù ZدàýBü?\½u/ÿµ§ýŠþÿÔ/ÃõËן?Ž_â—æËŽËÑ~AETŒ(¢Š(¢ŠùçÆŸ³¯ˆþ#øÿ®xîÓ[ñ.™ûL~Ï> ý˜>+x:}fm/Ú—¯ßü»[M*ëÃÑèþ.Ñu¿[þÒ>ÒüA¬Ùx¥f[ ? Iáèü?©é×úŽ«âs~Áš&§/|KûE~ÐÞ*ý¢¬õ¿ê¾ ý¨µX¿g›Š¿l>øsãWƒü-ᯠx+Ã?³ç‡ÿf­SD³ð·í1ûHh“Ïã߀^4ñì?¼A}sâ 5ü!Ô¾üóñ[ã×í·àÍwöøkð÷Jÿ„ûâìµàŸÚö³Óu/øD|=â¯øho†=øsñ"÷öý¿áRø)4ÏéŸÚõ?‰ÿ á ðŠ®>-ø‹þÅý¯ãk ÓöÏðuͯËß¿hÿÛâG‰¾|0ðßí·ðOÇÞø¥ûPø_á¥ßǃ,ø[ûejºN…¨þÈ?·WÅOŠž‹âׂÿbŸØÛöb°ñ¶/Á/ƒ>6ø]á];áçÄ¿ˆßüeª[x÷öŒ°ø™ð#âwÃÏ‚¾+ÙFvmJ6I7­ô¶šY»8¤ÚkUdÓµ’ºêŸô×äÚ×ÉØýxðìÍsð»ö¿øà_¿4-oSñ·Ä¿ˆ·ß~ÃðSøÇ?Œ¾0|oñWǯˆºÇöf±ð;Pøü$^+ñ·‰ô_ìø~ G¥i>ÔþË¡XéšÝ–Ÿ¯ÚxŸƒÿà™Ÿ³—€~|nøàûxsÁ?ÿeãû*øê_è?cðµÿŠj/xŸÇ д/i¾ ðG¼WãoÚóâçˆîôO øNÃàç…±á/ |6øMàoør \|ãÿÚ‡âN·ñ·â—ÃÝ{ã‰ñzãõçì©£ÚøOàåïìŸñãöGø'àyà©¿²gÁïx?âõž£ðšÚ—àíå/ƒ/õíJO |JñgþÿÂ_¡|Uø³û;xûHñwÃ[O~Ï/þÂ?³f>;~Ü_µÅˆþ“Dðσü}ã?ÚGÆß³‡Á_‡ö¿ÛáWí}û6é¾ÖüEðkàÏìñ¦hZ'‰´ÏÛÿãXM_MñÅ׎/¾E¢x¶ÎßJ:³Úèßho| ÿ‚éžÔu¿ÚOã'ìc­ü@ð×ÀKÆ Ñ5ˆ ø{­xIð–’Ðj>moƾ"ø;\ñ߉¾=þÑ?²çÂ…·o¾=ü#Ðj‡¾%ð/í³ðê?ÙÇ>2ðÿÅ¿~ÃðVþ1| ÑüWðïàþÊúÇü!^ømð_Ä:‡„üCð_Äü'¥|¾×uß?Åÿ %ð=_=’Wm^ö²–•µÍtÛÝ»¶¤ÓA¢¶´ù¥øiémÑúñð?öf¹ø?ñâoůü}øÙû@|Aø£àŸ…?µ_|a±ø¤ÿaø7àæ»ñ{ľÑü;¥|øðCDMú߯ÿ^êú†»¦ëº­ïŸ¦[C}ii§$|‡û;Á1áð‡ÀßÙ‹Áß´GÇ/Š?~$þÏ_ ¿f?øR{k¿…ZgþMð/âgì×ñÛÄÞøK/„>|1×¼Yð»Ç?e_ƒZv¥¬|sµñ÷ÅQðÿÀÖVžño¼Gâjþ úöÃøÃñöxÿ…wñƒÀÿ…¥à—ÿ„»à÷‰> ÿkø[Áð”|cøÇÿÆ“û%ø‹þFµ¦kz¶‰ý·ûAhžý•?²,4Áám7þçþ—ĽOKðOÀ=JI~(ºøûû@|6øÇ¦ü'ñ×íaÿ gíðçãgìcð'Áÿ³—ü ¿<ÿ ­ðCǾý—,ÿj/ÛgþðޝûAMÿ†­ñ7ö°ñü$_¾*xcöøWÿ Íý›âï ëºO¯Ëã9;WRнžÚ®_vÊËݲjû.V¯¥ìiÛm5ùwzôù®ûýåâ¯ØÛÀþ,ø««üC¸øñGKð‹þ(ü-øëñ/àN•uðü|*øŸñËà”? bøQñ[ĺ¾©ðóTøß¡ë~ ‚?. ð¿ÃŒžøg®Íð“ÃëâÏx‚ßÅ øâ~ÿ‚cü3ð§Ãÿü>ñ'Ç/Úâ­¿ÁŸ…ÞøKû6x“Ç—tßþÍÞøsã‚ßü{ðô|/øðßÞ6ÖôŸ‰?³_ìïãF¹ý¡<;ñ²ÃP¿ø?¢hÚ–›yáüUðçÄÏ=gþ %ñËÄÞ ý…þü-ý§~GûR럳ÏÀ{/Û·Þøgãÿü*ý¦üaûpÿÁ'¿gŸé¿´ÁmïÂ^.øg­Ø[ü{ý§|⟄¶º·Á­^ ûßišUσügà_ ëÞ ýBýµ>'ø³ö|ý™<;e§|XÖü7âío[ðGÃY?jˆ5ø-ðcÂ~¿Ó´‹ÿjŸ¿h/‹^)ý›þ5|øI¢|FOÝü4µÕíeïøs^øÓñ_á×ÃxWáõÇŽ4?x-Ú¤yW2M»%Õré{Ûkitîã£ÒÈž¶ûüÒ}ý>{N—ÿá} â߯M öÕý¯4úηñCUñOÅØ4¿ØÊëÄ~,°ø¯àÙCáþ¹á­WÂú§ì{¨|+ÓôM'AýŒ~ 7‡çð¿ÃÏxŽû_Üjþ ÖS_’ l_þÀßþ|-°ðnˆÞ ðgìŤüløiñ¿ãÓü`ñµÝŸÃ€ÿ³ìqá_Ùá<ðãÅž.Òu{Køßá÷À_†_ÿi1ñZ×-¼}û*üQý®3Õ~#ßj¿ü ðPøàÝÃí/ûUxëÆŸ³—í¿á[/Úëþ·¼Aÿ˜ø+ñÃöKò¿g+ÿøe¿ÙËà¯o7áÅŸøFþü3ð§íà}º·ÁïÙ·á§ü'ŸüãOø‹þŸØ'Ò®|mñážµ ß%Tì䕟+²kmzE'o³­“ÑnГ_Ï~UßÍ}×õþ†¾?ü¹øõðçSøgÿ CÆß ´O}³Oñ„þ ð§ÀÂoàÝ[BÖ|?â‡^-ð×íðgã§ÃíWÁ>%´Ö7ëÖ?ð†AªßgÚXlE¢]ëzV¯óÃÿÁ8fK?xÏÂÞÐu¿éž#ýž~þÎÞºð­îþ#ø+aðŠÂÃNð?ƃÞ1ñ6ƒâOx{ö†Ó­üû>Iqñ‡]×üPÖ¾-LiÎüªI$ÕÚ¿}ö÷­kÚîÚ­Ðî·û»ëo»u½¾íOÜŸ~Â? <ñ>‹_ øiâ/ økàŸŒ|3û|½Ô†4Ýâß…µ_ _[|0ø¯à ëÚ¯‡.‡±…¾Üü±¶øËñ³Å¿f_i>*ýœ>xþüд€ÿÿg ᦅ­xcàç†~(øÇÁ:_Âï—º|7ÿ¾"üEøuªøÀºÆ¥ãûë¶ñÑñÇæ½—í*úWÆoŠþñí¿¢~Ïß³6³ñFÿU?·–•gûx>ÿâ׎<9ûÿÁ(µïƒ^ñ/Åÿ|×?f¯ëü-ñ£ãßŘ'´øzŸj^¿iOÛÄÞÕÿi?ŠŸ¼màoxgö¡ÿ‚eüñgìwwðËáo†~xgþÿàçüj?ŽZf½gâ?…÷µFãoxóö¿ø±â Yê_´¿ü#>)ðÏ‚´?èÞ&ðÎâ_ x˜å©o‰YÅo{ë¢WåßÞk}wµõ4¾Ý{z;þ^zh´?Pæý’þËðOÄÿSZñµ¾‰¯ülñ×í¥x®KBox'ã‹¿jwöÄðÿŒ<1$þŸÂ—ð«¾;êÚˆü áÿøOÅÞÔ4¯ è^ø™¢|EÑ.Õ>!hÚ7…´ènoüIãÈü'‚4Ëÿ éÞúòŠËš]úßçtï÷¤þHgÅýŒn~ø6oü9ýª¿jøgÞ о|Ò´ýCà=þ•û5ü0Ð5_ \Yø'áׇõdž~$ìðÏ‚¼-ðöÇÇ¿µN‰ûEü[ð߃l5…ðwÄ/x›ÇŸüJ¿ð6µãÿÞè>|føms¢x§Ä ~x†çX‹ÇUÿtÛ/ ø·EÐu¿hÞ(òï ~ÀßüðçZøKà†ñ·†>j?dÿúg‡íø±­ü¸ø+ûCj¿¼IãïÃà{ψ¼ý™?iƒ"ËÀ:oÄÿ…ßþjzÞ§â?‹þ³Ö-¼iàé, ð<ž-ÔtmJÇÅÖ>2ñ6ŸðO‚Ö¿ÿh߇ÇÄÿnmÿj¿ÙçVýžþ2x’}kÂcÄzÌ>,ñÇíSñ?âÅ([ø&ßÚňŸloŒ¾4ñ:o‡aøU£_ÜxkFðÂïxGB_]}åEòI$ì—ktwW{»7uÛï _wù#óËâ7üsá'Å+âGƒ2ülñ‰«øÛàÇÆ‹¿µø9iàß_´À-+ávŸðÓãßÄ[í àæñÃ^6Ò®þü×o¼!ð;Ç_þjú¯ÂíCá$ú'‰¾$hþ7>8þÄ>øíñǾ7Öþ2ülð†~2|ðgìëñëà÷‚Ÿàâ|9øÛðsÁºïÆM]<âÝOÅß<_ñsÂðiÿþ&ø_^ñÁÏŠ #ð¾»ñËö†Ðþ ëºßí3ã €Þ»øÃÿ ü@ý®~~Ð ¾7xûÃþ'×>kßî5½yÿj4­Å|IàøãÅA¤xJÛÀ>ðßt“ÇßðL†~/ðŸÅïxcã—í ð‹Lý¡tOŽ^øý?ÃÛ¿ºÿÅ¿‡ÿ>4þпµërüWøñ:ßÂz'<]ûU|yÓ¼¬|.µðއvÖ¼&oô/|ZøÓûc|vñï€å ú^·eâïÛsâ¶¢\ø†×ÅÞðÿÃÛKý7RÔô¯jþ,òý+ö0øÇaûcøÇzgŽÿáý‘þ|lø³ûLø#ágü,/ xãþŒþüjð¿Å9¿á¸ý”|ñ3áÏöïÄÏÚgãÅíý_öÖøïák]¿ðˆøwàÏ…­ÿ»=o爿àž?¡ðŸíiàåñ?Ŧ~Ù? ¾(|%øŸ;k^7ú‡>-|iý±¾;xŽ÷Àr‹}/[²ñwí¹ñ[NÑ.|Ckâ‹ oxáí¥þ›©jzW‰5}åE R[7Óðm¯Å¶æ¿Å¿ø&?Ã?ŒPøÂúïÇ/ÚCø7®ë´ÏŒ,~xjïàl?ü+ñö¹øUû@|.øÝãïøŸ\ø¯|o¸Öõçý¨>5ü@Ò´|]ñ'ü;ãA‘á+oøwÃ~ÒJ(¢““•®ïkÛç¿«}[Õõ [úù~ER¢Š(¢Š(Ì>7Éø»ÿdÃÇßúŠjÕþzÕþ…?¿äŒ|]ÿ²aãïýE5jÿ=jô°?Oñ/ÈΧOŸè¥‹ÿä-iÿb¿ÿõ ðýrõÔx¿þBÖŸö+øÿP¿×/^|þ9Š_›.;/EùQR0¢Š(¢Š(¢Š(¢Š(¢Š(‰ñWïøÛ]øiâ_èÿÚzßÁÿ_üEøu{ý¡ªÙÂ;ã-OáÏþßkfÓï­-5o?á÷Åxû?]ƒSÒ¢þÝþÕ†Æ=oLÑõ-?¶¢Š?M€(¢Šâl>x7Løâ¯‹V:?‘ñÆÞ ðïøƒûCU—ûOÁ¿ µß‰~%ð.ý•5ôš%—ö·ñƒâ-ïö†Ÿ¦ÚjºŸü$_fÖ/µ M'BƒL<ðëÁ¿ ´+ÿ xGþÂÑ5?|Kø‹}eý¡ªê~Œ¾0|FñWůˆºÇÚu‹íBî/øH¾ øÛÄþ þφxô­'ûOû+B±Ó4K-?M´í¨¢ï»éø+/¹h» (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€<Ããwü‘‹¿öL<}ÿ¨¦­_ç­_èSñ»þHÇÅßû&>ÿÔSV¯óÖ¯KðTÿüŒêtùþ‡úPx¿þBÖŸö+øÿP¿×/]G‹ÿä-iÿb¿ÿõ ðýrõçÏã—ø¥ù²ã²ô_QE# (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€<Ããwü‘‹¿öL<}ÿ¨¦­_ç­_èSñ»þHÇÅßû&>ÿÔSV¯óÖ¯KðTÿüŒêtùþ‡úPx¿þBÖŸö+øÿP¿×/]G‹ÿä-iÿb¿ÿõ ðýrõçÏã—ø¥ù²ã²ô_QE# (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ øÃöòðŸ…|{ðWá×|uáŸøÓÁ>4ý·ÿà™Þñƒ¼Y£iÞ#ð¯‹<+â?ø(ïì©£ø‡Ã>&ðö±my¤kÞ×´‹ËÍ/YѵK;­;TÓ®®lo­§¶žX›ìúùCöÅÿ’ðWþÏÿþ kÿ¯/ý’ëJ?Å¥ÿ_!ÿ¥!Kgèÿ ÿ†ÿ‚~Ò=ÿ`üAÿÙ[ÿ%ðÀŸðOÏúG¿ìÿˆ?û+󤯫è£ÛUÿŸµ?ð9˜Yv_r>Pÿ†ÿ‚~Ò=ÿ`üAÿÙ[ÿ%q?dïø%¯Áÿë~-~ÆßðL¯…ß¼;ýŸÿ ޾"þÉ?±Ï‚|¡kj¶:•ý±âü3Ó4M3ûO[ÔôÝOûmômÕu >ÛÍ»»‚>寊?hØu_üxýž?hxcÆÞ=ø'ðÁ?|5â|:ð/Œ¾1xËÁ?þ*ÜüÓ¾ürÑþ xBñ7¼MÿÏ‚|3ñËà–¡âφ>ñgÄÿé_´]ô'Ã|ñ?Ç_x%Æ­Vííjuûr»²m%®ïe¾¯g°4¿•tè»þ…öNÿ‚Zø«þ¯øF?coø&Wˆÿádø&ïâ_ïìÙ'ö9Ö?á>øsaÿ—Û¼à¯ìÿ†wð”ø&Ïþïý¯ÅZÛô+øM|%ç_§ü$z?Û6ü5ûÿÁ6|iáÏøÇÁß°¿ü—Åžñf‰¥x—ÂÞ)ð×ìiû$k¾ñ/‡5Û5MÄ×4¿…—Zf³¢k:eÕ®£¥jºuÕ͆£asݤó[ÍùaâÿÙÃãÇÄ?ګ¿ü;ð£ÆÚ—ìÅã¯ønOŒš—ìÁ¯h·?ái|øgÿÂѵ¯ÙÿƱøh¾øãoÚ{ã¿Ão¶Õ§ÀŸˆÚ¯ƒí¿hÏø«~ þÙ6ÿ "øÝûZZ|5ýþð׈,—®iZv§kui J¥H¨µZ£º»÷åîêÕž»ééÙ½lYkk¢>kÿ†ÿ‚~Ò=ÿ`üAÿÙ[ÿ%ðÀŸðOÏúG¿ìÿˆ?û+󤯫è¨öÕçíOü_æ]—ÜÉ?Ûëö0ýˆüûþÑ>&ðoì-û øWĶ5HtÏxö.ý—ô{GmR{M"æûDÖ,~C¨èº¼VW÷'MÖô«›=cF¼0êzEõާikwÒ¿ðM_ùG7ìÿfQû+ê‹ð%Aÿ#ÿ“ý¤¿ìŸ¿þž´ŠŸþ «ÿ(æý€¿ìÊ?eoýQ~«”¥*r”¤ý´•äÛv䎗wÓV+%-½ßÔû^Š(¬ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€<Ããwü‘‹¿öL<}ÿ¨¦­_ç­_èSñ»þHÇÅßû&>ÿÔSV¯óÖ¯KðTÿüŒêtùþ‡úPx¿þBÖŸö+øÿP¿×/]G‹ÿä-iÿb¿ÿõ ðýrõçÏã—ø¥ù²ã²ô_QE# (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ ø¿öùÖu ~Ïút_‡¿~*Éð¯ö¨ý‚~2jþø5àcâGÅxCà×í×û8üSñÒx3Àú rjž"ÕôïøC_ÕÖÊ&·°žæöîÊÆ ›¸>Тª2å”d•Üd¥nöw°=S]Ïįø|ÄúEÿü_ÿgö‰ÿç#Gü>âý"ÿþ /ÿˆ³ûDÿó‘¯ÛZ+OiKþ|GÿTÿä…güÏî_åëý-¿áð?éÿðQüEŸÚ'ÿœðø?ˆô‹ÿø(¿þ"ÏíÿÎF¿mh£ÚRÿŸÿÁ•?ù ³þg÷/òõþ–¿‰_ðø?ˆô‹ÿø(¿þ"ÏíÿÎFø|ÄúEÿü_ÿgö‰ÿç#_¶´Qí)ψÿàÊŸüYÿ3û—ùzÿK_įø|ÄúEÿü_ÿgö‰ÿç#Gü>âý"ÿþ /ÿˆ³ûDÿó‘¯ÛZ(ö”¿çÄðeOþH,ÿ™ýËü½¥¯ó§ûNÿÁH~%þÐ?¾)ü°ÿ‚nÁCü3}ñÂ÷%ž¹wû%þѺ•®Ÿv.m¯mä¹³‡àÕ¤ÒÛË5¢[ÌñMæA­p‘\´BÞ_×ø'׆¼Gà¿Ø'ö"ðwŒ|?­øOÅÞýÿf¿ x§ÂÞ%Ò¯ô/økÄzÁŸézç‡üA¡êZêz6·£jv·Zv«¥j6¶×úuý´ö—pCq ‘¯×”RE(¨F IËIJWm%ö›è%­Û»µº/ëP¢Š+!…Q@Q@Q@Q@Q@Q@Q@Q@Q@añ»þHÇÅßû&>ÿÔSV¯óÖ¯ô)øÝÿ$câïý“ê)«WùëW¥ø*‰~Fu:|ÿCú×ÿààOŒ:Æ«q{kû>ü5±²YXéÖw'ñEõÕ¶™¥XÛizdW·ÑÇa õúiövÂþö ?N·»¼óî-ôëeŽÎoøÆú ÿ ?ð{â¿þ?EÑõz/zqüÌŽgßúÓü¿«°ÿ‡øügÿ¢ðÃÿ¾+ÿãôÃü~3ÿÑøaÿƒßÿñú(£êôçÜó4»¿ëþóîÃþãñŸþˆ?Ãüø¯ÿÑÿñøÏÿDá‡þ|WÿÇ被ÑÿŸqüÌ9¥Ýÿ_ðߟvðÿŒÿôAþà÷Åü~øÆú ÿ ?ð{â¿þ?E}^üûãþaÍ.ïúÿ†üû°ÿ‡øügÿ¢ðÃÿ¾+ÿãôÃü~3ÿÑøaÿƒßÿñú(£êôçÜóiw×ü7ç݇ü?Çã?ý†ø=ñ_ÿ£þãñŸþˆ?Ãüø¯ÿÑEW£ÿ>ãøÿ˜sK»þ¿á¿>ì?áþ?ÿèƒü0ÿÁïŠÿøýðÿŒÿôAþà÷Åü~Š(ú½ù÷ÇüÚ]ßõÿ ù÷aÿñøÏÿDá‡þ|WÿÇèÿ‡øügÿ¢ðÃÿ¾+ÿãôQGÕèÿϸþ?æÒîÿ¯øoÏ»øÆú ÿ ?ð{â¿þ?Gü?Çã?ý†ø=ñ_ÿ¢Š>¯Gþ}Çñÿ0æ—wýÃ~}ØÃü~3ÿÑøaÿƒßÿñú?áþ?ÿèƒü0ÿÁïŠÿøýQõz?óî?ù‡4»¿ëþóîÃþãñŸþˆ?Ãüø¯ÿÑÿñøÏÿDá‡þ|WÿÇ被ÑÿŸqüÌ9¥Ýÿ_ðߟvðÿŒÿôAþà÷Åü~øÆú ÿ ?ð{â¿þ?E}^üûãþaÍ.ïúÿ†üû°ÿ‡øügÿ¢ðÃÿ¾+ÿãôÃü~3ÿÑøaÿƒßÿñú(£êôçÜóiw×ü7ç݇ü?Çã?ý†ø=ñ_ÿ£þãñŸþˆ?Ãüø¯ÿÑEW£ÿ>ãøÿ˜sK»þ¿á¿>ì?áþ?ÿèƒü0ÿÁïŠÿøýðÿŒÿôAþà÷Åü~Š(ú½ù÷ÇüÚ]ßõÿ ù÷aÿñøÏÿDá‡þ|WÿÇèÿ‡øügÿ¢ðÃÿ¾+ÿãôQGÕèÿϸþ?æÒîÿ¯øoÏ»øÆú ÿ ?ð{â¿þ?Gü?Çã?ý†ø=ñ_ÿ¢Š>¯Gþ}Çñÿ0æ—wýÃ~}ØÃü~3ÿÑøaÿƒßÿñú?áþ?ÿèƒü0ÿÁïŠÿøýQõz?óî?ù‡4»¿ëþóîÃþãñŸþˆ?Ãüø¯ÿÑÿñøÏÿDá‡þ|WÿÇ被ÑÿŸqüÌ9¥Ýÿ_ðߟvðÿŒÿôAþà÷Åü~øÆú ÿ ?ð{â¿þ?E}^üûãþaÍ.ïúÿ†üû°ÿ‡øügÿ¢ðÃÿ¾+ÿãôÃü~3ÿÑøaÿƒßÿñú(£êôçÜóiw×ü7ç݇ü?Çã?ý†ø=ñ_ÿ£þãñŸþˆ?Ãüø¯ÿÑEW£ÿ>ãøÿ˜sK»þ¿á¿>ì?áþ?ÿèƒü0ÿÁïŠÿøýðÿŒÿôAþà÷Åü~Š(ú½ù÷ÇüÚ]ßõÿ ù÷aÿñøÏÿDá‡þ|WÿÇèÿ‡øügÿ¢ðÃÿ¾+ÿãôQGÕèÿϸþ?æÒîÿ¯øoÏ»øÆú ÿ ?ð{â¿þ?Gü?Çã?ý†ø=ñ_ÿ¢Š>¯Gþ}Çñÿ0æ—wýÃ~}ØÃü~3ÿÑøaÿƒßÿñú?áþ?ÿèƒü0ÿÁïŠÿøýQõz?óî?ù‡4»¿ëþóîÌÿÁt>-x»Ã#ð¦¥ð3áÔw‰ô_Ã×óXøƒÄ±^Ãe­i÷mÔ¶rOö˜#ºŽ ™Ý涸‰%ÒA*¿ (¢®áM5¨§«·Q6ÞîçÿÙPythonCard-0.8.2/tools/standaloneBuilder/doc/pic18.jpg0000755000076500007650000007130510231140007022501 0ustar alexalex00000000000000ÿØÿàJFIFÿÛCÿÛCÿÀ‹”"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?û‡þ ÿ„ý¥¿àŸ?´ÏÃß‚?þþÎ^ ð†¿û8|.øŸ}¨|Nø_¨ø“ÄQx‹Ä·¾4ÑõH£Ôôoøb tù#ð¥•üqß[Oz/.59&Ô¤¦ùoüÃûyI÷¾þÆ :ÿ KÅ;‡)ƒ†ø–2§s ¬¥0ê’¢¶ýãø½7ˆ­¿à¬_µ-ׄ4Š:÷‹-¿àÝ?Íá}à‡ˆ/¼'ñ›XñtÙ4M#áŠ´Ï øÃRðÏÅORKkO‡þ Óü-âkíÅRiz§†õë‹hôé¿;¿nÙWÀ´ï€?if/†:ÇÅ/ø('Ãÿø'ü+Æ þYÜxׯ·'ƒ8øà{ï |>ñ'Â$ø{à£m¤ø›Ä¿ÑÜ…à/ì¾Âg\ÅU­—esÅç?Yç¯ü*ý™¿f_‰¾?ñÛÿ°|ðóöjø…ãOkgJÒ¯µÍPiðßõ-kSþÍÑ´ÍGW¿6V3}KÓï¯î|«K[‰¢×ð?ü ÿ*øÞ+ýš¿f àí{â/‡ƒ?f߈>'> ø{á‰-×Ä^<ñYÑüsx)þÙbÿ⯊ÛRý¦|e}©ÇñOökoiÞ,‹ölЀfðÔZ{|8Ó~i¼4~ˆ¼SâmJâ=ÿz«áž)Už€ðp¥W‘âr÷‰J©<Ú®jçkX×J—²Ã`)J5LEzµçZ0ŒéÓsŽ.GMS\ò¯<*ãiâ=Ÿ¼’ÂÇ¢é^‚”ùªÖ’”êFœ#Å·Í@ø”ÁÈ_·)ëð›ö9?æŠx<…=þ$9>˜Ç8;‚iÛÁÆß· ÀnøKû@,Wை‚ 2H™$üC!¾æ0RÌÁ ÍiÌÁ*?bßÙ·ö›ýš¾=ø“Çÿ³ñ»Âž1Öï¼!ñgö’øuûSÏûi¼ðkZñÞ¿áüsýš>'|ѾøÆgìZ×Å/|oñ®¹¢xwÀS|;‡á§Ã¯øŸÄzõª}áø'ìÓâo†‡ãW†>k!ø5kÿÿëß´­ÏÅÄßõ†ßðQ_ÏªÛø½çñõ‡Šgð¬<-s¢ëxà\ºÌ>ЦÑo“QøqšdÿbúL~Wá.ŽËëðr|"–­OªrP«WIÖ¢°õjã©*Ê¢XG—–N­ ðåN”­æPÄñV# C ݸW„ªE{VêFä£?iaäé¸ûÝÚÓ¦îù•¼­àâŸÛp»áG쀧ð__ :ñ r2O$)ÀÉ óˆíÁÿ~ÛR†Ýð§öBÆHø1¯¹G=þ Ç*æxþErÅI,é¬ÿÁ>¿f Oø)ìïû1\~ÍCÃ_°‰ü_ð’ÃÁ_·ñgÇ[øjÝGZý”äøŸáߎZÏÄKÏÙ“Ä_ð½>*«h_bøàx³V[aáß…:¯…µ•‡•~Êÿ±ÿÃ?ˆ0~×>&ý¤`_|#øÑðáÀMoàŸìwà/†_µÏŠüWñÃß~3xÂ?þ<é?³ÿ¿jφߴ_ÄÿøDRÇBðmæ³á?ÚÁ_ ¼¦êzþ½ámwÄövQ]`²ï þ§õ·ÁÐä–(ÌT𲪨ç8ùeøX{æ®§Ö)V„¥¢“–“Œ±j”§eû~*ö®’Íß2¯‹¡{ÕPçÁІ"«çxN^IA¥Bm¥^WT\ÒrŒ1ÿÁÂ_¶“ŒŸ…Ÿ²@h~ ø…ÿ ü >0Õÿg¯é¾ñÇü"z„ZOŠá×ï|[“âoøFµiáÓkŸõÍOÃÿ±Ö±=ý·Œ¹ðÛÃÞñfŸà­öPÿƒ„> ü;Ѽ)á‰_¿áÓ¬?lïh>·ñ&£áí#ÆZ·‡<%¥i:,ºÇÄŸˆz†ŸámGm7‹|Yks×>UJÓyN—`ñ9–+ Xü3„èF”'•c³jËŽ«~|55MÔ¤áW*•TãîÛzSÏäñUgžV†>|=TÕNv±Xjû 0²YsrM8UŠƒZ;~^Áÿæý°¤Îÿ†_²ªô$/ÁÝT”F_Ÿ3`X(ùØ¡£p\bàYè/üoö½'þI¯ì±Û§ÁíKŽ{çÆ™õ#ñáå¢à³fݧw”ýð9sä7ÏòeÎcá×ÈÆ›´ƒ‘ÇLvÆ9QÈÚ8ã.Ͱ~˜ü3à5+.ËmþßÝÿ§¾o¿ø´ºùoõ›>æVÍ16¿óAéeå.Ýúo¦Ÿ·ßð]Úæc‡øoû-™ÙðRùwy™CŸ[H?tÀ'›-¾ªÿÁp¿kCß?eå=ñð†ù‚ò{Ÿ© wÊ©ùNBþóÉüJ²0áx1Ž;>i[c$î—zœœ*«a<¯>Ï£Œm 6ªc*ò‹ƒþâp6ôؘÛÑ6bÛ9øiÀŠi.ËV¯E ½ãÿOwöàâlùNË4Ä¥héxÿòíÙm¾š~ÎCÿ¼ý¬d8o‡³ „7 /ÈÌ2Å à°,Ñ€¨ÁÊeš-˜¿àµŸµ\€–øsû3ǃÈo„w`†ççñD`àŽ™ïòØJ°~,گ̧aùOÞ<ýÙ8ÿV¸ÎÝÁ·Å°!ù¢Æè:{UÚ§÷e0AÃŒ0‘|˜sŒ` Š6þãËòíb^ð%×üc9v¶Ú5»ÅÏï7ÿSâlý5lÓ´]cßüK¢Û§OØ…ÿ‚ÒþÕ p~þÌ㎇áÞGN¸ñAûÙ!rùÊ3ÊØƒþ +ûQÈ2ÿfÅ9“%~\•~èËxˆrA9ÉVV,?ñŽ{ Œ¹#;G?ºo½Œ' ±€9gú?If˜QûµLyÃ>Q÷8ÏÙÓíäe6•eòÓg—mœü6àUnË–›òÖìºûU×Íþ‚©ÄùúQ¶iŠ[ìáÒÿô綾¥–‘±úò¿ðXßÚ|œ~Íý{|&—¸Œœøv#ŒsŒIåiAÿý¦åÆï‡ß³ªäàøTòå>p¹lëÀž SÀ“’Ú§äR~î0sÇo˜ò~AÏôÁóýrÍ0yL6°à™?yùÇÙ×#äÚNцE;‡“>?âð7+êÖ]{'ðÕì¿éêëëóØ™ñ>~©Å¬Ó›{Þ íþÕ.7[­Kÿuý¥ˆ¼û:©ÇÌ?áT± ~|€N¾»°GíÈ£qŽìðVÏÚJRCxöx@–‚­óøža°@b !®[j‰¤·ü¥vªŠ›T £î¦7ª|´Î1€~\OÉ·1jÙŒ8;UvºιðNáû‘ýß™wǶ0͈ü¯6Ë7áÇò¿øÆòûéök_úúß~›wZÄq³“þÔÄÝZÎðÓT´÷ný:ÚËõr?ø*÷íÊ xö~¨$…C Jç6²­×ûʇîU;¶[‡þ ­ûD¹;¼ ð9døV„ #r?¶ $íÈÆ>G È<ǃòîÄh6•Äj0üƒŒyIÇd{@?$xÄzVëógk¤è7þYvùMóü›”þïiŽèöy–¹Ä:àãËÿð½â¿çç¯ÙûÞ‹:|SÄ-;渧kÛXü¿åß’ï¶ÚY~¥GÿFý¡–ðOÀHñsð¶.»U†7jˆJœžx#hüÔ†Èÿ‚ ~Ðþd¿€Ã®Aø[oÇÞÇ]Tx瑌Hù¼¿Í+eÚ>àLd|ÕÊEÂ&<£mÈày{U6ÅåùVº0`Ÿ½Á^¼ƒµrxÁä`(åvþæ#áßó[ý\Ëí§J¾_ôõ¿ËçºPâž nßÚ¸«Šþëý=®¿M ÿ‚˜ü{þ ø gîü/·$|åW9¿‘÷·ØQ·aÄñÚß_ø)7Çsœø?àhÁä°´Ê›ƒÿ’08ã¡Îsæýší'äÙ€ßqrFçQ‚<…À“oÏòǰ)O—Éòl6c|ì)y8Xù'v0¿7Éž±ìT‘·CåyÖ=%ºá~è^}Ý„~â€<ˆ2>\—‚¡p›|˜r©áÿ-¸{¶Ú5zò¿ùúÿ7¥ú]¥>(âÕ³\RÒ?j=¢öåúL~í¾èOÛÃã…¾ +“ÿ×LÈÚ²Ÿïv”¹UÀbÏïxv!ý¸>.H2ÞøF£qþ-¾”å1Ã(Èù˜J°(‰†h­þ…~còôIÌ>eÂÌsŸ+ï.99] ó!ÙæÛôÖ«…`b2W ¿ñî0?Ñ×ä;1Œ¯—åªypy~E”Ôà J-pþ]«ûµùbþºuEN(âÆë5Å'ë.ð]—m¶{/´—öÙø²G>øIœs†ú9í'ÎO#ƒÀ9ÀäjÁûf|T”á¼3ð­rØ |9ѳóž<¾aÉÀOÊ£z1,\ý‹â”t G¨ù[òŸO”àcù~òïÙ¦ )ÆÙ3·Çþ‘ŒÉû¸ü›Xí\H·³çKÊ\ÁÊ)®ÀÞé=*öÿ¯¾]•õ¿T Š8ƒ’/ûW{Ú÷‡oúö»/»¦¨û~Ø?Î?âžøX=âÜ蜗¦bžN1Œà·­ÿk‰“0 áÿ…Ø,¡±ðïDóÚ•f° ÙŠ šKo‘”p8èä`Žò/í‚1Œ&µ’åÐìCµ“ªá£Áœõò>y8Îwñ/”ò|ë(ÿP¸>ßò Àè—Ù«Õ-ýõøÛæDx§ˆ\[y®+§Xyuözlº¯Í/®Sö©øŠÊ¥´†ŠHøWzÇÍh‡¹ÎàŒù•Nñ¸jˆr6ƒðÜ.p]~x{ û¹m$íÜ7´¿á¢íW¢_ôó~ú«ëx«±ÇЏ‡®kŠÑÛxmh¿ä_’õíõ4_´—¤ûÚõƒÿÿù8m8[®Ò»@p¯ç%½¡ûEøèõÑþŽ?èŸøhÿ’ ûtõÇÍ·ç+TÇü²Û‚y#•È·Ÿ+mÎ0¾^ÄM±ù~Už’ñØ.ÕGþ;øË·äÎ< Â-ÿȇoJ½¢ÿçãÿÒ»ëmSq²y®+§Ú…÷÷þ¶>’ƒãß$,Hð‘¿…ð†² 9 I})Ì2;Z'ó’Òòürñë¤øæAð¶Gèt±žþ0pwðK1´‘µWiÚ©´®]FâÞD8ßåò¹M.Õòü» dìF3ÉŽqzã#¦åÆÔËýFá+¿øBÁo{µ?»ÿO›õ}}ï´”x§ˆ\íý«Šµ–—‡ÿ+ÓeÛoš÷‹ŒÞ,•ˆm#ÁJAÃ/ü ^ e‘>rÚ.€\0@e%Š§Ú ŸE¢|FñŽ¿¬èÚ‡€¢½Öõ]?H¶{Ÿx]m¢ºÔ®¡³î$A’U·I¦S+Çʱ£²ÀÒf%ð+%Ã叨ÊvÇ•þã.ßg]ïòm~›J#îO'~é¿ F>!ü=Uqão ª8_øéãùiò»@Âãn6.<¸¹1œ´0Øš´ò< ,=j¼jIsS¢ç§=W2Õ=Ö—¶¦”¸›?©‰¡JY¶-F®"9ZpO–ua r¾]+Ѥí£Òǵÿhx—þ†ß‚øo/ÿùØW“|cøæ¿¼;áÿx›^øc«üDøwðÃÃúG†þ‹WQñ?įé~Ѷ±àMHµÓô×Ô¥×5»»ýZÔÅ¢éZ‚éêºÛéz.¥øíÿ2øOñãâgÇÿÿð‡¾ÁA4ø± ý¶o4ÛŸþÍ_ ÿf©®nãñ/ÂÚ7Å~ øWñ?Á?´Oü'¾6{ Ï„?³–‘á?øû១_Ú¯>xKHÕfø™æŸü#àß~ij'†´/€¿?gψ:üàZþѾý¢“UñÆ?þÒ­ñcG?¾/xÃã•æ•§èŸµ7ü,­lCâþѾ¸¾ðŽ|-.‰¥xbÏÁ6žo†>þxËsˆb±Ø rl‡Ùâqxz5#ÔÔ*UŒ$Óú˵ãðË•êÝÒ\®_±c2ÉPÂb«SÍ3u:8zµ Þ15Í nQºö*êñWWôþïçOü§_Õ|Eûoj·z¥ÂÈ`øYðÒÞÊÖÞ,´í6Ò]&çQ’ËKÓm#†ÇM³}BþûP’ÞÎc›P¾¾¿™d½½ºžb±¿à±ßòzzÇý“†úŽ­ÇŒ§ X¼U:qP§O^ŠÚ1YF1^I$K9TÁá*M¹Nxjœžò”©FRoͶÛ?MÿಟðIÚ3öïý©þ|aøEã?‚žð׆ÿfÏ„ ïlþ#ø“ÇZ>ºúæ/ŠüOuygiá†Þ0±“K{iQÛ\I«ÙÞ›ËmB3gn±ÙßIùMü—ûmÇŒüOý•xÁÈñ¿Å‚ÊqTøQIòþì€Т8Â*GåEký¹x¿þBÖŸö+øÿP¿×/_g”xÓÇWƒÉrúùlp9u/«acW/§V¤i©ÎKž£šs•æýæ¯Ðò1|#“ãñqxˆbjòç¨áˆ”#v’Ò)Y-6×v+ÿéþÛÉPý–GÀñ·Åœ1ŸýÆôÁÆ5í¿àÞ?ÛJó|Ký–ÔäüiñTYѲOü(èÉ,d Ь£hÙä%§öOEz/Çÿ$’xœ§Oú•Òÿäÿ-ºXÃýGÈl—³ÄÙmþÑ/-~/ëCøå_ø7¯öÏóS?eþƒþgOŠ™ => ¯/¶01€š6ßðo¿í•]ß¿fC´®øÏ≠D›‹ üVbTɆ {_ì&Š—ã÷ˆmYâr«Ø®—àùî¾B\ %og‰Ý?÷™tÿ·à³ù þ ûbª¨ÿ…‘û3®_|P!x^ÿ—BGG ò€¿ ŽÜð@¿Û ,nøû4WxÇâyÙ€A+Ÿƒ‰ŒmxðÊRO*X?®ª*â=ø…f¾³•YÿÔ²•þþ{ôý6Ð?Ôl‡þ}âºÿÌL´Ûm<—ësù-‹þ7û^"¨?fþáWÅÿö®‚ÐÆ~âó÷B¨a²ŸðB/ÚézüEýœ>é.ø—€Jíÿ‹;Ž̓‘ò; ÖM—^ «Û•j­ÿ"º_¤Áp6B¶§ŠôúÌ’éÚ+±ü§Cÿ2ý¬¢Àÿ…û:ñŸ›þï‰ Ë•Œ¤|‹!ŠFT*Ç@‹å¥½Åÿ‚~Ö ÿ5öwúÿÂ[ñ#Œ€1ÿ$Œq‘ø`/õKEOüG?è'+Óþ¥”¿ù0\ EÝSÅ_Où‰“ÛÖ/úÛ¡ü¶ÁÿGýªâþÏ@1·ÅX®$VÜKü"Ë9$,îE” ±é/üKö§gÇß³ÿé⯈œcoýR€ãÐ}ÕÆÁõEKñÛÛ¿Ör»ÿز–»oïù-wú‹^þÏ{ß\TßæŸùŸÌm·üsö¤„‚Þ<øÆÌlñGÄ…VbAÏ€X‚Á•‰ãb€Ä2Á­ü¯öUQÿ ÇÀDÆ>Tñ?Ä‹‚üZÄ uGÊ0÷~Oô¹E'ã§7wˆÊïÿbÊVéÓžÝ@| 7wO}6ÄÉm䣹üÖÁÿqý¦£efñÇÀƒƒÔx£Çä¨Ú­RyWŒ®Ð¡(ÑlAÿý¥"ÿ„×àhåH?ð“xñˆÂàWátDxQ‘…PË$ƒú:¢“ñËŸüÄå?æ[K¥¿¿ä¿A>ÈôñZ[þbeÓþÝ?œõÿ‚D~ÒjGüVß±ïâOg`=~ã ùpiU*Tìòµ­ÿà’ÿ´d@ñÁÇ™Ä~$ñÁQ¿fÿ‹d‡øyÁUP/–°ÿCTT¿xñ«lçþI¸ÉÇÓ0F#ò´-ÿà•´AAñÁ¯•²1â?>x'þªùPº§tqF Ÿ¿tRÿˆßÇ–·Ö2ßü6Ò¿þ•ä'À|>Ò‹§Š²w·Öd¾ûGúécð]?à—ÕTÂ[ðqp|AãBð§þÚ@ ÀÈ vì»üãä,¬|Yðxá•þßñ‹#¨?’OC Ú>]Ž!{ݺ*â6ñÝ­õŒ¶Ï§öu/þOËÓîVðúM{U_”%Èàšÿ£ Ÿ|' kÞ.ù2,¼‚À•eÁŒ‚Ÿ+#ÞÛš)ÄkãŸúËðÝJÝ:sùJÖ˜ðFö§Š×þ¢eÿÈÿÀ?!ÿ‚sümˆø©¾;kž+m¹HUÇ€ãùISŽЈ"ã‚ÚÿÁ;¾5.?â§ø[Á?óñY#Üàu$ž‡‘ÂŒòù³TÿÄjã”ÓúÆ]uÿRê_¬´óµ†¸‡“º§‹ÿ©>©õ–ÛvIŸ–ÿðOÏŒ‘Ÿü1^^³ârFJ9ð2 >Ü>ЛB¨_A®ŠþÀÿÿ‘á¨ç‚5åy'?ò& ž}º `„1þ¹QSÿŸïÍõŒºýÿ³©ùuro§WoÂÇú…Ãßóïÿ…2òÓáòõ¾·¾§äÝ·ì#ñr øƒá¹Û³5ç+"±Î| £€[† ì"k«ì?ñ]UGö÷õ€5o•O”Œ.|¹ áx;J~§ÑKþ#7^þß.½ÿè_OËOþ»íað·g‹¾Ÿó--k}Ÿ#òòØŸâ¤lµß‡¹ #VñÉÈ%‚ÿÂ&¹ndÆß‘£s–ºÐþÆ¿£:߀G >]S^ãD„ ž„c(zŽŠ¸ »b‹ô¶Š™xÉÆ²Þ¾\öÿ™}>–þÿ—뽚pûµéâô·üÅJÚZÚrÙmÒÇæê~Ç¿Ѳu¯†þ&zñ#!À`O…y#pç!¸%7òÞ-ˆd߈±à_Ás¸jZÑa‘TÅ,¿/îÈÀ* G#ÊŠ×ô*ŠOÆ.5’I×Ë´Ûþé­­Ú^[m墰ø ‡¤¬éâíÿa2]»Gþ¾–øeOˆ@øœx,qŒ G[ÀàŒ øo·8cŒ§oû0xò»µOa_r…ÔusÞ«ä“á¥v~U;ãF 6Û/»(¤ü`ãF’uòû'{}BŸÿ'×Ëü¬¨\=k{,U—O¬Ëôõ÷[âUý›|r1ÿO ð?çûVãîp1 >R{t`%ÛÙÛÆ±:Ô|&ÁYH"÷TÜK’A>ŸçÃåA%¿Ù´TÿÄ_ã?ùý—moùÓü=í?^¢\éYRÅtÿ˜©_O>_ëm­o’bø âôT_í .Õ…¼ÔHÈÐã;HùUmTVáøâÈÝYµd0!–óQʤèÀ– U”«ÆË·ñ¹I"ú®Š_ñxËþåúèÿØ)ë·÷¼¶V]º p-©b·¿ûÔôÙi§’>i‡à׉¢Ænôç"îø‘‘ Ä™RTð6…Ù@¨"Kk‹ðÄ€ôÝqÐ\ß?ò˜? Œ.ߢ¨©^-ñŠwU²ÿü!‡—W;ôïç¾ ¸‡–Ôñ[[ýê]ÿ—ËÓÈð»o†ZôGæ¹Ñ”|ø =Ï™rº\Dî 7±TÆ»Fà Z__‡zÒÿËΖ=üû¢Gþ¡ëžG¶``'²ÑSÿgŒ/m€Ý?÷}-ÚK²wÞýEþ ðòwT±IÿØT¿X³ÊíüªBFé´òUÌvâPû‰þÎBìTàçoÍeJ°·kKáoà “Añ ð®¹tohñéwš§‡5XãOÖô«_xw]ðíÝö‘x°ßXÛkú±¢Mqk z¦¨iï-ƒzEñS‹*ÆP©W/”'BqxvœeY)%-¥¬õ¾úp©Fq†23Œã8Ê8©'FJQkݶ’I«§©ð/ü1—Äú=ÏÛ ÿ7ïþrµJØ[XÖ5__øÓö£ý¥>"iÞ ñ׃>"i¾ñÇŒþ꾺ñ'¯J¤*ÓÊrT¥8Ô§8å©J3ƒŒ£$ý®8¦¼î{3ÈáR§<Ë7”'BqxçiFK–Q»Ù­ünÁeakÛk^·r¥àømðÒ*IRÑh©!IRTJ‚F2⊳ÿ¡ÿ“æñGý“ÿ‡úej+'Zx†ëÔ·´®Ýj–V\õ}ùYt\Òv]‡¡NœhÓ…_’”#Nw|´â£¾®É]õ?´/ÿÈZÓþÅÿêáúåë¨ñü…­?ìWð?þ¡~®^¼ ürÿ¿6uGeè¿ «ø~ø{Å–n¹ámOû>âÇKñ.Ÿi§ß_èú”кǨéú~µa©h÷×k‘sömSO½±¹ùRBUÁ|kQ:m‘’1ºêâh¬ìîî® Tù„S(òÐI66?•åd3­6ŸðXŸÛËþ 5û#ÁAÿa/€²wˆ-´/„¿<)àë^_‡~ñ-¯Æ‰ÏÇ SÀÞ=ðW‹µ½oFÕu­7Âzg„nü`!ðe÷„õ}2ÝjãZ}j? _hç/ÓüWãŸ|;ú)ýøû)ೌŸˆeŒÊë9IágB¤þ,F ¼U\!»ûÒ*Uä”b±”qTâ—²iQE~ÀpŸšö¿ðP{þ*üsÑ9Ð4O†þ ø?áÏÄωx;ž.ø™­ßÛüøÏâ-cÃ_ôoxÂøiâ߈>1Ò´i3ø„|ññïö-øûZÜëž ý¤~7ø&÷àDð½?á^øKà‡Á-wáwÅ¿ÿÂèøñ¯öa_øL¾,øóãÇxÛþ¯ƒ´Ä±>|=þÚøŸiàßìŸ hÚßÃoñW¿°÷íâoŒw_´ÏÿiŸ‚z‡íáŸøQÿð§¯ü+û)øëÃ?<3ÿ Âß¶§€5?øY 5ÚóÆ>6ø•ÿ _‚nŠpØÂ/ñ›áü#>)ðÏ€5ûøI´?Ä^ñ6¶¦í­´Õ.m]Õµq}.Þ–ZY;;­{uòÛOŸ~ÿ$}Cÿ “û?¦»ýƒyâ/hÿ`ðOü'þ5ñ7ˆ> |oðç߃z|9ÿ…»waûE|U×¾éß ÿfŸi åÓ ý ¼#ûPèú·Å ^ þÐúgíLŸð«ô-2Â×à÷߇~6Ö^x§ã®™áÿ€øÑ/Ž~.h9Óþ|H´ÿ„~M{Å>)ñü"ðšé:%‡†|}à;;ÿ—¾%ÿÁ-5_ˆv~?ðì?´ü"ú'‹¿eï~Îú‡toxÊßöøñªëÿ²­ÿì¹£øÿöÿø§cñ×Mø}ûoÂi¯k¿¼§xŸàoïx7ÇVþøá~"é¿ý¯ö»ý‹~#|ÿ…ùÿ Ÿã‚~ÃSþËÖß²_Ç/øXŸµß9øs¡Âóÿ„OZøQÿ×ÇŸðƒxÚËþCâ§ü$:—‹ÿáièZ÷‘ðÿû7Ã~ÿ„kÄ𜖥d¹ž¶m»é¶Ÿ örµºÚ÷ÒÆºþ{yÛ¿õ¿¨ü&ý§ì5/€¾=øÝñžïDð®™à¿Úöªø>¿ðhÞ#ÔfÕl>þØŸ?f¯…:/‡ü+a'м]ãOŠ?-üàÍJðoƒ¬uoüGø«âX<7ðïÂ-©ø‹ÃÞSUýºg ÃÃZˆµ¯Š>·ñ‰?ŠõHüOû7þÒ~¿øQàx7j:O‰u¸5?ƒZ'íÍ«üPøIûIü)ø-âÏ~ÌVgø­à? |v¿ø âüCÖü!qð·â׉4OvŸþ Cá?‡¿ücá_‡¾3Ó<â­¼¿ÆŸðM¿øL< ñ#Á_ð¹ÿ³¿á`üÿ‚´|þÓÿ…uö¿ìøz7íáÏÿð‘}þ«_·ÿÂŒÿ„þ/ìµÙÂÍû_ö÷öŸÃï³ÿcMâmÿèøññßàçÆ„_¾+x'áÏÃíOãgüÆß<+á_„W:ŸÄo j¿¶ŠmÏ…¾ ø…ñ/âPøÿâ|NðMÏÁÚËÅŸ,>xsá§Áiúî§à ľ=Ó.üã-'Æ4•ùžöi¾šÙé»Ù_k_W{]^]¿¯vý|ßÜ}Cðïþ ð ëüq×?áñ6•ñ³ö²ð†°þøcñoÆ^ øeð“àí}ñóöxðÅOÞ,ð–ãÏ þϾ ×ü3ðkPÕuŸ‹üKðãᆯªø7âïˆ4=KJðÏÃïYø?è‹?¼Gáþü<²Ñ/¼sñs[ñOŒ<Ôüs­üd‡Æš¿íû|?ý¡|Gà¿üNý®?iïÚ§F‹öf¸øƒãI|#ðâ†î?jßxSÄ~8øàÚáÿÄKÿ|$ñ6­ðWLÓ<1â/xËï/Œ¼eÿ ãöný |£ÿÂQ¨|>ÿ…‘ðCâW†ŸPÒ­.áCþÐ÷?u_xËÂ0j×ÞÓî|mðóâçÁ?€þ*ÕN§â˜­¿áCÚ|z±ð¿ƒ~ ü\Ô¾ø~¥ªw÷]ïÏtôIÙòÚéi~íù[yéú_õý.ýšl¯üuñÂ;_|%Ñ<áÚ{öy׿jßÙ“\Ð~&ßø÷Äz×Áo_üP‹ã¿…µ†ôÏ„dÓ?hï„Wv~øãÞšü|HÓ§ø“moá jŸÏþÙ^#ð·Å_i? tM[à‡Â_Úàì¥ñcâßÄÛý+⭇ƟÚR€ ðî_‡Ÿáøg«xGÆß ´ûÚ£àŒ^4ñ‰>;|7ñf‘ø©>‡ðÛÅàŸÛüOâ~~Ã~xsBÐô/ÚSDÓ5?€_²ÄØÛö*ñŽƒð.6øÃ£ø'àÿü(oxóÁ_üY¥|Lÿ„×öOøW•â?ø·À¼Qàï„ßð“ø'áßöž§ð÷âνâ/xþ·Æÿ†Ÿ~jö—?ð­n ø/ñÃösñoÀ¯ˆº¯ì½âŸ¶x'^øià]Á_²¶»àÙÏßn< iàÿ xÅ¿³®»ûC|Iÿ„×Á:>ËëM{º?Äïè^#ð-ŧ´û }Žo_©r[GÖÜ÷¶—k™ZÞO_Áß·—õM Iÿn?€¶¾Ò¼EueûC[\kºßˆ4]ÀSþÆŸ¶$?u˜|'aá«ïø»Jø'À…øß¨ü.ðÓøÓÁÚ7ˆ>0Z|>›áVâÏxkÁzŒ­¼]®éz%Ößü5Èzïü*ï¾>ÿ„·â‹|ý±àŸ‰~ø5ñoã¿ìåá]WÄ¿ádx ûâ_Å߆šgÁ3ûOÁÚŸ„þ"X|:ñÇŸ†ž2ñ×|cà ï j}§Å?‡ºî³ðn­ÿ–°Ö|9à x³öyø­ãŸkÛÃÞ ý£?eþб—Ã/ü`°ø¦Þøöpý—|}ûKOâï€z'‚mÿgO‡ÏðËDÑ¿h¿|?øtž4øõ ø/áîƒàoøÁÿ>¡ø_û4ü@ý”5êÿü[¢x×àÞ«¢xož8ø/ÁOé¿|}ñáWìÉðãösð†ðWâ…>+þÎ_³WÁÝÄøðŽX|«ü ƒÀúw‹Çi~0øqàxgLøVÚ§m$ÛÖÉè¯}>ÏU®¶Wѵ¸+õòý/××þ_¡ÿg_Œ?ð¾~x?â]߇á ñ5ÿü$ø‘àíøHÿáZ|cømâsá§ÆÏ…Ÿð•G¦húŒ¿áWü\ð|ÿ ¾ƒ`žñ¯ü#Ÿð•xJâÿÃ:Æ“sòïˆ?m/ˆÞøÇñkD¾ø!à™g߃µìóû%øŸâu§ÆÝuþ1ßüFý¥¼-û0ÝøZÐ~Mð:Ýx'Iñ·ícðëÃþ-ÔµÚ+K×l<-¢ø×Æ?†õí[Nм â?Qý™>|Uø;á?…–ž+ø‘¢ †Ñ?h_~м) ÃªøÅ_´ßí=ñ§Eý¡|]â߇8×lôø{áwÂëÿ<ð¿Áú¶s«ø‹áÿÄ Ý|CÖ5/x ÛTÕ¼»[ÿ‚y|9½øÙñö¦Ñ%ðN‰ûVx¯ãfñ«à¯ÇÙ¾èZ·Œ¾ÿ`~Ëß ¿fi¾xžú]b×[ø³ðOÆz'ƒüyu㯷ˆ|æi_5Ùþê¿ þ0xSÀÿt$¹¥}c¯/Å£æVÕ5öo¯½dïfô l»é}¾}éê{dß¶ìÕgã/ø3Xø“ÿ×ü"?ðC«üAñ‡ƒ¼}à߀÷¯ÂÍ+]Öþ)xcÃ´Š¼-£þϾ2ñ·Ã 'Â>>¿ø“à_üL×|eào†źÿ “âPð¶ßÃOÚ“áÅè^ðã|Qðÿ‹¼O¢|Hñ/‡ü-ñköøýðÄz¿‡>_ü"Òüâ -ã‡Ã/‡šœÚ&‹©üuøa§[j¢ÔXk÷úî¥iá¹õ{xÒ?|Q¥ÿÁ.<á~!hÚGì‡¨Ûøë[ý¦¼w¦jÿ?a‡ÿ>9kþ8ý©!ø?¼/ûA|vÕ¼o©ü]ýžlu?Œ~4Óm~ü>ðŸÀˆ¿Ã=áÏÂo|uÕ<#¥|F‹â¾ßÿØâßÁ¿øC|sð¯ö‹ðN—ñŸÂŸðº<7§ÙøËàÇÄÿ~ʾøIñ³þõõ„³ïìñ}ûVi¿~ø'Âw²ßÂ}Sá߃ôßÚSÄß <y¯ühÓ&¿ŸÀãölÿ‚d|fðŽ¥ñKÂ:¼U©ø3Dñ~§û|x†ÿWøµãåøIðÿág‡<á_xîÚ {Ä:Øö¿ƒ_ðQ_ÙÃâÜ?´è-ø7uáÏ|‡ödÿ‚~ÏŸ4-BѾ/躟…¾(ø³Sÿ‚|xÇø‘{âoxOá͇¡øYûdþÏÿþ#[ü,øwâ/j¾&Õ|â‰~Ôõ‚ŸüðçâWßë¾ðî½ãÿƒß|kðçÃßþ3ø&=CâWÃû3Å_ *|;ÕSö^øoðûàü-[âÔ_ÿk_øCÿk/‡_~ÜêZ¥ñ³Æß²ÏÁ+Â?ü]­ÛøÆ^ø‘â_Ú IеÿÙïâÃßÉ¦Ýø®Ëáòø§ìyû:~Ò¿¿h߇ZotŸìŸÙ‹ö-ý—¾-þÇ¿³Æ«âßx¾ ø7Äž:ý™ ø{â«¿|9ýªÿhkO‰žOÃïÙrÒçÆ¾*ñoÂ_ØÏU‹]ñ6ƒ{ ü¼‹Äþ%ð×Áßkø÷ûüFý­nuÏþÒ?ü{ð"ø^Ÿð¯|%ðCà–»ð»â߇ÿát|ø×û0¯ü&_|yñÇ㇃¼mÿ×ÁÚâ ?ØŸ>ÿm|O´ðoŒ‡öO…4moá·ŠU©¦Õîœw»m;½¬’nÖÑÙ&÷v mª×OÒýüÿ­CÇðR_‚~¹øHºW…þ6kßðŸ|l¶øGãß~Î?µ…~‹Æß´'çñü!Þ>Ô6øËöVоÓ?áà¿þ|»øEs¦|cñ_ÇÛ3öý²ü©ø7^ý¢µú/Âëo§ÅÛÆúŸ„…ÇÀ ÜèžÓ<áxËS»Ò|Eñ_|´›II¥Õ»ë¿÷lµ²¾Š×½·g½åÓåµÿ^ýÔ?ƒß´'ÃŽŸð‘Aà[Ÿiúß„¿²&ñƒ>)ü$ø·ð#â6•¥x‹ûM<5â{†¼ðëâ x'Åz‰ô¯ øê Kàßë¾ñ¿‡ô-wPÖüâË çþ gûjÿ×âµÿÅoáÿÃkáïŠô|iø3ñ×à/‡%x'áOÂË»¿…Ÿ u߃t¯‡?5ß‹Þ-ðU½¿‚¼[ñ{ãlj®|msâo$ñGŠ$ø‘…ªèQø#IÒ|áíCÃÚö½ã/Ï/Ùãþ Ññã[ýŸÿbkÚwâ·‚tˆ?²ÿÁ?Ù#Á>ð/ÿ„W:?ü zW¿Ž±OíñOáïÅÜ|ø«¢|añµö·û|9øgáï‰ÿá_ƒtíˆ3oxöÓ^ð¾‡áIJÝäìœmg­š|ßg[5kÙYkg¢ tôütÿƒ¥þ}OÐØlŸÙþOxcÀ²ø‹ÆÚv·âøAmû[ø)ñ¿@ðo‚|Sñ;Jе‡¿ ~1üEÖþéÿ¾|lñ§‹|ð+ãW‰üñPÕ~"ü2Сð3kü§ø‹Ëµ/ø)ŸìU¡Mrþ(ø³­ø/Ñè–^+Ó¾%xóàÏÇ_üñgõŠ¿ ~ ÙüGø{ñÓÆ? ôOƒ¾KãïŽß oŠüuâ_‡ðøOÇš'Ä™üIÃfºñm±ã_Ø×Ä~)ø«ãM^ÇâÖ‰¤üøµûC|ý«~,|<»øeªüU¿øÓû5Ãð~Åðóã$?4Ÿø'áv¡qû+ü—Æžñ'ÀŸ‰,Õá? Ðþ$ø]ümá†ü:ý„ÿi_üRø;ðãÆ·Ÿð€þÌ_°—‚| ðöxñG‹~øMøñ/Á¿?lØ?ãÇÃÛ‹½OáÏí}ñÂÓâ7ü%?¿`ûO ø×â‹~þǯ†µßˆ:Šô€~&‹Uñ/€>8Æ“ÕÉ­jö{kowW},¯¦·{¿Oëo?^Û}ÿ«Ú‡íIð‹FñÃ? ø…¾(øVãâÞ‰àÍkÂÿŒ?gÿÞøk7ÄK÷Ѽá|Pñ7Ã-+á·Â_Š>(ñ°ð†ðâ·ŠüñVëÇ ð—×Á£ÅÞ2𦋬ùwÃOø(wì›ñoþðo޼l¶Ÿ¿á›Áú¯Œ>~П 4++â/Ø øGâ}oÄ~xKDðw‚~;ëz€ðgìëã¯_è ý¢~#iÞ øgðC]ñ÷Ä ø“ÃZWŠ|ÿ‚qÿÂìý£tŽ¿ð—üìÿŸ³WÆ¯í¿Š¿³Gü-ÏÚ7áçü3·Ž¾øÃþ7ìÕûEÂãðGü(o‚~?ÿ…Sö½{Àð¬|{öo|\øÿãŸí]Cþü#þ<ÿÛÿ„?À¿ üÿ ŸûGþ÷Á?ø$¿Áïí?øW_dþ×ÿ‡\þѾ#øÿÿ Øÿá:ºûü/?øH?áþÈû]ïü+/²oiüAûGö4%©Y{Ò»¶¯¿ÙÖÞºÙ÷ÐÖþ_ðÞ~¿Öû_´_í½­üý¡üðÝcÑ4?| ýïÿjïjþ%ø7ûCxëÞ5°Õ4OÚ‚}3@ñÇoƒ^ñ‡„d]À³EÆ¿ªø›âÃÞ#øçaã)ü ðoáÌ>9ða‹Å›ÿà  !ðα?Çsþßi_?k/kà†?üeà߆_ >þ×ß?güTøýâÏ h<ðÏìûàÃ?µ WYø±ñ¿Ä¿>jú¯ƒ~.øƒCÔ´¯ ü>ñ…Ÿƒûo±çü.Ïøm?ø¸ŸðŒÿÃ_þÅý?äQþÙÿ…yÿÏü5Ÿü\OùôŸøK~Ûÿ Eÿ"üS?fÿ„þF{øI¿âŸùÅßðH?ø«ÅúÏ‹õ=[öyñæ§ãoã$>4ÕÿhØÛáÿí â?øâwíqûO~Õ:4_³5ÇÄKáƒÿ|7qûVøÛž#ñÇÄoþÐþ"_øá'‰µo‚ºf™áx+ÆBöM$ÛOK´¿»¯Oæo»Ñ[KXÖú[~—ØûËÀ¶Oìÿñ7â5ÿÂÏ ø‹ÆËâkO|Køia©ø«à§Æÿ‡ß|añàö»â¯üKðÃOŒ>?øsᄼmá=CÀ^?¸¿ð¯ÃOø¯]›Bø}ãÿXX]øgÀþ*ÕôŽ&ûþ û0éšVŸ}©j4ýoVñ¶à +á÷ì•û[Z|xÔõßx7â/ü?§þÎóüã½ï‚uß |øµ¨hÿí¾KðçS¹ø]ñG²ñTúß‚|K§iœOˆ`øHþøá×ü/x;þÚ‡öÝý£¿á:øi§ÿÂñÃþ/Bý¸´/ìxŸûsVÿ„ Æßÿ᳿¶<+ñ3ì>"û~»ðÂÃPÿ„;Gÿ„—ÉðçŠ|ÿ‚[›ý <3ñëþ_Ù{Á_ðxÛᇋáY~ɱŸü2×Ãkþ·ÁÛÃàçÚõ­þâ×Û/°ñ.³à¿| ø_áßêh_…Þ9ðç¾!ø¿ÀŸ>øSâ¯øá‡ÅoxWÆZ¿„~üAÖ¼7Ûk_´ÃõøEáŒþÖôM_Â>0ø£ðám¥Ï‰GŽ<%6â?‰ÿ¼û>j>ñ…kðûÄþ9ð—Å xçÄ÷žÕ~øßÁž¿ð×Å]‡uƒ¶ö1ñw‚ÿ<µoø$O‡5üðî¹ãß…ßµ?€Ÿ³ÏìEð[ÁÚ'Ç_ÙÆÃâ×Àßøö>øû]ü,ºñ¿Åoƒ7tèž9ðíâgÂþÒþ øNÿá‡ÄÏxÆ’xçǺež£áÿ¯-?cm+Oý˜~þÎ>»àŸÚxãgÀ¯ó\|4ø/àß…ÿbÕ~~ÖÞý¬õßøà÷n´MÀ~ ×õ¿ jð¨¾×_üø‰â/‡:W‚~8x'Ç^6ñ‡m4ωµïü9·Ð¼Gáßê~*°ðN½¤x†óêüòýžÿb߈ßt/[øWã‚|¨xÃÆßïì<ðà–»ðËöUøwðçáOÄhücñ/¿ ?eïüqøãោ¾6ý¥<3®xÿÁ<ðÓÅЯ¯5|S°øiÅÏ x«ÆŸCjd¢ŸºÛWÝïk.–]oþKvÖÊûõ?Ž_ø-üŸ7Š?ìŸü;ÿÓ+QGü‡þO›ÅöOþÿ镨¯jð©׸é(Â[¿WùŸÚ‹ÿä-iÿb¿ÿõ ðýrõÔx¿þBÖŸö+øÿP¿×®¾¥‰¬É¢Â÷ÄzV¢úM¼mh’O©-¤Ía =ûÇb¯-Љ¯dŽÑY¸u„;œÌ12Ááq¸¸á±8Ùahbq1Áà¡N¦3*çUa°«V…)âk¸ªT!Vµr«8)Õ§æºhÁT*np¤§(AÔ¨ä©ÓRj.u#9(BüÓq„¤¢£'dùK{¨õŸÉ©6æÒ¼eŠ1´í¹ÖÝ‘Yhâ`Ræ5…Ã<¨©§½Ì$ÇÅ?µwìÙ¯|rý¨?à´ûFËàÆÏ¿ÅAV×ퟵ_ÂÌðíÄ·2(½kk_ŽŸ>[ƺs­ÜWzä!â›I›WùÑûqþÍߣ¼ðŠþ)ü?ðωýœü-ý—mðÛIø›£húÞ‘ãM'ƇŽt‰¿ üM¥ë:ŽŸe¯êº´Ú—ã­;WÓtéu ø;EÓ´ÏéwóÛk>ÿ›.á¯|SúUqWŠÜvøÛÁ*ÜY‘x¿ÿ^ó_ ¼Aã<eü[á—ð&†°9O á¨fòqá¬â<9ÃøéÕ—öuj mjXìE8àq?ÖxÜ» Ë8[–eU2¬ûêµò… -<ó+ÁJ´0øÚºØÚ•ª×Tdê⽦.½¥HËÙóA)N?ÑÿÇÿ„žý§¿gÿŠ?üg$Ñi~+𾫧È>mGGŽìÅu¦ø¯HU‰‚kñ]¦ƒã-)غÅu§cË–0ÑךþÅŸ|Uñ›à¢üO‰,þ:ü#ñ&»ð7öƒÓ¢‰b†/Œ? Í¥Ž»®Ù}ŸFÐô“£üDÑnü;ñSñh6’èÖ>ñÖ“¦ÚÝÜIe9_ ‡þ Iû'ÛêÇS‹ãwÂßšiËB~#ø$DÖ×^rOjPkED ­À»B;€¨ á?²¯ÆüMÿ‚š|gÔgÏÚøÏá§Šÿdok?´>¯àË[?xÏã—ƒþ$[xwà¢ê^:±Óï, ñÖ§ð‡Zñ՜ڎ¿dš®áXï/´ÝgPðü×Zõ§ìœ«ãgž"x1ƾqÞOÀÜGÖñ&ͳŽÎpyG ñŸ Ã/Ëqþ߉ÂSÂeØ.5áœM£Z|ÕñüEÂþåÔ¥J•Zìøorlš®Ÿà3l¦X¼-xàkahãpõ«b°˜õZ³£NžU*׫Ì)}b„ÚTéÐÌóZ“p§N2ìåQ_íøQ_/xöÉýŸþ&üF¿øYá_xÙ|Mião‰ ,5?|øßðûáÏŒ>#|×|Uá߉~øiñ‡Çÿ|1ðâ·¼'¨x Ç÷þøiãë³h_¼â‹ ¿ øÅZ¾‘êOůk?|ð&ÖË[Åß>| øµ®j3ÛX/‡.¼9ñ«ÅŸ<ák-*î=J]N}nÃSøãüAmw¤XØZØj^—NÔµ[‹ÍR×Fn-nš²¾ªÚ^××Ï@=FŠ+˼ñkßüYñÃÁÚ–·k©üø£¤ü%ñŒú­µ„—ˆõŸ‚ß>;ZÞøj[MJúâóDÂ?¼-§OsªZè×ëâ;ZG¦Ë¦ZéÚ¾ª­¿–¯ï·æÐ£Eåßþ-xsãïÁo„¼e­é¾øÕð»À¼-§x–ÚÂÏÄvøá='Æ:—ˆ-4½KYÓ-u»]3YµƒU¶Óµ}V øçŠÓR¾·Xî¥-¥úm÷Þß“Ôh¢¼»âÿů|ðž“ãÙkwúf³ñGàÂ[XüiðÀŸ^Ï£©iVë¢i¾.ø¡ê>%¹Žê[û?Zê·z^›¬êpZiÂWv[½£E|óñkö©øð?Äv^ø‘âoLÔäÑ-¼Wâ­áÏÄÏxsáïoõ-:Ëâ?ÇøÁÞ'ðìõðºöã@ñd–>9ëŸ~ÝØxâF©oâI4φþ;»ð÷ÐÔìÕ›M'³¶þÀ(®'á§Ä_ü`øsà‹_µøH¾|QðO…~"øÄÙú®“ý»àßhV%ðƱý•®ØéšÞ™ý§¢jv7¿ÙúÆ›§ê¶^Ùµ K¸¦‚>Ú–Û€Q_<ø/öŸøUñÄ4?]ë~%Ó?iÙçÆ¿´ÿŸÁ£M¥øsRøUà»ÿ€wªÚø†MÅÚ.·â+ÚCÀ:§‡ôkß ,ËagâXüC'‡õ=:ÃNÕ~†¦Ó[«zúµù¦€(¯.Ò~-xsYøÓãÿ6¶ZÜ~.øqð»áÅ­sQžÚÁ|9uáÏ^,øáàï YiWqêRêsëvŸÀ/Ïâ k½"ÆÂÖÃRðÔºv¥ªÜ^j–º7¨ÒjÛù?½]~W—| øµáÏ^Õ¼cák-nÃLѾ(üpøKuˆ-¬-oäñÀ/>?øãØ"Óµ-VÝ´MKÅß5ÍGÃW2]EyáË­*ïTÓtmN{½"ÇÔhjͧºÑ€QE|óñkö©øð?Äv^ø‘âoLÔäÑ-¼Wâ­áÏÄÏxsáïoõ-:Ëâ?ÇøÁÞ'ðìõðºöã@ñd–>9ëŸ~ÝØxâF©oâI4φþ;»ðóI½möJà} EywƯ_ ¿gO…^8øÝñ»Ç'Ã…4I|Aãø‚Y–ÃK°Y¡´µ‚ [8nµ=g[Öu;«Ã^Ðìu/ø«Äz–•á¿ éZ®½ªéÚuרҳµí¦ªý.­uòº¿ª¢¼»àׯ¯…_´/Ãý;â·ÁOhŸ>k:ß¼?¡øÛÃRÍuáÍ~ÿáïŽO øÑ|ið¿á÷Ä?|@ð”ß>*[ø‹ÃzmǯˆÑxaÙë£Ò÷ÑémïÚÝnÐÔQE (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€?Ž_ø-üŸ7Š?ìŸü;ÿÓ+QGü‡þO›ÅöOþÿ镨¯rð©׸é(Â[¿WùŸÚ‹ÿä-iÿb¿ÿõ ðýrõÔx¿þBÖŸö+øÿP¿×/^,þ9Š_›6ŽËÑ~GŽø·öwýŸü}¯^x§Ç>ø×Äú‚[Gâ?ü2ðWˆõëä²µ†ÊÍ/5}cD¼Ô.RÒÊÞ KešáİCoH£D^oþöPÿ£aýžðË|6ÿæj¾†¢½z\GÄ4)S£C=ÎhÑ£N¨Ò¥šc©Ò¥JœT)Ó§NÔ!NŒcE(Æ1QŠI$rË€œ¥9à°’œå)ÎRÃQ”¥9>iJRpnR”µ”›m½[¹óÏü2/ì¡ÿFÃû<ÿá–ømÿÌÕz'€¾ü(øV5QðÃáÃ߇]6'[ð_†ü5“¦}¬i§UÓtá¨Ûwäyi›¡QYâsìóBxlfsšâðÕ9}¦˜ã+ЩÉ8ÎôªÖ9rNœy¢ùgÉYÅ4éà°tg”°˜ZU#~YÓÃÒ„ãx¸¾YF Jñn.Í^-§£ (¢¼£¨ü×ý•¿coxO[ŸâÆßˆuK~ן·?Ç_ƒu[¯‚ÇáWà ÿ¿´?í=ƒ>+xkWøwðóKø³®k~3øñ»Ä·ø§ñ“Ç~Цø·â½ð'‡ü]áAðÿÅ<ðÞÿÀº'ì £/ÃOŠ?müYûþÓÿ°†~ üø»áÍwã÷Àߊ¿¿gŸƒŸü)àq®èžÔ5¿…žý…¾+|>ðÇÆïøÒ(fø»sð“ÄWðMáoÅþ1ðoì~ÑÝ·nºl•Ô–ËMäÞº¾ú»«måoÂßä<×ÿ±oÆ Cösð¯Â_þÆ> Ó>Gñ³Çþ=·øIû=~ÍðKMöª—UÓ< ðÓÀ¿þ'üzøwû@kàœ3øÛVÓm?h+/Ÿ¿gíKLñ—ˆ¬ïf Ÿ†~ ø?áMOã·Áßâ~Íÿ±¯í¤jþÔ¾-~ɚܵޫñGþ Çñ+Vÿ‚„x—Å_³gŠ1x7âü_à߆4OŽÚ‰¾ üZðïì={â=;âgÄ ÿÙòãáÄË/‡ž)ð÷ìû5jš' |3øóákoêj¼5ûBêZ†_ð‹¼dÞ ø7öiÿ‚t~Ñ> ñ×ì¡â‹ øØ> ü7ðOìoáŸø+ÅŸ°Å¯ÃŸÙÿÀ?¿g?ÙÓÁ~ø·ãO‹>|Iýº|9ÿ Ćߴú÷ÁÿÙ7UŸöjøá¡|f´ð׉> øÓãíã IôRUd“IFÍ5·vÞ‰4–ýóUç÷ú’?žo€ðNo‰ÿ¼ ûðgíã­ ý®j/‡:‡þÍ®üT´Ð-<5eµà¯Ø/ã–½ð[âÁí;ྉðâOŠ¿àšÿ´‡ì™ûIükñ.·ðÎ×ß·í‰ñk ü/àÚ¯ÄïÁÏ|Cø©ñKDðþ½áÚÅš¯Å/Ú‹Áøõ¦X~Ñwš/€5Oø÷âö‘á¯ßú)ûi¶Þ—ný{[¾Ýlï«op²VòVü·û‘ù{ðWâ?Äø,üSûGüýž¼mñÓá÷ü[þÏíkðÒö|$ø[ÿ ;Uñoì«û>|%°ð_í-mâ¯]ëzO‚`Ñ>x'ÇW?¿g½ö‘ñÿ„â†#ø&÷ |©|yùw±÷íû9|9Òd ü&ñ·ÇO 꿵ü·â‡íá]cà‡ƒ~øoáÏìi¡Á9>üK¸ø—àïünÐþ.hþ6ŸOýŠüã» ü4ð7Åý ] Æ^Òìüñüßötø›ÿ´Ñ>9j ?d?Úû¿¾xkÀ°®¿áÏŒ| ÿ¾ð7‹?mÏÁñgã?|#­hŸ.4»ýJñ—ÄËþÔš•†¯xËá'‡´Éµ'³ú³_íðÃáΓðÆÿ |mûAxÛâOíCÿ­øÿñöœð¯Äß…ºÇÃþ_Bÿ‚rx3ö‚Ôþ%êŸ>(|9ý ¼MãmCVýŽ>)üA°¼ð¿ÁÿÂ]¡x×ÀÊxÛWñ—…üûÉE7ZNÚ.îîO^g+尿öÖúXJ߇ä—éþGá·ÂO€°þÇÿ³oü«KÕ¾hŸî?dÏÚóà7~9¿ƒôÏ…VþÒ?>0þÎ%ÿ‚qÛþÒþo†úþ þ+Ñ> üoý¤~x§Xñ'ÇHþ|r¸øUàïëž*ø{iâí/Â~ñG—øSö3øé¥|øËðêÙcí >"øÛàͿģñ+áü›ÅðSÿÚ'Bð·Åx«Æÿ|e«x×â·üßö”ñ¶—ñÃZø%¬xKâŸícáˆ×? WöžÔ2Ö5ÏüZÒµ_ð¨~ümý“¼a§ŸØGÀ>.Ò¾é^±ð—ÁŸÙê <à[OÕßÚ‹ökø“âH|9­kÚŸÅÛ‡á´4¾(~Æþ<Òÿdø¼9â…R|*øýá-áoÃßë^øà‰'ƒ>2|Kø'ñm´Ú¯âçŠfÓ¬>hž6𿊯þ/øsF°ñÇéEY7{Eo²}mµÛqÛNV+iéø[·§ôåéà›5Í;Ã_nøñ³á¯†_þå¿ìÕð›àö½ÿæÐáŠübý˜²>)ÿÁ4ÿácücð—ü)½OûKÂú׉¾üÒµlñ×ü›â|¾øßâ~Îþ ³ø¹ã/ÿÁh¾(h^-Ò¦øI£øËTý¯¼}û_Aãïø%ׯgñ€Ö¬õ žøG⟉“üøË¨j¶þ&ýšt¯x»ÃO⿆‡Šu-Qþ†h¦ëN÷´wo®·¾]V·ït›aʼú~ÿäWâ~6xCöPø»íe«Û|/ÖþüT´ý¡¿kŸˆŸ¿à¡^»øwâ?Œ¿³gÆMö›°ýž~xÄZ®©ã¿þ=Öþ?ůÙf]+áwíð&ßöpð}ÿ왾ñŽƒðÛà­ŸŽÚ7ö`ý£Å‡í]ðóöŸjKÛGö ðçìm¥üvñ>³û6xJÿágŽ4þÚRÉñöÒ48ÿg½2…ÖgímàË}ëömø7ñSâþøcã¦×~]x¹<-?ÄßÙ:){I^öމ-ŸG̵½÷èšZ%k½«—®çÁ¿¶®™ñËâïìwÿøCá€ú߈<]âÿ…ßþ|Òü?ãÿ†bÿã‡Å¿€¾Ðâø‘<ž6ñG€¼9ðãDðwÄŸˆ¾8ð·‰tø˜øŽãß 5_xfÏÄ/ð…¯¾¡Ò6xóöª¿×þ=~Ê_4ÍÀ¾6ø—á¯ÙçÆßð—~ËÚÏìåð»ÁºeŸŠ¼9añËû;Jý£/¾;øŸãgíáE}3þÍWà.™ªüð/Ä?øP^ðç…tMOö”øËûA~†ÑTæÛ“´}ëôwWÞÎ÷ûÛÒëfÓVÙv·n–ÿ#ðoö¼ý’¿hŸÚ¯â7ÂïŒ5øUñ³@ÖüKû/|ðÿ‚¼ð{âì1¬Ã~Ô+®üLñGÅïx‹ãÇí+ð§âGă?e»ñÇÁÍHý¦?àþñGÆÍOþ^§ã+ÏjºßïÙãLÔý³â·ì»ñãÅúïí{ð»À?ð«í>(ø'öŸðwìÅ?ü.['þcö¡ñÏ߉ÔÿoøF¼/w¨èžÿ†¡Öõ‰tßí/ƒ>-øÙðKÏÿ…µmà«Oˆ?·Ïíë¥|!ýx¢Ÿ´–ŠÑI&–ûiç®ß=Sºnå¿4út·ù‘ù{ÿÛý˜µÙÛþ=ݧß<ãoøWVú7ÃŒ+ûø'gŠ|-ÿ Ôž+ñ¿‡~ ÿÁ9þøgö}ðÏü$ÚO‰¼ êÿõïø§ãÄÿøBtÏ x·Âþ ðOÁφZ·P¨¢¢RrnN×vÛm†´Iv (¢Q@Q@Q@Q@Q@Q@Ç/ü‡þO›ÅöOþÿ镨£þ Cÿ'Íâû'ÿÿôÊÔW¹GøT¿ëÜ?ô”a-ß«üÏí Åÿò´ÿ±_Àÿú…ø~¹zê<_ÿ!kOûüÿ¨_‡ë—¯¿Å/Í›Geè¿ ¢Š*FQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE¿ðZù>oÙ?øwÿ¦V¢ø-üŸ7Š?ìŸü;ÿÓ+Q^åáRÿ¯pÿÒQ„·~¯ó?´/ÿÈZÓþÅÿêáúåë¨ñü…­?ìWð?þ¡~®^¼Yürÿ¿6m—¢ü‚Š(©QEQEQEQEQEQEQEQEá?hÿ†¿|Uà¯ø§OøÁâo|BðÿŽþáÿý_Ûÿÿkÿ/ÿèK£\ÿ”ü ÿ³ý¼¿õªà”Õõ}kjqŒ£99EÉÚqŠ^üãk:r{Fûõ·{híµú'Ýw>Pÿ†ÅøÿDWöÿÿÅZÿÁKÿúèÿ†ÅøÿDWöÿÿÅZÿÁKÿúëêú)^—òTÿÁ±ÿå!¯u÷?ó>Pÿ†ÅøÿDWöÿÿÅZÿÁKÿúèÿ†ÅøÿDWöÿÿÅZÿÁKÿúê÷Ä_Ú“JðWŒµøOáÆÏŽ¿ð€ÿgËñÇÄ4ø«Jø mªéV>%Óí¼e¥kž<ð·¼}ãkÞ'ÁÙãÂ_~<[x6óÁºÅçÂëø[ß ø—‰áoÛgà·üYàŸ†òëüF¿|+ðïÃvÞ“Â~%°ñç‡5ÿ‚ß³÷í®|yð–»câ¶Ðdýž~ü+ý¤þjÞ0ø£¯êz…׈õáϬ|iñ'â_ÁüS«SßÙÔÚÿņ‹»ýÖ›ß^ší¨kÝ}ÏüË¿ðØ¿ÿèŠþßÿø«_ø)ÿB]ðØ¿ÿèŠþßÿø«_ø)ÿB]}_EMé%OüþR÷_sÿ3åøl_‡ÿôEoÿüU¯ü¿ÿ¡.¹ígöùýŸü)¬|=Ñ|{¡~Õ äø«ñ7Á¼«üdý‚¿n¿ƒ^ñʼnÄzüž:ø§û8øCÁzv¯â-RO"Éu}~ÂÝ!†îöæx,l®î`ûB¿¿à°òP?à—ÿö‘ÙgÿZ'à\#J¤¹TjFêNþÒ/á‹–ÞÉ^ö¶è×Uºèú»w?mh¢ŠÀaEPEPEPEPEPEPEPEPEPñËÿ¡ÿ“æñGý“ÿ‡úej(ÿ‚ÐÿÉóx£þÉÿÿý2µîQþ/ú÷ý%Kwêÿ3ûBñü…­?ìWð?þ¡~®^ºÿÈZÓþÅÿêáúåëÅŸÇ/ñKófÑÙz/È(¢Š‘…Q@Q@Q@Q@Q@Q@Q@Q@(kŸò?¿ö`·—þµOü𾝝ÎïÛ'áwíÉ«ü[ø;ñ‡öÔfÛ/øcà·í ðKÇŸðÑ!ø ­¶ƒñ‡âgì™ñ;JÕü¾ øiñ*ÊóW¶Ôf™tmcþ}>+;}Ä26ÚçSšCEùoþ_ø/ÿý¿ðNü/þ-ÿôVü‘œ)þòœ\`âÔœ“¿´œºE«ZK©7³z7wÓÑ.ÿ×ÉŸ¶´WâWü"¿ð_ÿúàø_ü[ÿè>£þ_ø/ÿý¿ðNü/þ-ÿôRö+þQÿÀ§ÿÈÿÝ—áþ~Ÿf}½­ü,ý£~|OøÇâÙºßàŸˆ´OÚ{ÆÚÄOˆZ¯ÆÿxëBÕ~|FÐþ|2ø Þ2ðo„|àrÓãÿ‚o~|)ø}®‚úߎ¿g=vÏÆ^ñ”'ö‚¼Ñ>/h‰ðçŸÙOþ ãâ?دâOÄOüñ>‰ªiž0Öÿeß„ºžƒãíjþöÿâ/ìŸû:~Éÿ³×ìíà›ßëÚO‚líüûC|!ñwƒ~5üHð}Ï´ ¯†ß¼9ãýcáÇÄ­7CÔüUðçâWì»äÿðŠÿÁÿèuÿ‚táñoÿ úøEà¿ÿô:ÿÁ:?ð¿ø·ÿÐ}WÉd×¶¡f’–³Õ+ZþçK+ZÖß}EîËËE¦ÞÎú'oÛZ+ñ+þ_ø/ÿý¿ðNü/þ-ÿôQÿ¯üÿþ‡_ø'Gþÿÿúª=ŠÿŸÔð)ÿò¿÷eøŸŸçÙŸ¶µø•ÿƒÿ’ÿ¿ÿ´‹þË?úÑ?hÿ„Wþ ÿÿC¯ü£ÿ ÿ‹ýÕäÞ:ýŽ?à®´gÄïÙwVý¥¼Oû Üxà/í=ð'ã­íÏÃÿˆß[ÅÑèß ~+ø'Ç~(Ó´=&هº6µ©ëZ7…d±Ó-5wHµ]LÙ<š¾Ÿjok§ÓŸ3«I¥«EÉ·xJ*׊[¾ânýëTûÿ_&AÔQEsQEQEQEQEQEQEQEQEQE¿ðZù>oÙ?øwÿ¦V¢ø-üŸ7Š?ìŸü;ÿÓ+Q^åáRÿ¯pÿÒQ„·~¯ó?´/ÿÈZÓþÅÿêáúåëøeÕ?ट·N±¨]jwÿ´×ħ»¼”Ë/Ùï´ëX€"¶²Óì4ëk :ÂÖŽÚÃMÓí­tý>Î(,¬m­í †¡ÿý·¿èåþ'ÿàâþD®'‚›móÇVÞÏ«¹ji$¬ôI~_ð§§÷SE ßðñ/Û{þŽ_âþ!ÿäJ?áâ_¶÷ý¿ÄÿüCÿÈ”¾£?ùù¹Ú.ÏúþŸôôþêh¯á[þ%ûoÑËüOÿÁÄ?ü‰Gü£?ùù¹‡´]Ÿõý?ééýÔÑ_·ü£?ùù¹‡´]Ÿõý?ééýÔÑ_·ü£?ùù¹‡´]Ÿõý?ééôü‡þO›ÅöOþÿ镨¯Î_‰ÿ~#|hñ9ñ§Å?êž6ñ[iöšTšþ²mäÔ§°°3(.n ‚¹û2ÎñC-Ç›2[ˆ­„žDG^„#ËE»òÆ1¿{$®fÝÛ}ÝÏÿÙPythonCard-0.8.2/tools/standaloneBuilder/doc/pic19.jpg0000755000076500007650000017774210231140007022516 0ustar alexalex00000000000000ÿØÿàJFIFÿÛCÿÛCÿÀ,"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ýÿ‚«ÿÁU?kØÃö®øû;þÍÿ¿eø[ý˜¾|`Ôµ¾Òmu5sSñV…¬/ü%ڧćzئÓgµ³¿{bçT¿½Xn®’k[;_Îfÿ‚õÿÁQÓü!ÿ‚p1.±|9”–e 0"ý¦\•Á¸åƒ‚£õû\•£ÿƒ˜?cÕ±7ü•blgG‡¾9Mó`ýÝÑ)ÈÜŒàê:¿x£œxmÂ|=Á´3Ÿ )ñ>e›pÅ ç™Cˆ£”?i[5Ͱ*„°òÈ3^yFž_ ®²¯/mȨÅSæŸæUð|qœæ¹ôòž,Àd˜kõ >ÃØ¼Ú¤ã».ÆJ¿Ö(ñ.QÅÕÅΔi}Y¸ª<άœÚùãø¿þÿ‚˜øÊÛSñÀïØ`é7rÇjš¿‡¾é_\[ÝÝYéÚ†«àϾ Óô½JúÞÆúâÇMÔî-/omì/î-¡{{É å ÿƒ˜¿o9r[áì^æoÁ/ü¸pC|LàVÎÖWL:Fþ|V¿»ðZW'þ EÿŽ‹# ûfþÅ2À°OŽž>R@Øà3y@`¬^=¡×àÿÛÿIøwûLè±ü8ñ_Åß|øoáø.¯Åö·ý <}©è~ø‹ÿ½ø)ñâFð3Nø §? Ön¢Óôm AÑtψz–±¬êڕŵ†—¥Ø[My¨^O ¥¼Fi”/¥xwþ •ÿ;ñ_Ä»‚þý”þkßíuŸøvçá.‡û/|GÕ¾&[kÞ‡S¸ñ^‰?,¼]7ŠbÖ<3¬Íâ.M%/´H´NMV ?ìýAl¾þý?b/…?³–…ðÖã@ðį„ŸÛá‡ü·ñw⯂çøñÓÃÖ:ÇÏŠ¿·ÇŒ|/ñƒPø¥ð›VñªxW[Ö-gðµ®àÿø>ïFøWâ >óQð.ƒà¯O©_Éë?²×ìéðãÂÿðQO…?´/Âï‚§â׎þ*~ÞðX«?Ú‹ãÁÔ¾'ø˜þÊz—Ãï|Jð·Áÿ}—À.Ñ~|6|'­[jBËãǃügâÿˆ àÝSJ²—Áñh^^:·†pY¬ð| ‚<õIÖj+Ãä«;§íå j¥GSÝ8T«ˆ«]B r©^”ŠPâ6ðq«ÖŒ«T£í”ný ˜èàeÈy׌í+J§sJr„iÊKñ¶ø8“öÚ‘‚·Â¯Ù 6Jü×¾\#6I?ˆÀ#?6Ŷ÷‰wIÔ?ðpŸí§ %¾~É sŒƒ:çÉÝãÅ89ãåcıÁó¿ü›öiðWÆOÙKþ ñXþËcö°øçð~ÉÃàwÃq'ǽCÎoŠ?¼qᯉ$x?ö}øƒðóÅÞ)0xGKò“¨È4ðÐÕ|Ë=.=j;Ÿ»ÿmߨ÷þ óû*| ý®<{àO„:·Å‹ÿ ÿÁ@;kÞ&k _E£|G»×¼¡x3â_Å=WMÑ|gáï}F7$ð¿ TÈcÁQ¯£Š§ƒµ XoeRµL6OŠMJ¶iJtéºYÞ1ž"UZ”±‘¡Ïõi3̧Œâj˜:xïí—N„¨ûgí%Wš0U1tã ”Ÿ6 £qƒ›„eEÏ“ÚFÞOüûgÉß d 3˃ZÎÄù$l6|{‚N܂̀½‘wÉÔð_Û!À'á‡ì ð¦õ‚@?ÇãtblUH`U‚°‘bôÏÚóö&ý’¾|)ý¬-ø-ûBþ×^6ðoíeû9|5×¾øBóãïíQñ‡Ã5_ÙáÏÄ9¼Nðiß´ßÂoŠšü@ñLÞ-ð¦‘ñ›â¯þ/ø?Ã7> ðÿƒ<#ðÒk]7Y‚ÓÆ«K®\-Z|QÑÄQ©R2T(ûOipíXÒäY‹§éq&U•ZÔV½*øJ‰ba*q꿹ÎÛqŒéJœd½¤ù9dóÊwú³“JYmg>zr§V/Ùµ#ó~ø/‡í‹!Ã|1ý””woøSš° òHØ;¼n?( ³F #ïh×|‘nGÿÝý¯˜)o†²À$@ø=©ü¹#®ï+wÇ̈À™T‰.âÏì¯ðÇáÿì‰áO‰³ßìŸñㆳâ?ˆ_·ƒñ×Åÿl¾2êßc= à×,<7ð£Eø›á€Þ5ð7Ã/„4/†“Gñ/ÆV|-â{I¼K>¥«á°Ñlº/ø-ëË­þÙþ#ñö•ð¯KÒ>ø÷Kð6»ðóö„Ðaø‡y¡þÒZ$¿~ LÚΑâkÅ:ïÂé^K»= OÔ~èž³K=Fñ|þ Ö%´Ôíý\'øs˜fx,ƒp‘†.ìeˆ¯R9RÄdXÌtÞ8ÉÕ”qo^­ 7J´¨áÖ"Z˜Z•18~,F?ˆðøj¸š™Ånj//~Μg(Ξ>zªj¯²äN’¥N3I{>zެ*ÆêtPÁuk¹Ná¯ì²£Ïÿ Q ™F<ƒã"[øp‰!bŠH¶£ÿ‚â~ÖŽo‡²ú ü ¿ùrHçw‹‘¸ÁÈ*¤m9 ûÏ'ñÌ|êv“oÎÃ÷qaIû»ãòîwj,­˜¶ù°u $cp«Á\Áî<¨ù~a±1´|©³ýé¥á§&­ÃwO³[­¯ÿ/~ß%»ñçÄùòšK4Ä¥etœ-»G¢ê¶øWÄ~ÑÛÁnk˜øsû0¹CðŠøIùsâ¶ÜsôÀV$<;+ÿ©ýª˜ ß?fdoâáÑ Ë¼|T›±´ç…áI;AsâÝŠþñNÅ8xù+ÊüŸÁûžIÇ##Âù~e·QÚª6„ÚÊGʘ-ÐìLãn„åÛº §á·©YpÎ\¶Ú5{ÇþŸ7ß쮺-ÔˉóõVßÚ˜”¬´¼-ÿ¤®ß‡•×ì]·üö§€o‡Ÿ³H”>Ý)<âS“žz‚I*˜Ðë¯ü?ö #æøû7)ÇÌ?áSLvŸŸ#'Ĉ‚£û¹“´o1þ:X/ïìS‡æa†_—øsÎvò20«»jù{íºx×h`M  ùgü)òÓ%qŒåxù6î†%á·ó/øÆ²í×Ùªºרÿ]êgÄùú©ešb’²Ñ8ò²û–ª×_®¶¿ðXOÚnf¼û8€YA ðš`Wqaƒ»Ä€\`’üÊ£Ïk]eÿ‚ºþÒÄ Þý”ãæáK§ ××v õ;r´n1þGXx ápËóîÃ$nÎÝÀe¶ª§Ë•¾Ç¤vª6¨GDÀ~ùi¸À?.'äÛ˜²—‡ Ηúµ—[M9jõJÿò÷þËaKŠ8T·ö¦)-4¼;×µÛ·MôÓõ†Ûþ ÑûHÍþýžÀÂ’WáQwHɸîÖH+Ù‰ ¿1Qçý—PÁVÿh³ÿ2?ìü=sð­2>÷®´ ãò:‘óy”ö È>YàFwmÆßß™¿ÑÆä;znm¬¨~O'6= 1ëÁ{¾ÄÉãæÆr»ssðçÔÒ\7—¤íuË[­¿éïè¿DŸq©ešâ­}¯–ÿ§z~m¥×êE·ü;ö†˜ Þø2l|+@e –ÕH#‚å+–` ÿeÔðTÚÿÌ—ðzçál‘ßUãò:Jæ?Ì á>Gãiåp2ãv|¸6̸íòã;—Ê͇D£ùqQÈÁ=ö/#Þœ¦ÜÔ¼:à”ÿäœËÿð½mÞ¢·–ÞIƒâŽ UþÕÅZïKÇ¥­ÿ.Õ¶òÛÊëôÊßþ gñò_½à¯‹É…öùOœ®[7ù#Ú£r<ñi¤ŸðRoŽí×Â}ñðÂϽ×:Ž à£Œä€Çùµd˜ <§]¬x#”ýâœypù1£ Šr<œXoÆ=‡tão-É;Gø;ÇR¿ 4³•Ž?×rxÈårÉ,ŸX.Ò–cÂ7neËD>cä® mÃŒ¦ ”Çî|‹ xÆ9Æ0:¨ÎÌ+>^HÆW•ÀÊãrJðÿƒ9ÒÿW°wéVÛ/úx¿7×áÕ©ÿZ8TKûWm4¼:òÿwËMW——ÞVÿ·ÅÉIោå¾Tøm¥î@$ ¥‹0À•ÁØÁá2«‰â´¼¿¶ÏÅ‚9ð×Â^œ•øo£>V8ëÏLŒíÈ;A,¿ÙŒa ªŸ2æH†æo³®ùx û½‰±<¯#O׌`Àê¼…Â1ÀùzŒeOË€¤å~ò七y­þ¯àmwöjùÓÇù¾ºîÒñ´KûWm4æ…·ÿéö–Ûî×Û~Øß¥¿‡>®ÇËðëFù@pÐ ü¥ƒçiWŒ«ª?µÄý¯¾'7_ü,ŸøWZ!X/’I#1Q–O¬× v‹‡“¼®^!Ïî†Ùó¯Éå¼~^È|¿"ËR!ŽÊ0Œ2FT~ìü yg“Œ+av)É“à.½¿°0;¾•oÑÿÏÆÿ›Bñ3_Ú¸«&í¬Öþäû.½6ê}‰íYñ"Q–ðÿà 708ø{ ‚¸lÐg«d© „:ÆþtV·£ý¨þ"6s ü5á\ñðó@à¬lݬܑ‘žBªw4csÇò½¢àgË Ã8Ã/̃òS“ 2»5]ù^MŽ´+Éùz$œ¸ Dǧ’ý1v®Ð¹Ý<ȳÿPøBÒÿ„ ÏìÕíüÿå×NÄ8§ˆ\’y®*Þ°íÿ>ÿÊÞKo«!ý¤¼}'Þо¯cÿÿùNRAËu Whªþr[Þ‹ö‰ñ˶Eø{¬IO‡Þ;v£¶p4òN6ç !HgwIÍÖ©þ«n äŽW">ƒÈO‘¶g_/b&Øü¿*Ï^ÜaÁÁ]ªç(7lÄnr–Ü®ÝÊp›Jç|;|Øqð‹ÿ™ oå«ü±Îÿ«ôÕTx£ˆ5_Ú¸­šÂû¯î7ø?ÀúRŽþ3e´o¡Èÿ„ß›JCŽp>PAp’ c†ô?|_' ¤xuË/€¼-µ1­ƒ$‚IMÃsF›c“{¢––µ]«Œ¿2œŒ|±ŒãÉ‹å8áv ˜ ¶+ȵص_™NÆùIù‡Ü÷rœåðß&å}ðìXټȱçÛ丄µÿ„,Ë¥Mý×ÿ?_çßK]¢W‘i“ûh~Ùÿ³Wì1ðóÁ?¿jo‰?ð«¾x‹þ_íÄð‡xûÆßlñ–­ð˜ø—OÑÿ²¾x[ÅÚÝ¿Ú4Oø†÷ûBëMƒJ‹û?ìÓßEwwcÏç>"e¹? åùn#*Èò¿m‹ÆÔ¡QWÃÕ®œ#‡URŒ}´lù–­n›V>¯ƒ±ÙžyÆÐÇæ¹‡³ÃáiÕ§ìkÆ“S•eÌÕ7uk+;ÙÚÍl¾§ÖüS©xsEÕüC¬ø×àž éz†³«^¶Õî>ɦév“__\ýžÓá\÷Sù°K/“m×ìÙ RHʇÎü;ñçEÖ>|+ø™®üGøðëIøÁðëÁ|)¤|DðÖ‹ kË øãÂZŒôÛKèíü!©ijú~‘âm%5«}YÖ,ìo.)qE4¿ü8ý³ÿf¯ÛŸöRøïñköYø“ÿ Gá÷‡toеÂãïýÆZOÃ{ê?öWÄ_ xG[¸û>‰âï^ÿhZé³éRÿh}š éní/ ¶éþ Þ|*°øAûÝüZO†i1Á;þÂ<Ÿì|©h'Äòxö7‰?³,¼sou¤M¯?ˆŒDjécV–¶ñÝ:þWO=n-Ï%ÈÓŒÜZY|ïhÒ•F¹^%>fà–­nûéú Éíkf™ÃÛþcWx®”¿¯’>¸‡ão„nìµËý7ãìÅ­Áá½Sñ>¹‡¼;ˆ¯týGˆM©ê²éºÃCQ{[DhÕÚYY¥–#WžxcsàçÅmkãGÂ_üdÑ®~øgÃt=#_ðý‡‹~éqëËg¬xkþ*†-B×Ã>ñ>Ÿmsm§øŸM†í#Õ'ˆ^ ˜í¦¹‚%¸“åÿëõ]'ãOü*¸~EöØçö„þÝÿ…K¡ü:Ñ·y¾4øý—ÿ ü }Úqåê?Ù_ÚÞo“Kì<ÛÝõÿg8|qÿÊøÄ_ ÂmðúÙúÞx3þ]Wâü%Þ —öøRž'ðÇü+= BñF·ñûDkí+þ]Ã^"Õ|]ö¿øGôý V»Ô!°¸õpÙ• ¹Nm–K’û\ËÝðŠ_XźUH,Kæ¼cxûÊÍß«<üF­<Ã-ÃG4ͽž'ëž×ý±6ý… u)ò¿d¹W3×Gue}÷oö‡‰èmø'ÿ†òÿÿ…~]~ÜŸ´Wü,/Ùöðð—…õ OøUVÇÂø‡Ãž °ð¬z–º4‡:çˆìt-@é7‰$Ð×Kñçü"zÓÞXé «]Úx‚Æ5O ÜYêzÏä_ìû?|xð‡ÇÙWÅ_µìûûPøƒþ ÷kãmvoø&Ÿì÷ãOÜüsñ—ü³ÆW÷3ÍðwÄÿ·Âï |3ÿ„ÛþDŸí-'öjñ×~%|sÒ¿àšUý¯Âߊzï‡ü[scñcÂVüVÿ“aÿ‚·ÿÙÁ|IÿÔSö~¬²üeÊžiF¶W”Sö]|U*ØL$©U…juhÆ-Mר®“|ÊÖ»vr‹Mé‹ÂÕÀÔËêSÌ3*žÓ0ÃЩO‰UiN•E%(ÊÊ;ò¦ôk¥¬ºø*/üÏöäøÿûl|/ý©ÿc~ø ­xöaøkðª?ÜüHø£ðïâ¶¢ ñ~­®.ÿáï€|HAÔôÙiò5›{‹™“P†}>8"¶¸¹ù ~Áðppø*4œzþÕÿµ!?‰? ‰'Ô’I<žkú•ñü…­?ìWð?þ¡~®^»ð^)q_€ÀåqÁpæ3•áÖ <Ç!Ác±4ðЫR¬i:øˆÊn*¥Z’I5iÉÚí·µnËñëbeWN¦&§¶ª¨c*ѧ*Ž0‹—$Wå„UõvI_Eoä‡ã/ü»þ ûûEXÚéÿ?lƒ¿á°º±¼Ó¦øŸñ‹ã‡õ-6]6~ ´Ý_Ä5WN±…|O®9Ól¯`ÓæžøÜÍl÷6ö“[ø•¿ü•ûmÅßÿe^ §Ž>,ädÅÆ?áE „ µAŽ=Š‘ù1ZitW·‡ñÛŽ°t½Žd8J7æöX\“ ‡§ÍËsrRpÔ!'o†1ŽÑIqÔ଒³NªÆT’ºRž.¤¤“nMsI7g')5{sJN×gñ„Ÿðn§í°½~'þËu”ão‹.äeãwÀÖRA†>Rµ—fø7—öЋø—û.ŒråhÿQ² ?u‰Óoö™i·÷|¿M´?ޏ¿àÞÿÛ:6üLý˜†O|T%2¥r¡¾ à•8eÆÂ6mdÙƒþûcD0~$~ÌÃæmñŸÅŽ‘ðV0y´Byh"Žßúû¢¥øûâ­|NU¦ÖÊé/ÊðÝ- >È¿w‰ÑY´ËºËä.^ÿ‚BÁFþ|)øËðCÂ_ÿf#áoíÿ ëþÿ…×Tñf¡ÿ oü*Ýx»áùÖ©ðóÄZü#Þ"½¹ÔWþm_AmSÙ5w½³XaƒÎ ÿ‚ ~ב.ÄOÙ¸rÆ*ÿ4j1€A €¡T&ÄGõ©Ec8î­Rœòju15#[:yFÄV8xÖ¯(ÉJ­Xáðô0ñ©QÊj… 4“P¥N1¹pVI8ÓŒ£‹”iCÙÓ‹ÅMªpçG&šŒ]J“›ŒR\óœ­Í&ßò£áŸø!ÿí‹ámBñ.ŸãßÙjãQðö±¦kvúõÿ‹¼Y Mw¥]Å}mµáO| Ö<3âm&Ià‰u Ä:V£¡êöb};UÓîìn¥„z7Å?ø$wíóñÃâ/‹~-ü]øáð7Ǽu«>·âŸk^2ø†÷—÷¦{X!† _ƒvz~™¤é–¶ºNƒ é:~…áÝÃMд 7LÑ4Ý7N±þš(©ŸŽ\u:ÐÄÊy3ÄB”¨B¿öFÛFŒç “¢ªßRJtç:jJ28I«Æ-'Á9#ƒ§lg#”fáõ©ò9ÁJ1›…¹yãJ*VºRi;7傸!÷í_+ˆ?³ÉÁ#ÅŸÎѵÀÿ…F¤He*Ѱ ìhأŹüCö§E@|{û? ¡FÅ_ðÙœcá*)p6ªÅýAÑW/¸þV¾'+Ó¶YIiÛIí¡/²féâ´Ûý¦_¬/Ðþb-ÿà‹?µ$L¬Þ<øJíÇüU?ÈL þB† àŒ•ÀÜ£”’-¨¿à_´ôj€øëà0ÚÀñ?Ä£z|+Œ‘ʸ û¿'ú]¢¥øéÇÎ×Äez[þe”ºÛ߆ÞB| 6›§ŠºVOëSÙ|¿ ¯­®6ßðGOÚjVoül2xø” ;sð°dŸr +ymÌðHOÚMGü&ßWn0£Ä¾!;r?.@à)Øcþƒè¤üqãÆïõŒ²úm–Ò[ÛÿרŸðüŸ3§Š¿¬Ë§ý»oÔüµÿ‚Tþа°/ã‚ä„ñw`2±Ÿ†ë»‘‘’@òÐ*©½¶¼ðKêª?á-ø8¸¾!ñ¡ €xSÿ í œ¥?z(©~7qÛwúÆ[}?æ]KKZßoÈðûwöx«ÿØLºyrÛõó? mà˜Ÿa ¿ŠþÁ_xÀò$V9áÒ–è pÈ›Jí„Ûk/üOã¨#þ*¯„¿_íï>˜ð ’zw8ÁÛ³÷Š—ãgI¦ñmÕ¶Ë©[Ktæòþ´²|ÃÍó{d<“àe ÀþêœÇb²j'ìñ…HψþpF1¬xŸŽsŸù'ŸQÐ`‚ÇúåEGüF~8½þ±—iÿRê^Zü^^ž[XÿP¸~÷öx½ïþõ+téËä­×Ìü¢µý…~-@>"øt ÆÝ_ÄL@-mÉðZd0BŒ@S€1‘䥮’þÄ?—ñÃÎûWÄyyð$óýàp8 „hÿRè©ÿˆËÆ×¿·Ë¯¦¿Ùôú4úÏËmµÛk?õ‡ÓæTñw½ÿÞe÷|;h~eZþÆà#:ç€T`6ê¾ r3å§Â(Ní„66µ@?&+]ýŽþ&.3®xc+©ëÿ/dgÂÃ$åzqƒµ—ô–Š_ñ8Ö÷öùuûÿgÓÿä¿=WKh/õ ‡¹¹½ž.ÿö.–þï—ã®ÊßžVÿ²_ÄxˆÝ¬xX€š†µY¢$–ÿ„Y FÕØªÈ6( ŽÎú~Ê¿—Ö<uo Áá¾ppAùO`Wïê)ÄbãKßÛå×ÿ±}7Û]dûu¿ä €xyK›Ù⯧üÅK£¿òßñüR·ÃVß³7ŽámKÁÃæf/õbFæˆÿж™Ü,Õ ‰å„ÊŽÖò~Íþ8_ù‰øO;JÿÇö¬@6Ð1Çc€W®ÖÁ_µè©ÿˆÁÆw¿·Ëûÿ¸S·žœÝzþ‚\ÃÉ·ì±M¾ø©¿Î7ù^ÇÈ6ÿiƒà׉¢ÆnôŽëw|JäDñ&@T•<¡Dq„ ‚$¶¿Â_£)7º Æ@)szJdCiX%I ¸ØAQµ£mÐôT¯øÅm[/Úßîû%Ö^_®ã\ÃËþ]â¶·ûÌŸÏXïøy#Ã]n%Á¹ÒG*p·Dé¦F1•   DE„?õxÙY®4Ì©ãl÷8Qµ KT©W‰€C±ÑÊI¯QSÿg‹ÿçöd¿Ü ö·y½ì¯þ`¸‡•íOª³ÿi—ÿ#ý}ÇœCàýF4e2Ø ò14ÄR0y1ŒeH( AVÿ;xßö^øŸãj¾'¸ý°ÿiï Eíb³ðïƒü[ðÏ@ðLJô­6ÆÛJÑ´-Kƒà¼¯Ÿ¤i6Zt:…Ö£­j"Øê:þ­¬kwz†©wö…çf> 癵:t³:N6º”¡_/„”&â åTZ¸«?&άeyuIÕÀÖÌpµ*Â4êJŽ-ÅΗ2R¼Ò–¿ðÏ»ïØ“ÇZ•曩~Ú?µÆ¡§j·7öÞ>økwe}ewÁugyk?Á) ¹µ¹‚I!¸·š7Šhã‘”éè_±ïÄï éÞÒ|)ûnþ×¾Òü'àÏü=ðöŸá_|3ðÕž—àïxkEð‡…ôH-ô?‚ñ¢¼•ĵVÙFBµOþE«um‹¾Ÿ‹îz?ØËþ†yÇþö·ý:òGÃ:ßìñ‹ÄºN¡ xöôýµµý Vµ–ÇUÑu¿ŠÞÕtNÊuÛ5ž¡§_|žÎöÖeùe·¹†X¤^­;ïÙ?Å«à?…Ÿ ¼!ûK|zøcà„~ Ò|áíá爾hßÚ¿Ùz6‹á÷ñ'‰õ+ÿ„𾝫øƒQÒ<7 Z]"ßÚørËû4Üh>Ñ®µ=nmOí:+Xñf.«PŽY‘ªUýŸ¶§ýœ¹j{sÓç^×^I^KͶe,‚ŒêR«,Ã6u(óû)¼o½iò¿gö¢’}ì| ÿ eñþsöÂÿÃðëÿœ­xGí7û;[~Ïß°‡í‘6ñ—Ä ïˆ§¼Mâoj:¥âMCÄš’|=ðìòË?‡|'á 9­ÛNð†+¼ºt·óßËyuuyr× Eúã_ÿÁHÿäÆi/û'ïÿ§­"¢ñŸ‰ì<+¡CðÏÇZ­î»w`š†5moû>ÒO¿ü_ÿ!kOûüÿ¨_‡ëÁ¾/ü%ðçÆ¯ é>ñMî·a¦hß~üZµŸÃ÷6·òxàÆŸ|vðu”òê:n«nÚ&¥âï‡â[híb¿¼ðåÖ«i¥êZ6§=¦¯có¥Q·ªSm­î¹µÑߡ쯅z/ÈüØøoûlé_4/ÚÆ~3üløð#àׂg/è^4ý©~x7ö]ý£_âÇ?ˆß¾ÍðûPøyâ„?±ž‰á‚z¶·á¿ƒ:ÂïŽß>ø#á#øëƓŴï…>øêÓà†'„à§ÏñËãOÀÛÙ—á§Å~Õ~~ØÚWÆ‚ÿ |_ûx£Ä~ø«ð—ÅŸ°n©àÞü\¼ý¤¬¾øŸDÐ>þзosÁOÚ/Çpý¿âÖ› øÃÃãÇ>ñf‘ðÏï/‰ß²_ߊÞ)ø¡ã]wZñ¶—âo‰¾ ýšü*šžƒ©hPÿ®þÈßþ&üø ñ/ÁVz¯†õ}>oxCâçÄÙ¼[waã«Oü9ñ?ü"Ð|Oà _Ã/âíÅž]«~Ú¾£â?|D²ý³ÿkÍã'ôO‹þ½øÃÏìÉâøÓßïþÞx‡Ãú¯‚,þÖÚ-çŒô}Æ7Üž,ø¼šwÂÿ ^|+ðeððÐÃþ £ðLÿ„?BðG‹þ6|5øQàŸ~Ë¿ôÏÞ ømÃOâì…ÿ GCø=ãoê"ð÷ˆ¾(øÏì¿ ¿gŸ…Ÿõïx£âF­ð“Sм;iñ.ßáîŸûFØéôÌO‡?ðL†tO ÁðCã—í ð—Ç>Ñ4èß¼?wð7Äþ8áþ“û<þÊ?³–µàôмð®}ÆúìWû>øçĺÃ|68³øáUüâß xÅÿo…ì¬÷×ne¶‹vµÞ÷åèìƒ]6óü6üçŸØïþ ]sâï…¿¼)â_~Ô?´÷í;ñGàŸÃŸkZ‚>üÒ4+h_±ÇüÛãGÅx|/â⃟¼àVÓöÆðçÄ{}wã—‰<-¥\|FŸâŸÂÿ øžÒ[ÏÙ¿áG‹¾¡ðR?„šßü!þ#øcðËãgƃ(ñ·ì»ðëUý |¦|0Ð>øÆ_¶ü)?‹|-ñgâ¯Ã?Ž÷Ú^ý¤¾x×^Ô< ðkÆšV¡|E´Ó®ï›Æ>ñç…|)·û3Á<~ ~Êž,ðŒ~xŸâ޳©ø/áuÏÂ].ë^Ôl.<9uð[öø%àŸÜK­¯„àŸÿõ¹·ºµ°#ñ/Ä˶Ó[LÖ|-¤x3ä8?à›¿üã/…~xÏþÏìyðóÆß±üas¨|j𷎼eñ»]ý‰4¯ÙÖ/ x£â/Ácö³Öô/x§Dý˜~|"¾¸øCûlü0øs¦é^Ñþ3Éð³Yñ ç¾|@º“vÑZúè·÷¬—enT–­»Ýlj­-·éßç#ô£ÇŸ´‡<ñ§áïÀùü ñGÄÚ÷ŽôFñ-߈|%á‹ SÞ ðäþ,Ñ<§xƒX²º×4ïøÓD_ø—Ã^ñö«ðWÁl?gËx?Çÿ´ôÿ¾ø×ÁÞ;×¾CÓ?à«ß-¾i¾*ü-øÙû?x'Çü;ñÿà´ßn¿gû?ø]Ÿ|S⟃ÞÒµ?ë¾øùãßü0ÙãoÚ'à‡5{ÏÚWÅŸ´/ÿÂØÓ¼ø•û8xsâ‡Å_…¿õŸ|QÒŸán·¤ø–×À¾ñ=…·üCâ? Ãâ¨<â ÓQÐõO|?Öô[x×Dñ.«ð7Åß oþ8|?ñN«ðgö‘Ÿã7ÁgðÚÓâÙóþ …?gŸ?¿h_Ž_~*üTø3û<üøKðÿÄ–7 ´ß~ÍÞ#øs­üøŸ=ïìü/ø»áψ3geÍå{^ÿjöéÚ÷Ó—ozá­ôü~]µïóò±Úü4ÿ‚Ÿ|øåáÍ ãàÃOŠ?þ$êºßÄ+Rø/ð—Åÿ²ßŠé^6þÉý¨¿jxÅ „t¯ |OÑ>‡øÙûCês\øOãÂxSþ}¿ð§´+ã>…⯠ÂÛÑ>^üQðÿÃ_ i?´ü š!ûÜÝÿÂ+â›oÚ«ö¡Ó¾;ø_þý<þÒ?ÚõÿˆÚ·ƒ~'´>2øuÿ ûÆ_Ù­|ðn·sû8O>«ãoøÅß|=}CÅÚ¯‹u]oUÿ…ñ_öxX~"ø³Çâ¿xãw‚~0ø—U¾×u_ÿÂe­øÊËGñˆÖá÷ìŸÁÿ‹^øáà}âlµ¹>xÓDðoŒ>xÓU¶°Ó¬>(|?ñçÃÿüAðç¼5£JohZ%Í¿‹Ãsèÿ|9à?ZxÃ^ 3øI|9'†üEâŠ>ÿÁ1þüÑ<3ÁŽ_´7Â_øKDÐ<£|ZðýßÀßøâ?‡úOìóû(þÎZ×€gÑþ(| ñÿ¹ôOè?±_ìûãŸë ðØxâÏâ†5Wðg‹|%àokþ¾ûËÀ¾ ÿ„ J›A¶ño¼Q¢[ÿaZxjÓÇZ÷ü%Ú¯…4-Á¾ð” >5Õm%øƒãoí ¿Þø×]ñoůüEø­øËÅÞ'»Ô¼kq¢7‡ô›¦íȬúôü-nÝu÷¯ÐúÛåòýoøµQYŒ(¢Šü×ÿ‚–þÕ¿eŸ~Çö¿bø]‹¿iïÛËöý‘5sâ׃¼YãßxC߬ñwŠøàøÓÄü'㉭|EÆ«Ïjšµï‚¾×ý±?coþÙÞø1¡øÇâņZŸÀ/Úáßí?ðÏÆ? n¾Áâ='â¯ÂËÚx6îö×âoÃωþÕôK Ýj—:6£áiáÔ/ì4Øîä—Lúv¡âzÏü³ödñ—ìóûOüøŸñGâ¾§ûdëqø«öý üqâ­ þÐÿñø‡ÃúeÄžƒÄ;zçü£örðßÛKÆÿüñ³à—‰¿`øUßðмkáÏøŸâ5Ÿü/m DÕþÿÂ%©üø‘ñOá‰ámêí·…ô+â§ü"ÚìwáðÊÛøŠãÇŸðH/€?þ~Ù>+|Zý¡¾!x»öñÖþê¿´'ÇmW\øE üUÕì?fɼ/Áß xkHð'Á |ðƉá„ð“[Ï=‡Á¶ñ¿‰|@Þ!ñ§q‡'ð÷kñkþ Yû2|n¿ý¿îþ#_üQÖ-ÿà£Z'ìÿ¥|hÒí¼U¤i6 ¿ý˜ü8šÂ?ü%“Kð½®§£kz6§k¤øÇRƒÆÚÄkž#Ѭ­u?Ïá_ÂÚ£ýÏ^mÕí}¿uÌ•ú××H]ïsÞòùü÷·Ëm7ò;oØŸþ )ðöï¿øÕ |!þÛÓ|]ð[ðV•ñÚ¯ˆ>xúˆþŸÄžñ/†¾'þÏ_¾7|ñž‰®&—âmx<-ñCUñ†… ÿiͤè>ð/Á?†¿þè»5 {^Ô5Ú|:¼]öý3Gñ¯|GáŸ|7мíuœ¹yŸ*²Ó«}õi;^öº½´}Ưmw (¢¤Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ¾!ÿ‚‘ÿÉŒþÒ_öOßÿOZE}½_ÿÁHÿäÆi/û'ïÿ§­"´£üZ_õòúR¶~ò?A¼_ÿ!kOûüÿ¨_‡ëÁ¾2üeøð áþ£ñ?â~£­é¾Óu¿xißÃ^ ñÇÄßøâ?Ž<9ðÛÀ¾ðÿ~xsž9ñ>·âø·ÃžÒ´¯ øsU¿žÿU€˜Ýgž/yñü…­?ìWð?þ¡~¯€?à ~ñ—ÄŸÙÛKð€fñµ‡‰¯ÿjØ?PƒÄ´-+Ä~2ðV•áÏÛŸösñ/‰~"èúWˆ<1ã_ ¿ü+o èúǵ ïøKÄ~ Ñô¯_k0Ñïü3aªÀé¤ê4ôNm7äå¯GÓÉúøW¢ü¾G¶|ý¡>|tÿ„ŠÜøÛOÖü%ý‘7ˆüñOá'Å¿´­+Ä_Úiá¯Ü|3øåà‡_[Á>(»Ð øÛÁ>?ø‹áÿgê²ÿiø7áv»ðÓÃ^:Ö?µa±“D²þÂÖþ0|:²þÏÔ5+MWSÿ„‹í:=Ž¡i¤ë³éŸÿ>~Õ_¯?lÝ?áÇÄŸ|mâ‚ðODOڛƿìïþ#]ü(‡öªý¤ ý¦~xKÃß²—‡¿f'ÆŸð¤gÛ¯|EÐ|3û=hþý´îõߎwv> ø»sãm_ökµø}ò÷†|¬X|Fýž#ý¦>$þÔ?ðJ߉^'ñ'€4GWøsàƒ–ü“Áÿ¶ýÿÄŸ‡Wvÿü-à›Ïžý©t‰>kwþ)¸Ð¼k⯌z‡Âý™üGâï‹–<þ˾øë¡xcçí‡áÿÛËFøAãMáω~1j? ô¯ÛWNøýâÏÚ’×þ Ÿÿ„ðw€¼AãK¿ÙNk wD¶¿ðŸíµáoˆz®¡%×Áè~.øjïCøÅ:ü_ѾZÛ –ŽòNÛrë}Ñuê–«TÛG¯á¶ÿàÏègàÿÆ_‡ÿ<¢üIø_¨ëzç¼K¢x7ľñ&«à¯x.ÃÄþñÿÃÿüOð§ˆ<4Šüòý­<ûFê?´] àÏ‹|maàŸÚÇÁ:oìÃñ/XÑõïZÞ~Í?ðŽk¾$ø‹ûC|'Ô<+húOÁ¿kß³îµûLø/‹Zü>#þÔýª´Ÿø'—†&ðü °ñýô¿—¿tÛóûwöÛÖô_Š¿µü-ÏøB࢟Ø_ ~|ý®ÿ°¿áT¹ý m?bïø@>:êß´¯ü1ü&ÞGü2ψ<+ÿ Kû:ÿÃiÿÂÆûƒþ$ÿÄÃþûÇ51¦¥ö’ºÛVþvÙ^êïKÛºý«ŸàÏèÓľ °ðŸ‡Xøà‡ÂOŒzÇÁíCà·Â†Þ&ø Ã®û_~ü[ÓÿnOÙ§á캯íCñCàG~6~Ï´~§ñCž.øŸ¬ù_5oÙ›þ ãῌ>'»øá×Ñ4Oø'_Öü)û)èž5ýž>7€ÿeïÿÂÂÐ|¡|ð¯…>;jþñ±ìÕ“rVårÓ}:y=Vž¡.©}ö×åÀý®¯žu/Ú§àn•5ȺñN·.™kñFËା,Ó~üLÖ~·Å[ÿŠ¿ ~Aà{o‰Gƒ¯¼y­Çñ“ãWƒ¾^ÅiâIáÓ|q£|Zðæ£5®§ð 㵿Ã`ÿø]ÿð±¾Â[ÿ Cÿ 7ü2÷‰ÿáá_ð¾?á ?á\ÿÃrnüÿ„[þïþüZ?øB´?á°¼Ïø`/øÆoì/øBµâ™ÿ†u¯õ‚¿´m[á.‘ xö†›Â>,ý¼¿ko_ü34_ußÚßÛÁİŽ>xâ_ j“j>ð^ˆß³W†¾(|\ð<º.—¡xrëáýÏÆ¯43[ø³â—‹õ‘S\Örê—EüÍÞ÷þ[®éÅép¿“þ­þzú3ú4¢¿ÿ`½ö™°ñLŸíQñWö¡ñN­yàŸ‡_ðÒ´øûrxÂÞý®î>1ü¸ðÏöÅ?ˆ?´¯ÄŸø×Á:?“âÆ‘âßøw?ÁßþÀ~#ø9qã_~ÑðŠþ϶|/ûÉQ8ò»^þvi~?šiõ×ËÔòï‹_> |ðå—Œ~;|_ø]ðWÂ:–·má­;Å?¼á?‡¿ñ冥ªZx~Ë\ñŽ­£i—ZÝÖ™£jú¶•Ô—óØiZ•ÜP5½Ô‘mü:ø—ðçãƒtˆ¿ |àŸŠ?¼Eý¡ÿÿ޾x«Bñ·ƒußìVûBÕ±üOá«ýODÔÿ³5½3RÑõ±_Oö-WO¾Óî|«»Iáò‹þ -áOk¾ÿ‚sx§Áß>(üHÓ>ÁWd?_-~ü/øñwÄ~øUðöÃ⎣ã/^ø;á—†üYâëB·šÖ;™tíöi¯ï´Ý.ÒOS°´¹ø7Çß ?o>ÿÁrÿiÏØ›À> Z~Õ^6ø1âÙàü>Ô~|x»¼øcm£|>ý¶?h¯ |ñ†›­ü3ñ·í%¢Zx¯ÅÖåÒü7ûU|Q¹ðö…ã8ü¡|AŸá]Æ­q¦¥¾eÚWmrÝÍFÝÓ³s¿h½:‰¿.þ¯KÝ~^½OêŠþQ>;ÿÃ~Ã*ÿÁeá”ÿáá¿ð¨ÿá6ý„ÿáÞßð•Ã]ÿÃUný³áü6'ü+Oø^¿ñ›ßð„ùþWÛÿ·âÜýþÿøWßñ/ÿ…^£ñ×ÃÿðR†þÿ‚èüý”§ý¯5ÁZ'ì]âØ_Wñg‰~(üUñÅ퇎>è3þÚP~Ͼ;ê¾0ø“ãýnËÚ¾¶~ðoÄ?xáïÄ Òßàޕ៊ž!ÓâÔß±þüV©k¥“ö[ë£^Õ]knY릥üŸËç·}¿ßO骊ü¢ÿ‚cx3ã„ïÿhË¿üzý¡¾5|+ñ>·ðÏUøk¥üwýžjO€ö 7'Šÿiß |%ñÕ§Á OÿÁOŸã—ÆŸ·³/ÃOŠ?ü ªü.ý±´¯Œ?þø¿ö2ñGˆü3ñWá/‹?`ÝSÁ%½ø¹yûIY|ñ>‰ |;ý¡nÞæ‚Ÿ´_ŽáûÅ­7Añ‡‡ÇŽ|âÍ#á›ör»ÓE»Ù|<ÖÖÖÒÛ¥fÒ{…ÖžvüZ_¯ù²tWÅý¾~øóáεñkÁ ãoü>Ó>6~Éÿ4ÏZxvÛLÿ„¯Uý³4/ÙKÄ¿¼e é^"Õ´]nÛÁ)¢~ØŸ /|Z|Q¦øoÆZ'ögm­ü©Ýé:DÿȲ§ü;Wñæ›â«]ô7íW¯xË[øiã€^°ÑfOüiöy°ü¯ã7|}ñ3RÖümû=ü‡[°ø³û[h·ž3ÑôÜkrx³âòiß ü%yð¯Á—ÃÀiS“MÚÖÞúv}tVNîöÐw]ÏÙ:ñOøf¯ÙËþü4Wü(‚ðÐ_ô]áUxþüŠßðƒÉNþÁÿ„ÛþDŸø£ÿä7ÿ"·üSÿò ÿD¯ËÏØïþ ]sâï…¿¼)â_~Ô?´÷í;ñGàŸÃŸkZ‚>üÒ4+h_±ÇüÛãGÅx|/â⃟¼àVÓöÆðçÄ{}wã—‰<-¥\|FŸâŸÂÿ øžÒ[ÏÙ¿áG‹¾¡ðR?„šßü!þ#øcðËãgƃ(ñ·ì»ðëUý |¦|0Ð>øÆ_¶ü)?‹|-ñgâ¯Ã?Ž÷Ú^ý¤¾x×^Ô< ðkÆšV¡|E´Ó®ï›Æ>ñç…|(ù'ÒOk];&›·–è¯ñ4Ò½…tÿùšô?Ch¯Š?l?ÛÓà‡ì;ÿ îûãœÿÙ^ñ÷ü%×w'ÿ…û?ø[þ] À¿ðŒMâ{þ_Šþü\ø³ý™§øž Cþ/Ù·á×Lj×cþDzðUlj¼Cà Å~]âoø)ÇÃ?xs⇼uð7ö†ð¿‡úßíoàÿ üPÔ->êžøÑñö.°øë­|^ðÃ=Âß|Añ'KÖï<9û3üqñƒ5Œ^øMà}jÃÀ¯e¨x·E×¼KàÝÄR¡&“KG{=5¶éyùomv ­¯¯õþgéEøÙûUÿÁCµé¾µÖ|1ûC~Êš÷ƒu¿‰~0øûàCEý™ñÆ-: |[á_xKâ'ü+±ÓšÝk£·]n—ßm;ÝZàš{?ëOóWíÔý(¢¾ øûxö°øa¨ø'àŸí ¡[üoø]á_ãø…á‡þ ¿ø™ðªoü$ð·ÅÏhš^©ñ;ûODÑ?gOãg.¼y/Ž-<'7Å__7Œdxi_Üéæ«÷•K‹‹³VÕþç£óMn˜ÂŠ(¤E~kÿÁKjß?²Ï‡?cû_1|.Åß´÷íåû?þÈšŽ¹ñkÁÞ,ñ†Ãâ?‡'ñ'üKᯉÿ³×Å/ß'ð¯á—ñvâÏ.Õ¿aÍ_Qñ€>"Y~Ùÿµæ‰ñ“Àú'Åÿ ^üa‚çödñˆüiáÏŒ÷ÿï•áCá©|â]wÁÞ7ðþ…®êß‚|Ya£ö·ÿ|¦|Fð¯Â[ícÈøƒãoøÿâ/†3û/ÂïÙçágÂ={À^(ø‘«|$Ôô/Ú|K·ø{§þѶ:GÆý3áÏüáŸÁ]Ã0|øåûC|%ñÏ„´MÁú7ůÝü ñ?Ž#ø¤þÏ?²ìå­x}â‡À¯ü+ŸDñ¾ƒûþϾ9ñ.°ß ‡Ž,þ xcUx·Â^ñF¿à[ïÒŠòï…ÿ~üb‡ÅrxQÖîn< ­øoÃ^4Ò5èÞñ…þ øsÂþ#Òµ³ðÛâ×€uÍWJ½Òá¿ðíþµqáoÁ¥ø»Bñ…¤œó³Õµ×ªí­×]µßaÙv>^ý™¿àž?¿eOxGÆ?Ò<òðMߌ~ñ—„?5x[Ç^2øÝ®þÄšWì넼QñàÆ±û Yëz¼S¢~Ì? ¾_\|!ý¶~|9Ót¯ èÿäøY¬ø†óÇß ¾ ~®üøËðÿãÇô_‰? õo\ð7‰tOø—Ã>$Õ|ãØxŸÃž?øá‰þñ†‡Ž<9á»èš„|q <ú®톑â5ñu©ôïø?ÅþнFŽy¦ï«µ½åµµNÝÓwW¾½eÓËo—á¢ù~Ó¿±…¿iŸøXûþ2ülø'ÿ ³à›~ο?áO?ÁËŸø[ÿ-¿ácÂ?àÿÂèø9ñþoøE¿áqü]þÈñ¯øWž)½ÿ…‡©ÿÂM­øƒþÿÿÂ#òŒ¿à˜ÿ*ø‹ã¯g꺷öƒ|¡_ø—ÄúÇöV…c©ëzŸöf‰¦_^ÿgèún¡ªÞùfÓìnîå† 6ü?â ØO¨éÐkvÖöÚ߉|?$~ ð׈ü'~×þñ«ámRx4¿éZ6§u¢]jz5Ý׆¼Kki7‡7ürý¡¾-xçź&¿àýgâ׈.þøcÇ|?Õ¿gŸÚ»örÑ|ð¿àW€>Á¢x#Aýµ?h/økX_†ÇÇŸ ð¯Ä_øƒû?UÒ·|ãm ÃľÖ?²µÛ3[Ó?´ôMNÆ÷û?XÓtýVËÏû6¡ciwÐFsNÛ»-6²OËM¶µšWKK†ŸÖý?à~È~ýƒ4M;â¬?<{ûE~Ðß>2izßÁ-WÂ~!Eû<è·þ °ø%í£YøkDðïÁïÙóá_µÇÞý«ÿh‡ž<ŸÅþñGˆ×ßVðˆ< ãï ø#ÆžÄøsÿÜøIð»JøoàÏ |MøØ¿ü ÿ Ý­ø‹àÖ¡©ü0¼ðoÅï‰ÿ²gƒ~ø+àoÆ?ˆ¾# ¢ø¹¦øÛÂúìñðP¾Ð>|Lø_ð“Äš¯Â}üCðËRÓüWñ;NñßÞSø—Ö¾#Ò¼uâ ÛÅÚî‰âè~ŸU°‡Äzχ<'á­/Å> Ò´9']OQÑ<5©øÓÁÚwˆ5[KY¬4kÿxjÓQžÚã]ÒãºÄñWÄ_ø']øiá¯ëÙšßÆ_ü:øueýŸªÞÿÂEã-3áÏþ-_hÿiÓìní4Ÿ#á÷ÂïxƒûC]ŸLÒ¥þÂþʆúMoSÑôÝ@çŸwªè–ÑÚÖZ(êÕ¶wjÏQY_.¾v^§Ï>ý¼ðÒÃöY´ð?ÄŠ:Çì“û<Ãû0|>Õëáþ§âO…SxödמBþÃMŽîItÁ§j'¬ÿÁ+?fO~Ï?´ÿÀ/‰÷ÿ~+ê¶N·Š¿hßÚÇ*ÒíñÅš·i®ü*Õæñw…¼/áèZ'À{#Ö?~øoÀZGÁoèž‹D? u-3Ä>7¶ñWÚÿ¾8|øáË/üvø¿ð»à¯„u-nÛÃZwŠ~-xÿÂ<9â;Ë KT´ðý–¹ã[FÓ.µ»­3FÕõm* ©/ç°Òµ+¸ k{©"Ûøuñ/áÏÆèÿ~øÿÁ?~x‹ûCþÿ|:ñV…ãoë¿Ù:­ö…ªÿcøŸÃWúž‰©ÿfkzf¥£êb¾ŸìZ®Ÿ}§ÜùWv“éMEYµôkMS¾þªö¾êû¡Y_wüÀüØñçü àÅ…_¶_ÃÏŠß¿hoˆ^.ý¼u¿:¯í ñÛU×>h?u{Ù²oËðwÃ^Ò< ðcÂ_<1¢xa<$ÖóÏaðm¼G¯Ãâ_7ˆ|A©ÜGáÉü=ÚüZÿ‚V~ÌŸ¯ÿoû¿ˆ×ÿu‹ø(Ö‰û?é_4»oiM‡ƒ/ÿf?&‡ðÄ¿ dÒü/k©èÚÞ©Úé>1Ô ñ¶£ñÚçˆôk+]OÃóøFçWð¶©úQEÒÌÖÛikrZÖÚܵ¶åV .ß×ôßÞÏø=ðƒ]øaÿ ÷‹~;üløÿâoÿdZIâŒ7ÿl?±ô-ûNm'Aðï~ ü5ø7ðEÙ¨kÚö¡«ø¶ÓáÐøâï·éš?|kâ? øá¾…àßk¢Š†îîÿËðZ (¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+âø)ü˜Ïí%ÿdýÿôõ¤WÛÕñüþLgö’ÿ²~ÿúzÒ+J?Å¥ÿ_!ÿ¥!Kgèÿ#ôÅÿò´ÿ±_Àÿú…ø~¾ÿ‚øÆ_gm/Áþ›ÆÖ&¿ý¨`ýB|:д¯øËÁZW‡?nÙÏľ%ø‹£é^ ðÇ|2ÿð­¼3£ë>Ô/¼[á/ø7GÒ¼9}¬xÃG¿ð͆«ýÿâÿù ZدàýBü?\½&íQ¾Óoî•Ál½ä~(ühøQûU|>¼ý³tÿ‡>6|Mñ·ˆ> ÿÁ=?joü;³¿øwð¢Ú«öƒö™øUá/~Ê^ýš4Ÿ‘ýŸn¼uñAðÏìõ£ø?öÓ»×~9ÝØø'âíϵÙ®×á÷ËÞð±añöxñ?í5âø(oÄÿ‚z/‚nmáÏÄ_ƒßÿàªþ#xsþíwþ ѨxkÁ^"±ø{ñ£ãÿüx'^ño¿hÝwH»ý±üu£ÿÂG®è:œ>ð’|ðoìñ¬_ÿIôU*­tù«'ð(hí£VÒÚ+µmtÛÊÝÞÍ>þ^§àß„ükûxx[áΓðËãw„¿jþÓjø%oįø“À£«ü9ðÁË þ ÉàÿÛþÿâO뻂~ðMçÆÏþԺĿ µ»ÿÜh^5ñWÆ=Cá~Ìþ#ñwÅË?žeß |uм1áSöÃðÿíå£| ñ¦‰ðçÄ¿µ…zWí«§|~ñgíIkÿÏÿ‚Bx;À^ ñ¥ßì§?µ†»¢[_øOöÚð·Ä=WP’ëàô?|5w¡üb~/èß -m¿¦ª(Umu+ïmÑ-7¶É­ìõ m«ÓñÛ»ñgóaû|ý¨|]¨þÎßþ7j¿¶¿Â?ý—¬ôÿx?FñwÆÏÆ«áOØ?þ£ø?áÕç‹t7ð¿Œ~`|g_Ú—ZÓ,~x¿á¿Œ®>#x;ãÿƒu cPð¦­ûExÅÄhOøCgþÖ:Çí¯áÚ£Åÿ?àPü:ŸÃZíeðËà?ü+‰º¯ìáÿÚ_ü5ð:ÇÃ?±Ç†|mâo~&ý²¼%âÏþÒú>‘ñoìÚ¿‡<a¡Cà9¾iUý'׊Ã5~Î_ð¸ÿᢿá@üÿ†‚ÿ¢ëÿ «À¿ð¸ÿäVÿ„þJwöü&ßò$ÿÅÿ!¿ù¿âŸÿOú%?kvÛEkwNï^ÒÚOVÒKе¶òßnŸŽšyŸ”?ðV x¿Æžý«¼âÏþמ,ð‹?`ÝgÃ_²…¿f+ö¸×|9â_Ú“]°ý¤ô¿‹~øÉ¡þÈP]išÎ‰¬é—_²~£i_µÝ­ÏÁíFÂçÅÖŸàšÞoq¶ßÿá£cøÏðboÃkÝË/íCûeØiZ}ü'Z€l¾Ïû|~Ñ×ÞñV¡¬Oý§ð£SðN™û9iŸ<1¬xöÔд ]ýš¼mðëÇ_ðJ‰~ý§~x—áׯÚê*}§º£m¯×McË¢¶—Þ_Ìïµô-­ÿOMûµmCùËýž~ ~Ò >| ðv§~מ¾ø+û<ÿÁ~ j~ŸÆ¿´}ç„4ˆwü£ÇZ_üWNÒ´=KÄw¾ñ†‰¡øÀ.âè¾!ð>û#Éá«O…þ#±ý“üq Çâ'öcð×Ç_þβ^ðÃÿ·—…tÏ„¿³Ï샭~Üþø³¥~ÚºUþ‹ñàïí'ûø›ÄÞøàÚNuwD¶ý|'û{è)ø?û 躷þ xpxá~¹àßj~"ý|)ªMTSö¯[Å;ÉJ×ÓEk5׫]¥¨[o%oËüµ?ü;yûFøÃöÏñïíioðö¡ñ‡¼ÿ µ þÉ¿ >"ë>:ø3mã=wÆß±¯ü÷Å_|¬X\êwš'Â5¿‚´îµ§ÝütðÞŸðçá7Ç‹«7ãO„¾þØqxwÀ¿!éZŠ߉?ô‹zÇíåñ{öOømûC|ø™/¼û3Ádþ üUð‹<]Þ|1¶Ñ¾~Û´W†>ø‚ÃMÖþøÛö’Ñ-;ÿÃ~Ã*ÿÁeá”ÿáá¿ð¨ÿá6ý„ÿáÞßð•Ã]ÿÃUný³áü6'ü+Oø^¿ñ›ßð„ùþWÛÿ·âÜýþÿøWßñ/ÿ…^£ñ×ÃÿðR†þÿ‚èüý”§ý¯5ÁZ'ì]âØ_Wñg‰~(üUñÅ퇎>è3þÚP~Ͼ;ê¾0ø“ãýnËÚ¾¶~ðoÄ?xáïÄ Òßàޕ៊ž!ÓâÔÿ¦ª)ûoîEꞺݯe«îß³wz_ž{\-æþ_=»oø.ÇåüÁŸ|'ûF]øÇã×í ñ«á_‰õ¿†z¯Ã]/ã¿ìóûR|°øaâË?kzÄï |7“öñøíñ»öËñž‰®Yiüc¯Oã=F?‚ÚˆõÛË_ƒ Õõëøú»Eœ¥Í&ûÛ·D—D•ôÕÛW®ãJÊß×êQEHQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@|Cÿ#ÿ“ý¤¿ìŸ¿þž´Šûz¾!ÿ‚‘ÿÉŒþÒ_öOßÿOZEiGø´¿ëä?ô¤)lýä~ƒx¿þBÖŸö+øÿP¿×ÀðP‰þ2ø?û1j~3ð/¼mðç[Ÿãgì•à[ï|4ð•ñGâ6…àߊÿµ·Àÿ…fðÃÍcáïÅ›OxÚëá÷ŒüOaá] †~:ÕouÛ»м1«kÙö’}ÿâÿù ZدàýBü?_4þÐøkãÏhšÅ_'‚|7¦ü[øñ3O՛ĆÚçÆþ2xãï‚´g¿ñ­å„Úv­â…úe§ˆ´è!T¿ð³ëi7ú> ÖúΞË×uuíÕ¯uͪ¶·ÓÉ‚øW¢üÏ_†ÿ¶Î•ðCBý§ügñ—ã?ÆÏ‰ß> x'örñ.…ãOÚ—áƒeßÚ5þ'üsøñ[á\ßµ‡ž'øCûèžø'«k~ø3§ü.øíñCែ>?޼añ¹bZÿÁ`þøšÿIñßÃÿk~8ø!àïÙçööøµûE§ƒ5ÿ¿|qð«Ä±Ç‡?e‰:e–Ÿã¯‡Ÿ´'ˆþøûDñwÿÐY=·Â/|[¿ƒâ~ø{Å—Çð_Ç8<õÄï‡?²ÅoüPñ®»ñßFÒüMñ7Á?³_…SSÐ~(|7‡þ-wöFøÇñ7ãÿÀ_‰~ ³Õlu}>oxCâçÄÙ¼[waã«Oü9ñ?ü"Ð|Oà _Ã/âíÅœN«ðöQñ¦”–ŸjMwㆷ«x'ãׯ‰>-ø‹ñ·á½¦«ñSàçí#àßø+âÂ-cAøu£xá÷ÃOê6Ÿ ~kÚ{þÎÞ ø)â›|.±ñoü$Óë¾=Ýü]¾XîéÏÑ&¾Â[(¥ñ]ßMlík‹µšéù¯6õOO]^ǵ|Iý²|ðãö‡ð?ìÈ~üQñŸÄŸkt­:O Zü?Úm‡ÆíöºñM§‰uSÆ?ü#pš'ÃÿþÅ?|Oãè4Ý?TñXIàý?À>ñçˆõË­JùçLÿ‚´~ÎOðsHøïã/üløCðçÇü;ñ×àö­ñ‹Ãžøÿ “ÂÚ׊~|7Ôí<;&¯ñ iÿ?áø¹û@üøk«øçö‚¿ø3ðs^ÿ…¦|_øwñ;dzn›â/š*ø;öoý˜<=ñËß´‡‹?lŸü_øÉ¡küAy⟉Ÿ¾ Ma¯ßü2øgû^ü!ðœàßxÁðV‰màoÛ3â¶¡á¯„ÞøuáÍ_Ä~ðgu-*çÇÚÏÆ|W.ÿeÿغëáÿìåðø~Ðmoû*~Ï:Oì÷ðoÄ|XøR|G£Cá?~Êßþ|XÕELJî<9¯|Qøwñ'ö9ø5ãOéxvo…ZÍý¿‰to|.ñŸ„uÖðå©É„Ú÷nÒ’ÖÏšÚu|©]lÞ—µ‹¿/Ï·ùþ+Sgá§üûà÷Ç/hW>|Qø÷ñ'UÖþ$iZ—Á„¾/ý–üQâ? Ø|%°øEªxûÄ·¿í%eû'øŸDÐ,h_€sÃ_Ú/Ç~#ûÅ­7Aÿ„|xÀ_t†gÂOÛ'ÅšìMÿêø¡ã¿‡ÿh¿ÿµßÂï€ÚRh? m~ xsÄ~,ø«â¯ÙOÄ¿´_޼KzŸ~!ü øWáû៵›˜,µý.oßMÑ|=á÷K¨-íð{áßü"¾)¶ÿ‚ƒüRÓ¾;ø_þý<þÒ?ð³¿eÍâ6­à߉ß𭌾¾ñ—Á¯~Ì^ðN©/Á?ƒßaø]û?xUƒ]øuÿ TZÂø¯â_Æýoâmàï‡?²‚|û|:Ò¾;è×'ì1ÿ·ü*[­Câ‡Ãyu_Â#û5|Iý–tßøX³ÛXÚZjÞÃïŠ> Ö/¿á±ð›ã+=PƒìÚ%½ï‡µâ­¤%½ö“ÙJÊö^ën6Ú[ólƒ]5_ðü½´¾öõ]Ï-ñ7ü»ö^ðÕøâk/xjÓÄ𨵿„:?u‚ ¿áw|0ý 4/о-øñÂ^>ø™ñ“Á¿>x'⃾ümñ&ƒ ~ÑŸ>ü[Óá[]øSÅŸ ¼9ñÆß |ñÔ>ÿÁC¾ |e›àk|/ðÇÅhÿtOkgÄþÑ|'âŸ|=‡ÂŸOÀo6±¨xsÆÚ«üZÑ-øóÀŸ³¯Ä¯†¼gâºGì“ûø[JøZ¾ýªußxÛàÁ?Ùà‡ÁÿŠZ?Å€º¯Œ¼¥~ʾ ý¢þøCÆV:GŒ¾ø§áŸˆ|mㆵWÆŸüE>7ø{âŸÜi^!Óõ¿x7À¾6ðö‹â«?Q—áOìë}â?‚¾'×?l?øžûàî·Œ.âñ/íàmf‰,¯üq«éÞ>ñ÷ZqÔþkpj~"éú®û-j³×üoð«Å³þÌŸ|%ãÙ?@ðwÀŸ ·ô„úêÔ»>–ïk;ï{®QßÍtÛåß×îjÚ›7?ðPO†v~-~ЇïŠ>ð7ÂoMÓÖˆZŸÀ߃ö8Ò5o‰—¿­õÍâÆO_þ ø[Òü}¢øŸÃ^<ø!ñçâgÁßÚoáˆü:ÞøÅð;À9ñWÃÏ øËËõ?ø*÷Á Ÿƒš¿Ç/…_ ~6~Ð> ð'Á?|øÓ7Áë¯ÙþóþŸÃŸ x§ãu]OÄZï>>x Á?÷øÛövøýáÍ"óöjñgÇ] Äð©õ?è:ΣàŸü&ñ?Ä5ƒöoý˜,!Õu-'öÉñ¾Ÿñ%~(ø⯀>1Ïñ›à§‰~ |-Öü)ð«Ä¿ý¨~[|Uø—añÇãOí!ñ{Å âßÙú×öñÇÃohŸ|GûQüeñ/ƒôÿŸÿc/øÞˆÚÇÃÏøÏÃþøwñÃmS‹û2Ýn¤—-½ëé­¾ËM7'gT+üý-åmûßî¶§Þ/ügöO×hþÎÆ·âï ë<kqá­Cá·ÄOø³âÀMÆZ÷Åøötø_ñÆÿ¶]Ž·á»/†ŸbÒµ~Íð?Ä ÿÁcðÏž2¸ø™ðM>'ýEðö„‡ãï‡$Ñ5=mõŸÍð«Qðå„&ÃÀ"ð+hþ4ømñGâ¾,èŸ| ñ ÇÇø…ð ÄßþAaáïxCǾ<ð?ÅOÏðú_ž´_…?³®…â?ËaûaøÞÃá_е¿Œ0µøá¯ÚÀßþøOâÇ»ÿk<}áÿü/Ó¼ûJßk~$ñOÄ¿‰¾6Ò´|{ñoþøãÆx»áŸ„¼¯|3ø'}ðöø¤|ø`,4¿ÚÕ¼lšž·ñ;Æ63ñÇìÿeaã߈|Gáßê~>Ô<7ðçÀŸü#à]oK¸ÑuvM࿇¾xƾ#ø…ñ3â·ÅÏ |Høßãm[â{Ä ­îÂw²ÝI÷òV{]j¹­gËq§Ý¯–Ý>}tõסö­æ𻾠Ñ]øaÿ…÷…?ùmGü.ïƒôW~á}áOþ[TrOùeÿ€¿ò×uýï¼ôú+Ì?áw|ÿ¢»ðÃÿ ï òÚø]ß?è®ü0ÿÂûŸü¶£’Ë/üÿ]w_×ü:ûÏO¢¼ÃþwÁú+¿ ?ð¾ð§ÿ-¨ÿ…ÝðcþŠïÃü/¼)ÿËj9'ü²ÿÀ_ù×uýï¼ôú+Ì?áw|ÿ¢»ðÃÿ ï òÚø]ß?è®ü0ÿÂûŸü¶£’Ë/üÿ]w_×ü:ûÏO¢¼ÃþwÁú+¿ ?ð¾ð§ÿ-¨ÿ…ÝðcþŠïÃü/¼)ÿËj9'ü²ÿÀ_ù×uýï¼ôú+Ì?áw|ÿ¢»ðÃÿ ï òÚø]ß?è®ü0ÿÂûŸü¶£’Ë/üÿ]w_×ü:ûÏO¢¼ÃþwÁú+¿ ?ð¾ð§ÿ-¨ÿ…ÝðcþŠïÃü/¼)ÿËj9'ü²ÿÀ_ù×uýï¼ôú+Ì?áw|ÿ¢»ðÃÿ ï òÚø]ß?è®ü0ÿÂûŸü¶£’Ë/üÿ]w_×ü:ûÏO¢¼ÃþwÁú+¿ ?ð¾ð§ÿ-¨ÿ…ÝðcþŠïÃü/¼)ÿËj9'ü²ÿÀ_ù×uýï¼ôú+Ì?áw|ÿ¢»ðÃÿ ï òÚø]ß?è®ü0ÿÂûŸü¶£’Ë/üÿ]w_×ü:ûÏO¢¼ÃþwÁú+¿ ?ð¾ð§ÿ-¨ÿ…ÝðcþŠïÃü/¼)ÿËj9'ü²ÿÀ_ù×uýï¼ôú+Ì?áw|ÿ¢»ðÃÿ ï òÚø]ß?è®ü0ÿÂûŸü¶£’Ë/üÿ]w_×ü:ûÏO¢¼ÃþwÁú+¿ ?ð¾ð§ÿ-¨ÿ…ÝðcþŠïÃü/¼)ÿËj9'ü²ÿÀ_ù×uýï¼ôú+Ì?áw|ÿ¢»ðÃÿ ï òÚø]ß?è®ü0ÿÂûŸü¶£’Ë/üÿ]w_×ü:ûÏO¢¼ÃþwÁú+¿ ?ð¾ð§ÿ-¨ÿ…ÝðcþŠïÃü/¼)ÿËj9'ü²ÿÀ_ù×uýï¼ôú+Ì?áw|ÿ¢»ðÃÿ ï òÚø]ß?è®ü0ÿÂûŸü¶£’Ë/üÿ]w_×ü:ûÏO¢¼ÃþwÁú+¿ ?ð¾ð§ÿ-¨ÿ…ÝðcþŠïÃü/¼)ÿËj9'ü²ÿÀ_ù×uýï¼ôúø‡þ Gÿ&3ûIÙ?ý=iö/‡üEáÿi‡[𶻣x—F÷:QÕü?©Ùk:`Ôì­ìnï4Ó§Osh/í-5=6êæÌËöˆ-õ ¥#»¤øëþ Gÿ&3ûIÙ?ý=iT“U©&š~Ò=Ä„ö~ò?A¼_ÿ!kOûüÿ¨_‡ëà¯Û?Ãú‹,ÿeo ø«DÒð]µ¯‡üGãh>I©+[˧x/Å_üðîëÄÞ¯­x{Sñ¿Üüÿ‚IÙüLѾ Þ|ÿ‚tZüdñˆ5Ô¼ዟø'Äšþ¸¿0~ÊÿðI/Š?e‹ÿ…ºõÏìÿ/ÆÝsö€ÿ‚)øÿÄ|-7ˆßûágüá×üþ5ðV¯âë߆Ú?‹uO'Å¿²oí/®ü ðåþŸ7‡#ÿ…¯¢jzµï€u?xþ{GÜÿ>Á$þ1ø«âw~|ÿ‚t|Tñ·Á?/„þ3x;áÇï٣Ç*øGâ§Ô|A£§†~'x{Ã>©«ø Ä «øOÅZZèÞ*³ÒuÔ|5â lntmF+oøðötøãñ ZÔtø%ìPŸ²ä?h_€šOÅû/|ºøË¤üBý™¾&|Kø-ñÄ?gíkà†<-ᯃúßÅoƒ=ð§€|OðËöƒøÙñ3VƒÄüE⃠ÐüUñNïàwoû~Æ_~ x«öS³ø»7ÁûOþÀÿ±Œ?`ÿƒ>!øqã¯xÛÅ_´o…|]¨þÉq?Ư‰Þñ?†ÚGìÝâ 7Hý¼+|¿ü+ã¯ÚgN½Ô~.xƒK?¬í¾iÚÇÅ.‚ÏöEø§©~Ýžý¤µ…_²ÂïøD> xמ.ýª~/ˆü=ûSþן 5oƒ¾?øKðëöYý£¼ ?Â˲ü?økÿ Âßê^4Ôÿjï>ñÇÄ_ÙáGŒt/ÙûáWü%þÐÿg(ø«¯Á>ø/âÏŽ¯¾Á:üý¢íþx'öFñ£û9ø«ã§Çß~Îz¡ñò¦Óm¾øÁÞ6×5MSâ׎¯4]GÃÞðÄ+ë=+WÕü/q¡Íïþ ø ÿ“ðŸ…[Ç^*ø1ÿèðׂSļ&þ1ñï٣Fðªø«àžñXøÍá–ñ££Ûi â„zGÁÏ‹º§ÄíÞ GÀZw¿ˆ÷Þ*¶Òm¼âyt¿ÍƒŸðGŒ_ þ|<ð‹IðþãÅ¿²gÃÿÙ¿Á_~"x×öÒý»?h/ø_¿ðÌßµ?ìwûOZY^ü+øÁ,ÿ¿àš¿þ7ê±€ü;ãÿ~Ï¿kOø@á=ðäþñç„¿fØ~þÑœÿüþ ûûhj¿²ÇŸ‡žƒàÿ¾ ü%ñüö©ðv“á8þ+x·ö ý |Uû|~Ê¿ðSáï‡^øm£ø1<-à?|ø­ûkYü)Ѽ#¥ø“ãN£ûLøìß,|Eû·øO&á=;á¶•â8~!ø¦çÇ÷žðŸüýœ~>é?~|Fø»áÙƒáW‚eÙƒãìðgÃ_²þ¯ãI|+ñ?¿üiû.k¯ãWøA↾Ò?dOøHý‘ü+aà¿€ø•ûTiÖwÄëï ŸŒëmðN×þ+|ÑðÓáGÁïŒ1Ô¼Oðëþ ûx‹öXÒ?h‹?³Þ¡ãÏ7á6‘ûL[ë¾;xËö`ø¥ãÏøgMwöVÓ>ËðÿÂÿ>ø»Å ý°åñÞ·û=éðžxwÀš¿Æ{ý3ön½ö ¯Á,tïzÅö‡ÿ©³Ò?f¿i^ý¢õK­3öF·Ó¾ø«]ñV¡à]Ã?ï¦-¾øƒYñ¶“ªx;JѼu.ƒ¨ê>*ÓuYÛM«ÙÜYÇÛüøMûh|ñµðoÁÞý˜5/Ùó]ý§ÿh_—Ÿ´‰¾*üV¼øË…iOÚƒâ_ía㯇¶ß²Ž—ðGFðJxƒI¹ø©â€~øƒ/í‘6cžûGk5é-ï¿f=Gâ þ ‘ûSê>ý‰þx³VýŸô/ÿÁ:~þÊ_³×ÂOøwâ/Ä_k´Âσ?·ü7ö‡ñïÅ¿ˆ¾Ô¾ ø>Ëöqø'Ã/ø'´ø3áŸ~ÒžÖüwñ¦ë?ü-áÿ†±øÓâÕx{þ…|{ã©t?ø%L~ øWáÿ„ž,øŸã4ÏÙ<+ðã¿´í7Xøâoø… Gƒü?ñ«HÖt}Sá&³âÍ;Nø§jÚm÷ƒ®u›këYeè<;ðËþÓâýâ/ˆ¼'ðûþ ‘âüøá‹õßøOöWÖô…ß > xŠ^ø—ñSÓl.l¼ðÿÆß ­®~"øGÆ^&ŸLðç‰< o?‹´mJ÷ÃñI¨/Êþ,ÿ‚_ü}×|Ið X³ñÁøí¾þÓÿµßÆ¿Çs¯øÑ'¼ð¯Çïø/¿ìEÿQðvŸ£,_æŽãÄoìùû5øëÁÞ&µ¾—NÓ¬þ2êÞðö—ªë> ¾Ö>!è=©ÿëý©ôé4}káïÅO‡þñƒÿr–æM Ç|¬x»ÃŸ·Ïü_öý¸¼'ð§Oø•áŸÂgð_þ/ìåð³âìÿñKö€øy÷Å?Ù“Ç4ÏŠßô_‰þ ðVª(´\ø{þgðÏFøÕy¡ÿÁ*m~ øÃþ&ñg‡¾-\韲4 õß ø/â„þøÇÄÚ7%|-ªx¼{à_†>&ÖluYôíâ<'à½Ræ×Äž#ÑôÛÏ?ý«áÿ‚IþÊž øaðËÄ?³‡ü£Rý þ.ü`ý•þxösÖ|+û4x/ã/Š|+ûJ~Ôýœ¯>'xOáý÷„5Ox«Ãÿ-¼OãÜ®áy´í~†~&Ðeñ‡c·Õ ø{ñs <#sâßxŽËþðKþ ¡ûh|øðsö\Ñãý˜ñ¦‘ÿû‹Äžøƒã‹õu‹ÒxsÄ?4;o‡ËâO€}ÑáÏÙ×öñíOñ“öhÿ‡þÉŸð©?gÿÙ§ã§ü&¿ð¢¾\ÂAÿ ñö±ðü"ßðŽµ‡û+þÿøeÿíoí¿ííKþøN>Áý‘¢Â3öÏsúWÿø$œöºÄo„¿ðJŸxÛXøÁ¨|ð×…t¨f~}wÅZçÆ_¾x6Ôë¾ð6¯/ƈº¿À‰^Ô>Øh–£ üeøgñ¯á…õ¿ˆ·?uÿ^Vµý›?jïÙ‹ö•ñÇÄoÙáçÁÿŽß |{û0~Î_%ö½ý¾j­/ã/†üUðGãí­ñ_XÔ/~"xÇöký¶ümñ?Ãþ"¶ý«´Ë ëÅß´íGÂ0xN_ éšRøZ×ÃÖö0/üK✾ÿ‚¦}ºçö»ø›ûf~ȶ'ìÑðÇ3Íâ;cáÿü4÷íÅÿZý¨çÒ|]âi¾xSáþ»áÿÛ#ö_ÿ…‹aà¿øJ´üwð—Ä[ôYxáïˆ|P÷>ðþ 'â?Œ¾,ýœü=ðcþ Ñ®þÐ~ðý·‹|?дÿŒ ØøÿÛñÇÂÚâÛâoˆlü?âo‡~ ý§ÿk¯ÚÇÀ¿õŸÛ#öÚñ~£7Š¿koöŠÖ¯<á?ø'Íöµá¿Ø¿ö|ñ€ôïÚÆ>¹øÿ£ø£ãF£ñ¾ñ6½/ÁüDý¢õOü÷ùþ~Úþ7þÔ:çìéáÏÙƒÅÞ ý®~0xGã^©ñ3ã_Å_ŠÞñWÀX~Í_³÷ìµ}§éÿ³ß~ø³Hý¤…â-Wâ_Å/ÝXEâ‡ÿôÏø£Ã:î¡ã/iúG‡,´hZÎ¥–¯§ÏqÏøgÃßðDi×:ǃ´?ø%O‹4‹?ƒþ,ý¡o5O 韲6½§ZüðеŸøëãÍö—Õ´üãox‡ÁÞ,ø—,«à¿x«BÖ|=¬kVz¾—}gÊÿ´—ü#ö§øÝðOâ×ì±£jß³þðÊÃâü'ö…ø)ñSø‹ñ_øûâŸü_áüÀúWÂOŠ_­~ Éáÿ„?þxƒþ âgÔ>3xOã‡Çø¿Gø¡_[|ðíïÅíCJøIÏÿÁM¿àŸ¿|{ð#þ ã¯Ááÿ\øÓãí_ûTø;áï„ãñ§ˆþ&x³Â¾#ÿƒy¼}ÿÐð÷ï øOGðeäš÷Æ wöƒ¼³Õ4oéw—Zv©ðöêÚúÇÄSøÚx¼À‘ñãÅÿðI?þÊ?kOÙÓö|ÿ‚TþÕž øWáÿÚRÕ-< ªþÍ ‹üUðöUø³ûN_|$ømâ/ü,ø³¤x¯ã¡¤|>ÐïõÏ\Qð‡Á­[Æß¦“Y¶øgàŸ}A©ü2ÿ‚4èž;ø¥ð·Yø}ÿÈÒ>&üø¨|Xø×ðëSðŸì¯a㿃ÿ 4Bñ«ñ/â—„n¬"ñÃÿ‡úg‡üQáwPñ—‹4ý#ÖZ?ˆ´-NçRŠËWÓç¸ø_öÌÿ‚h~Ú·3üRø£ãÿf‚¿¾ |×¾Ùü5ðÏÆ¯Šß>éþÑ¿`Ïø,ìûà_ˆW?5OÙŸàÿ‰%ñ‰þ2ÁP|=‹>Eð\iÞøgðYñ¶ñâŠ|acðÏ@çþ0Á>1x÷Gý¬¼£IðÿP²ø‘ÿ7øðSãÄ_ÛKöìñgñOþ àOÚÛÃúW†`ý­e‡öEýœ?á[Íû`ø›Á^"ý¢¼'{û@øÇ>ðg‹¼ImðÃ_hCÄ?@?Yü'ûÿÁ9¼{á_ øëÀ¿²oìQãOøÓÃú7‹<ã üøâ? ø³Â¾#Ó­µx›Ã>!Ñü+y¤kÞ×t‹Ë=SFÖt»Ë­;TÓ®­¯¬ng¶ž)[ ÿ†ý„?èÊ?düFÿƒŸüÆWÖôPÉðÀ?°‡ýGì‘ÿˆßðsÿ˜Ê?á€aú2Ù#ÿ¿àçÿ1•õ½òGü0ì!ÿFQû$â7üÿæ2ø`ØCþŒ£öHÿÄoø9ÿÌe}oE|‘ÿ ûÑ”~Éøÿ?ùŒ£þöÿ£(ý’?ñþó_[Ñ@$ÃþÂôe²Gþ#ÁÏþc(ÿ†ý„?èÊ?düFÿƒŸüÆWÖôPÉðÀ?°‡ýGì‘ÿˆßðsÿ˜Ê?á€aú2Ù#ÿ¿àçÿ1•õ½òGü0ì!ÿFQû$â7üÿæ2ø`ØCþŒ£öHÿÄoø9ÿÌe}oE|‘ÿ ûÑ”~Éøÿ?ùŒ£þöÿ£(ý’?ñþó_[Ñ@$ÃþÂôe²Gþ#ÁÏþc(ÿ†ý„?èÊ?düFÿƒŸüÆWÖôPÉðÀ?°‡ýGì‘ÿˆßðsÿ˜Ê?á€aú2Ù#ÿ¿àçÿ1•õ½òGü0ì!ÿFQû$â7üÿæ2ø`ØCþŒ£öHÿÄoø9ÿÌe}oE~T|Pý‹¿b? ëWÒZþŲ•ÏÚuë«%Š_þ ±¶´¶±ð§ï"ŠÒÓAÓô{XüË­búyÝá’Idã>)áÿÙ÷ö ñe„ú§…¿cÿطĺe®·â_ ]j>ø_á}fÂÛÄ~ ñ«àïø~{½:þæÞoÂ~.ÐµÏ x—J’E¿Ð¼G£jº©®§§]ÚÃî·ÛxÆÞñçÁMcö’Ö¿gøåu;GñÇÃOˆ?¼ ñ£ÂÞÖ|3ðêÎãYð6©ã­ÅvÞ¼Öí´­wö>1µðÜšÞˆÇTÕ<¬ø{ÆZ6—âñ÷þ Õû þÇ¿ðLŸøO4¯€¿¶·Å/|>ø‹åjïÂ_Œ?þø£áÍŸŒ­ÿ³í¡ø‹áÝ7à |­øwÆÒèšzxkW¾Ò¼Ao¥x§B]2húýß„| {áo.«Ÿ=[JJÓ÷b¡t×_zÎÚí¿Tìl­¦Û+ë×ݶŸwôõûwþ îb?°ÏÂÞ›§@~5~×&?FÒôíH±‹þç‰<»=+EÑíltMµLAc¥évVzvŸj‘ZXÚÛÛCIÊÿÁHÿäÆi/û'ïÿ§­"ºø'§ü˜·Â¯û-µ¿þ¯¿×/ÿ#ÿ“ý¤¿ìŸ¿þž´Š™½¯úýý*!ö?íßÐýñü…­?ìWð?þ¡~¯ˆjÿù ~ÇöoØ¿ÿWN_ox¿þBÖŸö+øÿP¿×Ä?µü„¿c¿ûH7ì_ÿ«§@©¥þóúøÿ6'ð|£úKþÈŸ§øüž,ýª|cñ³öŸÓ~4è_¶ÿí»àk9ü3ûJüe³ø5'Ã?Ù¯öóøûû>xáµÏ왪x¿Yý_Ãú·À…~ø[âÍr/€°üB¾žóYøÑ£øÛAý¥®,~6éÞA¨ÿÁ[>)Úü:ø)ãûOÙOáýÏü6Ãÿ_¿am&ãöœñŸü&? >8~Ôÿ±'ìÑcuûY_Åû1^ÿÃ5|@ðÿü<à/nüð~ÏöÄðåÿö/ÅïCñ ßþ?kߺ ø›þ {âÏÚVçTÒí¿iû]r×öŸñg†e‹ÄÞÿ‚™x/þ Àߵǂþ7ë>Ö.m´èÚüòóãçíw¡_^xOÅ–v3ë~=ý·çѼuà]gĵˆü=âS×þ+ÿÁ'fü:Ô¼à#ñáoöÄÙË[Ó5kŒŸ´'Š¿áPü,øûSüý¥õß²m†¡ñ«Oÿ†&øñþW„<i¤~Èן|9à?øE~øHð¶£ÿ #ánƒ¡{Gxßþ Ç⯅0~Ó^ø•û6x~Ûã'ìû0~Þ>/øgÀßõü3¿ñWìkðköý¡|5ð÷á·Ä½àw|SâoüZøSû|ü9çÄ|"ð£ðÃâƒÖ4ïøsY×g_'Ä$øû|~Íÿ³Ý¾‰ûQøí¼âícàŸüÿöÿ‚axXøéàuøO¢ø3Á¿ðµhߺg‹5éþøÿã¿Ù“àO„%~Õz‹«øKâßí;ñ Æß·OÀ<_û&kþ?ý£¿o_‹ÿ>3i(ñÀÝ#â]‡~üø¥éŸ´‚~&~ξ¼økñv†ß²×‰~xCØ>5Á>>x×áÖ³¢|(ðßÃÿüM_ø_³øÇŸôߟ|9à]cö¬ý©þ~Ø´'‹´ß øö‰ø 㫈÷ǯ†>ø±ðŸâ/¾0øÇ³—Å? ø7Æ_¼Eá / ¯†50€,mÏÛ‹ÇðPO |Ñ¿f¿‡öÿ¾|?ý»>øçàÿ‡m?Ü~ÉÚÆ±¢xcþ³ûIx'ã×Ä_ŠÚçìËà߈ÿÂ)ðÿö¨ñ7Â/ÚxOöHø·ã½âOŽ'Ñí¡Ñ>øãâOÅ/}ÿÛý±|wûkꟵ—ÅO±ù?³”¿?e¯~ˉâ;Lø§áŸ|uÿ‚qþƵˆ~xÿÁ~ðľ°ÿ„wÄá+³ñwü-ïŠZÆ¿â?ˆ5ðg‘á|2ð5÷Œ:Ø‹þ Íà¿Ù/QÖ~'ø»Æþ ø×ûHø«ÄõŸü\Ö|Wñ÷TÓ¬tï‹Þý•üâ¿ øOMý ÿhoÚsâ´þÔ¼-û~ÎW7?>;|iñV⯠x™~x›áçÂïéß |3첟ÂßÙ;á ×Å?†?²Ö…ÿŸü(øQ¿³ÅO éúŸÄ™4} Xø;û8ü)Ö~ÚjvÞ3Ô.´_ü@°ý™~%|ðþ»ñ²Å¼Eã¿ø@ø[ðãâ7Ä/ÿ“ð§†|ùAûèþ ý¹4_íñ—öŸÖ­¡ÿ‚PÁ3ÿl™¥øcû[þÔ³ž£ª~Ðÿ·§Š¿mþÓ^1ñ±û8|]øO«ø—Ãþ%Õþü?³øqð³ÄÚŸÂOÙÛ¾_þÎ^øOàKXðö¡ú?ðSñß…n/ÚwàF·ñKâÄÏ xWö@ÿ‚~|^]Câ.¡£ê:Æ£ñwâ‹m¿‚Ÿ¾ Akáý Ã^ð7ü, ~˵O|7øOáo‡¿ôïéÞ.ñÿƒ~xWÅ¿>#ê¾*çüÿÉø!áσ_>x«Äß.uÙßàÿ…¿güSøñ÷ö•ý޾!xÓàÂ9õM'à„>8k_³Ç/‡?üAð×Á7†9u\7‚àø™â¿Œ¿>|5ø#¤|cñ'ÃëSà”Ÿ³Âý:Óöîðw|?¤þÏŸµÁÿø'ìãû/è>øIâ‡ß|ð ÿÅZŸ…ÿcŸi¾µÓo|Ieâ|dýµùƒÀþý¬u†ßðTŸƒ~ý¡ÿhÚ3âÃ?Ûÿà‡ì(Ñþ:èZß¾ÓeûHü@ð×Å‹sÁâoéÚÆ§ñOÁ>øIðëÀ_ü#â-7Ä6~ øSñáç‡þ|Ô>xËá>§àŸü?ñßÃßüRðn¥¢|M¶“ÅÒüã_Ù‹ö 𿃯|>–Ÿ´¯â†<þ#~Îÿ?oˆŸ¶N™ã½_àO‡>3xÇÂ?¿h¯Ù·â‰lßÂgð7á¿ÁÒ>|eø«èÿ,|û|1ð—‡uïi²„"øƒö|ÑüAû[Aÿ›ø‘/Æ_Ú}ÿio‹¿³ìû}þÛ^6ðgíoûPx/á.‘ð÷¾Ý输öcø{ñvÛöIðˆ?l¿Ú$hþ‡á÷ˆf½/áŸÆŸÙãáŸü Qðv£áß>Òð‡¿gŠ_µÿ…?jߊ¿ü{ ~ÁßîµÚ;öFÑþü]ð.±«éúÿíUûIþÍþ!о x·Åÿ³ÿÂïêß õÏŽCöÕð7Åÿ‚wþð÷Ã/†ßþ ø¿â—í_¢ü.ýªÿG¼ðà׿^øÇá¯ÃßøW¼ø?ðoà YøNô é?¿gÍG↩ðgáï†| §\[ø'Â^ðÏÆ_ˆÑhÐøcÃÚDï§kÖÚ=ýÅæ‘áß Xèß0xÃöiý‘?k/Žß¼ÿ í§|mø=ÿ ÷ö\øÕ«| ý¬mÙWÉÿ„WÁÖ¿´¿Ãx¦ÃàÆOƒžø‰ÿ÷„¿koøMtO}‹Å_Ùð´5ÂC§§k:ŽøÃûS~п~~Í^9ý¸~üqøÁ¤þÐ~/ý§ÿ๟5K­gâ_&üSâøþ/ühOˆ^¿û@üý§á¬[öBý’5ÿÚâGÁ/†ÿðÅß´ïÅ|Rÿ‚ þڵ쌿 ¿à±ÿü}w®þÚV^.øÛûcéŸõ?‰¿c‹Ý3àŸÃù|kàOøNü§ëÑ|=ðŽ™â«õþØ+öN¿ñß‹¼y®|)ÿ„³þøX³ë ¼s㯉><ýœmuŒZ?ˆ¼?ñ‡ÅÞý”üeãsöeðÄ‹Ú/þ$é¿þ"øá'‡|wñ*×â÷ÆØümâ-wþgŃã~Ûþ ×û*Áá]gÃWÆ kWÖ|A៌>)ýªÿjï~ÔÔ|§x³Eð­·€?k¯|lÖ?j?†~Ð4?ˆ¿ô /Âþ/ø_¶¾øÕñßBFGÇO‹¶~4?b¯Š¿ çýž>èéâê÷??hÙÆËÂ_?h߈_´7%çüû~Éß?á ¶Öþÿ`øÀßü9ð‚×À_ üuñ'à¯ÂÏüðoÛcðÀoŒÿ >øÇÀŸ ¿hÙÿÂVZÇŠto üøéá?ˆŸ¼?áÏüLðΑàË?üOø…¦ø”åÿ ÿÁ@¾>üTñ§ÃŸ„³ÁýWâ·‹>0ÁC´_‡:WÄŸÚŸÆžø{«|ÿ‚s~Ôý¾%|Kñ·Ž|/û&|Qñ'ƒ¾0xïã'¼5àoÚÃ_ø->®¹âö…ÒüS§XxYùöSÿ‚§xƒáïÀ/ø%—‚|oá_|~Ò>*~ÌðMO~Ð?ôÝSö ø‘ñ3ÀŸ´¯ím࿃žð¦›ñoÄzì­ãÙsMñ¹®|^ø9ñKDz|yý»~üo¾ø{ñJ?h |tø—£x·àïÇÿÚàGÅ=;Ä´ÏÅ=oãwÇÝ6×ã/Á_Š~øµÃÿŠÿµÏøOüaðŸþSð³Qñ‡>^Âü+‡ á_?±ÿ‚_þÅšGü*+oü:øá_üÿ†tŸÁ~ðoí%ûNø7áf¯¬~ÉŸð®ãýž<]ñcá'…¾1é ¾>|@øieðƒá&¦üEøëá?ˆþ;Õü9ð«á§†|Kâ-kÃþ𦛤yÿìCÿ ñßíUÿ Ùsñ3öiÿ†|²ý°¿d ¯Ûöµ‹ã.ñoÄsøÀßðÎúWÅk?ŠÚ~‹à¯ xÀkñí=ð¿YýŸîý„î¾j?ðY/~Íð¤tߨçþ7âV§aÿ Á+¯øc„ïÿ §xsá¯Æ-sÁ¿á-øQá/ ÿÃMø;÷ûáÇì¹ð'á'ü(/øWÞÿ„þöÖeÏñSxÇUÿ„àOˆ?áJÿkøþ'~!Ô¿á&û_ü3¿Áßø©¼aÿ ŒmÿáÿEñ ?ðx§ûlÿ†\øÿ ëþ?ü ßñoÿá ?á¨ÿ°?á&ñü—oøjømoøNµá!þÚÿ“šÿ‹—ÿÏö—ü!ßó&ÿÂ=ÿ ÿþ)Jù~ø(£uá_‚þ!ÑþxƒÅÚ¿Æ?ÛöíýŒt¿øOÇþ_O¨þÅzwüúÇľ¼ñÕ·€¼ªxƒã5Ïì+£xKÆ>1øsá_ê?-¥ñÅK#À÷š§ˆüþ×þ %ñ–oƒ_>'ÙCÃúÏįŒ¯Âï^h´T mõ2}?KÓ¾xÇ_>|4ø‰áïÚÇ?5 KöfðOÀ¿Û‡àìá]7öÐøqñ'ö[øÉñ³à絯ٮûö”úÄðMïØ—Åßâ׌>øÆ^)_|Nñ6¥xÇÄ>8ñgÃ?ê?>üGøcûAÛx?ை|Q©|ðW‡ÿi/ üZñÞ¥ûLøOÂ^Ñ|+ûGüBÕ44oüVð¿…øâ7ÀßÚ'Æ> |Aø{ð‡àÏÃÏx\ðOÁï†Z…?(?l_ø+ÄŸ|ÿ‚ü?øOû=~Ðð—?gÿø)§Ã‡µ‡¼-ûXèúÇÃߟ²'Â/Ú'GñÄ|DoÙkÁ²—Ã߇éñOàgŒ¼7ð£âÁïÛ¯ãÅ×ñÞ±ðKJÖþøž#ø¤ü ý_ÿ‚|ø³Å^4ø ãícÆ>&ñ‹5{?Ûþ má;=SÄÚΣ¯j6¾ðü“ö¯ð/|3m}ª\Ý\Ááÿø'Þðw„ôh¥];ÞдohöÖzF—cgã?ø''ì{ñQø©yãO†^ ñ‘ñÃÿ´ü>½øÍñÍ~ isüð¯Šüñ¿Æÿ þÛüJ‡àßÀÿŒü7ñâu¾9|ð/ÃÿŒ¾'ŸâçÆMSUñÝίñƒâe÷нÿá_À†gñ\¿ t¿hÞ4ñŒüY¯h—>?ø…â? Ÿ|EøËñ{ãÿ|M£xCÅ)Ö¼-áxËâ·ÇOˆÞ!ñ6³á}GÔu:ëÂ~¿¹ŸÁ? þxsÁà?ÿࣞñßü»Zð,´7Áÿi¾0~п°¿†?d=âÖ¬þÐÿÕÏÆk›ÿ‚eþÙŸþÿÁ+¿l_Úçâ߈¾ ~Ñ^ ý›¿gÿÙÛ㥶ñâoˆõcÅð‰ÿÁ¿à›ß´‡‹<-üMŒï|5ÿ #âoˆ<{âÿkqéϛ㿈^.ñk~ ×u™5?Ûû/ÙsàNð'áìÑgào'à—ÀøgOøU> ÿ„›Æ2Â+ÿ ›ã‡~?ýŸÿ⣗Ä/âÝsþü(ð­ÿ½¬ÂUýöÿÂG¦jšÕ–£çþ ý‚¿dï‡ÿ³ßÅŸÙ[Â? ²>üqø¦ü-ø¥à?øN¾$ßÿÂQàM#ögøiûiúü%ŸŒo|g¢}Ÿörø?ðëá×öŸ‡|E¤kÿÂ;ÿ tú„¾:Õõßê` xoöÜøÙû@|]ý˜>þÍõÏÚ¶×âˆußhÿm?‹¶³®ð‡ö@ÿ‚eøÛâÞ¡ðßâLŸ³/Å?øKû7Å¿·gÂü?ø[áOÙ¿À~ø•kàï‹ß´_Œõ?†¿¼o©xÆ?/þÅðS_Œ¿ßâÏíâ¯Þ ›önøÏûOÿÁ8mn5m{ãô Ô~ê?ðPÏØ3þ a¢ü(ø)û>ü>“ÂsÉñÃþý ÿhsãOÚ'UñUÏìÁá]¿o>*ü"Óþ=|QÖ~"|,ð·Ûÿµ¯ü¶ûãOˆçñ¯ìÿãχÿ³ßÄü@ñ/Ä¿‹ß5-#öɺø§âÿë? >|·Ó|ñCöMÿ‚þÃ_>ü?Ô¾þΟ l¾%ü'‹Ä~'øYñGÄ ~øÿZðm‡Ä‡Vž(Õ½ƒàŸüÇö`øð ¿³Ÿ‡<+âø'Þ ý’¼s¨êž,ñˆ'ñWŒ¾&~Ä~ ýš< û>|Iñ5÷‡nü7¤[xƒÃzGìƒðãYÐü!¡øSáïŠ5ÜÍ­ø&êÛÅ>+³Ö€>@ýŒoÚÅÿ¿à•¯ñ³à¯‡üeãoÚÿö`øAñ â'Åý?âç‡ü3¼Uâÿé:ü—ü5qð—À_üYñƒKøvÓþÔ¿´‡Àx“ö}Ô|ðjŠ7_±$?·eÏÀOŠú„=ö¯ÿ‚Šë²ÿÄŸž“àgü'¾ø%û?þÇŸ ñ…ãê~;ñ‡ÆÏÛ·ö±ø—û$üøW§üø{ð3âo‹o~Ùx·á–¥âoŠ_<sñâî•£êzfð“öaøÛâÛˆt)¾€Ó?`¯Ù;EÖ>ë:OŸìïøS_Ùðx Ãö~:ø“-ô øï]øð“Â>'øqŒGÃÿˆÿfˆ$Ö)| Ô¼#©è!Òï~ü@øEñ7âϾ"ü:ø±ðÚ |Sð‡Žî<;âíÆV^ ð'5 €|áÏø)ÆÍoág€,ý«¿f?ÙçâoŒ> |w½øƒ¤üýž“ö—øûþÎ?¿j xóö{׿jxƒ]ý›uŸÚGÇþ Áj*ñwÁ½/Å|;âO|Sð¿Á_¿îàœŸ±î¡á]ÂZ×Ã/xšÛMñ‰µý{ľ/øÍñÏÆ?>,Áã};Âz|ûE|_ñGÄ­_â·í=ðâ'…¾|/ð?Äo¿´OŒþ(|øƒð÷áÁŸ‡ž2ð&¹àŸƒß ´ 3ÿ‚r~Ç¿õŠ—ž4øeâiü?ñ{@ñÃëߌß×àÖ—?Çÿ ø¯Á_üoð¿àm¿Ä¨~ üøÁñ_Ã~'Xøûã—Á_ü?øËâyþ.|dÕ5_Üêÿ>&_x¨ÏïoxSâd_³ŸÄ‚¾Òj=[ãì‡àOü)ðŸÅÍGÅžøƒðÏö‰ø{¯|CøñËÃ?5_„¾ Ò4ÏüÒ?g/ø(µÆàh~ ø…ñgNý‰í¦‹@ð¹ûK|ðÞ¡òÁ¯ø-Gˆ>0ø._ˆv±gÆ Á?|?ð?Yý•¼iâ ~Ôø{ã Gö›øûð'öwø á?Úâ¯ÆØëះ ñwŠi…þ-ÔîdÁA¼+iðÏÁß´Œü!âo[|?ø[kñçö{Rø[àM_⟃~5êÚ>&ü?øñ/áo„|Mý§¬Eý‘àOŒ#øOâψºö4„^¿ÿ„‹Ä¾êÚzž•{¬ið‹ý—BÔ4Ë-oÄVÚ¿Ì7ü“ö=дïhö ¼Au¤x—ÃöÞÐ4½wã7Ç?éßü+§x«Ã>:м3û"Xø—âV­mûøÂ~6ðÂÿø#Fýbø!§xÅ_>x‡ÂÚ&¯ð'áç‚€<ÿþ ýãï¾9ñ÷üfßöŒ²ðÿ‡:|3øiáYÿàžŸ°OŒì|3ðÛÇ:ø_ðSWÖukŸ5ÍßáG‚ôí?âŽ|m$6ÚíÍÕç‹|Cú?_0|ý~~Í:ˆõ…+ñuxƒÄþ,ñ®©ñ'ö˜ý¥~:j>7ñW‹<+ðcÀ·Þ&ñµ÷Ç/‹®|aâ Á?³÷¿xYñ$º¦£ðÛº.¹á>Ò<{ñÏÅ?OÐEPEPEPEPæ·íû6þËþ.ø‰â?üCý˜~|Nñ¿‰uè쵟ü@øg¡øƒÄ7ÖÞðÃË="+­Y£·½¼û•À±ï¦º’[+8+[Xb_ÿ†Xý‹¿èÇÿdü3Z7ÿ$WÕ?´Ä¿‡ñLš'Š~ x'ÃZÉÖoµQ¤xƒÅz©2÷Â~´³Ô…†£mvl.îôÍJÖÚðEöyî4ûèb‘ä´cù»þwÁú+¿ ?ð¾ð§ÿ-«É­*ª­En^gkFëÏ[>¦É+.ö]ÃþKúgÁ=ÌGöøX`³ÓtèƯÚäçèÚ^¡é1Âüñ'—g¥hº=­Ž‘£é¶©ˆ,t½.ÊÏNÓíR+K[{hb‰9_ø)ü˜Ïí%ÿdýÿôõ¤WQÿôÿ“øUÿe£ö·ÿÕ÷â:åÿà¤òc?´—ý“÷ÿÓÖ‘D¿Þ×ý~‡þ•ûöïè~ƒx¿þBÖŸö+øÿP¿×Ä?µü„¿c¿ûH7ì_ÿ«§@¯·¼_ÿ!kOûüÿ¨_‡ëâÚ¿þB_±ßý¤ö/ÿÕÓ TÒÿyý|›ø>QýXý‘?aßx³Ã>,Ö>;|oý§í~ZÿÁGÿmßÚìqâo |ð_Á¦Ô|ÿFøûñûösø…m®ÛþÎíayáûÏè_ ?i¯ Ìß´|þñìóèÐÝ[øàOˆæøyª|aáŸÛÆžø%àí.çþ ?gñÅžý<3ÿg¼Ö>ë¿|â? |;ñ6³û x‡RøwãŸèzŠü!ýˆ¼Mû\x¿ãì‰ãÚ.Ûößo‰~:ýˆ>x›ãµŸ‹<'­ü-ø!àß\þÍ^Õ>'Ûx›À¶º5¯ì“?‡üiûDø\‹Y𿇾ÁZ~~Ò¿ îtxtoŠŸðK_‹‹cû>ùþ³á?xsöýý®µ†ý·ô/Ú[Ç¿ðQÿ؋ş µMFý¶´¿Ø—ÆŸ±íŸìéÿßð/íqâo_MmüSÄ~ µø)à¿ÚÛÁÖÚÏÄéo>9Áã øgÃß nWãNƒð.Î×ú®Åžð¯|+âoøëÃ>ñ§‚|iáýgÂ~1ðw‹4m;Ä~ñg…|G§\èþ!ðω¼=¬[^i÷‡õÝ"òóKÖtmRÎëNÕ4ë«›ëií§–&ü¡ÿ‚PÏûGx§Ãš¯‹>3ø»âˆü?ð›öøÿþÕ5üEºñ·ü-oÚÿþ ïñOö³ø)ûq~ÔÞ µ“Ä^"½—áÿlj·þðχ>$|L¶ðíñ[þåî³ñCá_„ü?¥|5Õ|Sùðþ ÃûGx;ö,ÿ‚føÄø€Ÿ¿eïˆðG?ÛáGÁIü um㿆¿µÆïÚwöDµý³lü]¥C«Mñ·Gÿ†MÓ4¿Û—ã¿Ä[ŠÚ\ÿ ®´ø)ˆ¼-ká韰Gu ëwÂ~𯀼+áŸøÃ>ð_‚|áýÂ~ðw„ôm;ÞðŸ…|9§[hþðφ|=£ÛYé‡ô-"ÎÏKÑ´m.Î×NÒôë[kh- Š%è(ùBý¼<[ÿ´Öµð?kÿ|@ñ¿Ãÿø(Âûÿÿ þÿÁL|yáÍá×€ÿ`_ÚÉÿe/Œÿ ?j{Œ¾/ÿ‚ré?>4üeø]û&|Uðo…ÿdÙ÷áíOàŠ´ß€%ø™®ü@пh‹ŠçíñðÓö„ý“|)ÿñ¯ÁKö¿ðöĉ-þ&x{âÇí1â¯Mû3ü(ÿƒi?h߃~%ø›â…ߌ¼Gá¨þ h¶×À‡²ñÏŒ¼[â4ý¡5OŠ~ý—<ñ—RÔ·?dßkÕísþ,ðŸ…|{á_xÇ^ðÿ<ãOë>ñƒ¼Y£iÞ#ð¯‹<+â=:çGñ†|MáíbÚóH×¼?®é—š^³£j–wZv©§]\Øß[Om<±0ãÀ/~Ôþø§ðâ߈|kû_ø«Zø¯ÿ?ÿ‚–ü(ø»á_‰~#ø‹®|,økû éÞ#ÿ‚–xçötÓtß…ÖV¿üðþÿâÃ_ÙsÄ¿ ÿhßxQøÅuáÏx7àW¾8§ìË⯇¬=àwÆ­àŸí™ÿøkñá·í?g«ü|ý·þx³áGŠü3ûþ×þ x—ºïüûöø;oâkŸÚáßÁ/| ðLJô¿‰?-ø éÞŸÂÚÍÿŒît"ÎM@~¯Ñ@˃>#~ÞöŸÿhëo~Ó÷:GÆÿك㷉¿h¿Z—ÁŸø*Õ¯…cŸŒ¾$ý¡ÿeËmð“öø¥ûEx¯ÃµGˆ?fƒÿlxÂðF­SöAƒö´Ó¾Égð+FÓµ~ËzŸÁÞƒö,ø_ûZü{øí |#øÓñŸöÿÿ†@ðü7%ž‡â½7ÂÿðPïØKþLJ?áÿ‚@xÓá/‡`ýˆ¼Mñ—ÆŸ±ì‰ãÚ2ÛÄ´‹?f€^&øígâÏ Áà/Züe×~øOTøŸmâoÚèÞ¶ð_ˆ ñµÖ¹³á;hPxsQ[KŽÍl`ú~Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(àß²¯ì¿ñ#âO‰|iñ#öoø ãÏë1iÛ>-ñ¿Áÿ‡¾$ñ&«Ḵ«ÔüC¯xv Nö+ Â}>ÒæëX)i¥érLjím<8úçÁ.“öýŠ¿yæþÇÿ²âÿ®ó¼ÏÙÿá<;ä%ö3w„´o³ìƱçnþÁû'Ùu/3þ/øGî¿á@ý—ã?Ýx—RõXûûÿãß°µŸí>oüJvíþÉûGÛ~Ýßì_¶ÂIü#ð‘|åÿÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>qM¾ijþ'Õ÷f‰-4]?öÏó{<ïÀÞ ømàÍÁüáoøCEño³<%à¿é>ðÞ>£§x+UÕÒÃÃÚ¦›¦iRÞkWÚŽ¡©[[èú ÿj]ÞÉuáÏ]É>‡§þ}ÁHÿäÆi/û'ïÿ§­"¿K¼}Å…Štò¼Qâ86tò~Ïᯇ°}›ÊýßÙ¾ÍåýŸì_aÑ~Ãå}þ¿ yðŽéŸš?ðR?ù1ŸÚKþÉûÿéëH®Où‰‡ý|§ùį±ÿnþ‡è7‹ÿä-iÿb¿ÿõ ðý|CûWÿÈKö;ÿ´ƒ~Åÿúºt û{Åÿò´ÿ±_Àÿú…ø~¾!ý«ÿä%ûÿÚA¿bÿý]:¿Þcÿ_æÄþ”C÷ÚŠüaý‘>þÈþ,ðÏ‹?kÿŽß~ÚþÒ6¿ðQÿÛwÁšíqâhtOþÐí¨ø/þ ñ÷öyýœþÛ~Ò÷ÅkÏÞx[Bøaû,xOá xâ ø÷á$ú7ì»uáOü.ñßµOŸõ?ø)í¡ŸÙ3ÇV2~ÌêÿðRƒÿ³_ÇÏÙÒÞëà¯Åk½;öPð¯ÆßÛCþ ­û9ëŸ~5Ãí1esû]xƒGðOüKÕ4¯ˆ>¼ýôæñWÀýBúóáäúGÅ[}á°dCÔWóÃâø)í¡ Yx_ÃQIû0\xÛã_Æüøaâ©> üVO ü0ñWì½ÿý?à‘ß¾!x÷Á ûL_âç‡þ;êÿ´Þ±ûG|$ø}áïüÔg];ºoÁ_üCý¦nu ¯ŒyíWûPüSñŸÇ¯†ÿ²÷Æ¿ þÏþ/ø›ð#ö¿ý›¼âoÚ+áÿÂÏü>Ö'|\ñÁχþ$ðÿíÇ¥xOâ÷€5‰ß¿ádxïöyøoñN×Ä~²ko‡þŸh¯æ‡À?ðUOø(¯¾ü3ø•ª|ø?ðSHý±|?û!øûöWñ7Å¿ ü/Ô´ïøWö›ý´?b/ÙêæÊO†Ÿ ?à¤_>;~Øþð×ÃoÛJÇÅ—ÆKχ?ðNý;ÁÞ*ðG€¬|Yÿ„[ÀŸ³çˆÿgŸêzWü+oŠ_¶÷üÓÃóÿÂUâÚWßðœYþÑ:¶±áoøDÿ°mþ xÚËÇ:‡Ž~€~ŸÑ_„? ?टµÇÄH5ߎÇ€?f þÏž ý§ÿàœ³Æ©ðëÂ~3Öþ6üLñ~£ÿø5ÿêÔhoø¶ËàL^ýš>$þÜøÃFø¹àï |að¯í{ð÷L¶ð'‡¼/û9I Yüuøãú¯ü ö§ñ6—ûøçâ—‡dˆ_¿à ÿd¿Ú§á×ÂßÙóâ*øÇöwÿ„Ïþ ;ÿˆøoáÄŸüEûGø¿Â_¾ |)ð—íݨx«Á_´/‚_?³~;|ðÅ}3ÀºF˜óü?´þ¨¯çLÿ‚¬þÜ^ý™ÿe_‹¿~~Ïþ=ø›û{~Èþ9|økð/Iñm¯ü*ŸüGý¡?àÿ²Õ¥¯Šu/Œ|áÿ?ð°|AÿðÆÍá”þ/ý“4…?ð­µÙ«Ä_´ŸÄ›/Cû_x[ôöiøßûm|gýš¿ik?ü9ø?ð×öÐøCâ|1øu¦øþûÀúoÃÝoâçÁüZø?âŽÿÿgÚ›öÓÕþx}õŠžÑý¼¾6xÏöŽðG†ֲ¯ÆßÚ+áÿì©ðÊÛö¦´ø3ñwYµÒu‹ ¯ø-‡Äo[|`ø!âo|øÛcÿ¶™ÿú×<ìaãoŠžñßìAûG~Ð?¼)㟋_5?†ºÍÄ.~ëþ ûh\hŸ¶Œô~Ì àŸø'ìÁñãçÇk½K@ø¬þ*ø÷â¯Ù›ö¸ÿ‚ž~Ìþü$ðí¯ÄÒ> øö“Ò?àŸ±|CðÄø·ãf£û"ê:ÜžñÃÏÛNÛÅKão‡ÐõùÁÿ<¶ñU¯üƒþ kŒuŸëÚ»~Ä·­Í÷†|3¨øONƒÂ·Ÿþ/ÞxF¹ÒõOxÒæëÄðLþð÷‹Yx¶Û¾ý?¢¿m~/ÿÿ~~Õ~ ø;ûþÏÿ³·í5£ÿÿåÒ>þÇ¿á;ý–<_ÿ ãûSøÓö8øñ7LðgŠ|û|?¹ý 4/ˆø…yñƒÃ·^øÿ ƒá×?gÏxÃöÌÑô[]Uýœüâ/íûÿðoˆüWñ+ÇúGÃÿ…Ÿc¯Øþ 1ñKâ?Á¯[xcSðwÆÝcà/ÂÏø&_Ç€zïþþο·‡í!áÿÙ»â†üAñúÏH³Ó*Þê:ÿˆ>*x[öw¾øç«\ÞËñfìözŠüÕn¿áœ¿à—ŸðZ¯† >þÏÿ³wÄߨãáÿíU¢\üDý…¾ÿÃxÆ¿õø'?Â/Ú{Â<ð¯Ã>0ñ·ˆ>|@ðŸ‡þ1øἺ¼Ÿ¾!xSÖ>Øü@Ó|Sá«-oFøà_¯ÿe„ÿ ?gÛëö¿øû?ü4øð3à•—ìûüX³ø;ðwÁ¾øeð²ÓâŸÄ/ðRøÿâ]¯Ãßiº'„­þ xãÂ_ >ø[Æ2‹HOø›ÃŸ ¾hšÖ¥{¦x3Öºhéýùû~Éß²ÆûSþÒµìãû4þÏÿ³ïÃÿÂYû |ÿ…ðoá×ÂøNÿáU|E_ølŸŠ>)ÿ…yáÏkZÇöÇí5àM7öiÑ<ñ_Þ!ÿ„þ«WøÉð;ÅÍðÿö²ñöÇëõQEQEQEQEQEQEQEQEQEx?Œÿuâ]IÿÕcìsïÿ|bÂÖ´ù¿ñ)Û·û'ímût[±~Ùÿ $ðŒÂEð?—ÿUÿL|Ÿûvò>Íÿ‚_²}“ûþ ÙÿØó(ÿÂ#ÿùÔxÏ÷^%ÔŸýV>Ç>ÿø÷Æ,-gûO›ÿ»²~Ñöß·E·ûíŸð’AÿÇü$_ùõ_ôÇÉÿ·o#ìßø%û'Ù?±êýŸýÿ2ü"?ñœ3øåþ)~lÑtùî3Ëü}Å…Štò¼Qâ86tò~Ïᯇ°}›ÊýßÙ¾ÍåýŸì_aÑ~Ãå}þ¿ yðŽéŸš?ðR?ù1ŸÚKþÉûÿéëH¯Òïqab<¯xŽ <Ÿ³økáìfò¿wöo³ygûØt_°ù_cÿ„oÃGü#ºgæüþLgö’ÿ²~ÿúzÒ+•¼Ãþ¾SüâWØÿ·CôÅÿò´ÿ±_Àÿú…ø~¾!ý«ÿä%ûÿÚA¿bÿý]:}½âÿù ZدàýBü?_þÕÿòýŽÿí ß±þ®Š_ï1ÿ¯óbÊ?¡úïÿ û,Âöÿ†£ÿ†iýŸÿᦿèâÿáMü:ÿ…íÿ"wü+¿ù+¿ðŽÂÀÿ’ÿ7üŒ?ò'Å3ÿ _ô<;û'~ËÖ>"ø‹Â³Oìÿá|`øá‹õßüøu¢k~)ü?ñÜÿ¼ñ/â.§¦ørÚ÷Æß<ñ6æçâ/„|eâiõ?øoÇwø»FÔ¬¼A,šƒ{ýì ~а‡ì±ûIü:‹áoÄ_ƒßÿáÿ…¢øÿP³Ò~|:ÿ‰ïüe?ŸÛâ—‚µë}wÁú|?ý¤þ6üðŽ»ûKør}?þ/ú~§â+ßøK³ ü:Ðü9ð×ûG⟂¾:jð€hšg‡-tÏ}¿ãoÃ_‡_¯áµÓ¾ÕñOÀ> ø…>ÿøWBÕì=þŠðþÉ߲DŽ5ˆ¾"ðŸìÓû?ø_Ä> xGâÇŽwÿþhšÇÅŠüw?Å/|Kø‹©é¾¶½ñ·ÄüM¹¹ø‹áxš}OÄ~ñÝÄþ.ѵ+/K& Ûÿÿg¯€_´§…tÿþÑŸ¾ü~ðN“â _i~ø×ðÓÁ<+¦øªÇNÕt{iþñÖ‹¯i~ ³Ò5ÝsKµÖmìãÔmôígU±†å-µȦö (Ïï~ü,Ôá#þÐøiðþÿþˆ ø±âï¶ø7×_ð•|Søkÿü+¯‰~#óô×þÜøàøU á ñ–§ö¯øWþ¯€?°µ+øC¼;ýðì÷ÿ˜ý˜¾|lñçíâ5ÿ†€øÛñtú·Ä/Š_ÿbχúÃë| ñûXñv»ìŸû+~Í:gňÆß…? ¾*éŸ~7X|PñßÃßü?ÓüIð›Ä_õ?|D¸ñŸéýã÷?³×À+Ï èÞ¼øð~ëÁ>ø?âoÙëÃÞ¹øià¹ü+¡|ñ¦á=Æ?´oK¢¶‘¥üñf‘à/é~&øicg‚õí;Á~±Õ4[«ohñYô ~ü,øàM áoÁO†Ÿþü2ð¿öŸü#?¾ø7ßü áßí½cPñ³ý…á éºG‡ôíjú®»©ÿgéöÿoÖ5=CSºóoong—Ð( ñgìõð Ç¿ üMðWÇ_¾øÓàß4¾¹ŸÄ“Ë©1mû=|³ð®³à[?ßí|â?ƒþýž¼Càëo†ž ƒÂºïÀ/éÞ,Ñüð;YðôZ*é§Áÿ é=ñ֗ំ—Ösø/AÓ¼iâË/Eµ¶ñ±ç°Q@®þÉ߲NJ< ¨|-ñ7ìÓû?ø‹á–¯ðÿáoÂ}WáÖ»ðoáÖ¯àMOágÀícSñÁO†š‡„u\x~÷áÿÁÿkzλð·Á·:|¾ø¬júž§á=7H½¿ºž]ûoÙëàŸ…uŸÙüø?kàŸüðÏìõâ[|4ð\×~x/NñfàïÚχ¢ÑWHÕ>øOHñ¿ ü4¾³ŸÁzãOXéz-­·ˆõˆ¯=‚Šóùþü,¹ð'‹¾Üü4øqðËâü,_øO~OàßKàOÂàÖ ñ‹5߈¿Û:}ïü&ÚÇŠ|?ø?ðËÂÿÚðŒü:ø[àß|?ð'‡¶õCÄZÏö„|'¦éÒ?µüA«êºî§ýŸ§Ûý¿XÔõ Nëͽ½¹ž_@¢€<À²wì±ð£ág~ü-ýšgÿ†¿¾%ÂGÿ àï€> ü:ðwÂÏÂcáË?ø»þ_‡¾ðæá/ÂUá-;Oð·ˆÿ·t‹ÿíÏXY蚟ڴËX-SÀß³×À/†ømà_†¿¾ü<ðOÁ¯kž,øAàï|4ð_„¼+ð§Å^'Ó¼m£ø—Äß ¼= hº~‘àox‡Hø—ñK×5Ÿ ÙézŽ­§xÿÆÖ7÷7Þ*×b¿ö (àˆ_ðKØâFðOÁú¯ì§û?é ¾|@´ñþðwÿ> Ø|"ñŸöG?ißøgÁ_~Üü>¾ðÿˆ¾ø?ĵ߯¿Œ^ðå­®‘ÿÿÆÏOñ O½Š÷Wñe¯‰~¿ÿ…Oð³þgü(¿øVŸÿáI¿ÿ…Oÿ wþ߬ÿ…Yÿçü!ÿð­?á^ÿfÿÂ%ÿ ÿþ/ø¥¿á þÈÿ„sþÏø’fÿf¢× Q@?ðÛözøðkNðNðƒàwÁÿ…:GÃOøçÂt¿†ß <àm;ÀøŸâ­Ç_¼3à› èº]·…|?ñÆÞð׌|s£hQXiÞ-ñW‡´?ëöÚ†¯¤Ø^[à|-ý“¿eÚ>…áß‚Ÿ³OìÿðÃþø©üXðÎ…ð·àßï‡ú?‡~)ë~Ô>ë?ô-3Â~Ò,´ˆ¿Ã-_Uøu©øËO‚ßÄwþÔõÝjRø~öçO—ßè Ã>ð¯‚ôëÁÞðÿ„ô‹Ïx³Å—š_†tm;AÓ®¼Uãßk>:ñ׉®lt»k[iüAãOxÄ>1ñf³,M¨øÅZî³âbæóWÕ/¯'è(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€<ƺñ.¤ÿê±ö9÷ÿǾ1ak?Ú|ßø”íÛý“ö¶ýº-¿Ø¿lÿ„’øF?á"øËÿªÿ¦>Oý»yfÿÁ/Ù>Éý‹ÿPìÿìù”áÿŒ|êâÂÅ:y^(ñ:y?gð×ÃØ>Íå~ïìßfòþÏö/°è¿aò¾Çÿ߆<øGtÏÍø)ü˜Ïí%ÿdýÿôõ¤Wéw¸°±NžWŠ;ø¯¬x—ö±øIûÇ>…eà/Ú×_Ó>e|møóðƒOÔü;ûhj¿²ßŽäÑü_¨]hþÕµ?‡ôûÿìÓñËöøkãþÇ_l¿ÙÿÇßuÚö±ñþ¯ðGþ#࿊¾;X|Sø¯ñÛã'í+ñÓÁ_ð­¼-«Øx¶×þ¯‹|cñÏþ˯ ?ˆüàï ýŸÆºŽ§¡ëzõ×é_ðHß„–> ø;q¨þÐÿ´ÿ‰~þÍ~øoàoÙ঳}û<[ü=øðÏá?íAûþÔþ ømá=wÿ³¦ñ“ÆþÓüIû üøws®|pø¯ñcâ£ðÏMñ4w¾6›â'‰nþ"GìãïÛïáèñ¼!|Bý¨?fŸƒšÇÃÛ˜|c¨ø¯Wø[áû_ö†ø[‹!øïðÿà‡ÄÏ_²ÿÄ}gö’ý€n>1ø&ÇÃß4o?øyÿøñáŸÃïŠðoöŸð&‡ñÛàÿÃߋ߲֑ñáç‚ü-â¯ÚŽˆ_¾üµðgà þ&]Éàßi´íKû<üoþÐÓ|ø5ã}G⿇þ1ü!ø©ñ'ö\±ñ'ǽÐ>'þÂÿŽ6þÛÿiŸø×âŸÅŸˆ^…Ÿ¿¶ÿb/‡ß²Ÿ‡/~%ürðìÍû(øKVøá_ |Ð~!øËÇúOì—ð“þ¯jú—†oü9ñSð=ïÅo‰¿ymû5|}øËû;X|Ký»¼?þ;xö}ý¯ô_ø'Ï€?jÿ‚¾ |lñ§Âˆ4‹ þ9|Ô|eð¿Eý¬|QðÁ¾1ø៉^¿ýž¼Oð?àÅ9þ jŸ¼}ðZêçâícñÀ?i/ø.÷ìÕà?l߆õoë´ìùðöÖ½ø\|Yã_‚"ð¯?hØÛà×Åï‰>;ø_âo€þý í¡àøkQø'ñ.×Yñ÷ÅŸ?>xÇNðË|9øÉ«ÇñCà.­ñCïø?nÿ‡°xWâ/ˆ|QðÓã‚5„ß´ÿìû!üCð/ˆ,þê*ðçÆ_ÛNýŽï¼dמ ø¡âÏêÞðÏí±ðËGø¯h>1Õ`µÔ|)ñ_EñHÓ|%ªxÓŸ¾ÿ‚uü,Öÿánø/Å?h~Ì¿á¢ïsþ+ÿ‚i|=ñÇŠ´¿x£ö€ý§ï£oŒ²Çí/ñÃo‹þøO¿?j¯Ù/Qø žý¢~-éÞ øGáÛoÄ.ðOìáðËáÏ~ è7þý”N¥Çñ+À_³×€¿h=Â_¼4òÇOø*·ñ‹þ éûB|]ø-áÚö#ø­¬ÿÁ8>4ÁC¿c_üNÐ?dj?þüð‚>&ßø«Ãú…¾ ~× м?ksñ3àw…~#ø;ã·…~|BÔ¼+ñ©Â»A⟠ø·Å ?Oÿhßڧ¿³n£ð«G×>|`ø‘«üXñ‰4Í'KøIá;ÄºŽ›¢x·þ:øƒâìu¯xbçâˆ<+à/WñŽ›û>|‹â§íqñk¾ñïˆ~~Ï?4…¿ï<øÁñþ Ýâ?Ù‹þ ã|qý®~ø£ão…ÿà˜_ðN üLý¯þ2ü,ýž¿coÙSß´/‚>üøÏ§xâ‡Ã?ÙkÀž-Ö>ë-ð'‹Ï]þѾø©ñOÅ—ß ¾xMñÇÃOâwÅkß³ÿ´Ïì­á_ÚNðvâψ¿< ¤xcÄv§¬i |]§hšw4M?Å^ñÔ^ñˆ|;â«o xƒKñ·ÃÏxÇáÇíð–/†ŸµÇìù⯠/ˆfÚàÆ¯âÞxâ ïø./ì ¢|vø»ð?Å¿áÿ…5ÿ gâoÿÂYð_Åßhñì•à<ý¢¼9ÿ ÷ðãâ×m¯ÿ·ð×Á¯Œ÷ßðšüPý–<ð³Çð­ö|3ñÿáiüo‹}ÿ‹ÿoO‹ºgÄ_Ù À_ðÆß´Ÿ|qý¯ôO<ñŸLø'â8¾x§öXý®~2Xü_øgñCáí%ã¯ÙËSÿ„+Ƴ—ö—ÅÿÂÛñOÆÏ ü,ðïŠ$ÿ… /ˆ>+~Η¿=ûþ ×ð³[ÿ…»à¿|Tý 0x'â÷ÊߵσZN£àyüá_‰?/¼áÿ…~ |(ý›¡ðÿÄ…ß>;|3øâ»¯‚|Ká_ŠÍp¿,xûáïÀMsGð‡í?ãÿ…>(ðÿìuàoþÖ>?Ð?gNðÆÿÛáŸÀO|ømñßÁ^øá]ü`ø§mûLþÎx§\ý™g?þÍ^ñWÇM.Þox7ÂÞ ø£ÿ ¿Ø?d_ø(§ÂÏÛþTþøWû@|(Ó>>þÏëûKþÏúŸÇOøsÁð¹þhð«4ÿŠÚ·…´-Æþ,ño‡áNø·ãgÂÏëwÿ¼;à|Yÿ„ÓHø‹û/kß~ <¿¢ñÿ€ðM/٫ß~'Á_Ú㌿eÍ7Ãÿ±×ÄËo‡:7‹þxÇà×í9ãOÙ7áŸÀO þÊÿ´ß‹>%hßæø­qâ 7Âß³_ìÁâ{k?€_¾|ñôÿ|3¨ë? uÍÇ_ì>$ûûhÿ | û0xgàGÆOˆ |[û$þÈ—ì3ð“â>»¢øâ&±aðOÆ:Çì ¾=ñ–¡áýKÃz?„µOÚ ~ɾ¶ø[ãSF¿øEàïø‡Sñgþüc𕬠n€<ÿöËý¨üGð#öµý‘¼{㟈øKñ_áÿŒ?á(Ò~xgáf¹â=➣ÿÿ‚I~Í?´¯þ&x{XþËø7ü5—üñcþ»Ý;Äqü,ñ÷Œ¼Gà­Ÿ¼+ð¿^ðç¤Ájÿe‰>蟴w<û@|ø[ñ öð·íð/Zøéá_‡_ ÿá{ø;_ñÀ¿…:½…¥Öþ*3á‡ü!_iŸ€Ÿ 5¿ˆŸ´Ö¥ðàOˆÿáfi~ü]ø…û)i^)ý 4ý®~~Ëþ1~Ï0øóñ«þ—ć¿ØŸð©ü-ÿ á׃?á8ûíÙÿêøé¦ÿÄ“ÆZ6¥­x›í´×ìïû%|ÿŠjêËíð¼ÿá^Á³âÄ߆š¾‰ÏÞÿÁ/þ^|3ý•þü`µ¶ý?f öbøâ«mÁgÅZ  ø…ûü]øañ£Y_î|-âOŒ ¾+~Ÿü{á˜5o Ïðk^Ôm¼Y üIø?ãÏø¼+fè²·ü#öjý­>|Eý£¼ã_øCáßÁx»Ã?u_|Jø!â_ ü%Ô|à¿üN×î|Mñ«àŸÅ_‹ß³v¹áý7áwŒ|%ãýgÅŸ>5xÛ¾Óµ»Ÿ xãYðÇÄO|@ð_„¼þ ‹ûH~Ñß´½í¡âoÚCGÿ„2÷Âÿµý†™ð[áU÷‚.¾øÇàÏìãñ#ö6ýÿh߃Ÿ ~.øoUŽ_X~ÐðÿÇ.h½?XÖ|KkáïŽÚŸÄO ø#]—á—‡üa§ýA¦ü'ø{ð‡àŽö’øÃâõïøóÄß´OÄßÛ[øgyá]sáì¾ Añ•·Žü/¢ø7áŸìÝðëàþð»@‡IñG„üð³á×Ã=KN³ñ?Ĉ6½ñÇ?<{ã—ÿàœÞÿ‚Yx;ĵWˆ¿àš>5ýÿg|,оü8ðTgÀ++_øC¾ßÿµñçÄ_ xsÅ“ê?jø§ãï>.Яcÿ„«YÓì?O袊(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šðþëĺ“ÿªÇØçßÿøÅ…¬ÿióâS·oöOÚ>Ûöè¶ÿbý³þH?áÿ„‹à/þ«þ˜ù?öíä}›ÿ¿dû'ö/ý@?³ÿ°?æQÿ„Gþ1ò_ˆšÜ7‰5;«ûùma“YVØxy/ç'OÐ<ªÏ=Åâx§Ã’E+É{p\AêööW¿oMCÃ^ ºðïŸGã?/¶©û¿'_‚m-¿ÔÿfãËû'Ä[²ÿÈ6?'ì_eþÏÆ›ý—öøDü ÿ·ŸRqSšm&¥-ÜW_9\Õ-¾]ÿ¹ååýkl¿qab<¯xŽ <Ÿ³økáìfò¿wöo³ygûØt_°ù_cÿ„oÃGü#ºgæüþLgö’ÿ²~ÿúzÒ+éOÙ÷ㆽûFþÎ~ ø»âMHÐ5-{â¯í¡G£èfñ´ûá÷Óáφã {q;5ëøwÂzTº«YG¦è­ªÉzÚƒáÍ éÚ›ó_üþLgö’ÿ²~ÿúzÒ+žÍb¢žê­4ýSˆþÇý»ú Þ/ÿµ§ýŠþÿÔ/Ãõñí_ÿ!/ØïþÒ ûÿêéÐ+íïÿÈZÓþÅÿêáúñü,ðßÅ OáTþ(×õÍËáGƆ¿´ïì &ÃVºÖ|Ið£]Ox_C½]GSÓ"´Ðï5ûm>mzxkû­"ÖóHÓΙ{©Á¯i QÄ)=œ›ûØZðIuKô<ƒöDýœ~>ü~øoâÍÆ?>鿲~…ÿ_ý·~5Ùü+ðÏìçãK?ÚO~ÍðYŸ¿¼ §ÜþÒ§í9¬ü6êß¾ø{Rñe¬_²„:÷ÂKÍgáÆªè>1¸±øÁ§|wÿ6ýª¼wñ§SøYð÷ö®ðÿ†tÚ7ļGcàÝ7âÇì£ñ·öÐÿ‚iÞ;ÿ‚¨Á8¿f SàÅ¿€V°‡Âï þÉÿ,> þÚ?¾x÷á7í=­~ß>*ðÿÅo…±é:?Å[-_á/޼IñŸú=ÿ…÷ÿOŸùaÿøÒ£þßý>å‡ÿãJ½­RïøÇÿ’3åÕü¼¼ÿØü¡ø…ûiüvðßǯ~ ðßí7ÿ %ï†ÿkÿØ;áí×Ã-?࿃—GøGð³ã'üŸöWý›5êvº¯…tÏŒ³—Ä|ñ¯Å»v×ö —ã'‡?n?x¿áoíÓÿÄøÅð·á—†þ5ü ø9à ý´ÿnÏ~Ìÿ°¿ÄO‰?´ßü,mköèý€>þÓ_~"Kð_àï|9ûø:Çö„ÿ‚]|"øÇñïáMŽ•á[Aÿ…wû2þÜ¿h¿ÚÇŸ´­÷Æ:/Å?‚š/ÅÝáÀßÙ—JñÇìé¨~îÿÂûÿ§Ïü°ÿüiWŸüRñ‡‡>0x]øuâÍ{â‘áÿfhj uÏŠ¼woý‘¬iúí¯öÅ/‚Ÿ´'Ãÿ‰¾óotËh5?øF|]¤mèòêÖ~ßáý_UÓ/O­RïøÇÿ’Wý_ËËÏð}Ê|xºøãÿ£ÿ‚þ[iÿ¶ü7GÃ/ƒÿÿk¯…¿ÿh¶þÎ:ßü$^»ÿ‚V|ø¹¯è_ð”~Ê¿ ~üñOü"ß>+|RÑ¿´ôÏ ¦±aöøFuÝBö÷@&/ >2|@ð'ÀßÛ'ƾðÄÿÙÿâçˆ?iŸÚÿö=øñKþ ññ“á±uûSø»Çw6?²‡À?ö«ý“¼[©üHÐlµÙÿöOøeðgá×í]â?xwö[øÿ£øgâ/ìÇûKiÓþÑŸ üAáMv_Ù«ßô߆?³Æ›ð âßìÏ/†¼Aâ…?ÿÁX>ÇûøOÇ/ñö ðÿÂO|ý¨¼û.üQðÏìsðÏö´ý þxƒãÌžýž|e£|lý¡¿nÿ‰?³ÇÆþÐ6Ö_~hþ6ý¥¿e_‡?þßñ'ü#Äá1øQiûTÂÐøâßÛÿþ AàïÙ?Ä_ð‹|,ñoŒ~4~À¿´ü;Â?ÿi/#á'Ã-+áý÷ìÿñ£âÄoÚËÀßðÕÖþðÏÁ{ŽÞ-ÿ…%ð‡Æþøið‹áÖ•ú½ÿ ïþŸ?òÃÿñ¥Gü/¿ú|ÿËÿÆ•Z¥ßñÿ$¯ú¿——ŸàûÍ™ûe|Eý¢ÿà–_´™ûnÿÃvÿÂâÿ‚þØŸl/Üþ˧ü1íOoû:üÿ„+à¯üb‡Â_„¿ð©ámÂÚý§?âÜ~ÑÿðžüE×?á›?âßë:ü+ŒŸð”þßÁI¿h/üÿ†y¹ðÇÿøQv^(ø©Ø^ÚÙü*Ñþ x⟉ÓþÝ+ÀðæŸã]ÿÃÿ|ßxˆë>5ýƒ~ x³à¯üö´øY¦xÿÄß°_Æx¾&þÏ>#ø)ñÈñ7ÃÙãÅŸ²=·ì+ªxkÄ¿²å¯Áÿ ü‹áφu‹~ Ô[àׂôMÂú?ÃÛŸ‰^ý£4/Š×ž¼ð¶…cáOCyã‰çñï…gÖ|5ã«è~#ñ †©ôÿü/¿ú|ÿËÿÆ•Z¥ßñÿ$¯ú¿——Ÿàû„ZßííÿÒ¾;~×3øÆÿ³ÿþ |1ÿ‡ŠÚø+þ ßÿ v©ñW㵃¿gO~ÐóþÇŸ¿á‹> þÄžý¦¾ÃBë_ fßÂâøãÿ ñ‡ÀŸý¡³> ø?Âÿ?iŸÙCÀŸ}Sñï‡þ*|Vý‚uo†ðS/~ÚþÿÁGþxÅŸ´¶á_ÙÄ:wÂß|Bý‹ÿà _ í¾ø³ö–øð_Á¿±æµáÿŽž<ñGÀŸ€öß ­~i_µÃ~Ñž ñV~Ôß²ü ¿¯ßð¾ÿéóÿ,?ÿTÂûÿ§Ïü°ÿüiQõª]ÿÿòAÊÿ«ùyyþ±øEû-ÁB?i‰^ý”ü]ñö¨òÿi¯ÿé´~Äð‹~Ïz/ü6wì÷ûQü ý†ücû`~Ûð¬ÇÃ(¿i¯ÿ§־=þÚ"ÿ…‰û5|Eømû3ü0ÿ†?òÿ…÷ÿOŸùaÿøÒ®Äßü+ãM:ÛGñŽ‹áÿi~ ðŸ‹,ô¿|*Óµí:×Å^ñVã¯øšÚÇTø“umˆ<ãox{Æ>Öb‰ux«BѼC£ÜÙêú]äÖ©wücÿÉ+þ¯ååçø>ÇÀ?ðRŠ^;ø?ûs~À^,øu®ÿÂ;â _áÿˆþê‡öf«ý£ÀŸà°Ÿð@‚Ÿ´/²ëº~§eü% ¾ x»Ã?Úp[E¬hŸÚÿÛ>Ô4Xiš­—Ä¿¶çüWá÷ì{û|OÔ?h/ühø£ûnÿÁ8>~Ô~8ñŒ~ü/ø#ðÏö\ƒJøçÿÃøOñãƒüIá/…?£økáÿþÏŸ·Æ/¿´ÏÆÚ´çÁ¯|Bø7§|qð§À/†³vã?Ùs\ýýÿ…÷ÿOŸùaÿøÒ£þßý>å‡ÿãJ­RïøÇÿ’Wý_ËËÏð}΃—ÿÿmø%—íÕðããÇíðÿâö‹ñáÿí9ð/Àÿ´¿ìÑoâ?Û+ûkágÿg].ÃUñN“¯|ý”¿c?‡ÿ¶Äü@ñŸÄ¯ ØhŸ±ÿÀ= ןð‡è?³­î¯âÚkÀõký¾<]|Qø§ûAøÀŸ¶ü<örð'ÃÿÙûÅ~ ý¬>Ûû8ø·wÆÏˆ~#ý¡ô_³Çü,OÙá¯Â/€º§ü*oü5ýžþ$ÿÂÞ “âï„?á ?·å‡ÿãJø_ôùÿ–ÿ*>µK¿ãþH9_õ//?Áö> ¢¾_ÿ…÷ÿOŸùaÿøÒ£þßý>å‡ÿãJ­RïøÇÿ’Wý_ËËÏð}¨(¯—ÿá}ÿÓçþXþ4¨ÿ…÷ÿOŸùaÿøÒ£ëT»þ1ÿ䃕ÿWòòóücê +åÿø_ôùÿ–ÿ*?á}ÿÓçþXþ4¨úÕ.ÿŒù åÕü¼¼ÿØú‚Šùþßý>å‡ÿãJø_ôùÿ–ÿ*>µK¿ãþH9_õ//?Áö> ¢¾_ÿ…÷ÿOŸùaÿøÒ£þßý>å‡ÿãJ­RïøÇÿ’Wý_ËËÏð}¨(¯—ÿá}ÿÓçþXþ4¨ÿ…÷ÿOŸùaÿøÒ£ëT»þ1ÿ䃕ÿWòòóücê +åÿø_ôùÿ–ÿ*?á}ÿÓçþXþ4¨úÕ.ÿŒù åÕü¼¼ÿØú‚Šùþßý>å‡ÿãJø_ôùÿ–ÿ*>µK¿ãþH9_õ//?Áö> ¢¾_ÿ…÷ÿOŸùaÿøÒ£þßý>å‡ÿãJ­RïøÇÿ’Wý_ËËÏð}¨(¯—ÿá}ÿÓçþXþ4¨ÿ…÷ÿOŸùaÿøÒ£ëT»þ1ÿ䃕ÿWòòóücê +åÿø_ôùÿ–ÿ*?á}ÿÓçþXþ4¨úÕ.ÿŒù åÕü¼¼ÿØú‚Šùþßý>å‡ÿãJø_ôùÿ–ÿ*>µK¿ãþH9_õ//?Áö<öÜøWañ»À<øS¨øÓâËÞëšT~>ø+ñÄ ¾*ø2ý|#ð¶÷Kñ/üwák»]OFÖômNÖÒþ(.—Rðæ¹ x{Æ>ñ7„u]sÃÚ§ãßü+þ ýñûö8°ø‰âOÚöäý¡¿l,ÖüAáÿ Ïñ â÷ÅÝwáWþiþ#•ü)>‰ðÛÇ6ñ.˜¿|i¦iÚ?ˆüyâ]DêÓx.k–øað÷U›AÓü_㯋¡þõ_Þ~ضÃ(5´è­<ð–ßá7†ü¡›#NÒ®.t½;XÑüK®O¬6›¡«êZçˆuB{©ÎÞæÓCÓô]Kñ¿øb}7þóþ ÿƒ‚ßüÆWF§*UŠŒåvš‹zyÞêým¾Î拦D—^¼·üÿ¸ÿ‚zÉ‹|*ÿ²Ñû[ÿêûñrÿðR?ù1ŸÚKþÉûÿéëH¯ªþü(ð/À/‚þ ø'àxãź?…|Iñ'Äòø‹â—†ìüC¨_üHñ?ü%ú¡ºŽÏE“ËÖ¯5S²Ò4˜`±’ÊØ[Í$2ÜËò§üþLgö’ÿ²~ÿúzÒ*\”±Q’wN¬ùÊ=ƒìÿÛ¿¡ú âÿù ZدàýBü?^ ñkã‡Áo€^²ñÇo‹ÿ ¾ øGRÖí¼5§x§â×ü'ðã×þ#¼°ÔµKOÙkž1Õ´m2ë[ºÓ4m_Q¶Ò º’þ{ +R»Š·±º’/yñü…­?ìWð?þ¡~¯‹~9Ï=¯í#ÿÚ¹¶š[{›ÚÓã|ö÷HðÏñÁ-?à£rE42ÆVH¥ŠEWŽDetu ¤0²åRªâÛIÊW¶ú]‚vŠô_‘ÉÃÊ¿àœßô¿±Gþ%OÀ¿þnèÿ‡•Á9¿èÿbüJŸüÝ×ßÿðœxÓþ†ÿàÿVÿäº?á8ñ§ý þ(ÿÁþ­ÿÉt~ëþžä£×ËñòÿƒøyŸÃÊ¿àœßô¿±Gþ%OÀ¿þnèÿ‡•Á9¿èÿbüJŸüÝ×Õßi-GàÃýG≼EñW·‡[ðWƒô økWžçÄ~3øñ?Çøað¿À>:λ¡ørË[ñÿÄŸxSÁzV±âÿx[Àúþ»³ãøOÂ6׈ô¿ðïíáâëŸ|1ðÄ…_µwÀ¯üZø¢>øOÃÿ.<«XM4ß¾9|p³ñ[øÿà÷ÆŠß ï´IôÙßâ?‡µ è;Ö¾*øOÄgÁ—¾9øqá|CðG5Ö£M«¥RÚÿ'Ew¦ú-û½møùÁ·ËÌóÏøyWü›þ÷ö(ÿÄ©øÿÍÝðò¯ø'7ýïìQÿ‰Sð/ÿ›ºûÿþÐßâüêßü—Gü'4ÿ¡¿Åø?Õ¿ù.—î¿éçþJù~>_ð3àøyWü›þ÷ö(ÿÄ©øÿÍÝðò¯ø'7ýïìQÿ‰Sð/ÿ›ºûÿþÐßâüêßü—Gü'4ÿ¡¿Åø?Õ¿ù.ÝÓÏü”5òü|¿àþgÀðò¯ø'7ýïìQÿ‰Sð/ÿ›ºû^¿¿àáoøÒø%¯Ç­.ø¢m3YK+cN—_Õ¤°Õl­ôýkW·³Ô¬ÞìÛßZÁ«izf© ½ÔrÅ£§XÞ¢-Í¥¼±þÆÓœ"¡ ÅÊÓsV•´ååíÞà›»O¥¶óAEVC (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ ø‡þ Gÿ&3ûIÙ?ý=iöõ|Cÿ#ÿ“ý¤¿ìŸ¿þž´ŠÒñi×ÈéHRÙú?Èýñü…­?ìWð?þ¡~¯Š>=ÉÅÁ8?ìëþ9ÿ묿ࣕö¿‹ÿä-iÿb¿ÿõ ðý~s~ÝöŠÐ_öYø¹û2ü¸ý¤üyðCöƒñ¯Œ5O†–ß¾ü4‘¼5ãïØ¿ö¹ýž‰¤×þ%x—š密+| ñoí]ûFü×ÿ਺ßü%~8ðÇ»Ý{ÂôÝá‡í5¡|h´¶ø·â?…úßÇÿÚÄÞëÿá®ÿà²ßôŠ(?ñ!ÿeïþŠJ?á®ÿà²ßôŠ(?ñ!ÿeïþŠJ«O_~†©¯â§ºK¬ž¾ê××» ­¥¥º>–íýi§CöÖŠüJÿ†»ÿ‚ËÒ( ÿćý—¿ú)(ÿ†»ÿ‚ËÒ( ÿćý—¿ú)+?bÿçåüó7”¾çýÃ?+Ÿðpü£ãGýw·ÿÔ{Åûk_Ì'íè?௟·ìÅñöwÖÿà™WÞ_ØNú^¿¥~Ðß²››=f-?P³²û|W´¶ $Ó$„©uöxEÔDÇs ›ÉkKŸéîT£N”y¡&Fù$¥kòZö}lÄ·“³W¶êÝŠ(¬ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ ø‡þ Gÿ&3ûIÙ?ý=iöõ|Cÿ#ÿ“ý¤¿ìŸ¿þž´ŠÒñi×ÈéHRÙú?Èýñü…­?ìWð?þ¡~®^ºÿÈZÓþÅÿêáúåêgñËüRüØGeè¿ ¢Š*FQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEñüþLgö’ÿ²~ÿúzÒ+íêø‡þ Gÿ&3ûIÙ?ý=i¥âÒÿ¯ÿÒ¥³ô‘ú âÿù ZدàýBü?\½:×ü×öêÖµ+FMá­ŠÍäÅm§Øü:ӾŧXYÛÅe§i¶m{w{%®aomeo6¡}}¨Í -ýõíãÏu._ü>‡öæÿ¡£áÿþ½ÿŠ®—ƒ«&ä¥NÒm«¹^Íß_t…4’Zè—oó?±ª+øåÿ‡ÐþÜßô4|?ÿÃw¢ÿñTÃènoú>ÿá»Ñøª_R«üÔþùòç]Ÿáþgö5E¿ðúÛ›þ†‡ÿønô_þ*ø}íÍÿCGÃÿü7z/ÿGÔªÿ5?¾_ü€s®Ïðÿ3û¢¿Ž_ø}íÍÿCGÃÿü7z/ÿGü>‡öæÿ¡£áÿþ½ÿŠ£êUšŸß/þ@9×gø™ýQ_Ç/ü>‡öæÿ¡£áÿþ½ÿŠ£þCûsÐÑðÿÿ Þ‹ÿÅQõ*¿ÍOï—ÿ ë³ü?Ìþƨ¯ã—þCûsÐÑðÿÿ Þ‹ÿÅQÿ¡ý¹¿èhøÿ†ïEÿâ¨ú•_æ§÷ËÿuÙþæcTWñËÿ¡ý¹¿èhøÿ†ïEÿâ¨ÿ‡ÐþÜßô4|?ÿÃw¢ÿñT}J¯óSûåÿÈ:ìÿó?±ª+øåÿ‡ÐþÜßô4|?ÿÃw¢ÿñTÃènoú>ÿá»Ñøª>¥Wù©ýòÿäv‡ùŸØÕürÿÃènoú>ÿá»Ñøª?áô?·7ý ÿðÝè¿üUR«üÔþùòλ?ÃüÏìjŠþ9áô?·7ý ÿðÝè¿üUðúÛ›þ†‡ÿønô_þ*©Uþj|¿ùç]Ÿáþgö5E¿ðúÛ›þ†‡ÿønô_þ*ø}íÍÿCGÃÿü7z/ÿGÔªÿ5?¾_ü€s®Ïðÿ3û¢¿Ž_ø}íÍÿCGÃÿü7z/ÿGü>‡öæÿ¡£áÿþ½ÿŠ£êUšŸß/þ@9×gø™ýQ_Ç/ü>‡öæÿ¡£áÿþ½ÿŠ£þCûsÐÑðÿÿ Þ‹ÿÅQõ*¿ÍOï—ÿ ë³ü?Ìþƨ¯ã—þCûsÐÑðÿÿ Þ‹ÿÅQÿ¡ý¹¿èhøÿ†ïEÿâ¨ú•_æ§÷ËÿuÙþæcTWñËÿ¡ý¹¿èhøÿ†ïEÿâ¨ÿ‡ÐþÜßô4|?ÿÃw¢ÿñT}J¯óSûåÿÈ:ìÿó?±ª+øåÿ‡ÐþÜßô4|?ÿÃw¢ÿñTÃènoú>ÿá»Ñøª>¥Wù©ýòÿäv‡ùŸØÕürÿÃènoú>ÿá»Ñøª?áô?·7ý ÿðÝè¿üUR«üÔþùòλ?ÃüÏìjŠþ9áô?·7ý ÿðÝè¿üUðúÛ›þ†‡ÿønô_þ*©Uþj|¿ùç]Ÿáþgö5E¿ðúÛ›þ†‡ÿønô_þ*ø}íÍÿCGÃÿü7z/ÿGÔªÿ5?¾_ü€s®Ïðÿ3û¢¿Ž_ø}íÍÿCGÃÿü7z/ÿGü>‡öæÿ¡£áÿþ½ÿŠ£êUšŸß/þ@9×gø™ýQ_Ç/ü>‡öæÿ¡£áÿþ½ÿŠ£þCûsÐÑðÿÿ Þ‹ÿÅQõ*¿ÍOï—ÿ ë³ü?Ìþƨ¯ã—þCûsÐÑðÿÿ Þ‹ÿÅQÿ¡ý¹¿èhøÿ†ïEÿâ¨ú•_æ§÷ËÿuÙþæcTWñËÿ¡ý¹¿èhøÿ†ïEÿâ¨ÿ‡ÐþÜßô4|?ÿÃw¢ÿñT}J¯óSûåÿÈ:ìÿó?±ª+øåÿ‡ÐþÜßô4|?ÿÃw¢ÿñTÃènoú>ÿá»Ñøª>¥Wù©ýòÿäv‡ùŸØÕ|Cÿ#ÿ“ý¤¿ìŸ¿þž´Šþpÿáô?·7ý ÿðÝè¿üUyÿÅOø*Ÿíoñ›áß‹¾ø÷Zð>£áhóèší¥§‚l4Ë·´™’T’ÚúÊxn-î-î!†æVhÚHU."žÝ¥‚J†¬g 9S´g;9^ɦíî­Dæšk]SíþgÿÙPythonCard-0.8.2/tools/standaloneBuilder/doc/pic2.jpg0000755000076500007650000032502410231140007022412 0ustar alexalex00000000000000ÿØÿàJFIFÿÛCÿÛCÿÀï"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ûþ ÿ…ý¥ÿàžÿ´¿Ãÿ‚_¾~Î^!ð†½û7ü/ø£}ñ;á~¥â_Gâ?^x×HÕ"SÑ»ÿ·üïöÇñGü&~7øoÿßükñG]ÿ…ðÒÓíÿ<ý“ñ×Qÿ„ÏÀ6_ð•x íž7ðÇÙ·|'iÿ ï‚~Ó®iÖPÿÂUáýÿÛ:å çÄÏØ#öÖø%ûe~Û_¿fŸ‰ß´%Ïìðþ GðxxãÆ¿5ÙÿãíGãVø“â‡_>/|dÔ|¨ü^Òì5¿‹zmŸ†|âFñ6µñ«Ç¶ÿ ü¦/„¾)ü=ñŽ£§ê?ÿ¥x?+àÙðîO,Ç€ifÓŽ &†34ÃÖO_žãèeù}9ÑÅÏ‚Š©‰ÅÒ§)iF¬)ÂuÝe8þsœbshãqVÏ'…N®2TðÓ‹öq£‚ÃÔÄW’%ˆ¬ùiД¢¾­Ë)57&_ø9söð=~~Æ#þè—‰ó’ŽÄÑÇ'žØî j/ø9[öíßc@rÃà—‰°˜I›?ðOÈ—v¤›Þ4ß,Š¿ðO_Ù~È ã¡ð„†ßðæøl£ûzÿÂ{ñ<øxwü,åÑÿá”ÿá0ÿ„Édüxƒ'àgü*…øà6®”$ãÄkõ÷‰?c_Ù#âß…ü'ñcÅŸ~&üUø‹áø#çü_â÷Á¯ÙOÁ¾$ý§ÿj«Ûøçñ‹â–ñRÿàÿÀíSö¼øiûAëß > iVž ð׆üáÚkŸ ¾x{ÆÚ‡‹ U8¢P|ÙÒSt#^ ÎJ.œê;Éáâ—,iY8s¬š9OÞqøF/ø9öé½ðö8NH?ñe|K‘ÓiÃ|F\‚ Îv•+‡þz[XðríÊæ“~Ç#§üÑOädßâ@ã’=F9ÁÜ­ñ?ì[û;Ûü&ý¨~-~Ê_ðO¿~.hŸ·ÿ†ZGì_ûOh_´CükýšfßþÌÍñj߯^%ø5û2|SðÅDñÅ›½gÂÿ|yñWÆž<ÒµŸ‡ð}‚]·Žcñ†µ©ý¡¤|øSûeþÐðCOüOý›ôo‹³?‹ÿ࿾xËöеŽš}•ßÄ…?³ÇíWªj?³ÿþüKÑ~éšÇ‚¼sà6ñ‡ˆü#eáë:gˆ|7©i÷‰Âú§…â0>aá/| Òÿcÿë~Ñ—[ĵñ‡ƒÅúíb0^aêU§_ƒ~¯Rž2ž ÓžœÛ«<Ï:Ê*MJŽcVŸ³¡áüÊ[œ'(B•JëF¬Z=·Ï’T³nxºR­Í’ŠQŽŠŒZžç©C‡p÷,¥'ʃ·›ø8£öÛ=~~Èþ辿ÇN¹ø†8äƒÓsƒ¸&”?ðpïí¯#ÿ ?dhÆ@ ü×÷Œ¼ÊG>Ïã·í-ûSø³ÄÞø—ñ_ᾇào†ÿ~|Iøs¨üBÑ<â/ èþÓ|u§x7ź7—ƒñÁÐÅOƒjSuè:ñ ðpxÒy_Ä¥%G1©IºøÏ P§Ru&s¥QRŒHì—º•),Þ2pš§íiF›šÆÖËånl4f”+᪹9EGÙ¨Î-¶‘ð2Á¶›»ágìŽp¿µ²óÜøô;dªô9 óˆåðpoí¢æ—~É×þ,εé‘×ÇËžùéŒsƒ¸'ןàž²×ˆ| û'øÇã—ìªüøÑã¿Ùwþ 7ñO\ý˜|;/íúßÅ_‹_³ïŒ>hŸ¼ ¡üø«ñ×Oø×âÍY>øƒÅ4¿†?þ/ü.ñ7Ä[Í: ëiž‚âO)ÔÿfoØ7Áÿ ?m?þ/ý…?jiÿ³ïÿø'÷‹,þ |pÔ¾%þÊõï‹þ#|jñïÃ_‹×¿ ,u|zñ>™ð7⵿„4C2xûÄß¼o¡^¯ÄO xâ„5 ]ź8_ ªÎT©p=ZõV&–0§Gj¸šÙûáÊTèÖžs =XÕÇÆU#^¥†úªs•hÔNŒrN)Œa*™Ü#NU›”ë^4¡€†e)J í"á‡j.›‡´ö¶Š"S<¶/ø8öÍsóü,ý“צåõ’у#®_þ+ŽHi.qP.~Åy?à¾ß¶IÆï†²x$½Ò`×ì¼=ñökñÇ‚uÛ­ òûPÓ¬õ«m'Äþ!Òµ *æóLÔ,¡Ô#¶r^išºNf³¿‡OúWXý’d´Àm7à¯ìáûKê°øCö—ÿ‚vk¿¿l_ |<ñ¾·û=x×CñGŽ~·ŒµŸ‰¿´­ñËÆÿ >$é_SƱ]øcRø9ðàe—†¾(XéÓ®5¿ Mv×Xcö}ý•~%üDý»~;øïöoñ÷íñ@ÿ‚¡xûá?Šþ üð¿Åߌ>-ðïÁ½?þ½Z÷â-·|ûF|ñwµož0Ò¼\u‹ž1ñ'Äo†ºtTðïÃÿƒúNk¨hz/“*Tö8š\–_,%:ÓrÃGëµkâka)aéF—ö”)a¡¬¿kSRî¤'K’‹T§ˆì”¸•)RyßûJ«($ª¿c t¡RU&æ°ÒF½’´iEû²Œ“’çTþS_ø.çízzü4ý–:ãƒÚ—àÿ¦~¼ Î0â;Áuÿk·Î²Ö$²üÔˆ\Fï¿ð˜üÄí$d Â0b€³Å»ñöhý‡|ð“ö³ñÂOŠžÕjoÿ´Ÿü_ø£ñYþxßà·Ã…¿¶ï‚|q⋟õ}[øweñSÂßcÕü ­}¼à/êú—‹|O⟠øÏTÓ|7yáo°´¯ØGö3×lß…?µ/Ø»ö‘ð‡Oí%û@øPñgˆüñ«ágìïñ;áo‡~ |]ñ‚t/â_ŠÿhÏ‹,ñÏô¿|7Òü_àï|?Ô~ø{Ǿºñ%î­ðâÖ+>Úߢ¶ÂÜ=˜Š¼YR§O=¬¤°øfªÑáêØŒ6:­?øUZTÄákÑÃS›…iJ1©^ 5)ÔxQ©ÅU\iÇ;ƒœž_Z‰Æy:UhA¿©Þñ§RœêÊ*PJñ§*“„¡Ž#ÿ‚ãþÖÏË|5ý—ã9ᡸpHÀo n‡#*T/μշ°¿ð\ÚÌœ‡²ÿ^ßo¸±“ÿ~qŽ1€A8Ä‚/ZøGû~Ëß>~ÏWஓ¥xÿâ§ì•ûøÿóO„|kñbãÀ_þ:þÌÞ:Ó<;ð¯ÂþÑõŸxƒãkÞñµ¯øÁžø·§jzÃøI¾Ñl´M&ÃÅÖzÍ?ÙÏö]ø«ü,ø“ñCãgìYñ?WøÃáÏÚ‡áçÃßþÉ?>þÐþ9ñ§Â‚׿-_‹šÖÞÛâßÅ|V𥖯¦éz„>6œú”„ðÒ†.Ràç̓Ä<-j*ŽÖXˆfxœ¦¥8Aæ¾ô!‹ÂVRÅ'õ5N?XUêB’Ê~*•JYÒå¯MV„JœžÍáhã#)Kê–NjmRiVÒRö~Î.¤|æø-ßíe!9øqû0€>ó„W€/ÈHo€Ç<ýäQË”]ï¼ðZÏÚ±Á-ðçögŒ ä7Â;ÍÂF¼NºüÀ€¿8FóVߥҿc¿Ù¾óö1øùñ7Ÿ ¼{àO‰ õ_Ú7SŸ\ý·~|zðRßx;Âþ>´ðïü7ø¡ðËÇ?gÝã†íü#·_¼káωž)ñ—í/oâ_IáÝáÖ•eyâÕºmùe6ƒó8ýêqü?èñg;zn*í‹Ëòí=Ì«„|9Î¥XNÃÒyv2xDqT*R½hrKš“Ž&q«Fp”g ‘qMM&£8ÎàÇçK€t\Ú¤–&„q*šPmÆÓ÷#Ë8Ê.2‹µœn®­'û¿ðZÚ¤œ‡Ÿ³?^ßî~Q¸ŒŸøª³Ó‚00ÀçErø,ÿíM Rßf„ Ì~Ý€¹ßóÞ$PÀËaøTrÅ@”Û~< çîã^-ôí6Ú‹‡{®6rÿ0ÿGMÃåù¾sµÑùY²õß†Ü où&rí“øku·ý=óðmhñ¬ùÿ³OûS{ïx_oú÷äº=¶ÒËö!?à²?µ®OÃïÙ½H°? .ÒU˜»Äh[¢ò¬!åÌ¿ðXßÚ|œ~Íý{|&—¸€N|H; @Á8Ä‚/É( 0Úª0Wo—„<'î"ÝŒgî®aˆöb h9û½p:›¯Ýœr0»HþŸèùGÃ~³¿ eÝ>ÍkýŸú{æú=<µS'â$žiŠù¸yÓµÛ²Û}=ß×8?à°_´Ô§ ðûöu^™ð©¦¨,[^èÊ@k&[Î-4GüÛö–#-à?ÙÕH`>±Áù²:úîÆ:ü¹Á$/ÍåþJY¦G— ÚTí+/÷ª2ÇìÉ¿>^ÖùZ(ÏËå n¢íP6Ú `Ëýÿ…¹‡?ñ?ç‚098ÃùZqÁYi$7?g±Îß…dìð·k!±‚UT*èCm"ålÿ(Ps÷qƒž;|Ç“òxä``áÙþ»l˜aû°6°?(ÀLÉÌëä' ³ç]‰²Däû>Í0—‡§ücywƪè¿éêóëß]ùn|QÄ ¶kŠMÞúÁ=-ýÄÿ»cõ=૟´aoþϪˆ…jÛN #'Y]Ø#© Àä/Ͳx¿àªÿ´S’ÿgóò¹ù~§Uˆ'ÃqÎUGs óÌÆÕhM  (ÉLòƒå.@Ç € ·÷w!_›z,‡d +‘å?¦s±v•Îè¶o·Î>pCµøo/Ûùj÷Kþ~vòó½öš|QÄ÷ÍqNÜÝaúAío+[ËÝýF‡þ •ûBÈNÿ|^O ð± /Ì»SQƒ’­…'Þ £¶º?à¨?´ '> ø 9䬃+Ãuÿ‰® ãýžœãæ1þeÚ®Óª˜-Â'Ì»ž!’~Í›6¸ýß–cuÛ•åXë(ÁèF§Ì¼7S³“ÆG+Œ»·1dü;à•&¿Õ̯üµ¿Y¯êú-Z…Å?¹!¼ð'9dø[¹äiÄ…È ù1Qæ<ñÁK>=8Ëx3àbùøam»;TŒ+Þ¦AËsWh«!’83­Æ;Xm$ïA‘ÊÇ yG-òîS˜ö²š=›íz;dÚ3åìÀÆæ‘s\(û<9VÛÓ#`DM‘ìòmb~pRnÜ;—­¾Í[lŸüý¶ûëëaÔ⎠\¶ÍqJÿÞx¯ä_—m´?E‡üŸã±Î|ð4`œÿů´%~÷Þÿ‰€ÉÉû½HùÌvàÿ‚|u—vïü  lÆÐCóƒ{ƒŒC4x ÅÊ šKoÎåÏÁ=Jãyçä#ê¼ÊíÌ:kÉ;ÊêsЧÞ;òÆ ÛÈßÀ æ?'α_ñ8+–ÿêî_~[ü5z5ÿOcçÚý_EKŠ8‚ßò5ÅnºÃ¼¸ÿ5nÚiú+üK㄃-àÿ‚ˆ1Î~Ùg;†\&Tå¹à¨PVC"CdÁC~6sŸ ü'?ñl¬ Q‡àÿ¥€HÚ ^‡%~cÀ©´gÊ Œ°Ã.b‡…g‹äm¹Ç"lo“o L`žƒ•âNûÌ1“ÊãWnbÊ>p[Óý^Àtû5?i~ûù´£ÅAÍoí\U®¾Ô-º]—O7²zÚëïÈà ¤*ÂÔnoøV– -*ï9›  • ÆÉ 2¨¸6zqþÞÿ|+ðqNà~ià U ¾H˸‚ص”8eO- Ø£iFÜËÂ~òOÞÜ Ãäåw|¡Y·GäoÓ· E# ƒ6lýÔ_*&§'hÚÀ¦ÔÛåE_ø17nÀ-VÑ«m×ýø<1œøVša+€üæ€HÚP89 n1éÛþÜߥ8 ü#\¶_†úVbsGºLòpÒ6(#e‚‹¡cðªŒg‚1žÙdÇ™ß`Ë gïWnè¶ìÓG”Ãl™Æ?Õÿ¤ºQä ýÍ­ûµÄˆáöléDü?àÅ×`ëîÕ]?ëêíÙu×V“|QÄ )¬×~k|Pòzû½ÒÝGkZÚ/·WöÛø´@-ោjp2à à§vÂFI  eY‡í±ñ`ç>øJ1œãᾎJà9Áõ?.z¨À9ÀÉO¢]ª£b¦F}ß–1µwÉÆ>êà(W#²£ˆÆz •ÂÈp~NXc åzu\n(p6“áü Ñ}š½—ý<òüõß–iqO=ó\S×¼?ùÙ}§¶ûµö¤_¶WÅGm­á¯…_{gí„S+ f&ßtme(…dF·mÒØÞ¶Äóÿ2÷ÂÁÓþiÖ‰‘x‡‘ê1ÎàŸ[&+d ˆÇÊ™œ|î<…å¶a×ËdªîþÍ·IØAÓNØ#„ÿax8öÁP01¶<¥À\¤í`ð½Wüü}/›ijÔ¾)âÅ,×÷ãý;}—oSë4ý¯>&¶ìøwáË»$|:Ñ>B#•ö¶-Û$ì œ Ú® PZHµ`ý«¾$HÄ6ðÄcvBü;з TÝhÏ)ƒ±ƒÄû•XOŸÈq/Þ;[å 2>_î¦m§÷-–ùw+e6„'rmó èm@Ú€¸dùÑrÇÉ^—´.cÚÑ2ìO'ÉÓ”¸ƒÓvÈ0?ø ^–ÿ§žZëë{]Ú¥Ååÿ‘áO᫽“þuÕyuZê¢GŠx«¼×ºë l¶÷RéÒOÓ·Ô°þÒ^>“ïh_×±ÿ‹áÜŽ §) 庅+´U9-ìÚ3Çgþ`ßǯü[ÿ údu°\÷ÏLcœÁ>tµLõ[pO$r¹ôB|³8Âù{6ÇåùVwÔc°öÆ8>DëŽzc|¸ÄyGxFßò!ÁtéWûþ~zü¯¥®Ð¸§ˆn—ö®*Þ°î¿»émd}í ã‰3áî±ðÿÃa£f?0m4#0د1ÀÅ™M-¶¬_üfÿ{GðôàxÃyԆΊe‚qÝpEóÞÏÂc¶0:ã 8>EÏN}1ÛbÑvÈ>FL2Œ˦&œáÏÙ—s®ÌžN {¿wäùºz—p—*ØX+ò§µ^¼·¿¾¿YßÞNé7Å#|Fó~%ø¨h:€<à¨ÿá&ÿ„Ûþoìkï ø·LÔ<7ÿ ç]³°ø‹yã_iþ»ñ–…ð<”dœ7‘áñùnI–,E\× „“¯B¥hû¸lmY%^ ™ÏNÎëNeyÛé8?2Ís¼Ò®šæ<¿‰Š¥Z4¥íiâpT£y*M¸¨VšjÛÙèÒKìŸíÿÐÛðOÿ åÿÿ; ü$ÿ‚¨~Ñüsÿ‚wø³Ä^º²OÞ|qÓü"—ºW…´ï[øâ_|yy4v6­Ç†u_ø"?è:~½ •ã[&‡¨ë:‘¯Z}ƒMðßø'·ÀïÚ«á·íUðóXÿ‚—x ãgÆO‹’üÕ4ïØkã~­ã;?Ú[áÏìŸðå,ØüKýžþ6xËáßÁ¿†ÞðWí¯¬xeü=cñ#öÅñ~Ÿ­h_µ†…¥ÉðëáÿÅM;PÐuŸüIóÚ#þQýœ?õ£>9Wæ8L]ËŸª¹nUF¦-Áâ°ÕðXiQ© ³ÏrŒš›­QJ.†"µ9'¬åÙ3ï+áªàq¹3§ÌkC˜WÃW¥‰Ä*´çIež&)ÃÙÆÒl5¦ŸÙìì½Óþ /ÿ–ý£?oÚ“ÀþøÏàŸ‡<7áÏÙ«á/Ã[Û?‰$ñή¾¹¤IâÏ]^YÚxká§Œ¬$ÒÞÇÆZTv÷ê¶×†îÛP¬aHí/eü¦ƒþ Êý·" ·ÅÙTcq|oñd“ óB“øyðóÀ¿³§†<ðûÁÚ¯™=‡†<áß諪^ëÛYw[ÔõIÿ¤¿‚ß´$?¼Gãøá?Å?>èž ñ‡ˆ>üZ›áV©â1ðÿâUÿŽt_xúË_øñGã7ÃkÅ>#ø[ñ?ÃÖÚ9ñÜ^8Ò¯ü ©^ø“ÂZ.ƒ­ø/YñAñCöŸøUð£[Õ<-®]ëz·‹´-oöPÒµß xFšký"ÃöÎý¡îÿfO‚ž%ŸPÕäѼ9u¢]|IѼS'‰`ÒõÍCÄz‡<'ªê’x~æãPð¾Ÿâ×ã¿ʵ:ÒžK0C9h_.0C­¥ÿƒzÿlñø¹Ÿ³éãOй #‚kÇËíŒ.B\Ÿþ"ø7àÿßüZø‹¬Â;ðûáw‚|UñÇ^ þÏÕuoì/ø'B¿ñ/‰õì­ ÇSÖõ?ìÍL¾½þÏÑôÝCU½ò>ͧØÝÝË vÕ_ñ|Cßë9V½²én½gèíÓO#?õ Ó÷X?ê&^Zü;è¶?àß?Û227|Jý˜8ÆÖ3ø§¾<;”‚hÌÀ¸Á2)ÂáY`’ßVø íÁø‘û3T¾2øŸÆ~_‚‘~\}Ñ÷T®Å%¿ô}ñ/ö¯Õüñ§]øàÙwö†ý¡<]á?…ß þ-x»QøKªþÌš‡<5áÏ‹,ø»àïÙ^Ýü{ý¤>êz†·¨j|w=Í·‡´jÃN°¶Óe½Ô¡¸Ô¢µ_Qÿ†Šø9ÿ çÿ iÿ ‡ücïü)?øh¯øOÿáñOü‘ÏøAáeÿÂaÿ¯ö'ü&ßò$ÿÄëþÿøFÿá)ÿ˜oö'ö·ú9x÷â#Õâ2«»m•Ѿ¶kE;«ÚëE}ÖÚ7Àù ÿ—xŸ–&K³ºV·D.ëÿý±GüÔÙœ} Qñw‹ôIï4F-FÖoÂÞ*ø «xcÄúL“Cz–âm#VÐ5«E—NÕ´Ë» “_Ó߀>-xsâ?‹>8x;C²Öíu?€_tŸ„¾1ŸU¶°‚ÃRñ³ð[áÇk[ß Ki©_\^h‘øGãW…´éîuK]ý|Gaâ HôÙtË];WÕ}F¢~=xƒ(ºs¯”Ê¥eT\e-SNvjIÙ¦¶Ðk‚2(í RwM5‰š’jÍ4ÒNêÊÏuÑŸÍÆø%oüwãÕ€4‰_ÿei|1ð¯GÖt?†þð=熞²ñ.½uâKᆟ ?g?xHÕ¼S¯]¶£âYxfß^ñ,ÖšRëzô:6›âKÿ ý®Æ?ââ~Íÿ‡‹þ&qÂŽ1ðyzãž06„þ‘~4þÐü%ñ‚<áÏ„ÿ~;|Tø¢x߯ø_ð–o…Z_ˆÏÃÿ†·þÑ|ãëÝã‡Åƒ? ­´O xâ—Ã\èãÇrøãU¿ñÖ›{á¿ kZ‰ãMgÂþ¡ðëÆ¿ð°ü£øµü%ãoÝêÚ𝂾"è?ðŽøËºßh> Ðu‹H.õ=SþÌÖôÍBÓOñoƒ5ïü9ñÖ•~ø×Æßµÿ x·YÇã‡`èÆŽY.„\å 42|5*Q•J’©RQ§MÆ)Ô«)Îo•sÔ”¦Û›lr଒¤ÝJŸ]©?u9ÔÅÎr|±Œb¥)&ß,cÆïH¥d’?—Èà…Ÿµ¤{sñötH+·ÆX®[q'àèÞÅFH!~tR¥qmö+ñÿÁ ÿk ÄÙÕpÊž-ø“µpWå_ø´+•Àãå^@À`‹úª¯.øñkß~ | øíàë-oMðÆ¯…Þøµám;ĶÖ~#°ðçÄ é>1Ðì¼Ai¥êZΙk­ÚéšÍ¬­¶«ê¶_Çü(ñ—ÅŸ xÃEñµ¾‰ðàŸ„¿h¯_ltÝ ûÁ¿~x»Jý§µ|a¨XÅâAñÄŸØ÷²·‹t-cÃþð/‹¼Sý«ã‡Shú&¯¢\xãXð/Ô4KÇ>Ýâ2Ívÿ„Ú]“ÓßÓ£¶–ÓD˜>Èôñ_øS/þDþsWþ ûI¾5ø0rñ/1÷Éð¬€9$>`0@ù6àÿ‚G~Ò'Æ_²»~øHürÅHîø`„ç€C?DJ$ÛÿDôRÿˆãǶ·Ö2Í’ÿ‘m.Ÿöÿ’ûƒýDÈ-ËìñVíõ™ò'óÛüsöŠEU>3ø*0ªi'Oe·ûL—ßhÿÃt±øzŸðMŽªÂUð‘05ï€ aOü C„áFü»'þ ­ñÍOŠ~t`×|]€HÆ~oqxU ¨ÚÈ|¶‹öã_-±oþ©y{ËòVpüv§Šë¾*OXÿ_%oÅ{ø'Æø±Ÿü(@ åë~*$dÄO?ð€Çá0ávÚ6¦µ¼?àŸÁñT|-ÖüW‘øÿ 2Fr>ïAŒaJ~ÍQRüiã†ïíòÔü²ê^_Þòôí²´ÿ¨={û<]ï÷©~|·ün~6ÅÿñøÐŒø›áx ðS[ñWÉž¤+xà !me&6ƒVØãXÄ_ Gxk^'.¿$JBíð4_)({€q„UM‘ÁúûE'ãG=ñsÿº}>ÉtŸeò»°ßðô­zx½6ÿj’íýß%ý\ü_Øãÿ™“á¨ç‚5’:óÿ"`ÉÏUä „1Ùƒö ø»Ëx‡á©ù”‚ºÇ‰²˜<•ÿŠ1I'ÑZ–×âÿ®×JÂà.Nê»Þ÷úÔµõ÷OËø?bŸŠq2®|=%H#UñÚC–Üü!êXà´°ûƒk!íi©ìmñ9A×<¨ÀÔõì&5*›<'*J“’«Î0ª»R?ÒÊ*eã'Ëzùsÿº}>÷þÃõµ‡À<<ízX­?ê&_üåcól~ÇŸÿçG<©ëÅ”|Üçþ`K Àç#§!JhÛþÈߢۻXðGÊû”.©®?z–Ï…T9(FÄùム¶¦ÇôNŠŒ|jÒN¾]eÓû>šü¤¿¯EcýBáö¬éâí{ÛëRòþî›tïéoÏÈÿeˆhª?µü¸P0ºŽ¶BáPm\xe>_—…áW £ “/ì­ñÌcÁƒÓ޵0ÿ†ù Aùzqƒ´¯ß´T¯xÑj«å÷_õ/§åýï/óÙXðôv§‹Þ÷úÔï÷òÿÁû•¾‡öbñädÔü¸}ÁcÔu} ù¨Åˆÿ„iU™”ÊtB…BÚ‹ý›PU×£xxî!™X0*FÜ)V(ñjÁû?øÊ&µ à·š–T“ëý‚¹P¸Rª¨`ŠÏëú(~/q›Þ¾_Óþ`)ù{MºmÒÖVo€xyïK¥íþÕ=6ÛK+[K~Šß&/Àùˆxh}/5.8_Mr9éÐchŽÌ?|Y«Cü0!–óQ,£ ÁÑAf«¯ ˜F¼¹"úªŠ_ñxÊÖöù~Öÿp§¶ŸÞì­§è¬.áåµ<_¯Ö§½E3æ˜> xš,fï@î·wÄ®D@ÿdISÀ G@¨"KkKð‡Äƒéšás}Ç 8Æ”½qÏNƒB}EJñoŒü¾ËúÌ >–þ÷’ü÷°¿Ôº~ϧýEKñ÷®‡ÏÐü)ñl7]èxv²Ü^o@7’À)YÜÈ>bdu‚[}H~k‘Œ }Þ{œ ,j~î™?tÿû«·jùqÁí´R~-q„¯zØ m¶šÙ§Ò^[mÙ!¾áç½iz~—o£è¾ økâ_‡¾ð¦‹aÍæ£p¶°Ýü#Õõ½BëQÖ5=WW½Ô|A®k:Ÿ¨6Ÿkuk¡iú6‘¦ýsEyøÿ3üÖ„pÙ,«‡h×*øJ­ÎšJkÞP©R7¾ÓwénŒå9}g_S0ÂÖtåIÔ£‹q“§9Ó©(;ÁèçJœ½bºh| ÿ eñþsöÂÿÃðëÿœ­|1ÿ'ø!¦þÏŸðMÙ¾hÚÖ³â/Nø¿ ê±k#¸ÒîuëûÿxÓÆþ5Ö§Ô_DÐ|5£®ícÄ·«iŸ£YCšAž6š_Þü’ÿ‚ÖÿÉêöSþÿèíR¼¥ÄXšÔ«à¡Ê°”ñÐ¥C<& Q­:T±8|d`ª{IZ?XÂQœ´×•®¬ôã“R§[‰ž31ÄÏ Ru¨CŠuiF¬ðõ°Žn‘¼• EX«½9¯¹û+âÿù ZدàýBü?_ þܼGñ÷à-—à éÚÞ¥q©~Ðß±§‰uôð×oþxŽÃáÿÃÛàGÄŸŠ ðÿŽ´oøKÄ~Öü1ðÛÂ^+ñ&•ªøCÄzWŽ ¿Ò ¼\Ú,ýÉâÿù ZدàýBü?_þÕÞ/ø™áŸüÑ~øÃOðŠþ+~Òÿ> ê¾±ñµ†‹¦üZñ„> ¼Õ'ðÍõæ–º·öKjkXÛë:%ÅäÚ|vÚÖ\NÍóÑŒ¥ZѲ“¨í{ÚêMëmzt={¥ÞÖ_‰óí1ûiZWÀxàïÃo|aÒ~'xÛÀÐþÑPxãÆ> ý«i_|$ð=·Š¼Aà? |$ñ/üÓÅ?> ê_ð‚|l¼ð‡‹m¼ ñ¿Xo† ðˆhO|'д¿Ú Å~Õu_Ï/‡ßðN¿ÚPðDüDø=ãiµ¿ÿÃ(ü4ð§ˆ5ˆ?<ñãàGìåû8Ák¾&~Ó¿€/¼sû=øßžøGý­û|Hø1â‡^ýŽõÔð/ƒ®f­CÀ¾°ø[­ü?ýž|+âßèGþ#öæÿ¤ˆü?ÿÄÑú!«ŸÑ¿c_ÚóÄz‹4ÁM¾뺿€¼Amá?iz7ìqáMSQð_Н<+áŸYøgÅ–6?´|÷>ñׂ|iàïÛhÚÄVzŒþñg†|C³iö—yuÖ°Ø„­ÍIûÊWn|×[k˶‹îKbyãÙìÕ¬­go?#á»ÏØïÆRþÌßðTÙ[á¿…<ð‹á÷ÇOøZ¾ý<%i&•ᯃž ðoÅOØoà§€u´øÏV‹áw‚nÿiÙþ6x§Åº“àë WPñN«ã_ˆÑøcX»ñ¤zLj¼NëöUñÕ߯=7^ð¿ì‹ÿ'‰µŸ±ÄŸÙóãÿ›û9iðÿ²OÁÿ ~Ë–¿aÏíŸ |LÔþ.|;ÿ„ŸOøMûNx+þGì¿á/‰_³Šÿ᥾ɫüE‹Ã?þ3j~ýpÿ†ý¹¿é"?ÿñô_þˆjçõŸØ×ö¼ðæ£á=Ä?ðSoƒú¯ãß\øOÀº^³ûxSKÔ|iâ«? ø›ÇWžð÷íψüAkàŸøÇÆ7:6棅|'âoËlºFƒª^Z¥†®¾Õ-{¹öŠ»÷uo•^÷¾½CçgÓ¢éó>Pñ¯ìymñƒöÓø»ñkâß<;ðúûö^ý–>xÄ¿j_³çöñ_öÌñ/Ä}ÄZWìõñ‹á¶·â?øG4O‰? /tCǺn¡¥YÂO©Ûx&ùnåñ´þyüRý’ÿá¨|]ûjþÍ_²ÎµðNÏá…á3ñîãO ê_gøsðçöñ÷ü'â÷ü_Oý„ŸÃŸ¼7â øCþ'†|'áïßu›]zßÇ_ t/|*øUìáy§øªÇâE·îßü0GíÍÿIøÿˆ?¢ÿôCQÿ ûsÒD~ÿâè¿ýÔÖºûTþïNÊÖÖÜ›´¼µm‡<{>ý:|üÈý'ö ×mµßŠß|û8ÿ§ø™yûkÿÁ=|kû<|9ð&“ðâæïâÇÃ;?„67?<Ù~À?µïü#ð,?³Î·ð§Ä~Ñ?e¿þÛü5ñ#áŸÃ¿þÞ?|ûpþÁ_¼iû_xâ_ÁŠÉñ“ƺ߀¼ð+ö´ø“¥|_ý¡à×íI¦_üz‚‡¸ø“ñ âF—á¯Õ}EÕ|GðkÅŸ´g‡¿à¹Ÿ±»û>x ÄÞñ×ÇmàçÀýSàׂüUy?†mlü3âωö?µ”þ ðçˆ.®|iàë{mX×,õçñg†aŠÙ¤×´µºõÿ~Ì?´—į±ÿºÿ‚®~Ïþ>þÑøà‹ü!_²€üUöÿ…Ÿÿá#ÿ…[ñ.Ïû ö˜¿ûWÃÿ‰_ð‡x»þA¿Ãž1ÿ„WÄðŽêZö§öV°ø…ö©ik^U>ÊI-¶Òþ®êÎÖ\ÑìúöÖöß_/ó?:¼û=|]ý–jO|]ø[û2k~.ý|­þÐ þ~Ïÿ³îµðÁsxCáÿÇïƒßðLoÜx¯áÏ€¾$|Sø1ð›À  øÿû1~Ó³ü@ðݯŠ<9ã‹ÿŠ¿-~ i? ü@ÔÿeÛo‚—¿°Šþ-üý£|Eªø¶]+WøéñŸö¯‚Ë[ø?åèšìÓ®è~"ÿ‚yxê_|=øŸ¢|{…>0øöÓÁ?³ÅgõÀ_~4üTÔtÝá‡üö_ø«ë>“Åš>—à/Ù«áŒ5[±xWá'Ž¥ñ6›cáïÚ‡Q¹¾ðü~ øýð'Æ2k6±K§'…~5|$ñ \#â?ƒ¯5Ÿ@Ñ¿c_ÚóÄz‹4ÁM¾뺿€¼Amá?iz7ìqáMSQð_Н<+áŸYøgÅ–6?´|÷>ñׂ|iàïÛhÚÄVzŒþñg†|C³iö—yt–²q•è·k·7}÷ÒÎ÷w{°æŽ¿¿ktµ­÷’ƒö0Õü*š¿ñCö%Ñ?j_†Ú¯í ÿEøñCöoÒ´ÿÙ“Åþ4ø™ûG~Ùºoeڧľø÷ñáßÁ_k~ ý—ü¯ü8ƒÆ:ÏŽn¾9|;ðçůü7Ñ|,<9{ñ&ÛÁ¾ÙðûöPø€ß³¯üká·Ä…ú&¯©þÈšßÀüvð߈.üâ;‡#øQÿøøùðÃHñ]SQÑüI­øöŠñÃtðÖ«àiüC¥x4¯h¦™ Oâ=7ïûŸØ×ö¼³ñVà[Ïø)·Áû_xÃþ&ñg‡¼sûxRk¾ð^£á=Æ>&Ѽ=/íº¾©áÿ êþ=ð.—âmfÆÎ};AÔ|iá;RæÖçÄzýŸ?á"ÓôŸðUïŒ)ñVO‹ t] ÇðÛŸ³ÿüÑþøwῆu_Áâk¯ìŸ~Ö> øañ³WøŸmð—þˆÏ¤Ïð÷LøÉðŽóÅß~ýy§þËø/ö¤×5%ýŒ4O[ÿÂÑø!¬~Ë¿´‡†¼Kð«áŸ‡?cÙ³á·ÁïÞÖ¿g¿ø—Nñ>™ûJü=Ñ,¼Sðßã‹4¯ÙçàwÂoþÎì>9Að÷âŠü3ጟ´Ïþÿ¹ýkË?hÞ¼ÿ‚›|µñ·ˆü?âox{Á×?±Ç… ñV»á_ê>ÑücâmÃÒþÑë«êžðž¯ãßé~&ÖllçÓ´GÆž±Õ.mn|G£ÅyÐÃ~Üßô‘‡ÿøƒú/ÿD5'†®Õ¯Ii%¤ª+ó;·¶÷íek«X9¢º>º[ÏÈüÿ‚f~Å¿ÿfÿˆ×'ø•¢|l°ñ´?åðÇ߈¾5×?bÍ#áÏí+ñ¾ë]ð¡}ñ“ÂV?³7Âí7ö‚ý¡üÝ[ÂÿµÝã‡íûã¯þÐ о&ÝÃÿgŒø§àü&¿ ø™©ü\øwÿ >Ÿð›öœðWü*ÙÂ_¿fÿÃK}“Wø‹†~#üfÔü+ú!âÏ¿|ðÏÄß¼uÿý—üðoÁ~ Ö|'ã‹^,ýš¾øsោüUáψW?üCáŸxóXý¨lü- øƒBø­gyðÇYѵMV×QÒþ!ZÜø.úÚA.š§ÁO¿iO ê:ýœÿà°?²ÿÇïé> ºðž©ã‚Ÿ³WÊžÓ|Uc§iZÅ÷†uøö¡×´‹?Yé]hבê6úv³¥_Ml–Úœ³7‡®úÒÑ[â©å½Óoe½ÖêÖl¢»ï}——Ë¡åðO€°þÍÿ³'ìçð›Vø¢|%ø“à_ÙöfðÅOøLøU ‡ˆ¾ iZGŒõOˆ¸×< ¯ê:÷‰5¿üTñÄoˆ^%Ö5=4xZñÇ-WÅž ñoŒ¼Gâ‰rhÿyWë?±¯íyáÍGÂz?ˆà¦ßô-_Ǿ ¹ðŸt½gö8𦗨øÓÅV~ñ7ޝ<3á;ïÚ> Ÿø‚×Á> ñŒntm+ÍF øOÄÞ!–ÙtT¼µè?á‚?noúHÃÿüAýÿ¢³–´›“•;·wïOõ‹œRK]=?Ì郞þ#öæÿ¤ˆü?ÿÄÑú!«À>ü9ñÿíAÿ Oü3GüŸö?ý¢?áþÄÿ„×þ_À?„ÿáÿ„›û_þ¿øJáýª¼Aÿÿü$ðëߨŸÚßdþÕþÄÕþÁöìÛÏ%}J¯óSûåÿÈ:ìÿó>½¢¸ø`Û›þ’#ðÿÿEÿ膯?Ô?fÚKHñÞ™ð·Uÿ‚®~ÏúgÄÝoû ûáÖ¡û(øËÇz¿ü%?Å/xgû3Â7?´Ä^ ¿ÿ„‹Ãÿ¾5ëºÙtùµôƒÿµ=?í_üY>}J¯óSûåÿÈ:ìÿó=úŠàá‚?noúHÃÿüAýÿ¢ø`Û›þ’#ðÿÿEÿ膣êUšŸß/þ@9×gø™ßQ^CáŸØ×ö¼ñ¦s¬x;þ mðÅšEŸˆý¨uí"ÏÄzF»¡ê—Z5Åäz¾¬éWÓ[%¶£g,ÇÔªÿ5?¾_ü€s®Ïðÿ3éê+À|#û0þÒ_5xwÀ_ðUÏÙÿÆÞ ð‡Ÿÿ f…áÙGÀ~$Ö&ÓôÏ@ÿ†ý¹¿é"?ÿñô_þˆj>¥Wù©ýòÿäv‡ùõä>ýkÏi×:ǃ¿à¦ßüY¤YøƒÅž¼Õ<3ûxS^Ó­|Uà/k>ñ׆no´¿Ú>êÚx/ÆÞñƒ¼Y£K*ê>ñV…¬ø{X¶³Õô»ë8:ø`Û›þ’#ðÿÿEÿ膣êUšŸß/þ@9×gø™ßQ\ü0GíÍÿIøÿˆ?¢ÿôCQÿ ûsÒD~ÿâè¿ýÔ}J¯óSûåÿÈ:ìÿó;ê+ÿ†ý¹¿é"?ÿñô_þˆjçüYûþמ𯉼uã¯ø)·Áÿø'Á~Ö|Yãø³ö8ð§‡<+á? øsN¹Ö‘¤ifðƪ\êš5Ö£yy¨Ýx•gy׾ ÓU4Ïi¶‘Ŧ›lª«l¸wwv~ƒ[Ê6åS¿½k6’û7¾½¾b¿“ÞÝ={œEÔoé?ô#ø_ÿüiÿÍ}ÛúOýþÿÀ¿ó_K•<~éÿò#ù?Ãüÿ«?+òõù%ÿ­ÿ“!Ôÿì§ü?ÿÑÚ¥}µû>üWñOÅ_þÔÿð‘&—i§ü:ý§|IðÃÁz>i-µ†‰á ü0øK}¢Ïys¨jÚÕþ¹­kÞ!Ôoµ}OP¸:޵ui`ö ¦£iŸÿÁkäÈu?û)ÿÿôv©[Q‹Ž"vmIj¶Õ_ªOð&ZžöüÑû+âÿù ZدàýBü?_þÕÿòýŽÿí ß±þ®¾Þñü…­?ìWð?þ¡~¯š¾2|)ñ_Å}_öy‹Â­¡Ä¿ jŸ€?)ünÓ¾.ÿÁH¿áAüMÑ> ~Ü~ ø“û!Âû8ÞÿÃ)þÌ_üGñÛAø#ûdyZ÷ÂÍGãìÝý·ðáïÀ¿Úgþ[ößñÆسÇÿð¸?áðïÂk{/Ú/öj²ð)ÿ ø¥ã¿ø'ÝíÃñ¯án»ÿ…—íqû ~Òß¾x›û3G×ÿáÿ‚“þÈ_±·|YáwûÄZ&ñWü/ßÙà6Ÿ¨fkºW†¾ü,ÿ‡yý—SÓüMñ7ö³žÛXýnÿ…¯ Ï·þ] ùº¯?ø³/Â_Ž? >%üø¥á¯øJ>|`øã/…¿|3ÿ ÷ƒtOøH¼ ñÚ—„ü]¡løwâV‘â #û_Ãú¾¡§ÿièZ®™¬X}£íZf¡e{1z¾ÖŸó~ÿ#;>ßÖŸæÇ öïñ§Ãωš/‰| ûjxƒöíÿ‚~|/øÁû1Ž_µ§„üð öñV©âÚ_áïíçðF_ÙOÃ#öøáâˆ<+ûQéðL}FøeðOá»ûPxcQý¦mµß‰^ Õ~øçI°ð¯È ü ûaj~xcã¯Ç/|ý´>$ÿÁGÿd_ü[°Ô¼ð3Å3ø[Ô¿àØO‰~<~Ñ_ +|VøaûGüðÄmOQø·û#ø{ã/ìÓ#øGàÏôüKþ‹~#øà§ÅÏ|1ñoÄ=Ä#¹øCâñgƒ¼5'Æ«}7áÏŠ Ô|?®ø{ÄÞ=øA£ücÓþüYñÃïøSÃ~8øI¬üVðg5ƒŸ´=7⻟xÚÖ-}}ƒþ¾ÿ>ßùuü5ÿæêkOù¿ Yöþ´ÿ4:^5ÿ‚„~ÓO„¾2ÿÂGûT®ø›û<|?ý¥ô_اÀÓø[ö{Òµø+GíOû7~Ü_ðPŸÙr×öñw†|qðËWñÆoˆ÷‡ÿdÿÙþ/Ÿø'¯ü3wÄXý‹tφ:Ì«ª·ÂŸ~ÏåÏ‚õÏÙ«Æ?¢ÔhoþçÂ×Ð?çÛÿ.¿†¿üÝQÿ _@ÿŸoüºþÿóuGµ§üß„¿È,ûZš?~~Õ±ÄGãoüÄßµìA£|V×øÁñ&çö‹ý¤|)ñ7Æv_~ üñTþ7ðÿì5ð'â÷Ä›O´Ç?û!ÿÆ?é³ÿí™kûÿ‡ÿ´ÿíûH~Ëÿ´÷Œ,¾o|Pÿ…ûÿý§¾!~Â_¶wÂ+Y?á&Ö­?gÿŠ´×íãþΟ >Ëãµü ÿ‚™|;ø›ñ‹ö˜øÕðÿöQÒþ1x›ö»þ¾ÿ>ßùuü5ÿæêøZúüûå×ð×ÿ›ª=­?æü%þAgÛúÓüÑüiþÄ´]ö§ü×Lý ?à¢_ðÀŸþ þÀ×Á¯„?ÿ·¿co‡?ñNk¿ðN?ø6ƒã­ÇÁøH?k/ƒ?þøþ?ˆþ+|Rß.…sñOþ%_Ùú/‹l~øzïÃUû}ðŸâßÆÏƒv? >;üRð×ü)ÿÁP?dü[ø‹àÿøQ_~"ÿÂÿ‚«üý´ßø»Ã_ðÌÞñ©ûOüJÿ…»û0|&Ô4¿øQZŠ~ÇàøwGü gˆ5OÚ7öºƒQÔ¿[¿ákèóíÿ—_Ã_þn¨ÿ…¯ Ï·þ] ùº£ÚÓþoÂ_ä}¿­?ÍË—ÆÏÚ{ãÇOƒÿ³Ï€Ÿö·ñ޾]x‚_ŒŸÿh è³W ðl±Ÿüþ}©ø›ö—ðÏíCàƒšWìû@üý™¼ñCö ø££~оø ðà×…þ AmàOÛ{övðçí#û3þкV‹õÿÁ_Ûöóñ·íçñ'À ñOö`Ö.l~0~Ù^öñgÇwÓ¾&xCá'Á÷øÛ¤þË¿|Mð/áŸü¯Äß´ì«áÿòxöyñγûUþÐß¶Ç?ÙãÅÿ~?\ê¿~ IãoÚöUøMàŸÜïøZúüûå×ð×ÿ›ª?ákèóíÿ—_Ã_þn¨ö´ÿ›ð—ùŸoëOóGáŒß¶ŸÆû?Û ãG5ŸÛÃö?´?mÿØKà_„ÿà–ñìÕñ ºïÀ/ÿ?àŸž"ýªþ(øfÒïöyø{ûx|SðÿÁ;¿µÇ ãf›ã‡¾ дï‚Þ-øðêÇáw>$|;¼ùƒKÿ‚§þÓ§Æ/‰^ð×íðþ‡ÿ>Éñ‹Å^Ö¾0~Ïjø%ßÂÄý»?aß‚?î¿hƒ^ý¾h¿±oÄÙ‡öeý­~8øÿâ·ƒÿl/þÞþøkñöb–÷â?Ä-SáÿÁ¯ñïú-ðl¿ ~øâÏ‹<#á¯ì|qø¦üRø¥¨Â}àÛÿøJÏðËàÿï ÿfxvÛHÑåÿ„wûf}>_júî«©úü-}þ}¿òëøkÿÍÕÖŸó~ÿ ³íýiþhþ||[ñ§âf¹ûJþÌ~(ý›¿j¿~ÚþÒÿfø)…µ/ÛÀ¾øßã.ð ÿðGSâçþh |áïÙsöêøÁð\ÕüM ø[TøðËMð_… ÓuO^üý±kÙÇŸ³GíWèµGü§Æžý´>Áðö‹ø?§ü)ñÆØKàõÁ/ˆŸ´oÀ-"Ûáïíñ[àö‡ª~Ô²gÀK?Ù?Æß¿ioƒúOÃoÚ$éþøûðÛööø3ðÏLøËû>|OƒVø;ãÏ |ñÖ‘ñß÷;þ¾ÿ>ßùuü5ÿæêøZúüûå×ð×ÿ›ª=­?æü%þAgÛúÓüÑü¹jðROÚª-áæ©ðËöàðÿÅ_Úâ_ìA©ü[ý³ÿe^þÊ>ð¯üûã.§û\Á2>|a“Ä×>ýš|YñÛöVðÿì‡ðÛö™ý¯¯5Köà±ý¨`ø?§| ¹ñ×í à/ŒÑü ø“£xŸßôOÛöŸÒ¾|'ñGŒ¿nƒú¾{ûOøËÁþ1üÒ¼?ûSÁûIh–Þ ø=7‚<¥ül›ö:ý?fŸÛÄøÓñâ6ƒãÿØçöøeû;~×´GÁ¯ø§À_±×íâÛCö)ý¤¾üzýoø)ðSörøâ­CÇ^ ´øÁâ¯^ø~ëÂvž1øùûa|Ký©üUáo Ꚏ•¬x‹Ã?|CûN~Òßu†~ñ¦¯áß jŸto‡—žÓ¾!ê>øy}ã‹o\ü<ðLºÓÿðµôùöÿ˯á¯ÿ7T{ZÍøKü‚Ï·õ§ù£ðÇöÛ¶ñWÀ;/‰?²ƒõŸøZÛã¯í¿ÿýý·¿cø³Ã:Ž<+áoxßþ ûÅûfxÄÞÐüYáßøÓÃÿ ÿk‹¾ý©5GÅ¿~j?ôïÛ¦çà7ÀõðŸ‚?f›ýcAúâµÇߨÃâgÃßÛwöøßáÿˆvßþ0~Ï¿³íi¨þÎ?²Ï<1áXf |=ý·<;û.xC³俿lOÚ/Ç?xkWÕþ x³TñˆtíSá®ið×¾ð¯Æ_ø×õ;þ¾ÿ>ßùuü5ÿæê¼â?‡þ |\ñWÃüCÐüAâ;Ÿ„> ox;ÃR|j·Ó~Üøª GÃúMãß„?Æ=?áOÅŸ|>ñO…<7ㄚÏÅoxÓQø9ñ CÓ~!ü+¹ðw­b×Ôö´ÿ›ð—ùŸoëOóGó¥ðŸÀŸ¶¡ñ×àg†>:ürñÁßÛCâOüöEñÅ» KÁŸÂß³Þ•¬ÁZ?jÙ»öâÿ‚„þË–¿³ÿ‹¼3ã†Z¿ˆ>3|@×¼?û'þÈð±~ÿÁ=᛾"Áã¿Û Ä_ðŒEà»/Š?³—‡¾ÿE¿ðµôùöÿ˯á¯ÿ7TÂ×Ð?çÛÿ.¿†¿üÝQíiÿ7á/ò >ßÖŸææËö¹ø«ûm|Cý‹ÿh¡yñgÄ£ý¯¾0Áw?à¿¿f_ üð=´_Ãß‚ à­ZÇÀËß Íà¯]üdø‘ûOŸ~È~øE£k>*Ó¾øŸà׉-¼+ª~Ï^$ý ío¿hÿ~Ÿ|nÿ‚‚þÅþ2øgñWâìÁñ¯àÿí ñ“á—ÁÿøZÇãWìÛã…?`ý–¼+ñ»âÂojž?øÁûGYøö€øSû0|ðÿŠáøûñ[Tøµá?é׿f¯Š_m>|zðßìÅ㯠i¡ÿðµôùöÿ˯á¯ÿ7TÂ×Ð?çÛÿ.¿†¿üÝQíiÿ7á/ò >ßÖŸææKà_üköìø…uñoMøwñÛáÿíIâÙcöÿ‚­øÿáΛû=ø‹àïíàOÛoâŸÀÙÇþ iñ/öuðW>,|ý–f[߉¿ðŠ|Mý»~'ø5¼9û&|&ý”Ôi¿ƒšÖ‡ðÿÃÿµgíGð±mÏŽ¿i xïáN£â¯ø›à‡Â_|9ý§ ñ7ˆ£Àñwü#ö˜³øuãok_µGü+oü9ýŸþ(øÿþ Ù¡Â-û=éÿðùÿŠ~ý©ÿn…¿¼ý™ãO†ZΧûEÂðø%û?~Ÿáÿ‚nOû=øÅÿðÝ_ð—|2½ð÷„¾5þÌÃÏè·þ¾ÿ>ßùuü5ÿæêøZúüûå×ð×ÿ›ª=­?æü%þAgÛúÓüÑø#û9~Ð^;øwñcà·ÂÝ+ãÿü ~ø‹ûÿÁRtûo‚š­ÄúÇÅc]ÿ‚½~Ûv¾,Ôõ=+ĺ,>;ü?ðçÃýR³×uߨ×âg‚þП±/ÅígPø ìñÏÄÏÙÓâ·ì}ÿËðwÄŸ|0Ò>þÛþð7‡n<3¡ü=×u‰?ðL}ö/ý½¿hÏÙKáµÌÞ=ðOÄëo xÁž6ý‘¼Cû ø³\—ÄÓþÔž?ð¯ì‘¬þÐǾjÿ´W…µÉ?c¿ákèóíÿ—_Ã_þn¨ÿ…¯ Ï·þ] ùº£ÚÓþoÂ_ä}¿­?ÍÍ—ìÅûxþÞ¾ühñ‡Å?Ú×ö`ð¯‰.¿f>#ü^ðv›ãgøÓâ¯ø'ÇÝgâÁýçáÅ¿|1ÿ‚qxHÿ‚løÁºGŽ>8xKÇ­ÿ ñßü'ÆŸ³þ£ð¦?Ž1ðÿÇoƒ±Ÿí¯ÄÞÿâoüã~ðÌxÃLý°|Aà¯xö ðÿÇŸØGÁÞ,øaû5xÅ_ðUÚRø…ûVhñ~Ë&ðö¯áGíCâ 3HøAû#øKYÕ?à”¾;øKáÿŽÚíOsñÃöpñ]—Á¿ÚKöA‹À?Ðwü-}þ}¿òëøkÿÍÕðµôùöÿ˯á¯ÿ7T{ZÍøKü‚Ï·õ§ù£ùÒý²ÿà¨ÿ¾~Ï~0ðƒ¾9ÿ`~Øþý ?à³ÿðŸxZ/†^×|Gð¿àOÀÙŸþ ÛñÓö ÿ…­¢_ü>Õ¼%ð»þÿ |ý’þ1~Ïÿð°í|9ãÚ«ág‚5¯ˆ^ÿ…½ðÞ?Œú¼ÿoéŸþ˾-ø?ûþÏìõs㿉n~üý¤|7ã_ÔïøZúüûå×ð×ÿ›ª?ákèóíÿ—_Ã_þn¨ö´ÿ›ð—ùŸoëOóGò%¬~Û¶OůÙÖûÅ´GíWû hGÄø&¯ÆÏž Ö¾"Øüeÿ‡s~КWü7öÔ­<û@|4ø{û&þÅ_ðÇßþÂAñ‡Jø­û6þÙ_¶·ÆÿÚcÄ¿ð¦¥Ð>|qƒþ7í;ñc[ýŸø—ûlA­þÍ_³×Šü7ÿý˜5o‡~(ý§õ¿‚Ÿ¶üOöCOƒZ/Á¯Ùö>8|bðv¡e{ñ»â7íŸð'àˆßÖŸæäËö@ø™ãOüsý’¼!¤þÓ~ ñ¿ìÝðwþ ?ãOÚ?í £YüÔ´ïj?´·í…ÿJ| —â‹>"ø{ál dðÿí½âŸ ~Ì_-¦ð®‰áo êž*ø·áŸ~ËÖÿ >(üIðv¦ß@X~ÝÿµWŒüðJÇÁ¶§ˆ5ߊߴ‡ÿcÁûmøwÂ~ ý”|Aâ¯ø%í+ñ»þ ÿÝýŸ/þ“ákèóíÿ—_Ã_þn¨ÿ…¯ Ï·þ] ùº£ÚÓþoÂ_ä}¿­?ÍŽ?´‡Ž~&~ÇZ·Å¿Ùká_ÄŸ|¶ý§ÿiÿÙ[ãçì»ñ'ÂzÃßø«Áý­à¥ß²ÏÀø)Ãß é?üñ‹Â×¾ ðgÅoÚŠÚ#Føƒñ³HÔ´íKQý¾­¾üøxž ý”¯•ãþýµn-köÉøÝá­kãçìÿáÛ/ ü@ý¸ü)¨~É_ñVþÒ¿¾|øcñÚÓöký¡ÿáÝÿ³ÏìWàßÚëAÿ…ŸÿÙ÷âü&Ÿà¢~(øEûFx;ã—ü"<-ቿµ7ì“à‡½ßðµôùöÿ˯á¯ÿ7TÂ×Ð?çÛÿ.¿†¿üÝQíiÿ7á/ò >ßÖŸæÁ~Û¾-ñ?gë?‹¿ðRÿøP³Ç‰ÿáªWÅ_ðPh.¿aØ´|lø9¬~ËÚÃ?ÙïÂ?¶'޾j?ðOÚ[áÿÅkŠ?µ_Äχ^;ø-û2|ø»â|ðïÂÏøá?íû/~Üñà¿ø)§ímð³EÐh¿ÿ”ý³~0~×ÿðFè|û8ÿ¢ºÑ*|oýˆt éþý•?f¯Žþ|3ø­ñ»Çñ'í1ûføož øðnoÚ ãþñgâæ·/Á NøhÞ#ø•ð«Ä?þ|C·ñOâŠ>/ë~4ø…ûP|9øCûvxƒö„ýŸ<_ûoü<ý¤~ þÙ—öGñ¶£kìñ3þ M¹Õ¿iKŸü,ø!¦~ÍÚ'‡ÿc…ß?hkÿjÍðÖƒ^ð¯‚uŸ~ÐÞñ|žÖµ¸?°ßøZúüûå×ð×ÿ›ª?ákèóíÿ—_Ã_þn¨ö´ÿ›ð—ùŸoëOóGó¥ûSÁB?i†¾ý«<]ðïö¨ó?i¯ÃÖtþÄð‹~Ïz×ü1ì÷û.| ý¹+xÏÂß|a¨XCðwÁ_oÑþ hV¿t øÇ^·—ô»þ¾ÿ>ßùuü5ÿæê¼ÿÆRü%øâ?„þ,ñw†¿µüAð;â¥ñKán¡ÿ ÷ƒl?áñÞ¯ð³â_ÁMC]û.™ñ*ÊË[ûGÃ/Œ|3ý™â+m_G‹þ/í˜4ø¼A¤hZ®˜{ZÍøKü‚Ï·õ§ù£ñÇáwí“ûmxÃÅß¾ÙøÇÄ2¹øõâgöIñnð³Àú®ñçöjý“à­?>~Þ?µg‹7ñÖ…à{Oèz¾OѼ?ðSCøËâÏðh~ Õ>+x¿ÃöÞ—Ä>+øÕoãm;ÁÞH<3±áŸ„>ñÆ=wÁ?ü?㛟x'[ø©£|ð瀴ï‹Þ*ðOƒ<_ñFÛÅþ)🇵7Ø?ákèóíÿ—_Ã_þn¨ö´ÿ›ð—ùŸoëOóAñ_þ@ß÷5ÿêµñÕ|oiÿ"_ˆ?ìhð‡þš|q_KxãÆúGˆt†‚µ³û¯‰®¤’뾸ó>ÑàiÖööÚGеKë‹«‹íRÒ(aŠÑ·nbYv€~KÕ¼Sáü>Öõ/øAðÆ?Œ¼c ÿˆu}?E²šö]ÇÓÇgÖ¥qm—RAms2[¤†WŠÞy E#/!©Õ\ºÞ3¶ŽÿÃ]7èËŠ´íäþ÷­⺯ÄÙ×]¿ðÖ©®x÷ள©ø/[ŸÄ¾Ôu_øQ¿ðŸˆî¼9â]xƒÃWwwÓ\hZÝÏ„|Y⟠OªérZßÍáÏøƒC’vÓ5FÖçÂ^#ý”|öOøAuïÙëÁ_`ðO‚¾XÿÂ%ª|7ðçØþü6þÞÿ…uà OìyìþÏàŸÿÂUâøB¼+Í Âßð‘ëߨVÛ‡Ú99%ü²ÿÀY¥×uýï¼òmKþREàßû2‰ú¾>Wè7ˆ?äàûîÿõ4ñ}~mØx§Ã.ÿ‚ŠøKRð§ˆôéÐ~Åìf¿ðö¯§ëVPÞÅñÏáòYËu¦Ü\ÁÔp\ÛLöï •"¸‚F@’ÆÍ÷ŸÄˆ¿¼#mà=7Å~:ðw†5üq} ‡ˆ|O¢h·³YKã¯AäVº•õ´òZÉ=µÌ)p‘˜ž[yãW/ŠºÉ=¬ïìa¥þ8ôk]V¯O¹&~Øß >x÷áþ¯üIý™´OÚëSðÖ· x_áÏÁèóxÓá›øãâçŽ<ðïIñÿü©è~:ðŽ‹¢|?¸Õ Ö¼oñáþøóâÀ¯­ñ§Yð.™¨éž"ñ·ƒ¼kíüâ?…Ÿ¾|0ñÄ-oâß‹¾|.ð€üSñ[Ä«~¾#ø›â?xOIðö¹ñ Ä ªk~%Ô×[ñ¦§§]x“U]GÄ~ ¿ú”âï[Õn—óãxƒâGìëâË4¿ø÷௉tË]oÃ^%µÓ¼AâŸk6Þ#ð_ˆô¯ø;ÄZj7×6ðë~ñv…¡ø§ÃZ¬q­þ…â=J×4¹íu=:Òê¿ø]ß?è®ü0ÿÂûŸü¶¬í>UYhÛÙþºÞÖ½õ½•;¯¿ÓþôÏœ?c/ùÿmÏû=ïˆßúªþ ×ÎðZßù2OþÊÃÿýªWп±%õ–§«~Ú–›yk¨iÚ‡í©ãëë ûˆ®ì¯¬®þ|žÖòÎê’ ›[˜$Žk{ˆdx¦‰ÒHÝ‘•Ï_ðZßù2OþÊÃÿýªVðÿzø—þ’‰Ê?¡û+âÿù ZدàýBü?\½u/ÿµ§ýŠþÿÔ/Ãõðü#⌾þÌZŸŒü ão|9ÖçøÙû%xûÆŸ <¥|Qø¡x7â¿ímð?á_ÄY¼ðóXø{ñfÓÆ6ºø}ã?ØxWB‡áŸŽµ[ÝvîÁ4/ jÚßö}¤˜5ÍQÅnæÒùÊÝ.þäRøW¢üµè¯Ê/‡ßµO‹> |?ý¢¾/|LñOí ñ£öjøk¢|»ðÄßÚ·áÏÁoØ‹ãN©ñWÇ>8ñƒ>+ü<ŠÃã÷ƒ¿àž í~xA¸ýŸüSàïxÇÃ>‡Å,ø‹ñ'Á¾ø©ñ;Å:.ðÏÀž'ãÏø*ÿŽ-5ü°Öî~i'ü[Çò|Kð_…|9ñ_ÄzuÿÆoø*/ŽdÚwà}Þ‰à|P¸øµ­ëÞøOã |+Õ¿fŸüRðçˆoü=ñÄß¾/ëï⟀ZŸ‰³“zY«¥~—v²Õ'}V–¾ët;þW?rh¯ƒ~%þÙ7úwìwûh|wðgÃýoÀ¿?dŸ…ßõ_üøÕkáÍJÿÁ~ü³ø÷àß xâïáÄ?øÄú'‰ü â߆~5–†_u¨WÞ3‡Ã÷þ ð×´¿xÃ[rþÛÞ±ñ•·†5σ_]ø7à/íñ÷Jø]¨|4ø ñÇBøÇ¬|Añ/µ[¿ŽŸ4+ïüð/Æ‚F«ñGG›Pø·‰áŸ‰Ç‚'’]»õ]-·{ó+Z÷º¶èµè¯Š>8þÛÞøñǾÖþ |lñw†~ üðgíñëã‚“àãü9ø%ðsÆZïÆM!&ø£^ðÿÁÏ…ŸüRÚ‹io hš÷‰µ+÷^)ñ?þ Çû=ü#ЭµøSÆÞ»×~6~Òß¼¢ø×â'ì›ðþE·ì•ñƒÿ>(xKÆ_?iŸ…ß  ðN“ñFîÓÁú…<[ãï |xñ_™wâÝàÍïÃíÄ.ÒE ;Y^ûj»_¾šk¯Mv ÿ_ת?P¨¯ÆËø*ÏÃ? ¿íñÃÇzÆ·©þÏCâì¿ð—öK¿‡Pøð—Àÿaø¿ûxöÈšö/þП~Üx#⌾ø•â?xâçö…ñ§Â…Sü?ð¿Á_|Óu_ÚSøáÿúŽ•ÿ^ø!âï ¿‹~ü-øÙñ{D‹Á?|@ڇë¯ÙÿPÒ®!ñÇöü*Ÿø^¶ž ñ—ü$¿ ($“mZÉ=tºm-[7¯n¶ £ï*+àÝöþð>±ðý~+MðOö†Ñ¾xÃDø{âÙ߯×þø{áÏÚ’ÃãŽ<ðçàÔ õ?|N×­þë<]ñká%‡ƒ<5û\·ìÑâ7°ñûø‡]Ò´?|1øç«|+!ý¼ôMNþ/xköuý¡¼UûEYë~8Ò¼eû.éRþÏ6?~Ø|;ðçÁ_x§Ä¾%ñ¯‰¿h?þÍZ¦‰gáoÚcöoÖàƒÀ_|iâ;Ø~5x~ÆÛÃòk ø½¦ü7\’íø®›ß]—W²z;0¿õýLûÊŠüQý—¿à¯ß5 ~Æ~4xãûwö‚ø­ðOö6´ø«ã/øIgÿ y?´í3ðsáGŒ¼3 ÿ‰žý ¼Oÿ î­ñ[ÀwŸð–ü ýœ¼kðCÁÿðžíñ|'¤ü9øº~}CûZÁNeïØÃâ6‹ðÏã.¿önãÁ:oÄÿÏÿ ¯Á?ÿÂðÃW×|Iáý7Æßð|XøµðßâÆoµ]øÇÏÿì»àÏ_íÿáûßÃÛ}oÆÿ ô¯7Nj\¼­·v­Õ.«ôëªî…ukßOó·ùŸ¡´WãgíÿÕüþÕü áÚÁ_<;ñGöÄðÅÚWÁZ/ìÉ«XxÊÙsö2ý¹¼Uñ/À?¼%ñKÆÞ'ø‰mñGáÏǯÙùåðæ±ñ'àO…>x«Äu'ñoоx·Kÿ…‰í o?x‡HÔômKöuø£ñ+âý×í ûuxÀ?> Kð[F›ÇcïÚoQø©|pÓµoŒ¿´ü#§hž¸ñ'Âo‡Þ6Ò|YãO üLñ'Å]gÄ~"ø{ð‚ëá˜ñVœ{9$žšù­7½ú&¬î¯uÖÁuý|¿Í¥WÈÿlŸþÓš¿ˆ[à¿ÃÿŠ>*øm k ´¡ñ²{_‡þø¬X|bý™<-ûUøoĺVƒâ?ˆzWÆEÑ4ßüGøGáïA«ü)Ò|GoãŠþ°Òü?«øsÿüQðÿëÊ–švjÏGo]uíèõQE€(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+Î> üøEñkû#þ¯Â¿†ÿ?áûöü,øcÆØŸÚ¿bþÔþÈÿ„KÔ¿³´¿³tï·ýÉûgØ,¾Ñæ}–/Ñè¡6Ói÷Z0>pÿ†9ý‘?èÕÿgü1ÿ ¿ù—£þçöDÿ£Wýœ?ðÇü2ÿæ^¾¢«žÍ/ü ÿ˜Yv_×ü2û&ðÀ?_ 5{Ÿ|1ø-ð›áοy¦Í£]ëžøsàÿj÷ZEÅÕíÆ•s©xFÓ¯gÓg½Ó´û¹¬e­eº±³¸xš[h3|]û5~Îøcàü9Ð/5)µ›½À~м!¤]j÷¶vW­Î›áû :Ê}J{-;O´šúXê[[;w•¢¶ó#þ [ÿ&C©ÿÙOøÿ£µJým¯É/ø-oü™§ÿe?áÿþŽÕ+L;n½6Ýß6ïÑ“/…ü¿4~Êø¿þBÖŸö+øÿP¿×Í?´ƒ¾øóÀÚ&ñWÆ àŸ é¿þ|LÓõfñá¶¹ñ‡ÀŒžøûà­ïüGkya6«xŸá~™iâ-:cÕ/ü,úäMþ¨5¾³§ý-âÿù ZدàýBü?_~ÙþÐ|Ygû+xWÅZ&‘â_ x—öïý|?â?xƒM³Öth:ÏÅÝNÖ4MoGÔa¹Óõ]#UÓîn,5-6þÞ{;ë9浺†X%tb1ç¯Ëv¯Qê·Z½BöŠ}’ý ?ëðãf•àÕoÚ?Føeão†^6~üRøuãÿ„sxËá猦ðoŒ¾êÚÆ¤|JÐþ#|3×·~üFø…à=COñçÃßiVÚW‹ïµ½ÇHñ¶‘á_xåß ~É?±ï…4ëHö©×|G­ÞøÛÁ_~"x»^ø£ð=wâ猾~Þ÷üGáþ±ã[?|?Ð<)¢Â)ñßÇŸt«M?áW†¾iZ·ÃŸŒ-ðÿ‰¬uÝoß …â-Wâ_Å/ÝXEâ‡ÿôÏø£Ã:î¡ã/iúG‡,´hZÎ¥–¯§ÏqÏø_áüš~Ø~øŸûþÅ4ÙÄÔux÷áÀ½NñÀ/üð'ÅØ¿iHx‡á÷‡-¼ð~]|vø3Œ.µoÁw^*ý™~-ºøÆ-_Ã1ð¯‚û– %eVV½öMWÉ7t¶O]õ#Ÿ­—õkþ_—m~@»ðw쇬蟵…¼SñKÁ~,ðí­êš¯Æ¿ j¿ü5§Ø]Xk¿³ÏÂÿÙ“]ð׆µ ê^ñ¢jÿ ¾hrOüdý—¾þο¾|;øƒð9?ávè^ ñ×í_«üOðÅ}OÆß ¼_ão ø'Ä ø÷¥x_ÃÞ ø ñOá‡ÄeþÚøpúÞƒ«hþñ¯muð;öoÓí¼=}ðÏöÂ×~ |Að¿¿joi?ü ñöq×üe…ûcüxŸöøáðÒmâÿÃ/Š? §ðN­ñFÓÁš†…~ÿ¿ácxwJøuáOñúÚj¾?6ý0ÖþÁ|3ÿ /þ?‡ßðLÿÃPdÃ4møOöWÒ¿á¢?á ÿ„[ûþ_Ûì-ÿámÿmÿÂqà¯ìø@?á þÒÿ„ÃÂßcó¿á Ò~ÖOðþ I¨ë.ð'ÃoÙ³öøÓñ·Â¿þ"üE¶ýž>øö?Ô~6x«Gø]ã¿|#ñd…üM{á]3NþÎøÛá]sàn§â/kþð'…~.éÚ‡‚6ü7øƒñá—Äo ~ʾ ý‹Ž§ êßôoŠÚOá'ýŸ|'ªøcÅ·Ÿ´/Œ:üAñ¯Ž“Y´ñ²ø7^ðy'ÀOÙFþóQÖý±< ¯]É6Œš~ÿ ¯Åω>%±ñ¯„¼'§øwáχ>¦ƒðëào‚¾ øgÃZ‡Ò/Ãj>*ø—ð ãþßÿè»ý¬<áÿÿG‡<-⯆ú§ìÁcðkãΣûBèžñ·þ?ø«ö*ð/ÆOø‚ËÄŸ²ÇÅ êžøwû!üaž?x³àEÌzãx;Æ|_ð ý”tØCö‘ø“â…¾ ÿ‚kþÉ ¼Aá‡þ!Ô¢¼»øKðsÄZ?Ä/Š¿kÚoö:ý¯<ð~â÷à÷ƒï~ ü?ýž~&üøq®Íñ-týÄz?jo€ºŸÄï„ÿüAã-ÃÙõEÿ?gÓ¢¾–k]ìš½¶¾½Xs¾Ëú·õ÷v×äû¿€Ÿ²Ž¯ÿ ;Â~!ý©5Ýwö}ø­ÿ ÖïIJÏü.߆þø9»ûLÿÂs?ÇM{þèÞý ¼Oÿ î­ñ[⿉áø‰ñËÆ¿|!âŸÿÂGðÿÁ^Õ¾üºøeÛ|ðŸÂƒÿ¾&üZñ?íµ®þÐ~(ø'áOíWÄ|cû.i?Ø~ ø9®ü^ñ/„té_~|Ñ~·ñ¿ÇWº¾¡®éºî«{çé–ÐßZZiɜׯÚþ '«Aû'k¿´gì©ÿ©ý—¼ûWþÌ·í ¥ø«Ç>0ýš"ƒá‡Š´ÿƒ_ðO_‹¶?³çđ㯂¿ 4+㿤~Ü:ç‰t?[ë÷ÿÁ¯†> ø¿˜Ö߯<+ð§ôá_ìëû|Dø»ûO|ÕàŸÿ²Gƒ"xs௃üSá¯ø+Äß¼Aû5iz%ç…¿fÙ¿D‚|ð_ˆì¡ø+áûëoG¬xËâö¥ñ#ì¿‹¾'ÿ‚4ü'øuðïö€ÿ…+ÿÈñßìËã¿°ÚÿÂÞð6û+ëWöÇíOû:~É¿ð°¼=oÿÌ_üOû?ü'øñïÍý¨þ1ÂÖÑÿáBcøgEÿ„?Çz׎þÉá§ôo€ßðI?üeñgìçáïƒðNwöƒð‡í¼Yã¯:7ï٣TøËà¿ ÞA᛫?x³á…Ž?¼9áû«ox:âÛYÖ4;=:x«fõwaÏä¿«–¿?É_ƒ_³ìÁð ‡ÚÂßÛ'Æþømàýà§‹>iÿ¾ Yxsã?‹?gÿ…_ > ü=ø‡ñ3ÅÚoì~2Yërxà¯ÁíÆ~ øUñCáÁoˆ6MÆ¿ õÏxïâΉñÔ~)ø'àĈ×4_Úó]ø7­ø£Á>øañrƒß~èð¹¾x#]ñ¿ˆ<àŸx—ÄžñoĆŸð]üSø®šGfÿüø·kÿ S¿›[ð¿ÃmWÀÿ}²ÿ‚4ÿÂöÿ†\ÿ…}ÿÈÿ†šÿ£tÿ„OöWÿ…íÿ"wü,Où$_`ÿ…ÿ$ÿþ+Ÿù¿äNÿŠ›þ@¿éÔhŸ ¿à>&ÿ…éÿçÃïø&Gˆ?á—ÿµÿá¥ÿ±<'û+ê¿ðÎÿðÿÂSý½ÿ Óìð©?±?áñ¯ö¿ü'ÿðÿfÿÂ⟶y?ðêßd>¦›»«+íðÇ_^ý5z«.ÊÇ?—n¯Ëü¶ÿƒÇ§ì—ñŠø_]ý³üo¡ü×u¿ÚgÆ?¼5ñ+öb‡áÿ…~ ~×? ¿h…ß¼}áÿëŸ5ï÷Þ¼ÿµÆ¿ˆV⋾$ð?‡|qâÈ Ò<%màøoÀºO¨ê¿¿fû}U"Õ|#¡~Ôž2ðÅÚ#ᦦümøeñw—þ ø©ñßÁzGÇ-BÿÅ^ñÄoøÊ[ï ü5ñÿ‚~ M»´ø$ž©ñ á%Ÿƒ¿gø'Gÿgωÿ³í…ûP^~Õ~ð¯ìÑ«|ð¯…c¯‰Ÿ³?Ão%Ï‹4¿j> ¾ðüw?¼C}âÏKã­+Nøy?ÂgKÖ,oäÔ¯®ü1ïúÏÀoø$Ÿ‡>2øOösñÁø'F…ûAø÷Ã÷>,ð/Àgá×ìÑ¥üeñ§…làñ5Õ牼'ðÂûGƒÆÞ#ðý­·‚ücqs¬èúæñ4Òܬz¨Ö§Õ6ýì´¿ÙµÞë«wwníÝßvþKú·Ý·åÛ_Îo_eÙ¦ÎïAø'ñßFðW‚oümào]øþ‡ÃèRè_ ¿e_†?²G‚¾jx¶Ç^ñ²x'EðOÁ¿†þ5û|~-OˆÚÄo}¯Vñýÿ‚u{ÀÚ§Ô?𻾠Ñ]øaÿ…÷…?ùm]Λáïø"³â¯‹~Ñô?ø%N­ão€>ñï‹>;x;MÓ?dkï|ð¯Â½F=≾-øzÖ u‡øq«Ë—ãÝgÆ6z6àýFHì|Cs§\ºÄz 3á—ü§[ð'ÂߊZ7Ãïø&F¯ðËãÄ ?á?ÁOˆºg„ÿe{ÿ|`ø§«ëï‡t¯†Ÿ |]ka/‡þ |@ÔüAáhZƒ|'¨jþ#½Ö<;®é–Úl·ºF¡ºx(·wRM÷²¿Ï¸s¾Ëú·üö¾Mÿ »àÇý߆ø_xSÿ–ÔÂîø1ÿEwá‡þÞÿåµyÇŽlcönø“ñg¿ðKïØ£TøÉà?ÛCýˆSàWŽ|ð·À0Yø«âíÓàŸÙ'àÏŽ>$øÏNýœ¼u⟆þø¥ð§â§Â/ÚûCÓ‡Â?j7Ÿ¾(x&ÿ­ã øŸÃ;×}àŸÃ/ØçXøËâÿÙŸö¡ÿ‚yÿÁ:>þÐz'‡þxÛÂ^øm§|-øÏð÷âg…~7AûJËàÍÁ>1ø‡û3~Í^6Ö~0ivß±ïíâÏü6Ó>ê:vðÏÃŽô¯ø–;¯hÿ—Ôaÿ?%÷!ûGÙ_Óþ–³ÿÂîø1ÿEwá‡þÞÿåµ𻾠Ñ]øaÿ…÷…?ùm^1¨|eÿ‚4Ëñ?Lð„ÿfØ#^ðþ‘û@h_ ~-üOÔ<û+éøð³Æ_ðL¯Š_ðS¯~Õ:f±¦è¾%²ñìÿã?†_ î|¡xëÄ׿ü9©ëGÅ/hÚæ¯áÿ†?Š>ÀÖþÁ|3ÿ /þ?‡ßðLÿÃPdÃ4møOöWÒ¿á¢?á ÿ„[ûþ_Ûì-ÿámÿmÿÂqà¯ìø@?á þÒÿ„ÃÂßcó¿á Ò~Ö}Fóò_rhû/ëúÒ×É¿áw|ÿ¢»ðÃÿ ï òÚø]ß?è®ü0ÿÂûŸü¶­Ÿ‹öðFŸƒþøóã Ÿ?°GÄ/~ο³ÿÇÚ_Ç¿~ü0ý•üYñ²ãágìݬxÏÁÿõm á쉦^Ëÿ¿Ä߇þ,ø;©ßë7Z'‡4O‹º6¡ð÷ÄÚö…â ;Rµ²<û5|ðßü&ºÏí™ÿ½ÿ‚d~ÏŸ ¼'ðÿÄn¾5ü/ñGÂoŒ «ñ‹öJý’Ô%ñg…üEáß üKð#xsÁ?.~&ø»á5î“ð÷Oø¢}Fóò_rhû/ëúÒ×þwÁú+¿ ?ð¾ð§ÿ-¨ÿ…ÝðcþŠïÃü/¼)ÿËjõŸü2ÿ‚4üBÿ…;ÿÃïø&GŽ?á¢?áaÃ?ÿÂá?Ù_Äßð¼ÿáR}«þ·ü)ßì[ ßøY¿ð¬¾Å{ÿ þ¯í¿øC>Éuÿ öoÙåÙðþ…ñ»þ 'ñ#ö Ñ~ üý‘ÿà´'Á±âÙ‹Âÿj_„6?³G>ü+ñWíGáÿÛÍ<áŸÝx3áω¼-£ø‚ûâ·ì—ðKà—…4ms⇨øëâí•ð¯@Ò-­¼I„¼7ñHúŒ?çä¾äÑö_×ôÿ¥¯Ðÿ𻾠Ñ]øaÿ…÷…?ùmGü.ïƒôW~á}áOþ[VÊØÁtïþ×^ñÿÀŸØ#àïü1Ä…žý 5ߌ_ ?e‡Þð¯ü.Ï…Ÿ ¾)|)ñ­Ö§­"aü?ñ÷ü-{/‡^ñ`ðŸü%_üñÂ>²Õ¿á‹PÔ}[øeÿiðÏü(¿øHþÁ2™¢|@øIñ¶ãWøã-#Å:WƒüG¦üSðþ¥àÍoÂÞñl7^´>£ùù/¹´}—õý?ékÿ »àÇý߆ø_xSÿ–ÔÂîø1ÿEwá‡þÞÿåµzηðËþÓáŸøQð‘ü>ÿ‚dxþƒû#þ£ûo²¾•ÿ ÿ ü"ߨ?ð¢þßaoÿ oûoþdÂÿ ö—ü&ûÿ “ö¿ø—üOÀÿµWìõûø{öpÿ‚tx÷öƒøÇñƒ[øq㯃ú7…f…øËðOº_ì£ñÃö¡³øâÏ„6>Ö|lþÕ­¾ø;ÂVˬXxON|\ðÏŠbñÌk¥è~%>£ùù/¹´}—õý?ék?ü.ïƒôW~á}áOþ[Qÿ »àÇý߆ø_xSÿ–Õçï?àœÞ#ðÿìõyûþÇßðJŸÛ{Wý ÿiýkö_ÓµÄ?ü;ðkÁ~*ð·ì¿ñÃö¨ñ;ø³â¿ÁŸÙßö¡¹·ñŸàŸƒ0XÛx.ɨÏ?<3ªjÚF‘"\Ý}¬üÿ‚s|ø5á?‰_··ìÍÿ©ýu}{Ä>Ô_Y›à]çÁ¨üUs?‰µ xg¾3|ýœ.|]â oÁ>ŸÅ:4ÿ|7¨ØÏgâk >Û]Ò<6þ'ÔO¨Ãþ~KîAíeýOúZðß𻾠Ñ]øaÿ…÷…?ùmGü.ïƒôW~á}áOþ[WŒ~Éÿ¿à—¿´U×ì•áo~Ä_°GÉ¿¶‡ìÿ'Çß„žðï…ÿgŸˆ×Z7ü#ÿ³ìeûBx÷à¯ÄVÔ¾|6ñ‡û@i^ý¯­¼iá‡ð§Œÿá,ýœ|?í¬ë>²ñ,~о ðŸ‡¿àˆ=ð¯†|uà]þ SãOøÓãû=x;Æ>Ó?doøWÅŸ|G§[køáŸèð^i÷Æ wH¼³Õ4o†š]å×5M:êÚúÇEžÚx¥cê0ÿŸ’û{GÙ_Óþ–¼7ü.ïƒôW~á}áOþ[Qÿ »àÇý߆ø_xSÿ–Õ³ðŸÁ¿ðKß~Æß ?lŽŸ²Wìû/øKÄü­üb³ø³ðóöyðÿ‡?gŠz­ö›à¯ˆ?þ%øÿÆð>™¢|@øIñ¶ãWøã-#Å:WƒüG¦üSðþ¥àÍoÂÞñl7^´ô oá—ü§Ã?ð¢ÿá#ø}ÿÈðÿü5öGü3Göß„ÿe}+þ#þøE¿°áEý¾Âßþßößü' þÈÿ„þí/øL<-ö?;þ 'ígÔaÿ?%÷ ö²þ¿§ý-|›þwÁú+¿ ?ð¾ð§ÿ-¨ÿ…ÝðcþŠïÃü/¼)ÿËjƒâ\?ðI?þÕ_³×ìkáïÙÃþ ÑãßÚãÆ oáÇŽ¾èÞýšã/Á? é²ÇÚ†Ïâw‹>ØøCYñ³øV¶øWàï [.±aá=8AñsÃ>)‹Ä1®—¡ø—Ïþ%ÞÁ9¼GáÿÙêóö ý¿à•?¶ö¯ûAþÓú×ì¿§k:7ˆ~øwàׂüUáoÙã‡íQâwñgŃ?³¿íCsoâ ?Á?`±¶ð\“QžxgTÔ/´"D¹º>£ùù/¹´}—õý?ékèÿ𻾠Ñ]øaÿ…÷…?ùmGü.ïƒôW~á}áOþ[Ws¬üÿ‚s|ø5á?‰_··ìÍÿ©ýu}{Ä>Ô_Y›à]çÁ¨üUs?‰µ xg¾3|ýœ.|]â oÁ>ŸÅ:4ÿ|7¨ØÏgâk >Û]Ò<6þ'Ô~_ý“þ!Á/h«¯Ù+ÂÞ,ýˆ¿`†ÿmÙþO¿ <áß þÏ?®´oøGÿgØËö„ñïÁ_ˆ­©|0ømâ ö€Ò¼?û_[xÓÂ?<3áOÿÂYû8øÚYÖ|eâXü ¡Q‡üü—܃Ú>ËúþŸôµöø]ß?è®ü0ÿÂûŸü¶£þwÁú+¿ ?ð¾ð§ÿ-«¹ðŸ‡¿àˆ=ð¯†|uà]þ SãOøÓãû=x;Æ>Ó?doøWÅŸ|G§[køáŸèð^i÷Æ wH¼³Õ4o†š]å×5M:êÚúÇEžÚx¥nƒÇÿ ¿à? >)ø+à_Å/‡ßðL†¿~%Â9ÿ ëàïü'û+ø;⟿á1ñïƒü#ÿWÃßXiÞ-ñWü%^-Óµ xsû H¿þÜñ…}«SµžÕ¨Ãþ~KîAíeýOúZù7ü.ïƒôW~á}áOþ[Qÿ »àÇý߆ø_xSÿ–ÕôÆ…û-Á/|Q¬iþðÏìçûx‹Ä¿ü-/ì­ BøCû<êúƧÿ ;ÇzgÂßÙúfŸáë‹ÛßøSÿu½á×Å/³A/ü+ÿêúg„|Yý‘â û]>_@ÿ†ý„?èÊ?düFÿƒŸüÆQõÏÉ}È=£ì¿¯éÿK_‰ÿáw|ÿ¢»ðÃÿ ï òÚø]ß?è®ü0ÿÂûŸü¶¯¶?á€aú2Ù#ÿ¿àçÿ1”ÃþÂôe²Gþ#ÁÏþc(úŒ?çä¾äÑö_×ôÿ¥¯Äÿ𻾠Ñ]øaÿ…÷…?ùmGü.ïƒôW~á}áOþ[WÛðÀ?°‡ýGì‘ÿˆßðsÿ˜Ê?á€aú2Ù#ÿ¿àçÿ1”}Fóò_rhû/ëúÒ×çyỵ²¾µš+›-JÂÃUÓ¯-äI­oôÍRÎ GLÔ¬®#- Õ†£§ÜÛ_X^@ò[ÞYÜAso$˶Λ¡ëZÏý£êš¯Ù¼¿´fé÷wßgó¼Ï'Îû,2ù^o•/—æmßåÉ·;ž/ÿµ§ýŠþÿÔ/ÃôZÈ—âûöüZøAüiÿB‡Š?ðA«ò%ðƒøÓþ…àƒVÿäJåè¥x,¿ð%ÿÈ_/»þ¯ôµv®áý_Kðþ¼¢kú曬ë:&‡«©Óu}cHðåÖ‡eâWKÓoD7º†› ÞøŸÃVšÍõ¤Zéw^!Ðí壟]ZÁ.7,¼+â}JÚ+Ý;ÚõýœÛü›»-Pº¶—Ë‘â“Êž y"“Ë–7‰ö¹Û":6Hê_ò’/ÿÙüKÿÕñðš¿A¼Aÿ Ÿÿدwÿ©§‹êœbµÖÜŠvº½ÛJ×·ŸawòvüýCþСâüjßü‰Gü þ4ÿ¡CÅø Õ¿ù¾løÃñ]øaÿ턾|løÿâoÿkÝÇáƒÖl?±ô-û2[^ñ޾6|Jø7ðEÙ¨kÚŸ¤xJïâ(øâï·êzÇ‚¼â? øâF»àÞ×á§Ä_ü`øsà‹_µøH¾|QðO…~"øÄÙú®“ý»àßhV%ðƱý•®ØéšÞ™ý§¢jv7¿ÙúÆ›§ê¶^Ùµ K¸¦‚5îÚü²·ø×ÿ!¦Î×ÞÎÛ0׺û½<ÿ«¯Ÿ\.í[S×tU¹·:Ï…µ+}ÄÚHš3©øwW»Ñ4ZéZí€oµi•φüC x‚ÞÇPŠÞêm\ÑõXâk NÊâɯø-oü™§ÿe?áÿþŽÕ+èÿØËþF?ÛsþÏ{â7þª¿‚µó‡ü·þL‡Sÿ²ŸðÿÿGj•­(¨âaªR[ù«þ¤ËX_º_š?e|_ÿ!kOûüÿ¨_‡ëâÚ¿þB_±ßý¤ö/ÿÕÓ WÛÞ/ÿµ§ýŠþÿÔ/Ãõåþ#ðüu¨xóÇZf³«AðÛâ7ƒþ-xZÓF×cÐ ^>ø¨cÁz¦¡púVª×Ö¸¶ÚàÒpZêZ†ao«µö†Ú¦‹ªL$¡]J[Fro¯V;^ .©~‡Sð»özý©þ ëïƒto†ÿ²ÄŸ†_ÿhÛOöºø)ñ/â/>"ÅñwÄŸÿj¯þÒt¯†0x6×àFµáÿÙCþ~Ô>&øOâ/Ú—ÂÿiÏø“àŸ…ü]¦Û~Íšeïí¨i¿øø+‡ìÑñOâì÷ûJüRýž4Ÿí¿ˆ&ý€?noÙ£ãí*ÃÄz—ˆþ9ü,ñÇìÏñsÄ_´ŸxGÀú îµñ7ö€øeûMYx/BøaâBãÞ øYûD~Øúg…4¿ˆô©Óëoø^Z·üõñGþ üÿÎÎø^Z·üõñGþ üÿÎν®Qï/ü‘É//¿úþ“ò¿æOÇςߵþ±ûG|4ý¦oüðÿÀ¿¶×‰~ ~Ê ý¾|+Ò¿hÛöNð'>Ý~Ø ¿h/Žÿ´÷ÇKσŸ±ž‹áÿìïÙ—þ …ûFøÇáÿÀoxÃà.±ã¿‰?³Çý;áWÅÿŒ¾%ñÖ½ðOGô†ðI/øS^7ýœü Üü?øû2þϵÿì×ûTøm¾1Mý³ñNøgoø$~½ÿØðV‡uá{?†Ïðÿ\øàˆ ?fÚCÁÿ¬5ùþ#ñ?ÄôŸü:Ö¾xZøË÷·ü/-[þzø£ÿþ ÿçgGü/-[þzø£ÿþ ÿçgG×(÷—þÃ’^_õý'åÌkþ ‘ûSéÞý¶>xOVýŸõßÿÁE¾þÕ¿³×Å¿ø‹â/Ä_ ë³wÂό߷üËö‡ðÅ¿‡^Ó~ øÂËöŽøÃ/ø(íÌ.ø3âo~Í~Ñ|ý´<7ð âwÃß~ÍŸ±Œ|7ð/Ë_…¾÷ø^Z·üõñGþ üÿÎÎø^Z·üõñGþ üÿÎήQï/ü‡$¼¾ÿëúOÊÿ‘?±ßügöúý…ü[ðSâ/€´/Ùãˆ< û?Ü| ñg…¼]ûH|hø+£§Ûÿaßø"‡ìñsâŸø¯FýŽþ6^ëeø›ÿÊø·<&¥áý¯Àž=øuâ)5{?Kâoèoè?ðNÏ|-øKû!|.øeâσþ1¹øOûKÿìý¥5Ž 5|%ý¡~h³Åï‡~ø³Çß³ç‡üK§ÉñgÄ¿h? x^ |0ñïÆ7Á~ýž?hÏÛ‡Á:‰añ·Åí;ÅvßKÿÂòտ篊?ðoà¿þvtÂòտ篊?ðoà¿þvt}ryà,9%å÷ÿ_Ò~WüÉÖà™µ?o¾üGñ­û?èŸ>ÿÂqã¨ü8ÿ~"üKñ‹¼càÛ'þ 9ûK~Íÿ ¾2þÖ:ÇÁ?|@ý¡>ßðÿþ ©?À/þ×ÿ~ Ûüvøoð³Zø#£x»À_¶GÄ„ž7øÉñ—Ð>Á-|OáÏÚ;]×5ý·?k¿ŒðÕß¾þÝŸðOOÛOþ#¼ý›~"ü"Ÿà—üWáÿÆýOö!ñ6…ãÿ~Éz‡Æ|ÿ…ÁáÍ3ÁÞøÁá/þеo×oø^Z·üõñGþ üÿÎÎø^Z·üõñGþ üÿÎήQï/ü‡$¼¾ÿëúOÊÿøãþ ûñ÷ö…øûð—öœø¡ìÁû?üIð‡ÿho[hãñ§Æ_ Û|}ÖüiÿãÔÿg|t_x3஑ûpøLÒ?b jïÆúÏŒ¼û;øÓánqû=øwöv¹ð—ÇoÙ³áWí£áNöý‰mÚãgÂïø’ïáý÷‡ìÿhØ'ãÍí¤·¿íwà/~Íþýœ>.þÏ?¾2|ðì›àzìåûpløÏá?Å_ü:ý¦ÿhÛ?„?îu^ðåÿƒ¼ áÿÙïá}Ã}íÿ ËVÿž¾(ÿÁ¿‚ÿùÙÑÿ ËVÿž¾(ÿÁ¿‚ÿùÙÑõÊ=åÿ€°ä——ßýIù_ùêømû-~Ѷ‰û8þÌzgÃ_x;àßüÓö Ð>xãç‹4ßÛ÷ö6ñWí⯃µÇüßã‡Á½/ÄÚwÇ?Ùö\ø­û1øƒã÷…¿àžþ.´Ö|û#øÛöÑÔd­GÄ÷>"ÔüS«x“Aø=eñËïø?àšŸì>Âþð/ìÁá߉?>0|B×~0[|Qý ¿l/Û'QÒ~üRøgðàwŽ4ˆ¿´'íMoã?þÞ¿þ |)ýŸl<1ñÓö&øðgö[øgñ[ºÇÁ=;á¯ÆÿÙ«ã·ìcðçö¯øŸú-ÿ ËVÿž¾(ÿÁ¿‚ÿùÙÑÿ ËVÿž¾(ÿÁ¿‚ÿùÙÑõÊ=åÿ€°ä——ßýIù_æÛ?þ ûâ¯ÚÇ&µð„õ??´/ˆ?c/~× ~.G¨ÞøWÇ~*ýŽ?m¯Ù—âæ™âmÀzgƒ5¿xŸÄÿdï |oøñëYø˜ºÞ£ñNøAû |0·¹ð¿Ão‡þ.Ô Àý§ÿf¿|Ñÿe‡ŸðOÙçáÿÁºí£|uø?áÿ…²N°Ÿ²v•¬kþÔ¿e?Úwâßí<> éÿþéðþǾ*üAøáÿü|ø ã¿ÿ~|;ø{ð׾>Ôô©þkÿ[Âòտ篊?ðoà¿þvtÂòտ篊?ðoà¿þvt}ryà,9%å÷ÿ_Ò~Wø'á‡üKþ×ÿg?h7?þ'~Ì¿³ßíû5þÕ>oŒSlüSƒþÛþ ¯Á6<¡Ýx^Ïá³ü?×> xâÂÙ£öðÅ« cÁ>ˆüOñ='À¿µ¯ÞÖ¾2ùþµÿÈý©ôï ~Û¼'«~Ïúï‡ÿà¢ßÿjßÙëâߊ|Eñâ/…uÙ»ágÆoÛ‹þ eûCø âßï i¿üaeûG|@á—üvæ|ñ7‹¿f¿hž;ø-‡toþ)ðÿÄ©ÁM¾ü.ñ}Γ‡á Ÿ‰ß>ø'ö½ýŸ4Oi+ñ†täð¯ÂgÂø•¤xWÁ'YúÿÇ>ÿ‚’|røgñ'Â~$ÒfÙŠæoèqø{Nø)ûJ|yø¯â¯‹SÁñ Á>"ñ€µÚ_Ù»öeñOì‹áÿ|)ð×Ä?×_þü0øçñ—ÁzÇ +ãïÂKá÷¿g]Ÿ=_þ–­ÿ=|Qÿƒÿó³£þ–­ÿ=|Qÿƒÿó³£ë”{ËÿaÉ//¿úþ“ò¿äOÿø#ïí â ¯ÚòŠž'øð—Ãÿµwìÿÿøéÿ´ïí1û~xïá¿ü6gìãÿªø à¿ê?jü#ø›ñþ»ßØsâ÷‹µÝÅ~"ðÿü#Z?‰~ü:ðf¯{áû{ë¿}¿£~ÈŸh¿ˆ_¶‹l üø%¤~Ñ¿³ì©û<ü>öYý¡|iñ·âÃo~Î_?lŠúOíáOˆŸÿe€6ß >0|<ñ·íà|ñ‰àÏj>ø™ð·Kø‡m©Ùjúf‹oÒÿð¼µoùëâüø/ÿð¼µoùëâüø/ÿ\£Þ_ø Iy}ÿ×ôŸ•þ)Óÿc/ÛCKñ6•ûAj“~Ì9ý ì?iÿ‚Ÿ·†¹à]?Ç_¾üñWÇÝCþ suÿÅý¢þ é^2¸øQñ—ÆÞø?á+k{Ú/à§ÅËÏ|Kñ§Ä9õk¯€þ:øKðÂ?CñÛÄþ?©ÿÁ2?j{‡_µW€<9«~ÏúÇü<‹öøÑð/ö—Õµ¿ˆ¿|;ÿ “ÿ ëö§ÿ‚ˆ~Òú÷Š~ØX|ñ?ü6/ü Ÿðòoø+HÑ<yûÿÂmÿ ùáoÞjþÿ…å«h?¿M¿áyjßó×Åø7ð_ÿ;:?áyjßó×Åø7ð_ÿ;:>¹G¼¿ð’òûÿ¯é?+üSàø'ïÇß|P𻳧ák¿Úö–ø½ñg]Õ#ñ¦¯â C៌¿à¢¿´·íÑðcÁž)øu«ø2÷Á?´/ˆ%é~ø£HøÍàÚûÃú†~ü[ñ§Ä¿Úã_ý«/þ%®mñÃEñß¾—ÿ…å«Ï_àßÁüìèÿ…å«Ï_àßÁüìèúåòÿÀXrKËïþ¿¤ü¯ðOÅïØö§ñ߇?i Þý<3ÿý5Ù7ö—ƒÁþ!ø‹ðÓß²Çü$ÿm÷Å°ø?ãoølïˆÿðÞ¾5Ô>!\xÿSýŠ?ásüSøKuñJòïá¿ü4v­á€¾ñÿþ ‘ûSüsðuÇìý­û?ø[öe¸ý ?à§?᤿ábüEÖþ;'ü·ü)ψðP?ìÿí¿ølÿ……àð•ÿdxZñïü! ý6ÿ…å«Ï_àßÁüìèÿ…å«Ï_àßÁüìèúåòÿÀXrKËïþ¿¤ü¯ùãø$ïÆ/]xâO‹?eßÙâïˆ4ÚáO‹|wû9þÖŸðPoÛ³öåð'ÅŸ…Ÿ ¿gÛ×ᇅÓÄß´§í‡ðãMî“ÿ·ÄßÛZÛÇ¿>øgö@Òü9á=cÀþ1ñÖ³ñ—Æ~ ø•áàçßú‡À¿ÚŸÃzÏì“ñçá/À_ÙÂgÏÙÿö†ý•®d­3ö‡ø‹àoÙÇ >1øïökñ/„õÏ…¿|3ûj ?ð®|?û$xÃZÂY?d¯øq­~%ë°i¾:Òl¾hÐ|Q÷ø^Z·üõñGþ üÿÎÎø^Z·üõñGþ üÿÎήQï/ü‡$¼¾ÿëúOÊÿ?¿à‰|!ð[Äÿ ,þÏS|×¼ðëöŸðÿí½ðàWÄßxÓញ¨|}ø£û5~ÕŸ²Oíkàqã?|(ø—¤| ø?â#ã7€kïê>øGñoÆŸÿkö¬¿ø–º=·Ç Ç~ò‹ß°7íOã¿~Ó‡·ü)ψðP?ìÿí¿ølÿ……àð•ÿdxZñïü! óÿÿÁ'~1xÚëÀ¿|Yû.þÈ|A ~Ð |[ã¿ÙÏö´ÿ‚ƒ~ÝŸ·/>,ü,øMû8þÞ¿ <.ž&ý¥?l?€otŸøE¾&þÚÖÞ=øyðGÃ?²—áÏ ëñ޵ŸŒ¾3ñį h??]¿áyjßó×Åø7ð_ÿ;:?áyjßó×Åø7ð_ÿ;:>¹G¼¿ð’òûÿ¯é?+øF¡ð/ö§ðÞ³û$üyøKðö@ðŸÄßÙóöý¡¿ekŸÙ+Lý¡þ"øöqð‡ÂÏŒ~;ýšüKá=sáoÇŸ þƇˆü+ŸþÉðÖŸð–OÙ+Á>k_‰zìoŽ´›/„Ú48> Áþ>øCà·‰þxëâ¿ÁûŸŠ±ůØ?Æ:Ï„äñ§‰ ðO…~7ÿÁ+ÿà•ÿ²/ˆ~5xfÏXð·ƒdñçˆ<ûAÿÁ6o#Ѿê—tï|øÃmñûâׂ¹G¼¿ð’òûÿ¯é?+ý‘E|oÿ ËVÿž¾(ÿÁ¿‚ÿùÙÑÿ ËVÿž¾(ÿÁ¿‚ÿùÙÑõÊ=åÿ€°ä——ßýIù_Ëü_ÿ!kOûüÿ¨_‡è´ÿ‘/Äö4xCÿM>8ªþ©¯¨ý²ÚÖ[+d°Ñôë{iî’ötƒGÒ,tˆšk¨í,cšY£±Y¤d´ÈUP*‚|kâßňÿ¼#o¦ü2øâÿŽºÏˆ™á­3@Ó5Ëy%Õµˆž.Ð.îïõk¿Z&e¡i:½»[éúÔúΣ¢Ém®ùªÒ©+5gí,ÛQZ©[YY+ùؽ¢¼¹|öjçcªê·úuÿ†­-<5­ë¶úî·>•ªjšTþ†ÃÁvøsÄä~%ñ,zçˆ4mNëDºÔôm;ÁÐAàí;Åž#_ø³Ã÷W^¶ð·Š|Sá¬O x«]ñÙ?¶>xÛÀ?hðO‚¼U7ü%·ÿo>Á®ø§û{ûwá¥ßü ¾?ñ®ÿ|6þÇÓÿá5¿±ûgÛÿøJtøW^?ñ÷ÙüOÿçÊÿðÐßµ¯ý#ïâþ$'ìßÿÍÝðÐßµ¯ý#ïâþ$'ìßÿÍÝÎ]éÿàê_ü°w^sÿ Ô¿å$^ ÿ³!ø—ÿ«ãá5~ƒxƒþA>ÿ±^ïÿSO׿¯ÂÛ?l 7ã_ÄŸÙçÄ|)¡~Íž8øZ’ë¿~øßûOÄ:×ņ¾,ÒãµOø»ZÔ¡ó´Ý^iÚóJ·±¶þÏ„BIïá¶O~øÇñÏ㧇üA¤xcá·ìƒãÿ‹‡<9Œþ9¶ø­ð/ÁZF­©ßkÞ¿q‡¤x£Ç±xšK 6ßY´Ónou½#A¸›ZµÕ¢²Ó®tx4ÍsX¹+¾TáuJ+ã…®¤›\Î\­Û¢`žï]_gÙtµÍŸÚÃ2ñ¯Ã Ÿ x#]ñ·‡5øÛá&â=WáÔÚU‡Œ“á…ÿÅ¿Áñ–ÇGñ£ã¯†Ú‡‚¿¶>¿ô}Câ/¼aañoá¶•}ãï‚Úˆþ.xsÁ>Ö=CÃ^ðç‚ü9áÿx;Ãú'„ü#á=Jð×…¼-á­*ÃBð熼9¡XA¥è~ðþ‡¥Ák¦hÚ&¦ZÚéÚV•§ZÛXiÖÐZZA ¼1Æ¿ÃC~Ö¿ô¿ˆøŸ³ÿ7tÃC~Ö¿ô¿ˆøŸ³ÿ7u>ÎvµéÚíÿ—[Ëó ¯?¹ÿ~Æ_ò1þÛŸö{ß¿õUü¯œ?ൿòd:Ÿý”ÿ‡ÿú;T¯¨ÿc_üNðå‡íâ_ŠŸµ…ÚÇÅŸÚOÅ_´_ j¾#ðoŠoí<=­ü<ø]¢Å$ú§µÿh­·Zðî·e½í½ô°ÙÇy>ŸgÜ~\ÿ‚ÖÿÉêöSþÿèíRµ…ž*6i®eªi¯‡£WOäKø>Kô?e|_ÿ!kOûüÿ¨_‡ëÈ~"üKøsðÁºÇÄ_‹^?ðOÂï‡ÞþÏÿ„ƒÇ_|U¡x'Áºö¶«c¡i_Û'ñ-þ™¢iŸÚzÞ§¦èúÛo ûn«¨XéöÞmÝÜÉëÞ/ÿµ§ýŠþÿÔ/ÃõùËÿ"ƒÄw_³F‡kàíWDм]sû^Á: ð¶¹â_ßø³Ãš7ˆæÿ‚…þ˱èz¯ˆ<-¥ø—ÁzŸ‰tM;Sk[ÍWÃúwŒ|'¬ØCq§Zx—B¸¹TµÁ«ÔiìæÓùÊÞe-—¢ü¨~üpø-ñ÷×¾1øñáwƯéºÝφµü%ñÿ„þ#ørÃÄvvn©wáûÝsÁÚ¶³¦Zëvºf³¤j7:T÷QßÁaªé·rÀ¶÷Ö²KÛxƒÄ¾ð„§Š|A¢xkLºÖü5á«]GÄ­†asâ?xJðwƒ¼?Þ£=µ¼Úß‹<]®è~ðÖ•®øYÒ´=. ­OQ´µ›ò‹ö‰³øÇû3ø7â_Ç¿ˆÿüeñßã÷ü(Ùá>=øFð·ìwû5|øsð_UøéñƒÂ~%ø·âÿÚLÿ‚†èŸ á2Öþ#|PøIsñÄžø…¡xãÇßg¿ƒþø{ðÛÅzÍçŹ¿/4ÿhkSã¹ñwÁ0üAñ·ü;áÃhéáoŠÿþ9k¿²çü#ñ³àñøïc«øwÃ?5¿ð¬4KÏ‚"ø‹ð;Sýž~ø‚ÛöÓõ}Cá¯ÂËO‰Ÿtχԩs{ÊK—š1¾­ÝÚý‹]mÓdÂÿ}¯÷[ÏÏ¿Ìþ®è¯ÈŠ÷þ"~ÄðWÿÙÛP×¼mû@øÛàß‚~?üøeâ;¿ xYþ1üYÿ…‡ÿþøGñËDÓ5ï |ðW¼¯xØxÛãþ±à Yü:øcá/í? h¾ Ó¯´m{ÆÃ_ñg‰ø›¯Ú«ÇVŸôÝÂÿµ×ü'~&Ó¾6~Æ? ¿gÏ€WìåªÃq~É?<-û.^|jý¸ÿ±¼-ðÏLø¹ñþ?âÏí9ã_øZÿ²ÿ‹~þÌ>ÿ†iû^¯ðê_ ü8øÍ¦x©*mì×ãµ¢ÓÛ¯7T­fÞÎÏþãý‘û]E~(þÜ?µW޾þÑ¿¼+áŸÚëþW¾~Å~5~ʲ_•û9Mÿ •ûFøŸÇ_¶F›/ÂoøFþ ü3ñ'íñGþ½[áÁ/†ŸðþÎ~?ðޤÿ„¿ìÕtx³BÖ­üSâÏíWûYh^ð­Û~Ô øKàŸþÔ?ðSÍ3\øåñ¿âŸì÷û+ø7áÍ·ìÇû_Ã=~γ/ƒ~.øëö$ý¨¾ÞÿÂ[ðÏIø…ñ x/ÇŸ õ¯µ_‡^2ñ¦‰ñ×IðOÿø]);;ÇÞÚ÷_g›·n××MÅ~Ÿ×OóGïô%ðå׈õ_ZøƒD¹ñv…¢xĺ煠Õl&ñáÏ_ø—Kð·ˆ5]9ÛSÓ´Oê~ ñŽáýVîÖ fÿÂ~%´Ó§¹¸ÐµHívëù°ßµWÃÿ ~ÒŸ->(ø'áGŠþ5~Úÿ²—…h¯xŸP³ý›~þÎñ§¯Ù›âŒ¾%è^=ý¤ÿe¯þ1øÿ ?ã=ŸÂÿØ~Õÿ~#l¶Õü ð—KðÂŽþ:¾ø‡m§~Òÿ¶?Šô]R-Gö£þÅ»·ðOüÁºŠ>øcáo‹¼¯ÙþØ?ðVŸ³ˆh/xÏãGì¥á)~%øÛÄ¿³ÂÏÛxkâ'‡>xCöUñî«âï|gø5ð^ãá÷Šþjš#t^Žñ³åZßy[²{7÷jò} ŸùŸÐÍbAâ_]xUðu¯ˆ4KŸhZ'‡üK®xZ VÂoèÞñeÿ‰t¿ xƒUÐãµ=;Dñ.§à¿éÞÕnía°Öoü'â[M:{› TŽ×ðWý´?o 7ãí97„<_ðOƾ6ø}ÿ Õoá/Økþ}Gâ?Æ;? | ð·Ç)¿e¿ÿÃ&ü+ý‘¼;ûA|8ÿ…á«|>ø â?øZ?nüø±áoŽÙÿ ‰oû/~š}×ůøJf¯Â;ªÅñ_þ s?ïí/Ùgá·Âï‡ÐdÚ]Øø—ì:LJï²ÓÓ¤â›mh“Òïy%«µ–ýõé}BúÛúÙ=·ëÛÔý]ñ‰|9á;5OøƒDðÖ™u­økÃVºˆ5[ ÂçÄ~4ñ•àïx~ ½F{kyµ¿x»]Ðü-á­*9ÿ]ñ³¥hz\Zž£ik6Ý6¿nÿž$øQû"x—Á¶—ü5f·ñ›Á?°ç‰k+ßì¯Ù{ÄŸðÊßþ,þÚðOO„ºÇÀß³|øKà;O…ßð»¾~Ð_µ_‡ÿáøçŒ>'ŸøRßÚ¿ |Gá=oá¿ÄMKXí¾~ÔŸµ—Ç¿~Ìÿ õ_ÚOÆßÿáiøÛà'„´O|:ðì÷¨øËöýšµÙþ 'ñ«ÀðP-/ˆ_þ!ø'àÏü7Ÿ¾ø}õÙOľ Ô<}û3é_ï¬'¹Ñ¿án,Ó·FI6Ü}ÛßâéåËóè­¹u¦úþ¶ÿ5øŸÐÍüóhŸ·wí7À{[ÿ|cÿ„o[øõû/Á=?j­㇈õÏ‚~~Ê~)ý²-¿jøûÀþ,øÉâßÙÏã¯Ãï†ß²ö‹iû0è¿>ë>~Ð?õ¿‹¼5ð×Åßuíoâƒü{ðÏÄü%ÿøÙã ü@ñ.±ûnø'ß>þËÚ¯‰ÿe¯€_¼Aû/xïÁ¿ðPoÿkïø(ßÀ_hZ>§â/ÅÏÚ'þžŸû0þÏ~Ô!ý‘ ýn|gªüG¾Õ~øàþ¡ñÁº†c=uŽ.»½VËoÊÎújÛÍ_òÿ3ú…¬Ox—Þ°ƒTñOˆ4O i—Z߆¼5k¨øƒU°Ñ¬.|GãOé^ðw‡à»Ôg¶·›[ñg‹µÝÂÞÒ£‘¯õßë:V‡¥Áu©ê6–³~^ÿÁK>>|røCâ?€~øwñáwì×ðÛÆº'ÆMwÇß~-|jøgû7ørÏÇ ¿øA§ü1øEeñ‹ãwì£ûeü+ßÄMÇ? üd±ý¯?àñxö4ðÖ‹à…>ý¥|9â?Š¿°ůˆ¿¼?ðÏö—øX¿·£¢xkã¯>=xCJ›Ã¾+ømaákÙÞüHð<>ðÆäñ'%ugêÝ”¹^‰?øm]_&—ßoó?¡Ÿ x—Þ4ðç‡ücàïhž,ð‹4M+ľñO†µ[ wÞ%ðæ»a©¡øƒÃúæ—=Ö™¬èšÎ™uk¨éZ®usa¨Ø\Áwi<ÖóG#m×ó+û-þпlþÞüZø±ûMëSö³ø£û|Fý£¾7jº/ÀX|øgã¯ø#gÂ?AûTøjûâWÂÍ[á—‚tOÚGö¿ø5kû'OãŠñ—ÀÛïøgľ ø[ÀŸáÕuÈþ×ý”?h_‹¿¾,xæ?‹´Þ·á_…~ø]ð/†Z¼/ÀxsãÜ??ࣶ·ÁOƒ_µ_kŸ /Äzßí‰ðCöjø¡ø~o„z§‚þxöÃã÷‰|Sû>xÂ:÷Œ¾ë¾r¤ãwueným¦ÚÙ»wëdšïmõWü¿Ìý“¢Š+!…Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@~IÁkäÈu?û)ÿÿôv©_­µù%ÿ­ÿ“!Ôÿì§ü?ÿÑÚ¥m‡þ5?ñ~Œ™ü/åù£öWÅÿò´ÿ±_Àÿú…ø~¾^ý ¾3j¿<7àÍSÃÿuŠ>$ñ÷Å_|!ð¿ƒ4¯h¾¿Õ¼Uñ+Vox^Þ cÄf×íZüÚu„²ë:†“¦ÚÃy%õÞ§o £¬ŸPø¿þBÖŸö+øÿP¿×Ä?µü„¿c¿ûH7ì_ÿ«§@¢S®£%xº5v®®ú«0m¨&·²ý£þÛÿþ‘¯ñÿsöPÿçŸGü$·ÿý#_âþ$çì¡ÿÏ>¿s¨¯Kê´?çßþM?þHÏž]ÿþGáü$·ÿý#_âþ$çì¡ÿÏ>øH?oÿúF¿ÄüIÏÙCÿž}~çQGÕhÏ¿üšüsË¿à¿Èþ~ì<5ûf韼UñjÇþ }ñˆ>6ðO€>xŸÄðÕ¿³,¿Ú~ ø]®üKñ/t쩾.É¢Yak>"Þÿhiúm¦«©ÿÂEömbûP´Òt(4ÎÛþÛÿþ‘¯ñÿsöPÿçŸ_¹ÔQõZÉÿ“Ϧßh9åßð_ä~ÿÂAûÿÒ5þ âN~Êüóèÿ„ƒöÿÿ¤kü@ÿÄœý”?ùç×îu}V‡üûÿɧÿÉ<»þ üÃøH?oÿúF¿ÄüIÏÙCÿž}ð~ßÿôˆø“Ÿ²‡ÿ<úý΢ªÐÿŸù4ÿù ç—Á‘üýü4ð×í›ðáÏ€>ü:ÿ‚_|@ðïÃï…Þ ð¯Ã¯øþ·öeÕ¿°¼à ÃÃ^Ñÿµuß‹ºž·©ÿfhše—ö†±©j­ï‘öBúîîY§“¶ÿ„ƒöÿÿ¤kü@ÿÄœý”?ùç×îu}VƒÞù<ÿù æ—Á‘øcÿ íÿÿH×øÿ‰9û(óÏ®&ÃÃ_¶n™ñÅ_¬à—ß øƒãoøá׉üAÿ [û2Ëý§àß…ÚïÄ¿øGþÊ›âìš%—ö·ñƒâ-ïö†Ÿ¦ÚjºŸü$_fÖ/µ M'BƒLþ(£ê´?“}ýùÿòAÏ.ÿ‚ÿ#ðÇþÛÿþ‘¯ñÿsöPÿçŸGü$·ÿý#_âþ$çì¡ÿÏ>¿s¨£ê´?çßþM?þH9åßð_ä~ÿÂAûÿÒ5þ âN~Êüóèÿ„ƒöÿÿ¤kü@ÿÄœý”?ùç×îu}V‡üûÿɧÿÉ<»þ üÃøH?oÿúF¿ÄüIÏÙCÿž}ð~ßÿôˆø“Ÿ²‡ÿ<úý΢ªÐÿŸù4ÿù ç—Á‘øcÿ íÿÿH×øÿ‰9û(óÏ£þÛÿþ‘¯ñÿsöPÿçŸ_¹ÔQõZóïÿ&Ÿÿ$òïø/ò? á ý¿ÿéÿ?ñ'?eþyôÂAûÿÒ5þ âN~Êüóë÷:Š>«Cþ}ÿäÓÿ䃞]ÿþGáü$·ÿý#_âþ$çì¡ÿÏ>øH?oÿúF¿ÄüIÏÙCÿž}~çQGÕhÏ¿üšüsË¿à¿Èü1ÿ„ƒöÿÿ¤kü@ÿÄœý”?ùçÑÿ íÿÿH×øÿ‰9û(óϯÜê(ú­ù÷ÿ“Oÿ’ywüù†?ð~ßÿôˆø“Ÿ²‡ÿ<ú?á ý¿ÿéÿ?ñ'?eþyõûEU¡ÿ>ÿòiÿòAÏ.ÿ‚ÿ#ðÇþÛÿþ‘¯ñÿsöPÿçŸGü$·ÿý#_âþ$çì¡ÿÏ>¿s¨£ê´?çßþM?þH9åßð_ä~ÿÂAûÿÒ5þ âN~Êüóèÿ„ƒöÿÿ¤kü@ÿÄœý”?ùç×îu}V‡üûÿɧÿÉ<»þ üÃøH?oÿúF¿ÄüIÏÙCÿž}ð~ßÿôˆø“Ÿ²‡ÿ<úý΢ªÐÿŸù4ÿù ç—Á‘øcÿ íÿÿH×øÿ‰9û(óÏ£þÛÿþ‘¯ñÿsöPÿçŸ_¹ÔQõZóïÿ&Ÿÿ$òïø/ò? á ý¿ÿéÿ?ñ'?eþyôÂAûÿÒ5þ âN~Êüóë÷:Š>«Cþ}ÿäÓÿ䃞]ÿþGáü$·ÿý#_âþ$çì¡ÿÏ>øH?oÿúF¿ÄüIÏÙCÿž}~çQGÕhÏ¿üšüsË¿à¿Èü1ÿ„ƒöÿÿ¤kü@ÿÄœý”?ùçÑÿ íÿÿH×øÿ‰9û(óϯÜê(ú­ù÷ÿ“Oÿ’ywüù†?ð~ßÿôˆø“Ÿ²‡ÿ<ú?á ý¿ÿéÿ?ñ'?eþyõûEU¡ÿ>ÿòiÿòAÏ.ÿ‚ÿ#ðÇþÛÿþ‘¯ñÿsöPÿçŸGü$·ÿý#_âþ$çì¡ÿÏ>¿s¨£ê´?çßþM?þH9åßð_ä~ÿÂAûÿÒ5þ âN~Êüóèÿ„ƒöÿÿ¤kü@ÿÄœý”?ùç×îu}V‡üûÿɧÿÉ<»þ üÌ›« Ý5tèu!jšÆƒá½Vþ 廲´½Öü?¦k7V6w³ÚØOka=ü–Vú„Ú~-üP%äšvžóµœ:N“¥Ýiz–­«jWöÖúNœ‰§i6ú¬óϪÛë*η:Æ1C fLîó ª¬Õ/‹ÿä-iÿb¿ÿõ ðýŸò%øƒþÆé§ÇåYsÉYYsÙ]ÛE&ºßK.¾¦·vO¿/âÕÃìž ÿ ÿŠ?ðÒù¸£ìž ÿ ÿŠ?ðÒù¸®^Š\Ëù#÷Ïÿ’Íþåý]ù[˵±ý¡<1û?è–zö§¨ë¼mñ‹Sñ&«g§è¶Ze—†¢–Úw‡lu ‚-_TÒ^êçÄÚ\+É¥É3(´TD•;°c_žš—ü¤‹Á¿öd?ÿõ||&¯ÐoÈ'Àÿö+Ýÿêiâú¹(­yWð£+^V»’MüWÛ¥ì%}uz?.ÉÛo0û'‚ÿè?âü$4Ÿþn(û'‚ÿè?âü$4Ÿþn+ãoÚ™uÛÚø±ÿiß~Ì?¼)çÜx«]øOðçáÏ>-øÓÅ:î«áï |5ðG„!ø¥ðã㦉ªÿÂK­ëþÓ~x3àoŠ~1ü]øŸ¯ü+ðçÃ?h—vz¿~*z‡ÀýWâ®»ð[á¹ñÛÃZ'‚þ7ë? ¼ªüdðw†§†ëÞø«¨øOI»ø‡á¯Ý[øƒÅ–÷:&…âéµ}/Jžø–¬-`’/k(˨ÜÍÕ¯Ë íkÎÿúUŸÉ»]^×Aó‡——õ­ºZ¯Ã‹ú/Åo|pÒü?¥ê–:gÁ¿Œº—ÁÕÔuŸ²AâKÝÀžñ^­®6•eqo¢Ú®­ã;íN³¾­-æ£Zë·3i×:¼ÚùÛÿ­ÿ“!Ôÿì§ü?ÿÑÚ¥}ûÈÇûnÙï|FÿÕWðV¾pÿ‚ÖÿÉêöSþÿèíR¶¦”q0IY)+-^ñ¿[²eð_É~‡ì¯‹ÿä-iÿb¿ÿõ ðý|]ûP麎©ªþÈÑ鶺Œ–·ì™â èìmg»{-Âÿì+hº_‡ô¿Ž~ é–:§öÆ¢¿u/h—¾$¿‚ÒâËJmsVñ_€«ªizTšÃÆ–xsÄ~ñ,šç‡õN×DµÔõ;Æ0OàíGÂ~#oøOÃö·^ ¹ðÏŠ|-â\O xW]ðçÙ?¶>%øÛÇßgðO‚¼+7ü%¶lþß®ø[û{ûwâ]ßü ¾ðVÏ|IþØÓÿá5°±ûÛøE´øW^ðÚØÉñwÄ>×-tÏ ø‡Ä^ñF –/ᯇ~ÕÀÕ<#¦µ²ÝjwVÑÜjf;qz× ·ñ_ö}ñOÅ_§ˆ¿á©ÿi߇Z}¦—i£èþ øaâO…þðމam-Íäëi÷Â]k\¿ºÔumCSÕïµëÚÖ¢n5°´º´Ðl4mL¦àݹ¬½œcÍÊõjIí¿@WÞÛµ¥öVK·‘ë¾?ð.•ñB°ðþ±7‘i§øÛá§Ž¡ì/ø‹v«ð»â7…~&hPýƒÇ^ñv‰oöoÂ:|Û¶:U§Œ¼/æÿÂKðëÄþ øƒ¤øcÆzm_ÿÃxþsöÞÿÃð¯ÿœ­ðÆ^#ÿ£Üý·¿ðã|+ÿç+SËOþ~ÿäúè}¿Oów˜~Æ_ò1þÛŸö{ß¿õUü¯œ?ൿòd:Ÿý”ÿ‡ÿú;T¯½¾|ÐÿgíÆšN“ãOˆ/¾ |@Ô>%x£Åµ ê^$Ô#x»Rø£û?ü%ð·„|Kã{ÿ‡¿ñíñûá—ÀM÷Ä6Òü ñ/SÐ4MSø—kâVçNð'‰ïç°Ò®,­4Ö¸¹ŽX¾®ñü…­?ìWð?þ¡~¯¿l?€ðÓßâø=>™àwDÔþ6~Ë^5ñŸ‡~"Ùÿiø7Å?~þÔ?~0üL𖱤>¯Úkð•ü>ð‰|;§è:®™&…®êºŽ‘â ½3D½Ô5;<]½£æøyÝý9µÚÝ<ÑKá^‹òùœO…?k¿øDu_Œ¾ý±¬¾ þÌšßÁ?üø§â¯XþÐð˜ü·øsñûÆ_>|5¸Ô>.|Røaû:]è~6»øƒðkÆÚ±á}GÀ©¡[ÛjŸ¦Ðx;PÑ>$x»]Ñ?aoˆ~GŽ<'‡<ð[öâý®4ïÙ?Cø©ð×XÒï|I©øßDøi©ßZøÓÅWzw‡bð퇋>èÖž4¶¸øƒ¡¡Ÿ¿d+ ü²øcû|?ø]ð+ßð´m¾!|Dø;ð—Ä~#ý‰¼9ñ¶Âo ê^ºÑ/~<þËþ¼ø©ðW[±×£øqñçÇŸ|)­xÇv´ßž(ko†ßüQ¨iøþ gñnÓᧈ<ñ‚~(Ñ>1xÛà^»ñwÀ>-ø•ñ?ãv…¤ø7àwüóãOíöÞ»ñïÅ_†Rx¯ö•ÿ…Ÿð#ö•øð÷ƾ'ø¯¢x#UŸâ7Ã}|C4OŒž&ñgÂêJ›Õ»{Ñ\·é§3Õ¶´MîÖ©)s ×·Müôòë~ËmÕïþÔ¿´/Ù“â?íwáohŸþ|7ø]ñCâÕ׊~ ø‹Â¬.ÖÿcŸéö?|KñàV»¤é_µb×· ¬´/‰ (>¶ë¾É¨é¶­^Wµ›åµ“hð:_ð¨l?joÜ~Ú~*ý‰¯­³þ é?²÷€?jo ^ùú­ßü%Þ ñʼn |uköh|<º&ÿ ë[ð¿Ã©|ýCÅrê¾.ÿ…£åèþ‚ÓÁ:î¥qåß?à¢ß³'Å_ÙoµÿŒ~*ü.øðCâGÅŒ_~øÛâ×Äm#áï‡ Öìµ?‰¶Ÿ.,5¿‰¾ø[uñ.ÛÀzŽ™ˆü3a{©h—k©¿†¯õiøŸÚ?þ ÿaûO|iø¡ãêú%—¼að»öOð â;ß›†þ,ý·¼-ûQøKUÒôëÿ XØèŸ¿dÿÛ+Çß³ÿ‡üaeâ]OÄ~¿ñÿ‰~&x{GÐüsð÷áî¹s‹áŸÙköø/â|Xøg§üø›ñÁþ6ÿ‚˜XOðûÇ_|uð›Á·¿o/ÛoEý«¼5â¨~&xàÆ=n/|>Ñ>x3Âï€á[hZΫã?êZÄ»[OéP|Bv¦ÒÕó{·ÖËàmÙ»¯z\ªïáiôjË[ùÃÁ=¯FýºþÂuûø+Æ÷ßð„ÿüá ñGÆOì¾)ñ'üYÏ~Î^øÿ¦|Sû‘áû*~ÿ„#Â÷~6ñOüZÿíë‹{OøM¼;£WËß¿àª?ð¯ÿfo‚Ÿ´ü*?ëßð¹?eïþÑßðª¬><ù¼ýµû þÙ?¶ö?Š´ŸøTóý—Á:·ü2wü*|LÂÂq®ë_õ¯øC´øSØ?6üÿÒ°µø“oã¿Þü.°·ð¿í ðÏâW‡¼;ðÁž#ð'õŸ…_?dÿØwÁv t_‡Ëâײø!¢h¿¶_ì+ð ö„ðn‘¢xâ”Ú7Ãÿ‚^ø;}â­SÂ?~+h×_!üEÿ‚KþѾ.ø1ð»áÖ›ãO‚pk~ ÿ‚y|ý’õ[«ïøê-*ãâ7ÂïØþ ±û,øƒZÓçƒá½Íܾ ¼øƒûsü%Ö4}JæÆÓ]¸ðo‡~"ê¾Óõ½'Ã^ñu%G«éÞé_–ÎÛ=e«ít–Ì5¿õÝ~—_cö»Pý¥g-'Æ_~j¿¾ éŸ~ø&ûâ_ůê| eã/…ßtÍ+G×u/üEðÅν·àŸéú'ˆ¼?¬_x«Ä¶:f…i¥kº>¡=üvš”Óö¾ ø—ðçâOü%¿ð®¼àŸÂãm{á§Ž¿á ñV…âŸøB¾#x[ìŸð“øÅ¿ØW÷ÿðŽxÛßo±þÞð®±ö=wGûe§ö……¿Ú!ßø£û]ÿÁ9¿koÚ?ÄÞ=·_x'^´Õ¿á²¤ðçÅ_~×?´õ¦•6…û@þÈ?µwìóðká¼?°¾ðÃÄ?³ÂÏøS’ü}ø{àwãg€üQ¨üFøàß…Þ'ø§­é3üAøÇão ¿êÃ_€ð¬¿h߉_|1¦x'Âÿõ¿Ù{öLøðëÀ¾³þÄÿ„?þãÇ_µž»}¦ZxcOѬ<3áÿÚøgãŸtYèWÒù?ØšöŸ6¢iún6¯ŒSR»µí¥¯t½uMµ{4•šLkÒßðËþÄø/ûhüø‘ð[öiøŸã¿ü.ø5âïÚOáwìÛãÍáO‹~+xN?Ùxö¢ðž¥â…ÿtvÖ_ß‹u¿ê~ñ÷†üÖ^Óïþ!_ü=ñðöˆ×µa¦mühý²¿g/:ÄMwÆ¿¼/ü)¿~Ͼ øÙ£é7ð+뿿᥾#x7á×ÃüaÓõohÿð­¼ÿðšÚxëS×¼[6—»á΋â/è6š÷ötv7žZü3â5‡ìåñWáÖ§qðNóâ犿àŠ?à™žñ×›®ÜÂ9ñÀ>ý¥t/Šwð“Üx :ý‰¾4ø§Åÿõm2/ÙçDÐl~(ü;øçðJÂÒ?G7ˆþ x;ö¸ø;û_x—E“í¾Ö5?ÙDøÕ©ü ðO€?iû¯‡>&ý£|ñûâ­žûné?¾ üT´ø§ð«ãÃå§Íñi}¯ÒñÙêömwÒû&%{+ïoÄú‡ö€ý´~ |ð?íIu¡ø÷áwÄÿ²Ïìóñ7ö‡ñìߥ|Vð‡ÅXü9ð÷áúøöÕ'ø÷áwÁ|@ý¡¿iÙãáO€üyñ[Âz_ˆþ+øöuý¦üuû5³ü=°ñ øcSñn·âÝOÃ×Â~Òõ‹ÿ_øëDð±¼Ö®ÃUÕÿ5ÿk¿ø'7ímûGø›Ç¶ëâÏëÖš·ü6Tžø«ã¯Úçöž´Ò¦Ð¿hÙö®ýž~ |7‡öÓ¾x‡öbøYÿ r_¿|®ülðŠ5ˆß<ð»Äÿõ½&ˆ?ümá74\èŸµÏøQòÒåW–¯Wk_g¢»Jßk[JÞí®Âï·ßòí~íu]ÏÙ? |pø-ãÿëð'Åÿ…Þ5ñw‡µ¿xk_ð·„¼á?xCñ«ÿéÿÇ´ñ ulj´Xï}F¾^ýš>|Fø'áCÀ¾ ·ðN«¢kÿ?m¯Œ:—ˆôk­ªéð½?k¾øvÇÃW¾´´Õ¼ÿ‡ßuX~"êóøŸGÿ„;Æ^Óô/ iŸtOÜø³Ã?PÖM$ݵZÙ÷×+öQE€(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+òKþ [ÿ&C©ÿÙOøÿ£µJým¯É/ø-oü™§ÿe?áÿþŽÕ+l?ñ©ÿ‹ôdÏá/Ͳ¾/ÿµ§ýŠþÿÔ/Ãõð×í‰7‰®4€^ð¿&øö×Á¾%MÝý†¯¥ Ñ¥jóÏaý¯£êúl:”W—mѵHëî_ÿÈZÓþÅÿêáúø‡ö¯ÿ—ìwÿiý‹ÿõtèT’x˜¦®½£Ñú±=!§eúPë4ßú?ø(7þ?‚ßýUçþ ÿ‚~ü2øâ?‹>ðü3þ «øƒàwÄ 7áoÅ-?þÂëøEüw«ü,øiñ¯OоթþÍVVZßÚ>|`øuâoí?Üêú<_ð‘cO¨Eâ #]Ò´Î_À?nÿ…§ñ»þþÿ ·þíÇÿ £þ?ü6Oü3?ü1ü$¿á™?áZÂ+ÿñÿ þãþoþßøvül¯þû7þø™ÿÃiÑÿOÿ…§û.|6ý¶¿h/ßð°4oþÒ?°íqᯉZï¿øHôícà§íOû:þÉßþ)~Î?µ¬ZŸ„?á²øoÿ /Ã/xßàÆ?:þµ®üEÖ|wð÷þ «ð«Àhž𞯨ZúÜþXÿà+üŒîû¿ëþ}Ç´ë4ßú?ø(7þ?‚ßýUãúÏìUð'Bñ§„þßÁL¿niümãOŒ?t èß~øQ³øËkð Äßµ,¿|XžýœõHüâýŸ<'ª|W¶‡ÇRxr Ï ÝxfâÎâ{Ÿx:×]ùÞãâ/ÄŸ‚;ðçÇÏ€~ßþ&ý‚þ~б®™qðƒö„ñíc¡þÑßhÚKGý¶¿bÿü-ð—üóÅß>-x“áøøµûKÿÁ/~!.Ÿñkâÿd ëÀ>;øƒð«]“㯂þ(èú¯|'ý?i_|RøðÏãߊ?iýCâ¶¡ûoþȾ3øýûFü&øƒñ¿Ä>ñ§ÂŸ‡ßðn¿Ä¿ÙâÅO|g×tëÍᯈ>1þÔ>6üø«ñ{C·øMûhA§xçà‹õü4ñOŠÿcˆV§$?–?ø ÿ »îÿ¯øe÷¨ÿðêÍ7þÃþ ÿ‡Oà·ÿCÕsþ,ÿ‚lxÀ^ñ7޼uÿý¹¼àŸøYñgŒ|câÏŸ<9á_ øWÚuαâx›Ä:ÇÀ;=#Aðþ…¤YÞjšÎ³ª^ZéÚ^ks}}s´Ê¿Ÿ5ÿ†×·ð—Æ] Å?ðßíñ7Á?ÿi†ŸðI9üÿ ws£ÞþÓ ¿n/ø(Oï‚Ú—ísâ/…žo~ |?Ôþø_þ ‹¨i?à«úŸ‰?g¿Œ¹ñÅ-KÆ^6²ñíkâíoßü7ÿ Oû;ÿÂûVø‡þÿãžµ{ûÿÁWôo‹¿,ábüMû'ì'ð÷þ}ñoötøqð‹öz¾þÄøoÿ ÇÄ„Ÿ²åÇìéñ«ÄÖñ‹Äßð³~þÎþøûeû2øÏáßÁ4ä‡òÇÿ_ä}ßõÿ ¾ãˆ¶ðì‰?…uŸÜÁCÿà¬Ú.¯£xƒÃ>¼SðŸâ/ƒÿjê>2Ó¼Y­xVçÀ²/Š¿`ýö£ø™áýCøuñ__ÒüYðïáŠ<+uáÿ‚¿õØõ“¤| ø»yà¿`ø9û'þÏõWÿ ¿à¥?ðPoxƒÃÿüñ/ÄÚþ-ð7†µ xsâŽþ4ü-Ñ´ßiž,ý–´+ß ü@Ѿ&þο¾|EøOâ84ÏŠüwðßÄ^ø«àßx‚+m>ç·øMñÛD¿ð¯íûKxÃÃ_¶ýÇï‹Þøeð›ã/>þÀµÇ‡'ý•¾éÚwÇKözðçìñð—ö™ý”ü3ñöªðÿÁˆž?ñßü%|%û4ü~ø…⯌¿ÏÅŽ~ ~È2x_áìãÏþÎ? þ)ü ð—ì»ûOè > x‡ö€ý¢¾ þÑ>ÿ„7ÄzÅߎ߲Çí‹ûq|XñÏìûûXüXøQg¦øj÷Ãÿ´ƒ>&üHømûWüXðçŽtß„ÿ¿co‚´¿ü³FðOìÓðgÄžƒðKÁ$?–?ø ÿ »îÿ¯øe÷GÂø'ïÃ/Ž? >|kø[ÿ ÿ‚ƒx£á—Ƈþ ø¥ðëÄßð°>hŸð‘xâ‡4ßxG]þÆñìÕ¤xƒHþ×ðþ¯§êٚkhû.§§Ù^Å=´]‰¿à›ð^m¬xÇþ +ûsxOH¼ñ„ü'gªx›ãgÀMNºñW|U£xÀ¾¶¾Õ>ÚÛOâxÛÄ~ðw„ôh¥mGÄ~*×tohöך¾©cg?æÇß‚Ÿ¶‡‡¿bôÖ4CößøuãoÙ7þ áÿ‚wx¯öiøà›¯ŠÞð®¡ÿøgð§öغ¼Òõφ&•§êÿ~0|>Õü)ðkÁßeK¯ü/ø—§xËÀÞý¦þ|U¹Ñþ7½öšø[ñ³âç‰ÿloj:íÿâÿiß´ìñÇr>§ñwº>‘ð‹à·üöhø·¯é_ôßjhºçÄþÌ¿ >%üTý–Ô5ßéš­ïåÇütþÛÿ|}û`xÀ>ý§Òçã_Áÿø(ÏÀ?ˆ²÷„ÿgø(ÿÅÿ†z‡Á þ éû]é_³ŸÄ/ þÐþ ø¹ã¿ø&|þ ý¡þ'ü:ý•þ hß¿eÏÙËá_í+áOˆ_m¿g?|CñôŸÚ7Lø²xÇá‡üKñwŠ4 øÿöŸýž<,~0~Þ>,ý“ô¿†?²‡í™ñ«QñWí#ñþ ÓÿñÖ«âoXüýª?eOÙ»ÂÞ×þkŸ±oŒ~k?ðVX¼wû |Cð¯ŒÄ>¹Ñ¾ÁûVÞxœä‡òÇÿ_ä}ßõÿ ¾ãõRÿ‚~ü2Ò>)ø7ডÿ ÿ‚ƒ[üMøðÿâ_Å/øgþÂéµü ðÄ ü'ñ]þÙƒöj—ÃöðŽøƒãÂÝ?û3SÕlµ_þµhZ~§e¢xŠçHð†Ÿ¿e_‹õ/ƒ¾ ÿ‚‹ÿÁQ“Ŷ_>,|'ÓuxO[øeð³ÇþxÆ^ø±ðÓá?ÇO‰±G„~ |eøà­Oá¿Ä»­KÁ¿ þ øÏÄwøeñ/Æn›{á/‡¾2ÖôOWÐþülðGìÿâŸÛ t/ÚÆ?´×ìáûÿÁD~;[x'źŸÅßüIø½û ]~×ÿþx³ögøIàojþ%ºøñ+ö%ðwɱÏìçðãUøkû?øóö±øMûücñµÞ‹a¬ëšïÏÿ²'ÃÿŠmûSü8ðö¡íâŸøUðSÿø*‡Ç|"øãû1øáì±û9ü,ø¡ñþ Acðëö’ýœ¿h¹ÿgƒ?ð½þ |Rÿ…éð·Ã:oõ?Úö¤ðåçïÚw⿎t/‚z_ü+?üDýŸNH,ðþAwÝÿ_ðËî>Èñ7üGÞÓ­µMSöçÿ‚“][]xƒÂ~Š/ øŸáÿ5Ô|iâ­ÁÚ=ÍÎàïÙ‡]Õìü?g«ë¶7ž,ñeåŒð…`Ö|uã­gÞ ðçˆ|C¥ù—ìŸû4iñçí1á_ø(ïüOÿ´F›­øºêö=Oã¿ü#Ÿ´ÚË]ñOío§ø«ö{ø½ð'ÇŸ5?„?~.xKNý¤àðGÏÿ¾üb¶ýœa?…¿´ÃOÛþßã×Ãÿˆð@Ÿøf‡^ðoíÙìãàŸÙŸàý¯üÄ_´/ü4?„~ é«ûxoâÂïŽ^ý·õßÃhiö_´'‚m|/ámLÿfxDý§¶9!ü±ÿÀWùßwýÃ/¸ý§ÿ‡Vi¿ô~ðPoü:¿ú¨ÿ‡Vi¿ô~ðPoü:¿ú«áÛ[â—‰þ ~Ôÿ´%·ÁÍwöÿ_W?ðLÙ#â—ü¯À_ tÏø('‚~x_ö±ø¥ñþ !‚5ßÚ§á'ôÿþÎ_ ÿá%ñŸƒ?gíÇZgü§Â~øm‡<®xgâ¶Ÿmà_|TÓtϰ?c‰ÿhïþ×ÿ|)âÿ|@ÕþþÆÿ?à ÿ ~+ë^"ø‹u­x⟎ÿm¿Úöný¼¿c- áׇ¦ñ¡â]kþÿö%ñ®‘ð‡Åڟį|>ÑþkàøWû8ê¾§ŽµÿþXÿà+ü‚ï»þ¿á—ÜuðêÍ7þÃþ ÿ‡Oà·ÿCÕðêÍ7þÃþ ÿ‡Oà·ÿCÕ~«QG$?–?ø ÿ »îÿ¯øe÷•?ðêÍ7þÃþ ÿ‡Oà·ÿCÕðêÍ7þÃþ ÿ‡Oà·ÿCÕ~«QG$?–?ø ÿ »îÿ¯øe÷•?ðêÍ7þÃþ ÿ‡Oà·ÿCÕðêÍ7þÃþ ÿ‡Oà·ÿCÕ~«QG$?–?ø ÿ »îÿ¯øe÷•?ðêÍ7þÃþ ÿ‡Oà·ÿCÕðêÍ7þÃþ ÿ‡Oà·ÿCÕ~«QG$?–?ø ÿ »îÿ¯øe÷•?ðêÍ7þÃþ ÿ‡Oà·ÿCÕðêÍ7þÃþ ÿ‡Oà·ÿCÕ~«QG$?–?ø ÿ »îÿ¯øe÷•?ðêÍ7þÃþ ÿ‡Oà·ÿCÕðêÍ7þÃþ ÿ‡Oà·ÿCÕ~«QG$?–?ø ÿ »îÿ¯øe÷•?ðêÍ7þÃþ ÿ‡Oà·ÿCÕðêÍ7þÃþ ÿ‡Oà·ÿCÕ~«QG$?–?ø ÿ »îÿ¯øe÷•?ðêÍ7þÃþ ÿ‡Oà·ÿCÕðêÍ7þÃþ ÿ‡Oà·ÿCÕ~«QG$?–?ø ÿ »îÿ¯øe÷•?ðêÍ7þÃþ ÿ‡Oà·ÿCÕðêÍ7þÃþ ÿ‡Oà·ÿCÕ~«QG$?–?ø ÿ »îÿ¯øe÷•?ðêÍ7þÃþ ÿ‡Oà·ÿCÕðêÍ7þÃþ ÿ‡Oà·ÿCÕ~«QG$?–?ø ÿ »îÿ¯øe÷•?ðêÍ7þÃþ ÿ‡Oà·ÿCÕðêÍ7þÃþ ÿ‡Oà·ÿCÕ~«QG$?–?ø ÿ »îÿ¯øe÷•?ðêÍ7þÃþ ÿ‡Oà·ÿCÕðêÍ7þÃþ ÿ‡Oà·ÿCÕ~«QG$?–?ø ÿ »îÿ¯øe÷•?ðêÍ7þÃþ ÿ‡Oà·ÿCÕðêÍ7þÃþ ÿ‡Oà·ÿCÕ~«QG$?–?ø ÿ »îÿ¯øe÷•?ðêÍ7þÃþ ÿ‡Oà·ÿCÕðêÍ7þÃþ ÿ‡Oà·ÿCÕ~«QG$?–?ø ÿ »îÿ¯øe÷•?ðêÍ7þÃþ ÿ‡Oà·ÿCÕðêÍ7þÃþ ÿ‡Oà·ÿCÕ~«QG$?–?ø ÿ »îÿ¯øe÷•?ðêÍ7þÃþ ÿ‡Oà·ÿCÕðêÍ7þÃþ ÿ‡Oà·ÿCÕ~«QG$?–?ø ÿ »îÿ¯øe÷›æ™g£Í¥i– *ZYøKÀñEö‹««ë©Iðf‚òÜÞêó\ßê7÷S4—7ú–¡su¨j’Ï{}sqw<Ó>΋vÚo†5íF ].kÄ×¼/eÚ–¤ëUµÖŸâÙîb†=^Êú(<ùlmG‰Fò#RûA¯‹ÿä-iÿb¿ÿõ ðýŸò%øƒþÆé§ÇâíRvÿ§Ÿ”~ÌíßÍü%ú·üúx_ÿÿò‚øKõoùôð¿þþ ÿåyæ«â_hWþÒõÏhš6§ãMn x;NÕu[ :ÿÅž#µðçˆð׈5É ]3FÔn­±<%ñ/áϾÉÿ/üã_·ø'Á_ìáñV…â?¶|9ø“ý½ÿ ëÇöŸØ÷÷ŸhðO¿áñ?ü!^*‡~…âŸøG5ïì+ûÿì}CìóÍ?æ—ÞÿÌ«.Ëúÿ†_qâ>$ø•ãMWöñð/ÃÛamüoû#üRñ‘ðÆ‘¥èú‘w⩾2| Ñ#×µKMOÓ“YÔ´ý")týãVûkhVº–¹‹öâwûGî ½^}EðŒv6Zúnƒw{u-ï†<9ª\Ü\ÿÂWâk1,·z¦•ytÛmlí`D3yi(œþrê_ò’/ÿÙüKÿÕñðš¿A¼Aÿ Ÿÿدwÿ©§‹ëY6µM§ìbï}oÍo¸—_&­å¢<»â×í?ð¯à‡,¼cñÛâ§Ào‚¾Ôµ»o iÞ)øµqðáLJ/üGya©j–ž²×"ÔSÖ|Aà½Oĺ&©·„> j¼3ã¿xö…ñÃ|+𦹦øû[ð^­¦v¿þøsàÁo„|{­ê^ø+ð»À |-¨ø–æÂóÄwþøqá='ÁÚïˆ.ô½7FÓ.µ»­3FµŸU¹Ó´*Â{ù'–ÓM±·híbÏš\©óÊ÷kâÒµ×{ÝímK.Ëú·ù~ò/Ù“ÇÞ/øâßÛ ïÅúÝÆ®Þý®<[àß[m,tÏxWÃÿ ~ E¥h:¦ÛÙéZ>› ³^j7úu•²êÞ¥¬kúÚõÍgUÔ/>@ÿ‚ÖÿÉêöSþÿèíR¾ýŒ¿äcý·?ì÷¾#ê«ø+_8ÁkäÈu?û)ÿÿôv©[Ãýê?â_úI/àùGô?e|_ÿ!kOûüÿ¨_‡ëÀ~'|#—âÖ«ðHhÞ´øQûD|øñ¨Ýk6zÍðÖ-~ø®Çám>Âþh¯üMce¤Jíc³Ñtû›ýhǪÝéöš¯ïÞ/ÿµ§ýŠþÿÔ/ÃõËÖ<Î\ãkÆrjû^ìi^)>Ëô>Èÿ…å¤ÿÏ_ ÿà߯ŸüìëŸñgÄ_x÷¾&ð/޼=ð߯ž ñ§‡õŸ øÇÁÞ,_øÂ¾,ð¯ˆôëÄ>ñ7‡µ…WšF½áýwH¼¼ÒõT³ºÓµM:êæÆúÚ{i剾W¢¶úånñÿÀPrGÏïþ¿¦ü­ôGˆµŸ‚Þ/ñßïŠ^,øsð_Å~ÿÂ]ÿ “â/ˆ´MK[ñßÂïøX<ñïü+¯j_n|AàŸøM¼?mm¡x»þCLÿ„“G·ƒLÖ~Ûep/ ÂòÒ篅ÿðoãOþvuñ½}r·xÿà(9#ç÷ÿ_Ó~Vû#þ–“ÿ=|/ÿƒó³£þ–“ÿ=|/ÿƒó³¯è£ë•»ÇÿAÉ?¿úþ›ò·Ùð¼´ŸùëáüøÓÿð¼´ŸùëáüøÓÿ|oE\­Þ?ø Hùýÿ×ôß•¾Èÿ…å¤ÿÏ_ ÿà߯Ÿüìèÿ…å¤ÿÏ_ ÿà߯Ÿüìëãz(úånñÿÀPrGÏïþ¿¦ü­öGü/-'þzø_ÿþ4ÿçgGü/-'þzø_ÿþ4ÿçg_ÑG×+wþƒ’>õý7åo²?áyi?ó×Âÿø7ñ§ÿ;:?áyi?ó×Âÿø7ñ§ÿ;:øÞŠ>¹[¼ð‘óûÿ¯é¿+}‘ÿ ËIÿž¾ÿÁ¿?ùÙÑÿ ËIÿž¾ÿÁ¿?ùÙׯôQõÊÝãÿ€ äŸßýMù[ê‹oˆ¾³ñV³ã«?|7µñ·ˆü?០ø‡Æ6Ëâ8õý7åo²?áyi?ó×Âÿø7ñ§ÿ;:?áyi?ó×Âÿø7ñ§ÿ;:øÞŠ>¹[¼ð‘óûÿ¯é¿+}‘ÿ ËIÿž¾ÿÁ¿?ùÙÑÿ ËIÿž¾ÿÁ¿?ùÙׯôQõÊÝãÿ€ äŸßýMù[ìø^ZOüõð¿þ üiÿÎÎø^ZOüõð¿þ üiÿÎξ7¢®Vïü$|þÿëúoÊßdÂòÒ篅ÿðoãOþvtÂòÒ篅ÿðoãOþvuñ½}r·xÿà(9#ç÷ÿ_Ó~Vû#þ–“ÿ=|/ÿƒó³£þ–“ÿ=|/ÿƒó³¯è£ë•»ÇÿAÉ?¿úþ›ò·Ùð¼´ŸùëáüøÓÿð¼´ŸùëáüøÓÿ|oE\­Þ?ø Hùýÿ×ôß•¾Èÿ…å¤ÿÏ_ ÿà߯Ÿüìèÿ…å¤ÿÏ_ ÿà߯Ÿüìëãz(úånñÿÀPrGÏïþ¿¦ü­öGü/-'þzø_ÿþ4ÿçgGü/-'þzø_ÿþ4ÿçg_ÑG×+wþƒ’>õý7åo²?áyi?ó×Âÿø7ñ§ÿ;:?áyi?ó×Âÿø7ñ§ÿ;:øÞŠ>¹[¼ð‘óûÿ¯é¿+}‘ÿ ËIÿž¾ÿÁ¿?ùÙÑÿ ËIÿž¾ÿÁ¿?ùÙׯôQõÊÝãÿ€ äŸßýMù[£ñUÍÖ®­awýµ¾á8^AÔ0O>•á­'L»hRúÞÒìD.í'XÚ{h]ÑCì ¼kâÇíð/ö|ð'ñ£â—„>7Šü[¡Eá›Oêi©¯ GñSëW:N‘Üj—Ö)Õ4˜µJÞÎM?J¸Öt[]BæÞçYÓ"»ô*+%Îå%tù®¢ù~$Ö©Z×êŸê;ieÒ߇Ü|Cÿ#ý†èä¾ÿßz×ÿ*(ÿ‡‘þÃ?ôr_ÿï½kÿ•öõïKù*àØÿò׺ûŸùŸ˜ß ¾<|øûÿÐëIø+ñ ÿáGÅ_xsÇŸ¶ÏìõàŸøÀÿ´ï|-¸ð†·ñÂ> ×< ±'ÄŸØCˆfMSź™%Þ§mú5âÿù ZدàýBü?_+~ÒÚïÀ/ü9ÓµÚKUÓôo‡:wį…>,²Ô5[¿ØXZ|Dø]ñ Ãßþ_Ï{á—Šö?ìoü>ðþ»­ì£CÖ&ÒãеËmOKÕ.t›üõöº''í²WnÒ½’Z±¯…km¿#à xÿâßì«àߌ¿—áÆÏ ø'Äßð¦|û<þÌ?¶íñ?ö’øñãú¯Å gã׉<+âï:üããf§àsàšü=Öü+ðÛÀkãëŸ\üøÓãÍoáÂ?ÞxÏã'Š~^ñ§ü#ãÇÆˆ¼Yã‡>ñ¶‡ðû¿ðë{›ÿ…ú½sð÷ã—Ç‹ßø,ÏÅÿÙCã¿ÂïZ|JðWÁ]o^ðOÇ­à/‰|w/íâ߀:7…´o hÿ¾ xïâ·Åý/áïÝ_¿kÿø&ÏÆïYxgâíá©­ônÛľ×üãŠ_ > x3ÄvÖ–Œ|AàŠ /<ñ'ÀÝï‡5ÏxCXÕ|â½ ÿ\ð?Š|[à}f{ÿø³Äz.©âžñ¯üÛÂZG‡ô]ↅ¿‡µ½+Ä¢ÿWø³ñïÄž#ñ?ˆü?ûMÁûdxoļ[â?j¾)øµ­ø_ö•ÏÅ ê¿5ŸßøbÿÇ´ };Â?þ'øź¨KyPªåÍðI«+_w{»o»»»è+¯æVµ·^VòïþG¹|\ý«¾*ÃûÁE|o¢|ý¥c…ßt­[þÿCñ‡áþ…ñWÿ²Ÿ†¿i_‡>%ðмmðçÀ<Ñ-|#ñOáµæ±޾xVoZx·Âoáÿx[IÓ<[âÍ»ÿÛKâ6ã-VÇÄ<oðûáwÆÏÙ¯öZý |O¢|m×uox_öý¦t¯Ùæo iÿ< }ð;BÑ>-üðö·ûU|ÓõÿŠ>5ø‹ð3ÇM¥Añ7XÓ¾ÝÝøGºÄ^v/Úçþ аüj´ºø·ð“YÓ?h½no|nÐüJ¾ ñW‡>#ßÝ|*ð?Áè?üÿCÓ%³Óíÿáø¹â{Å¿è–ÂSöÿìÿÂGá›[=ÜÑ?i¯ø%·‡>1øƒãþñ‹áýŸÅÏÿÂaý½âßøHþ!Ü}¿þï ~ξ ñoüHnåŸÃ6¿ÚÞý“¾iŸèz5¿Ø?áûf™ö=CÅ>5»ñìåÖ…Fíü“ÝF)^Íiu&úíæ„Úé%Óªï¯àOàOø)'ü-M+Ÿ¼ðcÌý˜µ~È? <]ã/|Eÿ„wãÆƒñöÚðoìÕã/ƒöþø!¢øÅÿ¼WàÓöÁøgñ'ÅŸíàÍwA¹‹âãx_Á6‹ÀÞ ?>¡ø£ñûÆ_¾<|øI¦|"ÿ„‡Ã?¾Ó Ï5/i^¹»Õc¹•o|1ðŸDÔ´k¿ üAñ·Ãï ÚjŸ¾*xÇ?> xÊïà>ƒâÿ~Ízí=âo†¿¾ü>øž5ÿ‚;xÿáÅׄþ(økDÓ>hŸ ô_ ø"ÓâÏdzð«Q›à§‡<7á?„^.ø‡ðzKð¯â÷ņº‚>Úx/ãÅŸxÛ⯇¦øeð¯QÓ|e§ð»áýç†ýGÆ¿´×üÛâÄo |WñÆ/‡ú¯¼ýƒö¸üGñJмAÿn»wâ߇_ð²<£Ë§ø'âçü*?j—Ä‚ðµ<=ã/øRµ][â'ÂøC|mªêõÈéJúQ«k=á;ÞÚuï«Ù[Ku ù«éÕy_õÿ>ß2]ÁT>7üjøQ¦ø·àìção‡_ðŸxÛö1ñWÀˆ<ð¿íá_‡>3øsñ—öÓý—>_ü4øÕñâÿìsáo†~ñ·Å¿†Ŧ•û.ëß¶¦…¦hV|kàÿÜÂð×Ä?~¢ø×ÿ$ÿ…=û9OñÿþÇü$^OÆÏø(?ÁïøD¿ábÿdnÿ†ð/íãã_øH¿·¿áÔöÿÂÔÿ†%þÌþÈþÆ?ðƒÿÂÍûgöŸŒ?á û'ŠüŸJñ¯üÛG°ñ.—kñGÃWf¿¢Aá­NÖ~,ü{ñ ‡ÁßXøÃþ1Ѽ?û0Úkþ(Ô­ÿdÃ^.ðgÿøGJý—ãøEaàÿü(ø7®x^ #Sø9ð¾ëÂ^]ûEÙÁ!>=x[ã [üløàïŠ?|û@è^ø‰&¹ñcÅÁ_~Ò?>)|ø§ã¯†ÿ .ð§ü,‹O‹ž(ñŸÆÏ x#OðV•ñëâ2é?>)ͯüQð÷…üu ×³M¥ì*¥vþ ·f’³ÖöO[­WE­‚û{Ë¥õ]ÕßÝøêWÀÿ޼eñâoÁ?Ÿ üð×âçÃ_ü)ø§wið³â¶»ñŸáΫðçã>»ñ{Â^ ¸·ñ¯‹~üñ5·­¼MðâD~(𼟠äд­ OjÚOüC¨x‡^Ð|óLJ¿nŠº§Àß ~Ñz—ì×¢Zü+øñ¢|ÕegFøé¯®_þÔ¿>|/øá¯Ú{EÔþøkSø ­ëúŸÇ?ëÞ.ŸàÕ¿íuáÏxsÃxƒ]×¼1ð³@øÝÏ|ý§ÿà™ÿá"ŸÀ¿´M®¡­ø·û"øÏâŸÅþ#jºW‡´ßÃ^¸ø™ñËÄ?~ ¯‚|/w¯øŸUð¿añ,^ ðÖ»ãøƒBдýoÆÞ,¿Ö<»Jñ¯üÛG°ñ.—kñGÃWf¿¢Aá­NÖ~,ü{ñ ‡ÁßXøÃþ1Ѽ?û0Úkþ(Ô­ÿdÃ^.ðgÿøGJý—ãøEaàÿü(ø7®x^ #Sø9ð¾ëÂQì¥wûš¶¼mû¹ì¾.º]íw+Öš­µÕo§üÞ‡Eãïø)ŸÄo†Zï|%â¯Ù»Á2ø›öxðOí5ñOö´Ãÿ´&»©h^øsû1|9ýŽ~6x’ãöuÕµ/ÙëCÔ><øÛÄŸÿm/]èžø— þÌZ?¼/ã_øÞ/ Å¢üHÕûk/Û‡öñ7Æ;_Ù›Á³7Á=Cö‚ðÏü/ø\6*ý«ø¡âÏk_|s­ø‹ÃŸþxCGñ¯‹ ¸“DøÎþ>Ò~ülý¦> øâÄŠº'ì{à7Æw¿¾ |Jø}â='Dð—ÃoØóÁÞ¹øgiþñeýö›ãmGO³ñw†N§®Ò§·î*­%wÉSY}9¶ò¿k·«eÿ¼·]VÚ_·Ÿß÷y´ŸðT- oŒv´/¼ñ²†z¿Á?ÝèŸ õ?|Fñ‡ü,߈ߴ_…¿à‚º—ìë¯jÿ üeñSþ·ü!ŸðÚÖžñ„¾x'㻤yß~#ü1ðWÄ߉ŸÞ¢¾!ÿ‡‘þÃ?ôr_ÿï½kÿ•ÃÈÿaŸú9/‡ÿ÷ÞµÿÊŠ=_ùõSÿ—ù×u÷£íê+âøyì3ÿG%ðÿþûÖ¿ùQGü<öÿ£’øÿ}ë_ü¨£ØÕÿŸU?ð ]w_z>Þ¢¾!ÿ‡‘þÃ?ôr_ÿï½kÿ•ÃÈÿaŸú9/‡ÿ÷ÞµÿÊŠ=_ùõSÿ—ù×u÷£íê+âøyì3ÿG%ðÿþûÖ¿ùQGü<öÿ£’øÿ}ë_ü¨£ØÕÿŸU?ð ]w_z>Þ¢¾!ÿ‡‘þÃ?ôr_ÿï½kÿ•ÃÈÿaŸú9/‡ÿ÷ÞµÿÊŠ=_ùõSÿ—ù×u÷£íê+âøyì3ÿG%ðÿþûÖ¿ùQGü<öÿ£’øÿ}ë_ü¨£ØÕÿŸU?ð ]w_z>Þ¢¾!ÿ‡‘þÃ?ôr_ÿï½kÿ•ÃÈÿaŸú9/‡ÿ÷ÞµÿÊŠ=_ùõSÿ—ù×u÷£íê+âøyì3ÿG%ðÿþûÖ¿ùQGü<öÿ£’øÿ}ë_ü¨£ØÕÿŸU?ð ]w_z>Þ¢¾!ÿ‡‘þÃ?ôr_ÿï½kÿ•ÃÈÿaŸú9/‡ÿ÷ÞµÿÊŠ=_ùõSÿ—ù×u÷£íê+âøyì3ÿG%ðÿþûÖ¿ùQGü<öÿ£’øÿ}ë_ü¨£ØÕÿŸU?ð ]w_z>Þ¢¾!ÿ‡‘þÃ?ôr_ÿï½kÿ•ÃÈÿaŸú9/‡ÿ÷ÞµÿÊŠ=_ùõSÿ—ù×u÷£íê+âøyì3ÿG%ðÿþûÖ¿ùQGü<öÿ£’øÿ}ë_ü¨£ØÕÿŸU?ð ]w_z>Þ¢¾!ÿ‡‘þÃ?ôr_ÿï½kÿ•ÃÈÿaŸú9/‡ÿ÷ÞµÿÊŠ=_ùõSÿ—ù×u÷£íê+âøyì3ÿG%ðÿþûÖ¿ùQGü<öÿ£’øÿ}ë_ü¨£ØÕÿŸU?ð ]w_z>Þ¢¾!ÿ‡‘þÃ?ôr_ÿï½kÿ•ÃÈÿaŸú9/‡ÿ÷ÞµÿÊŠ=_ùõSÿ—ù×u÷£íê(Q!·±¸’ «eÔt½'X¶†úÒçO½[ oM´Õôæ¼Óïb·¿Ó®¤°½¶’ãNÔ-­u ]í/ímo!žÞ=/@Ôux.®lþÀ–ÖRÚÁsq¨ëFOz—rZ²ê÷Ö1Í,ÑØÝºÇ Há v`ª1g{Yß],ï¦úo¥û Æ¢ºøD5oùûð¿þ ÿåýðˆjßó÷áü.<ÿËú|“þYà/ü‚ëºþ¿á×ÞrôV.³âOh><Ñ>ßø‡A“Çž!ðˆüy¦xoJÖtÝzõ¼#áMgÂþÖµËé4+JÓHµYñŽƒa§¦¯qcq®K.¢Ú:ŒZ¿&™ÞÛxWWº³´¿VÑ­í¯â’{3¨ø›ÃZTóÁÕ̶͋šž­iv"v—0,£¼/°²ŒÑË+Û–Wµíg{wµ¶ó×uÛ~½ŽrŠê?áÕ¿çïÂÿø\x/ÿ—ôÂ!«Ïß…ÿð¸ð_ÿ/èäŸòËÿä;®ëúÿ‡_yË×ä—ü·þL‡Sÿ²ŸðÿÿGj•ú“¢xÃÂÞ%Õüs¡øw_ÒõíCá·‹€üiýw§a£ø¹<3á¯Ï¡®¯fÓi:Õ–‡âí]Eô‹ëû}7Q¹ºÐoæ¶×´cL°ü¶ÿ‚ÖÿÉêöSþÿèíRµ š¯M4ÓRÕ5f´ìÉ—Âþ_š?e|_ÿ!kOûüÿ¨_‡ëâÚ¿þB_±ßý¤ö/ÿÕÓ WÛÞ/ÿµ§ýŠþÿÔ/Ãõñí_ÿ!/ØïþÒ ûÿêéÐ)Òÿyý|›ø>QýµþüYý´>?xƒZøÉàïþÌoìù¡~Óÿ´/À;ÏÙÿÄß ¾+Yüe“¿³_íAñ/öOñ×Ä+oÚ»KøÝ¬ø%üA«\ü+ñÇÏ ü>—ö7‡N¾‚óFýœuˆz —ß´æì ý¤5~Ôö_ 5Mþÿ†_d~Ò³mψüã¿üSñ~±á¯ˆ¾$ðÏí]£øÿÂ~1KñÃ_øT^ø³ûÉgà‰^øoãµñÆ?é±ÇâËßxßFø]çÿ ?eÚ;àÿŒu/ |:ý¨>øwöXÕÿh‹?´&¡à?øf»­_ö˜¸Ö>8üvñ—í?ñKÀðÑzïÇmOàü_üQñƒâ‹¼/¶Øò/蟳ޯÿ‡|w¤|g°Ó?i/`ø£ðÅ_<+û7ßxâ‡ôŽß³×ƃÿôïŠÞø}¨ÙxVçÅZ¨|<ý ôÿ ü+ñÄ?Ç øãçìùñãÿÀÍ×Åþ5ø™¨üÓ¾/Û|AÑ5_|IøuáO/°d~0~ÉðYcÆ ¿gOŽÿkŸØãß„¾#~Ïú·Ç_ÚÃà¿ì{ðËÇv??àžþðÇìãßÚwâ'Å¿Ž0hÿµÏíkâß|?øYâßi_²ç‰|?¨| øO¬jŸ~4|8û/‰t¯Ťüø‰úÿíÝû3Ëã¿ü:›Å4¿x¿þÕ‹j øûBxoÀŸücñwGðî»ðÇáÇ_Š^ øY¦|2ýœ¿hYx×áìý>?x»á¯ÇmOXø¥ð“öÿÛÄ~iž(óÿøaøÕ—ü;GþüØü0Çü.¯øBêÝáAÂÑÿ…qÿ wýÍŸð„ÿÂyÿP/øK¿æ3\ÿ¿`ÿxÇã/µÍ;ãW‡ô_ÙóãWí?û4þÙ¿>^ü#ÔuŸŒº—ÇßÙBÙ¥~Cð¿ã´´_ü?ø?©ÜþdzäÞ>ð/Šÿg?о4× ?-ü;ñ_Áò|@ðM×ÂUÿ‚³~Ãz4÷Q^øóãÛ?‡ôÿx;[Ó¿dÛYð¯Æ¯ ë?~ |ð÷‰¿foèÿïü-ûTøÅ_¿hï>ð~³û7k4ïiß<ã ÜêÞ Õ¢ñö‹·wìÏð#Äü9ñ—Å>ÿ¨øã/‰~#ñoŒ¾~КÂÍ{ß~j_¼k¦ü'øË{ð²?„¿þ xsá.âßê_ þø×âÅ8ü9à‰w‰à×ÿ…gãôðçãÀØöÂø±ãÙ—ÁŸô~ϲçìðáÂoÙÎÓã¿–ß|Ká_ƒ¿¶×üköœøáÏx‹örÿ‚ƒþ×þ.ø‚ûáßü¦ßáçÅŠ²xKö@Ó¼5ãOˆ:'Ž>üø—¡ë~ ðOÂ`ý¦?à‡_ðÑ~'ø·þìÿá¿øX_ðÙ×_ð¸õŸØÇþ?Û²ïþöXý¨?fÿøW¿ÿlOøhÏ ÂÇýŸþÿÃMïø+ðwþ×…¿áø;ð3àÁøLþøXzéÿÂßÛ»ögøÁã½ á—„üQñHñ׈¿´ìtÿüRøûB|º·ñŽ‘£ê.ºøE®Ïñ¯ágÃû/ þÐü2Ó.~9iŸ³§‰®´ŽÚßìã.ŸûIèßïþêúWÄ[ß<3ûf|Sø…ÿøùû(éÿ¶/ìð“þ×íðãÀý”<ð«Ä~.ý²~9ü,¸ý’¿goÚâ/|¬Áûpü2ûÛáfüRðLJèŸ5/ÙcöPý©ümã¿ß <_ÿûý„¿jÿütOÙƒÀwíñëÁ?í¼uû[.Ÿ}«øƒL_|$Ñüoð?áoÄÜüMñ&—¬øûßþ,þÝ>Öüñ/Á±×Œþüqý©õÙÿÆ^8ý–4_+XÕÿg¿Œ/þê_~üÿ†…±¾ð¿À]OâÄËáð¥¬þ:xwâíïìÏ«ÿÃB[éZGÁ‰Sâ]¿ç†¿àÞðŸþi·ž;ý˜>?xÛáW‡ü'àŸCûfþÂúwí)ð <+cûÿÁ;?dëü —öƒð¯§|`Õuø'7|yà_‰6?#Ӽ࿋?þêžñíΣ£üIÒÿGþþÄž#ø;ñÛá§Ä/ |uÙð·áŸìÿàß¿4ß‚Ÿ >øÇÅžðƒ´ßx?À~2ñ7ÁÝ;á¯Á+ÿÙÿÁÚ®·ñ³á§Ã}#öbÐþ)üøíñ âŧÀ¿ÚáŸì¥ñ_âì—â ÅŸðPï†zо|J³ñW‡äý‹þ*Á8?k¿ø(wˆ~/Üø;âøªÏáŸÀGö"×üâ­ÃQZCâ›ê_ iOx£ÄÞ¾øs¨üB¼ÔtŸ Øivš6£c¬hZ÷A¨ÁQÿa=+GÓ5ÝCãŸÙ¬¼IñBøià(á—Æ&Ö>-xÆÞø¥ñá&¥ð?ñü>|tøûCxà¯Å?öXø±ðLñ·ÂÏÚ·Ç~¾ø[û7øËâÄÛ7Â7¾ñ_þ Iÿ þsEÒ>=Â!ðÿãŸìÿÿAøð÷Á_ð«¿·ÿáKÿÃÒÿá–<ñ‹Å?ð‘Ý|E±Ö¾#e~Ó_þ:~ÐؚܺGÛ¿á¥áTø[Wø{ðÿà߃ìµ_øƒû Âwûv|2ýµ¿áhÿeºÿ…ÿÓþŸ·l—ø;ÿGøMÿ#—ü%ÖÙÿð’ÿÃÊ?·ÿäT¾þÇÿ…/ý•ÿ_øXßÚ^è5Ÿø(ßì{¡iÞÖ/>&ø‚ëHñ/‡î|Y¯êšÁŸŽ~'Ó¾øWNñW‰¼ ®ø›ö»¾ð×Ã]ZÛö'ðÿ„ümà/Šñ¾³û_KðCNð7о |wð÷‹îtM_àOÅû?yÿíáûYx«öuñWÁ_Yüný˜?d?üIðÿÅÏx‡ö¸ý³|9¨ø§à⯆úÂ]3Áß³”:d_ÿem"?Œ4‰~:ø™à[ûïçQƒÁ³OÅ{}/áWí®õ|0ð sþ 9â¦Ñ?ixCö“ðþ‹àŸÛsÃÿ´wÂoÚâÓÄŸ5ø«Tøñßö¸ý¹?iÍ3ß³—ˆ´ÏŽ>Ò> |`ð^‘ÿøßðòÿâ¯ÄÏ ~Ò ñf£áï…^8·ø#áKox»Á>=ýøéàÏÚ;ÄŸð‹j¿³Ç‡ÿüA£ÿméþ"Ѿ1|ºý >x¿GÖÿ².`Ôî¼3á‹ÿ³¯ÄÝâ„ït(í|®èÿíü¾ñoÄ-?Æÿ |wâ ߇^,ø\çþ?ý´¾|ÿ„+Ã?´~±ÿ7ÄÛÿ‡þñçÅ+ᄾ6|{øYð GÕ¾Û§ê^;øÏñ¯Á¿l+i?o?‡O‚5Ÿ üBm;ÅÞý‚j ömøƒñ;Â5¯‡þðO‰ü?ª\üCø3­\¯†5msNÑ Ò¯þ&ø€Ð>ÿÁP?bÏŒ#ð¿‡þüEø¬Ùx¿þÄGÄkßÙ·öðßÀ›}cöŠøYð¿ã7À¿øöŠñOÁÍà/ƒ~ |Uð/Æßƒ­à¯‡^0ø¡xï[ñÅ|1µðë|Mñf‰á ߘ?k¿Û“ãŸÂ¿ÛCÅŸ³ç…>0|øð§Á³ìõñË[ø£ñCþ çûa~ؾÒuŒ¿jÿø¿_øÉñ£àí ðCàßìðá߆ÿgïøŠ÷Ç´£áÿ ¾ªøûÅzôß |?ñú7þÈ?ðK_Ú;á‹goügøì‹ðÿö€ÿ‚u|@ðÚÙüº‹ã·Çýcþ ùûÁ5|?௉þøgûKøÁŸþøŸöýl´ü!ñ¯ìûãÏÜø;Âþ?³ðßÄ2ˆ~øáOÑÿÛöaøËûPøWÇŸ4ÚÃÿ¿gÏŸüQðö‰øsâO‚|CñUÇÃßéÞ'𿌼Gû9|JÑ~%|/¹ø=ñƒÄÞ ñ¾»¡_øŸâÿ†¿j?†z~£áo…Zÿ†¾ h2h,>3xþ³ûk|SðÿÁˆúÞ¯ |?´øÛð“þ ðWö)øƒàÿì¯ÜxsÃÿ ?hÛëàÃ߃ºÿÚ­|W5¾«ñÆðOÚƒà_ÇOí]Å:—‡~Îßµ×Å??µ?Ć:‡Å_ÙHÿ„âÇÏ x»ö½oøköìø7ð³áÄ_|5øuûSx“TŸâŸ‰ÿábü?ý¡±¾üSðW‚õ?Ù{à‡4µ'€ þÚß³§üMo¼]£ÿ ÿ'ö?íGðÓþ)4ÂOÿ Qÿ —Žá+ÿ…ðïÂ’ô¿³Æ_~Ðÿ þ$|Vý¡ü?ãσ³÷Æ|{øðþËà„øË£|Bñ÷ÂOŒŸ‡‡>(|lÒ~%Oðïâ/Áÿ|;ý¡þ*xÀ>ðßì×ð¿â`ƒGø7¨üCøÏñÄžø“¯üjùÃ?¶oí¡£þÂ×?ðTÃû0|EýŸ5¿ØƒÅŸ¶õŸìÃáŸüVø1ñ—ៅgý›µŸÚKÀ¾¹ý¥uOŠÿ¼ñËÄU͇¾ ø³Q‹ögýž4í~ë?ôuðÔž±ýŸ>"ýÿðSEý´<;â­BÏöŒø—û0|bðN¥áû«/Ä?>|Vý›|Uà¿iºŽ•ލx;Ç_´/íY¤|MðÿŒôO\¾ºñ5¿Ž¾j? õiZ\>øµmñ>óXøEñÿ†à¿[öj¹ýƒ~"~Õþ¾ý‡4¿ÙƒÅŸ²„¼ðŸöuƒáçí+ª|Ô~k?³§ƒ,¾0þÐ_þ0ütøwã/x_áÞµŒ5½{áGìÑð|oð¯ƒ|Qo†>Çã€þ=úƒá×ïۊÃXŸ\øÃûTþÏþ1û'ü#º~‡á?…±ß‹~xëGºñß„uŸ‰:ŸŽm¼mû\|wø¯ü@“áÿ‡5¿|×|ñ'á¯>ë?ñW¾,|-ý£þÁào ø8ŸñŸüoö=øy¨üT³ñ§ÄßxHø9áÿ‹Úÿ‹þ ÞüøæßµIþxWÅ~5øßà…ÿ­þÍðoã‡Æ…ø}ñ:ûÇß~ øëâÆ_ Oðã&—ªøÛWø?ñ2ǽÄ/Û»ögøkâ?x+WñGÄ|@ðÄ ¯†ž)øgðwàí ñû⇈ôï…Ÿ~3ëz•¯Âÿ >"ü@Ö~øcáÿí ð.÷Æ4Oj? <â?‹Ÿ¼âŸiüQñ߯ ïÚGà‡Š¾0ø㿊¾2M?¼ñûâ¿ÀÁà wÂÖÿµ¿~ßxOÅžñï…|3ã¯ø›Ãþ4ðOxv´øáwÃÿü:Юáð'„>Ñ£ø'Úo†tÉÿáø[á‡ÿ ¼/æÙiIÿïïx'Àš&ïìßøGÃ~¶Óôk/@ Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ÎÿÈZÓþÅÿêáú-?äKñýÿÓOŽ(ñü…­?ìWð?þ¡~¢ÓþD¿ØÑáý4øâ¼7üIÿÜOý&Fßf?öïæŽ^ŠÄÕgñ7þCÒ´MGLºÖçƒÆ7z¯ˆ/ôký ËáÏ]Zê¾Ó­<5®Ûø³[›ÅÖÞÐçðþ©ªx.ÂÛÚψþØ×¿·~|6ÿ„sOÿ„«;WE+ê_ò’/ÿÙüKÿÕñðš¿A¼Aÿ Ÿÿدwÿ©§‹ëóçRÿ”‘x7þ̇â_þ¯„Õú âùøþÅ{¿ýM<_[Keÿ^aÿ¥ÄKyzþˆù³ãŠþütøƒªøÛÄ·zÂ\ø_GÒ¾ÏàÖм3ã{ß|Eðv·ià_ |EÚøñkß~ | øíàë-oMðÆ¯…Þøµám;ĶÖ~#°ðçÄ é>1Ðì¼Ai¥êZΙk­ÚéšÍ¬­¶«ê¶_Ç®–zîŸæ—¤ê6=׋ÿä-iÿb¿ÿõ ðýyо"ø7Á:ïÃO xŸXþÌÖþ0xÚÿá×ë/ìýV÷þ/iŸ|ñjûGûNŸcwi¤ù¾xëÄÚìúf•/ööT7Òkzž¦ê6ÕI8î¥'ø»þù¶^‹þô7ü-}þ}¿òëø•ÿÍÕðµõÿùöÿ˯âWÿ7Uó͇Ä_ê¼Uð–ÇXóþ ø'Á>ø‹âÿgê±fx7⎻ñ/Ã^Ö?µf±D½þÝÖþüE²þÏÓõ+½WLÿ„wí:ÅŽŸi«hSê}µ?kSù¿×neÛúÓü‘êðµõÿùöÿ˯âWÿ7TÂ××ÿçÛÿ.¿‰_üÝW—ÑGµ©üß„È,»Z’=Cþ¾¿ÿ>ßùuüJÿæêøZúÿüûå×ñ+ÿ›ªòú(öµ?›ðù—oëOòG¨Â××ÿçÛÿ.¿‰_üÝQÿ __ÿŸoüºþ%óu^_EÖ§ó~ÿ ²íýiþHõøZúÿüûå×ñ+ÿ›ª?ákëÿóíÿ—_įþn«ç›ˆ¾ ¿ñ–¡ðõu°xÚÃûbh<5®éú¯‡5_é^Ò¾j¾%ñ?müAc¦ÂÄðO†?álü=ÑßùuüJÿæê¾)ñÏíSð7á§Ž4¿‡>=ñN·áokºÞ™áÿXj¿~&CaâKý_âì×ð¦Â x…|þñˆÿk¿€^ ŸÄº&­áËø³Äeö«mqðÃâ²ø#èj~Òª³m¤ö|«_M5 /»þù#Ô?ákëÿóíÿ—_įþn¨ÿ…¯¯ÿÏ·þ]¿ùº¯/¢—µ©üß„È,»Z’=Cþ¾¿ÿ>ßùuüJÿæêøZúÿüûå×ñ+ÿ›ªòúÄñ/ˆ,<'áÏx§Tƒ[ºÓ<5¢j¾ Ôm|5á¯øÓÄw65„úÜðwƒ´­wÅÞ,Öæ·¶’=+Ã^ÐõŸë·í—¡éZާuki1íj7áò .ßÖŸäkÿ…¯¯ÿÏ·þ]¿ùº£þ¾¿ÿ>ßùuüJÿæê¼¾¼ºŒ¿ï~ j¿ 4½G[×|]áíoÃþñBxsÁ^8ñ'‡<â?øÄ¿tøÛÇZ‡5x/[oxj?j:WŠ|G¤_èv8ø45È4ë ñùíj=žÚ¿uh»ì]¿­?ÉPÿÂ××ÿçÛÿ.¿‰_üÝQÿ __ÿŸoüºþ%óu^)ªø‚ÃF¿ðÖw·5Ç‹5¹ü?¥É¥xkÄzí…­ý·‡#xWá-ö±ä|Añ·‚|ñÃþÏÕeþÓðoÂíwᧆ¼u¬jÃc&‰eý…­ü`øueýŸ¨jVš®§ÿ Út{BÓI×gÓkS¿ŸÂ¶[½ºY…’ü?K~Húþ¾¿ÿ>ßùuüJÿæêøZúÿüûå×ñ+ÿ›ªòúâoþ"ø7Løá_„·ÚÇ‘ñÆÞ ñÿÄ_ xû?U—ûOÁ¿ µß†žñÖ±ý« Œš%—ö·ñƒáÕ—ö~¡©ZjºŸü$_iÑìu M']ŸL=­OæüMú’ü?K~Húþ¾¿ÿ>ßùuüJÿæêøZúÿüûå×ñ+ÿ›ªòú(öµ?›ðù—oëOòG¨Â××ÿçÛÿ.¿‰_üÝQÿ __ÿŸoüºþ%óu_/Mñ—áü?eø(ºŽ·{ñ&×Dð?‰u=JðWŽ5› ß!øÕ'‚|Aâ_é>½ð†4M~ãözø­¤Aªø‡]Ó,-¼G£xÂ÷óÚøâÃ/Åž£Gµ¨·vëð­»ì]¿­?É¡ÿ __ÿŸoüºþ%óuGü-}þ}¿òëø•ÿÍÕ|ó¬|Eðn‰ªßx~}cûGÄÚWü+©µ xcOÕ|eã-Jø±ã-CÀ>ñ>»àÿ Xë~&Ñ<­ø›Dñ,xëUÒ¬ü¢i^ ñ׉|A®é^ð'Œ5¶£ÚÔþoÁYvþ´ÿ$z‡ü-}þ}¿òëø•ÿÍÕðµõÿùöÿ˯âWÿ7UåôQíj7áò .ßÖŸäPÿ…¯¯ÿÏ·þ]¿ùº£þ¾¿ÿ>ßùuüJÿæê¼¾Š=­Oæü#þAeÛúÓü‘êðµõÿùöÿ˯âWÿ7TÂ××ÿçÛÿ.¿‰_üÝW—×ÿ Á²ë¿ðiúÇöþ·oãoøWZí—…týWÅßð„øÉ¾ÿÂÚ‡Gø—sá‹ZÓáwÚþO£ø‚ÃPø‹?…ô­CþïiV7×ßÄ_é¾"=­Oæüù—oëOòGÐßðµõÿùöÿ˯âWÿ7TÂ××ÿçÛÿ.¿‰_üÝW—ÑGµ©üß„È,»Z’=Cþ¾¿ÿ>ßùuüJÿæêøZúÿüûå×ñ+ÿ›ªòú(öµ?›ðù—oëOòG¨Â××ÿçÛÿ.¿‰_üÝQÿ __ÿŸoüºþ%óu^_EÖ§ó~ÿ ²íýiþHõøZúÿüûå×ñ+ÿ›ª?ákëÿóíÿ—_įþn«Ëè£ÚÔþoÂ?ä]¿­?É¡ÿ __ÿŸoüºþ%óuGü-}þ}¿òëø•ÿÍÕy}{ZŸÍøGü‚Ë·õ§ù#Ô?ákëÿóíÿ—_įþn¨ÿ…¯¯ÿÏ·þ]¿ùº¯/¢kSù¿ÿYvþ´ÿ$z‡ü-}þ}¿òëø•ÿÍÕðµõÿùöÿ˯âWÿ7UåôQíj7áò .ßÖŸäPÿ…¯¯ÿÏ·þ]¿ùº£þ¾¿ÿ>ßùuüJÿæê¼¾Š=­Oæü#þAeÛúÓü‘©¬ê²k7í}%µ­—ú.e­—Ú~Íom¥éÖº]¤Q˛˦ÛkgwžêiMî_æÀñ¯‹š÷í cá‹=öðÇÁ­oQÔõë=WÄšŸÆ/xßÃZe–‹§êÖš}އ¥x+À>-ŸYºÕ§×î./5 ý_C‹D‹G†Ú ;^}uî|?ê4T©5.mw½ÕÓæM;¯˜[Kv·à|Cý¥ÿ"ÿ¡7ö!ÿ×ñãÿ5Ú_ðR/úbü9?ùÓWÛÔU{OîSÿÀà…¼ßßéþ_‹î|3ð¯á_í9ûNYüyøógð#G±Ñþx¿á›¦ü"ñÄÝÝÝø‡â€5êÃøü_ñ{㿈~.Écð×\ñˆ|7¦Zkžøwá§±MCÅðލ.©áNém›M¸ŽÚÂêÂ3©ÞÜ †O?ൿòd:Ÿý”ÿ‡ÿú;T¯ÖÚü’ÿ‚ÖÿÉêöSþÿèíR®Œœ±“µÜ–Ú-…-"×k~hý•ñü…­?ìWð?þ¡~¯!ø‹ðëÁ¿<¬xÇÚ?ö߆u¿ìù§‚CUÑ5];UÑ5[xkÄþñ/‡ï´¯x7ÆÞ ñ6•£ø·À¾:ð–±¢xËÀž2Ñ4/x?]Ñhþ ÖüqñCã·Âo‚:§Ä½sNð¤:ů„tÍCVÔ¼9ö¯§YiÚ½öwwg¤ëS¦›ê[é7wRA²9e:®1øœÝµ¶·}z 4¢›ÚÈüûÓ¼5ñ3Hý‰¿bŸ|Eðÿí ¢ß|bÖþüeÿ‚ž]ü%Ò¾9hßµ'ˆ|Gã¯ÙOÆ—^ Ôotï€0ZþÕz6·£~Õv¿³¯‚.|ð*ÏK¿øQð{ÂZoÁèü9àÿÙ?áÿ‰¼ |óâïþÚ?gÿÛá/Û_ÆÞ øÇû|MðWì#§ø+Aø¯âŸˆÞ¼ðOÆÿø(•÷ÃOø·X»»¶ñÁ?žý‘þ!þÅ'×µïÚ]ðOíUñ³]ðµ§tëOŒµÇ‚|AðêÛöÏþ_ü[þ€ðOŸü;´wÿ8Ê?áEÿÁU¿èÿùÿñûG󌮥‡­ÖzÞÜÚhî–Þ‰¾±I+Zäó.ïç¯oÇõ¾ú_à‹ßü~Ñ¿àœŸðPýGEŸö†›öŠñf·ÿWñÂØî¼Kñw]ø«kmñcöŒð·ìÅÀÍ/VÕuø/Do†ÞøGuðKÃ_ -4/]Cs¢øÇÁ:TÚÇ‹.µÍg˾=xcö„øSªüuø;á}wö¡ñÇÁ?ø'öHño‰¿hvoÚËã?Œ¼ñ?Å~2ý¯ï¾:üIð/…¿d|ý ¼Sÿ N­ðsöPøwâÙ‡ö7ñ×Á´¯Œðü[Ó¾x;à›|Pð¯ÿR?áEÿÁU¿èÿùÿñûGóŒ£þ_ü[þ€ðOŸü;´wÿ8ʺo݆­¿‰i¬Z¶ŸfÚnµÕ5 sÇ»éúoúüíÐüøIáÛ+â‹/м®þÚ÷z‡…ÿá¾ øP±›öÏýž4¯|øƒÿhý²ÿgÿ+Ô> ø£Ç_ð—ÿÂmÿìÿ…Aâcâ‡Ç ÿˆ?µÁ?ËðëöÕ¾2é¿-4ÏŒ÷'Ä=öüÕøCòüQðGµ=oľ$ñWÆ„¾ýº¾/øÃ~,ð݆•¦xá}ïÂ?ø'OƯ€Ÿ´Uþ‰ñ3GñoÄÜüGÖ|q}ð[À÷ÿ4ß øÓšŸŽ~%ü*Õü=⟲/ˆ?i¿|]ý˜|SñÚÚðü@ñì‡ðWÄ-|Ká­_á×Â/ øž€>Ô~!Áâ[éVß³4Ú'‹>9뺼z¯† ÐþÁL> ü~ðú\ZWÄø'GÄÕ³ø%ú[ÿ /þ ­ÿ@ø'ÏþÚ;ÿœeð¢ÿàªßôÿ‚|ÿáØý£¿ùÆT¬5e^X=¿2ëÛK®—ÖÎËMîùãÝÿVþ¾ût?;|/ðëâÞ§ÿGÕ¾-|@Ñþ6Oð£Á>6ý¨>|ñö‡Äø¼ ¦\üQýà”>%Ð4ì­ú=÷àž»­üý®¯´-üð¿Æm3ãgÆÍoàÏ¿eojßÞÏâ¿Äêð‡|OÿƒbüQñKžñ¿Š´hîï|®|Aø?ûY|SÕuë›}/ûOUð?ǯøŠÒ×[ðÏÄ«3íø+‰¿i3}÷À¤øÙà¯|1ø'㈟üOð{áíÉûBÿÂêý .·æ¶øQâ/þÈŸ|ðáÿü+ýCÀÿ u #Ä?·?ï?>&ÿÂèÔô}áýdž~|sмgú‘ÿ /þ ­ÿ@ø'ÏþÚ;ÿœeð¢ÿàªßôÿ‚|ÿáØý£¿ùÆU{ ÷‹p‡»}¤µ½¯¥šÖÖjÏFövhæž­>½-óé÷§¾—þx>)|Kø¥oðöÇø‹ðOÇÿ¶¼üãoø-Gü/ÿx—Å_¶<_ü#û?ü.¶ÿ‚ƒè_ÿáFøŸâ¥úþÊZ¾|`ð¿ì‡£øOþ>úÓã„m¼;â=<gø;Iøé ¿¶|R°ø÷©é^"±ý–üUûkø'ö-ŸÆß³ÿü,_üoðü«âÇ3]‹Á¿¶<ßÿá ð/‰þ%üÿ‚¢ë¾ ½ñÄðO <Ã<|EðïÃ2æïÆZÅ·ö·tÿÛBÔÿ_fý?ࢠñ?éþÿÁ0çø}ãoøN¿á3ð,Þ.øã/ƒ|]ÿ GU×u߉Ÿð“øaÿgÖÑ5ÿøXºßŠ(øö¶ð7ˆ>ò½ðÿÇíþ ÉÿÔtYÿhi¿h¯kðU|-ŽëÄ¿uߊ¶·öß?hÏ ~ÌP| ÒõmWQñ‚ôFømᯄw_¼5ð’ÓBðåÔ7:/Œ|¥M¬x²ë\Ö~÷ÿ…ÿVÿ üçÿÇíÿÎ2øQðUoúÁ>ðì~Ñßüã*^»IrCIs|K]om–—Ö×jû$¬“Rïwøùo«×Ï×}/ùÛð[Á_´o…¾#|ø›­ø·ö¡ñ­ñ'þ û~ü5øá¿ëÞ:Õþøö8°×oß| °°ømwioàŸ x&óÆÞýuÿ†ŸüA¢_üR¸Ð¼ká_ƒžø¾Ÿ³ïˆü ðŽÏåïÛá×íCá›ïÛãÇß³öûPé6ø›ûPüX›IŸá>¡ñ²ox7ÁÿðowŒ¼?ð·Äþð×…o¿áÿ“¸ÿ„[ÂZo޼+£Ãªø›ãÇ„>ø>ÿ]ÕümðËᮕáŸÛ?øQðUoúÁ>ðì~Ñßüã(ÿ…ÿVÿ üçÿÇíÿÎ2…‡®¤åË SVæÒÎ\ݺh¾H9£ÝôßÊßðoóî¯ùoñ+Á_µWÂÏÚ{¿¾x·ö×øðÿáø•âoišõŸ|Sâ_Šþ8ý’஺Å[ý#Äÿm-ÿfß }³â7€bÝcÿ5ËþÅŸ >1ëµ áÃm?âC®ñ?>øûãWſق?ê¿¶¿‡>x[àŸíí k^3¾ñwí+ð“UñµÿÄÿø'³ø7DÓþ&|`}3þ ðWÁ?|[àÏücÑþ|iø½añãLñ—€~"ü*ð7Æ?ÿ°—‡š÷Ðæ‹ïÑíéøi¯}|¯øcð9¿à¡^:ø»û8x÷ãŸÄßÚÁuöñŸÃí?ö[ý¦.¼9­|6Ô~þÏzÏíkÄÏxWö€ø3ÿäø?­ê_o?kÆ~ý¦>x—ö°øaj—ß´­gÄmûø/Kö¿Ø—Ã^/ºý¬?gøÿÃÿµåÏÇ­ ö ý¡|5ûlx§ãŽ•û\Mð[Fý©ðì~Ñßüã(ÿ…ÿVÿ üçÿÇíÿÎ2›¡]ßÜ‚º¶’JÊÍ[EªÖök[ô4{¾ŸûnûöéÒöéçïöðø—û^x;ÆŸµÄë¿´7Â[†ø]ûvè>6ðW†¾þÞZ¯Ãÿ|"ø_û~Óº¿ÀŸŽþýªu¿‹ºïüÿÂzßĈ_ ?g/‹:UŸìíðoá?Çï‡^8øÂ|HÔ¼] üw·øÛ|Lñ-¦…ñ'àΗ¤xƒþ Q£~ÁÞ4ý¡¾xjïNÕu_ø*.ûMø³âí¯ìŸÿ3ñÆ?øjÓÄÃÿ ×~[ þÅ^)ŸJð”w_aÕü5â sÃÐ.µ£|{º¶ý³ñ/ìËÿ3ñ§‡—®xÄ©ðëLÖtMgLººÓµ]+Qµ¹°Ôl.g´»‚ky¤Wöeÿ‚™ë·þÕ5ÏÿÁ7µOÁzÜþ%ðv£ªüCøÿ¨ßøOÄw^ñƒ®¼Aá«»¿€“\hZÝÏ„|Y⟠OªérZßÍáÏøƒC’vÓ5FÖåû ÖK’:&´š^{·¼v‹wiul9—wÓ¦¿gOÿá¯ø-«økþ 'kñQñÁOþÐÖÞ>×~_økà—Š|Q¥x‚µŸ‡þð?üMª~ÄÞøë®|WtÍG[ðÖ™ãOØ+QñÞ•ûUÝMã⯋>ÝþÓP[|d×ndºúóÆ×Ò'Àˆzìß§ÿÁCmþø»Æß 4/üGøý£ÿÁH¼eã/ƒw6vÞ=ñ_ˆ¼uð‹á}ÿÄ_„ŸðUÿŠۺ|#ñ÷†>üHð·À}JøŸ£|KðtÚÆŸàÛSÃz×êGü(¿ø*·ý?àŸ?øv?hïþq”‹ÿ‚«Ðþ óÿ‡cöŽÿçIЮÚ|V¶Ò¶ÏKé«_fú-nšv4{¿š»éý?º_ð[à„¿kkCMøÃâûOÚ†ûâ‰á‡> øÆöÞ ý§¾\ø»öýŸ?๭þ&ÉñGágŒõíÇ^ÛûüEøâ(µoÚ×Sñ?Æÿ|ñoÆ}^çâGÄ»Eý¬|Qq·e¥~Øšï‚þè~ñ/íåà¿‹úΉû-é_ðPÏê|zº‡Âµf£ûpþÁV~-ñ/ì×kñûÃþ,ø sð»Bøw7íëªxæØÓÂÞ%ý‰¦øUk¦GñgÃúÏÂø+§\þç‹ÿ‚«Ðþ óÿ‡cöŽÿçGü(¿ø*·ý?àŸ?øv?hïþq”{ ÷¿$7½¹•´I%kj’W¶ÜÖ~AÍ5{zvþ¾ÿ#òsâO‡þ?xWñýÛËUømð»ö¼‹Ãÿ³Ü^ ñ/ÅßxÅñGìÉû)x»Mžïã߉5_|Dñ–·á__?hŸ|+ñ/í¡uñkþ Ÿª_ø'âì¿ûhê¿ ¼8?g|öÏۣľ µý¬?e|Xñíymð¯]ýžlÏßx[öDÕn|G¬ü@ðŸÄŸØ{Kðgˆ<_¡þ¯ÄGDðׇ$Ÿöoðw짪Íâ] D¹ÿ‚˜ø±cøŸâ_ØKCÓ¦ñeý¯t¿ˆú®³ðCÁ~:´Ð¼SQñ/Ç[¯ümðu÷ˆ?o+ŸÚ+Býô_ÿÁ:¼-áWö՛Ú7ˆüYû\ÁLô¿Øóĵv‡á Ûá­ø—á‚ÿd ;â6«ÿ/µ†ÿY°ðž¿iûNÏs¬h_cµþ?áEÿÁU¿èÿùÿñûGóŒ¬H?f_ø)¯ˆõ_Úøþ ½mâíwDðÿ†µÏÁñãü>#Ö|9á;ÿêžðþ«®Gðu=GDðÖ§ãOê>ҮѯüYâ[½: kwT’éû ÚûékI%¥ºYî´—x¥-pæwÓ}{~:}÷}¯øcñ‡Aý¿?·m½oEø«ûPÿÂÜÿ„'þ )ý…ðÇá§ÀÚïû þGü+ŸÚÓö.ÿ„ã®­ûJÿÃÿÂmäÃ,øƒÂ¿ðÄ¿³¯ü6Ÿü,o°x?âOüL?᯼s^¡ñ‡à×íaðwâ/íì“§~ÐÖßðì~Ñßüã(ÿ…ÿVÿ üçÿÇíÿÎ2©Öíü <|þïëúOÊþÍExÏü(¿ø*·ý?àŸ?øv?hïþq”‹ÿ‚«Ðþ óÿ‡cöŽÿçGÔëvþƒž>wõý'åf¢¼gþ_ü[þ€ðOŸü;´wÿ8Ê?áEÿÁU¿èÿùÿñûGóŒ£êu»GÿAÏ?»úþ“ò¿³Q^3ÿ /þ ­ÿ@ø'ÏþÚ;ÿœeð¢ÿàªßôÿ‚|ÿáØý£¿ùÆQõ:Ý£ÿ çŸÝýIù_Ù¨¯ÿ…ÿVÿ üçÿÇíÿÎ2øQðUoúÁ>ðì~Ñßüã(únÑÿÀsÇÏîþ¿¤ü¯ìÔUýCK›G:e•ÕÔWקÞ¾Ôo-í^ÆÖçSÕ|3¤êšœ¶V2]_Íc`ú…åɰ²ŸPÔn-,ü‹{Fþh¤¼š…s5fÓèÚûŠZ¤û…QHŠ+²{_ iº_‡çÔtízþóXÒîu)¤²×ôý6Ú//^Ö´ˆáŠÚ 겜E¥$¯#]ÒLácEP J÷Õ++¶ïÝ.‰½ØmÔ}¯ÁôñGþúOÿ0ô}¯ÁôñGþúOÿ0ôùWóÇîŸÿ"'øŸõgå~^¿$¿àµ¿òd:Ÿý”ÿ‡ÿú;T¯½¾ übºø»âOÚ.Ñ´+èßÿhoàÿ†m…ôš¦§y¤xwá×Ã-zëU×u3m§ZÝêZ‰‘$ZþŸ{¯jÿÿÁkäÈu?û)ÿÿôv©ZÑ‹Ž"œ^êKoK“-bß{~hý•ñü…­?ìWð?þ¡~¯ˆjÿù ~ÇöoØ¿ÿWN_ox¿þBÖŸö+øÿP¿×ÊŸ¾øãâ6³û0ÚøÂÚÏŠ§ðoí“û3üOñLz5œ—gBðȶ-ñ§‰µŸ,66‡¦\Ê“u©jXhzE½þ¹ªézm㥦&-轤¿6'ð|£ú2~ÈŸ±Wо*x»ÅŸ<û)þÄõ}/þ ¿ûnüG¼ÿ‚ˆøgÆ‹~ߺ·…~ÁZ~>øŸÇ_ n|!¥þÉ~¹øÙàŸø‡ö9ñcKûjÜéÉû:x÷YÕµø³H[Ïû-~Õ?~ þÃ_ðHƒÿ~~Ìüñ÷ö`ÿ‚`ø³àφäðøuðsNý‘>2ü+Ó|"nj«k=;âÃÿJ¾x/N¹Ñüàë éž ñg‹/4¿ ü.ñƒ§]x«Ç¾*Ö|uã¯\Øé~µ¶ŸÄ4ñ·ˆüCãk2ÄÚˆüU®ë>!Ö.o5}Rúò?o…?³céß4wøàvÒ>xÃþøE¥·ìø[NøWá_ ø«á޼+ះ'À¦ÛÀþð×¾ üñ‡ôo E¥éÚ7оü1ñmm«ø ·šO­Ïæþ¿ÌÎϳþ¿á×Þ~]|8ÿ…·ÿÆÿƒjþ‚ýŸÿjøH?á•ÿâÅþÔzÏü#ÿ|qý•ÿYý±u¿ø®uøR¿´GÙ?áþÍÿ„ÃÃ?ñg|aöøÃÖ¿ñOùßð”蟧څ×Å?‚úÇì“û ~È_dØÏÄ9ýŸÿhoÚÄ~™ðwÄ¿g…Ÿð¥¼wû5è_þ|-ø[ðÇÆ°íî³ÿ ßÄßÚþ_éÿ¯o¼þ‹à-v]{à…çˆ>+6§ðëéþÏ¿²Å…ž øñKö^øOñ+à—Ã_øG?á]|ñÿìǧxÇág€áðåïƒü#ÿWÃß|<Ô|%á_øE|%¨êðçö‘aý‡áËûÝLû.™u=«óúÏì£û øàׄÿg?þÇ5ßÙóÀ^ ¹ñg~ë?²W‡uOƒ^ ñUäþ&º¼ñ7„þ_|4ŸÁ>ñÕÏ"뺟ÅoiúWÁ{ØÛöÿ‚…êpKuñkö_×`ÖýÿDÿ‚šþÙ-ÿ ã_à/Û<%ÿêøÿðü(Û†¿ðζOíÉÿ ñˆ|ÿ â·íµáï¾ÿ…U¦~×?üuÿ ßDý‚¿i ϵ©ñOí àïêÿüEû>þ»[|)ý›,ü+¬øÏàí|â?ƒþýž¼CàëoÙðÁá]wà‚ôïhþø¬øz/®‘ª|ðž‘ãßi~øi}g?‚ô;Æž,±Òô[[oë^`xÿö}ýþ+üSðWÇOŠ_²÷‰_~ÿÂ9ÿ ëãÿf=;Æ?üÿwˆï|aáøB¾!x‹áæ£âß ÿÂ+âÝGPñO‡?°µ{ì?ßÞëzgÙu;©îœç‡óGÿ_æ}Ÿõÿ¾óð'öƒý®ÿmÚ÷þ AûGÅ}âÏÙƒÀš¾¡ÿ!пoÚ.ú×özø­â;â'…nƒÿ¶-æ‡ðWগ7í_£Üü ñÁÿþÏZ§‡µ_‹ž:Ö?h½;âwмs§øÆÏá/ÃM#Á÷ñì÷À/Ú_âŸÄOÚŸãWÂêß³ùø¦ÿÂǼø5¥øÿÄw~1Õ<9ðwâ.ðž#ð÷Ĥ׼MðÿöˆþÍøwâ?~Ô~ ³ð¯ìÙñOþ ïñÛÃ>ø%ãÿ~Ñþ:üý¨¼aÜ|Gý”aŸŒ~øcà_‹¿±ÇÀŠž ø'áöðŸÁŸ|Gý’¼;ã ü#ð«éÞÑßÃ? |=↚¦‘à/¶‘á? ém£xVÏIÓ›NðׇìM±¶Ñ´è­½þø-áüEø¥á?…:?…þ&ü`ÿ„GþßÄ_üÔ´OüQÿ…£ÏáßÂÅñv›àëoxÛþŸÜÜè^ÿ„›PÔÿáÑî'Ó4o±YK$ sÃù£ÿ/ó >Ïúÿ‡_yðGÇßÚóã/Ã߇¿ðSoŽzEï‡ü®~Á³Ç/|5ý–¼o Á©j>?Ô|9ðÏÄß>þÕ?5{ l5}[àÿÅm_ᆹà¯Ùïÿ> ÚøV׺/ÇK¿u?ÚŽ~Îÿ°oÈ´gÅŸÛBOÛ3ö.ý•¼Câ?Ùƒâíð×öŸøOñ¯À¿to…_¾üÓ¼+ûOÁ?¿à¶ÿ ï4ÿ|¾øÝûBxÛÆ~ ø#mû1xÇ╵®ñëáÞñúxg༺¯ì둪|v¾ýwý£¾ üý¨>|Wø[ñÃÞ(´ÿ…·û?üqýš5ˆ¾øs©[üSðÂÏÚ#Úo‡~)i>ñv»àÂ?ÿ ü#þ×ol'Óõ/j¾#ð?‚µ?h:ßü#:dŸ gßÙàv¡xwà§ì½ðŸàÿ‡ü/ñSø±á áoìǧ|?Ñü;ñO[ð&¡ð·Yø—¡ižøy¤Yi5†Z¾«ðëSñ–Ÿ¿ˆïü ©êºÔ¥ðýíΟ)Ïæþ¿Ì,û?ëþ}çó“ûA~Ý|mñ¿Àþ3ð/À_ƒþ.ý¨ÿe¯|b>»ðÂïj~*ý¤~>þγWüiû1ø{Â÷¾Ñü]ªüDÔ¾øßâ'ìugñàßìñ¥ø·Ä^4ø]¨üø¡à{‹Ÿ5Ín/]t?ýœ¾h|¥øGáGÄü›áÿ‡ Ö?àª_¾~Ôÿµ—ü‡â¿ÀŸ~˲x#þ !ðGþ áû7ê^*Öµˆí5⯇_²ëþÅžøkñ{Æ2~ͺ?‹~.OàM/þ Ë®GàïÿFºWŸٳBñU¯Ž´?€~Ѽmcâ CÅ–>1Ò¿gçxªÏÅZ¶£ñ¯XÕi{j¿ fÍwÅW^:×>øYñµ÷ˆ4ÿ_xÇUýŸ£â«Ïi:ÁMcKñ5׈o< 6¯qâ 7Wýšÿg=SOÖf¼}FÏQøðRúÞæ;Ÿ…~—AÿÁGüñ“\×?jÍÀ6úõ„þÿ‚WéÖß´D>>µø‰¤¯‰ãçõÙ;á`øÑû(Yèß³OÃÿ€ß°_í™û_ø;áßü;æÿà߇<ð³â‡>~À¿ðU?ðÑ´Gì¹ÿæƒðÿß>;ü@à‰-þ|Gð«ñOÁ^ýe/üj¾ðgÇ]þìÍû/ÿ ûû!ÿÂÿ ïþ{á?ü+ÿú¿á˜ôïøC¿ä„ÿÃ.ȳÿ óûþM—þ1Óþ<ä„ÿÅ¢ÿ’ÿõyÿ‡b_ø'„< ñáo„ÿa?Ù£Âÿ ¾0Â#ÿ oáׇchžø£ÿ ÿXŸÄ^ÿ…‹á7á]·‡ümÿOˆ.nußÿÂM§êðëêz7دe’v9áüÑÿÀ—ù…Ÿgýï¼þro|'á_üÿ‚Àk&ðχüE«ÿÁ??bÛ#ÅŸ°^©®èÚv¯¨þÄ~*øgÿ$ÿ‚ýxΈ¿dKíBÚâçölñÃÿþË_³'ƒ¼¬ü—Áz…<+û9üðöƒsa¤|"øgáï¿þøOºoÆ_ØÏöŒÓ¼3áûÚãü{þ Õû=|høíe£iÖ¿~/|øSüB×áwÀïŠà¶ÆÞ?ø?ðÚÛötýŸ-üðÓÅzæ­à¿Að'àÜ>Ñtèþx%t?×}oö}ýüMÿ /þ?Ù{á?ˆ?á—ÿ²?áš?¶ÿf=;Uÿ†wÿ„þoìøQoøyqÿ “ûþdÂÿÿöoü!þû“ÿþ“öCSýŸd=oǾ)k?²÷Â}_âoLJú‡Âu?ÙN¿ñ߯…š¾¡xwUøiñKÅ×_%ñćúŸ‡ü/á Pðo‹5 _׺?‡t-2çM–ËHÓà·9áüÑÿÀ—ù…Ÿgýï¼ðøhï¾#ý¡þ9ÃáïþÌgÏÙ‡öŸøû'xëÁ¿4i¾/ø«ãgÂOÙsâ…Ÿ|ûDØüJ´ðOà ŸÚóÁßþüÖ?fߊzÆŸ‰Ÿ,¼Æ‡r|}Òõ¯‚ŸjðRÿÛB/…?²gެdý˜!Õÿà¤ÿf¿Ÿ³¥½×Á_Š×zwì¡á_¿¶‡ü[ös×>ük†ÚbÊçöºñàŸø(þ—ªi_| yûéÍâ¯ú…õçÃÉôжúÃÙmgáOìÙâ?Œ¾ý£§â? øîâhÚ•—ˆ%“PcžÍü ˜Yö×ü:ûÏ·Ÿ¶¿íãûïø3â—Æ_Ùÿàm–§ðÿþ ãO |{Ñ>Ýx_Áß5ø$/í“ð§öRøë⿎šOÅ¿ŒÞ:ðÿÿgÿÚ³Ä(Ô>*jþмWû?øïöcøŠ~韴?ĉ·^ý¬¼ú½ðâ?о/|ø{ñ+Æß |AðsÅ>0ðü:®±ðïÄͨGC§¸·ŠêÚ?øÁ~6µðÿˆí ƒÅÓþ(ü9øGñ—M𮳣X|hø)ðWâµ·Œ~x;—¹øSû6^O£]^|ð=ÕχÏúÿ‡_yÔQ\¿ü%úOüúx£ÿò‚øKôŸùôñGþþ4ÿåðþhÿàKüÂϳþ¿á×ÞuW/ÿ ~“ÿ>ž(ÿÂÆŸü £þý'þ}Ïúÿ‡_yÔQ\¿ü%úOüúx£ÿò‚øKôŸùôñGþþ4ÿåðþhÿàKüÂϳþ¿á×ÞuW/ÿ ~“ÿ>ž(ÿÂÆŸü £þý'þ}Ïúÿ‡_yÔQ\¿ü%úOüúx£ÿò‚øKôŸùôñGþþ4ÿåðþhÿàKüÂϳþ¿á×ÞuW/ÿ ~“ÿ>ž(ÿÂÆŸü £þý'þ}Ïúÿ‡_yÔQ\¿ü%úOüúx£ÿò‚øKôŸùôñGþþ4ÿåðþhÿàKüÂϳþ¿á×Þ|âÿù ZدàýBü?\½u¾6‚{]r+k˜e·¹·ðç‚ืž7†x'‡Áº rÃ4R’)b‘Y$Õ]J° ®J¼9ürÿ¿6m—¢ü‚Š(©WQâùøþÅ{¿ýM<_\½u ÿOÿìW»ÿÔÓÅõQÚá_ú\@øoöÆÑ~Ÿ‡úwŒþ)ø»ö†³ð†u½ÃZ/ÃOÙããŽ>øâŸÅß‹Þ8ðO¿ƒ>ü,ñ—Â_oVñÏŠ,¾øOJñ/Æü‚ÿâeçŒ~6ÁöøGâÃ/kø¥|Uо | Ðþ;x—Dñ§Æýáw€4¯Œž1ðÔÚøsÅŸtï é6ŸüKáû[øNÞÛD×|]¯ªiPAáo C …ÔÅáýtënÛİñ-„v£>·mom­økÄÉáÿøÂwíá?é^)ÒàŸTð¶«£jwZ%Ö§£ZZø—ÃWWsxsÆž›UðwŒt­wÂ:ê;t¯î¥Ù·ÿ Û­ûéÙñìeÿ#í¹ÿg½ñÿU_ÁZùÃþ [ÿ&C©ÿÙOøÿ£µJú?ö2ÿ‘öÜÿ³Þøÿª¯à­|áÿ­ÿ“!Ôÿì§ü?ÿÑÚ¥tÃýê?âþ’ˆÊ?¡û+âÿù ZدàýBü?\½u/ÿµ§ýŠþÿÔ/ÃõË×<þ9Š_›*;/EùQR0¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯™þ)þÈþ4ø®OüIÒ<¯ëïae¥@öß¾:xsHÓt˳麆|/ñ#Eðχì Ä÷z•Íž‰¤iö÷ÚÖ£«k—±Ük¾§}wôÅã)EÞ2”]­x¶»][MY=ÕψáÝ?²Wý ??ñ"?iþ{túd¯ú~ âD~Òüöëíê*ýµ_ùûSÿ—ùŠË²û‘äŸ>|1øáýgà ôCAÑüAâIü]­Gªø·Æ^4¿Ôð÷aø“®_|NÅšˆ¾]h>eš÷RñF—ñ ÃþÔü6‰iyâ 3ƶžÕ48aÔ¬íïm!_Û{©·íIní+ØkáWÑY~^gçN“àŸŠ¿±‡<®|0ø5û<þÎÿioáÁÏÙËö9ý”¼9Æß‚Ú·Å_†ö>0|Uø½.—âGþ —ðî?Š?¾ÚxKñŒž$ñOÂøtÿ þËŸ ¤~-øPðGÁ-?âþÒŸ´ßí~!x§TÓ4MSðF·ÿ—ðŽ£û;øÓTÕü7áÉÿi¿†?ð^ïÚö{¼ñ•§‰<㟎žø¢|@¸ý¤â¦‹ámöšÕìl/¾izƉzgÁK]Kâ·ë÷Ä_Œž øÁàÝcá×ůø'çí¡ñGá÷ˆ¿³ÿá ð/Ä_Øâg¼®ÿdê¶:î•ý±áøKSÑ5?ìÍoLÓu?í¶3ý‹UÓìu o*îÒ £â´kà'…t/x_ÃðKÏÚoÞømö¿øW^Ðà›~/Ñô/ý¿â7„¾0ߤiþ·Óü-öÏ‹žð/Å;¿ì+{´|FðW„¼o6ÿxsGÔì÷TêîèÉËš.ö¾ŠÚ]»ê’ZêåÍ­…Ì¿™Zßåo.ý—–Œàþ6|xøÓ7ì%ÿZÓ|SâNøßû"ü.ý¡¼kñà®™âÏ„vïˆÛö!ðí3àïˆ^ð¦£ãÿˆÞ.øU­øBßãf‡á8–?‹>4¿¹ñ€æø…¥ë~OÚx7Â{z×íKûFøSÆ^3¾Õu‚z×ÃìûüZðÆŸð»ÇZŒ¾.|Fý§´¯ÙKãï\ün×´O‚¾ ðŽ·ûcxP±ø%â_‡_uÝ[JøS¬hóüq²»ø“e®ü7÷+öŠÓt+ÿêšì7ûuèÚŸ5¸:ñ.›ðOYÑ?n¯þÍ¿>øsBð/޼9ªüøsñ[ö¾ÿ‚~ü ñŸÃ?x—Pø·â›O6O‡ß·„xcâ·‡ü1ðBÒ Á6îçðU‹t¯Š6~ðŸ¼3ñßöÒø™£üE»Ô<â±i_ 4ÿ†oá/ xÅ|AãXÏ~Ô¿´o†~1üxÖÿ´> ÞþÏ¿ÿmÙ3ö<ÿ…cÿ »ÇVßüMÿ EáoزÓþ'ü/_ø]× Ñ¿áñ·íÿ ü"?ðκ·ü$Þøyÿü$þÕ¼[ÿ φ{¿xÿá?Ëû Sáçüsöµð§¥há­/QðgüÃÇÞ¿Ó|9'‡>ø:OØ]è~ ±¸³Ñ$ðÁ_ƒ~}*ÞHìß ~èmÓ<ák]+Ëü+¢|ð¯íñ/ö¦ÿ‡tþÚ#ý ¾$øÚÃÆ¿ð·|Uÿøñ~±ñÀ?`ø!à€?ð‰|4ñ÷ü+‹x[Á7ž ðÚ¯ôøHoþÑ®ø×Çóý­4ŸÿcYžÆwþ ¬ •¬ß2m·}.®¹–«§@æ]Ö­ujÛVÓ­ög†øgöÿý¬5Ù’woû<¦§ðkþ ¯ðKþ YñÛÃÖß ¾$Çañ‹ÃŸ4Ú#ÇÚGÀ?„·²þÐÜ|ÖüáÙÓQðŽ¥ñ“Æ1~Ñ–0ñެ¼mkðƒÁúg„'ð'‹x›ßø(íIáíKâæû>~Ì¿ ®ü#ûÑ>i6Þÿ„—þ Óûh|VÖþ|løåñÿ៌>.Á><_ã¯|.øñÿãljh¯ê ¼A¨|8ŠïÁ?Ùÿ|Eü#wžû»i¥xWÁÿںγ­èi­Ï^Êzþâ[ÞÍ+%¯f¯ó·/6šE]]7mo¯Ù×TíÖëïëo(ý§?ißÚ7VýmoŒºWÄ‚ þ7‚à¦þø7Oo|:ý¥|)ñöLðÏíQàÝ7âgïößµMâ·µ­oökñÅ …>ø3ð{]øoàXñ\¼Qwðô|\úóÃ_>4Ù~Ôžø'ãŸ~Ï:¯„F‰¥xRÕ<5¦x³Ãú¿Œ>4é¿ ø¹ãåðþ®|ñ LøoñGLÓ/ti_°ÏļY®~Ìž/ƒö«øqû[|[·øqñ—à¿€2´¯ü'о*ø—㶇ÿÜý­toþ4Ñ ð׌~2i_ðOiß|YáËX|?okáÿüC´ðT>.×tKk øZ4­SWº°† x~(àTÑ´å¶<5ãÿ„þ ñ‡ücàïø&çíká?xOáv•ð?ÂÞ)ð×üÃÇÚˆü5ð[B¿ƒTÐþx\Òük©èß ´mNÖ×QÒ¼§][xON¿¶‚îÓI†âäYtjZÞÆ[;h´nÖÖÿfÖ¾òݤÇÌ»®Ÿ§ùü¾LùÏö¾ø—ñ§â–·ã] C×~xOà‡ìÝÿ(ÿ‚_üñƒõ_†þ,ñ_Å_‰¾#×hø'¿Çë_økâ½§Åß xGញaqñïÂÞ¸ðF©ðSâ}ýü?¼A«Çã=þ iÚwÃÏž~ÁA?j­{öoøXÿ ~ |moâ¿cŸÙÇà7Â_ƒìì´¯…ð“ÿÁ(þÿÁBþ(ëx7â'íqðá÷üci«ê_ ¾|3²ø»û>«ðnmâkŸühÖìl~kß|x×Zø ñ'â7„¾0üEÿ‚^~Ó~>ø¹àìøA~)ø×þ ·âÿüFðWü"Úíߊ<1ÿ—õßßø›ÃŸðŽxšþûÄZö>§gý®Þ]êúÙõ ‰®»Ö¾_ü9×¾_Á/?i»Ï„~*ÿ„Kþ…—ðM¿Ü|9ñü :‚¼/à_íïMà7ðαÿW†~|:ðï„¿´4ËøG4/ø+HÑþǧø[B·°j•E=ž©Y;+½ýíUõj÷åºAÌ¿™/éwÛ·Þ÷Lò‡ÿ¶?íUñ:ÛÅ0Ο²÷À-oöjø'eñ‡öŒ‹ã>£gâŸøß?k¯ƒ‡eø£ðgö…ñ—ÃïØ×ûÓö4ñ/‰þ(êú®»ûoÂŒÕ~)\øÄgŒµ¿ÙïÄ—?±>|iý¬Ú|ñÀâ5¹jú×ÀOžþÞÿ‚^~Ózßü3Çögü(íø&ß‹õ/øQŸØŸðŽÿcžûg€æÿ…eý‘ÿ„¿³?á þÄûü"þû'•ý‰¦}”ø‹­|øÁ¥kůø%çí7ñGDñ´ÿ‰~ Ñþ"ÿÁ6ü_ãm+]ø¤ø6ÇáÖ•ãýcOñ/€õ;MOÆÚgÃí3Mð.Ÿâ«Øg×l¼§ØøbÚþ-Ò ÏeSþ|É&ïðÅÛF–ï]_6¯ûº­Bëù¿àü?%Ûæßsç/‚_ðS?ˆßô þÐ?-þ üý•üGñ³ösðWuE®ØÃ?|9øËÿ¬ðÏí¯wâߊ´½ãÝáËÿm~Ò_> þϾ×µo†´!öû Iiâ?|Vð‘ð—éGì«âß?þü&ø“ñ÷GÑ<%ñ'âGÂï„~<ñÃ+À>,ø{ð·Ä~'øEà-OâÃßé>4ñ‡‹5ëoBø©7^¾ƒÃþðåï‡ü ­èšŸˆü%¬øÛÅÿ$üGÖ¼3ñ+Ä~Õ¯ÿdïø)†ü9eñGŸ¾!ü>ðoì7âß¾*ü4¿ø_¬üñÇÆ7‹ϊš–·ð^ø3ðËSðŒ¾ øàˆu»è¾ ø™þXÛø./kÒ¿h­7B¿ñ.©¡þ÷^©øÓ[ƒÄ¾1Ôt¯ØkâÞâÏÚøsÃþµñ‰ní<3 Æ»­ÛxGÂ~ð´®©%Õü>ðׇô8ç]3FÓ­m¦T*5îÑ’ztNÖéwÕêÛê”z¹’þoË]µþ¼ûiöòOü5~¥ÿFwÿÿÄ/øÓÿÊ ?á«õ/ú3¿ø(7þ!ÆŸþPT}^·üû—áþcæuýÃþ}™õµòOü5~¥ÿFwÿÿÄ/øÓÿÊ ?á«õ/ú3¿ø(7þ!ÆŸþPQõzßóî_‡ù‡4{¯ëþóìÏ­¨¯’á«õ/ú3¿ø(7þ!ÆŸþPQÿ _©ÑÿÁA¿ñ þ4ÿò‚«ÖÿŸrü?Ì9£Ý_ðÿŸf}mE|“ÿ _©ÑÿÁA¿ñ þ4ÿò‚øjýKþŒïþ ÿˆ_ñ§ÿ”}^·üû—áþaÍëúÿ‡üû3ëj+äŸøjýKþŒïþ ÿˆ_ñ§ÿ”ÃWê_ôgðPoüBÿ?ü £êõ¿çÜ¿óh÷_×ü?çÙŸ[Q_$ÿÃWê_ôgðPoüBÿ?ü £þ¿Rÿ£;ÿ‚ƒâüiÿåW­ÿ>åø˜sGºþ¿áÿ>ÌúÚŠù'þ¿Rÿ£;ÿ‚ƒâüiÿåðÕú—ýßüÿ¿ãOÿ((ú½où÷/ÃüÚ=×õÿùögÖÔWÉ?ðÕú—ýßüÿ¿ãOÿ((ÿ†¯Ô¿èÎÿà ßø…ÿùAGÕëϹ~æÑøϳ>¶¢¾Iÿ†¯Ô¿èÎÿà ßø…ÿùAGü5~¥ÿFwÿÿÄ/øÓÿÊ >¯[þ}Ëðÿ0æuýÃþ}™õµòOü5~¥ÿFwÿÿÄ/øÓÿÊ ?á«õ/ú3¿ø(7þ!ÆŸþPQõzßóî_‡ù‡4{¯ëþóìÏ­¨¯’á«õ/ú3¿ø(7þ!ÆŸþPQÿ _©ÑÿÁA¿ñ þ4ÿò‚«ÖÿŸrü?Ì9£Ý_ðÿŸf}mE|“ÿ _©ÑÿÁA¿ñ þ4ÿò‚øjýKþŒïþ ÿˆ_ñ§ÿ”}^·üû—áþaÍëúÿ‡üû3ëj+äŸøjýKþŒïþ ÿˆ_ñ§ÿ”ÃWê_ôgðPoüBÿ?ü £êõ¿çÜ¿óh÷_×ü?çÙŸ[Q_$ÿÃWê_ôgðPoüBÿ?ü £þ¿Rÿ£;ÿ‚ƒâüiÿåW­ÿ>åø˜sGºþ¿áÿ>ÌúÚŠù'þ¿Rÿ£;ÿ‚ƒâüiÿåðÕú—ýßüÿ¿ãOÿ((ú½où÷/ÃüÚ=×õÿùögÖÔWÉ?ðÕú—ýßüÿ¿ãOÿ((ÿ†¯Ô¿èÎÿà ßø…ÿùAGÕëϹ~æÑøϳ>¶¢¥’ÚòÚ-<ßÚK§ÝßhÚ³.q%¬×Zp×tk j->ö[ ‹Ë¿±†þ;Kó§Þßéÿl†qc}h!»›æß‹Ÿ´¯ðçâWÃÏ„> øñ‹ö€øƒñáÿÅoŠVº'­{öv𥷆ü ðsÄß<âÝwÄþ ý£~=üðÔ^o‰~=ü;Òô]3CÖ5ÝcP’÷QôûkM:K‡ÍFN\©^Zé§K·å¢Lw[÷·ã±ômò‡ü/¯Ú+þ‘ÁûWÿáóÿ‚YôÇ(ÿ…õûEÒ8?jÿü>ðK/þ˜åW²©ü¿ŒÌW]ÿ­?ÍWÑ_|3ý¶,Qý_àí;ûOüCø¡­^x;ã÷í¿ñ[â¶Ÿÿý¡~ ^~Ξ&ýˆ|?áïØ Ký˜>ÁE~%üñÖ¡mû_i°×€4ë|ý‹ü%â‰~º—öó¿ñ‰ÿh¿hßõ+â_Šukï€~*ý?Ðþ5üLÑÿkx_⦟â‡ÿ jÙƒÁ:—À¿‡ž+µø{ý£ðÏöŸø?­üIñŸíð“â'Ž<#ªëþÖ>0|Eø7ñ3áN½ðÃÀ_>&ü`ðþ¿á_Ùö³ñï†äðÿ…¾ê~-ø‹ïÿþ xWà‚õ¯ø;Pñ¥¤k¿?h_w—&ºÓ¯5üUûJ|}ø—ûFxëO¶›KÒ´kdðþ“ãoŠž!Òü'k-œÚ…lôkcU×µ{{ísQÀñÇì÷£üJð'ÁÏ xçÇŸ5Ïüøð[â—†~5ÂÞðïÅÛÿü!Ö4«­g]»Õ|'àMÂ^ÿ…ïá(ümð‡ãÖ™ðÛÁžÑücðOãÆ…zŸá? xÞçOµö ¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(óŸÅÿò´ÿ±_Àÿú…ø~¾(×?å ìÀ?o/ýjŸø%5}¯âÿù ZدàýBü?_kŸò?¿ö`·—þµOüš¼Xÿ§økÿ麆ßf?öïæ«è¬MVÍá©4=WDÓ´Ë]nyüciªø~ÿY¿×|8Þñ­®•á­FÓĺ¿„õ¸|]sámrjš_,.|9£xƒÂÑøj×Sñ.ã âxJÃâ5ŸÙ?á:ñW‚|G³Á> °¾ÿ„KÀÑñÃû{þ/Š­?¶>%øûì~ ñOÚ<1ÿW€&û~»àì}{ûwâ_ÄŸøHôÿøEqùþäQùá_ùOÿí?ÿÕ·ûWîïˆ?äàûîÿõ4ñ}~xWþSÿã_ûGGÿõmþÇÕû»âùøþÅ{¿ýM<_]zØ=ý°˜ý¯ñ?ÐùGö‡Õþ4è^Mwá‡Ä¯Ùçà—„|+¢x³ÆŸ¾0þÐþñgÄOxOÞ°³¼[DðG‡¾)|Ó,4IôÉ|Gâ|Tñ'ƽ.Ãáý‡‚ìôðóÆVþ;¿ñgÃ×à!×>øµMÃZ›k~ Ôõ¯ ê­¨øsÃ÷æÿMœÝèšUÁ’ÂâÿÃ;‹^Ò|-¨¦‰%¾•ñGàÄÈ×Ĉõ+ðWãO€>2io¿…¼gà=N=n=OÀv’xkPº×/¼9¥xt­SÆ> øá=sáçŠ=F°ºåJÚÝënž½o絕·w£âØËþF?ÛsþÏ{â7þª¿‚µó‡ü·þL‡Sÿ²ŸðÿÿGj•ôìeÿ#í¹ÿg½ñÿU_ÁZùÃþ [ÿ&C©ÿÙOøÿ£µJé‡ûÔÅý%þ”CöWÅÿò´ÿ±_Àÿú…ø~¹Ëi"¶¼´¿:~}w§Ë%Æ.³¡hÚèÓ®¦µ¸°’÷O‹Z°¿†Æýì//tói7ŸÙ÷÷ö"qi}w Ý‹ÿä-iÿb¿ÿõ ðýrõÏ&ÔäÓióKU£Ý”¶^ˆê?á/Õ¿çÓÂÿøCø/ÿ”Â_«ϧ…ÿð‡ð_ÿ(+—¢Žyÿ4¿ð'þc²ì¿¯øe÷Gü%ú·üúx_ÿÿò‚øKõoùôð¿þþ ÿårôQÏ?æ—þÿÌ,»/ëþ}ÇQÿ ~­ÿ>žÿÂÁü £þý[þ}žÿÂÁü £þý[þ}žÿÂÁü £þý[þ}žÿÂÁü £þý[þ}žÿÂÁü £þý[þ}žÿÂÁü £þý[þ},ð'ÃoŒÿ ¼O©KðN/Œø×Á?|oû;üC¹Óì®Gņ7Þ ¹Ñ¼Qû8øRéõ*òö÷X³½»ÒfšÏK}FÓWûîŠ#9F\éûÚêÒ•ù“NêI§tÝïÜ,¶ÿ±ø•ÿöÿ‚žÒagÿÄHñÿFðïoø)çý&üDÿô`Wí­§Ö*÷þ §ÿÈ •yýïüü—Ü~JþÉðNŸŽ¿¿kMOö³øûûciÿ´ÏŠîþø¿àM¥Œ¯>jQØx«Ç |jšÞ©âk¿Ž_XþÇ_…ñhö:kh¶S5¾²Ò>°°iv¶ý¹ñoÁµo·ònì®%µ¹‹Ìñ„¢“ÊžŽXüȤxŸkÑ»£eXƒWÅÿò´ÿ±_Àÿú…ø~ÿÈ'Çö+Úêiá ªNßôóò}˜ÿÛ¿šøNµ7ÂÚÃösý üGáŠ> øWáÙçöµø5â [á/ÁÿŠ¿™â_…ß~2Ũø¯Tñ‡‚ì<7ðÿövñ‚¼ñïQøwâëmßáF·ðcÅß|7áoŠ øŸ'„|q௉4?øsNÔüãk_{_†¾+ø›ÅžðÿŠt¿|CµÓ,xwÅžøE㙾7ÿÁFþ|yýš¾þÒü#×Þ#øi­øßá·‰#øÓðÃKñO†Ÿâ¯ìõñûáo‚¾/ëŸ<_âïÙ×Å_u?ÜŸ‡^5ÿ…‡àÝůá/xïPþдÕ|ñAÿ„wÆ^×tMVûAñƒ¬ZAw©èšŸöf·¦jš‹|¯x¯áÏŽ´¨¬|kðÏÆ¾6ø}¯økź˛qµ§'«¿¼ô´¤—Þ’wæ’Û§’ý/#׿á8ñ§ý þ(ÿÁþ­ÿÉtÂqãOúüQÿƒý[ÿ’ë—¢£žÍ/ü ÿ˜ì»/ëþ}ÇÉßðQÿxîØcö›X|kâØVóᆩ¥]ˆ¼G¬F.´ÍfêËIÕôÛ—€Oaªéw·šn¥g.ë{í>îæÎê9m§–7úƾ!ÿ‚‘ÿÉŒþÒ_öOßÿOZE}½W&Ý(6Û~Ò®îÿf—q-ߢýOA¿ñˆtÁVÚN»¬évÏáËÙÞßNÕ/¬ yÛÆ^,¦x­§Š6•£Š4i —))%Q@Æÿ„ãÆŸô7ø£ÿú·ÿ%ÑâùøþÅ{¿ýM<_\½)JI¤¥$¹a¢où#æ;.Èê?á8ñ§ý þ(ÿÁþ­ÿÉuò÷ïø(Ã?Šž2Ñüàߊ?¥»ñ_ö‡ü+ßx—á§í à?„Ÿ³ô«ï¯ü(ߎ^<ð'†¾ |tþØðv•­|BðŸü)ÿøÛþO†ˆþ'øGûoá÷‡u¿Ø{Í~Q~É_üqð—ö;øû6x_öiý¡¼}ûP~ﲄ<âχ~ øQñà‡Â£ñWàOÀ[móÂP~Ôß|%á€-Ñ<[ñgÃG¯ xÃà§Œ~3CªÍã-+ↅ£ëßtüEð¹&›æ›jÖ÷ì•ï«¿EeÕo¸­ªÑ}Ý­ý|—cöþÐßâüêßü—Gü'4ÿ¡¿Åø?Õ¿ù.¿˜‚ý«|kñ³Áí¾2þÚ÷ÿ³=×ÆÏƒïŒ~!Øüÿ‚Šþ̪i^#ý—¿à¦¶Ÿ¼ ¨xÓöüø¡ñÿö‚ ×µo~ÉZ±â|Wðçƒ~xËÆŸ¼Cð"ƒß´Åü5kÐáwÁâ[Gý¡?áá­¢xGþ¯€?aù¾ÿÃ@\xÊïÇ_¿m¿ÛGÀ¾¿ø»®è>oÂh~Î^ý‚o¼ñ/þ •¨kÿ³—Å*ãYø‹âox»DñGíCâ}ZÜdŸñdôNוìïmNê×’è®õê•»[î·Mšù[½ºXýÖø—ññþü9ñÿůˆ¿üQáß‡ß ¼⯈¾:ñÛüU«ax7Á:ÿ‰|O¬ehI©ëzŸöf‰¦_^ÿgèún¡ªÞùfÓìnîå† ;oøNxköký«5߇þ%ø ®ü*ý¢h¨þòM»ÞÎVV·}÷v{5f†­Úß/Oøw¡ÔÂqãOúüQÿƒý[ÿ’ëáø«ÄúïüWáþ›­ø^Ötí/ö+ø·}¦XjºÆ¡¨Yi׺·Ç?‚°j·–6·wAiu©Á£éêñÇ-ìZ^ËÈ–6ËØñ¥ÿ)"ðoý™Ä¿ý_ ¨„¤ùÓ“kÙËFÛì -4[¯ÍoQEŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ¿$¿àµ¿òd:Ÿý”ÿ‡ÿú;T¯ÖÚü’ÿ‚ÖÿÉêöSþÿèíR¶ÃÿŸø¿FLþòüÑû+âÿù ZدàýBü?^Yãï‹zÁ¿ø«Äz׆~$øÁµ[=/úO‡~|7ñ‡Äïjljt=YÿâKàý'S—LÓm4­T¾¼×5Ét­¶ƒK‹ë𮉥êV|oñŸàõ§ˆÆëâ¿Ã[kÝ7F𶕨ÙÜxëÂðÝXjz_…ôm;SÓomäÕVk[ý;P¶¹±¿³#¸³¼·žÚâ8æŠD^KþwÁú+¿ ?ð¾ð§ÿ-©5%9>I5yigªw[¥Ùî ÖZô_…¿à}çÎðÜÞÿ£jý·¿ñ¾*ò®ønoѵ~Ûßø‰ß?ùW_GÿÂîø1ÿEwá‡þÞÿåµ𻾠Ñ]øaÿ…÷…?ùmNËþ|KïŸùþÞ];y~ûw¡ó‡ü77‡?èÚ¿mïüDü«£þ›ÃŸôm_¶÷þ"wÅOþU×Ñÿ𻾠Ñ]øaÿ…÷…?ùmGü.ïƒôW~á}áOþ[Qeÿ>%÷ÏüƒþÞ];y~ûw¡ó‡ü77‡?èÚ¿mïüDü«£þ›ÃŸôm_¶÷þ"wÅOþU×Ñÿ𻾠Ñ]øaÿ…÷…?ùmGü.ïƒôW~á}áOþ[Qeÿ>%÷ÏüƒþÞ];y~ûw¡ó‡ü77‡?èÚ¿mïüDü«£þ›ÃŸôm_¶÷þ"wÅOþU×Ñÿ𻾠Ñ]øaÿ…÷…?ùmGü.ïƒôW~á}áOþ[Qeÿ>%÷ÏüƒþÞ];y~ûw¡ù»û`þÒ|qý™~2ü'ðOìÙûe/Šümàû+BÏìµñbÃM’þ;Ë;è๼‹B»ko´­£ÛÃ+@a[‰bûDAæOëy‡ü.ïƒôW~á}áOþ[Qÿ »àÇý߆ø_xSÿ–Ô¥ÌãÆœ¢¢å/´î䢞ë´P/[Þݺ›wù£øÏûYx[áν øþí;ãíCÃÞ†-cYøaû:üPñ§„m¯õ=Ä:ìm§‹,t(´=rê'UÓ.¯¦ðõæ­§X\^>w}½¦ë:^›äðÜÞÿ£jý·¿ñ¾*ò®¾ÿ…ÝðcþŠïÃü/¼)ÿËj?áw|ÿ¢»ðÃÿ ï òÚžö½6’MÞJöI^Öòû{òòÓúîœ?á¹¼9ÿFÕûoâ'|Tÿå]ðÜÞÿ£jý·¿ñ¾*ò®¾ÿ…ÝðcþŠïÃü/¼)ÿËj?áw|ÿ¢»ðÃÿ ï òÚ‹/ùñ/¾äöòéÛËóÿÛ½œ?á¹¼9ÿFÕûoâ'|Tÿå]ðÜÞÿ£jý·¿ñ¾*ò®¾ÿ…ÝðcþŠïÃü/¼)ÿËj?áw|ÿ¢»ðÃÿ ï òÚ‹/ùñ/¾äöòéÛËóÿÛ½œ?á¹¼9ÿFÕûoâ'|Tÿå]ðÜÞÿ£jý·¿ñ¾*ò®¾ÿ…ÝðcþŠïÃü/¼)ÿËj?áw|ÿ¢»ðÃÿ ï òÚ‹/ùñ/¾äöòéÛËóÿÛ½œ?á¹¼9ÿFÕûoâ'|Tÿå]p üs©üfý¹4‰šgÂOŽþð†ƒû(|Bð-ö«ñwàçŽ~Z¿‰/þ/ü*×ôý>ÆûĺU¶—q¥ÛjW6Ö–·ò_´zN§4–qÛÛ¬Ò}ÿ »àÇý߆ø_xSÿ–ÔÂîø1ÿEwá‡þÞÿåµ)rÑ’r‹ï'düšö¼¯·mv·ã¯ÍŸEy‡ü.ïƒôW~á}áOþ[Qÿ »àÇý߆ø_xSÿ–ÕŸ$ÿ–_ø ÿ"®»¯ëþ}ç§Ñ^aÿ »àÇý߆ø_xSÿ–ÔÂîø1ÿEwá‡þÞÿ嵓þYà/ü‚ëºþ¿á×Þz}æ𻾠Ñ]øaÿ…÷…?ùmGü.ïƒôW~á}áOþ[QÉ?å—þÿÈ.»¯ëþ}ç§Ñ^aÿ »àÇý߆ø_xSÿ–ÔÂîø1ÿEwá‡þÞÿ嵓þYà/ü‚ëºþ¿á×Þz}æ𻾠Ñ]øaÿ…÷…?ùmGü.ïƒôW~á}áOþ[QÉ?å—þÿÈ.»¯ëþ}ç§Ñ^aÿ »àÇý߆ø_xSÿ–ÔÂîø1ÿEwá‡þÞÿ嵓þYà/ü‚ëºþ¿á×Þz}æ𻾠Ñ]øaÿ…÷…?ùmGü.ïƒôW~á}áOþ[QÉ?å—þÿÈ.»¯ëþ}ç§Ñ^aÿ »àÇý߆ø_xSÿ–ÔÂîø1ÿEwá‡þÞÿ嵓þYà/ü‚ëºþ¿á×Þz}æ𻾠Ñ]øaÿ…÷…?ùmGü.ïƒôW~á}áOþ[QÉ?å—þÿÈ.»¯ëþ}ç§Ñ^aÿ »àÇý߆ø_xSÿ–ÔÂîø1ÿEwá‡þÞÿ嵓þYà/ü‚ëºþ¿á×Þz}æ𻾠Ñ]øaÿ…÷…?ùmGü.ïƒôW~á}áOþ[QÉ?å—þÿÈ.»¯ëþ}ç§Ñ^aÿ »àÇý߆ø_xSÿ–ÔÂîø1ÿEwá‡þÞÿ嵓þYà/ü‚ëºþ¿á×Þz}æ𻾠Ñ]øaÿ…÷…?ùmGü.ïƒôW~á}áOþ[QÉ?å—þÿÈ.»¯ëþ}ç§Ñ^aÿ »àÇý߆ø_xSÿ–ÔÂîø1ÿEwá‡þÞÿ嵓þYà/ü‚ëºþ¿á×Þz}æ𻾠Ñ]øaÿ…÷…?ùmGü.ïƒôW~á}áOþ[QÉ?å—þÿÈ.»¯ëþ}ç§Ñ^aÿ »àÇý߆ø_xSÿ–ÔÂîø1ÿEwá‡þÞÿ嵓þYà/ü‚ëºþ¿á×Þz}æ𻾠Ñ]øaÿ…÷…?ùmGü.ïƒôW~á}áOþ[QÉ?å—þÿÈ.»¯ëþ}ç§Ñ^aÿ »àÇý߆ø_xSÿ–ÔÂîø1ÿEwá‡þÞÿ嵓þYà/ü‚ëºþ¿á×Þz}æ𻾠Ñ]øaÿ…÷…?ùmGü.ïƒôW~á}áOþ[QÉ?å—þÿÈ.»¯ëþ}ç§×ä—ü·þL‡Sÿ²ŸðÿÿGj•ú=ÿ »àÇý߆ø_xSÿ–ÕùaÿŒø‹ðûÅß±v±¦øSÇ^ñ>£Ä__MaáïèšÕì6Q^_A%䶺mõÌñÚÇ=Í´/pñˆ’[ˆ#g,jÛaã%Z›q’\Û´û?"d×+×·æ¿ÍÉ-Q^ÁˆQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÙPythonCard-0.8.2/tools/standaloneBuilder/doc/pic20.jpg0000755000076500007650000021731410231140007022474 0ustar alexalex00000000000000ÿØÿàJFIFÿÛCÿÛCÿÀöo"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?û‡þ ÿƒý¥ÿàŸ?´ÏÃß‚þþÎ> ð‡ˆ?g…ßïµ‰ß õxŠ/x–÷Æš>©z¦âß A.Ÿ$~²¿/í¦¼[ËNIõ3g$)§~]Gÿ/þÞ?c%8ð¤üxøÄ>|N×¾(x#_ðoìûàíoÅ¿ÃýëRÖ>=|;ñ_5[ÿ Ïoáï éV¯®Z]~ÿÁ9¿gØ;ö„ý­?d„>0|fÕ-~#øÂÚÃâ×ÎR£^Iyø¼GP­‚£O7ñŸU§kZ'EZ •禔éF¦20„躼ѧ;ÇžŠû§Sÿ‚üÁI|?á/xÿÄŸ³_ìÙáÿ|Jÿ„ü:ñγû7øóJð‡á ÔFñxðOˆõÛèÞ,>Ö¦ƒKñöýØÐµ[]¬g“÷yÿÁŶã€OŸÙ+ÿ [Ä\œîø„§ŽGÌå[pC½býÑÿeÏ…¿fø&Ç€jŸÙ“Xø%¯|5ý”¿à¯>þÆ>Ñþ:XkÞ)øÅá‹ u?xAøWñ'ã>ƒûK|NÖõÿj~#øÙ¤|.Ñ?hx£ÆWº]x9~ øö;ý£à›i_,>(ø¾ÛÅ‘|(ý¶>!h¶ß´_‰º·Å?x×á-¯ƒ¾øOÇ÷|6ñ>ŸðûÂ~#Ð4¿xWUø¡ãˆ7‰ãm[Å~uûVÿÁ2t_xnãÁŸ³÷ì¶> ~ÓwÿðQOÚ/öwýžþ/Ž|wáEý¢d¯…Ÿ õˆÖÿ¾ÍûR|Nññü#ÃÃÖð‰¼Cᆚ—ü%CF›EÔ5½S aµ7„XšØXÿªT°”ñ0£Uâ1”°ô0ØzòŒ¿;§‰ÄTþÓ—-—f8zõçN3úœ]Ic#‡„=¡•Zœ]IM¬Öu]'(û:2J•*SÅVÁN•8¬"½O¬aêF n>ÚËØ9ÉÙyí¿üûgËß ¿d•€Î> ë[PäÿÅvÛ°T1§ÈŽ[j e·Øþ ïûd8R~~Ê àÞ¯òç×wޏÎ>dB!•Hu¢ñ¯ì‡ûø/ö*øoã/~ÍŸ´ßÆmâì¤|n¸ý§>|;ñÇÄü7ý¥%¿ñ6µâ»Š_¬~;Zü ðÿ†·…µ_†Ÿ~·ì¿sãïx&âmKâ·ü'¶÷WZÐßàž?±†‡ÅÇ_ø‚ËâÇüOŸ´?Âôø›âÍ ?à–~øþ<:ßüF¿þ!x‹]øiûRGã‹ÛÏøG—YþÅÕt†g[/û5‡ü9yj±SáJœaþ¦N<تø8?ªAóTÃãòì¾¥IB9µ£E×Ìiû:˜Št¹çƒŒ´±™^ :ÜU¼s˜Ú4©V’ö²VUpøŒLb›Â¨Îji9Fœ§ÉíŸ.Ž*¾æ{oø/gí‹3a¾þÊ@nPÅ~êÃh+) Åjá›(UùUËŒI,)ÿÜý¯›¾~Êàñ¿õ"Î:Ÿ©#¨ÉU9€w¬\_ü¿ötýž~éÎð³öKý¥¾x—Áß´×ü¦|Pñ7Â_‰þ ýœþ |)ŽËÄPø{JÒ_ÁýKåÈ—*sã°‚@AÆÅmÁSÍ–ß]?à¸_µ£`7ÃÙ|2á ñ –Áäø¸NUNG!x!÷ˆß²?ìG§~Þ_´·ìÍð÷öwÔáÕ¿gßÙÃâçÅÿ‡Ô>3üCñMŸíñ‚çà7Áü/ø9¢x;O—Bø¦úo…šïâ7_à øŸ¬|Gñ¦µw«êâ}?ÀÓ¼¡ôú×ì1ð'Gøkñ÷Æ_ÿdåø¥ñó²ÿü×â|ß³ 럴>¾¿¾4|w×üq¤üpøx¾ð'ĽãmªÙø3Dо ¯„þ#ø¯Ä+𯞺Ëjþ¸ƒJ‹‰áü-PÁTŸÎ×ð¹V2„*ÓÁBKœâp˜l JÏûaÒ¥N_\£^­iÏêôiÊTªWŽ.ÂÇG>*öµ£ê2Xz¸ª3qfœðtjÕ® ¾¢¥6½„鯋«9¨ÊtZª¾p¶ÿ‚Ü~ÕóáßìÂ2S;~ß •çÅg,B†gÁTK$ ÿ§ýªŽ|<ý™îá%Ñ ’GSâ•$‡*§*r÷‚«¯aïØWáÿ‹i«ß|'ø—ûRÛ|5ý±| ðÂãá'Â;O|{ñ—ÄúÁ}7â‰ôÛ- áWÆßþ%ð¯ü\ûψ m~(üM×>*Áá}[ᮕá-CÁº÷Œ4ßëSy–“ð×öJý›í¿àžâøGã xËâ_íWñ+OŸâGÆ/‰žÕþx_àíÏðþÆË[øÓðòk)üŽt…U÷$MÛvóÀáI;AsÕ> ø3áxßþ mÆø“öpð¥ïí/û)YÞkÚ_Œþ1ü5ð÷Ž~|Hý·þ!øoÄŸ´Š´¯ˆÞ3×>øÇû[èjº'Š5/ ê <'{¢6¿à_ xbæ ^y¹Ïˆß²×왡|{øsàGö@ý±¼-á3ö£ñ—‚õÍoÀ¿þ.Ûü=ø“ð“MÐ|[}¢iz>§â‹¿ J¬){g|oñ÷Å|7øöY-šïÁ𗉢6Þ ×nôMXÖ5[=;ä„þ`wþoï°dŒuÈÀåvî‹êòþà Ï „Ì0¼5‚Xleb(ª´«S©ìêÙÇÚSu›„œ]Ü%Ë(ÞÎ*I¥à⸃‰0˜ÊØZ™®#žISŸ$á(sE¯†^ÎÍ+hÕ“Jéµi¬¿ðVÚB`7xö|ã;~4…eµ£@#Çqi¨?à«´Yÿ™ö~¹øV™{×ZPqŽyHù¼¿Ê›ûŸ#œ?w ¹˜ ç÷pm˜#'iŽ3•ò¿â_РÇðã¼÷»ìLž0~aŒg+·1tÏÞRIpÞ^®õ÷kyÓÄÿ`ø£ˆF¿µqV»Òñék˵m¼¶òºýJƒþ ›ûCË÷¼ ð9 ¯ü*ØÃ'ï å·jƒ<’@û@´ÓðTÚõð_ÀeõÏÂØ29aßUãò8 ?—ù…d˜ <§]¯Ñ‡Íï@ùÿp»‡É´œ 2)ܾOüK·Ðc)õŽO}‹Ï?0Àåvæ¿âðM×üc™~¯_v¯t¿çêü×£⎠ç·ö®*×z^-o°í·–ÞW_¦vßðS/sdÉ࿉×å ­Ë)ÞT øàò  lc’|ä¶Ò_ø)7ÇryðÀáëÿÂÏŽXs@Fy$æ/Í»Ú>㦠ˮdQ´þáxm›Y°˜T#qò¼»-ä?w=ú¯ÌÜçbóÇ<Œ`œ®ÌÁ„|<à¾d¿Õܯüµ­­¿éçêý;WúÏÄÏþq]>ÔzrÿqÿV½¬™ú7mÿøã1;üðR>+ÿ ÆÏ*Cíîºç$vŒ£cs £¶Ð_ø(gÆÆÿ™O௿ü[-<`|þ·€À$n’@ÞÑþzØ.Þ62`8ÚË–\ȃù ×nÒ~\„+óy^U–äAǯ~ÿ9Ú¹n9ù†grìßñ¸/¯õ{m:Uî¶ýîþŽûû«VˆñF~êrÿjâ­¦œÐëoîù.4î¿A­ÿoߌòŸŸÂãà¿ð­tâWæL¸Î ¤20ûâx­o/íçñˆõð¿Áßr¿ 4³•üöäñ‘’ €r@Ë/Áö)´å˜ð§å?3.^!Ëy# Û>a”Ã!L~çȰ،c`uQ¸W<|½F2§+Œu\nHÿˆÁœËþ1ì÷U{/úz¿7×mm?ëG{^_í\U´Òð·Oîy.ªÖé«_xÛþÜ_%bÃ?GÞùSá¶—¹@“j–,ù+‚ƒÃ eWÅiymŸ‹$sᯄ™Ç$|7ÑÈku$䎜Wâ‹1†ÆÔ.vª|Ë™b˜ýpËÆÏÝìx6'•äiúÈ8û¸ÀǪü­ÇÝ>Ÿ)Âãñ÷—%ÀÌ×ú¿µåöjí§ý<üy»ûÛ´£Åăö¬ø“(%ü?ðÅ~goÃÝ€…È{5ÉÛÿt£¡VÞr[]OÚ“â#g:ÃAÁ?òO4 N8´'æ# HQÁÜTndùbÉ0?Õ"âI9Q‚¹uÿ¦òÛ?x>_.D ¶/+ʲ֌c°Vê»”|‡ŒymÉÆáv»)·tY¨|!wÿßJ¿ÊŸüü¯]ê¡Å*ŒÃþa$œ3ÀÍ éᩌ~ënR0Ã"ƒÈä}œŒ/–Qd~_“g©ç§H߆\ã9àyG‘½´m9;áÛ¾,cÀÜ$Ûÿ„,ùUíÓ—ç÷Š Aœø¡<+‘÷0pÚåNæëµ—hªþtvý/Å?‰º?Àï x“ÆŸþ3þË¿ <àë«{/ø×â.•¦ø7Á¾¹¼Ö­<7c±â¿x OðþŸý¡â BÃDÓÞçQŽ;ýVþÆÂÍç¹¼¶Ž_µM¸ýÑ\¤|Ã>OAöxþGÛ÷p¾^ÄM‘ù^M—ÿ6øuðÃÅ þ*|Zø‹£ø&û[ýŽüQãÛ?ৈ>%êí¾ü:øñû>xkÇÞ%øqñ'ÇúWÁ+ëˆ>.ðO„nî/¯|UàíMñ=ο¡=ý¶Ÿámk[]&ü»Ä\&SÂÿØßÙy&T¾½,r¯íðó¯«Çéò/o]kÔRÓTÖŽÇÛpf'0Ï^b±ù®bþ¨°~ËØ×/ãV¸ñŸ£é¾!Š{Ojú5½Ž¥weïZn­âûýHÖn5„|7ñOň߼߉~*ƒàø*?øI¿á6ÿ„›ûû¾-Ó5 ÿ¹×lì>"Þx×Àš…nüe¡|M,ÎŒò,Ç0y.Hñlã(ÀÒk>_aŒÂæõ«óSúÂæ›ž‡,œ£d¦¬¹Ý¾ž¦¬s\ f™·±¯–æXª‹ë‹™ÕÂârŠT­/e¤Tqu¹’NíÅßÝGÙ?Ú%ÿ¡·àŸþËÿþvøIÿPý¢#øçÿïñgˆ¼)udž¼øã§øE/t¯ iÞ>(·ðÄ¿ø>òòh,ìl5[ ê¾!ðD~#Ðtýz+ƶMQÖt#^´û›á¿ðOoßµWÃoÚ«áæ±ÿ.ðÆÏŒŸ%ø'ªi߰ׯý[Æv´·ÃŸÙ?áÊY±ø—û=ülñ—ÿƒ ¼3à¯Û_XðËøzÇâGí‹âý?Zпk K“á×ÃÿŠšv¡ ë> ø“æ?´Gü¢?û8ÿëF|r¬ð˜º9–?UrܪL[ƒÅa«à°Ò£Rgžå957Z¢”] EjrN+Y˲f•ðÕp8Ü™ÓÇæ5¡ŠÌ+á«ÒÄâZs¤²ŒÏáìãiF¶ŒÓOìöv^íÿ”ÿ‚KþÑŸ·íOðûãÂ/üð7û6|#øo{gñ#Äž:Ñõ××4y|Wâ{«Ë;O |6ñ}Œš[ØøËJŽÞâM^ÎôÞ[j›;uŽÎúOʸ¿àÜïÛn5P~(þË6ø®BácT¯À¸þ\¡ÇÊ tUEòÒí·Åÿò´ÿ±_Àÿú…ø~±´í+TÕç{m'M¿Õ.R&íôë;‹ÙÒt¦x­£–E‰d–4i „")!Aú£ÆŽ8ÈrÌI—WË£‚Ë©<65rêujªJr’S¨æœÝäõjâÅðŽMÄTÅâ!ˆu«Kžn5åó4¾—º´èïæÁºÿ¶¼l¬ßÿe¢A+ão‹(Â@ÿ…°,¥Jɤ#¤†9bÚ‹þ èý´T‰¿³x4ø§…ÀŒ»~FÊ>Uà(E¬?Ú7ü þ4ÿ¡CÅø Õ¿ùøAüiÿB‡Š?ðA«ò%zoÇÏݯ_+ÑYÂM/þKò9ßäVtñ=—ûL¶ÓM¶½¿–?Œ[ø7Ãö̉•›âWìÑ€|iñW÷cn Uÿ…(¹`v•!ã )ØÑÈRXvãÿ‚þØÈ¨§âOìÍòªŽ'¶Ì8 ð`näŒÈ6ƒ’yRC±üsö¼D@~"~ÍÀª¨Âø¿âfÑŒgø6ŠGap6ª‚/ëëþСâüjßü‰Gü"·–œx‚ò×ÂR¿6Ö¾"µ×!½»ŒpóÅc§èú•äVªÄF—wZÛ]Ì'†Æ[©lµ´™xñâ$å_+^o+¥¶êæ’Ùv»·[úiû¼N–Û/¿áó^KF"–ÿðBoÚâ |Bý›É ¤âï‰l¹ ß~c’ œ“Ê– ˜¿à†ßµ’")øƒû; ¡FÅ¿6‚6çøBŠG¤h2@EúÒþÀÒèxð¿þxÓÿ™ ?°4ŸúÈMÓÅ][_¬K¦ßgÏú³?“Ëoø"í[ +7¿g†Ã)ñgÄbP(líÝð‹“ó r£‘¶O*Xvcÿ‚(þÔè~Ï«€>Tñ_ÄR«¼ø´êãåQò®€‹õUý¤ÿÐñáüñ§ÿ2`i?ô@Únž*é%þñ/–œ¶ëòù3ùe¶ÿ‚.~Ô_ÇN6³Åx˜w|(ùˆ,Xž6*€®"šgð‡üKöçð7ÃOŠ¿<1ñsà.•ðëãwü ð´<6š‡ˆ¯Wħៈ'ñG‚q«j?îu½û[º¹½ú†ý£¼Zê¢öÉa¶·þŒÿ°4Ÿú »pÄ^3À!ãbä›)mÁpAèbˆ†‡ìº«ÿ¹øþ1ÿwÁßoø¨ræöx«Þÿï/­¿»é篡ømÿÅøó]þ,øDv@_xɉçáÚ–Ü£OCEHÄ?dÕ_ø&ŸÇPGüU_ ~¿ÛÞ0$}1à$ôî:qƒ·gïGü þ4ÿ¡CÅø Õ¿ù¢ŸÁÞ.µ‚k›Ÿ xŽÞÚÞ)'¸¸ŸCÔá‚!C$³M,–«QE³É#²¢"–bRüjãÖÓu²õnÙe4º{Ëóõ ‡¯ÍìñW½ÿÞ_[wÓï^Gá}¿üãt;Añ?œ+dc^ñcó£ráMß(ÇE;£Œ†ƒìš‹ÿíøÔ¤ÅOð·ŽÿÛ~+$sê< ¤úu6†?Ùš*?â5qÎÿXËðÝOËû÷éýicýAáëßÙâ¯vÿÞe×þÝþ¾ãñî×þ ÷ñ’ƒâO†C€+­xˆíÉð2d0]¬@VÂ. JÛi/ìñHÿŠá¯øœøŸ#’sǃ'Ôr8*vÿ\¨¨ÿˆÏÆéÝWËoÿbê^Zü^^ž[Yÿ¨\?{û g[ðêÞ r2b9ÉðŠ[aÝ£( /ÉŽÓA?c¯‰«ŒëžÆ êzÿËÁgÂÜH åOpWô–ŠŸøŒœm{û|ºÿö/§åýÿ.¿.‚ÿP¸{››Ùâï§üÄ˧ý»ýz¥oÏÙ/â4GæÖ<Ü@MGZÈ,ÑIÿ„Y ÈŒ «±UmQ‚+;ëû*|BþC j:ÞÑÁøoœqƒŒp ¿è¥ÿ‹¿·Ë¯ÿbú}wîûßñ°¨<=~ogŠ¿ý…Iùõõ÷[á›oÙ—Çp›RðrÎÃËÔ5sÍéÿÜ`î —*†D…ÉK[Ëû7xàuO ôÇÚ¶ËŒø3Œ8c#oÛTÿÄ`ã;ßÛå÷ºîíÑmÏÖÚÚÞVb\ñwT±WóÄËÿ‘ÿä|mû?øÂ†¾ð²üÎÀ¥î¦HÜÈ{hä°p6€È¾XTòRÚú| ñrÿÌCÃ}ÇÚõW´R8þ•À+µ¶”úŠŸø‹Üeÿ?òÿü §Ù+|[;kÿ 5À<<Õ,Uüñ2}µøwÑl|ÑoðkÄѺïÃù ­Ý÷ËŸ/åûA.6å¦ÅDò£¶¾Ÿ §®êš†±¨µ~iM©ÝÍ{xÖzN‘ð.ÇIÒíMÄò};K±³Ó¬¢)mekomP§ÜÔW•˜ñîs›ûí<6QŽú¿´ö —ÆJ—µöj§"U¹Õ|ÝùQÛ‚á<».öŸPÄf8OmÉí}Ž1ÇÚ{7'Ošðwåç•­o‰÷?8|aûkÿ<1®x/Æßµ÷í]â x“OŸJ×t gÇ ¯tÝNÂà$6òü*pÁ%†UÛ5µÄq\ÛÉñG"{/ÄŸÙËâOÄm~ ^Ú§ö„øy¥éú]¾¢ø7ᯉ~øwš-„W7šÂÚÃwðWÖõ ­GXÔõ]^÷Qñ¹¬ê>~ Ú}­Õ®…§èÚF›õÍÅ+ÅF…L,r¼‰aêÖ£^¥/ìØòN¶©Ñ©%í~*pÄWŒ_j³½î­Òò .µÁ7føm£kZψt½;âþƒªÅ¬xŽãK¹×¯ïüYãOø×ZŸQ}AðÖŽ»µÞ­¤Z~e i6xÚixkòKþ [ÿ&C©ÿÙOøÿ£µJ…ÄXšÔ«à¡Ê°”ñÐ¥C<& Q­:T±8|d`ª{IZ?XÂQœ´×•®¬Ö95*u°ø™ã3Lð•'Z„18§V”jÏ[æáÉÉPÄUŠ»ÓšûŸ²¾/ÿµ§ýŠþÿÔ/Ãô\~ïÁz?—ò}¯Å#ûVÏ—í?ÙúO…~Áö¸ó¾Ãý§©}ÌÝöoí ï'gÚî<ÃÅÿò´ÿ±_Àÿú…ø~‹¿ùü?ÿcG‹ÿôÓàzù×ñUùÿéq_‘ìGeè¿#à oöøñ­üOøÇáo_³Ç‚~)ø'övñ¶ðëâÕ÷‰~>Üü0ø·­øËQøIðËãÎ¥£ü øwsðoÅ üq»áŸÆXøOPø­û@üÒµ¿‰ïâ? ø¢ûÀ^ Ѭ¾(ëCj¿> h_|5ð'\ø¿ð»FøßãMø;àÞ«ãÿ éß|YáËX|Aquâ |<»Õ¡ñv»¢[[øOÅ3ϪézEÕ„0økÄÉ:¦¨µ·åïíŸû|iøùáÛkჼ û!øÿÂ?µÞ·¨|að·ÄßÚ>k#ý>4ÚþÈÿÿe­þ_„Z_Âiš¶¶4Ï„¶ºŸ†?h;ãG€üYðšÿâÖ¹«Ú|ø“oð²? ühí¼kûø¿ÄµÇ>,]Å? ¾(þÐß?imgWñíQû\x&ÃáçˆþøCà‡´_ Aû|/Õ¼?û:ü{ÖîuÙ·Ã~.ðׯ¿‰ÿ<9áøÛJ›Ä >(øsà>á/ŠO– -mî·¦®öŽ÷•·rÑ$ýÛ$î˜kø­ÿYÀ×}¼´/ÚWörñF•ã­wÃ_¾ ø‹Dø]àŸ |Kø™¬h_| «i_¾øÛÁ³|Eðgüu¨iúõŧ„|âï‡ÖóøëÃ*ñÚ~…¯ø6 ¼O¥_Ýè‘=òžý¥g/¬ÿ„+ã÷Á?Âóÿ„ßþŸü"ÿ| âø\?ð¬¾Ñÿ #þgöN½wÿ þ÷Ù.ÿá7ÿ„Kû_þO²Üo}ƒÉ“oå©ÿ¬ñÄŸ³‡ìAð[@¿ø]á;ÙköCÓ¾øÛNðо |+°ñçÇí ö“ÿ‚wþÔzׄ¾!|9ð¾…㟇ú'ÆþÈ?-/ø'ûixVãÄ–??hÛcÆ_>1üzÒ¿aüø—¨|Iý¬æ[ý¢?á Ñ?cÙõýbÃÄ'Á_ hÚTß¾i^ñE¦ƒâ¯‹ž*9iÙûïy%µ´½›¶¾óWÑ;-5m0»íÛϵü´»õ±õä?¶Áojÿ³¼|{ð»ö…ðÇ_ÚÄ߳ƣãÏ„¿¼'ã_xÄ~ý™>6þÒ—o{àçñF™ªëcLøK¤hw>ŸTÐ/ì¬<{¦ø¦[Ç·²µÒµÏ¹ñ·Ábï·߷íeûqxÊÿJømû=ÿÁM~ë7ÚįÚá_„¼M¡ÿhx›ö×øfú?í>ñ<a¥xSâ/‹P´ñ6±‘â?ÝoÈ'Àÿö+Ýÿêiâú$¢¹”]×"¾©êç›Z+-4ê ý­Ï{î~e|Vý©¼eû8xËö̲ñ¯ü,ŸøF> ø/ö•ý”<s>•à Wâ–«¬iW¿uOÙát¶žÖ5o‰>6OÚ Á_ õ)|Wamã_Cã/ÛßàÇÂTð$>ÃñŠ´ÿ‚Ž|øñáìCñ£â×ü,ÏÚ Bÿ…ðOâ¯Åï·~Ïÿá"ý >&x[ÀËá™?ᜟâþûA^ÂØÕ¼wà={û[à_À¿‰Ÿ>ÂÆûˆ>$hZOÃ?‹·Ÿ>×ø£ðáÏÆ|ñÏŒôϵë¼msã_ l³Ð§¶×|ý*_#Â^.þÕѵ;½OÁ:gÄ3áŸÇ]+AÓîôŸ±|xø ðâr]oáw‡ü¾&ïö[Ò¿áqëßü=ñãg´OxÛÂ_þ*üðV¿àÝáÏʼnþð·‚¼áŸx·Äoà;¿ŽúO‘áO…ß <=¯x á߯|$ñÖ…ðöÓBøð÷ÅZ'Ž~.éß’p¶«ìëm5VJÎÏ¢o³“\Ú wü /ÛõÓmÏ.øYûxâ͇ìͨèÿÿhmßöŸø]£üjðìzÇ…þê7þøUãè~ø}ãi~ øâÝOÄú'‰õ?øëŲü´øÅ7ì×áψ^ñí‡ìéáèÚå×ðSþ ðÏÆžø/«é^ý¡¼kðÛÄZ'ì³àÿþÒ¾6Ñ~é6 ø»ûQü?ø/⯃øËá/xÛÃ.¹ø£ñßöø/ˆõÙ÷àOŠþøWÄ´è%ño…|9á/ˆŸð®ýGÃ?°·ÃŸ i_²w‡tˆÿŸ²'‚~ø+Áž›Åúé^1ÿ…!àÝSÁ ü[â{„ðŒZß‚|m§èž"ñ^™ã­{ö{ÕþÂ÷ðo‹5߃ߴ5§Å§ü,ÓøŸ‡?ðMÏ„Ÿ ´¯†þ ð·Äß‹ðÀŸðÍÚ߈¾ jŸÃ Ïü^øŸû&x7àÿ‚¾ücø‹â1ðª/‹šo¼/§þÏõ íá7ÄÏ…ÿ “âïø›Bÿ…Yâo‹|1«Þ|Bм¡|Kÿ„³Lñ×ìñ¬üiøFò|EŽ KþREàßû2‰ú¾>W{ð—öKøsðoþ‡þkÆ×ÿðÉß²÷ˆ?d¿‡_ÛÚ–…uýµðçÄðÏ?nÖ¼kýŸá½/ûGÆÑÃ4øìš–…ÿ感ÚÞ-ó¼7?Ûôì Rÿ”‘x7þ̇â_þ¯„ÔãËyòÞÞÎ{úéøY¿;ÚËD;Û[o½Wër}oöøñ­üOøÇáo_³Ç‚~)ø'övñ¶ðëâÕ÷‰~>Üü0ø·­øËQøIðËãÎ¥£ü øwsðoÅ üq»áŸÆXøOPø­û@üÒµ¿‰ïâ? ø¢ûÀ^ Ѭ¾(ë~Ù¨~Ò¿³–“ã/ˆ¿µ_ßôψ?ü}ñ/â×uо²ñ—Âï‡:f•£ëº—þ"øbç^‹[ðO‚týÄ^Ö/¼Uâ[3B´ÒµÝPžþ;MNÊiþx›á§íað»âïí¬| пgŸøGöœø£áŸ‹ZÄ‹_>$øoÄÚÚÚ#öz¿ñµÿŠõ/…Òê_­ô _ŠÚßÈÿàŸ´oÅß„Ÿ?g-+Rø'¥|>²ñ·üWã‡Â_Šš‡Ž¼u'Œ¼iñöëøaûlxCMøgñá=·ÂGÑ>ø'á¶·ûpø¯¾+xkâ÷ÅíwÅWÁýò„:ßÅ Ý7á’QƒµÚвÕ=oevîÞÒÑ$“Öû ××ôÛïêÿô£Ãÿµ×ìŸâË õO ~Ó߳ωtË_…Þ%øáu¨øãWÃmfÂÛà·‚üGªø;Æ?ç»Ó¼KsoÂï ø»B×<-â_É"øOBñªèz¦­k©é×v°šWíuû'ë¿ ¼KñÛCý§¿ggà‡‚õ¸<5㌚WƯ†Ú¯ øŽêoÛÚøÄ¿í¹‚îÓ\›ÅÓGàÆöÏ~Ìÿ¶'Å/üGøÙ­7Âï†þ9ñ¾‰û<|3ñìýð—ö«øõá|MøUðÿö§ñ5’^þÛžøð³ã×ÀÝoWø‰ûPèÞ9¹ÓþüÖf¿°ý´ß†ºÿŒõ~ÐÞ;´øxrBÉóok««§¥ã¶öoÞÒ)­lž†¿×]µòë¦ý¨nÿm‚×ß#øEàïü.Ôü]ð»ö`øñám_Å?¼'áo‡ÿþ ~Ó?µŸ‚šŠ>x£Kj~?Öìµ=Öišw…íü'ã|OøðþÓÇúEÇŘõß ñ?³oíýð[ö¦ýž~|gøañöy»ñw‰4OÙ{Pø­ð½ÿh¿ ê3| ñí­øKE_†~3×ü=¢k:¯Å]OYñƒ¾ø3Äž ðuÿÅߊ¾Óþ‡ð=Æ·¬øoâƒßðMŸÞð¿Ù5=kátzŸ¾(þÎß¼i¥Oñâïżaû8ÿÁbþ0ÿÁCômJø±ñáÌ>øù­øÛàßíãoxƒÇŸ´ï‡þ#µø«ð»ÃWZ³xÛLø¿â/|,< û~ÖÏÃoاÁß“öyðN§û|.ý–> xr‡¿~$üO°øÅáÏ…ßµ‡üÛã·Äÿërø“öøEqð³[²ðì"Úw€üakñFÃÆ#ø¤¶ž!ñÏÃý3Á'Wñk奯½´’½ú[Wn©ËM6ø®âziºÕvÕ~ZúŸPüÿ‚™üøƒ¢|¾ø­­|.ø/©þгαûGørÚção„õíÀ¾ð7ìóû,þÐü ñk]ñ&ðâãÁß|+áÚY¼{¦øbÃDñ†©û<ø ÷ãïˆuÏéšÑðŽ‹õ·ÆMkÂ>-ø9ûFxrËVð牥ðÇ€ü{àÿèV·úf³'‡µOám¿Š×ÂÞ/Òâ–å´OPð_‹ü3âA¢k0[Ý]ø_Ű-dÒµ½>æçñcÀ_ðMoþÏŸ5¨¿hÂIðû^ý—¼Mû|`Òÿg ücø©ñ>ÇáÏÆ¿Øþ Ÿû'x¿â' ø7àoÄø¿ÆÞøÏû Þ[h¾…ÓèKð“â øÏâÏè7 u¯…>'ýø=ðÏ⯃dÏŽ¿?h4Ñ4ïÚWö˜ð]÷ÇÚ/Â~ÓáÒþü;øªß³Ã_ƒ× üfž3ø•q.‰àü!ðެk×?üižÿÂÁü ®^Š9çüÒÿÀŸù…—eýÃ/¸ê?á/Õ¿çÓÂÿøCø/ÿ”—ªë7úÌ–Ò_5¯ú¯Ø­b²Ó´í.ÚÞÛí77†(­4»[;UÝuyu;¸‡Ìy&rîÜc.ŠNRjÎRk³m ²íýIQHŠ( ¹{?øRÇâ}¯ÆX´+ þ#Ùx Uøek¯ê1¶­> Ö¼C¢ø«RÑ×@ÕóÃ~mÆ»áý&õu†Ñιn–Ïem©Caw{kqÔQM6µM§µÓkNÚÔÂ_«ϧ…ÿð‡ð_ÿ((ÿ„¿VÿŸO ÿáà¿þPW/E>yÿ4¿ð'þaeÙ_ðËî:øKõoùôð¿þþ ÿåð—êßóéáü!üÿÊ å裞Í/ü ÿ˜Yv_×ü2ûŽ£þý[þ}žÿÂÁü £þý[þ}žÿÂÁü £þý[þ}žÿÂÁü £þý[þ}³qc6©¡h·vÿÁkäÈu?û)ÿÿôv©_GþÐßòv¿ðO¯û(´'þ³Žëçø-oü™§ÿe?áÿþŽÕ+¢žµpÍêÜ]ÛÝþòªÕõÑ%舖Òõ_”OÙ_ÿÈZÓþÅÿêáú<_ÿ!kOûüÿ¨_‡èñü…­?ìWð?þ¡~£Åÿò´ÿ±_Àÿú…ø~±—ü¼ÿ¯‹ÿoû?áûiË×Åý±¿áoÏSõ áů|jðž­ã YkvfñGã‡Â[¨¹’ê+ûÏ]iWz¦›£jsÝé>£_͇ğø'Gíã?ëZ¯Šüñ³V´Õ¼mûS\|?¼Yû ZÃ<øûâGü7öÚøåcñóÄ_¿iŸ‡Ÿ>(þÌÿð±¾|gý™üK¤|`ýƒ|?â¯ÚWÿð«µ9üsðúˆ?þxvëõãöÃø=ñÆð®þ*~ÌÞ"ÿ„/ö‚ð_ü%߬<[ý‘áoÿd|ý¥ÿáðWÄ¿`øÿSµðMÿü(ÏxàÏí‹ý‘6u⟉¿ðËðÏz§ é?¼Uw3”"šJjÍËÒ6Úîýv½´ßT »m®Ÿ¯÷]ýÇÚôWàØÿ‚tx›Á?¶?ƒüAàß|l¾øÛö]·ý™×þø·ãOÆ_‡Ÿà£þÿ„Rømñ¢}{àÿìûªÏðOㆅñšÓÃ_> øïãí/ã müýŠ> |&ðçü×A²æ‰g¯|ýž~øKâN»¦üBð>‘áÏ‚ÿ,l-ü]ûHk×>×4¯ü%ø£â™./|}û/?ƯÿÁ@,%ðä×ö³É¡øƒYÓ×Q¹Û¯ç›ötýˆ?hø[önðÇŽ¿gÿ´„¿áÛš§ƒÿk¯øHþjßðÊ??goƒŸ±ÿ…¿j/Ù#þøƒ'íáïøYZ·ÁÚÃBÿ„à|{û?üBÿ†¢ó¼]ã»-'âÆëß {_ìûk¿³v…ûÃû8ÿjÿe~ÅðWí‘§Çâ?‡>2×uŸÚ«Á¿¿`›ï€þ-ø‘¬xçâ ÂÐÿ†Lÿ„Sö†ñ?Á={J×|egû=|9ðn­à_Ù®ÓJþÕøcðëÄ­Â*þú}’·f÷æÓk+êÞöVl¿“ÿ-¼¼ÿ»öº¸Ÿ‰|ðáÏþ-|EÖ?áø}ð»Á>*ø‹ã¯g꺷öƒ|¡_ø—ÄúÇöV…c©ëzŸöf‰¦_^ÿgèún¡ªÞùfÓìnîå† ;jùçöºøKâ?¿²í=ð'Á׺&›âï_³ÏƯ„¾Ô|KsgáËüGømâ_hw¾ »ÒôÝgSµÑ-u=fÖ}VçNÒ5[ø,#ž[M6úácµ—5fÕôWW~WÔað[ö„‡â׈üoàü'ø£ð'â§ÃýÁ>0ñÂÿ‹S|*ÕüJ¿ñ΋àYkÿþ(üføms¢x§Ä ~'øzÛG>;‹ÇUÿu+ßxKEÐu¿ë>(?g¿Úgáÿí1Å‹¯‡ÚÅ ßàÿÅ~ø’‹_ "ñôñk>-Ñmô½À¾.øñQñ.©ÝZøâÿÞÕnüá/jzÏ‚ôÓQ¼¶¿,Z´“W|¼Ëw}ß]Öû‡õçý|ŽÛá§í3ðÿâ¿ÆŸŸ|3¡üQÓ|]ðDø}­øÓQñçÂÏ|3ðæ¯Ä|eðvŒßnþ èþÔþ"èj¼W;|Bð†‘ªü*×ì/ôI|ãÏÜ'ˆ­|=‰ãÿÚ“JømñÃÂ$øAñ²/‡ÒxÛá§Ã oö‡þÀðnŸðsßþ1ë¾ðŸÃ/ý_ñæñŸÇ_ð•xÇâÃoÿÂ{ðàÿÄ_„žñO¿±|añ ÷¾1§ÃlH<ñÁÿµ‡í=ñÚë~-ðŽ»û!þÊÞð>á­cÀðøÇÿ>üIý¹ücâÿø~ÓÅ~-𾙥kgLøµðÚ +XñÖ¯àÿÞßø²ŸÅ¶Öú7‰®´?.ý¦üñâßÅ¿„þÑ>xÙm>ülø#ñ#­þ2xZ÷öj‹áφ>'ü%ø‡ñƒIøíð Zñî­ø£ãchŸ¼yáŸÙþFýœÿh= áGµŸƒ~ülø/ñûÆZ×ÁA(ótåå[ÉhùUú­SoK;v•šóý~×nŸ¡´QE@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@þÐßòv¿ðO¯û(´'þ³Žëçø-oü™§ÿe?áÿþŽÕ+èÿÚþN×þ õÿeö„ÿÖoñÝ|áÿ­ÿ“!Ôÿì§ü?ÿÑÚ¥uRþ&ü/ÿNÕ"[KÕ~Q?e|_ÿ!kOûüÿ¨_‡èñü…­?ìWð?þ¡~£Åÿò´ÿ±_Àÿú…ø~ÿÈZÓþÅÿêáúÆ_òóþ¾/ý¼kìÿ…ÿí§/EVeQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@þÐßòv¿ðO¯û(´'þ³Žëçø-oü™§ÿe?áÿþŽÕ+èÿÚþN×þ õÿeö„ÿÖoñÝ|áÿ­ÿ“!Ôÿì§ü?ÿÑÚ¥uRþ&ü/ÿNÕ"[KÕ~Q?e|_ÿ!kOûüÿ¨_‡èñü…­?ìWð?þ¡~£Åÿò´ÿ±_Àÿú…ø~ÿÈZÓþÅÿêáúÆ_òóþ¾/ý¼kìÿ…ÿí§/_ž^ý´¾#j÷—þ7ø—ðCÁ>ý›nÿj‰²_…~(øWãn»ñâ4?¼)ûUx«öCðµñ/àÝÿÀïiþðOÅ_‹ž°ð½†¥àŠußk¿|q⯠Ú|9_‰>~†×åï€?e¯Ú6óN¿øñOOø'áïÙ÷Jýµþ%þØzgÄ_|Qñ׌¾1øïÌý¼%ðü±ÎɬéÍsÅj¿µ×쟡|*ð×Çmsöžýžto‚4Öçð׃¾2j¿¾iß ¼Yâ;Y¼Aouáÿ |C»ñ,>×u»k ø¦ ô­/Wº¿†o x‚) Wѵ¶üòÐ?à›ž/³ø«ã‰õÍ+áw‹¼ ?ÅÛãOƒ¼eñƒã§íqñÇÀú—ˆÿk˜h5ºðFµÿÝ»ñ§ÃÙ?ÁÚ'…lioøÆ^7Òþ$øÖÿãÃÿ x¹$ð7ïþК¾ öÞý˜k…ž#øqñë@ð×ìóã_ŒžÑ?h‡çÃ?|pø“§CwðÿãMÿì°þñ'¿l¸ÿf¿|Iý¤~(ü,ðçì…ào†ú?Šþ#þÍ^ñÇŠþx‡Â^ø‘ñCÇ>øª|Zý¢_,:I½í+»?['e«øoi+Ø5íòû¯®Úk§^‡Úþ3ý§~ xCÅš‡„îþ4þÏ:f§à m øí¤xÏã§„üâÏ„ž½ø-ñ3ã^‘ªê–ßU¸moRðÃGÆéáÿÞ|=°´?‰Ÿm|K{¦|7ŸBñ/íßû'ÝCðWTðwÇ…ßü#ñ×ö†‡öZð·Ä/…ÿ>x×áþñ¦ÿáWŽ>,è~ ñ_‹4¿6™§k~%Ó<káo øwN“Wñf³ãü8Ðí<<öþ)Rµü¼ý®¿àŸ?meOÚz×ÁÚÂívâÛ[øÕñ‹Âß¾øÅž‡Yðä?ðAßÿÁ9ô?‡> év^4 kzÆõµ¼ðÂM;Æ>,°Ñ¾M¤éÖž:×|]m‡.¾½öZý£~!~Ò¾ý°¾&iÿüñÀ~6øaÁŸüQñ×Åë?~øöíø_â_Mñ—Ä~kz_®4Oø('ŒüU¡x> jšî«ð'ÃÔ>%é6Ÿu_ü|´ìŸ5ô}R÷¬¬­¾­ï²JÏ{†¿×m.üºéÔúóÁ_´ïÁoßüð&¹ñ§öyµøßñ£áw‡>)x;áO‚¾:xOÇ7þ8ðæ³áÍGÄ7^*ø4×vþñwÅ¿…ÂßÃþ)½ðçÄ­/À:5‡‰<9áÝGÄ2i*Zê6v߇i_ÙËÆÚð‰|~ø'âìOøSßÛ?ðŽüUð.·ý‘ÿ ý‘ÿ ûOû3^ºûü/?øH4øSßkò¿áfÿméð…mÿiYùß—Ÿ?àŸ´oÂ/„Ÿ ÿg-WRø'ªü>½ñ·ü«ã‡Å¯Šš޼uŒ¼ñöøaûøCRøgðëá=ÏÂDÑ>(x'âN·ûx}¬~+x—â÷ÂwÂúWÆ bò„:íßÂû-7âo¶~Í_±oÄoÙ›Bÿ‚{éþÑ> ·ü2ßìQã_Ù§âÆ… ëšï‚ô-wâ7ƈ߱‰þ*|OðTÚoÂëÿøH>Óÿ 3ã—Ä[¹üK£øS]øñ^ð•ˆî|9ÿ Ç‹üuà¡ÆÚ^š«lÝïÓUÊ“Õ|MÚÉ—}¿àm÷îõ]¬~¡QEq?ü%ÿ ÷ßøìž ¿ÿ„×Á>*ð—Ø~%ø+þOÃ›ÏøHô+ýìž?øuý½áoøO¼qöÏ'Å^ ÿ„ŸÃŸð•hO¡ohÿoþзÈg—꿵×쟡|*ð×Çmsöžýžto‚4Öçð׃¾2j¿¾iß ¼Yâ;Y¼Aouáÿ |C»ñ,>×u»k ø¦ ô­/Wº¿†o x‚) Wѵ¶â|ûhüñíñÃöU×<{ð»Áþ|QÒ|àï…Ú¯Åo ŸŠ¿ü9¨þÍŸ?h‹¯ˆ^øavúW‹—DÓmþ#ø§Ã3®—eâ[Ã/xŽMnmGGðÿÈwÿ²?ím'ß ÛIsà[Pxÿ^ñçÁß þÚ´÷ìí®ø‡íºÃO|ñ¯Ä¿ø(À¿ƒº'í%ûKxÛà—߆ú·Âë O‰<%ÿ +áÏ|ÆÏüOø¹û.øãoÆ.ý›ÿ`ÚÃáGÃ? ~ÍÞ1OÙæ_…mñGþ Çñ§Å?ü5ñgâN«ñHñì-ð7öðÖ¹àüÕ?gÿøsÄš'Ä?‰?±=Ö¥xßQøåáKýÀÿàñ­ßµ-{Â’|<ñª4ìýíu¶«Oykçe{«{×\®û-tüíéÒ÷[õÚÚŸ¡¿¶í£ð[ö$ø-ã߉ÿü{ð»Hñv‘ð»â·>ü)ñçÅo ü0ñÇoü0ð›ø…¾ü=o½Ö§¬ëzΧuáÏ ³xoÞ)¿Ó/üS¢¢_Ü_ØX^úŽ¡ûJþÎZOŒ¾"ü:Õ~?|Ó> üðM÷Ä¿‹^Ô>*øËÆ_ ¾éšV®ê^?ø‹á‹z-oÁ> ÓôOxX¾ñW‰ltÍ ÓJ×t}B{øí5;)§üòý¥?a¿ÿð†þÓ>ý–‡‚|u¢~ÕŸ±B~Çž ¾ý©¿i¿Ú|(þÆÕjÝcJø‰kñÄ¿ÿjˆ?ÿ¶îÿkÃ?„|e⇿ð‚é_ ü=¡xwÄúÞ‰â«}?áωüQÿ‚WüRñž•ûKx+JßZxóþ ãÏ„¿|uûXþØúÞ•kñöÜðoí3¢i¾‡ö-¶’/Ù‹à7ü RþÔ~ ð–»ñÓÃWußx7ž'× ø/ |Aøç{®|&i´¯&žºé{YZé½,î­vßįÿ]6ûþåµ×Ÿ‡_´¯ìåñƒUÑô/„¿¾ üQÖüEàCâ_‡ô‡_| ãmW]øs¤øÊûáÖ«ãýOðÖ½©Ýê~ Ó> éš—uYC>…eã->ûÃ7ñkv“ØÇµð—ã‡Áo¾½ñÀŸ‹ÿ ¾5xGMÖî|5¨ø§á/ü'ñÖ#³°ÓuK¿ÞëžÕµ2×[µÓ5#Q¹Ò§ºŽþ WM»–·¾µ’_ÍÚWþ Õñö‡—ãöƒÿ ç‚|៎µÅ_ŠÛþV»â wÂÿ~&ÿÁµïø&ÿÚ?áþÏÑ4ýoÆÚ'ÅÍoþ_øEÿá-Ò4-KáÍ·Úÿá7°ñ4ßðÅõçÀ†ŸWãOÆ/Ú'ã¶…ð»À^.ø“ð»àOÁm;á¿Â_‰,øÉáÍ;ß¼YûAøæÓÆ÷¿ücð‹à>¦úß‹õ?Ú3WÐn|ÃW°ðÕ‡€tÝz/øŽãÆ·Z‚åÆº•Ý“µÖµ¦Êú_Uk[_‰¿×]¾îºOìµûR|iøÅð[Á¿´ïÇo…³Ïìõû:øëöyðïí§xÒÃöªñgÄøWÞ'🇾 Ú'ÄÍÆ?²÷Áx3DÐü ªjú·ŒüYÅ-~Ã÷ú*ZÅgªh÷·^"Ò~‡ø‹ûJþÎ_ô­c]øµñûàŸÂíþ6ÓþxƒXø‹ñWÀ¾ Ò´/ˆÚ·ƒl~"é^Ö5ëÚe¦™ãmOáö§¦øëOð­ìÐk·¾ Ô,|Oma.‰wôŸšÿ²'ì[ñ§öqý“ü_û;ZþÇ?ðMø»Qýì~ëŸ<3ã?xãßµ/ÆŸü6oxZ÷ö®øqìuð_SñÂïêz׌uïˆ×7¾"x²ÊÃÄšþƒ§i¾!¸ñV©¯Úñ7?ðLoŒ>¿ð†§áoë®>ëü7áüJý·¿jOÙköøÑàÚß²V¿¨|Pý¨?k¿Ù“Àº‡Ž~$|Qø_ãŸÙß\ø5à‡xãáþµû6'ÀQªx¯GñwÀ?Jñ¸ÓrzÙ]Ù&µVÓW)%®š¾·²³@¯e§E~¿à¿‘úñªüpø-¡|Uð×ÀsâÿÂíã4IüKàïƒz¯ü'§|Uñg‡-añÅ׈<5ðòïV‡ÅÚî‰moá?Ï>«¥éVÃá¯K$êš6¢ÖÞ_ñ›öÊýœ¾ü0ð§ÆüRðLÿ¼mÿ ¿Vð׈´øM+UøsñGâßÁ¯ƒÐ|l±Õõ_i%÷Á?kþø‹â/Ä?S»Ð¼5àßiúºI¨]êÞÓ5—¾þÇÿg{–øAàÿ ~ËÞ4ýŸ|WãoÙâOˆ'®«ð³Uýš>þÌ´¯ü+ýüKgñCþ½¿ðÉžñ§Â‹ž>ý¯­|eðoÆ^8Ó|M¬xoã­ðF ¾4|ñmÿñý¬'Ò?e¿ jž'ýžSÂ?°çìóà‚ßí´ýkâKxã?ˆÿgïÚoþ ëûAü<ñ¿ÄÍvãÁ+¦|$Ñ>>iŸ±4žñŸ‚<-់wÿ³þ®ž/ÐüsûY[ø¼#à4£NêòÓKì›Vm÷³½•Úßfƒ^ßð6û÷o¦ÖÜý ý ?m‚ß|ûR]h~=ø]ñ#ãì³û<üMý¡ücû7é_¼'añV?|=ø~¾=µOøjÑüCâïèž$·Ô|-i‹5O^ØYÃâÿê1Ùê)©éÖ×Ä?¶Áojÿ³¼|{ð»ö…ðÇ_ÚÄ߳ƣãÏ„¿¼'ã_xÄ~ý™>6þÒ—o{àçñF™ªëcLøK¤hw>ŸTÐ/ì¬<{¦ø¦[Ç·²µÒµÏÍÚïþ Íû[~Ñþ&ñíºø³Á:õ¦­ÿ •'‡>*øëö¹ý§­4©´/ÚöAý«¿gŸƒ_ áý…ôï†!ý˜¾œ—ãïÃßk¿<âGâ7Äü.ñ?Å=oIŸâÆ?xMûoÚþ ñûFþÙž&ñ7޾-j_þk~?ðLŸüAáχ^:ñ×ÇÍ+ÃtÿÙþ ð7Jø™£ø—Ä¿ ?g»¿xÛQøƒÿÓfÔ>ÞøcÂZ“àß…7Úí·Åíg[ñŒðÛå§eykfÛ½ìíe¢Õ«ÞKf¶’»Awéªû´¾»ukò?W~üpø-ñ÷×¾1øñáwƯéºÝφµü%ñÿ„þ#ørÃÄvvn©wáûÝsÁÚ¶³¦Zëvºf³¤j7:T÷QßÁaªé·rÀ¶÷Ö²Kê5ðoìkû5x¿àψþ-|Døƒá=Â.ø‘¢|2ðY±ƒö¿ý®?n/ÜøsámÿÄÍsG»Õ~7~Öá}OJѧñkÄPøá_‚þø~ÃÂ×ñx—ÅÚÏÄ?ˆ7ôÿ ü-ûʲ’IµÚóµö×fÖK­Æ¶×úûŠ(¤EPEPEPEPEPEPEPEPÄ?´7ü¯üëþÊí ÿ¬ßãºùÃþ [ÿ&C©ÿÙOøÿ£µJú?ö†ÿ“µÿ‚}Ù@ý¡?õ›üw_8ÁkäÈu?û)ÿÿôv©]T¿‰…ÿ ÿÓµH–Òõ_”OÙ_ÿÈZÓþÅÿêáú<_ÿ!kOûüÿ¨_‡èñü…­?ìWð?þ¡~£Åÿò´ÿ±_Àÿú…ø~±—ü¼ÿ¯‹ÿoû?áûiËÑE™AEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPÄ?´7ü¯üëþÊí ÿ¬ßãºùÃþ [ÿ&C©ÿÙOøÿ£µJú?ö†ÿ“µÿ‚}Ù@ý¡?õ›üw_8ÁkäÈu?û)ÿÿôv©]T¿‰…ÿ ÿÓµH–Òõ_”OÙ_ÿÈZÓþÅÿêáú<_ÿ!kOûüÿ¨_‡èñü…­?ìWð?þ¡~£Åÿò´ÿ±_Àÿú…ø~±—ü¼ÿ¯‹ÿoû?áûiË×Á¿>%þÖµ½[â§…µßÙæÃà†ûC|pø-uðOÄ þ$ÚüU“ß¿hþÍ~1ñ¼´–ñwUð‹kz•ÇÃsãO†¼'쯅ä7ZWÀ}SÇ:3ÏwûAØýå_xörøñð»Å7þð/íà örÔþ6|Køß}àÏøPW:Ÿí>«ñƒãŠ¿hoˆ¾ ÿ…í¬|dÔ>EàŸ|Qñ·‰ü;ˆe¨üe¤üÔÿá мe¦|W²Óþ=ZLmg²zZéµmn•“³zYèÖ¶h—üoÖÿ¨]ÿÁC¿dÛ- ^ñ,þ:ñ·ö&“ÿ”Ú ì?hK¿ø\W޾#x+á/„¼Oû4ÛZ|,šïö¬ðN·ñâgÃÛxëöiƒâ¿ƒcÿ…£ðÃU¹×`Ñ>#x+R×vÇíÝû-ÇáÏx›Røƒ­øvßÁ¿ ¾9|eñ¾ã…?|ñÀÿfû†:ÏÆGÇß üYàâOµ¿øsãGÂoèþ ñg…4xóÀÿ<%ㇾñW„u«=jOƒ~&ÿÁ:> xkáßÅoø÷[ý•¿á”¾~ÉSü"¹ðßü ¿üûiþß¼sã/ÚZçTøÿ§íãoü>ý~ø‚äü(ŸöX¶ñWö?Äý+ÃÞ ßÄOi¿6üiû|@ø…ñvÓKñìú߈.>7kÒ|ð§à·ÄÙçâßÀ‡Ÿ³ÇÿbÏ„Ÿ x»ÅúO›-9i3Þ]u²I­V÷ûôIüAwÛ·âÕúô×£ï~‡×“þÜÿ³ùñMéâ·öw†|-ÿ %á-{Ú¿À¯öþ)ñÏÄoÙïãÀϾ-´ø=â[½LÓþ"Â1ñsâΓðCLðWÃüO×~?ücñ÷‡|ðO^¼ñ7ÃøO^ñMCþ ‡ðOþÇÿéW¾6_ë~ ý¥ôÿx[]ý™¿jö•ÿ…ñðzçö%ñW„¾xö~Ö>i?<[öß‚µˆ>-øžÇÃ_|Wsÿ‰ÄH5Á>ñõõq??`]wEðŽ•ã kž6ø¥ão…^6ýª~)ü?ð€<ðæw^øûGÿÁM¿gŸø(·Ã»‹ø¾+üyøCàWÁ?¼mð+Að¿Ä¿ ÝüSøy®üdøs7Š®<ã…^6›ÃÚ{íþÅ?²ÿí mñËÆß¶Oí7¢x[âOu¿PGð·Jð‰àëø|9ñKáŸüŸá¦—ªø—Kð·íûNøGÁzÞ‰qûêpxÃ>3Xx³ÃŸü?â­CÄ¿¼Gm®|(Є©Y»·nd•Òmë˧-õ½ïÑéèµíÛô¿_7ýoõÁ?Ûáÿlj?|ám;[Õtφÿ~xÁ¿¼ xã⯊ø«û'ü>ý«<-ñ Ã⧆|7½ D¹Ð|Y®xyÖOêö“Y|3½Õ5½3Sý >øgÄ?^WÁ¿±Çìkâ?Ø×ÂÃïüZÑ<_á´OÙòˆÃÄ ¯í¼Gâ?üý‘üû'êÚ¯‚µ3âd:gtOiŸgÏiÞ×|;ñÿÂwúÆ]çľ,·ø«àCà‡ÞUœ¹oîꬵ×Wm^©Zï[¼Â¼»ã‡Å¯|ø-ñã·Œlµ½KÂ?~xÿâ׊tï [X^xŽÿß<'«xÇ\²ðý¦©©hÚeÖ·u¦h×PiVÚŽ¯¥XO$]êV6í%Ô^£EJß]WUµÀü‡ðíÁñãNø·ñ;Nø¹uðO]ðOß³¿À_ˆÿ þx.çÂ?þxËö²øŸ§|#ø_ªèúïŠÿi_|LøŸàŸüLÖ4 ê.ø×ûþÂúWí ð“X¾ý«ÿf—ñ—‚t ü4ø·ûO~Ú^#øYûXx—àM×íûþÇžð÷ìóð?âÖ‡¨þ×~ ¿ñ'ˆþ&øâ‡ÄŸÚSÁÞ)²ð…ÜŸ¶/ìŦA¢xLø1àéï­­4ß‹ÿ,ºŽ¥§[Ë¥ÚÏõçïØÛöøWã-ÆÞ ðð§ö‡ü+ß ø—ã_Æÿ|$øEý¡¥_xqáFü ñçÄoüøýàíWZø{á?øSþðOü! 5ÿü0ðö'Ãïk~¿í´ƒßØŸ´oÅ_ÿð‘}§þoÁ?€?¿áþÈò±?áFxëö•ñ¯ü$_ÛßÚrÿiÂQÿ ý™ý‘ýaý‰ÿÛ?´õøH>É¢kÍ ¶£ötÑ+»Åmi-¹ÚÖöÝ&Ïø×Oëî>(ý–¿à¤Åx¿ÀßôøP¿bñ·ìû é_ ¯<1ñPÕ~Âúýe_^ðWíãÉü7…>øÛÄŸþ5üEøð†ïâ§Á_ø]~2ðJü1ømá/|QÐ|K¥K‰ ~Þ^8×ÿbÿÛëö•ð¶§ð»â=ÇìÃðº_|ñŽ•ðû‼ñ^Á¿à›³‡í‘¡x·Ä¿¼Qã½[Ç>Ñ.ÒµjÿCx«ö<ÿ„›þÇü\O±ÂìýµÿdÏÛþE´ÿÂ3ÿ »ÿ YÿïþF{íŸøNá?änÿ‰Oü#?ð°ÿäXñü"_ñSx§Â¯ø&ßü+/؃ö•ýásÿmÿÃCüÐ~ÂÇÿ…uý›ÿö'üûàì-ÿ ü"ð_ÿÂAöŸøQŸð´¿²?á(Ñ<ŸøJ?áþÓ—ûþí]Þ–û|î­}žf¯üÊ×wÕët-}wý-úÿÀ=CàGí/auð«âGÆïˆÿ¶gì‡ûN|+ðÞ· øSKñì}ðÃÄzu†ã‹‰¬í$øqqk¡þÓßµ®§ñCâŽu?ü7Ðþ|/ð5ŽñYñˆtO èñƽñÂÚu¯ð«þ Gð‹Äº¿íouñ'UÖþøGà&·ñWƃÆþ?|3ø€ß³Ïìýû2~Æ~:xûÇßþ!ø/Nñ͆·áþÔÐZhú;ø;Ãß<á-GÀ¾ñm½¶­âGÔ|Gðöø³ðÃÅžøññßàŸˆ5¸5ü{ø­àŸˆß5Ú†×ã÷Œ'øuð‹Æ_ü­ø7BøIû,øÂ_´ kþ+jÞþÆý ¿aÏÙö–Ô<}7‹uÝW[Õ~ß|(:6ŸðÏâ7´­m/fùœŸ§*íÊÕ—"Wz¦Ý½5¸k§Êÿ‡Ÿk÷õïõçŒ?jO„^ ‡ÇÒ]7Å\|/ø££üñö‘ð—öøýñÃÄ~ø®ü*ð—Æ½7N½ð¿Á¯†^<ñš$Ÿ ¼yàírçÆ¶š]Ïôëÿé¾Ô|Giâ鎄¼KþÝ߲ܸÎãDøƒ­øÞßÁZßÃ? <ÿ ~üaø«Ötÿˆ…©[ã•ý-­Ö¿ ²z¾­&´º³5íoŸ§ü»ÌõÙÃþ ðÃ⟆|0ÿ5ÏøD|mãG|-¢†?ü-má¯ø7ö¾øÛû7~ÏÓ|o*Ð.?áž¼mñ£þƒ<¡|y¿øaªü[øñgã/† ¼1qãmûáö…õç>-xsÀ~#ø{à™,µ¿øûâ~¶Ú„ü á+k ÿÉáÍ"ÿDƒâÄÍa5-KHÓ<=ð»áF™¯éz·¼g®jvßêþøsádñOÆO‰ÿ ¾xóâ…¿°ÇÅ_k¼C©þÒš&¡¬xâíñSÇÚ‡„>Ãà›ýrÿö‹ý¡þ)~Ñ;ð_Â}J÷â—Œu?|.ø‹©üGÒ< ñ¿áçÆ‹ßÚÞ0ðçÂ?ƒ¾>øGiû>þÑ_|=ñÆËëßüþØøá/Œ>ñü+'ö…ü]«Ç¤mè_>Zk·zž«ð³âG‡SSÑ?¶ÿ±?¶üOâ/‚~7‡S´ñOÁˆÚÞ­«èWßÃ?ˆ?¾|j™rs{¯O{½·|«áNÖµúôÓpW¶»éù+þ7>Bø÷ÿ#øEàÿ‚ßµoˆþjºÞ¡ñSàWÂïÚÓPð;|PøñûÁ_¼ñ§öWðŸÄûÿü3ð§Åoø/À ¾0k~ñŸx3áÄý[Å—¾ðÄh®š‚|Mâö˜ÿ‚ü0ðwì÷ñCâ§À?Š> Õ|màOüiñGƒ<+ñá7Å»Í+ã=σdßÚ_öøgªx ý/¾}»àŸÄOøP>)ñ§‚iÏ]øËà?Æü'øŸðóá7Œõ/jºŠ|âmÿèøññßàçÆ„_¾+x'áÏÃíOãgüÆß<+á_„W:ŸÄo j¿¶ŠmÏ…¾ ø…ñ/âPøÿâ|NðMÏÁÚËÅŸ,>xsá§Áiúî§à ľ=Ó.üã-'Æ>ÙûfÁ6ÿá®|uãïÿÂçÿ…}ÿ ÇÁ;?ƒßÙŸð®¿á+þËû'ìåÿ1øÿ Û?á:ð×Û|Ïøx¯ü%¿Ùd´Ùÿ {ûûM¿á`ÿlø"íE4›nÎM½ÓÕ$Ÿ»ªjïMµÕèÁ^Ûvý/צ¿ÖüOÇÛ×ÇÞÿ…•ã]â7Á?ÙÿàGÃo|_ð‡‡üâßÙÇö•ý¸~#|fÒ¿g°x_öžø©wðöyñgÁ?þÎ_ÿf/Œú‹~ x×âÇu‰~ ñfºšˆîõ/…þñGÂ]OãNݧüÇã߃ß4…ß³÷‹ Öþ*øãÆ€Ëñöˆ°ð¿Å_~ÔŸðNŸ†ÿü%à?øzÃàÊkº'í+ðCöêðg‹4O_ø!!øKâ?Šßo>&èö7 >.|8ÕŠ_±WÄËøªÏÁ¿ gŸÚ+à߉>(üJøŸàï†ÿ¾4|rý”¼GðŠ÷úOŽi?„ž*øð«á÷íÿµÏìóûQüoŸÅ?~%|ø½á?ü*±¿—IðG‰¼1ñƒÀ:Âýàáqÿ¿ðž£­ü ñþ‡âmoᇋ´=oŸ>0èž ø›ñ§ö¹¿ñ§Å[Úþ ¹ñÛWx>;ü~ñ͇ÄcDÒ¼9ÿìð·Àÿ j§‡ôˆ[Þ$Ò¼iƒ<;qák¯ø•¯e¥ö×Ugm4ºø¯ü׋\Öä´4’÷¿ú_åkÚß;»Ûèo‡ÿðQOØãâ–…áïxãö׆|eÿ £þ_Iðûâ–¡|Cÿ…ÉñáßÁï ·ÕõßišÄOøF>.|Yøqð³ãgü!7÷ü3‡Äoi>ý¡áXx™æÓ!í¼_ûgþÍ^×~0xkÅŸ²µ¿€¾ ø·ñâÅ—ü!Þ>¾ÿ„SÁ¿þüøµñSXûN›ákËMwþo‡ß´÷Àßgøj}cUÖÿá7þÊð厯­økÅúnòõïüoí ?c_ÁñŸÈÖÿcÙ{Áßüâ9¾}£JñwÄo…ßÿaOŽ_ þ&xŸÃIã«k¸¼gñöðÔ>:øS¥xžÓ]ñwƒ|{®è^ø½àoIÓüYqÄø«þ }ã/ˆ÷>9ñÅÚ‡þ/k¿×aø'¥xkJø?ûmèÿÿf‚ÿ³wÇ? x{Døü$þ ý–?áK|IŸÀ¿þ"ê¾.ð÷įü[м5ñïÄ_ümðÀüWñÜÚ•þ)%®š·¿»¯-µWoµÒî={k§é×î;oÚŸö´ý£dŸ|Iñž‹ðOâ—Ãé¼ûTxóÃ_³ÿÃÍ7ÇZ'Å¿ü9ýš¾üMøÉÆŸüvÕ|I¯èšß‚|W­øáŸÂoiZìÃàÝ àÿÄÿڳᇄ“âÏÄË¿ x~ããÆ'ˆ¿iïÚÃÀÿ´OØÓ\ñ/ìóâ/ÿu¿‚óø;ö‚Ò¾üIðׯøsâ·Ã?ÛÓâeÖ•â_ÙÆïö”ñ?‹¼u­èÖÿðOßèxƒKý¦|ay7Çë2xjø?¨é»]Sö&øÓã‹ÿÚ£Âÿ¿hO…Þ0øAû]èŸþ|K¸Ñÿg/xsö›Ó¾ xëß¼'ð£á_ƒþ9ꟴ¿‹¾øsDø øù­|%iaû/Çá?êïã!ð[ü_øËñKâG‰ Sö&øÓ∟´‹¿hO…×_µ‡„õ¿…óü9ñW‡?g/h_³Î•áÏ…žý«þi:W¾ê´¿‰þ$øÇ[Ô¼9ûo~Ðrê> пiX nÛàÕõ·†¡±ð´Ÿ‹Nôí¼og¯+ø´åvåÚ:§¿2³i½¯åÛm.ºùþ??žuø(?í{à_Ú?ƺ›ðOKÿ† ø'ñcãÇý3Wð/ŽµÏøiŸøS?´oíËðYðïÁëË?‹~ÿ†Yÿ„Çþž-Ó5Ú~ÖðˆÿÂïðîƒw¦x»þþ§¬ü_ýCøÃûB|0øÿì:¹ñ¶¡­ø·û^ox3ágÂO‹þ#jºW‡³ľ'·øgð7Àÿ~ ¯‚|/w¯øcJñGަðÔ^ ðÖ»ãx]×týoÆÞ°Ö> Ô¿àš~#>ø§àïü|Ñ4í3ö¯ø]ãß„¿¶túÏÁ»ýnÿÅþø©ñ§ö£øíãËßÙ†[/‹þ·ýžu¶ñwí§ûAéÞ¹ø«kûWØxÑ|´Ötßê~ñ¶¯ñoêŠ?þ4ø§Ç¾4|<øÅð»Á¿þèŸþiz·Œþø³â«ÿ‚ß¾ |6ñ´š¡ðçCý þø»þ†mþüÒâE¿ÅÈ|'«Íeñ3To„ZbxëÂÚgÃ/fÚ³I^[&¬­wÊþÕú6“]¬…{yéÂÿ×snÛ?öj¼ñ—†<£üIÿ„—þïøAaÒ> ø?ÁÞ>ñ—À{}Wâž•¡k |1âOÚG¾Ö?gßøÛâ~“âïßü6ð/Œ>&h^2ñõ·Äÿ„oá- Xÿ…·ðÔx§‰øiÿý“~-ÿÂþ ñ×–Óâwü"³x?Uñ‡ÀOÚᦅs¥|EûüO­øƒâOÂÏ hžðOÇ}oP ý|uã+ýÁ¿´OÄm;Ä þk¾>øƒáxkJâoÿb^xËUŽoÿÛßþ ülýšÿi:oŒ>iWü@Ó¬4ÝOVð´3RÖtË]n×LÖt]GÖ4 kÄ>ñÿüCá/Š ü[ã…~8ðO¼E⟵ßíâ?€^ð…¿Ãoë>*x§[¾ñ-¿Ã?øbÿÇ~/¿ø-ðnÁ~&þÑ~ Ѽ ëš7ˆîµ»¯†Ú4ÿþ ꨷Ÿö¸øÛû0ü<ñÔú^ƒñ%ïâí¾üñ€l5¿¿ôOüø‰­øPø¿ñ‡Å¿¸°ñ‡<1â5¼»øgàXxæÂãá‡Âï xGWñ׆~ø2xžÃá·ˆü]©ü^ø’ÿ¾,ø·ãO‹>2q?¿cÿ üuøÓeñ[âgŽ>(®™á…Öß~xsá/ÅŸ?³Ÿˆüâ_j^$øá­ÞüOýŸ¾)ü6ñw´OŒ–þýŸì.|ãÔ|9à«ÿ€úoˆ|4©©øÓÄEäR»Ö+¥›mÛKm¥û´ùS½“ð7üO×ÿmŸÍûjüøðò_…Þ3ø!ñ‹Dýœ|K¥üBÑä¿ñþ»áÏß¿àª?dñƒüY¡ø¬øGTÑ/n?b?ƒsøKU·Ò5K Ÿx«ÇÒ´ú³ëžÔ¼'íž3ý±þøkâN¡à Gâö‰à †SÀ?o~!|/ø™aàu¿ºý“þ&~Õ§ÂZ'ÆýJ? | ðÆ·á„´øáãÏ]xƒÇžð_Ãý!¼ãÂÞ.ø§àsNùçágüoþ‡Æ?ßí>3ÿixgö{ÿ…á†þÿ…uö?샟|-ÿ/øiðOágü%RxëPÔ5øW_ÿoßxþ}zÃZñO‹¿áœÿá*ñmÆ©âo‹ÚµÿƒOÚWþ ï¥|`Ñþ?_ë¾,ñ·ˆ´OŠ?>*ü~Ö>|4Ð|¤üF×t¯Á+5ïø&Þ¡ð‹À.ø‹ã]3áö™ãmNÓS›âg…|}ã¤Óüe®ÏaàÏèÖš$WÞ:ŽŸ²rµÝ¹-t·•ú¦º¯Mz¡kø­<´¿Ý¨|Fÿ‚¡üð xoB½ñ·‡-5Ïžð/ÆmãWìÍûPüø§ø7âOìåûdüBø57ÂoüPømðïÆ?ÁE~k1jºÃïÛCöÓðŽ‰¢]Ü~ß:~»áÿŒóøY¿øuâ_ë|¦üHñ‡×Ÿ³—ìyÿ íñKâGĽ3â'ü$ßð·?ákÂo¢ßøGû?gü$ß¶?í?ûZ|,ÿ„WR·ñ=Çö7ü ßð×ÿ|ãÿí{ÂÏþÏøiâ¯ÿ£ÿ„gÅñé%M&“»QViÝ]¶Þª*öÛ³½·W~¿åÚÚ]ùŸkÑEŠ( ˆhoù;_ø'×ý”ÚÿY¿Çuó‡ü·þL‡Sÿ²ŸðÿÿGj•ôí ÿ'kÿúÿ²ûBë7øî¾pÿ‚ÖÿÉêöSþÿèíRº© þÿ§j‘-¥ê¿(Ÿ²¾/ÿµ§ýŠþÿÔ/Ãôx¿þBÖŸö+øÿP¿Ñâÿù ZدàýBü?G‹ÿä-iÿb¿ÿõ ðýc/ùyÿ_þÞ5öÂÿöÓ—¢Š+2‚Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ˆhoù;_ø'×ý”ÚÿY¿Çuó‡ü·þL‡Sÿ²ŸðÿÿGj•ôí ÿ'kÿúÿ²ûBë7øî¾pÿ‚ÖÿÉêöSþÿèíRº© þÿ§j‘-¥ê¿(Ÿ²¾/ÿµ§ýŠþÿÔ/Ãôx¿þBÖŸö+øÿP¿Ñâÿù ZدàýBü?G‹ÿä-iÿb¿ÿõ ðýc/ùyÿ_þÞ5öÂÿöÓ—¢Šóÿ[øëZðŸ€|[­|Dðœrx³ÁñÕï†ô¿‚šÂ$0øÇÂÚ7‹kâ«¿ò´rÁm«.š5é¼!r‘N†üèQ¨±’c%)^)E¤îí«Ri.ïÝc¿õóKõ=Šüý©¾|9ñŸÃ_ø-·ÇïxÁ>+øïû0ÿÂÂÿ†kø×â_ èZïÅ¿Ùçþ?ø&ìÁñ·Àßð£~#ê–^1øMÿgÆx·âï„ÿáÖtøG~'ø§Ä~>ÑþÇâ½oSÕ®Šz÷í®þÙ—‚¼kàkþÏø+Ç…üðOBø§iã«ý á'ö—üOÆþ'ø‘â ‰´ŸÜÂSà›?øO®þ"ø_à_„´„?ð’üF°ñ½Ž½ñ£ÃŸð¹¤ñ×ÂÊTî¯Íö\×emßó-]¶`ݾô¾ÿëúéûÉE~ øŸþ MûcÜÞx»OøYðÁ>5ÿ†cðOÄOþÒ^(Ýð·Âÿ|kÿ Ãöªý°ÿf;Û¿øLþ9þÙÿ³×ü2‚|]ÿ K㈿ðšÜhÿ·?ü+M âGØ|Q ëŸð§ Õ><þ†üø§ûFüdýŸÿh¯èWÏÅËŸ¶ïÂÏÙËLÕ¼/ã¯|9Ñá@|oø³ðá ¿ÆËË?øËÄÞ.þØñ7Âø|[ñ#Å´ð6ý Ärh>ðE†¡ ®³¯'NQWn;Û{´Þ×¶Úkéç &Ÿç¶ëM¾óíz+ñ³ÇðPÏÚÅú'…üCû5|Öî4ÏŒ¿~þÏ t/ˆßôI>0øãMìóñ×ö¦ý¨_Äß¼YûIþÏ¿ üm¢|#Ð|á/Ù_ðŸü4·Â/|-ý©< ûWxwÅWž0ÔþxcáßÄ3À_¶ïíqãDø¹g¨ø[öyðW‹¾þÏ? „~ñ±á ýoÄ¿´ßÅ_Û7öªý”t»xƒöŒ¶øSñ?U¶Óu[;Ÿø+gŽüKÅ„^ ñ§Â_‹–ðŽéÿ±±áH¿eüG𯌿d?~3øoÆ>/jÕlüo‰sÿý¬'Ò?jOé~ýžSÂ?°çìóã?.u âKxã?ˆÿgïÚoþ û>|CðGÃ= ßÆË¦|$Ñ>>iŸ±4~8ðgüSâo‹wÿ³þ®þ×< ûY[ø|]à3ÙK˦îß‹ïw]ôÕ-uý|¿Í¹4WåïíáûK|FýŸ>3þÏvŸ ~|ñÏÄx'XÐ|?¬|Tƒ]ѵ[øNoø%ïìãªø+Mø™á«ms[ð‚|g¢~ÑÚ–½âû»/xçoŒ¾ü'ñmÏ„¼Uiàiüâ¾-~Õ¿|ûGë¾$ø¡Âï‰ZŸü{öyÿ‚™üRñÞ‘áßx³Àžøëâ?†_³gü›ã_€|UðÇÂþ!ø“ñJãöoø£ øGöÄ×þ‰ZιûAß§ÃûÿŽV:.‘ éŸ´î…à"4Ü’jÚ©5ßÝÿ7ewm_dÚ/ù¥÷µþw?è¯Ê-Köžý¬<ûR|ý|câ_ÙçÅþ.ñ—Å:·Š~-økàÄŸørO‚ß¾ÁC>#ëžðÿ½Sö”ñö§¤|Q±Ôÿ`;« +âþ£ñWÄŽÃâôkøyqðòI|yâoÿÚÃ_ðŸÀ¯üPÙçÄg>Á1þ4øïAðÂo‰>¿½ðçüOãMçìíàxK^ñíñ2ßÃ:ßìÏâï ëÿ ý¯¼MðÃÁ¿³Ï€|#û蟵Çí-ñ[ÁiðÃÅ—S~Ð~ðçíÃÿø|¾ðf³á Ó>üQñ~™ûxÅÿ>5ø“Ÿ¬ß®ëVŸtÿŽ:Ÿ¨Íû:øsôoþïÿÑ^ðÇþ#ž«ÿÑKSìÝìåë+_V´Ó£NáuÒïú_ç¼éè®cþïÿÑ^ðÇþ#ž«ÿÑKGü#Þ3ÿ¢½áüG=Wÿ¢–Ÿ³þý?ü þ_ÉýÞŸçø>ÇOEsðxÏþŠ÷†?ñõ_þŠZ?áñŸýï â9ê¿ý´{?ïÓÿÀ¿àüŸÝéþƒìtôW1ÿ÷Œÿè¯xcÿÏUÿ襣þïÿÑ^ðÇþ#ž«ÿÑKG³þý?ü þ_ÉýÞŸçø>ÇOEsðxÏþŠ÷†?ñõ_þŠZ?áñŸýï â9ê¿ý´{?ïÓÿÀ¿àüŸÝéþƒìtôW1ÿ÷Œÿè¯xcÿÏUÿ襣þïÿÑ^ðÇþ#ž«ÿÑKG³þý?ü þ_ÉýÞŸçø>ÇOEsðxÏþŠ÷†?ñõ_þŠZ?áñŸýï â9ê¿ý´{?ïÓÿÀ¿àüŸÝéþƒìtôW1ÿ÷Œÿè¯xcÿÏUÿ襣þïÿÑ^ðÇþ#ž«ÿÑKG³þý?ü þ_ÉýÞŸçø>ÇOEsðxÏþŠ÷†?ñõ_þŠZ?áñŸýï â9ê¿ý´{?ïÓÿÀ¿àüŸÝéþƒìtôW1ÿ÷Œÿè¯xcÿÏUÿ襣þïÿÑ^ðÇþ#ž«ÿÑKG³þý?ü þ_ÉýÞŸçø>ÇOEsðxÏþŠ÷†?ñõ_þŠZ?áñŸýï â9ê¿ý´{?ïÓÿÀ¿àüŸÝéþƒìtôW1ÿ÷Œÿè¯xcÿÏUÿ襣þïÿÑ^ðÇþ#ž«ÿÑKG³þý?ü þ_ÉýÞŸçø>ÇOErz?ü$ž3oë>,ÑüUeqð×Åþ2‚]3á½ïÃû« OÃ>;øCá{x%{¯Šß!Õ¬/ôÿˆº¬ÓDh·wšnŸ"]]Ã5ͺõ•2ƒ…®Óæ\ÉÅÝ5wÎ-wÿƒèŸê|CûCÉÚÿÁ>¿ì ~ПúÍþ;¯œ?ൿòd:Ÿý”ÿ‡ÿú;T¯£ÿhoù;_ø'×ý”ÚÿY¿Çuó‡ü·þL‡Sÿ²ŸðÿÿGj•ÑKø˜_ð¿ý;T™m/UùDý•ñü…­?ìWð?þ¡~£Åÿò´ÿ±_Àÿú…ø~ÿÈZÓþÅÿêáú<_ÿ!kOûüÿ¨_‡ëËÏúø¿öñ¯³þÿ¶œ½sÿ’[ð_þÈGÀŸýT ®ž¹É-ø/ÿd#àOþªP¿…?úùKÿI¬>«Ñþq<ïÆ¿³Wìåñ'â7„¾0üEøðOÇß<ýƒÿ/Å?ü*ð/Š~#x+þmvïÅÿ„KÆúîƒâoÂ9âkûïh?ØúŸö>»yw«éÿgÔ.&¸~Öûá§ÃOÆZÄ]KÀ Ô> é?ØÿÙ^:¾ð®…wã-3þÝ+â.…áÿìÿÏa&·eý…¢|`øµ£èÿf¾‹û3Jø£ñO²ò-6ñwÄx'Õoîõ¸’ù}CÃþðç„ì'Òü-áýÃZeÖ·â_ÝiÞÒ¬4k ŸøÓÄz¯Œ|câ í4è-­æÖüYâíw\ñO‰uY#kýwÄzΫ®j“ÝjzÝÔÛtQv÷müÿ®ì.ñ/Àÿ‚Þ4øâ„Þ1øAð»ÅŸ üY­ê¾%ñOÃ?øÂzïÃÿø]ñÄÿuÏxƒÁº¦“uáÍg[Ö~$Ý]|BÕu]GM¹¿Ô|qs?‹.ç›^šKö øðZ×Ú¯ƒ­~|.¶ðŽ»ð»ÃÿõÏ Aà ÃáÍgà·„ìÔüðëᦥà]cáWu?ê~꺆»ð—ÀÞ½ÐgÑ.üð»[Õµ]cá×…g±“BðN«©ê‡†¬4˻ۙ¥ÚƒàÁk_j¾µøAðºÛÂ:ïÂïü×<-€<'‡5Ÿ‚Þ°ñ.—áo„®‡’ºf£ð»ÃZgøÛUеßøÁ>.Öü/äÿÂ5¬xŸÂº¿ªøwìþ2ð/ÄX?°µ VÂîïIò> ü.øg㨳æ·ò¼eðëÀ¾'Mºß„|?}§–? >éž2Ô>"é¾ðNŸñVþØþÕñÕ…t+Ojð‘i_´/hxž õ»ßíÝàÿÂ]XûMô¿ÚzWÂï‡Z}ïŸiàŸ C¦vÔR»îÀñO‡_³WìåðJÑô/„¿~ ü.Ñ<;ãmCâ_‡ô‡_ ¼ à+Bø«x6ûáÖ«ãýOðÖƒ¦Ziž6Ôþjz—uYC»{àÝBûÃ7òè—sØÉµeð?à¶›a¦ézwÂ…Öf¢|%ðÖ‘§YxÂv¶W‡>xŽçÆ?|?¦ÚA¤Çoc¢|ñuåߊ~éV±ÅaðãÄwW:烠ѵ9åºoQ¢ßw÷°>y°ý‘dý+Ä#ߦ©ñÃÿ5Ë G©øóDñæ§zŒô¯Ýj¶(¿.õÈ/®dzïìÕû9x£Uð.»â_€?üE­ü.ñ·‰þ%ü3Ö5ß…^Õµ_‡_¼mã(~"øÏÇþÔ5 âïÂ>6ñwÄx'Õoîõ¸’ù}®Š9¥Ýýﵿ-=âm>|9°þÁû€<gÿ¯¼[ñ/Ãdð®…oÿçÄoÂkÿ ×ô&Á?±ümã_øY?á-ñVŸö}wÄðŸx×ûbþóþwíýµR¢Šâoþ"ø7Løá_„·ÚÇ‘ñÆÞ ñÿÄ_ xû?U—ûOÁ¿ µß†žñÖ±ý« Œš%—ö·ñƒáÕ—ö~¡©ZjºŸü$_iÑìu M']ŸL?¯»p;j+‰ð¯Ä_øÛ]ø—ᯠkÚzßÁÿX|:ø‹eýŸªÙÂ;ã-OáÏ€>-XèÿiÔ,m-5o?á÷ÅøƒûCBŸSÒ¢þÝþÊšú=oLÖ4Ý<ð¯Ä_øÛ]ø—ᯠkÚzßÁÿX|:ø‹eýŸªÙÂ;ã-OáÏ€>-XèÿiÔ,m-5o?á÷ÅøƒûCBŸSÒ¢þÝþÊšú=oLÖ4Ý<³ìö¿ÉÚÏÑÝ}èÚŠ( Š( Š( Š( Š( Š( Š( Š( Š( b×þJ”öB>)êßý˜«§®b×þJ”öB>)êßý˜«§­'ðÑÿ¯oÿNÕÞ^¿¢>!ý¡¿äíàŸ_öP?hOýfÿ×ÎðZßù2OþÊÃÿýªWÑÿ´7ü¯üëþÊí ÿ¬ßãºùÃþ [ÿ&C©ÿÙOøÿ£µJÚ—ñ0¿áúv©2Ú^«ò‰û+âÿù ZدàýBü?G‹ÿä-iÿb¿ÿõ ðý/ÿµ§ýŠþÿÔ/Ãôx¿þBÖŸö+øÿP¿Ö2ÿ—Ÿõñíã_gü/ÿm9zæ<ÿ$·à¿ý?ú¨<]=sÿ’[ð_þÈGÀŸýT ¡ õò—þ“X}W£üâ|ÕûnøkÄ~,ø3à½/ÂÞÖüK©ÚþןðO¯ÝiÞÒ¯õ›ûox/ööýšücãOi§Asq‰á?èZçŠ|KªÉØh^ѵ]sTž×LÓ®î¡ü‡ø‰ð“öŠð>‘„,üOûC|øaû^ÁM~&|l¿ðÃø(?ÇÙµ‰?i¿üVýßÀ^ýƒ~?|øç¥ü.ñGìÍã¿ø¯XÔ>xâûöOð÷ÅY|[៞ ƒö»¸°o þÝþÐ_µ_‚žðf©áÿ‡º‡Åxû⯀>ø_ÁšWˆ´_ _êÞ*ø•«7‡¼/o±â3kö­~m:ÂYuCIÓma¼’úïS·†ÑÖL¯øH?oÿúF¿ÄüIÏÙCÿž}kJiE8Cš<Íßš)ÞÜ»IôÝ]ogÐMÆú»5ëäûy•?þ þÔ>.ø—áäøçâ¿Û_P»øûPü(ø3ñ·Z´ø¡ñ³àŽ…qðÿðH?‡Á«ü ñħüãö‹×>'økâ”~ðþ”ÿ tO|o>ðv¯>›§xľ k>ºøMâ†_4_†Þ)ð×Ùÿð~ßÿôˆø“Ÿ²‡ÿ<ú?á ý¿ÿéÿ?ñ'?eþyõnŽ!Û÷KEeïCMº\Ún¿ðØ\Ñþgøùyy~/¹ø}ûNø›ößÑ~ ÜZxe?jüAøÿ «'ì·âÝ áüöñ—Ç]wÀŸµíà¯Ù×῎´ٻ⯃<kÿÁ„ß³½áŸðQ/~Òÿií+ã„Þ-»Ò|kiá¿ÚïâOmã¯~ÖÚ?†~7øëÂWÿ¶¼ßdðOü‹ã÷„¬aø—ûOkšPý ?gÚú þ ¥ øcáÕEàŸ|ñ·Œ&ð/ìÕ£øa>~Õ> ²Ðµß|*øÁiðÿÁš‡†ÿbÿá ý¿ÿéÿ?ñ'?eþyôÂAûÿÒ5þ âN~Êüóéû,FŸ¹Z6þ8YÞú|Wµß5›zíed‹ÇùŸNúÚÛùéå£?*| þÓ?ðÕ_u¿ÿjøFá6ý¯ÿál|1øiðöäþÂÿ†DûÆ;OÙóþ޾ý¥á•ÿá6ÿ„þ×Äÿ‡zþοðߟð±¾ÁàÿÿÅMÿ eãšý䯜á ý¿ÿéÿ?ñ'?eþyôÂAûÿÒ5þ âN~Êüóê%‡ÄJß»µ•¬¥Nß$šôW»²JîÃRŠë÷ßü£¨¯œá ý¿ÿéÿ?ñ'?eþyôÂAûÿÒ5þ âN~Êüóê~«_þ}ÿäÐÿ䃞=ÿþGÑÔWÎ?ð~ßÿôˆø“Ÿ²‡ÿ<ú?á ý¿ÿéÿ?ñ'?eþyô}V¿üûÿÉ¡ÿÉ<{þü£¨¯œá ý¿ÿéÿ?ñ'?eþyôÂAûÿÒ5þ âN~Êüóèú­ù÷ÿ“Cÿ’x÷üùGQ_8ÿÂAûÿÒ5þ âN~Êüóèÿ„ƒöÿÿ¤kü@ÿÄœý”?ùçÑõZÿóïÿ&‡ÿ$ñïø?ò>ޝÿlŸ x|ðÿã·‚øbÏWðÕ†«ûC§Âh¼Y®'—Ån¥õ¦•gâØ|1áGÇ~_øÇ]ÐåÔüEàq­éÞ%—Áºœ:öµ£Oá»ÏhùÑu­KNþÉ ª^h’]h‹¨½Õ®ªkšeµ®¹©|›ñ“ö•ñÏÃÿŒ^ø)ðÛàˆ>7x¯]øi©üRx´/ˆðGög‡´_ØxOT’éü}{¢é³y:–µ ¬ gªÜ_\ÿhLFŸ\¾q„ÔÜl¯ÛNQJÖÖòmFÍ>ýGukôÓþ‡Á>ügøMû5|ø?«j^6ðÆ¡âÏ|køýûC|oýž¼!û||iÒ¼1ûJüYñö¹ñ‹Åÿ¼ ðŸöø±û7þÕ¿üsãÏŽ5¯‡>ñÿ‹µ?ü;ðoÁoø7âþâÏ‹Ÿ>ø¿LñOØÃÅÿµ÷ÿˆzíûA|+ý¨ußø[ž ·‹âgƒ<1ðŸÄÚ~«ñ'ö²øÿûÿ‚*'ƒ.u߆vo…<à}¾6ø=û\|9›ã?ÄK_‡?³ßÀiþ:øñ'âÂ?í×Óï¿Nÿá¡¿k_úGßÄüHOÙ¿ÿ›º?á¡¿k_úGßÄüHOÙ¿ÿ›ºÑ)Y¦©;ÞïÛRûNîÞý×N¶ÑhžëOïiäü¼¼¿~G~Í:íùã¯ÙCSø¿ñWö¡ð·¬üûÿax#Vøû]øûþ?…ÿ³ŸìéqûUÂìø§?í+ðÛöðWµŠ¯ûZi?á°¾xûöÓðçÙäñÂoøJ¼myû#ø^Ãúøiý…ÿ çÀð‹ÿÂmÿÏü!>ÿ„wþ_ü,oøXߨ_ØVÙðŸÿÂáÿ‹¹ÿ ·öÙÿá*ÿ…§ÿûwíÿð›ÿÅMý§_+ÿÃC~Ö¿ô¿ˆøŸ³ÿ7tÃC~Ö¿ô¿ˆøŸ³ÿ7t§NßÂVèªÑ·á%ë­õmõÐV]þé_ç§ùoQ_ÿÃC~Ö¿ô¿ˆøŸ³ÿ7tÃC~Ö¿ô¿ˆøŸ³ÿ7uÊ]éÿàê_ü˜î¼þçþGÛÔWÄ?ðÐßµ¯ý#ïâþ$'ìßÿÍÝðÐßµ¯ý#ïâþ$'ìßÿÍÝÊ]éÿàê_ü˜]yýÏü·¨¯ˆá¡¿k_úGßÄüHOÙ¿ÿ›º?á¡¿k_úGßÄüHOÙ¿ÿ›º=”»ÓÿÁÔ¿ù0ºóûŸùoQ_ÿÃC~Ö¿ô¿ˆøŸ³ÿ7tÃC~Ö¿ô¿ˆøŸ³ÿ7t{)w§ÿƒ©òauç÷?ò>Þ¢¾!ÿ††ý­é?ñ!?fÿþnèÿ††ý­é?ñ!?fÿþnèöRïOÿRÿäÂëÏîä}½E|Cÿ ûZÿÒ>þ âB~ÍÿüÝÑÿ ûZÿÒ>þ âB~ÍÿüÝÑì¥ÞŸþ¥ÿɅןÜÿÈûzŠø‡þöµÿ¤}ü@ÿÄ„ý›ÿù»®ŽŠß·ÔÜÛÁ4~1Ü[\Eö÷|iø4Á2 "šcñ‹G,RÆÊñÈŒÈèÁ”• ÓTföä~•i?Êauç÷?ò>»¢¾ø•ûL~Õß¼âÏŠ¿àž<àè·~ ñO‰µŸ_ã°Ò´»$Ý$¬ø²k«»©ähí4í2ÂÞëSÕµ‹]3K³¼Ôní­eûâêÂ÷M]:HZ¦£q øoU¿‚Æynì­/u¿éšÍÕìö¶ßÚØO%•¾¡6Ÿ§K y&§¼íg)Á'$’nÉ©FZïödÁ4ô^»3޵ÿ’¥ýŠ_ú·ÿf*é똵ÿ’¥ýŠ_ú·ÿf*éèŸÃGþ½¿ý;Tòõýñí ÿ'kÿúÿ²ûBë7øî¾pÿ‚ÖÿÉêöSþÿèíR¾ý¡¿äíàŸ_öP?hOýfÿ×ÎðZßù2OþÊÃÿýªVÔ¿‰…ÿ ÿÓµI–Òõ_”OÙ_ÿÈZÓþÅÿêáú<_ÿ!kOûüÿ¨_‡èñü…­?ìWð?þ¡~£Åÿò´ÿ±_Àÿú…ø~±—ü¼ÿ¯‹ÿoû?áûiË×1àù%¿ÿì„| ÿÕAàªéë˜ðü’ß‚ÿöB>ÿê ðU øSÿ¯”¿ôšÃê½ççÚ¿þB_±ßý¤ö/ÿÕÓ W¬hÿdŽ੟?lO‡¿üOsû8~ÓþðÏh¯‹èš'Ä/Ù[à×…à›°¿ÆÛËŸƒß´uõÆ‘ñöaðÿÿˆŸþ(üsÑ3~Ñý¨ì¼?ðƒCý¡|1ñæëá¯ÂKQÒ¼U}âi>é^&ñL.—Þ–ø+üRü̧ñ?—ä˜?i/ø)¿íOðGàŸÅ¯ÚŸFÒgýgá•ÿÄø*OìõðSàæ§ðëâ,^;ðÅ?ø'GÂ/ø(Ž4¯‹¾4ÚülÃÿ¾üWñü×Äɨ|ðŸÀÿþ#ð†ñÇB±¶øßâ+ß„:†«ñoŸý¢ÿà¥ÿ¶‡ì©áÚUñŒŸ³Åm_özñí!û8ÙËែ¿¾éÞ)øûðÃþ -ãÏø+Ç~:\ØêŸ´ÇÅK'àúx'Fð÷ì½âÏÙÎ-NÿÆšÿŠ­µŸÚGý§<)¤jÖ?³î‡ú?ðoÂ_²í#ñö±ñΡûü?ðgǨ¿áý•kSâÇÁŸÙÿSø§ñ Gø‘û,~Í?õ‚ÿüà-câU—ÅŸ‡ú_Ã/‹¿ ~xË@Ôümâ_j>#ø©hzñG|?áëgí_ðŸöXøÁu©~Ç_þÂ7{ûv|?ý§þÍñ»Ã^ øu£Ý[üS_ÙÇFýš¼YÿÿÄŸiºœÑ~×þ(ý‘~ xòÏá'—áø[ýœ~üu·Ô¿âÙ|.ÖtÞ¢O˜>$~ÙµÇÁ|Uý“¼G¬üøÇûaÞxö_ñ_ìÉâ?‚Ÿ²î· øWân£ñûQý±µ¿|!Ô>|eÿ‚€ø#Ãqøƒá§Á¿ØãÿÅ‹¯Šž/ý¾> øWÄv½¥xgDðeç< øCã×Ëþÿ‚¬þÜ^*øuûNüTÿ…Iû?ü>ðÿìû x«ö•ý¢ü!ãý'Å·ÿþ#øïözý©ÿ঳Åß‚> Ò>üeñ—Ã/ƒ¿ð¼,¿`OøJü9ñ'þ÷í1£þÉž#¿½ðgöíááÿXüJðéÿÀï¿°/Ä/…Ÿ´wìÕð·ö4ýŸôOÙ—Ã?´¥àˆ¿¬ÿg‚úoìÏñÏâŸü9ð£Ä^.ñ¯‡<#áÝ"÷áÿÄßøV_,´ÿ‚>5ñ» ÛøÁ´'ìïãÿ†Ú•¦µð’ ÓèþÉß²ÇÃÿx‹áo€¿fŸÙÿÁ? ¼_ðþ„þ,øuჼ7àO|,¹Ö>"øŠçᧈ¼#£xrËÃúßÃû|`ø·®ÏàÝKO¹ðäºÇňºœšk^øÛÄÓê`þÍ_¶·Å?Œÿ´ìŸ³î¿ |?·½øÿÿ†…м;¥xŽ/üÿ…?ûiü9ø[ÿíÿ…‹¦^ø¯U›á·ü5÷ì‹®xïãÿ„á7Ñl¿áèþŸâ¯ÀßìφZ&±§Íú_0~Ì_ ø%Æ>óPøÁãxãã9ø“ñçã]×Á¡â¯Ú7ÅCà×Áÿi?týà>•àŸ‡~ðÿ„>ø'À¿³õ®‡cðwàž£{¨üÕ|Wªx'Ä·>%?þ)}?@Q@Q@Q@Q@üWÿý·ýÍú²¼u_–Þ7Õoô/ÛÿL×4¿ k~4ÔôoØã«§x;ÃSør×Ä~,¿Ó¾5|.¼´ðׇî¼câ øFÛ[×n!KÒ§ñOŠ|5áÈoî “\ñ¦-Ö£mú“ñ_þCöß÷5ÿêÊñÕ~[xßÃ^ñ§íÿ¦x;Æ>цßf?öïæð?íµñWÅÿfýKÅúWÂ5ŸÙçöóø‘ûBÝjáºøáûÙ×ÅŸ²¥üKÐücヾ*hÚß {âo> |oøEû@xöOñÂßZüq=е—ø7ðêïâàïø*oÄÏx³ÃŸ`ý5³ñÿÅ~øKðuï‰>9|#ð=·‡>-|ý¯~&x#â¥â_ÚßöIý—¾*M¢x^ýŽ> iÿ—Âÿ¼Qa¡|?Ô-¼Oð‹[øïñgIÕ¿gø~¼ðÇìëûEã-wà…·ƒÿá0øƒà?Íãÿˆ‘|GñÅ/Š2ñ·ÃŸÚ³Jñ×Á‹ë¿~(ë~(ÖÿhüKÑ?gûßêß >-xËâF…§é_~ KºM§Âo€×>Ûðì-û8|8ø¦|VÒ4_Š>%ø“¢ë~ñ‘ão‹_´‡í'ñ×Äzmÿ‚üñãáÏ…à²Ôþ5ü[øqm¢hþý§>;X[xj&_5ÿÄ=KÄ3éSxNеm*/JÎðw·»Ñ]¶Ó—½w£JþJÁiiªóû–Úy?¼üòý©ÿo?dÛGKýŸ~hžø“ð;öCý¤¼KñïÆzÏíâχWÿüGáOþØ?³l¾ ý˜|EàŸ‚¾/×¾1ë~ø©ûüoñO„u_Çû._ÜxrƒzãOá¯ø×ÅÚÂsöûÿ‚k~ð‡íðcÂ>ÖôÍ3Qýžl|ý§>ê?´2Í£|~øAû#üiøÅâ]>÷Ç׿³‡€g_k µƒürÿkÏ‹ÿ|%ñWÁzn…­ü3ðÖ§¦|S—àïÞ_?àž?²oĽ Ä>ñ|m¥èž4ÿ…¯Ä /‡ÿhO„_ð³´¯Ÿ¾"|Zø‰áŠ÷? >)ø.ïâ§‚oþ ü]ø¯âxâ$þ&ðo€áfü@Ò¾è^Ñ Á<dߊ:ïˆu¿øÆÚ­§Š?ákÍ©øÓãßí  |ƒUøéðçâ'ŸŒ>'Ð~xwâž“ðcž6ø‘àמ:ð¿€ôjÞ)ø‹ã_ˆWë|Añ.¯â‹¶¥I5îÊÉɯWËk·-lÖÚ+;jõ½ûÁé×çò>yøÃÿ,ñÂüJøÑ}ðDÖ¾hÚßí§ðÓá>­iñ’þ×â¯þ4þÃÿÿiÏ|Dо!ü9›á¾ø_ð»Åw±çÆí#Á<7ñsâ÷‹%†ëá^©®|"ÑŸÆ.Ó>Ÿà¤Þ8ø3{ðóÆß²æ·eñëÄßÁù¾|2мUñâÝ…Ïþ8øsö¡ñŸ„%ø»û9üøßñ'Â|9áÏØ×㵿Ŀüø7ûQü?ð·ˆÏÃvÑ>5x¿á߈¼wñ3áoÐÞ2ý¿cxËÆ^ñ¯‡´µ¿Ž> øßwyðRø×ñJÜh_4¡ðûö‡øðŸà|Fƒá÷Ãx–Óã^£¡|TøëðkÀ¾øqªüyñ|Þ#ñÈÖþ7x²ãÅÞ£ñ/öVøñoÄzïø}ü}àÿˆß>|@ðý‡Â[ÿ‹·¾ŸÀ>;ømã x»áž·aoñïã?‡uü;Ö|/â?øâ_‹~xÇU×ü «Oáâ¯KOqõ¾÷ÝZÞõ¶º{]ín†½ÿ­?àÛ^½OÃoŽ¿´Å¿Šž)øýñ®ÓáÏí¯ðg[ø_ÿòø_ñKÂZŸÆ‰ÿ¾~Çÿü7ñþ !á½{ö‹øÿû9ø×âGÀ_ˆ?¾ ë×|ñ/FÒ5ïØ¿ãOÄÿ‰¿³ÿ€4Ë/þËú^·âËOƒ:÷ëÇŠ¿l?øFá|Å»ûoü)?Û_öLý?änû7ü$ßðÔ_ðÅŸñq?äX¸þÆÿ„þÿþEø›ÂMÿ óþFÿÂ[ÿÏ ~Æß°ßÄÍWD×|!áßx“D½ø'ðËÏÖ(X·ü&>>Ó<-Å¿ƒúï…u¿‡_¿á^èþ)ÓþKñ³Ã¶ž ðÇ?árÍáy>'êß4ÏøQZïŠõ?ƒº‡€îÜ¥M´œd’émWçÅÕ)vÞöníŠýwÓòWéýytü¼ýˆm‹ãÖü+ðká¿ü'Þ6øÉÿ ããÃ?~Ñ¿µ?ÄôðoÁÿ€þÿ‚nÿÁ'üQã?·ÇCáWíñ3Æ^6âgímáÍ^Ìj? lí¾%jº×ÅïŠ^6ñ–ƒãk„ÓKð?ãgÆß±üý†~üwøå‡?i_xÉþ-üuýš¾üN¼ñíψ´ÙÓÇ_³î«àŸi?<ãOŒþ6øÕû_|!øŸ¢éVÿ|MÃe|7??CtÏø'ì›áß iðo|mðêÓAÿ„vÄ? >=þП þ#iúW…þ|ø§øbßâÏïŠ~ø¢¾ ¾ø]û>|ÑüQàSãðoµß…~ñ-{âc☶ü)ûþË~¿øquá?‡ÚÞ‰¦|,Ñ>è¾ðE§ÅoŒ'áV£7ÁOxo¼]ñàôþ>—á_ÅïŠ? t|=´ð_Æ‹>ñ·Å_MðËá^£¦øÊ OáwÃûÏ ŽtýÙj•½Ri6ùµÓñÕÜV–š¯?Âÿ“ûþîÛöJøÓâ?ÚCödøûAø§Á'Ã}OãÂï|Zµð?‡üoñÃþø…¤[x¯ÁÖSø¿Qð7ËK[oêºωm£ð•†‹â9õ] KÔ¼K¦i–ž&Ö>†¯.ø[ᯇÿ <9á_Ùóá·‡õ¿ øGà¯Âð†“>•ã‹Ïiôë _Á>ðþ•ñÄÐ^éž0Öô=3ÀÛxƒJOx‡Ç„ž×|u¿Ž<)©ø‡Ôk'k»++¶—döïÓÍú”¶WߨQXžñ/‡©áohž%Ó-u¿øjëQðþ«a¬Ø[xÁ~#Õ|ãÏw§Oso·á?hZç…¼K¥I"ßè^#ѵ]T‚×SÓ®íaÛ¤EP\'í7ñ³Âô›ø…þÛª^ø_ÁÖÞðÅ´é¥â=J/xuš(™’_±iv^lë:̰Ko¦[Ë $7º¥î•¥j=Ý|íªüwý¸"×®oü)ÿüø³io†›¡Ø_ZþÒ¿³ªjšf¦éúU•ÄÖúGÅ;èã—ZM?IÔK²Ôµk´kÞµ°Ô5q¯xj÷YÚ”9î­Ì”¢ä¹£Õ§³“K{^ÚÛ¶ä·fºhú_¬z7þÛ<'ñ[þ ÛûAøËÁº‡Ût»ß‡òCqo0Hµ-R‹WÑóFÖlÒI~ŪYy±™bKoqo-¶¡§ÜÞéw¶7×?¨>/ÿµ§ýŠþÿÔ/Ãõù}ûWÞ~ßß´ßÀ/‰Ÿ¦ý‡~&Z_xãÂ÷š&®jß´—ìßâ‹]:î{›+Ûy"³OŠk5;§5ž“n¯§Ìò]G­øfâÊ-A¼Aá«}_õÅÿò´ÿ±_Àÿú…ø~®¬y)(Úß¾”’挚‹„R»‹kt×KÚöw•ÿ»ç½Óëêy…¯ü•(?ì„|RÿÕ¿û1WO\ůü•(?ì„|RÿÕ¿û1WOYOá£ÿ^ßþªRÞ^¿¢>!ý¡¿äíàŸ_öP?hOýfÿ×ÎðZßù2OþÊÃÿýªWÑÿ´7ü¯üëþÊí ÿ¬ßãºùÃþ [ÿ&C©ÿÙOøÿ£µJÚ—ñ0¿áúv©2Ú^«ò‰û+âÿù ZدàýBü?G‹ÿä-iÿb¿ÿõ ðý/ÿµ§ýŠþÿÔ/Ãôx¿þBÖŸö+øÿP¿Ö2ÿ—Ÿõñíã_gü/ÿm9zæ<ÿ$·à¿ý?ú¨<]=sÿ’[ð_þÈGÀŸýT ¡ õò—þ“X}W£üâ|áûWÿÈKö;ÿ´ƒ~Åÿúºt û_àì{?‡?lÏÛwö¢ñâü`еþÓþñgÁ[=ö˜øË¥üñ§Ã;?ø'÷ì‰ð3Uñ7‹?fŸü[ƒàOˆüAkñ'Á¼7m¬ü\øOyñ ü'áŸé·+¤h? u»_Š?jÿù ~ÇöoØ¿ÿWN_KÏû}ê?>0~Ô>ø—ጤÔ?à£þý¿e¯‡?>xWÄ>*³ÔuŸø%ìýûiÚø;P‘õÛZøÄ~6ƒã$·_þ#x„øWáÆ£ã+Xø³ã¯†Ÿ³çƒüIãφ¾–ø+üRü̧ñ?—äÄÿÁ&?kK?‚ß|1û@ü øÁã†Þ ðÿ½7Æ_³ŸÁAÿÃøéâ­{âÞ‡ÿ¯ÿ‚<~Î^ø·¨|?ÿ‚‰Cñö<¼ðÿÁo~Éÿ¶wÁ›¯éÚŽ›ûCèZŽt§ø9»ð'â÷Å^~ÿ|Qýž>2鿱ìßÿ€ñÄÏÛöðÿÁÿŒ G‹>.Añ3Å_¾2ü"øS¨|6ø©ð·Äß>!ø_á/†ü[âÚÓàß‹~7þÍ:Ïí%ñ3á?‡`ðv£ñÎçö–·øSáßx/ÃzN‡à?ðXo‡¾ñÇíâˆ> ñ„ÿfŸ³À/ëÞ+ÖßៅüUðóöªñïíµû]~¾=ý•þ,x—Å´ï†Ö> “ã·À'áσ~'è·íû(øWQðoƉ_ÿjýà¶©ðËÇ¡¡Árÿeü=Ö>#x+À>!iø?ûlükøÉÃþÊ¿´ïƒ^ý…>üø¯ñ/OñÄO‡?´çŠ~ üIñü7ûK|°øqkû:üJøÙ§[ø«âBø_âÆ«ð¯WðÅ›u|ÿû`Á2<}«|3ýŒþ^éŸ?jß†ß ü?ûNëß´§…> |<ÿ‚zx‡Å_mÚKâÂïŒZçíy¨~ÏßðT-?Ç¿±ç„ü?ªxñk}jê/jÖŸ¾j?´f•ð³à ”?|MñgOÒyù?àœß|3ðö°²ñ×ìÕÿ ñOâíûk·š‡Š¾#|ý¥|wûDxökÿ‚l~É_4Cãm¯íìßð·öøøáïڷŸâñÏÂßÚ¯^ý޵KG×þ+þ׿³¶§ð3ö­ÑÿgmVïôÄÿðSO„ž øgñïâ7Ž>ü`øksðÃÿ>"ê~ø×«~ϳ¿Š¼_ðCö‹ø…â?†_¾6iú÷í ñûá_Ÿ…¾ø‘âŸüG°µø]ûL|Jø ûJøCQð«á‰üãoü:ð¿¹ÿØŸöéÑÿmÚâî¹ð£Æð~ÎQ~Ȳ'Ä_hW5?øF~.ø—ö˜ÿ‚•| ý¡ ÿ„ïÀwÞ)ðÿ>Éâه¾ÿ„‹Àß~$|×ÿá_ÿÂmðKÅÞ(ðgŒ×Æþ0øëöø»¤|hñßÿh¿ØKþ[örÕ~ kWGöIÿ…±ðOö­þ×ø“«~À¿ðHoƒŸ?i?íßÛëâ?ÁOüYÿ…#âÙ7öÐøÿ Ëã6©áoÚÇWÿ…µÿ N—ðÊ÷ÁŸ~%ø‡H>Á2ÿhï‡>Öþ$üSð÷ü-?ÛŸÃ_µÿüKSð÷í'/ÅÛ¯øPøEð_àOüà·üâ—Ÿ|Cñ&›âÿÂïðÿÁ¿ÚëÁ?´ Ú¿ÂÏè¾ø«¡|Hð¿ü*Ÿ ƒöÿ‚‡~Óÿþ Á&4/^*ðýí#ñcãÃý7ö¡oø;ÃþÑ>;|øßÿ¯ý°?mÙãâß„t=VÑõ}/Ãþ,Õüà/ |Eñï4‡¾ ºý®?g?Ú§áÂèæø]àMOLÔ~ ñü—öbÐþ$üuø)eàψ9øÛð[↾i¿>üQý‹>(øïâ¾±â_ÚÇá'ì_ú—€¿k]Lø!ý•ñ·ãÏ ?Sðïí¡ªþË~;“Gñ~¡u£øGVÔþ|[ÑüúýE~PkŸðXoÙ«ÀÞ ñÏŽþ.x+ãÁM¾ñµï‡.~'?Á /Nø—ãO„?~~ÈþøÅš'Æïxáÿˆ>~Ø>þÌÿü}ûAx³à·À-CÅ^'o‹_ þ2|Cý—<9âÿ¾úƒö)ý·> þÞ_ 5ÿŠŸ¯üÛ/|@Õ~øóCÿ„ÇáÄøD|w¦xs¾6] þOì÷ñ3ãWÀ_ý³À¾=ð7Šÿ´þ|^ø£è¿ð’ÿÂâ­CÃÿ|/ã¿xPëú(¢€ (¢€ (¢€>ø¯ÿ!ûoûšÿõexê¿¿jø\ðÒß?áäà¿áÖ¿µü(¯ù¿ä±ÿÂ}àOøV?ò<ÿÅÿ#·ö'üŽñKÐÁÿŸµ×ìÏÅùÛÜ×ÿ«+ÇUù£©ÊH¼ÿfCñ/ÿWÇÂjñÛµJ¯GjmÙìôŽþFßf?öïæÇ?ø/Çw?~1xöJ»ý¼¼ðÄš'ìAᯎÿ>;ü+ÿ‚±|Kø«7‡<üßZÖü?ðã@ñ·Ä?ƒ¿·ç‹tMâ׌?d“¯i_²gÄýÃÂpøÞóÄž9‚ûá5ïÇm]õáímªÉkªøŸÇ?¶¿‹eÐ|ÿôðµû¿Ú{ö~Òµ…ÿà¤_µÃ/ÚRÿPø9¦|uø‹ª/¼/ûëÿ Xø—ñûÅÞ1ý´þø7Nøuñëâߊ¾~Óº~©­økú¢¡Õ}¿—v›v²ÕÙ6ÚVzÙ«+i«JßÖ6^ªþ§óÍâÏøkh<3ñWGñü6»|Að‚~?øþ ™7ƒ?á§®4«¿Úá×í}ûoøá=ÿí9®ü9ó|ãoê<;ÿö¾Òþ%ÿÁJ5 à‡ÅÜx£â-ÿм]iâÚgÄú·µè ýª¼-ÿ¯ÄÛ/þÚþ#ñçÄŸÛ_þ Qð×Åž´×¬õø@e[øxgŒ?g;†? ¾6Ú[þ;ûgÄoþͺÿÀ¯ŽÿôKûËøM| ðr‹éû+øÃ?ìÿk¨¤ê_ì­[ôÕ5dº.¯¼®úØ-æÿÏmû½>çcù°ñ÷ïÚRøIkñSÁº?í¯wâo‡ß±Gü·á_ÀC¨~ÖVž>¼øññá‡ìë¬|Ô¼1á/‰Ò~ÛÞðOÄ©þ |sñ§|!ûnÝüA¹øOûJÚh_>üXøƒá›OØ+ÇÞ;úöŽ›öŠðWíaðWOøS/í áM3áÅØßàç‚t+ÿÁAÿi|uýœ5߉? ´Žß¾&|kÑ>5jŸ±OÃýoEð_޾9xÆr~×_~'þÒiaðy>8ÚüUѵ?ˆ©é­ÛVnáoÍ?ºÛ}ßðçóaðKá×í ðáÏìÕð—Æz?í¯áßÙ§áwì½û|:ý«ü?à=Cö²Õ¼u¡xËÁ:üÃ_t‚گ›íOãî§ý™ûY韱õ–«¨~Èš–¡¥^þÎp|&¹Ño®ÿaÙtéäí‚¿m=cÀ¿µÏÄWñoí¯a¨|ýŠ5Ÿ‰_°×mõïŠúgü&_¼9ûFÿÁL5ßÙ6ÿÆþšÑ>#|døÙ þͺ/ì•£üSøñ¶ûÄzïÄÿøLü/§þÝ>&ü\°ðtÞþ†h¡Õm·Ê®ÚoäîþrÙ¾ªË¦¢Vêÿ«—âÏÊ/ۣľ µý¬?e|Xñíymð¯]ýžlÏßx[öDÕn|G¬ü@ðŸÄŸØ{Kðgˆ<_¡þ¯ÄGDðׇ³ûC~Ëžý°í~ø—ãÕ׈áøUá¯ø$ïÂÍGÄ“þÍþý”õY¼K¡h—?ðS,üKû hztÞ,¿µñ®—ñUÖ~x/ÇVšï$þðå׈ô¯ÝxD¹ñv…¢xƒÃZŠgÒ¬&ñáÏ_økTñO‡ô­rHSÓ´Oê~ ðv£â *Òê fÿÂ~»Ô`¹¸Ð´¹-vé*–ŠV¾–m½½æï=×¶ºê“éf[W«Þÿ—ù~,þe|M«þÛ:î·âoÁñ+ö†ð—Ãm#Dýž¼Kâµ½ð¯íYñ_⯄ÿcïþÐßðZ ÙÃÄ—ŸÙïâ—ÂÛ–ó⌼1àØÃßµ_xïõ<ÐøzÚ÷öÀŸ_ð焾=øzçèo Ø|oÓ-¼ cûDx«þ ãkH> øþ÷Äÿ|û@|.ñ–§ñŽ_´Äןð·| ¦|KøÁàí ì_$ý‡ôÿÿÃä¾"ø‹ÂÚž•i¬ë´—öOÄCöÖдÏܘ<5áË_ê¾1µðþ‰mâíwDðÿ†µÏÁ¥XCâ=gÞ¿ñ.©áoêºäp.§¨èžÔüiãGÃúUÝÔÖ5ÿ‹)êßý˜«§®b×þJ”öB>)êßý˜«§¬gðÑÿ¯oÿNÕ)o/_ÑþÐßòv¿ðO¯û(´'þ³Žëçø-oü™§ÿe?áÿþŽÕ+èÿÚþN×þ õÿeö„ÿÖoñÝ|áÿ­ÿ“!Ôÿì§ü?ÿÑÚ¥mKø˜_ð¿ý;T™m/UùDý•ñü…­?ìWð?þ¡~£Åÿò´ÿ±_Àÿú…ø~ÿÈZÓþÅÿêáú<_ÿ!kOûüÿ¨_‡ëËÏúø¿öñ¯³þÿ¶œ½sÿ’[ð_þÈGÀŸýT ®ž¹É-ø/ÿd#àOþªP¿…?úùKÿI¬>«Ñþq>pý«ÿä%ûÿÚA¿bÿý]:~‹èß²·À/üyñgÅÏ|Eñ»ñÀ_¶ý·íS㯠hÞ.ð^©§x/ãíçüoÃ?±ŸÃ¯hÖ>Ÿ\ðç‡î¿eÏx;âÕ·„uJÏÆ“ø«Åžñä^"o‡zö—á;¯ÎÚ¿þB_±ßý¤ö/ÿÕÓ W¼~οµì±ð£öÝÿ‚–ü ø¥ûK~Ïÿ ~6üJý¿þ ÿºø;ãÿŒŸ¼ñOÇßð˜ÿÁ5?àœðü!_|Eâ=;ž*ÿ„«Åºv¡áoaiÿÛž#°½Ñ4ϵjv³Ú§¥ƒþ ÿ¿3)üOåù#××þ ð Õ>#Ë£x¿ãƒ«üQñˆ7ü ø³ûBþÓ?m¼iðÊûÃ?j†^6øY⯊~¿ñWícñ[À?ü{û/~ÑðPŸ~Ì?³çÀÿŒ<wÿ ñ͇ì_ðÓâg>!i³Wü7ö‡ø-ð#âOŽ~/ü½ý‹ì|Aã­;öÔý«5=ÂÞýž>|LñÃßÙ[Á:®ƒªK'ÿÚÄ_:‰?Oþ4þÂ~1üeÔ?h›o‰>|vƒÃÿto‡ß~^|3ºÔ~ê?`ý¯ô'Åž ð¿Å?…ÿ¾ë^ ñ¯Ã¿ÛŸöˆø_ã›oо ø“áVð¯ˆô=kÁ~ð_ÄŸ h¾=¶?dØCáïìƒâˆ1ð×Ä¿Œ$Ô_ö ý±ÿk[Å’iŸ >ü,ð¶•â|Vý¸~/Å©[hÒ|+má]'ÀZ>…áçFÖµ?~0þÎ_ðTŽÚì±ðj/?üïÚ·ã¿íÿ<¾øcáÏøV^Æ>*ý–?k/‡_ðIë/Ú‡âïü!^ø|šf‡û?øûãoÅÛ'áOü4_ˆ4]á×…~;kÿðÏÿ>"xsâ–—ð³ÀwŸéðTÿÚcTøÅñ+Þý ¾Ïðÿâ§Ãù>1x«ÂZׯÙïâïíOÿ»øXŸ·gì;ðGâ½×íðkÀß±·À ö-øû0þÌ¿µ¯ÇüVðí…ã_Ûßß ~"þÌRÞüGø…ª|?ø#ñµþ=€~ßx_þ ±û8øVëþ ±¬Û7Ä GÅ¿ðJ߇ú×ÂßÙ›Æ:ŸŠ-N±¨øÅ_³ŠþÌÞ0о)iÚv‹§xKÅ_ð•xKNðŸ‹5 OFðÏ…u;Ç~ Ю|3¨h>Ô|càÿxþ•ÿøIc⃷íûOø—áßì×áÿ†þý˜þ k7߳ſÃ߀? þþÔ±ïíOàŸ†Þ×|;û:h!j? ôßG{ãi¾"x–ïâ$>*ÿ‚…þÒ-­ø÷Á?¿à¦¿üsû.x{öŸøÑá þ /ñ¯ö‹ý…¿fÿ ê“ø+öGÿ‚füIðìë§þÓ¾ÿ‚sþÓ_±çŠ×´ýÁcQð_ÄÏÚÓöóø9ÿ#¼ø“¥[_|?¾Ðõ_| ý¨þü3ñÁMÅú?‰¾Ïá]ëÁßüñ«HÖ5Eºúÿà§Â}Gá…u _øÃñƒãÇŠuï]x›Å~5ë~¼ñV¹¨Ë§iZ …¶Ÿá†¾ øgðoáׇô è“ká?„ >xWRÔlõ_ˆ>%ѵïŠÞ9øãßûQEQEQEðÅùÛÜ×ÿ«+ÇUù£©ÊH¼ÿfCñ/ÿWÇÂjý.ø¯ÿ!ûoûšÿõexê¿4u/ùIƒìÈ~%ÿêøøM^;þ%_úöÿô˜›}˜ÿÛ¿š>Þ¢Š+œ ¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯¨?ÖÿÓo;þÞ|ÿ´ÿàëíkþÚÿ¨ÿö‡öÿüÍßð—ÆAü¿_P­ÿ¦Þwý¼ùÿiÿÁ×Úþ×ýµÿQÿííÿù›¿á.ÿŒƒè¡öÿíßý¸™n¿¯µÿ[ÿM¼ïûyóþÓÿƒ¯µý¯ûkþ£ÿÚÛÿó7Â]ÿàþ/ÿµ§ýŠþÿÔ/Ãõïëé·ÿo>Úðuö¿µÿmÔûCûþfïøK¿ã üÅÿò´ÿ±_Àÿú…ø~ª¿À¿Ä¿&(î½?Hakÿ%Jû!¿õoþÌUÓ×1kÿ%Jû!¿õoþÌUÓÖ3øhÿ×·ÿ§j”·—¯èˆhoù;_ø'×ý”ÚÿY¿Çuó‡ü·þL‡Sÿ²ŸðÿÿGj•ôí ÿ'kÿúÿ²ûBë7øî¾pÿ‚ÖÿÉêöSþÿèíR¶¥üL/ø_þªL¶—ªü¢~Êø¿þBÖŸö+øÿP¿Ñâÿù ZدàýBü?G‹ÿä-iÿb¿ÿõ ðý/ÿµ§ýŠþÿÔ/ÃõŒ¿åçý|_ûx×Ùÿ ÿÛN^¹É-ø/ÿd#àOþªWO\Ç€?ä–üÿ²ð'ÿU‚¨_Ÿý|¥ÿ¤ÖUèÿ8Ÿ8~ÕÿòýŽÿí ß±þ®¾·øñû|üSø]uû`xïÀß³çÃÿþÎ_ðO϶ÿÃXxÛÅ´ˆþ|l_øD¿g†¿µçÄOøg‚º?ìóñ+À¿²þü]ðJø/þOí û?ÿÂ_ñv?ø\ÿ„Áš>“ñ_ÄŸþÚž%ðç‚ôïÙkÆ>1ñ‰á?øOöëý‘?ÿ‚„xCÀßÿfßøX¿±·ÁŸØƒÅßð…|ðïÉ>ý¡?áð—ÁM?ã7‡?·h_Ùïþøº÷á&§ÿ™áˆ>-x›Ýʲü~3)a0X¼Ta7Ë †­^0“ÕFN”$¢ÚÕ&ÓkS–½zejµ©RrWJ¥HA´’»JM]zºº‡íð²_‹ºgÁ üWýŸõGÄ Á_þê|9¤|]øÿ —Á?Š_üe¦|/ÓtßøƒÄ-мâgøwý§ðOHø¥ñ—Fñ¯eðÂO ø£áÿ‹ß?à_¶  ×tÛ¯àÿмð³Ä+¶ø¡â¯ÙÛþ ÛñCöfƒÀÕ> |Tø»y¬ëÃöAøÛáM#â—ˆ-´Ùë]ñ-Ÿ†~/ëþÓ¼ðkÂ?´Åÿ x²ÒÛáç‹ü+ã?ʯÛv_اãg†ÿk»ícþ wûøOáßÅÏÚãïíªk>øíáŒ<5ðkÇ¿ð@Á/¯†~ øýüIñSãñ“V—ÇZ7Â?j?Ž>Û[Yø{Å ñT³ð1øƒâ‡íðÿþ ÙâßÚSâµÇí3ÿéý™,µ?Ùÿß³ÿƒ¥ø‹û^|Gð¾â¯·ì;ÿÆýŸõ`ÑiŸÙCöJøõkÿÇŽ¿à¥u¯kPþÏúÂËïEâé~üVøñ7Â>0øSáŸOû:ÿ¡>iÿ†ü_ÿ)1úîþ‚ðßø>—ÿ&^š7í ûü'ø5âÍcÃßf†Ÿ³çìµâ oÙëÇZ¦ñ/áOƒ~ ~Î~*ð4þð-ŸÀï_XëZo‚~øƒÁ×:烼mðÓX—ÃÚ‡çÕü3áè´[I5 .Îo?oŠ¿ ÿk߈_ÿeËÿj_ bý˜?cßÚƒÃß¾þÑ¿¾j?<+ûJ|Lý¦-|(Ÿ~'þÏž$ð/¼?áû+oÙcKñ$>4ð/ʼn´ï‰ÞøqáË˼-o¨¯‹ÿ"¾>øßöS¹ø§ãŸþÌŸðP¯ø'O€¾ÝþÏÿ°·À­'övðWü?IýŒ¿á6ð'ì¯â?Ûþòÿá%Ÿíû4&µñ7öPøá{ßÚ‡àįxƒà6‘âcÆßð¡|Gû8øÇÃ^ø?ñ/^×®Oø%ÿÿe?ØóÄÿ¼Yñ{þ ÿéÿ‹¡ðÿNдÿxGþ ¤þÐdžõøx'ü'ö¶ºÓüEñãZxâÅ_ìÿ‡ÿ·¿ ÏñKÆvßðøûÇ~ø‹¬ø¯L´ÿ‰V»â“û:ÿ¡>iÿ†ü_ÿ)®àÿè/ ÿƒéògÖßðOŠ¿ôÿÙàçÆùf¿ÙƒàÀŸÚ“Ãÿ³‡Æ½Çà¥ÿ´?íñ÷Ç>*ý©|Að#Â^Óþ6|Cøÿûé~)ñïÆøSâÍáçÂë_üuø‘¨ø‡Æžøû(ø;UðßÃmOÞ3øiõÿìÏû||øýð÷ö=¼ñăÿ h?Ûö`øIûPxöTÖ~3x/RøË'…~'ü3o‰7‰á? ß?†~Î_´÷ö¿ŒÿcMÇÿ¿h¯Ž^5øyâ?k<;{ã€ü?û9øá÷ųû:ÿ¡>iÿ†ü_ÿ)®àÿè/ ÿƒéògõiãoÚàÃOh~øñÇàÿ€¶Õ.|%¯Å§àjµì±¢xïâ—ÂÝgö–ýŸô‰¿¾ê>5ü:Ôþ2|:°ñßÁÿ…šF¡x‹Uø—ñKÂ7^#‹ÄþéžñG†uÝCÆ^,ÓôYhþ"е;J+-_Ožãñ'öºñ?ì#ûAø«þ Aã¯~Þ¿ðL˜ ÁâoØÜkZ¿…þøËWøéðTÖcð…çˆõj? noµ¿5Ï‚ü.¯ñí»á¯‡ÿµW‹~$Z¯ü¿þ Óâ;-oþÂ_ |eø‹ÿ„øe£ÏáÏÚcöý³ÿeÿ `ÿ‚vi~ñ?ì‹ðwþTß´§Ã‡¾"ý >xÃTø§ñ3ÀŸü]ñ‹Ä-ÇÄߎ¾?ð[ŸØy×ý óOü7âÿùH}wÿAxoüKÿ“?©_…¿µì±ñÇXм;ðSö–ýŸþ0xƒÅõ?‹оüdøuñXñÂÍÇz‡ÂÝgâ^…¦xOÄz½î¯ðÿHø›¤j¿µ?ið\xrÃÇzf¡á­J/Y\éñoüý¡~~ÒžÔñ·Å_ü#ð iÖßðX¿ŒÿðPß]øWàö£ñkÄZî³ûAþÚ>>ð~¯£x|êÿ¼Q†¾ ø ࿆tïê0ø³ÆÚ÷ʼn·?4Ï |?°ó¯úæŸøoÅÿòúîþ‚ðßø>—ÿ&~úÑ_ÿÃÊàœÿôŸ±Oþ%GÀ¿þnèÿ‡”ÿÁ9ÿèÿ?bŸüJüÝÑý‡П4ÿÃ~/ÿ”‡×pô†ÿÁô¿ù3íj+âŸøyOüŸþóö)ÿĨøÿÍÝðòŸø'?ýçìSÿ‰Qð/ÿ›º?°ó¯úæŸøoÅÿòúîþ‚ðßø>—ÿ&büWÿý·ýÍú²¼u_š:—ü¤‹Á¿öd?ÿõ||&¯Ñ?x—Þ4Âþ1ðwˆ4OxGÅš&­â_ x§ÃZ­†»áÏøs]ñçŒõMĹ¥Ïu¦k:&³¦]Zê:V«§]\Øj60]ÚO5¼ÑÈßš—ü¤‹Á¿öd?ÿõ||&¯”œeµã(¸Ê0”e&¥$“Œ“³M4ÓM]=Þšq‹M4ÔkTÓjÍ>©ŸoQEÌPQEQEQEQEQEQEQEWÔëé·ÿo>Úðuö¿µÿmÔûCûþfïøK¿ã þ_¯¨?ÖÿÓo;þÞ|ÿ´ÿàëíkþÚÿ¨ÿö‡öÿüÍßð—ÆAôPûöïþÜL·_×Úˆ­ÿ¦Þwý¼ùÿiÿÁ×Úþ×ýµÿQÿííÿù›¿á.ÿŒƒðÿÈZÓþÅÿêáú÷õ¿ôÛÎÿ·Ÿ?í?ø:û_Úÿ¶¿ê?ý¡ý¿ÿ3wü%ßñ~âÿù ZدàýBü?U_à_â_“w^Ÿ¤0µÿ’¥ýŠ_ú·ÿf*é똵ÿ’¥ýŠ_ú·ÿf*éëü4ëÛÿÓµJ[Ë×ôGÄ?´7ü¯üëþÊí ÿ¬ßãºùÃþ [ÿ&C©ÿÙOøÿ£µJú?ö†ÿ“µÿ‚}Ù@ý¡?õ›üw_8ÁkäÈu?û)ÿÿôv©[Rþ&ü/ÿNÕ&[KÕ~Q?e|_ÿ!kOûüÿ¨_‡èñü…­?ìWð?þ¡~£Åÿò´ÿ±_Àÿú…ø~ÿÈZÓþÅÿêáúÆ_òóþ¾/ý¼kìÿ…ÿí§/\Ç€?ä–üÿ²ð'ÿU‚«§®cÀòK~ ÿÙøÿªƒÁT/áOþ¾RÿÒkªôœOɯø.Çü£çÇö8x_ÿI5Úþ>k_>~ÎÿðOmSâ׌¿bŸü$ñgÁOxëö”ø%âÿØþÛÇ¿µïíàëÛ›ö±ðŽaøYûDé²/µøÛÆß <¦ü"øO®^þÖßu_x›Ã:n³mâ…Z}¶™ñÿ¦ïø*Áïøh€¿~ÂEÿ‡ü//ÚoàÁïøK²?á ÿ„_þg‹Ç‚¿á"þÁþÓÑ?¶ÿ±?¶ÿ´¿²?¶tí/³}ûNÃÎûT_x«þ <ñ´/†¾ñ?ü£ûODøAà›ÿ‡_¬¿áŽt«/øG¼©üFñÿÅ«íí:íiw«yÿ~(øëÄÚäúž«öçöT7Ñèšf¦éÿÐq' e97ÄYÔò—W>§Jž‹­W §ƒæ£:^cF•Xbq4g ÏØÖ§ìÝj!Roâx›/ÌñXÊUð5ŠåÁʃr­J”aQâ¨V´Ôñ8yÊ2§NqisÂ\Ü“‹‹vþeüGûüøs¢\øïâ‡íñCNøoᯅÿ°æ­ã½KÀ_³Ÿ…j_ðÍß n ã_ü_ñçÄOxÇÁž6ð߯oÙ£âÄo†Öº'ìñã_²[h ,þÚðOÁïj¾ø¥ÿßø!ñ“áÍþ…û?|9Ò>|¿¸øUñgâ¯>¿¾|3Ò?á ð¿Ä¯øD‡Äk ^ñ½§ü%Oÿ Çâ=­þ äý¨ôox»Ã³ÁTtO\xßDø¿á­kÇŸÿàžŸþ/|iµðçÇëØüfðÿ…>>|Sø¹ãÞÑ>"¿Ä‰:ω4¯|Aðå…׊þ$üFñ¢A‹¼}âíoYýkâ®C^„è.9¸ÕÃÆ•Wý“R”¥<¾4«û9Óá)N”=Õ­tåV¶T©Òž_VœªUùŠ|3Ž„ã?ìj©ÂnQÿjÁÉ%îpæRÍ“ta­£ ŠR”kÆJ0þKl¿à›ŸhøûdøŒÞF‰ûþÔ>1øã?Ãðïí¯‹¾ü.øKûu|qø™ñ3Ã[ZEãk?‡ß°Ï‰að/ÂWÄöš‹¼cãÝCñÅïhšMÿŠî8càì­iû!~Òßüñ3Æßu¿ ükýŒ¼/ðsÄúß›χ¾2ÒáhøköÑ›â¯Âߌ^â÷‰¾x;ûRÓউñ'@ñ¿Ãß~Ñ~~•£|2ðâÜx[ø‡ñ{Cø]ý‘ßÁ¿lmGJÓô;Ïø+›¢ZxÛGø•ªèëûü-ƒJñïÄm?Áß~xƒÇÿ´ø>2Eiñ¯Æßþ|WñßhÏ|]‡ÆÚïíAàíZÏô]ÿÅÃÞ±Ñü¿Ç¿ðmljv-ÐüYÿ9ÑÂ>2Ñ<áûχ~ý>ø#á_†ì<â=cžŸá—Â|jðïúޓâ?|AÕ‰~x[Á^#¾›âïÇ(õ-Vòßã§Æ|mµ/¸z¥XýspÑ£™Lùp™v{þ§ˆÂTÌ}§übTêÔYŒ(×ýÔq4iÒŽ"xwÏMÆt¦\/Œ_²Éê9¸â•êâ0Oø°«?/ü*J1táï:s”œ×,“Rü8ý–¿g¤ÿ‚&x@øQàKãŠxÛáïÄ_Žþ›E¶×®jïÙ¯ÅðRÚ{À^>Ö2kž%ñ-Ž‹ð7öDñF±¤þyü ýƒ.~5þÎ~;ø¼ÿÿáøƒ¢x'ãGŇŸ|k/ÀBø¯ð—à|Aãψ/ð’ø‡ö•Ð?iÏî‹áßÅßè:—¯٠â·Ã~#xëÃ>&ø§áKMâ¾·ð“úÓøÿÒþÐß ¼oû>üIøqÿ`ÖüãŸÙgDºð×À¯h±ö‰aà¯j?>"üNÕü?8‹ö†þ/Ñ5ÿ|[øþ%Ò¼s‰l,Óü{ãû‹ÿ ü5ñ¿…4(u߈>?ñE……§‰¼qâ­_WÁx¡ÃXJ™„òþ6Â[‹|:Æå\M]áèÏ3ÏqØœ2u2:ß»œqØI+º1Xœ-RÃa°(¿õo1« “ÕýÕ' žË—ANqÃ`¨Ó©îãaï'B¿>Êw§VjU*Vgòùñ“þ ›ðçÀZïÆ? xöñ·¼Mð߯߶ïÂß ÇãÙóBøw¡x³â7üƒáÊ|ký¬íõ½[Eý¡>&jðLß 5 ÝþÎÞ(°Ð|g®üUø}â|JðGÀ è:wÄyí±ÿüÑ?c¯JÏûGü/ø‹ñ#Á$ø1ño᎓ãÙçQñ™ã{Kk]økáÏ„Ÿ´—ÆÏŠš§Âÿ ëÞ×¼?â¯þÑ_ e?ˆÿ‰~ØÜ|)oø›Æ¾øeýië_ðn/í)âwÄž%Ö?à«?lÖü]ãoÚÏâ/ˆoá†|oý¡ãÛ›áÎð—ö¦Ö>ÍkñÆ KOøZ?´?ÃÿÙö0[i^ û?ö¯Ã«ërÏ©K‰ñkþ  øãñÃÖ^øÿ9Ñ5=2=nÛÅ~!ºÐ`O†~ñÅÙØjZu—ÄoŽÞ1ðƯ x»ö„ø¡eo¯x²K?‰ÿµÏˆ_-/üyñT·ñ$zŸÄÝø‡l‹9,FZñ|y‚Äá©Âo4‹Ès•[QÕš‚ÃÊ— áá QÃÆ”¤œiT–"¥{N4aJVá|l©â,’µ:’kêÏë¸GG–.^ÑK1¨ÜœÜÒ~ôU8ÃG7&4Wö±ÿ{ÿÖD?óRü¦¨ÿˆ=ÿë"ù©?þSUõ¿ñü5ÿ¢“ÿ0ùÿÿ:Ï/ýQâúÿåÞÿšO➊þÖ?âúȇþjOÿ”Õñ¿ýdCÿ5'ÿÊjøŒþÿÑIÿ˜|ÿÿaþ¨ñý ÿòïÿÍ'ñOEkñ¿ýdCÿ5'ÿÊjøƒßþ²!ÿš“ÿå5GüF è¤ÿÌ>ÿΰÿTx‡þ…ÿùwÿæ“öKö-ÿ“ÿ‚}ÿÙ”üÿÔTW“ê_ò’/ÿÙüKÿÕñðš¾ÃðÁïøg‚_³ÏÀøH¿á/ÿ…ðS¿¿á-þÈÿ„þøVz†»à¯øH¿°´õ¿ìOí¿ìOí?ìí_û7í?cþÓ¿ò~×/Çš—ü¤‹Á¿öd?ÿõ||&¯àlÚµ,No›â(ËžŽ#­J|²=*µåRœ¹f£8óBIòÊ1’½¤“º?kÂÂTð˜jsVœ(aá%tí(Â’ºm;4ÕÓiômoQEä!EPEPEPEPEPEPEP_P­ÿ¦Þwý¼ùÿiÿÁ×Úþ×ýµÿQÿííÿù›¿á.ÿŒƒù~¾ ÿ[ÿM¼ïûyóþÓÿƒ¯µý¯ûkþ£ÿÚÛÿó7Â]ÿÑCíÿÛ¿ûq2Ý_j!þ·þ›yßöóçý§ÿ_kû_ö×ýGÿ´?·ÿænÿ„»þ2Áü_ÿ!kOûüÿ¨_‡ëÞ?ÖÿÓo;þÞ|ÿ´ÿàëíkþÚÿ¨ÿö‡öÿüÍßð—ÆAø?‹ÿä-iÿb¿ÿõ ðýU‰~LQÝz~<Â×þJ”öB>)êßý˜«§®b×þJ”öB>)êßý˜«§¬gðÑÿ¯oÿNÕ)o/_ÑþÐßòv¿ðO¯û(´'þ³Žëçø-oü™§ÿe?áÿþŽÕ+èÿÚþN×þ õÿeö„ÿÖoñÝ|áÿ­ÿ“!Ôÿì§ü?ÿÑÚ¥mKø˜_ð¿ý;T™m/UùDý•ñü…­?ìWð?þ¡~£Åÿò´ÿ±_Àÿú…ø~ÿÈZÓþÅÿêáú<_ÿ!kOûüÿ¨_‡ëËÏúø¿öñ¯³þÿ¶œ½sÿ’[ð_þÈGÀŸýT ®ž¹É-ø/ÿd#àOþªP¿…?úùKÿI¬>«Ñþq>pý«ÿä%ûÿÚA¿bÿý]:~ûWàOí_ÿ!/ØïþÒ ûÿêéÐ+÷Ú½,ðWø¥ù™Oâ/ÉQ]D…Q@Q@Q@Q@Q@Q@üWÿý·ýÍú²¼u_š:—ü¤‹Á¿öd?ÿõ||&¯ÒïŠÿò¶ÿ¹¯ÿVWŽ«óGRÿ”‘x7þ̇â_þ¯„Õã¿âUÿ¯oÿI‰·Ùý»ù£íê(¢¹Ê (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ úƒýoý6ó¿íçÏûOþ¾×ö¿í¯úÿhoÿÌÝÿ wüdËõõúßúmçÛÏŸöŸü}¯íÛ_õþÐþßÿ™»þïøÈ>ŠoþÝÿÛ‰–ëúûQõ¿ôÛÎÿ·Ÿ?í?ø:û_Úÿ¶¿ê?ý¡ý¿ÿ3wü%ßñ~âÿù ZدàýBü?^ñþ·þ›yßöóçý§ÿ_kû_ö×ýGÿ´?·ÿænÿ„»þ2Áü_ÿ!kOûüÿ¨_‡ê«ü üKòbŽëÓôæ¿òT ÿ²ñKÿVÿìÅ]=s¿òT ÿ²ñKÿVÿìÅ]=c?†ý{úv©Kyzþˆø‡ö†ÿ“µÿ‚}Ù@ý¡?õ›üw_8ÁkäÈu?û)ÿÿôv©_GþÐßòv¿ðO¯û(´'þ³Žëçø-oü™§ÿe?áÿþŽÕ+j_ÄÂÿ…ÿéÚ¤Ëiz¯Ê'쯋ÿä-iÿb¿ÿõ ðý/ÿµ§ýŠþÿÔ/Ãôx¿þBÖŸö+øÿP¿Ñâÿù ZدàýBü?XËþ^×Åÿ·}Ÿð¿ý´åë˜ðü’ß‚ÿöB>ÿê ðUtõÌxþIoÁû!õPx*…ü)ÿ×Ê_úMaõ^ó‰ó‡í_ÿ!/ØïþÒ ûÿêéÐ+÷Ú¿jÿù ~ÇöoØ¿ÿWN_¾Õé`ÿ‚¿Å/ÌÊù~H(¢Šê$(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šø?â¿ü‡í¿îkÿÕ•ãªüÑÔ¿å$^ ÿ³!ø—ÿ«ãá5~—|Wÿý·ýÍú²¼u_š:—ü¤‹Á¿öd?ÿõ||&¯ÿ¯ý{úLM¾ÌíßÍoQEÎPQEQEQEQEQEQEQEWÔëé·ÿo>Úðuö¿µÿmÔûCûþfïøK¿ã þ_¯¨?ÖÿÓo;þÞ|ÿ´ÿàëíkþÚÿ¨ÿö‡öÿüÍßð—ÆAôPûöïþÜL·_×Úˆ­ÿ¦Þwý¼ùÿiÿÁ×Úþ×ýµÿQÿííÿù›¿á.ÿŒƒðÿÈZÓþÅÿêáú÷õ¿ôÛÎÿ·Ÿ?í?ø:û_Úÿ¶¿ê?ý¡ý¿ÿ3wü%ßñ~âÿù ZدàýBü?U_à_â_“w^Ÿ¤0µÿ’¥ýŠ_ú·ÿf*é똵ÿ’¥ýŠ_ú·ÿf*éëü4ëÛÿÓµJ[Ë×ôGÄ?´7ü¯üëþÊí ÿ¬ßãºùÃþ [ÿ&C©ÿÙOøÿ£µJú?ö†ÿ“µÿ‚}Ù@ý¡?õ›üw_8ÁkäÈu?û)ÿÿôv©[Rþ&ü/ÿNÕ&[KÕ~Q?e|_ÿ!kOûüÿ¨_‡èñü…­?ìWð?þ¡~£Åÿò´ÿ±_Àÿú…ø~ÿÈZÓþÅÿêáúÆ_òóþ¾/ý¼kìÿ…ÿí§/\Ç€?ä–üÿ²ð'ÿU‚«§®cÀòK~ ÿÙøÿªƒÁT/áOþ¾RÿÒkªôœOœ?jÿù ~ÇöoØ¿ÿWN_¾ÕøûWÿÈKö;ÿ´ƒ~Åÿúºt ýö¯Küþ)~fSøŸËòAEWQ!EPEPEPEPEPEPÁÿÿä?mÿs_þ¬¯W接ÿ)"ðoý™Ä¿ý_ «ô»â¿ü‡í¿îkÿÕ•ãªüÑÔ¿å$^ ÿ³!ø—ÿ«ãá5xïø•ëÛÿÒbmöcÿnþhûzŠ(®r‚Š( Š( Š( Š( Š( Š( Š( ¾ ÿ[ÿM¼ïûyóþÓÿƒ¯µý¯ûkþ£ÿÚÛÿó7Â]ÿòý{u÷Šl¬Z5-Réo.ô½7Rž;oÅ©ÛEý¿¤Ë«¤?iÔ¼w º“ˆ W2jý¥"ê§SŽõ|[ãƒâèµkÿwª_ÍÝ¢^ëúë²ÿ[ÿM¼ïûyóþÓÿƒ¯µý¯ûkþ£ÿÚÛÿó7Â]ÿàþ/ÿµ§ýŠþÿÔ/Ãõæµßí5uð öløÏñ“Áð[ø—Å~ðn§¬x{FñO†$·ðõÞ¯u=Í…”šõÅ·5-JûM²¸×þ£cµxŽ}WL¾ÔíŸÇ8ÕuÏOñü…­?ìWð?þ¡~ª¬ïMImÏmÓÕFïfû¡GGo/>Ñ]}æ¿òT ÿ²ñKÿVÿìÅ]=s¿òT ÿ²ñKÿVÿìÅ]=e?†ý{úv©Kyzþˆø‡ö†ÿ“µÿ‚}Ù@ý¡?õ›üw_8ÁkäÈu?û)ÿÿôv©_GþÐßòv¿ðO¯û(´'þ³Žëçø-oü™§ÿe?áÿþŽÕ+j_ÄÂÿ…ÿéÚ¤Ëiz¯Ê'쯋ÿä-iÿb¿ÿõ ðý/ÿµ§ýŠþÿÔ/Ãôx¿þBÖŸö+øÿP¿Ñâÿù ZدàýBü?XËþ^×Åÿ·}Ÿð¿ý´åë˜ðü’ß‚ÿöB>ÿê ðUtõÌxþIoÁû!õPx*…ü)ÿ×Ê_úMaõ^ó‰ó‡í_ÿ!/ØïþÒ ûÿêéÐ+÷Ú¿ ÇÔWËÿð¾ÿéóÿ,?ÿTÂûÿ§Ïü°ÿüiQõª]ÿÿòAÊÿ«ùyyþ±õòÿü/¿ú|ÿËÿÆ•ð¾ÿéóÿ,?ÿT}j—Æ?ür¿êþ^^ƒì}AE|¿ÿ ïþŸ?òÃÿñ¥Gü/¿ú|ÿËÿÆ•Z¥ßñÿ$¯ú¿——ŸàûPQ_/ÿÂûÿ§Ïü°ÿüiQÿ ïþŸ?òÃÿñ¥GÖ©wücÿÉ+þ¯ååçø>ÇÔWËÿð¾ÿéóÿ,?ÿTÂûÿ§Ïü°ÿüiQõª]ÿÿòAÊÿ«ùyyþ±åÿÿä?mÿs_þ¬¯W接ÿ)"ðoý™Ä¿ý_ «ôCƺý—ˆo쮬žê_*×Pû\·Vižeî§â]ÄýžÎ-WYò­bþÙKx|Ûù¥o%™ñO„Ù|ð=ßÇ;oúçŠ|Wgâ}/á>¥ð{Iðö“áý#PÐFƒ®xÃHñ®³¬ê7wšö›¨\jójÐìtËkd³³Ó,íõinÛYŸX³œäœê;¯z -U¯h«^öïÔÖÚ%þýþ¿3Ñ(®£ìž ÿ ÿŠ?ðÒù¸£ìž ÿ ÿŠ?ðÒù¸¬¹_xÿàpÿä‡_¹ÿ]>Ìåè®£ìž ÿ ÿŠ?ðÒù¸£ìž ÿ ÿŠ?ðÒù¸£•÷þþH/ë÷?ë¯çÙœ½Ô}“ÁôñGþOÿ7}“ÁôñGþOÿ7r¾ñÿÀáÿÉý~çýuüû3—¢º²x/þƒþ(ÿÂCIÿæâ²x/þƒþ(ÿÂCIÿæâŽWÞ?ø?ù ¿¯Üÿ®¿ŸfrôWQöOÿÐÅøHi?üÜQöOÿÐÅøHi?üÜQÊûÇÿ‡ÿ$õûŸõ×óìÎ^Šê>Éà¿úø£ÿ 'ÿ›Š>Éà¿úø£ÿ 'ÿ›Š9_xÿàpÿä‚þ¿sþºþ}™ËÑ]GÙ<ÿAÿá!¤ÿóqGÙ<ÿAÿá!¤ÿóqG+ïüü_×î×_ϳ9z+¨û'‚ÿè?âü$4Ÿþn(û'‚ÿè?âü$4Ÿþn(å}ãÿÃÿ’ úýÏúëùög/\'í7ðÛÄ?ô›{?øóża¦x_Á×z­ ø]Ñ4Ûˉ<áÑ&“âk]ê/¶éw¾Th—ÂÞãRЮßiësnúž¬{Ù<ÿAÿá!¤ÿóq_jŸ±Ì:Æ¡u©ßþßÿðP»¼”Ë/Ùï~ØÚÄ µ–Ÿaàkk :ÂÖŽÚÃMÓí­tý>Î(,¬m­í †ÒšµÛœbÔ£$ï^ÊI¦¯kk­÷%êÖéæ·qü·ùyaûx;Dø}ÿôøõàý#Äž-ñåΕðêv×¾"xßYÖõ={ÆÚíÆ³¢}»T‡MÕuMJÛž„ĶÞðÆž|Ë5ã[¾ÕõëÍGQ›ô{Åÿò´ÿ±_Àÿú…ø~¿?|aÿ÷ð/Ä kž ñ·í»ûyx£Âž$ÓçÒµÝY¼ø#{¦êv ¹·—ÁeN$°Ê»f¶¸Ž+›y"ž(äO¾[•#[¹öÆèBÙêÉ:v挤깾T’IÅ$’MíËù^ìQZ­\¶×äÿ[|™çV¿òT ÿ²ñKÿVÿìÅ]=s¿òT ÿ²ñKÿVÿìÅ]=e?†ý{úv©Kyzþˆø‡ö†ÿ“µÿ‚}Ù@ý¡?õ›üw_8ÁkäÈu?û)ÿÿôv©_GþÐßòv¿ðO¯û(´'þ³Žëçø-oü™§ÿe?áÿþŽÕ+j_ÄÂÿ…ÿéÚ¤Ëiz¯Ê'쯋ÿä-iÿb¿ÿõ ðý/ÿµ§ýŠþÿÔ/Ãôx¿þBÖŸö+øÿP¿Ñâÿù ZدàýBü?XËþ^×Åÿ·}Ÿð¿ý´åë˜ðü’ß‚ÿöB>ÿê ðUtõÉÛü;øqikecká[Yi¶Vgoñ×ö™†ÖÃLÒìàÓ´Í6ÊÞ?‹ ­†§Û[XØYÀ‘ÛÙÙÛÁmopÅ) ÆR弡$ìߪ&´ÿ½Óòkïkþ ÖQ\Çü ?ÿè]ñ?þŸÚsÿŸmð€ü?ÿ¡wÄÿø~iÏþ}´rÓÿŸŸù$‚ï·ãéþoîó:z+˜ÿ„áÿý ¾'ÿÃóûNóí£þ‡ÿô.øŸÿÏí9ÿ϶ŽZóóÿ$]öü}?ÍýÞgOEsð€ü?ÿ¡wÄÿø~iÏþ}´Âðÿþ…ßÿáùý§?ùöÑËOþ~ä’ ¾ß§ù¿»Ìéè®cþ‡ÿô.øŸÿÏí9ÿ϶ø@~ÿлâü??´çÿ>Ú9iÿÏÏü’AwÛñôÿ7÷y=ÌÂðÿþ…ßÿáùý§?ùöÑÿÃÿú|Oÿ‡çöœÿçÛG-?ùùÿ’H.û~>Ÿæþï3§¢¹ø@~ÿлâü??´çÿ>Ú?áøÿBï‰ÿðüþÓŸüûhå§ÿ??òIßoÇÓüßÝætôW1ÿÃÿú|Oÿ‡çöœÿçÛGü ?ÿè]ñ?þŸÚsÿŸm´ÿççþI »íøú›û¼ÎžŠæ?áøÿBï‰ÿðüþÓŸüûhÿ„áÿý ¾'ÿÃóûNóí£–ŸüüÿÉ$}¿Oów™ÓÑ\Çü ?ÿè]ñ?þŸÚsÿŸmð€ü?ÿ¡wÄÿø~iÏþ}´rÓÿŸŸù$‚ï·ãéþoîó:z+˜ÿ„áÿý ¾'ÿÃóûNóí£þ‡ÿô.øŸÿÏí9ÿ϶ŽZóóÿ$]öü}?ÍýÞgOEsð€ü?ÿ¡wÄÿø~iÏþ}´Âðÿþ…ßÿáùý§?ùöÑËOþ~ä’ ¾ß§ù¿»Ìéè®cþ‡ÿô.øŸÿÏí9ÿ϶ø@~ÿлâü??´çÿ>Ú9iÿÏÏü’AwÛñôÿ7÷y=ÌÂðÿþ…ßÿáùý§?ùöÑÿÃÿú|Oÿ‡çöœÿçÛG-?ùùÿ’H.û~>Ÿæþï3§¢¹ø@~ÿлâü??´çÿ>Ú?áøÿBï‰ÿðüþÓŸüûhå§ÿ??òIßoÇÓüßÝætôW1ÿÃÿú|Oÿ‡çöœÿçÛGü ?ÿè]ñ?þŸÚsÿŸm´ÿççþI »íøú›û¼ÎžŠæ?áøÿBï‰ÿðüþÓŸüûhÿ„áÿý ¾'ÿÃóûNóí£–ŸüüÿÉ$}¿Oów™ÓÑ\Çü ?ÿè]ñ?þŸÚsÿŸmð€ü?ÿ¡wÄÿø~iÏþ}´rÓÿŸŸù$‚ï·ãéþoîó:z+˜ÿ„áÿý ¾'ÿÃóûNóí£þ‡ÿô.øŸÿÏí9ÿ϶ŽZóóÿ$]öü}?ÍýÞgOEsð€ü?ÿ¡wÄÿø~iÏþ}´Âðÿþ…ßÿáùý§?ùöÑËOþ~ä’ ¾ß§ù¿»Ì-ä©Aÿd#â—þ­ÿÙŠºzÌѼ9á]êž…áË«mcPÐn|2ú¶¯ñ âÿ®mt;ísÞ!Ô,´ëoˆ|Y¥éÿÚ§„ô nîmtøîåOŠp±–S§EG ¢ù¹aÊÝšÕÎrÙùI¾·Òîÿ‚>!ý¡¿äíàŸ_öP?hOýfÿ×ÎðZßù2OþÊÃÿýªWÑÿ´7ü¯üëþÊí ÿ¬ßãºùÃþ [ÿ&C©ÿÙOøÿ£µJÚ—ñ0¿áúv©2Ú^«ò‰û+âÿù ZدàýBü?G‹ÿä-iÿb¿ÿõ ðý/ÿµ§ýŠþÿÔ/Ãôx¿þBÖŸö+øÿP¿Ö2ÿ—Ÿõñíã_gü/ÿm9z(¢³((¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šø‡ö†ÿ“µÿ‚}Ù@ý¡?õ›üw_8ÁkäÈu?û)ÿÿôv©_GþÐßòv¿ðO¯û(´'þ³Žëçø-oü™§ÿe?áÿþŽÕ+ª—ñ0¿áúv©Ú^«ò‰û+âÿù ZدàýBü?G‹ÿä-iÿb¿ÿõ ðý/ÿµ§ýŠþÿÔ/Ãôx¿þBÖŸö+øÿP¿Ö2ÿ—Ÿõñíã_gü/ÿm9z(¢³((¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šø‡ö†ÿ“µÿ‚}Ù@ý¡?õ›üw_8ÁkäÈu?û)ÿÿôv©_GþÐßòv¿ðO¯û(´'þ³Žëçø-oü™§ÿe?áÿþŽÕ+ª—ñ0¿áúv©Ú^«ò‰û+âÿù ZدàýBü?G‹ÿä-iÿb¿ÿõ ðý/ÿµ§ýŠþÿÔ/Ãôx¿þBÖŸö+øÿP¿Ö2ÿ—Ÿõñíã_gü/ÿm9z(¢³((¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šø‡ö†ÿ“µÿ‚}Ù@ý¡?õ›üw_8ÁkäÈu?û)ÿÿôv©_GþÐßòv¿ðO¯û(´'þ³Žëçø-oü™§ÿe?áÿþŽÕ+ª—ñ0¿áúv©Ú^«ò‰û+âÿù ZدàýBü?G‹ÿä-iÿb¿ÿõ ðý/ÿµ§ýŠþÿÔ/Ãôx¿þBÖŸö+øÿP¿Ö2ÿ—Ÿõñíã_gü/ÿm9z(¢³((¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šø‡ö†ÿ“µÿ‚}Ù@ý¡?õ›üw_8ÁkäÈu?û)ÿÿôv©_GþÐßòv¿ðO¯û(´'þ³Žëçø-oü™§ÿe?áÿþŽÕ+ª—ñ0¿áúv©Ú^«ò‰û+âÿù ZدàýBü?G‹ÿä-iÿb¿ÿõ ðý/ÿµ§ýŠþÿÔ/Ãôx¿þBÖŸö+øÿP¿Ö2ÿ—Ÿõñíã_gü/ÿm9z(¢³((¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šø‡ö†ÿ“µÿ‚}Ù@ý¡?õ›üw_8ÁkäÈu?û)ÿÿôv©_GþÐßòv¿ðO¯û(´'þ³Žëçø-oü™§ÿe?áÿþŽÕ+ª—ñ0¿áúv©Ú^«ò‰û+âÿù ZدàýBü?G‹ÿä-iÿb¿ÿõ ðý/ÿµ§ýŠþÿÔ/ÃõñïÅ_Û?Â^ñÖ­áËOÿµÇ‹×Ö~ðíψ¼û/üZÖ<+¨êz†´}'XþÁÖ¥Ð,¢×4ÛMVÎöÆß\Ó¢ŸDÖVÛûS@ÔumïOÕ/2qruUß:vºZ{ýíÝ }ŸðÛïå±ôÕñü77‡?èÚ¿mïüDü«£þ›ÃŸôm_¶÷þ"wÅOþUÒöU?—ñùŽë¿õ§ù£íê+âønoѵ~Ûßø‰ß?ùWGü77‡?èÚ¿mïüDü«£ÙTþ_Æ?æ]ÿ­?ÍoQ_ÿÃsxsþ«öÞÿÄNø©ÿʺ?á¹¼9ÿFÕûoâ'|Tÿå]ʧòþ1ÿ0ºïýiþhûzŠø‡þ›ÃŸôm_¶÷þ"wÅOþUÑÿ ÍáÏú6¯Û{ÿ;â§ÿ*èöU?—ñù…×ëOóGÛÔWÄ?ðÜÞÿ£jý·¿ñ¾*ò®ønoѵ~Ûßø‰ß?ùWG²©ü¿ŒÌ.»ÿZš>Þ¢¾!ÿ†æðçýWí½ÿˆñSÿ•tÃsxsþ«öÞÿÄNø©ÿʺ=•OåücþaußúÓüÑöõñü77‡?èÚ¿mïüDü«£þ›ÃŸôm_¶÷þ"wÅOþUÑìª/ãó ®ÿÖŸæ·¨¯ˆá¹¼9ÿFÕûoâ'|Tÿå]ðÜÞÿ£jý·¿ñ¾*ò®eSùÿ˜]wþ´ÿ4}½E|Cÿ ÍáÏú6¯Û{ÿ;â§ÿ*èÿ†æðçýWí½ÿˆñSÿ•t{*ŸËøÇüÂë¿õ§ù£íê+âønoѵ~Ûßø‰ß?ùWGü77‡?èÚ¿mïüDü«£ÙTþ_Æ?æ]ÿ­?ÍoQ_ÿÃsxsþ«öÞÿÄNø©ÿʺ?á¹¼9ÿFÕûoâ'|Tÿå]ʧòþ1ÿ0ºïýiþhûzŠø‡þ›ÃŸôm_¶÷þ"wÅOþUÑÿ ÍáÏú6¯Û{ÿ;â§ÿ*èöU?—ñù…×ëOóGÛÔWÄ?ðÜÞÿ£jý·¿ñ¾*ò®ønoѵ~Ûßø‰ß?ùWG²©ü¿ŒÌ.»ÿZš>Þ¢¾!ÿ†æðçýWí½ÿˆñSÿ•tÃsxsþ«öÞÿÄNø©ÿʺ=•OåücþaußúÓüÑöõñü77‡?èÚ¿mïüDü«£þ›ÃŸôm_¶÷þ"wÅOþUÑìª/ãó ®ÿÖŸæ·¨¯ˆá¹¼9ÿFÕûoâ'|Tÿå]ðÜÞÿ£jý·¿ñ¾*ò®eSùÿ˜]wþ´ÿ4}½E|Cÿ ÍáÏú6¯Û{ÿ;â§ÿ*èÿ†æðçýWí½ÿˆñSÿ•t{*ŸËøÇüÂë¿õ§ù£íê+âønoѵ~Ûßø‰ß?ùWGü77‡?èÚ¿mïüDü«£ÙTþ_Æ?æ]ÿ­?ÍoQ_ÿÃsxsþ«öÞÿÄNø©ÿʺ?á¹¼9ÿFÕûoâ'|Tÿå]ʧòþ1ÿ0ºïýiþhûzŠø‡þ›ÃŸôm_¶÷þ"wÅOþUÑÿ ÍáÏú6¯Û{ÿ;â§ÿ*èöU?—ñù…×ëOóGÛÔWÄ?ðÜÞÿ£jý·¿ñ¾*ò®ønoѵ~Ûßø‰ß?ùWG²©ü¿ŒÌ.»ÿZšÚþN×þ õÿeö„ÿÖoñÝ|áÿ­ÿ“!Ôÿì§ü?ÿÑÚ¥všŸÅkÿ¿µGìq©øoà—í'á ᯌ>3j¾-×~)|ø‡ðÿÃÚ}‡‰>øóAÒç“ÄÖŽº,>v´ÖzZÅ{i4÷ÚžŸogÔ“:ÅÅÿÁkäÈu?û)ÿÿôv©[ÓMUÃ'ºŽªéÚõ*¾žM?™2øeê¿(Ÿ²¾/ÿµ§ýŠþÿÔ/ÃõË×Qâÿù ZدàýBü?\½sOã—ø¥ù²£²ô_QE# (¢€ (¢€ (¢€ (¢€ (¢€ øÃߵĿÃâ=cáì+ûQüHðN…ñ3ã'ÂËé_¿àŸ> мY®ü ø¿ã¯ž=Ôü;¡|\ý¹¾|D‹Ãñ|DøqâÍ7H½ñ7‚<9yªYØG¨Ç§Gmu7Ùõò‡ìCÿ&ë'ýü×ÿ^›ûlVQ圥n^[+µ»·A;Ý%æþæ¿;‡ü/¯Ú+þ‘ÁûWÿáóÿ‚YôÇ(ÿ…õûEÒ8?jÿü>ðK/þ˜å}_EÔÿçßþO ³ïøz“ûü”?á}~Ñ_ôŽÚ¿ÿŸüËÿ¦9Gü/¯Ú+þ‘ÁûWÿáóÿ‚YôÇ+êúü½øûRþѾ,³ý†>/|EÔ> ê¿ÿà ßØßð‚ü.ðWÂïx?â7ÀOøN¿e_Šßµç†?á-øÉ®ünñ÷†~7ÿÂ-ោ—ß uïìÿÿá/×|Oiñ7Oÿ„3Oðôß ü@ÓƒMªkOï˳ziÙ7òï`Õnÿ4¿¯_#é?ø__´Wý#ƒö¯ÿÃçÿ²ÿéŽQÿ ëöŠÿ¤p~Õÿø|ÿà–_ý1Êòø'‡íiñöãøðWömÁ:Âï|ðÏü$z†Ÿ¦ë¶ú¯ÿhÕ¶Ñ,~2ÿºÑõ^Ýü=ø'ð_âñ áEü'ƒÅ:ø¹ã+}cZÑ?áø]ðëÁ?iÏÐÚ$áâéjšç–tÛ~ý¶zݾšöééÿïò>Pÿ…õûEÒ8?jÿü>ðK/þ˜åð¾¿h¯úGí_ÿ‡Ïþ eÿÓ¯«è¥ÍOþ}ÿäò >ÿ‡§ù?¿Èøëötý²|?ûBü^ý¡~ËðƒâÇÁÏŠ?³-¿Â«Ÿ‰ø“¬|ñM„‘ü`¶ñÍφ#ðß‹?gŸŽ_|«]iëðû\·ñE”¾ ±¼Ð5¶Ò®`mN-RÓLû¶/ Áö 6úûĺ•ý«k5í­­ì^#šçìÐê7ÚY–S¥ø{QµM÷ZuÐDM'–¨î‰¼ ü"ÿ‚{ÊO?à°¿õßöHÿÔ‡öÀ¯ÝßÈ'Àÿö+Ýÿêiâúª‘Œ'4•Ò„$“oy(7ªi¿‰„[i?ëpþÀÒèxð¿þxÓÿ™ ?°4Ÿúeü‘ûçÿÉæÿòþ®ü­Ô`i?ô)ü?¶øàë)þ/ê?~&xGãÞ·á+‹ýá׉m£ø1û;Xx²cUø±¥ê^ Z|ñ®Ý÷ü;öMÑt­?QñW޼màCXñ¶ðëDð7Ä߀Ÿ´'Ëz÷Œ¼Sà߈¾7ð |ø…ð³Ã_5ßøZzÂO‰^ø9¨i> ¼Ò¾2|Oðn·ðkám÷‹¾.[¯‚^šwiSŒ­¿/´vz«?{Éþ—Bí®þž^_Õý-÷ÿö“ÿCÇ…ÿðÆŸüÈQý¤ÿÐñáüñ§ÿ2ðÞ«ûw~Ëz=‡†µK¯ˆ:ÝÆ™¯è“ø—ZÔto…?|CaðwÖ>#ñƒµŸ~Ó×z€u+Ù'Dð׋¼ñÂÞ.Õj >Xx?Ä >2h~(ŸHÔþ|Pµð——~ÓðP?† ~~Ôº—Ã]sûgâçÁ?‚´‹ü7Œ>ü[¶øãß‹þxëÇß¿ üjmÃþ*øÛÂz‡€¼Umñ'á?Âß‹ZÄÿ [|<ø¹e«é¾Ô>|B—ÂbM´½’×Ê~ŸÍÓ¯`ùöíåå×õô?M°4Ÿú*ì;X‹HÒ<+á?x3Â2j_ëšvŠí©kz¿ŒâþƳÒmµUº¹6µ>ŒN…¹ë>ŽëK‹V¼×´mÚâþ÷N¶MF=viçŸO·Ó®n™WHÑ5HÒ$T´ ÓI»³…B¨Z¿?µ/ùIƒìÈ~%ÿêøøM_ ×ò%øþÆÿé§Àõn1ZÙ2µÝ®ä“ë{kÜK¯“ýì 'þ‡ ÿà'?ù£ûIÿ¡ãÂÿø ãOþd+—¢£™$~ùÿòCù¿Ãü¿«¿+uØOýÿÀOó!Gö“ÿCÇ…ÿðÆŸüÈWøËÄÚ†„4«= I¿ñ·{-þ³>£éÃZÖ?áðVŸ7‹>"ê–2jšL÷—ðøWL»Ð¼, ÔV¼GàOêSÛ[ëâe–óǾ³½º´ŽãTÖ-ì43ÅZ§ˆ£ygê·Zž¾$¾ðÞŸyu¨Ïouñ ;kì}VÒ+Ë/†<‡á§‹õ-óÛk{]7ÆwVš™%ÓEy{>Ý2mB¥¸QÆIs:V^jk£w·6ÖMßm`ºïùyyWô·cý¤ÿÐñáüñ§ÿ2`i?ôÿ±^ïÿSO×å'ìû|Ný’¾'~Òßþ/þÒÚwí!ãÏÚCNø3§jú¾Ÿðfãá Ò‹W ¨j qñkâ£xSñ|T‘nîÖM Ú &™5;­Nââ©~-ø/ö­ñ§‰­n¾~ÒÞøWà#FµÑ´? \þÎQøûW@.ïõmKP×\ü)ý¨t¯Ø|0¾ø=ðãUñ—íâO‹?<3¨øÛÀž¼²ñÉñwÂ__5]Wãg„üâÝ5ü1ðæ×że⟿à–ßð¦ÿh üzÿ„—ö^ðWü#^6øaâßøV_²_ìgÿ µðçZÿ…mðCöðø9ö½kDÿ†€øµöÏx‹þsûWRñ®ôÙ¡| ðß„°n?¶?·ô¦¿áLþÜßô{ßÿñt_þ}T™ý¹¿è÷¾ÿâ è¿üúªïñ/oKÞV•¡Q_žâ²ÓÝzmªòþ÷‘æ¾ ý†>*ü!ñŽü_ðKö”Ñ<©ühÖþ&Ãñ‡W×¾ÃãŸÙøÅßµÇícûTø"/Ÿ´Ÿü:ø£à Û#⇅/ü6ñÆ­wÂ:Äk_‹_Zÿ™ý¹¿è÷¾ÿâ è¿üú¨ÿ…3ûsÑï|?ÿÄAÑùõQv›~ÞÞï–¦¾¿¹ÖÝ;lƒþÝzéo?$}½E|Cÿ göæÿ£Þøÿˆƒ¢ÿóê£þÏíÍÿG½ðÿÿEÿçÕQÉùýOî«ÿʇwÙþæ—ü¤‹Á¿öd?ÿõ||&¯Ðk¿ùü?ÿcG‹ÿôÓàzø7áOìåñ‡ÃŸâøíñãï‡þ.k 2xcö‘ñŒž°ø?ñïÁ¼1¢¦©y{a«ü 5ík^Ö[O†îòã^¿ø£á}>ÏHµÓô]*/H±ðÔWÞI­^j:æ­ö—a Óqo—ž6öq5§Ëu$ߨæéü»‚¾®ÏW¶—Ù.öüOr¢¾!ÿ…3ûsÑï|?ÿÄAÑùõQÿ göæÿ£Þøÿˆƒ¢ÿóê©äüþ§÷UÿåAwÙþæ}ouà½Xׯ|CâIµíIáÐl<9áÝHñOŽ< m¦ÙÞê—zÇ®õwáÏŒ|¯ë¿ðÝèÿž‰ªÜ]èz\ž—R†Üê7É,rü+Ôµ[OøVçÆv¾øo¯|:øiðÞþ¼oâIá½Zý¡´­ÁþžO‰úƇkð×áŠü!áI|cã=+Ç—þ#×eÓ5ÝQ//#Ö­õ?žáLþÜßô{ßÿñt_þ}T™ý¹¿è÷¾ÿâ è¿üú«XÍÅrûjN6²N5l·i«RNêïÖí½]ÄÕõ³Þû¯/?%÷Jë?µŸø^>/ñM†’šÅÿíS{àß hžŠïPðéøãâÚÃZ~§ã·Ä[Ë]z+o |]Ö<[káí;À^Ô%ø[M¾Õld´Õ§Ô;mLxõ?xçS³Õ4«ÏkÞ=À^ Õu êSü9øgãßxcâ§Š#Õ¿á ¹×¬¦ñ—¾0Ùkþ%¾‡SñçŠÇ†<9o£hÚ^›á…¾ºÓ¡øÓþÏíÍÿG½ðÿÿEÿçÕGü)ŸÛ›þ{áÿþ"‹ÿϪªUe%(ºÔ’–öUfô“_ºÞKGÙ]+]Ý(Û[Kï_.½,}½E|Cÿ göæÿ£Þøÿˆƒ¢ÿóê£þÏíÍÿG½ðÿÿEÿçÕXrGþSûªÿò¢®û?ÃüÃö†ÿ“µÿ‚}Ù@ý¡?õ›üw_8ÁkäÈu?û)ÿÿôv©_Cè³/ÇÛÿŒ¿¾*üeý¦|/ñ:ÇྱãMoCðÖ‰û?Û|:»»»ñ§Ã¿|?¼ŽOY|Tñ 1[ňaÕ.4 ù%“JŠÖÞ[º¸œüñÿ­ÿ“!Ôÿì§ü?ÿÑÚ¥mMÇÛaÔd¥Ê¬ÚRJîu%eÌ¢ö’èL¾ikµú.ž‡‡x—þø=©kM¦þÏ¿ŸN·µÒô« ï¼Oá{KÛ»-J²Ñ­o¯, Žþ «ø,#½¸ÓáÔ5¬%ìãÔuo'Áÿ‡úü+ÿ£{øÿ…w‡?ùŠ+»êÔ®oWïOw«ûDsIuüùü?×á_ýßÄü+¼9ÿÈ4Ãý~ÿѽü@ÿȧüƒE}V‡üûÿɧÿÉ<»þ üƒþëð¯þïâþÞÿä?áþ¿ ÿèÞþ á]áÏþA¢Š>«Cþ}ÿäÓÿ䃞]ÿþAÿõøWÿF÷ñÿ ïò ðÿ_…ôo?ð®ðçÿ ÑEU¡ÿ>ÿòiÿòAÏ.ÿ‚ÿ ÿ‡úü+ÿ£{øÿ…w‡?ùø¯Â¿ú7¿ˆøWxsÿh¢ªÐÿŸù4ÿù ç—ÁÃý~ÿѽü@ÿȧüƒGü?×á_ýßÄü+¼9ÿÈ4QGÕhÏ¿üšüsË¿à¿È?áþ¿ ÿèÞþ á]áÏþA£þëð¯þïâþÞÿä(£ê´?çßþM?þH9åßð_äðÿ_…ôo?ð®ðçÿ ÑÿõøWÿF÷ñÿ ïò QõZóïÿ&Ÿÿ$òïø/òø¯Â¿ú7¿ˆøWxsÿhÿ‡úü+ÿ£{øÿ…w‡?ùŠ(ú­ù÷ÿ“Oÿ’ywüùü?×á_ýßÄü+¼9ÿÈ4Ãý~ÿѽü@ÿȧüƒE}V‡üûÿɧÿÉ<»þ üƒþëð¯þïâþÞÿä?áþ¿ ÿèÞþ á]áÏþA¢Š>«Cþ}ÿäÓÿ䃞]ÿþAÿõøWÿF÷ñÿ ïò ðÿ_…ôo?ð®ðçÿ ÑEU¡ÿ>ÿòiÿòAÏ.ÿ‚ÿ ÿ‡úü+ÿ£{øÿ…w‡?ùø¯Â¿ú7¿ˆøWxsÿh¢ªÐÿŸù4ÿù ç—ÁÃý~ÿѽü@ÿȧüƒGü?×á_ýßÄü+¼9ÿÈ4QGÕhÏ¿üšüsË¿à¿È?áþ¿ ÿèÞþ á]áÏþA£þëð¯þïâþÞÿä(£ê´?çßþM?þH9åßð_äðÿ_…ôo?ð®ðçÿ ÑÿõøWÿF÷ñÿ ïò QõZóïÿ&Ÿÿ$òïø/òø¯Â¿ú7¿ˆøWxsÿhÿ‡úü+ÿ£{øÿ…w‡?ùŠ(ú­ù÷ÿ“Oÿ’ywüùü?×á_ýßÄü+¼9ÿÈ4Ãý~ÿѽü@ÿȧüƒE}V‡üûÿɧÿÉ<»þ üƒþëð¯þïâþÞÿä?áþ¿ ÿèÞþ á]áÏþA¢Š>«Cþ}ÿäÓÿ䃞]ÿþAÿõøWÿF÷ñÿ ïò ðÿ_…ôo?ð®ðçÿ ÑEU¡ÿ>ÿòiÿòAÏ.ÿ‚ÿ ÿ‡úü+ÿ£{øÿ…w‡?ùø¯Â¿ú7¿ˆøWxsÿh¢ªÐÿŸù4ÿù ç—ÁÃý~ÿѽü@ÿȧüƒGü?×á_ýßÄü+¼9ÿÈ4QGÕhÏ¿üšüsË¿à¿È?áþ¿ ÿèÞþ á]áÏþA¯Ž?n¿ø*§€?k߀:ÁýáOŒ<©Ïâ x’ÛXÕu­V°ì;™ŒÖSÃi­Ä>}½Ô²Eq¸ÄÐÇÀv¸€¢œpôa%(ÂÒNéóMÙú94MèßàÿÙPythonCard-0.8.2/tools/standaloneBuilder/doc/pic21.jpg0000755000076500007650000024701010231140007022471 0ustar alexalex00000000000000ÿØÿàJFIFÿÛCÿÛCÿÀ÷"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ûgþ ÿ‰ý¦?àžŸ´ÇÃÏ‚?~~Íþ ðˆ?fÿ…ß/o~(|.Ô|Kâ5ñ‰uhº¤Qjš/Œø2Ýø§X¹ðƱáŸøXø{J‡Sñ?ìðÇðeK;á‰XÜ’Žmçj4q˜ê±Çb±ùF]O‚¯ˆ¥Jªy´p¿\©R¾ÒÃBRƒTùê¯Ê¸¯1ϰ¸,æ¶SÄ9^[›c3l7 ð­ýf?Ø’â {Ã}F†aS,§,diâÝ*§eW:tHÊqŒ±?nÿø-/íÓû_~Îk¤éŸ±ÏÄý+ö†øwñ[ÇÖ·ì±à]S¿ðªþ)¿Â›í&ö×Ã?µÅÏëGUÕ­u RÓRÒ|Vö±i±YW¸¼¸Oø¢ø9—öó‘˜Iðö/'î|ñSmRŠ[?éÆXö!þÔßðN]Àÿ Sã—Œ¿dŠþüUý‹m¼ãíBoþáfý˜5]SÆ^ø üZñ—>*[üuøqâ«ß†÷Ç߇óÈš}†u¯èþOþòü\ýœ¾~Û?d~Òÿà§¿~~Ò_ðP_‹>ñ7ìÿ$ñõ¿Â!­êv_¼cñ—ÀºçìÏðöëÄIyà¿‚Ö>>ñ†e«|?¹ã+ïø\úÃ_øßáÏŒ­ßø–çötøAñbâïâ±âßÙï^ð|žÒü! x³Åñÿl$Ò'ñ¥ïŽuMIõK¿fxo pô±xœ_Ó£„ÃÓ©R_öiV¯9fu™NRÃË0¤©*«#Äa0rjЯÄa0õ µ*†Tªq=OgNžvêV›Œd—´Té¹b08xڢþnGŒ¥R²q‹…*ugV*<ÿ=Åÿ#þÜî o„Ÿ±Êœãð¥~! ‘·iÀUÜŒKÏEàâŸÛpŸ…²žãþ¿ˆ3‚~!.G' p2Á~q3ÿ§ýŒ?fÿÚ[öløíâ?üGð×á÷Š-þÚÞ ý¥¾ øCãøá¿ø;ÅúÞ©áßÞ3øù­~ÑZÿÀ¿ü^ðæ—áË¿ü\ø¥~È^ Öü;¢.·ýŸñ-|aàÙý¨?mŽß¾|[ý¬~'赿ìÁðËÅ> ø7â/ÅïxKà<¿±GÂÏiÿ¾ü~ý|CàOøXÞ!·ñG…­~4øûXø£àÝ/Yðn“¡è? õÓ⫚ùWàìûø¾ûþ õð‡Pýœ|]§ÿÃbx¿þ yàÿüAø¯âŸŠ¾ý§¾iß³'‹¾#Ù|–çÂ~ø§|ð·ÅÏ iºn‡¥|CÒ5ÿ„Þ-ðÍψ¼<ðIáÆßËqåa…Õ2œ&7Àü•å‚Ãâqk‡¦è¤¸wĘÏ`ëæTkT¡‡Á`±*3%:ÓtcF5G(ô×\Oõ(ÑÎïâ'J“©RJrö•¶´TðÒ„gRµZmÅIÆæs”9R4§üÛöÉ8ÝðÃöOÁ~êÄ)Ïb|p¤ŽÙ*§#>q„ÿ‚ù~ØÌyøcû(à#±ÿ‹9«äFaÇü&ä1óp1A¹£õ߃Ÿ±oì¡ñ‡áìÝûBú>•ñâ×ìsÿø‰á_ÙkÁ^;øÁsðßã'ÇÿÙ[ÇúW†¾øOÃ.µñÄ´7ˆ5]ÂÞ%×|Eâox㟩ë’ü<ÒµÏCÑì¾;‰ð¸E‹©›ÊtšÃÊ.œää㉡CJKŸM&éÖ§zn^Ö:ËÙòG}Ÿü‡öÀß ÿee°?ñgµ@W @o€và«ÊAC½bc4vÖ‡üoö½'Ÿ†¿²ÀéÇü)íO#;yÿ‘Ìprqœco8;‚~#Z.v†a¸Œ2`û”È6°Ü» avAåù6Z*=±Ó‚9êùÿV88àq¸ùví‹éâðíþ¬e¶»û5¿»ÿOwÛÕDx›>»ÿ…LNýáÿÈ.ËîÛKÇöÚø.íu)Mß e¡’»ˆøA©ŒgÏñW0fÌjFŒ+–‰ZßQ?ฟµ£OÃÙ|2Gü* ñ·%¿¿âäbF0C*´– ûÁâ]¢óؼä®vóqÐýœîo—î8U-•ò¼ËN‚„A·@ãnм‘<¨°~\²-»~ì{1o2ðÓ€ùÒÿV2Û]éËW¿_Þþv·H®“S‰³øÊË4Ä­ºÃ»þç’û;.‰{¿³kÿ¿ý¬›¯ÃŸÙx=~_ž@Rü¿ÄN8ǶáöjÛÿÁljÙwoøuû1‚œ'Â;Ó·ní»‰ñF>`1ƒ°ƒ€€ÞbÛþ-Æ0{/ÊÃ,¹ê¨0•ÆìaOɳ÷] šã#b®Ñ/Ê‹Âç¹>@ÆýœÝíhä]«³e¦sð×RMpÎ\·û5»¯úyþ~«fTâ|ý$Öi‰O]œ:%¿îü—E·CöDÁiÿj“œü=ý™‡^áQÜ£$e¿âªu\ ‘‰<›pÁh?jyr[áïìР“ÿ –ä”'€Þ'àŒœºaU‹mQ+Áøô£‚àçý•ù¾ó £Ž2à ‚?‡ËÿFд^§bü¥>b0Éòg*|´ë·ŸÞGµWwîü¿6Öâp-¿ä™Ëº}š¿Ýÿ§¾oªÿ&¸›?ä¿ö¦&öZÞßü ·n›éeûŸðYÚ×'á÷ìÞ¤X„—i*Ì@Ýâ4-ŒÑyV ‡òçðXÏÚxœÂû7þ ¥ã’9ω{t9NvþðCù#†UF íòð‡„ýÄ[±ŒýÕÁ 1ÌAqG=tè>n§åÝÁ\&Ì[e ø­xk.ùÆ·÷éêîþ]Öª!Äùû’O4ÅtÝÃÿ•®Ë§MôÓõÖ/ø+ÿí4ç àÙЀvü(”…ö‚I×#(¤:ÛJÜ-®€ÿ‚ºþÒ§¯€ÿga럅¿Ç> Ÿ”w†'qOÉ‹uÁËÆ×j•?y$y ÁÛÈØ›\c÷~FÝ?iF?‡õþ¿ßjäñŒäcåvî‹7áÇó/øÆòëY}š¶Õ/úz¿5åÝgþ´q:K5Å[µáÒßÜ•¶]¶ÛªýW‹þ ÝûIÈp|û<œ H 6±ç:æÜñ¸nxÔ*?˜Ñ¯™$ÑÁWÿhé[ÀŸ³ê`r?áUŒƒ´0àë*Ùb Ú@L:£™ÊeùÔìo•³¸ŒàžO”0~]Ê|Èv*1ßÏ6×£¶L/ú­¸ä|˘ãࣧÈÛ2£åòÖ5M±mò­¦^ð:WÿVòïü¯oúü¿_FU^(âÉ[5Å/u=á¿§'’è¶Û©ú‡ÿZý¢»ø#ö~þÉ\dwîuµôäc;~c¤ðTßÚ_½ào€‰ÉáVÆ?xW-»TàpÜ„’Ú§åÀãŒc‡AÉä/Nƒ_•p8L~ïBÜa³µ†ÒNôü¬r”rß.å9k!ù£Ù¾Ö?âðK‹ÿŒs/ék*½ÒÒÕ_ç/òTø£ˆïšâ¶Ö_ÜòÓW¶ÛOӿय़œe¼ð1|ü0¶ÝªFïS å¹È+´UÉ6—þ MñÜž|ð8zÿŰ³ã–çP‘žGFÉ9‹óžÙ6Œù{01¹†$\Ç >ÏU¶ôÈØd{<›]$?w=ú¯ÌÜçbóÇ<Œ`œ®ÌÁšð÷‚¹’ÿWrûiöjõikûßòêÕÝì©ñO6ïšâžßjÝþãþºèšýƒþ 9ñÎW Þø$ °áXÚn\É"w]J…ÁÀ'tnYQ|óg¤¿ðPÿÄ Þø& |3°`§•ÏÚÁ<ŒUr9!yÇç}šâD á`¯Ì¸™¸cödÝ/|ÛZ-ÛbòwiÛè6ªª›SW•L)È20§jàp˜ùqŸ‡Üš·`ßf¯ëSË]úÞÚ´ßqi,×kGíCª‹ÞϪþm6º>ùOø(WÆÆ$ |W?òLì2»D„þ’s °ùF·éx+ßôÈéÀ9Àù–ì?·WÆ s»Ã_TdnøVÚfØ”™Fç¾m¡C° ¸U}ÅUnÓá”— =9Qò7túd0?/Þ]kA†Sˆ†ÆVÞËòÇ‘·¸ò†â6îq¹v '1ýŸÍÓ³^ðo#êöëgËWº_óñ~zùü%GŠ8ƒ‘·šâ®–÷KÓµÛï_#îXÿmÏ‹NªÍោ‹ ð­ôœ‚BžŒ±Éûʬ•[r%…ý¶>+œçà W‰ÿ‹o¤¸Wm§å‰Qº?¼Uw2|gâ4ùváTr0Ãå€<¨°§6&Àì\w#àž‹€Ã•Ý·ä—õmóñò·Ë´á·&Ýñçàç+«ø¿–¯eýÿ.ÝüùbŸñ ß5Å=m«‡M¿åÚì¾í·åûRÛ+✌ÊþøT0OÜøs£6ÐedRÙ„˜cØÑ¾ì¹ŽÊðý°~'œÅ=ð°zÿŹÑ8?/LÄ29<œc Á~=´]®F͘$â5È\ÎHòi}˜”l‡aV_“ìþV—®£Ç@#pœ‘x8ÏlŒ a2|ÁêR¶A²þí[iËý÷ùêï}n”>*â¥ý­ŠûáÓ—ûž^~«§ÖÐþ×?dÝŸ|.P¤dÿ»ІÐVcüPb )Á’1µdf)–k}xÿj¯ˆÏ÷´†k÷x?4,ʤ“¾É8Ë8pï(ÂD‡äKEäŠ6•;›ƒÇ*ÞZüãoüö‹j†—t^WÚlú;uÀÆÝ¸òÎ m# Ïü{ÃÇËÀÚ¯î¶yv±>á4–A‚KKéW«ŽþûóÝG¯ËIqO/ùšâ–ÝaÚ+ù뮼·>Ÿµ/ÄB9оŸóO<>@öÿ^ÿÜt9Ç;u"ý¦> 9Ãè?Tç¿ü:v#(,MˆÉa†k£*ÏØ¾YQÐ :d:}Îøù~î1Û&õ²ãhòÊm*v)ÈOޙϖ2Çgïlˆ9ìÿñ,™p'r¯øAÀýÕ{¥ÿ?Ë^Íò³ýhâUÿ ¸«Ù}¨_§÷"ú+Û~ßLÚ7Çg®‹ðð}~øo>ÜÇ©ÈÀ6>`–aý¡üs! 迱ž]~øh*|’7Íÿö;w ÍíGÞÈ»ä‡ç”þ9‘óŸì/ò6üqëa— µŽÓ÷ÇÝOÝÈ~oá¾MÊÛâØ#fó"Ûç[Âà^²Ø8/º¯hÿ}~oåq.)âÈ×t»Ã¼¸¿%øiô|_üi'ÞѼ£¡ÿŠ Ã9w ¤®T‚Üü¥J€ê¯çGo`|rñë¤ø ÿñ@ø_=3ÐéKžùúsƒ¸'†[&1û­¸=HÃ.D=‘ÈûrFaDM‘ù~Mô팸ÃO‘sÓŸLvÆ#Ê< Â\Òÿ„,’¾Õ-´?éãó¾«®ÚØñÒþÕÅnºÃºþç’û—cÝàøÍâÉI £ø-p~aÿ…ó2ÉX &ÖU„’©öƒg{þçŠ6’tÏ‚Èð™’22te$d•…9¨;Ò?³L<¹ai^bÿHncöeÞÿ&ך5|§“¿NØãh\*Œ/ ¸Ø0>DùF6µ~èß.ÿQøOš+ûnd¶©·»ÿO<ß©n*âóòæØ¥hɯzZ.ßc¥—Ùè½î§ÕWÏâí6öóN½ñGÁ8o,.®,®áÿ…w'•sk3Á<^d_ äŠO.XÝ7Äïcr;)ù?ÆŸ+ð'áGÄŒ>2ñ7«¿ |;ðƧâ}OOðÿÃ)ïuíUl!-m£h–×ßtÍ:M_Y½km/MmWUÒtx¯.á—WÕô­1.µ oš¿o¯ø(§ìqûøÓJÿ†´øÃÿ ŸþÇŠ>&ÿÂÿûâ—Žÿ·ÿáÕ´?øJ¿äšx#Æ_Ù_Ù_ð™xoþC_ÙßnþÒÿ‰oÛ>Çö_™i¯Ú+àçícÿ¶øÅñÿàŒ?á>øGãï‡þ#ÿ„KÅ¿ðø§ÂßÚßð‹|C—ÁZ÷üH|k¢xsÄÖ`ñ7‡53þ&z5ŸÚ¾ÇöË?´i÷—sÿ2G>›œSÈò% TPRþÏ©gï(é/¬Y¿uüï¡ûöBµÿµ3{¥{}uvOþ}y/êÖýVñÄ}3áþµ?‡x×Ã_ |1uâiÿü#aâzeHnKѬm¡ðE¶¯â;Ûs¥è­®jº.Ž×ŽeÔõ}3L¶¾Ô- ø¡©|Òþ=ün¸ø±ÁyuW±øc…WâÞ•ðïWœiíã?ÚEüL|9mãë;ÕH…Ì~ÜúTJUÎì€Kh¯ð¿í£©|:Õ?cŸÛÞãá” bÐSá?ì÷ Úü,Ò¼¤x|êëâÚî å·lì´‡ÖM”–â{ˆ›Qk!§G4†Ú+5M£žEÊ1þÆÉ.ìÛþΗ-¹Òk›ë[ÙvµÛöE•ÿµ3~Ÿó¯{EíìzV²?VôÝ[Å÷ú>‘¬Ük4xõ»[›Û;=GÀ1Ëz-­u]GGifþÉð©fžeæ—wå ¼y< "F\(µý¡â_ú~ ÿἿÿça_~ÚOÁÍwö&ñfñÿàŸ¿hß„zÂzÓÅ¿>|7ñOň߼߉~*ƒàø*?øI¿á6ÿ„›ûû¾-Ó5 ÿ¹×lì>"Þx×Àš…nüe¡~=ÿÁ=¾~Õ_ ¿j¯‡šÇü»À_>2|\—àž©§~Ã_õoÙþÒßdÿ‡)fÇâ_ì÷ñ³Æ_þ ü6ðÏ‚¿m}cÃ/á뉶/‹ôýkBý¬4-.O‡_þ*iÚ†ƒ¬ø7âO~{šRËó¬ë†É²%‡Àf˜ü%ÔÀÎu6&¥*iËë1s’„´•–ËVì¸rœ\fU•âëæ™»­‹ËðXš®8Å{Zøj5jZ>ËÝ‹œŸ,ní¶–M{—üCöˆãŸü¿Åž"ð¥Õ’xFó㎟á½Ò¼-§x@ø¢ßÀükàûËÉ ³±°Õn<3ªø‡ÁøAÓõèl¯Ù4=GYÐtzÓìi_þÑòˆxÿìãüiÿ­ñÊŠÃ<¥F–aj)a©Õ˲*YvîÓöwø/âý6ïC½mKRÑí,‡Äøš nÁd¼Ò#Óï4G׿3> ÿÁL/¾~Í¿ÿf};öÖÿ‚P|PÐ~ÝiÚ—Âÿˆß¿dÿø)gŠ>*ø3TѼ;âo èxGZðgÀoxgIƒEðï‹õmOš/Þx‡ÄZ>´tOxÆÚ/ˆ¤Óµ*Ÿðw"çþ Ið?åÎïØ#à"ýÌïÿŠóãT[qä?™þ¿ÊÙ¶óþ>~Ïä¶ÿdx“ùjûßíîÿ¶›üÏü ó<ϵÿÓçŸöÏù‰iÿÅký “xoÃ%§ÆSÆpÓÉjÂŽ.X Ã,©[ç†Ãâp0Ãã0Òo‰kG bu± ÙÒäð³l·¡eÚñyVwO…ͲìU*Xœa…Ìp”ð8ì.*…zu![ŠÂ9aêÑštåNS\¾ü›ýŠñ“û?x³Ä¾)ñ—‰¿à¤²ž¹â¯ø«Å8ñf´~þÝ6®ø»ÆÚö¥âëÙšì%¦èV­øƒX¼Ô“Mðþ•¦h–‡T±³Ð´Ë :çG³¥·ð×ì»Ïü<+öT’¢ßá×íï lÉ©@?b²yëåªù­s§ù’ÿHH>÷û{¿í¦ÿ3ÿ¼Ï3íôùçý³þb_ÚñZŸ{ý½ßöÓ™ÿ^g™ö¿ú|óþÙÿ1/í?ø­k£O‡¡G C8ÇRÃÐ¥ 4iC ’Æ©R„iÓ§ý“¤aÆ1]G‘ÉãÂ8gEF1„*T„! ”aÉF1ŠÒ1ŠQŠI$’Hý™]öZ?à¡_²ÃqÁáÏíï!n(gìIûÁ/î¼­›¼Ñs§ù!†¡b²ÚƒJý•£`Çþ û-?#aá×íï!æÃDö%W}ðy&7S(¹²û; 56Sø¹÷¿ÛÝÿm7ùŸøæyŸkÿ§Ï?íŸóþÓÿŠÔûßíîÿ¶›üÏü ó<ϵÿÓçŸöÏù‰iÿÅkiæi[ûs1µ­þï’þ™Oü>Îé+8ðæR•• ëkþþµõ庿?›üè{âïÇ¿…ß×áXø·ÿ4ý—ü\> üð/ìÿð¼EðgöÌÑG†¾|7]@x/Â1ÿÂ+ûèc\QÖoŒ:·‰uc©X5þ³{ö½"ò1ÿ žÇüö`n8 ðÛöó6q´G·ö*>füÅäìÍûU‡“»ûBÇÎü=ûßíîÿ¶›üÏü ó<ϵÿÓçŸöÏù‰iÿÅj}ïö÷ÛMþgþyžgÚÿéóÏûgüÄ¿´ÿâµÆ††§XlÛ‡¥òÒ£„ÈéS4œåËdê1朥9r¥yI·«*\?–T›©:Ug9róNxšò“²§Ü¥QÉÚ6Jíè’è~éÛÝþÉ1ðð?Ù‘‚¶SËøoûxK‘æR…b‘çV„DP3O§4LÍ¥4z)«þÈʪü öfà ,_ ?nùø6ˆJ~Å£Ìû¡–š.tÿ$ÄÃOø7÷¿ÛÝÿm7ùŸøæyŸkÿ§Ï?íŸóþÓÿŠÔûßíîÿ¶›üÏü ó<ϵÿÓçŸöÏù‰iÿÅknžbÝÞw˜ßàdÞ»dÛðô#ý\Ê_ü¸ž­;ûzÝy4øö×ðWóýî‡^ýãecÿýš˜‚6ù_ ?néHX_ظ™K€Àbdiňƒê:|­‹cØñÛûöl=v˜þ~Ýr“•ˆÏØÁ‹)yB1‰úh·/ôÔÏßÞÿowý´ßæàW™æ}¯þŸ<ÿ¶ÌKûOþ+Sï·»þÚoó?ð+Ìó>×ÿOžÛ?æ%ý§ÿª•,ÂNï;̶·ð2ekmke?ð<‡þ®e:/a=’Ò½eüºé?7åäAËã?Øíz~ßÿ³{t§Ã/Û®BÙo—³ö4ý癘|­„ù¢çOòw BÀK£oãïØÚ"¤þßß³«`PEðÇöç“?¼ ¬…c?ß´ŠÐˆ¶ÿ­i´Ó ¥²<{ý½ßöÓ™ÿ^g™ö¿ú|óþÙÿ1/í?ø­O½þÞïûi¿ÌÿÀ¯3Ìû_ý>yÿlÿ˜—öŸüV²èãÚåþÛÌ­{ÿ%ÿçGõ¶Áþ®e-%ì'k§üzËù;OÏðGôaįØÉBû}~μµaø_ûsºõ]«ÏØàyªàÅäì_ß?Ê_éáì'ÄÿØÁHÿŒûýžåe]Ÿ ¿nY ,¤'•·ö8a rИ¶e76AΡ§´ŸÎ?Þÿowý´ßæàW™æ}¯þŸ<ÿ¶ÌKûOþ+Sï·»þÚoó?ð+Ìó>×ÿOžÛ?æ%ý§ÿªX|rm¬ï2×þœd½­ÿB‹þ½žŠÊ<9”­ ÙÛþ_ÖëÉýÿ?˱ý'Áñö)‹ñžÿ³ÛõÚÑü-ý¸äl›D^_ìv¾hqäˆö6%óôﳪ¦¡¦F¶×ã7ìN1Ûãö~n˜Ùð³öâ±ù1å”ý˜$ý×’#Ï›ö?ÉÜ5 'óK÷¿ÛÝÿm7ùŸøæyŸkÿ§Ï?íŸóþÓÿŠÔûßíîÿ¶›üÏü ó<ϵÿÓçŸöÏù‰iÿÅk?UÆÞÿÛy—þ É|»åHK†ò•ª¡5{Ëú½y¿ýç§§cúgƒãìGBoOÙýö•Áá_í¿&@2bÛû+Iæ@!*Íæ‹›ZÿLc«ÇߨyUü7§ÀVÀü*ý·œ¯Ù†MЈ¼¤Q/Útÿ §éÁ¿˜?½þÞïûi¿ÌÿÀ¯3Ìû_ý>yÿlÿ˜—öŸüV§Þÿowý´ßæàW™æ}¯þŸ<ÿ¶ÌKûOþ+Tð˜Öïý·™ßþ¼äÝï×(ÓÑi䆲‰4Ý ßM«ÖþëÛžßiôíØþ°¾xÏöUø×ñGá·Á…ÿ¶ÏÀ_|Jø»ãßü/øyáßøW¿¶޾!ñÇÄi~𖈺߈¿e=#úRë:ö­¥ØGªëZ¶™£Y GO¼½Ôlì®m®î%¿ü[öà‹ïj?@À#ñîº@/·¹ð“œ/MJ£kD¶ÿÇü¡¿ãhðMÆÝ×ö÷ý[vþ»ÿho‡gvÿ?ÿjÎÿµIæý³>}ïö—™ã?öÁ¯Ç¼Kã>$àìnY…Ë3ˆ§ŒÂÖ¯VXü¬ã:u•4©¼6 µ|Ñœ¯´’º;ðœ!’b¡7ReÈÒ\˜Š‹âŠ}\¶ékÆâÿÁ?mÑÿ1/Ã#=׈p9#þpLòÄ~M¨?à„ß¶ÔG-ð<ò¤0ñæ¸Y0 ¸ð2Hì連iGòžìfŠüÓþ#'ZßZÀtÿ™u éoòGbàŒ…+{Ž>ðñ•Áuù"Ro†âùICÜ#Œ"ªlŽ kÿ¡ýª”Ž>ðxÿŠÆç#’sÆ€¹8>£‘ÁS°Çý1QSÿkŒ¯­`®¿ê—ù~:쬗dÚž+牓íÞ>Hþjíÿà•_µ4N¤Çðßj”#0¶@Ø'þäÝ…Æ7dnJ¬gÈk=Dÿ‚\~Ô*ª<Ÿ‡K… µ|])UãW:"ä/E;Tà 8ÇôEKñcŒ^øœ÷ÿp£ý~¾z+7À¹wöx«éÿ1Séo+ôî8éÿ½ý§ÐäÃðó£ÿsœ¸çD䌃ÆÓòå6¼:ÐÁ3?i˜ˆÍ¿€Fr¾,ËÚ?âJ‡oîŠðÊ¡U6F©åCmýQCñ_ŒekâpNÛ°P·ÝkÃù+ê.@Õ,Sÿ¹™'ÓªIì¿«+=+ÿÓý¥€æÛÀ™Æ,àdÐéG8$`ðF8Á ­Ø?à›¿´¤L¬m<•ee#Å(vÅ·þË]ç'$nL…Ym¤´þ‚h¥ÿ[Œkë8+>ŸQ£å×~ü¶àl+*X›Zßï2òþï—OM¬À¸¿à_´lhŠlü ¨x¦#‚lci*G €¡QW–þ áûF)ÿ?ñTBØXŸË Ù 6@*U‚²~öQR¼TâõªÄà¿ð‚‡—K[§õeeáøíK½ÿÞg÷m·õÑ[ðšßþ ûûCDrtÿ É Eâ‹rdF'=dQ‡ ±€Tl!²Y__Øöƒÿ‰„øô3[q÷8´|¤öè0ÀOܪ*â)qkmýgwÿP4|¿ËôÛA¨|={û,OþOËW§’ý,ÏÄ?`ïñN™áCÊá¿á&¶&=F0t¿ ¹ÓÄ–'R5<­¬] aF®Ò‹å¤µTR~(qlšoƒº·üÀÑén–²ÙmoÊÍð.@ÿåÖ'剚ÚÚm¶›3ñyb/ø•ølp8ÿ„’ÈÀÈ‹ÛåéŒptáý‹¾9F:G‡Ô)*x’À‡FÜIw3(Ëp¿ŠH#x‹Nà`‚vžI«)W—iØÈå$‡õÖŠ•âw%o¬`ÿðŠúyyà^JÞËÿ…3òÛKtGå²wÆX± Gî¾!Ò‰\ˆr£X*J>P»#ª‚(í­/ì«ñÌJéÔkúVGq‰WÓôÇ?Uh©^&qRmýc ¯ýAQòù­–ß+hê'Ý?eŠÓþ¢gþGåÝ¿ìÁñz"3 ØaX_ÑŽÜK¿vw¦ö(@9ÇÍ2²‘nÖzökø¶/ö‚ª]wGÚ¸6Œ\®Tò¨Â©ÚÄ‹ôÒŠ_ñ¸ªéýc tïþåGV­¾žKk.á馥K­ïþÕ5ºkk[®ö¿™øS®Á9?jkZ¿ˆ5OÚëö¸}O]Õ5 cQk‰ßô‹&¿Ôîæ½¼k='Hø?c¤év¦ây ¾¥ØÙéÖQ¶²µ·¶Š(S‡ñ‡üoãOÄ kž ñ·í5ûWx£Âž$ÓçÒµÝYø©ð^÷MÔì.Aso/‚§ Xe]³[\Gͼ‘Or'ôE|ÇöºNÿÙ9%÷¿öu;ßM~?/Å÷=ßìŸú™æÿøZü¿éß’?n¿àŸÿµÕε¯x‚?ÛGöÌÓ5?j—zÆ´Þø»ð[ÃVWW÷·w7³4ZO‡¾išM…¬w—&ÏNÓìmtí:)M¶Ÿkml© ñŸ?à—ß´OÅë>ø™û[þØþ<ð_ˆm%±Ö¼1⯌ÿ u­P·š7„öWß æˆJŠìÖ÷1ª\Ú˶{i¢™Eýõ¢©gÓû/%·oìøwOùû«ú·Ü?²êg›ÿákéoúwåý]ŸŠß`¿ÚOâ6¿¯í ûB|<Òôý.ßGÑ|ð×Ç¿¼;áMÂ+›ÍFáma»øo«ëz…Ö£¬jz®¯{¨øƒ\Öu?Pm>Öê×BÓôm#Móïøv_í#ÿGqûaáÞø9ÿΦ¿z¨­1íLUzØœF[“VÄb*Ô¯^¬òênukU›©R¤Ÿ2¼§7)KE¬Ÿs:9%<=T(f­:4)Ó¥Jœq­F:QŒ)Â+ÙíÂ1^KÔþA¿à©²î§û&ÿÁ7`ømqq¬ê:Xø¿¤êº~±â=SÚ¦½ª_ø‡Æž0ñ¯ˆ§Ô_ÂÚ^‡£Ã·Xñ|ëi¦§Ã™‚ŽW‚Yœ¯»?àãïù2ÿÙOÐôuµåã1µ³ ULMuJ3pÂÐP£MR¥ XL B‚ºŒaB…8o­®õg¡ƒÂRÀáÖŒªJ ¦"³iº•gWˆ«Š­9Í¥Í)Ö­R[+^Ëcøéÿƒ¹?ðROÿ.w~ÁîgüWŸ¢Û!üÏõþVÍ·Ÿñóö ý·û#ÄŸËWÞÿowý´ßæàW™æ}¯þŸ<ÿ¶ÌKûOþ+_êWþä\ÿÁI>ü¹Ýû|_¹ÿñ^|j‹n<‡ó?×ù[6ÞÇÏÙüƒößì-_{ý½ßöÓ™ÿ^g™ö¿ú|óþÙÿ1/í?ø­´<7ÿ’†¿ì]ý;Tñ±ïU¿Æ¿*a÷¿ÛÝÿm7ùŸøæyŸkÿ§Ï?íŸóþÓÿŠÔûßíîÿ¶›üÏü ó<ϵÿÓçŸöÏù‰iÿÅj}ïö÷ÛMþgþyžgÚÿéóÏûgüÄ¿´ÿâµ>÷û{¿í¦ÿ3ÿ¼Ï3íôùçý³þb_ÚñZý¹Ìº|¿÷}ïö÷ÛMþgþyžgÚÿéóÏûgüÄ¿´ÿâµ>÷û{¿í¦ÿ3ÿ¼Ï3íôùçý³þb_ÚñZŸ{ý½ßöÓ™ÿ^g™ö¿ú|óþÙÿ1/í?ø­O½þÞïûi¿ÌÿÀ¯3Ìû_ý>yÿlÿ˜—öŸüV .Ÿ/ýÆ{ý½ßöÓ™ÿ^g™ö¿ú|óþÙÿ1/í?ø­O½þÞïûi¿ÌÿÀ¯3Ìû_ý>yÿlÿ˜—öŸüV§Þÿowý´ßæàW™æ}¯þŸ<ÿ¶ÌKûOþ+Sï·»þÚoó?ð+Ìó>×ÿOžÛ?æ%ý§ÿ¨ §Ëÿq‡Þÿowý´ßæàW™æ}¯þŸ<ÿ¶ÌKûOþ+Sï·»þÚoó?ð+Ìó>×ÿOžÛ?æ%ý§ÿ©÷¿ÛÝÿm7ùŸøæyŸkÿ§Ï?íŸóþÓÿŠÔûßíîÿ¶›üÏü ó<ϵÿÓçŸöÏù‰iÿÅjéòÿÜa÷¿ÛÝÿm7ùŸøæyŸkÿ§Ï?íŸóþÓÿŠ×í Á5à£>=ð¯†üuàØ ö×ñ¯‚|iáý#Åžñ…?eoŽž%ð¯‹|+â=9u ÄÞñ‘àM[Hñ‡õý"õuM#YÓ/5m;XÓ¯–úÎçY¶Õ¾5ø£ï·»þÚoó?ð+Ìó>×ÿOžÛ?æ%ý§ÿ¯úwþÖ_ðS¯ðJOø7Çþ !ûE~ÎÞøGãŸx×á?ìð[TÓ>3h~9ñ7…áð¯Š?bíwÆ—ú…¯Ãÿx;Y_&«ðûEµ²½¹ñ¥§-î¥ØêwÓØKÄqŸæ<<òˆeØ\*®g‰ÅaÜqµ+Ò§OêøWŠSU(F¤•ãNqqt¥Í)AóA'~Œ=USs”¢¡¿u&ÝܬÚën»\þÛþ QÿCù·Á7?os÷÷nýhgÏúýû³ðîë~Ò·çížo™>´¾Û'ü&cÁ*?à¨6ïø&çíî~þíß±ïí ùÿ_¿v~ÝoÏúVüý³Íó'Ïö—Ûdÿ„Ï÷z?ø=þ ’þVgïØ ïû>qð·ö•çÍþÉÎÝ¿´œŸ{íÒlÛæÿ¬ƒgŸ‹_íR?ø=þ ’þVgïØ ïû>qð·ö•çÍþÉÎÝ¿´œŸ{íÒlÛæÿ¬ƒgŸ‹_í_ÿ_¸³þ…<;ÿ…ù—ÿ1›ýZ‡üü­ÓìC¥¿¿ýÕøŸ„-ÿ¨ÿ‚¡üÛ¿à›Ÿ·¹ûû·~Ç¿´3çý~ýÙøwu¿?é[óöÏ7ÌŸ?Ú_m“þ1¿à•ðT?›wüsö÷?vïØ÷ö†|ÿ¯ß»?î·çý+~~Ùæù“çûKí²Âgû½üÿI+?³÷ìwýŸ8ø[ûJóæÿdçnßÚNO½öé6móÖA³Ïůö©üÿI+?³÷ìwýŸ8ø[ûJóæÿdçnßÚNO½öé6móÖA³Ïůö©þ¿qgý xwÿ ó/þc«PÿŸ•º}ˆt·÷ÿº¿ð…¿à•ðT?›wüsö÷?vïØ÷ö†|ÿ¯ß»?î·çý+~~Ùæù“çûKí²Âf7ü£þ ‡ónÿ‚n~ÞçïîÝûþÐÏŸõû÷gáÝÖüÿ¥oÏÛ<ß2|ÿi}¶OøLÿw£ÿƒÑÿà©/ågö~ý‚ÿ³ç i^|ßìœíÛûIÉ÷¾Ý&;oúÈ6yøµþÕ#ÿƒÑÿà©/ågö~ý‚ÿ³ç i^|ßìœíÛûIÉ÷¾Ý&;oúÈ6yøµþÕ?×î,ÿ¡Oÿá~eÿÌaõjóò·O±–þÿ÷Wâ<?àŸß·—Á/럾4þÄ¿µÏÂ?†¾m5ø™ñŽh 4¯è¾´>ÿ‚—ø;á~Žº•âÿøÇÄ0­þàÝ.ëPŠÿ_×ÒóV»¿{k½:âÓI?æÝ÷¿ÛÝÿm7ùŸøæyŸkÿ§Ï?íŸóþÓÿŠ×ìø#‰q|Q—f8¬n „¯—çX¼¦Tðµ*Õ£?ªPÂTuc*ÑŒýéâ'xÇÝŒ[I¶–Š1¡:qŒœ”鯥ä’jòI-.¶ŠùÜûßþ Pßñ´?ø&ãnëû{þÇ­»]ÿ´7ó»ŸÎÿµgÚ¤ó~ÙŸ>÷ûKÌñŸû`×øŸÁ*þ6‡ÿÜmÝoØõ·oë¿ö†øvwoóùßö¬ïûTžoÛ3çÞÿiyž3ÿlügÇùd?ö.ÄÿêJ= ¯øuÅý!øƒÿsø±ñOöMøíÿ­ýµ´Ï‰4_Ù—áŸí}û8~Ø¿ ,¾k_>x?âf¢i>7ñ‡üã]â!þ‡¨¯ä‹öý·¼+û |ÿ‚ÀxêûÀþ ø¹ñ[ã?ü½ûm~ÌŸ²ïÀß ê:w†µŽ¿´ÿÆ9þØü'ø[sñÄjž øWáýfçIÕ5O|LñÕå·‡ü#á]Y¾³³ñ?Š[Ã~ ñ7ë÷ÅÏø(—Æ_دáŸíñÛþ -û(xàÇìùð7àÿ…þ%éÿeÿÚ*ڷ¾:ñ§‰~!†v?³ÓøCÇ_¿eOŒžøÁ¯ø“\ø|Þ Ö¥øa­ü¾Ó¼[}uãïŽ? ¤ðÅå½èêýùqÿý£¾xïö:ѿ࠿±·ÃÿÙ“áÿí¯ñósðö°ºý©µ„ÿµÄ}Ï\øIðãׂcýœ¾ ÿeÂÆûŽü'iñW৉¾<|6ðÇŽü ·Œu­ áÿ‰t߉1|ÿiÿŽý£¼mð³þ kñ¯á?ìðÿUøeÿ¹ý ?lÿƒŸÖ?jx“Äÿ#ø-áÿøÇÿøø{£|eý­¾|²ýˆ5ÛoØ÷Äï¯\~ÙðR߆°/Ä/_´? ñ Ÿ~~ο <{ð{â^¯âøWÓô‡ÇãwÆ=kà_ÂO|LÖu½'Á#ñ‚|¯|DÐõóì_û^|ý½?eÿ„µÇÀ ß^|)øÏáûÝgÃÑx³AŸÃ^*Ñu Äǃ¼cá?hòËumˆ<ãoxÂ:ÍΉ©ë¾ÔµçSð‡‰¼OákÍÄ:Ÿåì­ûcÿÁG>&ÿÁ^¿à«_³¥áOÙÿÇ?³—ìÃñöÓ|3áß|pÕ<¬| øYñ«á?ˆ¼]¬øËáÔþý‹µï|{øñ;ÃöüDñwÃO‹<áÏ…¾;´ƒá_€¾,x§Á——?aýþ¢¿tßø,/Æ_ˆÿ³Å¿ø(§ìýûøâ×ü‹á_ˆ<{«éß5/Ú–†ÿµÆ?Ùãàoˆ#ðßíûG|$ý—|CðëÁ0xÁw>ø¿«x á¯ÆŸÚ{à¿Å¿‰^ø[$×~ð.½ãO xróö{á?Å/|qøYðÓã_ÂÝwþ†_>ø7â—ïfk'ü$^øáÍ7Åž×±¼E§é Ò?µü?«éú‡öf»¥išÅ‡Ú>Ë©éöW±Om Q_È…¿lø(çíMÿíÿƒ†4ÿÚ7Ÿ³ÿŠ~|øÿý›n|]¦|pÕ,&üzÑ¿h¨ø[áÚÅŸ²¶ƒðzóÂÚ÷Áý{âµçƒRÛEø_ûM|Cøûcð“â†|{­|Òü}¥ø÷à¿‚À?¥ê+ñö£ÿ‚Õ|,ø-ûdøçö'ð§û X|@ø#ðÿÃ>2ý <ûsþܾý‚>xCĬ|=âO…? þ^k_>7ü@øóñ_øªÞ|Fñ¶¥à¯‡v¿ >xqü#£øâ\ÿ x£àÇ/‡°x«ÃŸ4†ß¾Úè·^7ð—„~1x{ÿ†_~Ëeâ/ø§áׯ_†:¾§àïˆ>ñ/‡uµOø‚]ÁþûþŠüAø§ÿsñÛ~ÝŸµü÷ö\øû?üYøõû/|?øcâ/øW¿´íÅ£þÊÿi¿üJø;âÏŸð®¿cÿ‡ßð þ6Ù|Uÿ„7á–‹áéüsâïøÏááø Gâh4_éð°õ¯ÿk/Úûâïìñð³áÅ özø¢xÆgÔ>:x÷öÇý¯~ þÈŸcÝ÷Ö’igÇ‹z"~ÑWºÏÄ|M×|-ðoÁšÀ¿ü`ð&«ãíV÷Wø¥áßÛø[Rñ ßôWñ…ÿhÿ‚ |,ÿ‚ˆÁ ?à­ž Сø£ümý•> ~Ê~ øÇ üøÑáÏÚwàN­áÏþصo‚ß>þÒþÐü9á/Šþ)øKÚë麇‡< ñOá§Œtøâ—ÃO êz>•âOÝïÁD¾2þÏeÿ ~Ù²‡‡þü ý³~0Xþο¾,ø/öŠƒã—Ä/~Ðÿ M_à'ÁŸÚƒàƇð{šGÃï|YÒ4ÿhÞ/ýŸþ/þÕŸ >|Lð£è^$ø7ÃmkHøÃ8êýòü<'öÿ…§ÿ /þ‡ö@ÿ…Ûÿ þ?ü)ßøio‚ÿð´ÿáiÿÂGÿü+OøW¿ðšÿÂ[ÿ þßø¥¿á þÈÿ„þ?ø’fÿiÿ¢×Ëþ ÿ‚‰|eý¡þ2þÔý?eüxøû|`¾ý~6üYñ§íÀ߈^;ý¡þÀú¿Ç¿ƒ?²ÿÁsà÷Šôˆ> øM¤jÐ,|_û@|_ý”þ|Eø™â´Ð¼7ñ†Ú.¯ñ†Õú+øÂÿ‚KÿÁP>Á;ÿà…ðI?k°ü?Ö>6þÕ?jÏüÐ~2ühðçìÅð'Iðç?l?Œ:·ÆŸ‹¿ih~#ð—Âχÿ <%â=2õ4Ý?Þ;ø§ñ/Æ:÷„¼ð·á§‹5=cU¿ðßéÿÃø/GÂÏhÿ·×…õ/þÏþ3øõûþÈÿn/ è?²_í…áÏÚ×öqý¢¾ü7ð Õµ™<3ûKøOáG„/~ü@ðßÄÕáÄ?†¿þ xkÆ:®»àÒþ*xÄ7ú0ïõø©Ág¾;x'àŸüãö¥øÿûþÎø ÿøû;|øCá_‡_µwƒ¼qûXÛ|Sý¦þx“Ç? ígøQâ¿…¿ ¿g&øâÿømtOøÃĶ_„|GmðÛÅ^øƒñáïÃ?7Œþ x'è þ •¬|-ý©þ:~Ê·OÁ‡ÿ³çˆ> ~À¿üŸPøð/ãwŽÿj?…‹û8øâ/Š~|R_¶»û4~οtoˆ½Ð¬|A¢x_ÁŸ ¾%Úø¿Ã—Z¹‹ZѼA¤éžñ ëõøC©Áa~2ü8ý˜>ÁE?hØŸÃÿ àœ_~ϼA'†ÿgÏÚ;âßì»áï€ö¾ ŸÃþ4¹ñ [Ç¿ ~ ~Óß>-ü5ðÿÅ(æ´ð‡Žµïø¯Ã–¯ß´.³ñ—ß¾8x‡ösðŸ‡ü{ûAè?þ%ë?| â˘,ü+ãOŒº_‚õ«ï†ñ5å׉¼mkáÿøÚ GÖnn|;ý™¼YÿOý¿ÿ`Oø/±ÿ ¯â'Ä•ý¶þ&þ×þºðí®üløãsáÿ…büSøÿøøðÿã ¿Š­¼û8~Ì>ð}ÍÖ«û8øïÁ:޳ð¯Y×¼=ãm:×ÿÚþ Uð³à·í“ãŸØŸÀŸìañàÃÿ øËö€ñÿíÏûrøsöøYáüJ±ð÷‰>ü'ø]y­|øßñãÏÄ áþ«yñÆÚ—‚¾Úü,ø]áÇðŽâ?‰sü@ñŒ^ Ò@?o¨¯å‹öÜÿ‚ÛüLø¥ÿ!ý ¿à ß°÷‡þüvøñƒáïÀŽÇRñOÃß‹p~Ï_4ß‹ÿ |+ñ?KøIâ«_‡??gÏÚßÃúì|cà/øQÐþø¯à×Å>-é>)Ð~$ø9~\þŸk¿ðP/¿¿l/ø'ÏìkûF~Ìü-ãoÛßĶ%¶—⯂Ÿµ?>0øWៅeOžø»c¬êÇ_²gÀ=_Å> ø‡«ëÚç„®¼3oa¡éÞ Ó´m+Å0ø³Æ:ýç…|:ú¿E~@þÖ?ðU¿øeÿÚŸö–ýš?áBÿÂqÿ ïÿ€øÉÿ[ÿ„×þü#?ð˜¤ø‹â?Â…ÿ„sþ׈?áÿ„ƒþÿíoøZ?ÛÚßöWÚþÁÿ ëRû?Û&ñûÏø,/Æ_‡_²?ìíÿý¢bü ý€¾0øö}ñGÄ߈º7íKÅÚöxð_í ¢h:g…þ.x³öyÐ~é~ñïÁõø­âÏèÖÇáÇÏ|}Ÿá'ü3ñ/Zýž<3ãë/ü ð îõQ@Q@Ï—ü}ÿ&Cáÿû)úþ޶¢ø8ûþL‡ÃÿöSôýmELwŸø—þ‘?ŽŸø;‘sÿ$øòçwìð~æwÿÅyñª-¸òÌÿ_ålÛyÿ?gòÛ²×ÿOžÛ?æ%ý§ÿ©÷¿ÛÝÿm7ùŸøæyŸkÿ§Ï?íŸóþÓÿŠÔûßíîÿ¶›üÏü ó<ϵÿÓçŸöÏù‰iÿÅköç2éòÿÜa÷¿ÛÝÿm7ùŸøæyŸkÿ§Ï?íŸóþÓÿŠÔûßíîÿ¶›üÏü ó<ϵÿÓçŸöÏù‰iÿÅj}ïö÷ÛMþgþyžgÚÿéóÏûgüÄ¿´ÿâµê4Ý7ÈÅÅÀÍÁË"1Ýänó f>d»®Í—{ù³y^tê³ÜÜ\ê:Ž¥õ|#Â9Ÿfk^Ç G’¦c˜Ôƒ–‡“iJI8ûlMnYÇ „Œãmÿyã“ïùùÝæÄþgúößæùžvgûGý¥«ÿh ¢Zß¼¸ù·ýçŽO¿ççw›ùŸëÛ›æyÙŸíwö–¯ý¡±E}7üCÎ ÿ¢s.ÿÀ*òíâçôÿòò_qŽÚ%¡ÝûË›Þxäûþ~wy±?™þ½·ù¾g™þÑçijÿÚÝ—üÚ!ÿ¾ÿÁcTiB_Á9”W¹|Ãü\Œi,µ'v`v3¼{å.QšäÊl®ÿ†Zþç?à¿)¿þ €ÿ‚5žgüL?ày^wÞý€¾.'Ýû¡Û¶©]ûü¯ô3ìWÉ_J¾Èr/‡U2|¯ €©ˆâ æ§B N¤)ä8‰FRr’Š”›q‹JNÎI¸ÆÞîIZ­YbÕIÊIQ¦Ò{&êÅ^ËÉXþá‡>Gî3Ÿ²ÿË®ìîþÂÿ¨»·y¿ôÛÿ/?iÿ‰×úÄÁ6hø$÷ì‘qoÿÝÒ>xSö~ñïÂ{áÇÀ«ÏŒÿþè>ðíkñÅþ |$ñ\úÏíþÓ¼âÚÆKñNI¾x›_´ñåÕÉ‚ËÀº6¥áIü/ÿ“¼0çÈýÆsö_ùuÝߨ_õ—vï7þ›oó¿åçí?ñ:ÿ_/ø'ŸÀo‚¿´¯‚¿à«ÿh…~øËð¿ÄÿðQ·]oÀß¼3¥x«Ã·s[~Á°L¶ŒvµµÊXëZMÎÛí]ÓÍ®³¡jQ[êz=ýŽ¡oÌÁ¼vàžUÏJ<¹’JPjnENM¸M8Æ£Œ§TêAJ9ITÓáoûËsu}/+õ]6}¶{¡?µÿüö.ýºþêÿi?€žñ„..áÕ´ký3N‹Â~2ðgˆíû‰¼ã/ .›¯ø{Wµ'˹KkÆÒuí5î¼?â/]ðÖ¥ªh׿çeÿdÿƒW¿jŸØ…u¿Œ²,~$ý°?fkÒëIÐôÖ¿io‡ÑHtÛ}RûÅ¿ü%๭|oá ˆîox»Ý;L¹Ôux#ÃÚ‰ªø‡^þÒ¢ý¿à ßðKÁ«ø—ö=ñ§Ä?ø)ìü—~Âßüw ØþÒ¿´MOZkí_\ýš?j_Ù\ê_´O XÞÜ.ðão›­ßxsA²Ó<ñ+PñÖ§vþ ò¯ÚKþuÿ‚þÏ?³‡Áïßð†þÑ^6Ö¾1xûâoÂøQ°|:²ðoůƒß>§Ã)¾4ü7øû£øÇÄeŸÃï|9âç­ï´½*óÆÛ—úöœþ›VÐg—Äß?“WÍð˜¨Ç%©õÚ5ªT§_&¥Ia–!ýc:ôÖTŸ-EUF¬ðµéa±8ª4ªókQS”z¹ZIÝjÒæ·ºÒ|Ñ»ÚÚ)'(Å´’ä0çÈýÆsö_ùuÝߨ_õ—vï7þ›oó¿åçí?ñ:!‡>Gî3Ÿ²ÿË®ìîþÂÿ¨»·y¿ôÛÿ/?iÿ‰×õýûW~Õ?ðE/ø.·í7ðëÁÞý˜¿i/ØÇöÓý£ümá¿…¾ý¥4;?‡·¿¼añ[Ç7zw‡~ÛþÑt‹­~/èúçüCáßë¿|)a |D³°¿´¿×¼Y¯xOB°ðýçò 9ò?qœý—þ]wgwöý@¥Ý»Íÿ¦ÛüïùyûOüN¿UÂbåˆæ§_ SЧNJØj“£W–5½¤a:u¨T©N¥9T£^œ[të~éÊ¥ q>n FÚ©)E¶”’kk]4ÒiÙ§Õk£vg÷éh¸ÿƒ-—nÝöð®Ý›wù¿ðWevyyžvülû-ïÚwãÈÖ¼ß.÷ø+ûßíîÿ¶›üÏü ó<ϵÿÓçŸöÏù‰iÿÅkýêZ.?àÆKeÛ·}¼+·fÝþoüÙFÝžDg¿>Ë{öøò5¯7˽þ þ÷û{¿í¦ÿ3ÿ¼Ï3íôùçý³þb_ÚñZþá/üŠx—þË<çÿQ²ÓŸüJöOÿK>÷ÿ‚T7ümþ ¸ÛºþÞÿ±ënß×í ðìîßçó¿íYßö©<ß¶gϽþÒó'Ò//¼=©üAÿ¬ø§ÿJÿ‡tÃDü@ÿ†­ÿ…ÿ cþoþçˆÿá#ÿ†úÿ…áÿ §ÿ /þGü+ÏøYð¯ÿá±ÿâcÿ —ü ÿðº?áV¥ÿiÂÒÿŠª½ÿöãýµ¾)þÈŸµüÂ7:ÃûoÙö¾ý >"~ËŸ~)x‹Jñ¹ã¿üvñ·Ãiu?سÀß´ÿ ø®ÞöËþÄÝÅžñw‰µŸ‡^6ðw‡t}* üMâ†ÐÜÚk·Üü<‡Æ?ðù/ø`?øC¿ãáŸÿáÿ…×ÿ Kã·ü¤sû þKþsþÙÿáEÉ…ÿÆBÂ=öíOùsÿ„çûkþ(zü õ?ƒþÉàOÁ ¼#ÿwñ7ŠÿáToýŸþxwÆß¾Þë>ÑôïÚ;Cñ¯‡~?xçâ.…Ĕӵ¯|?ñWí5§k>0Ôü#sÿ Ö£àMsPð„çøQ¿C¸ð¯ÓþÖ¿à®úæ£ð#Cø§ðÓþ ÁðÃHÓ¼AákŸÚsâ€>8þÓµøWIð®¨Þ6Ѿ| ñìõû:[|6ñüm‹…¼MñöŒø­§|!ð­Ö©q«xOã~¯aik©~p|dÿ‚šüSøàOø-oŠ­¿j_‡ÿ°oì‹û ~гwì¹ðþ áßÙŸÄ´gŽü/ñÛEÖ>é¿¶Ÿ¾"þÎÞ(ÕüA{ñ#þ¯‰¾3ðŸÁ/ø›FøQáE£üGŸÇ>ñÄ8|)wâM3õÿâ—íÃð_àÿŽõ߇^,ðWí«øƒÃ¿ÙŸÚ‡Âßø'·íõñÇÀ—Úú>Ÿ®Úÿa|Rø)û4ü@øeâ*ËS¶ƒSÿ„gÅÚ¿ö&±¡áÝgì Ò5]2Èñ€ÿÁþ>Ý|ý«"þè_´ÿÁw¾&ÿÁm?aëã'©áÿøWÅ>=BÔ¼ â?°?jïØËöÐÿ‚Ÿ~ϵ'ì‹ûdMû0~Ë_³çÅÿƒþÑ~Gû3xëâ·íCñ–Ïãïƒ~-éßôŸ‰~1ø‰ñOáGì±à›/ƒþ¹ð/€4mGàv‰ð{Wñ§ÄH5?^[~п ¤´Ñmî~ŸÓ?à¨ÿ°ž·û'|-ý·4oŽÚÿ³—Lj‚ž%Ó>|b¿ñ߯Šz¿Äwá&•ðÓáoÀ«_‡ÒüzøñSñ×…üMa§ø7 õÞèþ×|cm¦ËàÍ#Pñ¿Aà¿ø(ßì{㿇¿µÄ­/âoˆ4#ö-ðý÷‹?j |Iø3ñÏáÆ_‚³øfÿ­¼MãoÙûâ¿Ã_üvµðÿˆþA}âk6o4ïˆPi:å‡n|E«è:ΟbñÄØïöúý»€ø¹ÿ¿øûãߨ¿þwû9èþ/ø?mãoø&‡í?ÿÑø×ñÛTÔµÿCá_xWö4øS©xâ~Ÿð’ú×áý毮øƒ]Õï"¸ð¯Œt?éÚ¦œ²MâWÂ÷!lÛÐ>~ÈŸ¶‡ìñ—öÕ—öNðŸìÁûFþÏŸ¶Oí?ã/ÛxXþÑ´/ÅoÙ»ã/Â?¿`¶³øñàsª|6ý”?iŸüSø?wsáx‡á£ýð·Æž ƒRñGƒ¼d¿d²Ò|uyû=ExÿÀo¶¿¾ÅûRë?õßÚ ¼? ÏÅkï€>ñ§„þ Aâ«Éî/.4o‡º_ÄOxÓÆ×^ðå´ö¾‡ÄÞ$Ö,õO¥ÜxÅü'à(õØü áÏΆ߱ßíOû9ÿÁOÿnÚÿán™û?ü\ø%ÿ ÿ†"ÿ…‹kãÿŒ~ üSýŸá˜|⃾.ÿ„+ÁþýŸ>7øKãÏöÿ„µ]?Ç^þÝø“ðwˆÍ?ìý2ÚˆWŸ¯ÔPóƒàø&Gíõû>Á>þ1ÿÁ ¾jß²ˆd_Âéø;ð¯ö®ø½ñãE·íðÓöXý©|Oªø‡âõ¯ÄÙ“ÁŸÏÃ/´ë/Šô?†þ0ðçí5ðá׎n­¾xÄÿ| —Šü1«~ï~Ï_<+û5üøû9øPñ­àŸ€?þ|ðv©âË­:ûÅZ—…~ø/Eð/‡µ_húVƒ¤^x‚óHЬî5›­/CÑ´ëFK™¬t­:ÙⳇØ( ç‡Bÿ‚h~Ú >Ácÿe?Çû0xëàßüûãü/ã烾8ø³ãWÅo‡>ø«öÔýž!🇾ø›àû3üKð·ˆ|?àoŠÚ}žƒ¬üAÒÿh‹-GVø{ysãû‡–Þ$²‹á…ÿ ~×ðKÿ¿¿àÿ‚Wx;ÅÿôßÚBý˜?b/‚—ž1ñ6¿ãK?ƒRx«ökñ'À-cÇZ…·ˆt¿‡úÏŸÃúµ·Â¿Çá;©~C¨ßOy£.±¥h1Ü_K§~ïQ@7ß±ßíOû7ÁA?jÛsö<Ó?gÿ~ý¼þüÓi„?´¯Æˆ¿µ‡¿ÿeÏ 'Ãþ2ø#ñ?áwìùûEYk?üYðË]ñ=‡ÄŸ†ž;øgkâ=;ÇzVƒã üXŸÃúΡðÿDûÿöoÿ†§—ÀšÆ¡û^Ã?Ø|MÕþ xßRðÿ„fÿøXº¿>ü,—X’‡ Ö>"üNþÄñƈ^·‹Sñ¿Ä»/…¿¼9©ë¼šƒðŸH²ðêø‹ÅÿE~ÐvßµÁÿ øÛÇ–?ü ðÆó]øð÷ûnï\ð׎¾xËWÓ´oŠú£ÿôý´>þ×±í_àïüý»õÙ[þ À¿±M燿l/‹ß¾ê:OÇÓ­ø_~Ý_ üc¥üýµ®m¾0~Ñ> Ò/üKÒ5[íFýÞ¢€?”/Ú{þ©û}~Ô^ÿ‚æÏâÏ~ÈÄßø*¯ü;/RøI¦xwÅ_-ü ð¯þßXÐ5ø7â.»©|*ÕüA«ÿdxH¶ð„~%øgçþ>±¤ÏñYøOû9Ùx®?…¾ ýøçû~Ú·Æ_Ø«Mý¬fý˜>~ÏŸ±í?àßÛ4øÓöxñ×Åoüeý¥þ>ü‚çJøøcñ'áFàŸÙSàþ¹sâŸøóâçán~×^4Šü/ð—Á¿ã’ßVøÕ{û=EøÃð3ö2ý´?aÿŒ¿¶®›û'Mû0|GýŸ?mïÚÆ_¶hñ§í㯊ÞøËû4|}ø÷¶•ñâðÇá·ÂÁ?µ_ÁýçÂÞ ñçÂ?ÿÂÜý‘|i,x£á/Œ¾+É%Æ“ñªËözŠþ`¿eÏø"§íOû,þÉßðH}CÃ>>ýŸüMûsÿÁ(> ~Öš–•áwÅ_`ý“¾8|,ýµþ$øæ~ Ô>"éÿ ¢øÁðÿâ™ðÅ6§ð·â]·ÂßxsÂÿtMOBñgˆ^×í|EáßÑï_ ¿à¤Ÿµ§À/Û“àWÅß~ÄüñËö øÅðàÏ„¾|UøóñëÅWß~-ø/âƒßâÄïŽ'ø#û>iø?áÝ#W𮘿¼+û8|Qñ¦±¨ßxƒÅÇâ•m éÞñ7êýøCñsþ ñ÷Ç¿±üïösÑü_ð~ÛÆßðMÚþ £ñ¯ã¶©©kþ4‡Â¾,ð¯ìið§Rð/Äý?á%õ¯ÃûÍ_]ñ»«ÞEqà+_è~ÓµM9d›Ä:¯…îBÙ· ~пðKÿ~ÒŸðROŽ´g޼_áý'ö\øýÿaø—ÿ¿ñŽ—á=Q±øû¦ø«â§ÇkÇ^!ñ†lu‡ú÷û?Ùü;×o-ômT×5F߯‘ÛC}ðÿQÐÒ[É¿g¨ çÇðLÛëöƒÿ‚}üÿ‚A|{Õ¿d~Ⱦ ÿ…-ðwâ§í]ð‡â/Æ‹ŸÚ;â_ì±û-xŸJñÂ_‡ÿ³'Œþ †_ÿhˆ¶_ > høÚß xcIýþø³áßø¿ágÄ¿ ü-ø‹ÿ âoŠ>øËÿ¾-ÿÂ#£ü@ÿ…]ã½oÚ–›áˆ¿ðxŠ{oøÛþŸ\éþ&ÿ„G]¹·ÑüIý™ý©Ï•ìò/ Q@ÏíGÿÿÿ‚…ÿÁKdŸ°¯ííá¯ØƒCðMŸˆ>kŸ´çíuðÏã¾1þÐþ#Ô~èŸlñ·ŽfOƒÞ"ýˆ¿gï…?>0|uñM”þ¼ñ´þ8ñ…~|$ø•ñKÃZÃoˆöÚ•¦‹?Ôß±ßíOû7ÁA?jÛsö<Ó?gÿ~ý¼þüÓi„?´¯Æˆ¿µ‡¿ÿeÏ 'Ãþ2ø#ñ?áwìùûEYk?üYðË]ñ=‡ÄŸ†ž;øgkâ=;ÇzVƒã üXŸÃúΡðÿDý~¢€?n?؇öÐÿ‚ÿÁ+ÿkÙöƒñÇìÁð¯öƒøéâÖ¾GðoNø­âƒ_<+ðßãO‚þ+üøiã6mÆß+|#øÀ¾¶Ö5/„ž&ð÷Á¿‹> ðˆ<7¦øOâ&ãÛ¨~þÏQ@Ëíïû~Ú‡Š¿à§ðRÏÚ2oÙƒÂ^ Õ?àÞÛOö2Òþ üñ×Åoˆ~*ð7Š­õüa±›Pñÿ޾|0Ò>+xVÒ,5ÏÝxêßÁ¿µj>*Ò¾Cð£ÄöÞ¼øçñ,øWû~ÚðQŸø#7ü÷öø•7ìÁà?Ø¿â§ìÁûk_ÿhxëâ³þÔ¯À/ü7ø[ñ¯Ã_ >~ÎzÿÂSáO€¾0?Š|'ðçáf¹ñÇÅ´§Åê>Ò|mñŽÃözѵè_¼ýNÑ@Q@Q@Ï—ü}ÿ&Cáÿû)úþ޶¢ø8ûþL‡ÃÿöSôýmELwŸø—þ‘?ŽŸø;‘sÿ$øòçwìð~æwÿÅyñª-¸òÌÿ_ålÛyÿ?gòÛ²×ÿOžÛ?æ%ý§ÿ©÷¿ÛÝÿm7ùŸøæyŸkÿ§Ï?íŸóþÓÿŠÔûßíîÿ¶›üÏü ó<ϵÿÓçŸöÏù‰iÿÅköç2éòÿÜföhåþÙ"©B§ÈgË»»–&xÏ› Û‰gf’àÌn.$‚y„×z¶½ÑV~•ÿïy¯ž»÷Í#ïÝóyžfíþowçnó~ߨoûuÆ…møy”`òŽÈ჌“Ì0LßRn.u±™Ž†"´¤ãG–œ]<5ËÍ= 1œªTŒªOæñU%R½G+{’tâ–Ê0n+¾®×~mÚÊÉQE}©ÎQEýÎÁ~Süÿk<Ïø˜Á:8ò¼ï½û|\O»ö C·lÿR»÷ù_égØ®ÿ†:þç?à¿)¿þ €ÿ‚5žgüL?ày^wÞý€¾.'Ýû¡Û¶©]ûü¯ô3ìWÆL/÷/ ?ì¢Ï?õŸ®}Añc?ëÍ?ý=ø†ù¸Î~Ëÿ.»³»û þ RîÝæÿÓmþwü¼ý§þ'_ê ðöûøùÿïÚw^øëû[x#ßµOí9¡~ÐÞ¼øÁÿÿ‚düÕ´íŲ÷ìßð§Dðæ» üEý«-'ƒÄW÷_¼Mâ+[K{™äŸG“bÂ/l®`¯ãóö2ýŸu?Ùþïöið„¾|0ñ7í¡ûVü—ö¶×þ?þÑþ Ð3¯Âÿjµxûâ5‡‹-¼ðæûᄾ x+_øãñ"ñÇØ>&ø—û1ü]ýª¯>þÓŸ tˆžø‰ð7áÇÄ‚ÿ´ÇüãâÇíðÛâïí‘ðËÄ÷Ñø÷áÕçÁ¿Úƒáåäÿ¿à¿ õ]7ÅÒk¿³ß„ô¯€zçÁï³èÞ'ø]ûE|SMKQºþÍ>«™Ö‹Ä`éãh`©Ô¯J Øšø¬MÒÂÆN‚ÀV„!Rp U(ãã,5\4±õ2e‰¥R§ÔCš I8¹4›j*1k›~tÛI§ýÏyK‘Tåi¢ì%û_j¶‡ÂüCÖþ ø‹à‰~üwø¿û>xÇá—‹Åwý|ÿÁ9>)ÿÁE¿d€¾'ø÷ûLþÄk¿jÚ7ö¥ý­>$øKöuñþ<ý©?dýOã§Çßxžìø‡áÞVûI|·ÐÚÃÇšWŒÿgïkî¼)â[h4Ïž4¹Ñe×üGüdÁw¾&xãµ¼?¾jíã/„_¿àªßðS¿ü.ñ律­Yh>?ð¥—À?ø$o‚§ñG„åÖô›Zðܾ(ð·ˆô;MzÆÎM+SºÒo£°»Ôb_³^|¾G‡….)§,2Œ°QÅæ0¡R•E^œi:9Œ0ð•XΣŒªSÃÎt£VJ¥ZPöÑS§(Î[ÕmÐ|ß,MYÞðrv²Ù´´MÛG¡ó§üÛð³ÃÞ8ÿ‚¢þÏÞ>ñ¾©àßxösº·øçâsÇZt·º%§ŠíµÏü/ýŸ-"³ƒÂ÷×7z·ˆ¿jŸŠÿ|1¤Ic%¶«c{âµRMjßO“ZücÔ´-[Ãúµî¯èšŽ‰®èš‹èúÖ‹¬h÷:v­¤êÚuÎe¨éz¦›{áÑyc¨ØÞ ­/l®á70\™`ž)¥™ÓYþÏ¿aïø7“þ /âÿØ'à·ÂÍ;Á_³oÄŸÚKã¯ÃÏÚ³ãÅOŒþ!»ð÷ˆ~|)øq{cû7üáŸà_k¾-×õMsXñwí%â}Å6þðv£ª\|ÐË¥bÓÇ{_®ýW…„hMÆL&#ARöÔ£:u©ã*b^+ ˆSœ}œêB»Ãû:1©„©OÙGÝ·/4¤îµRQw³³N*<²VÝ&¯wo]±Ûþ e¶D‰kXÉc ²ø+˜y Œ[ÂdWBÌãì·‚t,Z dHR÷ø)ûßíîÿ¶›üÏü ó<ϵÿÓçŸöÏù‰iÿÅkýòx}vÿÁŽzpÛ·ý[6gwüÁ›v<‹lîÎíþ[y™ßçÝnûTßÂmÞŸoxCI¹\+!xöeÐ¤Š«"È’$ІY «£’Onáí.ïmî?ª¾Þãx³x»8ÊñtÖ? âF{€þÏÄES£^Œ2î¯íaŠçýÕJZ¨åNt§±„ygNjÕ<\Óœ=9Åò¼)ó­Zn¥M9mª|ŠÍ5fú­¾Åÿ‚T7ümþ ¸ÛºþÞÿ±ënß×í ðìîßçó¿íYßö©<ß¶gϽþÒó4Ð ø™ª>“câ(î.ü+®~PÿÃþПð䝸høg¿‡ÿðôoøkÿø·ü*O±þÓðŽÃdÿÂðÿ†…ÿ…_ÿ gíÿð´¿á`Ã)Æ)Ã>ýŸì?ð´ÿÐ?á#ÿ„ãþ/}W´WóÙëÇí ûü}ð7ükã€ú?ÃŒ¿mÚÃÿÿjŽÚ&›ðgÆ—¿´ÿÄ¿¿¿l‚ÿþ'§Å¿Z§Šþ+|AøÁð›ÂÚ„_ ¼{ãO›ïjøA­â éÚRøsÃßÿÁC¾5xãö’ý¨ðø™ñSþ‡¨ ÂÚ÷ãWŽ>ø&w‡?eï†ß´ÿÁïø&Ž|AñÃá×퇨þÎ?±¯íàŸÚƒá7Ã?…ÿµïþÎ_ü!û>hß§ý¬g_ƒÿüc kžÕþ(üøàˆ_¼?¡|5Öþütø¾&ðgŠüWùñƒönñÇ?mø)/ÄÙ·ökÿ‚ë~"ÿÁ´?¶'À…ÿ?j'öÚø™â¯‹¿uÿŠÚÅŸÃ/‡R~×Þ$ñïíá?j’$Ú/„gÿé? üiâ-G@ñÅ?‡ÿ µ†ß|!ñ_âgö»E~0üý4ŸÅWþ+Öu+VñMÕôW_Œ·F½ñ³âŸüyü‡Á°çíÿ«~Øÿ ?gÿØïö{ø¡ð®ÙâíÆáÍcöQøÍð/Áž>ñç„~/Yh—¿h‡þ&Ôþ¦¯ðé¿eÿˆß¼wâ?xãÿo¼ ¢|7ð¯ÆOü,þÏh Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( çËþ>ÿ“!ðÿý”ýÿG[QGü}ÿ&Cáÿû)úþ޶¢¦;ÏüKÿHˆÇOüȹÿ‚’|ùs»öø¿s;ÿâ¼øÕÜyæ¯ò¶m¼ÿŸ³ùí¿Ù$þZ¾÷û{¿í¦ÿ3ÿ¼Ï3íôùçý³þb_ÚñZÿR¿ðw"çþ Ið?åÎïØ#à"ýÌïÿŠóãT[qä?™þ¿ÊÙ¶óþ>~Ïä¶ÿdx“ùjûßíîÿ¶›üÏü ó<ϵÿÓçŸöÏù‰iÿÅký·á¿üÜ5ÿbèÿéÚ§ÎbÿÞ«~TÃï·»þÚoó?ð+Ìó>×ÿOžÛ?æ%ý§ÿ©÷¿ÛÝÿm7ùŸøæyŸkÿ§Ï?íŸóþÓÿŠÔûßíîÿ¶›üÏü ó<ϵÿÓçŸöÏù‰iÿÅj}ïö÷ÛMþgþyžgÚÿéóÏûgüÄ¿´ÿâµûs™tùî3´ÓÑRÊÜ+o›îÎæœ™ØîŽIÖL´‡÷¦âæIÖKuu+=Ä‘Þ^ýŽ[`˾)¼Á QºUÃBˆñª¹wÃÊÄ!>sH‘E7Û^ÎËP±hÛ­-›víÖð¶íþfìÆ§vÿ>ë~zïûUÎìçÏ›>ccë¼ý•zçÏù>öwy1«ýîíÞo“ÿ“oó¾Íþ“öŸìMkû#ˆó WxmK”OêÕòÌ»†–»ÔŒiÕPtfª9:”êP”¨ÕR“”éÎIÊîçÏÑ„jã9&¯Ô«ÍÓu7uÙ§ªìͨ.!¹BðH² b¥—=p@;]%‰ÇÉ42E4é,õx¦ò£˜ys?Ëæ ¾C±ò¼¢¬%“gŸçG°–%y Tºží*çQñø;ż¯=tðYÚ£“æn4¢ªs¸åøÊõ+º*žU%R¥ Ztd©×©%ïTj«''xŒé{ÔïRµo~)E;»Y5«WItÓSbŠ(¯Ø¯îsþ ò›ÿàØø#XÙæÄÃþ ÑÇ•ç}ïØ ââ}ß°jÝ»gú•ß¿ÊÿHó>Åwü1×÷9ÿùMÿðlü¬ló?âaÿèãÊó¾÷ìñq>ïØ5 nݳýJïßå¤yŸb»þ3úa¹xiÿeyÿ¬ýsè2‹ÿ^iÿé蟙ðO˜õø)?…_Ã_ õOkߴψà“+ÿ‚T|CøO}§iZ_ˆü#sðÛQðŒ¿d?Ú?Áú~«¨Áwâž3ðÂÿ‡ÿ³Çÿøfë?¾!Í«|Lø‰àë?…ÿü¨êŠŸ ?k/ÚöB‹Ä²íIðE¾2üÒµi4¯þŵ§…|e¥Ið—唚sø‡ÅŸ—WÐôïˆ?²‡Ç©lø™6§}¬YÜüGð§ÄÍM \ü÷ðæ¯­øc\Ð(iGØ4Ý+P¶‹ã‡…­|ñÃ] Ó¯¡±×‹þ#x«ûRÒÞÚÝ„ÐßêQø§øVYv.…LD0ñÁbp8®I<-iUÀTÃV£0ÃÔÃâ0´q ÷T¨Ò¥ES¡…–8LZu%ŠXŒE¥ç‹IËš3ÚVš’wm8É­ÛmÝÊüÒMrò¥ý ÿÁ¿jOáþƒã[Øößø‹ñ{àž•§G®x{öý¸õ] \ø…ð“Lðß„,´½{Dñ‹ð·ÀZÿÅ|*ðÒ¿†|OáïÚËöP¶ø£ðÍtYõoümý‰¼ ⋟xýA¿oø,ü[á7ÁÙóöÄøû ø;ö‘øÛ7ÆÚRÇödðö“§þÏ¿<Ÿ>j¦ø×ñ“Eøýà][â‡Ãøü=®kן¯|/ñ»@ðç‹~+ê÷:fƒyt _KÕ¬ôó«ý¢?j~ÐßµG‹?k­/À_ ¿f/ñŸ…~"Úxö[ð߈¾xÀ¾<Ðl< ‹âÿ‡Z}ÅÿмIáoêþ$ÒOÄ SU·ñUíÛøó]ÕõÝ.[TÔ-lï¿A|[ÿòÿ‚‹øËà·€>§‰¾x7ƾ»ñ”¶¿µ7ÀßüûYêVGÃá⋾2èŠçÁú±ð‡‚dÖ¼wð—EðÅ/Oá ÜøûÇž5¹Ò´ùµO"|'NxºuêÂŽ&Jʦ"lN"ZçD±¡‹¥IUÌ¥,V%V†#¨b<%4êJg*z,CQi7•¢ÔbÓjÖn-ÚìlãÆòrJé_÷³ö«ÿ‚¬Áp¿j›_ ø“â¿Å?„ðBØÿǾ×¼A£k>:ñLÞ ý  |YýžüOûZ~Ó©£ü:ð‡¼5ñÃ:OÂoxËáoÂ+H>*ühñ‰uÿƒ:ω~x3ÆßþGî3Ÿ²ÿË®ìîþÂÿ¨»·y¿ôÛÿ/?iÿ‰×½„ÉèaèB„ÜeN°øˆQÃSx<4+áZöU9)Ôž')rQo¯âñª­jP¨”Œ#”ª96ÖíJ-ÉóI©n®ÒŠÝ¥ÉÙ6µÜÿ@O®ßø1ÏNvÿ£«cfÌîÿ‚¸3nÇ‘mÙÝ¿Ëo3;üû­ßj›ø[¯î“Ãë·þ sӆݿèêØÙ³;¿à® Û±ä[gvwoòÛÌÎÿ>ëwÚ¦þëûÓègÿ&óìêñ'þ¨øXùž!ÿ{ÃØ ý9\û¿þ gÿ)8ÿ‚sÙ÷þÈúÐ?ký¢kü]¿à–ò“ø'7ýŸì‡ÿ­ðö¿Ú&¿úvÿÉ[ÀöNæ_ú³‰êpÏû¾'þ¿GÿHAExÇOÚÇöXý—ÿáÿ†—ý¥¿gÿÙßþí¿øB¿áz|døuð“þøF²?á$ÿ„[þÿøþøGÿá жÿ²~×ý•ý·¤}¿ìÿÚV~wோ >%}þ×Ä¿‡þ>þÑøà‹ü!^2ð犾ßð³â¿ü$ð«~%ÙÿajWÿjøñ+þïÂã(7øsÆ?ðŠøþÝKQþÃÔþËü"}1èW?áŸxWÆšuαàïxÅšEŸˆ ê>4ðŽ©sksâ=+À‚Š( Šóý?âÇÂÍ_ÇzŸÂÝ+â_ÃýOân‰ý»ý³ðëOñ—‡/|w¤Â/£ü-ñ‰¿´ü#m©Kâ øG|?ñÇ঻®ý«O‹û#GøÁð·SÔ>ÏeñÂsêþ@ÏÜø³Â¶~*Ѽ yâoÚøÛÄ~ñ7‹<=àëgNƒÅZï…|¨øOGñ‰´oKrº¾©áÿ êþ=ð.—âmfÆÎ};AÔ|iá;RæÖçÄzÿ“!ðÿý”ýÿG[QSçþ%ÿ¤Dã§þä\ÿÁI>ü¹Ýû|_¹ÿñ^|j‹n<‡ó?×ù[6ÞÇÏÙüƒößì-_{ý½ßöÓ™ÿ^g™ö¿ú|óþÙÿ1/í?ø­©_ø;‘sÿ$øòçwìð~æwÿÅyñª-¸òÌÿ_ålÛyÿ?gòÛ²÷û{¿í¦ÿ3ÿ¼Ï3íôùçý³þb_ÚñZý¹Ìº|¿÷ÜZ6ëKfÝ»u¼-»™»1©Ý¿Ïºßž»þÕs»9óæÏ˜Øúï?e^¹óþO½ÞL_êÿ{»w›äÿǤÛüﳤý§ûZØ´mÖ–Í»vëx[vÿ3vcS»Ÿu¿=wýªçvsçÍŸ1¹ýmswËÖè¿s;ÿy,[qä?™þ¿ÊÙ¶óþ>~Ïä¶ÿdx“úÏÄlG±ð½SäæúÞ Ãós[ÙòÖÁâ¹íÊùïõogËxÛŸ››Ýå—…„WÇ^ÿ ê?]ão/Šÿ#-!–efŽ)&Q÷Ù¦_ž9%;Š‹°þdRM'?ló£žGÿ‰’ß±ñ›]]£‘X8fGGRϽ‰VVVEÙÍÑ ¤^MájGRÿŠÓ²ÓÑRÊÜ+o›îÎæœ™ØîŽIÖL´‡÷¦âæIÖKuu+=ÄŽ¹³·ºGYc]Ρ|ЈeP¢P˜gW ª'™LR,ÉÓÃ4RC<ÑÉðpðO‰áü? šß7Äà¨c*à±4aO VÂÊ¿ÔéÖ¥R«ö«:X¬JNŒÔjVå‚”iÇ«ûF1«(JŸ¹r©EÝû²Šæi¥£QnËU{k¹ËÚj¡–=²¤Œ$›äÝãfhÚ7ËN%Œ3#Ý™žæ „:…ÜöW,é­oí®ð"ÞĆ&Æà¿.pÊZ)v‡‰ËA$±˜§µ¸Gk{»Yfæïtém6±>|RaLþöMêѺ8ºsæ¼Ó‹‹¦¹óæŠT¼½¹½³ñUwWY#f]³ïbYYMÑvst °7†Sx:‘Ô¿â´ðrN6âïññÈó¬=JØ<7±§W+ÆIN¦ ç:žÓ,ÅRªé{ꤹ%ωÂÔŒcN*<‘•=ja¨báí)´¥-§•¡M5}ú)_®÷ï«ûDý–àïoøfŸÙörýœáÞ¿ðšÿ€øð‡àŸü&_ðÖ_ðŽÂ[ÿ «á÷‡¼ ÿ 7ü#ßðÍ÷öö÷öö¯ö7öæ³ý—ö¿°ÿkj>GÛ&þ%ìu.1È’P6¥÷²fˆÞÊÓaf‰ât–æY–H!_Kw¥_k½:H‹$l®ŽªèèÁ‘Ñ€eee$2° «Apkõ<Ó"ð»Ç|§.Ãñ.[î9Tža ª¦i›e˜¼³‰„°µeUåü¾¥xµNPŒ¥:´\]:Š0•H߆q¹dç*3ö~Ñr{E sŒâ­$—´ŒÒz§më[Ý÷üFÅÿXÏÿÍËÿòS£þ#bÿ¬gÿæåÿù)×ð‡E|ßüJ€?ôAæÓÆŸý›nfŸôÿ”0ÿü¤þï?â6/úÆþn_ÿ’ñýc?ÿ7/ÿÉN¿„:(ÿ‰Qðþˆ/üÚxÓÿ¢0þÜÍ?è+ÿ(aÿùIýÞÄl_õŒÿüÜ¿ÿ%:?â6/úÆþn_ÿ’tQÿ£àý_ù´ñ§ÿDaý¹šÐWþPÃÿò“úÍÿ‚™ÁÑ_ðñoØ‹ãgìoÿ 7ÿ {þü+ø¸ßðÓ?ð°áÿ…}ñsÀ_ÿäPÿ†~ðGö¿ö¿ü!Ø_ò4iŸ`þÓþÔÿMûöußòeEú¯x}Âe8Œ‚²ì\«˜Öͱ_¯æ™´Ì+á°˜:¸o›cqø˜sá°J~Ê£B>Ëž4ÕIÔ”øq8¼F2¢«‰©í'*j\… ¥)%jqŠÞRwjúÚöJßwÿÁ,ÿå'ðNoû>ÿÙÿZáí´M‹·üÏþRqÿæÿ³ïýÿõ ~×ûD×ðÓ·þJÞÿ²w2ÿÕœOªáŸ÷|Oý~þ€?य़òn¿ìÿÿà“¿úôßØÞ¾ý·¼añÛàÿíOÿ6ý¥þ |bÿ…oÿ £ÿ€ý”¿iKÏZü=ðwŠ¿áxxÇà×Ä_ø+wüðÃâˆükkâøGÿgÿÂ?â'ãƒðÏAðWÇokx>ÿáíðGþÙüFýþ¢¿„O¦?~þÚµÏ_<3ãÚoû~×ÿ·ÁÝá&Ÿð_ÁÚŽ±ñCß ¿à¤ÿµOÀ¯ Úê~¹ð®‘ã?Ÿþ~Î_4/k¾0ýŽþ!ø7âŸìã¶ø[ûZÁA¾þÓ²/Æßx—àж'ÇOÛ³Àÿµ>§ðsöjð·ü'¿ðŸ~Ïÿþ:|ðWößÁß mÿÃ&|Eý üûqø[þ?iÙ¿ðÑð“Á8ÿa_í¿j–ð©?á°ÿá§>é$ÿ†}øíeoúýEðPÚã·íðwÇ?ð²|sÿ ‡Â_~ÏÿµoíGû5ÿÅ3àïý¯àOíAû ÿÁÙßðÎ~9ÿ‰‡´OÛÿÂqûü$ý?â™ñï“ã ÿÂ?ÿׇ¼?ñkUøŸý¥û½ÿBý¦ÿiÿ‚¿eŸ†¿³‡Å/ü3¹øÃáû kë¿|3ðÿÅ ŸkðUø#GìÇ¥ë>&ðíåç†|S¬x~ÇáOíiñ×Âúφ|#ñáÖ£¬éÞ7¹¿Óü/ñÏÁ­GâŸÆ/„Wß~3x'ã߇~øGÁ üOý>Ñ@Ëüƒã_Š¿iOø(?‡hÏiþÒ|mñûö`øÑñ¯Æ:_„íu é¾*ø©ÿåÿƒQ|uâ?Ã6:Æ«¯jö~³ÕõëË}×T×5FßNŽÚíWQ¹Io&úÿÆ?¶çÄÏüBÿ‚‡h×_´ˆø#Rø)ûC| ûOíüwý>Ñ@ˆ?ÿk‹¾(ý²|à+ßÚ/þω¾+ý¯ÿl/‚¿¿àŸ¿Ù?Çü2ŸìðrÇö¯“öný¯?á ð÷€´ßÚëÀ?ð»áø7ûê_ðµþ<|[ñ·ìÿãÿøl3ᯂt+/‹?³´ñÿŽ,ð®›ñ—öÌýœõx~Ãöƒøßÿžÿ‚JþпþÞë:u¯Æ_‹ß¾Áÿoºø£ñÇáà îcñ·þü6¶ý?h;|K𦇫x/ÁÐ| øÉ7ˆµ­:?†6mú¢€?(?iÏ üñïíiÿxý«| ៃþ4ñ·?iÿxOÁß´Ÿ„ôoøÅ^,øâ?ø&üâG‡¼3៌Z=µæ¯¯|×µ{Ë?èÚ6—â;¯êšÕ·Šlm§¹ž+æ?à¥øñàÿìùñª/ üø©ão‚ðQÿø'Ç„þ|ZFð_ŽXÿÃ6|,‡àOÇ_ˆ~ñ¯ü&?<%ñöøÿ ö€øðGö{ÿ„ã/€üWáÍSþGü ž²Ò¾-xËálj´/ÈûiþÝš×ïÛsã>‘ûMý‹áÿì-ûk¿µ×›;_‚ÿu/øløV_µ?ü£Á_³ÿÅ_ˆ^?—­¢Þ~Ïÿ¶_ìËû!| ø™ñ‰¿g ü2ÿ…¥ÿ wƒþ(~ÆŸÿeo‡÷º×‡>%ÿO´Påü³ã¿í?ðOQð~û?jž ³Õþ>~Ì·ÀÙïKðÏ€øóûn~ØVP~ÐÖh/xãöÐ ÿ‚ |;¸ÿ‚yxOáïÀÏx«ö]øIû?üý¶õŸØö³ðÏÁ-#áN£ûXÚøƒã·Œ~~ÄwÚ7Šÿh|Sýž>1j?¶U¶—ðïá…¶ñ—öxÒüûý¬üøgâ?Œ¾øõâ/ÄïÄOx~ç@ð*k>?ø…ª|=ð\÷x›N¼ñ¿„þ ßx¦ƒ~øÁuá¿xÇÀ—?´YüeŸáŸ‹7|aðçÃÿŒ¾2øeãüFøãï~Åÿ³¿Ã?‰5ø7â_þmcáßÄÿ…þñÿÃŒúGÅ„Ò~€ý±?i_ü>ý©õ?‡^,ý´?áˆü%á¿ÙÿàÿÄÙ—Oÿ…wð³âü6ÿí ã/ˆ¿´…ñCàGü*ßx#Å?jOøUúgÃ?Ù²øg¯Ø;Åß?i[þ_þÕñáñoÅ€šŸƒ?_¨ æ ö¦ÿ‚„~Ó |ûVx»áßíQæ~Ó^ ÿ‡¬èþ9ýˆÿáýžõ¯øcÙïö\øûrxÇö?ý¶?áYŸ†RþÓ^ÿ…±­|ý‹üEÿ ö•ø‹ñ'ögøŸÿ äx#áΟ¢ü^ýŸl<~×¶í§û&ø+öĺðÏí_ñâV§ð#âíSû$ø'Uø¥ðÓöb’êk¯Á ¾"ÿÁ\¼ ûJk°|6øð×L¿ý <ñ¶×Fø)¦iöÚ}‡ìãª~Î:Ÿ¥x³öyñÆÛ­s㦱ý>ןüYø[àOŽ? >%üø¥¡ÂQðËãÃÿ|-ø‹áŸí=cDÿ„‹ÀŸ<9©xOÅÚöχu #ÄGö¿‡õ}COþÓе]3X°ûGÚ´ÍBÊö(.bü!ð¯íí­ø 〥Ð?à ^ýª¿àþøÁð^o·×Žu?ÙÿáŸ„çø©û5ÁL­ükðâOíû:ü.ø?û4ü?ðÿÃÿ?ÿàž!ÐíçÑü1ñ—Kø…ûNø'ÁÞ3ø…âO|}øOàù@ý®iýKÄŸ¶×í‰à_ˆž Ðümãƒþø/ð¦ßã‚|?û?øV€_à¾ÿðRÙÏâ§ÇOCñötñ7>xƒþ û|Lø[â/‹7ñ·Âïø/ökÓ¾)èŸnßÙïã-Î¥á½ãúÝ¢€?žØçöÂý¡üKñ—àŒ?mƒþ,ý›¼ðþ EñËÅ~øóá'Ń_þþϰÁ94_kÿk­Gö'ý‘¾ø×ÃÿüSûP~Ñ×ߎÿc‡~øbø7áGÆOøóâÁÚÏ[þ‡¨¢€ (¢€ (¢€ (¢€ (¢€ (¢€?Ÿ/ø8ûþL‡ÃÿöSôýmEðq÷ü™‡ÿì§è?ú:ÚŠ˜ï?ñ/ý" ?ðw"çþ Ið?åÎïØ#à"ýÌïÿŠóãT[qä?™þ¿ÊÙ¶óþ>~Ïä¶ÿdx“ùjûßíîÿ¶›üÏü ó<ϵÿÓçŸöÏù‰iÿÅkýJÿÁÜ‹Ÿø)'Àÿ—;¿`€‹÷3¿þ+ÏQmÇþgúÿ+fÛÏøùû?~Ûý‘âOå«ï·»þÚoó?ð+Ìó>×ÿOžÛ?æ%ý§ÿ¯ö߆ÿòCp×ý‹£ÿ§jŸ9‹ÿz­þ5ùS½þÞïûi¿ÌÿÀ¯3Ìû_ý>yÿlÿ˜—öŸüV§Þÿowý´ßæàW™æ}¯þŸ<ÿ¶ÌKûOþ+Sï·»þÚoó?ð+Ìó>×ÿOžÛ?æ%ý§ÿ©÷¿ÛÝÿm7ùŸøæyŸkÿ§Ï?íŸóþÓÿŠ×íÎeÓåÿ¸ÎâÑ·Z[6íÛ­ámÛüÍÙNíþ}Öüõßö«ÙÏŸ6|ÆçõµÍÜ.w[¢ýÌïýä±mÇþgúÿ+fÛÏøùû?~Ûý‘âN‚Ñ·Z[6íÛ­ámÛüÍÙNíþ}Öüõßö«ÙÏŸ6|ÆçõµÍÜ.w[¢ýÌïýä±mÇþgúÿ+fÛÏøùû?~Ûý‘âOê¯äÙà¿î…ÿ¦bx˜/÷ÙzÔÿÒ‘ÐZ6ëKfÝ»u¼-»™»1©Ý¿Ïºßž»þÕs»9óæÏ˜Ö*½£n´¶mÛ·[ÂÛ·ù›³Ûüû­ùë¿íW;³Ÿ>lùb¿UÉÿäS•ÿØ»ÿ¨ÔŽŸÄ©þ9éL+óHŠo6HO—3üÞ[mò›æ†S›<ÿ:M䤱+É;=¬ðßj¶ÚŽÅÏžpþQÄxO©fø:xºQöŽŒ¤¹kaêT¥:N¶ª÷©ÔQ›qjñæŒ%(ÉÂ6t«T£.jrqz]ti4Òkªº8YíæÂO+È¡‚¶$.$%Hà݉½ÃÅ*¶9šæX%]B[éÆnµº–ÚQ4'qlRYÖuvWÚÛáß{Ü$ˆñ½Ì¦[˜ç‚KéÆ]¤Å2íš(åQ» "+¨ßÄü0#çŠI#oïFî‡*Ì7y¤K›$'΄|Þ[n’ãkù¾he1Mçìó$ÞJO-Â\NÏkw4š­·‰?œ8›Âüû„ñ0θ_‹Çá°µ§^ŒèÙf™|(QU•jþÊ4é×áZ• QRJßr/^†6•uì«(ÅÉ(´þ ÝÆ6W»Z$õ}]ž—4¬õXgHÖvXçfHÆò¥.¤ˆÊÒ¢,†HWkM" .-Vî ½Ó®¯µ«Ïþ÷û{¿í¦ÿ3ÿ¼Ï3íôùçý³þb_ÚñZéZj—¸µÊ:¨T’Grdk G 7nU„–êÊtgI`x^îîâÆïÅ^çøÏ*q¡—ñd9¡gJÎIT8Óš•\ÃVuê9ªIÔÂSŒ¥JR£)ź™×˯yÐz½}›i&ß.z$½ç¤¼ÒÛ®¢«ÚÝEwšpIRѱU}­±QÒDxÝâš'Žx$– c‘ìWô&…ÇáhcpUéâp¸šq­B½)Ó«NjêQkîiÚQ’q’RM/&Q”$ã$Ô“³OtŠ(®Q@wÿÁ,ÿå'ðNoû>ÿÙÿZáí´M‹·üÏþRqÿæÿ³ïýÿõ ~×ûD×ù›ôíÿ’·€ÿìÌ¿õgì¸gýßÿ_£ÿ¤ ¢¿à¨ÿ¾2üñWŒ¼cð‹âˆ<«ø þÃÿøýá«;i Õ<+Æ_züûTøAñ Yð.»oªx'Å^ øysâEᙼUáíj ;Åž,ÑÅ»é(×ìu¯þ>üpñW·ýˆ›Åÿ¼AãOŠß~0x³Ârü6øñÛQÓôí'âg‡`ÏÚïãÆ±áVñŒ_<ûBøX¹ø?­ü0ð&ñþ×áÃ×ñWŠüñÛÄvß¼SðÏÃÃFþ>˜û~Šüà³ý¼|ý ¾*KðóÁ¿5x/âÿ¼¯xÏXð¦‰ãü%øgñ“á׈4hßÀߌ> øÿû/üøËðCãï€þ,xÄu}#ÁþñoŽü‚oø)ïÄ›ÚÆÓöa›ö<øâ¯øAþ |øûFøÛá…ûXü[ÑþüløÝðÛàÿÄ›û¯‡þ9ðßìKìËâÙÿá>‹ñïáî¹ñ#âoÇïÚsöQø»¥xDøŸãKÙ²ãû'áV‡ñ õúŠü ðÇüKã.¯û x¯à—íñðÒ÷ÃÞø±áÏÙÖÿüãŸj_¡ð”:ÅmlöúŠüAø•ÿlø§ð“Ä~?ðWŒ¿e?‡óx·ö_øû[|býµ¢ðÏí9â=WÞøYû"ü,ý…hÝ~ËšÖ«û1x{Sý¤> x¯à—íñðÒ÷ÃÞø±áÏÙÖÿüãŸj_¡ð”:Åmlø§ÿrø“ðÇÄkðOÙ#þŸÚëÿ>*øGâW€~ø‹ö±øãð'AÑþü,ý‘~2jž"ðÅÙwöý hßÿix3öîý›í-gñ¿ìYð§À–1‹ã…õˆ¶x[áïǰÛê+òÁŸðTøËÄzþ¹uû|@ømðÀ¿´ì]û<|Añ‡Åïˆ:?‚¾;h>;ý½¾~Æ^'ø;ákOÙ²×Âþ ½·øð—âoí™àÿ~Ö^øƒñ'á¶ðÃÁÚe¿¾øÓöñÕ׌> |;øÿÇðT¯žø“û/~×¾'ø1ý‘û2ürý€>3üRý˜~|6øÝñwâ§Žþ6k´‡ícÿ•øUû1ë¿´¯ÁþÍþ‡ÄÃLørË^Ó>EûqøïÂz?ÄoÚÁ?â¾µg¡øsãô}E~@ü/ÿ‚~Пáøgðûö,ÿ„_öšñ_ü/¿ÝxGö”ñ¯í1û+ü Ôþ~Ï_ð̰xÃÇÿ >"übý„t_ÚkÆ¿Ú×íðwÁÚ ŸŒ?b?…^ÔücàßÚ2Âׯ³h¿ ~x‹ãoŸüý¡ÿhë/ØËþ çÔ¼3âŸøNü[ûTÃ,xGöŽÕ>)x®êmcâo5ø%·íñßâWˆµßêþ ø›âÛ߈^-øe£|[Ó'¶GÖ>&øïš€¼YñÁ¾ñß‹üSdû}E~þÃ_ðQÏŠ~ý‡cïøi_‡_Ù~3ø‰ÿÀð'íð#â'Äߎ¾#ø‰ã¿ÚWÆ? ü%û*ü"ñL_¬|ð»âÏŽ¼ñö—øõûPüÿ†lÑ~Ãbüvøå£üDºÿ„¿áOÿÚ4i³§‰½ö^ÿ‚‘|lý«lŸ ôÏ…ÿðª"ü'_ÚöMø ûFø·ìž ý³t/ j^ø¥ð‡öYÑïáb|KñžŸ?Äÿü0ø-â‹@·ÔWåí ÿRð¯ì×{ñÂÿÇ_¼A«x'àí?ñ/àŒu ø³N¾ñV¥á_…ðGíkþ Ñâˆ^𦱣h:Eçˆ/4 óànðûTñ®§\j2[|A¾ø‡§[<¾‡ ð÷íóñOÃÿ´ÇŸÙö€ýŸ>øãoĈ4ÛÛ¯ƒ¿´ˆþ2ü,ðÿÂÏ‹³ßüã€-ÿ‚tüVð/Œ>KðÛDðç‡ü9ã_‡Þ=Ñ~,x»S¸ñÃ߀~ŸÑ_Oûsíý—|]ûB[|.ó|Aeû_üEýŠ|à ümö}ÄŸôÏø(—ˆ¿àœ? 5ÿxê?ÜÞø'áÿ¾&ÛxOÇŸu]ÀŸøÁâ éºO‹þ@øáûe~ÑßÿißÙªûã'ÁïøAü[­þÏÿµ/à Þý¢.¼qû8ü]øÙñoöÓÿ‚9~Ï_²ÿÄ…ø–ÿ¼âØ~øSÅ¿µEï‚üyñÇß²þ‰ñwá­Çíÿ þü[ð•Ç‚õ¯€·ÔWå«ÿøËáØ.¼3­~ʹø­ðãöŸÓÿf?V^ý¢ —à†‰ãO|ø)ñóá—‚þ |pñ·Áï\ø×ãÇÏþÑ üðCý¢~~È?¼]ûJÅâÙëÆ_´÷Ãø“önÔhóàüÓÄkkà.ƒû*ü`Oƒp|`ý¡~i?ì¾þÔZv“ñ öfÖþ%øCâˆþ(xZý”|1ûxkàþ·ãσ=ð7€|OðËößøÙñ3VñWˆþ øwÅ<âO|SÑ>~¯Ñ_˜´WüŠ×àíOðãàz|/ÿ…•ðËÄ>üø¡ñ;ÀþÑÞ%ñÁŸ´§Ä_ ü8øgà·…ÿdß~ȾÛ7Å/‚>>ñ&•ñ—öáø3ñv…Ÿ,¼[á/ƒž3½×~ xãgÄðIÿÛÅ^ ÿ‚kþÔµoí)ãÏŒôÙãàÿì»ñ¯ÅÏŠ5ˆ¿®¼+á¯ø!üWöŒø›§øNoøžÖÚxÓÆÞ#ø‘ãÛ›]GÄz&â?‰ž;ñ7Š|AªÁ«øŸ^×'þ‡¨¯ÆþܵƟûU~ɲ¿ˆ~|ø]ñ“\ý§þÜ|j𯀾_Úo†þ-üN? >_ý™à«þÁ>ÿbÏ~Ò¿~ x¯Æ`Ù³âÀ·Åümø»ûCxÄxŸö#ý”|SãÚÃÞøuñ/Ç^ÿ…ñëöÒø'ñÀ—_§ý²>;|Aø'­xóÅÞ.ø;àßÚ7BÒÿfOGÔWåìÍÿø·û@üeøð_^ý‘|AðwWñׇÿkO|PñĽCö‡ø[§hþýš ý’bÑ|Mû=x;ö‰ý¾|døéáÿx“öÈð‚u­gâoÂïÙƒNðоüqƒÂ÷?4 x7XøÐ~Ñ_ðR+_€µ?Ãéð¿þWÃ/|@øð[â‡ÄïCûGx—Ä>6~ÒŸ|3ðãáŸüjÞý“|Iû"øClß¾øûÄšWÆ_Û‡àÏÅØ~|H²ño„¾xÎ÷]ø1áÿ€§ôWá‡ÿuøúß?fï‰^/ý޾è¾6ý·>þÎ?ÿdxoöÂñ§Š|+ªxWã¿í+û þͺžŸûFü@Ôÿc_êÿ¼Aà½_þ ðCÅ¿ þþÒw‹4ï|U°¸Õ|)sáïÍãß?ø¹û{üBÛàg¾)øÄñ'¿x‹örø÷ð_àÇíCñ1> jŸ~(þÜ¿ðodÿ¾*øc⎑àƒ>)ø±áÿ†_ oMTñ†þ üð ,ŸVø÷û5jÖÏÁ¿kž6ñèô=E~`|:ý¾~)ø·öqŸö´ñwìùðÿÀ~)~Ïþøûû&ø¹¿hø¿Xñßü- _Ïðà¯í ðëß³Ìß~þÐo~&ü:ðÏ>~ÊÞý½ÿ¶-üAƒâ&¥/ÁxSÁ?bø+Ÿ‹?lÏ€ó|Bý¡ÿf¯j*ý˜~ Á=þ9|"ñ7À‹dÿ€_¶†h> ý¾þ|Ö¬¾;ê6~ ü}ÿ‚zü3ý®~ üQðçÅ…“ü—Á?>øÎçöý ô?üUð§ÆïŽ4š σz¿ˆ¾è2xçÆÚOÂŽÿÆÿðQ/Œ¿tï/?eøâ¿þÏ/´ÿ~ÑP'Á¯…³Wí/⯎žðWÅÚçãÃïƒß5‚ž øs«þÍß´ŸÚ/Oø+ð³ö°ø!ðN}[áßÄWöÖfåøåû@üý_¢¿0?m_Šÿ´v‘ªÁ0uŸ~þÄø›ñOö¿Ô´ÏüøËñ¶ë࿇5}÷þ ÇûvüAÖþünø‡ð/¿´÷‡îÿáñ…´&Ÿáo ü`ð&¯ñOáׄ®tMwìVúGÄ-#æÁjë¾&ð•ω>2音àîõøƒû8þ×_µ=ý÷Œþø_áÃÿ¿´ÆŸÚÿþ ½âß^|bý©~"ü.øYkû,~Á¶O†ÿc«$º¸ðçìÙñ³þïÄÿÂYðcáÿƒþü/øW­|:ø•áÏ|Aý§¾&|eÒh‰5ðÇŒyôÿ‚×Oâ…÷ß~þË~ ñ?…¾ ü`ý—þ ~ËÚ]Ö½ñ—ž!ø«ãïü«ÁðSOjþþÌ_²çíAñ'á?‡þ| ñ¿…t«¯‚ý­õ|LÓõâý+á7›[â¶–û½Exì¹ñ·Xý¢¾øâ÷ˆ¾|@ø%âÿÂM§ë¿ ¾%øWÇ~ ñ¬x7Æ>!ð6§©éºÅ/|-øšßü_{á¹ügðŸ]ø‹ð¯áWŽüYð³Ä ñ_‹¾ü7ñµ¨x'B÷ú(¢Šþ|¿àãïù2ÿÙOÐôuµÁÇßòd>ÿ²Ÿ ÿèëj*c¼ÿÄ¿ôˆütÿÁÜ‹Ÿø)'Àÿ—;¿`€‹÷3¿þ+ÏQmÇþgúÿ+fÛÏøùû?~Ûý‘âOå«ï·»þÚoó?ð+Ìó>×ÿOžÛ?æ%ý§ÿ¯õ+ÿr.टþ\îý‚>/ÜÎÿø¯>5E·CùŸëü­›o?ãçìþAûoöG‰?–¯½þÞïûi¿ÌÿÀ¯3Ìû_ý>yÿlÿ˜—öŸüV¿Û~ÿÉ Ã_ö.þª|æ/ýê·ø×åL>÷û{¿í¦ÿ3ÿ¼Ï3íôùçý³þb_ÚñZŸ{ý½ßöÓ™ÿ^g™ö¿ú|óþÙÿ1/í?ø­O½þÞïûi¿ÌÿÀ¯3Ìû_ý>yÿlÿ˜—öŸüV§Þÿowý´ßæàW™æ}¯þŸ<ÿ¶ÌKûOþ+_·9—O—þã;‹FÝilÛ·n·…·oó7f5;·ù÷[ó×Ú®wg>|ÙóŸÖ×7qü¹Ýn‹÷3¿÷’Å·CùŸëü­›o?ãçìþAûoöG‰: FÝilÛ·n·…·oó7f5;·ù÷[ó×Ú®wg>|ÙóŸÖ×7qü¹Ýn‹÷3¿÷’Å·CùŸëü­›o?ãçìþAûoöG‰?ª¼Mÿ“g‚ÿºþ™‰â`¿ßeëSÿJGAhÛ­-›víÖð¶íþfìÆ§vÿ>ë~zïûUÎìçÏ›>cXªöºÒÙ·nÝo nßænÌjwoóî·ç®ÿµ\îÎ|ù³æ5ŠýW'ÿ‘NWÿbìþ£R8j§øåÿ¥0¢Š+Ñ (¢Š£w§ÛÞÒnW È^=™t)"ªÈ²$‰"¡–BªèÀ¤“Û¸{K»Û{ŽfêÂæÛ&TßHc®dY÷c*Ââ_ß™å@³Çq$ÒËunɨ\\]EâþÒšè’#G"«£«#£¨dt`U•• ¬ ¤A Œüߌ<3Èø¢5ñt¡ý™œÏÚUŽ;¢©âkÊœ!˜Qp—¶§û¸ÞT*Ñ“•Ny¹NìÃãjÐj/ߦ¬¹^ñIßÜ}­Õ’Zh׎êë$lÁÃ+££}ìC++)º.ÎnVðÊoR:—üV¦²•º  ª´rBŽáŽÈþO.7¸,Ó#h /23ÜAoL—:Mî²]èÁÈkRª ²ÉÎîì“çó$K‚Í1’EœL“#=Ä÷,És«Yk<û£«´r+ ÈèêY÷±*ÊÊÂè»9º!”‹Ã)¼ Hê_ñZ~ ÿÏ…Y‡üûÂÕÄÿÓÌNIšÎ•ûQÚú…Ä)C¤¨{ž¢ú¶:ä’ìªS»Šó[§üËäõïÒDY#etuWGF ŽŒ++)!•X ƒƒN®&ÚòâÝÑ¢‘w3yEÝâ”Ìb/•F¸,Ó!a,ms3I4C-ô×ÉãšËQŠ÷råÊ2Â2êûâùdGBQð’ÂeYW͆Xž{+«+Ë¿Ýø;Äü“Š%G_þ󚜰†³”¨âæ¨ÆUe„Ä(û?â{HÓÃÖœ1ŒbáÉCËÄ`ªQNkߦµr[Åine¾Í]¥kßcBŠ(¯Ó3îÿø%Ÿü¤ãþ Íÿgßû!ÿë@ü=¯ö‰¯ñvÿ‚YÿÊN?àœßö}ÿ²þ´ÃÚÿhšÿ3~¿òVðý“¹—þ¬â}— ÿ»âëôô„xÿ¾üø©â«/üJø{áÿjöþ2|{?C>½á][à×í¨ü/Õ>3|=ñ7u‹ø·Ãþ?¹ø5ðæ-fø{W4íçG°¸³Ò |bø™à¯Âç½ñ÷ü&?ð—ê^#ñGö·‹RË^µøÿöùûwü-?ÙóþŸü5ÿü1Çü+ÿÚþgü1Oü6Oü-?øiøHÿgŸøfŸíÿøw¯üeoü+ÿøU¿ð×_Ú»¿ãÿá#ÿ„Wþ¯ü\øP•òßü5?ü/m'ûwþÿþkþö ÿ†uÿ„›þ/ü(Ÿøa?øC¿cïønŸøj?øeßøÔ_ü4Úÿáã?ðÿÂÈÿ‹Åÿ ü ßðÊ¿ñ%ÿ†&¯áéÓýOöbý“¾þÎ?¿gÿZ}“à—íý¡ð·ã&§ñ{ãgÄŸxïãF±ûDZè_³å–…ñö†ø¡ñ XøÛ㿈;Ó5|øo©ëŸu/ØèöŸ >|6Ô4Ý3Ã>ðö”Ã.~Ìÿþ)ÿÃEÝxâx¶ËâÛµ¿k>&ý¡>|,ñÇÅ?ž#ÿ„Âß~#þËš¿ˆ|#ðKã/Äj ü}ðWö‹ø…ð‹Æ~#¸ðçÃ/€_>üD½ð—Ãß~&Ñ?u_Ù¿ö¿ÔdOØÃ?5ÛÿãßÿdÙ/öÿ‚…ÉãÿþÐ×Å?üIý“¿mø$GŹôi¾“AñŸÀOÚáìåûh[xsÁ³VàOÚÇö›ñËßxÞ?Ú3öºðv™ãÖô ÿ~ßZæ—ÿ8ø¥wã_ÛÿNñoÀÙÿö¨ø¯ûü:Ò<ø¦|^øñsÂZwìÙ?‚?_µ?Ø+ö,ø]àOŠZÍ矈·„ ø¨Akáû~Ó¿u‚Þð†±¡|NÓü#ûü8Ò¼cãŸþËðx·áÇÃO|/øuûxgáv±¤øïà×À Ÿ…þƒÅ¿¾ /„:ÿäýeð¯Š<%ªü2ñŠm¼yðö‡øñľ9øÍñÏÇß>#ü3ýªôï„zÇ-/âOÅÿüJ×¾+|CñŠ|-ðà¯ô?øÓÆzçÄ/‡~x'áçÃø;Á:Žãí—ãÿÛêÓö{ñ‡À_…> ý¿ïh~ÐðYÿø§âÃ?|hi¿ >&þÌÿðV߈ðNïx_âö‡{oÿ oûoþÙNoƒøwñ7ß³¿Å?‡¿ þüS½øû@Y|øoânÿÆžÿ‚Žx;áfµñoö|ñ¯íâ¯ÚÓâ¿íÿ‘øQá üKñ©®|,økð'Nðçü?Ç?°Æ›¦ü(ø£ekû?ø;áýÿíð×ö;ñ/ÂÚ7ã‡õÝxsÇÞ ø¦|qöKñW‚~ X~¿øãö ý“¾$xã‹ðçÂø[Á>'øÁû>|wÔ|á;ßxW¶?eM;öyÑÿgÍSÃ>ði ðÿÃ-#öRø¥èÞð…ž‡ðöóNøymc­ø[T¶×üW½ãúüÿö,Ó5OYƒá×Ä ´|?×~øOÃú§í%ûNë~ø%àMoÇ ~'[h_²ïÃgãÿÃÿÙ'þŸˆ¾ ø³á§û1xgá&±ðKXøIðÖçàþ¡àøAü2ºgßôPÄ?ðN¿ÙV èÞ·Ð>0hº¾âx˜üað·íWûWx?ö ñ£ã-;Âz/Š­¼û]xWãfûQüLðþ¿¡ü:øQ jžø‰ñźðÿÁ_š1Ò>ü"³ð_°h¿²çÀŸ|,ýŸþ h^þÊøû+ÿ©ÿ†{²³ñ7ŒañÂÏøRþ‹Á^ÿ„sÇëâøXòOÿ´þø×ûCÅßð´þx¯Çÿ þ)Âeðÿâ7<9â?¢€>@»ý‚¿dëß|ømqð§þ)/Ùÿö›öbø)m޾$Úk ¾l|ñ6•iáZøÆé_<âßÙà¾|l‡\ÿ…ÙðËÇ ü;㟇¿¼3âßí fôø;ûþÌÿ!|ý¡>2üS×¼Gãï…Ÿ¾ xÃMñ‡ÅŒ_üyñÆÿõ߇ÿ~Ù]|'ñ‡ˆõÏ…‘øà×ÁßÚø6ˆ >x£ÃŸ_Ñ@xoö*ð®·ñ÷öý£?hËoƒÿ¸Ð>0kZ¾³â ø˜|añOíWûWxÃö ðæ£àÝ;Åš/…m¼û]x«ãf±ûQü3ðþ¡üEø¯ i~øwñÂþµðÿƯŽúz0Ò>:|]³ñ§ÛôPÌý‹ÿf~Ï?²‡‚~xÁ?³ãøƒÅž,Ñþx2÷ÄÓ¼ â¯ü[Ö~þΚ׎µÙóá7ƈ1ø¯Ç­ãï‹ß ¾xKâg§ø©ñ’ëÅ+Õ®~2üS›ÅÿOÑ@ |Ký„f‹ôߌ^2ð¿Äñm—Ä„ÿ5-#Á¿ÿhO†_ ü%ñŸÀ‡?&xWÆ^ð_ìñð¯öPÐ|3âm7ân±ãõŸÙóà¯Ã_†ÚÎ~gÓ¼Q§h:·Š-µxÅεôýò‚¿aÙŸÀŸc½Óü/ñÄÞ-Ó> xâ^•ñ[â·ÇÿÚãoÇmÄ ÿá#‹Àún‹û@|cø§ã¿º?ÃýLñßÅ/KðŸLñý§ÂÍcÁßhk¾ Ôü%û@|iÑ|v]þÁ_²uï>ü6¸øSÿ—ìÿû?Íû1|¶ƒÇ_m5†_¿¶>ø›J´ð‹-|c‹t¯ˆñoì¿ðÆß¾6C®Âìøeã¿…þñÏÃ߈^ñoö†³{õýóÂoØÛöxø'â¯x÷À^ñø‰á¯üUð̼sñOâßʼnž%Ó¾5j?oþ"\üIøñ_Ç^5ñ·Å¯jVß³oÀ_ è~,ø£¯xÃÅ^ø{ðŸÁ? ¼ ¬økáÞoáqÏüKý„f‹ôߌ^2ð¿Äñm—Ä„ÿ5-#Á¿ÿhO†_ 2þËÿ¬|Mñ'⎾%x‹â'Åÿi??bßÙ]4=g⿉üi¨è?~x'àÎscðnÖóÀWŸoÑ@hßðNOØ÷BÓ¼Y£Ùü2ñÖ‘â_ÛxO@ÒõߌßüO§| ð®â¯ øëBðÏì‰câ_‰Zµ·ìOáÿ øÛÀ_ ücàöA‹à†ào|øâ[hš¿ÀŸ„ž çíà—ÿ±d^ø…àCá×ÄÙ|Yÿ…ÅÄÿüBý¤¿i߉_þ hÿþø?ölø½á|iøñÄ¿½øÍñÍ~ isüð¯Šüñ¿Æÿ þÛüJ‡àßÀÿŒü7ñâu¾9|ð/ÃÿŒ¾'ŸâçÆMSUñÝίñƒâe÷нâÏìmû<|lñWˆü{ãßx€|Dñ/‡þxfO‰^ø§ñoá?ÄÏ ißu×ÿî~|FøQã¯xÛá/ˆ4ÛoÚKã×…õÏ|.×¼â¯|=ø±ão†^;Ö|KðïY¸ð¹ú~ŠùƒâÇìmû<|cø{ð{ágˆ|âø'ö{ñ‰âošwÀŠÿeÍGá£áφ~2ø3¢[|=ñ?ìÓ㯄Þ)ð§‡ôÿ…?|cðú èúÕ¯…[ÂºåÆ“.%´imçúÏü“ö=×tï è÷Ÿ ¼Ak¤xkÃ÷>×ô½ ã7Ç? iß<+¨ø«ÄÞ:×|3û]ØøkâV“mûlxÅž6ñïÅøßFý¯¢øß§xçÅ_þ;ø‡ÅöÚÞ¯ñÛâýç~ߢ€>@ñOì#û3ø«ÃšG‡?áøà¯ìˆ>%èÞ-ø;ñÿö„øñONñí3ñO[øÝñ÷MµøËðW⟀~-Gðÿâ¿Å­sþÿ|'ÿ„Ôü,Ô|Gáχןð†Çÿ ÃáÂxT½ý‚¿dé|âOhŸ á]øÄ_<ñJÕþ xëâOÀïü?ñßÿ>ý—ü®üñ§ÁßøÆ³çöOìåðÓÂß_Lø¯ü;Ñõ?…’ø·Á¾ŸáÿˆŸ¬|Qõýçÿ ~øà¿4/†ß ´/øGü%áÿí9í­§Ôõk®±â cPñ7‹<]âïx›PÖ<[㿈;ñn±®xÛâ/Ä_kž ñßÄoøƒÄ^9ñψ¼Aâßk:Í÷ QEQE>_ðq÷ü™‡ÿì§è?ú:ÚŠ?àãïù2ÿÙOÐôuµ1Þâ_úD@þ:àîEÏü“àËß°GÀEû™ßÿçÆ¨¶ãÈ3ý•³mçü|ýŸÈ?mþÈñ'òÕ÷¿ÛÝÿm7ùŸøæyŸkÿ§Ï?íŸóþÓÿŠ×ú•ÿƒ¹?ðROÿ.w~ÁîgüWŸ¢Û!üÏõþVÍ·Ÿñóö ý·û#ÄŸËWÞÿowý´ßæàW™æ}¯þŸ<ÿ¶ÌKûOþ+_í¿ ÿä†á¯ûGÿNÕ>sþõ[ükò¦{ý½ßöÓ™ÿ^g™ö¿ú|óþÙÿ1/í?ø­O½þÞïûi¿ÌÿÀ¯3Ìû_ý>yÿlÿ˜—öŸüV§Þÿowý´ßæàW™æ}¯þŸ<ÿ¶ÌKûOþ+Sï·»þÚoó?ð+Ìó>×ÿOžÛ?æ%ý§ÿ¯ÛœË§ËÿqÅ£n´¶mÛ·[ÂÛ·ù›³Ûüû­ùë¿íW;³Ÿ>lùÏëk›¸þ\î·Eû™ßûÉbÛ!üÏõþVÍ·Ÿñóö ý·û#Ä$(ÑÅlÛÙ#DgýáÞÊ¡KfY&”î#?¼šY9ùävËo[\ÝÇòçuº/ÜÎÿÞKÜyæ¯ò¶m¼ÿŸ³ùí¿Ù$þ®ñNL?‡8zcÉVL–X^2å©N 4\£.YE«Å¸»]6¬ÏÓÆ6µO¯G$ÑÐZ6ëKfÝ»u¼-»™»1©Ý¿Ïºßž»þÕs»9óæÏ˜Ö*½£n´¶mÛ·[ÂÛ·ù›³Ûüû­ùë¿íW;³Ÿ>lùb¿QÉÿäS•ÿØ»ÿ¨ÔŽ*ŸÄ©þ9éL(¢ŠôH (¢€ (¢€ ¯ukÜF†AÉVKFÅY7.õt9GxÝ$GŠhžH'ŽX%’7±Esâð˜\~¾ Bž' ‰§*5èVŠ:´æ¬ã$þôÕ¥%(µ$šq”¡%(·EÝ5ºg'}¦K„Â’O›È!Ziå•äI‡—;I•’sæ´Sý¡e¸Ya¹»¸¾³ñN_Þÿowý´ßæàW™æ}¯þŸ<ÿ¶ÌKûOþ+_@¬›Í*ÒFV9ÙžC’|©K‡«,¨‹!’fܰȂK‹¦š ¨/u[ïçÞ3ðjiâs>œ\\«b*dÕ[‹Œ9!%K-¨£%RN¢ªáB¼©¥ B:®PQ©ëa³ UÛ­f´²²Z¤õ»jÛfÙêòÇåG0ó¡/˜7Iqµü¯(« fóöy‘ìç–á. Tº»šM*çÄÜ¡x$YP1RËž¸  ®Œ’Äãäš"ž&x¥Ûºµ–ÚS Ãql•`ÖuvdÜ»Öáß{Ü4ùÞñCˆøKS'â<=là „”¨U¡‰æ†i‚ 1£Jó’§*)ÓƒœkB£š“«J²æ~ÓZ¸*5Ò©I¨JI4ã¬%wÛK[ÞOT×f´Óô¯þ gÿ)8ÿ‚sÙ÷þÈúÐ?ký¢küW?à”úºOÿ;ÿ‚qE:¬lÿ·oì‚e`b’Vý ¾€6†D²¬¶æ"³ÜFdš$Yä†ïI»ÕÚŽ¿—~™üG“ñ7p&;&ÆGFñ§‚|iáýgÂ~1ðw‹4m;Ä~ñg…|G§\èþ!ðω¼=¬[^i÷‡õÝ"òóKÖtmRÎëNÕ4ë«›ëií§–&è( ø)û=|ýšü+¨xösøðà‚uo]x³TðwÁO†ž øWá]KÅWÚv•£ßx›Pð÷t]H¼ñæ‘¡hz]Ö³qg&£q§hÚUŒ×/m§YŰQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE>_ðq÷ü™‡ÿì§è?ú:ÚŠ?àãïù2ÿÙOÐôuµ1Þâ_úD@þ:àîEÏü“àËß°GÀEû™ßÿçÆ¨¶ãÈ3ý•³mçü|ýŸÈ?mþÈñ'òÕ÷¿ÛÝÿm7ùŸøæyŸkÿ§Ï?íŸóþÓÿŠ×ú•ÿƒ¹?ðROÿ.w~ÁîgüWŸ¢Û!üÏõþVÍ·Ÿñóö ý·û#ÄŸËWÞÿowý´ßæàW™æ}¯þŸ<ÿ¶ÌKûOþ+_í¿ ÿä†á¯ûGÿNÕ>sþõ[ükò¦{ý½ßöÓ™ÿ^g™ö¿ú|óþÙÿ1/í?ø­O½þÞïûi¿ÌÿÀ¯3Ìû_ý>yÿlÿ˜—öŸüV§Þÿowý´ßæàW™æ}¯þŸ<ÿ¶ÌKûOþ+Sï·»þÚoó?ð+Ìó>×ÿOžÛ?æ%ý§ÿ¯ÛœË§Ëÿqž\¾¶¹»åÎët_¹ÿ¼–-¸òÌÿ_ålÛyÿ?gòÛ²÷Z\ÿÁ*ÃÇÿEÿ‚o¬‘Óöùýƒ‡%]_þáØ`ŧÈbnNân\¹»$Ïxu3Æí_â¥ÿ¿Š8?à©¿ðMÃùb_ÛÏö<•°YTÈß´WÃôv\˜Uw4Ä8IÊ™nä #—Q“Oñ/ûV×ù/ô–ʧ‘ñ†)œãRX 8ê p“š”)J›rtè¹KÙÊ<ïÙAsór®[s“ÍT¡9¤Ò“ƒ³ÿŸW×ÌüÀýª>ü,ý¢?o¯Ùà_íðÓáÿÇ?‚W¿²íùñbóàïÆ/øsâoÂË¿Š~4Á7üà‰w_|k¦ë~¸øà |[ø­áoøÊ]!üGáŸ|Mø…¢hº•–™ã?Úê_”?´Wíðkþ ñûa|AñÿÀ…_þ2|)ø1û0|+ox>oOâX>j?³?ÀÏø:?㇌~|ñÜ·þ2¶ýŸ|Aá|ñì§oáýAÖ|+ðàÖ·ñ öwð‡Ã x[DÑü%á¯è÷ã_ìõð ö”ð®Ÿà_Ú3àwÁÿÞ Ò|AkâÍ/Áßþx/â§…tßXéÚ®câm?ÃÞ:Ñuí"ÏÄzF»®ivºÍ½œz¾¬ê¶0Ü¥¶£yƇû=|ðÆ£àmcÃ_¾ø{WøaáÿøOᮩ¡ü4ð^“¨ü<ð¯ÃO üIð/ß øúÃE·¹ð—‡üàŸŒ¿üà@—OÓ¼+á_Šß|=¡[Xi9ñEž©üâ{ãí•ñ‹ö§ø%ñ?ö!ƒâ­×ìÿû]|`øUû_Þ|SðŸ‚ÿeßüEø%ã¹¼9ñþ •ÿhðµ²üJýž5Ÿˆ_µ÷ÄÝ+áþ‡{ðÛÄ~.Òþ*ü&ñÆ/Šô}âçï‚?²/Œ¾0|ðÏ…>?ýÿ,Ñ?á¢?à™ß|9ÿ Óí¿ð¼ÿhø$î‰ÿ /û'jÿð¯~×ÿ 7þ ûØÂôýšuïøJ~-ÿÂçÿmÿÂðoWÿ„×âoü#;ü9yÿ OŒþÅý­©}ÿð·öNý–>hú‡~ ~Í?³ÿÁÿø_â§ñcÃ:Â߃¾èþø§­øPø[¬üKÐ´Ï øsH²Ò> jÿ µ}WáÖ§ã-> ßøSÔ<#u©KáûÛ>^ÿþ?ÂÏøG?áÿ…iðÿþ/øXð¶?áÿ„7ßðŽÂÓÿ…§ÿ Óþ_ö'öoögü,ø]¿ñx¿á2û/ü$ð´ÿâáiÂ[ÿzþxmÿnÿŒ¿¾9ÿÁA¼kqðÓÃþ-ý¸þ þÌðCߨÇãWÂYÀÿtÿÚãö‡ý°¿lχzW‰~ÛøÓ⇂4ˆ?õÍ#ö£øgûE|!ð—‹þ=ü%ÖüWðÏÅ^øOñ¿â§ìÍñsþtŸ ½ÅßðTOÛkáÃÙìþ/üø?áïŒxƒöø{¦ÜÁà{­GáŸÄ(~þËß¾þÚ¿µçÂ?€¶‡íY¤~ÇßðNÙ÷HøÙâ]öúñ–»ûK|Xø™à¿ øöVøç [x/ôfà?þïxá?ÂÏÿÂÿ wÃO‡þ*ÿ…¯ðþÏá?Å/øHüáÍsþWÂÍ;þ_ìÿ†ž?þÓÓn¿á1øaÿ +â/Øüâ/íZÿÂ}ã_#MOøJµß·ðìû,x_ÀšÂß þÍ?³ÿ‡~iþ)|'Ò¾h_þiÓ>|qÖ4Ï|køi§øGOð忇ì¾ü`ñ‰£k¿¼m§ÅáψÆ‘¦j~,Óu{Û Yâü Õ¾(|}ÓÿàŽŸðWŠúÇÆO^xÛÁ~ ÿ‚î\ü ñLJï|iáωŸ ¼+ðsöý±ü%ðÃF_ˆw^>ñ¯¨xƒá¦¯àidøcâo[ü5Ó¾|=µøqðïÃÞ‚çáÃxÏÅ~Á¯þØŸµ?ƒ|wãÍCYÔÿgýá—ìÑû_þð7Æ¿éŸþ"ø{Ç~)þך?ìE«ûAü-ø‹uûAø“Ãÿ~ø#Ä·_†u=?ö~ñgÂßÚ/ÄzÖðg]Юhm>÷⾟â/…_«Ú7„ü+áÍGŚLJ¼3áý Wñïˆ-¼Yã­SFÑ´í/Qñ§Š¬ü+áŸÙø›Å—Ö6Ð\øÄ¾ ð_ƒ¼m¬ëÞj0xWÂ~ðôW+¤h:]¯iŸ²wì±¢xïáoÅ-öiýŸô‰¿¾éÿ þ |EÓ> ü:°ñßÁÿ…šF®øwJøið·ÅÖ¾‹ÄþéžñG‰´-?Á¾Ô4Yhþ"×tËm6+-_P‚àåÿ¿´wÇÝ'ãïÆ‡?¼_û0|*ðOì¡û0|ý¬~3x—ö Ò1øðÓÁ~8ñWÂ?>£áýaüMðÇÄ>'ÑuM_À^ m_Â~ÕYð­æ“¨¶£á¯ß“s£iÒÛ`j²wì±­øïâ—Å-göiýŸõ‰¿~ê þ5üEÔþ ü:¿ñ߯…š¾¡xwUøiñKÅ×^—Ä>ê~ð¿†t-CÁ¾,Ô5^èþдË6[-#O‚Üòƒâ?íûh7íËû~Êþ:ñÁÿøÚÚà/Æ¿ß|!Ò>+]|3Õ>~бÏü&óÄ?²oŒô½câW…õÞ øq«þÄwšÏ…?iRÛág‚üYñ Ä þ+ß~ÅÞ ¹ø5/|{ãÿ±?üSö§ñì÷ð³âßü*¿Ùá¿ìËðëâüWöhÿ…?ðŸÀÿ|1â=[þ û3ÿÁ4.ÿ²~Cÿ »|?ýŸ>þÊÿ?mÏøI|aÿÿÆïø]? 4m7àWöì÷­x þ×Åßíwá?ÂÏk‡ˆ¼MðÓáÿˆ¼A«ÿ­þÕ×ußøsWÖ5?øQÞ;Ôþ)|þÐÔõ 6âö÷þÿÄÝoYø‹ð·í3Ëÿ ÿÇz¾§âï ÿdx‚þëP—Ÿðÿìõð Â~_øWàwÁÿ x%5ÿ‚Ã|eÐþ~Àúׄ<ðâíû]ÿÁ8> þÓÞ-ø?á7üUà´÷í+ÿÐý–~ëžð?Œ>7xØü¹ñ·í—ñ¿VѼñ3âŸÃ¸>/j?í¾[þÓŸcÒ7þÐÿþüK³ý©~øá¯ÆO„?/>ëºn}ð“MÔu½:óáŸÂÿ‹Zˆ~Î_¶ÿìiûøëᆳà_j~(x«öÃö*[?^øícñ_EðOÂßü5¹ý»|5ÏÂ=cösø¯¨øâ‚^&·‹â׃døÃ¥Ý|ò|bø§ûIÿÁÿcOŒ¿.¾ê-ý°> Á$µ¿Œ^øiàÿø+áf»ð³öÀý¹¿dk/ˆ?õ/xÃâÅ=OÄüGðK➯ðGâΑâŸë^øÅáÍCÆI­ø[Eð—n¼¥þ¯k?³×À/üeðŸíâßõßÚÀ^¹ðŸ~;k? <ª|eð_…o ñ5­ç†|'ñ>ûEŸÆÞðýÕ·,Ùüý€ü+â?…ßðO¿†þþÔüAð«@øwû/üø[à½c¾'ñUÖñ»â~7Ô?e›Úoö&øáOx¿àwÀÚf{¯Ž^-øÑð'Qø§~ÏZW‚o|wñƒ\ø-ð£à¥ÇÄÿ‚¬þÜ^*øuûNüTÿ…Iû?ü>ðÿìû x«ö•ý¢ü!ãý'Å·ÿþ#øïözý©ÿ঳Åß‚> Ò>üeñ—Ã/ƒ¿ð¼,¿`OøJü9ñ'þ÷í1£þÉž#¿½ðgöíááÿXüJðìþû~Åþø5âÏÙÏÃß²'ìÁ¡~Ïž=ñ·‹—Xø£ñS“Mkßxš}LóƒÆŸðP/¿ ¾ ~Ñ¿¶¯ˆgý˜5/Ùóáoˆ?à£Þð/콬ÉãO…´?Š|UÿóŸö­Ò¯/|'ûCßxÏâ‚~1øƒâåÏìyãÜüÑÿeφZ„ž:ñ7eø¡ñ"OÙ·TÓ>;|ÿáÿ¶ÄÏÚÓöø]ûe|&ðÿÃo|:ý·ô¯xWQ¶°øðÏÅ^"ð¯Åø&üæËYýŸ>~ÞÿðQ-_¾Ð5ƒ·óøgã'‹~4x[Nø»¨ëþ,ðO…¾è÷?|Uâ¿~ßhß³×À/|eñgíáïßô/ÚǾ¶ðŸŽ¾;hß <¥üeñ§…làðÍ­Ÿ†|Yñ>ÇEƒÆÞ#ðý­·‚üom£kåæðÌ1[,z–¶¸ dïÙcàv¡xwà§ìÓû?üðÿ…þ j<3¡|-ø7ðëáþáߊzß5…ºÏĽ LðŸ‡4‹-#â¯ðËWÕ~j~2Óà·ñÿ5=CÂ7Z”¾½¹ÓåüÀ_Úö§ðßí[û]|$ðćòÂòÿ‚Ÿü,ý•¿gûÿŒ^ø‹ñSß³Gü#ŸðEï…_¶çÅmrëÁÚ/džð°¾üBÿ…g{á¯ü%ðWˆ>¼ø§ñâÇ_øëâ¿öô¿ ǯø³öïøËáÏø'lj¿h}ᧇü{ûAè?´þ³ûé~ðœ~ñ§Æ]/þ 5sÿÕ±ø¯áŸxë⇂í­|?â?AÆÝà?ŒhÏ ÁymðSÄ?µf…Þ~пüIýž¾|eÓ¼m£ü_øðâ¶‘ñ/ÃþðŸÄm/âOÃOøçNñÿ…~x«\ñ×Ã_ øÚÇÅ.©mâ¯ü<ñ·‰üKãhÚìWúw„¼UâsÄ:¶Ÿ«ê×÷—ü*…Ÿð«?áEÿ´øÿ Kþÿü*øS¿ð†øsþgü*ÏøG?áÿ…iÿ ÷û7þ/øWÿð‰Å-ÿoöGü#ŸðŽÄ“û7û3ý€?|]ÿDý¶¾|=žÏâÿÁ¯ƒþøÉˆ?h—ºm̺Ô~üB‡áŸì½ñkàí«û^|#øûh~ÕšGì}ÿàýŸtž%Ñ?o¯k¿´·Å‰ž ð¯ˆÿeoŽz·‚ü7ûFiÞðï°Á:~1|Sø±ûs~Ùv_jøàO‚^øâþ¼â=Ã’üSÑÿà°ŸðZƒ_ð½<<Ÿð°¥ð—†> |Xð—ÀOøHÿj=_þ cÄþ)ëñ¯ü%>Ó< ÿ—‰ÿOô/Ù;öXð¿4ÿ…¾ýšgÿü2Ò>üRøO¥|:о ü:Ò< ¦|,øã¬iž"ø×ðÓOðŽŸáËÙ|?øÁâ F×~)x6ÛO‹ÃŸ5#LÔüY¦ê÷¶³Åßè_ þx_XÓüEំŸü;â #þ—öV»¡x7ÚF±¦ÂññÞ™ñKã_ö~§§é¶÷¶_ð¸>&èš7Ä_Š_fž/øX;Ò4Ïx³û_ĺ„@?þøàoí“à¯x»á‡ìÿñsÄ´Ïíûaü1ø[ÿø7ñ{Xºý©ü]ã»›Ú¿ã¶¡û*~Ö>Ó>è6Z¿ìÿû'ü2ø3ñöQðç„üEûR|Ñü3ñöcýšu?g?…~ ð¦…ìÕñ÷ü[þ +ûCüøEâSáç‡ÿem#ö´ñü¯ãçì¯ñPÿ…_£ê>ð¯ÄOø)'üÃÁ—?u_ü(ÿ‚ŠüOøíûhüñ/ÃoÚ†ÇAø×ñóá—ü³Nÿ„VÆ×À^:øyá_ö¥Ñ¼%ð—ú=Ñ¿g¯€^øËâÏÚ3Ãß¾è_´|?má?|vѾx/KøËãO ÙÁá›[? ø³â}Ž‹¼Gáû[oø:ÞÛFÖ5ËÍ:<'á˜b¶Xô-mp4OÙ;öXðÏü/OøG?fŸÙÿÃÿðÔÚÿðÒÿØŸþi_ðÑðÂSý½ÿ Óì·ÿ…·ý·ÿ ǵÿá?ÿ„ƒûKþý³Îÿ„ƒVûXäíQÿmø§ð#öX°ø¥ Û~Ïòüm×?hø-g€<9ðëÅ0øÿ·þÁ1¾ÁNþÎ4¿Šß>xÓàO…uO þÑ~4ý§>Xü=Ô>øëãwí«§ˆ<«þË:ç‰.¾ ÛüXNñfñ'Jðä?<-sà Ïx÷ øùû~Ë´Gƒ¿h¯ø»à÷Ãÿø·ö øâo|RøÝேß´¯Ž×ð| øû5iþ5³ø“©ø?[Ôî> xà—Å¿ˆ¿¼â?AâøF|ãxF )¼%â wAÔ½áoìû,|Ñô/üýšgÿƒþð¿Ä Oâdžt/…¿þ|?Ñü;ñO[ð&¡ð·Yø—¡ižðæ‘e¤|@Õþjú¯Ã­OÆZ|þ#¿ð&§¨xFëR—Ã÷·:| ÿEPEPEPEPEPEPóåÿÉøþÊ~ƒÿ£­¨£þ>ÿ“!ðÿý”ýÿG[QSçþ%ÿ¤Dã§þä\ÿÁI>ü¹Ýû|_¹ÿñ^|j‹n<‡ó?×ù[6ÞÇÏÙüƒößì-_{ý½ßöÓ™ÿ^g™ö¿ú|óþÙÿ1/í?ø­©_ø;‘sÿ$øòçwìð~æwÿÅyñª-¸òÌÿ_ålÛyÿ?gòÛ²÷û{¿í¦ÿ3ÿ¼Ï3íôùçý³þb_ÚñZý¹Ìº|¿÷èÇê¿5üãïªL}þ°Æ›6ÿ¤ç?iÙåy-Ÿµù_`í°ø·°®?Uù¯ç{ýRcïõ†4Ù·ý'9ûNÏ+Élý¯Êûÿh}‡Å¿Õ^9É%—ÙE„ÿÕfnx™gñçÿ^Ÿþ¤vQE~ÌyÁEPEPEPEPEPEPÙ¿ðL'CÿNÿ‚míeÊ~Þ?±ÒHU€(ÿðÐÿ°®ÀÂCº@®„»X±¾oˆÿÚ®¿Å;þ zßñµ/ø'!ÝÓö÷ýŽ;þî?h†ë·>xÛ´íÙæAµlòíÿeñ_ûX×øýô­¯/ÜÎÿø¯>5E·CùŸëü­›o?ãçìþAûoöG‰?–¯½þÞïûi¿ÌÿÀ¯3Ìû_ý>yÿlÿ˜—öŸüV¿Ô¯üȹÿ‚’|ùs»öø¿s;ÿâ¼øÕÜyæ¯ò¶m¼ÿŸ³ùí¿Ù$þZ¾÷û{¿í¦ÿ3ÿ¼Ï3íôùçý³þb_ÚñZÿmøoÿ$7 غ?úv©ó˜¿÷ªßã_•0ûßíîÿ¶›üÏü ó<ϵÿÓçŸöÏù‰iÿÅj}ïö÷ÛMþgþyžgÚÿéóÏûgüÄ¿´ÿâµ>÷û{¿í¦ÿ3ÿ¼Ï3íôùçý³þb_ÚñZŸ{ý½ßöÓ™ÿ^g™ö¿ú|óþÙÿ1/í?ø­~Üæ]>_ûŒô ãõ_šþq÷¿Õ&>ÿXcM›ÒsŸ´ìò¼–ÏÚü¯°?ö‡Ø|[ÔZÝEwšpIRѱU}­±QÒDxÝâš'Žx$– c‘ù;ùc¸»šH›Íü´FÃ2ºˆ’00¸ßý£……ãš;Åò¬åR[ONøÑ˜à1Ü’UÂc0؈c³¬>/éÕ„¥ˆÂÓ˳U¯Jç:3ÄP§ZJ6£Rµ*uy'8ÅøÙt%EE(´ãO–W[7R“{]¤Úî“jé¥^Öê+¸„Мƒ€ÊJ–Š«ímŒèrŽ’#ÆïÑÂr}k>ÉpÞÓ›Ùýc4ÀÑçäåæäö•ãÍËÍn[Ûš7µÐÕÒøiTvÞГßm‘¡EgÿjØvŸw¦È¦}ùû»6FÞg™º+fï;ívVÿí /´WÝ¡Ûû»›gDŽO¿äco•+ùŸë×g•æyÙƒìþwö–‘ý¡çb8烰ܞӉ²Ysórý_Cn^[óýVu½ù—/´åç÷¹oË+ZÃb%µ7‹Žý¹­—uÝV)ÖíÊ33•5;63°ƒb—…ç%I@h#œÈ Ù.£¤.£öî~í®s÷?»;¿Õÿª†]Û¼ÛOõ>vÿ;ýí?iÑ?¶¼ºþ(p&j8‚Œ¤â¦ eŠ…›jΦZš•âï%4­'E»X,SÕR}µ”nŽIõZíøQ_|r…Q@Q@cÿÁ/[þ6¥ÿä;º~Þÿ±ÂçÝÇíðÝvçÏqö»<È1ö­žB}¿ì¾+ÿkÿïø%ëÆÔ¿àœ‡wOÛßö8\ïû¸ý >®Üùãn>Ó·g™>Õ³ÈO·ý—Åíc_ãÇÒ›þN+þÆÿ“!ðÿý”ýÿG[QGü}ÿ&Cáÿû)úþ޶¢¦;ÏüKÿHˆÇOüȹÿ‚’|ùs»öø¿s;ÿâ¼øÕÜyæ¯ò¶m¼ÿŸ³ùí¿Ù$þZ¾÷û{¿í¦ÿ3ÿ¼Ï3íôùçý³þb_ÚñZÿR¿ðw"çþ Ið?åÎïØ#à"ýÌïÿŠóãT[qä?™þ¿ÊÙ¶óþ>~Ïä¶ÿdx“ùjûßíîÿ¶›üÏü ó<ϵÿÓçŸöÏù‰iÿÅký·á¿üÜ5ÿbèÿéÚ§ÎbÿÞ«~TÃï·»þÚoó?ð+Ìó>×ÿOžÛ?æ%ý§ÿ©÷¿ÛÝÿm7ùŸøæyŸkÿ§Ï?íŸóþÓÿŠÔûßíîÿ¶›üÏü ó<ϵÿÓçŸöÏù‰iÿÅk©¥ÙÇy#É1ß[K! Ë;J²8&ùQ£d–I$_>y.#ºf2ÜZ_Þj^%ý3#ɱ¼Cšà²lº4åŒÇT”)ºÕ*4ãNœë×­Vm6©Ð¡J­iªp©Zq¦áF•ZÒ…9ñT©TåRwå‚MÙ]¿á¤’îÛI]¥®­+³/ï·»þÚoó?ð+Ìó>×ÿOžÛ?æ%ý§ÿ©÷¿ÛÝÿm7ùŸøæyŸkÿ§Ï?íŸóþÓÿŠ×°þʰïï]òÌûó÷·ï‘¼Ï3tÞnýÞwÚïüÝÿÚ¿h˜XÙ„ öh\m*L‘¬®á„áÌ’Håg7>cÈÌò›†vc<¥ÿW¡à_JmbslŽ>VÔ¨TÇâ&çuh¸TÀáb¢ãÌÜÕFÓIr5'(ð¼Îе©ÕoMÔVܽT¥Ö=ºßÈâ~÷û{¿í¦ÿ3ÿ¼Ï3íôùçý³þb_ÚñZŸ{ý½ßöÓ™ÿ^g™ö¿ú|óþÙÿ1/í?ø­{†´´mÛ­­ÛvýÛ¡Œîó<ýû²¼ïûUÖüçwÚgÎ|é7X¯Sà6.\ÿZâ\5rû?«å•q<׿æçö˜Ü'%½Þ^_iÍy_“•sCÍ"­ËFO½æ£·.ÖŒ¯~_+yž÷¿ÛÝÿm7ùŸøæyŸkÿ§Ï?íŸóþÓÿŠÖaoq"  ¤GRáÄO*HŒ'bÁ‚݉UÁ¹%³x&ÎIÔ…ìŸð™÷TWupñ›xž&­ZŸ+J42ªxy©ÝZNu3 T\Ty“‚¦›m>t¢ã)y£Ó–ŠOMê7µº(G¬W_/3‡kK¿›uµÁûû·C#çý~ýÙ[­ùÿJߟ¶y¾dùþÒûlŸð™ØþÊ¿n°}î»å„ýÿ½¿|—9ÏÚfówý¯;¯üßí ÷¿ð–öW©‡ð/‡£Ïõ¬ß:­~_gõwÃrÛ››ŸÚa1|÷÷yy}Ÿ-¥~~eË3«§-:jÛósKùm´£o‡]þG=•ÔxX+°L’²’ò‚B¸V¼%¥7ǵÅÑšin Æ¥5ÅÌ~0m£¥Û6î·¶íýwȧvÿ?ÿjÎÿµIæý³>}ïö—™ã>ÂíwZ\®ÝÛ­æ]»<ÍنݞEÖüôÙö[ÙÇ‘6|¶åô¯šþ÷¿Ö¾~ÿXd}û¿ÒsŸ´ïó|æÏÚüß·¿ö‡Û¼[ùïð&…øÏ„òÜ¿‹«†ÍñùjRÆÆZøiË2¡‡œœèC N´[šœ`©QqK‘ÎWæ]TqR­†¯9Æ)Ó„þ¥$¢šÑÝ­¬Ýß{-ŽÂŠ(¯ëà (¢€ (¢€>Çÿ‚^·ümKþ Èwtý½ÿc…Îÿ»ÚáºíÏž6ãí;vycí[<„ûÙ|WþÖ5þ)ßðKÖÿ©Á9¿ìp¹ß÷qû@|7]¹óÆÜ}§nÏ2 }«gŸoû/ŠÿÚÆ¿Ç¥7üœ—×q4êÕ¡†‡ÖñžÎ8Z5jR¤½¾'Ù:•#†§9Fu}›«8Ñ‹åu$£Ìü7g'Ë“o–7æi7¤odÛ[^Úö3ïg½¶2 WZ ªÂU˜™4Ø–ÛÆÄò‘æ“íKäZÍ=šZê˜çY¼t*¢.¡VHÑ‹‚Â0í 1‘Z0©v„ÝÛù+~’yÿlÿ˜—öŸüV¿šÏ‹8ª¤'N§qJu#(NÎsBp’q”'b\eEµ(´ÓM¦šgb¡A4ÕI«4ýœ/s]¼Ù`]Ýü»nnÜÛ‰¤|ÿ¨Ù· u¿?è»1öÏ7̃Ú_mþ>ƒFy$‚Yy%ÌˆŠ¯"Ȩ« l¬¬fžOÞFñŸšVãXæŠKï5õ}O—ûßíîÿ¶›üÏü ó<ϵÿÓçŸöÏù‰iÿÅkØi_ñáþ÷šùë¿|Ò>ýß7™ænßæù×~vï7íú†ÿ·\~àí\neÅîX¬ÃZ~UÆÂ•lV&­9Ô•L6)BU”,1Óšs…H©E5>JãÌ9a‡\±ŠsœbÚI4¹Tû_xô¶ï[]3Uÿ Ç÷¼¤Ç]ûæ6mù¼Ï3vÏ+É»ó·y_`Ô7ý†ãDlÝÉógu»·ßÎÿÞE.ìùïæ¯ówî¼ÿŸ´yçí¿Úþ$¹®:ùPC·sI#8ÿVß*¯Ë°Ç4­æ›•‹ä‰ã“Ù¤Žù®bÑõHô.~ÔÝsä|ÿ{;¼éÖ~÷vï7Îÿ¹·ùßiÿIûOöÞµõùÝjyŸÜ?„„½œ²¼5eiOš¥ e¨Ùªi{JXšT¯TŒoÎÛ’•(áI8eµe¿<¤×MéSóÙ¦úvó: (¢¿{<°¢Š(¢Š(ìø%ëÆÔ¿àœ‡wOÛßö8\ïû¸ý >®Üùãn>Ó·g™>Õ³ÈO·ý—Åíc_âÿ½oøÚ—üîéû{þÇ ÿw´ÃuÛŸÿ$ÿu_à¡ÿ¦bQE3ÈQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEüùÁÇßòd>ÿ²Ÿ ÿèëj(ÿƒ¿äÈ|?ÿe?AÿÑÖÔTÇyÿ‰éøíÿƒ·à’ø)GÀØ¢{Éû|aB²¯Ž¾6+—f…ÇLË#?Ú£Ž9Ú)" vÚW‰?™k]6 o-Èóns˜¿.û·2£É&ݾdÂ7v–qö‹©%žk‹ÛÙø;%ÁG> ÈC·ìð€ì‰ãŸ ŠÍŒ•C$…T’»fÏòñyyœ`‘¾WȆ[t¹S'bH뼑£2G$$‘[ÛÅ=ÜöÖÓ®_G.áÎð‹…¸ßˆ*a+V«”SÇSÄc)F¦'¡KQážœã9TÌê×§JPÄS¦ñ^ÚTp9|ÝZ˜ïƒÍëÖ«­†¤¤’©ÊÔ]¥Q¸E>gt”èß-¯)½”nVLÚŪ CºáÊ’›Ë—#RûYÙdÇ"4Ü"–×ÉIeÔ4Èo°o/$¾1ȆVE "ªdìIÒi&IãFdŽâ9#¸ŠÞ®í.í­¼_Oï·»þÚoó?ð+Ìó>×ÿOžÛ?æ%ý§ÿ¯»Å>6c'_ƒá\5XJ­(føÊr­‰Ä$©(bp˜*±…$Tã_’8ÚxÉ×£:3©‡ÁÕJ :tmWm·féÅÚ*í]JKYi%~W4ÒrVf„º¥ìØÄ¾X>IÝBå—aVVOµ9ó^h\¢5ÔRy–‘ÅüÙEâÌÿ½þÞïûi¿ÌÿÀ¯3Ìû_ý>yÿlÿ˜—öŸüV²E—2,Q/˜òç•eee,îîÆå e.Yä‘Úê6Žé¤‘µÔY¼iÑZèñ sw¶áÙˆ ž^ÀîK6ö/#N$—ÍYZQå\\Ã+ÝKyª^ê”äiâ6-ÕúÆ/J„«Sžk›â±//ÁÍÇÛË N¤£^Q”å:VÂ`hTt½µ•)Rÿk©ÕÃá"´Œ[å|”ãy|µ§i{Òi;4›z<8l®®FèágGPâG*#‘%yp’V%W2ÎÎÁ¯CÅ%ÔÎu®gnC¢Â§uÄ9ܦұ¸)'˜’‡y¤‘d’i‹—{Å$±ÎÓ½ö±6©µTî/í­¸wÞþbÆb‹J¬|¢wF§pÚ³ÂvãÌ•§·‚–æêÖ¿p˼1ànÂÿiñ"ža*>ÊSÅç5iáòèV‚«xÐËã5J¯Ö’ú®2¦e)Δ9©ù²ÆâkË’Šp¾Š4ÓskÝZÏuf—½ ]ߥœ,lÂû4.6•&HÖWpÂpæI$ò³‹›Ÿ1äfy ÍÃ;1žRù÷šBNòK,lêå¡e)%bäÅd,¢[44™&•Ú !»Õ­5XW\Ý,yƒ‡ÚÞt§{'”ñùyGÂKbÍûC\'ÙfO£nìZÝEwšpIRѱU}­±QÒDxÝâš'Žx$– c‘ý5_ ¸ê…LO.¬©{Ô(að•2ŒTc‡£M,F *8JêˆöJÎNXÊJnPÖ7 ÕY9«ÚíÉTŽ®ö–²WvOººÕ7c‹’cm³E"3îÂȹó#Äü0¹2î–i#oøüód¹t?ÚM¨0ñ§mnmàYXb’áÂ(`ŧ¹%Îânn 9&yOïžÞ” ­:UàêÆ­8Ê0”ŒN/ëéÇ—–Q”œº­£ò»ßdù®·µžç7®;4°C·*#gë{JÞC.Ñ?bù"º‘þÓöi#‘n¢ÑüAkDmæ.Óa¤3²lI3ùó’¤Ï$êK!îDú‰¸m_QËÕ˜É}*¬c‰B¢A~GÚ·V&ðÆH¤}—Kn,™/SOñ]/PŠxfݵ٦IW̘³¸Œ”دpY¦2Dñßö_ÿµŠwüõ¿ãj_ðNC»§íïû.wýÜ~Ð ×n|ñ·i۳̃jÙä'ÛþËâ¿ö±¯ñãéMÿ'ÿc$ÿÕæ$ûü“ýÕ‚‡þ™ˆQEüÌ{!EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPóåÿÉøþÊ~ƒÿ£­¨£þ>ÿ“!ðÿý”ýÿG[QSçþ%ÿ¤DäþÖ¼ŽÏþ -ðH‘¾Wý„>ˆa·HßðœücL‰#¬jòFŒÉ’4’Eoo÷sÛ[Mü©K,—24²·˜òã' ÊÊÊEÊÊ\ªG-ÔmÒÇê ¨ªøÓú‘ÿƒ¹?ðROÿ.w~ÁîgüWŸ¢Û!üÏõþVÍ·Ÿñóö ý·û#ÄŸËWÞÿowý´ßæàW™æ}¯þŸ<ÿ¶ÌKûOþ+_ïÞ â|Ï6ðÏ€òZµ=–U’ä´©apt›P«ˆU+ª˜ìKÓÛbeí'NÒ†Ý*1U*â«b~[Fñ¸š‰^u*^R{¥û¶¢»%»ë'«ÑEDûßíîÿ¶›üÏü ó<ϵÿÓçŸöÏù‰iÿÅkrÎÎKé ¦!dP²+¾÷&’džGUy.#’;‰n'–îÒîæçÅõâŠK™(—Ìys€J²²²–wwcr†2—,òHíuGtÒHÚ‚j,Þ4î"Š8#X¢]¨¹À%™‹3wwbÏ$’;3É#³I$ŒÒHÌìÌfðÏ€£ÅØÚØÜÉÔ†G–T¤±„kS–e‰šu#£‰Œc téÂ1©˜N•_­R£[ NŒiK ^ÏÆb¾¯Æuf´z>D”=÷­´Ô\­¦Ýù\]{;8ìã ò¾ ÓÛ¤mÎøÞGXÕä‘Õ^I$i$–ââYîç¹¹šIî ¶ÙçI´É»b…y¶à©»œ»Ça~yæ‚Ý7Oq rGyyœ`‘¾WȆ[t¹S'bH뼑£2G$$‘[ÛÅ=ÜöÖÓqòË%Ì,­æ<¸É²²²…DDQr†2—*‘Æ‹uGt±Æº‚j*¾4ýwŒxë*ðó„á¾ÁàªfXzt”0-Tž +Âɪ®xïgVzøÜj”ªÂ“ÄGQÖ–e­j”#àÃág‹“«ZRPoYiÍ7uFé¥Ý+Û•[’+GËrëRžïÌ@v[˵D*÷'˵YÒ9üï;τȈ·OæÚǶóYAâÌÿ½þÞïûi¿ÌÿÀ¯3Ìû_ý>yÿlÿ˜—öŸüV§Þÿowý´ßæàW™æ}¯þŸ<ÿ¶ÌKûOþ+] .HÒö&“Ë`û•d‘˜ì’A”‘<ÊÒJ×"5w–Uíëxòêê+þs†'ÅÜA†wœÔu³m ót§Zž–+&Õ*1p§G J¦"¤èá(¼.”¦ã͆¢çRµ£‡¥'Nš´#Ì¡œcOw«rvIÉóIù½äÓïQwIo#Ý NÜÆò?˜¨o•špþ`ºó${È›ûFYî“ÅõQÝ]d˜8ettbϽˆeee7EÙÍÐ*ÀÞMà êGRÿŠÓ¾¬{Í")¼Ù!>\Ïóym·Èv>ošLRlóüé7’’į$ìö³Ã}ªÛj?­ñ7‚øœ¾œ1¼'ŒÅãjP”êÏ Œ«FÈ*T•Zu0˜Š°ð«[ÛS”aOÙÒŸ5J*n›á¡˜Æo–¼c씢›‹Ö)©&Ý—*ZÝ­ïºD6šÈrVè*‚ªÑÉ ;†;#ù<¸Þà³Ld 0¼ÈÏq¼m2\é7ºÍïí[ÓîôÙÏ¿?wfÈÛÌó7CålÝç}®ÃÊßý¡eöŽV{y p“ÆÊò(`­‰ ‰ R87bF/pñJ‡íŽf¹– WP–úDñœ?{ý½ßöÓ™ÿ^g™ö¿ú|óþÙÿ1/í?ø­| /‹œq‘Ó–YÃà±8¬5JЬó¬:9N\þƼic0Vö|Ö‚©ATŒ‹“ŠŠZ¼«S‹”c$­ìåGð««Æ[ÝÞÎ×é½ä™Öie‘W 4ŽêŸ»–f,G$RoxýÜ3Ç7Û>Hï×R ã9–ÊêXMÂÂÒDÊï»*æDËneB×O:È'™ƒ*Þ‹„{ÇSª$×MâøíÂIqÈÒI¢†IWPÁ‹NC¬¢ìî&æA0½$Ïz5/3Æ}Õeá÷Ðã¯í¬Ç5Ì18xѨ¡M`áF5ªãñ\Õ刬êR%†¦·ÃÒ„'^U_-l4h%]â±O ì£&ÚMó^Ê1PÑY§vÖïD–ÎúqpÝ]ÙÊŽGo!«<š¯ißÌ‘Þ] ÄæYa–)/§»†Oô–ZŒW»”.Q–—WßÈË":„–(Bʾl2ÄóÙ]Y^]ºïO·¼!¤Ü®¼{2èREU‘dIEC,…UÑI'·pö—w¶÷ÍՅͶL©¾6Æ%\Ȳ3îÆU…Ä¿¿3ÊgŽâI¥–êÝ“P¸¸º‹ÅÿS*|uáV&¥Z*·ðŠ­RR¤ï5O 4¡N¥z±£^¶Q*pq¢ªFø*“¢Ô©I:(Á}W’v¥^É'æÚVJéTûRkâIîµ;J+—³ÕåÊŽaçB>_0n’ãkù^QVÍçìó#ØÏ-Â\@©uw4šUω:(.!¹BðH² b¥—=p@;]%‰ÇÉ42E~Ïä¶ÿdx“ùjûßíîÿ¶›üÏü ó<ϵÿÓçŸöÏù‰iÿÅkýJÿÁÜ‹Ÿø)'Àÿ—;¿`€‹÷3¿þ+ÏQmÇþgúÿ+fÛÏøùû?~Ûý‘âOåûI·ûEÈ•¼Íb_1åiI2F­(–F>bÏ,ÿ»–á§ŽYî$¶¿¸Ô|QýáàÞQŠÏøw‚²|ýþ? JŒfâå4ý­i×ÄN)¦éá¨B®"ª‹æöt¥Ëwd|ÆaR4«b*Kh>kwiS²^rvKÍ›šm¯Ù ãÙq.ZbͽÏÏ#¢³n“nß1ã\byg–K«Û‰§¾¹’òò;8Á#|¯‘ ¶ér¦NÄ‘Ö5y#FdŽII"··Š{¹í­¦¹\Måѽ˜ÊQB•XãEäÆF;"N'g[¼ ©s¥ÚÁm Ý­ìþ/þÛãLÿá· eÙNH£OV‹Ëò‡R…9òC ošâ:4°•qjUáZ|ðŠÄæň©†ÄQŽ*™ó˜jO^S«¬SR©«ÖîÑ‚»rQ²²³÷a&Ÿ+!–Y.dieo1åÆN••”*""‹”1”¹TŽ4[¨Ú;¥Ž5ÔQUñ¤{ý½ßöÓ™ÿ^g™ö¿ú|óþÙÿ1/í?ø­v´U…æ‘Ü«Lª¯ç,H`í,¨7J€¹V3}¦w zҫκ‹ë:öõÕ¬Wqf%X-dÜ»ÕÐåãt‘)¢y ž9`–HßòƒÃ Ë‹¸~·C=£<Ã[Ržµ:˜š¸šô«N5a˜TÄFX|^*¼jÕ÷¨bS§R†"¥kלh÷ÕÆÃV4]&¡ É4’N1k’ k¤–ë[¤½Õ~ï·»þÚoó?ð+Ìó>×ÿOžÛ?æ%ý§ÿ©÷¿ÛÝÿm7ùŸøæyŸkÿ§Ï?íŸóþÓÿŠ×B÷N–ÓkçÅ&ÈïdÞ­£‹§>kÍ0ˆ¸ºkŸ>h¥KËÛ›Û?gýïö÷ÛMþgþyžgÚÿéóÏûgüÄ¿´ÿâµü×5Ês“W.Íp•0XÊ<®¥Ž÷d¯Ó©NS¥Vœ—ÃV”çNV|²vvì§8TŒg )EÚÍy8&švi§ºi2õ¦¡qjcÛ*HÁÂI¾A½Þ6f£yÜ´âXÃ2=Ù™î`¸C¨]ÏeqâΚÖþÚï'ýáŒHbln òç ¥¢—hxœ´KŠ{[„v·»µ–n/ï·»þÚoó?ð+Ìó>×ÿOžÛ?æ%ý§ÿ«‘Ý]d˜8ettbϽˆeee7EÙÍÐ*ÀÞMà êGRÿŠÓíø?ÄÌó…åC VÚy4=)`qN¦„jNsy}e8ûŸ¼•£UU£(¨Ó䂌'jø:UÓirTz©-›j s«jµ¾–~{ߺ’¦]³Eª7adEuãxŸ†|ñI$mýèÝÐåYço4‡‰$–i×s–…”¼¢&IÜVsrÀËq惲MÒ»A5Æ­iâ -5’-ÐiK0hä…’$xþO.7pÊ¢xÚ Îò$[£^½Ö“{®té",‘²º:«££GF••”ÊÀ‚¬ AÁ¯ÝgG|VËç*\«0§FUTì°ÙÆ[R­ð𩉧J¤©â"žtêO‡p>YEʔךž+5´­ñSšV•“jñzßNW{Þú£“ÓQ×R‰$V6õu%ÕÖ)KÜ.`n 4†Rstd7ÌoþÛâÞº£ò£ó|ý¸—Ëò‹Ãta·ªº‚ö1cpÍ™0Œ šPòW½À¼%> ÊñÙd±qÆÓ¯›â±øzªœã‡«‡ÁáéS­îºÊ8^jŽ»¼íŽ&ºÄN3Qqµ8Á«ßTÛmyk¥õ k¢HŠ®Ž¬ŽŽ¡‘ÑVVV2°$2A‚0iÔWÙΩ Ó©Ô§R2„á8©Bp’q”''FQmJ-4Ói¦™Î›NéÙ­S[§ÜżÒw’XcgW- (1I+$î+ ‰eÜy¡ ¸ŒÉ4®ÐI Þ­iªá«^YHHA,Šëó#nY…uºó\HJ8Ž.¥Y#kùï¼eÛU{«X®â0Ì2J° Z6*ɹw«¡Ê;Æé"_ðq÷ü™‡ÿì§è?ú:ÚŠ?àãïù2ÿÙOÐôuµ1Þâ_úD@þ:àîEÏü“àËß°GÀEû™ßÿçÆ¨¶ãÈ3ý•³mçü|ýŸÈ?mþÈñ'ó)£Â×Î;KÜ1}à9sfØG’Q"³´³«Ç$±HnoµjË6§}ý5ÿÁÜ‹Ÿø)'Àÿ—;¿`€‹÷3¿þ+ÏQmÇþgúÿ+fÛÏøùû?~Ûý‘âOæ‚Ä ³¶Ø r¤0w•D’H\Or¥wiO´Ü™šF¸˜±•ÿÔ¢F_O–äøê°§?ìî› åÍí)b±xÅAV¤’åÿuúå¹Jê5ÒŒeváñyìšH¦×=dŸgÊÏþÞQ"R_.ÊQÆm¶à|åo8ìee)* èY¼7åhâŽÒúy"±¸ãþ÷û{¿í¦ÿ3ÿ¼Ï3íôùçý³þb_ÚñZïk¬í¢ÃF*QÊ0”¤.VT‘˜³BȶӾ'Kw[{‹®àýïö÷ÛMþgþyžgÚÿéóÏûgüÄ¿´ÿâµúOsYæg‰ÂÞ.†O„Â`){:®pœêRXìEIFî­عaj¨ÙÛ N3÷¢ÒË/‚†2ëRR“º³²”"—v¬¹—ø·&‚âh¼2¼ŠT²âBâBEØ‘‹Ü$±8ûc™®bž&Ô%¾ügÒYê°Î‘¬ì±ÎÌ‘ŒåJ\!I•¥DY ®ÖšD\Z¬3ÝA{§]_r¿{ý½ßöÓ™ÿ^g™ö¿ú|óþÙÿ1/í?ø­O½þÞïûi¿ÌÿÀ¯3Ìû_ý>yÿlÿ˜—öŸüV¿?œwŸpeõÿYÀJê®WŒj˜'Ï%)Ô£N5!õlK³µzVæm{hV‚P5­…¥ˆK™rËKN))m“vÖ:½ÊÏSÐ+óHŠo6HO—3üÞ[mò›æ†S›<ÿ:M䤱+É;=¬ðßj¶ÚŽ]ާ,3É<li¤O–$á>dí&VH”²Ïö…–Ý¢šæîâÆóÅ=%­ÔWq ¡9”•-WÚÛÐå$GÞ)¢xç‚I`–9ú3.ϸ3Å Ëñ¸z\Ö§ ·(dž凲–/ZR½*МeM¾YÅóÓ—ÕÜ—‘:XŒ¹àß/»ïÅ{²ÚJ2O³_ŽS‹’cm³E"3îÂȹó#Äü0¹2î–i#oøüód¹t?ÚM¨0ñ¤{ý½ßöÓ™ÿ^g™ö¿ú|óþÙÿ1/í?ø­{©íá¹@“Ʋ `Á[=pTŽ;]â•É42KªñK"77y¥MÈÐ+OW“’$•A.7VY^v"y›rÃr÷ÉtÓAs<º¯‰ÿã ³žŒ±¹S©ek•KØÒ©<Ç j|Õjb0´©Ê2ÃFQ“UèÎ~Î×…8ÇÚKÑÃã©Õj3µ9é»\X¤”›ÞËTÒ¿Kì²~÷û{¿í¦ÿ3ÿ¼Ï3íôùçý³þb_ÚñZصº–ÚQ4'qlRYÖuvWÚÛáß{Ü$ˆñ½Ì¦[˜ç‚KéÆUþ÷û{¿í¦ÿ3ÿ¼Ï3íôùçý³þb_ÚñZŸ{ý½ßöÓ™ÿ^g™ö¿ú|óþÙÿ1/í?ø­/ÂbñX U n ½L6+ R5¨W£' ”ªAÝJ-}Í;ÆQn2N-§ÚãÅÆI8É$ÓÙ§ÉtuVz¬3¤k;,s³$cùR—RDeiQC$+µ¦‘—« ÷P^é×WÚÕçÿ{ý½ßöÓ™ÿ^g™ö¿ú|óþÙÿ1/í?ø­u,u9` žIà“` ³M"|±$o ó'i2²@<¥–´,¶í×7w7ž)ý÷ƒÐ7ùNeý¡þ„a+ʬS$À¬·w™4ñL÷3]Íÿ û[×ø»Á,ÿå'ðNoû>ÿÙÿZáí´M•ÿKþ Áðwpµ&µ|6a”f˜R¯óá”sÑUbïZ1¦á)Â3nRožÑûlƒ,E ò”Rq©¶¶v‚ÖÝ=.Š(¯ä#ß (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€?Ÿ/ø8ûþL‡ÃÿöSôýmEðq÷ü™‡ÿì§è?ú:ÚŠ˜ï?ñ/ý" ?ðw"çþ Ið?åÎïØ#à"ýÌïÿŠóãT[qä?™þ¿ÊÙ¶óþ>~Ïä¶ÿdx“ù¢´mÖ–Í»vëx[vÿ3vcS»Ÿu¿=wýªçvsçÍŸ1¿¥ßø;‘sÿ$øòçwìð~æwÿÅyñª-¸òÌÿ_ålÛyÿ?gòÛ²MÔ“[*Úù^œlý.­ê×s'[Œý¢‘$>Xc;wB1 ŽÊEÚ»£»I ÃÚ¤.ndÑüE‹÷¿ÛÝÿm7ùŸøæyŸkÿ§Ï?íŸóþÓÿŠ×¤×#fŠ :ªÈÑ”Û#ni×bðhŽà ¯’Mçýž4½Y¥Ñµnoï·»þÚoó?ð+Ìó>×ÿOžÛ?æ%ý§ÿ¯WŠx'‚ãœéZ^Ï,.6”§(IÉb0t%U®KrÆ8•^œ#4¦¡·Ìšœ–\Øj]ÕâÿíÙÅ/ÂÍùýÁ÷¿ÛÝÿm7ùŸøæyŸkÿ§Ï?íŸóþÓÿŠÔûßíîÿ¶›üÏü ó<ϵÿÓçŸöÏù‰iÿÅj}ïö÷ÛMþgþyžgÚÿéóÏûgüÄ¿´ÿâµ>÷û{¿í¦ÿ3ÿ¼Ï3íôùçý³þb_ÚñZþzu.Ÿ/ýÆ{ý½ßöÓ™ÿ^g™ö¿ú|óþÙÿ1/í?ø­\Žêë$lÁÃ+££}ìC++)º.ÎnVðÊoR:—üVûßíîÿ¶›üÏü ó<ϵÿÓçŸöÏù‰iÿÅj}ïö÷ÛMþgþyžgÚÿéóÏûgüÄ¿´ÿ⵨Ntç ”ç*u)Ê3„á'ÂqjQœ%¥FI8É4ÓI¦š &¬ÕÓ²iì×¹£:k=]'xâV6u@³+’±@ÐÒ–Q-¿”V{ˆÌ“D‹<Ýé7z®ÕyÿÞÿowý´ßæàW™æ}¯þŸ<ÿ¶ÌKûOþ+[Öš…Ũel©# &ù÷xÙš6çrÓ‰c È÷fg¹‚á¡w=•Ç‹?yàÿ±XÇÅ‘©¤¹ýžoF0Xªq?ÝÑÄaiR„q<ÒŠŠÄÆp¬œ¯Z5›•Hùuòå/z…¢ô½7~Vß-Ú“o—âÚÖÓKln^iPÎ’4 ±ÎÌò“åJ\8xÝYeDY “6å†D\]4Ð]A{¨Úßs·V²ÛJa˜n-’¬:ή̛—zÜ;ï{‡ÒD¹”Ës$Ç}=ô‘øË®¶¼·ºDh¤]άÞQt2¨Q|ª3†UÂÂXÚHdŽh&†Y!ž$šHb™vÍr¨Ý…‘Ôoâ~óÅ$‘·÷£wC•fìøÃnã/ö·WÁ`q˜«ÔŽ' òêñ’ujyÿlÿ˜—öŸüV¿Í¹÷g3ŒúŽsƒ–´¢êQ’œ*ÐÄRRqUhV¥)S©¯z7U)¶£V9û§±J­:ÑR§%%tžé§îhÓ³_“Ý6‡#ººÉ0pÊèèÅŸ{ÊÊÊn‹³› U¼2›ÀAÔŽ¥ÿ§Ai¬‡%n‚¨*­£¸c²?“Ëî 4ÆHÚ ÌŒ÷[ÆÓ%Γ{¬Ç¤Z[ϳ̫9,Ñl“d±ì’-ìåL³™tºï•ä óK ×¢þëWÕï_i‘\ÆL)Säª±Íæ4¯"L<¹ù<çÍh¦ÚÓÜ,°ÝZ]_YÞ~³Á<1Ç™NC(áüà (â¢ñÐáÚ¾Ö´3*T]JöñŒ©Rj”Z´©Ñ­’KV§_÷tx1°µ*û °––‹¬¬œQnÏWdÕ›jÚ·fµzHé",‘²º:«££GF••”ÊÀ‚¬ AÁ§W"^÷L¸XË3Ìê…¥h.WEvU̲–CfkÈî]7W³¯ü%ÛÖZŒW»”.Q–—WßÈË":„–(Bʾl2ÄóÙ]Y^]þ¯Ã^"eÙÎ1䙥 ™Ò©õz™f1MF½zt£*ßV¯Ëìÿ‰í*5gÕi¨N’ª¤Üxka'N>Ò U¢×7ïÿ‚YÿÊN?àœßö}ÿ²þ´ÃÚÿhšÿoø%Ÿü¤ãþ Íÿgßû!ÿë@ü=¯ö‰¯ó7éÛÿ%oÿÙ;™êÎ'ÙpÏû¾'þ¿GÿHAEWð‰ôÁEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPóåÿÉøþÊ~ƒÿ£­¨£þ>ÿ“!ðÿý”ýÿG[QSçþ%ÿ¤Dã§þä\ÿÁI>ü¹Ýû|_¹ÿñ^|j‹n<‡ó?×ù[6ÞÇÏÙüƒößì1š$á’h );¼ôÌŽÏ #JÊ “#(/ ­$sÈò¤ži/ÌίýjÁÔÿþ/üRÿ‚‚|×¾ü&ø“ã6Ïöø¤\k>ð'Š­‰Ëc .•<ë,•Z˜:ø„¨J•(NUkJ–+ù£íTiÓ«R¤i?ÞMyYr­ :R£UFoš-Ó”—+•ÛVIÆ+[jì›Øù¯ï·»þÚoó?ð+Ìó>×ÿOžÛ?æ%ý§ÿ©÷¿ÛÝÿm7ùŸøæyŸkÿ§Ï?íŸóþÓÿŠ×èý“j›wìÑû@¿»wÁ¯ˆ¯Ÿõû÷g×[óþ•¿?ló|Éóý¥öÙ?á3öMý©þmß³Gí~þíß¾"¾×ïÝŸ]oÏúVüý³Íó'Ïö—Ûdÿ„ÏùÇûc)ÿ¡¦]ÿ…¸oþZzÊœô÷'Óì¿îyy?¹Ÿ?ýïö÷ÛMþgþyžgÚÿéóÏûgüÄ¿´ÿâµ>÷û{¿í¦ÿ3ÿ¼Ï3íôùçý³þb_ÚñZýß²oíOónýš?h÷÷nø5ñóþ¿~ìørë~Ò·çížo™>´¾Û'ü&c~É¿µ?Í»öhý ßÝ»à×ÄWÏúýû³áË­ùÿJߟ¶y¾dùþÒûlŸð™ŸÛOý 2ïü-ÃòÐTç§¹>ŸeÿsËÉýÌùÿï·»þÚoó?ð+Ìó>×ÿOžÛ?æ%ý§ÿ©÷¿ÛÝÿm7ùŸøæyŸkÿ§Ï?íŸóþÓÿŠ×èý“j›wìÑû@¿»wÁ¯ˆ¯Ÿõû÷g×[óþ•¿?ló|Éóý¥öÙ?á3öMý©þmß³Gí~þíß¾"¾×ïÝŸ]oÏúVüý³Íó'Ïö—Ûdÿ„ÌþØÊèi—ánÿ–‚§==Éôû/ûž^Oîg€£ººÉ0pÊèèÅŸ{ÊÊÊn‹³› U¼2›ÀAÔŽ¥ÿ¦õ–±ÉxÙÎ^9£vwla——vï6%µ14Ûüëh<ÛŸ´éz†µì û&þÔÿ6ïÙ£ö€?vïƒ__?ë÷îχ.·çý+~~Ùæù“çûKí²Âf7ì›ûSüÛ¿fÚýýÛ¾ |E|ÿ¯ß»>ºßŸô­ùûg›æOŸí/¶Éÿ ŸÒp߈•xWNSŸà#MÉʾ¶>L¿ùy?Úp°Äӌ䣤*ÂTëÓ·îêÅ6žUpмyjR•ì’’‹SÁ´¬í×Gu½Ó<õ$E’6WGUtt`ÈèÀ2²²’XU ‚85F÷NŠ÷kåÊ0¦@ŠûâùÕ£tpQð’Ì".WÍš)R{+«Û;¿\·ý—?k Nölý  bF‘âƒ_Y¿{æå‡‡.%_0¤¯#C$òI*-À}BᡗŽ$³í;>ðf¿ÚM¹Yþ|ALçr޾xßd‰$mµÎv “}¬ö³Ïý#“ø£áLjkÉóìvQ…ÄÖ5‰Ë±ùŽ• Õ¡N¥iV˱ÅF¤cIRœ£QÏ ‰¤Ú‚¿4gSÇ©‚ÅáfªRI$ýÙF ´¬§6ÛJÖiµå§Ì¨ot©&ýÊÈ®Ñ)•£•ÒBÒ»G²Uó& 3<Êbf¸›í³˜®õ'ŠOt×–÷H‹¹Õ›Ê.†U "/•FpÊ¢xXKI ‘ÍÐË$3Ã$Ÿ@?ì­ûMHŸ³ÇgGVGGø?ñ‘ÑVVVðé ¬ ¤A ŒÁ¸ý¿jš9lg_†E“$Ið—ÇâEf’FYRfðÛgËó¤Vi^{—[É.u[-sΆsK€.ø{‰²>%áˆÆsžGW<Ëe–©æ¯5•*UÜñrUfá$çR¥7Rqv§§³x»*´jQ­¢UU9òOÜŒW=Õ¢“K^Í$õ<•Ñ$FŽEWGVGGPÈèÀ«++XH ‚A5ÍÞiI, Ó®ç- )yDL“¸¬æå–ãÍ dš9¥v‚þkZÓÄCYþÌ¿µ8óûöjý <ÇY“à¿ÄS¾k4->—8ò¤X m6v¬ -Ï™§êÆÇü2Çí;ÿFåñãÿ Äþg«×Æg~x›”C_>ÉhbiS©N…LFm—àó|ª­Nd•j ËR›”ãN¤«á+Zr¥.tç áO‚©eJ£‹i´¡)SšVz>[§²v´“²jÚ?—ìõycò£˜yЗ̤¸ÚþW”U„³yû<ÈöóËp—*]]Í&•sâNŠ ˆnP¼,¨©eÏ\×FIbqòM ‘OË¡IVE“Ãr$ІY «£’Onáí.ïmî9Öý“ÿjÛIdþδF šßáÄvYT3έ¸xrwoe•’U¹”JeG{=Ä«ãˆXßjÓÂæÜEñwN£Ãá1¸lßó:>Ë MP§È±µ}…9r8Ê–#ëΕj”ñ)»Vßê‘Å®hR«‡­dåS—#¼•ÝùUÞ­ÝZÉ«®ßSÿÁ,ÿå'ðNoû>ÿÙÿZáí´M÷üKàwÇïÁE?`øÿàOÆx;Áÿ¶ì·âøÏÅ? #ñ.»«hÖúG‡|?¢é}ë:ž¢š^—ggwsy~–ÆÿPÿ\¯øj_ÙþŽ3àGþï‡ÿüÐ×òÓ#‹8Œ3î̸w3ÃfXjyeB»£;ÔÃbaN£¡ˆ¦ýêug®œ*EóÒH5'ïðý ¸zX˜Uƒ„Xµ}œy-tûiê¶i=w¢¼#þ—öcÿ£Œøÿ‡{áÿÿ44ÃRþÌôqŸ?ðï|?ÿ憿ŒÏ¡=ÞŠðøj_ÙþŽ3àGþï‡ÿüÐÑÿ Kû1ÿÑÆ|ÿýðÿÿš÷z+Â?á©f?ú8Ïøw¾ÿóCGü5/ìÇÿGð#ÿ÷ÃÿþhhÝè¯ÿ†¥ý˜ÿèã>áÞøÿÍ ðÔ¿³ýgÀü;ßÿù¡ w¢¼#þ—öcÿ£Œøÿ‡{áÿÿ44ÃRþÌôqŸ?ðï|?ÿ憀=ÞŠðøj_ÙþŽ3àGþï‡ÿüÐÑÿ Kû1ÿÑÆ|ÿýðÿÿš÷z+Â?á©f?ú8Ïøw¾ÿóCGü5/ìÇÿGð#ÿ÷ÃÿþhhÝè¯ÿ†¥ý˜ÿèã>áÞøÿÍ ðÔ¿³ýgÀü;ßÿù¡ w¢¼#þ—öcÿ£Œøÿ‡{áÿÿ44ÃRþÌôqŸ?ðï|?ÿ憀=ÞŠðøj_ÙþŽ3àGþï‡ÿüÐÑÿ Kû1ÿÑÆ|ÿýðÿÿš÷z+Â?á©f?ú8Ïøw¾ÿóCGü5/ìÇÿGð#ÿ÷ÃÿþhhÝè¯ÿ†¥ý˜ÿèã>áÞøÿÍ ðÔ¿³ýgÀü;ßÿù¡ w¢¼#þ—öcÿ£Œøÿ‡{áÿÿ44ÃRþÌôqŸ?ðï|?ÿ憀=ÞŠðøj_ÙþŽ3àGþï‡ÿüÐÑÿ Kû1ÿÑÆ|ÿýðÿÿš÷z+Â?á©f?ú8Ïøw¾ÿóCGü5/ìÇÿGð#ÿ÷ÃÿþhhÝè¯ÿ†¥ý˜ÿèã>áÞøÿÍ ðÔ¿³ýgÀü;ßÿù¡ w¢¼#þ—öcÿ£Œøÿ‡{áÿÿ44ÃRþÌôqŸ?ðï|?ÿ憀=ÞŠðøj_ÙþŽ3àGþï‡ÿüÐÑÿ Kû1ÿÑÆ|ÿýðÿÿš÷z+Â?á©f?ú8Ïøw¾ÿóCGü5/ìÇÿGð#ÿ÷ÃÿþhhÝè¯ÿ†¥ý˜ÿèã>áÞøÿÍ ðÔ¿³ýgÀü;ßÿù¡ ÆŸø8ûþL‡ÃÿöSôýmEpŸðpGÅ?†?ÿb/øW?¼ãÿì_‰þþÙÿ„'ÅþñWöOö”Íýý§ý…¨_ýƒíÿ`¾ûÚ¼¯µ}ŠïÈó>Ï6¦;ÏüKÿHˆ©:÷ˆüC¤_Û[i:î³¥Û?‡<;ÛéÚ¥õ”;x#Ñ´Ï´ñFÒ´qF!Rå#E$ª(ßðœxÓþ†ÿàÿVÿäº<_ÿ!kOûüÿ¨_‡ë—¯R’”’”’æ–‰¾ïÌÝ%e§Eú’ûŽ£þÐßâüêßü—Gü'4ÿ¡¿Åø?Õ¿ù.¹z*yçüÒÿÀŸùŽË²þ¿á—ÜuðœxÓþ†ÿàÿVÿäº?á8ñ§ý þ(ÿÁþ­ÿÉuËÑG<ÿš_øÿ0²ì¿¯øe÷Gü'4ÿ¡¿Åø?Õ¿ù.øNðK/þ˜åW-nòÿÀ×ÿ$—Nž–ü×ôµÿá8ñ§ý þ(ÿÁþ­ÿÉtÂqãOúüQÿƒý[ÿ’ëâø__´Wý#ƒö¯ÿÃçÿ²ÿéŽQÿ ëöŠÿ¤p~Õÿø|ÿà–_ý1Ê9kw—þ¿ù ¼|ºtô·æ¿¤}¯ÿ Ç?èoñGþõoþK£þÐßâüêßü—_Âúý¢¿éµþ?ø%—ÿLrø__´Wý#ƒö¯ÿÃçÿ²ÿéŽQË[¼¿ð5ÿÉãåÓ§¥¿5ý#íøN*—VñÖ‰}káßÛè×rh%õ‰+[½ê¿uiZtú¾©¦é6Í\ê—özu»Îΰ$÷·ÛDÓ4i,‹É*™#‘ÂU€S/ÚŨ·4ݬ¹ž·Û¯PV{[ú·ù/ÀÙÿ„ãÆŸô7ø£ÿú·ÿ%Ñÿ Ç?èoñGþõoþK£ûIÿ¡ãÂÿø ãOþd(þÀÒèxð¿þxÓÿ™ ?yüÿùR?üiÛðôòôû¼´?á8ñ§ý þ(ÿÁþ­ÿÉtÂqãOúüQÿƒý[ÿ’èþÀÒèxð¿þxÓÿ™ ?°4Ÿúï-øNn»­h^>ý•~,ÿÁM®ÿaO |mû-¦¡oÿ·¯?áøÿàøFo6ø«áé¾|TÓµ/Á©ü.øgá¿ñ—ü‹Ãž4ð_Áýëâ–·¢ø»àÏíåâïÛKCñ·‡<5a¦Íâ_xëöáÖ¿lïþÍÞ6²“UºÔõŸ…ÚΧuàëF+OivÅ_ƒÿ¾7j>¼¸ø¥ø ¸­/þ ‘þ*üVø¯ð‡Åß³ÏÃøŸ[ý¦¾%ü2øãiû|*ñoíqàß?´¼?µ ýwâíã/k6ÿ~|:ñwÅÿjž øoáo†Ÿ¼Yyá |+ø[ã/‹¾'ð6ñ3Mø½³öNúµ¬¬•ü’ÖÏGföÒítWZÙwÒÿ…ÿSêŸÛáûþ×ý’t=;[ñˆõãºxÇÄšVã‹«‡> øCöJøŸkàÏ‹OÝè6š'Œ~þÖ~ñD5Oh¾Ò¼Gkáÿ…±êÏÄŸéÞÓ}¯JøµáËÿо%ø3¨Ùk~ñ΢Aã Ùø’ÚÂÖÃâ—Ãñ‡íuÏ|/Ôlu-FßÄš'ü]â?üGÑ㇞#ºð¦¥ã hÞøµðGÆ?~Cý¿àžþ ý•üeðÒëோ?áøGð_þÇ‚~|¾Ðu_é^øûFé_üoñ/áîŸãwÆ·þ<ñ®jüsÑþ'øãZñU¶“à߉_~ Eà)4ø¾øßá×Ô_ð§¿¶¾1ÿÂÝñÿˆ¿á2ÿ„7ýà?‚¿²?²¼-ð{ûWÂߨ>6ñ¿Ù$Ôõ_øL¾6xËûWÅ^ÿ…§~šWü!5_øU_ þÑß/¾xÇ_|/®øÿÁ¿?°>üqý¡u_k<5ã…úß?µ´O:—€´ý"Ëâ€ÿ±µ_ØøÚçS×-<)?‚|TÂ×ñ÷À‡?Ûµ0ÿ„û[_Â1£ø§öKýœ?i_ˆ¿ð–éZŽ…ÿ Ÿ®ë_þh¿´OÄ„ŸÙWvÞ!ð~¥5×¾%ø7PþÀðß‹gñ×…õ¿‰Ö? ¼·ûB|ñŨ~øÀ>7Ñ>üTøñFo‹_ üAã_üJø~2ü]ýž~5xçÂÚßïnüñÛö8‡â—ìd–.°ð6›§j^ý—n¾=h¾.Òþ(øßáø|Zñ÷íñSÄ~OŒß´æƒ¦Û[x⧃¼ð’×+QM¤µæÑó^ïTìôµ•¯mݯ¨µõíä´¿êÏlÑ?oOÙÄÿៅ¾4hž*ñë|?}©xWDñ‰~èWÿ¼à?ˆ_gñOÅ÷ÿ ü%¢|{Ð~&x6Ãö~ñ/‰¼e¤øsãÇŽ5ÿ†_u_|Iðï‰<'¤WíÝû-ë%Õ-~ ëvúf¢Aâ]QÖ~üaðõ‡Æ/_xÃþѼAû0ÝëþÓmÿkmľ.ñŸÃ¿ xGUý—äø»aãüWø7¡ø^}_SøÇð¾×Å¿<üÿ‚mÿžýœ øÿ Ÿþ/'ãgüããü%¿ð®¿²7ÃxöðWü#¿Ø?ðj{ájÃÿiÿkÿlŸøAÿáfýû3Æð†}¯Åd¿ðO?xƒöj¶ý‘>!ütðO¿g߆^ ø1à_€?og]*m*çJýü}ð»ÇŸ &ý¯WÄÿ¼_ÿ %äÿ–ð_„>!è_ ×öNðoÄ?ø¿ãe߆4[Å¿ 5¿‚uj_Í+]/–œÍ{¾¶NÛnÃ_-ŸÉée×ÏSÚüû_è_¿hß„_ >Iö¯øÃàŸíOã_ØøßÀ?¾|cðÄož:ýŒô øKž%éÞ ñ·ÃŸíßþÓ7þ6¸Ð|ðöÃ]ñ?…µ…ž=ð­Ü> ñ†¡âϵëóËöiý‚´¯Ùçâ7~&iúŸÁ?ÝøoÁ?´‡†5߇Ÿ³¯ìÅàßÙ£àåÖ«ñ÷]ý‘®á×|à¿ x£Å:Þ‹ÿþ‰û%héâ ¾"øÏ㌼gâŸëz…޼ðûÃ>øWáßÐÚ‰rÝr»«oÖ÷{èºXúÿZ/Öá_ÿÁ:äÒ¼ÿeöˆÿÖø·_oWÄ?ðNŸù4¯ÿÙ@ý¢?õ¤>-Õ/áOþ¾RÿÒkUèÿ8Ÿ8ÁkäÈu?û)ÿÿôv©EðZßù2OþÊÃÿýªQ^–ø+üRü̧ñ?—äÙ_ÿÈZÓþÅÿêáúåëñ¿ÆƒÖž k¯Šÿ m¯tÝÂÚV£gq㯠Ãua©é~Ñ´íOM½·“UY­oôíBÚæÆþÎtŽâÎòÞ{kˆãš)y/ø]ß?è®ü0ÿÂûŸü¶¯6Q“”­|O£îüSVZô_§ù¯¼ôú+Ì?áw|ÿ¢»ðÃÿ ï òÚø]ß?è®ü0ÿÂûŸü¶©äŸòËÿä;®ëúÿ‡_yéôW˜Âîø1ÿEwá‡þÞÿåµ𻾠Ñ]øaÿ…÷…?ùmG$ÿ–_ø ÿ ºî¿¯øu÷žŸEy‡ü.ïƒôW~á}áOþ[Qÿ »àÇý߆ø_xSÿ–ÔrOùeÿ€¿ò ®ëúÿ‡_yéôW˜Âîø1ÿEwá‡þÞÿåµ𻾠Ñ]øaÿ…÷…?ùmG$ÿ–_ø ÿ ºî¿¯øu÷žŸEy‡ü.ïƒôW~á}áOþ[Qÿ »àÇý߆ø_xSÿ–ÔrOùeÿ€¿ò ®ëúÿ‡_yéôW˜Âîø1ÿEwá‡þÞÿåµ𻾠Ñ]øaÿ…÷…?ùmG$ÿ–_ø ÿ ºî¿¯øu÷žŸEy‡ü.ïƒôW~á}áOþ[Qÿ »àÇý߆ø_xSÿ–ÔrOùeÿ€¿ò ®ëúÿ‡_yéôW˜Âîø1ÿEwá‡þÞÿåµ𻾠Ñ]øaÿ…÷…?ùmG$ÿ–_ø ÿ ºî¿¯øu÷žŸEy‡ü.ïƒôW~á}áOþ[Qÿ »àÇý߆ø_xSÿ–ÔrOùeÿ€¿ò ®ëúÿ‡_yéôW˜Âîø1ÿEwá‡þÞÿåµ𻾠Ñ]øaÿ…÷…?ùmG$ÿ–_ø ÿ ºî¿¯øu÷žŸEy‡ü.ïƒôW~á}áOþ[Qÿ »àÇý߆ø_xSÿ–ÔrOùeÿ€¿ò ®ëúÿ‡_yéôW˜Âîø1ÿEwá‡þÞÿåµ𻾠Ñ]øaÿ…÷…?ùmG$ÿ–_ø ÿ ºî¿¯øu÷žŸEy‡ü.ïƒôW~á}áOþ[Qÿ »àÇý߆ø_xSÿ–ÔrOùeÿ€¿ò ®ëúÿ‡_yéôW˜Âîø1ÿEwá‡þÞÿåµ𻾠Ñ]øaÿ…÷…?ùmG$ÿ–_ø ÿ ºî¿¯øu÷žŸEy‡ü.ïƒôW~á}áOþ[Qÿ »àÇý߆ø_xSÿ–ÔrOùeÿ€¿ò ®ëúÿ‡_yéôW˜Âîø1ÿEwá‡þÞÿåµ𻾠Ñ]øaÿ…÷…?ùmG$ÿ–_ø ÿ ºî¿¯øu÷žŸEy‡ü.ïƒôW~á}áOþ[Qÿ »àÇý߆ø_xSÿ–ÔrOùeÿ€¿ò ®ëúÿ‡_yéôW˜Âîø1ÿEwá‡þÞÿåµ𻾠Ñ]øaÿ…÷…?ùmG$ÿ–_ø ÿ ºî¿¯øu÷žŸEy‡ü.ïƒôW~á}áOþ[Qÿ »àÇý߆ø_xSÿ–ÔrOùeÿ€¿ò ®ëúÿ‡_yéõù-ñ£öýµ"¶Öô/€>Ôm4ëý /K-í¶› žóUÔµ_ѯø]ß?è®ü0ÿÂûŸü¶£þwÁú+¿ ?ð¾ð§ÿ-ª¡í`ÛŒd›Vw‡2jéÚÒ‹[¤öè'gù­ËÕ}èü™ÿ‡{ÁO?é0³ÿâ$x‡ÿ£øw·üóþ“ ?þ"Gˆú0+õ›þwÁú+¿ ?ð¾ð§ÿ-¨ÿ…ÝðcþŠïÃü/¼)ÿËjÓÚ×íÿ”aÿÈ Ñþ›òóôü<ÉŸøw·üóþ“ ?þ"Gˆú0(ÿ‡{ÁO?é0³ÿâ$x‡ÿ£¿Y¿áw|ÿ¢»ðÃÿ ï òÚø]ß?è®ü0ÿÂûŸü¶£Ú×íÿ”aÿÈ£ý7åçéøy“?ðïoø)çý&üDÿô`Qÿöÿ‚žÒagÿÄHñÿF~³Âîø1ÿEwá‡þÞÿåµ𻾠Ñ]øaÿ…÷…?ùmGµ¯Ûÿ(Ãÿ GúoËÏÓðò?&áÞßðSÏúL,ÿø‰!ÿèÀ£þíÿ<ÿ¤ÂÏÿˆ‘âþŒ ýfÿ…ÝðcþŠïÃü/¼)ÿËj?áw|ÿ¢»ðÃÿ ï òÚk_·þQ‡ÿ ôß—Ÿ§áä~r~ÉðNŸŽ¿¿kMOö³øûûciÿ´ÏŠîþø¿àM¥Œ¯>jQØx«Ç |jšÞ©âk¿Ž_XþÇ_…ñhö:kh¶S5¾²Ò>°°iv¶þ³Éy¯iñ½ÿ…o4?Äö(מ¿ñ‘y¯è6:õ²™´{ÍoAÓµÏ jÞ‘m¨%¼Ú–‘aâ_^jVi5®¹¤Ï2_ÛùŸü.ïƒôW~á}áOþ[Qÿ »àÇý߆ø_xSÿ–Õue%))9+YòZÖÛD’ÓÐjËk}þŸðœ?áLþÜßô{ßÿñt_þ}T™ý¹¿è÷¾ÿâ è¿üú«èÿø]ß?è®ü0ÿÂûŸü¶£þwÁú+¿ ?ð¾ð§ÿ-©óUÿŸqÿÁÿùXYwøÿ?5÷Ÿ8™ý¹¿è÷¾ÿâ è¿üú¨ÿ…3ûsÑï|?ÿÄAÑùõWÑÿ𻾠Ñ]øaÿ…÷…?ùmGü.ïƒôW~á}áOþ[QÍWþ}ÇÿSÿåaeÝÿàOüü×Þ|áÿ göæÿ£Þøÿˆƒ¢ÿóê£þÏíÍÿG½ðÿÿEÿçÕ_GÿÂîø1ÿEwá‡þÞÿåµ𻾠Ñ]øaÿ…÷…?ùmG5_ù÷üOÿ•…—wÿ?óó_yó‡ü)ŸÛ›þ{áÿþ"‹ÿϪøS?·7ý÷ÃÿüDÿŸU}ÿ »àÇý߆ø_xSÿ–ÔÂîø1ÿEwá‡þÞÿåµÕçÜðE?þV]ßþÿÏÍ}çÎð¦noú=ï‡ÿøˆ:/ÿ>ªöÙ§àÅßìýðkà ¯üUoã[íXñö·yâ[OIáKMBïÇŸ"ø úkxŸDÖ¯a²Šòú /%µÓo®gŽÖ9îm¡{‡ŒD’ÜA8ycV+ÒÂ&¨¤ÓOšZ5n¦RøŸËòGòKEWI!EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPÿÙPythonCard-0.8.2/tools/standaloneBuilder/doc/pic22.jpg0000755000076500007650000021657610231140007022507 0ustar alexalex00000000000000ÿØÿàJFIFÿÛCÿÛCÿÀæž"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ûƒþ ÿ„ý¥¿àŸ´ÇÃï‚?þþÎ^ ð†¿û7ü.ø¡¨|Mø]¨ø—Äqx‹Ä—¾4ÑõH¢Ô´_xb¬$–WñÇ}m=輸Ôä›RkI M;ó³Ãßðp×ü×Å^ñÇÄ/þ̳&½à†?ðŒ‰^7Ñ?fŸˆº¯„~Âiª>‡àÓãÙxöm‹âÝjÃ'_½Ó›\Õ-eÓôåžú;›[_Ù/Ú]ÿ„[þ yûcø£þ?|7ÿ„oþ ¶ø¡®ÿÂÆøkköþÉøk¨ÿÂgà+/øJüöÏxcì¿Û¾µÿ„ûÁh×4ë(¿á+ðöïí­?âO…Ÿ?gø(ìÏû{Ùkz‡|ðžÓÁßð@¯Ùgöˆý¥þ*\øáÿÆ?Ÿµn¡àÏ‹_µwÅÝFïUø‘áŸøÖãÃZ¤ºrk>7øñwû+Âÿ¼5ªø£ÅsZE/…<7ýÃ9w ®ɪâø™N•Y¦q:¸™T“Ï3œÊXhÒ…9Ö\ý…:Xª•§VŒ°Ñ çRžæuóO¯âcG;­†ç–bðøEvÿbÁÕÄ$ª9¹(9Q´”é(F2vŸ=”¾_ø9oöï#Ÿ„_±NqðKÄøi8ÿ’›“Ó¯œrWZø93öê‘'Â?ØÚ>¼‚~%b™‘ÕwÅÉ€“!4Rd‚·+eíß´'üƒöT׿j?‚ÿ³‡ÃÙOã?웬ßÿÁ@1ův–cR¦"–U‹T)RZŽ¢§ ª‹©yœÜXÕH¬â)Q«N”êºÎ0æL-'iK (Ó–&´”£—4£&–¿ ¯ü…ûrŸù¤ß±ÇþOätõø8äŽÄÈpKÖÿðqÇíÅ3(o„ÿ±Ø”6> xŒ æ‚>oˆ…Y†Ån–Ú«3ÛýKáø'‡ìYðúçö¬Ôüeû>ÛÇŸoŸ|ñÁ?Ø?ß´gÇ»~϶ßì|i?ˆt_†ú_í™à/‹ÿ ü`øÅûDø'áwÆÿkŸ <à=rÓA×nWó3öý—þüTý¯l¿‡"ømñ#Å|øû`x÷ö\ý™þ3Ï«ø;ãÅ_Œ? 彃áWÁ/Šþø]{àïˆ#ø›§øtë~"ñÏÃoƒž%ð¯‰æñ?õO°Ý èšæ—'^(ð£‚Íqtx6>Ç*Âa±ug<,iº´ñThÖ‚¡f WŒ+Óu*b=†1r¨«J”e(áq;w.Lcln’Dý‘?a¿†?ü1kâ/ˆ°"Ü|tÕÿà£ß³oìçñÇöX~×z8ý’d?|'Ó¼Iªüv_Z|b´øëàeñÆ©sªë+ñCã÷Œ¼sðÅ?±D^Ðô=.ÏQ± ¾ÿÁ;ÿ`]{ưOÀáv‘ñ3Âÿ¶Äø*÷ÃÍKöŸ·ø³ñ7Rø’<û)xßâž“û>|Høa{ை:Wì÷q­ÝxkHðÖ¡yªê?|WàÅai¨Ãá õëÝðbpž`牥W‚Ia£VueBެ<>M˜ç•ª©Ç6QtáË1R¦îþ·5‚Ž.ŒhkB¯Ö9Ç9ITåPSXKš¦3 ‚§žO™×ÄSO_Ü«ªÞÎiAøµ÷üÓþ ]¤ü6Ð>2ë_²×ÀÍá‹5yü?áoŠÚŸìÉñ ÇΈ5ûiu˜n4_øâïÅ6þÖµX&ð߉!ŸMÓµIï ›ÃÚÔS[Ç6•ªEaÁø8;öÑ=~þÉëðgZÏOCãåÏ|óÆ9ÇÌîøkÃ^9Ð<¤jºV«¤jÿƒXÄ{Ox3â/ůëÞ ½·²Ñ­t?øâ×Á¾;ðÿ†<_ðãAŸOÕµ/øAu¿ ¶ƒâ«ßê±üD²ñ¦Ÿ¤x&ÃÁ¼ÅÙöðwí©ÿøá?Ù >‘ûþÃ?i.?üyøÓ®øWÆ;±øOû,xÇáΑá¿øÆþðƒ®µ_ˆ-¬XÞüRñ~³ã KâWˆ.__дÀðg áÌêT£‹à:n´hcqÍ`£Bté`ðØÌ&Òx¬Ï9Õ©Wƒ„(.yV”êÑÂÓ§)-ªUâ¨Î–{/fêPÃþùÍNUªQ©Y¸ªXjŠ1Q¡ZMI®U¨Î«”Ošàÿ‚ÿþÙ’æ|-ý“£ã%GÁ½e™3# ÿÀÉ@¦9 #mÂÚ_ð__Ûõøcû(œÂ›ÕøÎ?êyèrvçtç6ÏUñìUû&ëš'Œt}àn“à;ÿÿÁ4ø)î‰â øïãçˆ>üh±µð͵ïÃÃãoˆ¾.ðÕ÷Á v}TÔ5]+â7‡¼oñF+Ïø–= â¶•§Xx2ÃÁ?ÏRlcc8û¿ìt8ù~î6Ÿ»ŒEõ/øožýfX^ÃÐú·²ö”ñT”ejðr„¢ðøÌM6“Jr½Hµ:rjðp©/'›qtÕLÞ¥EWŸ–T¦ÜoM¨É5R…)'g+&œZûJJ¹¶ßð^¿Ûf¾~ÊGæ¶üÕÆÀD¼sãF Ù@ãËmQ,–úÉÿÝý¯™Ao†Ÿ²º’?ñgµ<.Häîñš6y ¨À‚)¿ l—.Ÿ"6ÖN‹/ýyàùsü¹±‚ÙO+γé!DváWøp9+åGÇ+²-¤cl{6Ûû5<3à4ݸc-[mÞ]=£îÿÉôàŸçÊVYž%+.±ìÿéÚì»m¾—_¶‘Áuÿk·Î²Ö$²üÔˆ\Fï¿ð˜üÄí$d Â0b€³Å±üö¶~[á¯ì½Èo„:†GâØÁüÊT/ÎŒËmø…n¸;¶°ÚΣ;?rÇ…ò¹o—rœ¦ß,üÑã|=5²mçËÙŒò㼺|ˆxmœËå„UÄ>_—gœü4à4—ücjÿ·k.±ÿ§Ëòù>&Ï“VÍ1+ç–þç’û—Ïö€Áp?k#×áÇìÀ:qÿ ‚û#%yÿ‘»¡ÉÆq¿6ñ¬ð[/Ú¾@wü8ý™ã$/Â;ÖÙ–a†#Å ’\„PcpYq7Ù”{c§|ØùÿW÷N8m —nØwìÓ •³j” á>qÃ!þ“%¶Ç††äò¿Ðb^ð%£ÿÎ]wkûµ“ÕÇþžÇ»û?>.&Ï”U³LJwèáÝsÉtÒßgcö]à´ÿµI8??f~½¾Üð7“ÿP=:Œ AÆ$òmÁÿŸý©¥ûß¿funoøT—cfU!¼JcÎaÝ·µ¿ãÒ ÀlñÐ|ÝHÚ=9F—þ¥f0U±ÚSçeÁ‚rp›þîæùÆØÀûžVëHÿˆmÀ¶ñŒåßgìÖëËÿO_wÿ¢ÿYóÿgíLUûÞÿÓ~K§OûtýŠOø,‡í@Ê øû7) Âiþ\‡ãæñ"œ‚rðÛ‚ Æ;qÁbi×Îï‡ÿ³9eøK1±É𜓂ÀŒa; óÈèF>\a¨Á\ãTx#‘ãâ=¹‹JÁݵ×i'z®í˜]۱䟛äޜdzaù¢Ù¾×øoÀÎÿñeÛµðÖòëí_ç÷ô˜q>~ã&óLUÕí¬4³Òß»]—ݳÙ~»Eÿyý¦$o~Ω€sÿ¦Lƒ±X`6º¤‚KrvUs"Cià®´¡$þÎýOO…åäŽâœàz sŸËü¢µL.|­¸dŒÌQüª<ˆþFÛ‘÷vDÛß*ßI?w¡=;|Çï|xô#øv~â‡<¯ücywO³Wº_óõôõïýå4¸£ˆ’y®)¯X?ýÆû~W_«ÐÁY¿ià?ÙñrFBü+ÉŒÀ/g<U†Ñ¶D ‘‹•³ÑðU¿Ú,ÿÌû?\ü+L½ë­(8Ç<އ$|Þ_åm¢` òŠí*p9)óÆ3'îFIÙ‡ùWl¨WÈÛ¦î Çðã¼÷»ìLž0~aŒg+·1D¼9à„â— åú½}Ú¾_ôô•ÅAÏoí\U®öp¶ZÞä­·GÓwk¯Ô(àª_´D¿{Á?³úŒÇþb,ù,ªUˆÀ“×÷a‹UžKmhÿ਴(-ீ •ð¶) œÚ nßĈx;‚üÛ?/-*pƒc!ÜÉÌX,Û‰û8ÞÃ±æ ± æ?'ͱè \Fƒn0Š0p§ŒyIŽœ.=¸?*mýÖsðï‚T£nËõßÝ«ÿË<¼ºíª‰SŠ8…NË5Å$’Òðòÿ§}’ÞÝ4ûGéd_ðSÏîNï| ÀÎY>Àv ®yÚd’BäP|ލó x¿à¥Ÿ¤å¼ð1|ü0¶ Õ#ïcÈ9lœ‚»@uW2$?™Öãæk¤è3åü¬s·Ê?7˹Õíd?4{7Úô–©´gÊ Œ¸Ú딋…ÿG‡(Ûy"mg“k”¼<à¤ôáÜ¿§Ù«m¢ÿçë[ï«ùuU8£ˆ-³\R¿÷£Þ+ùåÛmÑqÿ&øîOü‰ÿ‡®~YärÜêcžGBIQ¿ÊÓ‡þ 3ñÊLnðoÁEÉÁ_øV6yOÞËfç‘‚Fp£rÀ´üæAÈùqŒuà®»í^F0yÁ9]™ƒvÑ0yN6¿B9OßF>oôq‘òc;W Šw#þ%Ñ?x)A5øîúUòó÷üþí¯ýhâKÿjâ¯d÷†ö_Ü_øo²~†¯ü;ãiøKà¨àçþ-–ŸÃÇß==¸ œ ”»üãT§ á_‚ÀdaðÎÀ2 ¾g!±´1®X±U[‡´ø wè¼?s¯09\nM[1ó¡Ä#¡ÜWˆ¾w;Ÿ÷?1ùrFåÚ£9Èó4øÿˆ}Áœ—ÿW°·òÕée·´_úK×}t8£ˆuÍqZ'Ö?Ýÿ§oô飲Gß©û{|deR|-ðqIPHÿ…i¦ðJƒžTn #æUî01Ç*¿+q÷O§Êp¸Á<}åÎ<ÁÍÛý_À[^•|¿éëüã×mZQâž!ç·ö®*ÊÚ^[û²ÞÛ|ϵ ý³>*JpÞøV¹l>èÙŒyÏ_0äà §åQ½– .~Å ?l‰çñO|,¿ñntNËÓ1 ŽO'Æp_Ž,ÓG”ãl™ÛŽcÿHÆdýÀÜ~M¬v®$@ÛÇÙó¥î(àqÐÈÁ'ä^3ÛcLŸpz“¶AÒÿf¯F’ûoóW×{±KŠx…I%šâ­v·‡G}‹ôóÓ¶ëëx?k‰’’Ãÿ P71øw¡€€¬Ù$r©Eb7§È’3ŒK5¾Â~Õ?YTᢒ#þÞƒÆ@þõ¢§Áw*ëÈ–K†ÝµÆCºA‘Çpý×%vä10Šòf?+í,# ÚW ¼mÆ8AÀòcÛœ`±ì#Ù¶ ©À| ¬–AZ®•zòßíþôݪ|SÄ*KþqV÷zÃû«¬æ½/·ÓÑþÔœè? xW?/ÃÍà¬lÃ¥›dg£h;Œcsǵí%ãé>ö…ðí{ø·þÈàpÚr’[¨R»@uWó’ßåHW“òž#“ Ü"cÓÊ~2ÕÚÑmó"ê-SýVÜÉ®D}Ÿ#lÎ0¾^ÄM±ù~Užu8„S² Ó_v§x­x¼÷K¯]—úÓÄ6‹þÕÅmÞ>_ôív]öè}?hÏùƒ|;¿ñoü7Áê:Ø®xêN0A»f¤üm/ÞÑ<œà¯ü Ýó2ÙÒ†qŒ]ÈİQqö?œp8è=1Žå^2x#qíšchòv¾pÃç÷Äeÿp»±³k  ½|Úl>á¿äC‚Ú=*õµ÷©Ó×[ýiâ/øUÅkÙÁ}˜½-ý›ü,¾„_Ž~0=tŸû|/è1ÿ0¾ùïŒrͲݿƿKÚW7?ü ~Ú€¤‡'þ% »CZ?‘¶ÔËoáÈ=ˆëÛ=—ýއ£t]¸JÈa³µÆS½†R,,‡v<£œmɣ«?Éåùö™Ç¸K•¿ì,KiWû½yÿöçÔñ+Ú¸«¥Þû?ÜÿÛ~NÖ^ì¿S×Ú*¶;ÊŒÃ*Ÿ1bôô½ñrÛØMwâƒZ|×ú^“«­•Ï€$–æÞÛZÓ-5k$¸{‡W¶~Øï`iVÞîâ8ä-•Š“_/F¸ˆ ¸Äc€1ŽUò£Àã•òãÚ@fÈ>yÿ‚¬øGÁ¾9ý–bðÖ»ðãgíñPÿ…¿³—‡gTÕ|;ñÀß´ªø?D?~/x?㕞•¨hŸ²Ïü+]lÍâ~Ѿ:¸±ð¼-¹¥xžÏÆÖž'_†>9üãÄ,·&á¬[ˆË2L­UÅãªaê¼F¥hû8PU,]x(µ%«½¬ÝûŸWÁ¸ìÓ<Æc(có\ÁÓÃáaVš£Z4Ÿ;­Èùš¤Ü—*JÖÒÚY«/Ñ=oÅ:—‡4]_Ä:Ï~ Ùèú—¨k:µçü+m^ãìšn—i5õõÏÙí>Ïu?‘k²ù6ÐMq.ÍÅ$Œ¨›oø-'ÆÛ¯Ž²§ì‘ãËΓáoˆ"“ÇÚf‰‰¢xjf´×¾i΃/ˆ´ß™4ësJÓ¼EyhŽ×šœzcßj°i—õÔ·]gìwðŸãÇÃ=GöÔø(„»Ã_g/øá_ÃþÎßðxÙ/ï>/~ÎZ¿„ü!ã>™¿hu¼ø›á-_J›áŸÊ¿ðQ?ùG‡ü«þÄÏêð%~uGG1ʳZ•2ì³[<½Ð¯‚ÃJŒ¿}Rp¨œjŠQ”RÝ'}lž‹î%B®3ËiïOr«K]Uƒö4iÊ›KÙÂÒRwºôÚÇÖ¿ðY_ø$¿íûx~Ôß¾0ü!ñ§ÁO øoó_Â?†×¶ŸüIã#^msG—Å~&º½²´ðÏÃ_ØK¦5Œ´¨í®%Õ­/òÚþ6²#´½—òžø7/öÛøŸû*ñƒ‘㋔⠨?ð¢“åýÙ ¡Dq„TÊŠ×ûrñü…­?ìWð?þ¡~®^¾‡(ñ§Ž2 ¯’åõòØàrÚO…\¾Z‘¦§9.zŽiÎW“Õ¯"1|#“ãñqXˆbjòç¨á^PÚKH¥d´Ùßv ÿéþÛ üPý–:c|YÀãñcºgœÆÝ[oø7‡öÓ„ø¹¿²âœlñ¯Åg#çVÉ-ð=2\ HFÕùH_³ /쪊ô_ÒÄF¬ñ9M¿ìWKÿ“ÿ†é¦†ò¹}ž&˶&K^ú-×Cøå_ø7¯öÏÏÄÏÙO|UÈá8ø&8ù}º.Dwmÿàß_Û2'Bßf ÈA2ø¥¹—$©ÿ…$ 7Ì,ÀUÖ þÃh©ÿˆýâœ~³•Y«È®—¦êwÛMì%ÀÙ VTñ?øQ+ÿé?Sùþûc(Qÿ #öfPü«ãŠ$.6ð§þºä(\áFeVâÿ‚þØhA??f G§Œ¾'™R ¾ œ•m¬„Êì”fG‹ú좥xùâM,NT“ÿ©]/»ã×ç{õ¸.ÈWü»Å|ñ2vô¼_oó?’˜àƒ?µä@ÅÃý›à|Mm¤ˆ£ISÀÚda ‰-í/üƒö»_ù¨Ÿ³×þÿ‰™Æ>¯§¨è1”'õ™E%ãψ)§õœªëþ¥”Ÿç?ÊÝ÷õ!M?gŠÒßó.Ÿöïä)6ßðBïÚÒ?âàþΊo‹¾$»[;›àê\ ®ACòü¤n¶zþsûXŒÅÁýûÌÙñ ãîçþiN>\cÇËåÿTÔT¿ü@rrúÎWwÿRÊ_‡¿{éÜ?Ôl†÷öx«ÿØL¿ù~gòËoÿAý«¢d/ãïÙÝ‚²‘·År€o$®~å›,$®p6¸†H5ãÿ‚(~ÕˆgÐT(Âø«â!žŸ ÁáR1ÂíbêŠRñÛå¾#+éÿ2Ê]-Þo²¸>È»§‰¿–&KÿmÓ~–î0°ÿÁ¿jT Ÿüp{ârÍ­ÿ"ÚK·iù-6òà\ïOÿ…2ÿäOæà¿´àÇüW_ûÌÏãòsògŸøUƒ— `Ñ¿üçö–‰@>5ø0 ¾'ñë”ç/ð³–!AÈXÎP`¨0ý—úE¢“ñÏšKëf›[-¤»tS·M÷À¹VtñV]>³/þG§NÝç5àß´˜ÇüV߆p 8ÈÁ:|¡Í–âÿ‚R~ÐÈA>2ø0 †_øÔ•û¹`á·, ¸hðPd&7ƒú¢¥xßÇ‹lFYÿ†Ú^]yïÓ¸—ðúM*x«;ßý¦]z|;Ã=Àø?à–_´@â߃@íÆGˆ¼fJæ8Ôªãá¼)eãî…T@Š«±!¸¿ðK¿Ã¯‹¾pxÄ3õÏ?ño0Oà9Ây¼”TÿÄmã¿úËðÝK^¿ÏÝ_Ô#À|?uOû “ùëøGádðLomÏŠ¾€¤Ä18ÃDrIøx¡‹*’ß*üè…HQn,´×þ §ñÔÿWÂ_¯ö÷Œ LxI=;Žœ`íÙûE'ãg6ŸÖ2Ý6ÿ„ê^_ÞòúƒÃ׿³ÅÞíÝâ¤÷õü3ñ.ø&çÇ(™IñGÂSµ”«mø°²m9ÝÏ€vñ—_•B©FX$¶Ö‹þ Õñ­ø›áX*ª¸]oÅ{Fð"l">U_—gìõŸ\rìÝ|·Oú—Rÿäÿ¯’±.áé;ºx«í¦&]?íßéë¹øÛüÇãB0'Äß Á†MoÅ9NÄ…>°8aƒ ƒiRch5`ý€>1EŒø‡áO¼5¯–_’ Uvø/””=À aSdp~¾ÑRühㇾ#.÷O§Ñ%üý—âÁðJ×§‹Óoö©.ßÝò_ÕÏÈåýþ0?â£økÆ1ÿŸärNxð`ÉÁÇQÓ‚§a‹FØOâÔAAñÜ+d¬øŒã÷‘7Sॠò¡þ;’2Äcý`¢“ñŸÚ³ÄeÖÞßÙôü¿¿ÖÚþvõ ‡íog‹·ý„Éik[á?,—ö ø¬?æ?ðó¦5oàpGñHŒã#ƒÇ;J݃ö)ø©+6»ððíee#TñۆݻÂyç¡d( Q–ÝíP(¥ÿ—­Ëíòëvþϧå§Ååúm .áø«*x«ZÚâ_—÷zÛ¦žG椱¿ÄäDS­øE_—T×ð0ª06øR1ŒŽÈƒaTaVÜ_±÷ĸÝXëžg 5=xº}ü:çÂË–]À™+”xŸË’/Ò *â1ñ¯üÿ˶³ÿ„úzÿäß•¿ \Ãѽ©âµÞø™uÿ·«ù+~zÃû&üDû[Á<`çûKYfû€#©ò“ÀBªD¨¨ž\vÖ×öTø„ü†<0Ôu½£‚0ðß8ãàAÑR¼aãDïíòÿü §ø{úmÓn–ÒÉp'g‹¾Ÿó.Ÿöïõ÷ ÛþÌ<‡níSÂWÜ¡u\ã÷ªù$øiCƒŸ•NøÑƒ ¶ÆËIfߌÄÓÂ|ùþÕ¸ûœ h”žÝ öÕ?ñøÏWíòû»ëõ }mýï/éànî–*ÿö>éö·Oòè|coû:øÚ u œ2•?mÕX¦Ýü€t,Fåãzd‚’y2Á¯À_¢ þÑðÐÚ ·š‰€ ãc|ª€6ª ‹ÖôR~/q”­zù~–ÿ˜ }-ýï-¶òÑY¾áæïìñWÓlT–ÖÓáÛD|¡À¯¯[ÿ}Ö\ ÍD¹ ñ»D#à‚ÈQ¶²lÁðkÄÑc7zÇu»¾%r"ø“ *JžP¢8ÂA[}-E'âçÊ×­—é·û 4ÙíÏnŸÖ–?Ô²^Ë¢·ûÌ¿ùøG΃á‰?Ót>üüßq÷xÒ׃Œžœ€Ýš6ÿ uèvƒs£á[+‹«¶ yŠÙ'û%7¼îe"ÜÙûÕŸ‹|bì½¶_¥¶ÀÓ[m´üºX?ÔÛÙâÿðª]’×Ýì—èxÊü:Ö‡ü½i„÷G²ñÿ þœcŒ`€>]–­ü¬BA3iD‚¥Hšá‚`7![O°H8 œ“Ê–\¢¥x³Åé5í°ÿÔ ;ôëÍ~‚ÿPxzÖöx»ZßïRòþï—ùžtžÔV0†[BÂË6ÂŽÖH¸ãøQÂíU/µ†¯´ó—éÇþ+ñω¾ýþŽ|}”ð‰ÙÆOÄ,qgfEŠáºY_ pFS˜g9fA,Û.Àfõ©ÔÍ¥–f9îi–VÁS£‰Ë2\· œJ§ ç¹µ*ßqÃyN9v/<Í0u±˜IV†WƒÃR¥í*VÄW•8V­¹Ò²¤ªÒ¡J¬*sƽy: ë4iÛ÷OöbøÓ®|fð7‰#ñæ…§øKãÂ?‰0ø)ñ·ÂZ@ÖEÑ~"ø&{K„Ô¼=q­Z[ÜÜøSâõ¯üXðiK`YøGÇÚ™y­êzµ†£9ú:¾øñ_³/í·ðÓãíŒ+ið¯ö¾‹Áÿ³ÇG·¶A¦|cÓåÕ$ý’þ%^5–“«ê„ë·W¾0ýµTŠ}F’ÿÅ µ?êW‡ôøÏÞýqô}ñ‹*ú@ø)á׌YU,6|_’FK•aî8{2Yÿeñ·Ó‡5Iá°xlò…lχ¨b*ÔÆÖàÜß…óLSRÌâßËf™u\Ÿ2Æeuœ¤ð³‹¡R#^*® ÝýéNŒ•*òJ1XÊ8ªqKÙ4Š(¢¿`8OÊ/ÚöÙý¬>_þܺFû=þÏ6ºgì™û!øÃö­Ò>!ÞþÑ¿|_âk>ýª›àLZ—Á¸?f‡ö÷Þ±âïÙŽî/‹^µøí£XxCÞ&¶ŸÁß|w©ÚËn>†ÛÛö–çÂ;¼Yÿ ¦£ãmWÃÞ8´ý£|ñ¿ö_ñ—‚|-§|øõñÖ/ˆào_ü1­¯‚o´OÙóâØþ xóþ§ÁÍCJðÅïìOŠúÇĆ3|1ññãö<ÿ…Ùÿ §ÿþŸøkÿأ¿±çüŠ?Û?ð¯?áÿ†³ÿ‹‰ÿ#>“ÿ oÛᨿäQÿŠgìßðƒÈÏqÿ 7üSüOíûÿÂðý ǯøN¼žO‚|á/øV_þÂÕøsâøB¾ÁH¾}“Çú'ü,_ÂaàŸÿÃÁ¿µ|Uà­ú?ö®…ðªÿÂ?ÛÐÿÂÉþßð.¿»k]º_WËîŸÚæÙ¤­µ˜µõׯªôÙ\úÃö¤øEuð[âgíª7Åü+ø?¢xÏÄ¿µo‹_³ÿÇïƒ>#Ѽ9ðÿÂiãox‚ËáÏÅŸ†^ ø“â]NðãIsmªø[Â:Õ†³g©hZú–½¥êZe¯ñÃöÖøðWÂõSÆš$~#øK­øÿÀ:Ž“â];âf•áÈþ*øöGÕ¿mÛ¿ xƒÄÞøcñXÓtEýt©> ê¾0ð·‚üy €ŸÃºâ‰1Úøûà·ìe¡x'örø³û9|]ñ?ü-üpÿ„óIñ¯‚|>>#|>ø9àŸ‡>;ð.•ðÂïàŸìëà-{âçÅ?|ø'§x'FFÑ>øgâö¥¡x'Å>"ñ…ç¨þx&óÂ_|ò÷¿à’Þ ñ×Ù<5«|NÏÄ~Ëß´'ŸŠ??á ÕGü,?ÚWãÎ…ñâÂ_Ú¿þËo‰z'„ÿáÖÿm/ÛçÄð¢¼;<Ö᪲—QÑí>| ¤©]ÞRµôÓumÒýzuVÙ†ºiÚþ[_õûký?kOˆß´ÆÚ?á׌ô_éš'ÁÿíßøF®¼1¦ë¶Z­÷ögíñÿ$ý–`þÝŸUñ&µis¿á÷ìwðÏX›û>ÇLÝã-sÇZ‚yz&§áÿxcŠý‘?ࣞøÃðçàˆ¾1ø«þO‰ŸµïÚ|cðàõ§ìÙûFü7×WÂÍ¡| ÕõŸè:Ÿ¬5ÏøiOøT¿ð¼t OÅ¿µÃ-#Àÿ1xrûÄ~ðvâÙ†ï_ð›oû[hž%ñwŒþø[Â:¯ì¿'ÅÛxâ¿Á½ÂóêúŸÆ?…ö¾-Äñoü#öað?Û¿Šþ%Ôþ6Zx'Dÿ„×þ«»?Ù+ö¶Öõ߃ßð¯´-ž'ÿ…ÿà­ à~¥ãoÙãÊðOŠ<9ñFÿ…åáï‡ßð•ü9ÖôψžþÛðMÜ:ó|Qàÿø"÷ÂO |0ñ'ÂUµý—­ü3aàŸ†Þøy¨ø_ö!øaáÏxûJøAñoáÆ_ÍûuxÚïž ñ7íký»âo€ÿl¾0è^Ô¿e¯ü[Ò¼Gñ†ç[ð҉¼Kð¯Ä=GHÿ‚z|Uð'‡>èŸ>)~È tÏ |QñWƯü#ð×ì„¿e¿|U tƒÞ8ðÿÁ„_´ÇÂ[ëíþ]ø»J—ãOÆoÚSã‹`ø§a†5?ƒ³V™ðHå£üòß­Ö–ÿ Õ½6ÿ0×M¶×®ºy­7ëÿíþÕ?|OñVƒz7Šu¹ü\ºß‰|)¦j÷~&i_ ¼[ãCªÏão‡>;jÞ±ø!ñ/â‚Ã~4_|/ø}ñÄß<%7Ê–þ"ðÞ›qð«â4^ùãüjÛá¶«ûHxKJøsãaâoÙ¯ö¡ý>kz¬?~<|Pðo~|ñ—ì=5Ÿ xƒáïÃè<3uñ³IðÏícâ À¿|5ãü[Ö5_h^>ƒÀ>$ðμÞM¯„ðNOü ý¦õoš5—ìòöó|Qøáñ£Lñ-§ì›ðþÛö¸Ôüqû@êþ?×üm¡|Cý®õoø‡S×þiŸÅYø/Ãß¾|$ø¦xCBøWà/|Wñg„|9ñJø¿Ûxÿö5ñ‹&xkAÓ~xÏá_ì“áoÏàíSá–½âÍ âмAñ2?‰:·‡-ôï„ЋÙ)-[“Öë^eu¢þ[÷ßp×É~=>]¼í§ýºg|9¥kðk_umOUÖüAáóð·ÃŸ³í'âÚB¿ð­‡†µ_Oãoًß 5OÚ+áþ‰¢èþ:øm­j>%ñ×ÂÿørÛDøµðkY}TiŸ¾]x³Ô|kûE|ð'ß |WÔ:ñwŠþ(øÃÆšƒ¿jßÙNÃöœø-á_|@øûüñM¤_äø·ð¿S½ø£m©þžñƒ¾*ZxÓE°ðï„þ üIð£ðóÄ—¦—ã='ê~Ë—÷? ÿf |$ñî‰àoþȚ߆üAð[Äþ0øYáÏü?šÿEøñ öo¿ƒÇßþj_³¾ƒ>‰}ð¯â·¤Ñü5ð\ø/áÏ øá<%ªhºRx÷ µÔÕ?vÒzüIôÓE~^öM¤ú´ƒ_ëå~þÖ§m§þÕ?ukž))Öô½3Ã~|ñ5¯‰~üLð—ˆü7ñWö‹°ø¨ü!ð?ˆ<âŸhþ.Ñu¿[þÒ£ÕbÔô;X|âÙô¿MáO¾2´ð÷—xþ )û|Oÿ…-ÿÆøJ¿á£µáCÿe|>ø¥/ü-¿øFÿáSÂmÿ™àˆÿá!ÿ…kÿ ŸÂ¿ð¶~Áæÿ¤ÿ„oãWü,¿øE᜿hOøV]âÿØ›ãO‰üG{uí ð»NðÄÿÚöFý«h½_ÙËÅ—þ#ñoÆŸÙnÿöd’â/‚¾)OÚ^ÇLø9ð»ÇÚgìŸðÚÒxëÁß¼Yá+ý_Ç‹üIñM¾« é~õ€ÿ±çü)?øbÏø¸Ÿð“à ~Å*ý?äQþÆÿ…‡ÿ 7ü2gü\OùõoøD¾Åÿ »ÿ"üTßiÿ„çþF{øFâ -NÛ¶û.žëzÞϧ§Þ‡~‹úºóí»ï.ÿà¡ß²m–…¯x–xÛûIÿ„Jmö€Ÿ´%ßü. +Ç_¼ð—Â^'ýšm­>MwûVx'[øƒñ3ᇇí¼uû4Áñ_Á±ÿÂÑøaªÜë°hŸ¼©k¸–ÿðP_„Z·ÆŸ ¼7áÿŠ:õ¿Æ­ãJ^_Eð[ãõŸÄ„¿>ø³öbÐôï|jø#uð}~$üÑ<[áÏÚ_Cøƒ7ÄÏÚoÂÿø_ÀñøÅ—Ú…÷„~-x;ćåðH?ü!Ò<9á¿ j߳τ4χZßìͼUð³ö6øðããOüû9þÓ³ÿí ‘~Ô`ñ¦½âïÿ|eoû:øgÚ—Ž<>ü?—Åž1ñïÄÿüñ ´†¿PÚþƾ#ð×íIâŸÚ«ÀŸ´M7ÅÞ4ø£â=[_ðß‹~_ø«Ã‹ð[â?ÁïØoá‡ÅhçFø™à­NÇ⎥©þÂ^ñ7€~/ÞÞê¾ð]‡Œ¼aáÏüø‰pš/ˆôæÕ$Ý¥'¤­{®‹—h÷mßm-mnéòºù«õíó=³Æµìóðï⮡ðSÇ4O üIѾ'ÇèzŦ·kaá_‚‰’_ü_ñ‡Š[K>ð‡ÂïÜ|$ñ~‘âßø›]Ò¼'àßÝxÂþ+Õ´oüZøS¥øÓçÁ@þCâo€Ðxk\ÿ„7Ã>$øÙâ?|}OÚ7áÅ¿ÙËÆ_ ¾i_²ísûCéŸÂ´„^&ðç‚u/~Í“éV |?Ó¬< áO øC௄5=wâO|pER¶­ÞÝ®®ã¯NÙ]ô½Ú`ïÓúÕ~—>òпl?‚~#ðo޼g¥Cñ±ÿá[Â17Œ>_~Ë_µñâÃJñ®«6‰á/éÿ³v±ðvÃö‚ñ‚|G«Xx‚ÃGñ׆¾ë ¿¹ðWÄTƒ]øVÞ>>4ÿÛ'öÖõ_‡Z†7øûUðÛüe¬|:Oø_Úƒ>ë·³Øþ ø[Ç^Öá£áøWýã/†?|1®gk¾&XøSâ‹ø%†•kðçÅ^…b ë~#ñ·€øUÿùðoÃoØãâF•ðóBø—¢húí+û7XüdÕ~ þÑ?f»ø·®øëA‡Äÿ´¾àßüRømðâ| áÍoÀ¿OÆcàÿüóUøWyðtÿ‰Ÿüið‡ÆÞ/ñ¾»âŸÙ×ömñ—ìçñ^Ò¼MûU|[ýªaý<ñôx_ö(]oâ.à?~ÊŸ~ülðn½ám[ÖìuoüAÕ< ã…g--}ùo¦n_ðÿ6žÊᮚzýëϵϼ¾þÕ?~8xŽ÷Âß üS­êzœz%ÏŠü=u¯|9ø™à?|Pð=•þ›§^üGøãx;Ãý¡~Y\kþ’óâ‡ÀÍsâÃûK|7Õ."ñ´¶Ÿ ¾Ýiâ_iÿ>7êß 5?éþ2ÑþOðÇá×ÅÍ+áÍïÂïŒ$ø£®Ù|'±øð—Åþ6øÇ©ü[ƒXøW¦øïâ‡|Aá½3çØ›þ ÉàØ»Äqj>²ýž`Ó<+ðº?‚þÕþ~É¿þüiñwâ¿ð¤é®þÔ ñ|]ñ×â‹Ûø Ã7Z—ˆ|ið áÿ‰|Y«x÷Æ>/øQâ-Nÿá´_ ±u¿ø'F«â|cñòüVðOßøL×tvñ§Ã¸/î¼ã/ |EÑ´M{Â>&ðåþ³âvßðQ߆ÚwÇïø/ÆÚgÅü¶ýž~|`ðç¼Oû(þÖ¿ð]ÿŽ>.þÖ¿~'ë_´~§âO…özgìáð»ÃšgÀø‹Cñ—ǽá‡Óxëâ ¾.×|fuo zŽ—ûÂGðCö·øYñ¿â'ü%Þ&ý¸?á9ÿ…õã…^ÿ…S¡XÂeû?øö^OøT^ ñw‰þ5j þÌøGðËÁ·ÿ —þ'ý¿â1ñ7Šؼ3¬i^ðçã?Ø·â7ÅŸþ×v?¾7ø'Pøƒû\~Å/ìyâü:ø%®øÁ¾ÿ„wUý°fÒ¾"hþñ/ljZÞ¡ö¦ÓtýCÂ7¿bûV«ðîûX¶ñ=…§ Ð¼/gªmï¾·³åÛݶžö¶M®šèµÓñü<ý{ú÷í¿i_Û›á‡ìçáoÓê7µˆ?> üUø¹¡xcÅ_þ-ü1øsñ{Uøcðs^øÛ7Ão†Ÿ´G‰þKðcÆÞ6Ô<áÝcU¿ðßïøûÆ^м5ãÿ_x>{O†ž:‡Cõ~ÔŸ¼'ð6Ú'Å-ñGÃ_ ®µ¿ xjÖ×ijÿÇíâ­Ïˆüiñ3Jø=àïÁðQøemñêmoÅŸ5ÝAðÖ•ÃV¿×aÖt­{K‚ëÚ¦¯7ç—Å¿ø$O‡>4|]ñŒ/ÖÿiCÅ>8Óÿgûux‹ÃŸ´÷ÀÚàV¹ðÏ\ý³µOŠ:®™«ü.øU¦~ÐVß<¨þÏ76øwð“àwÃ;·ñ¿€¤ñ&µ÷—޾üFøÁðOÁ?~-|LðM÷Äülýž¾0øƒÇ_¾ë¾ ðn¹ÿ ùûPü8ý¡t¯èÿ-|Ö_UgÆ/†^,í¾%~Õ?~xáoÄmsÅ:ß‹<#ñ¿[Ò|?ðzÿà¯ÃŸ‰Ÿ´UÿÄÛýwáÿо+iøÃß|ñ/Ä~$Ñ/¾x#Å>6‹Äº^“sáÁáÍmNMU-æµiþx×?b߈Ú'íñ'ö¡ø'ñ¿Á>ø¹ãßxâþÒßâŸÁ-wâ·ÃáÏÄß‚±ÂÏøVãÂþøãð[ÄÚ¿‰¿a_†þ1ð¿ãñö‘¡hš‹-ZøÓUñáÙ¬/oü5>iá­2ß]PÐÆ©é«ÚíyÙ»_–ÛÙ_[Ý»+jkåºû´¿ë÷u?nïÙnûÚ¯‰´Ÿˆ:߈-ì5¿èº6á…?|Sñâ\>/°ñ.³à¿| ø_áßêh_…Þ9ðç¾!ø¿ÀŸ>øSâ¯øá‡ÅoxWÆZ¿„~üAÖ¼6i¿·§ìªxŽÛÂ1|hÑ,¼Fß ¯~5k:^»¢x¿ÃSxáV‡ñkCñ§Ž>+Éâ/évÿ´O…Þ.øñá߯‰~*Màù¾ |UÓ¼=ðŸâÜ> ø“ãÿ‡ÞñGËÞÿ‚iøá¼?³ïˆüñóD·ø©û1þÏ?±—Áo…þ ñ‡Á»ÿ|?½ñì©ð«öÉø¯øßÇÞÑ~/ø;Ä~ Ñ>&|6ý´¼vtx{âƒ/þøãžñ%ïŽ~ è#Yð^§Úø7þ ÅáÍ7µWƒ¼qñK[ñ&™ûcþÏ:çÁo‹“øSÃV ¿Ò¼Gñ/ãOíÇñÛãGþK«ê¾=·ðþ‰®x»öåñ~ð¿Á&µñ½ÿÃxÃvž+ñÏŽNûTÕÙµK[JOk~¿g¦û«í¦ì×M¶××Oø=ϯ~~П >:ÂEn|m§ë~þÈ›Ä~ ø§ð“âßÀˆÚV•â/í4ð׉î>ürð?ïˆ-àŸ]è'Ò¼/ã¨|5/ƒ|K®ø;ÆþеÝC[ðO‹,4¾&ÿÁG~hZ¿ìÿ¨ü7Ó>(øçá·ÿheøWãhß²íaã|Yà}ködý©>0øCÆŸ³ç…>½¿í¢k.ø!á;©>!ü ´øÑðþ…Zåߌn.ì¼9â/ øÞÛÔcÏØûJý–ábjP迲÷‡u¿ˆŸðˆØêWì—û"x7öGørt¯ÿÂO>¨k^±ñŸÅŸˆ>0ñµÕߌõÛmKXñ?Å­CÁº~…aá»/ü:ð>·/Ä_üJâ~þÅ¿¾Yþɾ×¾7ø'Äÿÿbxrÿà…¤|×|-ñïáÏ„ÿe_ÚöSѼ+ñ‡â çÇøgÇ6o üað—Š5?ø+ág ï]ð/ˆ­í>iÚtȾ+SNZ¶’÷wMÞ.ÿgtíkÙ-õµ™®Ÿ+ýêÿ…Ïl×lŸÙÿÞ ð/Ä]SÄ^6ÿ…}ãßøIöøëNø)ñ¿[ðoÃoøAuXt/ˆ_ðÑ'Ñ>ê'ì³ÿ ×[:žñ;þRûáGü+mWž?ÓüsýwðçÇøsEý»¿e½gÄ~/ðìÿu¿Ûø#[øÁá­oÇ¿>üaøCðZëÄoüecñ›ÃþøûñOÀ>ø!ãÝoáÒ|8ø“¬ø“Jð/ÄßÚøOá¯Ä$øGÀ>.Öôoƒhø$ü.¯üCðWü-/‚zïü,Ÿøjëí?ÚöQÿ†ƒÿ…#ÿ 3ûFþÐÿÿá7ý”lÿá{|5ÿ…ñ³Jÿ†„ÿ„KâÅ?µø×þÇü)/Ùÿ^ÿ„_Àÿð®±µ¡¾#Á8¼9ñ_à¶ð'Æ?µ¸¼"¿´7íåñ§Å:†¼5a¥xWðçíÓá?Û§ÁÚç‚ ø·à~‹ñsâ÷ö–Ÿðgâî½ÿ «Á^2ÿ„sÂß <âßcøgÂ:ö­aÛiÿ¶Oìÿ­ê¿´/ x‹ÆÞ4Öþ%ý‡ì?€~ |oñö«à?·øËXøtŸð¿´ÿ|9×nÿf±üA𷎼 ¬ÿÃGÃð¯ûÆ_ ~.øc\þÎÖþ|L±ð§åæŸû þÒ¿¶wŒ¾"|fý³<)ðOþ&Ò¿áš,~ |>øÛû/xÆ_ 5Wà~•ûmhž#Ô>5þÍÞ ý¹ÿj? üAðM߆mjçáÆ±¤þÖ_xâ7„¾ê÷>6Ö~ øÃûkü;øIñoâÏü"šWŠµÛ¿ x_Äÿõ_…žñމðOÁ>&Öô¿Yx{Ç_u/ø7[ÿ„3âΙ®ÝZ|<ñ¼ú—xÃöéýœ>ÍãëOk_|'©ü=ÖôÝèz÷ìßûIéž#ñÕþ»ñWÂ_téþxnëá$z÷í'¢7ÅOˆ_¼yâ_ÙëNøŸáÍ.ÿâGÃ{­SU²Ó> x:ûZÛñ7ÀÿˆÖÿ´jüøOñ3Á>ÿ„×Á?¾|rð—ÄO…:ïÄŸøJ~üñ×Å_øNßáF½á¯‹ß ÿáUøÚûþ·ÅM3Ä>(ñ~ñ§B¼ßðþóMðFÿŸˆí<}ùåáø$ü#ÿ¼#ñþ—Á;OøAÿá]ÛÿÂ]áÙGþOÚ7ãŸü+ïÛö<ý¬?á7ý°þ>ÿÂöÖ?á£>6x«þ'þïüSÿ…wðûíþ:øÃñâ¿ü"ëö¿øAnTU7ñI­×ߪø]­Ó~þA¯oëO=zöÚÞgÚÿ?ký Ãö,ýªÿiϲlx›ö~ø'ñËÆ°ø?⯀~#|<×|9ñá‡ÂOâN…á/‹¿üu§|6ø¹à¯í=ü'â„Ð|G¥ø7]ñßøgÆ~»>ñw†ëÂxŸcÏøNþÿÁE>ÂÄþÊÿ†úÿ„ßþ'_ðˆý»þ?ü&_±ÇÁïÙ/þA¿ð“ÙÿÂwýÿ ŸþÿøÿðoÛ?·ÿáÿEþÊÿ„“RùçâÏüoÄ´EýïįÚ#â/ìóñoã}®·ð~ éþ"ý’/õŸÙ|ðçíCá i_¿fO~Ñ:ñwÄMl[þÙuãâ ?ö‰ð=…‹ôoºö›á«Tøsâý?â°•6µmk~·³QÑû¶v|Êúm{;_ëåÿüÑúOðëâ/ƒ~,x7Gñ÷€uí¿ ëÚÁ<Ú~«¢jºv«¢j·Þñ/†Ú¼Söuø1¥~ÏŸ<ð—G‹Á6öžÿ„‚úkO†Ÿ ¼ðSáÍŽ«âïë~4×tÿ|+ð-´Z'‚|§ë~"Ô,¼+£ßj^.ñ’èPX\üEø‹ñ;â ljþ!øŸÚê®íª»·§@[+ïÔ+ðþ ëÿ$¯ö{ÿ²âÿýG,k÷ò¿ÿ྿òJÿg¿û(/ÿÔrÆ·Âÿ¼Sÿ·ÿô‰?…ü¿4Dž/ÿµ§ýŠþÿÔ/ÃõË×Qâÿù ZدàýBü?\ºú”z&³&‹ ÜkéZ‹é6ñµ¢I>¤¶“5„(÷ïм·B$V½’;EfáÖì83 L°x\n.8lN6XZœLpx(S©ŒÅÊ…9ÕXl$*Õ¡Jxšî*•U­FœªÎ uiŹ­(ÁT*np¤§(AÔ¨ä©ÓRj.u#9(BüÓq„¤¢£'dùK{¨õŸÉ©6æÒ¼eŠ1´í¹ÖÝ‘Yhâ`Ræ5…Ã<¨©§½Ì$ÇÅ?µwìÙ¯|rý¨?à´ûFËàÆÏ¿ÅAV×ퟵ_ÂÌðíÄ·2(½kk_ŽŸ>[ƺs­ÜWzä!â›I›WùÑûqþÍߣ¼ðŠþ)ü?ðωýœü-ý—mðÛIø›£húÞ‘ãM'ƇŽt‰¿ üM¥ë:ŽŸe¯êº´Ú—ã­;WÓtéu ø;EÓ´ÏéwóÛk>ÿ›.á¯|SúUqWŠÜvøÛÁ*ÜY‘x¿ÿ^ó_ ¼Aã<eü[á—ð&†°9O á¨fòqá¬â<9ÃøéÕ—öuj mjXìE8àq?ÖxÜ» Ë8[–eU2¬ûêµò… -<ó+ÁJ´0øÚºØÚ•ª×Tdê⽦.½¥HËÙóA)N?ÑÿÇÿ„žý§¿gÿŠ?üg$Ñi~+𾫧È>mGGŽìÅu¦ø¯HU‰‚kñ]¦ƒã-)غÅu§cË–0ÑךþÅŸ|Uñ›à¢üO‰,þ:ü#ñ&»ð7öƒÓ¢‰b†/Œ? Í¥Ž»®Ù}ŸFÐô“£üDÑnü;ñSñh6’èÖ>ñÖ“¦ÚÝÜIe9_ ‡þ Iû'ÛêÇS‹ãwÂßšiËB~#ø$DÖ×^rOjPkED ­À»B;€¨ á?²¯ÆüMÿ‚š|gÔgÏÚøÏá§Šÿdok?´>¯àË[?xÏã—ƒþ$[xwà¢ê^:±Óï, ñÖ§ð‡Zñ՜ڎ¿dš®áXï/´ÝgPðü×Zõ§ìœ«ãgž"x1ƾqÞOÀÜGÖñ&ͳŽÎpyG ñŸ Ã/Ëqþ߉ÂSÂeØ.5áœM£Z|ÕñüEÂþåÔ¥J•Zìøorlš®Ÿà3l¦X¼-xàkahãpõ«b°˜õZ³£NžU*׫Ì)}b„ÚTéÐÌóZ“p§N2ìåQ_íøømâßÛÿö°ðn‘ñwÇ×Oû<êþð&‰ÿHøñ¡øF„ßt¿Íð[þ aûM·ÀOüÕ|m'íªi—_h½3Å^ñ‡þ;ZxOðŸÀÛÿ ø–ËQýŸ>6ÛøÏK—À»´üÇãÀ|Cø‹¦|"ÿ…µû#é¿ðÕÞðG‰¿áð·Â´ücý?g?ÚâïÅ? ÿÂÕ¸ý¦¾(|Lñ^߉Ÿ²gƃ¿gÕÿ`ÿƒþ¶ûgü'^ø§ã¿ø;Âëñãõv÷àÁmJÃRÒõ„ ¯ôÍgDøµá­_N½ð„î¬5_|}ñ·Œ~;xR´ŸI’ÞûDøÕâë;OüZÒ®£–Ãâ?ˆímµÏÁ¬êpEt¸¿ðÍ_³—ü.?øh¯øP?ÿá ¿èºÿªð/ü.?ù¿áÿ’ýƒÿ ·ü‰?ñGÿÈoþEoø§ÿäþ‰ZóÓë’]5»÷vµšÓÞ×­Ó½Ò׿nž—ý~ÿ#ñ¯âOÆÛ7övý³~(øjÕ>~Ñ´WÇï…ß°GÂ_ê ~¿€|9áOiïÿ{øã©ÞÞüøËûsxkLø‹­Á¦|ñŽ•ssyû]ü°´°ñv›¯éÚoˆõüSý^ý—~:뿾x_Œž ðÇ}oþ-†·ðËGñÏÃU½ÿ…ñnïàçÿÂV/ÄoOªé—ŸtoübÑ<qâÛ[ÿø—N_øsÂÞ8_øzÏUÓ¼sái:G¨ø¶€ÿ³·Ã›¿‹Z÷†<ðëá÷ìËðOưÚxƒAð-°ÿ…KðÂúƒâ_øcÁZW„´+½oIðL'Âï ^ÝøÁZk[j¿ð‚xJÚÓB¾»Ð4-”¥Y(림©7hÙh’nÞê].Û@—õ¿âõ}~óä/ˆúƘÿlß ü Ñ~&kv? ÿhoŸ¶%þ¢ý’|uâ]7àž³¢~Ý^ ý›~8|3ðæ…à_xsUø ðçâ·í}ÿýøã?†~:ñ.¡ñoÅ6Ÿ Ñ5] â·áíi^Oïø—Gð.«ã/hšWÅxJÕt{ hZ߉´Oë~&Ñ<­üEÔlü¢i^ Óüyñ ûJðÏ'ñ‰Åi³Wìåáÿø\?Ø?~ èŸðÐÿÚð¿ÿ²>xMÿ…çý·ÿ öÏü.±è0ÿÂÍþ×ÿ„ÃÅ¿Úðšÿmý¿þ}¯ÍþÛÔþÔ)FËš7µ–Ë[^úôÓ–öß–ÏI0׿áéÿïò<»@øïñW_ÛêÓÂß ôOˆþ.ý˜~(Ëà‚Ÿ´­z_üW¿oØËöpý¡t/ x—Ç(¼Õ¼9áÝoÅ_~1kžƒÆiÚo‡<=áÃáû­SG¹¸Òµ}SWü×ð_ÄßÚ‡ãÏí}ð"Ïþ ø[ö‚øaðOöþø}ñjÓâ/ì'ñ³Â:WÃK›Á(üi©|Ö>ÜþÛ·ð”øÚÏþï x³Oøùð¿ö‡ñ÷Àø7X±O‡þ2Òo,¾!Üþ¼ø+öjýœ¾|9ñoÁï‡_~ øá¿·¿á:øY௅^ð·ÃŸÿÂS¡Zx_Äÿð–ø#BÐl<3â?øHü3acáÝ{ûcL¼þØÐ¬í4Cí}¼6éµàÿ¾XxKKø_ðƒáwÃ}3À'Œ<5àM;À>ðŸƒì<áψ^#ÑücãïøJÓÃÚNoá½Ç.ðöâŸiZ4vV&ñ‡£ëšÔºž™eu¥ÞË[Y]/äqmÞû½l»êÝ’¯o—àÓý7éó?/~ÿÁC¾4ügð?„ÿi}à ¼ðB?Š?ðOÿ‚Þ1ø!ªè¾,ñ‡Å]oÄ·ÃÿØ»Æv¾7ð×íiãoxGº'Â[ÛÂÖ3ø#TýœÁ¬o~”MàOÙ?´ßì÷àëOÙÏáu‡Æýöyø£¨| ø™£ü"ømkð“à·À-_á?Ã-_ៃüg·‹¼¢ Ú{NÓ¼%àÏZÅá1á˯Z]>Œ“ÁaâÆßaï€VjþÏ?³Ïn4-ľ5üaÒ¾ø.o_Ø|?ññû]ñlju ø2÷Ç>0Öô?øCø³±¦µâ9þ xOÃþ*Òá¹ñv—¤]EJPN-AîœWWº¶úûÚßVß»k$Ã^þ¾{}Ýt]î|Qû4üKøÓñßö°ý†hŸ‰úïÂïøDh_ø&¿íOñ§áOÃü7ñg†$ÿÁ4¼rÞø…ñÄ?|s¦|hÖô]3Ä^ÐWÆþøkð6ÃP¿Ð5½xøÊßÄÖ…1>=ÿÁAÿhß„_ >&~ѺV›ðOUø}{ãoø(¯Àÿ„¿ õøê?x/â7ì)ðÃöØñ~›ñ3â/Å‹o‹i¢|PðOÄoöñß|)ðׄ:ï…ô¯Œ=œµÛ¿…÷º—ÄßÔ?~Í_³—ÃoˆÞ-øÃðëàÁ?ü\ñ÷ö÷ü'_üð«À¾øã_øJuÛOxŸþßèZ ‡‰¼Gÿ ‰¬,|E¯ljwŸÛí¦¯¨}£P·†á<»ÄÞý“×ö››ÁÚÿìçð»WøßûS~Ï?u|L¹øEðÚþÿâ?Áo…¿ìïðËÇ þ-xÎöÌx»Åú'ˆ-þ-ü/Ó´ßkV¾!ðž«áÏ^Úk/§&áë IsE¿†é'¥–ÉÊMyZëÞÝòÿy…šëÚúz/Æß‘ùåñóâ_í`ß´¿ìëû;jšïìóãßÚ+á·Å?ãOÁ¿‰Ã‰?þ j>#øëÿõÿ‚Çøáç‚>&|8¸ø»ñãÇ)¢xCÇ?³œš÷Œüoáo‰Iâ_ øù4ÀÞÖ<Úÿ?CeÏÚ?Ä´õÿ|{¤ø[ðÁ +DøYá¯éß¼1áŒ'ãLžÔ¼cûAøÄÖ–Úçˆ<"tO„—/øsð_Ò´ËÈüYà/Ú“á/í]ð³ÆÐð…usô5÷ÃO‡:ŸŒ´ÿˆº—€<¨|AÒ±ÿ²¼u}á] ïÆZgü#ºWÄ] ÃÿÙþ'žÂMnËû DøÁñkGÑþÍ}öf•ñGâ.ŸeäZxÛİêxŸ~øsàW¯ü&ðµî·¬éž Ñ"Óî¼Sâ»› GÇ=ñÔÓjž1ø™ñ\Ó´Ý"ßÅ?~'øºÿ\ø…ñCÆri¶·þ5øâ_x³TFÔõ›¹JQká³I.Ý[“ÓMíeÒì·£ûöI~Gá½÷íKûFß|Rý†ÿkM{Pø'wÿ QûxŸþ€4…Þ:Òá@ÿÃlþØÿðH_†š7ü.^|n×?á¥?áRÿÂñ𖵩ÿÂá¿ÙsþOü "Óm?á]ÂÁÓ/þýyñ³ãÇÆ™¿a/ø*Ö›âŸhšwÆÿÙáwí à;_ŒtÏ|#°×|Fß±€¿iŸ|Bð?…5üFñw­oÂÿ4? ıüYñ¥ýψü7Ä-/[ðêx–ÓÁ¾úÆÿbÏ„ü7çþÊŸíþ þÜþ6ø“ðÆ~0ð×Àß…j¿?á.øIñsöŠø™¦|rñéšn·ãü@Ñ>ø—þË=WþïøJüeyáÏøH4k›KC[Ò~¡øuðÓáÏÁÿèÿ¾øÁ? ¾xwûCþÿü:ð®…àŸè_ÚÚ­ö»ªÿcøcÃVf‰¦iëzž¥¬jb±ƒíº®¡}¨\ù·wsÍ#s»îíªÑ-9¯Òûkï_™ê’¼ïßÖ˧ÊþGãgÅ~Ö³¯ÇïÛ7ãÝßÄÙçÆÚŸìéÿ×ýš>4üvðõ·ìññ'¶ü9ðßâïüïÇÚG‚>ÞËûSøžãözÖï|# j>Ô¼oã¿iKñ©eãk_ZéšLþÖ;o~×_´Ïø-5+Dø[û:êÿµçÇÿƒ:ŸÇ|6ø»ûPØ|Bø“ÿ0øÿû5ø'ö‚ãIý£¬>$þË:Þ£áÏx. |gøƒà_‰¿²}—ˆþ)é_ ¼;§ü Ñþ|9øAñ#ô£Ã³WìåàŸë¿¼ðàŸ„~x£Á3|4ñ/|1ð«Àºƒ|EðæãUñÖ»?€5ß iZ ¦‰«x&}oâÄÍbo ê7º¯Ä_j`×~.ñÚiû5~ÎV´Œ6?~ Ùü\ð¯ü%¿ðŒ|S´øUà[ˆÞÿ„û]ñ¯ŠÙ¨x§]¸¿â÷ÞšÙ-m¶ÉÞîíK•;$ì¬[þïË®ú[çÔü¡ý¼fñÇÆ_ÛWáO왤Ëð¸øGÅÚß쫪ø‡Bøëàˆ¾øêÃÄ¿à´^3¿ð×ÅoÙµ¾5|7ømãmIñì×ðçÆžŸLÿ„CÄqüLðç4ÇáÍ7Æ?³ç‡ü3is®xÂ#Dø·qáˆßô +S¼“Åž=ý©>-~Ê? <k·VÝ·ƒu‚ß¾.ü`Õ-~è“|Tý›>(øGá.¹ñ Ä~ ðœž##¶ø¢üYðµï‚¼Yê^#'‡þ~Ù>1ð¶sw&…¥_üBøË¡éÚjè>,Õ5/q?µ_оèÿÏÆM_⎥qáŠ?ð¸<'ðáÂ߉Ÿ5¿‰wÿ<9«éz׎þ üøkñ[Ç>"ø]ðÇ>?øyñ>ÏÆMá½+ß ?h} ösñÇ‹´7‚4½}^îåvQøwm¸ÝµmuVkµ»}z¯Ñ[çúŸ/Z~Õ¿µ‡‡ïõ=_â4_³ÊiŸ?hoاö5ý þx+Áßu ÿˆjO~Ç«âï‹_¾2k¿t›‡_ ¼âïÛ#I—ß ¼mð'âO‹<_áÏ„zŒŸÄÏ j­®>ú‡ìÕûZ|FøÉÿ÷ÿ„ŸEðM‡ü5üËÆ¿µ§Ä_ì7]µþÅøáÏøb°è¾ þÐñ&©ýà™᥼uö½7]ÿ„]ìŸ y>$ƒìÇö÷ÔZÃOÙË⌾~ÔÚW€> üEøƒoà›øT¿´nŸá_ø»ÆP|9ñF•¬^i¿ð®¾/[XjÜ^ ñ‰ão]XÿÂ5âеm+ÅÚÄð}¢Ó_½k³Á_³WìåðÛâ7‹~0ü:øðOÀ?<}ý½ÿ ×Å?|*ð/…¾#x×þvÓÅ'ÿ„·ÆúƒaâoÿÂGâk kßÛçöÆ»gi«êhÔ-á¸AÊølíÙ-yZ¶ýß5÷û6²L5ïoǷݳZw¾çåíKÿ)ý¡¾êÿ¼wðïᾉãßÙÖÛDý°üðâ‰~hžðæŸûC~È_³'íñgÆúgˆøGö{×4_þÕR|$ý ,*ñoÃïÍÙSö­øÓ­7ÆŸÛ/C‹ávðCöƒý¯?àœ0xÇö}Õ|âÍ{â®—â?Û[ö2ÿ‚X|3µÕ|5ûGZ|Ið÷„m4O…÷<-¯ÏáýSöfÖ/üu€¼A£Gâ_¿tí_áÿíwůÿ¾>ørËÁß¾|.øÕá7[¶ñ.áo‹^ðŸÄXxŽÎÃRÒíþÞÚ'Ž4Ù7Ä¿ |ãïÙÿâ7À  øŒë+ø™àÿ øÏC×?gM˾~ÖŸ¼EÿÓ!Õt_oâÏü*ØóâÖ¡§éºí®•¨Ã,üCÿƒ…lu/ˆŸ´{Ÿ_Ýøþ'ÄÙÃþ'±ð‰u߉_ð„ø7ÆÇgñ?Œõ½>Ëâ,¿«ÚWì‹û'è_ ¼Kð'Cý˜gà‡5¸!ü/ýt­+À_~#üø's៎ð„þÎ øo¬|ðψ<ã-+àgƒ~'üwøgð¢ûAO j^³ðO ø⇎>h¾$†ÃÁ¾ Õmu¼(,ÏU|ð÷’‹Õ[D´êÚòVME·n[¹6äÃ^¯ðôÓóûö?//ÆÏê~.ÿÂÁþËÒlô}Á‡4+kLOükýº¾ |Qý›~üIøið»À?´WhmcÆŸo¾!Ùü;øáÍwÄàšÿðUÁ6Ÿ>üý´?nøoáv‹ãŸ…°MwñQþ,xrÿâ}†µãOøáæ—¬|ÖüIâÏÔ?ÙãÀŸ²Œ¼'à?ü!ýœþxLý>(þÔÿ ~Ámð‹á·…oþøÁÿ~#ü øó{ð–/ YÝ[øDø§âïø›QÔ®|-u¡ßøãÚ¥•ߌ´Û]N÷PÒ,ýGá×ìÕû9|Ò´} á/À‚ ´OøÛPø—áýáׯø'Jо#jÞ ¾øuªøÿGÓü5 é–šgµ?‡Úž¥à]CÅVPÁ®Þø7P¾ðÅÍüº%Üö278§/q'gt®´q¶ïºw½¾ÊmY»kÙèô{=­åÓõg—~ËŸ´ˆÿiëÿø÷Ið.·à?‚V‰ð³Ã^Ó¾#xbÿÂÿOÆ™<9©xÇöƒðÿ‰­-µÏxDèŸ .<_ðçà¿¥i—‘ø³À_µ'Â_Ú»ág /à= êçä?ƒß¶×íªülø=ð{ã†…àŸ‡¿~$ülð¿†~&~Í×ß"é?øUðÛ⎲þøIúOðWá/‡>|*ð?Âo ^ëzΙà½->ëÅ>+¹°Ô|qãßÝM6©ã‰ŸõÍ;MÒ-üSñG⋯õψ_$ßüLÐͦ«ðGá‡í¡ûsê~Ñ4]OámìÞø©âo‹°øŸ­x—Â>øy¥Ü|ñ‰ ø;¢Yk|:þÊð—Á«o‚ût¯‡ß¾$OýiáÿøE<#wqà›ˆ>.øã?j–ø7Åð°µï‰ž¾ÖtOˆ¿ð’ëøš'…?fOØÇáúÙøáÇÂïÙçá·‰~(ü=ðûè ~é ðæ­ñWãgŽ<ðGÀ³Þøoá·†í­æÖüYâíwÀ>¹ñ-îäéö ¦Ýx‡UÓ¼9¢O}§’”_2Œ,ÛIi¯O=úYÞý,ƒ].úkæôòÿ/Äülý–ÿá´ü}ÿ˜ñ?ü4OÁ;ÿ‹ž5ÿ‚^|~ñçü,_‰³·Å‰?løsâ?øuF¡ÿÿìá°¼-âo|l¸ñ5çö:ÂuáÍ Å;ïáÿ…/£êÿÛþפÁL~1ü@ÿ†cøÉðÇáöÏìûñþWÁ´Vÿ§…®ÿáJücý¸ÿáFêz'…ÿáøƒöšøuãm[þþÕ¼mö~Á?¼-ãOµÿÂ'wñOáö­â/^| ý]ð—Àÿ‚Þñ±ã| ø]à¯x‡[ñ÷‰uÿøKÀð߈õÏüU¿ð~©ñCÄƹ£i6Zž§­üHÔþøQñö«{u=ÿŒ/üàû¿ϨÜxgE’ËçŸüý‹>.|Oñ'‘û*|¸øƒû xÛá·ÀxÃÄ¿~Kªü7ÿ„Gá'Â?Ú+áž™ð7Ä ¦jZ߃üðÿDøÝá¯øDìô¯øDáñ•ŸˆÿáÑ­­-ôýoV®xɶãt“è•““ok2Iîž«ªešëÛð·¯gë™åß°†¯ûXx—þ ‡ð;Æ:§Ä¯…ßh¯~È üiðoÅ>;ð¯ÄŸxq¼GâoÙóÁú§ÃËOÚ3\¸ø¥ñOÇ?u³ã™äÔ~.üTðµ×‚¯üia¨Þ]è<7¬@ÒjxGãÇŇ?³ÇÃ/~Ñ ÏÏ—¬>~Î^оÁ:üuàø]¾ñ¯Á?‰_ï¿átøWÀ¿t/‰ÿð¢~#|ÿ…‹ãÿŽŸÛÚ~6|Kø¹ñçÃ|A⩼wÿ —ÄgñçÄvÿGñ3iÿÛÍäùnÛmh´Z¶í³å²ÑèÕï¸j­¯k¾û~zŸ!ØÿÁC¾4Éð‹þ ⻯ |.“Åß±_ì‡ñ3â^‡s‹âÈ<9ãÏ?~?ÁKgÏ뺮…'®u=áwŽõ?ØoÁÞ8ðÿÃ{O_x³Àv7ñ/„5‹¾?¸³Òü]Úÿ²'ů?´Œ6øŸeð»EðŽ…ûC~Ò¾é¶ñdÞ#Ô<9û=þÓþ ·þ!jž!Ô›LÓµ¿éž ðæ’¾ðÞ™©Xi÷þÖþ#ÜÛüX°øGðGÄþ6Ãûë¿¿hÝSã'ìð»âÃoø%î‰â¿ IàÏ|ø3ã[ øsŸ²ßÁÏÚKTðÿìñá߉´ D¹øWâχž³ÒšO‡öx‰¡ÜAmáÍ C×nC|?á¯xNÂ}/ÂÞÑ<5¦]k~%ñ-Öáý*ÃF°¹ñ žÓN‚ÚÞmoÅž.×uÏø—U’6¿×|G¬êºæ©=Ö§¨ÝÝLIÆÚBÍ»ëÑYhúÝIè·¶»†½ÿàí¯—] º(¢³Wàü×þI_ì÷ÿeÅÿúŽX×ïå~ÿÁ}ä•þÏöP<_ÿ¨åtaÞ)ÿÛÿúD‰ŸÂþ_š?¢OÿÈZÓþÅÿêáúåë¨ñü…­?ìWð?þ¡~®^±ŸÇ/ñKócŽËÑ~GŽø·öwýŸü}¯^x§Ç>ø×Äú‚[Gâ?ü2ðWˆõëä²µ†ÊÍ/5}cD¼Ô.RÒÊÞ KešáİCoH£D^oþöPÿ£aýžðË|6ÿæj¾†¢½z\GÄ4)S£C=ÎhÑ£N¨Ò¥šc©Ò¥JœT)Ó§NÔ!NŒcE(Æ1QŠI$rË€œ¥9à°’œå)ÎRÃQ”¥9>iJRpnR”µ”›m½[¹óÏü2/ì¡ÿFÃû<ÿá–ømÿÌÕz'€¾ü(øV5QðÃáÃ߇]6'[ð_†ü5“¦}¬i§UÓtá¨Ûwäyi›¡QYâsìóBxlfsšâðÕ9}¦˜ã+ЩÉ8ÎôªÖ9rNœy¢ùgÉYÅ4éà°tg”°˜ZU#~YÓÃÒ„ãx¸¾YF Jñn.Í^-§£ (¢¼£¨þ^¯e_||ø9ûWZ~β/ü ÿ5ïŸð[üDý¨¼ßÙËÀßð×^øâŸø(¯Á‡ÿ³¯ü&ø™qñËÅ?cøåãï€ú÷ö'í ேÿ4oøPð–Ãã¨xá@ñ/Úÿµ_ìA®ÏªøßÂÿgøYÖž%ý—´Ÿ…±ßÅ9¼GðçXÕaÚÚ~Ñ~(ø…ûbøŸÆÿ¾ é?ü)ão‰1ø¹ð7⟎¿hOÙêßã_í=ñÆ_õßøûNÕ~ øká•Ç~†ñÏü#àÃχþ7ø—â¿ |Qðß…¼+ûCxßöVðþ­ãÆøEðwß¾9|4ñÇÆŸ øÿÂß~!üpø»ðÏá_ö'†t¾&ø€ß¼qã¿|3ñ†­¢|+ð‡Œ|EûJØøÓà_„&|Vðׄ¾(üMý<;û!üøÕâßx ¿g[ß³=þñËöïøsûJøãâ§ÿ wMñwÅE·ýžà°Yfý¦¼9âkƒºßˆ~ Ãâ«/øWVø™Ñz¯^T’nÉ·«mY^ú¾‹dýè¥öII.·ÛÏ·®š/ÎçÈc]GãwÆÏÚcÅ ø[ãoˆ¿³¿í¯ñïVÕþ~Ï~ýƒü]mñãŠ?eïø'o…õ–Þý¿|/«~Ê~+ÿ…oñƒáíð³âßÄáhüxñwŽ<¦Éq¿ûDÛé¾×âØKâˆ|ûE|øð þGÇŒÿ²ö·ðsàíãñ/Ç >5ÿÃ7iZÏüËÁÿ³n³ðËÇÿü}ïÚÍ¿á(øû |kñÿе¿‚_³ïƒ|kÿ ñ+VÐ<=⿈_|'àïµþ;ÁAþü0ýœ¼Kñ²ÇMñ¶Ÿ¿Æß¶ßÁï ]ÝøBñ¯ö?ÄoØ£À¿µç‹|uâ-{ÁPü[øsÿ 7‚uøcˆ²xKHÓþ$xK]ñwöÇ‚´cSømý¹®ëÞ òÿØçöÉøåñSöŠø¹ð#Æ¿õ¿ˆðž·ñ§UµøÇá»_†z‡Ã+ /þ ÿ4ø àï |P´Ô~!øKÄzæ‰/ÃoÙCáW‚¾Oð·á7޼F|Gmâ¿|añ6úÕ§ˆ 9ªrÞÉ(+jÚz=ït›º³ïµšÐz}ú÷Û—þçtz‡> \ø£öDøEðóà‡ì»ÿ ×iáßÚ‡ö@ø‹ìçöO€þ ÿ…uàß…?·çÁÏŒßuìïƒ>ñwÁ‹´x;Â>2ø©ýŸàßkZ®¿ý¡öCc/ÄRçÃkÅÁ6ÿgß| ÿ…Ïÿ ÁøVÞñü+«} ÇŸ<û9X~Þ|S£ÿÂuªüAñ¿íyñgöSø‰ñáíCźGü+?ŠzŸü!_õ]Fÿâü. øÄÏÆŸ‹ßCx«öÉð?„þ*êÿ.>üQÕ<#áŠ? ~|Køí¥Zü?? ¾|røÛÃY~|)ñ.‘ª|CÒþ7ëšßŒßãwÀËx |lø'ÿ ³àšþÑ_ÿáp§ÁËŸø[ÿ-¿á\ÿÂAãÿ—øÇñþoøE¿áqü"þ×ðÿÅ_øWž)½ÿ…‡¦Â3¢xƒþÿÂ#Ÿ$•—,Ÿ3w»ÖÏK»ì®ïwm^Žá¥×’·åòí±ùE«ÿÁ4|i¤~ÉÿðO/‡šÏÁÏŠ>,ÑþþÏ/§þÔ~Ø{ã‡ÄþÖïÃoÙ§Ã~ø™â»ø(¬_¿f¯èŸ¼-ð§â¯Áo øÏÃþ%¹ø“ð£Àþ!øqðƒö|KOÙÖoèzkñöBý«$øÓû+x¦çáÿÅüIø­þÁ¾ ð·íà_þÄÞ:†Çàï|¸ý©´ÿÚ_ö§øëàï…_ðP¿üQñ0Ÿö¦Äû8h~øEñ«áWŒ¾é~#øgˆþ#þо¼úöàÿ‚œøཟí}û=øG_ÿ„öø{û/|ñ×ÁÏÿÂkû5xëí¿ü û*ø·öŒÐ!ÿ…3¢|ZñïÇ bxS@Õ|Wý»ñëöyð7ÂMgþ_ìtñ>³/Ž~iß»i¿kOŒ~ ýôšW¾¼î÷½ímÕÛºZ=…d´×¿þËÿüò²ýŽ.~hV¾:øÁû?ÿÃ)볇üËㄟ´÷üOþ߀ÿ?áqþ×ß ¾#~Å´ÃoÛûá7Å-öý¥ÿáø¯û0|Fý¥þÇûHü=ð‰¾"ùßðüHð£ë<[àéIæý˜>*üMý‚kx¢ÓDðoíKûyü.ø÷âO‰%Öa¹ðçÃÏŠ¿¾ Ÿ…?>øƒÄ>ÄZ±¢~Íÿ ô_„_³Þ«ñáÿ‡!‡â•‡Âþ1OáI¼gã­}oñ~þÛÞ:±øÙûFxcãWÁ¯žø]¤~Ô?³×Áÿ |EÔör»ðoÀ]wãïì½ûêø ñÇÀ?õŠþ%ñ¶«ûFüt›B¾ñü ñƒáΑªüQÑæ—âÜ ¼3¬kíd¿ø)Ïì½ûgüFÖ¾ü×þÝ­Ûø'RøŸá ÿá5ø'âïøO~iï†ü?©xÛþ¯„ÿ¾$|Aø3ö[¿xÿáý¨¼ðâÝÇü%ß`´ø{q­ø#⦕à'Q«ÙZ6“iÝ+ÚInßfÕÚIE¤’»i%Õö×ä¾{-|ÏŠ>3~Ⱦ&ñ®…¯Û|*ý€?á[ÚxÇö^‡á7ìa᯳~È>ÿ‡`þÔ6¿¿iWÅ?´÷‘à¦‰ð[þýoâ‡À‹_ð²b ߌß5_øRÚ^-ð–—ñÀÿ ¼?®ýEûpü ³ø“ûFþÌß|oû Ãvü#ðÁ?Ú³ÁZﱿe_ÿÂñâgŽ¿d=wá÷‹áý«>+|*ðÌÞw†~|SÑÿ·¼/}«ëº?Û?³î--ôÿK3ñ?´·üŽçDýœ¿jÿøá—ÆÏƒÚß…üû{|:ýhéŸõÿ‡><ý¥cÿþÑwÚÞá/ xâ¯Äψ6ŸÙ·³oÅŸè:‡ÆŸƒ^ ð¿¡|:»Óµ[åÖüOàÿ ø¯oöºÿ‚§|3ýžµÚ{ྋ‰íð“öyøÕñCámŸ‰|{ð7ÅþñÏĆ¿³'‰i/ž øEðÓãΣûRø/DoxkYÕõ_|PøGð‡Àú‡‡çÒôˆçXñ¿Âƒã‘{FâÔU×=•ÞÍ(É·Í}/ÑÞé¹k{–VߪíÒÖÛ¾Ÿ§Cä?†ŸðOÚ{Ãÿ´ÁütÔ¾6|^ø¹à¯øc;‹ÚOÁ^:ý’n~øCÂß¾|ð‡Çßx·ãßÇ„ž'ÿ‚•iŸð¶~)ü;ý¢|[¯|,øi¥|ø÷¡|y´Ð~%x£á¦¡ñÓö™ñO„þ×ý¡dˆß><~Øüü"?|Qÿòø{ð/öIøÃ}ãíw@Ò¾þÑ·?·Æ‘¯xóOÓ<'¨êZ߃ümðÿDøÝðòßGøÑià‹xSÁ¿~"ø_á_ˆÓÅß¼;«bk_¶OÄ;ö›×.þ*ü?ý¡¿g¯Ù×özýôŸÚã^—%¯ìŸâ{ØxŸWý³4=vïö¢“Âÿþ4üIñ‰gáÏÙ“Ã~1ø£~ÄzŽ¿â5ñ¿â;_’^è÷ºG…¼5êçüOÂÞ×|?ð÷ÇŸ³wíCàÿŽ^,ñ·ƒüៀ?ð|ñïÄm_þoßÚ+Çß ¼[ý³ð‹ãwÄ_„zO‚|¨~Êÿ<ý½â‰úGü+-wÃð›|t´øSð6gø»ÝFÓ´oÊ—»m®žºÛd¯k«I_â@­®ûß[ù[–úßÐü½Óÿà´M¯‚¥Ò¿fÏ|lýœnõOxòãÃ#ã‹?a‚ð©¼}©ÿÁ<¿à¢¿t_žøcÿÏøyáß…Þ ûWÅÚö|ðÖ¯ñƒÃÞ ø“ûJøÏþ2 sá÷ƒ¾|ðˆ¼aÛxSöø—á_€ÿ| àßÙããf›ðc⿾ ÛüNýŸ>#øOþ ÿ ?YоÛ|Pñ©ãÙëöløSð«Lÿ‚héž6Ôþ%j³¬>6ø§ûIøŸÆ¾!|$øsã­ ÇÂþñÁÙ—\ñ×Þ:Ÿüãជ7ŽnµÏ¿´6“ák´¤Ú·§´øuáËß„_±Å]SàÏíoûDiZn—ñÖÿÇ2ü.øã˜<7gâ ßx;OøýãûxkQø#ðK⾟ãsàÿ¡þ ~Õ^øÿñâσ~xÆÚÇ‚~ øÛÇŸ ¼UñËûoàãü9?þkºW†¼ð‹þ;‹7ÿ´‡.øiâ?Žu-wÛMz^.ö¿6÷é¾K¦ %³éú/ò_yùð?ö8ý¢toþÇú‹?gÿxËÄß &|±ð–Ÿð#áç†>(þÔð¾¾|2ý¡þh?à¨<ã&пh;¿üPÓï­?hïÚWÆ ¿^•ªj¾3_xsþ/~Óžø¡¢OáÛm[Æ_¼û(x7ƾ#ürø™à? êÚß´O‚zß‚tO†~%ø}âÍ?Ãú¾«â½+ö¢ý”nÖ_ð½|(¬x[öÞð¶§ñ?Àß<ðkãgÁ?Œþ<ñ·‡ü+§|6øŠŸ5½WLмcð“ö˜ø¹à¯‰zlj> |cø±ðù<âËOÙãǃtû 3ÆZ§Äm3Æ^±>(ðàïxsÆ™ÏSWË|[v“nÚì›ÖÝ-Ý\I.¾_úJûôGŠ~Ä? ¼uð'QøËoà¯Øþ§áÇŸÛ]üQ¦|,þÜýœ¼ÿ Kàæûüð½çÅ?øB>xãâoÃOþ?ÚKà­ß‚?áð—Š"ñKÂËÿ…§¯[Ûiú^³owí4O‰ÿÿhß~Ò>ø9ãoÚ3Dø»ðOà¿Áü=øY¯ü$ð¿Äoê¿üuûAxóÃ^2·_Ž_~ü>ñw‚|kiûAøŸDñA‡â…ã/ë¾ ð@мñ7DøâÍoàߨé´§õŸ¿~>ÙišÝ¿„~ë´×‡üEaâ Sáÿƒoî¯ÿeO‰Ÿ¾üAžøÓÇ>øm hš¿ˆþx†ûÃ^%ñ÷|áË_^iZߎõ_Ûeto—~ ÁR>þÐ>#ø[௄þø£ã¯üMÖþ)ø~}#Àmð‹âŸ‡>ßü¿ý®¾ Oñ ãÂ/‹¿>Ûhš?ÿÚsáßÅ%ñ/„~*øÃ×6k¡ÕOíK'…þøž=ù9>Tì¹dµ·»®¾õÕ¹UÝÒÓ]ÝÍ4×Óm´ò¶¿®‡Å&ÿ‚hü@“Hý¶|m«üø]ñöŠñ'ì‡âï~ɬGõüý³~+þÓðSÚ³Vð·ìýñSÆñxgÇ?µ¿ƒþ9ý¤¾é>ý eÓ> ?Œ/ü=á_ˆÐXøXÑ5O ø¶øû |Iñ?‚ÿjŸ[þÍZݯí ñ âŒ|iâOÛƒÃIû'ê~#ý¡egöáð·Ç!û øÆüY®üMñf·7ìm¤~ÍZWÂÚ§àöû^ßü7ƒá|M{û=Zøs]×þ¼ý’ÿà§?²÷íŸñZøgðk_ûv·oàKâ„'ÿ„×àŸ‹¿á=øa¤k¾ðþ¥ãoøF¾üZø‘ñàÏÙnüqàÿ„ ö¢ðgÀ_‹wð—}‚ÓáíÆ·àŠšW€x«ø)…´«Ï‹VšßÂ/ž8ðÏÀOø\^7øõñ›Á^ø9á?‡?þ|?ýª¿kÙñ:м?iâÝág„øñGBñÆï…ß´Îð;àÇůþÉúˆü=ñö|¶øw¢ø>ËÁŸ²wƒ¾þÈ4OüM°×üUmá/†ú÷‹<9¨ßøÏRøÓñÇÚ_ÄŸ‰ÿ¼à}¿ˆðOmŸ¿j»ïÙÇáç‚~yßðO/ü ýмOàSþW߃´n½®ÿÁAfñŸÔ-þ4hÿŽ´ â¯Å=ៈ&ÿ„çâö…­mÁÿ>Ñ>ü"ø‹ñCö•øi­øLÐÿkÏÚ ö`øGâdñìóà‡ÿïþü~ý¤ü¢Úx3Åÿi/h>Öü#ð¯à£¬üLÖi-öðç‹|qe¨h¿#ñ†§âøBÿµð7üOödø…aªx‡Ã–oüàÿÙçSý§þ*|TÒ¼+¤x·áWÂo…^ñí)àOˆ~%øàOx¯Ãž-Öüñ'ö\ñß Ñ¾ÞüO›âÌÚχü}û=Iñ‹àÞ‘ñ/â_ÃÑû_yòéÌïmUýÝ7×áµ¼åî­e×M;ôÿ€þãâ~Êž Ô¼9ñÛáÏüÓDðÀ‰zßìñá[ÙcPðü³_ñÁŸxÃö§Ôþ7~ÛŸ þkŸõ¯Ø§Tø£ã¯ü@øû<ø3Æ^+ø™'Ä ;ýüañ;á'Ä¿„ß¼7ð³ãáŸø'ï4oÚ“áŽô„ÿ´7‚¼#á oöH½ý®,6YxÏá7ì©ãÿ~ά>-§‡¼QñƒÃöÿÿh߉Ô^ ÿ‚ÄþË?ðåÝÇ…ìõ½oâLŸ~üð§Á |Yý¼yâ?xãã]‡Ä=Sᎋáÿ‹Ÿj~Éú6·âÛƒ¿_JðoÄÚ/Á?.¯üƒ„dñÅšGÅ=¸¿à£7>¹ý²üKûCüñ·ÂÏ„³O¾xkJñö¡­|Ó´«?|[øûxÃÃÿ³÷Ä]bÚ+TÓôï’ü\ý¥¯ø™ñ’ëÃ_¼9ªøÆ÷þÿ‚x|hý°¾!¿‡í-üwð£Â?µ½nãàÆ¯¨éZ„?‰ü9-ùƒáì^ ð¾™âÕø•ðÖ_´mI¯~ò[»¾ngµïei%+­-g¥Á[E{ì×ÊÖýž ³ø™ãïØãÇVÓ¦ñ‡Š|®øcÀ'iž øJ­áo¨¿à›³£û;Âç»´øqñ³àç‚|mÿ êßFøoñ…`ÿìñO…¿á:“Å~7ðïÁ?ø'?ß þϾÿ„›Iñ7‚´_âž½ã_ücøŸÿN™á/ø_Á> ø9ðËVñïן¿hH~-xÆþñŠ?~*|?Ñ<ã|/øµ7­SÄcáÿÄ«ÿè¾ñõ–¿ð?âÆo†×:'Š|Gð·â‡­´s㸼q¥_øR½ñ'„´][ð^³â¡ªeRM8´µù½ù•ޚ麶ÃI.ûuôKôGò¿û.þƾ,øÏû~Ä—ŸÿdÍoökð6¡û<þÀÇöˆ×<5⯂ß|Gû^kv¿µ?ü·ãt´‡üIû7üa¼ñö¥­üø7ðcö¡ñŽ•ñã£ð›ö†ð¥ÿÆè-~蚇Ž|uñÇÿ¡¾/ý|Hð–§à½ â§…¾^ð'ì ñÃøßâΡû8~Ï>ý¬-¿kÏø'µà¯‰ŸtøN ~Ï? ~Á8~~Õ>øã-^]3âOÃßÙæËß ÿk‡ºgÁýcRðþ·âß…Skþ> ×l~!ÛØxŸ÷&Š•RIYZ×óÖí6žº§k>êã?žo þÄ´›áŸ…_Ø?³ü+¿ˆ?|ðVý­|aˆþiº¯üÃöø û_~Ä´UÏÆÏ xƒÂuMoâ·µ­öký¨áø‘ûpÂ…ñÔ>2ý©4/øHdð§ÄOŽúßÃóÆ_²ßíeñŸãÇÆ¯Ž·?³g¾x'â¼mâ]oá/Ä_þÏw~2ø•ð’ÒçþUmãϺƛð÷ãGÄ?†z¯ü5Ã?ØöµøS§øOÅþ;´øaâ*îÇÂÿüGðûÁ?ZöOèfНm+ÞѾ½úÚÿkÉzl¬´¶ZéoÂÖüºyŸŠ>ý•|uÿ AÿmøYð³öEÿ†]ÿ†¢ÿ…çÿ Ûû6ù¿³—„¿ämÿ‚| øeþ…ð3âg¾ ø'þož ñ½ÇúGì¿ã÷þdÿkO=x§Å/ØkâÄM+ÄSü&ý’¼mû)~Ê÷^6ýŸõ~ôø'Ü2ø³ªü>ðoí¥|Bø‹£üñ'‰~4ÿÁ;“ãσÿ³E߉ÿ¡š)*²WÑjÓÖïeÕëð­]Þöz…¶òÿþ[mä|½û|,×~ ~Í_ ¾x†ßÆÚ}Þÿ Æ¡|EñGßøËÂ~ñ¼Sâø#X›àׂ>|ð¯ü ¾Öt/éÿ > øn_ƒŸt­ÇáÂxóá÷‚|9ã¯}CE ݶú¶þñ­]‚¿ÿ྿òJÿg¿û(/ÿÔrÆ¿+ðþ ëÿ$¯ö{ÿ²âÿýG,k|/ûÅ?ûÿH‘3ø_ËóGôIâÿù ZدàýBü?\½u/ÿµ§ýŠþÿÔ/ÃõËÖ3øåþ)~lqÙz/È(¢Š‘…Q@Q@!ê±·Ûáþ‡àß ü@ø£à/ø/ö†øßûOü7ø³á«¯‡úćh?|qñgÄ{¿é¾9øyã…zÞ‰w þÑ¿~iZ7Ć~4‡Jð?‰`¿‚Fø“ è´ß.ñgü³ÂÞ4Õ|Kw¯~Ò?µ ö‰ñSàŸ‡>~ÑþÔ"ëÞ'ø#®|Aðü&w´wÅÍúÏöiñ¯À] À~ ×´ |Ѿèžð-§†ÿChªç’ëç²}oÛ¾«³Õjþ¶?5þ-ÿÁ1þüb‡Ä~×~9~ÐÚÁ½w[ý¦|acðÃWaøá_ˆµÏ¯ÚáwÆïxÄúçÀ­{ã}Æ·¯?íAñ¯â•£ø£âï‰<áßx²4 [xþð.“íŸ ¿coüø™7Ň>(蟈u¿‹¯Å î¾êþøÁañ/ã—í ûEèñšk_5 {@Ñ> |Tý¨¾2k? çøM¯ü4ñ¥a¯Øh¿üAñ_LÐ4k{?¯(¡ÎMY½;iøé«¾·zß[ßQY_/òZ!ø«ö6ð?‹>*êÿî> |QÒü#âÿŠ? ~:üKø¥]|? ¾'ürø%ÃX¾|Vñ.¯ª|<Õ>7èz߃àÀˈë³|$ðúø³Àž ·ñGÅ(> mü%ý’þüÿ†aÿ„cZñµÿü2wì½âÙ/á×öö¥¡]m|9ñü3ÏÛµ¯ÿgøoKþÑñ´_ðÍ>û&¥¡Â9¡'ö·‹|ï Ïöýûê(æ•­}6üü¯½¬º!Ûúþ½ù¯ñoþ ðÏã>#ð¾»ñËö†Ðþ ëºßí3ã €Þ»øÃÿ ü@ý®~~Ð ¾7xûÃþ'×>kßî5½yÿj4­Å|IàøãÅA¤xJÛÀ>ðßtŸ¡æý’þËðOÄÿSZñµ¾‰¯ülñ×í¥x®KBox'ã‹¿jwöÄðÿŒ<1$þŸÂ—ð«¾;êÚˆü áÿøOÅÞÔ4¯ è^ø™¢|EÑ.#×~*þË6²Í§„.Úן<5á3DñÇì“ðûTø…£hÞÓ¡¹¿ñ'#ð\žÓ/ü3§xOoàì·¥~Ï?ÙšW‡þ/ülñ‡Ãïø&Ïá‡Áo„¾5×üß¿ 4ßìkm+Á>Ó|à?ëÿ±´O ø?ÃZh¯|nø·áý ÷ph´û¿ˆo~ ýCEÒ³WÑôÓ¢¶´VÓ¦›ùE£Á1áñÏÃÿ‹þý£>9|Qñw„~ |Qÿ‚€øÃÀß üwð«Køð^ÛGÇµŠž>ð¿À¯üYÕ>(Ùüý¦£añšÓãÄŠ?´-Çí û<øoö`øÇª|Lºøá‹ÿ|*ðLjÿhÍrÒÑãø ðóà¶™áínóLý¦üoàíCYðž LÞÐ<ug—‹¬¼AâŸâx[ö!ð¶™ñ?Àßüñ—ãgÆÏŒþñ·‡üU§|IøŠÿ4MWSмð“ö˜øGெšÇ†þ |øOðùüá;OÚïãÇŒ´ûý3Áº_ÄmOÆ^+±(ñþ¿àï øsÁúgÚôRæ–ºï£ÛkZ˲²JÊÛ.Èvþ¿¯Ìø7ÄÿðO‚Þ,🼨øŸâŒ:g>ÁC¾êóÙk^ŽþÛßðRß:/ÇoŽ×ºl³ø&æÞoÂ~.Э4ï„·7V·–‡$¹´ñŽ›ãÍMâÕáõ~ʾðÇíâßڛľ8ñ·Å‹šß‚uï…^Ö"ê_¼%¨|'øMðËÄÞ0ðL>&Ò<9u ¿Ç/ü^ñO„ÿ±.ç🉴MCÇ/¼{õ sËk÷ü]Þ»ê÷ï¶ÁeØø¢OØïÁ¾>øŸûbxÃãW…<¯xgö‘ðMŸÀ]7Ãþ“UÑ®o>ë_ <)ᯋZ¯Œu[+=ÄÚÆÏŒž&I¼ñ'ÅÞñj[x«à?ìïûhò¾ŸâoƒvÓÛâMûhšü¾=ñ/íûCx«öгÖüªø7ö¢Õbýžl~*ü=°øwáÏ^𷆼5௠þÏžýšµMÏÂß´Çí!¢O?~xÓÄw°üjñõψ$Ö<ð‡Røo÷•sË¿D¾I%mz;+­µ¸!øö6ð>û8Oû9j?>(ø²ÞoŠ>%øëÅ¿]|?¶ø«kñË]ý¤õ_ÚçKø­>øyᯄͭø/ãþ£iã x^ëáUÏÃ;¨t-+ÂÞ1ð'‹<#6¹¡k8Ÿb |øÇ¬|Ôþ2üløÍñsÄð¶á"ñoÅ7ø9aýµÿ {Âß±÷‚µ´h?¾|%ðÍŸü#¾ýˆþižþÈÑ´ÝŸoñ½çˆ¿á#Ô5­2ïAû^Š9¥®»Ý½ºï÷õKMd_qò÷ÀÙoJýž³4¯ü_øÙã‡Þ ðMŸÃ‚ß |k¯ø6/‡?~i¿ØÖÚW‚|%¦øÀ~Öþ!ÿchžð†´þÑ^ øÝñoÃú‡nàÐþ!i÷>,ÞüAòè¿àž?¡ðŸíiàåñ?Ŧ~Ù? ¾(|%øŸ;k^7ú‡>-|iý±¾;xŽ÷Àr‹}/[²ñwí¹ñ[NÑ.|Ckâ‹ oxáí¥þ›©jzW‰5}åEò×]ìߪwOï×ÍêõâOö!ð´¿Úÿð‹|eøÙðûìð~‘¡ÇõåsË¿ùèï¾ûëëw»m‡Å÷ìwâoü9ñ¯€<[ûd~Ô>.»ø‹öMƾ.ñn‡û ø£ûá…¾…âÝïàåßÁý{öOÔ?f(¼â)|m¯j~5×í>Ûü[ñæÝÂþ5ø›¯ü>ð„¼¢biÿðO‚Þðæ¹à‡>'ø£ðÏá^©¢|›Kø_á­kÂzׇ<%ñwög°ø¢þÏ_´G‡õÿˆ¾ ñ×Ä›¯Š? ¼9û5ü ðö•áŸøïÄß|[aðþ ߉ß¼u¯x›Çωþò¢Žyw·]]­²éenÝ,Åÿ±Íßü"¾)¶ýª¿j;ã¿…ÿá?ÓÏí#ý¡ð_ø«x7âwü+Cã/‡_ð¯¼eðÄß³ƒ¼ªKðOàÅ÷Ø~~ÏÞÕ`×~ÂU°¾+ø—ñ¿[ø£‰ãÿø'Áoˆÿ²ÇÀÿÙ\ñ?Å_†ß¾jß |­éZׄàñÆ¥áÍgö>ø¿û]^ø—R»ðMöƒy­Çð¯ãWŠuø.t¿ hÖ ñÃÃú¬šl¾µÔ|)ªýåEòÓ[[k$­¿–Ú»-•Ý‚Ëúþ¼—Ü|óâŸÙÃÞ%ø™ã‹6¾:ø£àïxãDý•¼5®OàØxzðçì™ñËâ7Ço x~cÐçÔΉñ7Sø§ã‡¿´«½JîÃÆŸ µ|'§Aị½SWÔ~†¢ŠM·¿õ¢_’@QE (¢€ (¢€ (¢€ (¢€ (¢€ üÿ‚úÿÉ+ýžÿì x¿ÿQËýü¯À?ø/¯ü’¿ÙïþÊ‹ÿõ±®Œ/ûÅ?ûÿH‘3ø_ËóGôIâÿù ZدàýBü?\½u/ÿµ§ýŠþÿÔ/ÃõËÖ3øåþ)~lqÙz/È(¢Š‘…Q@Q@/xsö´øsâxOáÖ›¢øØ|Añ'ÆÏŽ_u_ϦèCÆ_¿áCi^%×|Añgâg† ñ%Æ·á‚~.Ñ-þë¼ysc?öþ•ûTþÊ:…î•£Ú|qðÔËÛ|:ý¥g/ŒV®ü%øýðO⎉â/j Ñ?k/Ø£Mýš|;âÛnøËÀÿ¼a¥|nðWÇ/‰ú†‚aðí¦¡ÿ ·ÃédMXžÇƶºïÄ+ögøuá/ÜéZ'Âo†7v¾_â/Ù‡ö°ñÇÇ-öË×<5û<øwãíoà¼ýŸt¯Ž|Kð«Æ^øSðÏöôøguªø—öŽ»ýšü1âïëzÍ¿ü Å:üÒÿfoØYÍð;Ãú4ž%>0j:¿Â9`ÖŽÎÝ×ÄÕÒצ¶oEVßÄ…¯õòë寯Èý'›â_ÛøŸâ,þ?ðL¼ÿ ×ü&~:›ÅZ^ ðü*íW]о&ÂOâw¿]@ÿ…u­ø_ĺ?Ž¿µo­?áÕ|;®éþ þÏ»ÒumþCðÏüsöOñ?Çè~ Z||ýžN™ã…ß¼yð'ÇÖß´ÃkÛÚľ.þѵ‡¿ tȵ$·ñ®·à/| Ó´I¼®ø¢þ÷Ä~?²ð½Ö‰¡êzT_ât_Ù_âe×ìCâï‚ÿþ|.ñ×ÅOþÐß?hwð†¿iߎ_~èÞ#øûvøËö½ð*xö¢ømðƒHøßáíoáCëþÕô¯xoዬøãÁðifÏFÐuIõ›_/¼ýˆj¯|ýµü=ñcã/‚~&ü\ýª?àžZ_ìµ£ø×^{='û#â4>)ý¾õí?Oñ­ß¼3«x'Àýª>ü;´ø£á…×~&ÿÂâ߈—Á‡Z†¯cá)…{×—ÚåZ­®½åkßK·{+mvÛ‰®4þ—Oëµµý Ô?i_ÙËIñ—Ä_‡Z¯Çï‚zgăþ ¾ø—ñkÀº‡Å_ÙxËáwÃ3JÑõÝKÇÿ|1s¯E­ø'Á:~‰â/ëÞ*ñ-Ž™¡ZiZî¨O¦§e4øŸh|=ø»û?üµMÄž.øÕñE|®ix²ÂÏÄ ü9¨üý©>5ø[â«áxìõNÿDñ~§û,øÇÀ>[³áë Nþ?êzv·}qà}SB½üòø­ÿñøÓñŸÀþ,ýš5Ïü.ðgÁþ(ÿÁ@>4ø;ã~•­x³Æu¿þÞ?ÿm]x#Ä¿³íß‚|á èŸ n?n?ßAã}/öñÿÄ~ x~)< àWø±¨·ÂŽ'ö€ý€?kÛ;âOŽücñ‘?gŸ€ZgŽ~h¤ƒáŸÅŸ‰?´-þ“áÈ?dÿø+'ÀSÆéŠgÿÙÂßQÖíü]ÿøy¨Øx!®¬,5xÆww9Ó59t=#Pj4úÏK;úí’³wÖ\ºµ¢—™¯k=<ôÒÿªùh~†üý´~ ~Ó~1|0øãß…ß<#ðƒáwÀŸj?¾üVðŸÄß^xã7‹?h?]ü=½_>©¦hz߃4Ï‚:G‰.ZÞ_ê–tÑ.‰£[é¶·þ ùçÂ_ðWoسÅßðÍ~'ÿ…ßðOÁ_ÿh¿‚>&ÂÅø—ñãáGƒÿáX|Fømÿ ·¨Ã8øþÇþMSÃ:wÆÉ|3ûKnø«Áßð&»àßø@ïáþÇ×ôýcûcGö¿€ÿhßøhߎÿþ?ø7àŸÃÏøXÿf¯ƒÞð—Áï:øÙÿ$OÇ_µOuïx‹^ñ¯ìûû>ÿdÿkÃAhÚf‘¤iš7ˆ?ä_Ôï/5;o´ÚZW—~Ë_²—ÆŸƒþ#ý‘-|w/Âæðìsû!ühýt sÂ^1ñf¹â?ŠÞÕoÿaÈþüZÖ<-¬ü6ð¶™ðÛ[ñ™û5xúïÇß ¬¼cñÃÀúŸƒôï|Løo©kZ§‡KSNWè•’’ß‘ßTšožÛiå`×OǧUÑù\û_Uøáð[Bø«á¯:çÅÿ…Ú7Æÿh“ø—Áßõ_øONø«âÏZÃâ ‹¯xkáåÞ­‹µÝÚßÂ~)ž}WKÒ.¬!‡Ã^ –IÕ4mE­±~~Ò¿³—íÿ ü(ßþ9ÿÂ!ý‘ÿ oü)ø›ÿ¿ü$ÚØ?ð‘¯kØŸÛØšÏöGöŸÙ¿´¿²5?±ùß`»ò¿!¿gŸø%Å/„W?t?‚|w¢hßðÂþ<ø…âˆkÛ¾ ð_ÄoØëà?ì·ðµ¼?áØ×ÀrxàGí ý§â¿ÙSEñ¯~:|`ñoõß ê¾:Юü_ð_â‰ð'DðGÄßµÿf¯Ù/â7Á¿øw¿ü$úׂoÿá“¿àž^5ý’þ"ÿ`êZí×ö×ÄoÿÃ}‡ZðWö‡†ô¿íÅÿ Ó㯵êZïü#šêkxKÉðÜÿoÖ?°S4´“nÛékÙ·¢»Õ¥›M7}SH.ûZ}û½»Xõ?¶Áo…ZÝÇÃíÇ¿ ¾ üoѾ(þÌ^ñÀ+â·„í~*ø+ß´íð/àE¯Ä/ø&Ñõßi'†-þÃÄÐÝxF[Ñ“Åzv·ñƒþ ðágÀkâ°ñ¿ÂëÿŠ“~È~2ý°~~Ìú¯Ç?„Vß~&øÂß¼]ñv  ø«â^™âMûLðG‰,'ø“ðÁ¾'ü?è^ ñ‡5¿h:CÞOå÷²×íž×¾Xéÿî>ÛþÚþý°ü1ñrï⎬þ#klÿ‚›x+ö÷ñ×ý{à¤?oü3áÏøG<3ñá焼]§üvñWü&ºï…¼­kðŸãív×á·Ïý€?k…¿±ÇØÇCOÙçÅšgí#û!é? x²Ãß|AeÂ-CSø§'Ä:Q§m^Òþd¹£¦¾]_/Åöop×M=zÛm?=z«ßþ?ü9ø?ð“ö„øÃªêð•蟳‚|qã_‹^ð-æ…®øËBÿ„á…·ÆKÂSi:Ιi¦xÛSø}©øÄZƒâ]O@ûn•⟠jóÝÙèšÝ–§'Ïÿ‚Ž~Éþ'øýÁKOŸ³ÉÓøúÛöøm{aûBøâ×ÅßÚ#àÖ¯ð÷á.™¤–þ5ÖüâïZv‘©7ƒµß_ÞøÇö^ºÑ4=OJ€ëæ©û"xSý™?jØÆèš_ÂŒ_ ¾1øá?Ä«›ÿ|UðŒß´^‘ñˆüZÒ¦mßã·àÿx¶_i¿µZüUøçНl¾;K«|_𯋿hïþ_ñGöZý£~;ø7öï¾ñžŸðOá×ÄÚßþ åá¿Ù/Ã^ðÇÅ|Gðo„¾#x_Uý»aƒZ×|uªüøg­Ýø'RÑ?i/†z„Ú–ŸðéµÝ?U´ñÖŽžÔ-4ë¾1”¡gwÖÉÞÚ7;[üM®–³Õ¦?ë¿nº^‡Þ:WÇ‚ÚïÅ_ü Ðþ/ü.Ö~7ø/DƒÄ¾1ø7¥xÿÂzÅ_ ørêÜZøƒÄ¿-5i¼]¡h—6þ,ð´ðjº¦‘ka4>%ðü±ÎɬéÍrk> xzÿÆ^¿ñáv‡©ü=Ñ<[â_iÚÇü'¦_øÞðç€|cã¿xÂÒ÷V‚ãÃ:'‚¼#ñWáŠ|[ªëQÙXxoß<®k3Ùiž0ðõÖ£ùçð[ö ñÃ_Únßâ¹k¢xƒÀÞý¡¿ißÚ[ÁÞ?ÕjÚãÄ÷òøö–Õþ:j×^ð×ìEw«h?²Á oÁ¶?´WŠ|?ƽ/Ä_/üoáÏ xƒY“áG„¼sñ×Qñ7¿‹°6«ñJý¼omÁ:_¿iÏÚ‡öOøýá/è^"ñ—ÿxƒÁ¿²7ƒdGÁÿ¼uñ—À:Nñ3ágöÏÄÏ€4ß xûáåÏõ_‚zWÅ©¾-x/FÖ¼lúÇ‚nNX^ÜÎÖZé»’O®Ü¾õž½·½¿/Nú~>GÐËûhüÔ|qðÊ×ÂÞ=ø]âÿ‚¿gŸÚ“ö‡ºý¤Z|3ø/ñS[øc«xßÇþ£ì;ûEx{Àñ7…¬´K{|QñÇÄ‹t¯ø)üÀ÷úÿ‹5?‡ÿ~|;ø—â_ø(¬:?Œÿj_ŠÚßÃß|×<=Â)>ü&ø-«øsâ÷‡ì5M óÅß³7„~!üW®Zz{Î÷i«Ç»ë{]­^îšµÌ_¯õ·Ü·ß_-Ô-Wã‡Ám ⯆¾ëŸþhßüi¢Oâ_|Õ|á=;⯋<9kˆ..¼Aᯇ—z´>.×tKk ø¦yõ]/Hº°† x‚Y'Tѵ¶>üpø-ñ÷×¾1øñáwƯéºÝφµü%ñÿ„þ#ørÃÄvvn©wáûÝsÁÚ¶³¦Zëvºf³¤j7:T÷QßÁaªé·rÀ¶÷Ö²KøÙà_ø&'í¦|›ölµñÿ‚~|>ñÿìQ¡~Ï´Ï< ñcÇ_4¯Ú?â6Ÿûøcö8ÑüK7ìÝñOàÏ€ôO?ð«õ½'FñN…ñàgÇ¿ k¿|ð§ÃøÛð÷Y»ñއ«ü ûËö5ýš¼_ðgľ"|Aðž‰á|HÑ>x,ØÁû_þ×·ˆî|9ð¶ÿâf¹£Ýê¿¿kð¾§¥h‡Søµâ(|?ð¯Á ü?aákø¼KâígâĈz†þÌ£¥w¥¶ï­õêµIsY%Íg+!_ª·ôºíùy^ÚíþÉ¿·¿ìåûWüøwñÃ_> Øë~"ðOÀ=_âgí ã_|mªüøûAÛhúƒ>xêûOºÓ.ôÏju9þxcLñáwÆ>2ÓæÑ4¯Å­³èðvÞ6ý²¿g/‡_>~ξ3ø¥àŸüAø£ÿ Ö“á¯íøHÒ—â7‚ng¯#à÷ö¯Š,u±ñ³Çz'í5ðÏÆ¾éú&¡®ø£Á³ê Hí-%ðÿöÿæ¿‚¿`ÚÃWøEû(xSâz~Ï> ñwì'û<üøKð¦ÛÀ~$üHðçíâ?ƒß¿a/Ú ¯~!k¾!ýŸþj³ö‰âOö ðçÖçÃ~ý¡ïô«:ߋΛ¨Ü|'°ðÅ_løGû0þÖý©†øiÿý‹>$þÎ^ý©¿á¤~ øá¿áÒ¶>%üaøQáoøB¾#x«À¶áIøÿPÿ„ÞÿÃ>øÙáÏ ßý«Å_ ÿá!¼×t±ßÏåÜiöÿnlÿ†•ýœ¿áqÿÃ:ÿÂþø'ÿ ÿD+þ¯áqÿÈ­ÿ Ïü“íïøM¿äIÿŠÃþ@Ÿò+ÅAÿ Ÿôºø7áoìÃûX|ðçì™uàï ~Ï?ü]ûþÏ>?ý‰¼-¡ø—ã‡ÄŸ‡^ø¹ð[IJ¤ší âé³_ÄOáoÅÔÿe»[MWörÓ¼ñKÂz}‡çÔm?i}ZãÂé~+Äø=ÿêøðoörÕþXøóÁ>*ûíCÿËø§áÝÅ®øsûkáÏì;à_ø&ׂ¼uq¯h0éþ"ÿ„kÆÞ1ÿ†4ø‹©øKÂú~³â½ ?øHüg¬xÞÃízíÞ‚8Ó×Þ²¾š§ö­w§HÚOnkÙ4Ó~ªßÒÿƒ÷¤þ<øáð[ágˆþø;âÅÿ…ß<]ño[o |)ð·<á?xâoˆÖÿDÒÛÃÿt?êÚv§ãMmu?øsNm+Ãvº•ø¿ñ‰h`­„sâÿÃJþÎ_ð¸ÿáá|ÿ†‚ÿ¢ÿ WÀ¿ð¸ÿäVÿ„çþIö÷ü&ßò$ÿÅaÿ Où¿â ÿOú]|ÿ$ý?i?گß|ð»^Ñ5ßüEýž|]ð‡Að·‰kÚ?öNðçˆ'°ñÖ—¯|Uñ‡û;x Çúgí{¢xïLñGtíWàçÇ›]#Àþ°ø;=§†$Õ­þ<|JLùãÄ? j¯ÚÀÿ²Â=;þ=á7íCûnþÖ:oíÿÆË¯øVú¯íwðCöâ×ü!ªÂñSöwð¯ì§ñOþÆÛOÁþ ÿ„gá·í‡ñcÆ^8ÿ„?ûwÄŸ |¢?Å7àÈ¡óki6®¬¬®ŸWkÚ.6»zÆërï¶—_¥ÿ7ªÓMOÔ;OÛCö^Öü- üBðWÇŸ‚þj~6ñouïŠÞ øãðOSøsà=WÀ¿ør÷Æ?~/ü.øÕá7[¹ð֣⟄¾?ðŸÄXxŽÎÃMÕ.ü?{®x;VÖtË]n×LÖtFçJžê;ø,5]6îXÞúÖI>%ÿÁ*?j‹OñŸQeø]ðâãâÂæø{ èÞ3ýºlÛZü_¯ìeÿZýŸ[Ô>*þÑt¿øcD›Ç?·›¤ð‡­5/i^ðÄÏØ+ø»U·ðÿŠ?k¼5ð—Äz7íañ«ãµÕî‰'„~#þÏ?³Â]N‚æý¼Gkâ?‚¿k¯ø¦÷U´“M‹LƒD¿Ó>>ø:ÜÚj÷×÷Wúo‰bÔtÝ*ÞÏKºÖTã½Ù]Úû®ëGk¦ìÞ©ÛÝÛPWëÿ·Ý×FywÃOø(§ìYñ'örðíMÿ #ðOÀ?ü}ÿ®“ý±ñ/ã ÂñÅ^°ø‹ÿ OÇú‡ü&÷þðçÆÏxfÿí^*øoÿ 滣ýŽþ.ãO·ûsýyªø—Úÿ†´½sÄ&©øÓ[ŸÃ^Óµ]VÃN¿ñgˆí|9âÝxÃV—sÃq®ëvÞðŸŠ|S>•¥Çu‡<5â rHLѵ«oËß…¿³íað#ß²e׃¼5û<üCñwìoû<øÿö&ð¶‡â_Ž~xsâçÁoX~Ê’h´'ˆ]xÃ^»ñ,:ö»­Û|TðŸŠ~Ï¥ivWðü@ð׈<$ â=QÓm¸ŸÛ'ö³ðçìà‡þ"×.>iÚŸÅ_Š6¿ |­üuøÃaû?ü ÐüFßþ!üSº½ø­ñšï¾?¸ð‰uá…ž)Ѽ/s¥ü>ñ¥ÿˆ¾&j¾ð\šn‘¦x—Qñw†þ ðüãö“àŸü7Ã3Ô¾ è_m/Ù{ãÂÏ i^ñ׎¼YàßüFøÁûPÿÁP¾=Ao®ø»UøIà­oRðNƒ¢~Ûß ô)¼Q§ø=wPÕ|3ã©“Á––^}¯âïÙÛþgÀo‹^ñ¦ÿ„?ö¡ñÇ¯ŠšwÅ?>&é_ÙZ¿ì½û\ü´Ò¾ x'⋼{àŸ†ø{¦ü2ðoü!ºD¶Ê“Âà¿Qjiîä•ý’kU²mÛ®«ÏC[}ÚvÚÿv¿ä{f½ûJþÎ^мkâü~ø'áÏ ü6û'ü,_kß| £è^ûÄoü±ÿ„×WÔ5ë}?Âßlø¹à|,´þݸ°ûGÄox·Áïñ7‡52ÌÕÿi_ÙËÃÿð§¿·¾?|Ñ?á¡ÿ³?á@küUð.›ÿ ÏûoþßìoøSßlסÿ…›ý¯ÿ ‡„¿³?á þÛûü%û'›ý·¦}«óËÅðNï¿ÁÍJðÅŸ‚GÄÏ ÁCkÛ‡UÒüñŸãìµÿ “þÿŠjß øGOñoí9ðÃ#ãgÃÏxKàŸíàT×¼G¡xGÇ?Ûßð¨->Í5ÇÃ=y`»íÛ¯§e믕ö?W¬?k¯Ù?UñÄÏi´÷ìó©x»à®‰ã?üdðµ‡Æ¯†×ž#øKáχé¥üCñÄÍßIJj~Ñ<©Éã=WÅ6ºU‡…ïäKMr{†XÉâ¿Ú—à¶…û2|Gý®ü-ã-ãÁ†ÿ ¾(|ZºñOÁ_xO⇋<9ð‹Hñ&©ã/ëšwˆaðŽ»­Û\xO\Ð"¶“Ķ6øŽÊm+TÔ´Ç·»’Ûàߌ²íCûEÞ|{‡ãƒðM®õxCÄ?³÷ÄÿþÒß<;âá‡ÀïÚ«á'Çæ‰á |ð†·û,ÂíÑ>èþÑ_´ŸÃ/_¾-Ú|c‹Ãþ8Ñ4?|>øKû>ü$ø5ê ýˆu»ßØïö¾ýŸ‰ñJñ>«¥|dý¡¿lKÿßüFø áŸÙçOñ/‰~5~Ó~&Ðþ$ünÖô¿x3CÖ`‚?üðæ‡áÈ|?ð«KðýÍÇ„5‹^?\°I7'ºººjÚ_U¯WÓKYêÐúù[úòþ¼ŽÛÃ?ðQÏÙ?Äÿ¡ø)iñóöy:gŒ>|ñçÀŸ[~Ð? ¯l?h_üZø»ûD|Õþü%Ó"Ô’ßÆºß€¼]ð+NÒ5&ðv»â‹ûßøþËÂ÷Z&‡©éPê+ã‡Ámw⯉~èþk?ü¢Aâ_üÒ¼á=G⯄ü9u‡î-|Aâ_‡–š´Þ.дK›xZx5]SHµ°šø~XçdÖtæ¹ø;âìµûFüwðoíß}ã=?àŸÃ¯ˆ?µ¿üËò_†¼1áŠ>:øàß |Fð¾«ûvõ®øëUø#ðÏ[»ðN¥¢~Ò_ õ µ-?áÓkº~«iã­<7¨Zh×|c‰ð[ö ñÃ_Únßâ¹k¢xƒÀÞý¡¿ißÚ[ÁÞ?ÕjÚãÄ÷òøö–Õþ:j×^ð×ìEw«h?²Á oÁ¶?´WŠ|?ƽ/Ä_/üoáÏ xƒY“áG„¼sñ×Qñ7ÂãNÏVš[]=yS½ôº¾Ž×wÕh¬-­;t×Ïòó>òÿ†•ýœ¿áqÿÃ:ÿÂþø'ÿ ÿD+þ¯áqÿÈ­ÿ Ïü“íïøM¿äIÿŠÃþ@Ÿò+ÅAÿ ŸôºÄñíuû'øOÀð|MñOí=û<økáµÖ·á¯ ZüBñƯ†Ú7î|GãO‡úWÅŸx~j>%¶ÐfÖüYð¯]Ðþ&xkJŽý¯õ߇úΕã-. ¯j6š”ßÿÂŽý£~(~жÿáðOƒ¿gßÿÁCcßÚ;þ7мg㫈ÚÇü3_Áø'oÅ솟¿áMŸüCðO‹|mû?¤¿ø™ÿ á¿øDuÛÿÜÿÂâ=[áü"ž2Ûø;û|iý–>~ÀãàƒÿgŸ|Iý•¿d?þÌ?>ê¾<ñgÀÿ…^)ñÆ)¿fÏüXøÉᯈþøñ[^¾Öçø©û;ßjsèÚçÁ­&ÿâLß¼Aãïx»Ã#ðìÚW,4¼µi;]u‹–û-m=VïK »íúvï¿WuÚÇÚþ!ýª¾ø7Ä4?üYø]à]3ö|Ñ>j¿|c㋟´|;¿øË®Úx#Ã^>µ¼ñêø»áÆ·ªÛ麩£Ïñ#ÂÞðç,<{á(þxƒÆšœ~,Ó¼+·«þÒ¿³—‡ÿáOo|~ø'¢ÃCÿf€þ×ø«à]7þŸößü#¿Øßð§¾Ù¯Cÿ 7û_þ fÂý·öÿøJ<;öO7ûoLûWã]Çü›âeÏ‹<á\ë~+Ó?b_Ùçþ ÇðkÃ^%Õ~#ürýŠ,?hˆ³·Áoø(7Âψzw†¾6ü(øÉð·DÒ¼ûh|3ø›?~i?üâÙxƒöf¿ñÞ§iñ~÷áÏ׿³§ìŸñ¿öXñö“â߇žø'â-â¿‚|௎^×~>þÐÚ¿°ÿi_Ú¯ö‡ñ‹| ñâw~?|Aý­|mâ;¿ÛÆ–ž'×¾*kß³Ÿü%þ2øsm-< ¢|^?~ 7%¤›vZh“Ñ=ÛºkUgð§Ìƒ^ÖÛÏ·oš¿K_cëÏÙkö¥ø-ûc|ðoÇo>2ÑøWß´o‹5ßÙçUðçÅ?þÕÿôWÆß5?Ù£Ã|­é¾ýˆh8µè_³Gì·sðjÆÛijXøóÆÚ·Â_Qøÿñý“~(ë¾!Öüoà_j¶ž(ÿ…¯6§àKO´&ðr Wã§ÃŸˆŸ ~0øŸAøáߊzOÁ xÛâGƒ¾.|S_øëÂþÑüe«x§â/~!\k­ñĺ¿Š.ýGâ_ì­ð7â߈õßxÏÂÚØñο¢|7ðûøûÁÿ¾&|4øáû„·ÿo| ?€|wðÛÆ>ñwÃ=nÂßã߯ë%øw¬ø_Ä~/ð?Ä¿ü>ñŽ«¯øVŸÃÇ[Ò²´e{jßó]Yé%¥¯u£¾ÖÝ-{úziÿï>(ø5ñç⯆ÿbÝ;â?Ä›ínO‰:§ü£Æß|ImᯈøÎXxóþ /â?Ù¼xÃþ=øŸð»Q¸ñ'ÂïøGÄ0xJ‰þøÄz­ À³|ñžñ/ø þ =ñWÄ¿ ¿eïüGø'¢| ¸ý¯4OÙ7ãGÁø9ñòŠ÷íð«âoíaûüø¡|^¸øû-ø#LðV·m¦~ÙŸ ã“ÃÞÐþ"ÍãOGñWKÐ>+üñvàˆzèo†¿eo¾øEáÿz_…µ»¯†Þø£¥|jÓ´ïüFø™ãOÜüUѾ?AûQÚxãļcãwâ'‹5¹¾=[GñU—Å>*Öa×oÚ}'\‡QðåÕÖ6$Ÿ±‡ìÕ.…ðÃOðÛv‰û2ø'Á?¾YÂcãáÿOƒ~|Fýžþ-x7GûHñH»ñ'ö?ÄÙ[à/ˆ?´<]>¿ªêð‚ej·×Ú'Š6ø»ÿòø…ûBi3è_®u/ülñ–‘mûøámÏŽ¼5á_Ù‰žøÙñ§âgí%}á/ |$ýt‰ºW‡õ_Íàÿøö“ñ·Œ>é_<ºçþ 5ãˆÿ¾j Ὴ?õ? k~-ýŸ¾1ü*Óuˆðæ¥ãþÚ¿ðDßøSÅVÚ7í3û8|1ñö¹¢iŸÿlk>öûâìÉð§âØx»â׆> ø§Ãgˆ¼ûA꿨pþÂ?²Üikðû[“LÓ4OxkÁÚu×ÅoŒ7¶ |9ãÏüñׇþZ^xú{€z'‚|]û:|ñOÁ-+à´~°ýüGð÷E×>ÁðßS“Qº¾Äð÷üÇöMðæ«ˆ#ð/¼Gâh|mkñü[ñãßí ñWÆWþ2°ñ—ì³ãí?XÖ´±‡Ã>#ñžâ6¥J÷åw»Ñ%k6ô·7go–‚´´×·áoòyò÷‹?à¤þi^%5ý•ü®kw_<9û:ü!Ö>übý ?ho†~1Ùx7ã—Ä_Ž^ÕuþÃ'ã¼ð¡¼)ð;QÑ|]âƒ_³‡Çÿ EñoÄOð£Äz߃5¿…?´-÷ÁßPø³ûT|iÖb|øaðç[øIñ“Å_´7ì«ðÑ>üeÒüYð_ûvü#ýž|u¡j7?~‰>ø]ñkÚ¯ˆÿá ø‘âO€ø«kð«Æžø”>x7ÇÆèÞ£á/ø'¿ìÃà‡6Ÿ <5¦|l´ðN‰ÿWü ¶—Ÿµ¯ím­ë¿¿á_hZ÷„¼1ÿ ƺïÇ KÆß³Ç•àŸxáþ³ÿ 7Ä?¿á+øs­êüYý·à›¹´öÏøg_ƒŸð§?áBÂÿÏþ>þÁÿ Šá)ÿ„§þŸøOÿágÂËþÛÿ…™ÿ ³þgü]¿ø^¿ð—ÿÂãÿ…ÇÿƒþŸøYŸñURr§tÔ^’Mßgº³“ßµþih={ô~·Ó˦½MÏ/‡_´ïíðßãgíUñkáï‚uσÿ¶¿ìð;Äú'íã¯xËàÏÄoÚ/ö^ÿ‚}øJðÁφž%ø០xÇàž—ñßãf›â­Æw¿þ k·ZW‹¾&øþÛàÝÇŒm ð¯Ž=Cö&ÿ‚‚k¶7ˆâTýœ>(ü9ømãO…ÑühøGñ?Wð?í §xsSð=Ýÿ…‹¡|Jñſٳà—½/âŠtè>!𯇿gOŠßµgÃýrÃÃ_¯íþ+¯‡<3àŸ|Nú‹Oý•¾éÞ×<,<-­êšg‰þ(üøÕâk¯üFø™âßø“â¯ìéað;NøCãxÇÅ>1Ö<]­k~·ý›þ IªË©ë—PøâÿÂSêž>‡ÄúŸŠ¼ewâá/ì­ð7àˆï|SðßÂÚÞ™©É¢\øSÃÖº÷Äo‰ž<ðçÂÿÞßéºïÃñ÷Œ|OáÙëáuíÆá8ï>ü Ðþü?»°ðÃ}.ãÃriŸ ü iáäåM§î¾kE&¶Ò)6×3Õ»ü­Öá­÷Ó_ÒÝ=OŠ5Ïø)gˆþxsÆ_¾4|Ñ4?Ù×Mø£ûqü%ð?‰¾üd¿øñ§Äž#ý†¬?j¯ø¾÷Å|Wðƒá'¼¢xãÀß±ÇÅÍCÃw:GÇŸߨø³UøqáSMMÄ&ñ—‚6þÿÁBü}©ü9ø¯ñCâïìµão…Þøÿ÷¾2ø²Mö•ðÏ…´Ï€ú¶…ñóž§íQû#þÉ?~-øÛàßSÅ>xgáÄÚgÁÏi>$øUãߌîôïÙãSúóPý”?ggÚƒµß…ú'ˆ¼#áïŠ?þ2Øø[Ä·z߉<9uñö°øã¥ünÔ|A¡ë𦡦x¯Døƒ¦~Ò?ôíWÁ^(µÖ<kaã‰í4iÖú/†ãѱ<%û~Ïþû$øwÆÞ/Ô-¼mà¯˯|]ø×ñ¿ãŸŠu}wá—öõßÂëx·ã?Äoø›Åž øSâoë¿>|4ñ>­«ü9øeñŽýþ6x¾ø¹ ·a/JÏÝw¾š½®ÿ½¿-»«ôî+õÕ——{ýç‰ü*øáûUxÇöÓñgÃ|3ðOƒþØ~Ëß³ÏÅ?ø+Ä_¬î¾#|×~&üWýº4ãL´ðWÂxgâ¼wោ? ´ŸŒ>šG߃ï‡õxþxß㞟5ß‹|cÛxÇöÃÿ„Gã¹ðo‡kø¹uñ³öuð7¯ Â]äÂÐø9ñ·ÂÞ ñ¯‰¾:ÿo'†.|3à¯øVžø ûpêð¬|G¬¯Š|eÿ ö=>ïIÔ>;|"´Ö=GÁÿ²·À߇¾#ðŠ|ámoÁzŸÃMXð§…­|+ñâfáÆð>£âÝGCøqâŸi~1µðþ|,¸ñç‹ãýŸ¾ø÷Cñ/ÃÿÙ²Ã_¿Òÿgÿ ü4Ó;HýBÿá׃u?ˆÞøµ}£ùÿ|àŸü:ðLj?´5X¿³<ñG]øiâ_hÿÙPßG¢^ÿnëþ^ÿhjmÞ«¦Â;ömûO´ÕµØ54Ü/~]9mm½å³~óºv³Õ;7»Wf¿—é~‹ÏúÑ~Cø'þ õâŸx?‰ÚGìQñ³VðO¿ážõ¿‚Wv7Æ?ÿÂmáoÚ öøð+Ã>ñWŽhÏÙãö}ýŸtŸš¶“ûAxwÇ>ðÁ´ÁÏÂñ.ÓSý¢¼à'¼mÛ~Ò¿ðPŸˆß ,þ?x+Ä_|ðŸÄß ÿe®5=gã®»àOˆßþ#xöU×¾?ø¡` ?Š±ßŠþþÖ~ ø_¨.‘á/üGÔîôÝwᆻ¦ø—^øÃû1YøfÏÁ7Å¿¯4OØGö[Ð&Y,¾kwVößÃÝkÂF½ñ[ãŠ|9𢅟|ñ¯ÀþøáxûWðçìÿð»Jø“ð«áf¹yðà–—à…^!°øaðßÂÞ%ðn¯áøSBÒ6þ%þÆß³ÿÆMwÇú÷Å_øÛâü,Ÿø«À÷†|Uñ¯ã~±ðçEмqðæÿá‹oþ|*»øŒÿ þ øÛ^øg­x›ÁWÿþxKÀÿŸBñ¯íÅIÿ Ư¯W5+üÚõmý›}«5ý~ã[-uÒÿ¯N¿Õþ0ÿÁK+k¿þê¿~3뿼%à«‹ø·áÀ[xÚÛÄßþ$Gâ ÉðÞM JФðF­¤øßÄ:‡ˆuíÁ¸ž+ý„e¿_üGºñgÃío[Ó>)èŸ4_x"ïâ·Æð«N›ã_‡§ñGâç‰=GƳ¯ÁÏx§\ñ¯‹|ý­âoÿÃ:ÿlêðx¦ÃíŸðÉßüAñÿàú™­Ùéöÿð€ü\ñN½âßôKH?á)ûöá#ðÍ­žn›§k(´û릫§5Ÿ»{íwk[¡¯WýY~·ëÔöº(¢³QEQEQEQEQEQEQEQEQEQEQEWàü×þI_ì÷ÿeÅÿúŽX×ïå~ÿÁ}ä•þÏöP<_ÿ¨åtaÞ)ÿÛÿúD‰ŸÂþ_š?¢OÿÈZÓþÅÿêáúåë¨ñü…­?ìWð?þ¡~®^±ŸÇ/ñKócŽËÑ~AETŒ(¢Š(¢Š(¯ÈŒðP/þ ñ7Ä߇«ð³Á?nôÛ_Dý<ñ?Ãíûoj·_mýuÿÛz_ˆšïìŸðWáwÁÿŠ:ïÛ~Gð÷ÀSxGÀõŸøCüeã_xÛ[ñ>¥ðûà¼3|YýB¿ø‹àÝ3â7…~ßkGÄx'Çÿ|1áÿìýV_í?ü.×~xkÇZÇö¬62h–_ØZ߯‡V_Ùú†¥iªêð‘}§G±Ô-4v}2œ$­uºº¶ºZ÷ººÛ}nº¥¥Ë¯Æß3¶¢¾Cð§íÝû-øâÿáů„þ ëzÞ™ñODø_­x_ÆöŸ ~0…Ztßü9á¿|"ðÄ?Œ3ø/…~(üJÐ|oðöïÁþ,øÇÁ?|C7Äß…zv›àÙõ?Š?ìüIê>ý¢¾|Mÿ…-ÿGŒ?¶ÿá¡þ ê¿´WÁïø§üS¦ÿÂaðsDÿ…Mý§ãø›è–ðý—þŸÂÏø§üQý‰â™¿á(ÿGÑ%þÄñöBq’Þ-z§æÿ$ßÉ…×uýï¼öº+àß?¶÷„ü4—Âõ¿ø»Bý¡¿f/ƒþ(ñ«ðoãLßVÃâ—í›ð/ö`ø»¢økãäоx³âÃôøŸâmø[⇈=ñ7‹<ð§ÄÞ'оüUø—á'WøsðËãú|ñ׊¼?ñrŸCâà  <mðëIø+®ÂÚñ7~6~ÅþOø?áÅ¿Šßô¯þÓŸ>xWP›ÄŸ´Ã=óào)hº®«mâÏ„~*‹Ã'ðÏÄOXøÉ(IÚÑzù;}ý—P?Ch¯ÍÚçöû›ö{¿ý®>ø{À:Þ£ñ'àoì©~× ¼Ssà?о:øU­x|9ûZêxCâÖ¹à_ ÛøGá6‰¦\~ÌÖSi·Þ;ø±à»ÿ‹xÊ÷Â>X|Gá§“Rõý½¿gùn|#»ÅŸð€Új>6Õ|=ã‹OÚ7Á?ÿeÿx'ÂÚwÀ_bøˆÞøÕðoÃÚø&ûDýŸ>!}â?áZ|Ô4¯|^þÄø¯¬|Aøc7Ã’²|®Ï]¯¥“¿Üþû­Ð]wþ¿¦¾óíz+⌵Ͷ™û~Õ´ÿÁïxÚ oà7Á?Ž^:ðî‰ñÿà7ÇßÚ~2ø]ð£Sø…¤C©øã„~üA×<{w™iy®øv;M+SƳ£i'ƒ[Òu5Ó;o~Ù?³ÿµß øKLñ¼9ãoøÚßÀøñOà§Æÿ‚¿¯5Ûÿ‡?þ+é÷þ0ü9ð/´¯ø‡Á?þ0Ýø_â^¯ Ø|9ñN»ðËÆþ ð?xsSðõ¹Ë+^ÏFÓÑéd›¿mPºî}CE~^üUÿ‚£ü0ð«ûSé^ð'¾%Ã9~Ëß>?iºÞ…á/‹qx7Åž2ø1ã/Û_áïů„^:ñå— sÁ?¿áñ·ì]âO xcÇßüA•ñ[Uñ$Öÿ ôoÂ=lÞ'úUýºg ÃÃZˆµ¯Š>·ñ‰?ŠõHüOû7þÒ~¿øQàx#|×|Uá߉~øiñ‡Çÿ|1ðâ·¼'¨x Ç÷þøiãë³h_¼â‹ ¿ øÅZ¾‘åÞ ý·¼&ß´íû?üP[ð­ÇÃÚáçÁÿ†0´ø7ñ¥~j6?fÏÙ¯âg‡4_ˆ´1ðέðÿ|Uñgã¿à?ø7Yñï‚üGâYµ/…~Ñ|#ªø»Æ^¹ñ¡É-}×t®Õít¯oV]Ñ÷•âžý¢¾|Mÿ…-ÿGŒ?¶ÿá¡þ ê¿´WÁïø§üS¦ÿÂaðsDÿ…Mý§ãø›è–ðý—þŸÂÏø§üQý‰â™¿á(ÿGÑ%þÄñöG‰Íÿý“mu_éW¾:ñ¶›ÿo¼uà_ëz¯ÀOÚJðm…ÏÂk¿~2øÙü Õu_ÛüZøàßøNüÞ \²{FOäûµù¦½S ®ëúÿ‡_yö½ò…m„Zî·¤ø:kÝo]ñηñGâ—ÈôƒŸ >?|k°ðœ?ÿh‰_³¶—âO‹Ú÷…¾ Z[üÑ%\ñ?ÿoÿ†ßÿdÿ„µN©ðãö†ðÖ™ñ7Dðê> ð×ì·ûX|Sñ‡üYãO†ÚOÄk»?éžøÞ.øð»J·Ô¤Ò4¯ÚÂÞ o‚Þ/¿‚ }ŇSÔmt’ù%ü¯Gmº»ýû?¸.¿¯—ù£ï*+à߆_·O¯xÓö€Ó¼cñ+áu—¼ñE­~xÓڌڇ|$ø·ñßâ6«¥xwû1*ð¶û>øËÆß 4ŸøúÿâO|ñ3]ñ—€m¾|\èZ?ü*O‰CÂÞ]oûü6Ô~4ü øS¥ü8ý¡†™ñËDøÒúwˆüKû-þÖñ†üYð—ÅŸ³†í,üAðÃÆ?´h¿ ¼EoûHGªþÐþ)_ üð=ÿƒgðö¹âɵ=Zèxxä“û/kìöI¿É0ºþ¾_æ¾óï*+åïŠ>#YüF¸ø'û<|3ðOÅ‹žðO…þ)üD´ø§ñ[]øðçÀŸ|w®øßÂ_î.Ô/>h?6õÚ3Â~ñÃ?‡?lõ¿|Iñþ‰àÆ»½Ñ< ñ§Æ³Î‹ãß¿†tï¯íUuð‹Âíµ½wÇÐü=Ñ<}«|8øñ[×<¦i¿l¼GñÁÞÕ+í¾¶Z»ov–©[[µ¶ } E|Qà_ø(wì›ñÁ³xûAñ×´Ï Íà â/…'ñ÷ÀOÚáV«ñgÁ¾'Õ|1áÿ ë|5ñCágƒüMûEÿoø›ÇŸ ü%£iÿ4ˆš®§ã/Š¿¼gc7‰¾,ü8Ò¼O·ªþÝ?³†aá­GÄZ×Å Ûø‡DŸÅz¤~'ý›ÿi? ßü(ð<#ñ…£øûGézçÂK OöYø]¨ê~ñÖ‡ñCö’´øUðÿÄ>ð?޼c¡x“Qð‚¼S®i’Ë.ß ß¶ÁuÜúòŠü×ñ/í©ã þÉ^ ý¢õOè—ZŸ†¿o-WökÔt x#â&¹øU£ÁTgý‰nõ?øÁ×úï¼YñFoƒvÒkÚV—ák}fmwâ«@úµ2ê×À³{dÿ·Oìá‡4­~ k⎭©êºßˆ<>~øsöoý¤üQûCèWþ°ðÖ«âIümû1xsá&©ûE|?Ñ4]Ç_ µ­Gľ:ø_áß[hŸ¾ k/ª3ãà ¯’ìß¼ã¢oUkþbºï¾¿yõåùåáø(à ¼MñæëŸð™xgÃ<9á€Iû9|1ø·ûFøËâoÂMWöAý‘¿h}Oâ¢øOà.ñwÄÞ#ðN›âoÚN *óâLJü5¥|0Ò4¯|!ðþ«©Eâohž0úÃ_µìóãM_Ãú/ƒ¾(hž,¸ñgÅ+à×…¯ü5i­ë¾ñ/Ä wödƒöÈÐôïø·KÒî¼-¬èšÏìÕukñCJñ®¬ÜøQ°¹ƒ@´ñÞ.š?°á%ö^×½­kþ×°Ï¡¨®'á§Ä_ü`øsà‹_µøH¾|QðO…~"øÄÙú®“ý»àßhV%ðƱý•®ØéšÞ™ý§¢jv7¿ÙúÆ›§ê¶^Ùµ K¸¦‚?þ;ÁBþüð?í ®hÓë~6ñwÀ¯…ß¼o¦iW~ø™à¯…_¼qû>ü?ñŸ<øà ¼ñROx!.>üF°ðêQ“vI·³VÛ׷̼¨¯Í{oø(ïÃm;ã÷‹üãm3âƒ~ Û~Ï?>0xsÆÞ'ý”k ßø.ÿÇk_‡?õ¯Ú?Sñ'Âû=3öpø]áÍ3à?„|E¡øËãÞð‡Ã‹áɼuñ_k¾³:·†½³Å·wì·à{ÿˆö¾,øƒ­èšgÂÍ↵âÝü)øÂ~j3|ðç‰0Áà~ü^ø£ð×AðGÄ+¿|øMã|Uðôß ¾*iÚ—ƒ`Ôþ|@³ðÛpšû2Úû?/.—׳Ð.»Ÿ^Q_/i_¶ìÕ­Û=î•ñ'íºüXY¬õ8|ãïì­oJý¨¾ðOÆÿˆüSñþ1þÕŸÔ>øÊoiþ ð¿Ÿã/øè'†-ôOˆ¾Ó~vß¶÷ìëÿ Cáoƒ_ îüý½áGãbÂÈñoü$Ùð®~k_>1ø+ãgüHcÖü?¨x¿þßÂ?x×ö:ÿ‰¢ž)ø[ÿ -ÿ á/+Äßô›»oþ3þÝÿ´ßÁ¿üfð÷‰¾èšŽou½?Âÿ²·ìçqðcW× xÛöÎÑ/þ)xsÂ>ñ¶§ñ_à/…¾6hן7Q›qwÒ´uKhékY4›I½UÞ¼É2[K¾é½û®÷×ËMÔ/þƾ#ñOÅ_jö?´M'à‡Å¯Úàí[ñcáåßÃ+ýWâ­ÿÆŸÙ®€ ðî/‡Ÿ!ø™¤øGÁ? µ Ù_àŒ¾4ðw‰>üHñf¯ ø©‡ñ'ÂïãoÜ|0Äýœb߈ß>#| Ôõïþ ñÇÂ?Ùoö^ñïì—ðÁGÁ-wÁ­~ø¯]ý›®4mkãÅ;ÏŽ>5ðÏÄoh^ý™¼%¤jz—‚¾|мA®ëÞ"ñ§†ü;§¶™á{ø[ûT~Û|eáßÙ³UÐ~ üý ¡ÿ†€ñ?мsñÀ~ø«¥Màß‚šWìq©ØèZÇì×û?~Ý:ÿ…1ãoÿÃiø~}>þÙ?Õaðo«ˆ“ø'öˆð¶—ð«èoØWøÓâOünñÄÿ‰Z'<#7íyûoxkáN’þñe·ÄxsÀ·í5à–ðÿŒþ#x‡â—Œ4Ïè–Zf‡áÍáž•á¿‡ß ,>xBÓü`ñe½­†§c/ž1w”m¢I$îšqM4º¤Õï{+;h‡£}o¿§ÂÿÈÄ»ý‹~#>¯|1±øßà›Ùöãö¡ð—íiá ]ü×o>1èÿ¬ÿo~Þ~:Ñuï‹üq°ðOˆüâ?X|Eð7„´Ý?àW…ußx[Å> »Öx¯Ç| ý“?lX¾#üQÕÿkÚ+âìÏðÿãÁ]Wâ‡Ä sáSkþ&x_µ¿ìûá¯ÙJûÄ—>ø_­þž²øÅâIî¼á ~Ðß ¦ý”|A¯þÓŸ¾"ØØ~ÕIñOoþ ñ/â7Ç_ÙÏà‡Ä^?ñ³ülðçì½ð@“àö½â­vÿì?|kà_ êþý¦|k©Þ_Éÿ ãoÚÛþ×øiñ›UmcBøWöþÌ^‡ÃŸ>~Øž"ø±Ož1“æVRIûªî]ímUÒ÷¿ð-£·¥×¦Ÿð ¿?ðKß|Cñ‚/ü9¨~Ï> ðÂ-Æþøð/öµý”ì?jï‚ß|9ñnÿÀÚ·Äÿø­ño᧦hšf§ðƒá‚þÏzPñ °ýž<'¬ürøSá¸5ÿƒ~/øðóögÛºÿ‚yøË@þÍð7Â¿Žž ðÇÀOãgìcñëâOƒüUû:éZŸÄmoÆ_±Ÿü2æá½+á§‹~üJøðcàÿ‚|eàïÙá>—á7ökñ&•áMwSñþ§áÓ<)«x?À>òïƒÿk 'Âv´ø¥ð»ÄŸí)ÿ(ýºÿg>$ø‘ð·âO¯þxsáÆŸø(WÄý]þ%ˆ¿hŸÜ|{Ñ.|#û6éß ~xOÁ×ÿ³}‡Á¯jÚ]^|HÓ<‡5Ï¡¿á­>#Ã"ÂÖþÅðOü-Ïøjøbßí/ìÝwþÏü,oøoÏøwÇü.ÿøAá$ÿ„›þŸøI¿âøÂ’ÿ…™ý»ý…ÿ‡þö‡ü]ºMÔV\ÉÚ\«E»“×UüÑw{Ý7Õ6+=ºëø/ÒßÕÍ¿Úsö5ñÇkÿÚO|ZÑ>韵O쇮þÈŸ-|Ò¾(ü(‡á…àßÙ×à޾0üKÖþüð‰§iþ"Ñ>Xüf»ðn‘âKÆßÃ?‡Ú·†<àŒMSö&øÓ∟´‹¿hO…×_µ‡„õ¿…óü9ñW‡?g/h_³Î•áÏ…žý«þi:W¾ê´¿‰þ$øÇ[Ô¼9ûo~Ðrê> пiX nÛàÕõ·†¡±ð´Ÿ‹^)ãߎÿ¶'‚?kþÌúOÄ/Ùæçâ§Äýöfðÿˆ~.ê¿>=_ü*±°ñg„?à¯ßoçð×ìÔß¶rižÖÓLý‘>øFéŸañ‰&ÕüA«xÛUñNƒ¡|)ðGÃBÇþ ñ¦O„_ðPoÝxcátž.ýŠÿd?‰Ÿô;˜4_AáÏ|iø+ñûþ [û>x§]Õt)þ×søcàÝÿ„/üIáÏ?lïŽÞ½ýœ%Õ~/øÞßàV·à~Ûÿ4írçâm¯í7aãxgÀ¶–o5;=WñkñGö&øÓñŠÃâ$~3ý¡>[ê´Çìócû)~×w~ýœ¼Y¥Øx·à¶ƒâ?7^—öpÓµ_Ú_Ä>(ÛxGö’ø™¡ëž1ø›ª~ÔÖ|Ggà_Ø|6ðþ™ ëþñ‡ð[öÌý©>%~Óvú.¹ðGDðÿìµâïÚöýš|âýVïà÷†/âñìÓ«ütðÍ׋|5ã‹¿Ú÷^ø©ñ¿[ñ–½û:ø¦iþ i°×Â{ÿxsÄþ ñ\Ÿü[àÏZŠþ/müBýº~#|2ý ~#|:ñ?Ã+áŸÂ_žÕ¾"øêk±Ùø?ö,ñGÁÙãB±øÙâ?ê.°ðÿ‡þÍû\|sñÖ±¨|H×ltß…þÊ¿±¯íèC%ÇÄÏÙãX‡W´æµâångnWÖÖÚ×M%o%mki{imü­ú~7ê{_…cÏøFáCÿÅÄûoü)?Û_ö³ý°ÿäQû7ü$ßðÔ_ðÚñnÿäg¸þÆÿ„þÿþFïø›ÂMÿ óþEÿÂ[ÿÏâØ·â7ˆþ1üZÖï¾7ø&/Ù÷ã'íCû<þÖž'øciðK]OŒv¿fŸ ~Ì6žÑt޳|qŸÁ6¾ Õ¼mû'|:ñ‹tÝCöuÕ5Ûÿ k^5ð~âMVÔt/øsàßÙSö†ý±>=þØ?-xᇇ>xOöIðsx#â߈~.üYÓ>/ë~*Ó?hÿN¾7ðÞ‘ðRÃB¿øu­Ê| ¬ÛøþÂ×áøÔãwÌœ¬´²Ù¹MÙÚ×N.I§~Íl-6Õ}ûû©~k™õçìû:ÿ¦ñOí'ñSYðü ¾&øÓñ³â?ö„¿á ÿ„ŸþƒžøÇñƒÆ¾ÿ‰õ¦·©iú×ü.o‹Ÿ¾?þØ¿éšv•⟇ðÔÿðÏzŸŸáŸþ ´ÓÕü?ñ.î/ÚwÂôAáéÞøE¥x:OV|9¦hZÔ´Í YvüOÿ&ý±îo<]§ü,ø àŸÿÃ1ø'â'‹i/nø[á‡>5ÿ…aûU~سíßü&ÿlÿÙëþÁ>.ÿ†%ñ¿Ä_øMn4ÛŸþ¦…ñ#ì>(ÐuÏøSjŸ_,ù®¥ßVôI®h-e¾Í^ï]úI—]ž–·{{¯eÛO»Cê-+þ Ѫé?¼ã?â·‚|9iá_Ÿ~2k¾7ðÂ/|<ýª¼W¥|Iý±þ5~ØPþÏ÷ÿ´_†>?Úhš·ì½>·ñGGðGÄ¿?~ |IðoÄ‹=Å^7±·ð/ÄøÄñ5ïø&߈õŸ‚ß> jŸgŸŠ^ý˜´KÏ…ŸüûK~Éÿþ ]|°ðŸÃ ü<Ö¾.|¸ý¢<¦x÷ö¼øu¦|8“HÐi¿ k¿ ¼'ká?Š?ü/¡þÏ^·ø†×š7Ô?¾-|iÒkÙ§àà /…ÑxGâÂïÚâ×ÅoxòÛÅ—þ#ðï‡>üIý“ô%²ø{¤x{RÒôÍs[ñž™ñ»Ä~koj:%‡…oõ}â¸Ô¼SoðÖÿà§Æ/Èy¿lÏÚ“ö”ø]ð+Wø×ðGDøgð¯ö…ø£ÿÜý¥¾ÝÜ]üðLjôŸÃÊ?àŸ×V>Ò´ï þ׿þ$þк$žøÓ¡Kâz¿ÀŸÙÃÁ7ú† ñG‹-{ã–‡àï†ä}¤¬ù’»M_–ú¹-·ø»z«–ŽßçÓ—þõsê‡_ðHxàWÄŸ„¿5»m{ã'Âï…ß³ïň^ð‡‡&ø…û<øOö*ø ûxÃáÏŠ|/¨ø£Åf«­3á/Œ~4þÏß.îæÖÿgŠ¿oì4ë_|+×~?|8ý¢ýGá‡ì}ñ?öaЮbø¢þËÞøƒñoãgìÓcãÍOöUý‘>~É?<-ðá7ÄiüñgPñÇ…õ_üfø£ã|Hø]uñ;உ¬ZxãÆvÚŠ|uðšo|:ø'ikñ§ãÅçÏ¿à£ÿµ'Œ>ÚüOøÃðkDø[áÚ#öyÑ~/~É/q ü¾ñŸ>*øãàgÃo€¿ ´¯øöôñŽiÝÆ^9ý¦þøoÄükáÏø'gü †ÅXþÛül†ƒE×íûûfé_ þ j¿þèŸ-ÿfÏŠ?¼%ûWþÑž%øÿ<9ð«Ãžøû>üyð±âØóöuý·|sñ'LÑð/ÀïˆÂøWðÛÄ_µßè_­~-vß¿lÏÚ“âWí7o¢ëŸtOþË^.ý¡¿ißÙ§ÁÞ/Õnþxbþ/þÍ:¿ÇO Ýx·Ã^8»ý¯uõ¿kß³¯ŠfŸà¦—û |'¿ðG‡ø• |dú†ÃàíñáÆÏ|wø'­|\ø_ÿ +áÝõß„¿f¯xGáψÿg/ŒšïÀüEðm§‚µÚ§Ç>&Ð~6|ðÄž øÑ7Ä{À¾е{I×gßj§ëÖ/|ý©m?ßbËOíÙ{á?ÅÏÚïö^ñWí‡ÿ ü*ïŠÿ>øáÏ4/Ù3Dÿ…wÿü.ï‚^&Öümñ#Äß´·ü,ïøK¿á9Ót/ƒÚÿ +þú…Ÿü4Vµ‰àø(wÆŸŠ_³¯ÇÛ‡CðÇÂï üý›¿g'â׌g]WEñgŠþ*üMñ»ÿøøAûsÚÙxkö“´ñ·„¼#ðÏD°¸ø÷áo†SÛjŸ³Äûûø~xƒÆêZ{ü@Ó¼3ððj£Ý§k­“ݸZöûNêûivÒ³o'ÿ¤þZW>òø§ð?â5çÄkŸ³ÇÄÏü'ø¹â/ø_ágÄK¿Š uߎ|wðçÀšïü[ðþÞãÁ^ø½ð?ÄÞñ·Ãï|Gø…'…üQᯉn…¨è_üo¤üFðGÄBÏáF½ðŸä?‹?ðM¿übøÓà/~1ø‹û<øƒÅÚ?ÅÙWãŠ|oâÿÙ"ÿÆ|+â?ÙÃÅŸüY®|;ý’¾0ꟴBj³ìóñ?SøOu«Üü$Ôt/7þñgÆ/Žþ(»ñ׋n>#Ig¤ñ:Oí[ÿ·ðçü%âÏÙßDÓþ$øO[øAâ-_Æð|<øO®øá·À߈6$ñGÄíWöø)ÿ ý¡>*|]Ñ<)¯|³ð¯‡Ï‚?i_ |Lø±ñ?Ä¿ð§¾ü@ñìÝ®ø/ã'¨ü$ý¯~-øçãgì÷¦ø›^ðN‰û>ü~ðOîgïˆÚìÓñ>ûJý·u]oö^¹ý ¼Sã‡_,~?ëðÅØ~F¿scû=þÕß u¿xŸÁ¿õ‹ß‡?þ$êÚߊ­~ N7jQÑ=U¤Ú²{¤ÛÓdÝÒM´¢›מ­hî»wí§•û·©{ÿÛûGÃØ×À°|gò5¿ØÃö^ðwÀÿxŽo‡_hÒ¼]ñáwÅ¿ØSã—Ã?‰ž'ðÒxêÚî/ÙüAý†<5޾é^'´×|]àß뺇þ/x[Òtÿ\b|hÿ‚k_þÑ>8о+|m׿d?‰?5…Þø/ñOÅ~;ýƒ¼9ñ>ÃGð?‚¾ |Wñ„ußÙ;Ã?¾5üNÓ?gÏŠ#LøÉâ[ø‡â›~Ôÿüoâ? |2ñ ï‹ ÂÚßü]ú…á¯øsÆžðÿŒ|â Åžñf‰¥x—ÂÞ)ðÖ«a®øsľ×l Õ4?x\ÒçºÓ5YÓ.­u+UÓ®®l5 ˜.í'šÞhämºi5×fú.®ï§WÓÓ² /Ë¿K[òGÁ¾%ý|Guû3øƒàgƒ¾-hš‹®kÍWö»ð·Äü2¿ñg‡4oÍÿ ŸöûÐü!⇺_ÄÏê~%Ñ4íM­~ê·ÚwÄo ßë6Ïâ»EЮ.cÐ-~yøÿ¶ÿ…«®¯Åï‰%ý—¾0~ÐZ×¾#ø·Æ§ãïìgÿ “öU›þ?ßًáEÝßÃÏÙ¿^ý ,|màOh~ ý޾ Ùè¾5Õ¿hßù7š÷Çf“A}'âW„´_…_¯PªMj›mÞÊ÷•¯­¶vZmä_uº¾›—¾ÿ‚yøËàŸŽ®¾*~Îÿ<áˆ6ÿnðŸ‡Å?Ù×JñwÃ/á&¿û9~Ÿ|K᫆?~%~Ì%¯¥Öÿ`O†>4ð¿ˆüwðëᇃ´/xßáæð6âÑ|'â/ âiÿðIß…^ðæ¹¡ü8ñη jz'ìóðCáÀOø—J›Å¾#øIñËàe‡ÀëOþÓ^ µ´ñ…ü#ñK[Õn?bÿø'橪ü)Ô|-ᯆbÿöPž;m.-3ãÏÆ=;Ä«´Qí'üÝ–Ëeª[kóîû±Ù_/òGËß~xËáWŒ¼Mð×ú?ü!_²?‚³ÁÙ»ÀwÚ†•­j°ê¿ ´¯ˆMñÆZ~¶/¼Gãkÿßø'Ä~èçâwŠ“ÆSxËàÏÄ]\x7Mðþ±¢|Bø«ò÷Žÿà›ðµ4¯ü!ñÿÆ3öbÔñ_‚t[OÛãÅçÃo 音—ƒ5Ýæ/„kâøÚ/xÈ|TýB¢’œ“m;7kè·J×Öú½n÷»}ÂËúþ¼‘ùåã?Ø·â7ÅŸþ×v?¾7ø'Pøƒû\~Å/ìyâü:ø%®øÁ¾ÿ„wUý°fÒ¾"hþñ/ljZÞ¡ö¦ÓtýCÂ7¿bûV«ðîûX¶ñ=…§ Ð¼óÏ¿à~ñEÿí*š6­û<øJßãÆ‰ûbM¦|R´ý¾êÿµÆ•ãÛ7ßt¯KñöÕ¼i6§ã¯…Þ Ôþ9xÒøá÷~|@ðÇ¿†Þ"øÕ®øGBøkñköNŠj¤ÖÎß%m’ÚÖÙ$_×õä|Qñ×öø9ûEüc´ø—ñFÇû{Ã:Á?üø‰àµx§Kÿ„óûkÂß¾|?ñü%^ñ~‡¨x_þÇÂ?ÚsöÒðöF‡`Ÿð˜ÃKÂU­êqx›àß‹ýåëßø%æ«…tÚoÄÏ‚~+øƒâ/üƒÆ8øÕû6øËÆÛ> ¤ÿyÕd_Ù?]øUá¯:çìÃû<ë?<­Ïâ_|Õ~ ü6Ô~xOÄwSx‚âëÄøyw᩼#¡kw7,ñLóêº^‘k4Þ%ñ²NϬê-sêÃO‡>ñ—޾"økÀ ðïÄŠ?ðŒÂÌñÖ…á] Iñ—Ä_øBt©´/Âuâ}>Âß[ñwü":%Äú?†?á ¾Ô?°4©æÓô¯²ZJð·mE}ß^¯«»ûÚMù <»Jøð[Bø«â_ŽÚÂ…Ú7ÆÿhxkÆ?4¯xONø«âÏZÃáû{_ø—⦓‹µÝÚßÂ~‚ +TÕî¬!‡Ã^Š84m9m¶ô†Ÿ|+ÿWü#ðO‡?á[x&ïá§Ã¯ì èZ?ü ?oÿáûw€<ýŸaoÿ·‚o?áð/Úü+¡}ƒB¸ÿ„+Â^uƒÿÂ9£ý¶¢‹¾ï¶ý6·Ý )âÙ«örñÇü-?øM~üñ‡ü/?øB?ávÂQð«À¾ ÿ…Ãÿ Ëìÿð­ÿáiÿkh7ð°á_}’ÓþøKµÿáû-¿öØ<˜öö¿ð­>ÿ¹ÿ…=ÿ‚áQÿÂÿ Óþgü"ºü+ŸøW?Ø_ð‹ÿÂÿGØ?áÿ„'þŸø§áþÌþÂþÂÿ‰GØ?³ÿÑë¶¢‹¾ïïò·ä’ô@|ómû"þÉöv t»OÙ‡öyµÓ>kz—‰~éÖß~AaðWÄzψì¼c«øƒá-¤^[‡Þ«âí7NñN¥ªø:=þûÄvZåÔòêv°]GêŸ >Ø`ý‡À ³ÿ„WÆÞ-ø—á²xWB·ÿ„sâ7¿á5ÿ„ëÇú“`ŸØþ6ñ¯ü,Ÿˆ¿ð–ø«Oû>»â?øO¼ký±yÿ N»öþÚŠ.Þí½ú¾·¿ßwVŠx#öjýœ¾Â/ÿ ßàÁ?‡ßðƒýŸþ¯øB>xŸð‡ý“þŸÙ?áþÁÐl?áû/ü/?ŸgþÉû'“ÿ ‡âŸ—·þ‹µñ>!~È¿²Å» Kø­û0þÏ?tÏ k~<ñ/‡4ïˆ_~xÒÃÃþ#ø§â6ñÄÿh–ž$ðÖ¥o¥kü\ÍâŸj¶Áâÿ³kž!ŸQÔɺ?CQG4¯{»÷»¿ßóx]¥|ø-¡|Uñ/ÇmáÂíã4H<5㌚W€<'§|Uñg‡-aðý½¯‡üKñÓI‡ÅÚî‰moá? A•ªj÷VÃá¯Å š6œ¶Ûz÷ÃO‡>*ÿ„×þx'Äð²|iðÓâ/ö÷…t-cþï‡6ð–ý‡À5þа¸ÿ„§Á6ðŸxëìž×~ß¡[ÿÂkâß&Á?á#Ö>ÙÛQEßwÛ~‹eò˼Að?à·‹/àÕøák¨øƒÀÖoí¾4ø/ÚWƒ¼ñ~ ½GI¹¸‡â„ü#¡h~ð×ã‘|Y¡xsFÒ´=/VµÓ4ëKXvô†Ÿ|+ÿWü#ðO‡?á[x&ïá§Ã¯ì èZ?ü ?oÿáûw€<ýŸaoÿ·‚o?áð/Úü+¡}ƒB¸ÿ„+Â^uƒÿÂ9£ý¶¢‹¾ïïË øðZ×â«ñf×áÂëoŠšî·áÿëŸ ð„áø¬øÂ~ñ/Ã/ xƒUñ”zJøQÖü5ðÛÆž1ø{áýVïRšÿFð?‹2›â/ƒ<ã­COÐmîü]ãoüA¸ŸÇ^ñWˆ&Ô5ÝÆSÍâ}*þÓ[•ï›Úè¢ï»ûüïùëêŠi³Wìåáÿø\?Ø?~ èŸðÐÿÚð¿ÿ²>xMÿ…çý·ÿ öÏü.±è0ÿÂÍþ×ÿ„ÃÅ¿Úðšÿmý¿þ}¯ÍþÛÔþÕÄè?°ÿìYá_øB¿áýeï¶ñµßÄ¿‡_Ø?>hÿð€üF¿ÿ„KíÞ?ðWö„­ÿáñµçü >û_Š´/°k·ð…xKοøG4±ýCEÒþg÷¾Öü´ôÐ.Ò¾üо*ø—㶇ðƒávñ¿Æš$ñÆM+ÀÓ¾*ø³Ã–°ø~Þ×Ãþ%ø‡i¤ÃâíwD¶·ðŸ… ƒJÕ5{«aðׇâŽMN[o/ð¯ìkû9xWö€ø—ûS­ðOˆÿh/‰>6°ñ¯ü-ßx#ÀºÇÄoýƒà‡€>ÿÂ%ðÓÇßð‹ÛøÛÂÞ ¼ðO€~Õ ÿÂCöwƾ?Ÿíi¤øûÏê(æzêõ\¯^½4Zâž5ýš¿g/‰?|%ð{â/À‚~>øGàìøA~x×áW|SðçÁ_ð‹hW~ðÇü"^×tÿ øsþÏ ßßxwAþÇÓ,ÿ±ô+˽#Oû>Ÿq5»íj¿þ k¿|5ñÛ\øAð»Yøßའx;ã&«à ê?|'á˨|Aouáÿ |C»Òfñv…¢\Ûø³Å0O¥iz½­„Ðø—ÄI&³¨­Ï¨ÑEßw׫ë¿ß׸/ÃþÅŸð®áOà þËßð¨ÿá6ÿ…—ÿ ³þÂøW?𱿰¿áÿ„ÿþøD¿áÿ„ÛþŸø§á*þÌþÝþÂÿ‰GÛÿ³ÿÑëÔ4¯ÿ´/о%øí¡ü ø]£|oñ¦‰†¼cñ“Jð„ô,ðå¬>·µðÿ‰~!Úi0ø»]Ñ-­ü'áh ÒµM^êÂ|5áø£SFÓ–ÛÔh£š]ß^¯®ÿ}•ýÄð׆¼9à¿xÁÞðþ‰á?øODÒ¼5áo xkJ°Ð¼9á¯hViz‡ü?¡épZéš6‰£i–¶ºv•¥iÖ¶Öu…´–Co q®ÝR¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯À?ø/¯ü’¿ÙïþÊ‹ÿõ±¯ßÊüÿ‚úÿÉ+ýžÿì x¿ÿQËèÂÿ¼Sÿ·ÿô‰?…ü¿4Dž/ÿµ§ýŠþÿÔ/ÃõË×Qâÿù ZدàýBü?\½c?Ž_â—æÇ—¢ü‚Š(©QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWàü×þI_ì÷ÿeÅÿúŽX×ïå~ÿÁ}ä•þÏöP<_ÿ¨åtaÞ)ÿÛÿúD‰ŸÂþ_š?¢OÿÈZÓþÅÿêáúåë¨ñü…­?ìWð?þ¡~®^±ŸÇ/ñKócŽËÑ~AETŒ(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠüÙý›f߆Ÿ¾x—â‡ÅþÔ~&ñ·‰¿j?ÛÿJ¿¿Ò¿oÿø(7Ãm ËBømÿý©¾ø þðÂ?Ú›Àü)áÿ |;ð„ü3¤iðž“g ž“’G-̳Ï'»ÿÃ~οóÓö¯ÿÅšÿÁSú6(ýˆäÝdÿ³¯ÿ‚šÿëÓmŠú¾·©Rq›IÙ+YYv^D¤¬Ÿ['»ßOòGÊðÄ_³¯üôý«ÿñf¿ðTßþŠ?ሿg_ùéûWÿâÍà©¿ýõ}x§í+ÿ þËã÷ü3¯üœü)?Š¿ð¢¿äVÿ’Çÿ.½ÿ ÇþGŸø¢ävþÄÿ‘Ãþ)oú?âSöº…V£is%wkµ/]6—oëOòGÿÃ~οóÓö¯ÿÅšÿÁSú6(ÿ†"ýç§í_ÿ‹5ÿ‚¦ÿôlWâÿí—ÿ «ÿ ÍûAüÿá ÿ„›þ{öØÿ†ýÿ„ íŸð±¿áTà þÒßÙ_ðÝ¿ð–ÿÅyÿ Cÿ Qÿ ƒûþcþ3Oûwþ?û7þ)Ÿøl*ýxý?æ¢ÿÂÙÿ“×ÿŠGþ«ûCþæøVð¤|ßù²ù?á–¿²¿ê¨ÿÂêÿŒ×ÿ†º­%*Š<ÜïÑÂ*KU«ZÙk¿œ›D’íþZrõù/¹Gü1ìëÿ=?jÿüY¯ü7ÿ£bøb/Ù×þz~Õÿø³_ø*oÿFÅ}_Egíj7áò—oëOòGÊðÄ_³¯üôý«ÿñf¿ðTßþŠø?þ á®ø‚Óöûÿ‚¤|%‹Æ5…ß "ý“­~øâOǯ¿¬<&§qûLèþ'½ðÞ¹ûC|Pø±ã6ëÆMá TñBÅâ_±Þê6VËmie¦Xizm‡ìý~%Á=¿å'ŸðX_úïû$êCû`V‘”§J·3½£´Z^¤WEØV´£o?É’?|nõyômÂ1ØÙh?éº ÝíÔ·¾ðæ©sqsÿ _‰¬Ä²ÝêšUåÓmµ³µÍå¤p D^s—ÿ ~­ÿ>žÿÂÁü £Äò ð?ýŠ÷úšx¾¹zÊR’i)I.Xh›_eeÛúþ’ûŽ£þý[þ}.þØþ+ø³àω?¼¢|ø‰â? |Tý±¾%þÕŸ >%øá“ø?ÅŸ>9ü7ñÿŒü7©xCYqs’Òs½ì’mÛo‰Ýr§}·³ì+.Ëþßð>ä~ÝÿÂ_«ϧ…ÿð‡ð_ÿ((ÿ„¿VÿŸO ÿáà¿þPWó}û&þÑÿ´÷íoñEøÿ¶ßög†|ÿ ö¿Ž²_‹?dŸÚ/þü+/ Á/%xÓUý¼| ðöãX[ÛþÈÿ¼d|1¤iz>¤]øªoŒŸ4HõíRÓCÓôäÖu-?HŠ]?F¸Õ¾ÚÚ®¥®G¢ý€x‡]þÑú’¾!Ô¿å$^ ÿ³!ø—ÿ«ãá5”Ÿ:mµìäìÛzé® ôÛMWæ·¨¢ŠÈaEPEPEPEPEPEP_€ð__ù%³ßý”ÿê9c_¿•øÿõÿ’Wû=ÿÙ@ñþ£–5Ñ…ÿx§ÿoÿé& ù~hþ‰<_ÿ!kOûüÿ¨_‡ë—®£Åÿò´ÿ±_Àÿú…ø~¹zÆ¿Å/ÍŽ;/EùQR0¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(ð#áoüGöý–¼5ã_€_¾0E¦|QøyûWÿÁE"ñLJmm-ÖO _ø§þ Gû^xçCÓoeÖ5 nn¯|â x‰fÒÖÿN[=rÒݯ†§¥acè_ñüþ‹Dÿøáïþj+öÖŠÝÔ¥'yQ“n×j­¯em¹4%&´æÛËþõsñ+þ"ÿ‚aÿÑhŸÿü=ÿÍEñüþ‹Dÿøáïþj+öÖŠ\ôçÌ¿ðkÿäi2û¿àÿW~VüJÿˆ„à˜ôZ'ÿÀóQGüD#ÿÃÿ¢Ñ?þø{ÿšŠýµ¢Žz?óæ_ø5ÿòi2û¿àÿW~VüJÿˆ„à˜ôZ'ÿÀóQGüD#ÿÃÿ¢Ñ?þø{ÿšŠýµ¢Žz?óæ_ø5ÿòi2û¿àÿW~VüJÿˆ„à˜ôZ'ÿÀóQ^Mÿ†øáðÇöŒý»?à«~x§Nñ€ügcûêºF«§Ü[ÎcZÇíurö„vóN¶zšÏÝÚ´Ž²M “ÚÍoq7ôE¥5 ÆÜ\ÔSn§5¹d¥·*íÜVwM»Úý-º·sÁ~5þÚß²—ÁíoÃ_¾$üvð…üm¢øJ9uÏ \ê’^êúÕ|Kâ}[M¶×-t«{çѯït{Ý?Y¶Óu?²ê躦“«­±Óu]:êçÆÿáä°Ïý—ÃÿûïZÿåE}½EO57kÂw²Mª‘IÙ%t'kÛk¿QëÝ}Ïüψáä°Ïý—ÃÿûïZÿåEðò?ØgþŽKáÿý÷­ò¢¾Þ¢‹ÒþJŸø6?ü¤5î¾çþgÄ?ðò?ØgþŽKáÿý÷­ò¢øyì3ÿG%ðÿþûÖ¿ùQ_oQEé%OüþR÷_sÿ3âøyì3ÿG%ðÿþûÖ¿ùQGü<öÿ£’øÿ}ë_ü¨¯·¨¢ô¿’§þ ÿ) {¯¹ÿ™ñü<öÿ£’øÿ}ë_ü¨¯$øeñãà÷Çßø(F⃟jZÄÓi¿³ïħӭít½*Â{ïø^ÒöîËDÒ¬´k[ëË(#¿‚Âêþ ïn4øu F+ g{8õA [Éðáþ¿ ÿèÞþ á]áÏþA¢Šô>­Aêávõ~ô÷z¿´gÍ%×ð_äðÿ_…ôo?ð®ðçÿ ÑÿõøWÿF÷ñÿ ïò QõZóïÿ&Ÿÿ$òïø/òø¯Â¿ú7¿ˆøWxsÿhÿ‡úü+ÿ£{øÿ…w‡?ùŠ(ú­ù÷ÿ“Oÿ’ywüùü?×á_ýßÄü+¼9ÿÈ4Ãý~ÿѽü@ÿȧüƒE}V‡üûÿɧÿÉ<»þ üƒþëð¯þïâþÞÿä?áþ¿ ÿèÞþ á]áÏþA¢Š>«Cþ}ÿäÓÿ䃞]ÿþAÿõøWÿF÷ñÿ ïò ðÿ_…ôo?ð®ðçÿ ÑEU¡ÿ>ÿòiÿòAÏ.ÿ‚ÿ ÿ‡úü+ÿ£{øÿ…w‡?ùø¯Â¿ú7¿ˆøWxsÿh¢ªÐÿŸù4ÿù ç—ÁÃý~ÿѽü@ÿȧüƒGü?×á_ýßÄü+¼9ÿÈ4QGÕhÏ¿üšüsË¿à¿È?áþ¿ ÿèÞþ á]áÏþA£þëð¯þïâþÞÿä(£ê´?çßþM?þH9åßð_äðÿ_…ôo?ð®ðçÿ ÑÿõøWÿF÷ñÿ ïò QõZóïÿ&Ÿÿ$òïø/òø¯Â¿ú7¿ˆøWxsÿhÿ‡úü+ÿ£{øÿ…w‡?ùŠ(ú­ù÷ÿ“Oÿ’ywüùü?×á_ýßÄü+¼9ÿÈ4Ãý~ÿѽü@ÿȧüƒE}V‡üûÿɧÿÉ<»þ üƒþëð¯þïâþÞÿä?áþ¿ ÿèÞþ á]áÏþA¢Š>«Cþ}ÿäÓÿ䃞]ÿþAÿõøWÿF÷ñÿ ïò ðÿ_…ôo?ð®ðçÿ ÑEU¡ÿ>ÿòiÿòAÏ.ÿ‚ÿ ÿ‡úü+ÿ£{øÿ…w‡?ùø¯Â¿ú7¿ˆøWxsÿh¢ªÐÿŸù4ÿù ç—ÁÃý~ÿѽü@ÿȧüƒGü?×á_ýßÄü+¼9ÿÈ4QGÕhÏ¿üšüsË¿à¿È?áþ¿ ÿèÞþ á]áÏþA£þëð¯þïâþÞÿä(£ê´?çßþM?þH9åßð_äðÿ_…ôo?ð®ðçÿ ÑÿõøWÿF÷ñÿ ïò QõZóïÿ&Ÿÿ$òïø/òø¯Â¿ú7¿ˆøWxsÿhÿ‡úü+ÿ£{øÿ…w‡?ùŠ(ú­ù÷ÿ“Oÿ’ywüùü?×á_ýßÄü+¼9ÿÈ4Ãý~ÿѽü@ÿȧüƒE}V‡üûÿɧÿÉ<»þ üƒþëð¯þïâþÞÿä?áþ¿ ÿèÞþ á]áÏþA¢Š>«Cþ}ÿäÓÿ䃞]ÿþAÿõøWÿF÷ñÿ ïò ðÿ_…ôo?ð®ðçÿ ÑEU¡ÿ>ÿòiÿòAÏ.ÿ‚ÿ ÿ‡úü+ÿ£{øÿ…w‡?ùø¯Â¿ú7¿ˆøWxsÿh¢ªÐÿŸù4ÿù ç—ÁÃý~ÿѽü@ÿȧüƒGü?×á_ýßÄü+¼9ÿÈ4QGÕhÏ¿üšüsË¿à¿È?áþ¿ ÿèÞþ á]áÏþA£þëð¯þïâþÞÿä(£ê´?çßþM?þH9åßð_äðÿ_…ôo?ð®ðçÿ ×çOüWþ +à¿ÛsÁ|9áχ>(ð%÷uýdÿj§ÐôÎ Ãô]ózß´GdÏkåÍ{^Úì£þÖqú¹ï.¶]Ë`йùKãÂÎéC_-Žº0ðÌÜv.!£ËcÇ}k›s88ÃÙ[[ƒ2ž¼`õµráÏ’f67Å#DO-.ßp.ãuµZÊFZ=âO϶ö±tÔ¿µ]þ†‘Îs¢d1‰Ë:›ã9·yo}\Zõt{Œ¶mÓ\çF0Z¬Ž{r’.Û.l~+Ÿ•vÙ«V8ÜbÌg”ÏõzOÒ^? ¯ŠZ>9â×±ôÄ‘Æ'QH¿IXüó2(¨pù${ƒXÆS\N ¾²£Ãp,6§psâ"Ÿ%t,–GË[ÍàÖïR5Á—òàâ]ªÀ-ü;r”4M§¨0ÕQUaïed {a¨ß$`vW9î­eˆCeË)Ñúý¬|çÛ_ÒV?¯ŠZ>9â×±ôđƾ¢¾ÅúIǧ•‘EC‡¾G¸5¬m1%Äê ë*]ÖáX{YSˆWÓɆÔÉŒO11ÎuD6Ì% ‘âþ5…ÚC|n.%÷rxNæSbÒb51âðDL¬s]O ³o¥Œq·qwß‹_ü?—ļî­Ÿ¤|z_´8|r1Å®c©ˆ-#Œ}E|þÒñ®‹†ú¹í[5˜ #ê+&Ãkñªkë[Ph¢t¯„‰hxk ˆwŒ×^þAeL`x8‚8ø6<ÍÜóqC.û&gÊ»Ol¦Ö uê#U³h¯ù?~Ô¿´¼k¢á¾®{WÑúJÆz.êçµ]“sx`£š²—Òk†RUÇ‡Èææ‘å²µ®Î@~Ѷm~K}§Ü}·~`e>ÿiO¦¾ÿ{H 2\Þ)þV$›­Dè›ýOßµ1úHÆOþ—õsÚ¾ÿhøÇEý_ÿ*õ>çð±Dʺ¼)°V .®ªZ>V†:9Å¥ÙÅÅøÍµ/àXT‘JÆP¶?£^ÉLrjñ[w“Qãë:ø­/Gÿ'ïÚ¯öŒtl;Õÿò§¹Ým;†H[RK`:#­)Ä7_Œo«RÌÝ¥†cÓaØu 8<Ì^™Œ x€×å7¹òX8žêçÄðj|=ôÑǽï™äÝùž>=Vט»1ñÜâÃ(‰Çê|ò‹‰–½Vî7CC(г ¤§ŒÁ²Ò9„Ž[ŨýŠ/íèØ~Ãÿ*¦ëÿýÃþOÿԹе¯N¼±¹†rÏ(š·[ý¡býØå}þб~‡ì?ò¹%õoÇ×ÒreÛ­þÐqn‡ì?ò½ ßâ݃aÿ•É‘{ ãëèäË·Wáö+Ѩ6ùO±^A°ÿÊå‘O_G&]º¡»ÜW£Pl?ò½ Ýâ§ÿOA°ÿÊåȽ‘<}}™vê¼:Å:=Ãÿ)áÖ)Ñèvù\À_SÇ×ÑÉŸn›ÃœS£Ðì?ò½ ÜbgÿOB?üü®\/a<}}™véÆí±>C°ÿÊûá®%Ñè¶ù\Ð_Tà×ÑÉŸn“Ã\K˜¢ØåzðÓæ(¶ š^‡Èž>¾ŽL»tžb<ÅÁ}ðÇæ(¶+ êpké93íÑxcˆó{ônÃæ(ö+_Bpkéy2íÑ ×bÅÅzð·æhö!sÀ|KØSƒ_G&}·¼-¯æhö!}𲿙£Ø…‚ŠðkèäË·@7W^ìÒlBú7S\ìÒlBÁ Øùà×ÑÉ—mÏ k¹šMˆO +¹šMˆX‹êpkèä˶àÝ=w5I± ׄµ¼Í.Ä,0½‘85ôrgÛkÂJÞj—bÂJÞj—b0_Tà×ÑËŸm‘º:Îf—b¡º*Îj›b(^ÇÈœú92í±á_5M± ï„|Õ6Ä,¾§¾“—>Ú¼?WÍSlBõÃÕ|Õ6È,…è|‰Á¯¥ä϶¸Ç*¹ª}_xr«›§Ù–>EõN }¹öÓẮnŸdÑTŸûtû ³ œú93í¦1šžnŸdÞ¨æàÙš°œ:ú9sí¡ÂõÜ ƒ¨æàÙž¾„á×ÑÉ—mŠÔspl‡bô1IüÈ6C±gŽ>%ìq)ÇG.}®ðœþd;&ö/¼'?™ɽВ+.׸Fo2“{¡_1ýˆvMìTGȤ"œ8trçÚÞŸ7™ɽŠÈ|ùZL”%¡Ö1q\_ÍYŠ=Ñn‹ ÜÍ ¸ÅVNýî&¿{sîâËf‚xš~ÅçüŒqÂ#ãºrË)û–¤³¾Ÿ,“Ò1¥Î;ÉÔþÕ^R9(ij䪢§eT,š6ÌÀ×YÍK^ÄqGº,+tÛœ¯­Áê´šv6Hœýí̳ƒ.EœâpûT¸s¨Ù†`Ž­Ñ² "<š@inl°ñfÕ{_þW›çþ;üÖ°Ä¡s$s+ðçˆÚ^ìŒÌCG°jaõòb8tÑšxâ¡ìD3X€uØP³*$¢’:Ý R aÓæÑÚÁûQÚùÝ|ÁÄpT"ªúœÒ ö-èË»Ó.2K®5X~+-F_¬Í38ýÄ[w<¼õËÿõ\¾é±}/s8ô0¹ŸôàÀ÷²0Û›4 ¯k:ßo‘r8ˆÓãTؾ‰I¹ñ!àj9_¿? q÷¨`mýÍà s·®"Añ†­wÁý×}nOÃc7K1Uö—vÛ’Ý+ºº\cÄ¡¢|4QÃœÌøÞŒM‹ZuYÜ«ÁoÒ_ïwÿßOÝ_©Ô{àùŒü!p#u¸‹YŠUM;«@˜%KÆX §2Ü|@HÕsvÜcQùDUGÑ:âfÜæ#ú<ݶ.ÀÜK¤« ƒ=D"×â%—ò•Z‹ôUº|>ºž²š¿ Ž¢žFËó¼åsMÁ±ŽÇXk¯oé˜èqzŒÓŠš¢÷gŠ=êTËW9¥öldZ0÷xºÅÈ¿l·ælˆ¯¤âÅøå_è³tÕõÓÖUWá’TTHée~wŒÎq¹6ÛŒž%öEô¼3k'q~•ºŒ^¯ ‹ŽcUW¼9¨µ»Ô¸Ž2ãv«ˆ|‹;Ý%v¹šíæ9ªñH°×Õ¾zzfÀÊ`àýéïŽgæá×hÌ|Cp.Gæmôpâῲ,¥á›I;‹èýãý/ Ú?¸¿BÂwISˆî†«–š&“¤1`‰Âz˜ˆx2AÞh77$4JžnÓ‡ãCôKt¼7hþâú?DØ÷KÃvî/ѱڬf›Âáê¨"†¶sNEE#ås\"–L×l­¸´`ZÞ[ßÈ’î¶‚™ò¾¦˜hXé£ÎkLo|!æF†´™.ѺË@9 ‰»nóvœ8¿:þÉñÞ—†íÜAú'Çz^´qvø†ëE-U©†§ Né+a¨kíF¨xuã/Í ÔoŠÄ_ ÄN)BÚ½jf>Æ1,‘?|i‡´Æ÷´´ßV¿'ÈžnÓ‡åcôSŽýV´qz¢¬s¥áÛG÷ë뉥ÝôOÂð*º˜æ‡J}®‘ô ‰Œ²LóœÛ;Æ`µ‹®ÛÚüiæí8qrÿÙ^9Ò°í£û‰ý•ã+Ú?¸ºYÿHt3GOUJ÷ˆé§{«adLçB)j$tos.]`|]v_¨Ã±a_<ôÒÑTÑUBÖHø*2dypk®Ç9¶%½ü]`.óvœ8¿3¢Ìo¥aÛG÷¡ú.ÆÇþ«Ú?¸¿[Dóvœ8¿%þËñ¾•‡íÜ_²üo¥aûG÷ë(žnÓ‡äÃôat¬?hþâô?F8ÐÿÔÐmÜ_«¢žnÓ‡åCôgŒôš £û‰ý™ã=&ƒhþâýUÍÚpâü¯û4ÆzMÑýÅ Ü^épyf–Š·c¦‰ÐÈ7Àæ.Ò6 ôTIüÍ“'/ÌdýãRÊùQ‡=ÅÄ0¹ Èâ—Ÿìßé4;G÷WêžfÇåÿÙÆ1Òhzïî¯Côs‹ýE]ýÕúr'›´áÅùýâãÿQC×wuzþÏ1n‘E×u~–‰ælN_šg˜·H¢ë¿º­aÛÝ]mmU_#î]k‚¢Â8‰_ ¢Oå옩^_›Ñö+Ò(ºîî¯^b½"‹®îêýÌØœ8¿9ðé]wwW¨· ‹E+$lôÌpp%ÃW(,±_¢"y›‡ _¹\–)*êè^è¢Æ2°^À° •Tnçèúîî¯ÐÑHü½‘éÆ_žø Šsô}wwWßq>~®îêýó6§/ÏÆá±1ÿ~®îêô7‰ûôwwW|‰æm80p^b\ý']ÝÔð'çé:îî®õÌÚpbàü ĹêN»»«ÐÜ^"?ïRõÝÝ]Ò'™´áÅÃøˆóÔ½wwSÀÜGž¥ë;º»„SÌØp`â< Äyê^³»«èÜ~ ?ïRõÝ]²+æl80qcr€ÿ»KÖwu}ðF¿ž¦ë;º»4SËØp`ã<¯ç©ºÎruãþí7YÝÕÙ"y{ \xÜ¥pÿ»OÖ=Õ÷ÁZîvŸ¬îÅ×¢y{ ‚ÕÜí?Y݉àµo;OÖ=‹®Dòö¹1¹ŠÞrŸ¬{¯k9Ê~±ì]R'—°àÁÊø5YÎAÖ=‹ïƒUœäcغ”O/aÁ‹˜œ¬÷ ëÅônv¬܃¬{L‰åì80s^Uóubûàõ_9Xö.‘ËØp`ççêÇýÈ:DZ} WŸXö.‰ËØp`çÆUçÃöžÄà:¯>´ö.ËØp`Àà:Ÿ>´ö/C©·Ú{ê'—°àÁ‡ÀÕ|_iì_x£Ï‹í=‹mò¶18£Ï‹í=‹èÂ'ó¢ûObÚDò¶²8ý¨þÓØœ?Ú{º'•°àÁ“ÁsùÑý§±}dÃö£ûObÕDò¶30ý¨þÓØ¾ð|¾s>ÓØ´‘<­‡ î—ÎgÚ{PKç3í=‹EÊØp` (dV}¿ø^…–ãoÚ®¢y[ ´99[ö¯º$œ­ûUÄO+aÁ‚ ¥xò·í^…;Ç•ªÊ'•°àÁ_xw(Yµ8%]MCå8æ%n&G#Ö¨2yÚEœ·å—õcV8ÿû·5Pö?Å× eau¨·=W#d; Åbdq¶&åc@k@h™ÈÞEŽOñ¯‡ú“®š7G.èñ‡Æág5Ó´‚>1‘zv6‡KI+]M4b66°^À “’lÅ«‹m¢¼³ÑðÿXÕzÛ3¸¨cX@ÂwŒQ4î˜^ùˆ..9G4.¹aîÇàŽ%ô_Ô'$ÿ(ø:|1Ÿ„,gà4¯Àkðs$Ú=n“¾8œoî{Ÿckj/6Ô|—ºÙ¨÷ÁóøBúi¤i ˜Áˆ27µsmÍ·r´ðË$”µõôÆgHj7—°Úéd—!%¤´K …®³½Ñ ¼¥ÑßçGµojhïó£Ú·µN-„ŒTR[SG5$ûüSSä.ÈöOk^ï"ίܛqY¡›ăêi%\ÌÔEw× ï(¶øð O®öèjßÕu2Ű½îß°7? R¶½™†PÛÚîxÍ%ç©ðêóWKSRÇ=Ò:v]…³É$ :í¸ tÒ”´ëñ‹¬µÔº;üèö­íMþt{Vö ¡WAeM ò9áÔs™ã "ÅÆ7ÇcñZCÉ®Ë.]ÉPT¾VTÍS5 Ý4‚…Îh˜@l‘ÜV×eÐhïó£Ú·µW¨–*Yiâ–XÄ•,‰¡áÅÄ4¸ñ|@ëí9¬gr2bx-U;ñZʺ×G(‚J§±¬tÄll þùÄÜÇUÉ káØH žz™kjkj¦k#|õ²0¸µ¶cZÛ÷›Úþ6²@ÑDDP¶Dé-Ëa¨—8çò/Z;üèö­íTDŠ]þt{Vö¦Žÿ:=«{PDŠ=þ#Y- •Žž&5ò5¦ùC¯k‘«^S«´)K£É`I`¸\Õ4wùÑí[Ú‚$Rèïó£Ú·µ|tEŒ/{âkZ.I• ö aîÇàŽ%ô_Ô-Šzˆªé¢©Ù¢•‚F:Ä]¤\‰cîÇàŽ%ô_Ô$†£ßÌgá Æ9‰Táx§£lF¦JÈ©£3X×MP؃ˆ{ÚâöµÇ¯Qïƒæ3ð…çu_àÿY ÿüø•„K¡îÃÓ¸ÜÓò• OÆ7„»¨Ý63C7 ÐØ#†šGé_;¤3I#hlŒ¶]èŸ-óy-®£±­Û6öÑÿÐgÿäªû¦•°þd‘Äåe6÷Z÷°ž¨ž-|@ñk[Þ`÷¶ÿ'ÛQÜZËš¥ÃŠ“ð½i,ßþÞîƒè©? Ö’ÄÿU½Aï'ÿoàjåñÔVMº¦î{sÕØck)éæš¹µtï•і–“›XñHãÙ¿¤Jéh7=‡IM\ 5§|Ñj žÖÑLð ˜æ›fkM¯ä òH7i VŸêã«2:¦Wºg¾íkHy{ÉsHcAmü‚Ö!®Ïta1gã~ÏÈÂsÆb¡ÛnÃô»½ÈPérÅ€Ôž2ŽfwãþûWµú:ý#㤠u|-MCƒJÝïDcÛ|í–÷Ìçyƒ“ʹßÖâÎã[%Nê8&È[+ÆvÈ\ë·/%€79H¸Õ{†Éú¦¸Fî¯EÿòÔ.±/ÿiúFç¾ a_S‡ðWv?q/¢þ¡ZÜ÷Á¬+êpþªîÇàŽ%ô_Ô,ûWCQïƒæ3ð…ëäl;šŠGÖ3¡s‰ò]’£ßÌgá 2«t5õ4óÑϸé*©%/dõ0ö’MœÒHòñkV®qjN—Ðv¨fÅ):\AÚ¹ Á¿û©ÃºÔÉÁx7ÿu8wZ™UGBàÿЖ0æAª¬ /ý[×_‰áóbû“ÅðÚbÑ=] UiêlÃ,n¨.fo#­+¿»^ÆÔi±­Í»tµ0²¿sqà›ËDIiA³.n|;wNÝn0ágnJr9 t=«Ï…¯î|¾»jÜåqISoÇ·U]ƒMá5 [IRÙéãŽSH×o¯.‹SxÍ˵~ú׻•úJÉ)áF+ûŸ/®ÃÚ¨VVb¸æ;ƒÏ>% 4o•Ï{ª#èËF¦›ñÛÉåS,®Æ›Hˆ¹´""" """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ ¿†{àùãð¹qÛ¯ÇQŠbtUÓEOK…:)#§”Ù³]‚M!÷¶v´Ý­gvl2nωÕac©0¹kÞçܵ’²0ÐËÇäˆñyrñ÷bóÁ>%ú?Ž®jsxdš¢:3¨ø¤ëC‹‘tÂb˜¶vãw=&èë$ÇqjwèrS>–ž †æt±<‡9ò?h´Xj°½øìß»¦Üþé)1 àñMSSK˜Qb,{wÆ4QT¸Æ ®@sœÑ¬gh{ún¯ŒÜŒÍhâºÕ÷Âük÷N^‡µ'+›"*)Wÿ·» ú*OÂõ¤±ðã]Uº W¬ÃßDÚ–@ÖFéXóv­¤òµl,Oõ¥ŒKsXNêp¶Qc®¨§ŽVLƶgÆC·¬·»švå–*hã{n œ¡»‚8—ÑP§¶ G¾˜ÏÂâO{XÊÊw9ÆÀ A$ýªõG¾˜Ï“J0Ê& ¢Â2‡{ÛPW’¦VGS6÷ñNâLŽÎë1®6¤q;ÊGû)e©§‡>ùQCcq/mùR*XY$³¾ wÌù³µï‰®s@cÖF­aÜHÆTDa’7ÆéZ';ÜÐÝò\÷¸i7°‹ËÇ©>‡ÇÔà \駆6‡äÖûk°:ïÄuñrk^Œð¶fÂe`•Âá…Ã1'ûZCÇgo.15ÆY þæ^ 5ñ°‹|± ; ¼èͧ/cÜr»öZÆ€oqp\î7|ZÔ<ÃWôí²3!ŒHnáâƒË¯Wû"ñÂT6›jÞÕbŸ~ŠšœöÚ™r¸Üå^ÖÕÄ÷G’ê}&~~N¹AC„¨:m6Õ½©ÂT6›jÞÕIŸŸ“®SIŸŸ“®PPá*›Mµojp•M¦Ú·µ_Ògçäë”Ògçäë”8Jƒ¦Óm[Úœ%AÓi¶­íWô™ùù:å4™ùù:å é´ÛVö§ PtÚm«{Uý&~~N¹M&~~N¹AC„¨:m6Õ½©ÂT6›jÞÕIŸŸ“®SIŸŸ“®PPá*›Mµojp•M¦Ú·µ_Ògçäë”Ògçäë”8Jƒ¦Óm[Úœ%AÓi¶­íWô™ùù:å4™ùù:å é´ÛVö§ PtÚm«{Uý&~~N¹M&~~N¹AC„¨:m6Õ½©ÂT6›jÞÕIŸŸ“®SIŸŸ“®PPá*›Mµojp•M¦Ú·µ_Ògçäë”Ògçäë”8Jƒ¦Óm[Úœ%AÓi¶­íWô™ùù:å4™ùù:å é´ÛVö§ PtÚm«{Uý&~~N¹M&~~N¹AC„¨:m6Õ½©ÂT6›jÞÕIŸŸ“®SIŸŸ“®PPá*›Mµojp•M¦Ú·µ_Ògçäë”Ògçäë”8Jƒ¦Óm[Úœ%AÓi¶­íWô™ùù:å4™ùù:å é´ÛVö§ PtÚm«{Uý&~~N¹M&~~N¹AC„¨:m6Õ½©ÂT6›jÞÕIŸŸ“®SIŸŸ“®PPá*›Mµojp•M¦Ú·µ_Ògçäë”Ògçäë”8Jƒ¦Óm[Úœ%AÓi¶­íWô™ùù:å4™ùù:å é´ÛVö§ PtÚm«{Uý&~~N¹M&~~N¹AC„¨:m6Õ½©ÂT6›jÞÕIŸŸ“®SIŸŸ“®PPá*›Mµojp•M¦Ú·µ_Ògçäë”Ògçäë”8Jƒ¦Óm[Úœ%AÓi¶­íWô™ùù:å4™ùù:å é´ÛVö§ PtÚm«{Uý&~~N¹M&~~N¹AC„¨:m6Õ½©ÂT6›jÞÕIŸŸ“®SIŸŸ“®PPá*›Mµojp•M¦Ú·µ_Ògçäë”Ògçäë”8Jƒ¦Óm[Úœ%AÓi¶­íWô™ùù:å4™ùù:å é´ÛVö§ PtÚm«{Uý&~~N¹M&~~N¹AC„¨:m6Õ½©ÂT6›jÞÕIŸŸ“®SIŸŸ“®PPá*›Mµojp•M¦Ú·µ_Ògçäë”Ògçäë”8Jƒ¦Óm[Úœ%AÓi¶­íWô™ùù:å4™ùù:å é´ÛVö§ PtÚm«{Uý&~~N¹M&~~N¹AC„¨:m6Õ½©ÂT6›jÞÕIŸŸ“®SIŸŸ“®PPá*›Mµojp•M¦Ú·µ_Ògçäë”Ògçäë”8Jƒ¦Óm[Úœ%AÓi¶­íWô™ùù:å4™ùù:å é´ÛVö§ PtÚm«{Uý&~~N¹M&~~N¹AC„¨:m6Õ½©ÂT6›jÞÕIŸŸ“®SIŸŸ“®PPá*›Mµojp•M¦Ú·µ_Ògçäë”Ògçäë”8Jƒ¦Óm[Úœ%AÓi¶­íWô™ùù:å4™ùù:å é´ÛVö§ PtÚm«{Uý&~~N¹M&~~N¹AC„¨:m6Õ½©ÂT6›jÞÕIŸŸ“®SIŸŸ“®PPá*›Mµojp•M¦Ú·µ_Ògçäë”Ògçäë”8Jƒ¦Óm[Úœ%AÓi¶­íWô™ùù:å4™ùù:å é´ÛVö§ PtÚm«{Uý&~~N¹M&~~N¹AC„¨:m6Õ½©ÂT6›jÞÕIŸŸ“®SIŸŸ“®PWŠh§|†FHËåÌÇ/ÉqòµcnÇàŽ%ô_Ô-ˆ\çéNs‹œjÉ7ÿµÇÝÁK迨Oc¡¨÷ÁóøB«Kú¾‹ê°þ[Uª|1Ÿ„*´¿«è¾«åµ¨ #Ou)aŒKŽ"£åR Ãðš/Ec> þÄðš/Ec> þŸˆ0ü&‹ÑXϨ?±<&‹ÑXϨ?±n" ? ¢ôV3êìO ¢ôV3êì[ˆƒÂh½ŒúƒûÂh½Œúƒûâ Ãðš/Ec> þÄðš/Ec> þŸˆ0ü&‹ÑXϨ?±<&‹ÑXϨ?±n" ? ¢ôV3êìO ¢ôV3êì[ˆƒÂh½ŒúƒûÂh½Œúƒûâ Ãðš/Ec> þÄðš/Ec> þŸˆ0ü&‹ÑXϨ?±<&‹ÑXϨ?±n" ? ¢ôV3êìO ¢ôV3êì[ˆƒÂh½ŒúƒûµF›DÊ¡ðµîsC'fGê¶²Ó¬qùTÊW…ç»ù5Hˆ """ """ "Цm–iòæÞØçÚö½…×¹dŠ­òÆ&×ff6¾°8ü…QéM©Î{[Û‘«ÿø§Aó6žžIž ll/ qØ ¬X÷UO4L–,7|oÍ{h^Câ ùBÔÄ¿UV}ÿ U÷=ðk úœ?€ «á4^ŠÆ}Aý‰á4^ŠÆ}Aý‹qaøM¢±ŸPbxM¢±ŸPbÜD~Eè¬gÔØžEè¬gÔØ·„Ñz+õö'„Ñz+õö-ÄA‡á4^ŠÆ}Aý‰á4^ŠÆ}Aý‹qaøM¢±ŸPbxM¢±ŸPbÜD~Eè¬gÔØžEè¬gÔØ·„Ñz+õö'„Ñz+õö-ÄA‡á4^ŠÆ}Aý‰á4^ŠÆ}Aý‹qaøM¢±ŸPbxM¢±ŸPbÜD~Eè¬gÔØžEè¬gÔØ·„Ñz+õö'„Ñz+õö-ÄA‡á4^ŠÆ}Aý‰á4^ŠÆ}Aý‹qaøM¢±ŸPbxM¢±ŸPbÜD~Eè¬gÔؽǺ8å•‘· ÅÜàÐ]Dæ|¤êã+eH!;û¢.h-½ÉâÕÇü—Ýé"?±ÝŠSþ>ÿùU»Ó:Dc»6ÖA&#QCóËNÆ>B óXkòø¿ò>;N°ðï…ØçÑRÿ' ×¦÷5_Z?•ÈÝÁK迨ZôÞæ«ëGò¢Y±ø#‰}õ ìt5ø>c?UiWÑ}VËjµQïƒæ3ð…V—õ}Õaü¶ òúróRöÈ÷¶1‡ÝòçÿÎ5yEÁÔ¡šŠy(ÛLÉYþ f’6µÁ®6hñï«QÕâüjê%ˆ*©]$3ÇŒÐUFÎ0–\ÃÉ«ÅãûR5µsD{Óg’V4¤’âî(ýÃlkëâ:µêÁD@DD4Lß7UŽ·3šLT¶sMˆ6ÿ§"Ð~¡16ick£ÞŸ—/ŒÝzµƒn3Ån?ˆ[E’o`†²1srw¶’OÆm¯È½iócÙ7±QB:Ç(~û#ÚéÇZÍs¯r,/ûGŒž4–…²J_¾ÈÆ—¶G1¶³œÛX›‹þÈâ#‰_ÒæÇ²obiócÙ7±{pö5~”ÆÂÜŒ$Y® C_î~=e‡ÂëxÏ»KËMÆ¢ç‡ß‹È@·üÝhiócÙ7±4‡ù±ì›Ø‚¬ïÏ{Ý™ïu®ã`<–@ CÈ¥RéócÙ7±4‡ù±ì›Ø‚$RéócÙ7±4‡ù±ì›Ø‚$RéócÙ7±4‡ù±ì›Ø‚$RéócÙ7±4‡ù±ì›Ø‚$RéócÙ7±4‡ù±ì›Ø‚$RéócÙ7±4‡ù±ì›Ø‚$RéócÙ7±4‡ù±ì›Ø‚$RéócÙ7±4‡ù±ì›Ø‚$RéócÙ7±4‡ù±ì›Ø‚$RéócÙ7±4‡ù±ì›Ø‚$RéócÙ7±4‡ù±ì›Ø‚$RéócÙ7±4‡ù±ì›Ø‚%+¿ÂÇóÝüššCüØöMì^_+¤;-…È hÉ„DPCY ª(§…„I˜ â¹R½¯5•9ñ5@Î}É6 ° µ²\E‹¸µkúŠŠ¬¡2GKI€ÃNÈálfîÌÐøËœAm…ÄgP½ó/µpI-{FWMP^Z­[Û'J²‰b*ˆWW,Í–FC%ä¤±Ùøšà-¨€o¯]ãg"Šz7ËFÈšèÄ…²¾Gk±’HžÝZ¯`\Ö‹ù¤K«á–S [‘ÒS²1¶ cç%€±ïñ«(ˆ*â_ª«>ÿ„ªûžø5…}NÀ‰ÀµÍkšu¸\ˆƒÆ¦ÒæÇ²ob‘K¤?ÍdÞÄÒæÇ²ob‘K¤?ÍdÞÄÒæÇ²ob‘K¤?ÍdÞÄÒæÇ²ob‘K¤?ÍdÞÄÒæÇ²ob‘K¤?ÍdÞÄÒæÇ²ob‘K¤?ÍdÞÄÒæÇ²ob‘K¤?ÍdÞÄÒæÇ²ob‘K¤?ÍdÞÄÒæÇ²ob‘K¤?ÍdÞÄÒæÇ²ob‘K¤?ÍdÞÄÒæÇ²ob‘K¤?ÍdÞÄÒæÇ²ob‘K¤?ÍdÞÄÒæÇ²ob‘K¤?ÍdÞÄÒæÇ²ob‘K¤?ÍdÞÄÒæÇ²ob‘K¤?ÍdÞÄÒæÇ²ob OøùÿüOäUKæøÀ.«ßQøõk²óTÙjb•©– %b˘_Ž× ë^]KÁÙ}?Œí™ÜA¶ÐàêyŒm/u3Á¶Ò÷Vâ ÃϺžcÛKÝLû©æ0m´½Õ¸ˆ0óÁ¶Ò÷S>êyŒm/un" <û©æ0m´½ÔϺžcÛKÝ[ˆƒ>êyŒm/u3Á¶Ò÷Vâ ÃϺžcÛKÝLû©æ0m´½Õ¸ˆ0óÁ¶Ò÷S>êyŒm/un" <û©æ0m´½ÔϺžcÛKÝ[ˆƒ>êyŒm/u3Á¶Ò÷Vâ ÃϺžcÛKÝLû©æ0m´½Õ¸ˆ0óÁ¶Ò÷S>êyŒm/un" <û©æ0m´½Õ¯FÚ¾ŽJíàT¹îl–-k¬ñòêeR»ü,=ßɨ=êyŒm/u{m}L8e;ÛýûÙNÙ¦ñdW%Ã^£®Îâ½¼ŠWâ3ç‘‘º0ùXÖ6àœ™ÍÉÿÙk[ã¿‘|û©æ0m´½ÔϺžcÛKÝSºZˆ+g{$¨|q60Ȭ¹ ¬]È ã±ÁY4µ†ÍlsJÖÄK…ÃK]5Íÿ'õ_ŒÛXxϺžcÛKÝLû©æ0m´½Õ?Ôå¨plYiã/}Á»Ë\ö5ê¾Kùmñ¨«+je¦«)ÜÙ£k†¶‡k¾kŸrue.­aç>êyŒm/u3Á¶Ò÷Tñ¹ÔrÊÖÃ$˜õ¶YÏ-.âÏÉä|B:ª½ú¯z75“µ¡ãY|$‹ü®7ù"£Æ}Ôó6Ú^êgÝO1ƒm¥î¯O«¨SUÇ™`&8ÚÛç|bÄ“ãZãÍâò_Uªjº©*£‚V1„—ê6ÉmAÇ/»ò“Å亂ž}Ôó6Ú^êgÝO1ƒm¥î«U’Í+œÐæ6(ªacšZKœs1×ú½Ðò/DÌJ±ñ1æ&F& 1—¨9ÍA÷v§qø¼_³î§˜Á¶Ò÷S>êyŒm/uXá Û`á/s˜ÒFRÙ'^°K¯mVµ®x×¶ÕU¾¯Diƒ;sf´ÛPa6ÿ絯ñüH*gÝO1ƒm¥î¦}Ôó6Ú^ê–|Bihd‘¥‘µôÅͳŽ`왽×(ÕªÃV°u'u]Cwö]Ž•²6(ƒc÷NÈî7ÄO”ZÞTóÁ¶Ò÷S>êyŒm/u{edÒÊçÈÖØo,toÛó™˜k°:¯åòkÕ®CˆÔˆ 6'†5ñ¶Å¹As‰¹¿»ã°ââA}Ôó6Ú^êgÝO1ƒm¥î«Î«š::×»#¥¦ÖC\C†«êã·‘y5U1ÖGJ÷Dç9Í%á„ ¤<Ú×:üN;ùxµ §Ÿu<Æ ¶—º™÷SÌ`Ûi{ªs]3£¦tŒ‰í¨ ‘Ê|A‚Ç^³ãê:µŽ%ò,J©ñ±ï…¬lÍiˆ›jÌæ¨8—˜&ñy/¨!ϺžcÛKÝLû©æ0m´½Õu²Nq(c|Ñ»+$Î ¸¶«ê>7Ç«åÕ}}Ôó6Ú^êgÝO1ƒm¥î­ÄA‡Ÿu<Æ ¶—º™÷SÌ`Ûi{«qaçÝO1ƒm¥î¯q»tÆV bÂpÌæË#ˆRQsñ\-”Aîfæ‘‚ökˆùW…-Oø©¾{¿š‰S{š¯­ʉdnÇàŽ%ô_Ô-zosUõ£ùQ,Øüľ‹ú…}ކ£ßÌgá ­/êú/ªÃùmVª=ð|Æ~ªÒþ¯¢ú¬?–Ô$¤ŠgÊd’|’±¬’69 < ÚÚOí"†6º©Ó:Iš×ÌÙßnhkÞÒ½ÚOì·P#‹ã+Ò%ˆ#¤Ž+:9'lÁù„¹Ásu긷¹$]Àž-z‚šVï¬kL“ÂÙüÏ̘:çW»ZÞKY}D±tÐDö¿4ïp“|.{ÛrsDï#@ÿ²Ñþå-Þd…ÒÔ:‡äI–?ùµsîœu›kâÔˆ–<[²¾Yä˜?9‘îmøˆ ÐÑpç"uñê ÌTÑDc%Ó<Ç‘¬slÆ1Íph³ÈÑrIÕñ©Q,AMc_$¬hï$¸¹±´ÛÅmíÆnã¨\Ÿ-”èˆ2èpʧcø½KéêZˆàŽ-¸~PìÃäñ‡ÿ +NL)²±Œ’€=¬`t7 ­\Kê 3 Þ¥t±Ñd‘×ÌöÅbo¬ÜنﲶY(³ÈÛe{¢¹רÙ¸nG=Í¢±{ƒœD^èƒpN­fú×Ó‡¸‚  ‡7®0ãsäòùyWÄAê:!ŒG+˜ÁÄÖÇ`?Ù{ѧæ$ê —FŸ˜“¨SFŸ˜“¨TH‚]~bN¡M~bN¡Q" tiù‰:…4iù‰:…Dˆ%ѧæ$êѧæ$ê —FŸ˜“¨SFŸ˜“¨TH‚]~bN¡M~bN¡Q" tiù‰:…4iù‰:…Dˆ%ѧæ$êѧæ$ê —FŸ˜“¨SFŸ˜“¨TH‚]~bN¡M~bN¡Q" tiù‰:…4iù‰:…Dˆ%ѧæ$êêXß4aìsNw8[ÈÕ óY]I F÷-T xc.×H(ò*¢» 2Q®¤þÏþï/—•G&„M+å— ¡|%Î{©ØK‰ã$ÛY^|Á=‡ú³;gš¢<5ÔE#†%LHcÁ6Î9D³ãÀ°ˆed±aT,‘„9¯m;iDj+AG<-¨§’’# v"ÊDP}›,ó‰fË`|­ppðªOF×ÓLƽåÅ’ˆ˜çÆ9áÀC1÷nã>^-AZEl|•Œ“Ha– Á)’Ðo™X3’]pϺw¶¿ˆ/"çl¯–y&Îd{›~"44\9È|z‚ö‰b ©#¨µòLÆJÌ’‹F`/kæiâÌî+q©È»¥þú¤F÷=ÂË•/$“¨w8ë>^-A,@ÊHãkrK;ãg9¹˜‚E‹rvƒ¨_ãÖWšŠ8ßK,Q;|-ÎûøÎ‡z6¹Õ¯åVQ,y0Æ&2ï“É!8Ë!nbpµƒ@žÿ!÷_^"¦Š#˜ÇöæÇ™¹\ö5 9Þ-ÿaºWÆT¨–"m\:ª8Øç½Ñ=­kEÉ$Œ# ¨§ÁðتhÜ*)飌ݗ,p`ÿ·‘[D$›0Zð :ØgÉåR ­JïÅÃû¾"osòë?i^†á¶7ÆÜ9¡¶fˆu:ÜWÖ½ -¢# Ùo:ˆãU¹I?î¾¢¼àÂÁFr–†½j-C‹‹YÕñ¯‡ ¼Ñ]ïnW¸Å­Ã›kˆ Ãw¨tY#uó1±Xê7A†åµ¨­kZÑqZÖò•¿`äDAðaM‘â€HyëpTü—ÓøÎÙÄðv_Oã;fwÑé[ìqIýíœÌÎ#+)'5õ̧ܵʵaø;/§ñ³;‰à쾟ÆvÌî-ÄK~ËéüglÎâx;/§ñ³;‹qƃ²úÛ3¸žËéüglÎâÜD±‡à쾟ÆvÌî'ƒ²úÛ3¸·,aø;/§ñ³;‰à쾟ÆvÌî-ÄK~ËéüglÎâx;/§ñ³;‹qƃ²úÛ3¸žËéüglÎâÜD±‡à쾟ÆvÌî'ƒ²úÛ3¸·,aø;/§ñ³;‰à쾟ÆvÌî-ÄK~ËéüglÎâx;/§ñ³;‹qƃ²úÛ3¸žËéüglÎâÜD±‡à쾟ÆvÌî-Š:= Š#<õßygvg»‹ŽÀ _R)]þ?žïäÔå”Ææµ­ŽÙuÆÓû#â^4‡ù±ì›Ø•ø>c?U„ð•„Òa¬8Ø}¾NT7E]Q 5 bx}¯§åŒ %¥ââà^ÇËñjZktÞñ†©Ó~0·@DDD@DDPU 1’†¹Æ‰,ÑwÄà”–—ñ‘ÅÆ¢.”4I aòÕÏ’7j6‰q¸»š$H}Ö°A¿V…ÄTÄÕ;Üî&èØÀ$½Ï{uëâ{›d Ã|Šy&›$Oƒ3ò ÷{7qpx£>-õ“d¡uUS¼ÔMxwªx‹ÝvœÏ!ò6À^ÂûÝïsoó+èŠ Q´Ò±­/Ãįp/yÞ¼gÚ>3¸ùJP¸Š xØÊºÂÐn[ %Î.ã2òC⑱°beö%ÆšCrâmãÄ5l?Û•舠""" """ """ """ """ """ """ ""©½ÍWÖåD²7cðGú/ê½7¹ªúÑü¨–Fì~â_EýB¾ÇCQïƒæ3ð…V—õ}Õaü¶«Uø>c?UiWÑ}VËj šr[`ãk¸ z¯mÏÚ¼>(¤c$0ÈÆZׯ×I$›kÜŸµzDA ÷,º²ø¬Uš-¨r1½P¼>8äŒFø£t`5¡Ž`-°µ…¸¼zD 4Ôi8ÌàXHc͵ǑG%<2ïbHbs#Ëf:6–Ö¹­[ˆ|jD@³nÒÁ•¹f•ºµA¨q#r´´†2ì÷> Õãþ Êydqƽà Îg9±€ç|d ž2½" ©G…ï8µ~ ê¨Æ”Øš#Êë´0dÛË›þ>=ZÓ:Dc»H‚]é"?±Ý‰½3¤Gö;±Dˆ%Þ™Ò#ûؾ"qi3DKMÁ-v£Å«WÆThƒÓi`l‘²@ûfpk®ëq\ÛZ÷½3¤Gö;±Dˆ%Þ™Ò#ûØ›Ó:Dc»H‚]é"?±Ý‰½3¤Gö;±Dˆ%Þ™Ò#ûØ›Ó:Dc»H‚]é"?±Ý‰½3¤Gö;±Dˆ%Þ™Ò#ûØ›Ó:Dc»H‚]é"?±Ý‰½3¤Gö;±Dˆ%Þ™Ò#ûØ›Ó:Dc»H‚]é"?±Ý‰½3¤Gö;±Dˆ%Þ™Ò#ûØ›Ó:Dc»H‚]é"?±Ý‰½3¤Gö;±Dˆ%Þ™Ò#ûØ›Ó:Dc»H‚]é"?±Ý‹ì™[Ùòârƒå”|JA™]º(a¬|MÃñIr°¾*) Icmbþ^.E…M¿êÌjâÇü žN%´ˆ9LO8³°ø Ãq69•ðHçKFö´4<\“m\««D@DE—Ç‘ˆßnŒ´1̶°·/H¨øæ±Ñº3yÐÂÐÀQ{ rxÇWÆQìŽHÌo†  mËfß(µ­as«ã_QÇ5ŽÑ˜ãÈæ††2‹Ø[“Æ:¾2¾¢ /,Ž(à …¹œò"mÜA¸$Û^½zפAð±®cÚæ4‰ æöâÖ~Õêþ;Ÿfæ ¶öD‚GŬ±|DDPTÞæ«ëGò¢Y±ø#‰}õ ^›ÜÕ}hþTK#v?q/¢þ¡_c¡¨÷ÁóøB«Kú¾‹ê°þ[Uª|1Ÿ„*qEY<Ñê&G}úMyZýïâA:(²ÖrQmäöi–³’‹o'³J¢‹-g%ÞOf™k9(¶ò{4¡*(²ÖrQmäöi–³’‹o'³J¢‹-g%ÞOf™k9(¶ò{4¡*(²ÖrQmäöi–³’‹o'³J¢‹-g%ÞOf™k9(¶ò{4¡*(²ÖrQmäöi–³’‹o'³J¢‹-g%ÞOf™k9(¶ò{4¡*(²ÖrQmäöi–³’‹o'³J¢‹-g%ÞOf™k9(¶ò{4¡*(²ÖrQmäöi–³’‹o'³J¢‹-g%ÞOf™k9(¶ò{4¡*(²ÖrQmäöi–³’‹o'³J¢‹-g%ÞOf™k9(¶ò{4¡*(²ÖrQmäöi–³’‹o'³J¢‹-g%ÞOf™k9(¶ò{4¡*(²ÖrQmäöi–³’‹o'³J¢‹-g%ÞOf™k9(¶ò{4¡*(²ÖrQmäöi–³’‹o'³J¢‹-g%ÞOf™k9(¶ò{4¡*(²ÖrQmäöi–³’‹o'³J¢‹-g%ÞOf™k9(¶ò{4¡*(²ÖrQmäöi–³’‹o'³J¢‹-g%ÞOf™k9(¶ò{4¡*(²ÖrQmäöi–³’‹o'³J¢‹-g%ÞOf™k9(¶ò{4¡*(²ÖrQmäöi–³’‹o'³J¢‹-g%ÞOf™k9(¶ò{4¡*(²ÖrQmäöi–³’‹o'³J¢‹-g%ÞOf™k9(¶ò{4¡*(²ÖrQmäöi–³’‹o'³J¢‹-g%ÞOf™k9(¶ò{4¡*(²ÖrQmäöi–³’‹o'³J¢‹-g%ÞOf™k9(¶ò{4¡*(²ÖrQmäöi–³’‹o'³J¢‹-g%ÞOf™k9(¶ò{4¡*(²ÖrQmäöi–³’‹o'³J¢‹-g%ÞOf™k9(¶ò{4¡*(²ÖrQmäöi–³’‹o'³J¢‹-g%ÞOf™k9(¶ò{4¡*(²ÖrQmäöi–³’‹o'³J¢‹-g%ÞOf™k9(¶ò{4¡*(²ÖrQmäöi–³’‹o'³J¢‹-g%ÞOf™k9(¶ò{4¡*(²ÖrQmäöi–³’‹o'³J¢‹-g%ÞOf™k9(¶ò{4¡*(²ÖrQmäöi–³’‹o'³J¢‹-g%ÞOf™k9(¶ò{4 ¦÷5_Z?•ÈÝÁK迨[0Fø¢“}tEòLd´NqdcxÈiò,mØüľ‹ú„ö:|1Ÿ„*p>ªh!™Ì¥c%cdË¿<¸|Ë^Ç—ýÕÊ|1Ÿ„*´¿«è¾«åµE¥µ%ò²r ¬ {%­iÊrßY.Ì/”Ø8kÔ’ªVSKR!a…‚Bßï,ã“0$‹X ´Ž2xµrQ›¥¦Åæ…˜f!WSG¿F‚IZÒEÚâm}Z³Ùø”nÄá{^¹ÜuÙÇA1 Í{Ù¼@›`_YåV†¦jU-;"ƒ|c¾9ó¿(-lWÅ>YâDùRŽY*#–gXF^ÝèãXÆÇë[ö¹OijdÅ™5Sç“ÇÆlî-e ìÌçozÉiÀF5/cÊ]“ÆØPÜ:PÂÂÖâ_ŽÀr%"Xj pÒË8$¶Ï)l®qvhgxÔl?föââE`ÔT²ÒKHèÃKA|ìco~2æªÚìÒƾ;gŒ^0ðw!±¶0)ZÇ0SÝö¯'‰Ì±Üö<\\éE9y"ÿ¶NaÆxˆã<¨6¿¾1Ü66¼Øµ¯yÔ,ŒZ ޲5_‰xËYÉE·“٬ц 3ÆØß#[‡K`,y‚pëýŽýÝ'bR´²ÖrQmäöi–³’‹o'³Y¼:ÿAã¿wIØœ:ÿAã¿wIØ”4²ÖrQmäöi–³’‹o'³Y¼:ÿAã¿wIØœ:ÿAã¿wIØ”4²ÖrQmäöi–³’‹o'³Y¼:ÿAã¿wIØœ:ÿAã¿wIØ”4²ÖrQmäöi–³’‹o'³Y¼:ÿAã¿wIØœ:ÿAã¿wIØ”4²ÖrQmäöi–³’‹o'³Y¼:ÿAã¿wIØœ:ÿAã¿wIØ”4²ÖrQmäöi–³’‹o'³Y¼:ÿAã¿wIØœ:ÿAã¿wIØ”4²ÖrQmäöi–³’‹o'³Y¼:ÿAã¿wIØœ:ÿAã¿wIØ”4²ÖrQmäöi–³’‹o'³Y¼:ÿAã¿wIØœ:ÿAã¿wIØ”4²ÖrQmäöi–³’‹o'³Y¼:ÿAã¿wIØœ:ÿAã¿wIØ”4²ÖrQmäöi–³’‹o'³Y¼:ÿAã¿wIØœ:ÿAã¿wIØ”4²ÖrQmäöi–³’‹o'³Y¼:ÿAã¿wIØœ:ÿAã¿wIØ”4²ÖrQmäöi–³’‹o'³Y¼:ÿAã¿wIØœ:ÿAã¿wIØ”4²ÖrQmäöi–³’‹o'³Y¼:ÿAã¿wIØœ:ÿAã¿wIØ”4²ÖrQmäöi–³’‹o'³Y¼:ÿAã¿wIØœ:ÿAã¿wIØ”4²ÖrQmäöi–³’‹o'³Y¼:ÿAã¿wIØœ:ÿAã¿wIØ”4²ÖrQmäöi–³’‹o'³Y¼:ÿAã¿wIØœ:ÿAã¿wIØ”4²ÖrQmäöi–³’‹o'³Y¼:ÿAã¿wIØœ:ÿAã¿wIØ”4²ÖrQmäöi–³’‹o'³Y¼:ÿAã¿wIØœ:ÿAã¿wIØ”4²ÖrQmäöi–³’‹o'³Y¼:ÿAã¿wIض \ÐÜÍ-%¡ÙO¸½¿åA/{Ù&ø¦3‘ÅÀø­uî@?µÉäR(©½ÍWÖåD¥@P@ú© †g2•Œ•“.üòàó-{_÷S¨©WÑ}VËj Sgâ6)‹£yË9¨ÊÈí¸Î/bI>)½ü¼J㦑،´ðSM$qÊ". y76änP ›¸yuræÕbǫ̂«Ã[‡bO|ú-3å;@-â¸m¼œE6J—NýÏcŽ{žÆ‚l¹¹rñ¨k ñEQz:©e³[ ް5ÒX4€çÚ®kIÔÖÛuðÖ8SULb§9³½Ñ‘¤ \WŒë<¼K9¸œ,#w;Ž·]ó6‚`ï(6‹,Û ’âPMôýÍãf,…™4 €:ɹóËÍìI)JÕß* ›Ûc‡9t¶Í)27ä$Ó¬»ˆuyW–TO-Võ$® sâççxÚ 5 ÝÂÚÿß>\e³]¹üxX¼ø”3°œÎ.:Å®okÛPä_-ªVÓï iC.pâdŒ<ß-­–Ìc?REZosUõ£ùQ,Øüľ‹ú…¯Mîj¾´*%‘»‚8—ÑP³í] G¾˜ÏÂZ_Õô_U‡òÚ­T{àùŒü!U¥ý_EõX-¨c?UiWÑ}VËjµQïƒæ3ð…V—õ}Õaü¶ ñ¹o…Û¢ú*Oå"ì¹o…Û¢ú*Oå"ìáD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@\åG¾˜ÏÂF¹Ê|1Ÿ„)"­7¹ªúÑü¨”ª*osUõ£ùQ)VTQRþ¯¢ú¬?–Õ*Š—õ}Õaü¶ ñ¹o…Û¢ú*Oå"ì¹o…Û¢ú*Oå"ìáD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@\åG¾˜ÏÂF¹Ê|1Ÿ„)"­7¹ªúÑü¨–Fì~â_EýBצ÷5_Z?•ÈÝÁK迨Yö®†£ßÌgá ­/êú/ªÃùmVª=ð|Æ~ªÒþ¯¢ú¬?–Ô7-ð»t_EIü¤]‚ã÷-ð»t_EIü¤]‚Ü ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆ œ¨÷ÁóøBè×9Qïƒæ3ð…$U¦÷5_Z?••EMîj¾´*%*ÊŠ*_Õô_U‡òÚ¥QRþ¯¢ú¬?–Ô7-ð»t_EIü¤]‚ã÷-ð»t_EIü¤]‚Ü ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆ œ¨÷ÁóøBè×9Qïƒæ3ð…$U¦÷5_Z?•ÈÝÁK迨ZôÞæ«ëGò¢Y±ø#‰}õ >ÕÐÔ{àùŒü!U¥ý_EõX-ªÕG¾˜ÏÂZ_Õô_U‡òÚƒÆå¾n‹è©?”‹°\~æŽõºÐK'‰ã¥k^íAÄÜÊ.>к½&~>¸Z„JŠ-&~>¸M&~>¸TJŠ-&~>¸M&~>¸A*(´˜9øúá4˜9øúᨢÒ`çãë„Ò`çãë„¢‹IƒŸ®IƒŸ®JŠ-&~>¸M&~>¸A*(´˜9øúá4˜9øúᨢÒ`çãë„Ò`çãë„¢‹IƒŸ®IƒŸ®JŠ-&~>¸M&~>¸A*(´˜9øúá4˜9øúᨢÒ`çãë„Ò`çãë„¢‹IƒŸ®IƒŸ®JŠ-&~>¸M&~>¸A*(´˜9øúá4˜9øúᨢÒ`çãë„Ò`çãë„¢‹IƒŸ®IƒŸ®JŠ-&~>¸M&~>¸A*(´˜9øúá4˜9øúᨢÒ`çãë„Ò`çãë„¢‹IƒŸ®IƒŸ®J¹Ê|1Ÿ„-í&~>¸X5ø>c?Y‘V›ÜÕ}hþTJU7¹ªúÑü¨”ª(¢¥ý_EõX-ªU/êú/ªÃùmAãrß ·EôTŸÊEØ.?sGzÝNè%“ÄñÒµ¯v âîåh]^“?\-B%E“?\&“?\*%E“?\&“?\ •ZLü}pšLü}p‚TQi0sñõÂi0sñõ QE¤ÁÏÇ× ¤ÁÏÇ×%E“?\&“?\ •ZLü}pšLü}p‚TQi0sñõÂi0sñõ QE¤ÁÏÇ× ¤ÁÏÇ×%E“?\&“?\ •ZLü}pšLü}p‚TQi0sñõÂi0sñõ QE¤ÁÏÇ× ¤ÁÏÇ×%E“?\&“?\ •ZLü}pšLü}p‚TQi0sñõÂi0sñõ QE¤ÁÏÇ× ¤ÁÏÇ×%E“?\&“?\ •ZLü}pšLü}p‚TQi0sñõÂi0sñõ QE¤ÁÏÇ× ¤ÁÏÇ×%\åG¾˜ÏÂö“?\,|1Ÿ„,È«Mîj¾´*%‘»‚8—ÑPµé½ÍWÖåD²7cðGú/êö®†£ßÌgá ­/êú/ªÃùmVª=ð|Æ~ªÒþ¯¢ú¬?–ÔcÒDmÉ)c°7Ðß/%׬Õ}#øãµE/½Áóâr‰«ÕôãŽÔ½_Hþ8íUT&q¥¶žÄ’Û“c¨ë qyC^öüa†j¾‘üqÚ™ªúGñÇjÎ5Qi‘R²HÝ+ÉÌÌã3@c{·ü¥=TURL!’9eÞLJkvmZ¾oü ÑÍWÒ?Ž;S5_Hþ8íUQ¬Õ}#øãµW’½ÑV2‘Õg|n•¬l¹ŽP@$ØêÖáÇÇþÅyXoøuúdŸšÄg©{Ã[4„“`3•&j¾‘üqÚ¢¦ÿÏoóQ µš¯¤v¦j¾‘üqÚªªÌšw5’˜á>mé HKÉß `Û-¸ÿÍăO5_Hþ8íLÕ}#øãµP50 ž0øÛ™í/hå#È:˜&plSÆò[˜¼‹Úÿ%õ ¿š¯¤v¦j¾‘üqÚ¨GSÍŠxÞ ²‚׃skÛå¶´uL séãî-h/1ÄS}H/æ«éÇ©z¾‘üqÚª¢>$jâßiêß$yÜÌÍy±-qi·.°uña’UH lï°°%ÒÛùŸ‰s{‘ø7ÒÏùÏ] ÂÉóÛüœ‚\Õ}#øãµ3UôãŽÕUZÍWÒ?Ž;Rõ}#øãµP•ò6Hc‰ŒsåqhÎòÐ,×8›€OyÙ&e4M}TÐG}D‰[ò]Ày>$³UôãŽÔ½_Hþ8íYÖ2Má¯1¶I¢5¡÷ ec¬om~?¾¡ue¬Õ}#øãµ3UôãŽÕU{«­}M’¢³#_#bo÷×%Î!  øÏõ^´™ùù:åsÛ¦÷Œ3ýN›ñ…¸‚]&~~N¹M&~~N¹Q" t™ùù:åHVæ‡oîÚÆi€þeVRËïp|Ãøœ‚\Õ}#øãµ/WÒ?Ž;UUÒØ [îsXÖÞ×sœ5ùÈA{5_Hþ8íLÕ}#øãµg‡Ì&Š)#Šò8ŒÑÈKu1Îò€oâr[XÖ‚®™ÐºaQ‰¦Åáã(?/û„ªúGñÇjf«éǪ‹g…ïkY+ç38À’Þ_“ãQTVà sö>Xc2: ñšÀ_‹ÉäûPiæ«éÇ©š¯¤vªÌZK€>Fj7÷/s?ún¾ õ%{¢¬e#ªÎþøÝ+XÙs €I±Õ­ÃýŠøç9î.s‹œ|¤Ýa?áÔ?é’~k⩽ÍWÖåD¥QS{š¯­ʉJ€¢¥ý_EõX-ªU/êú/ªÃùmAv=$FÜ’–0ë} òò]zÍWÒ?Ž;TRûÜ0þ'(ZÍWÒ?Ž;Rõ]#øãµUPÔÔ6™s¸‹­åÔ%ÇPò48ÿ² Õ}#øãµ3UôãŽÕ›]Y2>W1¯k\[Ü\@â^äž6b ¢FéËÜ×4?[@k{qþÏü ¿š¯¤v¦j¾‘üqÚª¢ YªúGñÇj¯%{¢¬e#ªÎþøÝ+XÙs €I±Õ­ÃýŠò°ßðêôÉ?5ˆ:&ÏR÷†¶i &Àg*LÕ}#øãµEMþ*žßæ¢Ak5_Hþ8íLÕ}#øãµUU™4îk%1Â"|ÛÓ@—“¾Á¶[qÿ›‰žj¾‘üqÚ™ªúGñÇj j`>3AäùU^ÝïwŽú ÅTÒ;z‘û󌯗ÑsHÉ›ÅÌEšÛØùM–on‡÷‚»Ç}8;t?¼}Þ;è4¤¢–H(šÓ5Óû»3Ì“-¿î°ÝýóÏ<Æï»Û[$s²5»áò´y\¾U‹ÁÛ¡ýàƒîñßNÝïwŽú¶6ÛžÞ>Aâ·Ü¸gŒq CV¿*ú°ø;t?¼}Þ;éÁÛ¡ýàƒîñßPn,7ü:‡ý2OÍbpvèx û¼w׺º`b5Ø”uOî­e6÷`\×_Ý7þPoSЇç·ù¨ºF й”ka{s4%À"ãâ¸X|ºÞ>ïôмTQFØ c³éì“5€?.ü\Fkf÷¿áeðvèx û¼wÓƒ·CûÁÝ㾂ó°÷:–x¿ºñ·ç1ÏšW]φ{†Û=¯¬ê&×:¬VÒirTƒ+CfžWÜ‚NSöÝ\ ÿÂÉàíÐþðA÷xï§n‡÷‚»Ç}[ÓE4Æj—[Rì›Ë÷8FœØºÀØçÊ@ò_^µ” ßE¯ˆÀØ ¥šV\ââC-œ¸¸’ ¼ºõ¬ÞÝïwŽúpvèx û¼wÒÆóÈtŽpI Âò°ø;t?¼}Þ;éÁÛ¡ýàƒîñßP7#ðn¥Ÿóžºÿ…“ç·ù9eàØs°œ.:7L&s÷†e¹åÜW6ãåRbâ3@ب+¢¤ñ³=ϧßK¬5ã8Ï/“‹ÊÑaðvèx û¼wÓƒ·CûÁÝ㾃V¦œÎøõO(åÅ•àøŽö]ÄH<^Eë$ñÏÑ VÊØkæ1€–›‚~&ZÙkV¼ŽÝïwŽúpvèx û¼wÐjSSKFÆä’'¼Db6sš=ê{ÛÊèˆââ7ø”ö~{^<¹ˆ¾cÅn>/)Õo÷ø–'n‡÷‚»Ç}8;t?¼}Þ;è7aðvèx û¼wÓƒ·CûÁÝ㾺oxÃ?Ôé¿[‹Ÿ—Ūå¦Óq¨¦ŠˆçÈÚ,„–8_>®%Ð ""€¥—Þàù‡ñ9D³k鱚š€iqX) kr¶3Gœò’\_¯Y>AäùUJ9Xç5…–.dŒl kƒ­%ík¬~ÝïwŽúpvèx û¼wÐiÏI-K2Í, Õ#mgØ:'²÷ y\5[Èu¯¦žL¹Ú#c˙⠩œì­Í`e:ÚuìÑä:õêËàíÐþðA÷xï§n‡÷‚»Ç}[ô”\Ò0ºP39ιß%v²à Ôöë:õ*ÓÐÍPÉé#·÷¤Í!¹tok@ŽÙ³~=Dùl¨ðvèx û¼wÓƒ·CûÁÝ㾃t€Ð@puä•÷ât¯pÿ‡ñaðvèx û¼wÓƒ·CûÁÝã¾ ?áÔ?é’~kâÆ¡Áë¡Æ#]‰GTñNèÖSovÍuýÑóål Š›ÜÕ}hþTJU7¹ªúÑü¨”¨ *_Õô_U‡òÚ¥QRþ¯¢ú¬?–Ô¥÷¸>aüNQ,Úúlf¦ \V hÜ­ŒÑç<¤—ëÖOy>UWƒ·CûÁÝ㾃qB`/©3äˆ6<ŒÞ²æ9Ýræ‘o¼Zõ•“ÁÛ¡ýàƒîñßNÝïwŽú “SÓºïÔžï{›‘ÎÖÞÍ9‰kïõâÃèÓ$üÖ'n‡÷‚»Ç}{¡Áë¡Æ#]‰GTñNèÖSovÍuýÑóåõ7ø¨~{š‰ ¤`Í ˜ÙF¶·3Aò\.>+…‡ÁÛ¡ýàƒîñßA¸«ÅEm€¶8>‘¾É3XòïÅÄf¶oq«þ_n‡÷‚»Ç}8;t?¼}Þ;è/;s©g‹û¯~sù¥uÜðàg¸m³Úú΢msªÅm&—%H2´6iå}È$å0omÕÊü,žÝïwŽúpvèx û¼wÕ±­4SLf©q…µ.ɼ±s„a¹Í‹¬ Ž|¤%õëQÉ@ÝñÑÄZøŒ €ºY¥eÀ..$2ÙË‹‰ Û˯ZÍàíÐþðA÷xï§n‡÷‚»Ç},o<‡Hç$·ü/+ƒ·CûÁÝ㾜ºÞ>ïõr?àúYÿ9ë¡oøY>{“–^ ‡; Âã£tÂg1ÏqxfPKž]Åsn>U&!#4 Š‚º*O3Üú}ôºÃP0Œòù8¼¡mn‡÷‚»Ç}8;t?¼}Þ;è5jiÌï€ïTòˆÞ\YQîˆà?eÜDƒÅä^²OñM¥l­‰Ñ±Îc i¸!—âe­—ö¸õkÈàíÐþðA÷xï§n‡÷‚»Ç}¥54´lnI"{ÄF#g9£Þ¡½¼®ˆŽ.#‰Ogçµã˘‹æ©Œªu9-k£‘Ì“3ÀÉhÌ—ù,-äòò õ£—[Ö‹Ù¦Œ:]oZ/f†¦ïy§Œo¾÷wäåã ä•P²žiƒÃÛvp  ‘ò û£—[Ö‹Ù¦Œ:]oZ/f¼²¤ \úrÖÄé^øåÌO-€ý¾>A*ô*`1²AÕ»‚8—ÑPžÇCQïƒæ3ð…$ÒŒ2‰‚G†h°Œ¡ÆÞöÕ=G¾˜ÏÂZ_Õô_U‡òÚ,,’Yß;æ|ÙÚ÷Ä×9 1€k#V°î%tA3§nhäÍ—YÍ3Ü\ñoµ®¿æ%ga¸Žî³n#’¶©Œa³ÉÁ÷÷.÷#‘nx¹¾…?®ÏßZˆEh©\ÖBÇÈÂÊ(ψ’ñÅÅÅò¨[KR×Á'‰,±º6°:y^ã4N.±nXÅšIËÄ–Êÿ€›èSúìýôðs} ]Ÿ¾‚­E4’ÐÕ±òFꊜäIìkÌ@'ÜߋʾÕÒé5R™æÉ+žÖæsK†hžôáqÅ©Yðs} ]Ÿ¾žno¡Oë³÷Ò…9häxnSLÙ÷_,š‹ZÒ ŸrðCl[`5`‹«¢YZìÂBÓ¬ „‹ ›|œ¶µ¯žno¡Oë³÷ÓÀ Íô)ýv~úP÷¤ÏÏÉ×)¤ÏÏÉ×+Ç€›èSúìýôðs} ]Ÿ¾¥zLüüršLüür¼x¹¾…?®ÏßO77ЧõÙûéCÞ“??'\¦“??'\¯no¡Oë³÷ÓÀ Íô)ýv~úP÷¤ÏÏÉ×)¤ÏÏÉ×+Ç€›èSúìýôðs} ]Ÿ¾”=é3óòuÊi3óòuÊñàæúþ»?}<ÜßBŸ×gï¥zLüüršLüür¼x¹¾…?®ÏßO77ЧõÙûéCÞ“??'\¦“??'\¯no¡Oë³÷ÓÀ Íô)ýv~úP÷¤ÏÏÉ×)¤ÏÏÉ×+Ç€›èSúìýôðs} ]Ÿ¾”=é3óòuÊi3óòuÊñàæúþ»?}<ÜßBŸ×gï¥zLüüršLüür¼x¹¾…?®ÏßO77ЧõÙûéCÞ“??'\¦“??'\¯no¡Oë³÷ÓÀ Íô)ýv~úP÷¤ÏÏÉ×)¤ÏÏÉ×+Ç€›èSúìýôðs} ]Ÿ¾”=é3óòuÊi3óòuÊñàæúþ»?}<ÜßBŸ×gï¥zLüüršLüür¼x¹¾…?®ÏßO77ЧõÙûéCÞ“??'\¦“??'\¯no¡Oë³÷ÓÀ Íô)ýv~úP÷¤ÏÏÉ×)¤ÏÏÉ×+Ç€›èSúìýôðs} ]Ÿ¾”=é3óòuÊi3óòuÊñàæúþ»?}<ÜßBŸ×gï¥zLüüršLüür¼x¹¾…?®ÏßO77ЧõÙûéCÞ“??'\¦“??'\¯no¡Oë³÷שZÖ9cCZØØÀ ¡&)UásŸ¥9Î.qª7$ßþÔJE7¹ªúÑü¨”ªóI4£ ¢`‘áš,#(q·½µzQRþ¯¢ú¬?–ÔKK4ÐÔÓµÐ6:‡ç½Î¹˜Ö44ÞÙoÆ8íñ©ßù\齘t§T†¼\ÜÄX5XD4Þþ_‹^F€áØîë1¶â1I+`Š˜Æ<‘€\rár8ù¸·5¸Ùf© `4ðGÝ8Äå-ÅÂÄç°÷#ËûKTb€¸¾æ7:f½²Í+I¬3ÝÜ>«¶ÎùùR‚®—H©ª”È×6I\ö·3š\3@@¸-÷§ Ž-KÄ´r<7)¦l{Œ/–ME­iϹx!¶-°ưEÔRîkq±MNÀ)çŽG¶s‰ÊKKEÏcî—öUÇn+rL©e3¢sj36#ˆLá¯XîxØ”&Ê×f`d$X\Ûäå°Õ­zÒgçäë•F§r[¤¦eDɽ¿)k†!5‹\æ·7¾{‘™·<…*w!¹ZJ¨âž’HâtO‘Ò¿™¡¹\ÁmoòçÿJ´™ùù:å4™ùù:åg»rÛŽZˆæÐy÷ÜFVësC…¯'”öEéûÜ®ýqRÉ.ù; yf!1ÞÜç|~?ÖøÒ…í&~~N¹M&~~N¹^<ÜßBŸ×gï§€›èSúìýô¡ïIŸŸ“®SIŸŸ“®W77ЧõÙûéàæúþ»?}({Ògçäë”Ògçäë•ãÀ Íô)ýv~úx¹¾…?®ÏßJô™ùù:å4™ùù:åxðs} ]Ÿ¾žno¡Oë³÷Ò‡½&~~N¹M&~~N¹^<ÜßBŸ×gï§€›èSúìýô¡ïIŸŸ“®SIŸŸ“®W77ЧõÙûéàæúþ»?}({Ògçäë”Ògçäë•ãÀ Íô)ýv~úx¹¾…?®ÏßJô™ùù:å4™ùù:åxðs} ]Ÿ¾žno¡Oë³÷Ò‡½&~~N¹M&~~N¹^<ÜßBŸ×gï§€›èSúìýô¡ïIŸŸ“®SIŸŸ“®W77ЧõÙûéàæúþ»?}({Ògçäë”Ògçäë•ãÀ Íô)ýv~úx¹¾…?®ÏßJô™ùù:å4™ùù:åxðs} ]Ÿ¾žno¡Oë³÷Ò‡½&~~N¹M&~~N¹^<ÜßBŸ×gï§€›èSúìýô¡ïIŸŸ“®SIŸŸ“®W77ЧõÙûéàæúþ»?}({Ògçäë”Ògçäë•ãÀ Íô)ýv~úx¹¾…?®ÏßJô™ùù:å4™ùù:åxðs} ]Ÿ¾žno¡Oë³÷Ò‡½&~~N¹M&~~N¹^<ÜßBŸ×gï§€›èSúìýô¡ïIŸŸ“®SIŸŸ“®W77ЧõÙûëÔ­kƱ¡­ll`P“ªð¹ÏÒœçTu“ûQ,}Øüľ‹ú…¯Mîj¾´*%‘»‚8—ÑP§±ÐÔ{àùŒü!U¥ý_EõX-ªÕG¾˜ÏÂZ_Õô_U‡òÚƒÆå¾n‹è©?”‹°\~å¾n‹è©?”‹°[„s•ø>c?]ç*=ð|Æ~¤Š´Þæ«ëGò¢R¨©½ÍWÖåD¥YQEKú¾‹ê°þ[Tª*_Õô_U‡òÚ‚® M¦cÛ«¥Ï“~¥¦5¯k¶Q{ºÝu#.#§¾*VÉ÷½Ä'q°”» ·¾ßˆñ|k¨e&è·SS qd4ÔÒ87Œ€ÙI²ÙõÑbòÃ,oÒÇ !‰µ1ƒýó‰.Ë«SOÿmÂ=E†UÓ™‹[K.”ÂÙ›)9c¼’?P·Ž?½"Ç-òù/ªÍ]C¦™ô’¶14`H3æsHµˆâÌÜÍ.ãe¸”qb³Ô¼²ž¯|Bó´Ë–Ö{ÙfjñµÆî<¾N+›zŽ©Ôl­Šgç–™^ãã¶BK Hñ®ÀÏŠ,5€‚•&ˆÑÖš¨â§yq’ñÉY#¬Ø€ñË >öxÇ”))ðjŠXYF×Äú}ò 1$8„bÁ– ßzó fâ6×>Œéµ"ÔîŠ@$Ï|ÂÅ»ÙÔÖbAÆ”kYðâÕµ’SÍWcê˜#ˆKmN¥ÎZãor úÏŨŒ¸²‘Ž}>J([V.¼…¯‰À¸ÛÅͽØ|¼®òiº‘óbtÕr²+AÌùˆ.sr‘«WŠÓ~KÛ_¨ìqûÔÒ2•¤RÆé*o-²†¹í95xÚã_'ͽUVÍ6çñJ†·ytm¨dncÉ>&fæâ7iåòkAƒTQŠ6¹ñ8C$r<‚xÅ9„«^°ÓŒêÖ¤Áª ¨Ã¤sâ"šc}‰ÖY­6ÕË#~¤“«8…%.ðØdtÍ/aÄæJE͵8ɰ¸Ôk¼Óc“LÈ$–‘Œd†Ge˜¸µ³¬·Š.o{VÁc?REZosUõ£ùQ,Øüľ‹ú…¯Mîj¾´*%‘»‚8—ÑP³í] G¾˜ÏÂZ_Õô_U‡òÚ­T{àùŒü!U¥ý_EõX-¨HÞç:¢Bö‹¼4‡—\~ØÔ|¦ük›Á4ŽÝ^‰þ'E¦Þ¸½ÞYmÇ«ŽÜk@F|²@ÜHQ8BÙÜñ>ø@jiwîŒ~ç—’ëp§a4Nkbuš2$pßɳì|}dŸ÷ÌyMý:Ùü—ɽ{î®;þÒ³XÊŠgÔENÉL–ÌL@݃;DÀ[Ší9€19È×dF BZb{³8¹Åó=Å×âMËHkAiÔl5/0Óa°fta±Š"Ðâ^àÖÇ`M͈û_’×âÊx]Š>'ËŠ@ér0:£|2¬×s¸õkøÕ¸`­—Åiª"y®©ˆñ¶ÁÏÑãiñ½Ïº¸ãòBƒNl3k$¬És>C¾¹­p$¹ÙõÙ͹q³®Ï)S;¦t@XíêA {3ºÎß Ýåò’uù.me‡] mK*`¦mS©%‰Ì²™ sÛ·.½ót0eÑãÉŸ&Q—|ÍšÖòæ×—_*QSÉQ¿º;ËâYàFRâ-Éîœ>0H7 6á”lcXØlÖ2&4f:„g3ý¾[«h‚8!Žšž8"nXâ`c{Ø`5©9Qïƒæ3ð…Ñ®r£ßÌgá H«Mîj¾´*%‘»‚8—ÑPµé½ÍWÖåD²7cðGú/ê}«¡¨÷ÁóøB«Kú¾‹ê°þ[Uª|1Ÿ„*´¿«è¾«åµË|.ÝÑR)`¸ýË|.ÝÑR)`·""" """ """ """ """ """ """ """ """ """ ""ç*=ð|Æ~º5ÎT{àùŒü!Ii½ÍWÖåD¥QS{š¯­ʉJ²¢Š—õ}Õaü¶©TT¿«è¾«åµ[™‘‘n«t’Hö±‚‘Îs€IrJÝf5 «'c„­Š8ã,§‘²9Î/¸ "îÔË꼚¹ü•{¢ÝM4…Á“SSFâÞ0 eË|áUrUšÉ+ 5-ɽ–ÓÁ”H5Œä›‰]ÄG[„Yv-DÖ±ÆWYÃ1"7ì\‹¾ÃÄÖñ­l§Ú=" Š*¦b1ÄæÅ3£’730>5ãט––)·¥XTôÏ/§¬k(´î1f½Þ÷Ýšü]r;7“ŽÆþ±:J]SwI•€ÆÀÒ^æHñœÍqqpã®à ñ#„Á’8 {ÌìlqÑHÁâ¹Ã(mÀñ˜x¬nÙ1GèµL;ÓÅ(.…Ã[^7–¼c¯[¼žEJ–‡8†˜çA ’o¥Åñ\4 @Ê$ÔNöMÈ·%ì.G‚o8u] U†¢#.eÜßî™7¸SI:µßÉma+±šc-3!.”M0Šá®Ô \àð-ã4å÷CW¾¢½AŒÐÔo{ܯ´–Ê] Ú,}É$`x:‰Ô.Rl7}ÄÛ\%ÊöoyZ[qâï€ß_”J~B×Ä ‹ÞáŠ="ûÜT±ß'òòëñùoo‹ãAw¨}fIS h|вGñZ ²² ¡¦Ððúj\ù÷˜›kZö^ßì§@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDÎT{àùŒü!tkœ¨÷ÁóøB’*Ó{š¯­ʉdnÇàŽ%ô_Ô-zosUõ£ùQ,Øüľ‹ú…Ÿjèj=ð|Æ~ªÒþ¯¢ú¬?–Õj£ßÌgá ­/êú/ªÃùmAãrß ·EôTŸÊEØ.?rß ·EôTŸÊEØ-ˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€¹Ê|1Ÿ„.s•ø>c?REZosUõ£ùQ)TTÞæ«ëGò¢R¬¨¢¥ý_EõX-ªU/êú/ªÃùmAW©ÐñíÕÕdϼÒÓI–ö½›)µÿÙmÖ:¸UÐBé¨ä¨9šæµÌÊ R‹¹—'U‰ÆmcU®²÷-ð»t_EIü¤]L44”Ík`¥‚&µÙÀda :Ö¾¯-µ_‘nQŽUÇJéa…²¾˜Hê–µ‚Ŭ{š%ã.míüAä|~_RãUtÔòUË„KQ#eÃŽö$!ÅÜBâ;ZÞ[ßöV¬Øu CZÙè©å .sCâk¬\nâ.<§Yå^Y¼TˆbfôúyKs†6í{˜\ÛÜ^Òq‘ÆJ ÊœK¥«4v‚¢gï{Û¢‡-³ I»]%ލ¼áÇ嵌PWÕɉÛ$QUTG$ºÏk ]PI!®òäâͨž3mzx $3FadÍ›.øpn°2µ¡º‰&ö¿Ç¨ZÄÐP5±ÓÍOdÖ…±˜ Á¶µ¬q@ƒ*\b¹Ôµ‡Gcè¡|’gΖ¾FêÃ/½û^ëâ×oš¢,Fâx£’¡î_{$oyK¬E¬O½Wåºù‰a45o¤†¥Ùb÷˜ 0·ˆ’-.oŠß!BÖ+Aô´ï{}c?UiWÑ}VËj–ø]º/¢¤þR.Áqû–ø]º/¢¤þR.ÁnDDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDÎT{àùŒü!tkœ¨÷ÁóøB’*Ó{š¯­ʉJ¢¦÷5_Z?••eE/êú/ªÃùmR¨©WÑ}VËj 8\2Tâû¯‚&æ’J*v1·µÉd ¶ü"A ›¡’3 ¢ÞšÈ£hh,¹ã‰Þ+|SšÚ®åŸ¹o…Û¢ú*Oå"ìá³pºóS#ôg·|nj¦å±ÎíñŽ-n[9À´Hùäu‰+˰i¤}\°á§Üï`Ç!d!ŽI 9˜ò:¾+®­sU˜4®™ìm;Í%qŽžÂ@»#± “Å8IÈnîBV‹èå’,5²BéMÌs÷LJ—Ú2ÜÀ›^Îp7 8¯¨ˆ9ÊL&¥’Ò>zv½±Ii-;Ódkbümì¼çY¿”€Fˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€¹Ê|1Ÿ„.s•ø>c?REZosUõ£ùQ,Øüľ‹ú…¯Mîj¾´*%‘»‚8—ÑP³í] G¾˜ÏÂZ_Õô_U‡òÚ­T{àùŒü!U¥ý_EõX-¨1å Îÿ6=“{_{ƒæÄå t‡ù±ì›Ø¾¢w¬ÄöÛ8üŸûTj|›ä•›ÛÄQȾ—´1±6âB[˜9ÆùŽ¡¬ÆÎ4f¨´´ècn³kêÕñD¼°oY€í·ñy>#ö,™gs*#"búÖ: Š_ÅË¡¾-³\€ÓÇû\\JÅ,”⪱±VŠ‘ýË…ì9ˆßM†P½µ”¡H›ɽ‰¤?ÍdÞÅ$ŽOpöºíÔo¨ñدH%ÒæÇ²obÅš²y7a1} I½µ¡ »|`¹··/Ï)Z« ÿ¡ÿL“óXƒ §Õ1à~U÷H›ɽ‰Mþ*žßæ¢A.ÿ6=“{-Äá|ÛËg¥t·# ÍqÇ©}Táß´Jv¾vºVê€FEÿêM®ìÄqë÷DA•5dòn bû@($“{kCAvøÁsn3n^+žRµVþCþ™'æ±n Š›ÜÕ}hþTJU7¹ªúÑü¨”¨ *_Õô_U‡òÚ¥QRþ¯¢ú¬?–Ô!Ž(CZÍl$Ý€“ãP¼éócÙ7±%÷¸>aüNQ —H›ɽ‹áª!á§zÌA om¹ÉñµF¨ɾIY½¼E»é{Cn$%¹ƒœo˜êÌlãA¦j‹KAÞq°6ë6¾­_ATKËõ˜HÞÛp“â?bÉ–w2¢2&/­cª¥ñ|\±ÊâÛ5È <µÅĬRÉN*«h©ܰH^ØôØeq ÛYJô‡ù±ì›ØšCüØöMìP2Hä÷k®ÐíFúù Šô‚]!þl{&ö,Y«'“vSÚA$›ÛZ ·Æ ›q›rñ\ò•ª°ßðêôÉ?5ˆ: pS ^å_t‡ù±ì›Ø”ßâ¡ùíþj$éócÙ7±BÜNͼ¶zWKr2Ì×z—ÕNûD§kçk un¨d_þ¤ÚîÌG¿sÅ«ãH:CüØöMìM!þl{&ö,Y*j*¥BÙÉœ!Ìæµ¡ÙN@ÍWÊ ÜëXñk ÅA¨¦–vÅ,“:9e…{Zsd‡|¹ÊÉ6µ[ÈNµhiiócÙ7±4‡ù±ì›Ø³wàÃ4°ÖšZw3<·i8v¶‹Y 5ÖŸ%õ…òUBö²Zˆ`D–GÚò8¸ä1Åù@h XÜñë PÖÒæÇ²obiócÙ7±x‘¹$sA&Ä‹‘oø^Pdîj¦jÌ:Љ ’¾ió8ý+ÀP@·#vJyK³´]ÍÈyW;¹ƒp},ÿœõзü,Ÿ=¿ÉÉì4‡ù±ì›ØšCüØöMìQ"³W²ó>ž6“`^Æ÷ ìu‚hÄ‘:°ñ9¬iýì©ÕͼOG&‘=¥w÷² µ¿Ý?ãüƒ_’zÆJèŸ&#js‰¨kš3¸€Ð]˜7k>/Ê‚äu‚VæÐEè¬gÔصóÔô6Ð÷Ó=OA“m}G„Ñz+õö*ôUOÄw\ʶQVÁ (uE;£ŒŒ \‹q_ì[ùêz ›h{éž§ É¶‡¾‚fLÊw¶i3dŒçvV— fÀ\“ñ k Âh½Œúƒû¾zžƒ&Úúg©è2m¡ï Èðš/Ec> þÅèn¥€´ð^5vñÐÉ©jç©è2m¡ï¦zžƒ&Úú ¡º¦† 3 :Ët,S¦“~ Ƽ§ü ž^5«ž§ É¶‡¾™êz ›h{è2º¦¼4; ƈn  †ËëwVòöá¸Øqã"ŠK•©ž§ É¶‡¾™êz ›h{è2<&‹ÑXϨ?±<&‹ÑXϨ?±kç©è2m¡ï¦zžƒ&Úú ½ÊÅ,;“E$Oß&vIZà ®"àëˆ+B¿‹ ¥ôõsºG‹6šÒ7&ÂÃŒqñÿ±Rg©è2m¡ï¦zžƒ&Úú ¢ôV3êìO ¢ôV3êìZùêz ›h{éž§ É¶‡¾ƒ)»©cÜ/k‡”PÈӺ˼<áØÙxÔ¡Ipµ3Ôô6Ð÷Ó=OA“m}YÝXq»°ÜlžSE'ȾxTÒoÁ˜×”ÿ“ËÆµsÔô6Ð÷Ó=OA“m}G„Ñz+õö'„Ñz+õö-|õ=M´=ôÏSÐdÛCßAÌâx™Å‡Á‰±Ì¯‚G:Z7µ¡¡âä›jå]Z‹=OA“m}3Ôô6Ð÷ÐJŠ,õ=M´=ôÏSÐdÛCßJ¬üG†Žhéô,Fw1ž3 £{Ú $Û5¬uÅüÕ¼õ=M´=ôÏSÐdÛCßA‘á4^ŠÆ}Aý‰á4^ŠÆ}Aý‹_=OA“m}3Ôô6Ð÷Ðe»u™È.ñ·p/E!ããCº°rß ÆÎ_sÿE&¯‘jg©è2m¡ï¦zžƒ&Úú ·î¬IîðÜmß-…º°Ö7 ÆÃORX­Lõ=M´=ôÏSÐdÛCßA’íÔ±ÆîÂñ¢~:Ï ¢ôV3êìZùêz ›h{éž§ É¶‡¾ƒŠ©øŽë™VÊ*Ø!eã.¨§tc1‘„ ‘n+ý‹¤Qg©è2m¡ï¦zžƒ&Úú7¹ªúÑü¨”ª:vHÈ¥t±ïn’rðÒö¸Û$m¹ÊHãiR (©WÑ}VËj•W‡JŽ–ž#C&háŽ3iáµÚÐíüH+â8ô4sGO¡b3¹ŒñÞÐI&Ù­c¨Ž/æ©øM¢±ŸPb×ÏSÐdÛCßLõ=M´=ôEè¬gÔØ¾ÓÆ@ ÆMµúêÿ…­ž§ É¶‡¾™êz ›h{è2Æë,ÙÚÜ4)5¡ÝeÚpìl´jB’Ãȵ3Ôô6Ð÷Ó=OA“m}QÝK±Âñ¢5èdòq/>Eè¬gÔصóÔô6Ð÷Ó=OA“m}G„Ñz+õö*ôUOÄw\ʶQVÁ (uE;£ŒŒ \‹q_ì[ùêz ›h{éž§ É¶‡¾‚fLÊw¶i3dŒçvV— fÀ\“ñ k Âh½Œúƒû¾zžƒ&Úúg©è2m¡ï Èðš/Ec> þÅèn¥€´ð^5vñÐÉ©jç©è2m¡ï¦zžƒ&Úú ¡º¦† 3 :Ët,S¦“~ Ƽ§ü ž^5«ž§ É¶‡¾™êz ›h{è2º¦¼4; ƈn  †ËëwVòöá¸Øqã"ŠK•©ž§ É¶‡¾™êz ›h{è2<&‹ÑXϨ?±<&‹ÑXϨ?±kç©è2m¡ï¦zžƒ&Úú ½ÊÅ,;“E$Oß&vIZà ®"àëˆ+B¿‹ ¥ôõsºG‹6šÒ7&ÂÃŒqñÿ±Rg©è2m¡ï¦zžƒ&Úú ¢ôV3êìO ¢ôV3êìZùêz ›h{éž§ É¶‡¾ƒ)»©cÜ/k‡”PÈӺ˼<áØÙxÔ¡Ipµ3Ôô6Ð÷Ó=OA“m}YÝXq»°ÜlžSE'ȾxTÒoÁ˜×”ÿ“ËÆµsÔô6Ð÷Ó=OA“m}G„Ñz+õö'„Ñz+õö-|õ=M´=ôÏSÐdÛCßAÌâx™Å‡Á‰±Ì¯‚G:Z7µ¡¡âä›jå]Z‹=OA“m}3Ôô6Ð÷ÐJŠ,õ=M´=ôÏSÐdÛCßJ¬üG†Žhéô,Fw1ž3 £{Ú $Û5¬uÅüÕ¼õ=M´=ôÏSÐdÛCßA‘á4^ŠÆ}Aý‰á4^ŠÆ}Aý‹_=OA“m}3Ôô6Ð÷Ðe»u™È.ñ·p/E!ããCº°rß ÆÎ_sÿE&¯‘jg©è2m¡ï¦zžƒ&Úú ·î¬IîðÜmß-…º°Ö7 ÆÃORX­Lõ=M´=ôÏSÐdÛCßA’íÔ±ÆîÂñ¢~:Ï ¢ôV3êìZùêz ›h{éž§ É¶‡¾ƒŠ©øŽë™VÊ*Ø!eã.¨§tc1‘„ ‘n+ý‹¤Qg©è2m¡ï¦zžƒ&Úú7¹ªúÑü¨–Fì~â_EýBاdŒŠWKöé'/ /k²FÛœ¤Ž6•»‚8—ÑPžÇCQïƒæ3ð…–£ßÌgá $oq5Œsäx.³X”Ž_‰|Ë9&Ìw’_{ƒæÄåBw2(³Õ5¦'¾ÔÑgsˆs¿Šë 8ù9_Ë9&Ìw“,ä›1ÞT›4‘°¶Xf/kA±;Ǒͤj9œ<@ ë² —º]锲ºQ›3Cãm—ÅÙO»oõ{€æ´.o|Ç’ÖòßU¥†ÿ‡Pÿ¦Iù¬A½7ÉXËÛ3€¿"÷–rM˜ï%7ø¨~{š©Y3©è§™€Gžâ¸Ao,ä›1ÞL°s’lÇySªÔNÕTHÑ4l~f5Î7‘ å hòj±_•ì°s’lÇy2ÁÎI³åF:ÖÊo3³1»îK6ï -ãÖo˜jãËa­xv ÈâßdŠFDè·Ö=Ŷ{nк¸¹{}Ðh4rÁÎI³äË9&Ìw–luÍš\ÌÌæÜ20µù¤ÏhƒïžCmzø”Â¥Î~öÚy0$:0æx¶ $—fËûmòþÐøÒ…Ì°s’lÇy2ÁÎI³å^'‰`ŠPlŒl€;8?à¯h)áxƒ1JWÆ:IÐã®Í{š ùrÞÞKùV„q±Ñ¹ï{š@ñ[~;üc‘sû‘ø7ÒÏùÏ] ÂÉóÛüœ–rM˜ï&X9É6c¼¢U¢s·ïïe™®/{r¿»°¾P×[[ˆÇÆ„UWö]â2ðÌ f>A{ê×åÖ¬,=Øüľ‹ú…¸€ˆŠ" """ """ """ """ """ """ """ """ """ ""›{‰¬cŸ#Áp½šÀ|¤rüJ,¾÷Ì?‰Ê†X9É6c¼™`ç$ÙŽò‰bn²¶|?sîžž¢jwššh̰D%‘¬|ñ±ÙZZìÎÊãa”ëò è2ÁÎI³äË9&Ìw—GºFa°â“×WÖTÐRÇÛ-};i§ß${Ù´²0qžæ†ÝÏ»ìÓ—Å>íxO¡8M%Mt‚©µÔòS¹Ì‘ާ-9÷Ì„Ëû/>îÄ\ª¾X9É6c¼™`ç$ÙŽòçàÝNUBúÚ}úJvÔÓS5á–Îg–8AËiÙ{Ø‹\¹ë_U¢8kñ9%trR &Þ4Zg¹Ï%ÌeóÌ.½ß¨Xjß,ä›1ÞL°s’lÇycnj®|Cr¸=mS÷ÊŠŠ(e•ö3œÀI°Ô5Ÿ"ÔAVZø[E†Æ×¹Ï§}Cžà9­ ›ß1ù-徫K ÿ¡ÿL“óX·ì~â_EýBÜX{±ø#‰}õ ¡¨÷ÁóøB‰KQïƒæ3ð… e÷¸>aüEBÑ1”ß6öcõX¹¤þ³k° ;©5lòX4ZªV€àûr•[Á£ÏëswÐl:ñ×p{Ìd8â–‘«Žî¾½Z¸—HÑ(,¨ž6äy{ƒ˜_#œcÿ&P-â‹ã++Á£ÏëswÓÁ£ÏëswÒÆÜLl*"„e´1Éf’Ö†ŒÆÙަ´j jøÊðÊx˜a¶ù–&ÀÛf6ôAi:¾#ÅouñàŽ Ñçõ¹»éàŽ Ñçõ¹»éca±Ò嶺(hdmß@lmµ€üCÝfòò•ö8#‰Ž3+XÜ  À›IòyxµX5±¼Áz<þ·7}<Áz<þ·7}Øm®âuÜ›rüCý–#þCþ™'æ±<Áz<þ·7}Z À0Ü2¤ÔÒÃ#e,1æ|ïŠH$YÎ>P>Äôßâ¡ùíþj #dÑ>)Øö–¸_Œëzßÿ¹swÏ3^ZEõ\¬ŒkY`_çõªŽÔ‚™,²ÔM ‘’]ïhkƒµ´ e£Žö²øØÙ7Èåš)KÜã$e¹¬ZÀ@»Há¿Ìð3ÿ?­Tv§xùýj£µQ©ÅQ0I’9cfp$ä€/oÿ†/ò•R6Ï–` "ÂÆ?>÷g1Í"ìo¹ÞÇký·¥àfþZ¨íO0/óúÕGjXÕ|aä9ÓTÉ#ZCd–@âf8-mF6굸ïu éœ E3ÜׯId”:ùujÃöû#Üñë*‡xùýj£µ< À¿ÏëU¨5c…°Å BW¼DƲâÀ;+x­{\_•}+Z.çXK­ryu²| À¿ÏëU©à^þZ¨íPE¹ƒp},ÿœõзü,Ÿ=¿ÉË'Ðx)ƒ k›HÙ%k3I"G¸“¬‚uë×äâVkpz\^+ñn¸hšFH:Èa×Äxø®yPXQÇ 6ú_3Ü ‹ç ¬.Ås¨»Ëm|Z‚Ìð3ÿ?­Tv§˜ùýj£µø(Û 4-|ÒÉ;!‚B[hËr;Å£‰Ìoº¿¹øÊ™ñï…¤ÔÕ—€àdtsÈ6$knPR×7ÿ¨¯[Å|Œy”ˤ\ÀÃk‚=È#XçÊ¥Š–([uãís¬5ˆËI°åvFë¿ì·‘z“EôjÆó™îÞ„'^g9ÚÝžÜgÍò+ô=¢òû ÊßÙ¹õ¿kìÿô Òƒr?àúYÿ9ë¡oøY>{“—=¹ƒp},ÿœõзü,Ÿ=¿ÉÉìV{Ü*)ãm­#œHò9ßý!@1*GB&߀ˆØ‡¹¤4ܨ‘®Ä€y/®ÊÎ@g†BHÞ‹€ã»ßþ«ÿ²ðÊvµÔy¥qÐÅñxò>'.¯{?j"®#”4J绊6Äâþ+û.5x¼£”/nž6ÆÇæ.°f@\_~+ryu/›ÃÄ’JÉÃd‘ï.sãÎ\#òf7ˆk¿”¯“Ó5ôÑÓE!k#köæ$4 z¯¨‹5  ¨\ë5ÅÍÕwµ¤°_ˆ @›‹uÜr…ᵑ81Ã~p‘¬1±´ï.pvrÈ!†Ú¼„ò)™£”–ÕI½çÆ Žpk[î¯f‚?dÚçâ´-¤’9)·™š #Š7=ñÜÈei6Ì/rðº}pÔ §’65ÖyvSªåÀƒ«Å ·ˆëãÕ¨©”qSˆ|VLlà3¹Ñû£Ï6µ{ãÇýŸŽþÚ¨¹àê7–×}ZïÉöžD›¦÷Œ3ýN›ñ…¸°÷Mïgú7ã qD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@\äm|ŒÝLtÍß1¨£q…ÎkòºžŒ:Å­q):Å­Ç™žé½ç"føqæäÏlzœÛ&n(hí‘ÜV½ì-kæe³6ÀÖ~O&|ÒV ù¯–²aÇžö³µ{ã­n+6ÖÈܸ¬‘˜TT%¸‹([YVè%ª­ª›{‰¦)ß{ YbI°ñ…¼[{†eßf+O&L±Ö ùmšŽaÇ’×»u{ão~+:öÈì´jå§Äk0©Úk#Ñ*wð×PÍãæˆÆ»F_ñ $ž,®Ù]”2è1 9°Úššúɪ*]58tÕ•™˜ç“ l{Ürï²´†—[y¿‹½€ÁŰ¹1*¶IQXi 42D!š¤Ìéd}S^Á]›3r»Å f]vÞÛ“Æ!ƒQbÚCÝžGTb×Ef,°µÚk嬘q罬í^øë[ŠÍµ²7.V磤Â(wˆáÈg”H[IƒÉKK„`Y™IœË—8›ç¹„3U˜­<™2ÇX3å¶j9‡K^íÕï½ø¬ëÛ#²ÁÅ௖OÒŒOœ¼Ììï/8»4¸,f»ÿ•¿4q/ÐWç{Ÿf÷úJ¦&÷—sá¹2dËc¬¹o“#mæ·ˆ~ˆ’ v?q/¢þ¡n,=Øüľ‹ú„ÐÔ{àùŒü!D£¬«,¬ÞYM,®l1¼–€dr•7£êzÑ÷ÐZEWJ›Ñõ=hûé¥Mèúž´}ô‘UÒ¦ô}OZ>úiSz>§­}¤Ut©½SÖ¾šTÞ©ëGßAi]*oGÔõ£ï¦•7£êzÑ÷ÐZEWJ›Ñõ=hûé¥Mèúž´}ô]Ÿ)ÞätO·‹#@%§ÈEÁ!bx;/§ñ³;‹KJ›Ñõ=hûé¥Mèúž´}ô¾ËéüglÎâx;/§ñ³;‹KJ›Ñõ=hûé¥Mèúž´}ô¾ËéüglÎâx;/§ñ³;‹KJ›Ñõ=hûé¥Mèúž´}ô¾ËéüglÎâx;/§ñ³;‹KJ›Ñõ=hûé¥Mèúž´}ô¾ËéüglÎâx;/§ñ³;‹KJ›Ñõ=hûé¥Mèúž´}ô0Ì:,+ŽŽ$‘Œ.viÌKœ\o`>DÄ(¥®‰‘3«¤hvc£9­.>K’Òu\ñ[ä_t©½SÖ¾šTÞ©ëGßA›à쾟ÆvÌî'ƒ²úÛ3¸´´©½SÖ¾šTÞ©ëGßA›à쾟ÆvÌî'ƒ²úÛ3¸´´©½SÖ¾šTÞ©ëGßA›à쾟ÆvÌî'ƒ²úÛ3¸´´©½SÖ¾šTÞ©ëGßA›à쾟ÆvÌî'ƒ²úÛ3¸´´©½SÖ¾šTÞ©ëGßA™àÈtÐ>|_¨l2²fÇ,Œ-.i_Äø–ê«¥Mèúž´}ôÒ¦ô}OZ>ú HªéSz>§­}4©½SÖ¾‚Ò*ºTÞ©ëGßM*oGÔõ£ï ´Š®•7£êzÑ÷ÓJ›Ñõ=hûè-"«¥Mèúž´}ôÒ¦ô}OZ>ú HªéSz>§­}4©½SÖ¾‚Ò*ºTÞ©ëGßM*oGÔõ£ï ´Š®•7£êzÑ÷ÓJ›Ñõ=hûè-"«¥Mèúž´}ôÒ¦ô}OZ>ú HªéSz>§­}4©½SÖ¾‚Ò*ºTÞ©ëGßM*oGÔõ£ï ´Š®•7£êzÑ÷ÓJ›Ñõ=hûè-"«¥Mèúž´}ôÒ¦ô}OZ>ú HªéSz>§­}4©½SÖ¾‚Ò*ºTÞ©ëGßM*oGÔõ£ï ´Š®•7£êzÑ÷ÓJ›Ñõ=hûè-"«¥Mèúž´}ôÒ¦ô}OZ>ú HªéSz>§­}4©½SÖ¾‚Ò*ºTÞ©ëGßM*oGÔõ£ï ´Š®•7£êzÑ÷ÓJ›Ñõ=hûè-"«¥Mèúž´}ôÒ¦ô}OZ>ú HªéSz>§­}4©½SÖ¾‚Ò*ºTÞ©ëGßM*oGÔõ£ï ´Š®•7£êzÑ÷ÓJ›Ñõ=hûè-"«¥Mèúž´}ôÒ¦ô}OZ>ú HªéSz>§­}4©½SÖ¾‚Ò*ºTÞ©ëGßM*oGÔõ£ï ´¹\Wp´ø¦'S\q¬b”ÔÆÉ+Ÿ 0eApt¬¨e3ÃÉ`ÊÝöFÙÀ8–]Å­>)Ør\Fí§1ѵõŽsaÈöÈÖÆ ís1‡+lÓ‘ ‹Ü®#lêhÍ·ì§I±i–Q+È9®¾5®ki))Ñî„>gÒWRMlu:4¥ŠZ˜ƒ‹ðwưenYY­áºóquŸ¹ÌO©Ÿ’ª±õ Åð·×¾7±´ï<­/÷Î9qñ[¯Žý5 ¢¦;;ß%Nø÷ºÀ]Ïs‹œl¹&ÀÄTY¹ -UA£‡CSéëæ²' :8Á÷M"Þ+2¾h´ÍUYìh©ÌÐfÃê%1ümñ’B‹¯Åiå½õYº:ªÊ: Y¨ædDâ‘Kš<ÅѾv1Íì ã±Õ{XEùpy±ˆ1WæÒà‰ÑFáXàÀ×{ X”ÞÃŒ~Ë|Ñh*·-AW‡ŠXæÓŠ“W–*×DwÒó!vf¼vâà/`mn!`¯Í-°ü>)_ Ä*Å;åcˆsù^Ásbs.-Ϙ€¹? ñ|7LĪ]Y5,u8ƒ@°HØ7÷5‘ÆúhẼ-ƒøÉmû¼S~#JÆ2hᨆFÍO6víí7® ik€ –¹Ââê¬{ÂãžiM8”Lé^èg¬t°‡H]¾Æ÷–4»;Á Npâ$9½ÜnŽz+ðêmú[DùQ¡¦î§¬pý’E8 ‚ È×`C­ËŒ××c˜1†C†;¨¦2 —o’º(jæº0ܹsÆHñϹi°@â뜷%Äñ’Pab{¤«§Ý††2˜iW¼JãE+ÅFhð[ i`k\}y®NV°—hàÕ‚Ÿ¥¨|ÓŒ.¥Ñ lé$|f6JÑaw9ÍlŸ´ç_Ö[3á‘ÔÍM,ÍÏ¥Ë ß€ÊâÇ2úŽ¿îùT8^ü:•ì|ÑÍQ4®š¢líäŽ7>RC@³Z $5­6Pcnƒ{7,1 «)wÊšxóŠG š×T27Ú)Nl¥Ö¦ú¬¥êj(pc>ZœLMˆ:’‚I {$”62ç™YEÍ-{&f¨¯â6â×zì*ðÈëalU ìl‘ÊüŒÇ‡´ê>G4öUj·7EXùŸ,a²Jæ½Ï†¨Äàö‚Ðö¹Ž®Êr— Û4’8÷nƦ JZ‡aõ›íM5,PÑHÉ€d¹êËÝ”FéKa¸;Þb./–í~îC…Ó×? ›Toš²ÌœKâ3ˆšì¯-2ï@äñ²îÈae„ pÇecwØëÉRòL²ÝÀævwf&åxªÜVWJ)¤ÍˆÆbC^øŒÍ$’$-x2\¹çÇ'[ÜxÜo~†M^í $¸€’‰Ñ½Ååxª•ÆVÄ×ï;Ù&çj‘…÷³K®Ñ£†ãóUàux…FY´¹óS²3M•¡ßÝ Ç:÷Ë­­ñÀ¹¸ýËPK%L“1Ó>{ÝÓV¹æ;¸;û¢çëÆ >&[4þÈ´ôØ =% Ôæk&;Hké^H¶c)vrë½À,ÅèñLKÃa§ tRGS¥Cc½äu8»¯senøàb!¼zÈšã+ɵÃäÏ™í9X \H!Y¢Ð7qXK$sÄ7ŒÄƺ½å´¹®´M/´VsF@ܹ[kX*+ÑKfz&6j\B–…ìdÅÍ.˜AwZ54Ïɯ/’ú£ÂwGU‹C;âÃál±É4Ž©-©†7¾ÅÓFö7{peÜwXå$X›ònG–xf{e.‰Ñ>Ü# lŒ´±ò7=¤pÈßà“”\›$;– †G‘Òç–)\úŠ×M!1¼>1ï.Ê× †Þ×'V³x3q—Ö˺¬Šœf§1ÍS34§Áïo€]€—ØHïîÝfºúø‚‚ƒuŽ'C…ÉMƒÃV#LêÈ¡¨¬ÊÑ Dw%Íc¼béFQmmÖKOŠºgᑾº*×63Qo‰ß†¦¼´¸ZöÖXß³ã*”›– ’†Ž¬t1QF!§u=k¢‘‘€\ìxqoŠÛ‚lKA7 “vR²(«Û†²L)Ø =ì¨&¢(7¢ð_L€— €o—:ȸk²øƒuøC §f’®z–Ãùà„ƒ²\>Hâá¼@a3|md ÆnC ЦY£§ l­É%;k)ÞÝìEc}ìŒ ¶_ äRSnZ‚–h¦c$ñI¾²ië]4€†=€f{É- ‘öi6ÄsuG¬'á<ЦŸYÒçÚD >³¥Ï´)§Öt¹ö…O¬ésí iõ.}¡D@Óë:\ûBš}gKŸhQ4úΗ>ЦŸYÒçÚD >³¥Ï´)§Öt¹ö…O¬ésí iõ.}¡D@Óë:\ûBš}gKŸhQ4úΗ>ЦŸYÒçÚD >³¥Ï´)§Öt¹ö…O¬ésí iõ.}¡D@Óë:\ûBš}gKŸhQ4úΗ>ЦŸYÒçÚD >³¥Ï´)§Öt¹ö…O¬ésí iõ.}¡D@Óë:\ûBš}gKŸhQ4úΗ>ЦŸYÒçÚD >³¥Ï´)§Öt¹ö…O¬ésí iõ.}¡D@Óë:\ûBš}gKŸhQ4úΗ>ЦŸYÒçÚD >³¥Ï´)§Öt¹ö…O¬ésí iõ.}¡D@Óë:\ûBš}gKŸhQ4úΗ>ЦŸYÒçÚD >³¥Ï´)§Öt¹ö…O¬ésí iõ.}¡D@Óë:\ûBš}gKŸhQ4úΗ>ЦŸYÒçÚD >³¥Ï´)§Öt¹ö…O¬ésí iõ.}¡D@Óë:\ûBš}gKŸhQ4úΗ>ЦŸYÒçÚD >³¥Ï´)§Öt¹ö…O¬ésí iõ.}¡D@Óë:\ûBš}gKŸhQ4úΗ>ЦŸYÒçÚD >³¥Ï´)§Öt¹ö…O¬ésí iõ.}¡D@Óë:\ûBš}gKŸhQ4úΗ>ЦŸYÒçÚD >³¥Ï´)§Öt¹ö…O¬ésí iõ.}¡D@Óë:\ûBš}gKŸhQ4úΗ>ЦŸYÒçÚD >³¥Ï´)§Öt¹ö…O¬ésí iõ.}¡D@Óë:\ûBš}gKŸhQ4úΗ>Ð¯Ž­ª{K]S1i ÈlB"ÿÙPythonCard-0.8.2/tools/standaloneBuilder/doc/pic24.jpg0000755000076500007650000016327610231140007022507 0ustar alexalex00000000000000ÿØÿàJFIFÿÛCÿÛCÿÀ¿š"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ûƒþ ÿ„ý¥¿àŸ´ÇÃï‚?þþÎ^ ð†¿û7ü.ø¡¨|Mø]¨ø—Äqx‹Ä—¾4ÑõH¢Ô´_xb¬$–WñÇ}m=輸Ôä›RkI M;ó³Ãßðp×ü×Å^ñÇÄ/þ̳&½à†?ðŒ‰^7Ñ?fŸˆº¯„~Âiª>‡àÓãÙxöm‹âÝjÃ'_½Ó›\Õ-eÓôåžú;›[_Ù/Ú]ÿ„[þ yûcø£þ?|7ÿ„oþ ¶ø¡®ÿÂÆøkköþÉøk¨ÿÂgà+/øJüöÏxcì¿Û¾µÿ„ûÁh×4ë(¿á+ðöïí­?âO…Ÿ?gø(ìÏû{Ùkz‡|ðžÓÁßð@¯Ùgöˆý¥þ*\øáÿÆ?Ÿµn¡àÏ‹_µwÅÝFïUø‘áŸøÖãÃZ¤ºrk>7øñwû+Âÿ¼5ªø£ÅsZE/…<7ýÃ9w ®ɪâø™N•Y¦q:¸™T“Ï3œÊXhÒ…9Ö\ý…:Xª•§VŒ°Ñ çRžæuóO¯âcG;­†ç–bðøEvÿbÁÕÄ$ª9¹(9Q´”é(F2vŸ=”¾_ø9oöï#Ÿ„_±NqðKÄØi8ÿ’›ÏN¼pqÉ]hàä¿Û¦Fa'Â?ØÙqŸ»ðOÄͰy¬Š[?ÔôÀpÂ=›ˆ+r–^ÛûBÁ8?eM{ö£ø/û8|0ý”þ3þɺÍÿüÄ¿áøåûEü#øýðÓöø·ð/O²ñV§¢|5ƒÇž8ý®~+øûãwÆoÝ|4“Mø#­|ñ·ì±oñãNñÝî™m¡|6Ö¤ðωü5ìÁ3¿a»þÄž3ñ—ì§ûWøßö€øûnÜx»àæ›û3~Öv>øŸð[â‚<)ðsâ¯Ç?ÙsÂ?ÿhÚó¿ nìþ'E½§ü<ý¨?ëÖßud›áw„¼UãØàúÊ”<Oõ.£©ŽÃbqTpÐÁF¦!ÑÃásZ¼if!*˜ŠYV1P¥J¥J’¨©Â¬hº‘KÌæâÇí"³ˆ¥F¥:3¨ë8Óç©S IÚRÃŨӖ&<¥¤¹¥ 4®|€¿ðríÊæ“~Çøex‡àŸìáÏÚ3ãÝ¿‚?gÛoö>4ŸÄ:/Ã}/öÌðÅÿ„ž1øâè|eà‰~0|bý¢|ð»ã€µÏ…ž ð¹i ë·+ùû~Ëÿ>)~ן¶WÃü5ø“â{‚¿l~Ë¿³GÆ‹_Áß~,|`øMq}¯‚_¼!ðº÷ÁÞ?ñÄÍ;ÃÃZñŽ~|ñ/…¼O7Š| ªÁá}\ÒŸ¯ ”xQŒÁ昺<½ŽU„Ãc+NxhÓu©â¨Ñ­B2̯W¦êTÄ}_ÝEYÒ‹œyçŠâšSÃQžný¦*µJ0QªåÉ*3”%ÎÖKÊœ”#Ož£i'&‘õÿÁÅ?¶áwÂÙOð¥õóƒÆpOÄ%È8$/,çÚ‡þ#ý¶¤á¾~È~î¿õí©û·lø¸$Jîš5Ú½£RÒC蟲'ì7ðÇâ†-|GñöYþ9êÿðQïÙ·örøáû, ¿k½ ~É?²'޾i¾$Õ¾;'í>0Ùütð2øãT¹Õ5•ø¡ñûÆ^9øcÑV/ hz—g¨YIôÃø'‡ì ®øÇöø¢ü-Ò>&ø_öÀø“ÿ^ø{©~Ó°|Yø©|Hÿ„;öRñÇÅ-+ö|øðÂ÷Á?´ŸÙòãZ»ðÖ‘á«ûÍ[Pø=â¿x® MF ˆ¯oð›,M*¼êO Ò©*p•aaò|Ç<­UN9²‹§ YŠtÝƒÁGBN¬6£WŠ«Fœáœ¤ªr¨)ʬ$åS†ÁSžâ•|E+ÿϘÝWösJÅïà¶ðRÝ'á¶ñ—Zý–¾èÿ|Y¬Máï üTÔ¿f?ˆ6? ¼K¯[K­As¢øÇ7ž*ƒÃ:ίþñiºv¥q{ ¾Ö➦ҵ8¬x!ÿþÚ'þiwì=âÌë^Ÿíxùsß=1Žpwû«ÅÞð׎|?à-UÒõ}'PðüÄ¿íð7Fð5ÿŠà‹Z_ü÷Dñ7…üsñ†ë_øiñ¦ÊÓÃ6ן ü~!ø¯ÃWßµëTÔu-#â7‡¼oñB ßø–=âž“¦Øø7Oð_óУò‘øgsþ™ôã#îà‹·÷O’p—†ùó¯,/áè}YÑU)â©(ɪôÜ¡(û f&›IÂ¥9^qjtäÒtÜ*KÉÆfÜI”\Ú¥HÕSp•)7éÉE¦ªaéJ.ÎZZÒZó)F?ºßð^¯Ûo¿ðÃöUûªK'ÁÝ[jåä\’|fAN0x*ÅŠ§œÖº‰ÿÜý¯›¾~Êàñ¿õ"'OŒÔ‘ÔdªœŽBŸ1bü4±^AòÏ ‡*¿*þö^XýŸæ'1ÚP6cò¼Ë.†%ÀQ°.06§*¼¨ÀýÚü¼cî.08M›`ö§áŸ)É.ËU›Ó–·N_ú}¦îÿš[¯;ýfϹíý©‰µÖ—‡eýÇÿÝ-uûiüWö»—9øiû-Y‡ÁýABüŒ@ÃxÏæ$ܲ¨ûÊ(ybØþ ‹ûZ¸%¾þËÉŒuøA¨qO;ü[vžãî¶â„J°~!گͻfv¾NÑÈNm\±Û¸ɱVFÝß:šÝvƒòmÆÃÊíÛ„'÷d¸< »HÌ^^ËX—†|ÿDÆ[ÿ€Öïÿ}æ÷·ê)ñ>~¥¦i‰Z-œ?»Úôô[¯Ùõÿ‚ßþÖM×áÏìÀ¼¿/Ï -þ"p Æ8Ý·^ø-‡í[ %¾~Ì£™9_„w¸3´ø£ˆê )V?b=6ðÃ,»ºª Ýq»SÆÏ—ý^ÌCÑÚ.v?•_”goSöqó6Ü‘¹v•eØž^Ë\§á¯¨Åÿ«9roûµWoú{ÉÿÛ¡W‰óõµšbS¿GÓüKìô_ û ¿ðZÚ¤œ‡Ÿ³?^ß .xˆÉÿЧ=8# q‰ZPÁfÿjINáßìÚ§#p .~LÈW–o ØÁS´rHamøçä|½üÑOÿHe÷Û§ìÿÁcÿj>o‡ÿ³rŸâð©¦;~ÿŸ(b ó÷x£yŠäðXÚv\îðìâ >Ê0l`ò9tÚªÅÊ(šKÈèÆÕQ´&Ñ÷çž7Œ)Ø™#ÏÉ…\ü›s¥¢òNÀ6²Ç†N ÊŸ-q¼üñìP_1y^mœ? øËþ1¬»wöjÿ2_óõùöý"£Äùû„›Í1:%­áåýËtî¶ò´\ãÿ‚¼~Ò®>ý‡·üZiÒSvýyKqß Ð«m`Á-Çÿqý¥ˆ>ýž:9ãáKdmA?ñ=cÆÑ¸£†ÜѨ‘ ü¥€aï|ª£îmòÿvÕLYé»;Wkew·lZ¯Í÷z+œc8Às’<¦äc“µv‘ñy{í³‡‡ÛO†òþŸf·—ý<óæºE>(â{渧kõ‡eýÇÛOMô÷Xaÿ‚°þÑÒ ·¿gµåDZÁ``ë@œe”“´†Q½#s,P[ðU¯Ú(çþ(ÙøŸù¥IŽ­ÝµµÏNzt9ÀÜcü¹µ\.v¨ÁeÎ9\×hRü¿.Þ‹±‘ˇg‘k¤¼dr0OÀž‡jzsÓG+·0â¼:à†ÿäœË÷_f¯Wÿ_{y¾¶¾­(ñOsµý«Š·nhò7[.‹m´ºýHƒþ ›ûCË÷¼ ð9 ¯ü*ØÃ'ï å·jƒ<’@û@´ÑðTÚç> ø 1Ô­ƒrõëÿ\ÆqÇç9óÉ0yN»_£š?Þóþáw“i8dS¹|Ÿø—o(ëÆ1íó/'¾Á–ãŽFþ¹†‡|šÿŒs/Õÿ-_/úz¿ò}úÑÄÿò5ÅZïíBÚmö<»­¼®¿J`ÿ‚œü~”Þ ø  2†oøUЀ‡Ëø™6ì7!Â9`¨%’Û]?à¥_C| R@'þ-…®įÍ~¤œŒ Ár¯;?4lÇÌät;™r#Ào˜þèä ¿wrm ψü¯:Ï¥„b4Bác ò·Ë*<0>Höà©ÝåSÃÎ R¸w®•ýÚ¾¿Ïú-<µU.(â-3\RZ}¨[hÿwõÓO†ÈýOø)ÇV8>ø8sÿ$ÂӪċâp1–@°fŒyÄ_ðQ?Ž ·ƒþ ç9øgeœíF r¹VËrHe ¡Õd2GçCæè‡•ÈRwå61·qùWnÜî‹ËßkÓZ¦ÕÏ•³Œ°ÃŒÇ <ˆÿvûrËåªGȶùÑSÃî N6áܽiüµ{'ÿ?u ñG%f¸¤ÝïïG§-¾Ê·Ü¿Eú?࡟_ üsŸ†Z¸ïv ‘´ddc ’£y‹NÛÿãD„ð—Á°IUøi§“2È”ö%HÂíxÛvÜ\­—çòŒ˜Ç¯|ÏÎv§ÍÇ?0Æ ÊlÝí¢c`òÊíe;@ÜS÷Ñ È|†Îva†dˆGîþϳK‰ø}ÁiiÃØº¯Kw¬¿öÞÍtâŒÿ•?í\UõûP[(µ§*ëå/ÐûÕoOŒdø[àîps†ºY…cõÄžFAÀàà|ËzßöéøÁ+Þø<e Wᶘ6)2 ¶IÉC1…VݵVáí>AÇÝÆŽ9Uù¸}88\'åû˯d¿¼C¶?–D9Ûþ¯çîoÜüÍòîa‘µF~O³ùšvkÃþ tÛ|?½·µ^éÏÅÿçîŠ-:« ü$\¨$·Òr U8Äld‘Ê« ʬYVÜ_¶¯ÅwÎï ü( 2K†ú9ØLØ#i ß ` ¢íI72.ù`øÂÄiò„QÈÚGÉÀ_*9nл\z0 6í®6äï&<$ç8òŽdw)ßѶø¶ùÖù¨<où'ð:v¯eýý~ç­ôÝOŠ8ó_5Å;^ÚãV·îü—{Û®©}­í‹ñIÆ[Ã_ t9øu£d«ÁÃ[®TîcÉV] :¤žtvöö¿øœG>øYÓœ|:ÐðÒqþ«ž{ñÀ9Ç%~F¶M +fV0È·éþÈÛs·åòÂ${"òü›=}Þƒt'O¹íÁÀÀ^ÝV#À\t¿°0:»mVöÓþž7ó²ë®öQâž!s·ö®*ݯ tÿ§o²ê½çØ0~Ö$fxáÁ<'ý Šƒ+"îÍ 9ÆnXö2>pVå,î¯íMñõÐ~û§žã§­¨õ ôÁó¸'ʶ‹µÈÛ³ñçnf,<´¾ÌIòE°«/Ëö/MÖAþÈ;c/m‹ÁÇ< ݱd¸„9¿äCÒÿf¯xÿÓÇçÛ¯Ÿ(ø§ˆU¿áWÓ¬:rÓ¿¿~—kCêKÚsâ Åh_ Ô¹ÇÃ߃ËL§¬œífûŽXªyÏiª¿´w´O‡jp2?á_øpàñœ§.@ÉÆB’X/Î#ù~ÉpјÿWÉ\%˜õòq2~wÇ—»1ù^m‡EíU`´ …ÆÞùKÀÆ…À„Ûˆs| Â<öþÁÁZýªÚÉÇþžzß^÷k£—ñ zf¸¯³Ö]࿤´Ñ#èˆhÈpÚ'Ãìwuøá­©òHØléÄJîš5ÛïhÔ¼ìEñ߯r[Fðø@|1ÆpsóiJH9#î‚Äq,p|Ýj¿8;å?x}Äý܇÷gäܺ‚6mðíómúkUÚ¸ØW 8Æ1òÆ3þ¦?”ã´lÀM±y^E¬TànI["Á-WJ½â¿çïo^ºuâž!Óþq[G¬:¥ùwú+yt÷1ñËÆþa>sŸø\`ú éc>çŒ`ç6݈>0ø®F!ô¿¯ÞÊø[rìªX¶ˆªr8Á(Á¢“pL–žƒ§9+ì>EÈ㞘#¶>N–ÍpØØ«·Ì;Bá“.æo"?½³w&ÆÆÔò¼»Ÿðš‚k"Á'ß–§÷¾¿ Ÿñ ÖkŠ^Ž} úú|¶>‡ð¿Œ¼aâ›Já[ié:Wö½íæ±àMÛ%±ÔôÝ%5Ò|+ª^I4—š­¢¢­¦ÁšòÉͧ§þÐñ/ý ¿ÿðÞ_ÿó°¯0øh0¾=ãñCÛñÿsçÿÙ^=8àq…ÆÕþekÙûãÇ‹þ<~Õ^*ý—?gßÚ‡ÃÿðO»¯hSÁK?g¿ø–çàgŒ¿à¢~2°¹‚oŒ^'ý‡þx—áŸü&ßò$ÿfé?´¯Ž¼ñ+àf•ÿÒ¬.¾ü,×|AâÛkï‹/üSŽgáþ –[—dÙ,0ÑÁa1 ëJ•¦êVMÍ9¼L7å\±¶í¦ÒnKôžŽ/9Ê7šfŽ»Åb(þë©Ã’›‡'¸©;5³zz]#úUñížøÉá‚ àxÃÅ^ñ'Ä£ýð×NLÑü+áŸx7Â2¶§âèyÔµ­SÆ)ý‹i¥[jê¶ú·6µ.=oøøÏ}{©ü`ø¯©jW—Z†£¨|JñÕõýýõÄ·w·×·~(Õgº¼¼ºäžæêæy$šââiY¥w’Ggfcýh0ø6ßöÜý øuáøB~AûêPøÁŸð‚ê¿ ¿áðl_þ§†<1ÿ Ï]м/­ü:þÀÑÇJÿ„Xðׇu_ý“þýCBÒnôù´ûãßâÏü•O‰öPTñWÄB«¼ø´Ê ð@ùW‚/ê ŠOÇn?“»Äåwÿ±m//ïé²ÚÖé`ÿQr ßÙâ¯ÿa2ÿäOæø"ÇíIo|b‡Š¾"|œ`•Qð¥rr2ƒ°£”’-ˆà´ôcÇ?+Œx£ÇçUW?/˜rF1Ðp£iŒyKôÁE'㯿ù‰Ë?ðÛKºÏ䄸 “»§Š¾Ÿó.–þï—ùÍJÁ¿iÄÿ™çà8àŒÿÂOãæêªøX8à€F6€¥váz°Áih‡Íã_@þóI¥OgÿQ2üùoÓ¿äÁ8¿à–ß´ *ƒãƒ¹UP1âa0 »~FÈ܃…]¡-Gÿ¼øú‡'Å¿±ó`xË‚sƒÏò ÏNTdaCûÅE%ãw§uˆËðÛKËûÞ_ä%À\?Úž+[ÿÌLºÿÛ¾_Õ•¿ ÿ‚f|wˆ|Uð‡ W^ñÚŒmño—åqü yq”HÓËŠ «ÿÔøê?æløL=†»âüsÆ<¿ÓîŒcå1þßQSÿ¯Ž·úÆ[ÿ†ê~¿Ïýuè%À\<Õ<]ÿì*vû¹m÷iä~)[ÿÁ7þ7C´ü)¶F5ï1:7'þÝòŒtSº8Èaˆ>ɨ¿ðNßcþf…¸ãûoÅe—ß?ðƒ ‘Û§AŒ†?Ùš*_\rÿæ#.ùeÔü¿½å³ÿ+ê^þÏ{·þõ.¿öïü=Ç?àž¿"efñ/ÂÒC#)þÙñIÙ·©øæÇ|¹]äÉo¯ì ñ‰þ?†`ªªàk>'*¸1à¤!P d*»?]è¥/8ÞVn¾[¥­ÿ ÔºÛß•»ï`|ÃíßÙâïÿaRéoîöVì~H§ìñ}Ná"økü\lx˜Œ<ø/p?(ØÈ|¶ƒ^ØgâÄ@¯|9˜k#f\¤JUqàÈþBÈxà*Ç¢ªlŽÕz*_ŒÜo-ñsÒßò/§åÚ^VÀ\>ízx½?ê&^_ÝòécòÕb/ŠÀÿÈáèÿ¸·ˆÉ“‘©'‘Ütà©Øcуö-ø¡ÜëžH .­¯œbHX’[Â1*‡ Ñ •Ql¶?§4R~2ñ³²xŒ»Oú—Ó]»OKÛeo+ýBáû[“oû ’è—Hë¢K[Ÿ› û|LoÀ€ã S_Ú>R03ánpHÁÀ 0H+zßöDø“#6±àCµÕ†ÝK\ÊáËÁð¨ÞÇ= Qò€¥YmÞ×ôfŠKÆ>5Jʾ]nßÙôü¿½~Ÿ¦Úà.JÞÏf­o¬ËóQºù~V?>âý”~!¢¢_Á@ª*ñ¨ë\aH|3Û•=FpЏD·ì±ñ¬x8xeÔu’Èq¸á¡—RÊÊC¡NÖG1Éß4TÿÄaãK[Ûåßøo§åýîÊßÒàíO®ÿí2Öÿöïõ÷[áØfGý§áŽsý¡«1d xn?”˜ÏhP‘** Š;kKû7xàuO ôÇÚ¶ËŒø3Œ8c#oÛR^/ñš·ïòý?êŸÿ%×­¾VÐðòwöX«ÿØT´ÿɧ©ñí¿ìûã(›'Q𺠒Wº‘ÆdVÉ΀ —µcÁQ· -–ÎúüñrõÔ<5ø^j^‹é¢¨çôè1´'ÖtTÿÄ]ã+ßÛå÷óÀSòþÿ’þ’²ÿPx{þ}b¿ð¦Zí«÷wÑ~–>[¶ø#â¨YK_xt…ÙÈ»¿-òÈÍÿ@D$à¼ÍÌcÈ’×U>ø•UGÛ4ÀQ…º¾!q·…?Ù ¸Â𼀟 èú*â-ñïí²ûÞÿîü¿½åþ]ø‡Ÿü»ÅôÛ%·O‡oëcç¨~øŠ6Vk½ Œmº½Â¤)Ò$¥J´L6|”’x>ëq. Æ’9 qt@ùc¦™ÆT€6€ @ˆ"Žn¢”¼Zã o[òÀúÏåÔO€xyÿ˼Vɼ˦ßgÈñµøy­ ¤é| gϺÈéÀÅ‚ñÜôéÀ.ÝkꑺM4(Ü@If$e9Ü4øÉÈQ *•ù@SÚzuŸ‹<^×+­€·–šíýï |ÃÍYÓÅÿáT»[ù|¾] ñ÷ÂïxÃÂú‡†<9ñcÆßÿ¶ ŒZLj~^øfÇÄ÷úUí¶ª4%ÕµáÅøwá/Úü`ø‘¬üpÕ< ãßx»[ÖômWZÓ|'¦xFïÁ_xOWÓ'ñÖ®5§Ö£ðÕöþrý08ÿÅ~9ñ7ÿ¢ŸÑϲžñ;8ÉøƒÅŽ,âŒÃˆ±\7K+á®Ês ç,È%›eØ Þµ:™´²ÌÇ=Í2ÊØ*tq9fK–᳉Tá|÷6¥[î8o)ÂÇ.Å癦¶3 *ÐÊðxjT½¥JØŠò§ Õ£:VT•ZT)U…Nxׯ'A}f;~éþÌ_uÏŒÞñ$~<дÿ |bøGñ#Æ>6øKHÃhº/Ä_Ïip𗇮5«K{›Ÿ |Bð>µà¿‹ )s¬ ?øûCÓ/5½OV°Ôg?GWÁÿ ‹öeý¶þ|}±…m>þ×Ñx?öbøèööÂH4ÏŒz|º¤Ÿ²_īƲÒu}Pvê÷Ƴ¶ª‘O¢èÒ_ø¯á–§âCÊðþŸû¿®>¾1e_H<:ñ‹*¥†ÂÏ‹òHÉr¬#ýÇqæK?ì¾6áúpæ©<6 žP­™ðõ EZ˜ÚÜ›ð¾iŠjYœ[ùlÓ.«“æXÌ®³”žqt*OâÄ`«ÅUÁb¿½)Ñ’¥^IF+GN){&‘EWì ðm§íÑáȾ IðÃÅ~Ñ<âïüQý§ô¿Éâ_ˆvO‡>~Ï?³§ôo‰6¿´§ˆ!ðOÀÿŒ7~ø—«è6|S®ü2ñ¿‚¼;â­OÆÞÔü=o‰ñKöDðçÆ/þÖw^1ñ~·máÚÛöCðì‰âÃV6oˆü+áÏ ßþÕrkž/ðÿŠuF×´Ëo^Ó?j «M*ÇQðtÖ¿ðdÛx–ß]“KÒ|OTý‰¾4ø£â§íâïÚáu×íaá=oá|ÿ|UáÏÙËÅšìó¥xságÿjÿ‡šN•ãozŸí/â‰>1Öõ/~Ûß´ºˆ4/Ú_À[¶ø5}má¨l|ãm'âÖ–¦Öí;yÛ™ëÙ»&ÚÞöŠk™±këëòíó{}ÇÚú/Æ_‡þ%øâï‰þÔu¿øGÀú߯ kïá¯xãÄ>#oüñÇŒ¾|Pðÿ‡ü £xr÷Ç>0Öô?øÅ~Ò´¯xs]¿ñ¥þð<$·ÕôYõÒ?nïÙoYñÃ_Añ[Ó¾"|[ÖüUá¯ü+ñ/ŸŒ>ø»uâ?ßü-‹ÅþñÂOøEø“àmoþøÑðÛ⮫¥xëÂÞ¿µøâ ÿh×€|ð÷‰¾#èÜN‹ûøŒ~ÇÞ.ýš¼cñkDñ‹¼qñGãÆ/øçEøeáï†~(ñſڟÆ_µF¹ðïÅßuO‰ž-ÔüOû<øŸSñm×ÁïŒ 5‹¦ÿâ×ÀÝGÆ^»ñ׆î<_&³¥yì}ÿãÿ†[øÇ¨|aÿ„¿à·ö—ü4üZÏÙ×öhÿ†lø9 ÿÂóð·ìáø£üÿ â·ü#¿Øßðßð‘xƒþ&wÿðšx§âî·«ÿÅ9ÿÿÙüF%OÞ¼žŽ\©_T—ºï˥ߧ¢¾†ºië÷¯>×>¼øKûTü øáâ;ß |7ñN·©êqè—>+ðõÖ½ðçâg€ü9ñCÀöWún{ñàGŒ|}àï xGö…ø]eq¯øNKÏŠ5ψ_í,ü[ÖÆƒáûÿø“áçŸŠÚŸÄ o øWâ=ûZi)ð÷Æ×þâboø''ÿbïŨøRËöyƒLð¯Âèþ øWøYû&ü?ø;ñ§ÅÞŠÿ“¦»ûQüvƒÄ>5ñwÇ_Š/oà/ Ýj^!ð=§À/‡þ%ñf­ãßø¿áGˆµ;ÿ†Ñ|&ùçö€ÿ‚@ÿÂóñ×Ä?ÂÒø' ÿÂqÿ ]qÿ SUý”á+ý±îá©?g?Úà7ü!<ý©á{hðž|ø5ÿ »á7ÂÏøU^ÿ„áoÁï‚ß¿á(oøBÿá8¿iRçw“åJé´õ}–Ý>{†¶]ô¿ê}åíÓû8MáÍW_ŸZø£¤êzV·áÿ…¾#ý›ÿi? þÐúíÿЬëÂ{vß¶ìÕwàߊ>>‡âOüS?þ ÅûB|ZžoxúÛUø}ðÃûWã?‡õ+ŸøjçÂÑx›Mñ·…üMû<|j𗎾K£ÿÂÛø}ã/‡šïƒüqàø›ìZUßϧìMñ§Å-?hÿ~П ®¿k ë çøsâ¯~Î^,пg+ß <ûWü<Òt¯| ÔÿiüIñŽ·©xsöÞý åÔ|A¡~Òþ°Ý·Á«ëo Ccà?i?¼¿ÆÿðLψ× >9øáwí#àŸëµ¿Á?Š_¿j_øûö{×~#éZ·ü-¯‹µ_Ç/ø‹à†¼;ûBü*»ø=öˆ?¶¯Ç˜tm#â'‰ÿh?#Á¶Ÿ´+íNÿ[ðWŒ¼YñDµ/ækUÞßÞûÑlí«Ý$®Í{tùßO?^¯mϵÿfOÚ‡Bý¥-¾,C§ø;ÆÞÖþüløÝð{Äk¾ øeàÝkþ7Ç‹_4¯xâ‰|á/‡ßÿá%´øXþ'ñ>‘ðÏ]ñŸü*W]‡Àž3ÔãÖí`¹Õ!h—¿~$jƒá¶‡ðÃáÿ|aaá¿ê_õï´xÒo—|û|iøKáÏ€¿ ÿhO…Ö.ý•þx×öaø#®|Cýœ¼YãoÙ?Å6#±ð×ÅO xoö—øo©øÛö†Òu?Ù¯áÝÝßÇøÇá‡ÃmVÃPñ¦ìפÜjú©áuû¶å«Jë—Wµ¥u𾼫gmlÞì×OM}n¿KŸQ|Jý«ÿgŸ„¾ø[ñ'ÆŸ4Eð7ÇoIð×ÁxRÓ[ø‹añcÄ~%ø⯉þ ðÿÃðïKñUÇ5¿ˆžðn²ÿ ô¯Á¨ßüPñþð/Ãè.Yjúo‡õ…Ÿ¥ðŸ¨èŸ²'‡<áØ/á÷ƒ¼_­ÛxGöÖü;?…‡‰ll5ïøÿÞý‘þ4~Éú•â cKo éšN¶tÏ‹V¾4Õ|A§xvk Ûÿ O£ZxkL·×cÔ4?Šü6ñÆ­wÂ:Äk_‹N*•õoMvÑûÎÉ«vI½u¾êÁ¯eºû´¿ëÛmÐßþÕ?|OñVƒz7Šu¹ü\ºß‰|)¦j÷~&i_ ¼[ãCªÏão‡>;jÞ±ø!ñ/â‚Ã~4_|/ø}ñÄß<%7Ê–þ"ðÞ›qð«â4^â`ýºg ¼9ªëóë_tOJÖü?áñð·Ä³í'áÚ]¿ñU‡‰u_ Ïà¯Ù‹Ä 4¿Ú+≭hþø“­iÞ%ð/ÂÿxrçDøKñ—YMTéŸ~'ÝxOåí/þ aà}'â¯ÅoèÞ ø]àKˆšßí5ã=3ã¯ٯáÿƒoïøãöª‡âsøÛP“öâÕµojqèžÔþ2øÒóá |>ø=ðÇâ…tß ü🈾&xÓÂ>ø¢|bòíþ /ªøsþ®¥¡]Á<¼%­üFÿ…º>•ðÓþ Íã/…~j¿?á¥gÓþ/xÃÿ¿n?üAðgíCuwûCCmá_Ú7À¿¼ã/†Úl,¼1gý·¨Xø—Ç-/ç–Ë£ÞúýžÚ¯Í†·ÛOø õºØý ‡öÉýŸäñ—†< /ˆ¼m§k~(ÿ„ѯµ¿‚Ÿôø'Å?´­ Xø{ðÇãÄ]oáΟðûàGÆÏÚx·Àðè¾5xŸÀ?õ Wâ/Ã- 6·ñ/Àzˆ»oþП <ñÂ_ u{Ÿk?|aýƒ5¿‡þü$ø·ñgþM+ÅZí߆¼/âŠú¯ÂÏøÇDø'àŸkz_ˆ¬¼=㯌:—|­ÿÂñçL×n­>xÞ}àßÁ,<áŽ^ø²ž ø]ñ*âÃ[øã?üXý¢¿f¿‡ÿÿn[dzÇÃ?„ß ü3¨x;ö¹ñ~­™à]ÆZgÀßøƒâ Oð#Å<[ñ»Æ¿ ¾&|3ñw޼®ü%úãW앪ü]ý£~|mÓüiàŸ†–Ÿ¿ámwÄžøsã/ þÕ^4Ò¼ã­Wâ?oÿi |lð~ËÞ6ÖåÑí~%þÎ_~|NðoŠ,ÛÅZÕæñQð/޾&©ÝZNܺéö»mµÿ¤ë§UoM.ÿ?ø&'ÀÿÛÿá·Å¿Ù?áíSª|8ý¡¼5¦|MÑ<ú‚|5û-þÖüGáÿxÓá¶“ñîÏÃúgƒ¾7‹¾#ü.Ò­õ)4+ö‡ð·‚›à·‹ïà‚ßCñaÔõ]$öÚ'íÝû-ø—âü;ðçÄoÄ ­ü=ðÒüEÑ>üaÕg–ñÅ¿øâ/Ÿ¯íKaàÿf£­üMð·Å?†|=҇ŃãMoâ?€ü#á¸5/x¿ÃÚ£òö½ÿÛñ³ð[àGÁMSâ/ìóñKÂ?³‰yð³àß‚?ioÙ"ÿã¿Ák¯‚Öøoá?‡š×Åσ×´Gƒ´Ïþן´Ï‡ií7ámwá—„í|'ñGã_…ô?ÙëöÿÚóFÛø)ÿÛÿ…=û9Aðþ?ü$^OÆÏø'ÇÆøKá]dnÿ†ð/ìà¯øG°á:ÔöÿÂÔÿ†%þÓþ×þÙ?ðƒÿÂÍûögŒ?á û_ŠÛTµ|Ïwd¯¢æÑÝÇ[GV·{_¸¯¥þoîíóû¼Î×Hý¿¼ ãoÚ7Âÿ¾ZxÛÅ?ÿá—¿iÏþ'ñÔ³·íÿ·ü)Ï~Ëúu?Ù§ÄóxËÃ?´Ï‚|]់þ:Ö-¯?g«Œð›ŰÔ<¬ÿgø§B‡ÆÆ¡ÿø`¿þé¶ZçöoÂ=WàŸí/âÿˆðøËáÅ¿üxð§Å¿„ÿÿb_ü/øV~ ø¯@ð÷ÅÍ/Æß´ÿÚ¶ÚçÁ¿ õ/„·Ÿþ0ÜøËà…ïÂ]7UÓüwḼqâ‘Á3>#]h_¾ëß´‚u/„eíwöSøá+?Ùï]±×oþËñöSñ®¡~Õúõçí ¬xgöŒðOм3û$øKáGíðûÁ_ÿg ãŸÃŸˆŸü=i/Ã}?Åe§‡øŸÁ áÕu¯ÁñKàŸ‚u¶ñ·‰¾)ø3Áÿ³ßì£ÿ ;à?ƒ>#Eã/ø&ÄŸ†wßÓã·Ž.æðN‘ñþ ¯á­wâß…ô¯xw]ø³mñ‹ÇøÆÿ u½>ÃÄ—NÔ™ìÖÍÞ÷×áZêºYZÚî/{òíýÛÿíÇÚ÷ÿðPÙ†Ãþ[DÔþ6k&ñwü'ÿdøoá_Ù+ö¶ñ—Æ?¯ÿ…i'áeüð—ÀýkâçÂìÝ?ã7Â-zÃþ¯‚¼ÿ …¾'øžþØðÏ‹´Zÿ¶‡öÏýš¯ðw¼eðßUø§¥hZßÂß x“ö‘𯅵Ù÷Á¾6øŸ¤ø»À7ÿ ¼ ㉚Œ¼}mñ?áøKBÖ?ámü5)ò¯ˆüûC¿íEãï‹Z'þ*x«DøñÅ /ü2¿øwðÿ\ñÅíöð&ªøÃÚ×Äωž#ð&‰àï†ß°—4ÝcÃþ!ñ¯Ä«ÿxãÆž-ñ…—‰| Å£xËåðH?üñgÁ}}5oÙçÇwôOÙfoüJñÿìmðÿÆ_´ÝÏŽ?e_‚ßþ øf_ÿ<_ãOéŸþx§Løà]kVð<ÿ þ'|@ð¶¯â¯‹úÏÃo^ ñw‹<âß…ªÔµ÷¥·­åw§Â¬’¶½oÓTž½»}Ú_M|úôë×oö@ÿ‚°ø7öŒÐ¼â_iü/¢|BðOÁÏØÞþÏ´>«ûXÿ¡ñ—Lj߾ü:øûW[hÿþ]þÏ¿"øƒiñ³à¯Âψz?‰í~#AªøsþoÚWþ ÍðëÆ–úŸiá 7ÁÞ ûÁø(ƒ<_Š⦟ÿ猵o麂>(ÚEñRÇá·Šx#þ ™ñÓá‡ÀÏüQý¤|âíoöHø'ð·à÷ìµâ?þÏzïÃ+Iÿ…KñoöTøåáï|~ð׈¿h_Š·~Ýñö*ø ³¤|;ñ?ìùçø6ïâî…c©Øk~5ðo‹>ÿÌøâï‹w¾-~Ò> ×þ ë?<7ñ‡Äü:ýžõ߇¾ ¸ÿ„Sâü—ÇZW‡t} Ä¿´/Å=oJó4Oø%î›áÍCW½ñf·öWãE÷‰m´Ë+OÁá;Qæ½í½=æ·VÞ7µ¯{Û[-µf¶Zk¥ÿ þ»vù¡sÿ#øEuñûÂе]nO‚_³ÏÇ‹ZïÄÍgà_ÇíÃÇÞ#ðÅßÙ+á—ÁK/Ù‡Æz¿‚ô¯þÓú'Å›šöáoÙÚ×ã-ÿÅ?ë?ìþêWO㯠ØxóÛ4Û»ö[Ö|Gð×Á|AÖôõ¿xkÀÿ üKð§ã„>.ÝxÀ÷ÿ bñ‡üAð“Å~Ñ~$ø[ðï‡>4|6ø«ªé^:ð·†ïí~ø‚Ú5à|=âoˆú7ÅßüŸÄ~5ðŸÃo„ÿþ8ü.ñ¿ÁÙÛöy·ýž?goꟳ5ýÝüþðÆŸØûã/ÃWýª5-{ãïˆ|#ûCh‹qû|7ðÆ? øáßìíañWÞ+øyð±õxgèoÙ§ö Ò¿gŸˆÞø™§êü?wá¿þÒ×~~ﳃfƒ—Z¯ÇÝwöF»‡]ð‚ü1âëz/ü#ú'ì•£§ˆ&ø‹ã?Œ2ñŸŠ|w­ê>:ð_Ãï øá_‡ST­¤Õô×]Ü[n;·dôÑi~¢÷».Ÿ¥ÿ^ÿç·ûwþÛÞý‘¾ |q×4Xõ¿|oð/ìóñ3ー üøÓñ—Úþ…á?]ü;Ö¾;Ý|ðγoðwáwŒ<]á-gK³ñ—Åü0ð爬<ñ"MÅѧÃÿê>í¼Wûw~Ë~¿økâψ:Þ‰¦|,Ñ>(k^(ñ½ßŸŒ'áV£7ÁOx“ÅŸ|#ðóã —á_ÅïŠ? t|B»ñ§Áÿ„Þ1ñ·Å_MðË⦩x6 OáwÄ ? ùwíwûüFøÿÿ óþ?Æÿü$ÿ†§ý—­¿d¿Ž_ð±> k¿sðçBÿ…çÿžµð£þ¯Ž??áñµ—ü4‡ÅOøHu/ÿÂÓеï#áÿöo†ü1ÿ׈ÿá9ùçÆßðH?ø¢ÿö•MVýž|%oñãDý±&Ó>)Z~ÆßõÚãJñÇí›áÏ‹ºW¥ø‡ûNêÞ4›Sñ×Âïê¼i?‚üðûÀ¿¾ xcá_Ão|j×|#¡|Fµø´%IÅsI§­í~ÑÓáèïk7ݵ°õü¿àõõíó>×ðÿíÝû-ë·óé÷Ÿu¿=†‰â]k\½øÕð§ãÀ-Âsx?Ú¯ŽüIáx‡ãw€~è>ø£¥ü+ÑuŽ2üñŽ¥¡üU›öyŠÚ"×Á³ü½±ñõÎ%÷ü#öaÓ4­>ûRÔþ6iúÞ­ãmÀWÃïÙ+ö¶´øñ©ë¾"ðoÄ_ø~ÿOýçøÇ{ßë¾ø?ñkPÑþ%Û|:—áΧsð»â.eâ©õ¿ø—NÓ<»ã‡ü‹ÃŸnþ/ÙøÇâ–·¦øGãWí ãÿ>)Òü5á« ?Øxsâ?üëVÿ‚hkžðÿ‰5MWYÓ-u»]3YºøÃ¥xßQðž«aüpx"ïÀ×Öë'ŠeÛÐÿb߈ÚßíðÛö¡øÙñ¿Á>/ø¹à/xþîßágÁ-wáOÃoáÏÃ/‚¶çÂÏxVßÂþ-øãñ§ÄÚG‡‰¿n¯‰1ñGäñö¯¡kz„üà½'ᧆ5uïëjÔ­{Êü··÷»_’ß=-ç} ¯•úúÿ[ûfŸûdþÏúÞ«ðëBðLj¼mãMoâ_Ø~Á£øà§Æÿj¾ûŒµ‡Iÿ ûOðgÃvïöaûÄ xëÀºÏü4|? ÿ° Ò&øsªü9Ò|ñ†ÓWƒáŸÂ¯Šþ"ð/¥Á:5]'â—€üs§üVðO‡-<+ñ³âÏÆMwÆþøEã/‡ŸµWŠô¯‰?¶?Æ¯Û Ùþÿö‹ðÇÇûMVý—§Öþ(èþø—ð'â/Áo‰> ø‘g£x«Æö6þøƒâ?øƒá¨~ϱ¯ˆþxöxºÕ>-hž2ðì«û<ü]ý”¾ èv ¯ü'â9þ xÒÿöI“áä¿×¾ |~øâ?xsâ/í7ðŸökñ§Ä/"ø>úŸí=¢|0Ôþ,h:åâþΚ_ÄÛ_ë_ ü-o­éwþjº¶Ú~Þìî|]·/®5 ÆÚW†ø£ÃßðHìAã¨>)|Óõ¿ x&×Hðg¼/û(ÿÂ5ñãâ§Äo~Ò¿²ÏíEðÏãíÕñ•>;jµ×£øƒû(øjoŒ:ž•áïÅKŸ‰ußø‹áf·âÝ>ïAú×ö&øÓᯋ¾)ý¥ü ûB|.Óh¯k~#Ÿ_Õ<[û9x³Å_—ßþþà >(iZ?ÂÝö—ðWŽlu½KÇ?°—€|{à^ünÕl<á?xÃá׈|5ñXMâ^œZŽÜÍèõÕkîÙ|/Mõ·^º^Ý¿Kþ¿w™íš'íÝû-ø—âü;ðçÄoÄ ­ü=ðÒüEÑ>üaÕg–ñÅ¿øâ/Ÿ¯íKaàÿf£­üMð·Å?†|=҇ŃãMoâ?€ü#á¸5/x¿ÃÚ£·ñOöÉýŸþ |F¸øYñÄ^6Ò¼M¥x'Âÿü[©é>7øËáÏÃ_‡>2×|oáÝÇÿ~0ø+áψ~üðLš‡Ã_ˆŸŠ¾+øßÁº‡´/ø‹Å!¿Ò¼3¥]êñüñðçþ ÅáÏ…µŸ>ø¥­Ëáý¡¿`ß>Ô|Ká« WÄzG‡?ao þÂÞÐüâ ½/Uðþ™âMoâ™ûÚϪøßNÒ<)a _üGž[OjVþŽ×Ä8¿´ì•ñããßíûNiº<ðßöbý£¿b€_³?ÅWWøssãÿˆÞ7Ò­|uûmÁñSÃÿ¼A¦ülðE§Á¿x_á÷ÇçLñÏÄ_„¿¼}®øÏ÷¶>×"ð?‹ü5««S¿Äì—]þΫÝó––öÔ5þ¿áÿ=:C/íÝû-ÜØxòûFøƒ­øµþüQÖþø›FðŸŒ?¼Y7ÆŸ xâ‡|WðƒÂ^ ð?€|Aâïˆ|!oð·Æž=ñ‡€>hž'ñg„þ Yhÿ|E¤éŸ<[áˆ:î%ÿííû?Ùø§Âºoü%›<3â?‚~?øÃý«àŸö)¸¼ðWÆ?†ŸáVøWÂ?ð¦î4ÿ|l³ø¹ãïøTþ?ý?á/Ñÿj¯üc¿øið¯þûÄ~&ø“³ÂØ“~ƾ#ѾøMðÅ­Gø©ð“ö¼ý¦ÿk¿…þ2ñ‡Ã+ÿü?µñí9ãÚšÿ_ð‡¾è¿< â?èžømûYøïÂz=÷‡¾,ü?¿ºñLJü%ñ õNƒo¬ü2Ö~^ø‡ÿÒ¿ø¥©x+៊ïtM{ÀÞø]ûJxïÇ^<ñ§ƒ<9®ü3ø›ûMþÔ·÷ìãûz?…í>ÏâÝc^Ö¿gŸüTý›üMañSáOŽ‘ðÏ]ñŸü*W]‡Àž3ÔãÖí`¹Õ>^øwÿûñ—ÁøC|sðÇ¿²÷ÁïŒþÿ…Ñ£êV~ýˆô¯þʯàߎ_ðϯâû þÏ þ9ü5øƒ§øØ]þË?õKˆ¿iOŠº«ÞjôË>_k ü'ðCëÏ€Ÿ¼Gð6oŠ>Æú'‰¾ø§âÄŸ‹_<>þ¿Ò> x7ľ*üEøáñ’ËÆ~?_ê~ø…¢^üIø‘ª†vÚÆwþð=…‡†üS©|O×¾ÑãI”•4Ÿ+mßKßk¾œ©mg¿}­i ý­ësçÿÁB<â à·ˆ|eá?øBm"ügñGÆÿ‚þð@м;ñ?Æ¿ÿf‰ <ð·ÄŸtÿøsÁÞ£¤~Ýß²Þ³â?†¾ƒâ·§|Dø·­ø«Ã^øWâ_…?|!ñvëÄ~¿ø[‹ü?℞+ð‹ñ'ÀÚ߇|9ñ£á·Å]WJñ×…¼7kðÄþѯø áï|GѼOÆ?ðM/…^.ðŸí[á‹‹Ýêßöø£ðÛâV‹¥ø¯Á“xãÀþ°øYñ¦_ÚßFø[ñÁÿ‹d²øËð»Æ¶_Ž¿h¿Œ_4‡Ô<â?ü?ý¡¼IðAñWƒ|#à?…ú·„¶ÿfŸØ+Jýž~#xâfŸ©üðý߆üûHxc]øyû:þÌ^ ýš>]j¿ußÙîwÁþ ðÇŠ[ƺs­ÜWzä!â›I›WùÑûqþÍߣ¼ðŠþ)ü?ðωýœü-ý—mðÛIø›£húÞ‘ãM'ƇŽt‰¿ üM¥ë:ŽŸe¯êº´Ú—ã­;WÓtéu ø;EÓ´ÏéwóÛk>ÿ›.á¯|SúUqWŠÜvøÛÁ*ÜY‘x¿ÿ^ó_ ¼Aã<eü[á—ð&†°9O á¨fòqá¬â<9ÃøéÕ—öuj mjXìE8àq?ÖxÜ» Ë8[–eU2¬ûêµò… -<ó+ÁJ´0øÚºØÚ•ª×Tdê⽦.½¥HËÙóA)N?ÑÿÇÿ„žý§¿gÿŠ?üg$Ñi~+𾫧È>mGGŽìÅu¦ø¯HU‰‚kñ]¦ƒã-)غÅu§cË–0ÑךþÅŸ|Uñ›à¢üO‰,þ:ü#ñ&»ð7öƒÓ¢‰b†/Œ? Í¥Ž»®Ù}ŸFÐô“£üDÑnü;ñSñh6’èÖ>ñÖ“¦ÚÝÜIe9_ ‡þ Iû'ÛêÇS‹ãwÂßšiËB~#ø$DÖ×^rOjPkED ­À»B;€¨ á?²¯ÆüMÿ‚š|gÔgÏÚøÏá§Šÿdok?´>¯àË[?xÏã—ƒþ$[xwà¢ê^:±Óï, ñÖ§ð‡Zñ՜ڎ¿dš®áXï/´ÝgPðü×Zõ§ìœ«ãgž"x1ƾqÞOÀÜGÖñ&ͳŽÎpyG ñŸ Ã/Ëqþ߉ÂSÂeØ.5áœM£Z|ÕñüEÂþåÔ¥J•Zìøorlš®Ÿà3l¦X¼-xàkahãpõ«b°˜õZ³£NžU*׫Ì)}b„ÚTéÐÌóZ“p§N2ìåQ_íøøÙð¯Å~8oŠ¿³ÆKˆÿoü]ñãþ Qÿý•¾%é¯Åˆ¿Â­GàoÀHࣰ|(𷆾êž$»ø!ðç[ðÊ~Êˆß þxKâg‰fðLj.¡Ò¾üо*ø—㶇ðƒávñ¿Æš$ñÆM+ÀÓ¾*ø³Ã–°ø~Þ×Ãþ%ø‡i¤ÃâíwD¶·ðŸ… ƒJÕ5{«aðׇâŽMN[o>ý“üsñ§Ã¿uOÙÏáv¯âïØÇáwÀß‹_õ{áÃmCßü9ñ?ÅŸ¼ðòËàEÝÅÞ§ðç[ðΧû)É=å·…´ Xh¶OÃyt=KP¸°k_éÌ›½ž‘’Ù;)s%ò‹”RÛE{-Vvߪü-¾Ïï8Ÿø(‡¯Ûö ý¾õ„_u¿|Iø5û<ügÕo»¨ÂAã­ ÍÒ´Ëèt¯í=nM7GÔ1øAð»Çø«­èþ%ø¡áoxÂ~&ðçÄøzÃÂZ^âhzÖ“{¦xÃ[ÐôÏxNÑõ_Úê7úe‡‚¼%ie<þÑ£²í¼5á¯x/Þðwƒ¼?¢xOÂ>Ñ4¯ x[ÂÞÒ¬4/xkÚ„^‡áÿèz\ºf¢hÚe­®¥iZu­µ†am¥¤ÛÃk7VJÛ6ÝúÝGK¦žéüž÷¸ÏƒkO|xÔõø'œ?¼Kÿ ùñâŸíC§ø‹Dø«áËŸ‰z™¥7ìûd|BÕþ|]ðÁïŽ^Ñ>!ÿck~Ó%Küj¾ðn™ñÃ^ñÆ‘¬x¶ÓÃbê›"ý¡¾?~ËŸ²?íâñ¬|.ñŸÂ¿‰¿´7üÿÂ? ¼¥xSâïÂߊ¿|qðÓÅÿðSOÚvx—ãïhK]OÅZ&©©þΞ$ð¤/Ãüøá˜~!øÄÞøÁa¯|7y|Zð‚~(ü>ñöü$ø‹á] ÆÞ ײu[wJþØðljl5=SþÌÖôÍ7XÓþÛc?ص]>ÇP¶ò®í š?þ6üYý…~øŽëö|øÏà-îßMÑ5¯Ž/Òdý•~"|Gø-ðßß´mÿÇ?øãâÿÆ?ˆÞøG⟂tOŠIsûGÛ|UñÿÅx:ÃSðž«ñ{]ø‹«/„u¿êw·h—#•ÚJú.k;ï¼’ò¶þóB¶·¿ôí§Î߈|ý >4ø‹ö°ø‰ð_ã^Ÿ¢|%·mâߊþüŸàÏ‹5_øÿáÂÿ‰>ø{cûCi_µß†þ3ø·à‡‰ôO§‹t-_ijޯðá?Çï…7ÿü5¥ø£GÔ¼# è>0|‡ñ3þ ;ûFø+Bøßý•ð/ûSÄß á³>[íøeã«Ý ÿhؾ#|}ÿ‡løTû7Žm5ÿ…ÝðàO„áaøU?³¼uñ'â7íÁÿöÿ… `<3ûKiŸØÿ¡¿³&“û9jÖß>0üø'àŸ…:ßÄ?Ÿ¼ñƒÄZÃøÆ_~#|øññkà[ã­_Á±Ëwãoíˆ>ñÿˆ¼1¯x£S½×nô¯M«êvš6·®kZd×wðÓáÍÿö÷Û¼à›ÏøJ¼má/‰~'û_…t+øHþ#xþ¯øA|¯yÖý±ão¶øuÿ—е´k¾ÿ„Á_Ø÷öð‹h_`\ÑRw…íem¬ÖM{õm¶“o |ÿ//ëKn<ß üuªüEÿ‚›|*ñ±‘w§þÔ:÷aOíßx‹v•ð»Åßðu7Ã= o·øëÄþ.ÖíþÑ¢xGOŸû ÇU´ðo…üßøF¾xcÁ?´Ÿ x3@úóöëø—ñ§â—ìëÿmд=wáw„þ~Íß³Ïí'ð[Æ>Õ~ø³Å~&ø]ÿ‚|xoãõ¯ü5ñ^Óâ#ðÏD°¸ø÷áo ÏàSà§Äûûø~xƒWÇ:{ü@Ӵ¨ZoÀÿ‚Ú7ˆí¼c¤| ø]¥xºÏ[½ñ-§ŠtßxNÇÄv¾#Ô¯þ-jšˆ-µË]&-N nÿSøûñÛQ½Õbº[û«ÿ_®çžKˆþ1“YÅñ×ìÕû9|Qñ”?~&|ø'ñâ ¿‚u߆xëÇ_ ¼ âïAðçÅW‰ô/øøƒAÔ5¸¼â-ÆÞ3Ñõß ¥òèZ¶•âïéú……Ŧ¿ªÃvÝH¹©YÙE%³Õ;õî´¾ê÷Z ·Îíyv_§è|yûdþÓp_éž=ð·Ãÿ…ß<#ñWö†ýµ¿e‚Ÿ³†•k«ü9øª~*þÈžý°¯´-Ä¿´¿Š>!ëß µ}ãoˆÿbýsDƒÃ2|øyÃ(~6x~ûTøâû„Z¼¿üNçöîý³u{ÿ|øUá}âïí+>·ñÞóã †•û ?Ã+ÿ€ðü ðçì•w«ü"ñ/ÁoßðR„~ñþ·¨\~Öþ ñT´gÁïÛ'Çß µßÚ|-ð'Å? xžëâÿ†?WµÙ«örÕ¼eñâ.«ðàž§ñã‚o¾|ZñÖ¡ð«À·¾2ø£ðçSÒ´} RðÄ_Üè2ë~6ðN¡¢xwÃú=÷…|K}©èWzV…£éóØIi¦YC&«û"þÉúï¯ | ×?fÙçYø!à½nø;àÞ«ðWá¶£ð«Â~#º›Ä^ ð×ÃË¿ Má [¹¸ñgŠgŸUÒô‹[ù¦ñ/ˆ%’v}gQk‘N ìþ ÷µõ×–é}—+^O Y÷þ´¾žvzô¾‡‰ø«ö”ø«â/ƒß±©ðçLø]ðÿâ§í·­ø7Ãö¿ˆ5Hi?…_oõOÙoâßíSâà¸øS㟆:gí¢3àÞ­ðÓÃ^%ðOÅ/øsV›ÅšWÅ}3U×t|â¯ÈŒßþ4ün›öúøýu®ü.ðç‹¿cø&¿í  èzí¯Ãj<ñ§À?௲ϊ~;þÆßdø»i©þÇßÅÍOöiðwŒ>"YÚißøóà?ˆß³_ì'ðëá¿Â_|øEñJý¨bÿ xYýžþë¿þè¿ðµ?à¢?´ÍVÒÛà†¾4jÜ^ ñ‰ãmKIø·à«/–ðµ­µGs¯xjÓÆ“Ùé~'àOˆŸ´oÀŸ¶GÄ-WÆ_ükðúãþ ûüøµà]?࿎¼#ã/üFý ÿeïø&7ìõ©|Løuñçö‚ñn‰ðÓÁ>Öþ)øǶ? |KðÃâÖ»¨i^Ö<?Åë{¿YxÛÁß¡¾%øõðÇÚWÃïêZWü-?þÒß>;~ÇsiZ‡„mµÞxËá'ƒi^ø‹áÿ&—ý£à˜¿áš~-|=¾’ÛDñ.•âV]l¬õOë²ø–ßÔ4Oÿ¼5áÅðw‡>|.ðÿ„W[ø{âUð¶‰à é^_ü$°ð—ð§Ä ¡Øi0iƒ[øe¦|,øa§|=ÕE¨¿ð]‡ÃÚxn}6ßÂN¬š’»“mÝ+´åù­`Ö–³wV°iÓ¥¶oåýu?<ÿ`Û3ö¤ý¥5êÿdßèƒÅ ,µïŽZƒ¾íÝþÔ¿´køG^øûc¨|·øGqûkøKö<ðÇÂ;¿…Þ:¼ø£ýþ mà¯Ø#Ç_5ïpün°ðψÿá#ð͇Ä_ˆ~ðŽŸð'¿ð…k¾)ðV‹¬xŸÇÚ€uÛ¯‰?^|ð§ìȳ|Qø­û;|8ø]á]OâGʼn>øÉãoü/Ò>øâ?Å_ƒ¿~"ü9ø‡?Ä-NßÃ~×¼q­øoâ¦ñ*Á|K¯6­«{­ø‡AÕu=3ÄK«j[z‡ìÕû9jÞ2ø‹ñUøðOSøƒñƒÁ7ß >-xëPøUà[ß|Qøs©éZ>…©xâ/‰îtu¿x'PÑ<;áýû¾%¾Ôô+½+BÑôùì$´Ó,¡9G™û–WZ[³Ö6mÙ½2×M½æ ¦·ÓïÛ_ë¹ñFŸûZ~Ѿ1ý¾6ø·ÿ /‹üO¦øêãÆZß„_?à–?'þÂÓt¯E¢x£ÆÞ/Öÿm‰Ÿ¡þПÁz„´«üLøK®þøƒá_Çž4Û—öþñ¿ÁoØPðwÁÿ…Þ%øßûbþÏ>!ý«§ÓþøMø—áφ¿ ¼á?Ù{O—@½ðÇÇoÛ7ö(·×õ¿x»öˆµñÕω´ïŒK7¦ü´øsñå4í_ö›—õ{ágìÕû9| û?ü)?€?þ}“þ²¬øUà_‡ßeÿ„ãþøM~Ïÿ–ƒ¤y?ð˜²øoÿ G—·þøWÞþÖû_ü"šØ<»ã§?döÑ?f/Ù·ãìçð»âGÃoüQ·øKðSៈ>|6ñ‡Â¯‡#ø{û<|iø›¡^ÁàÏYÂ'‡þü$ñ¿ƒ<5sá= öÿJ›\Ò¼;g¦ÙxsSÕïôÖ¥ ¤ –­«·e+¶¯þký›_Ws^öþ–—ûþÿ#â‡?·?í7ãXuŸŽ:¥§ìó£üÐ?hoØ7ö~Ô~xkJÕþ%ü@žÿöÖøUû k~*ðÿí‡àïŽ_ü[¢|1ñ÷í£&¥¥_x[öwÖ<9ñWÀÿ Óô?èãÛ_xgoàÇÚ7á?ükLý©¾"ø÷Á?þ.x7þ ågûGxXÕ¼ã­+ûGþïÙCFø‹áãf¡®üdñ߉¾,xÚóÄÚuõ×ĉš?ˆ~ÿÂwý«$úƒ¼¨G5õçêßÃO‡7ÿÛßnð‚o?á*ñ·„¾%øŸí~Ю?á#øàøB¿áñþ½çX?öǼÿ Ûá×ü"^*Ô>Ñ®øsþcßÙÿÂ-¡}ƒÃàÁm+ß<¥ü ø]¦øGãV·ã?üd𵇀<'gáÏ‹^#ø`š_Ä?|LÐíô˜ôÏk~<Ó#Nñž«â›]VÿÅ¥¦¹=õº¬asÆÖåKÞ‹Ùmª¾ú¶Ý÷z'²±o?ëMÄü½ý¡¿lÏÛ«áŽ5ø[àÂïêgŸ ~ÔŸ´Eÿ‡îþéÿ ¬ü9ñ;âí iá¿…hOÚ÷öU¸ø3¢|?ðì÷®h¾%ýª¤øIû@XxÊmCUø¹ª~ËßtÏ i¿´ø[àOŠ~ñ=×Åÿ ~¡ø—öEý“üiñÄ|cû0þÏ>,ø©âÍUð׊~&x—à¯Ãmwâ‰|9®ø†Zç‡üAã-SÃW^#ÖtMgáµÕ×ÃÝWJÔu+› GÀ÷3øNî ´¤°ož>;hðO¿†_þ2|%ñÿìÙðOÆ_ÿb¿‚w¶'ˆ?f½?ö|øy¬x7Áþ Õm¿h SJñ_ïx—ÃÚGÂ8|mã Cá—Ç‹+ôÍKJÕaÕgÖ.|Qy¡éþ2ƒSÕÚ”­ ´’~êzê“zëfã·'3ÕôA¯ëKé篡·ñö¢ø€ß²Ào‰_ü9¢X~Ñ_µ‰ð¹>|1ðÔ~ý§¼9¨ü@ñOÃkïŽ~7ðg‡üWgñûö\øAñDðÏÂüX×´¯‰“~Ñ? <â[ Á¯xGPñ~±«øOáÏ> п࢟µ÷Š< ûBüZÿ„wàŸÃÝö)ý—¼Gñ¿ã¯Âü-ñ6½ñâ~Ñ¿ðP?ÿ¼á/øö Õ~~Ïð–Ú~ÂÿmÐGöoíu¥|2×~#ÝÛÂeñÏDðm¦­ãOÚ >ü`ðn±ðëâ×€<ñGá÷ˆ¿³ÿá ð/Ä_ è^6ðn»ý“ªØëºWödžü8øEðÛKðæ½áÏÚãô_ ¼-àßxN;?øsTø]gñ'ö˜ñŠ|WáÛ¸ïl-ì7iš'ì—ão„Ú߇5£càŽ-ußi_ µ|ø—ã ¿kšgÁÔ?øf¯ÙËþü4Wü(‚ðÐ_ô]áUxþüŠßðƒÉNþÁÿ„ÛþDŸø£ÿä7ÿ"·üSÿò ÿD¯.Òî¿fM öͻӴ/š&‰ûRüOø]ñCUñOǘ> iñ‹<ðQÿe ?\ðÖ«ñ‹TÑtO|JÑ%·øíðR×Ãóø^ïÆßá¿øâ_jþ мgðºO [5(ó&£u=,´´œ·×Dœšm«è¤ÓE»¾«ç¢_‹_ðû!þ×_¶íUû,ø6öoiþ ý¤> þÎ?üSûLþØïÙúÏÀ ?.5_ˆß &Ñõ‹?·Ç†õ¿ƒ?ð–hŸ¾2øcP×ü¡~Ýž)Óõ__xëQø3¡Ú\xá×Ä®'^øãûiüc×g-WÃ=ø'ð[ûwþ ‡û[þÎ?…Ÿƒ>+üFмSðçömøsÿ?ðmö±ñÿÁºÆOƒŸð”ÿÂSÿ sÀ¯£|3м]…áoˆßtÏSxÇ]ÿ„¿Gø!ðsëÏ~Ï?°OÆè|mð&ëö4ýžuþÆ?u„ºƒø3Äþ|ý¤¼S{ðòhš¶™áÝÅZgÆ/Oâû›M#Â×úçŽ4j]GMÔ-ì4½wTú‡Ä¿þ xÓáÿˆ>xÇáÂï|+ñf·ªø—Å? üKà ë¿üKâ=wÇüM×ÿ…wðßöfÑÿá0ý ¼{ÿ wì<ÿ ›Âß¾×ðsá—ü#Ä¿}“Çÿ¶ì9àþß|Vø3¤ý¢oš¿Šnÿá,òô…ž'ÒañW‹~yv³ûVüiø§ð+þ ½ñàL_ ¾x»ööÖþϨŸ‹^ñgÇ|2ðç‹ÿb¯Žµ…Þ•e£ø;âOìí©ø¯[´Ôþi ¶ñþ"ðý°Ôu-f_ 5ÁµÓàû_â×Àÿ‚ß|9eàïŽß>|jðŽ›­Ûx—Nð·Å¯xOâ?‡,Ÿá] ËJø]ý™àÝcáÖ›ÿ ëO¶°ŠÓÁ?Ùÿ¼EâØÿÂ5™öOëºÇ† òôMNöÆyRŠKÝ»WÖ˪võWåvkK=]ì{þŸð~ÿ#ñGÄÿðRoÛæóÅÚÂÏ€ž ñ¯ü3‚~"x·ö’ñFï…¾øsã_øVµWí‡û1ÞÝÿÂgñÏöÏýž¿á<âïøb_üEÿ„ÖãGý¹ÿáZh_>Ãâ\ÿ…9©ñç¶ø™ÿý£|¡|oþÊøý©âo…?ðÙŸ -öü2ñÕî„ÿ´l_¾>ÿö|ª}›Ç6šƒÂîøGð'Â?ð°ü*ŸÙÞ:ø“ñöàÿ‚{Â…°ý¥´ÏìÔ=wöjýœ¼Qªø]ñ/À‚~"ÖþxÛÄÿþëï¯êگïˆÞ6ñ”?|gãÿꆃqwáx»â ¼:ñ?м?6Ÿ®ëþ2‚ê·÷zÜI|½­ßÃO‡7ÿÛßnð‚o?á*ñ·„¾%øŸí~Ю?á#øàøB¿áñþ½çX?öǼÿ Ûá×ü"^*Ô>Ñ®øsþcßÙÿÂ-¡}‚¹á§îÕ¯óßfï®—kEgeªWŸwÓ·—–—ís¶¢Š+!…ò÷Ç_ÚÓáÏìùãï…?¼g¢øÛSÖþ0gÂ5uá7B½Ò¬´ÿi_ÙCöYƒûv}WÄš-ݶψ?¶'Ã=boìûOoƒt?j ækzg‡ü=â¨iÙ¤´w³ïmÀ(¢Š@þxÿäª|Kÿ²ã/ýHõ*ÿCŠÿ<‹?òU>%ÿÙ@ñ—þ¤z•zù{ÿpÿöó:>¡þŒ/ÿµ§ýŠþÿÔ/ÃõË×Qâÿù ZدàýBü?\½pÏã—ø¥ù²ã²ô_‘ã¾-ýÿgÿkמ)ñßÀσ¾5ñ> –ÑßøÅ¿ ¼â=zù,­a²³KÍ_XÑ/5 ”´²·‚ÒÙf¸q¬ÛÄ(Ñ›ÿ†Eý”?èØgŸü2ß ¿ù𝡍¯^—ñ TèÐÏsš4hÓ…*4©f˜êt©R§ téÓ…uS„#ÂJ1ŒTb’I²À`')Nx,$§9Js”°Ôe)NOšR”œ”¥-e&ÛoVî|óÿ ‹û(ѰþÏ?øe¾ó5^‰à/„ >T|0øcð÷áÀ×M‰ÖÇ€¼á¿déŸkiÕG‡´Ý8jO…ÿØMßöO¶Ýù_ÚfßèTVxœû<ÆÐžœæ¸¼5N_i‡Äæ8Êô*rN3‡=*µ§N\“„'h¾YÆ2VqM:x,Æ¥,&•Hß–tðô¡8Þ./–Q‚’¼[‹³W‹ièŠ(¯(ê?þ$ÿÁ=¼uªþÏúÕšü<ñµÿˆðF©û9|IøñÃörñÆÿÛk]ý¼á ~ØMã¯ÙUðO‡¼AñÃáíoð_âªøsÀ¾×_âŸÅï øGý®/üïø§Š?à´Mî…¤èóø3ãf¯ðcNðOì¿oâÿ…ÿð–~þ1üBð‚>#ÁW¼I¦üÿ…qñcáç‡?`y¿áEjŸµ'ìãøSúï€lf¯‚þðü"_²¯Ä‰~1ø ð¯ÅzÏé?Çø*wìÙû=|]ø¿ð_âD:Ü^.øIð»Çÿ Ÿ†¼{û8x¿Ä~9‡á¯À[ö˜ñ'…ðÊ~Ìz'Áþ pÞ¹ýŸn|ñCÀ~ø‹âÏ ü)ý˜~%jÞ¡ñCö#øõã?þØòü;øI­èZ?ÄýnMcÅÿ>/xWö;¿ý³~4xroÚãáį~Ï³×Æ¿ øËǾøû!øÇöjøuñá_€gŸø(—à Øho«ü øIñ+Å~)ýn|Wào€Ù}ÿ6ðæûCë§‹hŸðY wö²Ò¼A«øÅßÚvšßõ?ø'ÝŸ…µ_x"OÚCÀþ!¿øa>‡ð{ÃZ¾ñe>5éPüZý»ô߀_¬¾4|výŸ¾(ü·Ô¾(Û|/Ó¼ñkãgìðãÄwó^xORñ]§Šì¼_ãÛSFø!u¢]&«éÞƒâäŸg¿Òµ-R/‡ á¯D9TM.XÞ÷].äÔšÕ«Ù­mt¯«ÕK£né~ .›6­úOì7ð“âOìËðÏÞÑ>üQÓ¼ ñö†ñN£á‹^:ý“ü5â?ÙÇáS| ºŸþ;/„_²ÿþÌÞ Ñ>~Ö5Ï|@ø£àoÙ«âŸì‡û6ü ñ¿ƒ¼uðXxsö‹°Ñ~$þÚ—Ÿ>üBºñgÃÏ|dðn‰gà‹ÞÒ×Å|Sð_ÄsØ|MÖäðÏŽçñO‡lõñ_¿à¡ÐøÓâOÆÍ_QðÇÅþË^"ý¡¿f_üý¥t­áV“ð«Á¾ý¨ÿdÿØ£Å_|â_ j6ðÇíAs­üFøÕû@Ù˱uð'Åv›ã‡àñ‹|+àÏ xŸþß—~ËßðWï‚¿…¿c?„?ƒÞ,ý†-?áž|}ñ#þ ûm|r±øùâ/‰ß´ÏÃÏŒføXß ¾3þÌþ%Ò>0~Á¾ñWí+áßøUÚœþ9ø}?Ä„¼;uêÿeÚcÄÿ¶ˆþ.Û|/ý¡¼-¯x·[ý¦|5ñkãOì¡wÿõø;¤x·ölÕÿeÚáçìóáÿ…ÿõ]SÁ·‰hm;ZoÙf{½+öñEÿìáá/ÚoÁú§ÄA£|+øaðWľý(øãûox[àOÄoø#[ø5ñ³ÅÞø7ðOÁŸ´WǯŒ> Oƒðçà—ÁÏk¿4„ñ‡‹tÏ|cð‡ÅÏÂ?§üø›â{Ãÿ>|OñKhZ-¥¾¢kÞ&Ö4¯Ý|½/üçÀ?³wÂÆµn¿ö‹OþÔ?ðPßÃãOøMf¯ÿÂðÃöeý´þ,|+Цÿ…y㯋_ þ(ü]ÿ„/áu‡„tÿì/ÙÏáŸÇ?‹~!þÀÙ¨xc[øƒâï ZxÚ”ª=Tbïx¥m_2rÓ]쯮»;;†‹Mz?»•/ÓñØø£^ÿ‚||`×þü*Ò¼Kû/`|ð—¾?\[þÍ?³_Àoø%§†¾1ø£Uñ^…û5h?þ>~ÔŸ?h ðN {ãfƒ¦ü+ý ¼5âߌ³÷ˆ4O/…¾%ü+ƒáŸÃï…žñçÇo„¾òý¬ÿe/‹¿¿c¿ÙSàÝÌ¿~'§Â-oálÿ´‡‚ü?ã€?>*üvðç„þøÿáôºTúÏí¯ðÛó7í ­Ù|s×þü_ñ/ˆ?ho‡?ì5¸|ªüXð†¼1ñ¿BømáØ¼»Ç?¶÷í=ã¯øSÃø5ñ³ÂZ߿ࡿ´Çì—¦|EøŸ²L¾2ø‡ðçàF«ûyj^µû;XþÒŸüSðûEñ·‡í?d¯h_5/ÚsÀ¾е+Ä_æøá½C[Ô< ¬xWêˆßðR?„Ÿ ´¯‰3ñOÃ/‹ðÀŸðÒ:'‡~2éúgà Ïü^øŸû&x7ã~9|øuáÃñV/‹šo¼/§þÏ4ûâÏÃ?…ÿ øwö^ÿ†¾øÍªü#ý¾?gßÚnÛà¯ìåûBü%ø¥¨xƒö^¹øGð3Ä^ø7ð¯öÔÑþøËቿáž<ñkþŸ©h¿³Úþ&ÿ‚‰ø[Ã)_ ]~Íßµ ¹ðOÂ/ÏªÝø{àç„¿³?᥾1üUø û(øK^ðÄÞø™á¿~ÒŸ>Á¡xKAñt¿øTßð°ü7íMwû?g|LO‡{~ÿ‚‚|3ø‘ñ3À?¾|:ø£ã¯Šž!Ñ5üNð†§ð7Ã~#ýü9áOŽ^-ý›<}≖>5x9ü{¢|:øßðãâw€|gªþËÇö‡°Óïüš•”úŽƒñ+àŽ«ñAsUÕ¸®þKDíñið§g½üÐÕ–ŸÓÙ|ú]Ÿ!üý–þ'üXý¾5ÏÚãŸìÙão†_ æñ·íñÂøŸãÿ„𾫧xÊoƒðG¯üÖ(x'Å{|mû&|mñýkRñ†•àO|2ø{ñNêÇÂ4„úÅ™ÿÌý‹~+þÍÿ®!øã'Œ´KÏü!𶨾øCáo#‚Ãá–·†| Š|Eg§xÛÅ>=ÿÁdþø.Ú·áç½KDÕþ7üø]ûZ]ü;>%ñoÂ-sÞ2øåû+|*øŸãïü<ñÁŸ|l?µ‡„4Oß|$øoªøÓâ_Á¿„¿ üUaàÉÛÀŸ5Dø‰ðcRøˆ^¤—*ŠiÆ+K´’ÕnÛNÒÕ=Öº¥p²O}|þKô[ug¥ÿÁ=tMoâ„|ñö+ø]â¯/ü£ö‰ý§ÿh‹>%ð—ìóâ_‡ÿ´o¯Œ^ÿ‚’ø³àu߈4ÝK]½ø©ñ[ýŸ5ïÚ#àßÃ-WFø³ðÏI›ÁÞ8Ôg¿øA'>xwPø…ióÏí;ûþ×~&ø'qà_üñ¶³­ü&ÿ†Õÿ†¾økûÝxËàŠ|UûPþÐZÇìýÿ /Ä_ÚÎõ¼Wû>|ðÇÀ‹ØÒÙ»þCÄþøÇðJðÄ Å?ð†k>iþý'Ól—øðþÛCøÃðÿö¼ñψþ|.½øëûOøÇâu¯ìd~ ~Οu¯|Z³ðÏÅoŽV¿þ!øá_Œ´KÍáÅ-Sþý|-ñ£âdød#ñ¯ ø“â/iÞ6.ü3øWý‰áào‰¾ 7ÄoxïÁ üAa«hŸ ü!ã~Ò¶>4øá¥V騩Yé»Më®ú]Jý-š´Ee濾ò_3¶ýŠ>Ãð[ý¦´ÍSà‰à_øóö†øÙñkÄ´7‡ôÏ…QØ~Ò^øËûCüuøÓðÂÊã^ðÞ¿/ÆMo[øà‰ZGßÛ|hðOƒì~Øßõºý(ð×í³ð[ÆŸ²ß‡ÿk/K­ø³À>,Öô¯ø[AðÔž×|Gâ_‹ºïÆ?gmá'‡õí/Åw_ µoYøÿukð£Jø‰§|M¹ø¨ßÜÁãëOŒS|š?‰MÄøÏöóÑ>Øj~<ýho \|?ø\Ÿi-.æ_ÙçT¿ý”þÞøâf‡¡|Vøµ'‡h=kLñΉâ-3à¿Å¯é¾ý˜uÚâe§‡< {k¯øEñv¿àÏ xšäíïs+ÝìãºÕ߯+³KÞå¶±Ié§ki»íoÓóèÏþ|øÙû?|cÓiþÇþ6Òþ /ü4Ç~~Äß 9ø›U¹×h?xÆçÃÞ1ñÆx¾vÚìW®øÛöRÿ‚=|øñð?Á?ôOÙÃþïü4ÿÃ/ˆ¶¿~ x7ÿð‚ÿÁ:¿hOƒ’lhšÍî·áO`|wñ_€4­?þtñW•ªÍcâí3~‰£]ëú~ßÇø)Ä>ø-ûGøûÂÿ~(øFãáþ‰ûpø?à7Å‹VŸ µO‚ß?hoػ´&µâÙh ¾:øƒã~—¢^?ìÏñwÄ6ÚÇÄ|&Ñ5¯ øR²ƒÅº/‹¼Kà]Ä]¯ˆ¿à :¿ƒþ*èŸ 5ÏÙ—ö†½ø“ãÍà¼ýœ´­3ödâ®â?‰þÞž)ºÕ|KñVïöÈ?uM÷áßìGâŸAáý/Äzeÿ„¡“ÃâOøóĵ|¦êZöŠzë}tM7~o³ÎîÞÏâwÝYwíÚßfÞZÙiç¡ù±ûNþŵ߉¾ Üxÿüm¬ë ¿áµá…o¾ÚþÀw^2øâŸ~Ô?´±û?ÂKñö³½oþÏŸü1ð"Çö4‡önÿ†ñ?~1üÒ¼ñBñOü!šßÃÏ€š‡þ×ø­û|xñF»ûFø'áÿáø}¥ø'öŸøåûkÚ÷>ÿ…uûmþÚÿ~$|=ñOˆÿá<ðv¯ªügÑÿáEøÇÄ¿´GÆ_øIu;]ðö¿ÿ ÿ„sÀÑnÿc߆̿CZÁC¾ ]|?ý£~ Ÿ |Q¶·ý•?g[ö„øÉá¹ô_ ŸèÐøOǵOÈ ô£oãkkß~üIýŽ~2ø/Äi¾"›áV³oá­gÀ?|gáu|Gkåö?ðS iWŸ­5¿„_x+âŠ|u¡x~ÓźÂÏx›ÇWÁ_ÕÙJÍôë+>®×èºûÍ+¶ %ç{[åmU¾Wé°Á6ÿf-Gövÿ…ÏwiðããgÁÏøÛþÕ¾ðßã þÁþ Ù⟠Âu'Šüoáß‚ðN‡>ýŸ|3ÿ 6“âoh:¿Å={ƾ)øÇñ?þ3Â^-ð¿‚|ðsá–­ãßýš¿e¿‰ÿ±ßø'¿Ž¼;û6xÛâGŒ~~Å5ø!ûI|3øoãÿ„š·Æ9¾<|\пb B÷ÆZ·Œþ9ühðÃïø'áí§ì«ü$ŒéŸµkŸxZ‚þx6ïàÇ… O‡Ÿké_¶÷…µ¿Œ~øc¦|øÙuàŸ‰¿>,þξý¢¶|‡àæ·ñàg…¾5xƒâŸƒÿ±.>1ÅûAi¿ð‹êß³ÇÆÂA«ü °ð¶·âŸý¯ÃºÞ¯àŸx_ÆßÚõrM¶—½fÖ¶vR…´w[»§ªk ìµÚËò¢?žoÙSþ Íñ?ágÁ øÃÄŸ³¿‚|5ûaøGãgü† üU´›á%ÇÆ? |ø)û?ÿÁ2þþÖžÐ~1èºÕÞ·¤ø& áwíiàøMñlßü-qã]Eм]áï‰Úl~-úöôý'ÀŸ¡ñì÷ñWCð?í¸¡à?àƒ$Òÿgÿ‡ZV‰cð៌üyðûÃ>ñ·Š?^(£ÚËݽ½ÙFIëv㢻¾·ë×Í—à×ßoòô?~|øÙû?|cÓiþÇþ6Òþ /ü4Ç~~Äß 9ø›U¹×h?xÆçÃÞ1ñÆx¾|Qð[þ ×ûcøGÂÞ³ñGÁ횇> ü&ðÿÄÂÁø[ÿ ?ÂÞ ø9ÿøh??g_²Gãy|3â/ø^þý…¿l¯€Øž7Ôôƒž2ûö7Å/xsáÄ'źÇõ E5ZK¤v·]“m}¯7®ï«aÊ¿¯—ù#ðoÄ_®~ÿÁ6¿àµ—?²ïü1ßÃïŠ> ý§~"ü(øöO€úOöƒm¿àœ?>ëZÇü#¿³‡¾$ü.ðçü$~|EÕ³ôÿ¾«{çÿÂA¬XÚ]ëDHXþÂ?¾6|&ÔôØ·þoö8´øÙð»[ñïì¥6«ðáö•&«à¿Ù{þ CàïŠüOðÛö\øµã_„~)ðOÇ]Cöý•>øë@ÿ„£^ñ—Æü>×|ñÓá•ßÀOi²ø‡÷’Š^ÖVvI7}o.ÑZkºµîîïó¹m¼½:4ûytÿ#ðoâìaûJø£]ø¥¦ü)ømÿ söÖ¼mû|ø—Xÿ‚ŠÂcà ÂÝøIñ÷áÏícáÿÙ7àoü-/‡~)׿l=GþÿÄ?ÿd«ŸøDþ!ü%ð÷Æ_ðÉ_møUâ?Kð³àü&˜Ÿ?b«_оø:>ÿÁ?¾(þÎß<­üv>>ý~ü4ÿ‚Dê>#ñ¯ÆØ~ÏŸð¬iß…_¼Qñ·ö)Õ4O x/ÀŸ>\üA›Äš?íIá›ÿé¾ðŽˆß ¼]ñþßú)ûY&–—ïÖû«ùéü¿fÁeýy[çуðÆ4ߊÿÚü6øÙã­nËö^ÿ…uñöø‡ãÙ{â·íàûö,ÿ…9c£ÿÁ-¿lýCÅ?ÿh߆ÿ!jµ7Àþ xë\øÉñ¿Ã×ß5¿k/Æï¡þ~ͼ7ûþÔß|ð÷áwì‰ñ'âf‰ñ¿Býœn< à_†³—Ä_øàÎðóáÏÅßÚ]d?|Gø7¦þÐËãí*ç\ñ'Ŀپù<9¨øJø{âO |7øUâ4½ø7àÕÚ):’i+-9z?³·_¼-­ÿ®Ÿä~ ØþÁV~6|&Ôì àŸ?±m—ÆÏ…Þ ñ¿ì{ñÃ_²¬ž ƒÅ>ý—¿à¤>ñ¿í¬|ø-ãߊß5ŸøOüWñóöDøu§ëv:Æ­ñVÕ~Øßx¿Áú~øÅW^i~9xkö ø«ð3Hð>‰s¯\üQý¦¼)ំ¤_ üY`¿±ß‹?kωÇŸ>xsÇk?­u»_Ø{YÒü'û2ü/ø¹oÀ_øŽ†? þ4xoBøW¡x¿ÃzwéE:’v½´qij×»}îÞ÷׫²­ýz/Ðþe~þÁµf—âÿ+à¿Å ü ðí ¤xƒáÏ„þ-k±7ƒüGðÿáPý®?à…ŸüM—ÃØÿÄZOìëàPÖ?eÛOâ}·†¾øoJ›Z¿Ðõ/ø·J½ø¿ñjÚãÇ_ÓURœÜít•¯µúÚý_`Jß×’_ QE ÿ<‹?òU>%ÿÙ@ñ—þ¤z•¡Åž?ÅŸù*Ÿÿì xËÿR=J½ ü½ÿ¸ûyNŸ?ÐÿFÿÈZÓþÅÿêáúåë¨ñü…­?ìWð?þ¡~®^¸gñËüRüÙqÙz/È(¢Š‘…Q@Q@”_µ/üŒ_ þ1x_áßÇ/Š:¾»¢~Ø~0ø?ðÄ· ¡ýž|+ûC~×?hÿ…Þ7ñ÷ˆðΧ¢kµ?ø)Wí'ãÁð¿QøwáÏx¼kð«Ãÿ<#áY¼-«úÿìwâmOþ_ß~Ùµ ÿüÿ þ‰áÚûöA‹â6™ðÃâü+Kï|ÿ„ZÙ>?¾ ×|Wðá×·õƒWôÍwÿÙÚ?ÄÝ?ÁÚ¶»á]Oíz)sÉîïê“õÝuëß­Çeý|¿É[±ù¯ð“þ ðÏàì>ð¾…ñËö†×> èZßìÍã ï€Þ%»ø7Ãÿ|@ý‘¾~Ïÿ ¾øûÄ'Ðþh?íõ½ÿeÿ‚Ÿ5]Âÿ|7àxãÂsÁ«øJçÀ>"ñ'unÛà×ìà€Pü>Ð>ülý¡¼1ðÛÁú'Á;O|,ÓüQðþËßüYû?ü*øiðgáïÄ?‰ž.Ó~Øüd³ÖäðÁ_ƒÚ/Œüð«â‡Ã‚ßl<š7~ëžñßÅâÞTPç'{½÷Ñkç¶þ{èµÑ—õòü4ÛcóËãìC®üvý£~3øßÅß|máÙ÷ã'ì½ð7öuø…ð{áÛü9Oø]ºƒ|uûWêÿüñ_Sñ·ÁÏøÛÂ~ ñ‚~=é^ð÷ˆ>üSøañ¶¾ \>· êÚ?€¼Ek‰ãïø&?Ã?øOâ÷ƒ¼1ñËö†øE¦~к'Ç/ü~ŸáíßÀÝNÿâßÃÿŽŸh_ŽÚ€u¹~+ü øoá=Àž.ýª¾<éÞÖ>ZøÇÞ9[Ox·Ç:Ÿ†<«øô¢Š|òÒÎÖ¶–VÑY7¦­Yjï²ì‚ß×õé±ò‡ûxÃß<1ã+ˆO‡<ûCxëöŸøyðš{¯‡ò|?ð?Å_‹^ý£ü'ñ’ïJÔ—áâ|TÖ4OŠš÷íIñ7âoˆ4oüLñD>ñÄ~°øg'€þiWu.øÿÜøIñGJø‘àÏüMøØßüwÿ #­øwàÖŸ©ü0³ðo‰ÿµŸƒ~0x+ã—Æ?‡^#? ¥ø¹©xÛÅíñóP±Ð>,üLø¡ð“Ãz¯Åaü=ðËMÓü)ðÇNð'èm¹å{ß_—ž¾º»½ÝÝÞ®å—eýÃ/¸ù{âOì—ðçâ¼SñÄ׬õ¿ÃiZèú–…o¥Aÿ 1ûJøÇö¦øKö/|7¨]Åÿ Äjº?Ä_>úçû[Á¶ú~Ÿá¯øDu¸®|Cwå×ðO¿†z®·ððø‡â/Åü6øiûCxÓö¯ð÷ÁOiŸo¼¿´7‹hŠŸ´Õ‡Å<`¿`øõáoÁ_>*Þé¾´ð'Æ_ hš—Ãÿ é^ñö—ãxŸâµ§Ä¼¨£žK¯ü -uÙ¥¢kTÅb |vøãßë~6xGÃ?> ø3öuøõð{ÁOðq>ümø9àÝwã&®žñn§â/ø¹á?øH4ÿ|/¯xƒàçÅ?†)] Z´¸Ð5½ÄÚ>•â+\OþÀ>ñ§‡>7|8½øÙûCi>7hŸ´U¥ÿÀŸ x£áþ‡ðÿÁ¾,ýªl> Åñ§â‡õ{O†#â§‹õ¿kßþ)øçJð_Æß‰¾ xWÇ3ƒ_ð×½-þü ƒáßÞTQÏ-5ÛmMÛt•¯½´½ƒúþ¾ãä?±·þ>xÅæ¯ñâ´ÏŠ ´Ï_´/ƒ¼uðüxsö‹ø¢ßøþïKøSñ ëÇ)ø/ñ2{‰ºÜ—^;ŸSðïíGÁ&¡ûx¾è~ ð¿ÄŠ>ñ‚ÿhoÿ´ÿË>ºø¨ü@øqñWöƒñÇÇ|G»ðþ›ãŸ‡ž1øW­è—zíñwá–•£|@øgãHt¯ø– ø$o‰:ñ MúòŠ9¥d¯¢ôím{馷ÓM´ _×¢>yñìááÏ| ƒàŠ|uñGįk­økÇV¿Ãâ~3ýƒ4OˆÖ…§?h¯ÚÄ÷>'À¯ÚKT¹‹öyÒïÿj϶^#ø™®h_ ~-GáßÙóEÓ< ¢xwLøÑñkÁÚoŠ?f;özø™wáÏ^Ýkþ;Ö¼] x3Å>ûÊŠ¤¶}o²ßîòOÕ'ºVŠ7ê~»ñ¶™ÿ ^«ûfh_µo†¾0ø7^Õ|;¤èºÝ·‚SDý±>)ÙxHx_Rðߌ´OìÏ\ÜxËS»ÒuyõóCýˆ|-oñá·ÇÿüeøÙñgâçÃoøAþÏâß¿ÁÍþŸøW~ý·<áøJ4…Ÿ>ød}“Ã?·Å=2ãþ}Ãlÿ„+áeåÆýCLñ½ß¾×¢Žyk«Öÿޝï{÷Òû ²þ¾_ä­Øü×ñ÷ü់ü'ñ{ÁÞøåûC|"Ó?h]ã—ƒþ?Oðöïàn§ñoáÿÇO?´/ÇmGÀ:Ü¿þ|N·ðž‰àO~Õ_tïë ­|ãƒáÏ­§Ž¼[ãOÃÕü?ÛEÿñø-„ÿkO/‰þ(3öÉø]ñCá/ÄùÛZð™¿Ð¼9ñkãOíñÛÄw¾”x$[ézÝ—‹¿mÏŠÚv‰sâ_X[xsÃÿm/ôÝKSÒ¼I«ø³ï*(çžÜÏ{ôÞéݽݬ­}¬’Ð-ý[l~^é_±‡Æ;ÛÀ~;Ó%ÿÙ@ñ—þ¤z•¡Åž?ÅŸù*Ÿÿì xËÿR=J½ ü½ÿ¸ûyNŸ?ÐÿFÿÈZÓþÅÿêáúåë¨ñü…­?ìWð?þ¡~®^¸gñËüRüÙqÙz/È(¢Š‘…Q@Q@—¿ÿà§øWsñ7@Õ~ÿ®ÖüûP蟲^ŸãïÚÇã?ÁÏ€³V½ñVø¯þÔI­jŸ|â^+ðG‚o¾iÖü3©x—àäî½ãïŠß ~Oá½[»ø™wð¯ôžør×ÄzWƒ®¼A¢[x»]Ñ\ßøoRøeð[â¯Â¯[þÑw¾2ø‡ éºˆü¢7Ão O⟗)þ?·÷ÿb-sÇZn£ øeÖ ƒqJÊñ¼šwIÛnº&®õëäë맦ŸðO¡ôÿÚWörÕ¼eðëáÖ•ñûàž§ñã‚l~%ü%ð.ŸñWÀ·¾2ø£ðçSÒµwMñÿï [kÒë~6ðN¡¢xwÄÅŠ¼5c©èWzV…¬j_Éi¦^Ík üKøsâ¯øB¿áñÿ‚|Gÿ 'Á7þ`ø«BÖ?á>øsaÿ—Û¼à¯ìûûøJ|gÿ ÷~×â­ íú¿ü&¾ó¯Óþ=ퟞz×ì[ñKñ—Œþü3Ñ> ø[öbø—ûPþÇßµ,úΟ®k¾ñ—Áoøcí+öDÓ<5ðá×Àü.¼ø}âÏøšÓö-ðf“cã‡øÙð·þ +âž±Ÿð¯Ä±|'Ò¬þ(²ŸìµûFü!øû,éŸtÿ‚iðö4ýŠ>$~Çžñ¿‚¾(øëÄ¿¾3ok¿²¿†>"x·áf»ðGÁ~ø=ö¯ þÌÚ¾½áãÆOì]wÆ6žÓüOâ-?E›Åã ]K¥ìÚ¿ÂßßÍhÛµ³VZö¿áÛïݽ;[sèo?¶Áo…ZÝÇÃíÇ¿ ¾ üoѾ(þÌ^ñÀ+â·„í~*ø+ß´íð/àE¯Ä/ø&Ñõßi'†-þÃÄÐÝxF[Ñ“Åzv·ñƒþ ðágÀkâ°ñ¿ÂëÿŠ“~È~2ý°~~Ìú¯Ç?„Vß~&øÂß¼]ñv  ø«â^™âMûLðG‰,'ø“ðÁ¾'ü?è^ ñ‡5¿h:CÞOå÷²×íž×¾Xéÿî>ÛþÚþý°ü1ñrï⎬þ#klÿ‚›x+ö÷ñ×ý{à¤?oü3áÏøG<3ñá焼]§üvñWü&ºï…¼­kðŸãív×á·Ïý€?k…¿±ÇØÇCOÙçÅšgí#û!é? x²Ãß|AeÂ-CSø§'Ä:Q§m^Òþd¹£¦¾]_/Åöop×M=zÛm?=z«ßi_ÙËàþ•¬k¿¾?|ø]¢xwÆÚÃOk~*øÁ:V…ñVðmÄ]+ÀÆ¡â]{L´ÓÔôßiþ½š v÷Áº…‰í¬%Ñ.ྒྷ˿iOÛGà·ìß­ü<ø}®x÷áuÿÆÿ‰ÿgø;àN«ñ[Â~ø«â/|}ý¡üð"ë↼vú‹¼I¢xßÄ>)ñ¥Âé~–ÃZ‡áÿˆ4i5½ Ôu½âŠ?ðO¿Œ6þ8øu¨ü3›DøðïඉñïÃÿ |;sû`þÔŸ±Å[ûÚ«âÃoŠ¿çøµû@þËÞñŸŽ~+k|sðjÚëMñ/Œ-5_þÒpül½ñí ªÜüzø{ñÃöª4ïØ7ã÷Âßi>iŸ³Î±ðC_ý¡¿àÿüSã=CâÅ߆ž#øeaûØ~Ä×>ü3ø1ªxöˆ¸ñ扯øGö(Óu_kß¿jMÄvÿßž,¼×ßÀ2|Dø†”iéy_«WIZëÎëMZëð§up×ú×·üK\ú‡öœÿ‚ƒ|ýšoÿh?kš†‰uñ¿à¿ì‡®þ×~øSâOxOÀ×ÿü9£xsöˆñ ׄ>µÝî±âík[ðí¿ìßâ›ßˆ÷Ú_€u›xsÄ^ñ ‹­%Ö£a¦ûgƒÿj¯€?áð£ðkâÏÂïÞñÿÅcàý§‹>ü\øEãi8Ðþx·ã£¢ÞÞZøöw[¶ð„ÍÕσ|iã?ˆæ›ãKÂ6_ ´¿øßÂß.þ×?²—ÆŸ‹WÿµÄ eø]}¦~Øÿ°n¥û"xŽïâŒ|Yà»ÿ„þ#ðG‡?k[¯†/Ñ4ï ü6øoñ3Dñï‹¿j%Ðüycª|4¿ø_áÏ·Š|<ßõ?hÒ¾&x†ÃGm{Ã~Ñ$Ýü=½ñ׃ŸÆšg†µ½GL] \´ú~§£Xkún±.‰{oqkרü:ý¥g/ŒV®ü%øýðO⎉â/j ÔÿmÙGý~;Z[|pø“âKÙ×ÞñíMk¤|ZøK¨Ëû5øvãö—Öõ¿þÔÚŽ¹©|2ñŽ—û.Xh>#øyeák_‰ž ÓòðWí+û9|Iøâ߃ß¾?|ñ÷ÅÏÿoÂuð³Á_| âŸˆÞ ÿ„[]´ð¿‰ÿá-ðF…¯_ø›ÃŸðŽxšþÇú÷öÆ™gý®ÞZi‡Ùõ ˆmß˼ûhüñíñÃöU×<{ð»Áþ|QÒ|àï…Ú¯Åo ŸŠ¿ü9¨þÍŸ?h‹¯ˆ^øavúW‹—DÓmþ#ø§Ã3®—eâ[Ã/xŽMnmGGðÿ—x+öKøáÏøf¯·k^ —þßü7öàý­Õãm'þÇá×ü%ºn¡ý—¡Xbø×ûÄš÷öv…ÿ â¯Ùköñ7Æ?'öÁ;/Ù÷ãgí¯û&~Øð³¿áhøêçã†á—|-û]ÿ»ÿ…ÿ FßÁ:Ïü'>6ý?áÿ„»þ+Iÿ„gÂßÿá0ÿ„cÄ·„¿áñ2´.ÕôåÑÝhÔí}µ÷o.]ÚvNú†¾›yþ^}|®~†h?þø«þ¯øF<àŸÿÂÉðMßÄ¿‡_Ø>*еøO¾ØÂ%öïø+û>þãþŸÙÿÂ}à_µø«Bû~…oÿ ¯„¼ëôÿ„Gûg—Áû]~É÷^#Õ|kûO~Ï7>.о(øà~¹áh>5|6›Äz7ÆŸ_ø—Kð·Â WCÄ­©éß|K©ø/Æ:w‡üwk‹5›ÿ ø–ÓNÒnn4-R;_ž?b¯€ðƒø§â÷Ä]CLñ¶‘áŸøÛâ—ÀÙgÀ¿lþÁ¨üýœ¼!ñÆzïˆtÏøb}ÓOø}àŸˆ?.õá-ŸÃ«è| â¿Ø?àgüÓO¾Ñ­¼MðÊêfùçâüÇãO‹>|Zðvâ…Ðê~<ýžà¸_ t‰ïu¯Gamâ?ø)oíaá?Žßou)`ðMÍÄ:'„ü#¡]éß®mmo/ô/Émiàí7ÇšcË«Â(Âí94®•þMþIù»ìöü}?àýÞgèj~Õ_l&ðfão‹? ¾xâ_ʼnŸþøOÇŸ>XøâŽ>|UÔ>kú/ÃÛ=Çºí¿‹5¹¼]m¦Z·ƒt›¹þ xZÿÄš'ƒ¾#xGÁF³à#˾ÁE?bω?³—€?joøi‚~øGãïøEtŸí‰~x[þ¯ˆÞ*ð-‡Ä_øR~?Ô?á7¿ðχ>6xsÃ7ÿjñWÃøHo5Ýìwóùw}¿ÛŸåïþÄ¿´oÃŒúþë¾ øiw­ülø¿âÿŒ¿ü1ñ¿ÇZþ«ãÏÙÿÅ¿·ÇíIû[øsöl×dŸ|Ö> x—ûWÁßÂó|{Ñ>)ü,øßðwÆ^=ñÕÇ€üS⿇ÞÔ|ñ¸ƒöGý­¼?û9~Í?ln|âO þËÞ ¶ømàß~Ú´÷ìƒÿ ÏÂÞð/Ãü$ý¥|[ñ¿ö{ø;7Åφ^6Ò4ÿ|EÒµïØ÷OOŠ?/ÿámÚx»Xøéâß|!ð8¹|´ûõþd´÷º;­}Ô¯+õvL.ûzù=>þº¯ÌûËÀ´?‡<_ñ'ã‡Ãmq4Oê ?hm'öxðqÕ|Y`oþ-øQý“þ~ÖOá­îÏJ¸]oMðĤþÒçñ-ùðçÃ/xêKÈ4ÆÔtÿö¿ ~8|øûáËßü ø¿ð»ãW„tÝnçÃZŠ~øÿÂü9aâ;; 7T»ðýî¹àí[YÓ-u»]3YÒ5*{¨ïà°ÕtÛ¹`[{ëY%üQøYÿøÓàÙ×âÏËŸ‰_ ­~$ühýž| û"xºýŸÅž9ð>•ð[Yÿ‚|~Çÿ²Å?øûkþ×¼ñGÂ?>ë¿ôKÅ£xOöøá߇¿ ÿh6Ñ|Gkðgâ¯ì‡õŸƒÿfyµïi ´GøÉñçâì“ðZ]ÿjÛWö÷šÏà·€¾*ø³Å_¼oã?Úöœ½ð|8Ñ<ðCâ/Çoü3ðD^ðW„ô¿Šº-…”þ9øçãø-áñÆòÊïÝKd¯§3ww³ÕÝ]+kkè]饷¿áýtòØý øµñÃà·À/YxÇã·Åÿ…ß|#©kvÞÓ¼SñkÇþøqáËÿÞXjZ¥§‡ìµÏêÚ6™u­Ýiš6¯¨ÛiP]I=†•©]Å[ØÝIŠ~жÁo‚¾ý©.´?ü.ø‘ñ¿öYýž~&þÐþ1ý›ô¯ŠÞ°ø«‡>ü?_Ú§‰|5hþ!ñwôO[ê>´ƒÅš§ƒ¯l,áñ‡õìõÔôëkî'öÊýŸþ4ü\ñÂ_þΚ†‰ðËã'‚ôO‰¾ Ðÿi‰þ3x³Â¾#øáÏŠWÿ äñMÞ•û:ÉðcâçÁÚëDñxLÔ|Að¯ã×ÃË KÿøjóáçÄ?‡~>¿Òþ*ü:ø7âü¿â—Œô¯Ú[ÁZSø&úÓÇŸððo|%ø£ã¯ÚÇöÇÖô«_ˆß¶çƒiMðü?±m´‘~Ì_¿á—ö£ñ„µßŽž»øÛ®øÃÁ¾ñ>½Á}âÇ;Ýsá1Ói9K½Ö®Ý7æwmE(ÞEÝöùýßð|¼û~Éé_> k¿|Kð'Cø¿ð»Yøßà½øÇàÞ•ãÿ ê?|'á˨|?qkâü<´Õ¦ñv…¢\Ûø³ÂÓÁªêšE­„Ðø—ÃòÇ;&³§5ÏÏ6ðQOس[øðƒá׆?i‚~0ÿ…çÿ +Iøu㯠|aøQâ‡:ßÄo†ZïÀ û৉ôÿËý¥ñ³ÅðÐþÖ<ðßB±ÕõÝoBµ×µ £°òtxu¿ƒ|Yÿ§ñ¯þ;ø\Ö4M?Àßu¿ÛÇÆžøÙªþÒ_µÇÄ{ÿxöâðçí% ]Zxkö»ñO¿dÿ…zßÃ+Ú—Å>Ÿâ¦—㿈7ÿ|9àï^ÉðóÀ^9ø÷¨øÃàßÚöþý¬1xâ>©û,xSÔþ(øSýž®´+àN£ð×BðŸ,ª6vvïtÝ´ÑÇinöí§Ý}vÓ__ÀöÏ‹_´$?¼Geàü'ø£ûD|T›D¶ñ†¯ð¿à´ß ­¼Gàï‡÷×ú–‹¥øûÆúÿÆŠ?~xWDñˆôOÃÞ ÑõoÁãˆ÷úŽo~øKÅšŸ‹šÏ€¶ôÿÚá'ü&_¾øÃÇ^ øeûA|MðM޼?û5øëâ?Ã~<eM¥k¦« >ð×¼Mÿ 7ü#?ðŒø¶Ë]×|©x¿Á¿ið‡‰îtêúN‘>§^]ñ/á§ÆŸüi×hŸÙÛBø]ñÅß~|7ø-ñ#á¿ÆŸ‰,øAáÈü9ðƒÅŸ|sðãÆþøào„_µ=?[Óõ?ß´ø#^øk¬ØxêÃYð6½ øçá•ÇÃ-@øËòÇŸÙö¶øãñoá×uëŸÞh–¿?bÿŒ×vÐþÚ´÷ƒ<ðBøñ?àwÄÿŠŸ|1û4ø/àíÀÚ÷ûWÅ ~$x·À¿´Ç{O†§Õ~,èZ ç…¼¢|øy9J1v»I[{«ßMoe¾É´´m» ÿ—çý~§Þ^ý®¿dÿŠ~ø…ㆴ÷ìóñÂ? 4Eñ/ÅoøãWÃoøsá—‡Ã[ÕĵÏx—QÓ<¢6™á¯ê+ªø’ëM°6ÖîÄæßJ¿’Ûöºý“ï,>ê–Ÿ´÷ìóu¦|}Öõ/ | Ôm¾5|6žÃãWˆôoÙx;WðÿÂ[¸¼JÖÿõ½+ÅÚ–ámKJðtšÍýˆïì´;¨"Ôî µ“óÊûþ ãñ¦O„_ðOŸ ZøŸátž.ýŠÿd?† 5Ëiõ¯AáÏ|iø+ñûþ ¥ûAø[BÒµØüs©è¿ ¼w©þÃ~1ð?ˆ>$]øfûÅž°ñ¿†¼_§|"ñýÅž©áÏÚöøëûLxãXø“ñÁ ­u?Ž_³Ï…?fŸŒ|?ût~Ú¾øUðÏÞøûBjvž-ŸIø ீW·N‰ãþп‰~ |]ƒök°ðÌÞ Õ| áŠóiŸ|Aão ¾Zwø®ú««h·µïñ_K%Ë«iŠï¶ºwò¾ªöݯÇcêþÝð_ìÏâÚkÆ>Ñ<'á þך¯ìÃâ™×u»k ø¦ ô­/Wº¿†o x‚) Wѵ¶ùwÄ¿²—Æ›_Ù+Ä ü/Âíw⥷íåªþ×~²ñ/Œ|Yá?‡úχ!ÿ‚¨Ïûwè~ñŒô¿†Þ4ñ†µ½Gá²ÚøGU¾Ó¾ø²ÃFñÄÓÃhºîƒm·uóÏŽ?`/ÚÆ_ï¿j-VÃÁ7?&diÿ°—‡üG¨|:ñ/Àx7XÕ~6_G>¡ý¡ðÂÞ#øž(Ów»²æ•¬ÖªË•Yí}}æì¶{ ×OE]/®ß.½¼¦ý´~ x?Wý¢#øíã߅߳ׄ~~ÐÞýž4ï|Zø­á?xsÇþ#ñ?ìÉðKö”´{+ÿ¿…ôÍ+[:gÅ­_C¶ðœ¦¿{aà-KÅ1^%½íÖ•¡ý ÿ /áÏöïü"ÿðŸø'þoøM¿áZÂ;ÿ V…ý»ÿ þÏü.ø@?²>ßý¡ÿ ·ü*?øºðŠýŸûwþÏüVÿ`ÿ„gþ&uùEðwö øýû(|I‡â·Á3öyø‡qáQøIàï…ž øƒñwàoâøUâÙ?þ ‘ðfëÄðxºïÀŸµ‡Ž|=­øGÇ?ðOKë |0×â”ÚßÃÿ‰šWˆ|Iñûþïj:/‹q<ÿµøðoÂɦü1øÓý¥âoƒßÿg½{öuÕug]ð_…µ¯ÛOàÏÁÏ€ÿu¿üXð‡ôOjø'ㄱ§À¯„òÚxÅú×Åtø9ûOÿÁC~Ýø¶ëÃ?¼šãO¤í¢ûôNëumß{Ù|,5íøúÁû¼ÏÙ? x—Þ4ðç‡ücàïhž,ð‹4M+ľñO†µ[ wÞ%ðæ»a©¡øƒÃúæ—=Ö™¬èšÎ™uk¨éZ®usa¨Ø\Áwi<ÖóG#|óñoöÊýœ¾é_´'ö¯Å/ø¯âìÃðOÇþ-| ð/ü ®üxоøÁ¶Þ9Ôµ9¾Üø£LÖôÏí=Sðÿö牰4+ÛŸøcÏÖlí5»+¹1?fO xá ü߲?­·ìÕû,þÏ?²ÏÁ¯„ÿ¼g¥_ØxãÆÿ<5áÏiŸ4íCVšh>8Ñ<7ð¯Ný›õ$ñ¯€¼§x_ˆ/ø™àûoê>)ð_‹¼ð×âŠßðO?üâÏÙ£\ñ?Âï|âüãOƒ¾7éZ×‹Ýø'ÁÞð®‰ð–ãöãñMô7ÒÿhÿßüA‡àׇâ“ÀÞ‹‹|(J1æ|ÏEf¼ÓW¿®É¥­Ýö‹ {~>Ÿð~ï3ê ÿÁG?dÿü~‡à¥§ÇÏÙäéž0ø]ðKÇŸ|}mû@ü6½°ý¡|GñkâïíðkWø{ð—L‹RKë~ñwÀ­;HÔ›ÁÚïŠ/ï|Gãû/ Ýhš§¥@uÿ¡õÚWörÒ|eñáÖ«ñûàž™ñàÿ‚o¾%üZð.¡ñWÀ¶^2ø]ðçLÒ´}wRñÿÄ_ \ëÑk~ ðNŸ¢x‹ÃúÅ÷мKc¦hVšV»£êßÇi©ÙM?Åe¯Ú7㿃nûïéÿþ|Aý­ÿàž^ý’ü5á |Qñ×ÄøKâ7…õ_Û¶5­wÇZ¯Á†zÝß‚u-ö’øg¨M©iÿ›]Óõ[Ohéá½BÓ@ðþ»ã—~(ÿÁ+þ)xÏJý¥¼¥?‚o­:ý¬l}oJµøûnx7ö™Ñ4ßÃûÛIìÅðþ)j?xK]øéá«¿ºïŒ<áOëÐ|Ð> üs½×>>ZmüN;+]=l®ï¢jí¦•îõZ+¿ÖºkçùyŸ²p|pø-u6«okñáuÍÆ…­øÃZäxÿÂsM£xÅŸ|Kð'ÂÞÕbVgÓµ¿üoð_Œ~ øJ»XoõŸŠ¾ñ/ÃÍ: ŸhZ¦‘kÅjÿµWÀ Íñ*÷Å~xKÀß tO ê¾:ø§â_‹Ÿ´¯‡þ¿ñ?Å_Š_ŸÃ^ ½ŸÇ§^ð†·áÿŠŸ )|UЮ<5â}oàßÁ ¿gŸ|%ñ…¾ ëV5¿xö|‡â¾—ûÞü$Ðì<¨xG@Ñ> \~Ô_~2iW7¬oþ~Ðÿ¿b_ˆ 4Ýþø¶?|½ü£ã÷‡&?ôý;áwŒ>7êš'Áωúæ…ûO|]ý!ø7û\^üUÿ‚—|ný¢þ%ü(ñ&ƒû7ük·ñ‡Âí'Åß·î¥ào‚ÿ¾8ü7ñÿ„<}ðªëÄ:í¡x©47±ø’”iµñ;飲뮭ÚûëªJÎÍè={ZÁûÕí?ö•ýœµo|:øu¥|~ø'©üAøÁà›‰ | §üUð-(ü9Ôô­c]Ó|ðëÃÚôºß¼¨hžñ±c⯠XêzÞ•¡k„òZi—³AíuøÙ¤ÿÁ;>0ÁñÊÓÆ¼a¢|z·ñÅÙ[ãÏÅ?Œ~ ý jO‚vâ¯ìÕðÏörðuíôðO‚Zæû-|MÖüoã?Ù—Iø›á¯ˆž6ø™¡CðËÄ´« OáwÅ_þÏžð¯Å?Ù:™(«r»Ýkëå×ËTž—µš¾·þ¿¯-¿ÏâÏü•O‰öP)xÄ´7ßÙsÀŸàý—,¿f½k^Õ?d?|Tømwá¯ÚCö|ñí1â +NðÂ|o¼ñÀï|ñâŸø)O´/|.ø¿ãÿ<ýƒðOö©ø{yð5ü9ûJè¾ ø·ñoÅ?´¯ü›áÀøGÿ?gO…´Ž|¡êß´Ô¾ Õ|mìƒyñ?ÃZ¬Ÿ¼3ðWá‡ÆO³è#âŸê¡û~ÏúÞ«ñ]ñ?‡|mãMoâ_۾߬xûã_Æÿj¾ûŒ´ˆ¯ÿ PñŸÄmvïöaûÄ xÇZ7ü3„ß ÿ°>ø·ö€ýœ¾j~ÿÃ>Ãâü<ñ×Å?ØßIý ¼[öÝ[ö¢øYámÓŲ/à PñO…~;Y[ø¶]'á÷‚5ß‹ž×ûüTøññgÃ?õŒo‚fðχ?jÚçá×Â_h^/¹¿ñ—‰üð«ö¾ý¡>éº?޾[|'ð?†~ÿ¿ðÏü#àÿ j/¾*ê¿4« ¼[ã+ïxškÛMOnØ[öp›ÃšV‹ñGIÔô­oÄ ?¼9ûH~Ò~ý¡õÛÿXxkJñ$6ý§|9ñoKý¢¾ hšÖà_†Ú.£á¯|Pñ‡.tO„¿´gÒŽ™ðwá…¯„ý¯À¾ü2ñÄ/xNÖô+‰úÚø—Å:x×Çÿàñ×úÞ³®xƒÁŸ õOß|6øi­øßÄ~$×ü_ñ3UøoáO ßüSñƯ¨xãâ<þ)ñuÌšÑRp³Q‹Nû¿W×™ô}ºuºhIõÕ—êŸÞ~yø'ã¯Ç#ð7öjý½õŸŠÚÞ½áÚ‹[ýŽáÔÿd«¿ ü3²øUðÇÀÿ¶×ÄÏ„_ <ÃψZO,~7Ü|Qø8ÿ|â?xãâÄü?øÉ7‡~*ižø+ð:ßâwÛÙóoþ mûE|cý±?g?ƒ´'Ä¿}ƒÉø'ðóÀÞ*øi7‡ü-¤xëÄÿî¼ ð÷Å^?øëñšÂÃD´ÿ…}ÿ ív6ý™¾ø?øZÿösø› |xñUߌ?áyü4ðìáõç‡ÿeo¾ø«?ÆMÂÚÜ.moľ+Ó4‹¿ˆß5_…^ñÇaÕ`ñ·Ä‡Ÿuoß|øiñGÆéâO7>(|>øyៈ-›â?ÅKx“R¸ø«ñ_íü4ý~|ÿ„þ§ƒÿáÿ…eðO¿³¯…~ÁâÍ»à瀾ÁÿƒüUöýnïþü+ï²_ÿÂâÿÂOâŸÿÂañ/þ]oHÿ…­ñ/þ±Ê 4£«i§d¬µ÷tzî½íß]Yßå÷½5·MŸôσ~þ׿´Øðý§ˆ~|.øâ—íû0~ʺ¦§ñ›Wð‡Š,> |iýµµËÛOøsön֓ඉðÛà‡ìÃ{àïk>Ó¿hÿüZñ¯…î¼}€.Bø£ûlüiø;añOþÏ ®5?ÙŸöy±ý«k»O ~Ѿ,Õ,<%ð[^ñÇ›_ Eû8j:¯ìÑáûn|#û6üL×5Ï|MÒÿeÿ èÞ#¼ð/…¬>$øƒL×µÿø?çŸÚ3þ /ñãÂ?³—í#ñÇáO‚~è“ÿÃÈþ~Ìü+ñvçâÄk±_l wKñ—Ä¿‚þ3øá‡ÞðNµiû|Eñ%Óþ(|b¹·×nüáMcÁº¶‰â/x‡Â?yj¿°·ìá¯ØxkNñ‹ñGÄÖþÑ'ð¦©'‰ÿiÚOÄ—ÿü?ˆüAâ˜þ~Ñú¦¹ñnÿSý©¾iÚŸ‹ügk¡ü/ý¤®þ*ü?ð÷‡ ÐõÍSPÓ ƒ\ðï‡/5¿xkDð·‡üžñŽþ/mÙÁI>ÑðÃöÊñÔÿÖôCÂwPøWö6ýŸü#ã/|E³ðïµÿˆ?áÿ„SÇ_~5üoø¯ã+øE4¯ÚcBðßöljþ(|Fñ~·â¿ì]öÁý¡ô}?þËíoìúWެtôÿDðÈ|#Äü@ÿ‚xþÉ¿ô/økÄ>ñ¶—¢xÓþ¼?,¾ü{ý¡>ÂÎÒ¾6|Fø‰ñkâ'†>+Üü(ø§à»¿Šž ¿øƒñw⿈<=à_ˆ“ø›Á¾ÿ…›ñJø¡x_DñˆtÝD½/åi{º«ßGïiÏmU’Öú¶Økäÿ¥ÖÞ½?àywÂø(&·ñö›Õ¾ hß³‡ÅøWÅŽôÏvžý¡®l4Ï~ÏÚ¿ü/ãmw⻫~Ížý–´…Ú¿ŒþxÓÁþ ñÃïÚóâßÄ OÄzï½ Ä_ <'¯xâ6‘ðƒoÄŸðPøGöÔ¾x‡ÂÙ÷zOíC¢üÔðOÄX<#ô?‡ÿeo¾ø«?ÆMÂÚÜ.moľ+Ó4‹¿ˆß5_…^ñÇaÕ`ñ·Ä‡Ÿuoß|øiñGÆéâO7>(|>øyៈ-›â?ÅKx“R¸ø«ñ_íøóöuø9ñ7þWü&þþÛÿ†‡ø'¥~οâ ñN›ÿ ‡ÁÍþÏögƒÿâQ­ØÂ?ö_ø^ÿâ ð¿ö'Šfÿ„£ý#[—ûÿ٠ôïðÊܶµõ澯~‹nôA¯~«îÒÿ~¿yùCû0ÿÁ@hoÚ‹öø!Ãh–¿ ¾%ü.ñ7Ä¿‰¿ ~%|UÑ,l<áÍgölÿ‚7|s°×~ø¯ÁŸ³׋¼[­ü1·ý´~$hzOÃêš5‡ÄÏø“Å^)×þ.ø#Ö¿ þü9öÏø&§í-ñ§ÅŸ¿bO†´O„´OøK¾0~Á¾øñðßⶃñ¯ÅŸ¼Gñ?ß ü'û;x{â?Š>;¯Ž~|1Ôü ñGÄúŸíð×Ä–zfƒâ?ŽVíýçįxÿM¸ðÎñí}KöVø©|@¹ø¬<-­èßo¾(Ù|_Ô|má/ˆß<â=WÅ–¾øKðæïIÖ5?xÇB¸ÕþxŸÂ?þ Xxûà~¤×_¾#ßü4ðˆ|}àxFµÕ—oÀ³¯Áφ_ð¥¿áðö'ü3ÇÁ=Wöuø=ÿŠu/øCþkð©¿´üÿ}nÿþµÂŒøYÿŠ?¶üSü"ÿèúÜ_Û~"þ×nTÚ²…´^©¥.·×V–«eÞÁg}ïýG§Éýçå þÑ·ŠoÿgGIоxŽâëþ »ûn|øm§ûAøÓáe‡Æo…_ <9ÿTð´øñ¥øödñ™à áN™ðáÍ×€"Ó-?h¾)xÀñ¦ð‹‘õËnÛÅ?ðV]oKÖì|-àÿÙ7âÄïx+DñV«û@øcá·‡¿hoŠ·úÿ¿hÚödñ†¾jÿeŸ‹^ø‰­êÿeor|:Ÿöš×?b_xÏÓü.Õ.üAá›{⮟ðGô7Mý•¾é-¾&i¾Öí|G§|Q½øÕ¡é©ñâc|?ð·Å]gÀÿ¾ø§Ç øM'Œ_á_‚µ¿è?~,ßüL—Â~ Ñ¡øŸãj~!Câ_‰6º_‹,8oöý–õùšK߇ÚÝ­½þ·ñ Zñ~‘ üVøÃáo|W‡âŸÅ_|kñÇ„~;ø_Ã>>Ò<9û@|.Õ~$üUø§®YüøÛ¥øÿáW‡¬>'üH𷆼¤xGÇž+еsš“zÁÛËMÜ›_Ú«m×ed+5×·þÛþOï6þ)|~ñ—‚ÿhßÙûöxðWÂ/øX<ñ‡â.½ã[¿i^оø7àŽ¿gOx·X×´ë½XÖüKý«¢|t»O iþ³Ôµ[ÿˆÚ_‚¼'¯Xøgá÷Œxÿþ û x7WðÅ|Jý>ü3±ñ·ÅO†Ú/þÏ¿jï†9ðmŸÆ{+ω÷ Ò|+­|Tý®¿øuàÝOâ7…~-_hþÄø'Çÿ¼1âí V/ìÏüQ×~x—ÇZ?öT7Ñè—¿ÛºßÁÿ‡W¿Ú†›wªéŸðŽý›G¾Óí5mv Oçöý–ô –K/‡ÚÝÕ½†·ð÷Zð†‘¯|VøÃâŸ|(‡ágÅ_ükð?„~x_ÄÞ>Õü9û?ü.Ò¾$ü*øY®^|ø%¥øáWˆl>|7ð·‰|«øGÀ~д…SI^-µmWu&ÝÕí·*Ztw]G­ü¿á¿àŸ!üÿ‚¨^|dðoŒ¾"Ý~Î~6øyðûPø&~5|ñ×¼/ûUxwÁ¾>ÿ„ƒUðn…ð“á7Ä?øŸö9ðÞ‰ÆÏzßÄï‡ú?ÃþÆ×ß·Ÿü'Ú¬^=Óþj¾6»ÒþCñ“ø*î·wàxµ Ÿ€º'Ã?xwâŽ>ü`ñ‡í!ã/Úöoý‘þßøKáÿÁ_‰šx×ö†ø›ûiÿ~ë<9ûD|3Óþéÿ´7ìÉðß|_£üOðǃüg­\X|¹øïö¾•ûþËz=‡‰t»_‡ÚÝÆ™¯èxkEÓµŸŠß|CaðwÖ>#ðÿŒtoþÌ6šÿµ+Ù'Dð׋¼ðïÅ>Ò¿eøþXx?Ä > 랃HÔþ|/ºð–%üßöa²Òµ ]3ãf·¢x‹ÆÚÇü}£ø»öµý­¼m¥|`×uÿü:øu¬X|zÓüañÃ\´øÿà›ß‡ß |àWøiñª|9Áº~«áˆ|+‰â¿ØëŽônýÙZú+ô·ø»þ®šúýë˵Ï.øAÿÖþ/þÓz·Áöpø¢Ÿ áø£ñÃྙñ®ÓÀÿ´5͆™ãÙûWñÿ…üm®üC×uoÙ³Ãß²Öð»WñŸÂx?Á~!ø}û^|[ø©ø]øW¡x‹áG„õïüFÒ>møƒöÒøáÏŒ´Kï‚ —ö}ø7ûPþÏ?²_‰þ'Z|m×_ãÿÄoÚ[Âß³ ßu­àTß ðMׂtŸ~Ö?¼?âÝKPý¢´½vÃÂÚ/|a£øo^Õ´í ÀÞ#úÃÿ²·Àß |UŸã&ámn6·â_éšEßÄo‰š¯Â¯ xãÆ°ê°xÛâ?ÃÏ:·Œo¾|4ø£ãtñ'ÆŸ>|<ðÏÄÍñâ¥Çˆ¼I©\|Uø/‰ü»Ãÿ°Ïà ÚãOí ã]gÆÞ:Öþ(ülðÆ}À—>-é?<#ªü9ø!ð/áO„¥×¾Z|KŸàGÄïxkÅ->,xKâ‹~ÂeáÏà©´›MoáG‚¼Qn¯NïÝvåVNíós+í/徯Oî°×ñ^Z[^¯ü9⟠nï>þÌ:߀?eoøwâí[ðOÄ´Ç€>ü]ý¥.|3ám+à?‚t/Ùæ×Å^ ñ7Äo†Ÿ>2ÝÚxÛ\øƒûEøU~xÃÀz…·‰~[?Ä/‰~*ø1ñF[ÿÙ÷G<+ÿ$ÿ…ƒð·â_íGàƒwìð3à‡ÆŒ>(ñWÄ_øGÿhÛOíØãÀ¶Î™á߆Ÿtø¯áŸŽ7|3øÃð³Ãwú¿Š?i¿†_dñÕ×ìmôËÿøCþ"øƒõ¯û~Ïú¯ÃŸƒß -<;ãoøgà‚tφŸµ?…Ÿþ7üøà߇:V…á߯€-þ0ü*øàß‹š¯‚u]?Á¾ ¸ñG…uï꺌µßø#Å-°Ö¼Màß êúQÿ aû5E®ÿkéÿ ¿°4Kÿº×~xWÆ>>ðìåão¯ÃŸøSðèÿÿeï x§Iýœ¾(ý“áD?Ã[ Câ/Âßjº|#à Øß[蟼 eáÒôµ÷_[oßOµü¶^OWÌ ý_oÒý=zuÝXÁL¾)GðçÅ^!ñoì}ãoø›Bñ·€<=‹<_ þØÿe_x[ÆÚÄ¿êß>0|røÙû|$ø¹ðÃÁ? 4ÿ„šôþ Z~Ë>6ø9ðÖóâ7ÀK¯üWм3ão‰%ø1í ?n-Wâíà‚óxWàŸ…ôOx'ºþŸãgãߌ­ÿá|jºÿÁ ZÆ·ûE}û:é¿¿mï‚~ ´×´- Æ|1ñ_á׌¼öø‡Ç_<#¢/é¾'úŒ°çÀ[_j¾µ½ý¡­®5ÝoÃúÖ¹ãØ?l¿Û:Ì>°ñ-…¼#ªü}ãºüoÔ~xiüiãgÃÿîþ Íð«Fñg‹_ˆß5‚ß ,4?ÁðÏIŸà¯ìó©øÆóà/Á]nÇáÜwþ‡Ä¿ ~ø?ÄcÂ~%ñÆ€Ú«iž?ñµ·ˆékhËgo'eoµÞýÃ[.ú_õ>†¢¸Ÿ†Ÿ¼ðáÏ€>ü:Ñÿáø}ð»Á>øuà_ÿhjº·öƒ|¡XxkÃ?ö®»}©ëzŸöf‰¦XÙhk–¡ªÞùiÔ/®îåšy;jÏÓúüÆQEQEQEQEQEQEþxÿäª|Kÿ²ã/ýHõ*ÿCŠÿ<‹?òU>%ÿÙ@ñ—þ¤z•zù{ÿpÿöó:>¡þŒ/ÿµ§ýŠþÿÔ/ÃõË×Qâÿù ZدàýBü?\½pÏã—ø¥ù²ã²ô_QE# (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ ÿ<‹?òU>%ÿÙ@ñ—þ¤z•¡Åž?ÅŸù*Ÿÿì xËÿR=J½ ü½ÿ¸ûyNŸ?ÐÿFÿÈZÓþÅÿêáúåë¨ñü…­?ìWð?þ¡~®^¸gñËüRüÙqÙz/È(¢Š‘…Q@Q@Q@Q@Q@Q@ù³û*ü(øÕñ›öTý•¾5xëþ ûoÅão¿³ìíñ¯Æ6ÞÐ?àœZ7…l¼UñàÏ‚~$x‡OðΕ¬Á9üO«éþÓõÞYhÖº§ˆµÍF:ÞÙoµ[û‘-Ìžïÿ Ãñþ’ûÿàüCÿ¥—Zºj-ÅÕ¦œ[MZ®;5¥+oØW¿Gø™õ}ò‡ü3ÄúH_íÿÿ€ðMþ–]ðÌ??é!·ÿþÿÁ4?úYt¹#ÿ?©ýÕùP]ö‡ùŸWÑ_(Ã0ü@ÿ¤…þßÿøÿÐÿéeÑÿ Ãñþ’ûÿàüCÿ¥—G$çõ?º¯ÿ* ¾Ïðÿ3êú+åøfˆô¿Ûÿÿÿàšý,º?á˜~ ÒBÿoÿüÿ‚hô²èäüþ§÷UÿåAwÙþæ}_E|¡ÿ Ãñþ’ûÿàüCÿ¥—_-ÿÁ(¾>|`øõàÚâ_‹ÿ¼SñFO…¶ÇÄ_„uïé ôÏéß ôŸ„½–êöïÅi¸¹Õ<9¥j—rÊ,üMgj»®¯&(ZÃG±|¹9ÛúOýþÿÀ¿ó_Râ“iÎ7NÏâÝÛ ú=}<¼ÿ«?+òôWQý¿¤ÿÐáü ñ§ÿ5ôoé?ô#ø_ÿüiÿÍ}«ùã÷Oÿ‘ÉþçýYù_—¢ºíý'þ„ ÿà_?ù¯£ûIÿ¡ÂÿøãOþkèå_Ϻüˆ|ŸáþÕŸ•ùz+¨þßÒèGð¿þøÓÿšú?·ôŸúü/ÿ~4ÿ澎Uüñû§ÿȇÉþçýYù_—¢ºíý'þ„ ÿà_?ù¯¯’|ñoÄÞ4ý«io†×Vº6‘àŸ…~ýœ®|)¡èÖ·`&¯ãèþ/j¾+×5 KV¿Õµ‹ËýQ4Ÿi‚ÛûB-ÇOðõƒiÚM¦¥y¯j:Ã亓R‹åJM{׳”c¥â–ò]vöÑëéÚýÿ«GQE (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ ÿ<‹?òU>%ÿÙ@ñ—þ¤z•¡Åž?ÅŸù*Ÿÿì xËÿR=J½ ü½ÿ¸ûyNŸ?ÐÿFÿÈZÓþÅÿêáúåë¨ñü…­?ìWð?þ¡~®^¸gñËüRüÙqÙz/È(¢Š‘…Q@Q@Q@Q@Q@Q@(~ÀŸòÏø'¿ý˜ì=ÿ¬­ð’¾¯¯É?ØÃöúý|ûþÂÞ ñ?íðâÃľý…ÿbïø‹L‡TŸTm^Òeÿ…:Ɖ}s¤Z_ÙE«èºŒ7:V·¦›“y£kwÚF§ ¦§cwkÑßðò?ØgþŽKáÿý÷­ò¢·«J««Qªuu&ÓP“M9;4íªd¦¬µ[.¨ûz¾^ý²~"øËá_ìÿâ/x'Xÿ„Rî/|ð׋>!géZ‡ü*/„ž<øáðçÀ¾9nñŽ«àíþ_Áø÷ãü%Ÿ´]ᇂÿá ÿ„»â‡6|dþÕÿ†lø¹¯|.ñ×í9ñ?Ç^2Óþ'§ü‹öøOðá´?´'Æ¿øóÆß¼ûnø'Æ´ÂÝwÃ|U­|$ñ6•ð?Äú·Ã¿ø{ûö–›â7ê÷ìÁsa®|*´ñÔµ¿ZÇÄMoYñGŒ¼gªé¾#ðm…—Ž,æÁÞ)ð†¾ xšöïSý´O…šŸ…%øm?À}]#øàøWÄüvÔüiûE_|^ø‰ã< ûGÁ#~x6o‡_ õOÙOá×Ãëh_çð/~øÂ> Ÿâ7…õ_ k¾ñüÞðÿ‚ôý_xw[ðOƒ5 ÅObÚøGÆŸow iSZz†•ûÁ=´+ÿêšÇ?„š6§ãMnøÇQÒ´Û½:ÿÅž#µðç‡ükâÝÚh0ÜkºÝ·„|'áo Aªê’]_ÃáÏ xCŽuÓ4m:ÖÚ¥ Ž){*·M·' ^W·Å£ÚÝ­ÝšW]ÖÛ]Yzmøü¬}óE|Cÿ#ý†èä¾ÿßz×ÿ*(ÿ‡‘þÃ?ôr_ÿï½kÿ•Ưüú©ÿ€Kü‡uÝ}èûz¿¿àˆòOÿo_ûH¿ÄßýgoÙv¾×ÿ‡‘þÃ?ôr_ÿï½kÿ•ñüÖîÒÿá§í×aso{c{ÿøwgyi4w6·v—?³—ìµ5½ÍµÄ,ðÏo<.’Ã4NñË«£2°'E Â^hÊ7•+sE«ÙÎöºWµÕýBéµfžóGï/‹ÿä-iÿb¿ÿõ ðýrõ™ñ#â—Ã/x¡toüFð&ƒ¬Yø_À_lÒµŸøKÔ­~Ñà? ]Ûý¦ÆûP‚ê>Öx.aóbO6Þh¦MÑÈŒx?ø]ß?è®ü0ÿÂûŸü¶¬å9JÑ—Äú>ïÈVZô_§ù¯¼òßÛ'â/Œ¾þÏþ"ñ—‚uøE.âñ·ÁO x³âö~•¨¢øIãÏŽ|ñËã–ïØê¾ÑÿáEüñ/~0ÂYñ E×þx/þŸøK¾'øsÄ_´Oè—þ'ñOA¶ýŒþÜYþÎZ·ÆÏüwø÷ão ü:øAáOŒ?~<~Ú_ð“øËÃ:þ(kú?‡|7ûR~Ú? ¼àÿ²üðgÅïjúƒ~Ðÿô­[þ]1//¼â½/Àé> ø‹ÿN«6»àÏøN¼1§éú'‹¿áÖî'Ö<1ÿ Ž¡ýªÏ6¡¥}’îW™œT’³Œ÷»J-©me%¥ÔZºZÞí^;…×uý[óÓðÜø/Bÿ‚Š~×Þ(ð/í ñkþß‚tOاö^ñÆÿŽ¿‡ñ·íuûMèß~2þÒ~Ò¾xŸÂ0þÐÞ#ý¾ |Ò¾j÷?m~*Ù~ÞÚwì ¡|Iñ/Åß~Ñß~|HÑ5?ÙkŸ`ø3'ƒ¿g¨n¡×|?ð¿Tý¤|'o jÿ5Ÿ¨ü1áØ/Á> ×~x3ÿ²'„~x£Á3|4ñ/|1¤üÐ<â/‡7¯ŽµÙü®øcJ·´Ñ5oÏ­üQø™¬Má]BÆãB—Uø‹ã­AìïÅÞ ›P5 þÁz·Œ¾"üEÕ|;û"j~0x&ûá§Å¯jOÁ«ß|Qøs©éZ>…©xâ/‰îmåÖümàCDðï‡ô{ï ø–ûSЮô­ GÓç°’ÓL²† v¾”¤•î—.ñÒñ}®îù®ÚÙhÁzô××MWü5µ>&ýœ~.ürø¯ûpüµý¢ü ¢xâ§ÃÙçþ ð÷Y°Ò¯>Ø_êö^4ÿ‚HüLÑu¿ü2ø_ûF~ÖZgÁmm´ÏˆÖúD×¾?xóÄzÿ‡4üauð¶ƒñO@ðg‡¿dëåÿ¯ì]ðªÃÂZ_Âõý—þéžÑŸyéõñÁŸù>oÛ{þÉÿìƒÿ¦_Uôü.ïƒôW~á}áOþ[WËŸ5½Ä¶Ÿí«¬ø{WÒõíóáÿìö=[FÔ-5M6ïìúoÆûK³_XÍ=¬þEÔÛMåJþUÄ2ÂûdÔ8ÆJo¿v·MËÚ]Áµxë×ôæ¾óï*(¢²QEQEQEQEQEQEWùãüYÿ’©ñ/þÊŒ¿õ#Ô«ý+üñþ,ÿÉTø—ÿeÆ_ú‘êUè`?åïýÃÿÛÌêtùþ‡ú0x¿þBÖŸö+øÿP¿×/_–¾+ÿ‚Û~Â×:Ü¢Ã^ø•¨ZXØhš4Z¿Ã­F]DèZ&¢Ë¨YEyg~–ÓXIw`5 + Cìs@o¬,nÌÖóŸðúߨ‡þ‚ÿðßÍÿËJæ• ÎRjœ¬äÚÓ£e)+-VËôþ¾þÌým¢¿$¿áõ¿±ýþ'ÿá¿›ÿ–”Ãëbú üOÿÃ7ÿ-)}^·üû—áþcæuýÃþ}™úÛE~IÃëbú üOÿÃ7ÿ-(ÿ‡ÖþÄ?ôøŸÿ†þoþZQõzßóî_‡ù‡4{¯ëþóìÏÖÚ+òKþ[ûÿÐOâþù¿ùiGü>·ö!ÿ ŸÄÿü7óòÒ«ÖÿŸrü?Ì9£Ý_ðÿŸf~¶Ñ_’_ðúߨ‡þ‚ÿðßÍÿËJ?áõ¿±ýþ'ÿá¿›ÿ–”}^·üû—áþaÍëúÿ‡üû3õ¶Šü’ÿ‡ÖþÄ?ôøŸÿ†þoþZQÿ­ýˆè'ñ?ÿ üßü´£êõ¿çÜ¿óh÷_×ü?çÙŸ­´Wä—ü>·ö!ÿ ŸÄÿü7óòÒø}oìCÿA?‰ÿøoæÿå¥W­ÿ>åø˜sGºþ¿áÿ>Ìým¢¿$¿áõ¿±ýþ'ÿá¿›ÿ–”Ãëbú üOÿÃ7ÿ-(ú½où÷/ÃüÚ=×õÿùögÒßðí_ø'7ýìQÿˆ­ð/ÿ˜J?áÚ¿ðNoú0/Ø£ÿ[à_ÿ0•óOü>·ö!ÿ ŸÄÿü7óòÒø}oìCÿA?‰ÿøoæÿå¥W²Äÿ-O½ÿ˜¯ëú·ü»ËO¥¿áÚ¿ðNoú0/Ø£ÿ[à_ÿ0”õàœßô`_±Gþ"·À¿þa+æŸø}oìCÿA?‰ÿøoæÿå¥ðúߨ‡þ‚ÿðßÍÿËJ=–'ùj}ïüÂñî¿«Àû¼´ú[þ«ÿæÿ£ýŠ?ñ¾ÿó Gü;Wþ ÍÿFûâ+| ÿæ¾iÿ‡ÖþÄ?ôøŸÿ†þoþZQÿ­ýˆè'ñ?ÿ üßü´£Ùb–§ÞÿÌ/ëú·ü»ËO¥¿áÚ¿ðNoú0/Ø£ÿ[à_ÿ0”õàœßô`_±Gþ"·À¿þa+æŸø}oìCÿA?‰ÿøoæÿå¥ðúߨ‡þ‚ÿðßÍÿËJ=–'ùj}ïüÂñî¿«Àû¼´ú[þ«ÿæÿ£ýŠ?ñ¾ÿó _C|%øð[à‡/|ð'áÂÔµ»Ÿê>øKà ü8ðåÿˆï,4Ý.ïĺƒ´LºÖî´ÍHÓ®uYíd¿žÃJÓm%­ìmc‹óþ[ûÿÐOâþù¿ùiGü>·ö!ÿ ŸÄÿü7óòÒ“£ˆz8M®Íßõh÷_Õ¿à}ÞZ}á¬þÊ?²ßˆµ}WÄ ý›>kºþ»©_k:湬üøwªjúίª]K{©jº®¥{áÉïuKQ½ž{»ëë¹æº»ºš[‹‰d–Gs›ÿ sû"Ñ«þÎøcþó/_ÿÃëbú üOÿÃ7ÿ-(ÿ‡ÖþÄ?ôøŸÿ†þoþZSöXŸå©÷¿óh÷_Õ¿à}ÞZ}½ÿ sû"Ñ«þÎøcþó/Gü1Ïì‰ÿF¯û8áøeÿ̽|Cÿ­ýˆè'ñ?ÿ üßü´£þ[ûÿÐOâþù¿ùiG²Äÿ-O½ÿ˜^=×õoøw–ŸoÃþÈŸôjÿ³‡þÿ†_üËÑÿ sû"Ñ«þÎøcþó/_ÿÃëbú üOÿÃ7ÿ-(ÿ‡ÖþÄ?ôøŸÿ†þoþZQì±?ËSïæuý[þÝå§ÛßðÇ?²'ý¿ìáÿ†?á—ÿ2ôÃþÈŸôjÿ³‡þÿ†_üË×Ä?ðúߨ‡þ‚ÿðßÍÿËJ?áõ¿±ýþ'ÿá¿›ÿ–”{,OòÔûßù…ãÝVÿ÷yiö÷ü1Ïì‰ÿF¯û8áøeÿ̽zGÃ¾ÿkÿªøWðßáŸü$`þÞÿ…}à x3ûoû+í¿ÙÚÿðŽizoö—öoö–£ö¶yßcû}ïÙü¿µOæ~lÿÃëbú üOÿÃ7ÿ-(ÿ‡ÖþÄ?ôøŸÿ†þoþZRtq YÆ£]›ºüÚ=×õoøw–Ÿ­´Wä—ü>·ö!ÿ ŸÄÿü7óòÒø}oìCÿA?‰ÿøoæÿå¥/«ÖÿŸrü?Ì|Ñøϳ?[h¯É/ø}oìCÿA?‰ÿøoæÿå¥ðúߨ‡þ‚ÿðßÍÿËJ>¯[þ}Ëðÿ0æuýÃþ}™úÛE~IÃëbú üOÿÃ7ÿ-(ÿ‡ÖþÄ?ôøŸÿ†þoþZQõzßóî_‡ù‡4{¯ëþóìÏÖÚ+òKþ[ûÿÐOâþù¿ùiGü>·ö!ÿ ŸÄÿü7óòÒ«ÖÿŸrü?Ì9£Ý_ðÿŸf~¶Ñ_’_ðúߨ‡þ‚ÿðßÍÿËJ?áõ¿±ýþ'ÿá¿›ÿ–”}^·üû—áþaÍëúÿ‡üû3õ¶Šü’ÿ‡ÖþÄ?ôøŸÿ†þoþZQÿ­ýˆè'ñ?ÿ üßü´£êõ¿çÜ¿óh÷_×ü?çÙŸ­´Wä—ü>·ö!ÿ ŸÄÿü7óòÒø}oìCÿA?‰ÿøoæÿå¥W­ÿ>åø˜sGºþ¿áÿ>Ìým¯óÇø³ÿ%Sâ_ý”êG©Wõ—ÿ­ýˆè'ñ?ÿ üßü´¯ä“â«a®xÿÇ:Þ•?Ú´ÍcÆ&ÕtëŸ*h>Óa¨kW·vsù71Ãqo4rySÅÑîÙ,há”vàéΟ´ç‹ù-~¶ç¿Ýtg6¬ï¿èÿÙPythonCard-0.8.2/tools/standaloneBuilder/doc/pic25.jpg0000755000076500007650000005770710231140007022511 0ustar alexalex00000000000000ÿØÿàJFIFÿÛCÿÛCÿÀ‘"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?û“þ ýÿý¥ÿàŸ´ßÿÿþþÎ> ðˆ?g…Ÿïõ‰ß 5øŽ?xšÿÆz.©ZžâÏ E5„‘øZÆþ8ïm.o–îãT–mA¬ÞÓ¿.“þ\ý¼Xßc8ä“ñ9ÁÀ8ø˜¤‚I§¦åV,©ú¹û{~Ò'öGÿ‚Žüøû?ÃühÑ|%ÿWø øÇá?Ä( þø‹ðïâoüà7Â߉^ Ö¬µ+Hˆ|ã?iúuÖ­¤øƒA²Ôå´½ñ… øˆݸÙøˆÁº9_V –X>ƒø5ÿñÿ‚{|Tñ?‹nü{ðCã÷ìMð½ÿà¨ÿ³wÂ_‚£öžÑ~)j?¾.XüZø;£xïÆðOŸüð/Ž-õ/z,Úö•âÿ‡ÿ´ÿ5 {Ä2ü7øƒá MOÆ×º÷‡µÛ¹|ßþ áé-¿à™²—…¼%û(èºvŸðãïüoáÏÅ_ì¯|LøÇ{ÿôñü6Ÿ‡ï|9ðWÄ_ü ãh~Ï«x›CÖü9àØ5ÿŽžñe÷´ðÿŒ>P×âñ,ÿMO,ð¿˜eùni{\n? „¯SìpÔ°ÆåxìÊ…ZUc˜U¡Žœg„§ƒÅQÂ×U¯ˆT*ÔXç†Àb¼¹â8š–ˆ©Í•©F“IÔö8¼>q”^J ª’«Ju£j´©¹ÓN‚©^Ž_ðq7í´í‡øUû!*áÉ#à¶¾XmRÀÿ ç¡àíaÚ1æ4[ÑÁÂ_¶”ƒ-ð¯öISÐøSçËß9o‚AÆU «„u•aýý…|w øWö0ÿ‚DèçĽkÏñ‡Ãø*–—áoØÿ[¹³Ðþ~ÞÞ8Ô|{âø?öuø·ã?øºÇáÿ…5_^ñ½™øbÿ>xïÁºÞ¯}­x}n|;â‹ÿ é>0ùöpýˆ?e];ö@øã‹²oísûCüYñï‹¿k/~ÒzOìåð§â7ÄÿŒ¿³>ë–Þð‚.,<;ñÃáG‚?gxrÞ÷ÃÿàðÏÇŸ5¯\jšÝµöá_ Úhz|\OὸØcx J8\Ï•ážU11•0Ù‡à§UÓÅ<º¨¸pìª:ð«ˆÂ*øÚXŠúÖ:{n"œpò£žÔ”ªáh⪪©S…(Õ¡–ÕPN”qsæÌ#g(S«ÉBUýœiÔ¢çˆ?à¸_ðP ÿÂ{û=þÏ> >4ð†ñÂÅ_³¿Œ|9ÿ W|Fn‡‡|ká¯í¯Y{Â:ø³»:/‰4ƹѵAgtÖ×>EÚÙåÛÿÁ|?lYXøeû(¢“ƒ'ü)Í[j|Žß0ÿ„Øç;w ²¨ÛÊ ïÝ>&ýœþ|jøyðSÆ¿üâ¿?>ÿÁÿà™÷ŸþxÃ^1øŸâŸéþ:ø“ñÃüs¥üø_ñŸöwø›ñx Î i÷·šOÆ xSÁZwnüEâ½3ÅÑø[L‡Ä?g_Ø;ömñÿÇ¿‹ž!·ý›~+Éð^ëö¯ýŸþ èÿ³'Å¿†?µßÚËözð¿ÄßÉã¿ø÷â¾ðÏö™ø.~~Ï·o¨ÜhÞøÓñ&ÚP—EÐtÍFÿC¸ÔôÜøÏž… ¾­Ž«àÚTªåÑrÅ,>ÎŒå:˜8Ч…L|'RS†:ŒœçNJ–&©B›©>(ö´aC9”£Šv¢ªUå©ÕsT°ü°Q• .XÊS’•75'ÉäiÿÜý¯›¾~Êàñ¿õ"Î:Ÿ©#¨ÉU9€w¬[–ßð\Úâd 'ÃoÙqX0µ §'jÞ. Ì;ðÃiB)óE¿¤x£öý™ü%û,~ֺτ|#ªX|Jý¾ ~ÖúLÿjï~Ð:G|qàφ†«ðãŸÂÏü,ý_ÇÖÖvgLÒ<ã|Jñ_ÄŸÚ)õŸ Éá |4Ól¤‚·íáû)þÉ>üLÒþ þÏ?´f§„t¯Ùÿ[øCû[xoÀ>3ÕþøÇEñ7‡¼%'‹õ¯‰õ_>0øWñKøˆž1†óÃÚ‡Â?‚?l¼=ñ"ÇIðŽŸ>±áǺiºp¸ ñ˜¼6 ‡ÉÖÄãê`!)à:j¥¹}9U”玂ö†e‡¯NPU':JªTýµ)Q\õkñ]<ñÎR…*ÄI*ÜÓp© òŒaAþò2ÃNœ£-!?fÜ”$¦¹‹Oø-Ïía;aþþÌJ2£„7Àò¤àgÅmž„ƒÔ;•WÍ’ßq?à´ßµK‡¿³8ëÈøGt@äã8ñI9?w•?Þ*¾O¿ÿÁ?~2ü6³ý†ÿá ¼[â#¥|_ÿ‚VŸÚ> xb×F×î<âEý°|+ë7ý‹´ÿ‹sþÐ?ü ãx[ÀŸe½×õoYüEø«gñŽßà÷…üðûRðæ¥àˆŸ ßöu¹ñ§„<) ë÷ßWÆv÷Ù`ò¾£˜â°Î§AáóU”S­F5*Ó«Š”±ˆÊN¼ð”áGû!åY“p©Z£y£ÃS¥5…úÆ!¼WÊ,E ”ÕL×eNn0”(¨Ñ¥¢§ ÍÏë«…´¡N)áUYN>ÙS£üKö¡‘rÿ¿fä#á4ü|…ÞñgžGÝùGÏå°‘aÛ³ÿ‚À~ÓWðìæŸ+>Ê9 Ãx€ðÜŽH¡Áfó£¶ö¿~Ìÿ±V‘ÿñÿìÉ¥þΟ¬|)ðßÁ~"ñº§ƒ%ø×û@è3ø—Æ? ~_ü>ºñ·Ã‡1é¿4„ž×5_ÝÞ¯„¾ ê>+ñGÄ_hZ~«ã_ ü:†ÓAðǹx#ö>ø$vŸþ#ë>µð¯üîóáv¡§|'ø·ñ_Iø9«Ã£þÈ“ø«ÃþƒÃ~%xæ×Føâ¿Úi^ñìÃZ×>'hÞ)Õ|Ið§ÁŸ­-,|? ‡j~ÑÃЯ. «¬exlêœ*a æòüLZn£˜W¥Wì•:²ÂƯ„,l°œkO•biÊ0”dªa©ÔSšÛ—•ºSäRŠLøêø+‡í)#…o~ÎàÙ+ð¤ü oùŽuü``¢­¾HÔHðnÅÿ\ý£U›Àÿ³ê’ ° ×å%I#çÖPœ~`‡æ óù~Éá?ÙOà,~Ó~!|FýŸ´ßüY´ý‰?kÏþ1ý5|hðÞ“áo|ø¥á½àïuO øƒâ2|fÑ,jÑ¥=j™kÄ*Ô¡Z†;&ª<5IQÄBJ)8Ô…IóÆ/¸ž*¥õyÏ;—³«<,d©Ê£«âý‹…IB¦’¼=´#:rœjÂjQpŠ‹”t-¿à©´,ÊO|‹—®‹#m\PpY\ƒò:m`®eH6-à§?çp­à¿Þ íø_ 6þyÔ_$`¤rÀ"ÌöÿR|!×ÿeÛ|â_xOð7‹>+þÑŸ´OÚ{áôZέáo‡Þ ñýŸÀ¿Ú²‡>8ðn­c{¤ê6š—Å/ßyš5¿ˆ¿¶îü]¥A¤ê¶¶±©Üø»â/ð×öEø_á¿^ñÅo÷ðüN²ý—ÿlï‹)ðïŽï¾(øRâûƾ!ü?·øe>¿áÛø[QÒ¬­ü+¯ÜÂl4¦ðúkZn«©p—WÑiº¥—ŸZ|¿{×Pèððp˜û­söíý¤¼)«Þø{Åÿ ~øOÄ:wÙÿ´4ü:&³cö»+}BÐÞiz£Yß[ »+«{Ë_>ÌÖ“ÛÏ…Yp&­û;üÔôÍ~ÂÇ὇†®µŸø'‡í•¦ëZ/‰¼}>¥áˆvÖúD3ø?ÃÑx‹ÅºæsðßQ“L½»¼±ñf•âOÇqâ ]tߨZÛxzÛÃÿLþÔ?>xëâ¿ÇO|]ðÊü,²Óþ)~ÉþðwÆ/íxTüHÑüsi¡xo⩾ñÆ£«|9ÖO<'o{©‹ŸxwL¹ðßü"k©x¢êöÎÓ_†ï ”<=XÌÂP*ÔkJ¯5(K¿\Ép˜_gJ–:q¯JRÌë{uMν5‡u#IÐRªR|Tðµ*ÿnÉÔ§R”cj“TeMañØŠîu'†ƒ§4°Tý—?%9ûUR\i¯mà ?æÀ üärcøe§ás+"±-1È8ÚÀ}ÆRÄ.ÓfÛÃã¬xcàèÄ|5ÒÆÜ,‡?4ÁN †;hbòDå‡é 7ömøñ÷Ángß‹žÒ×âÇÅ/]kZ¯†>!x/áOŒ<¦xÇ:¯‡­-|_®|Vñ¶µâ_Yë>°Öô/øbóÀúWŠ|;q¨ÜßøBì-`±ü¿ñ¡áSÄ2^x;Ã7~ðè²Ñí¬´MGÄâB ôíÎÇSÔ¯µöÒt(ï/uÍVÖû_¹š^§éòêRYi¶ÚvŸclm=\§"à,êµJXN%  têb)ÒŒ!OˆÅaðôÚ¥˜W¨ëTxE[F›§ QJ­XÕš¦üì~cÄùlTëçr—5zøhS¥:’›©‡£‡­V~þ”8,M+ÍNSo’”¡Q}í¹ñiÔ3xgá"erAøo¤äªplHù•X`UmÊ›–¿¶OÅ9Éßá¿…HrÙAðçGÝYJå¡äeHÂáâ|g÷Éiðýºâ4ùBáù†ù`/•Çbl®Èöùqušrãa]¦C°¯Î™™Fdo!3Ÿ/i/Ïëål°öÔÓþ1üëìÕì¿éâí®®×vñÿÖž!äoû[u+^ðÙ/ú÷ýÕº[oº_fZþ×?g`­áï…ØÊ†eøw¡€¬‡Û¶æÈ>è’Ø‚IaÛOÚŸâ3»Aøf§ð÷@ „Ú) ò*§¸)Þ±ü§®dCå†ÚÉótXøs…WÌçnTñ²5‘ó—çÛup®Ð£b¦09 ÂŒ/î×åãå]¸Qµ6í‡'À|xÛ Àíüµ;Çuí_ÏEçmÊÿZx†ñÿ…\V©_Þ‡Gîéçðù¥ºúÎÚKDz©/¢|:1/Ãï`O]Öär§!Nå;Ö'ób·Ø´ý ¼o>wèßÜÏ—à /s2û´¶Vàa…Ám¨'{™lÆü¸ÃŸº8\m)zmÛ«°®Í°y~E§O§.HùAÚ"û‹/÷Œ~vò>~™8Ú»äò<ë.õ„T$ÿ°p:J*î56|½]EmßXõµöGúÓÄ:ÿ®+ÿ‚ëî.ÚjíÓO‡èè¾8x½Û ¤øWk’G€|.XmFlý•ÏN„¨ãñ ía¡|Gñˆ5C³Óü 湪iÚM«Ýxà mΧwœpé ¼éK2™™mÞTEr°<¢O›-†¹ݷ.¸ŽTy}F2§)°ªðmß±ü2ø…ððm øLcÇüO,O*-¹Ç#dx#nÅÛåCŎྡ…¯ZžES§†­V7F¹©ÒsÓšæZ«»õhºYA>YÔ„egìôvz=ÓM4ößíÿÐÛðOÿ åÿÿ; òoŒ×à—‡|?â/kß ua⟈ŸþxHðßÃ1sªê>'ø•âÝ/ÂZ8VÖ< ¢iº~šú”ºæ·w«Z˜´]+P]2W[}/EÔ¿¿à¦_ þ<|Løñð!ÿàŸþñ·Ã/ø(&‘àŸ4¶Íæ›sàÿÙ«áŸìÕ5ÍÜ~%øCûFø¯Ä þ'ø'ö‰ÿ„÷ÆÏayð‡örÒ<'âÿ|3ñô+ûCµçÃ/ i¬ß<Óáß„|ào؃ödðÖ…ðãgìùñOÿ‚ƒ| _Ú7ÿ´Rj¾"øÇãŸÚU¾,hçâ÷Åï|r¼Ò´ýö¦ÿ…•­ˆ|AáÿÚ7À·ÞñÏ…¥Ñ4¯ Yø&Óà ðÇÀßÎÙnq V;B®Mû[ÙZÛÁ–¦ÚK¤Üê2Yizm¤pØé¶o¨_ßj[ÙÁ sj××ó,—··SÌV7ü;þOOXÿ²cðÃÿQÕ¢¸ñ”áKЧN*éâkÂ[F1«(Æ+É$‘é`ç*˜<%I·)Ï Bs“ÞR•(ÊMù¶ÛgéÏüKþ 3ûEþÝßµGÃߌ_üeðOÃÞð×ìÛð‹á½í—ÄxçG×›\ѧñWŠ.¯,­<3ðׯ:|ºd–1Òá·žmVÚìÝÛ굌 ôŸ•‘Áº¶Ê*øYÿ²²áq…ñ¿Å– ò *¿ñcSå8\Mª£ ŸÛW‹ÿä-iÿb¿ÿõ ðýrõöY?&2þ,Ú¹€œ‚%‡úÓ¢¡øõâ µñ9V–·ü%Ñ[;ôŸü7K ýFÈçÞ+Oú‰}?íÓùG²ÿ‚þÖÖáCüBýœ¸R>OüI;rÊr ø>„ä ¿yNrX®Í¿ü÷ö¯…ÕÏÄÙÜ•`Aÿ„³â;mùp~Sðˆn;°F 21G‡úŸ¢“ñãÄÛúÎWw{ÿÂe+kåÏ`ÿQr wŠÕ[ýæ[à?Ö‘ü¾ÇÿQý©Ð(><ýŸW|©â¿ˆ¥WxñiÔÆÊ£å\-ËOø#'í?nª­ã€CilñOÄ* ^Œ~ÆÌ[rHå`Qå 隊øŽ¼ÿA9g—ü&Ó[ZÛO[Yo1¨™­ìñVZÿ¼Ëñ÷uùŸÍ§üÓöš²Þ8ø~ïOxô‘¹wÂÐ1‘¸vj£¤·ÝOø$?í&§?ðšü êx$ñÙ‘“ƒðËÆOm`¬¥H‹ÉþŒh©~9qówúÎYÿ†Ú^]çäƒýDÈ/gŠ¿ý„»l–ܾ_Õ•¿ž»ø$×í …>2ø(>î6øÇn‚>DNÖá>îT'–kÝŸü·ö„·?Œ> œ+Œ¯ˆ|hÄn1ž3ðá\A–Q v¿¿4T?øñ¦ž#-³ÕÿÂu?.ÓÒö[ø ‡šåöx»]?÷™_Emùoýy#ð~ø%ïÇØäFo|œü¾ ñžG?xŽ\‘œü¬•$„Oì?ðMŽÑ¢)ñWÂ1µU~]wÅø\(.ßG ƒmTÂlýâ¥øÛÇN×ÄeºZÏû:•ôÿ·µÛ×ð°ø ‡ÛOÙâ¯eþÓ/ÇÝþ´¶ÈüX´ÿ‚r|m·P§Ä¿  àwÅŽÀ7–1“à(É-·.Iá£MSËŽßbÛþ éñžV|.`[kÅ9]§’»¼ ‚O\|£##kˆd·ý¢£þ#WÐF]gºþφ»Ëm·ÐK€xy_÷x¿{ö©}ÿü?[Ÿ‘‰ûüa\gÄ 1ºÇ‰þ\ßñFzÿ³Ðc!zßöø± àëÿ‡Nš¿ˆÛ»E cÁ± R`UAEê­Æn7v½|ºËeýŸMY鮓¿EéÓ¥õ‡¬—&/MŸÖ¥}-ýÏ/—N–üÅ´ý‹>(Á´¾¿à!·$õ]Þ¬IÂ+¸H£c‚xòÑ”ü¶âÓfØûâ\NŒÚß0¸åu=+Ã|Ëÿº±*X‡ð>I"q±~ÑRüdãVÛuòíêžÚ_íõ¶¯1ÿ¨<={ûx Jø£ñBðoÅÚÛ࿈³xáæ±ð÷âͧŒÿñü…­?ìWð?þ¡~¯ø¿ð—ß¼'¤ø;Å7ºÝ†™£|QøñjÖÜØZßÉâ?€_|ñÛÁÖS˨麭»hš—‹¾hzw‰m£µŠþó×Z­¦—©hÚœöš½‚ÚUz¥6ÚÞë›]úKá^‹ò?!Çí}ñWà—>xŸÆ¿hoþÆ|Q¹»ñïÆ¯Ú·ö`‡àwÆRÃÁ°÷ügã×Ç߇‘|.±ý™g_^ü.øaoðö]ø£àïx?à2øÅ,ñ/ÄŸé¿>"ÙiÚßÃ}àoø+OìÍñàçÇ_‹Ú {¿áž?áXÝüDðoü/ÿØoRû&…ñ‡Å7~ ø¯Âïð÷ík­þÈú'ö߈4OÙÿÂ%ã_Ú7Ÿ­?áÝwਿá8øP> ýyûE~Ì ¿jmÁÞøÃi­êþðž·ñUºðÆ•¬Í¡Xx¾Ãâìóñ»ödñ†¼K¨iÑÅâ84Kÿ†ß|o$øO\ð·ˆì…õ¯Þj >ß|,«Ói6¬ôÛE£þêWºøžhâš 5×ú²^««ë~¬Äøcÿø-ñ–o­ð¿Ã|u£ümÑü[¸ÿ„»ìŸn5¿|TÒ¼·à_ØÀþ›á$ò|lý¡¼\ÿ ~(üDøÕ¨¯‰|QðþÚ‰_~"|UøÅñ’ïÇ ·ðwà [ü3Öì<]ñï⮑ªËû3Åð‹ß ¼S?ÀŸÚ*Œß-í~Eê??e½+öyþÌÒ¼?ñãgŒ>x'Á6 > |%ñ®¿àؾü øa¦ÿc[i^ ð–›à?ø[ø‡ý¢xWÁþÐ|{ûExƒãwÅ¿è^»ƒCø…§Ýü@ø³{ñ?giZ÷û:¾ïËW·eËýàWÿ?Ão-÷ëäq7·OÃ#þw‹ü)ÿ…ëiâÚ›þ Äÿ&×foøN`øé ÿÂ=à?x³ö‚ðÇü Z·ÂŸŠþÿ„·â'Àß|9ñŠ|ÿçÃÿø³Vøð^×âo®ÁDü-àýwÃÿ|yû7~Ô>øåâÏx?Á^øÿ÷ÁÏüFÕÿáfü9ý¢¼}ð«Å¿Û?¾7|EøG¤ø'Çú‡ì¯ñ£À_ÛÞ øŸ¤²×|1ÿ ·ÇKO…?f‹°ö×°·Ã_þw„üCñãf»û>üVÿ…ëwâÙgþý Ã!×iŸøNgøé¯ÂCà?øOö‚ñ?ü'º·ÅoŠþ%ÿ„Kâ'Ç/ü9ð‡Š|{ÿ ÃÿxOVøsð^ëá‘áo؇ÂÚgÄÿ|oñÿÆ_Ÿ>3øÆÞñVñ'â+üÑ5]OBðwÂOÚcႾkø5ðsá?ÃçðO„í?k¿2ÓïôÏéµ?x®Äx£Çúÿƒ¼3áÏé‡îõßgm÷û>Wþ~—·.— tü{t¿Ÿ{~'ËÒ~ß7>6øù¨éökñ³Á<#àŸÙDÕ"ð‡~Ük¾ý¥~=ÁJ¼}ûxïàçÆé¯à¾Ü~Ô^3Ѿ&ø»Æ7ß²GŠôþÛÃ_ðTßø«Bø{â]3öhý¨SDø‹ðOöxøß§^ÝÇû5Eý¥~ØŸ¾#|%ý<¯[GûJÍvž6ý£þ ü?³ðÿ„†µà߇Ÿð°|ªüñ—ÁÝÛÇÚ—}CIÿ‚xüѵ/ê–¾'ø£%ÇÄŠ?>-k‰>µá6†×ÄoïŽðQÏ YiK‚bx4Kÿÿ|cáo[]É}uð«MðÖ‡§jZW‹¬õOë'†?àž?¼'á?ø;Nñ?Å´Ïü.ÿ‚xü%Ò'½Ö¼'%ýχ?àš_u¯Žßou)`ðMµ¼Úß‹<]®Ýéß®mmlì5ßGmiàí7ÀzšK«ÌÛ¥®t–ÿ •Û×}ߪ]/s]=5õÓðÜ>/þÙ7ú7짤þÑ¿þë~,צý¡¾ü Õþx‚×ÖÞ8µñf»ûløöFøí𦠧ø‡á¯†ÍñGÁ~#Ô~!ø#Ã^(_Š·?®¾ hZWŠmüwâÏ…sE®ë>)ð‡þ 3áÏ øOâ6¥ûMÛ|QÐ|-àÿÚþ #àXÿh]WáÅ…—«˜eÿ?µoŽ4¿„žÒü,Sâou¿~ȵOñà µï…ZìÞñÃÝCã¹ûJÛ럦úòoÙ/áÌ¿üOð55¯[èšÿÆÏ~ÑZWŠáÔ´&ñ—‚~1ø»ö¡×lOøÃÃOá¹ü)wÿ »ã¾­§øÀ¾ñŸ„ü]ámCJð¾…ᯉš'Ä]ãĶ~"â|Wû|ñçÃá/ÛÆÞ'ø}¦|lý¬>7ê~»ñ¶™ÿ ^«ûfh_µo†¾0ø7^Õ|;¤èºÝ·‚SDý±>)ÙxHx_Rðߌ´OìÏ\ÜxËS»Òuyõô;4ÓøÛM|\¶Ó_^žzìƒ]=5]7[|¯ý\?cÏÛÓà‡í¯ÿ Çádÿcñ7ÂÏøDnücáøXß³ÿÅ¿ìý Çßð“Ãà½{þ¯Ù{ã?Çÿ„cû{Pð7ôÿøD®>"ÛüFÐÿáþØñG‚´/ ø§À:ï‹|SLÿ‚´~ÎOðsHøïã/üløCðçÇü;ñ×àö­ñ‹Ãžøÿ “ÂÚ׊~|7Ôí<;&¯ñ iÿ?áø¹û@üøk«øçö‚¿ø3ðs^ÿ…¦|_øwñ;dzn›â/š/Úÿ¾k¿ ?á"¾ñoÇŸüMâ?ì‹I… ÿiͤè>ð/Á?†¿þè»5 {^Ô5Ú|:¼]öý3Gñ¯|GáŸ|7мóÅßüÇàµ×ÃÿÙËáðñ?ÅkÙSöyÒg¿ƒ~$ƒZð™ñ„üqû+|OøyñcU ¸ðæ½ñGáßÄŸØçà×k6“ÖVJëDÞ—ÕÙm~·^í~»ž_áŸø+wì½â¿‡/ñH²ñ¶£h¿ð·|3o£økWø'ñûãÇà áW‹|/û'|=ñ÷ÂÏŒž9ø1ñö¡ý¡|ñþ$ýž>üø¡ãëŸ`|F𦧪x_âÃOø?Dõ‡Ÿ¶Mú~˵Oí7ñ—áþ·¢xsö_ø£ûyiWqø>××|GøUû üaøÁám;ľÒî¾!ê· ­ê^øp<1¬AãíCáÌÚ¯Å]ꆙáýá¶¥àísR#Ó´OЇFøƒã_|?oøCâ¯Ä+‡š7‚ÿi†ðïÃü+ø-ûC~ÎÛM3öoøƒð[áÏÃØ~_øÓâǯôOüIø³ñÆž õsöKøs­üý¤ÿgÖ¼m§|.ý¦¿á ÿá#ÓôýKB:¯€ÿá¨m¼C}ñ—þÖ±¨øoP»þ/ˆ>6ø…ñ^ÇþÃãßìxïXÑtO°ü.Ñüðëƒt쬟į»´nî¢ôz§¥ÖË]A_¯oŸOø;.üsÑ<¬ü=øIâ…úoÇOãÄ-nõþ$|:Òµ_ˆŸ³×Âßt+ÿOuª|b¶Ð|ñgZøóÏì½ÿ~ø!«ø[ö3øCñ£ÇÛ¿´Åo‚±µ§Å_ÂKû?øcÉý ?iŸƒŸ Ð>ülý¡¼1ðÛÁú'Á;O|,ÓüQðþËßüYû?ü*øiðgáïÄ?‰ž.Ó~Øüd³ÖäðÁ_ƒÚ/Œüð«â‡Ã‚ßl<š7~ëžñßÅâ N•Ó½—W½ú;nìµOÝ»Ü5¾ý{tÓÏÖï}ìŽ$ÿÁS¿fȱñw†~+üÖ>+ö¾ÿ‚vx[Áz¯†®ôÚGö¡±Ñ>üñÀÙÃÂZˆ~h:WìÑðçWñ—Àßèzgí{Ãt?ˆ>?ÿ„2ïöqøG ØÙþÒÞ5øõ¡xóÁº±á/z7ÅMÆþ:´ñ&ÞûøÂ6Ó¾ülý¡¾Ûé ¼%ðWâDŸ|QðÿE¿øÕð«ÀÞ#ñ÷Š|'à}oT¸øc¨j4O j>.Úø/Ø®ïöZ›á_‡> ¯ƒ¾Mà_ü2ø¡ü+?uæü®ÒûìÚï³÷¯Ê®Í|ºyöôóí§™ô?ÄŸÿ~øËÁþø™©ÿ¢xÇÁ?5ƒÊ³Ð®îfÿ„wUOøI|%sÿ ®ÚIàŸŒ¯|gð+ã>‚–‘ÂÀøñGâÃBî ÆÚ®þ&ïö[Ò¿áqëßü=ñãg´OxÛÂ_þ*üðV¿àÝáÏʼnþð·‚¼áŸx·Äoà;¿ŽúO‘áO…ß <=¯x á߯|$ñÖ…ðöÓBøð÷ÅZ'Ž~.éߦ<–÷“nÏ­µ¾hú7£Òé_FÁßñ]:uëøöés˾~ßÞø³aû3j:?Á?ÚG·ý§þhÿ¼;±á‡úÿ~xÃÄz…¾xãÆ_‚þ'x·Sñ>‰â}Ožºñl¿­>1Mû5øsâ€|cûaÃû:xGź6¹uÄüÿ‚‡|3ñ§þ êúW†?hoü6ñ‰û,ø?Æ´¯´_ºM‡ƒ~.þÔþ ø«àÇ€~2øKÁÞ6ðÇ‹®~(üF·ý ~Ëâ=cö}øâ¿€>ñÆ-: |[á_xKâ'ü+¿QðÏì-ðçÂZWìáÝâ?ÆÄð§ì‰àŸ…> ðg…æñ~„úWŒáHx7TðGÃ?øžá<#·àŸiú'ˆ¼W¦xë^ýžõ‚ð½üâÍwà÷í iñcàCéÿ 4þ'áÏüsá'Âí+ῃ<-ñ7ãbü#ð'ü3v·â/ƒZ†§ðÂóÁ¿¾'þÉž ø?௿þ"øŒ|*‹âæ›ão éÿ³ÇÀ=Bû@øMñ3áÂOj¿ ôwñÃ-KOñ_Äí;Çuû­wòßk¿ÆÛt¿/7P×üößM¼·¿^ÝÛöbýº~þÔ¿ð®&ð×ß ´ÿ?×ãÿÁ=Cã„4/ ÿÂ×øs£ÿ¹±ø‘©øwGÒ|]â_h_ð«7~ÛÞø7ñGø¦|øÙñ›âçˆÿáSÂ;á/…‰ðrÃûkþ÷…¿lég×¾0ücøKá›?øG|3ûüaÔüQý¯¬é»>ßà‹?ÿÂG¨kZ¦ƒò÷¿à¤w>0ñ7ìžß³ïÃ/ž,ÿ…‰ñ³ÂÝçÂÝ?Lø¦xËö‹ý“~4þÈ?·įþjÿ>*è ð‚|yãoÙÒëÇ–:Äoˆ_¿hMJøM¬hŸ>xcþ;<úÁß°ü=ñËß´‡‹>6~Ðßþ2hZßÃÿ^x§âgŠ>Ía¯ßü2øgû^ü!ðœàß|1ðG¼¢[xöÌø…m¨xká7†¾xsWñ„üãÝKJ¹ñö³ñ‡Äßø•ÿ‚cü3Ñ¡øuðïã—í ð¯Åß³—ÂïÙŸá/Ã?xJïàn·â;_~Ë ¿j¿ƒ> ½Ö4߉¿¾ øVÖü[àoÛâÅŸ®fðrX]_Úx?QðŽ›àëüë-{%æùwiÙɦúò­i'×{$jû-~{¯ø7ùWÅø,Ÿìwðzo ZxÿRÖü3©ßhž$ñÄíľ-ø àü°ð?Å_ˆÿ|}ˆ<7ñãg„õïŽzß‚¾*|øÓàíWÃ_±vûQøT¿øiquá-+ÄšgÄo‚7ß~×ø%ûBCñÖo]xwá?ÅøGÃ?h„§ÇÞ-›áTÖ¼Gû7üU‡àω/t}7ß|Kã•Ñi_펕á/xÚ_ ÜxÛöø‹ªøWX> ¼Òµ¯~Òß5¯ÚÄÅõô ³ñ5¿ü >&ñWŒ<5ðëOÑüA¥éIàßêxúÇÇÞ&Ó¼5âKÙÛÝN÷Ý·¶½,¬ï¶­Z׳¸+õ·ü6òß}Ok¢Š+1ŸÇ/ü‡þO›ÅöOþÿ镨£þ Cÿ'Íâû'ÿÿôÊÔW¹GøT¿ëÜ?ô”a-ß«üÏí Åÿò´ÿ±_Àÿú…ø~¹zê<_ÿ!kOûüÿ¨_‡ëÃ>+übøgð;ÂËão‹.ÓüáFÕ-4c®ê±_Ia¥̶vÓÉcivÖßi[IÖ)®+v˜GoæùóÁ¾4“s’I¶å+$®Þ¯dµ6ZE_²=.Šø‡þGû ÿÑÉ|?ÿ¾õ¯þTQÿ#ý†èä¾ÿßz×ÿ*)û¿óê§þ/ò ®ëïGÛÔWÄ?ðò?ØgþŽKáÿý÷­ò¢¾Ñð%ô_|-áox GÄÞñ·‡£ño…u?IÕ3­xb{ë>Ó_µ±¸³‡Q]"þ{W“M¿žÒ+mNÂk-SO’çLÔtû»”éÔ[ÓšõŒ—æ‚éìÓù—h®£þСâüjßü‰^g‹¼=7|]ð½5 ¾>ð‹àÿxËÃ2Ú_AáÝ/ÇÏâ5ðŒº“Ïm¬7ZÔ~ÖîáÓÃjvút6:í¶­h—ZŠq’Wq’KvÓ²é۸¤¢Š*@(¢¾aø›ûgþË¿|_}à/Š_8ñ÷ŒõH´ ø[ÃöÚíßÈ’Lëk¤¬pZÚZÃq©ê7r[éÚN™kyªjwVšuÕÌ_bYxWÄú•´Wºw‡5ëû9·ù7vZ>¡um/—#Å'•<òE'—,oís¶Dtl2§4ìá4Þ©8´Ú[½WK ºî¾óŠÙÕ|9â LÔµ½oAÖt}G°¼Õu}_UÒï´ý3JÓ4ûy.ïõ-Jþîm,l,m!–êòòêX­í­â’i¤Hјp^ ñw‡¾ xC¾<ðŽ¡ý­áOxoCñw†5_²_Xiø{Äše®³¢êaÔí¬µ+/¶é·¶×?dÔ,í/­üß&îÚ ÒH’\d·‹^©¯Ìw]ÿ¯é£¤¢Š)QYzÞ³¦øsEÕüC¬ÜýGÐt½CYÕ¯<›‹²iº]¤×××?g´Š{©ü‹X%—ɶ‚k‰vl†)$eCñ¯ü<öÿ£’øÿ}ë_ü¨ªŒ'+òÂR¶ü±nÞ¶LKv—©öõñü<öÿ£’øÿ}ë_ü¨£þGû ÿÑÉ|?ÿ¾õ¯þTU{¿óê§þ/ò×u÷£íê+Ì~ |eøgûEh:¿Š> xªÛâ7‡t/é¾Ôµ­ÇVm9øSƲ]xkÄõ­kÃÿô}WLÔíï|OªxsÂÚÏ5è¬c6dGk¤xoAÔ/õ NìÛi–²;M–ñu]kE²Ô6©4Ö鮺¦´ï¨ÂŠ(¤EPñËÿ¡ÿ“æñGý“ÿ‡úej(ÿ‚ÐÿÉóx£þÉÿÿý2µîQþ/ú÷ý%Kwêÿ3ûBñü…­?ìWð?þ¡~¯ˆjÿù ~ÇöoØ¿ÿWN_ox¿þBÖŸö+øÿP¿×Ä?µü„¿c¿ûH7ì_ÿ«§@¯.—ûÌëãüÙ£ø>Qý¥þ~Ù¿|Mñ—àö¹â~Éû>~Ñ¿¶ÿí—ûøá†à_iŸ~ø«ö<ƒöÕ[Ï^,øí}ñ_ZðOÅ/üJ¹ý„¼c5·Â=ösøQ¨ø¾·—â׌¤ø=ª]|aý_¯ÎþÁþ*ðwÆ_ëšÆ¯ë_³çÁ_Úö–ý³~ ü0²øG¨èßtß¿µ|´²üQ‡â‡Çiþ-k^ øðL¹ý±ÿh9¼à_ ~Î ¼i¡À> Ûø‹â¿Œ$øãk¯‹ß£õì~d~Ô?´ŸÀÙѦ¸øÝñC¿Æú_‹´ Câ É÷ÄúWÆÍGWÕWMÓí!º¿ž×K°‰dÔµl4í>[Í.ÒîêÍ_K·¼ý7¯üg‡öÆ»}}¦Úê¿ÙZ‰ommofÔa¶ûLßu,Ë)Òï´ë§Ùk¨ÝAt±ùŒŽèû®lM¹Uö´ï­´²¾¼²¶ŸÝ~…GwòÿÒ‘ø}¡~ßlþüfý­ÿmü-ñvãoj>ý“í-5ÝvšÕîôËÖWÖÒ$±Ãqoqoq +Ãs 24mÂ+[ϲ}µ¡|~¸Ö~êüSáߎ¼Iâ_Û7ö¹ðÅö¡q„¼ð÷öXð•½Ýûø{Ã’øŠÇã.£â+Í2ÊúòöEÔµûØ-fÖ5K™î5èl4>[£¥èš-ŽŸÀù9*r­}œoï§îûJvÑQ‚½í{Êú¶îÍ5º¿wÓ­Ÿ÷ŸŸÝÚÇÕÔQEs”ñ„~5ø«özø¿ÿAø«àí?ÃòêúO‡ÿà™ž¼ñ?Œíuÿ‡¿<+ñâÄ߆¾:ý£~*Xiz¯†îoþþÌ^ ñwˆh‹ÖøÓáÆ{ðÏá‡ŠíµŠ¿ t‰o¾#x_íÚðÙkþ;ñWíWÿ.ѾüEÿ…QñO‡ÿ°f¡á?ÏáÇÚ>¬hcã¶¹m¦x»Á:Ìúwü%_üUýœÞø‹¡xÄÞñÞ£àMsÄVß>)|(ø'†~$øW³üY×·ÿ¥@‰ì½F}ÿ÷ý®¿á­¼ñáÿájþÏÿ´ü3ÿíÿÿᢿeÆû'ÀŸŽ?køð+ãçü%>ðÏü-?Žßð‡Âÿ Ûþ׉´Oø]ß>ßã…þ!ñoö¿†á&ÿ…qàŸ¿ëæÙ‹àо Áñ£Å_¾!xâgÆOÚ3ãþ/ø›Àßµ„ÿ ÏŠ´ƒ_ÿg¯ iÿ ¾kÿþ0ø§Áþ´øSðáÉ×-|Qñwâ.£¬üB›ÆÞ*°Õ|=á½BðƒþŸ¯PÈåü_ÿ ›Oû<ÿ©§‡ëðËãíóû*øN×TøqkûN|"ðÅ¿xcÄÞ‘üK¦kž9Ð|ñ5¿ÜXGâÏxkWð´Þ%¶ðiÒx§ÂšG޼1ªJöú†%ñ†5Èn®4ÏÜßÿÈ&ÓþÆÿêiáúøÅšå¿‚¼ o®é¿ ›â>¹‚õÿCá­+Q6^*ñ~«¦jÞ'·°ð¿‡f×¾ xÀÖz¶´š=–“¤MâxgÃñj7QϯøIÓMÖ£kÊåç6ÞÍý®_·¼“ëmÕ­}M!{ißô^kúè~<èÿ·7À /Ùvûá¯Å_Ûgá'Ço‹ð§Å^Öþ&xÀ7Ÿì>$ø†ãEÕô½\ŸÀcYñn…á=oX¶—L%]3ÄV¾¹ñjº¾ƒ¢x3÷¶оÛýŽäÑ?eû7ÿú¬|/]6ñþûâ'ì­ª|l³ø âïÙÿÄzÿÂOx×Bð/Æ=1ô‹~š- X½ðÕÇŒ¼%¤üNø‡á Ä[ÛéÞ!>ÖµGUÐÒößAñç‡ôOYøƒÂºf_죬êþ"ý—?fÏxƒUÔµÝ]øðwY×5ÍfúëTÕõ_TøwáËÝKUÕu+Ùg½Ôu-Föyîﯮçšêîêin.%’YÏ%N^OuY{G{›[l’§M%Ú×]¬ŠWº¿gm=7Õ»žûEVañ»þHÇÅßû&>ÿÔSV¯ä¿ãÏÇo:7‡?h±àÛÓöñøIâïÙ‡þ ñÿÚø—ð¿à?Â_‰+ðìókáÏüÿ‚h|.×õÛßè¿bÔàÖïõ?ž;Ô®~ø{àÖau­7Ç׿.n±à]gúÐøÝÿ$câïý“ê)«Wòÿñ+þ ‹ÿ)øÉÿ ;âWÀÙ3þÏÂOÛþ »ÿñø=á/ÿÂ÷ø àOì_øW àŸ¿µïÂ+ã_é~&Ô|¯~ÍZÏ€?²5; oþÜÿ„ªÏS¾ÓôË[ {öo+åx~"ÇTÍq¹fý‡µLÖ¾[‡ÃTåÏò˜ª ¦gj¤òèc[…'TèÆ²¢ïÌŸÊñt152ê1ÂÑÄÖ©õš—ŽŠ•#|64æã†÷ùUwE^iÓRqs[5ý˜Á2|Yâ¯ÿÁ6ÿàŸ>:ñ׉¼AãOxÓö ý”Oý£~%x àôüNø¡âÍÀþðf©ð£Xñ7Š|Av–Z^•a³ñid`ÒOuwu5½†™§ZGq¨êÚÕž—¦ZÝê7–¶Òþ|Qý¾>ø‡Æ_5_„¿·¿ÀŸ†^ ð®uß^ñ?ÁÏ|MÕ~3ø6m*]è^-‹Ç^ÿ…Oö?íKİøžËÃþ0Õdñ–‘àYîa›Á:GŽ<ñ+úø£em©xŸHÓ¯bó¬ïõï…vWpï’?6ÚëPø•ñy‘øËàÇ„´¯ÙCâ'Å›OŒ6¹ðV¡ã_…Ñé·¾ ø3ö]*]yü[ñžïÆ|­øwÁ2蚈.íµï h>0ûV«¡Åà¨-$øƒã?†~ñÇ›[—Ú>eÖv÷’ÿÓ¥Qh¶wNûj“5W¶ŸÝé~‘ó_ð×¹ùÛâOÚwàíû_þÂö¾)ø_â÷†|qñÚï\³Ñ..EÞŸi©~Î!³¹’ÞöÚÒimåšÒhžkt–8$ò’á¢k›q/ê­|·ûBüB×ìÿiØsÂ>e🆼cñ ãañ–‘áûír;_ÅáïÙóǺžƒg¯ÿijúœ·ºn“ª¿ö½¶–$‹N“WƒNÕ¯-nµD¹Ó¾¤®j¶µ>_‡Ù»{ÜÎÞÒ¥îù!ÖúrímJ]{ß_¹y°¢Š+!…Q@Ç/ü‡þO›ÅöOþÿ镨£þ Cÿ'Íâû'ÿÿôÊÔW¹GøT¿ëÜ?ô”a-ß«üÏí Åÿò´ÿ±_Àÿú…ø~¸[ÝšÕ÷†ïüUá-Åíàÿi>5𵾿ý¨ÖºŒü>òËáïÙG¥êz[ÿnxvæg¿Ðnî$t}],õÝ>(5Í/IÔl{¯ÿÈZÓþÅÿêáúåëÆ“qœšvjR×æÍ–ËÑ¡ÿ __ÿŸoüºþ%óuGü-}þ}¿òëø•ÿÍÕy}ý­Oæü#þAeÛúÓü‘êðµõÿùöÿ˯âWÿ7UóoÇïx—ã­¾gañŸãÀËM-B+ôø¯xwHºñh¾Õ$ÖSþ½cÇÞø‹¯_Ecª\ß_ÛÙØêšfŸsyx·šµ¦§w¦hsé^…EÖ§ó~ ü‚ËòïÒÖü‘ñü1—ˆÿè÷?mïü8ß ÿùÊ×¥ü ýš4Þ'ø‹ãEø¡ño⯊þ'éþÒ¼E¯üZÖ<#¬êQØ|=>,>‚Æã¾ ðk6Õñ–©̺§ö¤Ío›mk%¤ž\¿IÑIÔ›M9h÷VJöiô]Ò ²]?«%ù$QE@®x0øÀ:ÏŠüOáŸèz‹|xÚñ·‹muiÞ!ñ\^³¸Ó¼/g¬Þé)ÓcŸMðÝ•åô:—iÚtÚžµ¨[Ú®©¯k—Ú:*£)EÞ.Í«tÚéõóH-ÌõøZúÿüûå×ñ+ÿ›ª?ákëÿóíÿ—_įþn«Ëèªöµ?›ðù Ë·õ§ù#ÔÅmoÌ‚I4û[Ÿ³]Z^Åïˆ> ß[}¦Ææ+ËIe´¼ñ¬ö³ùPC:$ðÉ™‡ùùãoÙ{Å^7ñ>¯âIlOÚ÷ÃPê7·Séþð>hÞð¾Ÿ5Ì×Ú†´£ðrê[=#O4pËÍCU½‘¦Ôµ½SVÖ¯u Nïë:(öµ7æém–ÎÏ·t¾à²íÙýÛ~GÂ÷ß±&­©Ù^iº—í£ûjjv¡kqca}ãï„×vWÖWq<Vw–³ü’ ›[˜$’‹y£x¦‰Þ9‘™OÖ_ |¤|,øsà†>¹Ô¯4‡> ð¯€ô;½fk[^ëHð†…aáí6çU¸²³Ó¬§Ô§²Ó –úkM>ÆÖ[¦•íìí¢d;j*e9IZNé;ÚÉkòHKeýH(¢Š‘”5]+J×´ÍGC×tøµmY°¼Òµ*yï­`Ôô­FÞK=GOšëK»°Ô­¢¼´ški'Ó¯¬¯¡I –—v× Ééñ¹ðžƒ¢xW¾Ò<5á io‡ü9áÏë>>Ñ´è:5œ:v¢hš>ãKm?JÒ4­>ÚÞÃMÓl-à³±³‚b‚$EᨪŒåh»-öOóL,ŸõæŸèPÿ…¯¯ÿÏ·þ]¿ùº£þ¾¿ÿ>ßùuüJÿæê¼¾Š¯kSù¿ÿ¬»Z’,üSÕ|Iñ/ÁZÏ„´ÿx§á~§«Ë¤ËÄO‡ºÄÓüBÐΑ5ëÁÿî«ñ~!iT¯§ªZ‹È´Ô,?´%Ô4k½3Z·°Õ,þÿ†2ñýçí½ÿ‡á_ÿ9ZûzŠ=­Oæüù—m¿à’>5ðìkaáωß¾*x“ö‡ý¤þ,ë µj¾Ñ~)x«áæ·áëKÿø7_ð6©<‘h¿ ¼;­.íÄWޱYkvpË}o§ÏyÜviû*Š*e)I§'{+-´WnÚy¶þcI-¿®Ÿ QE QE¿ðZù>oÙ?øwÿ¦V¢ø-üŸ7Š?ìŸü;ÿÓ+Q^åáRÿ¯pÿÒQ„·~¯ó?´/ÿÈZÓþÅÿêáúåë¨ñü…­?ìWð?þ¡~®^¼Yürÿ¿6m—¢ü‚Š(©QEQEQEQEQEQEQEQEQEQEQEQEQEQEürÿÁhäù¼Qÿdÿáßþ™ZŠ?à´?ò|Þ(ÿ²ðïÿL­E{”…Kþ½ÃÿIFÝú¿Ìþм_ÿ!kOûüÿ¨_‡ëóËö¾øgð×ãÅÏø'Ãï‹ß>üZø}¬þ×?/u¿|RðW†~"x]¹ð×üCþ âŸË®ø7ÆZ^µá­kûĺ.¯é‰ªiwqÙk^Ÿ©@‰wgo,¡¾/ÿµ§ýŠþÿÔ/ÃõñGǯù8¯ø'ýÇ?ýu—ür¼˜i^ëGÍ?ý¸×ì¯ûwóAÿ ÿüÿ¤{þÀøƒÿ²·ÿ:J?á?àŸŸôØÿöVÿçI_WÑSíªÿÏÚŸø¿Ìv]—Ü”?á?àŸŸôØÿöVÿçI^)ñ‡àGü·à_ü#°xëöýµ oÅ¿ÚóxsÁŸ ?à˜Ÿ ~;üFÕt¯ÿf'‰|OoðÏàoìÙñâ ø'Â÷zÿ†4¯xêo Eàß k¾1ðG‡õÝwOÖümá; côj¾ ý¡õ©¾~Ö³Ÿíâ?üQñ¿ ~Ï?µ¯Á¯jß ~üUøñâ=#âÅ¿‰?±¼§^ü9øà߈aÑ5¯| øŸssãSáà}ÿBÓt/xH×¼_à½3Ä5µ[³«Wg¢œ®ÚM¤µ{½6—eºéç©çšwÃ?ø#®£aáÍPþÈÿðN]Lñ/ÂbÔ|Wû þÎ> °ðßÃÿÙÛÄ~ ðwǽGâ=ß‹¾h–ÿ 5¿ƒ.øƒá¿ |PðWÄù<#ãø|I¡øÃšv§àZø{Úü5ûÿÁ;|YáÏø§Kÿ‚x~Ãvºg‰tM+Äu¯‰àŸ?³Ï‚üGma¬ØA¨ÚAâxÇà~…âï ëpÛÜÇ«á¯èz7ˆô+õŸK×4­;Sµº´‡ó+Ãÿ²×ÆŸüXý¾!é~ Öô{‡šßüö¨ð—†>,xwÅžøE㙾7ÿÁFþ|yýš¾þÒü#×Þ#øi­øßá·‰#øÓðÃKñO†Ÿâ¯ìõñûáo‚¾/ëŸ<_âïÙ×Å_u?ÜŸ‡^5ÿ…‡àÝůá/xïPþдÕ|ñAÿ„wÆ^×tMVûAñƒ¬ZAw©èšŸöf·¦jš‹|¯x¯áÏŽ´¨¬|kðÏÆ¾6ø}¯økźËJ‘µ«Tz»þòZZRK¯T“¸’Ox¥·O%úÜðoø`Oø'çý#ßöÿÄý•¿ùÒQÿ ÿüÿ¤{þÀøƒÿ²·ÿ:Jú¾ŠmWþ~ÔÿÀåþc²ì¾ä:_ð]OÙ?öCøSÿÜøÛâo…±¿ìoðÃÅ”2øqû%~Ξñ¶—6z®²­ xÏ¿ ôŸxnåï´{>÷@Õ´ÛË›%¹Òî.%Òõ BÎëú_ðõî›eã;Ý:òêÂò Ûù7vWÚÜÅæxÇÂQIåOÇ,~dRøŸ{âÏø³DÒ¼KáoøkƳë¾ñ/‡5Û5MÄ×4½NëLÖtMgLºµÔt­WNº¹°Ôl.`»´žky£‘¿9|kã«oÙçöÓø»ñkâ‚~6jŸ¾/~Ëß²Çïøƒà÷ìõñãöŒûWŒ¾ üWý³©ûX|ñ¯„¼/ûC|ÔôÿŠ?±¿„t¿„ö lÞøð7â7ÄŸ…Ó~Ѿ2ø™ñàÇ_ÿÁ3¾ ë~ð×ÄŸ_ |g¢ügøUñoâf‹aðE>0ü>øÁ§éž8ý|]à]3²SšÒüÎM¦ì®’ZèݤîífÚBÓ²Ý.ÖÛþûßøNh^ ýª¾6k¾»ñÖ£wñö¸ðO‡þ"Ûm|xÒ~,k>ø;kðsÇÿ·—ÃÙ=oã´÷Úçů„ðQ¿_n¾ -‡ìùÂm*ËÂß³_Ç€_ðTË…ÓÝKû[ÝÛxƒöªñŽ¥à{_XêZu÷†¯>j¿°¾©£>Y_ø®×j÷“øo}½Û^êûK]6 ;vé¯N–—íc÷Ç¿ÆÚïÄ¿ xcâ?Š5=oàÿ¬>|E²ûЬ¿áñ–§ðçÀ¬t´ê ii«yÿ¾(øÄÚúž•öïöT×Ñëzf±¦éý·ü'4ÿ¡¿Åø?Õ¿ù.¿2¿àŸ~øÇáxÿjk¿Ž¶ž6—âŠþ6| ×µ¿øëÁ^ð«ñ]Óÿà›¿°_‚¼yãXt‡º÷‹¾[ý£â„|w ë¶Ÿ |kão‡:Œ´øKÂþ-Öí<:×múYÊRNÊrz-yµI¾Ú_`²íýiþKî>Nÿ‚øûÇp~ôÚÃã_·Ÿ 5M*ìEâ=b1u¦k7VZN¯¦Ü„¼{ WK½¼Óu+9w[ßi÷w6wQËm<±¿Ö5ñüþLgö’ÿ²~ÿúzÒ+íê©6éA¶Ûö•wwû4»‚Ýú/Ô(¢ŠÈaEPEPEPEPñËÿ¡ÿ“æñGý“ÿ‡úej(ÿ‚ÐÿÉóx£þÉÿÿý2µîQþ/ú÷ý%Kwêÿ3ûBñü…­?ìWð?þ¡~¯ÍÛßâWˆ>jŸ±¯Ç]à¯Ç6 ?iŸˆz¿‰<û?ü3ñOÅ_C§øïöý·~ øZºðï„tÝWS±ð­¿ÄŠ Ó|Eâ'³ž ÓUY¢µÔu ,4«ÿ¹ø7þ Ëÿð·Š|Ea5î…{ªþÉ´]õ…æ£k¥ê¶iS•øA§ /¶Dˆ¯¤™àŠhãŽá"‚Y.­¿¨o|[Ðþ øÅ^#Ö¼3ñ'Æ ªÙé~Ò|;ð«á¿Œ>'x«PÔîpÿ†æðçýWí½ÿˆñSÿ•tÃsxsþ«öÞÿÄNø©ÿʺú?þwÁú+¿ ?ð¾ð§ÿ-¨ÿ…ÝðcþŠïÃü/¼)ÿËj›/ùñ/¾ä?ûytíåùÿíÞ‡ÎðÜÞÿ£jý·¿ñ¾*ò®ønoѵ~Ûßø‰ß?ùW_GÿÂîø1ÿEwá‡þÞÿåµ𻾠Ñ]øaÿ…÷…?ùmE—üø—ß?òûytíåùÿíÞ‡ÎðÜÞÿ£jý·¿ñ¾*ò®ønoѵ~Ûßø‰ß?ùW_GÿÂîø1ÿEwá‡þÞÿåµ𻾠Ñ]øaÿ…÷…?ùmE—üø—ß?òûytíåùÿíÞ‡ÎðÜÞÿ£jý·¿ñ¾*ò®ønoѵ~Ûßø‰ß?ùW_GÿÂîø1ÿEwá‡þÞÿåµ𻾠Ñ]øaÿ…÷…?ùmE—üø—ß?òûytíåùÿíÞ‡æïíƒûHMñÇöeøËðŸÁ?³g픾+ñ·ƒî4­k?²×Å‹ 6Køï,æò- í­¾Ò¶o ­…n%‹íA™<_®5æ𻾠Ñ]øaÿ…÷…?ùmGü.ïƒôW~á}áOþ[R—3ŒcrŠ‹”¾Ó»’Š{®Ñ@½o{véþmßæO¢¼ÃþwÁú+¿ ?ð¾ð§ÿ-¨ÿ…ÝðcþŠïÃü/¼)ÿËjŽIÿ,¿ðþCºî¿¯øu÷žŸEy‡ü.ïƒôW~á}áOþ[Qÿ »àÇý߆ø_xSÿ–ÔrOùeÿ€¿ò ®ëúÿ‡_yéôW˜Âîø1ÿEwá‡þÞÿåµ𻾠Ñ]øaÿ…÷…?ùmG$ÿ–_ø ÿ ºî¿¯øu÷žŸEy‡ü.ïƒôW~á}áOþ[Qÿ »àÇý߆ø_xSÿ–ÔrOùeÿ€¿ò ®ëúÿ‡_yéôW˜Âîø1ÿEwá‡þÞÿåµ𻾠Ñ]øaÿ…÷…?ùmG$ÿ–_ø ÿ ºî¿¯øu÷ŸÉ§ü‡þO›ÅöOþÿ镨¬¿ø,F·¢øöÓ×õŸjú^½£Þ|?ðØõmP´Õ4Û¿³é³Ú\}šúÆiígò. žÚo*Wò®!–Û$n ¯j–”©§¿³‡þ’ŒïÕþgå­QZ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÿÙPythonCard-0.8.2/tools/standaloneBuilder/doc/pic26.jpg0000755000076500007650000016516710240730043022517 0ustar alexalex00000000000000ÿØÿàJFIFHHÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀR "ÿÄÿÄ^  !“Ñ1QST’Ò"23ARU”•³Ó56Varst²#B‘£±Á$4quCb¡áDÔ%FW´‚ƒ¢&'Ee„…¤ÂâÿÄÿÄ&QA!"1a2#BRÿÚ ?ÐåÎ\ÛY9”töe•KfIè£Æ©€É ÷ÅÀyÍþ´²¿¡dÿÿ£â-„§ÿßÍŽ9lí"úÃ/dg¥§Ž1–3¼ó™e5•?žj?KyWJÀùlû7bd8Åü„µæã¨ÿëŸ(ú ‘êÎí-çéçÎIÿ˜Ò{Ç,–På5ƒ6P›ÛŠ®Ô§‚Þ¨–¢z²cÑa7ÇšˆµÎqcOpÃ~0ëÕ×ÒËóM>ñ2â¦\£è6G«;´§“ô³•ÓAS-“gGOQ‹3+¨Þ&s°œWŽ£w¸³ì{#%íëO'(£e}§OÕ¶¡îÎ4ÖÊòײu÷ˆÇîÈ'ˆ…ûgÙTVÕ“‘©e2&ÕºÕc€t¬’Í{s/w ü;Áÿ[Ó:7ÿßµë“(º‘êÎí/ÑúdÊ.…dú³»K£¹K¹#Bÿ ÜîŸÂÙ×ÿÇvcù¾>÷_]úÕ½VKäÍ.PÛ1‹6ž’žÄ®³Ù+ÜÙ#™íÎ sŽsKn$ê‹Yºõoùýb}ûQÓPô+'ÕÚ_¿®¡èVO«ҒײòŽÚý >εf®ŠÈž×‘´î´L”ŒN-ku€Ih!¡¤}À‹ïÈÌže- ‹"®V=uKé_œ¦sd…ì pkŸ!i!çÎiÔpùgB"/Ôûöª¥ý*åU}K)¨ì«:¢w߆(hÜ÷:áy¸^uTCôÁ”= ÉõcÚZ ³,áidõ±eY´ºŠãS.rIx<4w‚/iÞ 8¯K²_£Ë Ì·ª« ¯¥¨–\1¶žAO,°Fç;^s4渢\;âx‚µ£ö™Çâ ÏãåÜ?KÙ@ôVW«ÒõúÝ·ú•êÇ´§¶èÅ^Ddý4|‘ÃYWO5tRÈè(I©nŽûƒÖðNˆ×­h)r’гÙSeËÖ¤ÔR°Ç, ïht¯q˜.ppòÔ³3¡sk÷í™ýn[ýÊõcÚSOúQÊŠLÖ“eÙðçcÇœ£sq°ñ8^í`ò©lìš±-.̵x9©ª³«æŽÏŠY sÏ Àc@.2A$†»^Å®û+fÃe¡[A5U ¢ÉêKìÆC,³btŽmÌŒJÇÎ"K׋Á&ñ'-šÚFúýTþ´2ŸCÓ8.ÏÑs™¬öˆìî¿+î¾íw(ÿ[6÷C²ý\ö–¶\–± 'å/ŽË9HÒùn:èÃÃ1qÜ\CG–ãÇ~µGM“68³Ù[[c2ž¼XõµrÙÏ’f67Å#DO-.Îà]ÆëÚ®¹HËCÞ$ïí_úØ·º—êç´¿Zö÷C²ý\ö•œY)`˜¤¬Ë<–MlV|!ó\é\[!daí{€ÂÞ7êÄo¿PWV M¤³ÄVMmÓÓwIôåÆ)aŒÄÂs¢ç_¿ˆÝxÃ{“,´b>1#¹d‡é^Þèv_«žÒèô—”³SÍQ™@ø Ñ´Ž-¸b7Ü/:…êʃ$ì{Z×±eŠŠ*ºiªíZÑ—ˆF;5à¸ˆÅØK@:Ákµ¶}ÉWÓÔO,tÕ6mŒg’IÉ͵Ӹ8‚òC@MM‰–Z?ŠýûPþ²²—DÒø6ƒFÎf³Ú#°cºü8¯ºûµÜ¢ýiÛÌõsÚZ˜ì (¡±ë¬î³ŽRHÈÙŠFgØØ_€ây$ã 6öÝ’â©!°,)ŸRùìN—1eTÔ=“Æúf½ìs ]'¼Þˆ7—#rc–Œþâ“¿·ëNÜè–g«žÒê£ý!e=¡1†ŠÉ£©7d4nyû¯¸-ab˜lê‹F¡òçèiç:&Cœ°©½ó›xË}ú¸µêÑä`³e0…ÎtbŪÀç· "öÜH¼Ü~«Ïú®ÚšZXãq‹1žS?®é?Ivü2¾)hløäc‹^ÇÓZG E"ý%[óÌÈ¢¡³ä‘î cLIq:€ýeGfØVmNAÏhŠ|вY-lS67€C[š‘® ¿Èƒ‰v«€WövJPÑ6ž Áþ*ŠªÏ{+ cÛ FrFasžá ï¸ÚÖ\@ò—,§B?õùXß>Ô²þ’­ø%|RÐÙñÈǽ¦ ´Ž0EúŠý‹ô“oO+"ІÏ|pkXÚbK‰Ôë*\­²¬ö²¦Ð¯§’Í©’Øž bcœêˆnÄ% ‘âþúá{Ho}ÅÄ¿rNɳÜÊkB‚šKF¦;^‰•Žk©á»t±Ž7w׋ÜK{Þ.5ðìÝ´¼î­Ÿ¤{z_´6|r1Å®c©ˆ-#Œ~¢¿?Yv×E³}\ïW5–#ê+&³kíªkë[Ph¢t¯„‰h<5†âß5×ßä.1aØâãàØñ7'›js²b| ‹Ú{ë°›® uê#UÙŒ´+þO¿n/Ö]µÑlßW;×èý%[=Îõs½vÉ“v`£š²–ÎÒkfRUÃg‡Èæâ‘å²µ®Æ@~ñ»¿%ß´ùDì¿02Ÿ?aiO¦¿?}Ò …—ƒ‹½?ÒâI½j'Boê}ûqÒE²ô¶w«ë÷õlt[;Õÿò»©ò~ËL««²›`²êꥡsåhc£ÜZ]Œ^/ã7µ/ØVT‘JÆP¶>Á£^ÉLrjï[{ˆÁ¨ñ‚u|WKÐÿäûöåýc[Îõü©Æ\åm;…™H[RK`:#®”ƒq ×ßõjU™iGfÙ–ôÖuDèÏ3‡bc 5ùM÷Ÿ%Ày´ò®{NƧ³ßMy¼æ97¿ÃÇתíx‹±øÞàßDN8þ¦ü¢âeoU—CC(Š²Í¤§ŒA²Ò9„Ž[‰âÔ‚‹õ‡kôk?aÿ•É•ÿÿÿg§ÿý–t-ièéåÌ3–yDÕµ¿¬+_£Yûü¯ß֯Ѭý‡þVI~­øú}'&]µ¿¬[£Yûü¯C/ínA°ÿÊÉô^Âxú}™vÕ÷}jôj ‡þS»ëW£Ðl?ò²È§§ÑÉ—mPËÛW£Pl?ò½ »µOþžƒaÿ•”è½ôOO£“.Ú®î­NC°ÿÊwujtz‡þV`/Ôñôú93í¦îæÔèô;ü¯C.-3ÿ§¡þGþV\/a<}>ŽL»iÆ[Z}‡aÿ•ûÝ­¥Ñè¶ùY ¿TàÓèä϶“»[K˜¢ØåzîÒÒæ(¶ 4½ôOO£“.ÚNì­b`¿{±´yŠ-ŠÎ…úœ}'&}´]ØÚ<ÅÁ~Œ°´yŠ=ŠÎ¯Ðœ}/&]´C+­bb½w[hs4{³À}KØSƒO£“>×ÝÖ×ó4{¿{¬¯æhö!P¢¼}™vÐ «¯?ði6!~Œ©®?ði6!P…좜}™v¼î¦»™¤Ø„™¤Ø…H¿SƒO£“.׃)빪Mˆ^»¥­æiv!Q…ì¢piôrgÚëºJÞj—bºJÞj—b0_ªpiôrçÚäeg3K± ÐÊ*Îj›b(^Çú'ŸG&]®; «æ©¶!~÷AWÍSlB© õ84úN\ûZðý_5M± ×UóTÛ ª¡þ‰Á§ÒògÚÜ[•\Õ>È/ÞªæéöAUô_ªpiôrçÚφ깺}_¢Ú©?ðéöAV/A84ú93íf-šžnŸdï Ôspl‚­ ØN>Ž\ûXp½G7È µª9¸6AW¯Ðœ:}™v±­G7Èn^…©?™ÈnUã‰{JpáÑËŸnޟ̇dÝË÷„çó Ù7râExtú92íÝÂ3y웹zó܇dÝË„¢¢œ8trçÛ¯O›Ì‡dÝˤ>|-&JF’ÐëŒ\W‹üÕX£Ê,¢²²f† Ûb«F§~n&¿6çÞâËÀ¹ ž&Ÿà¼ÿÑŽ8Dm‡]²Ê~ei,ï†'Ë$ôŒisŽdêÿ¹áµ#’†–®Jª*vUBÉ£lÌ uÎhpò]}ÄqMG”VVSdå}mU¤Ó±²DçæÜËœy8ÄáüT¶s¨ÙfXŽ­Ñ° "<@in,0ñbÕ}×ÿÝy·ÿŽûÕ°´¡s$s+ìçˆÚ^ì ÄCG¸5,úù-: èÍ-¬½×áÿªü±Ä ¨ET9êsH3±fŒ¸Ûšeãºñªà üW-F_Yšfqùˆµî9yê=—ÿò²ùMkéy3oC ™þöFy¹¤€n¾ëwñò,eZ4öÅ•5¯fÚRdøð5¯Ï>ÍqðPÀÛüà s³\Dƒß Zï›ù]ø¹?,iŒÝü,ÅWÊ\¶É, µr®–ذí(hŸ pã3>7ƒßqkN«Ê©û–ý%ý.ÿüéû+êu0}†~P°#+m²Ôªšv2 7V,J—Œ0N|È#qï#UæöÞ±¨þŒ¢*£à8™¶rÑýeµ®ÀÛJܤ« ƒ=D"ëø‰eþR¹¨¿EYOg×SÖSWÙ‘ÔSÈÙb~7œ.i¼Œw`q­{H}”ÇCkÔbœTÕ»Qæ¡eL±°ásš_sc"èÃÝÞë‘~ÙoÌÔˆ¯„âÅñÊ¿ÑfSW×OYU_fIQQ#¥•øÞ19ÆònÝÆO‹õEoô»3k'a}+*-z»&+8R9ŒuU^aÏuµE­ÍHûÄqçØ® Iò*ëo)+¬ü™®ÌÇ5]©šú·ÏOLØLš{ã™ø‡€ëÚ1ðÞàf¯£‡õEoô»3i'a~Ñ¿ÒìÝ£û èVNRTÚ9CUgŠGËMIÒưDá=LD< æh7›É ¥O7TáÅñ¡ú%·º]›´a~Ñ5½ÒìÝ£û èÖíU³MiYpÙÕTC[9§"¢‘ò¹®K&+Û+oF×yo¿È’åm3å}L50бÓF+œÖ˜ÞøCÌ i2^ѺË@8 ÄÞÛÞn©Ã‹ç_ª{w¥Ù»Gö~‰íÞ—fíØ[{C+E-U©†¦ÌNé+a¨kíF¨xuñ—‹±Bu‹¼â¸‹ïì«DÚ”-«Ñ&¦cî1‰d‰ùÆ{Lo{KMúµù?Ñ<ÝS‡ÊÇè¦Ýú«;hþÂô?EVçK³¶ì/¯¬M._Dû.«©Žht¨óµÒ>‚¡‘1‚–Ižcs›s»æ ®.½·Ýyº§,¿ê®ÜéVvÑý„ýUÛ*ÎÚ?°´³þèfŽžª•ïÓN÷VÂÉ ™Î„RÔH.tos/.‡‹=î»ê,ëXWÏ=4´U4UPµ’> ŒØ\ëØç6âXñu÷÷ºÀ^óuN_3¢Ëo¥YÛGö¡ú.¶ÇþªÏÚ?°¾¶‰æêœ8¾Kú¯¶úUŸ´a~þ«í¾•gíØ_YDóuN_&£ k¥YûGö¡ú1¶‡þ¦ƒhþÂúº)æêœ8¾T?FvÏI Ú?°Ÿ«;g¤ÐmØ_UDóuN_+ýZ[=&ƒhþÂï³2/)lyf–жÎc¦‰ÐÈ3Ì$^Ò‚ú*$ÿf¤ÅIËæ2~Ží©e|ލ³ƒžââ\Ð ä€õ KÏêÞØé4;GöWÔ<ÍC‡ËÿWÇI¡ë¿²½ÑÍ®?õ=wöWÓ‘<ÝS‡̇èî×úŠ»»+×êòÖé]wöWÒÑ<ÍDáÅóOÕå­Ò(ºï쮫;#r‚ɮ޶жŠ*ˆ¯ÀûË®¼uÄJú $ÿ^¤ÅJðâù°ýZ½"‹®îÊõÜ«Ò(ºî쯣¢yš‰Ã‹ç=ÀZ½"‹®îÊõBZÑJÉ=s‰pÕÊ .#ê+舞f¢ðâÃWä­¿jK•ut/tQc X/¸Öp¼®Qv§?G×we} ëÔˆ¨'G|÷¸KSŸ£ë»²¿{…´ùú>»»+è(¯™ªœ8¾~2Óñèúîì¯C!í!ÿ“®îÊß"yš§ q—?I×we;‰´¹úN»»+z‰æjœ°}ÄÚ\õ']Ý•èd]¢?ãRõÝÙ[¤O3TáŇî2Ñç©zîì§q¶=KÖwenO3PàÁˆî6Ñç©zÎì¯Ñ‘ö€ÿKÖwem‘_3PàÁ‹!hø´½gvWïr5üõ7YÝ•³E<½Cƒ3¹*þz›¬îÊý'^?âÓuÙ[$O/PàÅ)\?âÓõe~÷+]ÎÓõ¹kÑ<½CƒG¹jîvŸ¬íÉܵo;OÖ;–¹ËÔ81dÆLVó”ýc¹zîf³œ§ëËT‰åê2½ÍVsuŽåûÜÕg9XîZ”O/PàŘ9X?âAÖ;—èÉÚ±ÿ±Ü´Èž^¡Áƒ5Üõ_9Xî_½ÏUóuŽå¤Dòõ Á“õcþ$c¹~‹«Ï‡¬w-'—¨p`Ï‹ «Ï‡øÉÀu^|?ÄîZO/PàÁAÀu>|?Äî^…‹R?~/âw+ÔO/PàÁGÀÕ|_Äî_¼QçÅüNåvŠyZ‡ N¨óâþ'rýDþt_ÄîWHžV¡ÁŠ YSÞøÉÁsùÑÿ¹[¢yZ‡ ž ŸÎøËôY“ÞøÊÕÊÔ80V :aûÑÿ¹~ð|¾s?‰Ü¬‘<­CƒwËç3øÈ(%ó™üNåb‰åj8 ƒÊÏãÿ…èQÉwŠíDòµ Zœ­þ+÷D“•¿Åv"yZ‡AJñåoñ^…;Ç•«¥ÊÔ80sæÊmM‰WSPùM¹iG‹‰‘ÈÆµ j @®‘g-|²ýXÒÇÆ}Ù5Pö>Þµ× ˆ2°‚:‹ÔY=W#d9AjÄÈãlLÊÆ€Ö€Ð53|‹Ÿã[?Õ– tѺ9rŽØ|n9®¤õŒ Ó¬´:ZH-Zêh)£±°½‚û€“€’nêÕÅÆ®Ñ^YèÙþ¨;ªôý­¶gap[V@²r>Ù¢iÝ02½ó\\p hZåG–?4m/ºþá9'ò GŒaŸ”*gØ4¯°kìs$Ú=n“œp#Ϲî}Æëµ›µ%÷«š>Ã?(_¦šF’ Œ¨ƒ#w®m³mÉZxe’JZúúc3¤5—°Úéd—%¤´K …®¹Þ |¥ÑßçGµnôÑßçGµnô6µ’-QHEmMÔ“ç⚟pv°ê{\Â÷yu~I¶Ñ¥š­›H>¦˜ÒUÌÁ}DW¼†¸fð‹³°4÷Úï¸]¡«|tsUÔËpBÂ÷»8 À}@ÞÐ)[ ÞÌCm÷^çýPRQdõ=^jéjjXçºGNËØ[0|’J¯mà5ÓHFÓ¯¾.¹[©twùÑí[½4wùÑí[½]U•43Èç‡QÎgŒ4‹‹ŒoŽãõ]!ä×r«—$¨*_+*f©š…îšABç4FÇÌ$ps@’÷ eÔ\@ÆnæÝ£ÑßçGµnõÏO,uSÏ 2GÀó˜\.kƒCˆ¿‹ˆéÆ‚d´n©edÖ¥|Õñ¸9•oÍ´åcFÆssò8^Ûï"ò@¹vØö5=ì…ï’J™ÝQQ3ÚÆºY.!kA¸ /ºóy$›mþt{VïMþt{VïA¤“%¬éì[6ÈŸ=-%y¦4¾ã#s€‡$wÚîZ þt{Vï\õÅK-¦®¢H±]àÄàZ/ûøÁEÂË(≱ţC/ÃG] æósYsNÇØV'¾VÊ?÷:vÕÍ’vµ¯bÕÅd[&–WU¹´¯Ž¾j—ÀÜÝø\e`s›{o.$c놮œžù[(ÿÜê=ÛVî&>¹Q”ÖÍ ¼lÛ+C`Žig¥|îÍ$Œ¡²2ì9¢|·âò]¯‘ÖÖ[6û´Cÿöÿ÷+Ÿ)¥l?¤$q8YMf½×_}Âz¢xµñÅ­_wUcßv~OãQØZËš¥Ã¢–+Z’Ï´r9jMÑÄ ¸<‚ØË®pi}ànkð–®«3ƶ?+”GaÓÖ_i›Rk*jxN:ȞƆÆ#‹-¸k7‘ªó¬^·ˆáÉ+z¾®¶K2ÓÏ>M Ø&ž&Ç!cÁŽF·½Î0†’[pý  ¯=6ŽXSÐÛl³ÛNf`©e$Ϲí™íkÃXˉx p{Ž ÖF+Ÿƒå¶ÎU6ž¦¬›F®{b5ÔöƒéÍ,æ) Îd‘ÉcÜÃpñ^ ŒŒKµýRÙSÂéê krŽá¬lÍý¬aÇzN³{¼â8‹É¼š:?ù÷(>ê“ò½Y*ßþ}ʺ¤ü¯VKú«êü?‘«/leEdÙTÜžÉêë1µ”ôóM\ÚºwÊèËs€½— ÉŬw¤qƒuoéºZ ž³¤Ž¦®ÓœÑj žÖÑLð ˜æ›±5¦ëü|’ ´†‚«OõqÕ‡™S+Ý3ß{ZÒ^ò\ÒÐ[]q pÆzÑ„ÄL=ŸÍü:ŸÑ„çŒÅCm–¤|»É .X¬˜³Ì£™£]ü¶Õĺ¿G_¤{cô`e_ SPàҷ7¢1í¿e¾üNw˜9<«1—õ¶…³‘­’¦Êud-•ãd.uíÃÉpó„‹Æ«ï “ô%L)lŒ¸`_EÿôÔ.±/þÓé=ójÊü?.\±ù£i}×÷ «'¾mY_ƒ‡òË–?4m/ºþágÚ´50}†~P£ÊùME#ÈkkйÄù®‰IQãØgå ²«(kêi磟#¤ª¤”¼9“ÔÀCÚI79¤‘åâÖ¬"ÜÚÔ.  Þ¡šÔ¤épmõà»ÿ¥6wZ™8.ÆÿéMÖ¦UQи?ô%l9¤j«#Ëþ-ë_iÙóZù'kÙ´Å¢zºªxËÍÍÄøÃE÷y/+9jÕZ5y)S`Ðdƒ¨a’<ˆê¡Àˈ"æ‚5jWó[5¶cãm5}áÅÎlñÆÖßuþ7“ÞòyGýË:«(a*L‘µ.v¹).q.síOœãÇåPÉY•îi ÉKD¬Ôÿk;¯¶¾‰ÏëÐïNëí¯¢súô;Ö8ñ¹aZµÓí»rôކ3-æ^o=ÿÆ·NÊÛaÂçd”ärèw¯=ÔZ¿CåõØw­ÎW‘6øöUWXÓwMEcVÒT¶zxã”Ò5Ù×—E©¼fòíCë_aÊ—rWï*=ÉNê-_¡òúì;×ee«n[¶<óØrPÃFù\÷º¢9Œ´ji¿Žï'•L²¸#]""æÐˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆƒ¾ÌñƒíÊåŽÊûqµ¥§E]4Tô¶S¢’:yMÍšö 4‡ßv6´ÞÖ³‹ ‰7 ³ÚuVcXêK.Z÷¹÷–²VF#Yqúü€ñ/-]£^ë^x'´¿GñÕÍNo†Iª s£:zN±Ä8¹L&!™‹WdnOI”u’[¶µ;ô9)ŸKOCq:XžCœù¼Z.®ßÇsr›'ò’’С}Õ54¸…¢Ç·8Æ‘ª*‚÷øÁºòœæcCß fUÛ°1™#3Z8€®‡zýî¾Úú'?¯C½'+›"*)ËÿϹA÷TŸ•êÉSÙÆº«(-[N²Ï}jYY¥cÍì[IåÅ\,OëN‹K&¬œ©²ÙElRº¢ž9Y3ÙŸÍa¾öxœáwµó'ä…‘ߤ“]Xi㱟M-EŸM$~fH´fâqy8œ],„ w\Ào”¶¥$ÒEO“u4€ÙMTLÅs@¾ëøµyuÿ¢®´í[y®ýÁ_™¿7¥MM. î¾ìWÝ}Ë+Q+åŒTKçyeo £§u <š>u²‰;ÛîäÆåkú.§4Ô™iãàÚsÿj• ÐìŸþ”Y]JMË¢*‡PÐWRÙY›¦Dc‘Ô²ÓG‹QÛ¯»þ%+æØ©»vä÷Í«+ðpþ@¹rÇæ¥÷_Ü.ûžZKϦ¸eŠš8ÞÛÁ¹Á xú×XüÑ´¾ëû…=´ÐÔxÁöùBám¡D÷µŒ¬§sœnJ 'ø®ê>Ã?(PRM(³(˜$xf‹ÂnñmAœ­ÊJúYm™ÙfSIgYº¢SXæÌæˆY3‹#ÍHkî¼^GV“[ö54O=¯A1ÎiŸ#êXÖ¶P/1’N§û¼kŠ›%è8rÒµk¬ú Š™ªÙ=4ï…¯’&¶˜"/9Ž"ãårÃbZ–tÔõ´£©¨ŠJða–wDÃE@˜;cŽ Ð[†îøëÕ¬-ê-ª Q%£_AI sˆCäªk{âÀü.Åv\IÃyïn>[„òZtZ1YÒWS2ºV㎙ҴHöëÖ}äw§_Ôy‡#+©¦{aœÐ8R³dôvJ6™‘b$@FbòuÞÝwÖfOVÙÐ`†ÍšÏ’Zyžù1ß Š(£ dGþ%¥®2^ÒëîvùP-¬‹zζì¸+èêc1ËNÚ‚Òö⮿Ûˆ-x?[\<…tp•M¦Ú·zæÉú*»&È¢³fÍÑSGsG!&L·ihÃ{ZÇq›‹ˆýÐç\i3óòuÊ é´ÛVïN é´ÛVï]úLüüršLüürƒƒ„¨:m6Õ»Ó„¨:m6Õ»×~“??'\¦“??'\ àá*›Mµnôá*›MµnõߤÏÏÉ×)¤ÏÏÉ×(88Jƒ¦Óm[½8Jƒ¦Óm[½wé3óòuÊi3óòuÊ é´ÛVïN é´ÛVï]úLüüršLüürƒƒ„¨:m6Õ»Ó„¨:m6Õ»×~“??'\¦“??'\ àá*›Mµnôá*›MµnõߤÏÏÉ×)¤ÏÏÉ×(88Jƒ¦Óm[½8Jƒ¦Óm[½wé3óòuÊi3óòuÊ é´ÛVïN é´ÛVï]úLüüršLüürƒƒ„¨:m6Õ»Ó„¨:m6Õ»×~“??'\¦“??'\ àá*›Mµnôá*›MµnõߤÏÏÉ×)¤ÏÏÉ×(88Jƒ¦Óm[½8Jƒ¦Óm[½wé3óòuÊi3óòuÊ é´ÛVïN é´ÛVï]úLüüršLüürƒƒ„¨:m6Õ»Ó„¨:m6Õ»×~“??'\¦“??'\ àá*›Mµnôá*›MµnõߤÏÏÉ×)¤ÏÏÉ×(88Jƒ¦Óm[½8Jƒ¦Óm[½wé3óòuÊi3óòuÊ é´ÛVïN é´ÛVï]úLüüršLüürƒƒ„¨:m6Õ»Ó„¨:m6Õ»×~“??'\¦“??'\ àá*›Mµnôá*›MµnõߤÏÏÉ×)¤ÏÏÉ×(88Jƒ¦Óm[½8Jƒ¦Óm[½wé3óòuÊi3óòuÊ é´ÛVïN é´ÛVï]úLüüršLüürƒƒ„¨:m6Õ»Ó„¨:m6Õ»×~“??'\¦“??'\ àá*›Mµnôá*›MµnõߤÏÏÉ×)¤ÏÏÉ×(88Jƒ¦Óm[½8Jƒ¦Óm[½wé3óòuÊi3óòuÊ é´ÛVïN é´ÛVï]úLüüršLüürƒƒ„¨:m6Õ»Ó„¨:m6Õ»×~“??'\¦“??'\ àá*›Mµnôá*›MµnõߤÏÏÉ×)¤ÏÏÉ×(88Jƒ¦Óm[½8Jƒ¦Óm[½wé3óòuÊi3óòuÊ é´ÛVïN é´ÛVï]úLüüršLüürƒƒ„¨:m6Õ»Ó„¨:m6Õ»×~“??'\¦“??'\ àá*›Mµnôá*›MµnõߤÏÏÉ×)¤ÏÏÉ×(88Jƒ¦Óm[½8Jƒ¦Óm[½wé3óòuÊi3óòuÊ é´ÛVïN é´ÛVï]úLüüršLüürƒƒ„¨:m6Õ»Ó„¨:m6Õ»×~“??'\¦“??'\ àá*›Mµnôá*›MµnõߤÏÏÉ×)¤ÏÏÉ×(88Jƒ¦Óm[½8Jƒ¦Óm[½wé3óòuÊi3óòuÊ é´ÛVïN é´ÛVï]úLüüršLüürƒƒ„¨:m6Õ»Ó„¨:m6Õ»×~“??'\¦“??'\ àá*›Mµnôá*›MµnõߤÏÏÉ×)¤ÏÏÉ×(88Jƒ¦Óm[½8Jƒ¦Óm[½wé3óòuÊi3óòuÊ é´ÛVïN é´ÛVï]úLüüršLüürƒƒ„¨:m6Õ»Ó„¨:m6Õ»×~“??'\¦“??'\ àá*›Mµnôá*›MµnõߤÏÏÉ×)¤ÏÏÉ×(88Jƒ¦Óm[½8Jƒ¦Óm[½wé3óòuÊi3óòuÊ é´ÛVïN é´ÛVï]úLüüršLüürƒž)¢ž<ä22F_‡¿’ñþ£øªl±ù£i}×÷ â9úSœâç£y&ÿøQ*|±ù£i}×÷ ìhj<`û ü¡rÒüŸEøX}ÛWUGŒaŸ”.Z_“è¿ »j QT~&ei°$ís©SA#œ\ñ›ûWF\»Ã^uaÖ Ê: ›*Ç««©¦¢šÔ‚9`§–v‡9ÏkNßv" €Ô<£•º*áoØÎð ^€ÌÉÛLèÅK16Wd_©Äµ×7QäSÇiÐKhËgG]Lú蛎JfÊÓ#«Ym÷ß XåAÔˆŠ" "" ª‹v(k梎†Ñª–×I¢ÒºPÐáªüq? ^,sšocØîõǸÜAÁ*‡_è;wÙÒnN íßgI¹oÑ*‡_è;wÙÒnN íßgI¹oÑ*‡_è;wÙÒnN íßgI¹oÑ*‡_è;wÙÒnN íßgI¹oÑ*‡_è;wÙÒnN íßgI¹oÑ*‡_è;wÙÒnN íßgI¹oÑ*‡_è;wÙÒnN íßgI¹oÑ*‡_è;wÙÒnN íßgI¹oÑ*‡_è;wÙÒnN íßgI¹oÑ*‡_è;wÙÒnN íßgI¹oÑ*‡_è;wÙÒnN íßgI¹oÑ*‡_è;wÙÒnVT³:ª‘µ¦¨§qhŽ¢3õ]¬´ë~]ËZ©­?~Ùü­Ra\ˆ²ˆ€ˆˆˆ€ˆˆ¸­›C‚l;BÒÍgtJi'ÍâÃK®¾ãu÷qܽÉiÐEhÅgI]LÊé[Ž:gJÑ#Û¯Xm÷‘ÞQäTu"âŠÙ²ç’xâ´¨ä}<†f²v“ŽvµÂýN.ÔÖN¥öÝVM· ì«¡‚ '2R½²µ€—n'½#Š*Š+u¯¢–KJ6QÔÓÕ¶Žx˜ó+[#ÜÑÎÂ/Dëîc¸ÜA¹%½vL4ÑRÒ¹±ÍS=@ŽçæŸ+šÖ‘¬µ‚7x^ã}ì!º*º»v–[5<ÕDÊØèª32‚èd{Ä`?x=콤‚'YDÏ3iéä™à–ÆÂòÀ^ªbÊ&Ï &†Ç¶äŠF‡1ì³ä-p:Á aXZ_%V}Ãÿ)Wy+ó>ÄüíªÄ ¿¿Ðvﳤܜ:ÿA۾ΓrߢµÀpëýnû:MÉïô»ìé7-ú%@Àpëýnû:MÉïô»ìé7-ú%@Àpëýnû:MÉïô»ìé7-ú%@Àpëýnû:MÉïô»ìé7-ú%@Àpëýnû:MÉïô»ìé7-ú%@Àpëýnû:MÉïô»ìé7-ú%@Àpëýnû:MÉïô»ìé7-ú%@Àpëýnû:MÉïô»ìé7-ú%@Àpëýnû:MÉïô»ìé7-ú%@Àpëýnû:MÉïô»ìé7-ú%@Àpëýnû:MÉïô»ìé7-ú%@Àpëýnû:MÉïô»ìé7-ú%@Àpëýnû:MÉïô»ìé7-ú%@Àpëýnû:MËÓ-·½í`±m¶—/}ÚÑþ¤êë:–õESþVo°ïè•€Bs ¶ûÉâÕÇýîi"?àíÊSþ~ÿ3úʲ©sLéÿn\m¬‚KF¢†7ã–Œ|„1â¸kò÷¿÷]Óª;;çu¹÷T¿Ñè-鼯Åu¨Ëš6—Ýp­é¼¯Åu¨Ëš6—ÝpžÆ†£Æ°ÏÊ-/Éô_…‡ÝµuTxÁöùBå¥ù>‹ð°û¶ ¦¯°%­µm ÆÎÈ$’’èçh.}<ñºsœ»Uâé@ºûœ14ê&úK$-ªŒ•¤±âšsvK(Ktù©£ŠPÂ×Itm9æºö÷¯ÏùÜ·ˆ–1µy%_=\ š˜:jKZ’ç\U8’;õq;îCÅzšÎÉièíñS dEWQWήǦC„SÞ"aÒ1ÞëÀ=è/½ºÄKDPWØtºnQe58¨žÎŠŒ¶h…ìpÎGÜ@ÔAiâ ‚AìªÈ)ì·YðZv•SQhF5÷÷4‡ÆàÀ3²\# :àkCfd™°CY¼ÞNm¤“õ›µù½!þl{&îZ´{ É8(mԺѮ¨†*¹ëié&Íàšc!{šZÀóªYs…Îâ¼ù'u¢ê–Ú5ÔðËWmE$9£óBc,s‹˜^5E!®h¹¼W’O!þl{&îM!þl{&îMÃò ¦†–7ZV””tÏ€ÒS:FS2Y#ÐÖñ|Ln) Ýp788”ÙfÌ#&z¶¾'ÔÉÃÛ{$š¥•XÇ{q,–6‚¸\àë×îÿ6=“w&ÿ6=“w&ágdÙ,²¢ŸüLõU2çª*gÃŽWák!kEÌcÞ´x7›É$Ø,æÿ6=“w&ÿ6=“w&á£EœÒæÇ²näÒæÇ²näÜ4h³šCüØöMÜšCüØöMÜ›†sH›É»“H›É»“pÑ¢ÎiócÙ7riócÙ7rn4YÍ!þl{&îM!þl{&îMÃF‹9¤?ÍdÝɤ?ÍdÝɸhÑg4‡ù±ì›¹4‡ù±ì›¹7 ,æÿ6=“w&ÿ6=“w&á£EœÒæÇ²näÒæÇ²näÜ4h³šCüØöMÜšCüØöMÜ›†sH›É»“H›É»“pѪkOƶ+W.ÿ6=“w//•Ò†áy­ú$ʼ""È""" """ ®·è%µrrÔ³ s5]$°1Ï$49Ì-Ü«Êâàºø­zÃ4PÖÕÅY$•q|Nc#ndžçØ‚Œa.¿ Ãß_"£ ü¯« ³(+@êk2i Ý «‰³Ó½î{Ka-§»ï¾âàæÒÔ±k$°ò¾ZÉfµ[#©£k®$šXâ“p¹‡ËuÄkZTKªümµZÚ¨êji¨jàÎLÈɆLðilRa-ÔàI.‚ë°.+[$«í™ŠMMÂ2º¢zÉ\çat²ÓMÍ7^Z×Jƶýb6®àÉÆN×±%epu Jë.a…„ÛORù^Mà ZukÖF¬´b"[KäªÏ¸å*ï%~gØŸ€ƒÝµV \Ö¹§Qk…àýD56ÿ6=“w+CF‹9¤?ÍdÝɤ?ÍdÝɹ4YÍ!þl{&îM!þl{&îMÃF‹9¤?ÍdÝɤ?ÍdÝɸhÑg4‡ù±ì›¹4‡ù±ì›¹7 ,æÿ6=“w&ÿ6=“w&á£EœÒæÇ²näÒæÇ²näÜ4h³šCüØöMÜšCüØöMÜ›†sH›É»“H›É»“pÑ¢ÎiócÙ7riócÙ7rn4YÍ!þl{&îM!þl{&îMÃF‹9¤?ÍdÝɤ?ÍdÝɸhÑg4‡ù±ì›¹4‡ù±ì›¹7 ,æÿ6=“w&ÿ6=“w&á£EœÒæÇ²näÒæÇ²näÜ4j*Ÿò³}‡EC¤?ÍdÝɤ?ÍdÝÉbSþ~ÿ3úÅ ”¾#ØÖ‡_ s .mÇP7‹÷õê]®ðªlµ1JÆÔËåbÈ_Çuà~±ÅåÔ©»—ÓöÎÙ…k*›v‘42~Í€æâ,¾A~'kqïN«›Æ.:Íúª¬ïÖçÝRÿG§s²ú~ÙÛ3°º¬Ë–eELú]ULµ{êÒnm÷]sGœPvÓx5_Š>ê%Q–?4m/ºþá[Óx5_Š>ê%Q–?4m/ºþá= GŒaŸ”.Z_“è¿ »jê¨ñƒì3ò…ËKò}áa÷mA*,NS[UÔ6å|tõõè¶lU4ðGJ×Á$¥Ó_ŸÆsl9¶KØÄo.í,©³ì«r’Ê«8%ªÀüô\oqcFopÞàá„ õ!Bíj§-ìÚK9ÕµÔß1›7˜÷ÜO{ÃFm÷µîkÚ[sš h=Ðå%NOGlÀ_-<ޱŒÂç:S&h0p’dïqbÃåŇZP·E‰‡,%§µ-×ÒZM{jsTô´åÀÑ´8:ìXê/ý×=×ñ4ç~,íJª)j0hÙàùq±Úâk ͵ÆQpcõ¹€:‰ÄÜJ„YéòŠ­•–\YNúšÑO,U2ìÙŠWãkšòÍF=cp÷½óoÙiHÚhçàúòÚ†Ç%+ëù#Œ9ÿz/š-R`7;‹Q¹CJŠ®ŽÞ¥­¬Š–(æ—J¸¸ ¿ÃÌØ_åò¹À«Žî%h‚¡³[–…·_CeÅgR2'9ÕR=¤ãë°ƒæžO"êà̱æì-¼Ý…ÉCYQCkeLôbUš¢d-á­sÜ^Öyhs‰ 5¥ÍÄ뛉·â _-íJ;µ¶|0ZPÒ>²Òd÷74×<6ó$±ºÌ¡ÌÃ3£sH –ŒzˆG_e7amæì'e7amæì.KÓµ,–²ñm u·jSÁK 8'cÛ-T·ç&^bs@-g† wzo[Ö©k5÷(¨hm».žjY¡Ç;Þéie¿8Ù06ã+Z@küC»ár uðfXóvÞnÂpfXóvÞn¨¥Ëœ¨ª³©jßgRQ²Ôe4´/¨c²ÔAØP_0 žüWCqkoýÍìîÒØ€ÇÌ¡’J¹e¥§{!{2E[žà^qµÎ›8 KCpbq8 uðfXóvÞnÂpfXóvÞn½°m Ê·ZT•æ *¬ê±Lù ŒÆÉoŠ9Cƒ œ[p”6ìFü7ê¾áp•Á™cÍØ[y» Á™cÍØ[y» j‰P1\–<Ý…·›°œ–<Ý…·›°¶¨•Á™cÍØ[y» Á™cÍØ[y» j‰P1\–<Ý…·›°œ–<Ý…·›°¶¨•Á™cÍØ[y» Á™cÍØ[y» j‰P1\–<Ý…·›°œ–<Ý…·›°¶¨•Á™cÍØ[y» Á™cÍØ[y» j‰P1\–<Ý…·›°œ–<Ý…·›°¶¨•Á™cÍØ[y» Á™cÍØ[y» j‰P1\–<Ý…·›°œ–<Ý…·›°¶¨•Á™cÍØ[y» Á™cÍØ[y» j‰P1\–<Ý…·›°»!§­‚•¢ÑÑô¬nåÅ€\¸¸xù÷:•MiøÓöÏåj“âÈidŽ8ZIŒȼ⃛“h;)QãØgå %ÇlÚ-³à¦t0’ùêá‚÷¾ðÐç€MÀ w_w×üb£Êof¹Ó~p¯^RÕÏgä­±[JüÝE=ÒÄûÂæ°n:ް8ÐZ"ÆÁnÔÙÒº|í·jÐálo”-¦‘³¾Xã…±âŽàìoÄMàan¶ßßvÚY[IMIZ÷Ã_ 3QuÑ6",-y‘±µÎ'sR\^ÐÒYÆA¨iQeÝú@°cµ*¨¥¨Á£gƒåÆÇk‰®tƒ6×EÁÖæpê'qO>QU²²Ëƒë)ßSZ)加F]›1Jüms^Y¨Ç¬b.÷¾mêY¬­Ê)¬«*ՎϦ©šºžÏ}I’!`ZüvqýŽ748÷¦ñ¬^.lim¹¬¶½îš7K,,‘Ï|aÅí5Æ[Æë,áÔN&âPÒ¢¡*#ž cOe×ÏSP×HÊff±ÚLæA›ûHõµç»®ÃË_–TT¢iŸ¥rò"csÄR>¤°µçn`XiÅ„qbJ„Y©r¢aiÙÔ"Ë©‚¦z¶E=<ù²öÂø¦sdid…—b…׋ɹ®ïo-½fåm%M%Ù |ÔÏmáÿ”¨¬«f²Žƒ%é"} iAH'2’_Š@ÀH?²¿ °×6G4Ç|nÂ]b® ËnÂÛÍØN ËnÂÛÍØTe}»ed ‹WáZªK+JÓ¾œas ˜]#çi"9pl¤–—`†ºÂ¯-í‹.Ψ¶+)hf¡m]£K <%í‘Ú0©{^ç’@¼S†g/Ü¡|–<Ý…·›°œ–<Ý…·›°¸&¯¶¬Œªµã–¦’²Øª¢³á¢m-žZלu-,}@†2W^ehÔ5pw•”Ö¥~S8Çv¡=œ÷Oq¾m"çÚýx´r0‰~ð÷ÊwÁ™cÍØ[y» Á™cÍØ[y» Ùko­‰Ù›˜±(ŸUT\Çâ¨tSÕDö0b¹â›q.Íßq_x¯Êl¨·+줎[28ìyií:¥q‰‡1ÎÜMvx¾BL.ï-¸8œD2÷*ÿe7amæì'e7amæì. )¦É‹BÑŠ .ͳçÙL6} /¥kg«|.”ØÿjæÞy¨E|ï¼yA”œ)”†Ïlt2ÃIjÃu1·ÍÕYns1^nïæxpåžV›Õïƒ2Ç›°¶óvƒ2Ç›°¶óvVRÛL«°²ÑÒT>ѱäu ºQQBÖµît·J[o4„ën+Û °òŽß®Ê ;*Ѧ¤¥{YTú XÓ#Äbœ²æÇ4‚þ'XsžH`=î1r ~pfXóvÞnÂpfXóvÞnƒ)kí+Bjˆ¢–’>ηlÊYbt|³8ÍK.6Ɍڴa,w‚u÷Ýí}.\åEUMVû:’–£)¥¡}CDm–¢îÀÊ‚ù€l÷⺋[xïîj [ðfXóvÞnÂpfXóvÞnÂäîÒØ€ÇÌ¡’J¹e¥§{!{2E[žà^qµÎ›8 KCpbq8ÇDYC”•9FrvÙBª TW>žL)$k›’þ*¬¦O&6æ_SËfWûé<‹ð°û¶ ©´òjRº¢¢JêÈ¢ª¦e%U4Y¼Üñ4¼áq,.ç kšn:®"ô¬É¨jëP+« ŠJ˜j禋7›šX‹ \âæ!®æò’MÚ%Š’´í{+ëÛSŸlñT—±Ïˆ†ÅØšZóÎasÞA¸–´·¶[)ìgÍQS%Îl‚¡ïA+^$lšÆÃÀpmØEÀaÃÞ«AšnEÒ½.¦Ð¯ª©3‰Ý,¦ \àêw ÃÑwøXÆ¡Ä]å Ž§dÅ,šT2ÕV>Ï©ÏÐgb¾\YÃ{@y¼½æç8€]x pÝ¢X¨ŽÀᚪӯ«©‚vÍó9€²àæá cË‹_#IȇqÞÖ–òG‘ôLm;WY,T™¦ÑÆ÷0 hÙ,rÚCAsI†0KËsuI'D‰b’ıŸGUYhÖE *ê¤s›2ºHéšCq5„†øoi‘Ä5¸œíwá]¢ ‚ijɶm÷ÖÑ™(+a‚$‹&¯iÅÎߨÞG*¶¬°²zЧ¥§­°èª`¤f xæ l-¸ ˜ nh¹ \9"àElYÒÙ6% £=£GdRÓ×O‹=S d’b8‰Á·›È߯RªÉ±+­-Ë"–¢º 9š™¨ƒä ÄÜ.-¼\I"î"«7 8l›žZ™a²)c’ªVÏPöQ™dk±µî!½óƒ»àN°uñ©CeHDZöl.cÙ+ÓIxsev)Aïu‡¸^áûÇY½T"nt0PY”qÑÐQ²’–;ðC1¼’nh É'þ«£Hg›&ÉÛ–qpÑé ódÙ;ri ódÙ;rÎ"n=!žl›'nM!žl›'nYÄMÃG¤3Í“díɤ3Í“díË8‰¸hô†y²l¹4†y²l¹g7 Ï6M“·&Ï6M“·,â&á£ÒæÉ²väÒæÉ²våœDÜ4zC<Ù6NÜšC<Ù6Nܳˆ›†Hg›&ÉÛ“Hg›&ÉÛ–qpÑé ódÙ;ri ódÙ;rÎ"n=!žl›'nM!žl›'nYÄMÃG¤3Í“díɤ3Í“díË8‰¸hô†y²l¹UZ'ƒ®py#HýÖò®I‘沺’ŒÜµP1ጽ®;ÑäU­}”Æ5¢ÐÔÖÆÑ}sɺ3{o%×’O„N· N¼jRIaYJùe²¨_#ÉsžêvâxÉ7k+ÏsÖ'¡ìÿVfå~PÖSTGf²ˆ¤p´©‰ x&ìc‘h•|v‘ ¬–+*…’0‡5í§`-#ˆƒv¢¬-§A«eVYӹ톮À÷0€à×4´‘}úî+©rÚZTÌ‚g=­dðÎ r6F~KØ/ú¯âT6ÆG2ºÍ´`§«›öÑTº–šW4C ó2FºKÃq›Ì²^ œ3pÔÛµ‚‘Ù1K&• µU³êsÅôÀد—pÞÐo/y¹Î ^ÂÜ2G` pÍUi×ÕÔÁ;fŠyœÀYpsp†1eů‘¤áÄC¸ïkKmÑ%µ“PÛZOøêÊ=.›DªÑ³g=}sN6:ë³ÖÛ|o¾át‘äôQO1m}{idt² FL#c!q{ƒš—’÷›‹È×€ [†ÝP³%£…‘¾ R¾Æ:WÆf±¸HZçŒ3±„á`7‚o½Î.å¶r6 ëЦ¥žaQ>rXŒò—7:êCJ18‚âÜ$Mî¿]ç‰j,RE“P¶©•µÕ•UñÉÙU.l<€Ì,cY†ée½¿ö‡]ᥰQä} tÐCWY¢C˜s鋘Y4µŽG8ƒ†j=MsZp Æ·_¢D±WA`ÒÙÜ™’gpm¨aÆAÅÍëuÃ[¿dÞ+†³«’Ñ={-UlsÞèžÖµ¢òIಱlêhl{×Ð0Úu#"d§Æøc xk®7_uÆã­r¢DÐï­°²zÒdl¯°èª™ä{=xkžìO"öê.v²|§Y]‚™¼4lnjWÏÔÄ`‘ø±´¯ŒRw®… †ÆF‹s€oÄyTo²lI+*«$²)]UW‚¦gQù£ Ç» îmÀ Ž­AV"nt¶M‰CgOgQÙ´ô3âÏSCD˜†bhmÆð7ñ„ŽÉ±"Á›²)Y›Ãƒ pæðÝÞê»3Ü™¶y¢êÄMý–OGQWPˉ³Ö±ìª‘´:v¼Þðó†÷dïò®Š:*Îd ¡³a¥d {!l˜m{ƒžu8@ã ª7 :«&Ä®´`´k,ŠZŠè0æjf¢’<'p¸¶ñq$‹¸ŠCdØ”òÔË ‘K•R¶z‡²ˆ4Ë#]¯q ïœßuƒ¯V"n¤cØû61앎i¤¼9²» ÷ºÃÜ/pýã¬Þ”t6UœÈCfÃJÈöBØ)0Ú÷<4êpÆ@%T"nðPÙTµTSٰÿMÃD“}÷ç;ÞþüNã¿Â<ª±p·¦¡²¨©é©é,Ø`‚•åôñÅI…°¸‡Xni!ï8ò•Ù¤3Í“díË8‰¸hô†y²l¹4†y²l¹g7 Ï6M“·&Ï6M“·,â&á£ÒæÉ²våó5ôò5­¸°€3näÿE@‰bZŸóS}·U"€ˆŠ©¼¯Åu¨Ëš6—Ýp­é¼¯Åu¨Ëš6—Ýp¯±¡¨ñƒì3ò…ËKò}áa÷m]U0}†~P¹i~O¢ü,>í¨%E‰µí ë#.+k©¢Ò`àÚXK‰¬Ç+䨜d/6;¸¿mˆêb†É®µlÜš¦ £—N¶[^é¢5ÙÖ²ªA$˜LÑ5½óÙ«ðµ/!Cx‹ce=©mÚ,ŠÍ¥³h´ØÍT’K¤sn§£x$4·8ïÛ–q·PiýÜ.º–Þª¨É[2Ô£Žg¯Ž)Dr3˜Ìãƒ#¦W‚p‚ ÁÄå ,Õ·__S%DsÙQPÓÏ<Œ/sÄÎ’8ŸŠ9ïïÛÑ€â-Û½¤ Ê;f¶¦ÈdbʆºÔ¤£–J“F÷¶HêåÁ‡8 Í;î7<ùn @E“ÉËR¾ÓÊk@Ï30R2ÄÖ» ¥eMTFFîð8Eyn³­£{¯=4ò‰ ŽfSJê›fyDù£žkcµibk É7‹®CS#¹­C騲y-”V½³<¯³ÙOI[I¦Sckƒogz•î] ½å±Ýp½½ðX‚šŠË–ÝÊk^ -[F–*XéÝ)dkEï¾üM>hâúÕ·pÍúEníãøjˆiš~SèYü_ü7=£ßœÑóŽÏàÃßbÍg.Áßßà÷×.‰°‚ÇÝ_sŸâ:^“žýŽoÅÿŠÍÿ™ñš¯ÿ—4µµîŸH­Ý¼ G6GSÓ0>|¨¶¢a{Xú˜š œàÖlã. å$MMU•4ös(­:{V[^¦Ð²ç’H]PHÚ‚^Îñ­Î2pæ4ßs‹°à%ʽö=¶üš°"ª}¹Vj¬új»[=,¦FI Eîhälf{ƒ{Ëo8Þ/Tk{†gÒ+woÃNá™ôŠÝÛÇðÖJÓ‡*óùC,uÖ®š´0SÓÑÔáÍ`—FÁ)—1‹Ä™fw£ÿ­&VÏMKDùm–Q²ÓÕ#ªóò´QÌö€èÿk(¼0—ím7›Ú냧¸f}"·vñü4îŸH­Ý¼ QQœ 6•§®~nj\ìÎi‚’–½Ïq”8‡â’žjxõ‡=Æñ%×¾ƒ)Ü3>‘[»xþw ϤVîÞ?†µhƒ)Ü3>‘[»xþw ϤVîÞ?†µhƒ)Ü3>‘[»xþw ϤVîÞ?†µhƒ)Ü3>‘[»xþw ϤVîÞ?†µhƒ)Ü3>‘[»xþw ϤVîÞ?†µhƒ)Ü3>‘[»xþw ϤVîÞ?†µhƒ)Ü3>‘[»xþw ϤVîÞ?†µhƒ)Ü3>‘[»xþw ϤVîÞ?†µhƒ)Ü3>‘[»xþw ϤVîÞ?†µhƒ)Ü3>‘[»xþw ϤVîÞ?†µhƒ)Ü3>‘[»xþw ϤVîÞ?†µhƒ)Ü3>‘[»xþ”YͲé›LÚŠŠ’Ù|Õ{µ4ë ªÿ Õi•5§ãOÛ?•ªH‚YLnkZØîÀÓ®6ŸÝRñ¤?ÍdÝÉQãØgå ¶Ø×¶º™Í{c{\%i²1‘¯‰ÇSO”ñ^²®l¢®¨†š…±¼ _ÆoJDPTÞ W⺉TeÍKVôÞ W⺉TeÍKWØÐÔxÁöùBå¥ù>‹ð°û¶®ª>Ã?(\´¿'Ñ~vÔ„16wÎ"`™ík hÄæ´’>P púÏ*媱¬ºêQKWfÑÔS‰ Â)`kÙŒ’K®"ìD¹Äž=g•v¢Zk2‚í}- 4kp5ÑDÖۚۅÊèãr1¼%³('³…5 4”!­`¦|M1†¶ì# \.%Áu"Y,Ê m­(iŸ]pGRèšdcuêºð;ã«ë<«Š¿%ìkDQ²¢Ï¦t4Žid9–9­dŒcÒ5µ¢W<‡‹Ë}º ‚*:X3šhcÌFa‡`fã7w­»‰½ëu ]èä^ ™@âÂhi‰cœö“{×9âBF­D½­q>pŒ.¤AËKfPPÏQ=% 5<Õ.Ç<‘DÖ:W^Mî wÆòužRº‘~XôükZVƒ¦Úcah¾‚0ídÜxñÛëÕuÂlå¬îʦD±sÂlå¬îÊp›9cë;²©‘[‘sÂlå¬îÊŽJÊiŸåŠï…øâs¯%ŽÂ[{{ÝG œ/BG•U"\‹d §¬©¬†–Ž:ª¬:DÌikåÂ.n'^놡èá6rÇÖweS"\‹žg,}gvS„ÙËYÝ•L‰r.xMœ±õÙNg,}gvU2%ȹá6rÇÖwe8Mœ±õÙTÈ—"ç„ÙËYÝ”á6rÇÖweS"\‹žg,}gvS„ÙËYÝ•L‰r.xMœ±õÙNg,}gvU2%ȹá6rÇÖwe8Mœ±õÙTÈ—"ç„ÙËYÝ”á6rÇÖweS"\‹žg,}gvS„ÙËYÝ•L‰r.xMœ±õÙNg,}gvU2%ȹá6rÇÖwe8Mœ±õÙTÈ—"ç„ÙËYÝ•Ã[3f!ÍsI.$†ß«SG”EÈŠX¬®Ê(a¬|M³íIsa¬/ŠŠBÒ@ÜnÖ/òñr.né¢ôU³êܯRӴͬë>,ÛMŽe|9Òѽ­ ’nÕʵhˆˆ """ ""å–Ì žÎtÔ4ÒP†µ‚™ñ4ÆÛ°Œ$]p¸\<—Ôˆ9E™@Ø¡¦¾Ó:1pº&‚d]­ 9×7‹Yå^$±¬¹©]K-›FúwDÈLN¥†6XÒ.» I$!~¥ÚŠŽQfP6À(i„/´ÎŒDÜ.‰ khuÍâÖyWR"âŠÆ²à’y"³hã}Dšg2ƒ,v&¹ÆínÖ ÖµÚˆ8ŸcYrUTÕ>Í£uETFå04¾XȵÆëÜÛ€Z‚ê0ÄéÙ9‰†f5Ìl…£Zâ ù-mãê‹Ú ""€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆ"¦ðj¿}ÔJ£,~hÚ_uý·¦ðj¿}ÔJ£,~hÚ_uý¾Ɔ£Æ°ÏÊ-/Éô_…‡ÝµuTxÁöùBãŠ*È©à‹üÍDÈïÏI¯ @¿ÅýH'EÎJ-¼Ÿ 0ÖrQmäøiBTQa¬ä¢ÛÉðÓ g%ÞO†”%EÎJ-¼Ÿ 0ÖrQmäøiBTQa¬ä¢ÛÉðÓ g%ÞO†”%EÎJ-¼Ÿ 0ÖrQmäøiBTQa¬ä¢ÛÉðÓ g%ÞO†”%EÎJ-¼Ÿ 0ÖrQmäøiBTQa¬ä¢ÛÉðÓ g%ÞO†”%EÎJ-¼Ÿ 0ÖrQmäøiBTQa¬ä¢ÛÉðÓ g%ÞO†”%EÎJ-¼Ÿ 0ÖrQmäøiBTQa¬ä¢ÛÉðÓ g%ÞO†”%EÎJ-¼Ÿ 0ÖrQmäøiBTQa¬ä¢ÛÉðÓ g%ÞO†”%EÎJ-¼Ÿ 0ÖrQmäøiBTQa¬ä¢ÛÉðÓ g%ÞO†”%EÎJ-¼Ÿ 0ÖrQmäøiBTQa¬ä¢ÛÉðÓ g%ÞO†”%EÎJ-¼Ÿ 0ÖrQmäøiBTQa¬ä¢ÛÉðÓ g%ÞO†”%EÎJ-¼Ÿ 0ÖrQmäøiBTQa¬ä¢ÛÉðÓ g%ÞO†”%EÎJ-¼Ÿ 0ÖrQmäøiBTQa¬ä¢ÛÉðÓ g%ÞO†”%EÎJ-¼Ÿ 0ÖrQmäøiBTQa¬ä¢ÛÉðÓ g%ÞO†”%EÎJ-¼Ÿ 0ÖrQmäøiBTQa¬ä¢ÛÉðÓ g%ÞO†”%EÎJ-¼Ÿ 0ÖrQmäøiBTQa¬ä¢ÛÉðÓ g%ÞO†”%EÎJ-¼Ÿ 0ÖrQmäøiBTQa¬ä¢ÛÉðÓ g%ÞO†”%EÎJ-¼Ÿ 0ÖrQmäøiBTQa¬ä¢ÛÉðÓ g%ÞO†”%EÎJ-¼Ÿ 0ÖrQmäøiBTQa¬ä¢ÛÉðÓ g%ÞO†”%EÎJ-¼Ÿ 0ÖrQmäøiBTQa¬ä¢ÛÉðÓ g%ÞO†”%EÎJ-¼Ÿ 0ÖrQmäøiBTQa¬ä¢ÛÉðÓ g%ÞO†”%EÎJ-¼Ÿ 0ÖrQmäøiBTQa¬ä¢ÛÉðÓ g%ÞO†”%EÎJ-¼Ÿ 0ÖrQmäøiBTQa¬ä¢ÛÉðÓ g%ÞO†”%EÎJ-¼Ÿ 0ÖrQmäøiBTQa¬ä¢ÛÉðÓ g%ÞO†”%EÎJ-¼Ÿ 0ÖrQmäøiBTQa¬ä¢ÛÉðÓ g%ÞO†”Þ W⺉TeÍKW0Fø¢“:è‹ä˜ÉtNq`cxÈiò*l±ù£i}×÷ ìhj<`û ü¡qÀú© †g2•Œ•“yåÀ8æ]}Ç—þ«²£Æ°ÏÊ-/Éô_…‡Ýµr°OI”Nª¯6“ißS )*©ª@‚&»RE‹¾s¤/³n¸HÓ‰¸ogºœ¦¬‚δíHì¦KgQ¶« ÅUÒÁŒ; nkK£p9Ç[Ih¼áü­6Wt»‚íJª¸LrÊÚHå’"ë»Ç¾6œpÂ.s›xÀÛz.çž’Ê©}I›&²í¨l|F–£63€‡¹¬¿ àç^æ€ã‰Úûã}£Ê IÖìö]%•LúÌOtùûFAK!¥'Í;UópkGz]ÆâVK[“Ûϴꮺƒ9©1$k_M …®hj/¾üG[ˆÔ¾²¶†’¶Ûe¤lŒ¦„á—:Úzj˜]#Þ!hv68`hÃÄxøÆ»JJºZ½Ô™7m@Ö5ÌŠÍ‘¬¹ƒ nhsoûšÑÄÑr†N“**(èl*ÛCIÎ6’+BµÑU>APÇÓWIpa¹ ß+† KZ5FÒ´0åusìê©å±:;ä˜Ï ;XëïsŸ$-x Ã߃q4’"Ï-¤±À§iÉKií§”ñ±ô9¹¶2HÚÒ§ 3H5ß~-wÜ. [4@øÎOå3œç5Ù÷ÅTéÚ@ a˜»8О.ç¿Îuᦧ’ªhKßLÈì%‘Ë-äÐH~@p%Âæ— @߯W¼5œ”[y>§¥´¢¢ŒÅM`[±Å« bÏ—hhk[ÄրѨ\8Í×’¦á×úÝöt›”¡e†³’‹o'ÃL5œ”[y>­á×úÝöt›“‡_è;wÙÒnV…–ÎJ-¼Ÿ 0ÖrQmäøj·‡_è;wÙÒnN íßgI¹(Ya¬ä¢ÛÉðÓ g%ÞO†«xuþƒ·}&äá×úÝöt›’…–ÎJ-¼Ÿ 0ÖrQmäøj·‡_è;wÙÒnN íßgI¹(Ya¬ä¢ÛÉðÓ g%ÞO†«xuþƒ·}&äá×úÝöt›’…–ÎJ-¼Ÿ 0ÖrQmäøj·‡_è;wÙÒnN íßgI¹(Ya¬ä¢ÛÉðÓ g%ÞO†«xuþƒ·}&äá×úÝöt›’…–ÎJ-¼Ÿ 0ÖrQmäøj·‡_è;wÙÒnN íßgI¹(Ya¬ä¢ÛÉðÓ g%ÞO†«xuþƒ·}&äá×úÝöt›’…–ÎJ-¼Ÿ 0ÖrQmäøj·‡_è;wÙÒnN íßgI¹(Ya¬ä¢ÛÉðÓ g%ÞO†«xuþƒ·}&äá×úÝöt›’…–ÎJ-¼Ÿ 0ÖrQmäøj·‡_è;wÙÒnN íßgI¹(Ya¬ä¢ÛÉðÓ g%ÞO†«xuþƒ·}&äá×úÝöt›’…–ÎJ-¼Ÿ 0ÖrQmäøj·‡_è;wÙÒnN íßgI¹(Ya¬ä¢ÛÉðÓ g%ÞO†«xuþƒ·}&äá×úÝöt›’…–ÎJ-¼Ÿ 0ÖrQmäøj·‡_è;wÙÒnN íßgI¹(Ya¬ä¢ÛÉðÓ g%ÞO†«xuþƒ·}&äá×úÝöt›’…–ÎJ-¼Ÿ 0ÖrQmäøj·‡_è;wÙÒnN íßgI¹(Ya¬ä¢ÛÉðÓ g%ÞO†«xuþƒ·}&åpZæ†âii-ÂxÅâû¿î Š½ì“8¦3ÅÀ÷­u÷ïryŠ*o«ñGÝD¥@P@ú© †g2•Œ•“yåÀ8æ]}Ç—þªu/Éô_…‡ÝµØž©•¹STÈíŒtRßluå´´—RÄð_tbk\KÜo¼®w¾Ÿ*ä)_eÃeÔÏ 3ÇO4ñÅ+‹^öµÀŒ1˜ð#I.‘¤îôÜ1{­šÌÏÚöY²­³X«›K’Æ#ÖZ{ÛØÀ5]à“Ç­E)¡žÑÒdîP±5îh£œF÷¶ì/tc¼s…͹Ä0¶ãÞ‹¨ô̦¬›e1•’ÕšX"–« Cƒ!l¤4¹Ž Œ›ƒ^ÓŽ2×9®Ä<7,o³íšƒAsìª'TÈÁ6§½¨ìƒŠœÜë¯!À–Ž%¤²›âfMe`¹®k㥨kâÂkcx8£hp a î\ã|uVu‹YJ)ª2VÝ|&3Ù¡Ô è$›ä¸þÑÁÎsƒyqp!Ä”¡ÛRWÖJ)é,ÊgTÉ=[blÕŽc Tòˆœç8FHqs…Í‹¯8¯Ô¼¯˜ÛÂÏe‹XXÉ"†¡Ù¹øŸ#Xî61Ñah‘¸‰”sˆæâñ4v|ж>粎,K+_OOS €Èòù6ì.q¼¶û¯V¡pEf6ª)Ù“6ìy¬aŽŠvBK &!s憶âZHÀÛz.Püµm*Šlª™’5òÑÞֱ•/ˆ¶IêÌwÜÑß‹˜ÒoÏe8ŠsÕ¹‚ânspÞ$-ð ^×5ï ÌŠ«ÎG‡ÉŠgƒw×tgú¬å¡³ßŽ“'r‚".£žàpkÃ?(\´¿'Ñ~vÕÕQãØgå –—äú/ÂÃîÚƒÆK|îÊ/º¤þ’-‚Çä·Îì¢ûªOé"Ø-ˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€³•0}†~P´k9QãØgå Hå¦ðj¿}ÔJU7ƒUø£î¢R¬¨¢¥ù>‹ð°û¶©TT¿'Ñ~vÔe¥ jå…©PÙ60 ‹XÉ\@}Ô+‰íÛjŒSÓUX´´+*‚:òêwœÜ’RfƒÚCbü2/s.&÷`¯ÉØ!ªÊl§§¨Š9 –ž•’G#Cšö–Ê ê W+’68§|F:·½ïkô™+§}CKA åæF€ñs\Ïxý÷_¸E[2ë™oU:é,k=õRÆ'¼I#$©ìk°ø8©]sˆ¼‡Z¹WÛ™uhÁ“Ö­\Vv†ÑÂ4”UYöÈóQLÉÜ›Ãvlˆ¬›ñw¸ {ó ¬Èœ¯£•6~r¡‘™é™¤—_-Îý«ƒœç‡>÷¹Ï8’»“–D´ñÓËC°GQ=HŽB\Ó$ÂA! ›œ&”a7Žû‹P¸(ÎZÕ7(Ål9åÌË 5d´ÍžQ²1Ž8\!͘Ú$i.{ãuÁÇ‚ÐÌ©¬“!,ì¡dU~‹š¤5gt‰XÆb“7~¡#I¹‡ˆ°/dŠÈjŒ3ºH°ŸW+™#˜d’0» ’ -¹ïwxÓ}íIOY‘PSÐ6 4JfS2Lò°S¼>+wpž7\¯ö†WWQÍhBË7> Šzx[-fl¸Í3"k¤ k^\×38áØÒÅaf[UÖkÝ™Љé›R*o”>'º7ÄZatnµî:ØKEîÃ#²ZÆ}T•£¾I%dÞ5øXöÊÙoco¹˜¤c^ì csAv"‡%ì“Y5P†vÉ.3s*åk#sÁ’6aŽC‰×½®ïÜo½Æð¯›*k ¶+bu™³(í {>JVsÆI›"ÍáÂ;8ï¸8ÜuÑ“™OÝgü²¨­/Ží#;Þq5Ç忈]®3’pµ©jš‰$««¨mL –IMÕ¡¨ñƒì3ò…ËKò}áa÷m]U0}†~P¹i~O¢ü,>í¨ê%*ÊŠ*_“è¿ »j•EKò}áa÷mAã%¾weÝRIÁcò[çvQ}Õ'ô‘láD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@YÊ>Ã?(Z5œ¨ñƒì3ò…$rÓx5_Š>ê%Q–?4m/ºþá[Óx5_Š>ê%Q–?4m/ºþágÚ´50}†~P¹i~O¢ü,>í«ª£Æ°ÏÊ-/Éô_…‡ÝµŒ–ùÝ”_uIý$[ÉoÙE÷TŸÒE°[„g*<`û ü¡hÖr£Æ°ÏÊ‘ËMàÕ~(û¨”ª*o«ñGÝD¥YQEKò}áa÷mR¨©~O¢ü,>í¨‹ð°û¶ ñ’ß;²‹î©?¤‹`±ù-ó»(¾ê“úH¶ p‚" """ """ """ """ """ """ """ """ """ """ ,åGŒaŸ”-ÎTxÁöùB’9i¼¯Åu•EMàÕ~(û¨”«*(©~O¢ü,>íªU/Éô_…‡ÝµŒ–ùÝ”_uIý$[ÉoÙE÷TŸÒE°[„g*<`û ü¡hÖr£Æ°ÏÊ‘ËMàÕ~(û¨•FXüÑ´¾ëû…oMàÕ~(û¨•FXüÑ´¾ëû…ŸjÐÔxÁöùBå¥ù>‹ð°û¶®ª>Ã?(\´¿'Ñ~vÔ2[çvQ}Õ'ô‘l?%¾weÝRIÁnDDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDœ¨ñƒì3ò…£YÊ>Ã?(RG-7ƒUø£î¢R¨©¼¯Åu•eE/Éô_…‡ÝµJ¢¥ù>‹ð°û¶ ñ’ß;²‹î©?¤‹`±ù-ó»(¾ê“úH¶ p‚" """ """ """ """ """ """ """ """ """ """ ,åGŒaŸ”-ÎTxÁöùB’9i¼¯Åu¨Ëš6—Ýp­é¼¯Åu¨Ëš6—Ýp³íZ>Ã?(\´¿'Ñ~vÕÕQãØgå –—äú/ÂÃîÚƒÆK|îÊ/º¤þ’-‚ÇäÑÍeNPK'yã¥k^íAÄÞåâ¯IƒŸ®¡¢‹IƒŸ®IƒŸ®¢‹IƒŸ®IƒŸ®JŠ-&~>¸M&~>¸A*(´˜9øúá4˜9øúᨢÒ`çãë„Ò`çãë„¢‹IƒŸ®IƒŸ®JŠ-&~>¸M&~>¸A*(´˜9øúá4˜9øúᨢÒ`çãë„Ò`çãë„¢‹IƒŸ®IƒŸ®JŠ-&~>¸M&~>¸A*(´˜9øúá4˜9øúᨢÒ`çãë„Ò`çãë„¢‹IƒŸ®IƒŸ®JŠ-&~>¸M&~>¸A*(´˜9øúá4˜9øúᨢÒ`çãë„Ò`çãë„¢‹IƒŸ®IƒŸ®JŠ-&~>¸M&~>¸A*(´˜9øúá4˜9øúᨢÒ`çãë„Ò`çã넬åGŒaŸ”+í&~>¸T50}†~P³#–›ÁªüQ÷Q)TTÞ W⺉J¢Š*_“è¿ »j•EKò}áa÷mAã%¾weÝRIÁcòhæ²§(%“¼ñÒµ¯v âïò‹Çñ W¤ÁÏÇ× P‰QE¤ÁÏÇ× ¤ÁÏÇ× ‰QE¤ÁÏÇ× ¤ÁÏÇ×%E“?\&“?\ •ZLü}pšLü}p‚TQi0sñõÂi0sñõ QE¤ÁÏÇ× ¤ÁÏÇ×%E“?\&“?\ •ZLü}pšLü}p‚TQi0sñõÂi0sñõ QE¤ÁÏÇ× ¤ÁÏÇ×%E“?\&“?\ •ZLü}pšLü}p‚TQi0sñõÂi0sñõ QE¤ÁÏÇ× ¤ÁÏÇ×%E“?\&“?\ •ZLü}pšLü}p‚TQi0sñõÂi0sñõ QE¤ÁÏÇ× ¤ÁÏÇ×%E“?\&“?\ •ZLü}pšLü}p‚TQi0sñõÂi0sñõ Vr£Æ°ÏÊö“?\*>Ã?(Y‘ËMàÕ~(û¨•FXüÑ´¾ëû…oMàÕ~(û¨•FXüÑ´¾ëû…=«CQãØgå –—äú/ÂÃîÚºª<`û ü¡rÒüŸEøX}ÛPvǤˆÛ‚RÆ`gC|¼—¯XªúGóÆõ¾.°3”H:±Uôç銯¤C  íxsÃq‚·aÝÇp½%¶l¸$‚9m*8ßQ#¡…¯ Ë#]…Íh¿[ƒµ5ƒ©¾*¾‘üñ½/«éÏ×* SÚF®,í=[䙉¯7×›¹uƒ¯ˆ®†IU %³¾áp%ÒÝýOÔ³y#ón½Ÿß=h[þVO¶ßèäâ«éÏÓ_HþxÞ¹QV*¾‘üñ½1Uôçê†Ù´ê¬÷YðÑRCSQ[R`cfœÂÆÝ’\ãÅ]å^ßjÅfÙÑTÛÕkœìX1â×pxeä}×/%è.ñUôç銯¤ÁüÎA.*¾‘üñ½1Uôçë•qZÖ‡Yæ E{¤ŠØ]„$‘±²óq¹¸œ/7äÄ‚ß_HþxÞ—Õtçë4Û^ѧ¬¡¥´lÈa}]Ne²SÕgc5,—ÞX×b«ˆÂÏ8ë©–ý--£¯@ú‚J–Ô°ÆÇjÔ]}À÷ÃWÖ9P]â«éÏÓ_HþxÞªá´è*gŽ+©¥šHK#d­s7 [Iýî%Åjå›Ijêiª+¬êI*¤¢líakqkËA¼k»÷‚ *¾‘üñ½1Uôçê¢Ê´8NŽJŒÖoLðaÅ}ù©_üC÷y/»ZíAêJ÷EXÊGUœûãt­ceÄp‚&ã«[‡ý üsœ÷9ÅÎ>RoTOùõûdžõŠñTÞ W⺉J¢¦ðj¿}ÔJT/Éô_…‡ÝµJ¢¥ù>‹ð°û¶ íI·¥Œ:ÀΆùy/^±Uôçê)|\`þg(ub«éÏÓ_HþxÞ¹U]½nA`вªqˆ:@Û¯"æ€_#µàÆÉw—ÃY/¯«éÏÓ_HþxÞ³ÙG”t7eTUÕÔÓ2fÁ$°SË;cuC˜Ûð6þ2MÃPøÝ+XÙq €I¸êÖáÇÇÿB¼ª7üú‡ý²OzÄ&ÏR÷†¶i &à1•&*¾‘üñ½EMþj¶ßê¢AÕŠ¯¤?úøç9î.s‹œ|¤Þ¨ŸóêöÉ=ë⩼¯Åu¨Ëš6—Ýp­é¼¯Åu¨Ëš6—ÝpžÆ†£Æ°ÏÊ-/Éô_…‡ÝµuTxÁöùBå¥ù>‹ð°û¶ ê—ÅÁöær‰V×Ó[55ÒÚ°S@Öálfå$¸¿^²|ƒÉþ«—ƒ²‡éÏ´‹'W’Ö…K- ¦ÚŽªz±Y#ph®’"ÜÆ2c2tPã wuÚŠ°àì¡úA³Çm8;(~AìñÛAKid©hS›'vy©­ŸKθËþ":vkÝëª8ñë ¿U÷ ‹6–ÙýU£]KA j ‚Ÿo”µ±™œ]®&ÞI‘¢îKÍú€>¸;(~AìñÛNʤ{ʤ{¡ÿl“Þ±8;(~AìñÛ^èlzèmh×ZQÕKÀ"ñõ^eÒ=ž;h/N,ŽŠML4´ÚæÔuY­d`HbuY‘ÍÎâ¼ÄKâ7‘}Êò‡éÏ´àì¡úA³Çm~»!ë*c´éÙ™p›M– 寨pT6PcÅÇvx‚ñˆ  ¯om³’5V±´#ÒaŠ*ÊÙ&Ç­Îdo³Í/«Üoºû®òß©YðvPý ƒÙã¶œ”?H öxíª8ç°íJù+­)ÛGKj lŠwJÆ>Hö¹Ò5Á¯Î¹Žhmø1 ûë‡ ¡î|‚:_ñóQ2Šc=|ðNºY ¡Ï2¸¸8²ò¾ü‘uÁÙCô‚gŽÚpvPý ƒÙã¶‚ñeÒ=ž;iÁÙCô‚gŽÚ’?6àûÙýóÖ…¿ådûmþŽUv5œë&ËŽÓ œÇ=Åá˜A.ywæî>U%¡£4 Š‚º*NûÜú|éuÃPðŒòù8¼¡ÖŠƒ²‡éÏ´àì¡úA³Çmœ¨±¥¶"³„tTÍ¥«ÏÉK\âØänjFqà~°^ƒäQºÏµ"’Ì®¤ ³c¨¤¦šÐЧ2F÷FAl‚+õš0à¾:ûÝspvPý ƒÙã¶œ”?H öxí ¥ÉÜ“µ,ÓÔ㣞x©Œ¬ëšÓþ•—âÀOŒ¥ºë¼âãN¿VzìÌ9¬åس§oø®ÃácÕ†û®×}ýêªàì¡úA³Çm8;(~AìñÛAxŠƒ²‡éÏ´àì¡úA³Çm)¼E™þçMù¼Yùl;Z®Zm6ÚŠh¡¨Ž| ¢ÀIcºüz¸–,¾.°3”J¶¾šÙ©¨–Õ‚š· c4xÏ)%Åúõ“äOõTY*ën‚[FÌÌÀæ £ž†’çE+d $_p%—_qºûî7\y8;(~AìñÛNʤ{í¨:¥ñp}ƒùœ¢UµôÖÍM@4¶¬Ð5¸[£ÆyI./׬Ÿ òªåàì¡úA³Çm⤴,Z»BÜŽµ–”Ô,§¦1BúQ‘Åî@ñ#Ü?³‡ ×ñ_ä_œ”?H öxí§eÒ=ž;h(§É[f ²Î¢Ð&6_‡O;ãÍE™±?TnÆâÉF!ހ曯Wp±mšzÚFA´´v…U É_Rö>GJÙÈa`Œ†€éîňêm÷^nü”?H öxí§eÒ=ž;j‹˜Ì¥ò‰Æ´:èË^Isnȸ\o¼]¯Pýwjƒ²‡éÏ´àì¡úA³ÇmAx¨ßóêöÉ=냲‡éϵî†Ç®†Øu¥SÅ; kYM›¸5×øGÍÿº êoóPý¶ÿUHÁŠ1²l/n&ƒä¼/UáQðvPý ƒÙã¶‚ñdâÈè „ÔÃKA®mGUšÖF†'U™Üàn+ÌD°Ž#yܬ8;(~AìñÛNʤ{E¬ûR),ÊêJ 6:ŠJi© ªs!dotdÈ"¿P‰£;㯽×7eÒ=ž;iÁÙCô‚gŽÚ \É;RÀ}=N:9犘ÁšÎ¹­?á©Y~,øÊ[®»Á~.1„ëñUg®ÌÚÎ]‹:qfð_Šì>=XoºíwßÞª®Ê¤{AäÿUE’®¶è%´lÌÌ`š9á¨`y!®tR¶@ÒE÷Yu÷¯¾ãuÇ“ƒ²‡éÏ´àì¡úA³Çm}µa[9MBÊzãABÐé[† 9k_Mʤ{ê%Q–?4m/ºþá[Óx5_Š>ê%Q–?4m/ºþá= GŒaŸ”.FR1‘²6ÕÖ†±¢Ô¸È]GŒaŸ”.ÚO{XÊÊw9Æà ’Š 4aÒëzÑ|4чK­ëEðÖ~·)+é%¶ge™M%d:ê‰Mc›3š!dÎ,6A!¯¸ñya\CjR½² jèÚöIÍŽ :ëåtl¿Šç9Í-»Î ›thÃ¥Öõ¢øi£—[Ö‹á®:[~Æ®|,¤µè*3œÈ› Kds@sƒn:È! ¿c5•ou¯@Fàʧ–]‰Âõ÷¦ðEÆíh;4aÒëzÑ|4чK­ëEð×öÝVM· ì«¡‚ '2R½²µ€—n'½#qSå,O­Šß@!u$µO©‚°Imc`qÄK[p"{ÁóC]û׹чK­ëEðÓF.·­Ã\ì¶l¹)iª™iQºžªA <¢v–K!$´ßsx"á¯QSi´™¬î•k£Çœbi!Í¿”AB Z0éu½h¾hÃ¥Öõ¢øj. é´ÛVïN é´ÛVïA.Œ:]oZ/†š0éu½h¾‹„¨:m6Õ»Ó„¨:m6Õ»ÐK£—[֋ᦌ:]oZ/†¢á*›Mµnôá*›MµnôèÃ¥Öõ¢øi£—[֋ᨸJƒ¦Óm[½8Jƒ¦Óm[½º0éu½h¾hÃ¥Öõ¢øj. é´ÛVïN é´ÛVïA.Œ:]oZ/†š0éu½h¾‹„¨:m6Õ»Ó„¨:m6Õ»ÐK£—[֋ᦌ:]oZ/†¢á*›Mµnôá*›MµnôèÃ¥Öõ¢øi£—[֋ᨸJƒ¦Óm[½8Jƒ¦Óm[½º0éu½h¾hÃ¥Öõ¢øj. é´ÛVïN é´ÛVïA.Œ:]oZ/†š0éu½h¾‹„¨:m6Õ»Ó„¨:m6Õ»ÐK£—[֋ᦌ:]oZ/†¢á*›Mµnôá*›MµnôèÃ¥Öõ¢øi£—[֋ᨸJƒ¦Óm[½8Jƒ¦Óm[½º0éu½h¾hÃ¥Öõ¢øj. é´ÛVïN é´ÛVïA.Œ:]oZ/†š0éu½h¾‹„¨:m6Õ»Ó„¨:m6Õ»ÐK£—[֋ᦌ:]oZ/†¢á*›Mµnôá*›MµnôèÃ¥Öõ¢øi£—[֋ᨸJƒ¦Óm[½8Jƒ¦Óm[½º0éu½h¾hÃ¥Öõ¢øj. é´ÛVïN é´ÛVïA.Œ:]oZ/†š0éu½h¾‹„¨:m6Õ»Ó„¨:m6Õ»ÐK£—[֋ᦌ:]oZ/†¢á*›Mµnôá*›MµnôÆÈcsé^]!‘ΕÍ$’Ö·ÈÐ8š¥â)¢ž<ä22F_‡¿’ñþ£ø¯h R1‘²6ÕÖ†±¢Ô¸ÈË™¶…ÞÖ2²Îq¸($Ÿâ‚MtºÞ´_ 4aÒëzÑ|5EhåU­Ià³á–‚É¿L‘õ%’ꉲ»6ÀÂÞ=·^æÞëÆ¡¬ÉQ•”ö£¨\æ5ÐÕèÕN–V°BÝÕCÿ-Ì-¼Ý¬;ÍÖ:0éu½h¾hÃ¥Öõ¢økžKfË‹CÎZTlÓnÑ1NѤ_uØ5÷×âoüc•GUmÐSYV¢ÉÙS œÙMCiÞ×¹®¸œÎ=NÈnãAÙ£—[֋ᦌ:]oZ/†©©ò–'ÖÅ ï º’Z§ÔÁX$Ž6±°8â%­¸=àù¡®ýë…‹-›.JZj¦ZTn§ªC¢v–JòH i¾ç:ðEÃ^¢ƒ£F.·­ÃMtºÞ´_ yÓi3YÝ*Ö7G8.ÄÒC›( ‚<„ㄨ:m6Õ»ÐK£—[֋ᦌ:]oZ/†¢á*›Mµnôá*›MµnôèÃ¥Öõ¢øi£—[֋ᨸJƒ¦Óm[½8Jƒ¦Óm[½º0éu½h¾hÃ¥Öõ¢øj. é´ÛVïN é´ÛVïA.Œ:]oZ/†š0éu½h¾‹„¨:m6Õ»Ó„¨:m6Õ»ÐK£—[֋ᦌ:]oZ/†¢á*›Mµnôá*›MµnôèÃ¥Öõ¢øi£—[֋ᨸJƒ¦Óm[½8Jƒ¦Óm[½º0éu½h¾hÃ¥Öõ¢øj. é´ÛVïN é´ÛVïA.Œ:]oZ/†š0éu½h¾‹„¨:m6Õ»Ó„¨:m6Õ»ÐK£—[֋ᦌ:]oZ/†¢á*›Mµnôá*›MµnôèÃ¥Öõ¢øi£—[֋ᨸJƒ¦Óm[½8Jƒ¦Óm[½º0éu½h¾hÃ¥Öõ¢øj. é´ÛVïN é´ÛVïA.Œ:]oZ/†š0éu½h¾‹„¨:m6Õ»Ó„¨:m6Õ»ÐK£—[֋ᦌ:]oZ/†¢á*›Mµnôá*›MµnôèÃ¥Öõ¢øi£—[֋ᨸJƒ¦Óm[½8Jƒ¦Óm[½º0éu½h¾hÃ¥Öõ¢øj. é´ÛVïN é´ÛVïA.Œ:]oZ/†š0éu½h¾‹„¨:m6Õ»Ó„¨:m6Õ»ÐK£—[֋ᦌ:]oZ/†¢á*›Mµnôá*›MµnôèÃ¥Öõ¢øi£—[֋ᨸJƒ¦Óm[½8Jƒ¦Óm[½º0éu½h¾hÃ¥Öõ¢øj. é´ÛVïN é´ÛVïAÑl†71Ž•åÒé\ÒI-k|‰¡RåÍKW1Mñç!‘’2ü8˜àEü—õÅSeÍKOcCQãØgå I¥e ÑaCÞ-ªz>Ã?(\´¿'Ñ~vÔÔÙ/AÖ•«]gÐTTÍVÉé§|-|‘5°ÄÀ1x!Ìq(( Ãa¸08^æÞMÚ®¼ûŸ&åžÞeSÅ4´‚Ôe¤D—âm+ 6â/lo¼q@´uÙ¶ nåe¶ÛF)%lSÃg’0 ƒïð\/ðG"祃ô{W[i6*ŠGYôôòËh6ÚÄ+ån;9sHÍ·ŒëÆ5.©³ä=d“Õ¹Ù™Ù[žŠVšúˆQ< –GvzöÏqc‹@Â@w|Hº–Áª~FÛ8’"·O͸“€gä•̼Ý~ ñ~£åºõi&Nä:v¦øBí ­ Òoºìßí;ûñ7Šÿr¨ìüšÉZª Úªº)(…DñT m)†i±½×=ä¼aŒ2Aî¼ȸ• Ý­‘µ¶±]XÙálSJf¢WÆòF„ZÒæ‹Ùy¤xÄÛËq4€N¡ ÉZæÒ Ô ¨šwºq5Lõ$1Íc$—™š[ÎŒµ€‚ÛœÇFl* ýÒVÙ­–¢‘¶}}=D±Z¶¤Dø›®Î\âsŽâ:°GÉq&KdL6¤6\¯–„ÌÇ#­ID¯n½mfrò;×kÈy‡M<µ isÀ‰øœnBomç ¾á¬‹‰Cªóuæm&~~N¹T–¥‘vE™ £Ro¥›4èäe§%ÎòGt 0ea.âýbõ§ad}kSR×ÓèÔ²ÒORú¹íI£dy¹!`i½÷wÆq®ñÅv»õJzLüüršLüür¨$³ÿG´ÕV•=tÑÐ¾Ï¨ŽžcWjÉ.|M•„_/i _u廊õ$ÖGŠê j:}3I´$³æt6¤ÎÑäd2Jàà{á›´ÜF+þ¢¡w¤ÏÏÉ×)¤ÏÏÉ×+Çp7ЧõÙûiÜMô)ýv~ÚP÷¤ÏÏÉ×)¤ÏÏÉ×+Çp7ЧõÙûiÜMô)ýv~ÚP÷¤ÏÏÉ×)¤ÏÏÉ×+Çp7ЧõÙûiÜMô)ýv~ÚP÷¤ÏÏÉ×)¤ÏÏÉ×+Çp7ЧõÙûiÜMô)ýv~ÚP÷¤ÏÏÉ×)¤ÏÏÉ×+Çp7ЧõÙûiÜMô)ýv~ÚP÷¤ÏÏÉ×)¤ÏÏÉ×+Çp7ЧõÙûiÜMô)ýv~ÚP÷¤ÏÏÉ×)¤ÏÏÉ×+Çp7ЧõÙûiÜMô)ýv~ÚP÷¤ÏÏÉ×)¤ÏÏÉ×+Çp7ЧõÙûiÜMô)ýv~ÚP÷¤ÏÏÉ×)¤ÏÏÉ×+Çp7ЧõÙûiÜMô)ýv~ÚP÷¤ÏÏÉ×)¤ÏÏÉ×+Çp7ЧõÙûiÜMô)ýv~ÚP÷¤ÏÏÉ×)¤ÏÏÉ×+Çp7ЧõÙûiÜMô)ýv~ÚP÷¤ÏÏÉ×)¤ÏÏÉ×+Çp7ЧõÙûiÜMô)ýv~ÚP÷¤ÏÏÉ×)¤ÏÏÉ×+Çp7ЧõÙûiÜMô)ýv~ÚP÷¤ÏÏÉ×)¤ÏÏÉ×+Çp7ЧõÙûiÜMô)ýv~ÚP÷¤ÏÏÉ×)¤ÏÏÉ×+Çp7ЧõÙûiÜMô)ýv~ÚP÷¤ÏÏÉ×)¤ÏÏÉ×+Çp7ЧõÙûiÜMô)ýv~ÚP÷¤ÏÏÉ×)¤ÏÏÉ×+Çp7ЧõÙûiÜMô)ýv~ÚP÷¤ÏÏÉ×)¤ÏÏÉ×+Çp7ЧõÙûkÔ­kƱ¡­llpIŠW<.sô§9ÅÄÕdßÿ %O–?4m/ºþá[Óx5_Š>ê%Q–?4m/ºþáOcCQãØgå –—äú/ÂÃîÚºª<`û ü¡rÒüŸEøX}ÛPxÉoÙE÷TŸÒE°Xü–ùÝ”_uIý$[¸Ar£Æ°ÏÊg*<`û ü¡I´Þ W⺉J¢¦ðj¿}ÔJU•T¿'Ñ~vÕ*Š—äú/ÂÃîÚ‚²ŽÌáºÜµ²sÙ:φ›;‡ qÊÜW^/ºûî¼.‰l¤«Ê1”3RÙQUShú=#+¤{%Àʶ;†Yª®ñs~ µ_xŽÌ´¡±­\°µ*# ¢¢‚¢FÆqk+ˆ/¸r„nP[Ô™cWEWAI¦USÑÅGI¢÷S‡2G=Ï1Â[ ˜ëËX/»[w’%­‹9õŠ+*¯…¢|u±Õ½æ:|U›ƒöíÿæá&,B1¬cïm-{Ò–¶¶{"ª:vVÓ´T°ÈèËåíÅͰɒ7Ê/{Cb-âç¤ÊêëNgÁgXÑÏ=# «ã}fšhK`%—HqSËv3»ä^pÉMk¾Æ‚ݤ­›;UE+ª`tò;öñT=î…£qþ8Ðãš7¾kPQÙ-”¶-¶ûZž’Í™ò>¤z‹f¢RÖÈÊFƒž|.{ÍôÎÔ@¸9 W.‹;"­+.Š )é'³ôŠ ©k÷2Vº•”íÀذàí½ñ]œ:ŽúÃ'rÐÛ–£,Ù,Ù)jʃ>,ãCŽ@kd ¶¥¦÷5·›8æè²¾Ý¶j,Úêz\PÏjÀ)é[TÞËd™‡¾6½áø»çw2ö´ìnE[Æ+Ïfæ,J&RÒ†½øªô²±ï8n`x¦ÂZ³wÞ —Ü5ØóVeU—lUAIu=dL‹Ü×Hø°=¤´\Lq¼;“\/*ùw6‹YQ •™eSÉQjÕ˜ÚÉf‰ÂðçN*iˆÅ›¼`âÄCdµ­ÊÊïÑÖUÚ1Ç¡IK£ 4ÎKÿaœŒI~àv&¾íZïâ<È«JÆm‹³ÒHÊ:Šz©œÇºüL³˜Ñ‡XÄÖ88‘xs…ÃIJ2*ҳ휨–zG2Ì¢¢§˜1î½Î†ž²'÷ºÁuK¾íAÜWz*r¢×9EdYZtu2ÖÄé¡}@xu,U8bpaÃ+]NâZÛÛ{Z„8‘——µ•PTUØðA LTUf«LŽŽ:Çæà¸Û‰ØÃ±‹Àk@ ¼œ 7¨ò.yª²'ª*%’iå³)Ÿ$’8¹Ïq‰¤’N²I×z¼@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@YÊ>Ã?(Z5œ¨ñƒì3ò…$rÓx5_Š>ê%Q–?4m/ºþá[Óx5_Š>ê%Q–?4m/ºþágÚ´50}†~P¹i~O¢ü,>í«ª£Æ°ÏÊ-/Éô_…‡ÝµŒ–ùÝ”_uIý$[ÉoÙE÷TŸÒE°[„g*<`û ü¡hÖr£Æ°ÏÊ‘ËMàÕ~(û¨”ª*o«ñGÝD¥YQEKò}áa÷mR¨©~O¢ü,>í¨ ÉØ!ªÊl§§¨Š9 –ž•’G#Cšö–Ê ê W.Èrc' £[DÓ]%xŠžid–Ъ|Ѳù›d®ys?ãŽñÃSœ§k§£á7-x#å>‡Cð|vn\{á]Ç«•U¶·(*ê("Êqa½”l¯’V×ékEaº2ÿÛ$u9"> ãz^·ÜI’¬…ޤ26`{YQ+ECK‹ˆžç~Ü9ä‰1^^òoÆëä’†ÆÊVéoHÍgèÛ sØX[+D˜xˆp’ñ¬Ò8Ö>ÆÎî3šwèYìæ-"|ë»ÜYü×{~,ZóªÒÙ‚Ò²æ´ilèªÍ {â­s©ZìP4m¬cpÜZ_ŒŒ ¾G<ÎàqaAhÌŠ°[£u,òã”Ë+笚WÊ\Ö1Í{ÜòçÆæÇ1¸– ¼‚ŽŠËÉz#é™;,7ÆÙù^Æ@èé°µÎÄp’ ˜ó}ã'¼pt•ôReTÔsÕå[¬†KW™…’ZFv¸Cg‘‰­ý¶d”Œ]頻+Š* v¯#2¶Ì´i'6í§HuÃY,ÜMîx±|¤¬…×ji¸5¹/“±Á-MT9Švgf©q«’(äkžù^&Á²G‰ò/½ =Âà ²Lž³% ¨ th•,©dЉä x¨y|·€î2ânÃ?(RG-7ƒUø£î¢UcóFÒû¯î½7ƒUø£î¢UcóFÒû¯î}«CQãØgå –—äú/ÂÃîÚºª<`û ü¡rÒüŸEøX}ÛPxÉoÙE÷TŸÒE°Xü–ùÝ”_uIý$[¸Ar£Æ°ÏÊg*<`û ü¡I´Þ W⺉J¢¦ðj¿}ÔJU•T¿'Ñ~vÕ*Š—äú/ÂÃîÚ‚ ž\¦ÊzЉc†©é_$’85¬hl¤’N ×zèƒ.(ä¶mde\tSÓ:IgT2¢YdtøšØœÌo°ƒÞ´ÜÉ7u}™fÃlÚ¹aeÔ:FÁ[E<ŽŒ€àײV’ _qä+±Ù'lT[Ú©¶¨]iŘÑ]œöBÌÛjq°Ì\ûÛU'Ûq :õƒ¸E¤™_aÄÈ^ê¹ $f7¹”ò¸S´8´™îoìs^ “ Å컟„hmÕ‡))©$Ž’¶JjŠgÁc†0êq€âÆ÷Føo%ÏîôsÒdu™3ç³­˜àž­…µò>$Í4ÅÐû£8ª%»”]‚ðn8¤Ê‹Z§ËiQ‰ä¨ÍB 4 c4Ô2jwãØÜ,vwCš\Ù|jz,¤É Å=ŸC<Až†*jk¡²B?e$£6ر1§; Ž  sxÊ’§*æî{+­J3I;,–=ôOmîdÍqNÒâ| ¤:Á®ÿUGdØ9bì£á©CEQS¥>WOGŒ09”Q±†&Tœtgºñ#ÅÃ]Å× Š|…вnذ)m¨m CL,¤ŽêXi˜ëÀuÂ'8‹…åÂì8{àì“-lÇUY°Ñ™*…mki ™€µ®ŠW²VŒ7¾'ˆðŒNÅsJ’ƒ-lKF4ÕSá©Àbt´sDÒvmĽ€5¯' np-i$•¹3¥eDVëk0M›ŒÅ‰¿³-uúÅø™Tð8°¹­=𽦾—!tjJnÅ£ÒYTسbЦ2⻬wÝwîñ÷ÜH/2jÒšÙÉ["Ô¨lmž¶Š‰!¡Ï`qMמR­}…fp&OY–N{= ÒEMÇâºóu÷_uåX """ """ """ """ """ """ """ """ ""ÎTxÁöùBѬåGŒaŸ”)#–›ÁªüQ÷Q*Œ±ù£i}×÷ Þ›ÁªüQ÷Q*Œ±ù£i}×÷ >Õ¡¨ñƒì3ò…ËKò}áa÷m]U0}†~P¹i~O¢ü,>í¨ê%*ÊŠ*_“è¿ »j•EKò}áa÷mAYGið%nZÚÙœöƒgÃSšÅ‡åvî7_u×ÜT–Ô¶ómŒŸ¢–¶Æ©´i‡Äøã|"6¾’­·¾o$ .-!ã½æG³%¾weÝRI‚†Â±ìÈ£Š‚Ê¡¤Ž9LìdìŒ6BÒÂðÔâÒ[Æî%¸F.ÒË»^žÉ–®ŠŽ:©ì¶TÉjE Ž¥ˆ<9ó0Æiå71o”†9*òÞØ²ìê‹b²–†jÕÚ4°ÓÂ^Ù£ —µîy$ Å1ahiÖqâýÁ¬­É«Òdl¯±,Ú¦FùÆÏJdž¹îÄò/‹¬Ÿ)ÖTp EÖ,,Öu[Ø&d1ßòD$t±ÞÄEA¼‘¬—^:Ã/iå6TÙ6Ãì\6•tú6%%qµOuñÉPî¼ã<"uÝ„ñÐe¯Q•XD4”–¥£OKBçItñÂèŸi9Î,ŽK‰"0 ;Âû‹€ß¤±²À±èë©‘×fÅCg¤¬‘¬$°â‘›‹œo-ůY 4 Û?'㊚ͬ³¨L5Ø(¢§}+\ÉM|¬Œ‹®ÂÐ׸¨y5”:¼²·¥²m©è›öÕ&jgÊÚ§G5LW0 bÒ—k/ñ€~íî¸ÊZÛJ“)hu%3cÚ3¼W ræ|yC\ë˵ÜÜ`]ŠñSdkÏdQÚrféø*JR@èÍÌsÜÖ¸ÄçÅ|q‘{˃Ä:â´’Ù6lôú<Ö}$c‘ù·ÂÒÜR›ˆº÷ yòãuüe>ÆÊ+K(2ÆÍ™¢J 7S×ÙõQ9• k4@Ñ31\Éq=Ïi×û7·P/¼o>GŸÏèg³¹üælbÎ`Íã¿ÎÁÞßLJWè@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDœ¨ñƒì3ò…£YÊ>Ã?(RG-7ƒUø£î¢UcóFÒû¯î½7ƒUø£î¢UcóFÒû¯î}«CQãØgå –—äú/ÂÃîÚºª<`û ü¡rÒüŸEøX}ÛPxÉoÙE÷TŸÒE°Xü–ùÝ”_uIý$[¸Ar£Æ°ÏÊg*<`û ü¡I´Þ W⺉J¢¦ðj¿}ÔJU•T¿'Ñ~vÕ*Š—äú/ÂÃîÚ‚‘ô5œy}AGrªªÊŽYˆ OtS‹ÍÀ^HãRO‘Õ-ËvVEKVØ#¨§u ´¦’8))£dmt%Îa€–Kû8»Ç %¸ÞE¦K|îÊ/º¤þ’-‚Ü#äìÉ\ u©S9³'H‹9jÆÑG5t‚¦ È„w>F¾6ÔµºF»¤¹Äc}ñÉ‘•ÛTY-šÍ¾K.Ú;]MRè(› Ù›ylo/†R"ëɯ®"—Û9W%tÑGfÎë¹M-AšÐøi°½±TƒZÊ›îø¤$ žâ´“صu4™3U•FÆ­†ILÌÓ]Nèó­y»l’81Ç6çß„;Xˆ>gdd}§U‘=¡fÇ4tu•ÄçÆãKb¨Ž:V‹îÓ:V¿Ã?(\´¿'Ñ~vÕÕQãØgå –—äú/ÂÃîÚƒÆK|îÊ/º¤þ’-‚ÌP² ºª¸› ¨ª »¸† Ýuçøÿ¥ÝÜ&þY:Íì­Z.QSp›ùdë7²œ&þY:Íì¥À¹EMÂo哬ÞÊp›ùdë7²—å7 ¿–N³{)Âo哬ÞÊ\ ”TÜ&þY:Íì§ ¿–N³{)p.QSp›ùdë7²œ&þY:Íì¥À¹EMÂo哬ÞÊp›ùdë7²—å7 ¿–N³{)Âo哬ÞÊ\ ”TÜ&þY:Íì§ ¿–N³{)p.QSp›ùdë7²œ&þY:Íì¥À¹EMÂo哬ÞÊp›ùdë7²—å7 ¿–N³{)Âo哬ÞÊ\ ”TÜ&þY:Íì§ ¿–N³{)p.QSp›ùdë7²œ&þY:Íì¥À¹EMÂo哬ÞÊp›ùdë7²—å7 ¿–N³{)Âo哬ÞÊ\ ”TÜ&þY:Íì§ ¿–N³{)p.QSp›ùdë7²œ&þY:Íì¥À¹EMÂo哬ÞÊp›ùdë7²—å7 ¿–N³{)Âo哬ÞÊ\ ”TÜ&þY:Íì§ ¿–N³{)p.QSp›ùdë7²œ&þY:Íì¥À¹YÊ>Ã?(]\&þY:Íì®9^$~ 7ñ ”™W=7ƒUø£î¢R¨©¼¯Åu•@QRüŸEøX}ÛTª*_“è¿ »j-ó»(¾ê“úH¶ 1BÈ(*êªâl‚¢¨0Jìbâhƒuןãþ—wp›ùdë7²µh¹EMÂo哬ÞÊp›ùdë7²—å7 ¿–N³{)Âo哬ÞÊ\ ”TÜ&þY:Íì§ ¿–N³{)p.QSp›ùdë7²œ&þY:Íì¥À¹EMÂo哬ÞÊp›ùdë7²—å7 ¿–N³{)Âo哬ÞÊ\ ”TÜ&þY:Íì§ ¿–N³{)p.QSp›ùdë7²œ&þY:Íì¥À¹EMÂo哬ÞÊp›ùdë7²—å7 ¿–N³{)Âo哬ÞÊ\ ”TÜ&þY:Íì§ ¿–N³{)p.QSp›ùdë7²œ&þY:Íì¥À¹EMÂo哬ÞÊp›ùdë7²—å7 ¿–N³{)Âo哬ÞÊ\ ”TÜ&þY:Íì§ ¿–N³{)p.QSp›ùdë7²œ&þY:Íì¥À¹EMÂo哬ÞÊp›ùdë7²—å7 ¿–N³{)Âo哬ÞÊ\ ”TÜ&þY:Íì§ ¿–N³{)p.QSp›ùdë7²œ&þY:Íì¥À¹EMÂo哬ÞÊp›ùdë7²—åg*<`û ü¡up›ùdë7²¸åx‘ø€ \ßÄ.Re\ôÞ W⺉TeÍKVôÞ W⺉TeÍKSØÐÔxÁöùBå¥ù>‹ð°û¶®ª>Ã?(\´¿'Ñ~vÔŽÇ!­f¶o`$÷Ç”/:CüØöMÜ’ø¸>ÁüÎQ —H›É»—ƒ\ÖÎÈ à=®{c,f'5¤@»Xͼýc•yX;Bѫካy”•¤ ©¶­’F)ÙKíªÆÂñ!pq”ÖÜãã‡Xo¤®lO‰’>:W`®c{®.¸jÖni7rÈ‚¹®ðÀfcZ÷FÌMk‰‘v K]qú"ù³mUð<ñÚ9ûb–¶¸ÃbaŒáÓÕŸ›:q´0ëuÇ9ªà[uÆM×PÉ•¶¦g(™k‰))#dî–ðê—Æi­†‚뮾ëÏPÛéócÙ7riócÙ7rゲ–ªí¦¯“ ÛïcïÂí_ºn7#qäS —H›É»•,Õ“É–SÝ ’LÛZ ³Œ›¸ÍܼWžR­Uþ}CþÙ'½b 8©ˆ/ƒþ«÷H›É»’›üÔ?m¿ÕD‚]!þl{&îUÑe=“=¢lèm[2Jàç0Ó2HŒÍ¿Â5Þ.7%Åv/ŸÅx±Ì“TÓ>Ìî‰ÀS²Í› Ó/-¸>âF `Þ Ä>‹¤?ÍdÝɤ?ÍdÝËæ†RÛðMmÈËBŽ'ÓE\[Eœ–FÉ3Ræs8™~݉òýC¿`ն͹eKZÚj¹­)iêe¢† ¡aÏBjšâ#kI~;™p¸þî.ùZAÒæÇ²näÒæÇ²n儊ܨ‡Kª¤¶¸^ȳó5±v6;:Ù™Ž&†þÍ¢9®¼øö|õ¡oùY>Û£“ØiócÙ7riócÙ7r‰E_mQÙP6{F²ŠŽ;’ ÇK®&ëÝv»Õõ/t–¤…+*¨§¥©§}ø%„1ìuÆãqްGýg,ê´'Ø} Hÿ‰­mñ2úiÇ|17Žû‡|5‘ÇÄ£´mÈÞË)Ç(é¨ìéà•ÒÚ´®‰±¾f4F×I€:ùNnýŸzëÃUKjA]’’zZ† ¯tAÚ5ŽV¹¤}D*ŸH›É»—ʲ:ºM&Äž¶·G¢ ³]^ü ŽãGC.mÎ#ïdãæxZBúN™KžÌé0çs™œÁ‹9ƒ¼ìõÜwkâIšCüØöMÜšCüØöMÜ¢D™E]Q 5 bx;_OËKKÅâð/¸ù~­JÍQå7ˆ³?Üé¿8Wˆˆ )Ý!Ž(CZÍl$ÞÀIï(P)eñp}ƒùœ¨iócÙ7rñ5si ’yßPÆÒ÷Èö1­k@¼’HÔò¯*“*õXêdU´sHãÄÈÙSžâ|kA$ñ (,é2‚δ#d”V…ŸRÇÊac¡toxn"ÐG°‚nã¸^»t‡ù±ì›¹`rŽÚ£¨u ¥“Φ´k©çµôíζW¶Ž­Ñljž¼žðÆ?&!,Ei6Ç­2[tu t±2+FØß;Ž7;;>Œ"kncZmÎÅ Œl"ÐúFÿ6=“w/W6š 'ðE m/|cÖ´ É$@*Åäe·h[uÓ:ª¹’Ã#C[cã•ÚMLyÜa ¸–ÀÍc M䆋À]”•n}±BÚÈE=E5m3¨&¨?e4®ÎDaíkŒ`‡:G׃„be©Å\ÙØ_ à‘¡ÎasšK\50Ay+Þÿ6=“w,þJü‘?û•ÿw*»AU5dòe„Å÷@($“6Ö†‚ìãæî3w/甫UFÿŸPÿ¶IïX¯EMàÕ~(û¨”ª*o«ñGÝD¥@QRüŸEøX}ÛTª*_“è¿ »jÇHcŠÖ³[ 7°{ãÊ!þl{&îI|\`þg(K¤?ÍdÝËÁ®kgdð ž×=±–3šÒ ]¬æÞ~±Ê¼¬¡hÕðÅU¼ÊJÇÒPTˆÛVÉ#쥎öÕcax¸8ÊHknq‚qì7ÒW6'ÄÉ+°F×1€½×\5k74›¹äA\×Nøà31­{£ f&µÄ€H»P%®¸ýG‘|ÎÙ¶ªøFžxíý±K[\a±0Æpˆéê„OÍ8ÚuºãœÕp-ºã&ë¨dÊÛS3”LµÄ””‘²wK‰xuKŒc4Ö‚CAu×_uç‰(mô‡ù±ì›¹4‡ù±ì›¹qÁYKUvS ׯɆmá×±÷áv¯Ý7¸ò)ÐK¤?ÍdÝÊ–jÉäË)‹î€PI&m­ ÙÆ ÍÜfî^+Ï)Vªÿ>¡ÿl“Þ±‚œTÄ€AÿUû¤?ÍdÝÉMþj¶ßê¢A.ÿ6=“w*貞ɞÑ6t6­™%ps˜i™$F@æßˆaïÇ’â»Ï⎼XæIªiŸfwDà)ÙNæÍ‹„ÈiΗ–Üq#° oâEÒæÇ²näÒæÇ²nåó C)mø&¶äe¡G颮-¢ÎË #d™©s9œL¿nÄù ~¡ß°êÛfܲ¥­m5\Ö”´õ2ÑCа爡5Mqµ¤¿̸\ w|­ éócÙ7riócÙ7rÂEnTC¥ÕR[\/dYùšŠŠ¿Ø»lÌÇCfÑ×^|'‹¸­[k)¨ª)â–¶ŽŠwS –ES3Y™òHtp†|ÛDlº"ÇWß{Û†PúFÿ6=“w&ÿ6=“w(‘NMTÍYaÇQQ!’WÍ>'½xêjÈänÁO#€iv6‹ÜÐ|‡•grGæÜ{?¾zзü¬Ÿm¿ÑÉì4‡ù±ì›¹4‡ù±ì›¹Dˆ"¯¶¨ì¨=£YEG €IPc¥×uî»]Àêú—ºKR B••TSÒÔÓ¾üÂö:ãq¸GX#þ‹3–uZì >Žƒ¤ÄÖ¶ø™}4ã¾›Ç}þÈãâQÚ6äoe”ã”tÔvtðJémZWDØß3 #k¤ÆÀ|§·~Ͻu᪥µ ®ŒÉI=-C׺ ÇmÇ+\Ò>¢•O¤?ÍdÝËåY]&“bO[[£ÑPY®¯~Gq£¡—6ç÷²qƒs¼-!}'L¥Ïft˜s¹ÌÎ àÅœÁ Þvúî;µñ$ŽÍ!þl{&îM!þl{&îQ" Ì¢®¨†š…±ÁüÎT4‡ù±ì›¹xš¹´ÐI<ï‚(ci{ä{Öµ ^I$jyW•I•z¬FÈu2*Ú9¤qâdl©‰Ïq>Fµ ’x€”t™AgZ²J+BÏ©cå0±Ðº7‡<7h#ØA7qÜ/]ºCüØöMܰ9GmQÔ:†ÒÉçSZ5ÔóÈZúvç[+ÛGVèãÄÏÞOx ã“¿– ¢´›cÖ™-º:†:X™£ loŽÇŸF5·1­6çbF6h}#H›É»—‰«›M“Îø"†6—¾G±kZä’F •bò2Û´-ºéU\Éa‚‘¡­€±ñÊí&¦<î0Ð\K`f±…¦òCEà ®ÊJ·>Ø¡md"ž¢š¶™ÔTGŸˆ2šWg"0öµÆ0C#kÁÂ1 2‡Ôâ®lì/…ðHÐç0¹ŒaÍ%®‡ ‚<„ïH›É»–%~HŸýÊ¿ÿ»•] ªš²y2 bû I›kCAvq‚ów»—ŠóÊUª£ϨÛ$÷¬Wˆ"¦ðj¿}ÔJ£,~hÚ_uý·¦ðj¿}ÔJ£,~hÚ_uýÂ{>Ã?(\´¿'Ñ~vÕÕQãØgå Š*:Zx ˜£†8ÍÓÃuíh÷þ¤ö½ ÑÓèVŒîc;çAF÷´I»×DqUÇÝ4^ж}Aû•¾:žƒ&ÚÚc©è2m¡í ¨îš/E[> ýÉÝ4^ж}Aû•¾:žƒ&ÚÚc©è2m¡í ¨îš/E[> ýÉÝ4^ж}Aû•¾:žƒ&ÚÚc©è2m¡í ¨îš/E[> ýÉÝ4^ж}Aû•¾:žƒ&ÚÚc©è2m¡í ¨îš/E[> ýËžŠ©öŽW2­”U°BÊÆ]QNèÆ##‘wÿÁ_ã©è2m¡í¦:žƒ&ÚÚ ™3)Þ٤ł3ØZ\nÍÀ^Iú†µEÝ4^ж}Aû•¾:žƒ&ÚÚc©è2m¡í ¨îš/E[> ýÉÝ4^ж}Aû•¾:žƒ&ÚÚc©è2m¡í ¨îš/E[> ýÉÝ4^ж}Aû•¾:žƒ&ÚÚc©è2m¡í ¨îš/E[> ýÉÝ4^ж}Aû•¾:žƒ&ÚÚc©è2m¡í ¨îš/E[> ýÉÝ4^ж}Aû•¾:žƒ&ÚÚc©è2m¡í «ÉX¥‡'`dÑIó“;Œ-pWx:Æ¢ °¯µ"³i@}=\î‘âæÓSºRòn1ÇÇÿB¤ÇSÐdÛCÛLu=M´=´ÓEè«gÔ¹;¦‹ÑVϨ?r·ÇSÐdÛCÛLu=M´=´ÓEè«gÔ¹;¦‹ÑVϨ?r·ÇSÐdÛCÛLu=M´=´ÓEè«gÔ¹;¦‹ÑVϨ?r·ÇSÐdÛCÛLu=M´=´ÓEè«gÔ¹;¦‹ÑVϨ?r·ÇSÐdÛCÛLu=M´=´›NÓ6³¬ø ³m69•ðHçKFö´4<^I»W*Õ¨±Ôô6ÐöÓOA“mm¨¢ÇSÐdÛCÛLu=M´=´¡*¯´mèh掟B´gsß: 7½ ’MØ®¸ê#‹ú®¼u=M´=´ÇSÐdÛCÛAQÝ4^ж}Aû“ºh½lúƒ÷+|u=M´=´ÇSÐdÛCÛAQÝ4^ж}Aû“ºh½lúƒ÷+|u=M´=´ÇSÐdÛCÛAQÝ4^ж}Aû“ºh½lúƒ÷+|u=M´=´ÇSÐdÛCÛAQÝ4^ж}Aû“ºh½lúƒ÷+|u=M´=´ÇSÐdÛCÛAAETûG+™VÊ*Ø!eã.¨§tc‘„ È»Šÿà´Š,u=M´=´ÇSÐdÛCÛ@¦ðj¿}ÔJU;$dRºXón’rðÒö¸Ý‚6Þp’8ÚTˆ *_“è¿ »j•sÃ¥GKO¡“pǺxn½­þÿÔƒžÑ·¡£š:} ÑÌg|è(Þö‚I7bºã¨Ž/ê¸û¦‹ÑVϨ?r·ÇSÐdÛCÛLu=M´=´ÓEè«gÔ¹;¦‹ÑVϨ?r·ÇSÐdÛCÛLu=M´=´ÓEè«gÔ¹;¦‹ÑVϨ?r·ÇSÐdÛCÛLu=M´=´ÓEè«gÔ¹;¦‹ÑVϨ?r·ÇSÐdÛCÛLu=M´=´ÓEè«gÔ¹sÑU>ÑÊæU²Š¶Y@øËª)ÝÄdaò.â¿ø+üu=M´=´ÇSÐdÛCÛA3&e;Û4˜°Fq» KÃY¸ É?PÖ¨»¦‹ÑVϨ?r·ÇSÐdÛCÛLu=M´=´ÓEè«gÔ¹;¦‹ÑVϨ?r·ÇSÐdÛCÛLu=M´=´ÓEè«gÔ¹;¦‹ÑVϨ?r·ÇSÐdÛCÛLu=M´=´ÓEè«gÔ¹;¦‹ÑVϨ?r·ÇSÐdÛCÛLu=M´=´ÓEè«gÔ¹;¦‹ÑVϨ?r·ÇSÐdÛCÛLu=M´=´y+°äì š)"~rg`‘…®Êâ/XÔAVö¤Vm(§«Ò<\ÚjwJ@ÞMÂáÆ8øÿèT˜êz ›h{iާ É¶‡¶‚£ºh½lúƒ÷'tÑz*ÙõîVøêz ›h{iާ É¶‡¶‚£ºh½lúƒ÷'tÑz*ÙõîVøêz ›h{iާ É¶‡¶‚£ºh½lúƒ÷'tÑz*ÙõîVøêz ›h{iާ É¶‡¶‚£ºh½lúƒ÷'tÑz*ÙõîVøêz ›h{iާ É¶‡¶ƒ3iÚfÖuŸm¦Ç2¾ éhÞÖ†‡‹É7jåZµ:žƒ&ÚÚc©è2m¡í •Xêz ›h{iާ É¶‡¶”%Uö½ ÑÓèVŒîc;çAF÷´I»×DqU׎§ É¶‡¶˜êz ›h{h*;¦‹ÑVϨ?rwM¢­ŸP~åoާ É¶‡¶˜êz ›h{h*;¦‹ÑVϨ?rwM¢­ŸP~åoާ É¶‡¶˜êz ›h{h*;¦‹ÑVϨ?rwM¢­ŸP~åoާ É¶‡¶˜êz ›h{h*;¦‹ÑVϨ?rwM¢­ŸP~åoާ É¶‡¶˜êz ›h{h((ªŸhås*ÙE[, |eÕîŒb20yq_ü‘Eާ É¶‡¶˜êz ›h{hÞ W⺉TeÍKWì‘‘JécͺIËÃKÚãvÛyÂHãiTùcóFÒû¯îØÐÔxÁöùB‰KQãØgå $fâkçÈð\/¹¬ÊG/Ô¿0ÁÎI³¤—ÅÁöærÉe-£=5¹fR6д¨é榩‘æÏ£29Ìt!·ŒÔ„6ç»]Ã]ÚøkpÁÎI³¤Ã9&Ìv–J‡)䦧u=¥KXúˆ£l‚Cel³¾*f–’ e4 ZÖ’oÁÄ'î±®ªe65¥5í3´¬0ÀDN':@Ãxš20¹Þ»ˆ (i°ÁÎI³¤Ã9&Ìv–I¹`ÉjRÑEQĬK×+ZèÆmΛÃÙ­¬ bÖFa‚Ÿ, |ñ¿D¬¦¡žš‚¦b2QPèÚ×÷Î\N¡xn=aØBPÚaƒœ“f;I†rM˜í,uéïeS©Þ÷ˆ 5 Á$O2F®kÎh^æßÍÜ &à×éi*tºVM™šë♸^ Ä!Ö°H<`AAÙ†rM˜í. kámµ›^ç>õ{€æ´/7߈ò]w–ý]Jÿ>¡ÿl“Þ±}³hpM‡hZY¬î‰M$ù¼Xqàiu×Ün¾î;—;”Ìyk¬ë 8ˆáIÿöª²ù”íµíË¿*+岬kjѬtÔ”óÎÆ¼ÒæµÎÜF«Â\îRú>Ãö¤ÿûTÎå/£ì?jOÿµU¶¹´²zÎÓM·YY“JǶjXß ¨®À"co½Žx# ‰%¸H#\ÕyaGAf¾®ª–h_H¥šžiéâ|O,Î\ùDfö–žõÄ÷ßQ¸;3¹KèûÚ“ÿíS;”¾°ý©?þÕqÓe•Y7øx+$¥ÎA«3XbfFè¸ÈqÅcn–Ÿ4L2eÕŸ"¢¦Ž² 9iU5L¦!DxãcK{ûÙˆÍÙÀÀ½Øn7–w)}aûRýªgr—Ñöµ'ÿÚª8ræ’²¾–zW½Ô¹Šˆå§aŠG: ILØšÇsà^„cïˆ-7Z ¨ïÑYuòÚ!Ïl” Í # q%ÆAKÔò{ñ«S®ŒîRú>Ãö¤ÿûUæZœ¢†'Ë%†Æ—8ð¤ú€ÿúUÝfWÅjÙTvŒ {a«“±¯85ÍÝ~»ŠZ_%V}Ãÿ)AÅ’öã²'©íGS gJébc ,‘Ìð®߆þ!Æ®ãŽÏ{ÜÐÒzÛøïúÇ"Ç~>aPýõOÿq"Ù7ü¬Ÿm¿ÑÈ`ç$ÙŽÒaƒœ“f;J%š³ë«o¾*êú˜&tó1´RÒ]NøÁvlÅ.|…¯#ÿâ "îð5X`ç$ÙŽÒaƒœ“f;K$̺³Å–ËB²Ž²† ©›ULjLC>Âæ4ZòßKïË@ÇqèòÖ†Ó‚3fÒT×T¹Ò5ÔÔò@ç000¸ãÎfÈØü“ßÝuáØT5X`ç$ÙŽÒaƒœ“f;K?kZ“ÄëQ²l…k#ìÃdly§È{Ù.ÃààF Ü@ W]ž¡ý QÒRI5mDÓ¶yc4môðHbÑiäqsœæG‹× ÷»PÂ5(} ä›1ÚL0s’lÇiqÑÕÁhPÓÖÒ¿9OQe‰÷‰®ƒqÖ5*5©_› I]5DTínÐ ÜäÞx…çëâú×lLkñ—8µ­mú…þP?ºÏå7ˆ³?Üé¿8Z¼\ÿ`~`†rM˜í&9É6c´¢Dნ“f;I†rM˜í,ÎVWÏBÛ%ÖVR2¦´Å4”TÂypæe}Íacïï˜ÛîiÕŽÅ·x¦©š¦¤KhJY§„E1ŸA}úµùu®…G–?4m/ºþá^ ""€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€¦ÍÄÖ1Ï‘à¸_sX”Ž_©B¥—ÅÁöær¡†rM˜í&9É6c´¢T™Y[=Ÿ“îžž¢jwššh̰D%‘¬|ñ±ØZZìNÂãpÂuùh0ÁÎI³¤Ã9&Ìv–.)fÃjO]_YSAKlµôí¦Ÿ9#ÞÌ¥‘€ËÄw=Í ½Ï½÷4áñO–¼'jЛ&’¦ºATÚŠjy)ÜæHÇS–œyÌËû¯>Ä^ ¾9É6c´˜`ç$ÙŽÒÏÁ•6uU ëióÒS¶¦š™¯ »œBXà  Ó²ûî"ã«–¢ÂÊ×ÕG(ŽûNI]”°†Âɳ-3Üç’æ2üs À7ÞýBá¨6ø`ç$ÙŽÒaƒœ“f;J›&ªç´2VÇ­ª~r¢¢Še}Àbs˜ 7 CYò+D²×ÂÛj+66½Î};ê÷Íh^o¿ÿK¼·êêToùõûdžõŠñQåÍKWŠ,~hÚ_uýÂ@ÐÔxÁöùB‰KQãØgå $ËâàûóÁ%RZ´ö‰sóÐA, h# lŽÄŸ®øÛwúŸúsWXu¥Rj*Ù;ä¸4]U+@Èpþœ¥sw#bôyýnnÚŠÛ–º¢ª¢I&lµÀÌL#öf$omãÂ}úï]}õoÉ:†Ûõ´ÖÍd/TiU@BfšGæoiŒÆëZ{ÖñÞâ{;‘±z<þ·7m;‘±z<þ·7mí&LRÙóG UVRÑ·6]Gƒ7!c œA“ScŒ Ö î¿Äy%A5ÍRÖÓAKø›|¦‘²E‹W!ÜW^ëø›‡×r6/GŸÖæí§r6/GŸÖæí¥Ú\›e%)¦ŠÔ´„Æ"¤`•­­i¡¸Z1Ý…£ö˜ïƒxsƒº¨l‘gQEIOYRØblmkNv»ÝAÀá-5­02åÉÜ‹Ñçõ¹»iÜ‹Ñçõ¹»h.bѰµÒ¾R\çbx€I jPáå¸ É7•LÿŸPÿ¶IïXÈØ½[›¶º¨, 6Ì©54°ÈÙK xŸ;ßÞ’ 9ÇÊðAÍ–_1òƒý¶£Ý¹XÛÙu¢¾‚²¢ÐÍœ†hÌÁ¤´Þ× D¨Ÿ­KSC ©K5ŸRÀø*˜è$aqšá„‹Æ±¨ùsõ_’=O_ªí ölúšvRÔÖá’)šådƒ½÷FÐK ^mæôöe”ûB{BšÜ}lÒ¹æxe…Ä2&9€=®n˜Œñ_xÔ@$/ªü‘èòzýWi?Uù#Ñäõú®Ò¡EbX4P³¢´ï„OK>'NÌX©Û Yäâ"_þ®ºíWSÙÖ’¢>µi ¤¤¦ÌPÓÁ\ÉôÚE# \aŒ÷†\œÅåâ8®?Uù#Ñäõú®Ò~«òG£Éëõ]¤ ¬{"¤Ç%]»5ELmpmD•1â/‰íxhh`-tCMÇ\\I⯳Nøªl‹V-:GTWÏ_2<8FÛ°æ$Œ‚"ŒjcHÍg¯íýWäG“×ê»Iú¯É'¯ÕvuXÑRY6MŸAì•´‘Ç…ZðÈ„xn¸ÒF>;ïÕ~K¢ª¶‘¶4ÐpŒU w3¤f)¯!· ÏÔä ·õ_’=O_ªí'ê¿$z<ž¿UÚOèÓæßTÿ÷-“ÊÉöÛý©rr 2–ÄŠ 7GA’¶0ç9Ä‘#±ÜIÖëνzüœK¶¶Ç¥µà±ÏFëÃDÒ0AÖC¾#ÇÅyåSØèUm±‘ÖK]Y3!‘ÓAM+Úc†G5Í.iÃŒê{Àqh¸snñÜe…ÿ?­ToNã,/ùýj£z «'"Ä%5§hTÔÕRÒEO´®i÷ÅsˆcŠ23Þ¿ÀØ¿'K³S bÒm|xÆ›|Nµøq3 ˜ckg‚Á­·ñ¹ÅÒwaÏëUÓ¸Ë þZ¨Þ¨ê’Ë‚WY¤¾oþ&r+ä..9§Çß9×—w¯&ûï&âOôôyIfųí úYãkcmC N~1ÜöÜEÃ?(Q)j<`û ü¡D€ˆŠ" """ "" i¿ÍCöÛýTJZoóPý¶ÿU£iåmU­l@ËNÇkè$kiì¹#&ª³ö1ÈÃóœòÆÜÇkNâ]Ñ[µU9[[e6رé´j–FÊ)a.©š<Ìr9Í9Ñç8€‡Ë­vÕäþ•gå&•‡†q÷Ù»ó8©Ùý÷‹ÉÇwÖ‘YV¥-³[UKhѶ’²¥“Ë´nt‚è㌆¼J¼F%¦â|¨Öö(¦¡1ÝHo†ž£{$ñë•¡×Üu8»ážÿqXVÝ©5‡UjºŽV[1°Ä)`tF˜]6b{±7 \1 $5D·Ý6GÃJÊ9Ù[Rm'mCê,ŽòsÎæØd”jîp‘Ĥ±2rª‚žÌ§´-jâ²£k(Û 1†â#1ã}ïv'`.ì#¾q œ8_ª—/4¬—°k›ÿ´ji©æƒ‰Æö [Šö³ ÚZMþ6+ü%Ý`ÛµVµ­S ­‹èõ51¾ÎФ²8åtms7_sI8.ï®ò‚”ùKMgÑÂÉÿÄSÇC¦Í £ÈÇ—ñ‡H#c\o:™»l«*Ô³*$„hä³ßS<ù­ ÂQ‘ò]œÎ‘©ÏãÁ¬'¿í+c¯ huM1plaÄS¸àh@Ǩ8jhׄë%ÜK©AG’?6àûÙýóÖ…¿ådûmþŽYì‘ù·ÞÏïž´-ÿ+'Ûoôr{6•|´uöDµ…µ•n‚Bào K%ã_ñŽ]W®(²Ó'¥¢ÓE¤ÆÒ±ây#{æ¹ÍeáÎöµÄxÜì%X×Yúme™QÁ¡T™ðá¿ñIÜz¼e÷ëâ»Ê©G_G`Á§ü“M³>7´ò_áw·è×]¯Ã¿É¬,NSÙbH$©sœç70Ê9;HœP†gs å \öyÍ¿ª¦×¡¥¡†±Óç žìɧc¦t׋ưþôw êñUT¹9UµSkÐZÅW4 TSck sni.¾„:û€$\u=FOû3IbÑUfÙKqFùãÎb 4» cƒ…ÁÁÌssZAÕq| ÆQYNªŠUg3¸0Ín| ¼Æ™@,kœÛp'nð¿…™cd»5;j¦’ ˜âuýPÓZVÌ´ì{šÊHê[6ßI#ÇÞñÍ1Ý…Ä:üBîô«uCfdì¶MSêiëXéªVrZçg䘖á„_4À]uìÖpœvñ²¨HÓ,йý᱓{† x×6ðuwÇXÃÄ‚«)¼E™þçMù¼TyMâ,Ï÷:oÎâ"(ˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€¥—ÅÁöær‰K/‹ƒìÌåDJ‡*-™lx¬ãm jªóUW4º8Ûš‘üXÙ¬–áyUò⮳ôÚË2£;ƒB©3áÃ~;â’;¸õxËï×Åw•U›”±ºÍ𦶢–2§1M/{+{ƾø£i{uïi .ñO:® •tœ%RÇIŠ‘´ÔòB#†GÌù^ùÚöfÀ..ng[pânßÄnñiäŒV‘«|’SJém×G](šáNØ0½˜†1p.Ûq-ã»_ÙO+ßÐ8ÆØ³pIg0Ò‡´Ô| ‹ÛuK®Þ ZKœo½ð/¥Ê6X*Ÿ,Ú<Ø¿jÚi "Ânvt†Ýx8ðÝs¯» ¸ü¢²£’¦7U\ê{ñ~ÍÝù -ŒÝûGˆ‡84ŒD´ÿG쯲Å&³Z 3à"k1¯Žœ¹Ïq};æˆ]{ξøÈï$´—X×䣭i6¦¹’AVèäl.¦®{×´Ì/º@0µšƒ Œaqq s_î‚Ѧ´ t´Îy v²HÝØë¹Ìpi¸ƒqðAâ ®¥W`ØÌ±(_[FÓ$¦G6Ž‘´Ñpë'‰¢òç8ß~°.Ñþ}CþÙ'½b¼ToùõûdžõŠñQåÍKWŠ,~hÚ_uýÂ@ÐÔxÁöùB‰GYVYY™e4²¹°ÆòXZ\8Èä**oGÔõ£í êEË¥Mèúž´}´Ò¦ô}OZ>Ú¤\ºTÞ©ëGÛM*oGÔõ£í êEË¥Mèúž´}´Ò¦ô}OZ>Ú¤\ºTÞ©ëGÛM*oGÔõ£í êEË¥Mèúž´}´Ò¦ô}OZ>Ú—cÂsr:'ÝÞÈÐ iòx"ñõ‚'s²ú~ÙÛ3°¬´©½SÖ¶šTÞ©ëGÛA[Ü쾟¶vÌì's²ú~ÙÛ3°¬´©½SÖ¶šTÞ©ëGÛA[Ü쾟¶vÌì's²ú~ÙÛ3°¬´©½SÖ¶šTÞ©ëGÛA[Ü쾟¶vÌì's²ú~ÙÛ3°¬´©½SÖ¶šTÞ©ëGÛA[Ü쾟¶vÌì's²ú~ÙÛ3°¬´©½SÖ¶šTÞ©ëGÛAùfYÑYV|tpÉ$Œas±HF"\âã}À2|‰hQK]"e¡WHÐìGFsZ\|—’Òu^x®ãÿEû¥Mèúž´}´Ò¦ô}OZ>Ú Þçeôý³¶ga;—ÓöÎÙ…e¥Mèúž´}´Ò¦ô}OZ>Ú Þçeôý³¶ga;—ÓöÎÙ…e¥Mèúž´}´Ò¦ô}OZ>Ú Þçeôý³¶ga;—ÓöÎÙ…e¥Mèúž´}´Ò¦ô}OZ>Ú Þçeôý³¶ga;—ÓöÎÙ…e¥Mèúž´}´Ò¦ô}OZ>Ú ÎæC¦óÚöCa•“69daisH"þóêW«—J›Ñõ=hûi¥Mèúž´}´H¹t©½SÖ¶šTÞ©ëGÛAÔ‹—J›Ñõ=hûi¥Mèúž´}´H¹t©½SÖ¶šTÞ©ëGÛAÔ‹—J›Ñõ=hûi¥Mèúž´}´H¹t©½SÖ¶šTÞ©ëGÛAÔ‹—J›Ñõ=hûi¥Mèúž´}´H¹t©½SÖ¶šTÞ©ëGÛAÔ‹—J›Ñõ=hûi¥Mèúž´}´H¹t©½SÖ¶šTÞ©ëGÛAÔ‹—J›Ñõ=hûi¥Mèúž´}´H¹t©½SÖ¶šTÞ©ëGÛAÔ‹—J›Ñõ=hûi¥Mèúž´}´H¹t©½SÖ¶šTÞ©ëGÛAÔ‹—J›Ñõ=hûi¥Mèúž´}´H¹t©½SÖ¶šTÞ©ëGÛAÔ‹—J›Ñõ=hûi¥Mèúž´}´H¹t©½SÖ¶šTÞ©ëGÛAÔ‹—J›Ñõ=hûi¥Mèúž´}´H¹t©½SÖ¶šTÞ©ëGÛAÔ‹—J›Ñõ=hûi¥Mèúž´}´H¹t©½SÖ¶šTÞ©ëGÛAÔ‹—J›Ñõ=hûi¥Mèúž´}´H¹t©½SÖ¶šTÞ©ëGÛAÔ‹—J›Ñõ=hûi¥Mèúž´}´H¹t©½SÖ¶šTÞ©ëGÛAÔ‹—J›Ñõ=hûi¥Mèúž´}´J¶ºÉšº£;Ã;CC[cZÑÔ'Œ“¬ž>EÑ¥Mèúž´}´Ò¦ô}OZ>Ú Þçeôý³¶ga;—ÓöÎÙ…e¥Mèúž´}´Ò¦ô}OZ>Ú Þçeôý³¶ga;—ÓöÎÙ…e¥Mèúž´}´Ò¦ô}OZ>Ú Þçeôý³¶ga;—ÓöÎÙ…e¥Mèúž´}´Ò¦ô}OZ>Ú Þçeôý³¶ga;—ÓöÎÙ…e¥Mèúž´}´Ò¦ô}OZ>Ú: ”VŽœúúÚ©³F¤=®¤‚xšB¶\ºTÞ©ëGÛM*oGÔõ£í êTycóFÒû¯î–•7£êzÑöÕVU:Ir6Õ{à’ØÀïËM÷Ÿ%Äò$ ²Š×}VùÙMž/Šž™Ñ¾±Îk"p¹ÑÆ ÿdÒ.ïY„w­óEÐQÚöÅ£gÛ—É5dl5´´ôÐ2“4ÐÈèØçÉ(aÂðçÊÆß鿾·Ê:ªÊ* Y¨ædDÚ‘KŠgËl’¹¯sáª18= ´=®ck°œ%Ââ[sI ƒ챩‚Ò–¡Ö}fv¦š–(h¤dÀ2\ueîÂ#t¥°Þo—†‹ðö×åèlºzçÙsjóVS¹“‰`c\F ѹ®ÂòÓ.h<öÃ’Yaœ1ØXÜìuŽdƒ y&Yop8؉¼¯YdÕÒŠi sb1˜¤×¾#3I$‰ ^ ——<÷äë{÷àTÕ塤–ÐQ1º3³q@ù^*¥q•±5ùœÙ&çj‘…÷‹®iuí6m¿5]‡WhTYU‘KK;!“ØZû!#ç_~mo|Öç±ù-A,•2LÇLùï½ÓV¹æ;Üû"çœ×|{Ì74þèºzkž’†jHq5“bÎHké^H»”»uÀo¼"à ÌPå©i[–l4ñÙ®ŠHêt¨b¬s³xN/uð‡6Vç D7Y‹–¿-jä‘ô´4ÌlÏžQÎ ¹š˜T1:÷¾.semÎ8.$ƒàâÕE’Ôæ%†S(ŸMq•äÝx|˜ñ=§ k‰1 ‹š.¹d²G<@ã|f&5Õï,…¥ÍuÑ4¾è®sFÜ8[u×G9Ê)b‚¬ÏDÆÍKhRнŒ˜¹¥Ó/p%£SLüšðù/Õ“”uV´3¾+>˃Hê’Ú˜c{î.š7±¹·^àÛÜqÂH¸žù2FΖxf{e.‰Ñ>î6GÆZXùŽé07¾x$á“pRC’ÔÂèð:\rÅ+ŸQZé¤&7‡Æ1½åØZáxm÷^N­fø"´í:ªzêZ Hj*çŽI€¨œÃdeÝðcÎ+äeà ×_¬\§¢Ë)kÀ­ŠÍ`²Lô°gPDøª ™û,nvßñ~ t–…ƒOiæÍF&¾;ðKOXè$Ý{qÆæ» ¸/¸–ƒv «¨ò.Š–Ó©¬$9²O°Ó6 ²C"Ž6 Ð~mÄÃ-¼7x  ¢¦ËÚšÊM& læ #åÏE„²ÇDt!­wíC®ŒÈkµêél›FZñWM; ª£Ÿ1;#”ÈÌEŒaqkIdoF»Æ°/>cÉ .#{iÁÌtm}cœØp=²5±‚û£n&0ámÍ8¸¬`³#¦š¦X[_U –cžƒËõ]ë5r ôŠ]þt{VïMþt{VïA)twùÑí[½4wùÑí[½H¥ÑßçGµnôÑßçGµnô"—GÕ»ÓGÕ»ÐDŠ]þt{VïMþt{VïA)twùÑí[½4wùÑí[½H¥ÑßçGµnôÑßçGµnô"—GÕ»ÓGÕ»ÐDŠ]þt{VïMþt{VïA)twùÑí[½4wùÑí[½H¥ÑßçGµnôÑßçGµnô"—GÕ»ÓGÕ»ÐDŠ]þt{VïMþt{VïA)twùÑí[½4wùÑí[½H¥ÑßçGµnôÑßçGµnô"—GÕ»ÓGÕ»ÐDŠ]þt{VïMþt{VïA)twùÑí[½4wùÑí[½H¥ÑßçGµnôÑßçGµnô"—GÕ»ÓGÕ»ÐDŠ]þt{VïMþt{VïA)twùÑí[½4wùÑí[½H¥ÑßçGµnôÑßçGµnô"—GÕ»ÓGÕ»ÐDŠ]þt{VïMþt{VïA)twùÑí[½4wùÑí[½H¥ÑßçGµnôÑßçGµnô"—GÕ»ÓGÕ»ÐDŠ]þt{VïMþt{VïA)twùÑí[½4wùÑí[½H¥ÑßçGµnôÑßçGµnô"—GÕ»ÓGÕ»ÐDŠ]þt{VïMþt{VïA)twùÑí[½4wùÑí[½J£+þcÚße¿Ý^hïó£Ú·z¥Ë&ò"Õs/-i¯—“ýR?GÃh×=åﬨsœo$ÊâIþ+óO¬ésí "Ú}gKŸhSO¬ésí "ŸYÒçÚÓë:\ûBˆ§Öt¹ö…4úΗ>Т iõ.}¡M>³¥Ï´(ˆ}gKŸhSO¬ésí "ŸYÒçÚÓë:\ûBˆ§Öt¹ö…4úΗ>Т iõ.}¡M>³¥Ï´(ˆ}gKŸhSO¬ésí "ŸYÒçÚÓë:\ûBˆ§Öt¹ö…4úΗ>Т iõ.}¡M>³¥Ï´(ˆ}gKŸhSO¬ésí "ŸYÒçÚÓë:\ûBˆ§Öt¹ö…4úΗ>Т iõ.}¡M>³¥Ï´(ˆ}gKŸhSO¬ésí "ŸYÒçÚÓë:\ûBˆ§Öt¹ö…4úΗ>Т iõ.}¡M>³¥Ï´(ˆ}gKŸhSO¬ésí "ŸYÒçÚÓë:\ûBˆ§Öt¹ö…4úΗ>Т iõ.}¡M>³¥Ï´(ˆ}gKŸhSO¬ésí "ŸYÒçÚÓë:\ûBˆ§Öt¹ö…4úΗ>Т iõ.}¡M>³¥Ï´(ˆ}gKŸhSO¬ésí "ŸYÒçÚÓë:\ûBˆ§Öt¹ö…4úΗ>Т iõ.}¡M>³¥Ï´(ˆ}gKŸhSO¬ésí "ŸYÒçÚÓë:\ûBˆ§Öt¹ö…4úΗ>Т iõ.}¡M>³¥Ï´(ˆ}gKŸhSO¬ésí "ŸYÒçÚÓë:\ûBˆ§Öt¹ö…4úΗ>Т iõ.}¡M>³¥Ï´(ˆ}gKŸhSO¬ésí "ŸYÒçÚÓë:\ûBˆ§Öt¹ö…4úΗ>Т iõ.}¡M>³¥Ï´(ˆ}gKŸhSO¬ésí "ŸYÒçÚÓë:\ûBˆ§Öt¹ö…4úΗ>Т iõ.}¡M>³¥Ï´(ˆ}gKŸhWã«jžÒ×TÌZEÄ Ä" ÿÙPythonCard-0.8.2/tools/standaloneBuilder/doc/pic27.jpg0000755000076500007650000026423610231140007022510 0ustar alexalex00000000000000ÿØÿàJFIFÿÛCÿÛCÿÀ`†"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ý²ÿ‚žÁN¼Mÿññìéá/~Í6?´©ñ×B×LÑ4«ÍÃúîŸ௠ü)Ôn–ÞøCñ'WñUçˆ.<srà}Žk¦»¶¥Þ,¿5$ÿƒˆ¿i(ƒà”þ7Œ RÆMH PÌQKý’PάªN`Td‚+éÿø*Ÿ‡<3ãø)ü'Â^3ðîƒâï xŸâ¯ˆ|?âO ø£GÓ¼AáÏhÚLJf ?PÒ5½V¶¼Ó5]2þÚâKkËûYín!‘£š&BEBðï/ØþŒoö=ÿÄfø-ÿÌM~Õ‘Qð›$àž̸¿„3Œ÷8Ï£ŸU«‰ËsÌvœhåÙæ/AN„qô¨Æ^Ʀ½EÆ’”ùªJrf•xó͇slŸ/ËòúcK3Ëå‹©:øÌ<ªUTåIEòARŒß´œ¤åVÉÆŠ?’ÿÁË_|ikã?ø&½÷„,o§{[+ßxËIÐ-/.£å{k[WöSµ†âá#ŠGhbwuDwe ŒÃ”þšÕÙ°ÿ°×…ãÆ7ø³àào‘I%¿f\¨ŠBÃ?& r‹ËÛý«ÿ$þÎ?³·À¯ÙB½ø%ðà¯ÁÝCÄ7¶»}ð³ág~^ëVv?þ Ïkk«]xK@Ò®5‹™n!‚íæ†äi‘c‘ŒƒãØöZý?aoø8övýŽþéß|Yñ_àêø„øãã§~'x¾ü@4ÿ‚yüDø…â_øD¾h_ô/|:yú-zÿP‹ZðçÛ`òó^Åq]À¹ŒeK/âLÏ–â8“;öÕ0¼3K (ÔüK¢x›RñOÃé-~øWö1ñ·ìïÓQÒàšëG×&ñ_ÃooøÉÿŸý‰þüý¢¿iýCÅ¿´ÆO…þý’¿àœ¿µ7Â_ü?ø¯àßß_XþÚ¿>%|'ñ6¬üWñïì©w©ø»EÑ5/ZxóÀ¾%ºýœ¾ xŠë+á?ü;ÒõÛiµ˜½ðw‚ÐÄSÃ>ÇÏWòøÑ§šçÓ”s5®–YV¢ÏU8¨æ7÷ªÔ†¦}j–*te 9†kÆ2ŒêhÑTáIWs–“Ã<ǬDWÔTçOêöÒ1ucS÷R¤¦š^ìŸðt&®ä“ûød*今~ b ,Œ@ögÁb±¹²¯³"$ŽšÿÁκÃcìKá„Ïü,ÿœ  çög\Y‰ÜT¨_œ!K•¶ó?ÿÁ?eŸ€?üEá‰?ý >)øWÅ_ðT¿ÙËþ ãð²x£á×Â?øÿ¾ø/ãûüPñ|'øÏ§|O×<%¦|Pð÷‚SÃÞð×Â;fÿÂ:ÏŒ[WÑ-üYcáoóÿ?à–_ðNOÙËÂúV¹ûJþÕß>鿾>ÿÁBþ|/ñuä>!ñ ï€|?û&üf×~|8¼Ô~|/ý”þ)[|xÕµ?èšG‰¾*Ϩ|gýì­ü7â{}+Àf£áûíBÛÃWxO©ðÎm‹XøS©XLOâ+c#<LÂj†žk<[ %Õ*ÂxxÎ^ÆP¡Ó•5Sj™SsçÌp´=Š—·öÐË)“zt"çVXUFÓ«:qŒ£QÅs'7M)8û¢ÿÁÍÚ¹ëûø\tòSüžqŽ?ᛞxÆàððsf®FOìUáqëÿ?Á„dŒÿ&Ø:òÀ铎qí‘û/üø‘û3üý«þ6Éñ/_ð¯ì}ÿYÿ‚LÛéÿ þø³Âÿ µÔï>&x·á×Åý;ÃÚ/‚ôíU½¹Ð ø_ª^øž÷SÓ¼¿xb â=gñçüƒö]ø ñ[Ä>ø‘ãÏ<)âŸø*ìéÿøø_oàü<øKâx{ãçÀ¯üxo‰^<ֵ߉ºÏ…t߉¾ðRøwÃÞøMc­_xOXñaÕ4x<[cá_ã„áŸ*QOÂØÊ8®|U7†¥œqu:Ø5–ÕÄÑ¥^Y¶Tp™ÆYŠ©*ª…)GéP«Z½ ôé¹f_®LΔérÑ—´–/¦Ôk}b4ç8,,ÚS«ƒÄÓJRN’”Ô!8HôHÿàåíeÈö-ðºœá±ñ3ÁÄ(ÞW'?³jœå_ …ÚÃTGtm®/ü©«3ûxX7ñ+Á‡ocÉýœ#!€à>`¸“ËùÛöKýŠþü"ý¤ÿàªþø¿ðÅÿ?g„ÿ²ü²ßà/‹>$x[C³Ôê^:ø}ûMþÐÀ¿ \xÛá6•ÿîðû|ÒôïÚ#Wдë7Á?5ÝgKðÝ•çÄÅÖ>ðß‚¢µ¶µ³×Âá^"¥nÅ,áyq”sœö¼*ÕÄåøÌÂ8g ëÛB´)àkQšpöpÄZjÓµGOy·ÔöP†eIÖ¨ê^”°˜(J0¥ˆÃáœÔž BP”«BqqnNšrŒ_»Íô ÿƒ”us×ö4ð¸õÿ‹“àÎ:zþÎ#ÔçÓ<î b?ø9'W“þlÛÂÀ¿ÿÁÙO¾psû8ªîÚ…°\(S¹Ù9ÚÏ/ø*/‚~|=ðü§NðÂàŠ^7ÿ‚p~È¿|Añ¹ý‹ý«ð¯Â:Ç«øûSD½Õ¯¿á(Ôüyð/Àÿ /$ðÝôøsYo|Lñ_›«ÝAsá×Ö¼9ouâ]+ÞË<.ðÃ2ËðØåÂxÌ:ÅÔ¯J”%›qàÖ©GÚT©†Í*Ò£Jn›pž"T5÷Zæ´NLGq.¥Z_Ú´ª:Q§)Iap׿O–1«…„§8§f©ûM´vÕE‘ÿÁǚÌ·ìuátë~"x7=‚~ΉÁËõÚWhÄÉãþ6ÕûþÇž_ˆ^ öÿ«vúõÇNq‡Ùð¯íß}£þÍ? ?aß…?>ü ðç†>4ÿÁ4¾|\ø™ªë³ßÀψüAñ+ãL¿gøƒâø>2|GøsâŒÕ¯Ú+uðûøkÆú>ƒNÒ­¼mákm'NNú«ÆÿðG€íãÏÚ#à>$ü\ðÿÄïÙ_âçü‡ágŒ~*ø¶çÁ¾3ð'ÅQûrk>ðgˆuï ü Ѽà?ü-ÿ„Ä>1³ñ‹¦j>*.³£h÷>¾Ô¬ouH|W£x‚ü%¡‡Ââñü5[ ‡ÇË,+ŽuÄ˜Š‘ÂÐÍ0<±ÊpÌ#ì[Ì3L¾Š£Bxº‰b•MhÑÄU¥Õý±Ås«Z• Ê5g‡5U<]N>Ö¦¾1S¤åA¹¥‡Âb'ÏQQ_ºå·<éF~Š¿ðqŽ®ÀŸøcï ŒI|@!Y±‘û;õ! ÅU\¥Èÿàâ]eÎìƒáuÁù±ãï6Õß³$ÙÝNx|©©_o—tm}¯á÷ìCðãgìýeûøûâßï†ÿ‚ãügøWãx³Æ> ø—㿆ý>)k ×¼3s¤|0ø]áïÿÂwáÿÙèÚ6—ªxÇ'ÀºÍýψnõ/ÙÆ×ð+ö¬øyûø2Óá6§û)ügÕþ#êþ•⨾/xP9ñ-ŸÃmEñ ¸ð¶© üRñ¯ìáû,Mã]'Ç^Ô#yô8¾i7¾ñ…µË{½{^Óu- óHy?xSœãj`)p~cG ·u™ñ&"…,5EŠ–ÄÑÌåC,jÀãsœã”aFU=½|=*¯œñF ŒqͰò¦à¿æ.§9U±U©Ñ§S••Z‹œ£¾Y9¨òSœ£û,¿ðpæ°qŸÙÂÀñ¸ø1€9‚gµ$g<•S‘‚å¼ÁÃ:¹ëû#ø\zÿÅwà܃€qƒû>|žƒãæ ÙþÕ³ìéûAÿÁTt?ø'烵='ெ'øƒák^ðGÂØ›ö`øccáè_²åßÅÏÁáÚCÂ:ä¼cªxÅâ6Ñh;ø~¾ ðÖ½âÙµÙ4ïÃðÏÃV¿³§|+øKñ·þ Çû7Ýø_Eñg‚|ð×þ ñÿ‚ø¿à­Çüøßâ›oxã¯Á¸Å¦©âÿüÓô?ûGV¿Õol¼]ðÇÀß ~(øWNšÓKðÏ´ë¨õmc[ñ×xX°ù-ypv"/7†RÏxšœp<Ó-Îqù}Z’©‰„ñ5±3É1t<-:¸h(ο×?«¬GTs)ö˜ÚÛ—Ô別G–Éâ+aq8,>"P¦Õ(SXÚU9ªÊ5t¡/iì|ö?ø8?Xr~É^Œó–ñσ†Á™ÎgÀ S’7 39TŠvŠòÁÀzÃc?²w…—¦ïø­¼Ê©û?GžKƒ¥v€áXL°dþÖ¿±ïì«ñ þ 7ûjx'Aø}⟄ ý“¿eOþÓÞ<ðŸÂoáÇ„|)ñ xàoÁ½[Âþ øS YüM#à^jÞ.¸Õ•ÇjðMÏØóÁ |}ûEüCñÇí'¥|*Ò?fŸø'·íA¢xWÁð«|añÚ/íaãŸø/ÇÿuMS[ðÿßøëTµ›Àøð-´ÿ†Vž‹Ä ©ë>ñÉð´zˆú©pÇ„ÃeØŠ¼-˜áêfX\£K Ï>ÄÔUs©á#‚Â'C8©í+T†2dâ”)òÍÃ¥††s./\M:Y¦qÃUÅÓ•G‡ÀÒ‡. 5e^¯ïpqå„=„àï'.xÝFT­Uúhÿ‚ÿjçñŠ3ÿ¯ƒ23·œ€Cƒ“Žür²Tÿ‚üêîyý”¼0g{ø5¶áKàð’UXŒ•),UC2ü—ÿöð§‚.¿cßø(ÇÄ]v?€>ñŸÃƒû ÿÂñcö‚ø/¤|jð×ÃAãŠ2ÐüPmü;yðãv«ñ–•>hß5Ú„º-î¢tËm!5è_~É_°üã¯í#âÏÙ¯ÆÇà?ƒ>ü}ðwÄé>/ñ'†¾ü8oؘø2ÚßãwăžÕ¼3ãøwÅZOÅÄÞ%Ò—Æ6þøMðëÀ^6øq¤k:ƒ®®G†4±<áv›QÆð†aO”T… NiK4âJøhW©…ÉqT©TäÌ#JºÎè„!RµY<.*u©Ð¥õy׊Çb0øJ”sz¯ŒŒ§G ,>[N«„jãiJQ¾íAà&æåE{JJrö‘¥ÞÇÿìÕÜàþÊþÎà<_àö*AÚð Àa'Þ*T#oÑΰZð^=[¿ìµáø«üëŽÿ:7\`Œm—Ê¥á/þÌðçüŸÅ_ >xªÛ\ø‘ûe|V_|K¼¼ø{áOê> ðoíÙà-3ƒöŠÓô†úåçÅ?Ú|8’ÃÃÚ2èÞ?ðN“à-SûVm6=sBxtk.×Ä?ðO/‚ßµÿí)âÏi>&ø¡ðÃþßø*íAû7|^Òõ oÂ?á"ÿ„?À^;ý¡µ?|7¾¶ðW€¿á\løKÄ>±ð~, ø‡E×î5Ým¼+y¢ø›Ï— øUBu'ánF9é‹©œç•¥“æX캪xZ¤ë(Ö–_]ÁÙÔ…KS©J4ùq3µ˜ñmE‡Îhׯ9`Ôh, ¬f ‰ƒUª`ãMºkMI9(¸ûÑ“•éÚð^\õý–ü.:ÌÝàÞûꃎ>c×Ç8;Â]‡þ ©¬Ê?²ï†ç?á+ðk;ŠàŸøQ òUÀù@$u ³´Eð×þ ýû1üAøAá_ÚSÏøñ£ü;ñ/ìoûf~Ðßðªć·þ5±ñ§ì‹ñOÁžþËÿ…¹ÿ BÇC¸ð·Ä-ÅAþÄ~[jþÕlàÖ|Igr4»?K›öZøEû4~Ì´§íàéž,ñ³û'ÿÁ=¾<| ‹ã§„¾üi¼ø;kûN|Wñ‡ñ#Â7>(ð@øcãÍNQàT‡MñõçÂ/ ëZV~ÚF“o¥H5WYÞ· xKý^ ã'‹y¦4ªæÙí*k1«œRÉjaªVŽoYEa±U'*õéÓ«FThÔž¦"r¥N¤¬Ó‹½Ÿµ–gJ–¦2SŽ9}Vž ã•XÂXJiº”T:r•9ª“„jªQS”7“þ “«²©oÙ‹Âë â‚¿{#ð-2FÓÁÚG%‚…}’ø.6¬N?á™ü<ÒgOj~0Oñ§ö…ý¡þ4þÎÖôÿ x.÷ám¶±ð£öÄðÇÀiþ kš4úÞ™â½Lá̺æ³ì5ŸÝøÆÚžƾ Ð|7umâ-«p„¸LrËqy&8µR4gõlˈñxok#ŠtëÒÌy§OKˆX§:TjÓqW£ngOžŽsÆè}fžcFÒœ}®.¡W“ÛÑ¡Gšœð©)W•zN’Œç '¥M¯ìQÁoµyyÿ†gð²ßñSø7+N>o¨¤à~ppÎUVc èÿà¶:ËŒŸÙ«ÂêsŸø79Ú¬0ÁÈ?6 Á ê­½#àiÿü5øaÿóøŸð³áf•ã}?Ãß ¿à¬¾6ømy{ãÿh2Ö¼C¬xàwˆ|;qâ‹k|<øoc¡éÚ½ŽŸ§M†¤°×®´‰–öGñmä3A•ï¿¿c?‡ºçì]á‚ú¿„þMûE~ÒŸ³÷Æ¿Ú#Â’kž'øíoã­?Yøy­~ËøQ{«ÞEâ­3áÅ?‡^ ñ®¹ãØÒù4‚¾3±ÕüUðîynô›n ü3ánK0¯ÂÕ¨R­›ÕËa çùé 5 Z¯™Wÿ…^JThá£*•!Í%ÎQάRèþÓâÚ˜‰á¨æð”é࣊meø&¥VuXJì®R©R«Q„œcxÆsQä§wÃÿÃêõ~ÿ³w…Æ:ÿÅEàÎÍÓ?À'å9ŒdÙ"ÿÁiõc×öpð²õëâöǧÁ.§3€7”C–j¿°À‰|Ÿ¡êŸô߉IÿËÑ¿à Sx·Uñgƒu6³ –GÄ ¡ø{iðÓÃúü:v©Z¢hþ(“â„—z —vÞhž!]2hµ¥|=û | ø[ûRø²†¯Å›ö4ý¨¿àžÒÝê~>ñWƒ¼c£üNÑÿh_ˆ~ K‹mÃß ¼{à]O·º¶Ÿ=¾­&¿ãK=ZßO»´}'I–þÞÿEu¸sÂ*PŸ/ãeZªÕTå™ç°‹ŠÅeù} “šÍªrRÄãó<0jn¤ëV¡ åR.ŽcÆSk›2£ÈåóÇ €mIѯˆœc©Å¹ÒÃá+U•Üa.ENU%..?ø,Þ°äû9x\€Ø×¼ÁAe\óðQN9nªaµ¶”¹û5±ÿÕð7~ÎþS˜ sÁƒód~ ®q´à¹ïŒ6ßJøïûü6ø‘«ø—â‹5E§h²ÿÁXhøÂ:/¯ kþ(??i(¼=áß X|Iµøg{â•þØŸÄ×÷šçž07‡­4ûÁ'†tëõ_Å_³'ì·ðwãuÄ~;ñf•ã?†ÿücñßáwìëðÞïRøãauãSñ'ÅZCê>"ðì áÙ;Æv~2Ô”¶:Öyâ=àWƒ´Øï¬|?yã-féµMg@0œ/á^'/¯|7‰Œ0®T±0¥œguq1ÆWÂ}VŠ­šá«bkµ†­‰j RTiÔå«9EFXâ3n0£‹¥†ŽkIºÜ²¥)à°½'FomS“ Z©^µ:Iάfê8§§uôxÿ‚Æêç¯ìñáqŒçþ'~ ÂŒ÷ÿ‹0èzŽ:bM–Sþ ¬·Þýž¼.€}àu^XàÂ)#cç.L…;ƒ~ο~h_ðO„:…?´¾ øƒö¬øùðsPø¿á­/áÖƒÿ —€¿lmáÝÖµñ/Á+øqñ&ßâi—ªö~ð÷‰|H|?á4özż?5ΈöüãàÖ»ñ[À^ÕüEñ|SûJüfý»<3àÏèðçžøWiû5x£Åz?†åÖ~è í´ÿÂE Mªiž ñÁmHÓ/-ô/ hÚM¾‘mz˜Ç‡¼'T½½~ÅQ¡9fþ§ö®}Qס“WÌ£ŠÅBœs$áGê¹F?ÉZTñOÙ:ðÕj΂­³Ìxɵ y)ÔQÁ{Dð™|:¸êx7F‹“Â¥)ûlnà¥JóU%VOeðWeÆ[ö~ðºzçVðvA*¤`ƒKÙl‚6€êæ¤3ø+ž®züð¸õΫàÎ:úüô=Àðó»ßØ—à£x*ÞÇEÔ~(iÿÇü£Hýº'ñN©â jÞ :´M§nü6‡ÀV¿4v3SŠ E4Éñî´)'°k]M’Þ÷òÕFÝÆ=x+Ët;W=9;†0NWnb÷r¿|2Î!á2ëêõ! Æ®ižA¸ÔMÓ©\Úqp©Ë4“’« sÒ‚qoÈÅñ/`gEWÌ ãZQtð™{W‹<ðJJP¼/eÈî¹g+K“öM?à­ÚÓ€^ÀqþÒði B³`íø:H$#ã ‚X¨YLwãÿ‚°êÒ\}à/üHûŠ8?×±ÅJygz«¥Â[þ3Ĺ,v1Ú2©òHpãɘìÊœ&Ý„æ=›íw­†eÇ÷cù×&äý0­åìa˜ü± ‘y^M‡«? ø8ýq†ÚñÿUÕ»ü ð¸ÿ·ïÿ_„‹þÖsŒc“ËüŒž‡ŒñŽWƒÃ|œž2þ¿»™F;×§Ÿì¦:dýÜþŸ¸ˆøMáûi<†Zµÿ3|÷º_ô2ówÓÕÇd©ñ§;ß2Úßó—®‹þ ×oÃÊËõêø*N³)ü ðÊÀÜx<ìÂdŸøTcœ‰2;]Å@¸k{iÿ?ÕØ~ x]Náçø4H€_á:¦J¯9 •‚þIÚ' yr¬Ö^#ýðcöo˜˜#¦4l§•ºÃb„Q‚6ª ¥v„•?uTº¸;†nÈò—…ž™·_ó7Ï?ùäôþ¹ºµ.5âe&–d¬­ÿ0Y÷?êÏKµÒÉÙ«Cþ u«ž¿|.1×÷þ ÈäƒÇü*‘’6ž3õÀY6MüÓXóð_Âê£ï·à²~? —œ<• ™Ù&x*Tc±öåp[Ÿ¸2F1Û¦~]™‚õªüŶ´ƒ¿8Xû䉖;rNèüµG}ðù^uÄ(àVÿ°¥uù›çž_õ3]ÿࢗq-“þÒ_ zà²ýÝ¿ê=¼¼¯kGõb?ø).²ã-ðoÂè:·ƒ³’¨W¾!*K7'B¨uW2Gãþ A«ž¿¼.02yðaÆ8ÿ’]ÏÝ>ÉÀ Gåý²m\ù{1¸Œ8Ìpª>ÏÈû}¼°ˆ›cÛäÛ]AÇÝÆéÈ_•ø'$cƒÆ'åÆäç^p×ü!ÊÚÿÌÛ;ÿç—ê¿U+x›/í%oûËû¯ú…}´×¦—éún¿ðQÝXœ„>\g$ÿ€ìÍ.’¤`€à³*¬¦;±ÿÁCõ—!OÂ/ ƒ¸Ä~mª]T;øUêÀ¿A ¡\!Žï쟘‰Á?tcyù—å_¾2–>cŒ„Ø@mÑù{­¶íÓ£Ê#k«aG ™bùÜ}œ|­³îìO-Ð Eömº]Tð«€£ÖE$íÿClï˾d¿® %ÆœJ£u™.Ÿó—ö‹Óý–ßs—ÊÚ~–/üW nøQá`p7ƒ €HR~®åäüØ\ãîƒÿÕÿè”ø_Œç÷ àÇþ-§_”ûäa±ù̃ £j®Õ µ~ê`/ȇbe0 ùGEŸ~SÀaÈåx“†ýß-ÆsÆê¸ÌyGÂÎmß#–ËþfÙß_û¨¯ë¾äCx™·|Ë­¿Ü²ÿÓ åÝíÒÞïèÜ·Ö®àð³ÂÊ:“äx3…Ë‚A†¨„’ *® vDŠéí¯Gûvë.o…ÞNÄ?ç¤DÃUÊìA$2…Q"¤žtp~tÀ¸ v(ÀÝŸ»·9Þ­åÅó|™oÞ®ÀŒÞd?gótÍ»dÚîŠàõuùÆE·ÝÿFL#mÈ_-Q#Ù—äÚ)ø[À‰é‘˧üͳ®¿÷Rþ»>ª§ñ4olÉ+/úË¿\/’û–KþÛ£V=~ø\zÿ¡ø0€qœÿ ëœóƒøs‰SöâÖ?ñlü0‚Xý‡Á§i #m8øs€ÄFÄd…fTI>QÐ zªñ÷GËÎqòž0GAü6¢_¼v7ʯÉ òNpß¹l¿ËÛ—hGmÑíómæ>ð+M¼’_øuοùâ¿«èµQ¨q§´¯™tÿ ,¿Ëþ¡o-ºÚÑûö?Û[Xàü8ð°!°ÀiÞm«æ*?ñnF2|Ï•‚•hÊɱ£ºû5¥ý³u‚ï‡~poƒN xÝðõI$@< ¨;‚|)l¼±F×ÎÕO¹ûøÆö?fãw—‚¸‹Ëx˜b#f™©à(Ø«…QµG ò ÀýÜyN0>UÆÐ6®6œ𿓕²IhÕ¿áW:òÿ©¯~»}œßq=ÿägöŸüÁeû+ÔÓnëoký´?l­\ÿÍ=ð¾?ìàÏLãþIÿ±ü¹Ç8¹í«¹¼áxÈ?>í#ÁÀ"îq’Íà€ŠRËÀ@¹vUK–¶ø}G^;qÓåé¾ÙÏÇn«±n60Sk‰äLwäǹÿuûÑ‘´C»t^W›¦Âþå‹þĕܵÿ…\ëoü8=?®e±ë§r_ûK[¯ù‚Ëû¯ú„òóÛuk¯µSö´ÕÜ øÂêp»Ñ|1§þBG'’‚¤8FYV9Gía«ù‘¼/ïÿopxéÿ(ÈëÏŒc;¶ü‚6„ùY6ìùSîþâ/—Œ•6ˈ¼½–öTr8éÇû¿wòŒ¯Ü€06â<£á=òYïÿCLë´ê?m_ÿ$Bãn'ÿ¡Ÿoù‚ËûÇþ¡?E§EneõìµN°ägÀþQüGûÁ§oÊíƒÿ(Pqò̪0K²*ÈÉ¡í7¬?Þðg…Ó‚I:ƒˆÙ‚Ið2€æÆí¬6€Ê®³­¿Çð/ÌÆOÞÇ òJpÇÉ?.wù‘l³y‘mómú eÛ¦u^"OúªåƼL¶Ì’²ÿ ,¿·žv_˲Ñn}N?i]\ò|áp;ÿÅ?àÌþ_ð… ÷ïÀûØÃ‘i-Xõð—…—’O‡ü@ G‚‰ËUrÏÞ*•ùB¸ï˜téò9þèÁ·OÇ÷W Ã$nA•n1°üÍŒ!Âí`)·tS ø%Úù4¶¿ü3žÉÿÐëÿ‡q3µó/ü²ËûÇþ¡?Eò¶ŸQÇûBk.@>ðºòcÃ~;A}™ ø-Hå_ ´Œ9_.èÚÛ_z¹>ð°8€ð׃À8'ÁêH ªNBá>m¶L0ýÖÝ®î~ûï0ò®Ì0Ú›zÅö|išÑŒBí 6§ÝL``|‹òŒm"t*mÛRðׂ•­“K§üÍ3Žª?õ0óvÛÊû(|mÄéÆÙšÕÿÐ]ÓþåeÓ¢Õ@Žú¹ëᯠßþ)g¦zŒ÷úcœÁlGñÃW“‘áß 9ø¥ü•ÿXpIð‚®í±–Áp¡NçeHçx~AŽØÀëŒ0àtù=9ôÇlb= q‘œ!Ú:´ÇÄíËyk™>]û¼ÕÙÝæEäùöTü4à¥ÿ±¥{Gþf™Ï[Ôzý5ÚïÝV¸Ó‰¹[þÒWÿ°,¿û¿õ úvÚÈ÷øþ1k.2Ú…Ó¨ øOÁ¹è„ÂIÁÏ;Jí@Ž'K}­â'Š|C©[éO‡<%qsìéþø}§@°iÖ3êW³M{©xvÒÊÞ+{+[‹‰$¸¸‰BDF|¼Ý6õ{0OÞa‘OÜÅ…m™ÇÉå„DÛ•åXú_ÃGÆ?â—øƒÇýÓÿ²¼zqÀÀÂãbùY¯p~*Íqô²Xή+ÇciB®e:R«†ÂT¯N53(MÓ”à”Ôg 8¶£(»5¾‹¸“˜à0sÍe x¬v RtðYb©bqThÎPsÁN jnQ’M&á$[ûÄ_úü/ÿÁ§ÀÏþ"¹wâN·á¿xÁºÅ¯Âû|QÖµíÀº,üÔ/uÍCÂþ ñ7Ä_9M6Âí4½/Eð„5ÝWQ×u—Óô;YaÓô™uÖµÝ NÔ¾Xø‹ûp~ÅŸüe¬|:øµû_~Ëß ¾ øwû?þüEøÿð£Á>2пµ´«wJþØðlj|[¦kzgöž‰©éºÆŸöÛ>Û¥j:…·›iwÒe|Wÿ“Êý¿ì1û^ëüZ¯Àéç|䢸S%ŠjM?®qN¼°rÒüE­ì¾óõÇ–cWüÔ9¾é»ämÿR?ëNÇÝ_oø‹ÿ@…ÿø4øÿÄWøçã-ÏÃOÀÚ'‹ãøia¬üI×õ/ ø'H±‡áWˆ5MwWÑü-¯xÓVH¬<9¤j×v–o‡<5ªÞÞëZŒVz-µÀÓ´©µÕõÍÃQþ}¾Á¿àš¿µŽñ³ãÿÇÿÙ»þ>ýµÿà¡_ð–ø·þÇ¿ kÂ-ûx~ÑÞ ÐâCொ^ð͇Ø<3áÍLÿ‰fgö¯±ý²óí…ÅÝÜú_³ïüðÿìð—áÖÿïÃï…ß·üóá×|?ý¡ªêߨ^ ðOÇÛ;Ã^ÑÿµuÛíO[Ôÿ³4M2ÆËûCXÔµ V÷ÈûN¡}ww,ÓÉê䘼Ÿ3Îr¬¶· åQ¥ÌðX*ò§‹âhT…cÊóm,ÿ4•\&‹¥˜|†TåSBUaŠ9$$à夣8ÉÇE(´™ý Oqñ2Öy­®|7ðÒÞæÞY ¸·ŸPø ðO ˜å†h¤dŠX¤VI#uWGR¬+‡ø‰ñCUøOàOüKøƒ¯ø'ÀÚ¥âoëRÝ|¿6:F“m%ÕÓÛišM•þ±«ßÊ‘ùn‹£iú†µ¬êÛizFŸ}©]ÚÚMù“ÿ‰ø‡â?†úà gà'ÅOŠ:íËsñçÄö?±ïìûðîîÿÅžý«¼G4å~%|.øóðBïÆž ð7‰g;ÀÍ.¿ñGãÏ‹µ¯ ßþÊ6ØüPðOÄM Ä÷6¾ ø‘ùóáˆ~#ø‘ÿöÿ‚ˆë?þ*|Q×n[mF;Û ö}ø‰wá?~Ê>#†îÍ~ü.ø ðBÓÆž4ð7†¿gGÀË¿ð»ãÏ„u¯_þÕÖ_|Pñ·ÄMwÄö×^ øoæÇ6Ë›_ñ‹d–u?ß8§›YòóÉEn_ïmÍîÛ©ßý›·ü”9¾×ÿwÈ-²vÿ‘úmÚÏ¡éÿð_/k"ø%û;C3ZØé×?¼W}>™¥iÚVes{aáÁgey}§é°jV0^ji÷°Í.Ÿ¥¨Åfð¥ýàœ®Oþ £ÿ$Göoÿ²ãý3ÁEm›á¨`³|ㆇ³Ãa3|× ‡¦ç:Ž >?FŒ=¥IN¤ù)Â1æ©9NV¼¥'vï(ÄUÅe9^+?i_–à1§ËsÕ­„£R¤ù!Â<Ó”Ÿ,#ÆöŒRI/ à´Ÿ³ïí¿ñ7ã_ìñ«öðT^&øû4·ˆ|gý·?ˆ>éPøOħ…gëÏÝK¤üXñ¤ø†;Ù¼'®oµ†ËW·lˆÔc¶76F”Gíÿ]ƒeáÆ>¦ÇöÉÿ¾uP=¸ßœšþ›|_ÿ!kOûüÿ¨_‡ëòWUÿ‚Š}“öÇñçì«öØ£Áÿð|løMð{ìß¿n¯øU?´oÄøY¿ ~ |Oÿ„‹á7ìÓÿ éâ¿øN7Âáÿ„ÀzGü-#þ޼'ªèŸÚ~ó¼ûOs+ñ'—dùvCW…x3;ÃdË#<ÊqxÜl)ãqøŒ}xº±Í0ôÔ}¾*j1¥FšäŒ”æ¥9râxzŽ#ˆÆÇ2ÍðuqžÁÖ† N…):aFžŸWœÝ¡ ¾iËÞ”­dì¿jÏ…ÿðqí·à6øqûLü+ðïÄO ÃJŠ/~ȼÐç›[ð¾½su§ÝøÇžk‰î®¼!¥[JšÒjÖÑÚIx-`µ¹–+»Ò¿bOø8/GÓ>hzgˆ?iÝ/CøCöð›E±ý¹<#m¥|-]/Â:÷ÃÍ7þîiñöÞ×Á¦ÃáßÙ¯†£Ó¯ƒµíWÿfѵ;›[oè‡à?ü«À¾<ð÷Ž|Yñ}ªÒëÆß mþ x_örøWûFþÐÞ2ñ_ßþÄŸ±¿í9â?¯ƒ<ðšóã>»àŸ xÇöž_ ^|SÖþü&дM+Ä_|9ãÏ ø3âŒ4í/_ý'ð׉|9ãOxÆ>ñ‰âÏø³DÒ¼KáoøkU°×|9â_k¶jšˆ+Ó>'7íñMñæ‹á øçNñßí•àoØøÏÃßüC«x¿ÀzŠíÈ›þÓ—xöå𜟠¼%ñâµÏÂíjãâ^·ãøY¥þÁ¾.øÓÿ°ñçü 6¡ø»ÇšdŸfo xå´OøçQo|AÖì>êŸüâ=OÀšˆ~![ø»â‰áhú×üXêGþ®pLªÆmÆ«Ê3R3öÏÜeýµÎŸÖe,MÓ¿·”«_Ú^F ²È§˜g*2I8}k ×"¢“ŠÁ¨ÿ *VþD¡nT‘ø_û/|ÿ‚ç~Ì¿¼wñ¥~k_¾(|DÖ~kÞ'ñ‡ÆoÛWÇ_kw¿íµk?ÛøÖÏá7í¿ðŸLøÃ¤[é×öº#xsã§Ä¿ÛøMƒÃšN£èz§ˆìõo,Òÿeø/Þ…â‰&ðžµñ÷áÖ¥ñwâoŒ~2|H·øYû[|3øYáÿ|QñíüWþ/ñµ÷„¾üað§…aÖ5é­áŠâM?F±Š >ÓLÒìà³Ótí6ËJýý–?à¨öß.e|Bð'Úóà?üÃãþñ—ƒt¯„ ÿ…gà_þµuñ'[ø™âŸ„Ÿ<á/¿>.xûÄøkúñ\sñLjV"¶"|-Á¶&–…YO*Í*ÂT0qTðôiÒ«žN•*T£¨Ó£ pn”¢åµ»àì áNÚYÊ…)Tœq8h5:ÍJ¤Ü£ƒR”æÞ²“m]¤ÕÙüaxköÿ‚ãø;Ä‹|&ÿ<-⯠|5Ó> øcÄþý°¼¢ø‡ÃŸtKë}OFøO ë:gÇ]GHøg¥jV–ú†™àM>æÛÂú}í½µÝ¦“ðÄÐ}û%|ÿ‚Ï~È<ñO¿³ø‰ã߉~1ð¯Äëßk¯écÄ~.ð®³âO [ÇZ_ÁŸÛKáñ„ø‡YñF§yâkŽwÄÍ3Só¯mÒÊÒ×Ä^-ƒ_þþ(þÐþø;ñWá׃~!¦‰àφÞ7ø]ñïÇš§Æïø²ÃÂ>ð—ˆþÃðÛÄ‘ü=Ô/µË;mmoÅŸ õߌŸ‘®ü5ý£ho×|Gû5~Îÿ´4ü-ø{û<Û|AÒ¿áR]þÑ>ðW¼[¢øKÄt Ÿ|0´ñ—|ñGâK|ð¥â)jQ|`²ñÞã/‹>>ð–»á¯ÚwáW„€£asiâ9¼]4~oPøiñÁ¿>øâ×ícþ/‡ß|á_ˆ¾ñö~«¤ÿnø7ÆÚ‡‰|1¬ek¶:f·¦ièšïö~±¦éú­—ŸömBÆÒî) ÿÄxâx¨¯õo‚cÓ•(Ådù‚ŒiUöÜôâ¿¶-TXŒO4ce%^½Óö“¼>Ë[mæ9Ó“”fÛÆPmÊÍÆMýSYGÙRi»´ášå¿MGþ ÁÿtÖ~x{ඳ࿈ú·ÁÏëx‡Â õ/ÚOá•ÿÃ? ë÷ësÜkžðÏÅé<-¢ê÷øŸÄÓÏ©iºU­ì³x‡[‘æ-«ßyœ?ðHø(’`·ìðœ—þ.ÏÀÍé4õy Ûµ„‹…dãeI-?­ÏÛ'öŽÿ†NýŸüEñ¿ûÁ:×ö/¾ x+Êø—ñ3þßÃ'þ'Æÿ‡??á-ñÿÅøC¾ ÂàŸÿÂÀÿ„ËÅZ÷ü!º÷Ùt-ü}‘7ý¦øYÿ øaâ/‡6þ3ñ׊~ øÏ[Õümâ xsÃ_ðOˆŸÿà¥ÚWƒô/j¾%×u(>þͺÄþK¿xbÃÇSMðÎëÁ¾ ÿ„ãá"k¾:‡[ø³á?Ë×Oé Æ”éÉQÉxJœ'R¤çì²ìÒõj>z•$¡®j““æœÚæ›mɲ%ÀyD¬§ŒÍehÆ1毅“Œ#e¦ðNÑVIFö]Ò߃>ý‹?à´~øi/ÁÉñËÿî4ø~…:íiàí/á¼ÚŠåÔfñN‡'´ïŒÖž—Fñ=Ƴ­ÜkÚcébËW“V¿}BÞV¿¸X©x³öÿ‚ÀxûÀ^øWã½+âß>x+ûþ߇.ý§üâOøKþ½çþÿ„gÂÇÅûßh?Ø>¼¼Ð´Oì­>Óû+F»¸Òì~Íeø¥ñŸìð¿¿áK„þÊÿ…IàÿÂSÿ ×þá§ü)oøE¶¿ályž<ÿ„þøSß?áí¼ûdþÏÿÿá-Â"ñ¶«¨x7Á:÷ï´> |oÒ¼Sâ Á¿d´ø‹aðßÂZÇÃ?Äß×MÏ|x4oøN|sý©ñšçÏðŸ‡tøK<;&í#Ä_ØZ7ö½ßöeÙ¿tl?Úïþoþݧؾ éðŸÿÂ]qÿ #ö¥ý ?á•ÿg-þøF#ÿ„#PøÙÿ Ããïž8ÿ„¯û{áwÂÏøB¡ÿ„ÓÀ¿¾7x·þ'þ—öOˆøŸ„¿·5µçÆÏß?hþǼñ³á? jžøwñãÅ?íõ_‰_²÷ìÉñBx“ö¯Õ~h?߯Ú×ÆÏŒž)øoðÛMñUçÁÿxúÚóáƒcð®ßÆÞ;ðý§Šb8ñ,%à˜ªJN—.OŽ^ÍI¥SÙ¥›Þíûö·5îúYÿ©9w½|Ë:—3Š—62ƒæå·*—û'½ËöovºZÇâåŸìÿ‚´½øi¨ÛÍñªÚûàÖ“ |¾ö¥ðšÞ|&ÐuM? jz7Ã{ˆ¾-¬þ Òõ/ ØéÞÔ4ß Ë¥Y^hV–zDÑ}†ÚÚ+럱Oü{ÅGâü%zwÅ?ÂÛ>oŠÇ_ý¤|­‰à$¶_7Ä·üS“þSàãiü"‡ÄŸÚÂÞ×ûì8RÏö—â'üá„ÞÑçø®ÂEâmWãgì›á ü}ðÇâ߃|ñ7á'ÇÚûàìñã|YâÝÀ~ý ¼ xgã.Ÿªèß>x—â?à #Uñ—Â/kš–«áŸˆ>³ñ‡Ðÿ²/ůü}ý“ÿfŽÞ1²Ñ4ß|jýž~ üZñNá«kû?Xxâ?Ão xÇ\²ðý¦©©k:®‰k©ë7PiVÚŽ¯ªßÁa]êW× %Ôµÿ׊#%Up÷Âq´–U˜FqK±‰'ý±Ì¢±Kë)&’Ä~ù/ii)—e“N/0Εݾµ‡iÞɽpn÷¤ý“½ïOÜøt?› þ ãÿ#ðÿ†<[à áïŠtOxüèÇžÒ>7|3Ó¼1ãSáK÷Õ¼.|] Ù|JƒJñ(ðÞ«,úŸ‡Æ±iyý¨J÷ºpµ¸É­ü$ý‘¿à£ÿ~|}øià¿ÙçÂÖGöˆð§†ü âψMãÿ†p|MðÏ‚4Muµý{Á¾ñN“ñgL:O…þ'2Yh¿|?©ØëOŒô7NÓo-mþË Ô_¾Ÿµ'íáÏÙgá|eñŠh‘øGNø£û?øÅ:¿‰|YaàxCß¾?|2ø)®|BñŠ5K;Ý3LÑ>韮¼}ª®¢,l/ì<7q¦]ë~·¼“]Ó¾xÐà¦ß²¯Š~#|Uð¿‚¾&ø'âß‚~ø'௦xßöuñ çí9®øûâ7Æýwö•·¼ø=àÿ…Ÿ ðï†äñ®¨hZ®…âù´-âu–•7Š4}O¾Ô4›UÕ´Ëßè7–7V—N—ý—p~Ç?ðT~sañCŸŠ?ð¼?h`üiÿÅß?ñtÆ~(ñŸøOðü8ð_Œ~$ø[øgáÏØ·Z+ðf¿ðÃÂÞ,øQâÏ |PðßŰ׬"ðö÷— ø±àÝÇÞÖ?¶ü3­ÿhCóiú®‰ªéÚ®‰ªßxľñ?†¼Ac¥x›Á¾6ðo‰´­cÂ^:ð/‹t}Æ^ñ–‰®ø?ƉâmUÒ¬æ^:ñJœªK áz“ö“›Ê³j“j7”äó{În1I¹7++_BWeZ%˜gK–1X¬5£ÑK¢×e¦»j9z×ì­ÿ`ñ6µ«ø—Ä·_ø]Ñi_ éšÆðÃJ¼ŽÿLøq¤ê–`½Óü ¦ÝÛ[ÝiÞ±–ßÃöWÛ][ØE4PÉeý,ÑY¿ø•ÃÙ>àßgËÉÉý•åä·/'/ö½¹yW-­n]6²Vø-m?í ç™>ne‹Ã©s77Õ.Ÿ[«;ŸÎVû>ÁZ4/x£Æ:7ˆ~9èþ/ñÒèCÇ*Òÿj Çľ1>°ŸKðßü%ZíŸÅ[mOÄgÃÚdÒiºÕî®F•a3ÚiâÒÝÌqñž-ý‹¿à£_-´»xwÇ>7²Ñ5OkZ5§‹þ8ø#ĶšF³ã½lø“Ǿ›m¬üG½†ÇRñ—ˆ kÞ*¾´Ž ¯ëL5MZ[«ÜMôÑE*~9q-*‘«K!àúu`¡Ô†W…HÆ/aMFqÍÔ¢©ÐnŒZä¥'N6‹±?êXâá,Ã9”“p–+ àܦªI¸¼+樔۵ÜÒ—Ä“_ÎOŽfø*GÅ]×ÿ¯>.|Kðý–§·e¡øÿöð›-fÖÒþÆßVµÓ!¿Äè¾"ðßÙ|IáxcÀþø×¤é_<âÿèvz&‰â¯xkSø»®ÿÂ-âX¾Íu«{O½MV-wYÕõKË#¨:[þÝÑ\´¼dÎèJ„©pßÂXe‹TË3ìþ½,<ñrWÎçÄK CÚTiÎJœcÍË¡»àÌ£R2Í3©F·±ö‰â°Þò¡‘¢°KݦªÔåœÛå½­üþAû;ÿÁK#Ö|;âyñ]5ÿê~3Ö<)­§í jø_Vø{uñUðö¤>#-î¨xöòöþ÷Æwšl–—>'¼¿žãZ’îIØÚô:_ÁOø)æ¯ø“ÅšOˆ~3é+ñ Ñ¿á2ñ.™ûFé–~ ñYðíŒÚo‡Ç‰u«o‰pjZÿö4š~Šu[›ŸìË)ÖËìÐ;F¿¼TVÒñ³ˆ¦š—ðt” éIK*Ç5*n·Ö6žlÓƒÄ~ýÅû®·ïZç÷Œ?Ô<·™IfYâjJi¬mÔ”=’’Sº—²ýÝÓMS\‹ÝÐü°ýŸà¤Ze¶±e§^üUÓìüCãHþ$kö–_´;[]oâ$¾™¯ÁãÝfÞˆñŪxÒ-wCÑu¸¼Qx’ë‘êúF•¨¥ú^iösZ]°øÿÓôŸè6w¿,´/ˆz—ˆ5ŸèÖßt8tÏêþ+·{?ê¾0Óíþ!Agâ}OÄöIŸˆ/µ¤»ºÖm|¨/ç’5ˆXþñQMøÝÄnéä<ù¥ ¿øKÇë8rrMÿµܣìáÊÝÜyb•’Iê&Yd¿´3­ŠÿkëFWºÓ¢|ÒºV¿3¾çàì³íúCAñvü=?×?<6Û>á|0]¾;Qÿ éÙIO¾@#ƕۿ¿°ÏíJ1ÿ´ámðè•ûÜW ø¡÷Bí .Ò3µí¶ ý‰iÄ ·ÃDP2ßü<,?Õñ*å\FǵU6¬`Å ŸïÕ¤¼yâù+<·†ºÌgÑ%×8}¶Û·K)xu’J×Åfº;ÿúà_á©ø&?bÏÚ_þ‰¯®?â²øÇ^¿ñSüÄñ‚:q÷xòå±wí,?æš×§Œ|íÓ(^¸·;q·åòyè©^UëÀAµS÷Š—ã¯?ù—pæ÷ÿsÌÿ\Ýýûù‰øs’6ßÖ³]éþËþ n¶[=u¹øˆ¿²í1ÿó‡þß¼·#þ*1“Œc‘Õq· äÙ·ý‘hXÜøx*Þ!1ÎB¯ˆÔ³1U<mx›Ë–×öÊŠñ¸ºÍgpåŸýBfž_õ8òðë$Z}k5Ù/ãáÖí]º~I[ñ–Ù;ãì`ðýT€FïøJ¼Ì0‘)UÛ® Øæ3»µ ¨‹¶(-/ì©ñèù€àã)ðYÇ ÀÿŠƒ“œ`ñÿ8dý¢³ÿˆåÅ©§ýúÔ&eÿÏ{ýßä/ø‡9%ù¾µšßþ¿á;ßþ€oøëסøìŸ²·ÇäDQ÷Èω¼@áùkÃæ` µŠ0d*­o§ì½ñÅwxT 2øŸÁ¸‘¹ÿ‰È ¬±eQQ6±‡hŒ,#Nýv¢œ¼sâÙ+<»‡v¶˜LÍï_þOü‘«QÐMÿ Ññ¯þ„¡Ðã>$ðŽGßÀ?ñ;å¹?NW‚Ÿ«ôT/8±m—ðïþf_üö%xs’-±Y®®ú×ÁÿóõòVü­‹önøÎIðZ9ãÄ^ܤ4͹vë1ç Þ. G¶H™b“OÕƒövøÀ€gÁª¸'“â 3 yí+©¨ØÆ"Ê2»aUH”$Vß§´PüpâÆîòþùa3/þ{¼9É%¾+5Õ[JøOþaÿ€~f¯ìùñxÿ€cþCþ q÷GüN?#Æ=ðÏìýñlg>u¶“¯ø\íù%À#ûQ‹9b›XÇgŒí’Òº)/¸­&¿³ø{_ú„Ì¿LÛðÛîVqðë$ŽØ¬Óÿ`ÿL þ½¿:`øñU1»Â‘¨H ­økŒJ¿?ÚïX ¢=¤G·ÊJi÷ãøñABøE•pÂë~!p¨\jI•ùp>Uà.F?Ðz*œTÛÙü?­¿æ1éoúšùu½ºZÊÓÿã#nÿZÍw¿ñðüÃøïæ~~¯Á‰ã¯†CÏöׇ»ŒcûS¹ÆÇn éAð_âRmÿŠl.­¬x}Õ>i1Û¨!wm±îéÊŵ‘¼¹4ÿ¼(¡øÙÅM%ýŸÃú;ÿºf?üõüwìÊÿˆu’[—ëY­¯ãá:kÿ@?ŸËeoˆâøAñ Aððà(Çö¶ƒòí R·±‚¿.TmLd# ‡Â?ˆ ø§‡¶­¡ü½8ñ0^=º/`Göµ+Æž)_óÃûßýÓ0ì—ý <–»ù“ÿã#ÿ ¬×ÿàû§ÿ@>[mÖ׳_ÃðŸÇÈÀ·‡ñŒµt2FN0/rX›Y^2xÉY Øƒá£Æt%Lnþ&z3v3òÜ¡*Þ^TWÊã´úÒŠ%ãOÊ×Àdi¦1êÓÿ¡¯–ë_ÂÔü9Éø¬×ki_ ÿÌ:|¬|¬¿ ¼f?æ í °éÓ€`ãÔ`mÆÞsGðçÆCþ`ʧkc:†”È>V൞O µŠ¶S£úŽŠ•ã?/ù€È6·û¦aÙ/úyVV‡Y"Ûšÿàü'—O¨Û§Eú[æø<â¤eÝ£ª€ùu ,íÄ…·L»·*€ b+åíˆiúIàŸ(Pt¥\V÷OÚ¸Ç þ2 .ä^6«…X½úŠ—ã/»°d:Ô.cåÿSO/Ÿ[éi~dnßíY®ŽÿÇÁÿóüǃ¯‚üJ?æ~Ù§äp}={ c€—!ð‡ˆS´äÈbêÄ2cÎ=¥¤-·k  #dIlý²Šñx¢É}C!Òßó ˜t·ýM<µ¶ûmdWüC¬’Í}k5×þŸá<¿êÝ)‡Ã:Ìc›\çíVlÃýXùJ´ck˜÷•Ú« ªÄ¢8ìêkzGÅ;=X? õmÂ6¼Ñµ}Fñ7‰¼8¾8Ò41¯i³èzž þµñgƒ[U¾ƒH¿ÔDYõè4û-cû:ÿTÓõ­2Òë@Ô}†ŠæÄx·Ä¼># ˆËr¸|V®Iáó8ª”+Ó•°æ§›B¤yéÊQæ„ã%{ÆI¤ÕRð÷(¡^Ž&Ž;6§^…Z5èÔU°2têЩ´¦£S/œ%Ë8EòÊ2„­iE¦ÏÆOˆ¿ðLŸü`ñ–±ñâÓ~Ãß~ ø‹û?þ|Eÿ‚küñ·Œµßì*ÇBÒ¿¶ˆÍà™®ÿf[[[=6çâwÃ|)×ï'³Ò>=i‰¨Ïi¡x¶çSÒ#¿k‹K}{LÒ§¼µ¿ÒƧ¤j¤4WÉoà•­Â¼:¬š_¼âMViÆE¢kGå¡ôÙxÏú(sŸüÿóŒüIñ/üŽëÆž#ñŒ|c þÀ~,ñw‹5½Wľ)ñO‰à˜?³®»â?ø]¿ŸT×þÌÞøá2ïâ7…|a x†=.×Á¿n¼=¤[ꯌ/¸“QÖRâs-µÎ©¨^KúEo…âš8,N…Ꭵ‰ÂW¥‰ÃÕSâ):u¨N5)MF|A(K–qO–q”$½ÙEÅ´ñÄduñxzø\F}œÔ¡‰£V…x{<Ž<ô«AÓ©hd±œy¡&¹¡(Éo&“_xÀ?ðPx‡]ñ~Õÿ 4–×uSY:V•û+iM¦i‡S¾žôéúkjßµ]PØYþÍfu-SRÔ ¼Q›ËûËŸ2âO'ø©û-þÚ?¾ø»áok/ê>ñ¶>‰®ÚZ~Ìš.™vö“2J’[_Y|k†âÞâÞânauf¤…Râ)íÚX$ý9¢¹ÿ·°)Ýp§Þ÷¿´âKß{ßýb½ï­Í¿²ñŸôPç?ø+!ÿçü÷Áv­§³ø1û9[Ü'—4Óÿ 3þßí²hžOü%Ø?Ù’ÿblêþyûjøÓãE‡ÆoÙWáWÁ¯ˆº?ÃïÛ:&¹â]oÀ:wÄ[KKOþÏÖŸ,äÃ÷º·‡¦–âY¼=6–o¯ØGz¬·W_5­¼ÿ…3ûsÑï|?ÿÄAÑùõWƒ(Y¶êB<îNÍM»)µ¯,$—½Öúy©è´nÉvìŸV»Ÿ hðEÏxkÂ,.¼eû<üjñwÃ}Ã^Ðâý«cË¿—Ö²?ì/û1ø§X‹àìŸü©ØüQÔµ?ØKÁÞ3ðw­>&Çaà¿ üKø“ðÏQðŒî/´¿iß² < ¥|.øsà†zßhÑ>x'¾ÑçþÂðo…üý+Â:‡‡ôù¿áøuáü>ðï›i§ÂÿØ^ðg„|¤îû†<1 h–ö:U§Êÿð¦noú=ï‡ÿøˆ:/ÿ>ª?áLþÜßô{ßÿñt_þ}TKÞ²•znÛ{µåHkM¢ÿNþG¬~ÔŸ¼Gñ÷áxÁÞ7Ñ>ø»Mø£û?üZð·‹¼Kà‹ÿˆþ°ñìýñûá—ǽËÄ ÒüsðÓS×ôMSøikáíVÛNñ߆/à°Õn/m5%¸¶Ž)|OVýž?k gÄ~øÅuûF~Ï1þÑ_4O‹ÿ 4?Aû%|I_‚×_¾5_üñOŠt-Wá Ÿ¶t¾9Ÿâ‡Ž~x;PðÿÄ‹O6>µðž¥â_ j?µ]bóKñ–©ÿ göæÿ£Þøÿˆƒ¢ÿóꮣÁŸ³¯íÍâÿé¾ÿ†ëø§ÿh}³ý3þãE»ò~Éau}ÿÿð¼m¼Ï3ìÞWúôÙ¿Í·c8Æî0ZM¹Y'›ÊѵÝ-ž‹Wa7Õ§§šé®×>Xý˜?àš~#ý”õ…^+ð'ÇÍ]ñw€4O|4×î|[ðnþëÞ&ø-ìÉÿþýŸ>(hZ>…£|_Ñu? |Qñf§ÿøðŽ<ñ"÷ÄÞ,ðŸÃ›xÃÂ!øEñNâÛEñu§êíp?ðÁ·7ý$Gáÿþ þ‹ÿÑ Gü0GíÍÿIøÿˆ?¢ÿôCVòÂW“¼§M½·kò‚œVÉÿZwòÓHñ¶›®½ï‘ªÝý¯Á¾"мIð—ã×~Í¥x‡ÃRÁÿ ¯öbøñ¿à7ü$âú]WáÇü-øZ> †ˆ> ðŽ¥aòÇoø%ï‡>1|]ñçÇ ­Cöyñ׋¼WñGÆ4ÐüûVþÊv´çÁo øsâÀØ×àÇŠm"øw'Å¿…úïÅmOö-ðwˆ<ñRÓÆš-‡‡|'ñâO€5‡ž$¸Õ4¿é?£ÿðÁ·7ý$Gáÿþ þ‹ÿÑ Gü0GíÍÿIøÿˆ?¢ÿôCQ.";NšµÒÖOGk­aÖßÕØsdzïÓ§ÏÈüûÕà—¿SþËïxËþo]|øMá‚Þ'ÿ„Bƒþßíð“þ´ÚWí'ÿ/€ï~ü#ñ7ö†¡û~À‡ü(Má×€~h?ðÉߨþð¶“áŸÿt-kô3á§Ã¯üøsà„¿´øG~|.ðO…~xÃÿÚ®­ý…àßèVðÆý«®ßjzÞ§ý™¢i–6_ÚÆ¥¨j·¾GÚu 뻹fžJÿðÁ·7ý$Gáÿþ þ‹ÿÑ Gü0GíÍÿIøÿˆ?¢ÿôCPð•ä¬çM¥Òò¶ÖþN߯vñìþåþg%ñûà÷ü/?è> ÿ„‹þìOŸ³WÆí?ìí¿´ÿÃ<~Ñ¿ ¾?ÿÂ;ö?í=#Éÿ„Ãþ—ü"_Úÿk—þÿí¿íïìÍoû7ûÿ‰øáð?â7Œ¾#|2øÙðOâg‚~ü\økàŸŠß -.þ)ü)×~3ü9Õ~üg×~ø·Æ¶÷ ð—Åï€þ&¶ñµ·‰¾ü7“Âþ(âDš•¡Iã}'VðGˆuè:÷ƒ}þ#öæÿ¤ˆü?ÿÄÑú!¨ÿ†ý¹¿é"?ÿñô_þˆjKYZÒ§¥úÉî¬÷†·JÚ‡<{?Ã§ÌøWáÏü‹ÃŸ > k?|ñK[—Â-ûC~Á¿|-¨ø—ÃV¯ˆô~ÂÞý…¼¡ø#Äz^«áý3ÄšßÄ=3ö'µŸUñ¾¤xRÃ@¿ø<¶žÔ­ü)¯ˆq|SÿÛÿ„“N†Ïþ?‘ö?øo;ìû¿‡_Ú^ñWü6§íáðöáÿ„#âw‡?á:³ÿ„ïàžÿ ŸþÇ_…ŸÚzü4wÁÏøçFÿ„£á?öÇ“è'ü0GíÍÿIøÿˆ?¢ÿôCQÿ ûsÒD~ÿâè¿ýÕ_UÄoÏO{î÷·-þÚ~;‹ž=žŸð$~p~ÍŸðM¿þÌÿ ø±àOˆ¿³Ï„¼]yñGâ&­¯ø#áì‘ð‡öy³ø-ñ‹Àÿ±¿„þ(xá¿ÁíöˆÖ5?|QÖ5?اÀ>.о/ÞüDñ‡„ô½oÇæñÀÿ\k:-ç‡ÿWkÿ†ý¹¿é"?ÿñô_þˆj?á‚?noúHÃÿüAýÿ¢”°•äï)ÓomÚü †§²ÖüŽKãƒûFëðŽÿ€ø«ðOá—Ù¿µÿá-ÿ…ÃðÇ_ÿ¶üïìÏìøGá ý¥gøEÿ³|­gû_ûOþÿí¿·éŸcÿ„û"ïûoä/‡?ðN/|(ø-¬ü ðwÅ-n_·í ûüið¶£â_ Xj¾#Ò<9û xOöðv‡à]éz¯‡ôÏkôÏØžÖ}WÆúv‘áK ÿâ<òÚxR·ð¤v¾!û«þ#öæÿ¤ˆü?ÿÄÑú!¨ÿ†ý¹¿é"?ÿñô_þˆjºVS¦¶}z;«¾K»=¯é°sdzü?ÏÈüªøIÿƒð?Â#Þð¦­û<øCLøu­þÌÐøÅ_ ?co‡ÿ>4øßÀÿ³Ÿí7û?þÐÉíGñ¦kÞ.øßñGÆVÿ³¯†|9©xãÀãà?Ãù|YãüOñÁ_êiðÛAøkúQû5|ÿ†xýœ¾üÿ„‹þøQŸþ|ÿ„·û#þÿøJ?áYxAðWü$_Ø?Úzßö'ößö'öŸöGöίý›öŸ±ÿißù?k—­ÿ†ý¹¿é"?ÿñô_þˆj?á‚?noúHÃÿüAýÿ¢‰aqø§Më}Þöµô‡`玚=—§ßär_¾Âóð.ƒà¯øH¿áþÄøÙû5|aþÓþÈþÛûOü3Çíð«ãÿü#¿cþÓÒ<ŸøL?áYÂ%ý¯ö¹áþÛþÞþÌÖÿ³±¯þBý«?à^ý§¾*ê¿uÍkávµ©Û蟳´øqñ×à=‡Ç¯§Ä¡ý¶t ­Wâ·Ã{¿øãâv‰¯xGöÚñLþðþ—⇗þø™ðïÀŸ$ñ/‹´Èu\ýÕÿ ûsÒD~ÿâè¿ýÔÃ~Üßô‘‡ÿøƒú/ÿD5 ^;Nšß¬ºÚÿcÉM‡<{?ÃüÏÈýsþ Çñá_ÄÿÙsÇ¿³7‹þ øw[ðw¾Øx­!ýš<-á/€ÿ´/ü$ÿ‚°ê¾$ñW†>ü/øÇðVîÿÁ>,øƒû{hÿ < à ÆÚ‡ÄoÛiúÄ?Šþ;ërüGñuÿêì÷ð{þ_à oÏâ/øKu½CÆßþ)øÏÄpéðŽéZ¯ÄoŽÿüqñËâedž<4úž¿wá¯Äˆ¾%‡À¾Õ|OãwÃ^ ‹BмAãkz~¡âÍc­ÿ†ý¹¿é"?ÿñô_þˆj?á‚?noúHÃÿüAýÿ¢‰akËG*_Šn×µýΗ~^WÔJQ]ô’ïäŽúŠàá‚?noúHÃÿüAýÿ¢ø`Û›þ’#ðÿÿEÿ膩ú•_æ§÷Ëÿ:ìÿó;ê+ÿ†ý¹¿é"?ÿñô_þˆj?á‚?noúHÃÿüAýÿ¢©Uþj|¿ùç]Ÿáþg}Ep?ðÁ·7ý$Gáÿþ þ‹ÿÑ Gü0GíÍÿIøÿˆ?¢ÿôCQõ*¿ÍOï—ÿ ë³ü?Ì郞þ#öæÿ¤ˆü?ÿÄÑú!¨ÿ†ý¹¿é"?ÿñô_þˆj>¥Wù©ýòÿäv‡ùõÀÿÃ~Üßô‘‡ÿøƒú/ÿD5ðÁ·7ý$Gáÿþ þ‹ÿÑ GÔªÿ5?¾_ü€s®Ïðÿ3¾¢¸ø`Û›þ’#ðÿÿEÿ膣þ#öæÿ¤ˆü?ÿÄÑú!¨ú•_æ§÷ËÿuÙþæwÔWÿ ûsÒD~ÿâè¿ýÔÃ~Üßô‘‡ÿøƒú/ÿD5R«üÔþùòλ?ÃüÎúŠàá‚?noúHÃÿüAýÿ¢ø`Û›þ’#ðÿÿEÿ膣êUšŸß/þ@9×gø™ßQ\ü0GíÍÿIøÿˆ?¢ÿôCQÿ ûsÒD~ÿâè¿ýÔ}J¯óSûåÿÈ:ìÿó;ê+ÿ†ý¹¿é"?ÿñô_þˆj?á‚?noúHÃÿüAýÿ¢©Uþj|¿ùç]Ÿáþg}Ep?ðÁ·7ý$Gáÿþ þ‹ÿÑ Gü0GíÍÿIøÿˆ?¢ÿôCQõ*¿ÍOï—ÿ ë³ü?Ì郞þ#öæÿ¤ˆü?ÿÄÑú!¨ÿ†ý¹¿é"?ÿñô_þˆj>¥Wù©ýòÿäv‡ùõÀÿÃ~Üßô‘‡ÿøƒú/ÿD5ðÁ·7ý$Gáÿþ þ‹ÿÑ GÔªÿ5?¾_ü€s®Ïðÿ3¾¢¸ø`Û›þ’#ðÿÿEÿ膣þ#öæÿ¤ˆü?ÿÄÑú!¨ú•_æ§÷ËÿuÙþæwÔWÿ ûsÒD~ÿâè¿ýÔÃ~Üßô‘‡ÿøƒú/ÿD5R«üÔþùòλ?ÃüÎúŠàá‚?noúHÃÿüAýÿ¢ø`Û›þ’#ðÿÿEÿ膣êUšŸß/þ@9×gø™ßQ\ü0GíÍÿIøÿˆ?¢ÿôCQÿ ûsÒD~ÿâè¿ýÔ}J¯óSûåÿÈ:ìÿó;ê+ÿ†ý¹¿é"?ÿñô_þˆj?á‚?noúHÃÿüAýÿ¢©Uþj|¿ùç]Ÿáþg}Ep?ðÁ·7ý$Gáÿþ þ‹ÿÑ Gü0GíÍÿIøÿˆ?¢ÿôCQõ*¿ÍOï—ÿ ë³ü?Ì郞þ#öæÿ¤ˆü?ÿÄÑú!¨ÿ†ý¹¿é"?ÿñô_þˆj>¥Wù©ýòÿäv‡ùõÀÿÃ~Üßô‘‡ÿøƒú/ÿD5ðÁ·7ý$Gáÿþ þ‹ÿÑ GÔªÿ5?¾_ü€s®Ïðÿ3¾¢¸ø`Û›þ’#ðÿÿEÿ膣þ#öæÿ¤ˆü?ÿÄÑú!¨ú•_æ§÷ËÿuÙþæwÔWÿ ûsÒD~ÿâè¿ýÔÃ~Üßô‘‡ÿøƒú/ÿD5R«üÔþùòλ?ÃüÎúŠàá‚?noúHÃÿüAýÿ¢ø`Û›þ’#ðÿÿEÿ膣êUšŸß/þ@9×gø™ßQ\ü0GíÍÿIøÿˆ?¢ÿôCQÿ ûsÒD~ÿâè¿ýÔ}J¯óSûåÿÈ:ìÿó;ê+ÿ†ý¹¿é"?ÿñô_þˆj?á‚?noúHÃÿüAýÿ¢©Uþj|¿ùç]Ÿáþg}Ep?ðÁ·7ý$Gáÿþ þ‹ÿÑ Gü0GíÍÿIøÿˆ?¢ÿôCQõ*¿ÍOï—ÿ ë³ü?ÌüAÿ‚úÿÉ+ýžÿì x¿ÿQË+Sþ Ò£Ñ~þÌúr\Ý_4:ÂKs¨_}›íºýçà ^ê:•âÙ[YXGu¨ßÜ\ÞÜC§ØØéÐË;ŧØÙY¤±Û†V£ÙÍi¶•$¼ˆ–­¾öü‘úeûZÿÉåÁ;ÿì1ñ7ÿXï[¯­«äŸÚ×þO+þ ßÿa‰¿úÇzÝ}m^emáþÿéꦑÛîÿÒbQEbQù{ÿ”»ø9iÿæý¨ÿápüNÿ…eöŸ‚m>ÅõñOÀÏøX?æøñCþ†?ñKøçÀÿð¸á+Û©ÿÅŠñü%þøƒöø›øÄÙÿdý\ý•>%ü9øÁ¬xâ/Â_ø'âÃïÂQÿÿ޾x«Bñ·ƒußì›_hZ¯ö?‰ü5©èšŸöf·¦jZ>¡ö+éþŪé÷Ú}Ï•wi<1âר|ÿ’•á¿ûŒéƒU­©?~ŒuÒ¬]ï¦²Šµ­¦Ë[ü…-Ÿ£õëÔü‘ýˆÿm_ÿ´7í…û>Ïá¿ø)OÁÿÚ·àßÄÿ|Bñgˆ~~Ì_f¯‹sÛ|3Ô¾|Vñƒ¼Mñ£öU‹ö øûXÿÁ<¾èÞ1O‡–k??mŸÚ×âÂߌº—ÁÿØïâµÏÆ/|eÖ>;øSÀ>ÁM¼iÆÿ‚zí³ûW~Ì5ý“ÿjÏ|Qø/û\| øçñcàxWöPÓ¼gû5|tø©¦|ý¨þé°‡ÂÛoØKãµã†°|ÿ†bý±?à¥ß¶Š›N_Žm ý«2üsý´>üGý£u¿ÚÄZí û?ø»áßÀ›-cþ åûB~Ð_ðNßÚ¯EÖ¿cïüVøiàøëöaÿ„§ãÕÝ·Á?dÛWÅ¿?iÚÇþ'ƒ|Wqã?ٗ㌾5è?coÛ»öªø¡ãO]~ÒÿðR_؃àµÏÄ/ƒÿüMûN~Ï—¿¶ïì£}ûCþÆÚ·À/|Hñµ·ÂÿÙ3Ä_ðMO„_>|`ý“>"hVOãï þÙµ/ímá_‚Ÿ < ñ“Ãôoþ6Ò->)hÔíü¡~ÉŸðSÏÚÇÆ>ý“õŸ~Ú³ÿÆíkÇŸ³ÿüÓö„ñ‡„t/…¿ ´/üJÖ?oÛŠ_ø'í3à==¼㙿±þþÉ¿ÙvÞ,ø¤¾ðÊxî×þ ã}2çYñßÂÙ– ;ö ¿úÿö5ý²¾"üKø‹û+~Û¿ðдíçÃ~À>Oì±wÿïû_ì±ñkâÿÄoø·?>ø;ö´øÿ 'ö´ðw¯Ùþ2ëâ¯ÅøFÿáh¬ø§ÿ 7íâoøÛIýþ¢€9ÿxO¾=𯉼 㯠øÆž ñ§‡õŸ øÇÁÞ,Ñ´ïøWÅžñs£ø‡Ã>&ðö±my¤kÞ×t‹ËÍ/YѵK;­;TÓ®®lo­§¶žX›ùÁýg¯€^9øûû%þÁ·ß¾Ý\ÿÁ ¼AûFø³Å|4ðYñÇÃOxÓÆ‹á_ø&‰¼Qâ«íox×Ķìâþß´>³ð6Ê GOý¶¾|#ø‡ñçà?ü9¦ü"ñô½E4?ðMïÛoöÂø×ûCü°øëûiþÄ)ø±áÿê_ÿaßÛ7àg‰h‚Þ*›á'Š<{â?„Ÿ ÿcÁ<g¯ÚGàÿÆŸt}3ÂÞ>ðí ûe~Қ„žøÉá/ˆ²|Xø­¦èŸ|9ôü·ö–ګĵö­ÿ}ðÿíEão…?lïi_³WÃKØ15þÍ_ j‹ÿþ üný¡t¿†? />+k¾ ×¼-yðÛÇZ/ÅŸ€ú§ìÉðCÄÞÕ¾Ù…ZÍÍÿø*ÿí©û>Û›àÿÇoxàÿìÜ>øYñ7ì{Æ_üBð·Æø(µ÷ÆÏÙOÂwŸ¾|6ø­ãïþÌ~ðç…|EsðËâî£ñ_âgÁX j?µ‡ˆþ|^ºÖþh~ÕümûOøÛWð‡ì}àí?Å>—áÿìñâσ_µoÁOi_²í߯O‰øÿãßézŠ+ù‚ýƒÿá–?µ?àÿð£¿áŸÿáã?ñ$ÿ‡°¨ÿ…uÿ ¯ÿ(ãý¤ÿá¡ÿáá¿ðˆÅõÿ“ôÿ…'ÿ ŸþKþnïþoü'ñyá¯éöŠð‡µÀŸŠÿ¿h¿Ù£À9þßøÛû&ÿ¢ÿ†€ðWü#>1Òÿáÿ…ïàëïü)ÿŠZðöá/ÂUá-:óVÿŠ+^ñö“öÿcêrEdÿÏì!á¿ ÝþÕ_±^…û+é?ðNŽº¿ÁxÊOÛ“þ !û þÒšwůÚWö™øgeû(üsøskãßÛôxKön𶇡øƒö«ý¨õÿƒ_µ„ŸlÚ⋾7ø.ûâƒôߎZGÀŠ~S´P€|;ý¨þüWøíûEþÍñÏöÿÆßÙ7þü4‚¿áñŽ—ÿü/_xÿáOüTzׇ´ï x«þ¯ iך·üQZ÷ˆÿ°üŸ°xûS’+'üÀý—~3~ÆÞÿ‚Ä~Ý¿ ~~Õügñ7â¯ìÿû$XÜ|:ñí{}ñ·ÇrüvøoñËþ …â/ß¾xGâÅ_øƒÀ_ð¥|?yáýwÅß³§Ã?Ã^ø£ëPjkðïÁ¶^ š{ÿÛê(¯Âø%oí,ÿµWˆ5kí[þ ûáÿÚ‹Æß þ0~ÙÞÒ¿f¯†—°bj>?ýš¾þÔþ üøÝûBé ~^|V×|A¯xZóá·Ž´_‹?õOÙ“à‡‰¼+«|³ µ››ÿxçãîõüÐÿÁ7¿m¿Û ã_íðÃã¯í§û\x§âLJüC©|ý„olßž%ý¡þ xªo„ž(ñïˆþ|/ýü!ÿñýž¿iƒÿ>|QÑôÏ xûÀ_´7í•ûJj?~xkã'„¾"Éñcâ¶›¢|aðçØÿh_ؾ_ø,ÏíÉà_‡?f >2|Tý˜?aÏ ø—ÁÞ ø—ð¥þ&|GøûðâGü§Gø¿ásÃÚ´|SãŒ~èß t¿‰:5ýž£ãO‡tŸXøžÛFðÝŽ_³ÔPóCÿÞý¶ÿl/´?À;Ž¿¶ŸìAq⟋ñ¥ñÿö½ý³~x—ö‡ø-⩾x£Ç¾#øIð¿ö7ð‡üÇözý¤~ü`øñGGÓ<-ãï~Ðß¶Wí)¨ü!øIᯌžø‹'ÅŠÚn‰ñ‡ÃœìÃÿ6ý¡âý°¿dã/í]ðÆ¿ÿjÏŒÿÁŠß5¿‹ Å_²‡Ä/ü øÇñSá_Áÿ‹~~ |Iû ~ÓúׯO†ºÀoþÌ_´ßü»öÁø˜ÚŠüaø+á˜?jψžñ'í!ðÇú¢€?šØöÕøßûC~Ø_³ìþÿ‚”üý«~ üOñÄ/x‡áGìÅñ7öjø·=·Ã=KàgÅoø;Äß?eX¿`¯µüËàþãøyi³ñSöÙý­~!|-øË©|ýŽþ+\übñ'Æ]cã¿…ø&÷í·ûa|ký¡þØ|uý´ÿb üXðÿˆu/ÿ°ïí›ð3Ä¿´?ÁoMð“Å=ñÂO…ÿ±¿„?àž?³×í#ðãÀÏŠ:>™áox ö†ý²¿iMGáÂO |dð—ÄY>,|VÓtOŒ>þ—¨ ¿”/~Ò¾ø¥ûQÁ>2üsý´>üGý£u¿ÚÄZí û?ø»áßÀ›-cþ åûB~Ð_ðNßÚ¯EÖ¿cïüVøiàøëöaÿ„§ãÕÝ·Á?dÛWÅ¿?iÚÇþ'ƒ|Wqã?ٗ㌾5þ¯h å‹öaÿ‚›~Ðñ~Ø_²F‡ñ—ö®ø?ã_‡µgÆ à¿Åo„ßÅ„â¯ÙCâŒþ|cø©ð¯àÿÅ€??a…¾$ý„¿iýkã'Ã]à7ƒf/Úoþ ]û`üLmE~0üð̵gÄOx“öøcöÿügâ5׃¾$øóàoÇOø(ÏíûB~ÓQþзG…'ý>/Gû8øÇ ~hßµÆ|ý¡þ xcàÿìÕàÚáÃÿ~Ïúíá¿>(øßòuÖñßá‡> ø[@Ñ~"þÌ^°ý¾¢€?šø&÷í·ûa|ký¡þØ|uý´ÿb üXðÿˆu/ÿ°ïí›ð3Ä¿´?ÁoMð“Å=ñÂO…ÿ±¿„?àž?³×í#ðãÀÏŠ:>™áox ö†ý²¿iMGáÂO |dð—ÄY>,|VÓtOŒ>þ—¨¢€?œÙûöÿ‚Gøsþ ›ñ¿öhøqû=þÈW‹eÙþ oñcáo‚¼%gàˆ~;|,ø§ð_öŠý®|¨|Ki—ÿð»á`fÃêß¼eâ]zûÄü⿃Vu/xKâ6…eâ??à•ºoì±cûSü"Õÿd¯~À'þØý¿ÿà¨:n¥ðûöøiðëÀŸµ?ßÙb/ˆ¿ðP+¯„þ2ý¯¾1|4ø±ñþGì}ý•ðDø1ðÒ>i_|wûx§Ã_5øTþ ðÆëöŠþ`¿e¿Û¿ö{½ÿ‚½|bøÅᯌ?³ý§ìåûu|@ñßìŸð»ã§†> þÌãGý«~;~Ì? ÿbà/Â+}#Â>0¸øõ{ñàÿ޵¿ø(­ŸÅ¿‰ÿ¼-àï‹^ý¢c¯øOâÿÆ?xóöð¶•ý>×€~Ö??á—ÿeÚ[ö—ÿ„[þøgÙÿã'ÇOøB¿¶ÿáÿ„Ãþ'ïøÿþoøHÿ²|Iñ·ÃkOøWDømàß´_jü¨xâ×Ä»íWSøñGÁ·¿ ­®|1ñÇú–»£øw[Ô0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPÈ |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôPâüCÆ¿·Ö¯ÿíÿ‚‡éÿÿfŸÙáÿÃ+ØöÜÿ„›Åß nÁý¯¦ý£íûýQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEðq'üˆ?³‡ý†-¿õTxFŠ?àâOùgû [ê¨ðŽøKüU?ôäÆ÷ùGòGè÷íkÿ'•ÿïÿ°ÇÄßýc½n¾¶¯’k_ù<¯ø'ý†>&ÿëëuõµyu·‡øgÿ§ªšÇo»ÿIˆQE‰Gç—ü"ÃöUÔüá;ÚgÅ_²÷‚nçþÞÿ…MâÛ«ÀŸd3Å1j¾ ›Ä?ð”xÅ?þü×~6^ø:=cOø=ý¹ñÿôÏ ÝüaÖ>k|>Óþ>hZŸÚÿðMéüGuðgö=ºñŽ•ñGBñuÏìóð¶è&ÿëëuõµ|“ûZÿÉåÁ;ÿì1ñ7ÿXï[¯­«Ë­¼?Ã?ý=TÖ;}ßúLBŠ(¬J> ý½´>!ð?‚—Ázgìó«|ðÆ·â¿~Øíñ÷ÅŸ³ÿüqð[¿üM%·Ãßx§Ã?~5[ÇðºóÅ×Ú7Ä?ŒÍâ+øOÄŸþê?þ èž<øMñ‹â6—§v¿ðBÿÿÂkû ÿÁ;uµø&óì²÷ß yÞñ¯ü'ÚÂðÉü öKýwûß`ñµ‡ü#Ÿaø—à¯ìûøVß­üUðëû{Å?ðŠÿÂO¬}{^¡ðcþJW†ÿî1ÿ¦ V¶¥/~”mÿ/i»Ýÿ3Ým}wÞÉ-I’Ñ¿'ø¥þ_‰÷…Q^шQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEüuÿÁÄŸò þÎö¶ÿÕQá(ÿƒ‰?äAýœ?ì1mÿª£Â4V8á/ñTÿÓ“ßåɣߵ¯üžWü¿þÃõŽõºúÚ¾Iý­äò¿àÿöø›ÿ¬w­×ÖÕåÖÞáŸþžªk¾ïý&!EV%—¿ðT |ñ×…¿g#ãׯ_Ù{ྉ࿚§ÅÍ ÷öÜø3mñwöUø‡ªèß>(|%›á·Ž-¼OñCà‡Ãäñ³Ú|o‰_ ¼7ªüR²ñ–³yðË\ñW„|âá/ ý­ÿªÔ<9¨ü%ø4þøgð»áW„l5¿Ú…´oþ °øyð[ÆžðÏÄ/Š~Ðþ;ü ð^–÷šg‡þ~Óf—kûEøÏN×¼k`Þø¥¤ÜZ|Hø›o<|Kí•ê?ä¥xoþãú`ÕkjR¼èÇ]*Áî­ñv²ïÕ¿+\–´“ò’ÿ/êÇäìGûjüoý¡¿l/Ùö ÿÁJ~þÕ¿þ'øƒâ‹Û~Â_5¯ü5ƒà7ü3í‰ÿ.ý°|TÚrüsø+iíYãx»öøcýnÑ^щüÁÁ!?i_ÿÂÿ‚F|0ð?í¡ÿ ÷ž4ýŸþü7ý£ÿb?øW <ÿ û=ø/öñ¿Œ~üwÿ…g‚-l}¿âGÃ_Ù·á¿ü4/Ç‹Þ4ý™ÿhøi/øXü០|}ý˜ì<û}ð·Æ¿·Ö¯ã½ Oø×û4þÈþ\iÿÂMâï…¿·ÆŒ;Ò<­PŸFþÂøuâÏø'·Àïø‹íþ ‹JÓ5?íŠ^þÈÑïu v×ûn÷L¶ðî¯õýü¡x#ö•ðwÅ/Ú‹þ¡ñ—ãŸí¡ðÿâ?í­þÐ"Óÿh_ÙÿÅßþÙkðO/Úö‚ÿ‚vþÕz.µûxwâ·ÃOxÇ_³ü%?®í¾Áû#þÚ¾-øÁûL~о;ø?ðé<â»þÌ¿eñ¯Aû~ÝßµWÅx:ëö—ÿ‚’þÄ®~!|ø§âoÚsö|½ý·eïÚö6Ôm¾xëâG­¾þÉž"ÿ‚j|"ø‰ð3ãì™ñB²xOöËý©ko üøIàOŒžøç£|oñ¶‘iñKCþ§h å öLÿ‚ž~Ö>1ð—쟬ø³öÓýŸþ7k^<ýŸÿàŽŸ´'Œ<#¡|-øm¡xŸâV±û{þÜRÿÁ8ÿiŸéíàïÍýðÿöMþ˶ñgÅ%ðφSÇv¿ðPOé—:ÏŽþþ̰iß°]ÿ×ÿ±¯í•ñâ_Ä_؉[öÝÿ†€ý ?h;þûöòe‹¿øwÚÿe‹_þ#ŹøAð—Áßµ§ÀŸøQ?µ§ƒ¾~È¿ñ—_~(Â7ÿ CþgÅ?øI¿hx'ÆÚOïõÏø³Â~ñï…|Mà_xgÃþ4ðOñf§x¾,ð¯ˆôëÄ>ñ7‡µ‹kÍ#^ðþ»¤^^izΪYÝiÚ¦usc}m=´òÄßÎìkû=|ñÏÇßÙ/ö ¾øð~êçþMâÚ7Åž(#á§‚ÏŽ>x«Æž4_ ÿÁ0üMâ_h³x;ƾ ý³ÿdïø×öûý¡õŸ¶Pj:íµðsáÄ?ˆ7?üoáÍ7ሥê(ù¡ÿ‚o~Û¶Æ¿Úà‡Ç_ÛOö ¸ñOÅø‡RøÿûÞþÙ¿Ì|*ÖnoüiãŸÿ»ÔPóCûþÚ¿ÿhoÛ ö}ŸÃðRŸƒÿµoÁ¿‰þ ø…âÏü(ý˜¾&þÍ_ç¶øg©| ø­âÿx›ãGì«ìð#ö±ÿ‚y|ѼbŸ- Ö~*~Û?µ¯Ä/…¿u/ƒÿ±ßÅkŸŒ^$øË¬|wð§Ø³7íIð0ÿÁWÿmOÙðþÜßþ;xÛÄÿfáðÿÀºÏ‰¿cØ>2ø?â…¾0ÁE¯¾6~Ê~¼ø%ðûá·Åoxöcð·‡<+â+Ÿ†_uŠÿ> ÁãOx¯Å^ µ¹ø“¯êšÏìõøûþÙ_~%üEýˆ•¿mßøhÚö€ó¿á¿¿`'öX»ÿ‡wý¯öXøµñâ7ü[Ÿ„ |ûZ| ÿ…ûZx;áWì‹ÿuñWâ‡ü#ð´?áV|Sÿ„›ö€ñ7‚|m¤øÿìÿÖÛÅ_²±ãÿø*ÁÿÚkô—üöëý€4j³þÈþƒTøIðKQý¬þÔ~+üvý¢ÿfxçûãoì›ÿ ‹þÁ_ðŒøÇKÿ„þ¿ƒ¯¼ð§þ*=kÃÚw„¼Uÿ W„´ëÍ[þ(­{ÄØ~OØx‹ö½¾øÛã¹~;|7øåÿBñÇï„_¼#ñ ⯎|Aà/øR¾¼ðþ»âïÙÓ᎟á¯|Ñõ¨55øwàÛ/M=ÿíõWáü·ö–ګĵö­ÿ}ðÿíEão…?lïi_³WÃKØ15þÍ_ j‹ÿþ üný¡t¿†? />+k¾ ×¼-yðÛÇZ/ÅŸ€ú§ìÉðCÄÞÕ¾Ù…ZÍÍÿþÆþÿ‚xþÏ_´ÁÿŒ>(èúg…¼}à/ÚöÊý¥5„? <5ñ“Â_dø±ñ[MÑ>0øs쀴/ì_/ügöäð/ߎ?³Ÿ>*~̰ç„üKàïüKøRÿ>#ü}øñ#þ S£ü_ðιáí Z>)ñ‡Æ‚¿ to†º_ÄþÏQñ§Ã‡ºO¬|Om£xnÇ@Š/Ùê(ù¡ÿ‚o~Û¶Æ¿Úà‡Ç_ÛOö ¸ñOÅø‡RøÿûÞþÙ¿:þڱNJ~,xÄ:—ÇÿØF÷öÍøâ_Úà·Š¦øIâøá'ÂÿØßÂðOÙëö‘ø?ñƒàgÅLð·¼ûC~Ù_´¦£ð‡á'†¾2xKâ,Ÿ>+iº'ÆKÔP_Ê‚?i_|Rý¨¿àŠ~9þÚþ#þѺßíâ-?ö…ýŸü]ðïàM–±ÿòý¡?h/ø'oíW¢ë_±÷‡~+|4ðG€üuû0ÿÂSñêîÛàŒ²?í«âߌ´Çí 㿃ÿ“Á¾+¸ñŸìËñÆ_ÿW´PòÅû0ÿÁM¿hx¿l/Ù#CøËûW|ñ¯Ã¿Ú³ã¿ð_â·Â oâÇÂFñWì¡ñ Æ>1üTøWðâÇÀ‡Ÿ°‡Âß~Â_´þµñ“ᮃðÁ¿³í7ÿ.ý°~&6¢¿~ øfÚ³â'€ þÐÿ<1ðöjðGíð‡áÿ?gý áÖ¿ð߯Ÿ|oáÙ:ëGøïðÃÀŸü- h¿f/Ø~ßQ@Íü{öÛý°¾5þÐÿì>:þڱNJ~,xÄ:—ÇÿØF÷öÍøâ_Úà·Š¦øIâøá'ÂÿØßÂðOÙëö‘ø?ñƒàgÅLð·¼ûC~Ù_´¦£ð‡á'†¾2xKâ,Ÿ>+iº'ÆKÔQ@Ìì·ûwþÏw¿ðW¯Œ_¼5ñ‡ö´ýœ¿n¯ˆ;ý“þ|tðÇÄÙœhÿµoÇoÙ‡á?ìC¢|øEo¤xGƯ~ |ñÖ·ÿµ³ø·ñ?á÷…¼ñkÀŸ´Oìuàÿ ü_øÇàÏ~ÂþÒ½ö$ý°~7ø£ãïÃo„zçííáÿÚëâMí¿ÿý–~<~ÍÐøSöjÓ¾&| ý”g/~Û6_ ?jŸÞøá |Dðׯ oâ'ÁÙÏá-ÇŹ´ßƒÿ²®µð÷ã÷ÃßÛþÍò|vñG‡¾;xËú¯ý›ÿf/„_²o5†ß-> XxK_øãŠZ¥·Ä_Ÿ>;ëxïâV±'‰¼®ÁâÏŽÿ¾%x¶ÃþÝj¾6ñ™§ë–º>©ã¿ø»Ç7Z|ž-ñŠu`òƒþ [ûK?íUâ ZûVÿ‚¾øö¢ñ·Â¿Œ¶w‡4¯Ù«á¥Çìšÿf¯…¿µÅÿ‚ÿ~7~к_Ã…ŸµßkÞ¼ømã­âÏÀ}Södø!âo êßìÇ­fæÿÆž9øßè³7íIð0ÿÁWÿmOÙðþÜßþ;xÛÄÿfáðÿÀºÏ‰¿cØ>2ø?â…¾0ÁE¯¾6~Ê~¼ø%ðûá·Åoxöcð·‡<+â+Ÿ†_uŠÿ> ÁãOx¯Å^ µ¹ø“¯êšÏìõøÃðö…ý‹åÿ‚ÌþÜžøsñÇö`“ã'ÅOÙƒöðŸ‰|àŸ‰ _âgÄ¿~$ÁJt‹þ×<=¡kGÅ>0øÁðWáNð×Kø“£_Ùê>4øqð÷Ið5‰í´o ØèEû=Eøƒû.üfý¼;ÿˆý»~ü8ýª>øÏâoÅ_ÙÿöH±¸øuâ/ÚöûãoŽåøíðßã—ü Ä_¾|:ðÄ/о9ñ€¿áJø~óÃúï‹¿gO†:†¼ð;GÖ Ô×á߃l¼A4÷ÿ~Âð­ßíUûè_²¾“ÿàøë«üñŒ¤ý¹?ࢰÏí)§|Zý¥iŸ†v_²Ç?‡6¾=ý¿G„¿fï hzˆ?j¿Ú_ø5ñûWøIñöÇý ~!x»ã‚ï¾!ø?Møå¤|ø§ñçágõ;EøÿÈø±ÿãøµûSêÞ5ý‹>%þÏþÔüoû?üEÕtOƒ_üe¥øóã·íðë@ø‹ðM-ñW…lÿfï ~Ó~#“ö§ð—ƒ¾/~Ñþ?øÑ¯ëŸ~;ütø#û%þÿQ@Ììÿ ±ý©ÿÿ…ÿ ÿÿÿ‰'ü=ƒþGü+¯ømùGí'ÿ ÿ ÿ„Cþ/¯üŸ§ü)?ø\ÿðÒ_ówð«á8ÿ‹Ëÿ•°ü2Çö§üÿþwü3ÿüÑ@ÍìaáïÙÀ·Ÿ†u‚ºïüƒö¾ø­ñËöŸý³~$øÆûáßì“¢|4ÿ‚£~ÚwÇwý¦¿i?øÛö³ø‘¬|cø‹ñ“@ðÿÃ?kWìâ¿|Nýž¿f?xoÄß¾xÆšç…üS¡Ëðwâ'ô½EQEQEQEQEQEQEQEQEQEQEQEQEüuÿÁÄŸò þÎö¶ÿÕQá(ÿƒ‰?äAýœ?ì1mÿª£Â4V8á/ñTÿÓ“ßåɣߵ¯üžWü¿þÃõŽõºúÚ¾Iý­äò¿àÿöø›ÿ¬w­×ÖÕåÖÞáŸþžªk¾ïý&!EV%šÿðS_Äv_ þècâWÂï„?üiûCZxkö›øñë·þ*ýžtÏ‚Ñ| øëâ?Ãÿ`Óþ)|x>|Eøßᯃ_ µ=+RøÁà üHÖüe üñô<ñ+Äÿ~!}yÿªÔ<9¨ü%ø4þøgð»áW„l5¿Ú…´oþ °øyð[ÆžðÏÄ/Š~Ðþ;ü ð^–÷šg‡þ~Óf—kûEøÏN×¼k`Þø¥¤ÜZ|Hø›o<|Kí•ê?ä¥xoþãú`ÕkjR÷èÆÛUƒ¿{ª¶ú¥vöI$µ¼µ£~Oò_äv? |kû}jþ;дÿ³Oìðÿá•ÇöŸü$Þ.ø[ûpühøÁã½#ÊÑõ ôoì/‡^,ÿ‚{|ðÿˆ¾ßâ´­3SþÐø¥áì÷P×m¶ïtËoêçÂßþßZ¿Žô-?ã_ìÓû |?øeqý§ÿ 7‹¾þÜ?>0xïHò´}B}û á׋?àžß¼?â/·ø‚-+LÔÿ´>)x_û#G½Ô5Û_í»Ý2Ûú¿×ôW´b|ð·Æ¿·Ö¯ã½ Oø×û4þÈþ\iÿÂMâï…¿·ÆŒ;Ò<­PŸFþÂøuâÏø'·Àïø‹íþ ‹JÓ5?íŠ^þÈÑïu v×ûn÷L¶ðî®|-ñ¯íõ«øïBÓþ5þÍ?²Ãÿ†WÚð“x»áoíÃñ£ãŽô+GÔ'Ñ¿°¾x³þ íð;Ãþ"ûˆ"Ò´ÍOûCâ—…ÿ²4{ÝC]µþÛ½Ó-¼;«ýE|ð·Æ¿·Ö¯ã½ Oø×û4þÈþ\iÿÂMâï…¿·ÆŒ;Ò<­PŸFþÂøuâÏø'·Àïø‹íþ ‹JÓ5?íŠ^þÈÑïu v×ûn÷L¶ðî®|-ñ¯íõ«øïBÓþ5þÍ?²Ãÿ†WÚð“x»áoíÃñ£ãŽô+GÔ'Ñ¿°¾x³þ íð;Ãþ"ûˆ"Ò´ÍOûCâ—…ÿ²4{ÝC]µþÛ½Ó-¼;«ýE|ð·Æ¿·Ö¯ã½ Oø×û4þÈþ\iÿÂMâï…¿·ÆŒ;Ò<­PŸFþÂøuâÏø'·Àïø‹íþ ‹JÓ5?íŠ^þÈÑïu v×ûn÷L¶ðî®|-ñ¯íõ«øïBÓþ5þÍ?²Ãÿ†WÚð“x»áoíÃñ£ãŽô+GÔ'Ñ¿°¾x³þ íð;Ãþ"ûˆ"Ò´ÍOûCâ—…ÿ²4{ÝC]µþÛ½Ó-¼;«ýE|ð·Æ¿·Ö¯ã½ Oø×û4þÈþ\iÿÂMâï…¿·ÆŒ;Ò<­PŸFþÂøuâÏø'·Àïø‹íþ ‹JÓ5?íŠ^þÈÑïu v×ûn÷L¶ðî®|-ñ¯íõ«øïBÓþ5þÍ?²Ãÿ†WÚð“x»áoíÃñ£ãŽô+GÔ'Ñ¿°¾x³þ íð;Ãþ"ûˆ"Ò´ÍOûCâ—…ÿ²4{ÝC]µþÛ½Ó-¼;«ýE|ð·Æ¿·Ö¯ã½ Oø×û4þÈþ\iÿÂMâï…¿·ÆŒ;Ò<­PŸFþÂøuâÏø'·Àïø‹íþ ‹JÓ5?íŠ^þÈÑïu v×ûn÷L¶ðî®|-ñ¯íõ«øïBÓþ5þÍ?²Ãÿ†WÚð“x»áoíÃñ£ãŽô+GÔ'Ñ¿°¾x³þ íð;Ãþ"ûˆ"Ò´ÍOûCâ—…ÿ²4{ÝC]µþÛ½Ó-¼;«ýE|ð·Æ¿·Ö¯ã½ Oø×û4þÈþ\iÿÂMâï…¿·ÆŒ;Ò<­PŸFþÂøuâÏø'·Àïø‹íþ ‹JÓ5?íŠ^þÈÑïu v×ûn÷L¶ðî®|-ñ¯íõ«øïBÓþ5þÍ?²Ãÿ†WÚð“x»áoíÃñ£ãŽô+GÔ'Ñ¿°¾x³þ íð;Ãþ"ûˆ"Ò´ÍOûCâ—…ÿ²4{ÝC]µþÛ½Ó-¼;«ýE|ð·Æ¿·Ö¯ã½ Oø×û4þÈþ\iÿÂMâï…¿·ÆŒ;Ò<­PŸFþÂøuâÏø'·Àïø‹íþ ‹JÓ5?íŠ^þÈÑïu v×ûn÷L¶ðî®|-ñ¯íõ«øïBÓþ5þÍ?²Ãÿ†WÚð“x»áoíÃñ£ãŽô+GÔ'Ñ¿°¾x³þ íð;Ãþ"ûˆ"Ò´ÍOûCâ—…ÿ²4{ÝC]µþÛ½Ó-¼;«ýE|ð·Æ¿·Ö¯ã½ Oø×û4þÈþ\iÿÂMâï…¿·ÆŒ;Ò<­PŸFþÂøuâÏø'·Àïø‹íþ ‹JÓ5?íŠ^þÈÑïu v×ûn÷L¶ðî®|-ñ¯íõ«øïBÓþ5þÍ?²Ãÿ†WÚð“x»áoíÃñ£ãŽô+GÔ'Ñ¿°¾x³þ íð;Ãþ"ûˆ"Ò´ÍOûCâ—…ÿ²4{ÝC]µþÛ½Ó-¼;«ýE|ð·Æ¿·Ö¯ã½ Oø×û4þÈþ\iÿÂMâï…¿·ÆŒ;Ò<­PŸFþÂøuâÏø'·Àïø‹íþ ‹JÓ5?íŠ^þÈÑïu v×ûn÷L¶ðî®|-ñ¯íõ«øïBÓþ5þÍ?²Ãÿ†WÚð“x»áoíÃñ£ãŽô+GÔ'Ñ¿°¾x³þ íð;Ãþ"ûˆ"Ò´ÍOûCâ—…ÿ²4{ÝC]µþÛ½Ó-¼;«ýE|ð·Æ¿·Ö¯ã½ Oø×û4þÈþ\iÿÂMâï…¿·ÆŒ;Ò<­PŸFþÂøuâÏø'·Àïø‹íþ ‹JÓ5?íŠ^þÈÑïu v×ûn÷L¶ðî®|-ñ¯íõ«øïBÓþ5þÍ?²Ãÿ†WÚð“x»áoíÃñ£ãŽô+GÔ'Ñ¿°¾x³þ íð;Ãþ"ûˆ"Ò´ÍOûCâ—…ÿ²4{ÝC]µþÛ½Ó-¼;«ýE|ð·Æ¿·Ö¯ã½ Oø×û4þÈþ\iÿÂMâï…¿·ÆŒ;Ò<­PŸFþÂøuâÏø'·Àïø‹íþ ‹JÓ5?íŠ^þÈÑïu v×ûn÷L¶ðî®|-ñ¯íõ«øïBÓþ5þÍ?²Ãÿ†WÚð“x»áoíÃñ£ãŽô+GÔ'Ñ¿°¾x³þ íð;Ãþ"ûˆ"Ò´ÍOûCâ—…ÿ²4{ÝC]µþÛ½Ó-¼;«ýE|ð·Æ¿·Ö¯ã½ Oø×û4þÈþ\iÿÂMâï…¿·ÆŒ;Ò<­PŸFþÂøuâÏø'·Àïø‹íþ ‹JÓ5?íŠ^þÈÑïu v×ûn÷L¶ðî®|-ñ¯íõ«øïBÓþ5þÍ?²Ãÿ†WÚð“x»áoíÃñ£ãŽô+GÔ'Ñ¿°¾x³þ íð;Ãþ"ûˆ"Ò´ÍOûCâ—…ÿ²4{ÝC]µþÛ½Ó-¼;«ýE|ð·Æ¿·Ö¯ã½ Oø×û4þÈþ\iÿÂMâï…¿·ÆŒ;Ò<­PŸFþÂøuâÏø'·Àïø‹íþ ‹JÓ5?íŠ^þÈÑïu v×ûn÷L¶ðî®|-ñ¯íõ«øïBÓþ5þÍ?²Ãÿ†WÚð“x»áoíÃñ£ãŽô+GÔ'Ñ¿°¾x³þ íð;Ãþ"ûˆ"Ò´ÍOûCâ—…ÿ²4{ÝC]µþÛ½Ó-¼;«ýE|ð·Æ¿·Ö¯ã½ Oø×û4þÈþ\iÿÂMâï…¿·ÆŒ;Ò<­PŸFþÂøuâÏø'·Àïø‹íþ ‹JÓ5?íŠ^þÈÑïu v×ûn÷L¶ðî®|-ñ¯íõ«øïBÓþ5þÍ?²Ãÿ†WÚð“x»áoíÃñ£ãŽô+GÔ'Ñ¿°¾x³þ íð;Ãþ"ûˆ"Ò´ÍOûCâ—…ÿ²4{ÝC]µþÛ½Ó-¼;«ýE|ð·Æ¿·Ö¯ã½ Oø×û4þÈþ\iÿÂMâï…¿·ÆŒ;Ò<­PŸFþÂøuâÏø'·Àïø‹íþ ‹JÓ5?íŠ^þÈÑïu v×ûn÷L¶ðî®|-ñ¯íõ«øïBÓþ5þÍ?²Ãÿ†WÚð“x»áoíÃñ£ãŽô+GÔ'Ñ¿°¾x³þ íð;Ãþ"ûˆ"Ò´ÍOûCâ—…ÿ²4{ÝC]µþÛ½Ó-¼;«ýE|ð·Æ¿·Ö¯ã½ Oø×û4þÈþ\iÿÂMâï…¿·ÆŒ;Ò<­PŸFþÂøuâÏø'·Àïø‹íþ ‹JÓ5?íŠ^þÈÑïu v×ûn÷L¶ðî®|-ñ¯íõ«øïBÓþ5þÍ?²Ãÿ†WÚð“x»áoíÃñ£ãŽô+GÔ'Ñ¿°¾x³þ íð;Ãþ"ûˆ"Ò´ÍOûCâ—…ÿ²4{ÝC]µþÛ½Ó-¼;«ýE|ð·Æ¿·Ö¯ã½ Oø×û4þÈþ\iÿÂMâï…¿·ÆŒ;Ò<­PŸFþÂøuâÏø'·Àïø‹íþ ‹JÓ5?íŠ^þÈÑïu v×ûn÷L¶ðî®|-ñ¯íõ«øïBÓþ5þÍ?²Ãÿ†WÚð“x»áoíÃñ£ãŽô+GÔ'Ñ¿°¾x³þ íð;Ãþ"ûˆ"Ò´ÍOûCâ—…ÿ²4{ÝC]µþÛ½Ó-¼;«ýE|ð·Æ¿·Ö¯ã½ Oø×û4þÈþ\iÿÂMâï…¿·ÆŒ;Ò<­PŸFþÂøuâÏø'·Àïø‹íþ ‹JÓ5?íŠ^þÈÑïu v×ûn÷L¶ðî®|-ñ¯íõ«øïBÓþ5þÍ?²Ãÿ†WÚð“x»áoíÃñ£ãŽô+GÔ'Ñ¿°¾x³þ íð;Ãþ"ûˆ"Ò´ÍOûCâ—…ÿ²4{ÝC]µþÛ½Ó-¼;«ýE|ð·Æ¿·Ö¯ã½ Oø×û4þÈþ\iÿÂMâï…¿·ÆŒ;Ò<­PŸFþÂøuâÏø'·Àïø‹íþ ‹JÓ5?íŠ^þÈÑïu v×ûn÷L¶ðî®|-ñ¯íõ«øïBÓþ5þÍ?²Ãÿ†WÚð“x»áoíÃñ£ãŽô+GÔ'Ñ¿°¾x³þ íð;Ãþ"ûˆ"Ò´ÍOûCâ—…ÿ²4{ÝC]µþÛ½Ó-¼;«ýE|ð·Æ¿·Ö¯ã½ Oø×û4þÈþ\iÿÂMâï…¿·ÆŒ;Ò<­PŸFþÂøuâÏø'·Àïø‹íþ ‹JÓ5?íŠ^þÈÑïu v×ûn÷L¶ðî®|-ñ¯íõ«øïBÓþ5þÍ?²Ãÿ†WÚð“x»áoíÃñ£ãŽô+GÔ'Ñ¿°¾x³þ íð;Ãþ"ûˆ"Ò´ÍOûCâ—…ÿ²4{ÝC]µþÛ½Ó-¼;«ýE|ð·Æ¿·Ö¯ã½ Oø×û4þÈþ\iÿÂMâï…¿·ÆŒ;Ò<­PŸFþÂøuâÏø'·Àïø‹íþ ‹JÓ5?íŠ^þÈÑïu v×ûn÷L¶ðî®|-ñ¯íõ«øïBÓþ5þÍ?²Ãÿ†WÚð“x»áoíÃñ£ãŽô+GÔ'Ñ¿°¾x³þ íð;Ãþ"ûˆ"Ò´ÍOûCâ—…ÿ²4{ÝC]µþÛ½Ó-¼;«ýE|ð·Æ¿·Ö¯ã½ Oø×û4þÈþ\iÿÂMâï…¿·ÆŒ;Ò<­PŸFþÂøuâÏø'·Àïø‹íþ ‹JÓ5?íŠ^þÈÑïu v×ûn÷L¶ðî®|-ñ¯íõ«øïBÓþ5þÍ?²Ãÿ†WÚð“x»áoíÃñ£ãŽô+GÔ'Ñ¿°¾x³þ íð;Ãþ"ûˆ"Ò´ÍOûCâ—…ÿ²4{ÝC]µþÛ½Ó-¼;«ýE|ð·Æ¿·Ö¯ã½ Oø×û4þÈþ\iÿÂMâï…¿·ÆŒ;Ò<­PŸFþÂøuâÏø'·Àïø‹íþ ‹JÓ5?íŠ^þÈÑïu v×ûn÷L¶ðî®|-ñ¯íõ«øïBÓþ5þÍ?²Ãÿ†WÚð“x»áoíÃñ£ãŽô+GÔ'Ñ¿°¾x³þ íð;Ãþ"ûˆ"Ò´ÍOûCâ—…ÿ²4{ÝC]µþÛ½Ó-¼;«ýE|ð·Æ¿·Ö¯ã½ Oø×û4þÈþ\iÿÂMâï…¿·ÆŒ;Ò<­PŸFþÂøuâÏø'·Àïø‹íþ ‹JÓ5?íŠ^þÈÑïu v×ûn÷L¶ðî¯õýPEPEPEPEPEPEPEPEPEPEPEPEPñ×ÿȃû8ØbÛÿUG„h£þ$ÿ‘öpÿ°Å·þªÑXáÿ„¿ÅSÿNLo”$~~Ö¿òy_ðNÿû |MÿÖ;Öëëjù'öµÿ“Êÿ‚wÿØcâoþ±Þ·_[W—[x†úz©¬vû¿ô˜…QX”|Qûlü$ýu?‡>(ý§ÿkOÙïÁ?´‰û&üøíã« ƾðÏÄïìÏ®…á߈_áð—€üsÃëßk¶Ÿü7i ëºÔv:®™ök½Mñ?‡´Oø©u?¡¿à™_?á˜~|ø;>™à [Ó?ádø×Æ~ø_gý™ð“Âß¾0kþ>øÃñ3Â_t‡Ñ´ ½àŸ…> øóľø5 êºdzî…ðÃLð¦‘â ½O[²Ô5;ÏQ¯Pø1ÿ%+Ã÷ÿÓ«[R“祻{X=ôø´²é¼›ï!Ihß“ü¿à#ï (¢½£¢Š(ä…¾5ý¾µèZƿ٧ö@øðÊãûOþo|-ý¸~4|`ñÞ‘åhú„ú7öïÁ=¾xÄ_oñZV™©ÿh|Rð¿öF{¨k¶¿Ûwºe·‡u¯è¢€?šØöÕøßûC~Ø_³ìþÿ‚”üý«~ üOñÄ/x‡áGìÅñ7öjø·=·Ã=KàgÅoø;Äß?eX¿`¯µüËàþãøyi³ñSöÙý­~!|-øË©|ýŽþ+\übñ'Æ]cã¿…:ß¶ï‹|ccû6êþ$ÿ‚—ý¿ãƯ‡þ8ÔÿࣳgÚ¿aÛ?øt~ìmñ³ãOÅŸŠ_ð‡Ù|¶øÏû;Ã$þÔþ øcû8ÿhÁ@<_ñÇÀžÿ„çþ¯í¡x÷㈼3â{èúŠþP¿dÏø)çícã ~ÉúÏ‹?m?ÙÿãvµãÏÙÿþéûBxÃÂ:Â߆Ú‰þ%k·¿íÅ/üö™ðžÞñÌߨÿÿdßì»o|R_ øeüSÔ¿nØGã/í›û5x—ÆŸ¼+7À/x÷ã'ÂH¿cøwìõñ“àÿˆ>x“G“Âß<ûW~Ù_´¦ð‡à†¾;xKãŸ>"iºoÆS´Póÿ„ý¥|Gÿ wþ ðÃÀÿ¶‡ü/ßøÓöøCðßöýˆÿá]ü,ð?ü2ì÷à¿ØOÆþ1øñßþœ~µý±üöÿ‰ f߆ÿðп~/xÓögý ?᤿á`|ð†|%ñ÷öc°ð¿þÆ¿¶WÄ_‰b%oÛwþö€ý <ïøoïØÉý–.ÿáÝÿký–>-|_øÿçáÂ_~ÖŸáDþÖžøUû"ÿÆ]|Uø¡ÿßü-øUŸÿá&ý %êþ9øeà!â½ß ÓâÄ/¿ðX/ x â¥õÏìçð:_ ~ïW€|/ý˜¾|ø§ñŸã_ƒm> \üMøÿÿ¼üMãÿŸ>.}£GðOˆþ&x³Á¾ðVñcâ¼?ð›áÿ„üAñâ^¡áχ_ ô¯øDÿ„®ö×Mðíµ•¶›mdïõü±Á=?k_„Ÿçý•<%ðŸöÒý˜'ý›¿i/ø*ÿüö?øWû*ü<ºýž<3ð—áßÂK_Œ¿·íð§Å?µ ê7Ÿ5ïŒïÄKÏÙwÀÿeðçŒü9ûðïÅo†žðŽ¿føJ~=]Û|ƒöGýµ|[ñƒö˜ý¡|wðáÒx7Åw3ý™~8Ëã_êöŠ+ñ‡öfý©>ø*ÿí©û>Û›àÿÇoxàÿìÜ>øYñ7ì{Æ_üBð·Æø(µ÷ÆÏÙOÂwŸ¾|6ø­ãïþÌ~ðç…|EsðËâî£ñ_âgÁX þÐÿ<1ðöjðGíð‡áÿ?gý áÖ¿ð߯Ÿ|oáÙ:ëGøïðÃÀŸü- h¿f/Ø~ßQ@„?ðJßÚYÿj¯j×Ú·ü÷Ãÿµ¾ü`ý³¼9¥~Í_ .?`ÄÔ|û5|-ý¨>/üø+ñ»ö…Òþü(¼ø­®øƒ^ðµçÃoh¿~ꟳ'ÁxWVøf>k77þ4ñÏÆþö5ý²¾"üKø‹û+~Û¿ðдíçÃ~À>Oì±wÿïû_ì±ñkâÿÄoø·?>ø;ö´øÿ 'ö´ðw¯Ùþ2ëâ¯ÅøFÿáh¬ø§ÿ 7íâoøÛIýþ¢€?”/~Ò¾ø¥ûQÁ>2üsý´>üGý£u¿ÚÄZí û?ø»áßÀ›-cþ åûB~Ð_ðNßÚ¯EÖ¿cïüVøiàøëöaÿ„§ãÕÝ·Á?dÛWÅ¿?iÚÇþ'ƒ|Wqã?ٗ㌾5úÀ·<ñ—öýŸ>2þÚž ¾øÈ?à£ÿ·OìŸûLøâ'ƒ~xkQñŸÁ­FÛ®ûþ ÷«~Ñwžøà½#àoÆGÂ_Ù_Ä_²6àýGà ÿ¶…|qãoü>øwñ³ÃqÞêž þ‡¨ ÂØsöŸñ§Ç_~É×:çüïÃþ-øíãϧĿÛ_þ »oð—à¾!~Ïß®>xÒçÆŸ³Ô+ðwÃøãû|øñÇÅk¡üBÖ¿m~2üL½ø™ð¿àìç©üqðwÄŸøÃAøÿóÿü{öÛý°¾5þÐÿì>:þڱNJ~,xÄ:—ÇÿØF÷öÍøâ_Úà·Š¦øIâøá'ÂÿØßÂðOÙëö‘ø?ñƒàgÅLð·¼ûC~Ù_´¦£ð‡á'†¾2xKâ,Ÿ>+iº'ÆKÔPò…àÚWÁß¿j/ø"‡Æ_޶‡Ãÿˆÿ´n·û@x‹Oý¡gÿ|;øe¬Á<¿hOÚ þ ÛûUèº×ì}áßŠß <à?~Ì?ð”üz»¶ø#ìûjø·ãí1ûBøïàÿäðoŠî1üTøWðâÇÀ‡Ÿ°‡Âß~Â_´þµñ“ᮃðÁ¿³í7ÿ.ý°~&6¢¿~ øfÚ³â'€ ÿ‚lüFºðwÄŸ| øéÿý ?hOÚj?Úöèð¤ÿ±çÅèÿgøïá¯Ãmö±øÑâ‚ÿ´?Ä |ýš¼û@|!øãÏÙÿBøu¯ü7ñ§ÅøcöNºÑþ;ü0ð'Á? h/Ä_Ù‹Àv·ÔPáü·ö–ګĵö­ÿ}ðÿíEão…?lïi_³WÃKØ15þÍ_ j‹ÿþ üný¡t¿†? />+k¾ ×¼-yðÛÇZ/ÅŸ€ú§ìÉðCÄÞÕ¾Ù…ZÍÍÿ7Š¿eˆ^3øñâ§Â¿ƒÿ>ü<ý„>ø“öý§õ¯ŒŸ t€Þ ý˜¿i¿ø)wíƒñ1µøÃðWÃ0~ÕŸ<âOÚCáõ;E4?±ÿüg[o~ÈZÇÿà¨?ÿi¯ þÒ_ðQÿÛ¯öÐ ñg‹4$ø±ûL~Ò¿¾ü<ñW ÖtíÄß¾ ü_ø·ãƒü@|7â_xDÖ~x Á:…~øÃÆ_ ¼+s£|;ñ‰|1ª~ Á7¿m¿Û ã_íðÃã¯í§û\x§âLJüC©|ý„olßž%ý¡þ xªo„ž(ñïˆþ|/ýü!ÿñýž¿iƒÿ>|QÑôÏ xûÀ_´7í•ûJj?~xkã'„¾"Éñcâ¶›¢|aðçô½Eü¡x#ö•ðwÅ/Ú‹þ¡ñ—ãŸí¡ðÿâ?í­þÐ"Óÿh_ÙÿÅßþÙkðO/Úö‚ÿ‚vþÕz.µûxwâ·ÃOxÇ_³ü%?®í¾Áû#þÚ¾-øÁûL~о;ø?ðé<â»þÌ¿eñ¯ßÿ¿h¿ƒ¾$ÿ‚šþß_²æ‘ÿø㟉¿?gÿ€ú/¿ìÍ{ö—öŽø7ñOIøŸÿÿ…½û?ü-ÿ„3àΕâ‰?ðÈ>Ðü!ã?áOíáïÚÄî¼Q®ø›âTZ—Ä¿ÿÂIû}E~þÌŸ?j¯~þÇZ¯í}ñ~4ÿÁ= |>ømñ[ÇÞý˜ü-áÏ øŠçá—ÅÝGâ¿ÄÏ‚°xÓÄÞ+ñWˆ-n~$ëú¦³û=E(^ý¥|ñKö¢ÿ‚(|eøçûh|?øûFë´ˆ´ÿÚöñwÿ6ZÇüËö„ý ¿à¿µ^‹­~ÇÞø­ðÓÁñ×ìÃÿ OÇ«»o‚0~Èÿ¶¯‹~0~Ó´/Žþü:Oø®ãƳ/Ç|këÿðMïÛoöÂø×ûCü°øëûiþÄ)ø±áÿê_ÿaßÛ7àg‰h‚Þ*›á'Š<{â?„Ÿ ÿcÁ<g¯ÚGàÿÆŸt}3ÂÞ>ðí ûe~Қ„žøÉá/ˆ²|Xø­¦èŸ|9ý/Q@ñgþgü*ωð½?á_ÿÂ’ÿ…ã/ø\_ð¶áÿ…Yÿ ³þÍKþü,¿øL?â’ÿ…ÿ—ö¿ü&_ð”ÿÅ9ÿçö—ößüK>Õ_Îüö•ñü)ßø$gÃþÚð¿|[ãOÙÿáÃÚ?ö#ÿ…wð³Àÿðȳ߂ÿa?øÇáÿÇøVqø"×öÇðwÛþ$|5ý›~ÿÃBüqø½ãOÙŸö€ÿ†’ÿ…ðOÀ~ð—ÇßÙŽÃÀÓíøCðgSý¹5ÚƒáÏì¥âÛöŸñ¾~Óÿ´WÅïÚÆ>"ø9ûé_ þ,þÁ“xÂÇì{àÍ'Ä>ý<=«éþ ø—«øçá—€‡Šô|'Oˆ?¾ÿÁ`¼-à/Š—×?³ŸÀé|)û½^ð¿öbøEðâŸÆ~ ´øsñ7ãÿü"ð|Kñ7þ6|lø¹öÁ>#ø™âÏøGÁZ7ň^6ðÿÂo‡þñÆ?‰z‡‡>|'Ò¼àMþ»Û]7öÖVÚmµ—¿ÐàìÓû]ØøÏþ 9â?†ßüÓþV™kû@~Ö?|ûÿÂ7ûXxÇÇßüª|dñׄ¿áYü>ø}ûVü ýŸÿc/…¿ ¼Sðßþ/ÇO‹Ö#ý°¾;x;þŸ ~ ]|°ý³<þ ½ûmþØ_ÿh€vm?Ø‚ãÅ?-|_øÿçáÂ_~ÖŸáDþÖžøUû"ÿÆ]|Uø¡ÿßü-øUŸÿá&ý :þڱNJ~,xÄ:—ÇÿØF÷öÍøâ_Úà·Š¦øIâøá'ÂÿØßÂðOÙëö‘ø?ñƒàgÅLð·¼ûC~Ù_´¦£ð‡á'†¾2xKâ,Ÿ>+iº'ÆKÔPáü·ö–ګĵö­ÿ}ðÿíEão…?lïi_³WÃKØ15þÍ_ j‹ÿþ üný¡t¿†? />+k¾ ×¼-yðÛÇZ/ÅŸ€ú§ìÉðCÄÞÕ¾Ù…ZÍÍÿxëEø³ðTý™>x›Âº·Àû1ð«Y¹¿ñ§Ž~7þïQ@€?±¯í•ñâ_Ä_؉[öÝÿ†€ý ?h;þûöòe‹¿øwÚÿe‹_þ#ŹøAð—Áßµ§ÀŸøQ?µ§ƒ¾~È¿ñ—_~(Â7ÿ CþgÅ?øI¿hx'ÆÚOAÿ­ý¥Ÿöªñ­}«Á_|?ûQxÛá_ÆÛ;ÚWìÕðÒãö MGÇÿ³WÂßÚƒâÿÁ‚¿¿h]/á‹ϊÚïˆ5ï ^|6ñÖ‹ñgà>©û2|ñ7…uoöcáV³sãOüoýÞ¢€ üaý™¿jO‡þ ¿ûj~χöæø?ñÛÆÞ#ø?û7‡þÖ|MûÁñ—Áÿ¼-ñƒþ -}ñ³öSðçÁ/‡ß ¾+xûÃÿ³…¼9á_\ü2ø»¨üWø™ðVx›Å~*ñ­ÏÄTÖg¨ æ‡ö?ÿ‚Œëmâ¯Ù Xñÿüàÿí5á¿ÚKþ ?ûuþÀ„5Yÿd Áª|$ø%¨þÖ#ø ñzë[ø9¡øCWñ·í?ãm_±÷ƒ´ÿø_‡ÿ³Ç‹> ~Õ¿<=¥~Ë·>$x#ãÿ¥ê( Äø&ÏÄk¯|IñçÀߎŸðQŸÚö„ý¦£ý ?n Oû|^öqñŽþü6Ñ¿k(ø/ûCü@ðÇÁÿÙ«Á´Â‡þ<ýŸô/‡ZÿÃ|Qñ¿†?dë­ã¿Ã|ð¶¢üEý˜¼añüÓöµøIðÙSÂ_ ÿm/قٻö’ÿ‚¯ÿÁPÿcÿ…²¯Ã˯ÙãÃ? ~ü$µøËûq~Ð |SðûPðÞ£yñ^øÁ®üD¼ý—|ðö_xÏ߳Ŀ³Çí[ðáç†ÿf«¿Š>4øyñçÇ?ÔíüÐÿÁ7¿m¿Û ã_íðÃã¯í§û\x§âLJüC©|ý„olßž%ý¡þ xªo„ž(ñïˆþ|/ýü!ÿñýž¿iƒÿ>|QÑôÏ xûÀ_´7í•ûJj?~xkã'„¾"Éñcâ¶›¢|aðçô½EQEQEQEüuÿÁÄŸò þÎö¶ÿÕQá(ÿƒ‰?äAýœ?ì1mÿª£Â4V8á/ñTÿÓ“ßåɣߵ¯üžWü¿þÃõŽõºúÚ¾Iý­äò¿àÿöø›ÿ¬w­×ÖÕåÖÞáŸþžªk¾ïý&!EV%ÿðS;‡:¿ÄoÙ»LøÙâ¯Ù{á÷Â6ðOí wãÛãÀÆزˆÖšïìõo௠ë <[ñ/àg†n¿jxfÿâF¯ðÇò|b´×|ð£ÂŸµ7‡tŸ†ž8Óþ ëÞ(øe÷ü/åø/ð†?{¢ZxÛö“°ðf¡§~ãÀ:ÿÃ?ã/Æ‹†~*ø£§Ú-<#û/x»áõ¿†¼Oû(xJ×|m¡|:ýšµo…>ðÿÄ¿Š:'‡tÿˆ¾(ú½CàÇü”¯ ÿÜcÿL­oJw[j°w¿÷ßKy÷{m¹-|OÉþ)‘÷…Q^ɈQEQEüÐü ý³~7üWø­ÿÁðÅŸügÄ÷ÅoÚsã•ÿý¼3ðöjñ£ûøãÂß±íûIø¯ö@¹ño‡þ ËâOÙCÃëñ“ᎳðgÅŸ¿k­Gâíµãï ü6Ö_à÷Ç/ø§àí%âz€ÿnÿxã/ìû>|eýµøÙñ³á† xîÿG›Ã7ºïˆ¼'ð¿âƒ¼%ñ+í^¿ñ‚gÓ>'h~1Ñäð'~"ø´óá/‰^>ѼGïôü±~Ì?ðSoÚ/Û öHÐþ2þÕßükðïö¬øÁ¯üø­ðƒ[ø±ð‘¼Uû(|BñŸÀÏŒ>üø±ðáçì!ð·ÄŸ°—í?­|døk üðoìÅûMÿÁK¿l‰¨¯Æ‚¾ƒö¬ø‰à~Ò {ÿØÿþ 3­·Š¿d-cÇÿðTƒÿ´×†ÿi/ø(ÿí×ûhÕgý‘ü3©ð“à–£ûXxà7Åë­oàæ‡á _Æß´ÿµ~ÇÞÓüSài~þÏ,ø5ûVüðö•û.Ýüdø‘àþ=þ—¨ Äø&ÏÄk¯|IñçÀߎŸðQŸÚö„ý¦£ý ?n Oû|^öqñŽþü6Ñ¿k(ø/ûCü@ðÇÁÿÙ«Á´Â‡þ<ýŸô/‡ZÿÃ|Qñ¿†?dë­ã¿Ã|ð¶¢üEý˜¼aòþ¹ÿÖþê?²—Á_Úþ M⃟4Ûþ 7û1~ÖÞ1ø‰áßÙÀz„¾7…oÍcöøÑûEø‡Ä¿³}—Á¿ÙëãŠ<7ðƒö^øû#Aªé_üûZxWÄ^6ñ¦™ðöƒøwm®Ëá/ézŠþP¿dÏø)çícã ~ÉúÏ‹?m?ÙÿãvµãÏÙÿþéûBxÃÂ:Â߆Ú‰þ%k·¿íÅ/üö™ðžÞñÌߨÿÿdßì»o|R_ øe0|øS£|5Òþ$è×öz>|=Ò| câ{mÃv:Q~ÏQ@Ï€ÿnÿxã/ìû>|eýµÑ@Œ?³7íIð0ÿÁWÿmOÙðþÜßþ;xÛÄÿfáðÿÀºÏ‰¿cØ>2ø?â…¾0ÁE¯¾6~Ê~¼ø%ðûá·Åoxöcð·‡<+â+Ÿ†_uŠÿ> ÁãOx¯Å^ µ¹ø“¯êšÏÇÿðMïÛoöÂø×ûCü°øëûiþÄ)ø±áÿê_ÿaßÛ7àg‰h‚Þ*›á'Š<{â?„Ÿ ÿcÁ<g¯ÚGàÿÆŸt}3ÂÞ>ðí ûe~Қ„žøÉá/ˆ²|Xø­¦èŸ|9ý/Q@Œ?ÿh_ؾ_ø,ÏíÉà_‡?f >2|Tý˜?aÏ ø—ÁÞ ø—ð¥þ&|GøûðâGü§Gø¿ásÃÚ´|SãŒ~èß t¿‰:5ýž£ãO‡tŸXøžÛFðÝŽ_œý¥|ñKö¢ÿ‚(|eøçûh|?øûFë´ˆ´ÿÚöñwÿ6ZÇüËö„ý ¿à¿µ^‹­~ÇÞø­ðÓÁñ×ìÃÿ OÇ«»o‚0~Èÿ¶¯‹~0~Ó´/Žþü:Oø®ãƳ/Ç|ký^Ñ@~þß´ÿ>:øÓöN¹×?à§~ñoÇox}>%þÚÿðMÛ„¿¼}ñ ö~ø…qð Æ—>4ýž¡_ƒ¾ð‡ÇØ›àÿÀŽ>+]âµûhÃñ—âeïÄÏ…ÿg=Oヾ$øÿÆÇÿÝê(ùbý˜à¦ß´<_¶ì‘¡üeý«¾ø×áßíYñƒ_ø/ñ[á·ñcá#x«öPø…ã?Ÿþ*|+ø?ñcàÃÏØCáo‰?a/ÚZøÉð×Aø àßÙ‹ö›ÿ‚—~Ø?Q_Œ?|3íYñÀ$ý¤>ýÿðö…ý‹åÿ‚ÌþÜžøsñÇö`“ã'ÅOÙƒöðŸ‰|àŸ‰ _âgÄ¿~$ÁJt‹þ×<=¡kGÅ>0øÁðWáNð×Kø“£_Ùê>4øqð÷Ið5‰í´o ØèEû=E~þß´ÿ>:øÓöN¹×?à§~ñoÇox}>%þÚÿðMÛ„¿¼}ñ ö~ø…qð Æ—>4ýž¡_ƒ¾ð‡ÇØ›àÿÀŽ>+]âµûhÃñ—âeïÄÏ…ÿg=Oヾ$øÿÆÇÿ?ðíßãO|eýÿgÏŒ¿¶§ˆ/¾2ø(ÿíÓû'þÓ>ø‰à߀^Ô|gðkQƒöë¾ÿ‚}êß´]焾x/HøñƒãF‘ð—öWñì£ø?Qø?íƒá_xÛžülðÜwº§‚¿¡ê(ñ‡àí ûËÿ™ý¹< ðçãìÁ'ÆOŠŸ³ì9á?ø;Á?þ¿Äψÿ~üHÿ‚”èÿü3®x{BÖŠ|añƒà¯Âá®—ñ'F¿³Ô|iðãáî“àkÛhÞ±Ð"‹àÙ‡þ mûCÅûa~ÉÆ_Ú»àÿ~þÕŸ5ÿ‚ÿ¾k>7Š¿eˆ^3øñâ§Â¿ƒÿ>ü<ý„>ø“öý§õ¯ŒŸ t€Þ ý˜¿i¿ø)wíƒñ1µøÃðWÃ0~ÕŸ<âOÚCáõ;E~ ÿÁ6~#]x;âO>ütÿ‚Œþд'í5íûtxRØóâô³ˆüwð×á¶ûXühñGÁÚâ†>þÍ^ý >ü?ñçìÿ¡|:×þøÓâü1û']hÿþxàŸ…´ â/ìÅà;ƒöfý©>ø*ÿí©û>Û›àÿÇoxàÿìÜ>øYñ7ì{Æ_üBð·Æø(µ÷ÆÏÙOÂwŸ¾|6ø­ãïþÌ~ðç…|EsðËâî£ñ_âgÁX j?µ‡ˆþ|^ºÖþh~ÕümûOøÛWð‡ì}àí?Å>—áÿìñâσ_µoÁOi_²í߯O‰øÿãßézŠ+ù¡ýˆÿm_ÿ´7í…û>Ïá¿ø)OÁÿÚ·àßÄÿ|Bñgˆ~~Ì_f¯‹sÛ|3Ô¾|Vñƒ¼Mñ£öU‹ö øûXÿÁ<¾èÞ1O‡–k??mŸÚ×âÂߌº—ÁÿØïâµÏÆ/|eÖ>;øSú^¢€?šsöïðÿ€5ÙKö|ý¶?mOß[Ûþ 7û'þß~ý§<û/økáïŒÿd}G¿·å÷ìy«~Ú×ð3ÁþøƒãGÿ„¿³wˆ¿gßQø¢~Ø? üqñ#Å~øwñ³Á1êú§‚°?àŸ´¯ˆÿáNÿÁ#>xöÐÿ…ûâß~Ïÿ~þÑÿ±ü+¿…žÿ†@ýžüû øßÆ?þ;ÿ³Á¿¶?ƒ¾ßñ#á¯ìÛðßþãÅï~Ìÿ´ü4—ü,‚~ðÏ„¾>þÌvþŸh Âø%oí,ÿµWˆ5kí[þ ûáÿÚ‹Æß þ0~ÙÞÒ¿f¯†—°bj>?ýš¾þÔþ üøÝûBé ~^|V×|A¯xZóá·Ž´_‹?õOÙ“à‡‰¼+«|³ µ››ÿxçã?ûþÙ_~%üEýˆ•¿mßøhÚö€ó¿á¿¿`'öX»ÿ‡wý¯öXøµñâ7ü[Ÿ„ |ûZ| ÿ…ûZx;áWì‹ÿuñWâ‡ü#ð´?áV|Sÿ„›ö€ñ7‚|m¤þÿQ@Ï€ÿnÿxã/ìû>|eýµ j?µ‡ˆþ|^ºÖþh~ÕümûOøÛWð‡ì}àí?Å>—áÿìñâσ_µoÁOi_²í߯O‰øÿãßézŠþhà›ß¶ßí…ñ¯ö‡øañ×öÓýˆ.þÆþÿ‚xþÏ_´ÁÿŒ>(èúg…¼}à/ÚöÊý¥5„? <5ñ“Â_dø±ñ[MÑ>0øsú^¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šþ:ÿàâOùgû [ê¨ðÁÄŸò þÎö¶ÿÕQá+?ð—øªéÉïòäÑïÚ×þO+þ ßÿa‰¿úÇzÝ}m_$þÖ¿òy_ðNÿû |MÿÖ;ÖëëjòëoðÏÿOU5Žßwþ“¢Š+Ê/ø)`ø-¦xàŠ>;x‹ö ñg„ltOŒšû2ÁC¾9xOà‡Áoˆ^#×oþjŸü1¨xÇáÇ=3_ø£ðLðÖ¯ðÿE³ƒáÍý—„ÿi_OÄÛÍuá‰kÁ"ôˆÞø/ð†Ã⇂¿áZkw~6ý¤üCáo†Ýë³é_ ¾x·ã/Æ~Ïßü1a⯠|<ñ_…|à_Ïà øáÿŠþ|,ñOÃoé:€/Gû8øÇ ~hßµÆ|ý¡þ xcàÿìÕàÚáÃÿ~Ïúíá¿>(øßòuÖñßá‡> ø[@Ñ~"þÌ^°øƒþ éûZü$ø?ì©á/„ÿ¶—ìÁ?ìÝûIÁWÿ਱ÿ¿ÙWáå×ìñោ¿þZüeý¸¿h?…>)ø}¨xoQ¼ø‰¯|`×~"^~˾ø{/‡þÆþÿ‚xþÏ_´ÁÿŒ>(èúg…¼}à/ÚöÊý¥5„? <5ñ“Â_dø±ñ[MÑ>0øsú^¢Šþ`¿àžóþÆ_?à¦?>-êßðTï‡ÿ¶gíðÃö€‡_²¥·Œµÿø%·ÄOŠþ ÜÁ=þx›Å“ü'ñgÃÙ{Ã_¼?ðÿÁž:ø‘ûEÇ©xwöHñïÂ_„_ð‘ø7â^¥ãßëÞ3ñí¬üE÷ÿØ×öÊø‹ñ/â/ìD­ûnÿÃ@~дÿ ýûù?²Åßü;¿í²Çů‹ÿ¿âÜü øKàïÚÓàOü(ŸÚÓÁß ¿d_øË¯Š¿?áÿ…¡ÿ ³âŸü$ß´‰¼ãm'÷úŠþhcÿø(ζÞ*ýµÿÁP~þÓ^ý¤¿à£ÿ·_ì xCUŸöGð̧ÂO‚Zíaâ?€ß®µ¿ƒš„5~Óþ6Õü!ûx;OñO¥øû?ø÷êø&ÏÄk¯|IñçÀߎŸðQŸÚö„ý¦£ý ?n Oû|^öqñŽþü6Ñ¿k(ø/ûCü@ðÇÁÿÙ«Á´Â‡þ<ýŸô/‡ZÿÃ|Qñ¿†?dë­ã¿Ã|ð¶¢üEý˜¼aû}EüÐþ͝ÆÿÚöÂýŸgðßü§àÿí[ðoâˆ>!x³Ä? ?f/‰¿³WŹí¾ê_>+x¿ÁÞ&øÑû*Åû|ý¬àž_ôo§ÃËH5ŸŠŸ¶Ïíkñ áoÆ]KàÿìwñZçã‰>2ëü)ý/Q@Œ?³7íIð0ÿÁWÿmOÙðþÜßþ;xÛÄÿfáðÿÀºÏ‰¿cØ>2ø?â…¾0ÁE¯¾6~Ê~¼ø%ðûá·Åoxöcð·‡<+â+Ÿ†_uŠÿ> ÁãOx¯Å^ µ¹ø“¯êšÏþÍ?µÝŒÿࣞ#øa­ÿÁ]?áei–¿´ícðGÁÿ±ü#±µ‡Œ|}ñOÁÚ§ÆOÝxKþŸÃï÷ßµoÀßÙÿö2ø[ðËÅ? ÿárütø½aâ?Û ã·ƒ¿á`i ð×à•×ÁÛÛ3÷úŠþhà›ß¶ßí…ñ¯ö‡øañ×öÓýˆ.þÆþÿ‚xþÏ_´ÁÿŒ>(èúg…¼}à/ÚöÊý¥5„? <5ñ“Â_dø±ñ[MÑ>0øsú^¢Šüaý™¿jO‡þ ¿ûj~χöæø?ñÛÆÞ#ø?û7‡þÖ|MûÁñ—Áÿ¼-ñƒþ -}ñ³öSðçÁ/‡ß ¾+xûÃÿ³…¼9á_\ü2ø»¨üWø™ðVx›Å~*ñ­ÏÄTÖ~?ýÿà£:Ûx«öBÖ<ÿAø?ûMxoö’ÿ‚þݰá VÙÃ0jŸ > j?µ‡ˆþ|^ºÖþh~ÕümûOøÛWð‡ì}àí?Å>—áÿìñâσ_µoÁOi_²í߯O‰øÿãßézŠ+ñþ ³ñëÁß|yð7ã§ügö€ý¡?i¨ÿhۣ“þÇŸ£ýœ|G㿆¿ ´oÚÇãGŠ> þÐÿ<1ðöjðGíð‡áÿ?gý áÖ¿ð߯Ÿ|oáÙ:ëGøïðÃÀŸü- h¿f/Ø~ßQ@ËüÓöµøIðÙSÂ_ ÿm/قٻö’ÿ‚¯ÿÁPÿcÿ…²¯Ã˯ÙãÃ? ~ü$µøËûq~Ð |SðûPðÞ£yñ^øÁ®üD¼ý—|ðö_xÏ߳Ŀ³Çí[ðáç†ÿf«¿Š>4øyñçÇ=ÿü{öÛý°¾5þÐÿì>:þڱNJ~,xÄ:—ÇÿØF÷öÍøâ_Úà·Š¦øIâøá'ÂÿØßÂðOÙëö‘ø?ñƒàgÅLð·¼ûC~Ù_´¦£ð‡á'†¾2xKâ,Ÿ>+iº'ÆKÔP_ˆ?ðMŸˆ×^ø“ãÏ¿?à£?´í ûMGû@~ÝŸö<ø½ìãâ?ü5øm£~Ö?þÆþÿ‚xþÏ_´ÁÿŒ>(èúg…¼}à/ÚöÊý¥5„? <5ñ“Â_dø±ñ[MÑ>0øsØ?b/Û+â/ſڟá/¯~Û¿ð°?gÿøÌ¯ødŽžOì±ÿšÿ…ñâOüJ<ð—Ãßð¨ÿáÙ>e×ÂÏø³«ðÿþÏþNëáïücÿÃÿx[Výþ¢€?à›?®¼ñ'ÇŸ~:ÁFhÚöšö€ýº<)?ìyñz?ÙÇÄ~;økðÛFý¬~4x£à¿íñÃÿf¯~Ð~øóöоkÿ üiñGÆþý“®´Žÿ < ðOÂÚ‹ñöbð‡íõPóÿ÷Ÿö2øÑÿ1øññoVÿ‚§|?ý³?h߆´ü:ý•-¼e¯ÿÁ-¾"|Sø§ðNãþ ïð+ÄÞ,Ÿá?‹>þËÞøõáÿ‡þ ñ×ÄÚ.=Kÿ²G~ü"ÿ„Á¿õ/øG^ñŸˆ?hÍgâ/Ûÿ³7íIð0ÿÁWÿmOÙðþÜßþ;xÛÄÿfáðÿÀºÏ‰¿cØ>2ø?â…¾0ÁE¯¾6~Ê~¼ø%ðûá·Åoxöcð·‡<+â+Ÿ†_uŠÿ> ÁãOx¯Å^ µ¹ø“¯êšÏìõüÐÿÁ7¿m¿Û ã_íðÃã¯í§û\x§âLJüC©|ý„olßž%ý¡þ xªo„ž(ñïˆþ|/ýü!ÿñýž¿iƒÿ>|QÑôÏ xûÀ_´7í•ûJj?~xkã'„¾"Éñcâ¶›¢|aðçØÿh_ؾ_ø,ÏíÉà_‡?f >2|Tý˜?aÏ ø—ÁÞ ø—ð¥þ&|GøûðâGü§Gø¿ásÃÚ´|SãŒ~èß t¿‰:5ýž£ãO‡tŸXøžÛFðÝŽ_³ÔPò…àÚWÁß¿j/ø"‡Æ_޶‡Ãÿˆÿ´n·û@x‹Oý¡gÿ|;øe¬Á<¿hOÚ þ ÛûUèº×ì}áßŠß <à?~Ì?ð”üz»¶ø#ìûjø·ãí1ûBøïàÿäðoŠî:~ÆZÆ—À~Ì?ðSoÚ/Û öHÐþ2þÕßükðïö¬øÁ¯üø­ðƒ[ø±ð‘¼Uû(|BñŸÀÏŒ>üø±ðáçì!ð·ÄŸ°—í?­|døk üðoìÅûMÿÁK¿l‰¨¯Æ‚¾ƒö¬ø‰à~Ò ©Ú(ù¡ýˆÿm_ÿ´7í…û>Ïá¿ø)OÁÿÚ·àßÄÿ|Bñgˆ~~Ì_f¯‹sÛ|3Ô¾|Vñƒ¼Mñ£öU‹ö øûXÿÁ<¾èÞ1O‡–k??mŸÚ×âÂߌº—ÁÿØïâµÏÆ/|eÖ>;øSú^¢Šþhb?ÛWãí ûa~ϳøoþ Sðö­ø7ñ?ļYâ…³ÄßÙ«âÜöß õ/Ÿ¼_àï|hý•bý‚¾~Ö?ðO/ƒú7ŒSáå¤ÏÅOÛgöµø…ð·ã.¥ðö;ø­sñ‹ÄŸuŽþ?à›ß¶ßí…ñ¯ö‡øañ×öÓýˆ.þÆþÿ‚xþÏ_´ÁÿŒ>(èúg…¼}à/ÚöÊý¥5„? <5ñ“Â_dø±ñ[MÑ>0øsú^¢€?à›?®¼ñ'ÇŸ~:ÁFhÚöšö€ýº<)?ìyñz?ÙÇÄ~;økðÛFý¬~4x£à¿íñÃÿf¯~Ð~øóöоkÿ üiñGÆþý“®´Žÿ < ðOÂÚ‹ñöbð‡íõPâügâ5׃¾$øóàoÇOø(ÏíûB~ÓQþзG…'ý>/Gû8øÇ ~hßµÆ|ý¡þ xcàÿìÕàÚáÃÿ~Ïúíá¿>(øßòuÖñßá‡> ø[@Ñ~"þÌ^°óÿØ×öÊø‹ñ/â/ìD­ûnÿÃ@~дÿ ýûù?²Åßü;¿í²Çů‹ÿ¿âÜü øKàïÚÓàOü(ŸÚÓÁß ¿d_øË¯Š¿?áÿ…¡ÿ ³âŸü$ß´‰¼ãm'÷úŠüýl¯ˆ¿þ"þÄJß¶ïü4íû@yßðßß°“û,]ÿûþ×û,|Zø¿ñþ-Ï„¾ý­>ÿ‰ý­<ð«öEÿŒºø«ñCþ¿øZð«>)ÿÂMû@x›Á>6Ò¨¢€?~þп±|¿ðYŸÛ“À¿~8þÌ|dø©û0~Þñ/ƒ¼ñ/áKüLøñ÷àÄø)NñÃ:燴-hø§Æ> ü)Ѿétkû=GÆŸ>é>±ñ=¶á»(¾ý˜à¦ß´<_¶ì‘¡üeý«¾ø×áßíYñƒ_ø/ñ[á·ñcá#x«öPø…ã?Ÿþ*|+ø?ñcàÃÏØCáo‰?a/ÚZøÉð×Aø àßÙ‹ö›ÿ‚—~Ø?Q_Œ?|3íYñÀ$ý¤>ÿS´Páü·ö–ګĵö­ÿ}ðÿíEão…?lïi_³WÃKØ15þÍ_ j‹ÿþ üný¡t¿†? />+k¾ ×¼-yðÛÇZ/ÅŸ€ú§ìÉðCÄÞÕ¾Ù…ZÍÍÿ³ÿ‚Œøƒ^ø­ûN|`Ò¯ÿà ÿ²†~þÍ^#ÔcŸx[ö/ý£?i?þÈ>-ðÿÁ9|Iû(x}~2|1Ö~ ø³à·íu¨üCý¶¼}á_†ÚËüøåàüý¤¼Qãéz¾`ðÏì{ðCÃn~=øÁâÿˆ‡Ä,ñf„Ÿ?iÚWãWÃ߇ž*ñ´ίø›à÷ÁŸ‹ÿüqðoàŸˆ†üKâ¯hšÏÂ/x'Qð¯Ã?xËáw…nto‡~/ñ/†5@Äø&÷í·ûa|ký¡þØ|uý´ÿb üXðÿˆu/ÿ°ïí›ð3Ä¿´?ÁoMð“Å=ñÂO…ÿ±¿„?àž?³×í#ðãÀÏŠ:>™áox ö†ý²¿iMGáÂO |dð—ÄY>,|VÓtOŒ>þ—¨¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€?Ž¿ø8“þDÙÃþÃßúª<#Eðq'üˆ?³‡ý†-¿õTxFŠÇü%þ*Ÿúrc{ü£ù#ô{öµÿ“Êÿ‚wÿØcâoþ±Þ·_[WÉ?µ¯üžWü¿þÃõŽõºúÚ¼ºÛÃü3ÿÓÕMc·Ýÿ¤Ä+ò÷þ )wðrÓþ ÍûQÿÂáøÿ Ëí?þ6Ú|,ÿ‹ë⟟ð°~1Íð/â‡ü! â—ñÏÿápÿÂW·Sÿ‹â/øKü-ñìñ7ð7ˆ?²-þÉú…EeË%-tièìôó³·ÜQùûN|Ký‹>0|[ý“¾"ü~ñÿì½ñGöñÁ?Úóìž:øÁ⯅6ýußÚ7IøŸû(è_ þÏâ_ê5?šgƒ´ÏÚ‹Gø}åßOã«/ éÿ4ÿyZ]§Ä8cûÇþ !ÿ$¯Á`ÿ‘'þgíÿ gìŸò+Ã9ÃKþПðÌßð¬|Ÿø”ÿ“ÿ†}ÿ…iÿ +þ_ø¡áN ÿüQ?Øô=z‡Áù)^ÿ¸Çþ˜5ZÚ”¯:1IéVW¶ÞÖZûÚ¾¶Z"ZÑ¿'ù/ò>ð¢Š+Ù1 (¢€>@ø[ã_ÛëWñÞ…§ükýšd‡ÿ ®?´ÿá&ñwÂßÛ‡ãGÆéV¨O£a|:ñgüÛàw‡üEöÿE¥išŸö‡Å/ ÿdh÷º†»ký·{¦[xwWúþŠ(ù‚ÿ‚{Ïû|hÿ‚˜üxø·«ÁS¾þÙŸ´oÃÚþ~Ê–Þ2×ÿà–ß>)üSø'qÿ÷øâoOðŸÅŸ eï |zðÿÃÿxëâGí¥áßÙ#Ç¿ ~ÂGà߉z—|#¯xÏÄ´f³ñíÿÙ›ö¤øà«ÿ¶§ìønoƒÿ¼mâ?ƒÿ³pøà]gÄß±ì|ñ Âß?à¢×ß?e? Þ|ø}ðÛâ·¼?û1ø[ÞñÏÃ/‹ºÅ‰Ÿ`ñ§‰¼Wâ¯ZÜüI×õMgözŠüýˆ¿l¯ˆ¿ÿj„¿ ¼aûnÿÂÀýŸÿã2¿á>:y?²ÇünkþÿÄXtO‰?ñ(ðÂ_£ÿ‡dù—_ ?âίÃÿøo?ù;¯‡¿ñÿüuám[Çÿà›ß¶ßí…ñ¯ö‡øañ×öÓýˆ.þÆþÿ‚xþÏ_´ÁÿŒ>(èúg…¼}à/ÚöÊý¥5„? <5ñ“Â_dø±ñ[MÑ>0øsú^¢€?”/~Ò¾ø¥ûQÁ>2üsý´>üGý£u¿ÚÄZí û?ø»áßÀ›-cþ åûB~Ð_ðNßÚ¯EÖ¿cïüVøiàøëöaÿ„§ãÕÝ·Á?dÛWÅ¿?iÚÇþ'ƒ|Wqã?ٗ㌾5þ¯h¢€?–/Ù‡þ mûCÅûa~ÉÆ_Ú»àÿ~þÕŸ5ÿ‚ÿ¾k>7Š¿eˆ^3øñâ§Â¿ƒÿ>ü<ý„>ø“öý§õ¯ŒŸ t€Þ ý˜¿i¿ø)wíƒñ1µøÃðWÃ0~ÕŸ<âOÚCáõ;EüÐþ͝ÆÿÚöÂýŸgðßü§àÿí[ðoâˆ>!x³Ä? ?f/‰¿³WŹí¾ê_>+x¿ÁÞ&øÑû*Åû|ý¬àž_ôo§ÃËH5ŸŠŸ¶Ïíkñ áoÆ]KàÿìwñZçã‰>2ëü)õügâ5׃¾$øóàoÇOø(ÏíûB~ÓQþзG…'ý>/Gû8øÇ ~hßµÆ|ý¡þ xcàÿìÕàÚáÃÿ~Ïúíá¿>(øßòuÖñßá‡> ø[@Ñ~"þÌ^°ý¾¢€?à•¿´³þÕ^ Õ¯µoø+ï‡ÿj/|+øÁûgxsJýš¾\~Á‰¨øÿöjø[ûP|_ø/ðWãwí ¥ü1øQyñ[]ñ½ákφÞ:Ñ~,üÕ?fO‚&ð®­ð>Ì|*ÖnoüiãŸÿ ~Ì?ðSoÚ/Û öHÐþ2þÕßükðïö¬øÁ¯üø­ðƒ[ø±ð‘¼Uû(|BñŸÀÏŒ>üø±ðáçì!ð·ÄŸ°—í?­|døk üðoìÅûMÿÁK¿l‰¨¯Æ‚¾ƒö¬ø‰à~Ò ©Ú(ù¡ýÿà£:Ûx«öBÖ<ÿAø?ûMxoö’ÿ‚þݰá VÙÃ0jŸ > j?µ‡ˆþ|^ºÖþh~ÕümûOøÛWð‡ì}àí?Å>—áÿìñâσ_µoÁOi_²í߯O‰øÿãÓàoí›ñ¿â¿Åoø&†,ÿà£> ×¾+~ÓŸ4«ÿø(?ì…ៃÿ³WˆõØçÇý‹ÿhÏÚOŲϋ|?ðN_~Ê_ŒŸ uŸƒ>,ø-û]j?ÿm¯xWá¶²ÿ¾9xÅ?ÿi/xÃú^¯˜<3ûüðÇÆ[ŸA~0x¿â!ñ‹ øÃ>øûû1Øx×üûwøÓÀ`Ùóã/í©â þ ?ûtþÉÿ´Ï~"x7à†µüÔ`ýºï¿àŸz·íyá/ž Ò>ü`øÑ¤|%ý•üEû#hþÔ~Ïû`øWÇ6ñ_Ãï‡<7î©à¯èzŠþh~þÙ¿þ+üVÿ‚`øbÏþ 3â {â·í9ñƒJ¿ÿ‚ƒþÈ^ø?û5xQýŽ|qáoØ¿öŒý¤üWû \ø·Ãÿåñ'ì¡áõøÉðÇYø3âςߵ֣ñöÚñ÷…~k/ð{ã—€|Sðö’ñGŒ?¥êùƒÃ?±ïÁ |e¹øôã‹þ"x³Åš|Xý¦?i__~x«ÆÐk:v¿âoƒß~/ü[ñÇÁ¿‚~ >ñ/м ¢k?¼àG¿ üaã/…޹Ѿø¿Ä¾Õ>Ÿ æ‡öý¡ÿnOþ×e~ÓŸ´þµ«øößý£cøïâsá¿ìsk¨üCý˜<­þßxÀ^9ðw†¿bŸ \ü6ðÿ‚<û4ÿÁ5>#øÛâß„5Ÿ øƒÅ^ÿ‚¿|6Ô¢Ô¼¤|týŒµ/ìÙ›ö¤øà«ÿ¶§ìønoƒÿ¼mâ?ƒÿ³pøà]gÄß±ì|ñ Âß?à¢×ß?e? Þ|ø}ðÛâ·¼?û1ø[ÞñÏÃ/‹ºÅ‰Ÿ`ñ§‰¼Wâ¯ZÜüI×õMgözŠüAÿ‚lüFºðwÄŸ| øéÿý ?hOÚj?Úöèð¤ÿ±çÅèÿgøïá¯Ãmö±øÑâ‚ÿ´?Ä |ýš¼û@|!øãÏÙÿBøu¯ü7ñ§ÅøcöNºÑþ;ü0ð'Á? h/Ä_Ù‹ÀvÁ=?k_„Ÿçý•<%ðŸöÒý˜'ý›¿i/ø*ÿüö?øWû*ü<ºýž<3ð—áßÂK_Œ¿·íð§Å?µ ê7Ÿ5ïŒïÄKÏÙwÀÿeðçŒü9ûütÿ‚Œþд'í5íûtxRØóâô³ˆüwð×á¶ûXühñGÁÚâ†>þÍ^ý >ü?ñçìÿ¡|:×þøÓâü1û']hÿþxàŸ…´ â/ìÅà;Ûê(ùbÿ‚z~Ö¿ >Ïû*xKá?í¥û0Oû7~Ò_ðUÿø*ìð¯öUøyuû"kß5߈—Ÿ²ïþËáÏøsöx—öxý«~ü<ðßìÕwñGÆŸ><øç¿ÿ‚o~Û¶Æ¿Úà‡Ç_ÛOö ¸ñOÅø‡RøÿûÞþÙ¿ø*ÿí©û>Û›àÿÇoxàÿìÜ>øYñ7ì{Æ_üBð·Æø(µ÷ÆÏÙOÂwŸ¾|6ø­ãïþÌ~ðç…|EsðËâî£ñ_âgÁX8þÄßþ|qñZ赯ÛFŒ¿/~&|/øû9ê|ñ'Çþ0Ð~?þïQ@„?ðJßÚYÿj¯j×Ú·ü÷Ãÿµ¾ü`ý³¼9¥~Í_ .?`ÄÔ|û5|-ý¨>/üø+ñ»ö…Òþü(¼ø­®øƒ^ðµçÃoh¿~ꟳ'ÁxWVøf>k77þ4ñÏÆÿ?coÛ»öªø¡ãO]~ÒÿðR_؃àµÏÄ/ƒÿüMûN~Ï—¿¶ïì£}ûCþÆÚ·À/|Hñµ·ÂÿÙ3Ä_ðMO„_>|`ý“>"hVOãï þÙµ/ímá_‚Ÿ < ñ“Ãôoþ6Ò->)hÔíü¡~ÉŸðSÏÚÇÆ>ý“õŸ~Ú³ÿÆíkÇŸ³ÿüÓö„ñ‡„t/…¿ ´/üJÖ?oÛŠ_ø'í3à==¼㙿±þþÉ¿ÙvÞ,ø¤¾ðÊxî×þ ã}2çYñßÂÙ– ;ö ¿õÿø&÷í·ûa|ký¡þØ|uý´ÿb üXðÿˆu/ÿ°ïí›ð3Ä¿´?ÁoMð“Å=ñÂO…ÿ±¿„?àž?³×í#ðãÀÏŠ:>™áox ö†ý²¿iMGáÂO |dð—ÄY>,|VÓtOŒ>þ—¨ æ‡ö?ÿ‚Œëmâ¯Ù Xñÿüàÿí5á¿ÚKþ ?ûuþÀ„5Yÿd Áª|$ø%¨þÖ#ø ñzë[ø9¡øCWñ·í?ãm_±÷ƒ´ÿø_‡ÿ³Ç‹> ~Õ¿<=¥~Ë·>$x#ãÿ~ ÿ‚lüFºðwÄŸ| øéÿý ?hOÚj?Úöèð¤ÿ±çÅèÿgøïá¯Ãmö±øÑâ‚ÿ´?Ä |ýš¼û@|!øãÏÙÿBøu¯ü7ñ§ÅøcöNºÑþ;ü0ð'Á? h/Ä_Ù‹Àv·ÔPŸüYÿ…Yÿ ³â_ü/OøWÿð¤¿á_øËþü-ŸøG?áV¬ÿ„sRÿ…ƒÿ /þø¤¿á_ÿÂ%ý¯ÿ —ü%?ñNÂ9ý¥ý·ÿϵWó…ÿ„ý¥|Gÿ wþ ðÃÀÿ¶‡ü/ßøÓöøCðßöýˆÿá]ü,ð?ü2ì÷à¿ØOÆþ1øñßþœ~µý±üöÿ‰ f߆ÿðп~/xÓögý ?᤿á`|ð†|%ñ÷öc°ðôûE<>ý»üiàŒ¿°?ìùñ—öÔñ÷ÆAÿýºdÿÚgÀ¿<ð ÃZŒþ j0~ÝwßðO½[ö‹¼ð—ÀÏé~0|hÒ>þÊþ"ý‘´ê?gý°|+ãx¯á÷ÿžŽ÷TðW°Á6~#]x;âO>ütÿ‚Œþд'í5íûtxRØóâô³ˆüwð×á¶ûXühñGÁÚâ†>þÍ^ý >ü?ñçìÿ¡|:×þøÓâü1û']hÿþxàŸ…´ â/ìÅà;Ûê(ñþ ³ñëÁß|yð7ã§ügö€ý¡?i¨ÿhۣ“þÇŸ£ýœ|G㿆¿ ´oÚÇãGŠ> þÐÿ<1ðöjðGíð‡áÿ?gý áÖ¿ð߯Ÿ|oáÙ:ëGøïðÃÀŸü- h¿f/Øyÿìkûe|Eø—ñö"Vý·á ?hÚÎÿ†þý€|ŸÙbïþßö¿Ùcâ×Åÿˆßñn~|%ðwíið'þOíiàï…_²/üe×Å_ŠðÿÂÐÿ…YñOþoÚÄÞ ñ¶“ûýE4?±ÿüg[o~ÈZÇÿà¨?ÿi¯ þÒ_ðQÿÛ¯öÐ&ÿëëuõµyu·‡øgÿ§ªšÇo»ÿIˆWåïüRïàå§ü›ö£ÿ…Ãñ;þ—Ú~ üm´øYÿ×Å??á`üc›à_ÅøB>ÿÅ/ãŸÿÂáÿ„¯n§ÿ+Ä_ð—ø[âØ?âoàod[ý“õ ŠÊ/–JZèÓÑÙéçgo¸£òþ Ÿñ[öUø©ÿ´ý¢þ"ÏûFø&_‡Þ+ø'ñöÓào޾~Ó÷žðoÅߌzÁÿ‹Ú‡~èþ'øcñ#ÃZ'ÇOíoJñ.¨| Õo¼máojºöŸâkw~Ø~É~ÊŸþü`Ö<ñá/üñGá÷ˆ¿á(ÿ„Ç_¼U¡xÛÁºïöM¯ˆ´-WûÄþ¿ÔôMOû3[Ó5-PûôÿbÕtûí>çÊ»´žñkÔ> ÉJðßýÆ?ôÁªÖ´¤J1³Ò´Z»¾ŽQÒÖZèµ¾½„ö{|/§ü¼¿ï (¢½£¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(øëÿƒ‰?äAýœ?ì1mÿª£Â4Qÿȃû8ØbÛÿUG„h¬pÿÂ_â©ÿ§&7¿Ê?’?G¿k_ù<¯ø'ý†>&ÿëëuõµ|“ûZÿÉåÁ;ÿì1ñ7ÿXï[¯­«Ë­¼?Ã?ý=TÖ;}ßúLBŠ(¬J õƒòR¼7ÿqý0jµåõê?ä¥xoþãú`ÕkJ?Å¥ÿ_!ÿ¥!Kgèÿ#ï (¢½Ã¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(øëÿƒ‰?äAýœ?ì1mÿª£Â4Qÿȃû8ØbÛÿUG„h¬pÿÂ_â©ÿ§&7¿Ê?’?G¿k_ù<¯ø'ý†>&ÿëëuõµ|“ûZÿÉåÁ;ÿì1ñ7ÿXï[¯­«Ë­¼?Ã?ý=TÖ;}ßúLBŠ(¬J õƒòR¼7ÿqý0jµåõê?ä¥xoþãú`ÕkJ?Å¥ÿ_!ÿ¥!Kgèÿ#ï (¢½Ã¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(øëÿƒ‰?äAýœ?ì1mÿª£Â4Qÿȃû8ØbÛÿUG„h¬pÿÂ_â©ÿ§&7¿Ê?’?G¿k_ù<¯ø'ý†>&ÿëëuõµ|“ûZÿÉåÁ;ÿì1ñ7ÿXï[¯­«Ë­¼?Ã?ý=TÖ;}ßúLBŠ(¬J õƒòR¼7ÿqý0jµåõê?ä¥xoþãú`ÕkJ?Å¥ÿ_!ÿ¥!Kgèÿ#ï (¢½Ã¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(øëÿƒ‰?äAýœ?ì1mÿª£Â4Qÿȃû8ØbÛÿUG„h¬pÿÂ_â©ÿ§&7¿Ê?’?G¿k_ù<¯ø'ý†>&ÿëëuõµ|“ûZÿÉåÁ;ÿì1ñ7ÿXï[¯­«Ë­¼?Ã?ý=TÖ;}ßúLBŠ(¬J õƒòR¼7ÿqý0jµåõê?ä¥xoþãú`ÕkJ?Å¥ÿ_!ÿ¥!Kgèÿ#ï (¢½Ã¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(øëÿƒ‰?äAýœ?ì1mÿª£Â4Qÿȃû8ØbÛÿUG„h¬pÿÂ_â©ÿ§&7¿Ê?’?G¿k_ù<¯ø'ý†>&ÿëëuõµ|“ûZÿÉåÁ;ÿì1ñ7ÿXï[¯­«Ë­¼?Ã?ý=TÖ;}ßúLBŠ(¬J õƒòR¼7ÿqý0jµåõê?ä¥xoþãú`ÕkJ?Å¥ÿ_!ÿ¥!Kgèÿ#ï (¢½Ã¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(øëÿƒ‰?äAýœ?ì1mÿª£Â4Qÿȃû8ØbÛÿUG„h¬pÿÂ_â©ÿ§&7¿Ê?’?Hÿjè'ºý´àVÖÐËqsq®üI‚ÞÞÞiçžoØ÷ZŽ(aŠ0ÒK,²2¤q¢³»°UˆöÏü þ4ÿ¡CÅø Õ¿ù¾Iøýÿ'ÿÿÀÿ²âïýe B¿>¿à¦ß·‡í û.|~ÿ‚w| øGð[µð7í_û^|øcñ?ö›Õtý[ð?‡|9¬ü]ð¦Ÿâ?¾ÓÅÎ¥q¥|QøáÖ§¸ñ´ÂËáü^ —á!ñoŽm|IâÞ|áÌé«6Ú«ö”RQ«Q½Ó¾e®š\Ö;}ߊ‰úýâ­fËÁ'øsà¿-þ…â¿‹zþ­á†þ¾Ò5dÔü]­è^Õüc¬ÚévÉdîbÓ<=¡ßÞ^_Üy|7¦iov5moE±Ô;ßøAüiÿB‡Š?ðA«ò%|Cñ?þO§þ —ÿe£ã/þ¨OWÖÕ”£Æœ­'Τí̴哎üºÞ×Ù[Ìjúí£¶ÞI÷óÖýGü þ4ÿ¡CÅø Õ¿ù»Ï†Zˆ¼=ãXÖ<3â‹=:ÏûKíðŒë·_Ú4‹ûXsk§Ï;ïžx“÷q6ÝÛ›j+0ñº*c(ÆQ’Œ¯)+ÉZéÝ_ÜZM«_/ø>¿‡mF?á/ÒçÓÅøCøÓÿ”Â_¤ÿϧŠ?ð‡ñ§ÿ(+óžŠëúôÿçÜ~öO³]ßõý?ékú1ÿ ~“ÿ>ž(ÿÂÆŸü £þý'þ}ž(ÿÂÆŸü ¯Îz(úôÿçÜ~öÍw×ôÿ¥¯èÇü%úOüúx£ÿò‚øKôŸùôñGþþ4ÿå~sÑG×§ÿ>ã÷°ök»þ¿§ý-F?á/ÒçÓÅøCøÓÿ”Â_¤ÿϧŠ?ð‡ñ§ÿ(+óžŠ>½?ù÷½‡³]ßõý?ék÷į ¾x ÅŸ>'kš§ƒ<à}ïÄ)ñ6³àÏÇa¥ivIºIY!ðä×WwSÈÑÚiÚe…½Ö§«j7ºf—gy¨ÝÛZËÜÂgá¡÷õ/+ϳ¿·òqþ·í>}¬fû7—}öß´y_aþÅñ'Û<øFÍÿ‚_²}“ûþ ÙÿØó(ÿÂ#ÿù´13œ9¹b½éFÚ½”]÷_Íø⓵ú/Ť{Çü&~Rò±÷üû;û'ë~ÓçÚÇöo³ywßmûG•öì_}³Èÿ„cÄ_Ù‡ü&~Rò±÷üû;û'ë~ÓçÚÇöo³ywßmûG•öì_}³Èÿ„cÄ_Ùžþ«þ˜ù?öíä}›ÿ¿dû'ö/ý@?³ÿ°?æQÿ„Gþ1ðÿUÿL|Ÿûvò>Íÿ‚_²}“ûþ ÙÿØó(ÿÂ#ÿù^Þ}£÷?ó¦ý?_þIžñÿ Ÿ†‡ßÔ¼¬}ÿ>ÎþßÉÇúß´ùö±ý›ìÞ]÷Û~Ñå}‡ûÄŸlò?áñöaÿ Ÿ†‡ßÔ¼¬}ÿ>ÎþßÉÇúß´ùö±ý›ìÞ]÷Û~Ñå}‡ûÄŸlò?áñögƒÿªÿ¦>Oý»yfÿÁ/Ù>Éý‹ÿPìÿìù”áÿŒ|?ÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>Þ}£÷?ó¦ý?_þIžñÿ Ÿ†‡ßÔ¼¬}ÿ>ÎþßÉÇúß´ùö±ý›ìÞ]÷Û~Ñå}‡ûÄŸlò?áñöaÿ Ÿ†‡ßÔ¼¬}ÿ>ÎþßÉÇúß´ùö±ý›ìÞ]÷Û~Ñå}‡ûÄŸlò?áñögƒÿªÿ¦>Oý»yfÿÁ/Ù>Éý‹ÿPìÿìù”áÿŒ|?ÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>Þ}£÷?ó¦ý?_þIžñÿ Ÿ†‡ßÔ¼¬}ÿ>ÎþßÉÇúß´ùö±ý›ìÞ]÷Û~Ñå}‡ûÄŸlò?áñöaÿ Ÿ†‡ßÔ¼¬}ÿ>ÎþßÉÇúß´ùö±ý›ìÞ]÷Û~Ñå}‡ûÄŸlò?áñögƒÿªÿ¦>Oý»yfÿÁ/Ù>Éý‹ÿPìÿìù”áÿŒ|?ÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>Þ}£÷?ó¦ý?_þIžñÿ Ÿ†‡ßÔ¼¬}ÿ>ÎþßÉÇúß´ùö±ý›ìÞ]÷Û~Ñå}‡ûÄŸlò?áñöaÿ Ÿ†‡ßÔ¼¬}ÿ>ÎþßÉÇúß´ùö±ý›ìÞ]÷Û~Ñå}‡ûÄŸlò?áñögƒÿªÿ¦>Oý»yfÿÁ/Ù>Éý‹ÿPìÿìù”áÿŒ|?ÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>Þ}£÷?ó¦ý?_þIžñÿ Ÿ†‡ßÔ¼¬}ÿ>ÎþßÉÇúß´ùö±ý›ìÞ]÷Û~Ñå}‡ûÄŸlò?áñöaÿ Ÿ†‡ßÔ¼¬}ÿ>ÎþßÉÇúß´ùö±ý›ìÞ]÷Û~Ñå}‡ûÄŸlò?áñögƒÿªÿ¦>Oý»yfÿÁ/Ù>Éý‹ÿPìÿìù”áÿŒ|?ÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>Þ}£÷?ó¦ý?_þIžñÿ Ÿ†‡ßÔ¼¬}ÿ>ÎþßÉÇúß´ùö±ý›ìÞ]÷Û~Ñå}‡ûÄŸlò?áñöaÿ Ÿ†‡ßÔ¼¬}ÿ>ÎþßÉÇúß´ùö±ý›ìÞ]÷Û~Ñå}‡ûÄŸlò?áñögƒÿªÿ¦>Oý»yfÿÁ/Ù>Éý‹ÿPìÿìù”áÿŒ|?ÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>Þ}£÷?ó¦ý?_þIžñÿ Ÿ†‡ßÔ¼¬}ÿ>ÎþßÉÇúß´ùö±ý›ìÞ]÷Û~Ñå}‡ûÄŸlò?áñöaÿ Ÿ†‡ßÔ¼¬}ÿ>ÎþßÉÇúß´ùö±ý›ìÞ]÷Û~Ñå}‡ûÄŸlò?áñögƒÿªÿ¦>Oý»yfÿÁ/Ù>Éý‹ÿPìÿìù”áÿŒ|?ÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>Þ}£÷?ó¦ý?_þIžñÿ Ÿ†‡ßÔ¼¬}ÿ>ÎþßÉÇúß´ùö±ý›ìÞ]÷Û~Ñå}‡ûÄŸlò?áñöaÿ Ÿ†‡ßÔ¼¬}ÿ>ÎþßÉÇúß´ùö±ý›ìÞ]÷Û~Ñå}‡ûÄŸlò?áñögƒÿªÿ¦>Oý»yfÿÁ/Ù>Éý‹ÿPìÿìù”áÿŒ|?ÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>Þ}£÷?ó¦ý?_þIžñÿ Ÿ†‡ßÔ¼¬}ÿ>ÎþßÉÇúß´ùö±ý›ìÞ]÷Û~Ñå}‡ûÄŸlò?áñöaÿ Ÿ†‡ßÔ¼¬}ÿ>ÎþßÉÇúß´ùö±ý›ìÞ]÷Û~Ñå}‡ûÄŸlò?áñögƒÿªÿ¦>Oý»yfÿÁ/Ù>Éý‹ÿPìÿìù”áÿŒ|?ÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>Þ}£÷?ó¦ý?_þIžñÿ Ÿ†‡ßÔ¼¬}ÿ>ÎþßÉÇúß´ùö±ý›ìÞ]÷Û~Ñå}‡ûÄŸlò?áñöaÿ Ÿ†‡ßÔ¼¬}ÿ>ÎþßÉÇúß´ùö±ý›ìÞ]÷Û~Ñå}‡ûÄŸlò?áñögƒÿªÿ¦>Oý»yfÿÁ/Ù>Éý‹ÿPìÿìù”áÿŒ|?ÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>Þ}£÷?ó¦ý?_þIžñÿ Ÿ†‡ßÔ¼¬}ÿ>ÎþßÉÇúß´ùö±ý›ìÞ]÷Û~Ñå}‡ûÄŸlò?áñöaÿ Ÿ†‡ßÔ¼¬}ÿ>ÎþßÉÇúß´ùö±ý›ìÞ]÷Û~Ñå}‡ûÄŸlò?áñögƒÿªÿ¦>Oý»yfÿÁ/Ù>Éý‹ÿPìÿìù”áÿŒ|?ÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>Þ}£÷?ó¦ý?_þIžñÿ Ÿ†‡ßÔ¼¬}ÿ>ÎþßÉÇúß´ùö±ý›ìÞ]÷Û~Ñå}‡ûÄŸlò?áñöaÿ Ÿ†‡ßÔ¼¬}ÿ>ÎþßÉÇúß´ùö±ý›ìÞ]÷Û~Ñå}‡ûÄŸlò?áñögƒÿªÿ¦>Oý»yfÿÁ/Ù>Éý‹ÿPìÿìù”áÿŒ|?ÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>Þ}£÷?ó¦ý?_þIžñÿ Ÿ†‡ßÔ¼¬}ÿ>ÎþßÉÇúß´ùö±ý›ìÞ]÷Û~Ñå}‡ûÄŸlò?áñöaÿ Ÿ†‡ßÔ¼¬}ÿ>ÎþßÉÇúß´ùö±ý›ìÞ]÷Û~Ñå}‡ûÄŸlò?áñögƒÿªÿ¦>Oý»yfÿÁ/Ù>Éý‹ÿPìÿìù”áÿŒ|?ÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>Þ}£÷?ó¦ý?_þIžñÿ Ÿ†‡ßÔ¼¬}ÿ>ÎþßÉÇúß´ùö±ý›ìÞ]÷Û~Ñå}‡ûÄŸlò?áñöaÿ Ÿ†‡ßÔ¼¬}ÿ>ÎþßÉÇúß´ùö±ý›ìÞ]÷Û~Ñå}‡ûÄŸlò?áñögƒÿªÿ¦>Oý»yfÿÁ/Ù>Éý‹ÿPìÿìù”áÿŒ|?ÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>Þ}£÷?ó¦ý?_þIžñÿ Ÿ†‡ßÔ¼¬}ÿ>ÎþßÉÇúß´ùö±ý›ìÞ]÷Û~Ñå}‡ûÄŸlò?áñöaÿ Ÿ†‡ßÔ¼¬}ÿ>ÎþßÉÇúß´ùö±ý›ìÞ]÷Û~Ñå}‡ûÄŸlò?áñögƒÿªÿ¦>Oý»yfÿÁ/Ù>Éý‹ÿPìÿìù”áÿŒ|?ÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>Þ}£÷?ó¦ý?_þIžñÿ Ÿ†‡ßÔ¼¬}ÿ>ÎþßÉÇúß´ùö±ý›ìÞ]÷Û~Ñå}‡ûÄŸlò?áñöaÿ Ÿ†‡ßÔ¼¬}ÿ>ÎþßÉÇúß´ùö±ý›ìÞ]÷Û~Ñå}‡ûÄŸlò?áñögƒÿªÿ¦>Oý»yfÿÁ/Ù>Éý‹ÿPìÿìù”áÿŒ|?ÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>Þ}£÷?ó¦ý?_þIžñÿ Ÿ†‡ßÔ¼¬}ÿ>ÎþßÉÇúß´ùö±ý›ìÞ]÷Û~Ñå}‡ûÄŸlò?áñöaÿ Ÿ†‡ßÔ¼¬}ÿ>ÎþßÉÇúß´ùö±ý›ìÞ]÷Û~Ñå}‡ûÄŸlò?áñögƒÿªÿ¦>Oý»yfÿÁ/Ù>Éý‹ÿPìÿìù”áÿŒ|?ÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>Þ}£÷?ó¦ý?_þIžñÿ Ÿ†‡ßÔ¼¬}ÿ>ÎþßÉÇúß´ùö±ý›ìÞ]÷Û~Ñå}‡ûÄŸlò?áñöaÿ Ÿ†‡ßÔ¼¬}ÿ>ÎþßÉÇúß´ùö±ý›ìÞ]÷Û~Ñå}‡ûÄŸlò?áñögƒÿªÿ¦>Oý»yfÿÁ/Ù>Éý‹ÿPìÿìù”áÿŒ|?ÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>Þ}£÷?ó¦ý?_þIžñÿ Ÿ†‡ßÔ¼¬}ÿ>ÎþßÉÇúß´ùö±ý›ìÞ]÷Û~Ñå}‡ûÄŸlò?áñöaÿ Ÿ†‡ßÔ¼¬}ÿ>ÎþßÉÇúß´ùö±ý›ìÞ]÷Û~Ñå}‡ûÄŸlò?áñögƒÿªÿ¦>Oý»yfÿÁ/Ù>Éý‹ÿPìÿìù”áÿŒ|?ÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>Þ}£÷?ó¦ý?_þIžñÿ Ÿ†‡ßÔ¼¬}ÿ>ÎþßÉÇúß´ùö±ý›ìÞ]÷Û~Ñå}‡ûÄŸlò?áñöaÿ Ÿ†‡ßÔ¼¬}ÿ>ÎþßÉÇúß´ùö±ý›ìÞ]÷Û~Ñå}‡ûÄŸlò?áñögƒÿªÿ¦>Oý»yfÿÁ/Ù>Éý‹ÿPìÿìù”áÿŒ|?ÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>Þ}£÷?ó¦ý?_þIžñÿ Ÿ†‡ßÔ¼¬}ÿ>ÎþßÉÇúß´ùö±ý›ìÞ]÷Û~Ñå}‡ûÄŸlò?áñöaÿ Ÿ†‡ßÔ¼¬}ÿ>ÎþßÉÇúß´ùö±ý›ìÞ]÷Û~Ñå}‡ûÄŸlò?áñögƒÿªÿ¦>Oý»yfÿÁ/Ù>Éý‹ÿPìÿìù”áÿŒ|?ÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>Þ}£÷?ó¦ý?_þIžñÿ Ÿ†‡ßÔ¼¬}ÿ>ÎþßÉÇúß´ùö±ý›ìÞ]÷Û~Ñå}‡ûÄŸlò?áñöaÿ Ÿ†‡ßÔ¼¬}ÿ>ÎþßÉÇúß´ùö±ý›ìÞ]÷Û~Ñå}‡ûÄŸlò?áñögƒÿªÿ¦>Oý»yfÿÁ/Ù>Éý‹ÿPìÿìù”áÿŒ|?ÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>Þ}£÷?ó¦ý?_þIžñÿ Ÿ†‡ßÔ¼¬}ÿ>ÎþßÉÇúß´ùö±ý›ìÞ]÷Û~Ñå}‡ûÄŸlò?áñöaÿ Ÿ†‡ßÔ¼¬}ÿ>ÎþßÉÇúß´ùö±ý›ìÞ]÷Û~Ñå}‡ûÄŸlò?áñögƒÿªÿ¦>Oý»yfÿÁ/Ù>Éý‹ÿPìÿìù”áÿŒ|?ÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>Þ}£÷?ó¦ý?_þIžñÿ Ÿ†‡ßÔ¼¬}ÿ>ÎþßÉÇúß´ùö±ý›ìÞ]÷Û~Ñå}‡ûÄŸlò?áñöaÿ Ÿ†‡ßÔ¼¬}ÿ>ÎþßÉÇúß´ùö±ý›ìÞ]÷Û~Ñå}‡ûÄŸlò?áñögƒÿªÿ¦>Oý»yfÿÁ/Ù>Éý‹ÿPìÿìù”áÿŒ|?ÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>Þ}£÷?ó¦ý?_þIžñÿ Ÿ†‡ßÔ¼¬}ÿ>ÎþßÉÇúß´ùö±ý›ìÞ]÷Û~Ñå}‡ûÄŸlò?áñöaÿ Ÿ†‡ßÔ¼¬}ÿ>ÎþßÉÇúß´ùö±ý›ìÞ]÷Û~Ñå}‡ûÄŸlò?áñögƒÿªÿ¦>Oý»yfÿÁ/Ù>Éý‹ÿPìÿìù”áÿŒ|?ÕÓ'þݼ³à—ìŸdþÅÿ¨ööüÊ?ðˆÿÆ>Þ}£÷?ó¦ý?_þIžç´;¨!¹¶‹Äw×G=½Ä ñ”ÐOÈ$ŠheAhåŠXÙ^9™2’¤ã>%|xø]ð{À^,ø¡ñ;\Õ<àè·~ ñO‰µŸxÞ; +K²MÒJɇ&º»ºžFŽÓNÓ,-îµ=[Q¸µÓ4»;ÍFîÚÖ_Áÿø-?í?ñWö1ýƒ¾3þÓ.ôK_‰? ,¿eWCĺ4:ÿ‡5k gâ·Ào x§Ã^ Òä’ÚâmÅž×uß j³é†â=>ÃWŸPð¿ˆ<=â;]/\ÓüÛö”ø£ã/ŸðJ/üZø…ðcÆß³Ç¾ ü ÒoM𿌭´«»oxá÷¢ñü?ÄÔrŠp…¥WÙ^î÷N7|·ÚÒ¾ï³{\åVÝü<ßÓù?é3çOø8“þDÙÃþÃßúª<#Eðq'üˆ?³‡ý†-¿õTxFŠßü%þ*Ÿúrd½þQü‘úûRxgãGü4·ìgñƒàÿÀÏ|xÿ…qâø£Âþ ½ðƉ?‘­þÎö¾ ðí­×ˆ¼i­hÓ?´üI¯Ø#£ßÝkØöºî¯¤hZçöåyçˆß}Öëniwt|¿àÿ[øÇü,ÿÛ§þ‘—ñ£ÿ/ÀOþl(ÿ…ŸûtÿÒ2þ4áåø ÿÍ…v>?ž…Ú‡‰|uûC|OдMOÆß >XÞÿÂ3ð³Sóüeñƒâ7…~ü:ÑþÍ£üÔ.âÿ„‹â¼1áÿí  JÒ´ÿµuÛí3D²Ô5+NÛþÿÑnøŸÿ‚Ÿƒüè¨æ£ÿ>©ÿàuÿËÍ¥ÝýÑòÿƒýoãð³ÿnŸúF_Æü<¿?ù°£þíÓÿHËøÑÿ‡—à'ÿ6ØßÏ™ñ¿ o¿ho‰ð|Añ·‚|ñÃÿ„gád¿Ú~ ø]®ü4ð׎µíX~ I¢Yak>Ygꕦ«©ÿÂEöÇP´ÒuÙôÎÛþÿÑnøŸÿ‚Ÿƒüè¨æ£ÿ>©ë·¿_üƒ^ïî—ù¿ëÿ…ŸûtÿÒ2þ4áåø ÿÍ…ð³ÿnŸúF_Æü<¿?ù°¯gÿ„Åô[¾'ÿà§àÇÿ:*â|+<6×~%økô7ÄýO[ø?ãk‡_l¿áøYeÿ?‡>øµc£ý§Pø)ii«yÿ¾(øÄÚúž•öïöT×Ñëzf±¦éç5ùõOMýúÿä—w÷GËþõ¿ÿ ?öéÿ¤eühÿÃËðÿ› ?ágþÝ?ôŒ¿øy~óa]„ðj¼Uð–Çö†øŸ?Äø'À|OáÿøF~Eý™àߊ:ïÄ¿ xXþÕ›à¤z%ïöî·ðâ-—ö~Ÿ©]êºgü#¿iÖ,tûM[BŸSí¿áñ_ýï‰ÿø)ø1ÿΊŽj?óêŸþ_®ÝÒîþèùÁþ·ñøYÿ·Oý#/ãGþ_€ŸüØQÿ ?öéÿ¤eühÿÃËðÿ› öø@|WÿE»âþ ~ ó¢£þÿÑnøŸÿ‚Ÿƒüè¨æ£ÿ>éÿàuÂÒîþèùÁþ·ñøYÿ·Oý#/ãGþ_€ŸüØQÿ ?öéÿ¤eühÿÃËðÿ› ì|<t+ÿøö†øŸ®èšg¾%ü:¾½ÿ„gáf™äxËàÿÄo|%ø‹£ý›Xø)§ÝËÿïÄøŸÃÿÚÁ&•«fjèWÚž‰{§êW}·ü >+ÿ¢Ýñ?ÿ??ùÑQÍEoJŸþ_üƒ^ïî—üëÿ…ŸûtÿÒ2þ4áåø ÿÍ…ð³ÿnŸúF_Æü<¿?ù°¯LƒF¸ºñ«àë_Ú7Æ—>.дOø—\ð´àLÞ#Ѽ9âËÿé~ñ«¡Çð¥µ=;Dñ.§à¿éÞÕnía°Öoü'â[M:{› TŽÔÕtk ÿÃZ^¹ûFøÓFÔüi­Ïá¯iÚ¨ø§_ø³Äv¾ñŒn¼?á«K¿…0ÜkºÝ·„|'âŸÏ¥iqÝ_ÃáÏ xƒ\’Ó4mFêØæ£ÿ>©ÿàuÿÈ-.ïî—üë3ÿ…ŸûtÿÒ2þ4áåø ÿÍ…ð³ÿnŸúF_Æü<¿?ù°¯gÿ„Åô[¾'ÿà§àÇÿ:*â~OƇ>øµðëö†øŸâ/‡ß|á_ˆ¾ñü#? 4ŸíßøÛB°ñ/†5ì­wঙ­éŸÚz&§c{ýŸ¬iº~«eçý›P±´»Šh#9¨ÿϪøòòa¯w÷GÊÿ›þ·ã¿ágþÝ?ôŒ¿øy~óaGü,ÿÛ§þ‘—ñ£ÿ/ÀOþl+±ûn‡ý…ÿ Gü5n³ÿÏü&ßð­?á"þÔýžÿ°¿ácÂÆÿ…=ÿö¿ü+ìÿøM¿ánŬÿ„WíÛ¿ð±¿âˆûü$ßñ,®ÛþÿÑnøŸÿ‚Ÿƒüè¨æ£ÿ>©ÿàuÿÈ-.ïî—üëˆiÝ/öóý ~|Sø5aÿéøÁá›ïˆ¸Ñ,õË¿Šÿu+]>ì\Û^ÛÉsgŽm&–ÞY­ÞgŠo2åk„Šå¢òþæùwñýÍ ÅÊûžG„üJ1öõ_fò4­'nßì›±}Ÿûo•῱ÿÂ/äxwþÂð€ø¯þ‹wÄÿüüÿçE^]ãÏxágˆþø;â혿<]ño[o |)ð·+ÿ¢Ýñ?ÿ??ùÑWðÒx>0|9ðů‡_´7Äÿ|>ø£àŸ üEð/ˆ?áøY¤ÿnø7ÆÚ‡‰|1¬ek¿4ÍoLþÓÑ5;ßìýcMÓõ[/?ìÚ…¥ÜSAíW÷~ùÿò¿&ÛåÛ§/Ÿ—õ¥ÿI|»øþæ…âå}Ï#Â~%û?ú¯³yV“·oöMؾÏý‹·Êðߨÿáò<;ÿ <òïãûšŠ•÷< ø”cìÿê¾ÍäiZNÝ¿Ù6?bû?ö.ß+Ãcÿ„_Èðïü(ÿÊ_üWø;ðÛâ7„¾|Eý»4/ü\ñ÷öü ¿ +ÿ¢Ýñ?ÿ??ùÑV'ˆ4k ØAªx§öñ§†´Ë­oÃ^µÔ|@>èÖ>#ñ§ˆô¯x;Ãð]ê? m­æÖüYâíwCð·†´¨äkýwÄzΕ¡ép]jz¥¬Ç¶_ÝûçÿÊÁ-·éÛ§/Ÿ—çåЯ.þ?¹¡x y_sÈðŸ‰F>Ïþ«ìÞF•¤íÛý“cö/³ÿbíò¼7ö?øEüÿÂ<»øþæ…âå}Ï#Â~%û?ú¯³yV“·oöMؾÏý‹·Êðߨÿáò<;ÿ ?òÿJñ—€5ߊ¾%ø¡þÙ‹¬üoð^‰‰|cðoJñWìÙ¨üUðŸ‡.¡ðýůˆÏþ«ìÞF•¤íÛý“cö/³ÿbíò¼7ö?øEüÿÂ<»øþæ…âå}Ï#Â~%û?ú¯³yV“·oöMؾÏý‹·Êðߨÿáò<;ÿ ?áø@|WÿE»âþ ~ ó¢£þÿÑnøŸÿ‚Ÿƒüè¨öËû¿|ÿùX%¶ý;tåóòüü¯÷—ÜмP<¯¹äxOÄ£gÿUöo#JÒvíþɱûÙÿ±vù^ûü"þG‡áGž]üsBñ@ò¾ç‘á?Œ}ŸýWÙ¼+IÛ·û&Çì_gþÅÛåxoìð‹ùÿ…ð‡ü >+ÿ¢Ýñ?ÿ??ùÑQÿŠÿè·|OÿÁOÁþtT{eýß¾ü¬Û~ºrùù~~Wû¿Ë¿îh^(WÜò<'âQ³ÿªû7‘¥i;vÿdØý‹ìÿØ»|¯ ýþ#ÿð£Ï.þ?¹¡x y_sÈðŸ‰F>Ïþ«ìÞF•¤íÛý“cö/³ÿbíò¼7ö?øEüÿÂøCþÿÑnøŸÿ‚Ÿƒüè¨ÿ„Åô[¾'ÿà§àÇÿ:*=²þïß?þV m¿NÝ9|ü¿?+ýßåßÇ÷4/+îyñ(ÇÙÿÕ}›ÈÒ´»²l~Åöì]¾W†þÇÿ¿‘áßøQç—ÜмP<¯¹äxOÄ£gÿUöo#JÒvíþɱûÙÿ±vù^ûü"þG‡áGü!ÿŠÿè·|OÿÁOÁþtTÂâ¿ú-ßÿðSðcÿÙwïŸÿ+¶ß§nœ¾~_Ÿ•þïòïãûšŠ•÷< ø”cìÿê¾ÍäiZNÝ¿Ù6?bû?ö.ß+Ãcÿ„_Èðïü(óË¿îh^(WÜò<'âQ³ÿªû7‘¥i;vÿdØý‹ìÿØ»|¯ ýþ#ÿð£þÿ„Åô[¾'ÿà§àÇÿ:*?áñ_ýï‰ÿø)ø1ÿΊl¿»÷Ïÿ•‚[oÓ·N_?/ÏÊÿwùwñýÍ ÅÊûžG„üJ1öõ_fò4­'nßì›±}Ÿûo•῱ÿÂ/äxwþyåßÇ÷4/+îyñ(ÇÙÿÕ}›ÈÒ´»²l~Åöì]¾W†þÇÿ¿‘áßøQÿÂâ¿ú-ßÿðSðcÿð€ø¯þ‹wÄÿüüÿçEG¶_ÝûçÿÊÁ-·éÛ§/Ÿ—çå»ü»øþæ…âå}Ï#Â~%û?ú¯³yV“·oöMؾÏý‹·Êðߨÿáò<;ÿ <òïãûšŠ•÷< ø”cìÿê¾ÍäiZNÝ¿Ù6?bû?ö.ß+Ãcÿ„_Èðïü(ÿ„?áñ_ýï‰ÿø)ø1ÿΊø@|WÿE»âþ ~ ó¢£Û/îýóÿå`–ÛôíÓ—ÏËóò¿Ýþ]üsBñ@ò¾ç‘á?Œ}ŸýWÙ¼+IÛ·û&Çì_gþÅÛåxoìð‹ùÿ…ywñýÍ ÅÊûžG„üJ1öõ_fò4­'nßì›±}Ÿûo•῱ÿÂ/äxwþÂð€ø¯þ‹wÄÿüüÿçEGü >+ÿ¢Ýñ?ÿ??ùÑQí—÷~ùÿò°KmúvéËçåùù_îÿ.þ?¹¡x y_sÈðŸ‰F>Ïþ«ìÞF•¤íÛý“cö/³ÿbíò¼7ö?øEüÿÂ<»øþæ…âå}Ï#Â~%û?ú¯³yV“·oöMؾÏý‹·Êðߨÿáò<;ÿ ?áø@|WÿE»âþ ~ ó¢£þÿÑnøŸÿ‚Ÿƒüè¨öËû¿|ÿùX%¶ý;tåóòüü¯÷—ÜмP<¯¹äxOÄ£gÿUöo#JÒvíþɱûÙÿ±vù^ûü"þG‡áGž]üsBñ@ò¾ç‘á?Œ}ŸýWÙ¼+IÛ·û&Çì_gþÅÛåxoìð‹ùÿ…ð‡ü >+ÿ¢Ýñ?ÿ??ùÑQÿŠÿè·|OÿÁOÁþtT{eýß¾ü¬Û~ºrùù~~Wû¿Ë¿îh^(WÜò<'âQ³ÿªû7‘¥i;vÿdØý‹ìÿØ»|¯ ýþ#ÿð£Ï.þ?¹¡x y_sÈðŸ‰F>Ïþ«ìÞF•¤íÛý“cö/³ÿbíò¼7ö?øEüÿÂøCþÿÑnøŸÿ‚Ÿƒüè¨ÿ„Åô[¾'ÿà§àÇÿ:*=²þïß?þV m¿NÝ9|ü¿?+ýßåßÇ÷4/+îyñ(ÇÙÿÕ}›ÈÒ´»²l~Åöì]¾W†þÇÿ¿‘áßøQç—ÜмP<¯¹äxOÄ£gÿUöo#JÒvíþɱûÙÿ±vù^ûü"þG‡áGü!ÿŠÿè·|OÿÁOÁþtTÂâ¿ú-ßÿðSðcÿÙwïŸÿ+¶ß§nœ¾~_Ÿ•þïòïãûšŠ•÷< ø”cìÿê¾ÍäiZNÝ¿Ù6?bû?ö.ß+Ãcÿ„_Èðïü(óË¿îh^(WÜò<'âQ³ÿªû7‘¥i;vÿdØý‹ìÿØ»|¯ ýþ#ÿð£þÿ„Åô[¾'ÿà§àÇÿ:*?áñ_ýï‰ÿø)ø1ÿΊl¿»÷Ïÿ•‚[oÓ·N_?/ÏÊÿwùwñýÍ ÅÊûžG„üJ1öõ_fò4­'nßì›±}Ÿûo•῱ÿÂ/äxwþyåßÇ÷4/+îyñ(ÇÙÿÕ}›ÈÒ´»²l~Åöì]¾W†þÇÿ¿‘áßøQÿÂâ¿ú-ßÿðSðcÿð€ø¯þ‹wÄÿüüÿçEG¶_ÝûçÿÊÁ-·éÛ§/Ÿ—çå»ü»øþæ…âå}Ï#Â~%û?ú¯³yV“·oöMؾÏý‹·Êðߨÿáò<;ÿ <òïãûšŠ•÷< ø”cìÿê¾ÍäiZNÝ¿Ù6?bû?ö.ß+Ãcÿ„_Èðïü(ÿ„?áñ_ýï‰ÿø)ø1ÿΊø@|WÿE»âþ ~ ó¢£Û/îýóÿå`–ÛôíÓ—ÏËóò¿Ýþ]üsBñ@ò¾ç‘á?Œ}ŸýWÙ¼+IÛ·û&Çì_gþÅÛåxoìð‹ùÿ…ywñýÍ ÅÊûžG„üJ1öõ_fò4­'nßì›±}Ÿûo•῱ÿÂ/äxwþÂð€ø¯þ‹wÄÿüüÿçEGü >+ÿ¢Ýñ?ÿ??ùÑQí—÷~ùÿò°KmúvéËçåùù_îÿ.þ?¹¡x y_sÈðŸ‰F>Ïþ«ìÞF•¤íÛý“cö/³ÿbíò¼7ö?øEüÿÂ<»øþæ…âå}Ï#Â~%û?ú¯³yV“·oöMؾÏý‹·Êðߨÿáò<;ÿ ?áø@|WÿE»âþ ~ ó¢£þÿÑnøŸÿ‚Ÿƒüè¨öËû¿|ÿùX%¶ý;tåóòüü¯÷—ÜмP<¯¹äxOÄ£gÿUöo#JÒvíþɱûÙÿ±vù^ûü"þG‡áGž]üsBñ@ò¾ç‘á?Œ}ŸýWÙ¼+IÛ·û&Çì_gþÅÛåxoìð‹ùÿ…ð‡ü >+ÿ¢Ýñ?ÿ??ùÑQÿŠÿè·|OÿÁOÁþtT{eýß¾ü¬Û~ºrùù~~Wû¿Ë¿îh^(WÜò<'âQ³ÿªû7‘¥i;vÿdØý‹ìÿØ»|¯ ýþ#ÿð£Ï.þ?¹¡x y_sÈðŸ‰F>Ïþ«ìÞF•¤íÛý“cö/³ÿbíò¼7ö?øEüÿÂøCþÿÑnøŸÿ‚Ÿƒüè¨ÿ„Åô[¾'ÿà§àÇÿ:*=²þïß?þV m¿NÝ9|ü¿?+ýßåßÇ÷4/+îyñ(ÇÙÿÕ}›ÈÒ´»²l~Åöì]¾W†þÇÿ¿‘áßøQç—ÜмP<¯¹äxOÄ£gÿUöo#JÒvíþɱûÙÿ±vù^ûü"þG‡áGü!ÿŠÿè·|OÿÁOÁþtTÂâ¿ú-ßÿðSðcÿÙwïŸÿ+¶ß§nœ¾~_Ÿ•þïòïãûšŠ•÷< ø”cìÿê¾ÍäiZNÝ¿Ù6?bû?ö.ß+Ãcÿ„_Èðïü(óË¿îh^(WÜò<'âQ³ÿªû7‘¥i;vÿdØý‹ìÿØ»|¯ ýþ#ÿð£þÿ„Åô[¾'ÿà§àÇÿ:*?áñ_ýï‰ÿø)ø1ÿΊl¿»÷Ïÿ•‚[oÓ·N_?/ÏÊþ7ñÇ?µÏnEޝÿ­ø¯â éšµ ÓÅ¿gåm[á…÷‡uxºMëÆZņ•â] ÄþÐ+ÿ¢Ýñ?ÿ??ùÑRU)©)(SæRæOž·Å{ÞÖ¶ëµ¼‚ÎÖ»µ­´vÓþõ¿ãÿüWö¾ý­®a–Þæß]Š ‹yãxg‚x¾øN9aš)ɱH¬’Fꮎ¥XQXßðp^•‰ðÏöoÒVæêö}?ÄWÚ•ÝÿÙ†£s®'ßoÏ©ÅemeekªI­Aµ;; >ÒÂüÜYZéÚ|Gg^ŽøKüU<ÿåäúÙ_î^ˆÉïò_’>êÿ‚£øÆ_lþx?À3xÚÃÄ×þ*ýu•áËícÆ=ÿ†l5XäÿÚÃà×í+¢|Jý–|gñCö¡ý¨¼ÿ ·€%Ò¿gƒ?¾¯ü ÿ ü)ûCøûÚï‹<%{ã-Á¿ð¼µ„ñ?ü!:N¹‰÷w‰ÿà¡?ðNçø‰câ=cöðž­©ø[Á©à[_øG)þÒŸ´¯ÄŸ„~5øÙ£ê ñ¿HøÿÓø;àÙ'ÄzíÆ™â/ÿÂ+á›?ÙKÂ÷ÿ¤ÿ¶Ï‚þ4øÃÆŸ°”ÿnôM ÅÞý¯ýž<9ðÿ[ðÁO?Å‹:g>~ÝÞ-ø¹xNÂ?ØïÇ^#ý¥?ho…?~4hÿ~ê÷ž)·°Öõ|Oñ~‘û-øÄÚô¿€²~Ðñ_Œ§Š~|O–ããe·ƒ?i/ÔŸøywü—þ‹žÿ…”ŸüìkÃÿðPŸø&„ì'Òü-ñOÁžÓ.µ¿ø–ëNðþ»k£X\øÆž#Õ|cãOi§|)¶·›[ñg‹µÝsÅ>%Õd¯õßë:®¹ªOu©ê7wS U{ÂM½~ «~kíNêüÊö³iZè.´ÕYtºòóéþ~Wü0øœiÿxŸÅ:ðïíy7ÃoˆZßÁ??´×Áü ÿ‚œêwÿ³ÇćŸðSØÆw~ø5ûAxÃâwÅ­âÆ·ð¿á^½ûP·‡øŸÀ6Ÿ¶¾•û\i_±GŒ<%ûv|Eø™à¯Û“Æ_|ñÆ_µWüSPýª-?go^ðoÃ=WûWៃkmwÁÞ ÿ‚_øëÁºïŒ´/èðþÊÚö•â +àV±¥v×Þ ý² øs­xƒÂŸÿmˆq|)ý—¿à¤Ÿ¿f}JÃÀ¿¶Àµüxð.…û ÞþÍñWÂ_?´/ÇÚ7ãÏŸñ\~ÓøáíåªøªçâÛ~%økÀßµÏÙ‹Fø_s«~ÌÿÃË¿àœ¿ô\ôü,¤ÿçcGü<»þ ËÿEÏGÿÂÊOþv5\µtýÛѽéÔ{ßKû+Ù^ÑÖÉ]k{‹ÝïÛvºrùùk¥Ý·Úÿž#ðÿÄOü]ñ§Ã?ŒsþÞW¿°wÊ?ø¥¢7üká- Hðlÿ þ&éšg‰|¿öËñ7í¾ÿÿh-[àÒ~Ô>ñ·‹¼ûl|;½øCðÓáüÆZ‘à_þÅŸ´³~Í¿üûFÏñWÄÿ°–™ão‹?~þÍü+áïÙ“à—ÃÚ7Á_¾'Ø|×þ k6Ñþ9ÙüIý™ÿ‡—Á9è¹èÿøYIÿÎÆøywü—þ‹žÿ…”Ÿüìi¨ÕNîzY^[µ’³½=u\Ú$ùµMkrëº[l×—Ÿm=/¾‡ÀÿüñKà÷Æ=Káf…ûkêÿ°•¯ü3?þ4j~ø—ûcüsøÆßð˜x[þ áßX|,øÃáÿ|Aý³®þÉñ‹á÷üòãÆÿ ?g¯Íÿ?…¯î/ð׈5ω/ÅãÕ·èŸü<»þ ËÿEÏGÿÂÊOþv5åÚWíÿ|о*ø—㶇ª|Ѿ7øÓDƒÃ^1øÉ¥XøcNø«âÏZÃáû{_ø—â§Á¸|]®è–Öþð´iZ¦¯ua >ðüQÀ©£iËlrTw¼$®¥´*ï%káûMkyk ]i®ÖêºrﮯMý|¯á׺†|mûU]~Óÿ~~Úÿ¼ñÓþ åð?Oøw¢xÇö¾ð׊|;ªø^ÏöÔø…ñóá×Ç_þɺƥiàÿŸþ|nøyiðÆÇâ´mã(þ1ê·z7앬kô atÿøðëâ߬þ x—ö­Ñÿm}ORø?ûPøwâ/ÅË߇Z‡Äû/øwöjÔÿe_Û'á/ì÷¬|(¶ÿ‚|_Z]êß'øƒñGÂ>ý¸ôÿÙÎ OÇÑ|c×>$꺅ŒðN 3ö]Ô´ÿÒïøywü—þ‹žÿ…”Ÿüìhÿ‡—Á9è¹èÿøYIÿÎÆ—%Uö%²_[¤•½×ìôÓ}ï+?!Ý>½º¯-õ×oºþWúÚ¾(ÿ‚jÿÊ9¿`/û2Ù[ÿT_+¡ÿ‡—Á9è¹èÿøYIÿÎÆ±<5ÿ ÿ‚ax/Þðwƒ¾)ø3Â~𞉥xkÂÞðÖ»k¡xsÃ^Ь Òô?øCÒþÚéš6‰£i–¶ºv•¥iÖ¶Öu…´–Co q¬{–k–Z´ÿ‡W¢—ý;ó «§u³[®¶óþµò¿Ä^ ñ×´Ï‚þ-øà¯þÔ>øÏáßø*½ñ^šÓözý¥|ámOà??à¸Vž8ñn± üj»øq£|(ñׂ|Uû9|C»ñG‹tÿ xÿ_¶Ôþj5Ôõë|¢xÖ]3盇¶ÏïÙoö[µøWâOÚòÓÇßÿ`ßøãöÍ×>-x¯ö¬ý¢¼GàøÃÿõâÄÖ^ñŸÅñgágÅ>|Mý¹/-¾ þÊþ1øñËâ=þ©iß "OŒŸ þjžý~ÿ‡—Á9è¹èÿøYIÿÎÆøywü—þ‹žÿ…”ŸüìkE ‰éMë.fœ*»»mü=“Õ'{4+­5Ù[uåçåÓÏÈùcöEÒ~&hÞø#kñ ÇÿµçÄ}OÚóÇü+×&øAñË஑kðý¿d‰1ßi_´G…¿jïŽk»ÿÙæ‰ñ|H»ðψ?i¯é¾8ºý¦ï¾ iß|5gû:é_µMgoöÒñ§o¾#kk¿¾\ë¿|?¥~É~ñçìóðsâoü"wö¿Ä}O⯉9ßütý›þŒÿ‡—Á9è¹èÿøYIÿÎÆøywü—þ‹žÿ…”Ÿüìj}Nng |¡Q;Þéÿ ×붯]š²W]:¯/?óÛ®—úÚ¾(ÿ‚jÿÊ9¿`/û2Ù[ÿT_+¡ÿ‡—Á9è¹èÿøYIÿÎÆ±<5ÿ ÿ‚ax/Þðwƒ¾)ø3Â~𞉥xkÂÞðÖ»k¡xsÃ^Ь Òô?øCÒþÚéš6‰£i–¶ºv•¥iÖ¶Öu…´–Co q¬û–k–Z´ÿ‡W¢—ý;ó «§u³[®¶óþµò¿ð/ÇVß³·Š|yðgâÿ‚~6^üWøµûPüiø‹añGÁ_³×ÇŒ_~#ø7ãGÆ?_|Ö<[ñçá¯Ãx;ÁŸð©¾ ]|5ýœõí?㿉>ê¿ 4/Öšu…ŠþÎZ7ˆž-üØÓ<5ûIø³Ãÿ³æ—'‡ÿkÏøæ×[ýˆ'i߬ðòïø'/ý=ÿ )?ùØÑÿ.ÿ‚rÿÑsÑÿð²“ÿ>ZŠÖ¦ôn_][»ÿŸkDÚkµ—Upºîú}¥åçå¯Ïº<7á/‡üqàŠ7¿ õÙÿkËß†ß ÿo+ŸþÏš”Þ%øñ HÔ~kŸðM7âˆ'ý¢>,üUÕ|Mñâ¯ìóǯük°ðω|Qã?MáïÚnËà—Ã-#UÓ<9à Â~òÿø)oìÅûFü\ñŠ ~!x'XÑ>ülý‡§ðGÁï~Ξ:øÅsðßâ6•ûmü2ÕüoûKxoSð7ÇÏ…Ödü>»Òmþ$Üø«Á%×|)ðÀiß~=ÃÿŸáGŠ|5ñÛTðݧÁˆÚ߉“ö¬ø³ü9øoñÅ¿<57‰üAoâÏhW þ)Eà¿Ù:ù'þ]ÿåÿ¢ç£ÿáe'ÿ;?áåßðN_ú.z?þRó±¥*U$ïÉ%¿Ø«»nOþ]÷nË¢ê÷ÒëÛªì—êÏÈúÚŠù'þ]ÿåÿ¢ç£ÿáe'ÿ;?áåßðN_ú.z?þRó±©ö?–_ø.¯ÿ+2î¾õþÕŸ•þ¶¢¾Iÿ‡—Á9è¹èÿøYIÿÎÆøywü—þ‹žÿ…”Ÿüìhö?–_ø.¯ÿ+eÝ}ëüÿ«?+ýmE|“ÿ.ÿ‚rÿÑsÑÿð²“ÿðòïø'/ý=ÿ )?ùØÑì*,¿ð]_þV˺û×ùÿV~WúÚŠù'þ]ÿåÿ¢ç£ÿáe'ÿ;?áåßðN_ú.z?þR󱣨TþY຿ü¬9—u÷¯óþ¬ü¯õµòOü<»þ ËÿEÏGÿÂÊOþv4ÃË¿àœ¿ô\ôü,¤ÿçcG°©ü²ÿÁuùXs.ëï_çýYù_ëj+äŸøywü—þ‹žÿ…”Ÿüìhÿ‡—Á9è¹èÿøYIÿÎÆaSùeÿ‚êÿò°æ]×Þ¿Ïú³ò¿ÖÔWÉ?ðòïø'/ý=ÿ )?ùØÑÿ.ÿ‚rÿÑsÑÿð²“ÿ§òËÿÕÿåaÌ»¯½Ÿõgå­¨¯’áåßðN_ú.z?þRó±£þ]ÿåÿ¢ç£ÿáe'ÿ;=…Oå—þ «ÿÊÙw_zÿ?êÏÊÿ[Q_$ÿÃË¿àœ¿ô\ôü,¤ÿçcGü<»þ ËÿEÏGÿÂÊOþv4{ ŸË/üWÿ•‡2î¾õþÕŸ•þ¶¢¾Iÿ‡—Á9è¹èÿøYIÿÎÆøywü—þ‹žÿ…”Ÿüìhö?–_ø.¯ÿ+eÝ}ëüÿ«?+ýmE|“ÿ.ÿ‚rÿÑsÑÿð²“ÿðòïø'/ý=ÿ )?ùØÑì*,¿ð]_þV˺û×ùÿV~WúÚŠù'þ]ÿåÿ¢ç£ÿáe'ÿ;?áåßðN_ú.z?þR󱣨TþY຿ü¬9—u÷¯óþ¬ü¯õµòOü<»þ ËÿEÏGÿÂÊOþv4ÃË¿àœ¿ô\ôü,¤ÿçcG°©ü²ÿÁuùXs.ëï_çýYù_ëj+äŸøywü—þ‹žÿ…”Ÿüìhÿ‡—Á9è¹èÿøYIÿÎÆaSùeÿ‚êÿò°æ]×Þ¿Ïú³ò¿ÖÔWÉ?ðòïø'/ý=ÿ )?ùØÑÿ.ÿ‚rÿÑsÑÿð²“ÿ§òËÿÕÿåaÌ»¯½Ÿõgå­¨¯’áåßðN_ú.z?þRó±£þ]ÿåÿ¢ç£ÿáe'ÿ;=…Oå—þ «ÿÊÙw_zÿ?êÏÊÿ[Q_$ÿÃË¿àœ¿ô\ôü,¤ÿçcGü<»þ ËÿEÏGÿÂÊOþv4{ ŸË/üWÿ•‡2î¾õþÕŸ•þ¶¢¾Iÿ‡—Á9è¹èÿøYIÿÎÆøywü—þ‹žÿ…”Ÿüìhö?–_ø.¯ÿ+eÝ}ëüÿ«?+ýmE|“ÿ.ÿ‚rÿÑsÑÿð²“ÿðòïø'/ý=ÿ )?ùØÑì*,¿ð]_þV˺û×ùÿV~WúÚŠù'þ]ÿåÿ¢ç£ÿáe'ÿ;?áåßðN_ú.z?þR󱣨TþY຿ü¬9—u÷¯óþ¬ü¯õµòOü<»þ ËÿEÏGÿÂÊOþv4ÃË¿àœ¿ô\ôü,¤ÿçcG°©ü²ÿÁuùXs.ëï_çýYù_ëjðŸ‰ÿÿ³¿·ü7á½TðÝ¿†õK? üMø›á»?í_ø_ĺ®õÓ>|ÓÓþÏÚÅ›$µÖAaðRÀ^kzÝæŸã >úûá§øŸþ Aû꺫¥xgöš±ðV¯©Úµ”>-Óø?àį øÎ×áç‰5ô}ûP¸»Ñt%𵦗¢¯z…åºG¦›W¼2]ºÈ‘}ºq=Ô-9]øtÕ(Ý8»ÍÚI¦¯95tõÙßõ3–ÿvÞˆÿÙPythonCard-0.8.2/tools/standaloneBuilder/doc/pic28.jpg0000755000076500007650000010021210240730043022475 0ustar alexalex00000000000000ÿØÿàJFIFÿÛCÿÛCÿÀß "ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?û‹þ ÿ‚ý¥ÿàŸ_´ÏÃß‚þ~Î÷ƒõÿÙÃáoÅ ýGâ‡Ã CÄž!‡Ä^&¿ñžªG§£x·ÃM§¼~±¿Hïmn/–îãT–mE¬ÞÓ¿/þ\ý¼Xßc8ä“ñ9ÁÀ8ø˜¤‚I§¦åV,©û‡ûAë¿ð‹ÁP?lOÂgãO†ÿðÿÁ·µßøXßm~ÝñÀ?Ù?í5øLü eÿ _€~×ãO }—ûwÂÖ¿ðŸx#íÞgü%~Ýýµ§þz|kýžþ~ן´ˆux<~Ñú.­ÿ.ñ$ß±/íC¤ëÞ'´ñ—üSöÊýœ|á8.~1Yø{ÃÅ·¼WûNxRîü=ø‡û6|LÕþ%üTðî—ð¿N½ø‡ Í£?‡mt¯é Áp'ö.MO:àÌ&.qÉ)c±¹¿´¨ëb*Ï÷²‹¥V8|#© 3•IS†=âV ˆÅ¬"Âá±é~w›ÕÎþ»ˆ–7­J/éSÂrÇ–ME>xº•T\ã©:¥í*S£íUZ´ãSæ[ø9'öê™s'Â/ØÝ>f‚¾$%r6~#€HY0F×FV Þr[kZÿÁÇ_·ì|&ýŽ€ÜŠüñ 2¹8ÏÄV Aà•!Ù€ŒK,B|`ÿ‚þÉ?³ìmñ;ãg‰?cýXøÑð“þ ×ÿ¡ø¿®x ã'i½×OøýûL|møÛð»öŠÔd;ÄoæÅÝß±×À_~Ó¿?dÿðUO ü_ñ·Å?ÿÁG~?Â1áÚ·]ø±áÏš—À? ÿÁ=üKã sþ-sÆ·‡~3Yü³øÍ |<Ô|Qÿv«gàËZxrÓÄ+%üÖÖN¿²ßÀÏ…ß¼-½ìï¤|ý«joø%?ü›Añçì¨ê¿m/ֵ߆žºð÷ˆõEóñT|3È| ‚­ÃT’Õ1¯—bhóæéW¥ŽJ5ÝÒÈñò­YàYáèUÄÆU”á­)ñ%UF¢Ï+BT›öÔÝg,mJXö• §RýËYÿÁÀ¿¶uÃ2¿ÂßÙ3‚€´õœ&âÀ–'ÇNÀã%9R[l~l°l¯üÓöÇ=~þÊ×þ,æ­Çï㑜óéÓBý#ð×öGøKñ'öiý‘î>)|'ñjüMÒÿg¿ø,7į‡ß±þ¯ñ;öˆ_ 럴7Á_Ž~Ó¼û=ø;áˆ~&^üJÐgyâmO_ðÂ_x3â׎5O‡ð뿼EâíCBñåÎWÅoÙöEø1ðöŸøá'ìçá=gâ§ÃÙ?þ ¥ñ[Ä?üoñã寅ÿgÿŽ_´§Œ|eá? u?ø{âÿ„¾1hü9cáØø;â¿üAã ê:µìZŒ^Õ,´C¬pžËõ_õ'š³Ìg–Âxz‘©YqáªRŒç™Q^Ê®/–³®Ôp°§7Mb'ˆŠ¤ãÚñB^×ûfÔ½„qs•H¸Ãû6ŒÓŠÂËÞ;ÇÙ¦ªÊIIÓ;ÎGüö¿”ß ¿e”9oü)ÝS Io.G$tmùÂ?›¶Ÿð]Úæ|îøkû-ž“ÁýH÷>|^àœ(a‚¸{j dƒìÙ?à™ß±þƒñ‡öãø_áÏ‡ÚµŽµð¿â®ü0ñÇí)áÚO_ý¼'ðñ¿fM㈼®|vøãß„p|.Õ<7âO„ñ?¾:xÛŲh_ ­~Ûxk@ñ÷Ž5Ÿ^Ü2Zräçní«*¸òþw?¼ýÁÜxÜ>a´mo“Êó­=\ƒ†¼2â5ˆx£Maèex™<^­iC6¬fteUUQrsSªÓµ:Ð;Éŵçæ—å‡Ö3iÉΦ&’ö5c7 ˜JÑ£V3½(¸·+J~ô%{©¨Ÿ·ÿÁo¿kl7ßل 9%~_6®ìÿ w8ç •ÎÜ1ç1nEÿ«ýª¤o‡_³Dg¸„Wco-ýï¦à<†#a ‡ñRØaÁåp$;‚å—Ty}WnG)´¨‡oî:ÛQµ@Úé·J¸)‚ǃåE•ÝŽ6r»aò¶Û{“ð×}ÛpÎ]ªW´k2_ÏçÛæ¶^d¸›?\Ÿð©‰Õ+ëßà^]VËU¥ÿf,ÿà³_µÂåþþ̓ä,Jü$¹œ}ïò<ä £ÌÞjÛëÁÿŠý§dp­àÙÀ»;~K•œ1'ÄxÀwlPQ·ÉùãÖ˜>Aòž#nvà ãû•ûÛ:ñ’…w?—²Ï¦´¼NÃ1À®ÄùcÛœæ-Œ¤ù°ìó-²ÿˆoÀÞÒkýZˬ“irÖ²Ûþž>þ^¤¬ùÿ5OøTÄÙFMk &¯k{,º½¶ÓÝý}þ íûK:+þÎÀ• âÔ8Ç>¼¤àÔ)ÀmÛpÆ=«_ø+/í!9;ü û>G€ÇðªŽT‡ ݬŒ“Êœ…Ðà“çGkù/Äqü¸ÄkÕví·AåG‚1è›@¨¤àÿx!À%‚aü¿Ë;1‰Q¶ãkƒ¿£‡lºùGû›ýÞß-Žèöy–½m¸ÄqŒ(Úˆ0nÌŸê£Æ1ÀÛÐ>ì{?sŒ¼;à”×üc™O³WªMÿËåúù |QÄñ_Ú¸«r§kÇüä½-²Ý~žÛÁK¾>L›ŸÁŸãåð¬mw.1´×ê Á!ðÿ+.Ö þbC¯kÿøë4[Áß6–PÌ¿ ¬ÆÐK†ñ‰cÔ ráTJÖÿ›6 ¶0|¥L'÷‹‘ò“qm¹“çù6dzɶé¬3!òó¶Eù»&XíòŽY¶ð6]±—æZ`ü=à®YÿÆ;—è›^í^ŽÛûgù±.)âþqZm¬,´[{¶ü~û£Iÿ øÜÀnð—ÁE8±ðÏO!N »]Ø#‚v-°d¦í¿íõñžU,þø4˜g ´ìðWfÈ™È,ÈÊÑ$2EçŒ+´ ØhjýÄ·ʧbp¸ÂŸÝà)?»ÆèúûÚ„ùH˜yq†ò¸È‹å}¹q‘å²,^\[>Ïm„ü?àÅµÃØÛþZ½?î'ùß«è?õ£ˆ9þÕÅ_™«óCd¢×Øïþ[{Ú~Ý_îkø[áù¿ t°T3ºœ’Ì Iàdl$š[]”ý¶~,7_ |%铆ú9å'×'§ÛÀ9+É_…tÑûÌmn. çoïXò|“¸ü™#œÖM«å}¢Ç©ŒcØp¸Bx;c áqƒÊcrç.àÕ8/õf•×-_/úx¿«èµIÿ­AÏý«Šµ•ÕáýßîywVþpÃûb|Qe¼7ð±HÇü+§ÊsóB¿Þ#œ0Û‡Xäŵ§íkñ.v!ü=ðÃø3åü;ÑÍÎêCæÕ (a´öù€O:KoŽmjý¿1àŒ»Ïú˜øùp«°È|¿³Úôšråþá;|¡ò¯Üýô‡³çåÈù›Fù<Ÿ:Ë™ð(Éÿ``tjÞí^¶þÿæý;(‡ñ ¿ü*â¾(-á³åþãíüßøÇ×iûRüClçCøh0 Ïü+½…,„’zB€AÞPn1ïAûHøò@KèŸЃ£á÷‡I »NNxÎ w„q,püŸ~ƒ GÌ™÷gŒyG“”í]Œ Ì{s_f»P»0ü•säÅò¶0ËPSl>_“kœ¸„…²«]*묾ûùú-Ƹ§ˆ9bÞk‰¿¬X¯åŠôÕÛ§—ÓVŸ´g¾àùC¿¼7ŽdtR7ieH;yùð¡‹‘ç mˆ~7ø¾G ÚWÄŸø@|/‘„fÏÍ¥Áî*˜|‘.÷çm8`†@s³¦é˜e[Èß³kŸ3åDî¿Ðº{Q‰€0 äc¹ÎÄÁûÛ£ØFï: ¾d9KxIJKû dŸÙ«Ó—ûþo·š[‹ýiâåÿ ¸­•¯(/KÂ=—W²×¿Ò:ÄøƒXÑ´;=?ÀpÞkš¦¤Ú½×¼0–Ñ\êwqYÀ÷š Î$³)™–ÝåDW+È$ï´&­g‰ÃT­iR©N1iûhrÆÍ©[šýzwÁu±ùîWšæNxlE*T•Di.YSçwJ“»ºVnÖ]¬šý‰øÇñÍ~ xwÃþ"ñ6½ðÇV)ø‰ðïᇇô ü3:®£â‰^-Òü%£…mcÀš&‘k§é¯©K®kwwúµ©‹EÒµÓ!Õu·Òô]Kùÿ‚Ôëú¯ˆ¿míVïT¸Y  >[ÙZÛÁ–¦ÚK¤Üê2Yizm¤pØé¶o¨_ßj[ÙÁ sj××ó,—··SÍú-ðïÂ> ð7ìAû2xkBø ñ³ö|øƒ§ÿÁA¾¯íáßÚ)5_|cñÏí*ß4sñ{â÷Œ>9^iZ~‰ûSÂÊÖÄ> ðÿíà[‹ïøçÂÒèšW†,üiá†øcàoÍø,wüžž±ÿdÇá‡þ£«_V­nKOõ Ò®ŸAÐS¢°´ê%4êÕOßnI©uÓF}^•\.m#ñÖ‘®¶¹£Oâ¯]^ÙÙøcá·‹ì%ÒÞÃÆ:\6óÍ«ZÞ5Õ¾£Y[ˆìï¤ü­‹þ Ðý¶QTÂÏý•— Œ/þ,°_•Uÿ‹Ÿ( Âà*mUTþÚ¼_ÿ!kOûüÿ¨_‡ëñëöaø+û2x—Ãþ%ý¨~2xáu·Ç«oÛËöºð¦‘ûMø‚-#šÿÂðQ?_¾ü8ƒãÌhßn´K¯hß?g/ |/oÍáÏ|3›Jýî<7®ü;×eð.£ô™7oe˜<Ÿ/ÄeÐÁe”Ö ¹m:ÕU>yÍ)Ô”âäîåïZú«#_äØìMLf"‡^´½¤Ükʽ¢¢“²[¤ºßT~ZÿÁ¼¶Œñ+ö\f ¯¾+1²’~¡bÁs&H‘vO)-µíàß?Û2V‰?³a‘²&`ÿÅ›@pÑò…R‚4ò¢·ýBÑ¿oÿ:j–áuþ§ãÍö·ðÁIþü&ñdwö_´7ì“ûfü!ÿ‚wèZf·áo~ÐèÿôOÚ×öŠøÛàÏxÂ÷ÿg½özðä‹ðÏâoÇi“jÿ´g†1>~Ùÿ·‡ÆOŒzoì¹ÿ'Á?ƒ?<9ÿ 1añgÇ~ê7ÿØ¿ð¨|-ÿóø§à?xwà7ÁoÚ»â׆o?á"ðÏí¹ÿ ëWðü6^¥¿ìgÇøY~Ô4]WöZ×°ÿˆáǾڦ%TÉ#ˆ©J¸…”aãZ¥ 4ëÔ£J¥Tý¥JXz˜ŒL©S“”iOZTâi¹Wú•‘¸FŸ.1ÓŒ¥8Aâ¦á ÔT£9F-YNq§J2’\ÒTà¤ß$mùÝiÿ(ý­ mÒ|BýœŽ dlñĬ.×ä7Áߘc•¦T®"– ¤ÿ‚~Ö ø¸?³¸÷-øqÀñhÇtÀýMâÚ·ãOí³ð7á¯Æ-/…ß >hµçüªü"Õ|âω|Kâ?_?à›_µ•®«á¯Ž¶Ÿ~xGÁÚ'…n?io xãÃú§ì÷ã‹ÿÃðÓÄ#ĺüFÓ´O†çíýûGøöYý°~3üYðw~x×ÅÞýþ x—ÂÓüPðÅÿ‰!ð‡ˆþ~ËðpoÇmÄ—K×<=©èÞ¯©ü(µø{âMWNÔ ¿¿øUãˆþ´ŸN¸ñ4z¾ñüAr»Äå\é=?³)ie +ó¤´ié¢õÙ.Èn¥ìñ]5úĵÑ%ö|—muì|ñoÿNýª!\~ÏÃ@+ø†Øâ<ò>G‘ò•DÙ±QÛêÚÿÁ?j8Hó7xöæø‰©ø÷Â?hÙ»Løû­ü.Ó?`¿è×?îþ9~Év¬>)i¾5Ó¾øCXøh>üYúÚ«ã¿ìaáŒ>%ð?‚|)ñßÄ_< û1^è“k~ñ·ƒ|#ñÇ¿¶V…ûÛ|Bñ>‡ð—âÏÄ]áÖõø>)xëötðÿí¯ë¾ÕtýwötÕ~>Eâ½Rø£o›ñËÄoöœ«Þq·ü'Ro_…ÛŸgmüµè/õ ³^ÏmŸûLºYï˾ÝvÑi·åÄ?ðFÿÚr6R|uð cw̾'ñùe%T¹øZ9R20Wî®ÃÉånCÿ‚ý¥"P?á7øÀÄÞ;m¸$àðÂ,¨' ÆF¢!Ø/í-ûiøëö•›ö=ð׎¿eï üAøiÿ ÿ 3ã6»û7üWñoƒ~!²ðü›â‡ƒ?áø5§þ×> ÖþÿÄ“öøŸÂ¾'ÿ„ƒãOÅßíWád>*Ò¿á´ñ£øS¿h_ðQ_ˆÖ>ñ×í¯â_ø'âÃíoãg†>0ü3ø#ã‰uÝÆ_~ÅÿèÍûqøÏÿ >5j…ƉáøKµ»x>Ûjþø%£di^<ý¡5íWLñ]߯„Ó|¿â6ñü—ûÎTí$¿³imwy%ïYµ}RVvvD¾È¯Ou¢ÿi–š.ª>izù\ìlÿà’Ÿ´mº€þ4ø$HV_—Ä~8 d/Oø¶IÁÀÉá†Á’Ëå-¶¼ðJOÚ'Voü±?/ˆ¼nHË)Ý“ðÜdŒgå1°e$ŒùoÑþ7ý©m?‡Ÿ´ÃïÙûCö^ø‡ñsÇþ6ø=ÿƒþwÅ…?|?ðçãgÁø(§‹ÿä’ÂîøÅâmÆß ¼MûÿÂiÿ%wÃúÆÍ Æÿð§?âÃjßð¾í¶ü ûlüiñO‹þi:œ¿³Î‰ ØüQø‰ð3ãmýÜž,Žoü@ðwíqñ‹öAðÖµؼW¬j²6‰ñ«SøãoþÌ¿¼3ûFøã÷Å[=gö"Õ¾6üø©ið³â¯ÇˆÿˆÙÇ©¹}g+nJ÷þÎ¥³ÕiÌ­~[-ï䨜?výž.òM?ö™ußìù®¶ÚËD|çüßãú")ñwÁ̪ªñâáH|»~Gœdc8(C³ËØ´ÿ‚d|x·?7Šþàn¿ã#qB9ÿ…y$…Ãæ4'rù)kûmá¨1ñeþa4u߉uÛ‹i5K­ºÅøÛÇM[ëk_ö.§å¯Ç~Ÿ.‰ ð5Ëìñv½ÿÞ¥¿þÓ£ßÌüG·ÿ‚l|r‰ÑÏŠ~e0Û®ø¸…Ærv7€@bÖ1W ÈÆ7ƒrø'_ÆÈÑø›áXÚ¨0º×Šð»@ÎÒ< @è0±ŒµSäòÿg(©~5qËÿ˜Œ·¦¿ÙÔï§ý¿oÀ?Ô.º~Ït’ÿy–ËþÝþºö¿ðOïŒp(S↰˭x¡˜#ã?ðƒÆNí¹rXQO.86-¿`ï‹°È®þ ølÛ]XmÖ|Mò€T’ø/icŒà |»[Ê{ÖŠ*â4q¾¿¿Ëµßþéë~—s¿âê+þïïoþÕ/þFÿçÖçåŒ_°ÿÅd½ðív…SVñ!TÀ# ÿ‚€¤l8l;Jn[~Æ_ámgáø9s¹5]|‘¸EòŒxF.¡.8UÙV-‘AúeEfüdãV¬ëåÖNëþéÿò_ŸË ¨\=k{µàv€ºž¸p@Ç;¼,2HÁçÑ¡dÍk¶Ÿ²§Ä%Æu |ºŽ·…ùqÆ|63ƒ‚>éã§~þ¢“ñ‹[OÛå÷Z'ýŸO¥ºs[§Uù+?õ ‡î¥ìñWV·ûLº[´|¿Ëeo‡íÿfD¸:§„‡9ùu Xÿ `ò<;©* EŽ10kZ~Îþ4²ú—…ˆ^Ý—ÚžFÙKÛ¼> ðr ¼‰€¬°ËoöUÅî2i¯m—ëkÿ°SÖÖÖü×¾šÛ¿¥’à[RÅnŸûÔúZÚÚý5ïÔù=>ø¹ü„|6N1ÿz‰+´àuR•#+´ìò÷mþxšÚo4ä’êôãå@y<\eH@QÁô/ÅÎ1v½l¿M¿Ø)í§÷µÛ¯˜¨<<’Jž-%Û5Õ=]¼´ø]¯Ûã}æÀÆRâèàï HΔ­óŒ#e÷pßê~ͱÃíf'V7:^í5É#åÛ‘þ€œ¯PAG$‰¶4~ÃEKñkŒoÛà.÷ÿ`§å§Åä½:X_ê]¿g‹WÓLT—Ktÿ­O6o xžÞ&…â#ámrÌš7‰txô»ÍSú¬i»O×4»Oøs\ðåÖ¡¤Þ,7öVÚï‡õ}k‹h¢Õ4mCOiläïøc/ˆÿô{Ÿ¶þo‡_üåkïª+ÇÌxë7ͧJyž'ÆÎŒe R¯—ÆNœe%)F6¨´m&ïwç±Ý‚áL¿-Hà19–5d§R4qŽ*rвm:oT•ωÿamcXÕ|!ãOÚö”ø‰§x/Ç^ ø‰¦øcÇ3øªøvëÄ^ñ ‡‰´/­í~iú‚º†ŸWO¦êZmô¶3]ÚE}\ÈOóÇÿ•…­ÿm­zÝÊ—ƒá·ÃH\©%KE lb¤…%IRA* ÈŠþÈëøåÿ‚ÐÿÉóx£þÉÿÿý2µpK;Äf£ƒ–…ÃÒœñ*,2ÃóVq…')µ9s{ŠËmu=>WK ZX•ˆÆbkN’¡Í‹®ërÒRså‚å-å«zÜþм_ÿ!kOûüÿ¨_‡ëæÏøf¯ÙËþü4Wü(‚ðÐ_ô]áUxþüŠßðƒÉNþÁÿ„ÛþDŸø£ÿä7ÿ"·üSÿò ÿD¯¤ü_ÿ!kOûüÿ¨_‡ëà? þÛZ't¥ñÿfŸÛcÇ~—PÖ´«_xöXø•ã_ êþÖµkÐi^(𽎭 jßÙ:þ“©è×ÒéºÜ0jZ}å£È&·•çÔ*Nu=œdí&¥nͽ“³ûQ4”oÙoò=§Býš¿g/ ê¾:×|5ðàŸ‡u¿Š>6ðÇÄ¿‰šÆ…ð«ÀºN«ñâ7‚|e7Ä_xÿÇZ†Ÿ ÛÝø»ÆÞøƒq?޼1â¯M¨kºŒ§›ÄúUý¦·+ß6Ôÿþ ]M¥\]| ø]sq¡k~ ñ.‡<þðœÓhÞ#ñgÅ_ |vñOˆ4©dÒYôíoÄ¿üà Õmýg⯄ü5ñQžçÅÚ—«Úé|,ñΧñCÃzÿŠ'øUñŸáE–ƒ®i:öwÇ/†ºïÂk7Zµ†§¨­î‡á%¶¿y¡ÚE¥¼ëÓiöºEÕüÇOÒ/5;Ý3^ƒHäükûJþÎ_ ¾#xKà÷Ä_ßüñsÇߨ?ð‚ü,ñ¯Å_ø[â7á)×nü/áøD¼®ëÖ&ñü$~&°¾ðîƒý¦^lk¶wzFŸöBÞkt™F¤ef¥Ìµ¶­é§KíkylU×õç±µ{ð?à¶¥a©izÂ…×úf³¢|ZðÖ¯§^øÂwV¯‡>>øŽÛÆ?¼?©ZO¤Éo}¢|jñu§Š~-iWQËañÄv¶ÚçŒ`Öu8"º\_…Ÿ³Wìåð3ìÿð¤þüø=öOøJ>Éÿ ³áW~}—þøB?á5û?ü"Z‘äÿÂaÿ Ëá¿ü%^ßøH?á_x#û[íðŠh?`öºÄðÿ‰|9âË õO xƒDñ.™k­ø—ÃWZ‡õ[ fÂÛÄ~ ñ«àïø~{½:{›xu¿ ø»B×<-â]*IÿBñªèz¤ºžwk ÝÛwnº»uÿƒøâš‡ì‹û'ê¾#øgãSöaýžu/|Ñ<ᯃ~)Ô> ü6¼ñÂ_|8¿}Sáç‡þë—“Sð‰à=NI5i^ºÒ¬!ü ø]ãÍOUÑÃZ¦£ã?xOÅú—‡#ðçÄÏGáýBï\Òo®/4Hü#ñ«ã'…“J¸’Kðçů‰šÀ4Ïx¦×UõÄñ‰|9á;5OøƒDðÖ™u­økÃVºˆ5[ ÂçÄ~4ñ•àïx~ ½F{kyµ¿x»]Ðü-á­*9ÿ]ñ³¥hz\Zž£ik1yw}–¯î‰ñ÷Àÿ‚ßl<[¥üPøAð»âF™ãýÁþñÞãïxOÆ5ðçÃßë1ð‡ü[iâ'Q·ñ&‰àx‡_ñOƒô­f;Û ø\Ö5Í -OS½ºŸoþ§ÃŸøW?ð§¿áðOü*?øBáZ¬ÿ„WBÿ…sÿ çû þø@?áûü#?ð„ÿÂ3ÿïü"¿ÙŸØ_Ø_ñ(ûöú=mÏâ_ZøJðu׈4Kokº'ˆðÿ†´¿øƒJÐäu=GDðÖ§ãOiÞ Õm-f°Ñ¯üYá«MF{kwKŽën‹½5}×åu÷[äÅ+ÿ‚uþÅž6Õ~ ÂKû7|Õ~|ðOÆo|3ø}ð{áE÷ÀÿÂôñ—ÂÿøÏźÃCÁz&“ãh5¿…ÐcëÞþÇòí¼oñûVÓW»ñ*]éÿPß|4øs©øËOø‹©xÁ:‡Ä'ûû+ÇWÞЮüe¦Â;¥|Eм?ýŸâyì$Öì¿°´OŒ´}ì×Ñfi_~"éö^E§¼K§ÛV&«â_hWþÒõÏhš6§ãMn x;NÕu[ :ÿÅž#µðçˆð׈5É ]3FÔn­Ži=Ûv¿WÕÝýïWøåÿ¿f¯ÙËàþ•£è_ ~üø]¢xwÆÚ‡Ä¿èÿ¾xÁ:V…ñVðm÷íWÇú>Ÿá­L´ÓÔõ/ê*²† v÷Áº…÷†.oåÑ.籓i>üÄ~ ñŒ>Gâï‡ßÄÏü<ñJxÂkâ?øãUþ¡ª|dñƒ5ÅÒF§á}oâÖ§ªêšÄÍWCº±¿ñåþ¥¨]ø¦}VâòâI;ox—Þ°ƒTñOˆ4O i—Z߆¼5k¨øƒU°Ñ¬.|GãOé^ðw‡à»Ôg¶·›[ñg‹µÝÂÞÒ£‘¯õßë:V‡¥Áu©ê6–³ñ/‡oÙ?øwÿ¦V®Ìñeÿ^ßþ•'²õýý¡x¿þBÖŸö+øÿP¿ÖOüþLá/ý”ÚƒÿZ¿ã}kx¿þBÖŸö+øÿP¿דXþÑÿ4Ë+=7Møû?iúvŸkocaab> ÚYXÙZDZÙÙÚÁgÖ¶ÐG6öðÆ‘C$q¢¢ª‚oe*Þä§Í%ðô³žþ·Óæ ]GT´ÿ/ëÖÝÏ´~=ÿËçýÈûÔ«ð âgƯٓáŸííûSxö“ñÇÂí;LøÅûþÅÞÐþøò]#Ä^#ø÷`ß¿à£ÚGŠ~|=ø/$:¿‹¾ýƒeÍvþ?ÚãV›ˆÿj¯ÛîÃÆÞøÓð‰4»OÙGöÇø©ûok~×¾|4_|4ýþ!üøõªßür³·Ó>$xËÄþkŸøö…ø»ðÛáÿíáŸÙ ö›Öþ2~ÑWß´7üŽ-kö4ðÖ‹ðâ·ˆÿf¨|9ãø(oů„¼?ðÏÁ? ö…Óµ¿þо ýŸ|!¥MñÓÅ~x¦ÿöˆƒÀúwçÖ<}ð‘<9ý5QSíU¿‡îö³zîšo¯{ùÛ@·›þ¹;~'á·Åø($>9ý¡üOᯄ¿µn‰à?ØæöGÓþ!~ÖÞ±øUsðÿà¼>?Ñ?à¦> ñgÄÏüzø³à_|×´OüYýŸ?eïÙ‡XñŸ‰àø§ð«EñÆ»âß‚¾O þÒZ”ÞÄñÿˆ5ßÚÇþ Oai¯~Ñ^6ñ÷ü'ßðP߆Ÿ|3ûQ|4Öþø[â6­ðçÂßð[ üøUñgÀ0øEàÿ|3°ñµ‡Ã?xK^ð¯<à«= ë]³°ñm¦•qö‡þÉüZøAá?^²ð·ŒuoŠ:6™a­Ûx‚ ¯„¿>4üñ—ö¶–¾1øãÿ‡.Ô´F·Õn¤¹ðÖ£®]xròþ-7T»Ò§Ôôm"îÇoá×ïü'ðnàèÿØžÑ?´&‚ µ W[ÕuW[Õo¼Aâ_øŸÄ¾ ¾Õ|Mã/xËÄÚ®±âßxëźƷã/øË[×|aã w[ñ6·ªê·‡?> iZÌÿ5ÿ|ø1âMI"ý'øÃ?ˆíooÙÚëÁÚV‰®øºÛö ÿ‚‰Oámľ ¿ðŸ‡5ŸÃñ›þ ¹&‡¥xƒÅ:_†¼i©økDÔu5µ´Õ|A§x;Å—ú5„Óê6ž×n-£Òî¾ò®']øuàßøËÀ¿µ]¾ÂOƒüKc¨jº>«a¥x×J‡Jño†5 úÃþ?øìÖõø•ußøËÁ_¼y>„þ6ømàxq9Å»¨Ûã½­oz<©h•’ÝëÕµ`³µ¯}¿¯ßsðÛö­øÛâÏüLÓþüxý£tO|+ûyÁ,t/…_±†¼WðZëß´/õŽ_°Äßü]ðý÷Å/ƒš7íAñ‹DðƯütðN•ñ/á­ðáýí‡ìé™â†ú_ˆü)ñ†Ï_ý(ý€¿ä…øïþÏ_þ Uÿ¯ýªkízâ~|:ðoÂèþðý‰áûBh ›PÕu½WQÕu½VûÄ%ñ?‰üKâ íWÄÞ2ñ·Œ¼Mªë-ñ׎¼[¬k~2ñߌµ½wÆ0×u¿kz®«x9§Y§¥¬í>‰ùëw¾º ¶·õümþGmEVc (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ þ9à´?ò|Þ(ÿ²ðïÿL­_ØÕ¿ðZù>oÙ?øwÿ¦V®Ìñeÿ^ßþ•'²õýý¡x¿þBÖŸö+øÿP¿×ÌðKßÙöLø£ûü:ñßÄßÙ{övø‹ã}wâí'ý·ã/üøkâïkÙŸ´ïÆ=MþÕñˆ<3¨jú‡ö~‘§ØiV?k¼›ìšm¿—km Iôÿ‹ÿä-iÿb¿ÿõ ðýEðJ石×Ã/ü#ø_§øËGð_†fñí¥÷Šü7¬Þͪx·ÄÚÏx'Ã^Ðouë«?ˆzuÖ·w£øWLÒ´û^çOÒ´» Jkw¼šÏM°µ’f‚ÎÝ#üèð_‰|Guû{~Òžºñ·sá öCýˆ¼K¡øZ}VþohÞ#ñgÆoø(.—âŸiZ“¶™§k~%Ó<àí;Ä­¥¬7ú͇„ü5i¨Ïso¡iqÚþx»ÇÍâ»)`žÛT{É®´‰d¾Ôµ=&ëm¶¾–ÖÚéðôI¾_ÝÍ$ò™ä;#Œ¸+ðÇÅ?ØóàŸÆˆ×¼O7ÆÏüA¾ðO…þj¾ ø=ûRþÔ?³çöïƒ|®øßľÑüE¥|øÅðÛDñü#šßÄŸ^醻¦ê­—ü$ú´7Ëi*A5g Ô”“v’²vÕ>~m›]4ß©QM/»òIþLù{ÇðROøUzWŠþ/xÿàÇ—û1iþ6ý¯¾xGÆ^ø‹ÿ Ç{â7ìKàßÚWÆ_-üIðCZð/„>xSÁ:Õ§ì}ñâÏá·Š4ÏÚ7Æzî½s/Â6ñG‚<Ž|d~—¿·í៌w_³7ÿfo‚zíâoøQÿð§¬<+ûVxëÄß%éöð|=øâ¿€Ÿ þxó¶ñ¿üÏâ5§ÃŽ~:ø]û7x'ÅÚßì‘ðOâ—ÆڗÞ>ý¡5߇V“ÿ —âßíWð7Ä>øâ_þÏ_nþ0ý»âìUñæmWø‰áÙóÏðmßÂ-vûL°Öükã/ ü.úöqÿ‚z| øaðÛ\½ƒ[ø‡ñ“ÀÞ«ã9>,øƒÅÿ.¯ïüqâþ×^,Õ54ßüDñ®§}¢iºŸíÛûPé~O‰~)ø¥ñxóJ“âwÄÏŠ~>ð†‡ñ /ý¦¿à—ÚGÇyµOøâ‰ð;àßÄ âv‰ñ§Kð]§í7¥üiø‹ÇOŠ¿¾+ü_[¿Š_?lŸ…¿ ¼S¢\øã7Ä]wá_ÃßÚö|ý¢~|#ñg޾!Üé~Ö¼ñÄ¿ .ËÑrÙ¨ÝjùÒnú)^ÍZÛ5×k5ï[þËÉ®çÐßþ"ê¾ý¯¿g¿êZǗញû/~Û_´'‰<%à]?ÆZÞ«âo|ñ7ìà \Íàÿ‡:¾)ÿcx'ãçŨ4/„–ÚWŠô¯xË[ðljl¼­üLð?ÂýcÃ?!ø3ãWŽ5ÏÚöÃYÐüqñFøãþ Pÿmüã9~ xzÂËàoà†ÿ ÿjÖð>¡ðoâ:cü=Öì¾7ü7ð·Ä‹Tð_†~&xÄzÄÏÇ7†íþ*üdÐ |zÓ|Eý—­ü.ðOÆo…š®…}¤ki^(øsñ²çá‰üAo§Í§£ÝøkÆÚWÄ u]Å/âm |Ä_Þø"ï[ñ†¼uðë‰×eŸê< ñƒJºÿ„sþÏž'ý¦<_þËÐþÆ~ñ¡®k!¿Ò|9àŸ~Ï·þ ÑuxkÂ>'ñ•‡Ã¯Aâ¯Â9ãíâÌ©E-wör£mµÓµµóõ³×_U÷iÔú†Š(¬ÆQEQEQEQEQEQEQEQEQEQEürÿÁhäù¼Qÿdÿáßþ™Z¿±ªþ9à´?ò|Þ(ÿ²ðïÿL­]˜âËþ½¿ý*Oeëú3ûBñü…­?ìWð?þ¡~¯ƒ?aÏØÃ[ýª?f¯|sñÇí¥ûlxcÄž-ñ‡Æ½*ëAð'ÄŸ†¶~Ó,<ñËâGà *ßÅ|[¯ŒèÓ%¾—Rñ§5Æ¥%åÂI 2ÅkÞ~/ÿµ§ýŠþÿÔ/ÃôŸ±ž•mû+~Î~ø©x·Á¾2Ô|5«|Hñþ½bþ:Ñ쥽ø—ñKÆ¿n´Û;9ü<–¾ŸÆrx~ßRš[yu¨´´ÖdÒôg¿m"ưò§VöŽ*òVæ³ë;Ûð¿ÈM6£kíÓåý~= 'ömÓ?g ø—@ƒâ¿ÆŒ÷ºÆ¹à½cþ¿Ž^)мQâM*ÖâÃǶMáí ø_ž Ð4ÍÍÒSRœC _Q¿¸?Úú¾¡e¦è6z?çç‰?mŸ|8ý¸|uû0üV—DðÃm+öCø{ûGøsã'‰$°ð¿ôßÉãOÚ^ßâ|uñÄž+±Ðlõ¹>üo‹_|1a G~ßþþÒþ<ñ¸|9à2ºWëÄßi~+²¸ž Ý-ï&ºðÌQØé²k×[m´x¼f÷7s]jþðôI¾_ÚC ä;$¹ ùuñsöøsñÓâßĈß5í­ÆÞ ý”ü%„¢ðæ…-Εÿ ×ñ?ö’ñ¯‰m.uïCâ+M[Á?´GÃïÚSÆ³ÇÆ'†´¿øI~ø‹âÃÝC^Ô4OŠÚ­¦WMÔ“ºqqÑÇ£çÓnÑèúhToo»E׿ywìñÿðŸÿgünøÉàÿŠ>ñwÅ/Š?µ?‡ü'ð/Âÿ³÷ÆŸˆ´?ü ý¤þ#ü#³ŸÇÿþh>$øw[ð7‡4_‡šÇµ‹ü?ðÅß鞸Õ|?qã_xz÷èømOÙWûwûþ‡‚³ÿá ÿ„ÿþ'Ú¯?áHa¹ÿ…Ñöøh/±Âÿ„Ûþoü_ßøVŸð°ÿácÃ?ÿÅöÿ„WþüVUòÄÏø%ï‡ö¿ ~Æ>,ðWÄëž ý¢5¿x3óΕðF·ð_Áß‚Þø™‡†ü‚¼cw«øwÂ:oìëªü.øq¬.§ñ¿á_ý[öR¾ñ¯Ž^-ø‡eðçâ†?e¯‰eoCTÚm]ÉÛT–¯•/u½­¿à5{k¾Ÿ¥úúÿ“=Gþàœ¿áhiðül×ôKº×|-á_Ùkö¡ñwÆ?øÉ´/øJ¡Ñþ%þÏÞø;«|wø]ö¿ O£ø®ÃPø‹ðãÂúV¡áoxÄ–7×'Ä_ßx‹Zý»¿e½Ä~ðìu¿[øß[ø?á­Ç¿ þüaø½ðZ×įücðgÃþ+øûð³À>1ø!à-oâ*|Gøm¬øoJñ×Ä_ÝxOâWÃ<xGÇÞÖõŸ—¼IÿÛñŠ>|/ð/‰>"þÏ?ßáž·ñ}á'ÇÙ"ÿãì=á_xöo I£i_ ÿe]öˆ³ñwõ¿„6þ :?À¿xöø‹að_Á>?ü%øaᯠüñÂÿ…ÿ¾]ð÷ìQûR|!¿øMû$üѵ½kàñGþ Ãñ/ã_ÇO‰_>ZøOÆþ#ý‡ü9ûé:î»ð·Å^ý·¥øÉð¿Dñ_€cÏxwIøoâÏØ»âõü¿n¼UoyñwFøMã #âÃV£Ißß}wvÒýÜuvÖÝ^šZáwÕvóíþoÒ×?^~þÕ?~8xŽ÷Âß üS­êzœz%ÏŠü=u¯|9ø™à?|Pð=•þ›§^üGøãx;Ãý¡~Y\kþ’óâ‡ÀÍsâÃûK|7Õ.Ø~Ñ¿³N…ûGÿÂòÖ¼=ÿ ‰'ñ5¯Á=[Äß²wÅøU–¥ý©ã«ý Zøwÿ †ôCQñ/ü#ž]ûÁ9<ûxŽ-G–_³Ìg…~Gð_Àº¿ÂÏÙ7áÿÁß>.ð|?ñ/‹5oøÇÅÿ xà¿íKð?Uý¯ÿg&ðl‚|=áPøQ®ü]øc­ê?>hž±ð§ÂïŒzÇÄ}[Uð¿|}ñ»Ãz†‰â¿Š3kº—ü'ÿ‚iøàOÿ…Þø_ñóD9ø3­þÏü â¯|¿ñO„åøÓð—ö‡þ Óãíwžð÷Åÿë×Â®— k>øo£|Að¿‹>üi¶Ö ëz&™ð³Dø¡­x£Æ÷ ~0Ÿ…ZŒß<9âO|]ðÃÏŒ0x_…¾(ü5Ð|ñ ïÆŸþxÇÆß|=7Ã/Ššv¥àØ5?…ß,ü7åÞ3ýˆð/ÀïˆÂøWðÛÄ_µßè_­~-¤Þ²ke¥Úz-~ï~šÚúlþ_¥ú¿>¿y÷—ÄÿZ®sû!ØxJû?ü5WÆÍ À°jŸ|#ã/j¾ ðmŸÀŒ_´×‰fÖ>ø< ãm+ÆÞ!ðOÀýcស¡xµü-ªü0ñ—ì|gã x§þWáO‹Š¶Oìÿðgâ5ÇÂø‹ÆÖ~6³ðO…üiáß‚Ÿü}¡iºµßøK᥆§ã_|9ñ?‚tÏ|Yñ·Ã¿|?ø=ðÒÿÄ6ÿ¾/|F·Ò>ü4ð¯Š|m⯠è:ÑûDü:ñ—‹¼uûøóÂZ?ü$VŸ?jøX¾5Ñ-5 +O×n<ãoÙËö‰ý›®õk×ÚF‰}ÿF·ñëAø…âÝ>ï[Óõ[‡>ñ«x*ÇÆ?bð—Ãïxž¹ÿòøsoâ~o„²ø'àÃíCþùÿÿ¯‡_ ô/ø7Â?ðß¶ßÄïÛGUþÇÒ|5¬xkDƒþ^·ñ;RðÆ¡ö- Nÿ„GUŽûÇW?ð›]ë3è6ò”4»kN›ß™§wg´lÒµž¶³Ü×_]=4ÿƒÿõ~Óö;øýðŸÀþ »ÑèÞÖþx‹Â> |øð_â…> Úx£^ñ‰Ð>ýy_ž_¿eŸ|+ý¦|âXn¿¶¾x Á?ðQMwPñ•üV‰ý½ã/ø(WíÉðûö¥Ñü á_Øø‡ÄšÜÿð¥4O†:ï‡üâÁá=+^ÿ„¯á¦«àXuû½Sâ/‡¾þ†Ò—-×.ªÏÿJv¿Ÿ-¯·ž·~¿Ö‹õ¸QE# (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ þ9à´?ò|Þ(ÿ²ðïÿL­_ØÕ¿ðZù>oÙ?øwÿ¦V®Ìñeÿ^ßþ•'²õýý¡x¿þBÖŸö+øÿP¿×Á³ÝÇüoöœøU£ühøeáOØžÇÁ#ñÄ- DƒÇþ:è^*oøW_¼Yð×RºÕtü0ñ~‘aöý_Â÷Ö0Zx“UÆ›sf×EtÓ[C÷¿‹ÿä-iÿb¿ÿõ ðýIÿÔðÏŠþ þÆ >üPðŒ¼!ãK|qñ÷‡ï¼!âK«Û-/Ç¿¾(øûÂÒÞ3K¾·¶ºÔ<)â}R¸Ó'™5="[ÇÒµ«=?X³¾°¶¬<)ÊU½¢‹´•¹·s½µ]›iF×Û§Ëúü:žyà¿~Ðþð߈§ý¥GÁ‹OG®xj/ é¿ux‡Ãká½VÃÅs}®kž>ð÷„õIuËSBkx4«Ãa¦XZ‹¹5fãZ6^ñ?iÿ…S~Ö¯ì_%Þ·kñ¿Nýž|?ûOÚXO£LÞ×~k?|Kð§Q»Ò¼Ck%ͼ:ß„ü]¡ipøƒF×!Ѧ¹°ñ§†¯¼-'‰Rׯ+á?ÑÏ—k©Y]ê0Zêٽׂ¬£›Rѵm͹µ‹âD÷1C¯ec,þDWÖ#Äùñ©}Äøƒñ£ö`ø«ãÏÚoãgÇOÚhžñ÷„?gŸÙWUý‘> ø¯Y„ø?Úoá&¯ÿѼKᯈþÒ£×¼Gqð»^ømûPi¿>(N|*5y>ü[ñ&­ðkÄøÉá ÆžÆ´`ªI+F<¯–Ú+óÙ?5mí­“{•Úû·ôMþlû_àů|}ø-ðƒã·ƒ¬µ½7Â?¾xâ×…´ïÛXYøŽÃßü'¤øÇC²ñ¦—©k:e®·k¦k6°j¶Úv¯ªØAñZjWÖëÔ¾£_͇íûþ×~ ý‹?dO…šÀÿk?gø'—Ã|ÔþÚþÀz—ÄoŸ¶ž‰ð¢Ëþ7¿ø›ñ‡ö²½›Äß ¼¤x›Áÿ®>üKýüo¢|W°×|/ñ{Å犢Ô4OÙûWµí¼uÿæøŸ/†~7øƒÁŸ³¿‚lþ.xËÁ?ðZ/Š‹t©¾hþ2Õ?kï~×Ðxûþ uñ™ü`5«=Bßãg€~ø§âdÿ~2ê­¿‰¿f+ÅÞ.ðÓø¯á†¡âKGÔeÓ‡üüмšKGd¯fß2Ñ¥¿}7ÙôôÖß•ßÝ÷C4Wàß‚ÿa_šOíUñwâ–­ášçÄxÛö¿ñ-÷Åßø\?²÷À/ƒŸ>|^³øÇgð àoü4gÀïƒÞ*ÿ‚ªk?ð¯|7㯂^ÿ„Oâ>­á߆|SðþWÁOøšÓösý™¼ ãϵýž|=á?‹±÷ß‹ßðM?ø_³ø'ÿ Öüû4ÍáØ“RÕ|1¥[|Oÿ‚qh:/Æ?üñÆÿþÄ?ü)^Î7·:z_N^Òoy-­ÖÛ¡ßË·ãoóüé>ŠþyµïØïöσâ7ìmâxSÆß¾;üÿ‡|xþ‹áŸ±­÷…®þ|4×~ ÉûaMñßã÷ígáßø(ö¡ãojR~Ößè_µ];á‡Åƒž7øká¯xcWñ_¿hŸjÛZìQñvïö[×>h_²æ·ð{ãÕŸÂï‚ý¬?i_ |Bøcâ?ø('ˆü ñ‡àwŠ¿hMcÃþçÄ?~Óšßí ào|}ƒJñ÷ü¿Âÿ /Åÿƨ>üDð|Ÿÿi?Ú·þsÙÇOÞGV––Òïwy'eä¯ä}Ÿõo—^ýÚ¼9ð7áþ£ñ7Æ6ZÝÏ„t-oÁZŠuÚÂh|áÏxãÞ×>&xºóTÔ´3Ãß ¾išý×ÄÏŒ3Ôoá°ð/¯ øËÆwiso¡Ik6/‰þ7éZŽ உàß|Añ¶¥à˜~"ø<<.•ðçÁ·ü ðÏJÖ>#ê%ñ—†áÿ„›þoxãÀº{CwªüFðoìñûBÅðöÇÅ6ø}ƒ5ß¿cÏÙ DðßìŸñŸöyø£ðÿ⎅ðƒãv·ñG“àÇůþÏ:ˆü=ð«âÃo |;ñ§ƒì¼û ø;áŸìëðDñn±aã¯[xKà6½âɵÿê_|Oãí/âÿÄÿø;Àþ_ì³ûJø‹áF±âï‹×_ð´?ißþÔ?ðO- ]ñ‘àh~Í_°Oí§ðŸÄ°øëû+Ã!ƒáõ§ü-M'öý¹á³¶ƒÇÞ ÿ†‘ÿ†fi¼c/ÁïÁ*Q…ÚrZJ×èïdžhûÍêº+êÛMÕý6Óñ?^(¯æÃà¯ü£ö‰øuà_ëø3ãfµñßáç‚~ üAø‡wã_~à øsûqþÔ?³_íû>~Óú,þÖ~|<ð÷ÆŠð¸ücð ÇžÐjïø(¯t¿Ÿ´/~-Ô>üOñ_ÅoŽÑøKÔ>$ÿÁ8¿jI´øFÓâ–·ñGð—Âèµ oxkÃ_¼â?Žº¿íUûMþÊ_ÿà£_ ü?àŸê¾,ømg­üJñì}ñân•àÏzN«û2|C¿ÿ‚ŠAû3øüû:ü×bÖŸ³…ííc½¯m-¦º>íom.ú0»ÓNŸå¦¿?¸ýÿ¯.ðoůxóâÆ‡Þ²Öîn>ë~ð޼I=µ…§‡#øâÏè¿ßÀ:PŸR_ê:߆¾xÓá‡(xkFðß‹|Câí âO‡<ùEûþþ&øYñãàÄ-ká´† ¼ûoß|?Ò~7ß~È3xËàŒ¾2ÜþÁ>ðæŸàß…¿²üû>üÿ„ÿIøSûMëcGýž—ÇšV£¥xÃÆ^<ø§ñHø™ûAxÇá®õÁ 뺷íûvèVŸümð›[²ýµþ|u}ÃdÕ~(üºý†?e/‡VšîŸñ3À:»ÿ…'ñ⊞›Ç?!ðŠnüeðÇ^ð_Äí [ðgŒì`N1W´“´o~‰ó¨ôo¦¿?˜'~–ÿ†OþÈúóãWů|øUãŒÞ4²Öî¼ ðÓD—Æ>¼ðýµ…õÿ†>èÓCuã¿O§^êZmÆ«¢|8ðŠë>>ñ.áѬøãWðç†õ]7á÷„¼o㛯x;]õþl<]ûxËöcÿ‚}éú.ŸðÛþŸx›þ£ûF~δÒZøÇJñ7Œ¾-~Û~6øyû)|3ý•þx†þ?øƒÄßümaâk¯Ž?¿eCºñ·‡¾é^&ƒàgÁ០øÛÁ> Ö¿¤úRŠŠV|×rWô²Z&üÞú¦;ô·ü5Š(¨QEQEQEQEQEQEWñËÿ¡ÿ“æñGý“ÿ‡úejþÆ«øåÿ‚ÐÿÉóx£þÉÿÿý2µv`‹/úöÿô¨=—¯èÏí Åÿò´ÿ±_Àÿú…ø~¾ðßíµ¢x×J_xöiý¶ümо#ÝüGñ×Á«Ÿ‡66øçûIxƒá÷Â/ø¿ãæã¿ÝÂÄÐ|ðÂ? üyâO jËâšÇíßñ²Ï‹ê¶—ü"Ÿ~þËÒüEý‰þÿe~ËÖ¿ðòi?µWü7áÁ-cþÝ{á-ÿÅ_ðÕÿ ¿gÏÙWUþÏýŒ|KðJñÇü.oøH>XøÓâGÃѤG²“Ù¦´iûÛKnŽÏº¾›½,Û¿ëT¿_éèIôWóañ‡öàý¶ü/®þÛzÞ™ñÏàŸ…5¿…~ ÿ‚Š\i_³§ü&¾ñ§Æ?„^ýŸ~þÐ7ÿ³_ÇÏøeûØ»þÂøN®þü ø“ÿ ƒöšý°~"þÍ_|-ñwìþ ø}a­ü}ýž|à¿¡¬$§Šh¿ÅðÑõü]i¾Ík üH—GøsñV?¯g¢¶­¹k«»Íµ¢ï~[«;¿åêýºëoÊúŸ¤þø—ðç⎕6»ðÏÇþ ø‹¢[ÿayúÇ|U¡x»Jƒþøcâ/†¼íCÃ÷ú…¤_ð‘|>ñ·ƒ©®xƒÄæ©=®™£hš6™ku¨êº®£uma§X[Oww<6ðÉ"üuñLý¹ÿlðO¾ ÁûÁ<¿áðÇÄ_ë¿ ¼©ù¿´OüvWûcÇ^øiñƒ[оŢI©jؾx‹ûOU´±Ñî²m5 õÝ3åïÙ³öªñ×?hݶ_µ×ü/oxƒö×ý»þ üpý’ü¯ÙÊÿþoörø+ã¯ÚûMøCñgþ¿…? ü)ûAxn­ð{ömøiÿ çÇ?øÓÀ¾"ÿ…çö ô«Ÿ|@øe­h1ÈÚm5d“}õ7Dí¦—z7·dÛ·õæ—ê~×Q_Á5åß°ý™Gì­ÿª/À•ö½KVmvm}ÎÃNé>êáER¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯ã—þ Cÿ'Íâû'ÿÿôÊÕýWñËÿ¡ÿ“æñGý“ÿ‡úejìÀÿ_õíÿéP"{/_ÑŸÚ‹ÿä-iÿb¿ÿõ ðýy5íðƒL²³Ót߈߳öŸ§iö¶ö6#àÝ¥••¤I­¬qÁmkmqÃoo i1"G**¨õŸÿÈZÓþÅÿêáúùƒþ {û þÉŸb¿‡^;ø›û/~Îß|o®ü@ý¤ÿ¶üeã¿‚ |]â­cû3öøÇ£é¿Ú¾!ñ†u _PþÏÒ4û *Çíw“}“M±³±·òím¡‰ 4½¬«{ò‡,—ÃÖî{ú[OV ÙGDôÿ/ëÖÝsÒ~*hßt½JßÂÞ(ðG‰´­.ÿI›YoGàé`±Ô.­õ„ѯsáKdh%º¶‡]:dÒ¨¹KmJKhä6³´RW­ø»áÂ_‚º¯á_ƒ ¾|%ðÅþ¯à¯_øsá—‚|5à=÷^º³ø‡§]kwz?…tÍ+O¹Õîtý+K°¸Ô¦·{ɬôÛ Y&h,íÒ?Æ/ÛJ/x;â6·ñ£âEÏíCoû1|>ø'¡ø—Føû-|gÒ¾Ã(xËÀ:ïÅüý ~<ü/Ôþ(ü?´ý£üŸ¦ø'®øáž­ð£öÏÒ§ÿ…;ñSÃÒ~ϱEãÛÏ ümÊ­;TpænËG-[³jËU×[zÚîÉ´ôÛ¶ÞiŸá¹ú…\M‡Ã¯éŸ¼UñjÇGò> øÛÁ>øuâhj²ÿiø7áv»ñ/ľÑÿ²¦¾“D²þÂÖþ0|E½þÐÓôÛMWSÿ„‹ìÚÅö¡i¤èPiŸ›ý¨þ*ü0ý£ÿl«/x [ñ§À]öòý˜þ ÏñZø§ Wÿïÿi_Ù³öøiðÛÀÿ¾¾›â×ôM#ãÅsãïŽqxÄ?<9á?|Jºñßà ¾;|D¾ñ×4/ž$ÿ‚”øûöšøyàmKÂþ6|ðO¾6Á=¾!|-øÁmáÏÚWÂÚV¹ð“ÇÿðPOÙÁº¿€¾(ø»âWìéð'á¾*|3ø°–Ñx'öxøµûW|0ñσlþ3Ù^|O¸ðN“á]kâ¤*s{lùnÓV\Öi=zhí¾—ìUÿ_Ãþýä¯.ñçÁ¯‡ÿ|Gð÷ÄÞ9Óµ½vãᆶÞ%ð¶€þ5ñŇÃùüG þ‰¬è~ ñŸÂý/Äv? ¾%ë~ñ†ôü3Õ~$xSÅ—ÿ Ñ4¯ x[ÂÞÒ¬4/xkÚ„^‡áÿèz\ºf¢hÚe­®¥iZu­µ†am¥¤ÛÃk·E€(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+øåÿ‚ÐÿÉóx£þÉÿÿý2µcUürÿÁhäù¼Qÿdÿáßþ™Z»0?Å—ý{úTžË×ôgö…âÿù ZدàýBü?Q|¹ð§ìõðËÿþéþ2ÑüᙼA{ci}â¿ ë7³jž-ñ6³ãOê·š†§ðîââK­wÅ~!Öõ»‹x ¾™c. ö.Ÿ¦höÖ:u¬¾/ÿµ§ýŠþÿÔ/Ãõógü4¯ìåÿ þ×þ÷Á?øh/ú!_ðµ| ÿ þEoøNä˜ÿoÂmÿ"OüVòÿ‘[þ*ùÿ¥Ö*u!*žÎM^MÊÝ“z½6WxÒMFý–ÿ#ëxù¼We,Ûjy5Ö‘,—Ú–§¤Ým¶Ñâ×ÒÚÒ]#É7Ë⹤žS<‡dq€~3øµû+| øáâ;/üHð¶·©êqè–Þñ ®ƒñâg€ü9ñCÀöWú–£eðã㿃¼ã xGö…ø]eq¯ø²;?…ÿô?ˆ_í,«aˆõŸxNÿÃZ_Š|A¥hrNºž£¢xkSñ§ƒ´ïj¶–³Xh×þ,ðÕ¦£=µÆ»¥Çu·Y¹ÎO™Éó[}®ú«u¸ì—õÚÖü‘⚯ìëðs[ÿ„óûOÁÿjÿ…›ñ³á7íãø¨ñD?ôMÄ_¼mÛx×öuø9ñâ7„¾+ø¿ÁÿÚ¾6ðoöØnãñŠt­ Äð†ë·~-øuÿ #ÁZ>·§ø'âçü*?j—Ä‚ðµ<=ã/øRµ][â'ÂøC|mªêõϵÑG4»»ë­õÕÝë¾­¿¼,»)û=üÿ…ðÂÛÀ³ø‹þÝoPñ·Å¿Š~3ñ:Gü#ºV«ñã¿Å¿|rø™qá >§¯Ýø_Á+ñâ/‰að/…õ_øÇ]ð׃bд/x߯ÚÞŸ¨x³Xöºøßö[ý–õïÚç^ý­£?ùù¹‡´]Ÿõý?éé­Edÿë4ßú?ø(7þ?‚ßýTë4ßú?ø(7þ?‚ßýT}Fóò?sh»?ëúÓÓZŠÉÿ‡Vi¿ô~ðPoü:¿ú¨ÿ‡Vi¿ô~ðPoü:¿ú¨úŒÿçä~æÑv×ôÿ§¦µ“ÿ¬Óèü?à ßøtþ ô=Qÿ¬Óèü?à ßøtþ ô=QõÿÏÈýÌ=¢ìÿ¯éÿOMj+'þY¦ÿÑøÁA¿ðéüÿèz£þY¦ÿÑøÁA¿ðéüÿèz£ê3ÿŸ‘û˜{EÙÿ_ÓþžšÔVOü:³Mÿ£ðÿ‚ƒáÓø-ÿÐõGü:³Mÿ£ðÿ‚ƒáÓø-ÿÐõGÔgÿ?#÷0ö‹³þ¿§ý=5¨¬Ÿøuf›ÿGáÿÿçð[ÿ¡êøuf›ÿGáÿÿçð[ÿ¡ê¨Ïþ~GîaígýOúzkWñËÿ¡ÿ“æñGý“ÿ‡úejþ¿n¿à™zW…-®ð²þÿ—ÿ†Mÿ„ÿÁ?ðÕð÷øYðÍð•h_ðÐð®áø_ðÓðŸÿšûü,oøBá›ã ÿá*ÿ„sû þ‡ü]·ÿÂÿúþƒ<_ÿ!kOûüÿ¨_‡ë—®.YËKûüË[kí}Öº­=MÒ/É~6¿ä<ß~|O×jßü?ð¿í ão„&OÁzµß>ŸàŸ„š÷Äÿ„ž ñwüWö;ø™àü:°ñÏu ø7þ†|]ð§ö‚±ñ?Ç_‡?5_ü$øÉ¬]xÃ?¾ xÏáf'ÀïÛ×öÍøßñwöpñ·ñ;öyø[oñ+Dý‡µÝ+ökÔ4x'öÈøUð7á…ÿÀ—¿øíáé|#ðö‚ñ/ÄŸèÒŠ~Ñ;Þ èÒ½´nNMí®öÖö·v+[g¦Ÿ…—éøŸ—¿ þ>|OÑÿà’ÿh¯ˆ_|mñâçįÙ{à×|Kñjk„ž¹ðoŒ¿h­—3üOñ>¥¥|Ô~ü1ø'û=êׯ>:ø…­üø‰¥|/øðã]øƒãÏü`Ô<9â /~y|ý»¿l\üL°ð/Æ?þÑZßìåðOþ Kã_X|×>þÔ> ý®>#|øÿèñÿÀ¯ xËâ_ŸÙÏö~»øƒÿßÄÛ#â…Nƒû4|4ý›5ÛýWÃ> ð‰.üw­øcÅ*ø‰ý'Ö'‰|?aâÏxƒÂÚ¤úÝ®™â]Uðþ£uá¯øÁ~#¶°Öl'Ó®çðÿŒ|ªè^.ðž· ½Ì’i^%ð¶¹£xB¿X5MUÓµ;[[¸RœW5é§vßM蕺tµ¼­d;=5ÛñÕ—â~ë?¶V££j¿´¾•ð¿þ ‰ÿ ÿàÇÃßþÆ>*»øí¯ûÞê¾×~$øËöÒ·ø©ðÓô‚þøoö<ø3ãox{à·Âð-ÿíáOáÏŠ¼e¬è_cñÿÁþÑß>2|<ý®øâøK¼-w«Þ|Sÿ…“âi¿á¸ñ®™ÿGü*¯øUþ)Ö>|1ñß‚?áOkÖïñsàßööŸ­iŸáV|ñ~1ø7þ¯öf³â‰¼2žÒ4sà÷ì÷ðÃà_ü$SøÛÆÚ†·âßìˆ|Gã?Šþ-üwøªé^þÓ xbãâgÇ/|Eø‚¾ ð½Þ¿â}WÂþ‡Ä±x7ÃZïŒ|oâ BÓõ¿x²ÿXöºS”_Ã-5´SÚ+T—tÞ¨-µý]LŸø%güƒoûH7Å?ýRß³Õ~«Wæoì‡áÈfí+ã¨ÔüYá/Ýüpý¢Ì÷Š+Áÿáyi?ó×Âÿø7ñ§ÿ;:?áyi?ó×Âÿø7ñ§ÿ;:>±Gþ~Gñÿ å—gýÃþ}™ïWƒÿÂòÒ篅ÿðoãOþvtÂòÒ篅ÿðoãOþvt}büüãþAË.Ïúÿ‡üû3Þ(¯ÿ…å¤ÿÏ_ ÿà߯Ÿüìèÿ…å¤ÿÏ_ ÿà߯ŸüìèúÅùùÇüƒ–]Ÿõÿùög¼Q^ÿ ËIÿž¾ÿÁ¿?ùÙÑÿ ËIÿž¾ÿÁ¿?ùÙÑõŠ?óò?ù,»?ëþóìÏx¢¼þ–“ÿ=|/ÿƒó³£þ–“ÿ=|/ÿƒó³£ëçäòYv×ü?çÙž¡ãùü_ÿb¿ˆ?ôÓw_çëÿØÿ”|Wÿ°?†¿ô]õtÚçÅý'YÑuí~¶þÕÒõ 7íÚ~4›ìÿn´š×Îòá[Åæù^o™åù±ïÛ·ÌLîÂü*öÛRÿ‚†üKÔl¥ó¬ïü;á+ÛI¶I›mukw<ùr¤rÇæE"6ÉQ$\ítV _rJV§ÑÿytߪšJë«üR?²OÿÈZÓþÅÿêáúåë¨ñü…­?ìWð?þ¡~®^¼‰ürÿ¿6k—¢ü‚Š(©QEQEQEQEQEQEQEQEQEQEQEQEQEQEWñËÿ¡ÿ“æñGý“ÿ‡úejþÆ«øåÿ‚ÐÿÉóx£þÉÿÿý2µv`‹/úöÿô¨=—¯èÏí Åÿò´ÿ±_Àÿú…ø~­_xNÏM½¼Ó¯|gáxo,.®,®áû?Œdò®mfx'‹Ì‹ÂRE'—,n›âw±¹”‚jø¿þBÖŸö+øÿP¿Ñãù<_ÿcGˆ?ôíw\ò²uIÚvW¿^kì×d5öW÷.PþÀÒèxð¿þxÓÿ™ ?°4Ÿú!x[Ä?´§ÇMOâ.‰ñSøéá˵¾ðߌ~ßøBÃÀšÞœWÅ9°Õ< Q\ÛB»$Üõ¶¯í[Dîïo+½·Wøy.ÝÏmØ_ì 'þ‡ ÿà'?ù£ûIÿ¡ãÂÿø ãOþd+åÙãâ׈þ>xqþ5ØYhšWÀ_ˆú'„üCû:Dö×ïñÆõ+ Í^ßãGŒç}HižÑ>-i𝇵† B_x3Àúm‡Š>+kºWÄOˆú÷ÀŸ€CRm'gÝo¬þï‹§Pùþ^^_Õý-Ô`i?ô(þÏÿ¼-sâ[kýGÞñíñûá—ìù¡øßÄ—©hZŸ‹4O‡úŸÄû_j¾Ó¼MàëÿØxzZxçÀ÷Ü~.Ñe4ÚJ»io>¿öñ_7ø—õwåo«¿°4ŸúÏ㟈\M÷üSö8Óµ]?B¼øÃåkw~ Ñþ%êº:ü>ø¥>«à/‡:‡Œ¾"ü:ñþ/iðx"[¿‚ž øGñáGŽü ûFø«âì> пeÿi6~ý£/þk~"ðÕŽ°í}©©.ñöé_ðEóûíåý|ý¿ÿ°4ŸúñõÿÄŸø?âf»ã/Û|0ø¸þ-дøTŸ‡…¼ºãöÞðŸ‹~$þÌþøS· ÇÅÚûá_Å? ühø7ñ§àÅ_ xçöOý¬~9øGÆšÃŒÞøYã›MÅ~9ý—Ã>ø‡á wáÿ‰áð÷Å xzîïÅÞÖî<$YÿÏ´¬›»çJÉ7üÞZwŸåååý_Òߣ_ØOýÿÀOó!Gö“ÿCÇ…ÿðÆŸüÈW/EO2þHýóÿä‡ó‡ùW~Và<ñ7ÂõÏŠš/„/®5UøCñ&ëáWˆõcawa¦j*Óüàßj¿ØI©EgªÜéºd^5³Ðî/5/KkoJÖö†ºV·ª÷õñìeÿ#í¹ÿg½ñÿU_ÁZûzD£6–ÊߊLKT½QE (¢€ (¢€ (¢€ (¢€ þ9à´?ò|Þ(ÿ²ðïÿL­_ØÕ¿ðZù>oÙ?øwÿ¦V®Ìñeÿ^ßþ•'²õýý¡x¿þBÖŸö+øÿP¿Ñãù<_ÿcGˆ?ôíw_‘¾+ÿ‚Û~Â×:Ü¢Ã^ø•¨ZXØhš4Z¿Ã­F]DèZ&¢Ë¨YEyg~–ÓXIw`5 + Cìs@o¬,nÌÖü/â?ø+ψ¼C®ø¿nì–×uSY:V•ûFÚf˜u;éïNŸ¦¶­ûFjº¡°²3ýšÌêZ¦¥¨x£7—÷—>eÄ‹êõeí4å¼Ô—2–«ßþX˺ÞÁÌ—/’³Ûû½Úþ½ýQ_ͧü=ãþÆÿÿKÿçýGü=ãþÆÿÿKÿçýKê•;Çÿ«ÿÊÇμÿóóüû3÷ëã‡Â_|}ø-ñàOŒou½7Â?¾xÿá/Šu \ØYøŽÃßü'«x;\½ðýÞ©¦ë:e®·k¦k7SéW:Ž‘ªØAÝé·Öë%¬¿|Jý‰¾4þоøÃkûDþП µ¯x×öCý§?dO†úçÁoÙËÅŸ ¼9ào~Öâ?‹üoáoþÒÿu?‰ZÞ©ü"økwà‹Æ? ì4ËסXücÖõÛM_Uø§ðßSMNÓþ÷ü,µøŸSøÙàˆtoÂß>#]é?t+‡ß5¿^"øýíuüÚÃÑî?èüoÿñt¿þÔÃÑî?èüoÿñt¿þÕ/ Uï(ÿà5ùXùןáþ~ŸfItWóiÿG¸ÿ£ñ¿ÿÄÒÿùÿQÿG¸ÿ£ñ¿ÿÄÒÿùÿQõJãÿ€Õÿåaμÿóóüû3õ·ö2ÿ‘öÜÿ³Þøÿª¯à­~ƒxãþGOÿØÑâý;]×ó¯û4ÁNdŸÚGÅñ§ÅŸüOñ_Å_‹zÇÅ­ÄZWÀiþØG©k>ðO…n,`ðùøã%]ÍàßíInbÕ ·iµI-m´ÛH-#óxßÿÁX.|EâwÄ ûpÿd¶»¬êšÉÒ´¯Ø 6Ó4éßOztý5µoÚ3UÕ …‘ŸìÖgRÕ5-@Ûż¿¼¹ó.$©aêMÏK'(4ÚšQiÚÑmjÖé ™._%g·÷{µýz3ú2¯ý¡>ÂôøasàXuçøŸŸçÙŸ§ßÿd_~Üxoã×ÇÏ‚u»/x_ÄúÃëßÙ6æOØãÄW‡4/è“h_ÿfïþÐ^0øƒñ»ûJïâøêu_Ú_Þ ðÏÅ/ƒÿ³oÄ/øBÖþxèü`ñO…¿ðJïøW³ÿícðCþç‚lÿá©eïˆ?³›ðÓà7ü+O‡? ¿á>øßû|ügþØðÂïø[+û'‚|+ÿ Åÿo…~ÿÂeoý™¡|(°?ð˜Éÿ WÙ¼1ñgü=ãþÆÿÿKÿçýGü=ãþÆÿÿKÿçýWì+¥e(%tì¡4®µOJ_ðýE̼ûnºÛÏÓñìÏÓíGö ñ–½àߎ¿³Þ±ñÿì²?Çøjûí[ÀøU¥i_Uý±õ_ŠÞ(ø¥§ø“ãÇŠ¼Yã¯ê¾ ð÷¾8xûÅ ´þÏ?|e¢Üø{áâ߈¾:ðÿ†~%iŸ8¯‚?ðMÝ+á7޾|G†ãö^ð·ðïãfŸñSPð¿ì—ûø7öXøsã +Dýœ¿j_€ú>›­i–?¾%|AÔåø˜ù£Ý_ðÿŸf~¶Ñ_’_ðúߨ‡þ‚ÿðßÍÿËJ?áõ¿±ýþ'ÿá¿›ÿ–”}^·üû—áþaÍëúÿ‡üû3õ¶Šü’ÿ‡ÖþÄ?ôøŸÿ†þoþZQÿ­ýˆè'ñ?ÿ üßü´£êõ¿çÜ¿óh÷_×ü?çÙŸ­´Wä—ü>·ö!ÿ ŸÄÿü7óòÒø}oìCÿA?‰ÿøoæÿå¥W­ÿ>åø˜sGºþ¿áÿ>Ìým¢¿$¿áõ¿±ýþ'ÿá¿›ÿ–”Ãëbú üOÿÃ7ÿ-(ú½où÷/ÃüÚ=×õÿùögëm¿ðZù>oÙ?øwÿ¦V¯Úßø}oìCÿA?‰ÿøoæÿå¥<ÿðQÿÚáÏí3ûMj¿>^j—žÕ<á-*3¬éW>¥o¢YÏc{ÍœåÔe‘.!–Þ{ˆd·ž,È“¬ðCÕ„¥R$çàÕß~h»}É‘6šV}Oø?Õ™ÿÙPythonCard-0.8.2/tools/standaloneBuilder/doc/pic3.jpg0000755000076500007650000013231510240730043022417 0ustar alexalex00000000000000ÿØÿàJFIFHHÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀR "ÿÄÿÄ[ !T“ÑÒ1QS’23ARUrt”²³Ó"56aqs‘•±BV£Á#4bu¡$CDá‚FÂcƒ¢ð%'We¤âñÿÄÿÄ#QA!1"a2ÿÚ ?èqçpÖ.c> ÁT¸2HßEî5LÚIåà ›þÔ±¿BÅÿÿGÄ]„§ÿçÎ8#úH¿Q°tìŒø¸ñÆ2Âæc·žc“,¦²§óÍGíoéX.À· ²ó!¾-è%¯6ÇðPløÇ àVvòï?hßNqHýÆ“Þ9rXÃŒØla8 ÅW…)àÃÕÔOVLy,&Øø(‹\ç4ü»Ûnw>n¸Ï_\iýÄ|Êý²ãƒ‚=YÛÊy?k8Ù 42àœ=EîWQ¼6K¦Ç]7¬6ÆÎe±ƒð>Å|=„ñrŠ6Wá8ñ~­µwÓ[+Ë^ÈDaÖÚ#¸m žbÜ‚¨°Ö ÄŒ…0S"m[°«¥d”nkÜëk¹Á|°îçíµ3Ãñð}°?¶LbаG«;y}¶LbаO«;yXä¦äÎQ‘Órw/ãnÿãoÙÀ^·ƒçù7.Þúíεê±_iq‡ Æ0m=%>®ÁŽlŽ•îl‘Ìöð‚^Îim„œÀsg6Z­þ?¬Oï¶ý±c…‚}YÛËïöÃŒ: õc¼¤Âø/ð×íø; Í]Ÿ ÈÚwa0¥"ó‹ZÜàZhiÛ`"ÛFñ3™@Ì!Q‚*á½ëª_Jþ™Í’°5Á®|…¤‡žw9§1»àIžˆ¼~Óûí•KûUƪú–SQà¬Q;í»4n{`´Ø­9*!û`Æ ú±Þ] àÌ0–/aŒ‚/euƦ^Ix¼4v‚-iÞ 7­ 9/ÙæÁ˜zªº úZ‰e»iäòËns³ðœšàH‰phùDók‡ú™Çâ Ïãåx~×±€ÿá`¯V;Ë×ö»‡ô<êÇyO†èÅ^$bý4>Hᬫ§šº)dt$Ô¶é¿mŽgx&í„gκ \AÀRa Êœ,VaI¨¥aŽX;ÞÐé^â/0Xàà ¤™fg‚"ç×ûíÌÿk˜CÁ^¬w”ÓþÔq¢“‚Êp^‡…ŒK FæßaæpµÙÁéRàìZÀ˜GàÌ+ÅÌmMV¯š<²çž€Æ€\d$‚I v{£›=ºXg³VÐMU@Âh±z’ÜÈe–kΑͱ‘‰XâÌIq²Ñh$Ú$åÁ_©½}²µ gÈòÎ+Áù/ ÁpÙ#®_²Û·­²Û3Ø£þÖpö‡‚ý\ï.¶\VÀЋò—Ç‚Î24†¾[z0ðËÜöÑá°óÛaÓbÎ=•µ¸”õãÖÕ˃Ÿ$ÌloŠFˆžZ]Âà]Îë ™¬±H˃Þ$þý³ÿµŒ=¡à¿W;Ëïö¯‡´<êçyiÅŠ˜Å%` –YäÁ4u±`øCæ±Ò¸¶BÈÃÚ÷u¼ïÍxÛn`¶° M¤Áâ,ƒ°Ý=7)"¶œ¸Å,1˜˜O ,u± y–‹¶¹2ˆ#ã?rä‡í_hx/ÕÎò±í/f§š¢<@ø »ÂÈÚGÇxØ/lœÂÕ¥AŠx a| ,TQUÓMW„„%£/‹®wܸˆÅ—K@9Áêëp}ÅWÓÔO,tÕ87ä’rx6ºw^HhÁ™£¡2ˇâ±_ï¶ö•Œ¹&WÅ´7 ÁpÙ#®_²Û·­²Û3Ø¢þÔðæ‰ƒ=\ï.¦<A%8»qv8É##eéñ°¾á¼òI¾@m­²ß…bC€0Ï©|ø Òð*¦¡ìž7Ó5ïc˜Zèï=æÐA´¸s¸gïŸßµ/íOh˜3ÕÎòô?j8sDÁž®v®.¦He«šJx8÷:8¯pm'3m9̓5«Èû«Çâ¯ùsžL»vÿÚ†Ñ0g««ïöŸ†ôLêçjâGؾ§Åѳ.ݯöŸ†ôLêçjõý¦á½ú¹Ú¸•è}‰ãñtlË·mý¦a­ú¹Ú¾ÿixkEÁ¾®v®,}‹Òxü]&Ì»v_Ú^Ñpo««èý¥az¹Ú¸Åô'ÅÒìË·h?idÿâàïW;Wßí h¸;Õÿö¸Ñö/aO‹¤Ù—nÃûFÃ6õý§ö†4lêÿû\zúÇâéveÛ±þÑ0¾ƒµû^¿´™vë´-£`ýGþסø[F ÔírCì^Âxü}2íÕòû èÔý§/°®A¨ÿÚå‘O£f]º¡¸WF Ôíz÷…Oþ=£ÿk”bö>Äñøú6eÛªåÖÑèuûN]aM‡QÿµÌõ<~>™öé¹s…4zGþסLÿãÐÿ#ÿk— ØO£f]ºqŽØOG¡Ôí}å®Ñèµû\Ð_TÑÇѳ>Ý'-p—QE¨ÿÚõËL%ÔQj4½±<~>™vé9e„zŠ=BûË#ÔQjW:ÔÑÇÒlÏ·EË#ÔQêÑŽG¨£Ô®u} £¥Ù—nˆcvê(õ+×+p‡SG© žê^š8ú6gÛ{•µýM¤/¼¬¯êhõ!`¢º8ú6eÛ ×^ìÒjBú1¦¸ÿÙ¤Ô…‚±ö)££f]·9S]ÔÒjBr¢»©¤Ô…ˆ¾¦Ž>™vÜÏ]ÕRjBõÊZÞ¦—R^ÇØš8ú6gÛk”•½U.¤')+zª]HXÁ}SGFÜûlŒc¬êiu!zÅYÕSjBÅ ØûGFÌ»lr‚¯ª¦Ô…÷”}U6¤,¾¦Ž>“n}µxþ¯ª¦Ô…ëªúªmPY ÐûGK³>ÚãUuTú ¾ñåWWOª ,}‹êš8ú6çÛOŽêºº}P_F©?öéõAf/A4qôl϶˜Ã5=]>¨/¼oQÕÁª 4/a4ñôm϶‡Ôupj‚ -QÕÁª =} §£f]´F¨êàÕ ‹Ð“øj†Åž9ù—±Ì¦œ:6çÚïÏâCªnÅ÷Œçñ Õ7b¤ŠéãèÙ—kÜc7‰©»¡_1ýÈuMب±H>Å4áÑ·>Öòù¼HuMج‡Ïu¤ÉHÒZa‹šÑoгxÅŒX+h`­ÃY5;ø8šþ ϵŖcA<Í?‚óþF8áúïYe?2Ô–wÃå’z@Æ4¹Ç9€ÿâ«Ã…#’†–®Jª*vUBÉ£lÌ uŽhpðYm„sGŒX+±r¾·Õe4ìl‘9ü™cƒ-"Çyœ?.u0funMp`ˆîe¥·®ÃÍ{5¶[ÿ+ÍûÿŽÿ¯úÖJ2G2¿(á¾f|oåakNkÒ±ù-ûKþ.ÿüé÷WêuðyŒöBàF6á³ UM;«@˜¥âì@ÓÙn? 3Zmm çÈÊ"ª> ㉛s˜GöyŽØ]¸KRU†Až¢G‘e¼Ä²ß U¨¿eXσë©ë)«ðduò6XŸ}æëšmÇ8ë¯oíà¦:/QzqST^ëñGÁBÊ™caºç4¾ÆÆE‘‡»äç‘ol·ærDWÂjÅøå_쳫맬ª¯Á’TTHée}÷‹Îq´›vs“Ì¢þȰþ—ƒ5²n/Ò±£ Õà˜°p¤sꪾÏuµE­à¤}¢8Ès¬70$øvÆJì‹5Ü sUáH°kêß==3`e0p÷Ç3ïáÖ´^? Ú ~g/£N.û"Ãú^ ÖI¸¾ÙÒðn±û‹ô,Œ•8Gj°x¤|´Ñ4œ¡ŒkNÔÄCÁ’Ð A´ÚHh •<ÞSN/Ƈì—ix7XýÅô~ɰö—ƒuÜ_£aÚ¬3M„°\8:ª‚(kg4äTR>W5Â)d½kem¢ÈÀ²Ï ¶ø\m ¦|¯©†¦:hÅsšÓßy‘¡­&KZ"—9há°›[kÍå4âüëû'ú^ Ö?qìŸéx7XýÅÛá mµTB¦œ"ÒVÃPÖ=Ù>MPðëc/^„æ÷Èæ°‹wðV8R…µy$ÔÌ}†1,‘?„i‡´Æ÷´´Û›?ƒìO7”Ó‹ò±û)ãÿ+k¸½ÙVÒðv±û‹õõÄÒãôOÁx ®¦9¡Ê£ák¤}C"c,“<Æç6Ç|¦ ,.µ¶Ùo:y¼¦œ\¿öW‡4¬¬~âexsJÁÚÇî.–Ú ÑÓÕR½â:iÞêØY$9ЊZ‰Žîe¥Ðó^äç°oQƒ°°¯žzihªhª¡k$| ®<¸5Ö±Îm„±âËmù9ÀZóyM8¿3²Ì7¥`íc÷¡û.Ãcÿ+븿[DóyM8¿%þËðÞ•ƒõÜ_²ü7¥`ýc÷ë(žo)§äÃöa†´¬¬~âô?f8häÐk¸¿WE<ÞSN/ʇìÏ é4Çî'ög†tš c÷ꨞo)§åÙ¦Òh5Ü^‡ì× üš c÷êH¯›ÊiÅùpý›á&ƒXýÅ÷û7ÃM±û«õSÍåM8¿/þÎ0Æ“CÛ~êô?g8\äPöߺ¿NDóyWN/̇ìï üŠÛ·W¯ìó i]·î¯ÒÑ<ÞTÑ‹óOìó i]·î¯£ö{…´Š.Û·WéHžo*éÅù°ýŸa]"‹¶íÕëWH¢í»u~މær¦Œ_œò é]·n§ p®‘EÛvêýÌå4âüìb÷èûnÝ_F!áN¾¶íÕú'™ÊhÁùï!0§_GÛvêûÈ\'×Ñöݺ¿ADó9M8¿?„Çýú>Û·W¡ˆøHߤí»uwÈžg)£ÈŒ%×Òvݺœ‰Â]}'mÛ«½Dó9M¸>Dá.º“¶íÕèb^÷©{nÝ]Ò'™ÊiÅÃò3õÔ½·n§#p]KÚvêîO3уˆänë©{NÝ_F'áÿz—´íÕÛ"¾g!£1Cû´½§n¯¼‘¯ë©»NÝ]š)åò0qœ’¯ë©»NÝ_F)×û´Ý§n®ÉËä4bãÆ*Wû´ý£º¾òV»­§í;bëÑ<¾CFG’ÕÝm?iÛ’Õ½m?hì]r'—ÈhÅÉŒX­ë)ûGbõɚβŸ´v.©Ëä4`åy5YÖAÚ;ÞMVuvŽÅÔ¢y|†Œ\ÀÅÊÁÿrÑØ¾Œ]«÷ 틦Dòù 9®OUõvŽÅ÷“Õ}d£±tˆž_!£81~¬܃´v/£ÕxðöŽÅÑ"y|†ŒøÀU^±qzv›#¥¤ƒ ×SAM…ìØ´›„“`Vnnu¶ŠížÓý`rv«Ëø[\ÍÅC `‚q? Q4î˜^ùˆ..7G€.¹aãÑ%÷_Ô&Éú£ôt5ðyŒöBÆ~¥~¯ÀæI²zܧ„p"øáÜ÷>Ãe™‹Í™‚ÛVÍG|c=¾šiH&0Fb Ú¹¶æÛŠ´ðË$”µõôÆgHj8°Úéd–á%¤´K …®±ÝÑ ¼¥ÉßãG­nÔÉßãG­nÔ8[Œ*)­©£š’~)©î\{gµÀ‹¯wgWâ›p,Ð͆p}M1¤«™‚úˆ­y pàî‹8G€X~V{lt5oŽ‚Žjº™bŽX^÷p€ØÔ §ì VÂ÷²ðºm–¹à~¨1(±zŸWšºZš–9î‘Ó²ÖÌ$’€ë[h tÒt´çùEÖ-u.Nÿ=kv¦Nÿ=kv ¡WAeM ò9áÔs™ã "Âãã°ýVHz3زåÅ* —ÊÊ™ªf¡{¦P¹Í±ó‰Ð$µÂYs/›±¶ty;ühõ­Ú«ÓËTóÃŒ‘ð<Ç%× àÐâ-ææ#ôçAˆ1Z7T²²l)_5|ne[ø ö¬hºØÃ,o#…­¶Ò-$ Ü©ð4²¾I*guEDÏkédp¸†5­À9€¶ËM¤’u²wøÑë[µ2wøÑë[µKLVÁÓà\‚'ᥤ ‚cKì27€|8€9Ù#¹¬Ïbè2wøÑë[µW¨–*Yiâ–XÄ•,‰¡áÅÄ4¸ó}@çÚsXgdÂxªøV²®µÑÊ ’©ìk±[C¾q$6ñÍi! -|‚EóÔË[S[U3Y稸q…Å­±klï6ÙoÊÎHÍ@DE{dNÛ¶ ĹÀ~¿bõ“¿ÆZݪˆ‘K“¿ÆZÝ©“¿ÆZݨ"E¬–JÇOùÓmÐël´ŒÙîœÛB‘¹<–K ò4TÉßãG­nÔ"—'µ»WÇDXÂ÷¾&µ¢ÒL­Åk~ˆá/ºþ¡lSÔEWML½¬1ÖkH´Ô±ñÇèŽû¯êCQߘÏd*x~¦ª”ÏQ¥á%%=0t²¶É5eÂç5¡öXÂEòKAmŒ&K•ðyŒöBÍÆHì2ÉÁÙz»¶ýË-³ó^¸-²Þkî²Þå–Úû–žº’Nž¢6ɬ²Ö‘hû掓ÖUU¿ADÚXjNÓWQ$W‹,îbp-m¼à¢ÌŒqDØâÉ¡‰–ÝŽ c®…‚Ói±¬Œ¹Ç'cöÂâ÷ÎØÇþ§QîÚ«bžÂø®,†L5,®«si_|Õ/¼·\e`s›km.$_Ëk8½ó¶1ÿ©Ô{¶­ÜL| ü+„ë"­u0 †²7ÿ{ mþ­ù-8XægÒ-)ñÃ%v7ø¶÷zæËoÝ·ûÁou ¼ÖÝsxð^0œ8Âc| 1±Ó=Í2w#„”“eãgsm·ÜÛxݽ ñ…hÍ—¤smç·„[e¿»šË]ÑeÇ[eÇ]ÔÁÙU˜{ P2Jš†ÂÚXÚù êg0ÈÎ4|“%×@¸òn‚îm6ã,ÿ£Ü•ãªá›IIàÙ›ûD®–ƒ°t‘ÔÕÀÃZxL–¡ð¹ímϹŽi²óZl·Àäc¤4Y|«Ž¬<Èê™^éžûZÖò÷’æÆ‚Û|Ëk†3æŒ&"aìüoÁäüŒ'Uë¼öøy‡7j¢" hã]VE]#ç{âŠJfðR8–Çyœ#ž¸@Ðà.¸æa±·¯ØÂø!en ‹ Ì2Œ Lù7Ÿ82ÑžÜÀ‹¹+óf»ÁæéLq» ‘aÅ)ýz«Ï*ð¿ðŒÞ½Õ«)‘„ä¦á0•%¬{ƒZÈ™…·Ú@°Yv OœË¼þñœ´Úø×ô‡þö£Ü”å^þ›×¡Ú³ë+0®øyð”0ѾW=@C£-šmç³ÁáRdˆm""ˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆ/àÎø<ñì¹qØß‡Q…0tÑSÒà§E$tò›5¬e¶Ëíiµ­g5öl7gÂuX1¬u& –½î}¥¬•‘†€Î\~¿<ǛׄkÝ…ç‚|%û?Ž®jsl2MQÌ~I9Ç0æè]0˜†f-‰¸½&1ÖI‡pµ;ò9)ŸKOCo:XžCœù¼Z,¬ÛÏc~ã6/ã%&¡~Šjšš[‹±íáÒ3EP^à_6Z@sœÑœ_h{úc^ŒÅšÑÌt;WÞWá¯á9ýz©9\ÙQJ¿ý{ŒuIì½i,|kª±ƒ á:Ìú&Ô²²7JÇ›Xv“Ò?°±?m,a,ZÁ8Ó‚ÙE†)]QO¬™lÏŒ‡pWmµ„g8YÍ~düCÀXûI5Õ†ž< úij0}4’=ü ‘dͼâòo8ºYì°{R’i"§ÅºŠˆš@l¦ª&^± [e¼Ù¼9þÅ„ð‹°ßÆ¿³Ø+øx<ªjin[e¶^¶ËlÝZ‰XÏ,b¢_ã–ÇNê y2~²‰>M¶tÆÅ«û.§4Ô˜éçâÚsÿ+ ÈðOÿÒŒؤجEPê ê\ˆ`ܲ#Ž¥–š;Ùˆ†Ùm—âR¾mŠ›µÜ^ú5‚½`*¸ãôG }×õ þ§–“àúiÛvX©£í´­PÇ¢8KSÛN†£¾1žÈT[„(žö±•”îs€ A$þ*õG|c= ¤šQƒ(˜$xfKºlïmA^J™YLÜ<;ˆq2:û¬c\l¤s;ÂGû)e©§†ÿ QCcq/vý©,,’Yß;æ|×Ú÷Ä×9 1€g#6pîdc*"0Éãt­–÷47„–ý¶†“m€o>døS -s¦žÚs;ìÏ`9íæ9ùº3¯Fx[3a2°Jáhap¼GÙþÅV†ÐÜ1ØîÆ&¸Ë$ßÜÀ Áf~vg×õ+Óº `&m9{ãuߺÖ4Ãm½Å ¹Üîú³¨y†® éÛ;deÃÚáòAéÏ›˜þ¡xã* 6›ZݪÅ? 49í²™n¸Ún‚-²ÌÜÀóžèôZ§Êgëäí”8ʃM¦Ö·jq•›M­nÕ)Ÿ¯“¶S)Ÿ¯“¶PPã* 6›ZÝ©ÆTm6µ»Uü¦~¾NÙL¦~¾NÙACŒ¨4Úmkv§Pi´ÚÖíWò™úù;e2™úù;e2 Óiµ­ÚœeA¦Ók[µ_Êgëäí”Êgëäí”8ʃM¦Ö·jq•›M­nÕ)Ÿ¯“¶S)Ÿ¯“¶PPã* 6›ZÝ©ÆTm6µ»Uü¦~¾NÙL¦~¾NÙACŒ¨4Úmkv§Pi´ÚÖíWò™úù;e2™úù;e2 Óiµ­ÚœeA¦Ók[µ_Êgëäí”Êgëäí”8ʃM¦Ö·jq•›M­nÕ)Ÿ¯“¶S)Ÿ¯“¶PPã* 6›ZÝ©ÆTm6µ»Uü¦~¾NÙL¦~¾NÙACŒ¨4Úmkv§Pi´ÚÖíWò™úù;e2™úù;e2 Óiµ­ÚœeA¦Ók[µ_Êgëäí”Êgëäí”8ʃM¦Ö·jq•›M­nÕ)Ÿ¯“¶S)Ÿ¯“¶PPã* 6›ZÝ©ÆTm6µ»Uü¦~¾NÙL¦~¾NÙACŒ¨4Úmkv§Pi´ÚÖíWò™úù;e2™úù;e2 Óiµ­ÚœeA¦Ók[µ_Êgëäí”Êgëäí”8ʃM¦Ö·jq•›M­nÕ)Ÿ¯“¶S)Ÿ¯“¶PPã* 6›ZÝ©ÆTm6µ»Uü¦~¾NÙL¦~¾NÙACŒ¨4Úmkv§Pi´ÚÖíWò™úù;e2™úù;e2 Óiµ­ÚœeA¦Ók[µ_Êgëäí”Êgëäí”8ʃM¦Ö·jq•›M­nÕ)Ÿ¯“¶S)Ÿ¯“¶PPã* 6›ZÝ©ÆTm6µ»Uü¦~¾NÙL¦~¾NÙACŒ¨4Úmkv§Pi´ÚÖíWò™úù;e2™úù;e2 Óiµ­ÚœeA¦Ók[µ_Êgëäí”Êgëäí”8ʃM¦Ö·jq•›M­nÕ)Ÿ¯“¶S)Ÿ¯“¶PPã* 6›ZÝ©ÆTm6µ»Uü¦~¾NÙL¦~¾NÙACŒ¨4Úmkv§Pi´ÚÖíWò™úù;e2™úù;e2 Óiµ­ÚœeA¦Ók[µ_Êgëäí”Êgëäí”8ʃM¦Ö·jq•›M­nÕ)Ÿ¯“¶S)Ÿ¯“¶PPã* 6›ZÝ©ÆTm6µ»Uü¦~¾NÙL¦~¾NÙACŒ¨4Úmkv§Pi´ÚÖíWò™úù;e2™úù;e2 Óiµ­ÚœeA¦Ók[µ_Êgëäí”Êgëäí”8ʃM¦Ö·jq•›M­nÕ)Ÿ¯“¶S)Ÿ¯“¶PPã* 6›ZÝ©ÆTm6µ»Uü¦~¾NÙL¦~¾NÙACŒ¨4Úmkv§Pi´ÚÖíWò™úù;e2™úù;e2 Óiµ­ÚœeA¦Ók[µ_Êgëäí”Êgëäí”8ʃM¦Ö·jq•›M­nÕ)Ÿ¯“¶S)Ÿ¯“¶PPã* 6›ZÝ©ÆTm6µ»Uü¦~¾NÙL¦~¾NÙACŒ¨4Úmkv§Pi´ÚÖíWò™úù;e2™úù;e2 Óiµ­ÚœeA¦Ók[µ_Êgëäí”Êgëäí”8ʃM¦Ö·jq•›M­nÕ)Ÿ¯“¶S)Ÿ¯“¶PPã* 6›ZÝ©ÆTm6µ»Uü¦~¾NÙL¦~¾NÙACŒ¨4Úmkv§Pi´ÚÖíWò™úù;e2™úù;e2 Óiµ­ÚœeA¦Ók[µ_Êgëäí”Êgëäí”8ʃM¦Ö·jq•›M­nÕ)Ÿ¯“¶S)Ÿ¯“¶PWŠh§„†FHËnÞcôZ>Ñø¬lqú#„¾ëú…± œü©ÎqsQ´“oý¨–>8ýÂ_uýB{ G|c=ªÒüßEè°û¶«UðyŒöB«Kó}¢ÃîÚ‚TP ‘—º”°‹#[˜’H»öæ&΀z•Qp4Ï–Hâ}Dl{^-7€6žp‚tPåtÅå‚¢+Áá„_‡aöæ9¾¥èO ¦t"VZ-,€úÇû„""€ˆˆˆƒ"¯©é+å¢É+ç– ×?'§23[g71ü\¦‹ÉXgÔ±0wÒì9÷T¿£Ö⣔Ñy+ úƒö')¢òVõì[ˆƒ”Ñy+ úƒö')¢òVõì[ˆƒ”Ñy+ úƒö')¢òVõì[ˆƒ”Ñy+ úƒö')¢òVõì[ˆƒ”Ñy+ úƒö')¢òVõì[ˆƒ”Ñy+ úƒö')¢òVõì[ˆƒ”Ñy+ úƒö')¢òVõì[ˆƒ”Ñy+ úƒö')¢òVõì[ˆƒ”Ñy+ úƒö')¢òVõì[ˆƒ”Ñy+ úƒö')¢òVõì[ˆƒ”Ñy+ úƒö')¢òVõì[ˆƒ”Ñy+ úƒö')¢òVõì[ˆƒ”Ñy+ úƒö')¢òVõì[ˆƒ”Ñy+ úƒö')¢òVõì[ˆƒ”Ñy+ úƒö-j*Œ¶‰•B ákÜæ†NËÍfrÓœsøTÊW…ÏwèÔ""€ˆˆˆ€ˆˆˆ€Š*™²zY§»{ƒcŸe¶[`µ{–H¡ªÉŸ,blö2ð´Ùnp9üQéM©Î{[SEä¬3êØœ¦‹ÉXgÔ±n" >SEä¬3êØœ¦‹ÉXgÔ±n" >SEä¬3êØœ¦‹ÉXgÔ±n" >SEä¬3êØœ¦‹ÉXgÔ±n" >SEä¬3êØœ¦‹ÉXgÔ±n" >SEä¬3êØœ¦‹ÉXgÔ±n" >SEä¬3êØœ¦‹ÉXgÔ±n" >SEä¬3êØœ¦‹ÉXgÔ±n" >SEä¬3êØœ¦‹ÉXgÔ±n" >SEä¬3êØœ¦‹ÉXgÔ±n" >SEä¬3êØœ¦‹ÉXgÔ±n" >SEä¬3êØœ¦‹ÉXgÔ±n" >SEä¬3êØœ¦‹ÉXgÔ±n" >SEä¬3êؽnjqË+#n ÂáÎph.¢sF~’sõ•²ˆ$žÑ4Ûi<Ù¹ÿE÷‚f‘àíŠSþ>ÿ3ô*ª x&iþØ©¶² 0E o¿-;ù4_½`Ïáù?ò>»'Xx;évûª_Ñè5黚¯J>ê%‘Ž?Dp—ÝPµé»š¯J>ê%‘Ž?Dp—ÝPžÇCQߘÏd*´¿7Ñz,>íªÕG|c=ªÒüßEè°û¶ òúróRöÈ÷¶1‡;ÞÓÿë¼"Ðs(f¢žJ6Ó2Vƒd™¤­p`k.ÜÙŽo“õ«¨– ª¥tÏr0AU9ÀYoo“Ïø ¤kjæˆø&Ï$¬&iI%ÅÜÑ÷ °:ËsóÙóN‰`ˆŠ" "" <ô»}Õ/èõ¸½2N ÖF-6“Á´’~³f÷”?ÅTÝŠˆ‘K”?ÅT݉”?ÅT݈"E.Pÿ=Sv&Pÿ=Sv ‰¹CüXõMØ™CüXõMØ‚$RåñcÕ7beñcÕ7b‘K”?ÅT݉”?ÅT݈"E.Pÿ=Sv&Pÿ=Sv ‰¹CüXõMØ™CüXõMØ‚$RåñcÕ7beñcÕ7b‘K”?ÅT݉”?ÅT݈"E.Pÿ=Sv&Pÿ=Sv ‰¹CüXõMØ™CüXõMØ‚$RåñcÕ7beñcÕ7b‘K”?ÅT݉”?ÅT݈"E.Pÿ=Sv&Pÿ=Sv ‰Jïð±ùîý™CüXõMؼ¾WHuÛ¤´Ñ„DPCY ª(§…„I˜ æ´‹¯kÍeMÇAÀMP'sŸi&ÀÛm–.Z "ÂîlÙþ¢¢«(L‘ÒÇR`0Ó²8[µ×šsˆ-°Z#9…¶Þ_jà’Z ö‹®š ¼´ Ù¸64Žv•eÄU2®®Y›,Œ†Kd¤±×ùšà,Ì@6çÏllèQOFùhÙ]¶WÈìö$‰íÍšÛsZ-ð4+H–+WÂ,¦¶ã¤§d,cl cç€XGûýjÊ" ¸KæªÏ¸²U|^ú5‚½`-kš×4æ-p´¨ƒÎ¦ÊâǪnÄ"—(‹©»(‹©»DŠ\¡þ,z¦ìL¡þ,z¦ìA)r‡ø±ê›±2‡ø±ê›±H¥ÊâǪnÄÊâǪnÄ"—(‹©»(‹©»DŠ\¡þ,z¦ìL¡þ,z¦ìA)r‡ø±ê›±2‡ø±ê›±H¥ÊâǪnÄÊâǪnÄ"—(‹©»(‹©»DŠ\¡þ,z¦ìL¡þ,z¦ìA)r‡ø±ê›±2‡ø±ê›±H¥ÊâǪnÄÊâǪnÄ"—(‹©»(‹©»DŠ\¡þ,z¦ìL¡þ,z¦ìA)r‡ø±ê›±2‡ø±ê›±§ü|ÿþgèUK s~PÚÛs¯6{š¦ËS¬mL°I( ËÛÂÞ{- sŽoeÉÙ|¿†uÌÜA¶Ðà>SÃÖó2ÌþÎssX&ú]‡>ê—ôzrv_/ás7¬™ƒ**gÊêªe¨ kßPæ“cm²Ë'«Å+‹%lc„keeÓx°8ºè¶Ü×]œ‹>O:P¶Š£ð•3*fˆ›¼žÓòÚâ .ù ÞÌÏ`¾±l†ZŽ,‘¹ò]s_w0¸÷[huƒ¹Î-´ssZ¡:*uõ2EMSÀF÷I&BàZy„Þ"Þc˜Zss/o¯§ÓS0—Þö \â[i?$ÜÀç²ÌßXµBÊ*ìªtƒ§•ïx. ȳ=âë¤|¦ó 6y’±¬k¤tSˆã&ÜÍmâ"2YaÏ™¶ažÁÒ”-"®é¦pÓw²GIuìs˜KZZò ¡Ö ì>l72ù P|q9±LèÜ#i‘×{§†ÒMæóà”,¢¯OV*G‚–1,|$|#l¾ÜÖ9óZ9ùü…a5“:žŠy˜tq¹àk@µaÑÖã5u =\Tø Gu±„¾j¬û‡û%WÅï£X+Ðáö ·ñ§¨ÀÚéwRþ4õ].êÜDwñ§¨ÀÚéwRþ4õ].êÜDwñ§¨ÀÚéwRþ4õ].êÜDwñ§¨ÀÚéwRþ4õ].êÜDwñ§¨ÀÚéwRþ4õ].êÜDwñ§¨ÀÚéwRþ4õ].êÜDwñ§¨ÀÚéwRþ4õ].êÜDwñ§¨ÀÚéwRþ4õ].êÜDwñ§¨ÀÚéwRþ4õ].êÜDwñ§¨ÀÚéwRþ4õ].êÜDwñ§¨ÀÚéwRþ4õ].êÜDwñ§¨ÀÚéwRþ4õ].êÜDwñ§¨ÀÚéwRþ4õ].êÜDwñ§¨ÀÚéwRþ4õ].êÜDwñ§¨ÀÚéwW¸ÝŒÆV bÁ Œ¸^se‘Ä è´ýV…²ˆ=ÌÁÒ0[c\@·í^µ?â¦óÝú¨A7sUéGÝD²1ÇèŽû¯ê½7sUéGÝD²1ÇèŽû¯êö:Žø<Æ{!U¥ù¾‹Ña÷mVª;àóì…V—æú/E‡ÝµÉ)"™ò™$žä¬k$ŽhöckIýãÌBÆ×U:gI3Zù›;âÍ {ÚAÚÒu¹ßY^‘,A$qXèä³ÞßÍÌ[šÑgrHµÀžlù‚šVð¬kL“ÂÙûϼx:Ó›Ÿ=–Yà²ÅõÄqÓAÚûÓ½ÂN¹ïm¤Þ‰Þÿe£ýÊ[ÀÉ ¥¨t/’ì.ÛÙ€´÷N9Í™ù³"%ßl¯–y&¾d{›o1-pæ'?>`¼ÅMF2]3ÌwÀç6Æ1ŽkƒEÿ#E¤“›ëR¢X‚šÆ¾IXÑ;ÞH qsci³ä¶Û9Í®9…¤ølS¢ ÍÁø:°c«É¤Éæd ÷s8´:õŸeáÿ쯓OÔIØ*$A.M?Q'`¦M?Q'`¨‘¹4ýD‚™4ýD‚¢DäÓõv dÓõv ‰K“OÔIØ)“OÔIØ*$A.M?Q'`¦M?Q'`¨‘¹4ýD‚™4ýD‚¢DäÓõv dÓõv ‰K“OÔIØ)“OÔIØ*$A.M?Q'`¦M?Q'`¨‘¹4ýD‚™4ýD‚¢DäÓõv dÓõv ‰K“OÔIØ)“OÔIØ*$A.M?Q'`¦M?Q'`¨‘¹4ýD‚™4ýD‚¢DäÓõv õ,oŽš0ö9¦ûŽx Dk+©!¨àåª e­t€òGUØ42ÈFz“û¿ü¼>•˜ M+å—P¾G’ç=Ôì%Äó’lÎWžO`O#àÿVfÄøÃYMQ d5Há„©‰ x&Ëã¡tK><‚!•’Å‚¨Y#s^ÚvÒ9ˆ6f+AG<-¨§’’# öb‘f»<âG™²Ø…®þIèÚúi˜×¼¸²QàÇ<8˜^=۹χ›0V‘[%c$Êe¨0Jd²ëòK­Z{§s›3ýAy¶ûe|³É0}ó#ÜÛyˆ ÐÑhs‡19ùóíÄRGP%k䙌•—$‹À[e·šy¯;šÎu9º_ïªDosÜ!l·XÒòI9€q6¹Ç9ðóf‰bRGYØÿ•~@æÞuâ ÝÖƒ˜[õç+ÍEo¥–(ƒƒÂß}¿)ÐðBÓe§6µYD±äØËÂO$†@ã,…·ˆÂË@žÿî¾ ¼EMF1Ž. ÍŽón¹ìk@s¾M¿¸ÜÀ›ë*TK6ž6:œ¶÷÷[iç4Z~¿’¨ˆ+×±òàê¨ãcž÷Döµ­’H6`êÊLƒé§¦‘²ÅMomÛlphZ>µaK“OÔIØ)“OÔIØ*$A.M?Q'`¦M?Q'`¨‘¹4ýD‚™4ýD‚¢DäÓõv dÓõv ‰K“OÔIØ)“OÔIØ*$A.M?Q'`¦M?Q'`¨‘¹4ýD‚™4ýD‚¢DäÓõv dÓõv ‰K“OÔIØ)“OÔIØ*$A.M?Q'`¦M?Q'`¨‘¹4ýD‚™4ýD‚¢DäÓõv dÓõv ‰K“OÔIØ)“OÔIØ*$A.M?Q'`¦M?Q'`¨‘¹4ýD‚™4ýD‚¢DÔÿŠ›Ïwê¢D@DETÝÍW¥uÈÇ¢8KZôÝÍW¥uÈÇ¢8KWØèj;àóì…V—æú/E‡ÝµZ¨ïƒÌg²Z_›è½vÔ¢¡#¥Š¾y£oÞ (ø<Â׸És=„ó‹¶žÓ̾Â'†Žžž7‰j §/{ci •à»;šr߇™(^EFšjŠ—7ƒð¶F™\âÂâÖ^?ÞYàæçé’J‰2*y›uŽ™Œ}–_ 9·Íxà´s~b¡ih¦’Peá©Û‘‘ÙÁĵ„üÞ8ä›lðZ¢‚J‰NÐø$ñC#äà ²ôrÉ`ùV›.Ïá%(^EV‘ÒM4ò=âãXÖ††œîJÛyþM·-³?ƒ>lðDÛ_L"q’¥ÒþU‚®6\N|ßf`PÑENŽz™„Oš&±“E°ZÀ@ÌF`ò]˜Œä6Ìٳ渃šu5FÆl'WÓEOc)äZàëyÁñB³ÉÙ|¿†uÌÜLô»}Õ/èõ¸ƒ“²ù 뙸œ—Ëøg\ÍŸ‰c“²ù 뙸œ—Ëøg\ÍŸ‰c“²ù 뙸œ—Ëøg\ÍŸ‰c“²ù 뙸œ—Ëøg\ÍŸ‰c“²ù 뙸œ—Ëøg\ÍŸ‰c“²ù 뙸œ—Ëøg\ÍŸ‰c“²ù 뙸œ—Ëøg\ÍŸ‰c“²ù 뙸œ—Ëøg\ÍŸ‰c“²ù 뙸œ—Ëøg\ÍŸ‰c“²ù 뙸œ—Ëøg\ÍŸ‰c“²ù 뙸œ—Ëøg\ÍŸ‰c“²ù 뙸œ—Ëøg\ÍŸ‰c“²ù 뙸œ—Ëøg\ÍŸ‰c“²ù 뙸œ—Ëøg\ÍŸ‰c“²ù 뙸¶(èò,FyêÂ>Ùguç»›žÀo¨)®ÿ žïѨ=Ë)Ík[—sÆÓû£ê^2‡ø±ê›±*;àóì…XO ‰XA ÞÃñðt ¡ŒUÕÓP¶'ˆøZúxÞXÀÒZ^-m‡ÃõfZk»Æ ÿS¦öÂÜ@DEAT,c% sŒ/XÑkˆæpÂKK€úÈæçQJ$†0ùjç¹³"c\m¹ ‚D‡ºÎ6óh\ELMSÁÎâ`Œ€‚KÜ÷·9°‘ÜÚs/uò)äšk‘> ϸ8^ Ú,h´hÏÉ·1q´›…ÔT UOQ5°ðTñºÖ›Ï!ò6À-°[ÁÛm¦Ïó+芔US2ž)ªx3ÂRå"ÑÜÑo97ÆlÖsZP]EF¡ÓPS˜ØÀù)¢tÕWZ,¼âç slßÀãcyºo ""€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆ"¦îj½(û¨–F8ýÂ_uýBצîj½(û¨–F8ýÂ_uýB¾ÇCQߘÏd*´¿7Ñz,>íªÕG|c=ªÒüßEè°û¶ ™¦á%¶-pó[fªÓø¯Š)ÆI 21„–µñµÀI&Â,¶Òé}7¹dmÍwä° Ö4Y˜t1½¼>8äŒFø£t`5¡Ž`-°Y`³›À¤@±¦£(1ÆgÁ!Œ4}FËG?G%<2ðbHbs#»cKHk\Ö‚,æÆÏ­Hˆ6ÖÆ ­¸ÛÖæÌ:a̺ÒÒËYÜü›åû@´" òÈãŒ;ƒ†&›ÎscÎ9ùÈžr½" ©G‚ø-_„UÊ›Dw]kCÎMžßñõæÐà™¤Gø;b‰KÁ3HðvÄà™¤Gø;b‰KÁ3HðvÄà™¤Gø;b‰KÁ3HðvÄà™¤Gø;b‰KÁ3HðvÄà™¤Gø;b‰KÁ3HðvÄà™¤Gø;b‰KÁ3HðvÄà™¤Gø;b‰KÁ3HðvÄà™¤Gø;b‰KÁ3HðvÄà™¤Gø;b‰KÁ3HðvÄà™¤Gø;b‰KÁ3HðvÄà™¤Gø;b‰KÁ3HðvÄà™¤Gø;b‰KÁ3HðvÄà™¤Gø;b‰KÁ3HðvÄà™¤Gø;b‰KÁ3HðvÄà™¤Gø;b‰KÁ3HðvÅöK­Œlyq7AðÒ>¥ Ì®Æ(a¬|MÁøR[¬/ŠŠBÒ@ØlÎ-ðót(9TÛ~lÃV‹ø<Ëir˜O œ,ì7 ±Ì¯‚G:Z7µ¡¡âÒM™ºWVˆ€ˆŠ" """ //Ž9#¾(Ý hc˜ lX,æðéÖ:7FcŽãšZº-°YÑòŽo¬£Ù‘˜ß &2.ÛvÆÛtYe– No­}DÖ:7FcŽãšZº-°YÑòŽo¬¯¨ˆÐÖ¹„1–±­k>@ù!¥¤ÑakˆƒÃá†R °C)m¶p±µö}–©{D@DEEMÜÕzQ÷Q,Œqú#„¾ëú…¯MÜÕzQ÷Q,Œqú#„¾ëú…}ކ£¾1žÈUi~o¢ôX}ÛUªŽø<Æ{!SŠ*È©à‹þˆðQ2;xi3Ýh÷¿©袻YÑE¯“á¥ÚΊ-|Ÿ (JŠ+µZù>]¬è¢×ÉðÒ„¨¢»YÑE¯“á¥ÚΊ-|Ÿ (JŠ+µZù>]¬è¢×ÉðÒ„¨¢»YÑE¯“á¥ÚΊ-|Ÿ (JŠ+µZù>]¬è¢×ÉðÒ„¨¢»YÑE¯“á¥ÚΊ-|Ÿ (JŠ+µZù>]¬è¢×ÉðÒ„¨¢»YÑE¯“á¥ÚΊ-|Ÿ (JŠ+µZù>]¬è¢×ÉðÒ„¨¢»YÑE¯“á¥ÚΊ-|Ÿ (JŠ+µZù>]¬è¢×ÉðÒ„¨¢»YÑE¯“á¥ÚΊ-|Ÿ (JŠ+µZù>]¬è¢×ÉðÒ„¨¢»YÑE¯“á¥ÚΊ-|Ÿ (JŠ+µZù>]¬è¢×ÉðÒ„¨¢»YÑE¯“á¥ÚΊ-|Ÿ (JŠ+µZù>]¬è¢×ÉðÒ„¨¢»YÑE¯“á¥ÚΊ-|Ÿ (JŠ+µZù>]¬è¢×ÉðÒ„¨¢»YÑE¯“á¥ÚΊ-|Ÿ (JŠ+µZù>]¬è¢×ÉðÒ„¨¢»YÑE¯“á¥ÚΊ-|Ÿ (JŠ+µZù>]¬è¢×ÉðÒ„¨¢»YÑE¯“á¥ÚΊ-|Ÿ (JŠ+µZù>]¬è¢×ÉðÒ„¨¢»YÑE¯“á¥ÚΊ-|Ÿ (JŠ+µZù>]¬è¢×ÉðÒ„¨¢»YÑE¯“á¥ÚΊ-|Ÿ (JŠ+µZù>]¬è¢×ÉðÒ„¨¢»YÑE¯“á¥ÚΊ-|Ÿ (JŠ+µZù>]¬è¢×ÉðÒ„¨¢»YÑE¯“á¥ÚΊ-|Ÿ (JŠ+µZù>]¬è¢×ÉðÒ„¨¢»YÑE¯“á¥ÚΊ-|Ÿ (JŠ+µZù>]¬è¢×ÉðÒ„¨¢»YÑE¯“á¥ÚΊ-|Ÿ (JŠ+µZù>]¬è¢×ÉðÒ„¨¢»YÑE¯“á¥ÚΊ-|Ÿ (JŠ+µZù>]¬è¢×ÉðÒ„¨¢»YÑE¯“á¥ÚΊ-|Ÿ (JŠ+µZù>]¬è¢×ÉðÒ„¨¢»YÑE¯“á¥ÚΊ-|Ÿ (JŠ+µZù>]¬è¢×ÉðÒ„¨¢»YÑE¯“á¥ÚΊ-|Ÿ (JŠ+µZù>]¬è¢×ÉðÒ„¨¢»YÑE¯“á¥ÚΊ-|Ÿ (JŠ+µZù>]¬è¢×ÉðÒ‚›¹ªô£î¢YãôG }×õ fßRp®ˆ¾IŒ–DçÆ7œâŸÆÇ¢8KOc¡¨ïƒÌg²8U4ÌæR±’±²]áž\€>%–ØzÝ\¨ïƒÌg²Z_›è½vÔ–Ô—ÊÉÈ2°1씵¦è »nr]x[tØ3‹3$ª•”ÒÔˆXa`·ûËn^‘e€ZÒ9ÉæÍÑFl/KM…æ…˜3UÔÁqïÉ ’V´‘k\CM–æÍx~ïÔ£v…íx~.á×_*‚bzÛlo0&Óœ sž•hj^¨RÓ²(8F9Ü#Ÿ;î‚ÖÅh$ød˜sáJ9d¨ŽY`Œ½¼'åXccó€,ýî“Ïõ,Ù0³&ª|ò`,>/_qk(geç;ƒÎKH6̽Œ7tºæÃlè n”°X,³˜o=€t%"Xj pÒË8$¶Ï)l®quègxÌl»mœÜÃÀ¬Š–SºIiih/=Œm¶ó—0Ög±¤ F~{3ÆŒ9;†ˆlmŒƒ¥"ëXæõæ{¿äáHœË/aââàçHê)ËÉþù7‡9æ#œô ÚþøÇhlmy°µ¯yÌ,åƒaÎFky—‹µZù>Íl0X̆Øß[ƒ¥° °'¿Èxwòé6%+JígE¾O†—k:(µò|5›Ç¯òüºM‰Ç¯òüºM‰CJígE¾O†—k:(µò|5›Ç¯òüºM‰Ç¯òüºM‰CJígE¾O†—k:(µò|5›Ç¯òüºM‰Ç¯òüºM‰CJígE¾O†—k:(µò|5›Ç¯òüºM‰Ç¯òüºM‰CJígE¾O†—k:(µò|5›Ç¯òüºM‰Ç¯òüºM‰CJígE¾O†—k:(µò|5›Ç¯òüºM‰Ç¯òüºM‰CJígE¾O†—k:(µò|5›Ç¯òüºM‰Ç¯òüºM‰CJígE¾O†—k:(µò|5›Ç¯òüºM‰Ç¯òüºM‰CJígE¾O†—k:(µò|5›Ç¯òüºM‰Ç¯òüºM‰CJígE¾O†—k:(µò|5›Ç¯òüºM‰Ç¯òüºM‰CJígE¾O†—k:(µò|5›Ç¯òüºM‰Ç¯òüºM‰CJígE¾O†—k:(µò|5›Ç¯òüºM‰Ç¯òüºM‰CJígE¾O†—k:(µò|5›Ç¯òüºM‰Ç¯òüºM‰CJígE¾O†—k:(µò|5›Ç¯òüºM‰Ç¯òüºM‰CJígE¾O†—k:(µò|5›Ç¯òüºM‰Ç¯òüºM‰CJígE¾O†—k:(µò|5›Ç¯òüºM‰Ç¯òüºM‰CJígE¾O†—k:(µò|5›Ç¯òüºM‰Ç¯òüºM‰CJígE¾O†—k:(µò|5›Ç¯òüºM‰Ç¯òüºM‰CJígE¾O†—k:(µò|5›Ç¯òüºM‹`µÍ ¼ÒÒZtó‹E¶Ê‚(^÷²N0:9Lfã‹ù-u¶ïtxŠ*næ«Òº‰J€ õSA Îe++%ÞåÀ8âYm‡§ýÔê*_›è½vÔ¦¾#Â6)‹£y»9¨ºÈ쇸¾-°’OÉ6ÛáæW4ŽÂ2ÓÁM4‘Ç(ˆ¸1äÚlèmÐ ›\<9ºsj°½3**ðkpvªx±óä´Ï”|¶€--æ´6Ï1Gá¦ÉRéß‹ØqÏs¯Øh&»{¦ï19†r0èU£ª–[ØX$t…®’ÀÒœof´Ö“˜¶jøk)ª¦1 )ã¾lwtC¤i75±œç§™g7 ÂÈî7pësÛy´x@ó´XH±¶ Ip”GÁ?ðÙŠáeÌ‚`rm>1´¸Úm°’R•«ÂT86Ç òél½)27Ü$Óœ»˜sxW–TO-W$® sâççyÚ 3 mp³?ûçˆ[1Ø¿‡……çäPÎÂo8¸ç-6Ùm™‡Bø0´B@ñ‹˜h]°µƒÌÒÜ$‘`ÎAæ HÐ.y®x-¹; ŽmŽ’R9‡?r9Ï0#÷ŠŽŽ¢iYMTÓJP5ï {‰{˜ÒM·Klù@›\<9¹­ª0Ð/8FòN—„¹¿òJòÜ+ ÅÜ8DmhcM×EÐ%¼ÄØr0èJtóI=âcc]c­~væ9ˆ³ºÌ>«q^Ȫ´Ýw|¦x6}vFU“Ž/aÆØm· › €>Ái±£7Ô½ñëü‡‡.“bR´®ÖtQkäøiv³¢‹_'ÃY¼zÿ!áßˤ؜zÿ!áßˤؔ4®ÖtQkäøiv³¢‹_'ÃY¼zÿ!áßˤ؜zÿ!áßˤؔ4®ÖtQkäøiv³¢‹_'ÃY¼zÿ!áßˤ؜zÿ!áßˤؔ4®ÖtQkäøiv³¢‹_'ÃY¼zÿ!áßˤ؜zÿ!áßˤؔ4®ÖtQkäøiv³¢‹_'ÃY¼zÿ!áßˤ؜zÿ!áßˤؔ4®ÖtQkäøiv³¢‹_'ÃY¼zÿ!áßˤ؜zÿ!áßˤؔ4®ÖtQkäøiv³¢‹_'ÃY¼zÿ!áßˤ؜zÿ!áßˤؔ4®ÖtQkäøiv³¢‹_'ÃY¼zÿ!áßˤ؜zÿ!áßˤؔ4®ÖtQkäøiv³¢‹_'ÃY¼zÿ!áßˤ؜zÿ!áßˤؔ4®ÖtQkäøiv³¢‹_'ÃY¼zÿ!áßˤ؜zÿ!áßˤؔ4®ÖtQkäøiv³¢‹_'ÃY¼zÿ!áßˤ؜zÿ!áßˤؔ4®ÖtQkäøiv³¢‹_'ÃY¼zÿ!áßˤ؜zÿ!áßˤؔ4®ÖtQkäøiv³¢‹_'ÃY¼zÿ!áßˤ؜zÿ!áßˤؔ4®ÖtQkäøiv³¢‹_'ÃY¼zÿ!áßˤ؜zÿ!áßˤؔ4®ÖtQkäøiv³¢‹_'ÃY¼zÿ!áßˤ؜zÿ!áßˤؔ4®ÖtQkäøiv³¢‹_'ÃY¼zÿ!áßˤ؜zÿ!áßˤؔ4®ÖtQkäøiv³¢‹_'ÃY¼zÿ!áßˤ؜zÿ!áßˤؔ4®ÖtQkäøiv³¢‹_'ÃY¼zÿ!áßˤض \ÐÛÍ-%¡×O8´[gü¨"…ï{$ᣔÆn8¸’×[iþ÷GcãÑ%÷_Ô-znæ«Òº‰dcÑ%÷_Ô'±ÐÔwÁæ3Ù ­/Íô^‹»jµQߘÏd*´¿7Ñz,>í¨í¨íªU/Íô^‹»j­ô»¾ê“ô‘v Åo¥ØÅ÷TŸ¤‹°[„s•ðyŒöBè×9QߘÏd)"­7sUéGÝD²1ÇèŽû¯ê½7sUéGÝD²1ÇèŽû¯ê}«¡¨ïƒÌg²Z_›è½vÕj£¾1žÈUi~o¢ôX}ÛPxÅo¥ØÅ÷TŸ¤‹°\~+}.Æ/º¤ý$]‚Ü ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆ œ¨ïƒÌg²F¹ÊŽø<Æ{!Ii»š¯J>ê%*Š›¹ªô£î¢R¬¨¢¥ù¾‹Ña÷mR¨©~o¢ôX}ÛPxÅo¥ØÅ÷TŸ¤‹°\~+}.Æ/º¤ý$]‚Ü ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆ œ¨ïƒÌg²F¹ÊŽø<Æ{!Ii»š¯J>ê%‘Ž?Dp—ÝPµé»š¯J>ê%‘Ž?Dp—ÝP³í] G|c=ªÒüßEè°û¶«UðyŒöB«Kó}¢ÃîÚƒÆ+}.Æ/º¤ý$]‚ãñ[év1}Õ'é"ìáD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@\åG|c=º5ÎTwÁæ3Ù H«MÜÕzQ÷Q)TTÝÍW¥u•eE/Íô^‹»j•EKó}¢ÃîÚƒÆ+}.Æ/º¤ý$]‚ãñ[év1}Õ'é"ìáD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@\åG|c=º5ÎTwÁæ3Ù H«MÜÕzQ÷Q,Œqú#„¾ëú…¯MÜÕzQ÷Q,Œqú#„¾ëú…Ÿjèj;àóì…V—æú/E‡ÝµZ¨ïƒÌg²Z_›è½vÔ1[év1}Õ'é"ì‹G‚Æœ`–O‘ã¥k^ìÁÄÚéÄ.¯)ƒ¯¶¡¢‹)ƒ¯¶)ƒ¯¶¢‹)ƒ¯¶)ƒ¯¶JŠ,¦¾>ØL¦¾>ØA*(²˜:øûa2˜:øûa¨¢Ê`ëãí„Ê`ëãí„¢‹)ƒ¯¶)ƒ¯¶JŠ,¦¾>ØL¦¾>ØA*(²˜:øûa2˜:øûa¨¢Ê`ëãí„Ê`ëãí„¢‹)ƒ¯¶)ƒ¯¶JŠ,¦¾>ØL¦¾>ØA*(²˜:øûa2˜:øûa¨¢Ê`ëãí„Ê`ëãí„¢‹)ƒ¯¶)ƒ¯¶JŠ,¦¾>ØL¦¾>ØA*(²˜:øûa2˜:øûa¨¢Ê`ëãí„Ê`ëãí„¢‹)ƒ¯¶)ƒ¯¶JŠ,¦¾>ØL¦¾>ØA*(²˜:øûa2˜:øûa¨¢Ê`ëãí„Ê`ëãí„®r£¾1žÈ[ÙL|}°°j;àóì…™i»š¯J>ê%*Š›¹ªô£î¢R¨¢Š—æú/E‡ÝµJ¢¥ù¾‹Ña÷mAã¾—cÝR~’.Áqø´x,iÆ dù¾:VµîÌ@} ‘hüBêò˜:øûaj*(²˜:øûa2˜:øûaQ*(²˜:øûa2˜:øûa¨¢Ê`ëãí„Ê`ëãí„¢‹)ƒ¯¶)ƒ¯¶JŠ,¦¾>ØL¦¾>ØA*(²˜:øûa2˜:øûa¨¢Ê`ëãí„Ê`ëãí„¢‹)ƒ¯¶)ƒ¯¶JŠ,¦¾>ØL¦¾>ØA*(²˜:øûa2˜:øûa¨¢Ê`ëãí„Ê`ëãí„¢‹)ƒ¯¶)ƒ¯¶JŠ,¦¾>ØL¦¾>ØA*(²˜:øûa2˜:øûa¨¢Ê`ëãí„Ê`ëãí„¢‹)ƒ¯¶)ƒ¯¶JŠ,¦¾>ØL¦¾>ØA*(²˜:øûa2˜:øûa¨¢Ê`ëãí„Ê`ëãí„¢‹)ƒ¯¶)ƒ¯¶JŠ,¦¾>ØL¦¾>ØA*ç*;àóì…½”Á×ÇÛ £¾1žÈY‘V›¹ªô£î¢YãôG }×õ ^›¹ªô£î¢YãôG }×õ {WCQߘÏd*´¿7Ñz,>íªÕG|c=ªÒüßEè°û¶ »R#mÉKs†øz-^¯UéÏTR÷¸<Ãí9D‚ÕµzGóÆÔ¶¯HþxÚª¨Lã+m=„’ÛI°æ9ÈÞןþ?XA¡z¯HþxÚ—ªôç«8ÕE–EJÉ#t¯&ó/‹ÍŽu¶·ü¥=TURL!’9e¯cóºölÞoü Ñ½W¤5qp´õo’;îeæ¼ØK\ZléÎ~b¬2J©-ö .–ÏÔýK›Å£p}ìþùë¡oøY<öþŽA-ê½#ùãj^«Ò?ž6ª¨‚Õê½#ùãj[W¤ÓKz¯HþxÚ–ÕéÏUUÒØ [}îsXÖÛe®sƒF´„¯UéÏRõ^‘üñµg‡Ì&Š)#ŠÙEèä%¹˜çx@6üŽ‹3Œè*é ¦šl/AûÜ Ð½W¤mXOúuúdžõ‹qTÝÍW¥u•EMÜÕzQ÷Q)PT¿7Ñz,>íªU/Íô^‹»j ±å"6Ü”±‡8(o‡¢Õêõ^‘üñµE/{ƒÌ>Ó”H-^«Ò?ž6¥µZGóÆÕUCSPÚf5Îæ.³Ã˜KŽaàhqÿdªôç©z¯HþxÚ³k«" †GÊæ5ík‹c{ƒKˆÂÕîIãfm’7N^湡ùÚ\ëlçýßùA~õ^‘üñµ/UéÏUTAjõ^‘üñµW’½ÑV2‘Õg‡|n•¬l·Ð@$Øsgpççÿb¼¬7ý:‡ý2OzÄg©{Ã[4„“`Ê’õ^‘üñµEMþ*=¿ª‰«ÕzGóÆÔ½W¤3Ÿ….°få9ÏOƒ›ÂÑañv0ÿAùxßN.Æâ?/è5jiÌï€ðTòˆÞ\YQÜà?uÜăÍà^®OñM¥l­‰Ñ±Îc i´Ëy™e—{Ÿ6|Ž.Æâ?/éÅØÃüAåã}¥54´lmÉ"{ÄF#cœÑÞ¡Ûg…ÑÍÌmú”ö>ý–ÇvñÞ<ÖsóxNk?ßêXœ]Œ?Ä~^7Ó‹±‡ø‚ËÆú ÄX|]Œ?Ä~^7Ó‹±‡ø‚ËÆú3wŒþ§Mí…¸¹ùp«–›-ÃQM5Ïq´W ,p6[72è@RËÞàó´åͯ¦Ã55ÒáX) kn¶3G|ô’\_Ÿ9>àûUJ9Xç5…–2FH6Zàë-ð[e–¬~.Æâ?/éÅØÃüAåã}œô’Ô²ìÒÀÌÒ6Èï>ÀèžËm x\3Yà9×ÓO%Ûí±åÌùªg:ëoX §;@.¶ÆÏŸ6_cñ—ôâìaþ ƒòñ¾­zJwRÇ-é](ƒçZxI]œ¸s=¹Î|Ê´ô3T2FºHìþô‚ù¤6—Fö´ì¸,¼¼ù‰ðبñv0ÿAùxßN.Æâ?/è7H [$¯´[Ìé^áÿ âÃâìaþ ƒòñ¾œ]Œ?Ä~^7Ôý:‡ý2OzŸ±¨p=t8`aì%SÅ; kYMÁØ šë{£âÿÊÙA7sUéGÝD¥QSw5^”}ÔJT/Íô^‹»j•EKó}¢ÃîÚ‚Ô½î0ûNQ,Úúl3SP .‚š¶ëc4wÏI%Åùó“àµUâìaþ ƒòñ¾ƒqB`/©3äˆ6;Œà®Þ7®´¹¤Yò[ÍŸ9Y<]Œ?Ä~^7Ó‹±‡ø‚ËÆú “SÓºðÔž׽͸Æßkm±¦ñ-p'˜Z? NdÙE¬tSO3m{ƒ¤sÄ–f»`Ï ÛÌ?Ùcqv0ÿAùxßN.Æâ?/êØÜ°‚ëKH±¶œfÏÍ›Ãø"Ãâìaþ ƒòñ¾œ]Œ?Ä~^7Ô‹ ÿN¡ÿL“Þ±8»ˆ ü¼o¯t8º00vŽ©âÐ5¬¦àìÍu½Ññåõ7ø¨|öþª$.‘‚ô.ceØ^ÛÍÁhZ>«BÃâìaþ ƒòñ¾ƒqWŠŠ(Ûlp6|£…’f°Ýወ½eîã7ü,¾.Æâ?/éÅØÃüAåã}ç`÷:–x¿ºù\3˜çÍ+­sÀ!Ãl¿e¹Îbl´æ±[I•ÉR ­ šy_i›¦ ¹ºAÿ…“ÅØÃüAåã}8»ˆ ü¼o«cZh¦˜ÍRã j]scçÃo› ¬Ã~éÁn|ê9(Â:8‹_°K4¬´ââC,¾\\IÏ|ë7‹±‡ø‚ËÆúqv0ÿAùxßKÏ!Ò9À $,ÿ…åañv0ÿAùxßN.Æâ?/ê(ýƒïg÷Ï] ÂÉç·ôrËÀØ9Ø'ÇFé„ÎcžâðË —<»šÓg?J“G„f±PWEIò¯=ϧáK¬€ù@sÓàæð…´X|]Œ?Ä~^7Ó‹±‡ø‚ËÆú Zšs;à<<¢7—Twä8Ýw1 óx«“ÇÕF’ŽV9Íae…Ì‘’M€–¸:Ë|Ùe«‹±‡ø‚ËÆúqv0ÿAùxßA§=$µ,»4°34²;ϰ:'²ÛH ÖxuôÓÉvûDlys>@ª™ÎºÛÖ)ÎÐ ­±£ÀsçÍ—ÅØÃüAåã}8»ˆ ü¼o«c^’Ô±ËzFJàÇ9ÖžWg.œÏnsŸ2­= Õ ‘®’;?½ ¾i ¥Ñ½­;. /o>b|6*<]Œ?Ä~^7Ó‹±‡ø‚ËÆú ÒAÁÖÉ+íó:W¸Âø°ø»ˆ ü¼o§cñ—õÿN¡ÿL“Þ±n,j]F» GTñNèÖSpvæºÞèø¿ò¶PEMÜÕzQ÷Q,Œqú#„¾ëú…¯MÜÕzQ÷Q,Œqú#„¾ëú„ö:Žø<Æ{!Te##m]hkÑz,À ï}[¨ïƒÌg²á '½¬ee;œã`PI?Š 2a¥Öö¢øi“ .·µÃQIS+#©›ƒ‡€§q&G_uŒk€4ŽgxHÿe9•.käˆ=®-sZûl7‹@?Y"Ï·290Òë{Q|4Ɇ—[ڋᯑÕÓJZ#¨‰åƆ¼H›,¦Bj"²#d†øùÛ3ô û“ .·µÃL˜iu½¨¾øú¨[Hú¦¼I_ld@ç³ð_R …®}9kbt¯|rÞ ç†À?Ÿ [áAë&]oj/†™0Òë{Q|40Ù ž2Ǻë,qèÂRJ˜"g $ñ±—‹o9à GƒíÌ ˜iu½¨¾dÃK­íEðÔ\eA¦Ók[µ8ʃM¦Ö·j ra¥Öö¢øi“ .·µÃQq•›M­nÔã* 6›Zݨ%Ɇ—[Ú‹á¦L4ºÞÔ_ EÆTm6µ»SŒ¨4Úmkv —&]oj/†™0Òë{Q|5Pi´ÚÖíN2 Óiµ­Ú‚\˜iu½¨¾dÃK­íEðÔ\eA¦Ók[µ8ʃM¦Ö·j ra¥Öö¢øi“ .·µÃQq•›M­nÔã* 6›Zݨ%Ɇ—[Ú‹á¦L4ºÞÔ_ EÆTm6µ»SŒ¨4Úmkv —&]oj/†™0Òë{Q|5Pi´ÚÖíN2 Óiµ­Ú‚\˜iu½¨¾dÃK­íEðÔ\eA¦Ók[µ8ʃM¦Ö·j ra¥Öö¢øi“ .·µÃQq•›M­nÔã* 6›Zݨ%Ɇ—[Ú‹á¦L4ºÞÔ_ EÆTm6µ»SŒ¨4Úmkv —&]oj/†™0Òë{Q|5Pi´ÚÖíN2 Óiµ­Ú‚\˜iu½¨¾dÃK­íEðÔ\eA¦Ók[µ8ʃM¦Ö·j ra¥Öö¢øi“ .·µÃQq•›M­nÔã* 6›Zݨ%Ɇ—[Ú‹á¦L4ºÞÔ_ EÆTm6µ»SŒ¨4Úmkv —&]oj/†™0Òë{Q|5Pi´ÚÖíN2 Óiµ­Ú‚\˜iu½¨¾dÃK­íEðÔ\eA¦Ók[µ8ʃM¦Ö·j ra¥Öö¢øi“ .·µÃQq•›M­nÔã* 6›Zݨ%Ɇ—[Ú‹á¦L4ºÞÔ_ EÆTm6µ»SŒ¨4Úmkv ±l†71Ž•åÒé\ÒI-k| ™¡z^"š)ãá!‘’2Û·˜àE½´~+Ú…”Œdlµu¡¬`cEè³,½ô2¬Ü!D÷µŒ¬§sœlJ 'ñA&L4ºÞÔ_ 2a¥Öö¢øj9jdc*& §´<¹ä8Ðãts8s‘Ÿñ^ŸTÆU:œ–µÑÈæIyà\²3%¿e‚χ¡¬˜iu½¨¾dÃK­íEðÐÔÀÞôñ޽ÚñòþΞp¾IU )æ˜<=°‡_ @´µܘiu½¨¾dÃK­íEð×–Tƒ!kŸNZØ+ß·ƒ@¹á°ßçèøW¡S’ ã,{®±ÁâÇ€|%&]oj/†™0Òë{Q|4’¦™ÂIí¨RÂÉ%ðS¾gÍ}¯|Msšr3gæQÇHñ4:vÞŽK×sëÓ=ÅÏ|¢Ö¸ÿ˜•ƒpøنۄb’VÁ1Œ6y#¸>ÞåÂÞäsô-Î@bÞ…?®Ï¾µŠÑR¹¬…‘„1”Qžr,ˆ’ñÍÍÍö¨[KR×Á'È–XÝX<Ž/qš'X[v1cI7yðدòô)ýv}ôä-èSúìûè*ÔSI- [$n¨©¾I-cXâ=ͼÞö®—(©ª”È×6I\ö¶óš\/@@´“oáhæÌ¬òô)ýv}ôä-èSúìûéBœ´r<6é¦l{Œ/–LÅ­iÏ´¼Û l8ε]Ê×^œà\$X-6}6 Ù×Î@bÞ…?®Ï¾œ€Å½ ]Ÿ}({Êgëäí”Êgëäí•ã·¡Oë³ï§ 1oBŸ×gßR‡¼¦~¾NÙL¦~¾NÙ^9‹zþ»>úrô)ýv}ô¡ï)Ÿ¯“¶S)Ÿ¯“¶WŽ@bÞ…?®Ï¾œ€Å½ ]Ÿ}({Êgëäí”Êgëäí•ã·¡Oë³ï§ 1oBŸ×gßJò™úù;e2™úù;exä-èSúìûéÈ [ЧõÙ÷Ò‡¼¦~¾NÙL¦~¾NÙ^9‹zþ»>úrô)ýv}ô¡ï)Ÿ¯“¶S)Ÿ¯“¶WŽ@bÞ…?®Ï¾œ€Å½ ]Ÿ}({Êgëäí”Êgëäí•ã·¡Oë³ï§ 1oBŸ×gßJò™úù;e2™úù;exä-èSúìûéÈ [ЧõÙ÷Ò‡¼¦~¾NÙL¦~¾NÙ^9‹zþ»>úrô)ýv}ô¡ï)Ÿ¯“¶S)Ÿ¯“¶WŽ@bÞ…?®Ï¾œ€Å½ ]Ÿ}({Êgëäí”Êgëäí•ã·¡Oë³ï§ 1oBŸ×gßJò™úù;e2™úù;exä-èSúìûéÈ [ЧõÙ÷Ò‡¼¦~¾NÙL¦~¾NÙ^9‹zþ»>úrô)ýv}ô¡ï)Ÿ¯“¶S)Ÿ¯“¶WŽ@bÞ…?®Ï¾œ€Å½ ]Ÿ}({Êgëäí”Êgëäí•ã·¡Oë³ï§ 1oBŸ×gßJò™úù;e2™úù;exä-èSúìûéÈ [ЧõÙ÷Ò‡¼¦~¾NÙL¦~¾NÙ^9‹zþ»>úrô)ýv}ô¡ï)Ÿ¯“¶S)Ÿ¯“¶WŽ@bÞ…?®Ï¾½JÖ±ÌkÖÆÀ.„˜¥W…Î~Tç8¹Æ¨ÚI·þÔJE7sUéGÝD¥PšI¥2‰‚G†d°‹¡ÆÎöÕéEKó}¢ÃîÚ‚)ifššvºÇPâ\÷¹À¶óÃcCM¶]·œsÙõ©ß \éÁ˜r§T†¼Zm1 Ö˜†›mðýYò0nÁØw0ÛpŒRJØ"¦1†Ï$`Ûܸ[ÜŽ~…¹È [ЧõÙ÷Ö©Eq}¦7:f½²Í+Iœ3»´úrô)ýv}ô¡ï)Ÿ¯“¶S)Ÿ¯“¶WŽ@bÞ…?®Ï¾œ€Å½ ]Ÿ}({Êgëäí”Êgëäí•ã·¡Oë³ï§ 1oBŸ×gßJò™úù;e2™úù;exä-èSúìûéÈ [ЧõÙ÷Ò‡¼¦~¾NÙL¦~¾NÙ^9‹zþ»>úrô)ýv}ô¡ï)Ÿ¯“¶S)Ÿ¯“¶WŽ@bÞ…?®Ï¾œ€Å½ ]Ÿ}({Êgëäí”Êgëäí•ã·¡Oë³ï§ 1oBŸ×gßJò™úù;e2™úù;exä-èSúìûéÈ [ЧõÙ÷Ò‡¼¦~¾NÙL¦~¾NÙ^9‹zþ»>úrô)ýv}ô¡ï)Ÿ¯“¶S)Ÿ¯“¶WŽ@bÞ…?®Ï¾œ€Å½ ]Ÿ}({Êgëäí”Êgëäí•ã·¡Oë³ï§ 1oBŸ×gßJò™úù;e2™úù;exä-èSúìûéÈ [ЧõÙ÷Ò‡¼¦~¾NÙL¦~¾NÙ^9‹zþ»>úrô)ýv}ô¡ï)Ÿ¯“¶S)Ÿ¯“¶WŽ@bÞ…?®Ï¾œ€Å½ ]Ÿ}({Êgëäí”Êgëäí•ã·¡Oë³ï§ 1oBŸ×gßJò™úù;e2™úù;exä-èSúìûéÈ [ЧõÙ÷Ò‡¼¦~¾NÙL¦~¾NÙ^9‹zþ»>úrô)ýv}ô¡ï)Ÿ¯“¶S)Ÿ¯“¶WŽ@bÞ…?®Ï¾œ€Å½ ]Ÿ}({Êgëäí”Êgëäí•ã·¡Oë³ï¯Rµ¬sƆµ±°€ ¡&)UásŸ•9Î.&¨ç&ßûQ,|qú#„¾ëú…¯MÜÕzQ÷Q,Œqú#„¾ëú…=ކ£¾1žÈUi~o¢ôX}ÛUªŽø<Æ{!U¥ù¾‹Ña÷mAã¾—cÝR~’.Áqø­ô»¾ê“ô‘v p‚" """ """ """ """ """ """ """ """ """ """ .r£¾1žÈ]ç*;àóì…$U¦îj½(û¨”ª*næ«Òº‰J²¢Š—æú/E‡ÝµJ¢¥ù¾‹Ña÷mAã¾—cÝR~’.Áqø­ô»¾ê“ô‘v p‚" """ """ """ """ """ """ """ """ """ """ .r£¾1žÈ]ç*;àóì…$U¦îj½(û¨–F8ýÂ_uýBצîj½(û¨–F8ýÂ_uýBϵt5ðyŒöB«Kó}¢ÃîÚ­TwÁæ3Ù ­/Íô^‹»j­ô»¾ê“ô‘v Åo¥ØÅ÷TŸ¤‹°[„s•ðyŒöBè×9QߘÏd)"­7sUéGÝD¥QSw5^”}ÔJU•T¿7Ñz,>íªU/Íô^‹»j­ô»¾ê“ô‘v Åo¥ØÅ÷TŸ¤‹°[„s•ðyŒöBè×9QߘÏd)"­7sUéGÝD²1ÇèŽû¯ê½7sUéGÝD²1ÇèŽû¯ê}«¡¨ïƒÌg²Z_›è½vÕj£¾1žÈUi~o¢ôX}ÛPxÅo¥ØÅ÷TŸ¤‹°\~+}.Æ/º¤ý$]‚Ü ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆ œ¨ïƒÌg²F¹ÊŽø<Æ{!Ii»š¯J>ê%*Š›¹ªô£î¢R¬¨¢¥ù¾‹Ña÷mR¨©~o¢ôX}ÛPxÅo¥ØÅ÷TŸ¤‹°\~+}.Æ/º¤ý$]‚Ü ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆ œ¨ïƒÌg²F¹ÊŽø<Æ{!Ii»š¯J>ê%‘Ž?Dp—ÝPµé»š¯J>ê%‘Ž?Dp—ÝP³í] G|c=ªÒüßEè°û¶«UðyŒöB«Kó}¢ÃîÚƒÆ+}.Æ/º¤ý$]‚ãñ[év1}Õ'é"ìáD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@\åG|c=º5ÎTwÁæ3Ù H«MÜÕzQ÷Q)TTÝÍW¥u•eE/Íô^‹»j•EKó}¢ÃîÚƒÆ+}.Æ/º¤ý$]‚ãñ[év1}Õ'é"ìáD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@\åG|c=º5ÎTwÁæ3Ù H«MÜÕzQ÷Q,Œqú#„¾ëú…¯MÜÕzQ÷Q,Œqú#„¾ëú…Ÿjèj;àóì…V—æú/E‡ÝµZ¨ïƒÌg²Z_›è½vÔ1[év1}Õ'é"ìŠßK±‹î©?I`·""" """ """ """ """ """ """ """ """ """ ""ç*;àóì…Ñ®r£¾1žÈREZnæ«Òº‰J¢¦îj½(û¨”«*(©~o¢ôX}ÛTª*_›è½vÔ1[év1}Õ'é"ìŠßK±‹î©?I`·""" """ """ """ """ """ """ """ """ """ ""ç*;àóì…Ñ®r£¾1žÈREZnæ«Òº‰dcÑ%÷_Ô-znæ«Òº‰dcÑ%÷_Ô,ûWCQߘÏd*´¿7Ñz,>íªÕG|c=ªÒüßEè°û¶ ñŠßK±‹î©?I`¹ŠAAWUWdA‚W_ÀC@,´þ?e—¸Íý2v›ºµhÙEÆoé“´ÝÔã7ôÉÚnê\ ”XÜfþ™;MÝN3L¦î¥ÀÙEÆoé“´ÝÔã7ôÉÚnê\ ”XÜfþ™;MÝN3L¦î¥ÀÙEÆoé“´ÝÔã7ôÉÚnê\ ”XÜfþ™;MÝN3L¦î¥ÀÙEÆoé“´ÝÔã7ôÉÚnê\ ”XÜfþ™;MÝN3L¦î¥ÀÙEÆoé“´ÝÔã7ôÉÚnê\ ”XÜfþ™;MÝN3L¦î¥ÀÙEÆoé“´ÝÔã7ôÉÚnê\ ”XÜfþ™;MÝN3L¦î¥ÀÙEÆoé“´ÝÔã7ôÉÚnê\ ”XÜfþ™;MÝN3L¦î¥ÀÙEÆoé“´ÝÔã7ôÉÚnê\ ”XÜfþ™;MÝN3L¦î¥ÀÙEÆoé“´ÝÔã7ôÉÚnê\ ”XÜfþ™;MÝN3L¦î¥ÀÙEÆoé“´ÝÔã7ôÉÚnê\ ”XÜfþ™;MÝN3L¦î¥ÀÙEÆoé“´ÝÔã7ôÉÚnê\ •ÎTwÁæ3٠׿¦NÓwU9^$}à6ó ™Uznæ«Òº‰J¢¦îj½(û¨”ªŠ—æú/E‡ÝµJ¢¥ù¾‹Ña÷mAã¾—cÝR~’.Ás,‚‚®ª®&È**ƒ®¾,!€†€6Yiü~Ë/q›údí7ujѲ‹ŒßÓ'i»©Æoé“´ÝÔ¸(±¸Íý2v›ºœfþ™;MÝK²‹ŒßÓ'i»©Æoé“´ÝÔ¸(±¸Íý2v›ºœfþ™;MÝK²‹ŒßÓ'i»©Æoé“´ÝÔ¸(±¸Íý2v›ºœfþ™;MÝK²‹ŒßÓ'i»©Æoé“´ÝÔ¸(±¸Íý2v›ºœfþ™;MÝK²‹ŒßÓ'i»©Æoé“´ÝÔ¸(±¸Íý2v›ºœfþ™;MÝK²‹ŒßÓ'i»©Æoé“´ÝÔ¸(±¸Íý2v›ºœfþ™;MÝK²‹ŒßÓ'i»©Æoé“´ÝÔ¸(±¸Íý2v›ºœfþ™;MÝK²‹ŒßÓ'i»©Æoé“´ÝÔ¸(±¸Íý2v›ºœfþ™;MÝK²‹ŒßÓ'i»©Æoé“´ÝÔ¸(±¸Íý2v›ºœfþ™;MÝK²‹ŒßÓ'i»©Æoé“´ÝÔ¸(±¸Íý2v›ºœfþ™;MÝK²‹ŒßÓ'i»©Æoé“´ÝÔ¸+œ¨ïƒÌg²®3L¦îªr¼HûÀ,mæ)2ªôÝÍW¥uÈÇ¢8KZôÝÍW¥uÈÇ¢8KSØèj;àóì…V—æú/E‡ÝµZ¨ïƒÌg²Z_›è½vÔ!Ž(CZÌì$ÚÀIùG¤/9CüXõMØ’÷¸<Ãí9D‚\¡þ,z¦ì_ Q <â ƒm¤Ö? _' %gñrð¥í lM´HKo8ÛxæÌlçA¦j‹KAàq°s›-Í›ê(*‰y`௠móx>£ø,™gs*#"búÖ: Š_“ònÇ(oɲõ¤žÞææV)d§UŠ´TîX$/a¼G l@ÂÛ3”¡(‹©»(‹©» ’9;‡µÖ´;1·1æ?a°¯H%ÊâǪnÅ‹5dòc„Åö@($“ƒkCAwÁi³œÙÓÍié+Ua¿éÔ?é’{Ö è)ÀuL@€Axµ}ÊâǪnĦÿžßÕD‚\¡þ,z¦ìP· Âù¸ÏJém"à ½hç̾ªpðÙ%;_;]«s@#"ßú“e®¼G>~ç›7Ö4r‡ø±ê›±2‡ø±ê›±bÉSPTìªÈÆLáuç5­ºnf¶è6¹ÖXy³…b ÔSK;b–I²Âƽ­7®CÂZni&Á›5žs«CK(‹©»(‹©»o f–ÃSKNæ_–Öào‡gh²Æ€×X> s…òUBö²Zˆ`DvGÙlŽ.7 q}ÐO>p¥ l¡þ,z¦ìL¡þ,z¦ì^$mÉÐI°‘iÂòƒ'ªf¬ÀqÔTHd•óOyÇï^ú€€ð¹®SÈà]}¢×4é\î(ýƒïg÷Ï] ÂÉç·ôr{ ¡þ,z¦ìL¡þ,z¦ìQ"³W²ó>ž6“`/c·ýÂû`š1$Nì<ÎkAÿ{:¹¸ èäÊ#§²W{ µ­þéÿXÏàùìIë+¢|˜FÊs‰¨kš/¸€Ð]xw3Ÿ“ö ¹`•·£t³µ<âÞŽ‚û¯yCüXõMزhž.ÒË<å‘EKq¶–†÷šwYi[ÓczWøHï]¾Û×®Ùn{l¶Ï¶Ìé"|¡þ,z¦ìL¡þ,z¦ìQ" Ìb®¨†š…±«2ÓXxÍÞ0gú7¶â"( wHcŠÖ³; 6°~Qé ,½î0ûNT2‡ø±ê›±|uQc÷p-kE¤˜Ú‚CSt6'>Ëž<ž`Ñ#I'êPMŽf‡E-3ÁuÐZÖM–ÙÍÏfu.Pÿ=Sv,ÚŠÞFTS9µ2³„ù`_´ˆ&-máþù­ðýj13›O!Ë¡‘¡ìg ÉkÊ.½' ®6Ÿ¬% l¡þ,z¦ì_TXÇ=ÜZÑi&6€à¨`ùPÙ%|×ÚÐÀ O÷’¶õ¶sF:s™R®¨sÛS™‚üs4Âé{Cby¶àm¢ÒÜĸæ#6qb†ãj‹Å­àˆ´‹DmçÃà_r‡ø±ê›±D;—}ýG¿‘eMY<˜á1} $àÚÐÐ]Â0Zlç6tóZzJÕXoúuúdžõ‹qTÝÍW¥u•EMÜÕzQ÷Q)PT¿7Ñz,>íªU/Íô^‹»j ŽÇ!­fvm`$ü£Òœ¡þ,z¦ìI{Üaöœ¢A.Pÿ=Sv/†¨‡†ž ñÁ¶Ò?ƒëŠP/“„’³ƒxŠ9xRö†6&Ú$%·ƒœm¼s æ6s Ó5E¥ ð@¸Ø¹Í–æÍõD¼°pW€Ž ¶€y¼QüL³¹•‘1}kPE/Éù7c”7äÙzÒO?ïss+²SŠªÆÅZ*G÷,°Þ#…6  am™ÊP¿”?ÅT݉”?ÅTÝŠIÃÚëZ˜Û˜ó°ØW¤åñcÕ7bÅš²y1 bû IÁµ¡ »„`´ÙÎléæ´ô•ª°ßôêôÉ=ëtà:¦ @ ¼Ú¾åñcÕ7bSЇÏoê¢A.Pÿ=Sv([„á|Ü g¥t¶‘p^´sæ_U8xl’¯®Õ¹ ‘oýI²×^#Ÿ?sÍ›ëH9CüXõMØ™CüXõMرd©¨ ªvU dc&p„:óšÖ‡]73[t\ë,<Ù±Pj)¥±K$ÎŽYac^Ö›×!á-7@´“`ÍšÏ9Õ¡¥”?ÅT݉”?ÅTÝ‹7† 3K a©¥§s/ËkHp7ó´Yc@k¬Ÿ¹ÂŽy*¡{Y-D0H"»#ì¶G€8¾è  §Ÿ8R†¶Pÿ=Sv&Pÿ=Sv/6äŽh$ØH´‹?áyA“‹U3V`8ê*$2Jù§¼ã÷¯}@ ÀxÜ×)äp .¾Ñkš€ô®w~Á÷³ûç®…¿ádóÛú9=†Pÿ=Sv&Pÿ=Sv(‘Ù«ÙNÀùŸOI°±€[þá}ްM’'@ög5 ÿ½Š\ÜôreÓÙ+¿½ZÖÿtÿ¬gð üö$õŒ•Ñ>L#e9ÄÔ5ÍÜ @h.¼;™ÏÉûP\ްJÛѺŒÙÚÆžqoGAý×¼¡þ,z¦ìY4OiežrÈ¢¥¸ÛKC{Í;¬´­Îé±½«ü$w®ßmë×l·=¶[gÛft‘>Pÿ=Sv&Pÿ=Sv(‘f1WTCMBØž#ákéãycIix´Z¶Õ™i¬ ý‰Êh¼•†}Aû½úMt;é~§A“]ú ¦ãKàæà¼4ס/§-xyÁØl¼fȤ´-Kõ: šèwÒýNƒ&ºôgîÁ¸lž“E'ؾr©¤ÛŘkÂÀÉáçZ·êt5Ðï¥úMt;è29M’°Ï¨?brš/%aŸP~ů~§A“]ú_©Ðd×C¾ƒ™ÂxLág`ø Á¸MŽe|9Òѽ­ ’lÍÒºµúMt;é~§A“]ú QE~§A“]ú_©Ðd×C¾”%YøGCG4tùÌgÊto{A$›/YaÌG7ê­ß©Ðd×C¾—êt5Ðï Èå4^JÃ> ý‰Êh¼•†}Aû½úMt;é~§A“]ú ·ceò °vqm‡Ÿ5ƒv܆ÍÞçþŠLßbÔ¿S É®‡}/Ôè2k¡ßA–ükwx7 »í¢£q¬5…Á¸l4óE%…j_©Ðd×C¾—êt5Ðï Év4±Æ×`¼4O×C"ùÊh¼•†}Aû½úMt;é~§A“]ú *§áne[(«`…”Œº¢Ñ‹ÆF-"ÎkÒ(¯Ôè2k¡ßKõ: šèwÐ)»š¯J>ê%*Ž’2)],|¤œ¼4½®6\¶›¤Žv•"Š—æú/E‡ÝµJ«Ã•GKO¡’ôpDzxlµ­þÿÔ‚¾ÃÐÑÍ>E„gsòÞÐI&ËÖXsÍúª|¦‹ÉXgÔ±kß©Ðd×C¾—êt5Ðï Èå4^JÃ> ý‹éÆxÈà¼2lÌ?è_›þµúMt;é~§A“]ú ±–ƒ°ÝŽÎá‘I6ZÐÓƒ°ÙhÌE%ƒÀµ/Ôè2k¡ßKõ: šèwÐeia†ˆÍÿƒ'ƒ™yå4^JÃ> ý‹^ýNƒ&ºô¿S É®‡}G)¢òVõìU誟„q¹•l¢­‚P>2êŠwF/@´‹9­üýúMt;é~§A“]ú ™3)ÞÙ¤½r3}×Z\lÍ€ZIú†u…Êh¼•†}Aû½úMt;é~§A“]ú ŽSEä¬3êؽ i`- ý‹^ýNƒ&ºô¿S É®‡}^*Å,8»&ŠHŸÂLë’0µÀ\E çˆ+B¿ Eƒi@}=\î‘âÆÓSºRÒlqÏÏþÅI~§A“]ú_©Ðd×C¾ƒ#”Ñy+ úƒö')¢òVõìZ÷êt5Ðï¥úMt;è2›,cƒ›‚ðÓ\<"†@¾œlµáça²ñ˜;"’е/Ôè2k¡ßKõ: šèwÐeœk6»á²zMŸbùʦ“oa¯ ÿ'‡jß©Ðd×C¾—êt5Ðï Èå4^JÃ> ý‰Êh¼•†}Aû½úMt;é~§A“]úg á3…ƒàƒá69•ðHçKFö´42êŠwF/@´‹9­üH¢¿S É®‡}/Ôè2k¡ß@¦îj½(û¨–F8ýÂ_uýBاdŒŠWKé'/ /k—#m¦é#¥cãÑ%÷_Ô'±ÐÔwÁæ3Ù %-G|c=¢A7XÇ>G‚ám`>:~¥òìdš±¼’÷¸<Ãí9Pç,Š+õMi‰ï²š+îq`ü—X,qðt ¿v²MXÞK°u’jÆò¤Ù¤…²Ã1{Z „ï—#›HÌo8y€ç±KÝ/ÊY](½y¡ñ‹¶]çquÓÝ·˜žt¡vìdš±¼—`ë$ÕåœÜ'NùÙ]i}Ë>SA%àØÒomÀŒÿmŸb©|ÎcŒ22'²í°²÷÷-ç<àao1±(h]ƒ¬“V7’ìdš±¼³#ÂÔÒ±ïa. a]s\KAÒù9Èî®óýFË­%Ì,s ·3‡A°ýG89ÆcàA5Ø:É5cyP–¾ᨰlm{œúwÔ9îšÐ´ÛmãÑežsZXoúuúdžõˆ7¢g +m—œ½ ÝØ:É5cy)¿ÅCç·õU+&u=ó0èãsÀ<Öj w`ë$Õä»Y&¬o*uQº‰Àª‰&¼Æ¹ÆÙ ÐÖvk æ³ëó-`†2ébtnpnd’1—]võ„—óÌ|?j ×`ë$Õä»Y&¬o*1Ö¶SlpÌb¼Æð·,m¯ -çÎm¼3hðØ3¯ Ž.H¤dN‹…cÜ[cÛk@=Õ¢Òö÷@s Ñ»Y&¬o%Ø:É5cyfÇ\Ù¥¼ËÎ`Âã _zKñ€àH=óÀlÏŸ™L*\çðm§‘ÓC£gɰ4’]zïï·ÃûÃëJ.ÁÖI«Év²MXÞUâx–¥†ÈÆÈç±Àÿ{AOáaJWÆ:IÐãžÆ½Íý·m³Áo…hGž÷¹¡¤’ÛyíúÇBçñGèÜ{?¾zè[þO=¿£.ÁÖI«Év²MXÞQ*Ñ9Ü7÷²Ì×½· _ÝØ-ºë3¸€~Qç9³f ×`ë$Õä»Y&¬o,ã„ÊfÏ4RDÇÄ%eâÓy¦è3Üîoug?Ûg¨«[P‚'Jû\ Xö,»i½zïï7˜þ÷Ú‚ýØ:É5cy.ÁÖI«ʤy–ŒkìšAxXë·K¿zË9³ÛžËlÏbªÌ#p5ò9ÄÊáÁ‰ Þ 7ZI-m¶¿šßÔ”5nÁÖI«Év²MXÞPFöË$e¥hsIZ´ÁzA[ WÁƒaàI+¦¨Š­º{€´›O0´ý|ßZ· º‰´ó «»Æ ÿS¦öÂèiûáóì” šDƒ¶'Í"?ÁÛH‚^ šDƒ¶'Í"?ÁÛ:¹L0‰#ŽÙÃ$‚Ö°9ÀsŽ`mç^iê[ ‰ã¨®‚X™`/y 6À]œX†Ø:É5cy.ÁÖI«ʵ3œú*W½ÅÏ|½ÄøIh'þJ‘Ykán‹Æ×¹Ï§}Cžà9­ M¶Þ?ežsZXoúuúdžõ‹qaãÑ%÷_Ô-ŇŽ?Dp—ÝP:Žø<Æ{!D¥¨ïƒÌg²H%—½Áæh¨CZ&2›opf1Ÿ5…Í'Ù 6»`ì%Rj*Ù;ä°4YU+@ÀpýºJ­É £Ïëso Øt-<#­p{Ìd8òK ‹HÍÏk­Ï›72ð)%•ÆÛ/ps äsŒäº‘Ž`9¾²²¹#tyýnmôäŽÑçõ¹·ÒÆÜLl*"„]²䱤µ¡¢ñ²ñÌÖŒÄ ßY^O 6p—bl ²ðù\¤æú5×Ô?$p.?­Í¾œ‘Àº<þ·6úXØlE´¼©ªºxPE–Xóê÷‡¤¯±ÁLlq™ZÆÝ^Ø 'ÁáæÍ`fcrGèóúÜÛéÉ £Ïëso ÛÆÙk‰Ïi6týCý–#þCþ™'½brGèóúÜÛêÕÁ¸2¤ÔÒÃ#e,1Þ|ïÉ$,s„Á½7ø¨|öþª #dÑ>)¬{K\-çzà¸îCœÞäÞkËH·5 Œàýc:Èäfÿ?­TmA¨!i‘²Ë-DÒ %¯{@µ®ÌÐ3–Ž{lؾ6¶N9fŠR÷8Émë X´Ü7ëYœŒÀ_çõª©È¼þZ¨Ú¨ÔŽbŽ(˜$¹±È/8nÀÙÿá‹~Ò ‚ŠFØùf²!,cïðv9Ži±½Ï9ï[øÛK‘˜ üþµQµ9€¿ÏëURÆ«ã!Κ¦IÒ$²o1Àe™ŒmÍeœöÚ¡}3h¦{šãxÉ,’€ç[w6hÜ?q¿º;ž|åPä^ÿ?­TmNEà/óúÕFÔ±ÂØb†!+Þ"cYh°]`o5–Ùh·¥}ëZ-s¬ë-'§0 '‘˜ üþµQµ9€¿ÏëUTbѸ>ö|õзü,ž{G,œ ñS k›HÙ%k/I"G\IÎA9óçðs+5¸— Àcž"Ö†‰¤`$ƒœ†üÇŸšÓÒ‚ÂŽ8XɸRùžà\X×8]ap žkNbï ™ù³™ÈÌþZ¨ÚœŒÀ_çõª¨/ÁFØi¡kæ–IÙ lÛ#-¸ï’G3˜ÞêÞçë*gÇ“SV^‘Ò5Ï ØHÎÛ |–ó7Áõ••ÈÌþZ¨ÚœŒÀ_çõªªn1,NÀEmÀ]iÎÂÌäç9œOÚ£Š61µ¹ áæÞ-¹lÎÒ?í4ó,ÞF`/óúÕFÔäfÿ?­TmA®@/ü¤ÌçÞ$]°H´çÎM¶ÛÐÀ.µ¢×:À.²Òzs²y€¿ÏëUS‘x üþµQµA3wŒþ§Mí…ÐÓ÷Ãæ?Ù+›ªÅü_Áš¥Í‘ïÊbdM;ûÂðlq²Àsçèðó-ºˆŸ5<‘GQ-;žÒÞ+·š=–‚9³sxPH‹“²ù 뙸œ—Ëøg\ÍÄN`{¢´,r½Ëìÿ…æXÝ,²LéI˜˜K …·Lns…¹ó‚HÍ››còv_/ás7“²ù 뙸ƒbš šI$Ê#ß?ݺ ÍýÙüBûF(`‹…±FÈûÞrÀÞŸ …¿bÆäì¾_Ã:æn''eòþ×3qØ5¡Îu‚Ò€ŸkJú°ù;/—ð雉ÉÙ|¿†uÌÜA¥„¾j¬û‡û%WÅï£X+Ðáö¨ìZ{ØXü=†× 2ÆA…­GJÊzH‹ŒpFØš]ÎCE‚߯2 Ñ@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@RËÞàó´å£[‹X7 LÚªÇHdsl)™ H°›{yºmðª//…­s£.¶ÆHÉ,ËK\?E“ÈÌþZ¨ÚœŒÀ_çõª¨4Ý Oë\ó|’ÂâÒ3sÚësæÍ̾¾.ìsª«Kš×4¼È×9ÁŦÌí 9€ÿ•—ÈÌþZ¨ÚœŒÀ_çõªª!K’"Þ±DøÞÈšÿ“k.€NkNf4sÙšÛ-ξ2–(ãc#’xËZ^×6ñmÈÛfv‘ÿi§™gr3ŸÖª6§#0ùýj£j fµ‘ÇQ‡Gcmãi± o7Bú²9€¿ÏëUS‘˜ üþµQµAþCþ™'½bÜXÔ¸3`Œ:È(ÚóY%3ßxË#Ãc`#åžrlæñO7‡eaãÑ%÷_Ô-ŇŽ?Dp—ÝP:Žø<Æ{!D¥¨ïƒÌg²Hˆ """ """ –›üT>{U–›üT>{U£>jî õ6ÕSµñ:ìt×-’O×f7…–—>Iæð©Ä¿ÿššJÚxÝÜ„Gyî­q=Øé>‘ð¹Ô5”í™ÍÊœââ` ΜýÉ?î¤VTTª„PM1Æ $Ùu­²Ûàs7£Â¯À†:‚ú‡4‹"´²7æ±Ïm…ÂÛs÷BÀnncnoqQÅ€‡I°‚éKÜm'¾XÂë¢õçŽl׺Wªjs ágº„qµ±\ä\´›ÆÓe½9= | °áš×Hš¦H˜æ–÷‹AqÚpAÿ3zT´•y[{] 4ìŽ×´5Å¢Ó70=Ï…K,P¶ëcís¬Äe¤Ø:]q¹íýÖô/P2h¢àXào=Ü„ç¼ç;;¯ÙÎ|_¿Ú/!¯°[+vÒ#í~÷áÿì/J ö|õзü,ž{G'±Yïp¨§¶Y#œHð9ßý¡@0•#¡pÀDl!îi 633ØH¢Üö+7ž #‚.6ÏkßþëÙxe;Zê;Ò¸Šhbˆ|ž{‰ÇÛ½ŸÅ‘Wº%sÝÍbq5½ÈŒÄoé Û§±±÷‹ƒì ¸ ‹íæ° Ié̾pI+' ’G¼¹ÏŽø pÁxZmˆg·ÂWÉéšúh颵‘µŒ{o€F|Öæ"ÂtU c\\ÜÖ½­%‚Þ`\3msÚ:BðÚÈœáÃ8HÖØÚw—8:ùšÒa³7€ž…3"tr’Ú©8;âCl`Èçµ½Õ¶4Áû¦ËOÕd-¤’9)¸š #Š7=ñÚd2´›/ m/ Sà{† M<‘±®²65å×NkK7É ·˜çç͘©”qSˆ~K&68 ît}Ѿç›ìÝñãœþï×o¶‡f.x9 2ÌöæÏoGâzbc7xÁŸêtÞØ[‹»Æ ÿS¦öÂÜ@DE²÷¸<Ãí9D¥—½Áæiʈ•j¹ø3Å^ò×K(´49Ý#9  ²¾ÿÔA-âÓœá`ç%ŽoûwVÿ² ñT´Àe2 Xe1Fø˜O lä´[ÎFb{“Íà6­¦Im$µ¢0ÖµŽ/.qx"èÏh¹Íe£=¼ËÔÔœ—ÈY$†s7÷Ñ ÞÃ, Ÿ•`Œã=‹Ëèbs@¶]¹u¯¥o,ámþì,þôØ-ç’UøÍLmhq]ÎI¸†YÏ{7ɳÃm–gè_ d ¿kÏÉ´[tØâ7Æ ,ç s•N Ž¢.ü!¼ŒQ´†ZI&6‚;®|ç0Î¥¨¤lóUÈéK›4â'F.›/çù\ÀX,ÍÎM€‰ð%d‚@l×´µÍ?X9Ækû¯KÌQ¶Dlàì¼\Dp6‚@š-èÉ+Ò 7ý:‡ý2OzŸ°ßôêôÉ=ëâÃÇ¢8K[‹~ˆá/ºþ¡ t5ðyŒöB‰GYVYYÀ²šY\Øcy,-,ätU7“ê{Qï ´Š®U7“ê{Qï¦U7“ê{Qï ´Š®U7“ê{Qï¦U7“ê{Qï ´Š®U7“ê{Qï¦U7“ê{Qï ´Š®U7“ê{Qï¦U7“ê{Qï ´Š®U7“ê{Qï¦U7“ê{Qï ²ë÷O#¢}Ÿ&F€KO€‹A¬±9;/—ðι›‹K*›Éõ=¨÷Ó*›Éõ=¨÷Ðfòv_/ás7“²ù 뙸´²©¼ŸSÚ}2©¼ŸSÚ}o'eòþ×3q9;/—ðι›‹K*›Éõ=¨÷Ó*›Éõ=¨÷Ðfòv_/ás7“²ù 뙸´²©¼ŸSÚ}2©¼ŸSÚ}o'eòþ×3q9;/—ðι›‹K*›Éõ=¨÷Ó*›Éõ=¨÷Ð|Á˜:,ƒã£†I$c zB/çls“àL!E-tL‰˜B®‘¡×ŽLæ´¸ø-%¤æ´óYÏö/¹TÞO©íG¾™TÞO©íG¾ƒ7“²ù 뙸œ—Ëøg\ÍÅ¥•MäúžÔ{é•MäúžÔ{è3y;/—ð雉ÉÙ|¿†uÌÜZYTÞO©íG¾™TÞO©íG¾ƒ7“²ù 뙸œ—Ëøg\ÍÅ¥•MäúžÔ{é•MäúžÔ{è3y;/—ð雉ÉÙ|¿†uÌÜZYTÞO©íG¾™TÞO©íG¾ƒ3“!Ó@ùð¾¨l2²fÇ,Œ-.i[ò>¥ºªåSy>§µúeSy>§µú HªåSy>§µúeSy>§µú HªåSy>§µúeSy>§µú HªåSy>§µúeSy>§µú HªåSy>§µúeSy>§µú HªåSy>§µúeSy>§µú HªåSy>§µúeSy>§µú HªåSy>§µúeSy>§µú HªåSy>§µúeSy>§µú HªåSy>§µúeSy>§µú HªåSy>§µúeSy>§µú HªåSy>§µúeSy>§µú HªåSy>§µúeSy>§µú HªåSy>§µúeSy>§µú HªåSy>§µúeSy>§µú HªåSy>§µúeSy>§µú HªåSy>§µúeSy>§µú HªåSy>§µúeSy>§µú HªåSy>§µúeSy>§µú HªåSy>§µúeSy>§µú HªåSy>§µúeSy>§µú HªåSy>§µúeSy>§µú HªåSy>§µúeSy>§µú HªåSy>§µúeSy>§µú HªåSy>§µúeSy>§µú HªåSy>§µúeSy>§µú HªåSy>§µúeSy>§µú K6»Í]QÂñƧhhkbìkZ;ó’s“ÏЬeSy>§µúeSy>§µú ÞNËåü3®fârv_/ás7–U7“ê{Qï¦U7“ê{Qï Íäì¾_Ã:æn''eòþ×3qieSy>§µúeSy>§µú ÞNËåü3®fârv_/ás7–U7“ê{Qï¦U7“ê{Qï Íäì¾_Ã:æn''eòþ×3qieSy>§µúeSy>§µú t ”XG.}}mTÜ„ek€i žfƒÎе•\ªo'Ôö£ßLªo'Ôö£ßAiaãÑ%÷_Ô-,ªo'Ôö£ßYXÔé%ÄÜ*÷Á$!±òËM¶Ÿ„ô$ ©>y›Ñ`ÿïR¯®¦•ØNY¾@c©áh.{E¤˜Ÿ¬)2wøÑë[µ$DŠ\þ4zÖíLþ4zÖíA)rwøÑë[µ2wøÑë[µH¥ÉßãG­nÔÉßãG­nÔ"—'µ»S'µ»PDŠ\þ4zÖíLþ4zÖíA)rwøÑë[µ2wøÑë[µH¥ÉßãG­nÔÉßãG­nÔ"—'µ»S'µ»PDŠ\þ4zÖíLþ4zÖíA)rwøÑë[µ2wøÑë[µH¥ÉßãG­nÔÉßãG­nÔ"—'µ»S'µ»PDŠ\þ4zÖíLþ4zÖíA)rwøÑë[µ2wøÑë[µH¥ÉßãG­nÔÉßãG­nÔ"—'µ»S'µ»PDŠ\þ4zÖíLþ4zÖíA)rwøÑë[µ2wøÑë[µH¥ÉßãG­nÔÉßãG­nÔ"—'µ»S'µ»PDŠ\þ4zÖíLþ4zÖíA)rwøÑë[µ2wøÑë[µH¥ÉßãG­nÔÉßãG­nÔ"—'µ»S'µ»PDŠ\þ4zÖíLþ4zÖíA)rwøÑë[µ2wøÑë[µH¥ÉßãG­nÔÉßãG­nÔ"—'µ»S'µ»PDŠ\þ4zÖíLþ4zÖíA)rwøÑë[µ2wøÑë[µH¥ÉßãG­nÔÉßãG­nÔ"—'µ»S'µ»PDŠ\þ4zÖíLþ4zÖíA)rwøÑë[µ2wøÑë[µH¥ÉßãG­nÔÉßãG­nÔ"—'µ»S'µ»PDŠ\þ4zÖíLþ4zÖíA)rwøÑë[µ2wøÑë[µH¥ÉßãG­nÔÉßãG­nÔ"—'µ»S'µ»PDŠ\þ4zÖíLþ4zÖíA)rwøÑë[µ2wøÑë[µH¥ÉßãG­nÔÉßãG­nÔ"—'µ»S'µ»PDŠ\þ4zÖíLþ4zÖíA)rwøÑë[µ2wøÑë[µH¥ÉßãG­nÔÉßãG­nÔ"—'µ»S'µ»PD²1¿è>ó[ýVæNÿ=kv¬\ra0¨s™ikH x==jGØü9ØF¹ï/}eCœãi&WOâ¾eõš\úˆ¶†_Y¥Ï¬)—Öisë "_Y¥Ï¬)—Öisë "_Y¥Ï¬)—Öisë "_Y¥Ï¬)—Öisë "_Y¥Ï¬)—Öisë "_Y¥Ï¬)—Öisë "_Y¥Ï¬)—Öisë "_Y¥Ï¬)—Öisë "_Y¥Ï¬)—Öisë "_Y¥Ï¬)—Öisë "_Y¥Ï¬)—Öisë "_Y¥Ï¬)—Öisë "_Y¥Ï¬)—Öisë "_Y¥Ï¬)—Öisë "_Y¥Ï¬)—Öisë "_Y¥Ï¬)—Öisë "_Y¥Ï¬)—Öisë "_Y¥Ï¬)—Öisë "_Y¥Ï¬)—Öisë "_Y¥Ï¬)—Öisë "_Y¥Ï¬)—Öisë "_Y¥Ï¬)—Öisë "_Y¥Ï¬)—Öisë "_Y¥Ï¬)—Öisë "_Y¥Ï¬)—Öisë "_Y¥Ï¬)—Öisë "_Y¥Ï¬)—Öisë "_Y¥Ï¬)—Öisë "_Y¥Ï¬)—Öisë "_Y¥Ï¬)—Öisë "_Y¥Ï¬)—Öisë "_Y¥Ï¬)—Öisë "_Y¥Ï¬)—Öisë "_Y¥Ï¬)—Öisë "_Y¥Ï¬)—Öisë "_Y¥Ï¬)—Öisë "_Y¥Ï¬)—Öisë "_Y¥Ï¬)—Öisë "_Y¥Ï¬)—Öisë "_Y¥Ï¬)—Öisë "_Y¥Ï¬)—Öisë "_Y¥Ï¬)—Öisë "_Y¥Ï¬)—Öisë "_Y¥Ï¬)—Öisë "_Y¥Ï¬)—Öisë "_Y¥Ï¬)—Öisë "_Y¥Ï¬)—Öisë "_Y¥Ï¬)—Öisë "_Y¥Ï¬+ã«jžÒ×TÌZE„ „" ÿÙPythonCard-0.8.2/tools/standaloneBuilder/doc/pic4.jpg0000755000076500007650000026015110231140007022413 0ustar alexalex00000000000000ÿØÿàJFIFÿÛCÿÛCÿÀJX"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ûþ ÿ…ý¥ÿàžÿ´¿Ãÿ‚_¾~Î^!ð޽û7ü/ø£}ñ;áv¥â_Gâ?^x×HÕ!SÑ"øã?éÚuÖ«¤x‡A²Ôå´¼ñ„üY¡ÛêÔ<çöYÿ‚c~Ð>¸ø›ðá·ÆŽŸ¾Á>þ xçöHý˜Â>/|^³Óþ8ÿÁL?mý¡¢o€_ þ=þÌÿ¾-Ã3ø×PO…gYÓ?hhü௠jßðšø¿ÄÿïGƒ³ø'ûÁ 5[/ÚoâïÆ‚?ÿg¯„ß²WíŸáüyø_û[YþÓÞ ø÷ðßö?ý¢ÿeÅðÇÀ߆íàŸƒ÷^!žõo¿mOÚø‡Àw±jzÄè¾ øSNÕ~'øöÿOÕ µñ‡Éÿ¿fo‚_±Ïü7þ ]û5ü+³Ñ->#|+ÖàœWís'†õ‰:÷‡5OÚÇXø«áÏ|Bñ©üJ†ÚâmÅ~×>x—I‡Âz~á->ÇU‚ÂÃþ"µñ‹§}f,ð³‰Å`¨p hâ°Ùf#2ZÁ:YC ‚¥Ž«Eâ©cqJt1ydêÊ©C7Ë*'8âá%ä¼GR§JµLö¥S :öU¹ê§:Ò¡ û)P¦Üe:8…)A·„ħÊéK–ÒÁÊ_·kŸ„?±¬`n,৉à åpw|H”Ä¥†ô\$¬Í žÓF/ø9öè½ðö8Qßþ,§‰r:`á¾#.AËv²íÕÏŽÛô&Oˆ¿²ÿíÏÿÑ¿à™ÿ4ŸŒ¿µa²ÿ‚˜ÿÁ@~+x«Ç_óÀ ð[áï‡>|ZÐôÙGö~ñ?ƒ~2xïâ=ïÁË?‰´5öâo‚<ãÀ> ŠãáѼ»‡Â_~¿²‡ìqûPü7ðÏņ?±~³ñKTñ7üOöTý–~%üñ'ÆŸ¼Eû:~É:¯Á=‰_µ¹ªü¿ø®èÚ¿Å?‰úg޼M©|Jø‰á“ð;Â׺Cø7Á^ðΛáMVÆNU—xqK S™xt°2¥‚Ëó ûF¶êÙ¶/„ËÜjã1¹n"3¯ý™Œªþ³‚ÃÒ…:qQ«9â0±­¤ëñªÂn öªU«Ð\ê¤j{L-,=LBp£G FšÄQŠöujMÊNN1Tê¸rƒþBý¹OüÒoØätÿš)â<Œ€{üHrG¨Ç8;‚Oü}ûr8b~~ÇgŽåø+â=ªDR8 ÄW9%r9QµqPL‘}‹û,~Æß±?ÅÏ„¿¾ øŸÄÚÍçìí£ÿÁuþ4~Î:OŒ4¿ÚGÇÖ¾ ý¡ü àÏÙŸâç> k~#Ñàñã~Ï÷¿¾1jÖ þAñ3àŸÃ¿‡~2ñ€ît ü>Õôø‚]{Sò~ıߎ>&Ad¿°ßí]ðŸâo…ÿbÛGâgƒþü{øQñ¯öpø]ûaþÑßíü9­|ðoÁ‡:ÿí/ñóö—ñ¦·§ø?Æž!Ô>)øá·í!g«jsxÀþ%ðí§‡ô[ÿ躛XO #_†«ÀÒ…L,jÕ“Xjj„>¹ËQÊ®aAÓœþ¥Sžœ—û2«Fx™Q¦êʉœPéÑ©íIUq‚½I]T~ÅJ)G>ekIÂj’›äSò˜¿àã/ÛÉ ð£ö=¿¼Fv¯˜Ê¬Iøƒ‚HÎU„{Z)…18´º¿ðqOí¸@Ýð£ö@SÆGü)Á?W dà§,çõ7ú7ŠWþÿûH|8؃CðÿÄÏÁC£ø…ñ#öd·Ð?jd׿dŸ‡>#ý†­`ðÿí7©x?Xø±yñ—Â9ë~"Ð|Yñ÷^ñ—Á›Ûûï%χn´=3JÒ<5wþéã_†~:ýœþ5ü*ø³âm_Âð~ÁþÿÁ`þé~ð¤º÷Œ<}eû9é_Øß|%«É­ê:7‚îtkéð×ôÖñüiý¦‡ìýwðûö¥Ðoÿjm/àGìÏðWÆ1ðÖ‡eñ÷öÈøÕâ_‰?gh<_ñÖMNÁWáW‚<ᘾø;Z»ñï‰áñ§ào†:o&á¦*t(âxƒ«Šx'„:”êQÆcó¼±)b«`kÂŽY3Q•iÔÃÔÃ,‰¢húwî5 [WÕu ›{7M°·žööòxmmà’yDcôgÀÿðIoØëXø—ðNñïìëâß ˆnoŸ²÷´¼'ûA~ϾøÙà? ~É_þ)øgâ7ƒô¿ˆµGíñÄ>·ñ÷Âë KáÇÅoüSøy¢ø¿GÔÖ8,.´ªÖ£‡£‡UqØœvF¬çšFpöµ2üMyÔäT¡‡P‹¨±uiaZRâšu°ô«ç<޵JQŒêT©ËB޵iÅGÓäXŠtÔT¹ÝKµcRq­ÿÁz¿nß kºç…¼YðKöbðω¼3«êZ‰bÊŸñwünrWceÎÝÈw&ÒŒw¦ß6™-†ãnÞÛ>uýâ/'ìë…;6º?-c–'ËÓþï áÏâ°8,[á\®œ±X<6&PŒk8ÂUéB£Šn­í6“vm-WoÄ9íõ©G4Å5N¤é§x&Ô%Ê›µ7fíwk}É[÷LÁ}¿lrä˜þʺ|Õ¸çÿÅuŸnƒ‘È8ŽAÿóý±ÏüÓÙ@qÿDsVàã8çÇßòç!Ôr8éŽ w§è0@ávâ”cøqÇR0GÊ8ÿV¾œžÛqÆ6¦ñðË€¿è—ËvŽð­Õ+ÿËÏ^Þ‹u•>%ϯ™â^½áÿÈy/»um?s¡ÿ‚ôþØR0 ðÇöURX‚?áNjß(Ý(“ãNX%€S“µ Ïg}?à»ÿµóŸ†Ÿ²ºž7ðwTr3ÁÆ[ÐåP‚¬# D?‡V«†Qµ× ÷Yx_žCÉòFçýÞ[ƒ·ÉÝ”ò¼Ý?f!…Q‚6„ùJì òW÷0är6¦Æ ¸‹ËÙkðË€”´áŒµmökw_ô÷ÍÿÁ¶™Ï‰³ôݳLR³VÖ;_þ½¾Ë«Ñníuûd?໵é?òMeÓ#þö¥‘œsÿ#Ÿ äã§Ý9ÁÜxÿàºßµÛ»á§ì·Ì¿µ"»ãð™ÄíÈ$ Â0b ´‘~((äqŒcŒr9NŸ'Ý8ã¦6㸊Ô# [k¾uòÿtí…QË|»Õ·&ÓÉ2xgÀvñŒe»¯³[·ý|_×N‹UĹó‹ÿ…QVÍ1+Nð]÷cÙtV²Õ²«ÿªýªÈ¾þÌÊq–ð©.ŽÓó‚>)@Ø*?»£yŠEÿ‚ÓþÕ$àü<ý™ÿ„w?/ÍŒŸøª³Ó äã÷‚Çè×hQ°&ÕsA…>\y+Œg+À'äÛ˜l ç§B:t0#oN1Œ.wËŶqðÛèšË¶f¯xÿÓß7Û׬bŸçî×Í1O^ðÿå~KîÝ[OØ(à´µ<¹'áïìÐ#'þ-ÈÀ(N@o€Ø#'.˜UbÅTK$qÁe?j'o‡¿³rã9ÿ‹M>AØp|F2ÌAà€ :«—X¿-©Ø¿)O™†>LåO”ŸÝÉýä{Uwf?/͵޷\ ù{pɌƜä¯ÊÛr>îÀŠ›cÛåÁ5<7àeøÆ²å§òÖ]¿éê×îë£ØUxŸ?‹Ó4įG˧/’éÛn¿®_ðøïÚþ„Ù¸uÎ~MÀùñÉñ £ íÆ%~*Aÿ‹ý§‰ÁðìÞ¼wøM7HÏüT™ùº.@Á9P$0þK㱌œc§ßä‹óqór»qÕ6þât#€0UÎ2'÷ÅŒ' ±€9ËÝl£á¿5ÿ$Ö]·òÕþîÿ½}ßUèʇçî÷Í1[÷‡ÿ+òìöÙ[Üýs‹þ ÿûM;a¼û:uÁÛð¢S·.N¼ I*…]`¤\-¥Ñÿvý¥ˆçÀ³¨ r–;N•É׆ìc®#¨6ÏÉ»tÃ(òñµ‡ >TÌ‘ó!~S·‘±6H a<ºv². ª»WTd&¾@|µÈàáx…Çîò—‡<­n˵µýÚ½Ußü½}»m}“lÆ\SÄ Zf¸­ÿšø|—ݲ¶Ÿªcþ çûJwð'ìì9?óJË÷ºÿÅ@@<ºÀãç1Z‹þ ÙûII×À¿³À鸅,6®íl#àÈ€ bí¬ïkùT@0On$üÃh猞6Ÿ»³0h[/Cµ~R§%v˜ùc¸7’™—wúÔÙݺ#Ͱ‡gÿÞ_ºû5ºßü¼õêúè—ëâ|ýA¿íLMÕµ¼<¿¹§þK·[Y~¬Gÿ`ý£œe¼ û>§LçáXàíR8:Âä6[i;HÚª¹‘!°?à«´Yÿ™ö~¹øV™{×ZPqŽyHù¼¿ËËtÚ£÷{1ÆXr¹HøÈO‘öüƒåòÂ"ìg•my?‡õà½ßbdñƒó c9]¹‹'á×s[ý\Ëíå«å×Ú¿Ïî1ñ2_Ú¸«[¼;ÿ¾ž[o§»úwü_ö‰v øàùXü¿ ÓªÇ'Ü9ʨùNæŒyŒ_ðT¿ÚÛ à€`goÂØþP\¨-»SRxà‚¨UІۋ…³ü¼ˆeÊNÏL„nHòäé·®ÕÚW;¢Ù¾ßjÝ0Ã÷`m`~Q€Ÿ¼Q¸³Ç×flMŽ€~ïÈÛ¦’ðë‚-øÇ2ÿü·dÿçïvûöòZOŠ8%lׯçü ²ï²Õl~›'ü ö‚#Ÿ|Î9Ûðºà’3ý«’28$.@9 ól—þû@ЙðzÿÅ­ƒ€sŽºªäñÈ8Æì|þ_æÔc  a@Âò«…<“ Æí\κ°@0sÓ÷"òqó}ݸþ ¿¹Î>ðKµøs/Ýýš»&¿é÷êÿĈ‡ñß5Åtë'ü·w·exþ”§üßãó|ð%?¼á|A™G;µV9AÆå$…Ìj'kMÿय़Ÿ–ðgÀÄ;³ðÂÛ áHÚù7)ËsFÐỦæÄ)‚¿»Û·çhðÒò[È'äÀùÓ`F}Ðù>e†Õºmòöà–tÊGò§î"Ê6Üõ6"mg•mðó‚’Mpî_ðßá«øþûü½{⎠W¶kŠVi/z=ãýßÕÛ²¶Ÿ¢£þ Oñߟø£þñŸù¦Ÿ.7pßñ0ëÆOAÁÎ>m“§üã³σ¾q»‘ðÂÓ #ÓO'nîv#pŘöÿž uãÏo»÷¾÷ÉÉã9ÀÆ:®ßÝZ‰xc°ð2£äsÈòŽìÜɳËc˜¶y–‚ðó‚¹äËïoå«Ñ¯úx¼úkײ¨ñG;ß5ÅZëíE/Uÿ¥y[K/ÑH¿à¢ÿœÞø$G ðÊÐàU2OÚ3÷Xä2džƒmap–·Gü?ãqw„¾ «c$†v Á$ö HÈÀ%W=H^vþ|[&<°¸e;BäßÃÏü{|¤ìÉbØP¯îüŸ/OÖAµTmTÂcjŒªáXmSå¯Sµz…ÇËŒ¼>àÅ'nÀtû5_EÞ«þ½I|QÄ_ð«Šû?j+¢þê캯‘÷·ü<3ãg9ðŸÁaŒçþ-–Ÿ2þ·k’6ŒŒŽ’£yŠìðP?NÀ7„¾ Æ Ãøiaû°^UËfE ·hÜ\l±EÏà01ž6ã=¹\ä|«–瑌•Ù˜5-“k¡òÂmu9‘ÕbY>fÿFMÄlÃŒ»Y³‘»N©x{Áj-®À^Ë¥[ôÿ§_’~]ïýgÏì¿áW{7ñG´-ö>íÎÖ_|Gû||f~O…> ¨ÀÏü[]<Å#`‘£$eœà©@ ‡.‘N?o?Œg?ñK|ã?óM4¾0¬pq1çŒö8ä¯ÃvéŒ-FFí»s ¸Ú£ìÐeϘñ´Æ‰µqåAp¼và|®p~SÏŒyyy×pmíþ¯à:}š¿ü³Ë_ž‹WqÒþÕÅàPòþç’û·[Ÿp'íÝñ…·gÂßøÜK†º^Õ&aŸœå‰@H%¬rodcÛèÇûqü\vÁðÇÂ.ª †ÚfäE]íòŸ”†` „`з˜#?iK/†c^IØ~PÇ8ù÷sÝÞ6ÌžcòÄlwE³Ì´Ü~e~ë!Û³æOÞÛÌ~Ì~CåíEÄ~Yˆ°y>^˜êxÁªÖáì»W´jöÿ¯’ü×]µµÔ⎠I[5Å-VÒ—÷nëÑtûX~ÛOüË_ ¯ü[}®ã$dryã¦1œ…ü6ÇÅŽâšøKÆæ›èÿ.­îqžÃç•øåG°é¼'Ê¿*åN9>  q…˜¼>ïÃ|‡,qxÀF2™Ã€x9Úü?ÿÀjö_ôñ}þ¾òÕ‘OŠx…ïšâž«¬:[þù~ékËöz~Ùÿ†ð߈Ž[;þhøA¾e‹$`”“ @ò¤,Ȇáì4SöÄø àáÏ…ŠxÈ?4`!ñ@„€º©HpŒ²¬_[˜1íbq"ñ%”îcåC¹‡•™y|Û¢ò|Ý+j„Q† Ã&п,=‘ËÆqµ6¶Sy~]¶rà.MÂwÒ®×÷×O>úîÔÏŠx†-¥šâ’ÒÚǺïO²]_£Ýýh?l‰øçÃß ¯ü[­ óÇý3{ñîÈ#ý®þ&6wxwá€%™~ègh +·Èù›ä ÈGÜÈ¥¤‡äÕŒtéÛ§å~0¶á;¶ºíïQ¸Ç„˜åG•̃nä;“·Ç·Í€ÿP¸=Á·`n•þ«]?éâíÛ{é't®QÄwÍqZ%»‡—÷eÕmëo®¢ý«¾$?ÞðÿÃ1ó0ù~ègn(6}·l•*Q‹¤en#´´?jˆ½ô/†cþéç‡ûãUõ9G—§h¨À鎜ÏEヘàmÇðíÄX¾á ÿȇ²{UÞñ_Ïýk¦éBâž!Óþq[­Ü?»Þšùüµ‘ôÂþÔŸçAøkø|<ðþÿŸCõÇç•чö™ø!ù´‡KÉ ?á_xxÿxé–ݧŒà. 7#ÁEÇØþ\AÇÝÆa>^Ÿpúd}Üü8ÊmZ& -†×<ƒïØ|߸MØÙ´œ/Ì·¯‘»Nsà>QOûⶪ·jÿòñkò¾ú-JÿZxƒ’?𫊿{Âú[¯"}O»cé…ý£üxÀ¢|;€Jÿ¾ðæS#<îÓÕ±é”VàîU;ÄrÃFxëþ€ßǯü[ÿ qéŒØ ûž1Žqólùî!…Œm# ¿.Üá~ðòcã”yi·ÙÜAdzÀ/…;W ãžFíŒGŠà^ÿ¡ ~Õ»ý÷úuÑkbQŒ•1ÂlÄ>á5oøCÁnºTÚÉÿÏß=uù÷Ê\UÄ*JÙ¶+oæ‡ÿ#¦Ë¶Û­×ÑZˆ<_®è«®É¨|'ÐìåÕu "µZIs=Ιi¥^]º&‹à}^4"Ö,•Zy`‘ä2…‹l{ާö‡‰èmø'ÿ†òÿÿ…x§Š!ðlÿ³ŸŠ-þ"ø_þo‡Ó‹ðøëÁð‚j¿á-ðlžðjxŸÂÿð¬´-ÄÚßÄOíí¯´¯øA4 xƒUñwÚÿáÓôZïP‡O¸þldÙûãÇ„><~ʾ*ý¨ÿgßÚ‡ÄðO»_k³Á4ÿg¿x–ç㟌¿àž2¿¹žoƒ¾'ý¸>xkáŸü&ßò$ÿii?³W޼{ñ+ãž•ÿìÒ¯í~üS×|?âÛ›‹ü‰ñØ|§ˆ3l» “dqÃ`± W:•}:–súÌ9¥ÌßÙ^ëjÊ_­äJùŽO—c±9¦lëâh*•\1jæskÝŠ¤ÔU¢´¿áªýtý¹?h¯øX_²íáá/ ê,Ÿðª¬5…'ñ‡<aáXõ-thÿuÏØèZÒ4oI¡®—ãÏøDõ§¼±ÒV»´ñŒ0jž¸³Ôõ’¾8ø­ÿ&Ãÿoÿ³‚ø“ÿ¨§ìýEyù¼(ª˜*´pô0¿YÊð8š´°ðté{j´Ûœ£)8ó5{]êzyDªû,e:µëb>¯˜b¨S©^ju}•>NHÊIFü·i;l~rÁÈ^ø?«þÜß .¾ ~ÔßþkIûü·µð¯Ä ~ÓZæ¹}¦/ˆ>'4>#´ºø1û9|^ð²iwW“ÝéÖö÷Þ%°ñwz>¡%Ήkc6©ß~CáÙŽ2 ÿ‚ƒþÊ‹‡Ü>þÞÛAócmÄâ±e²ªÆˆ… ´ûè·üµÿ) ø#ÿfðÿS¯5ü¹×÷Ç„ü6ñžpŽ#ûs9êÙT%ì0ðÉW¯[ܦñ6"¿.—ýåj’»w“Z%›eX ùŽ*¥ZSNiKÚÖÛŒzF¤b¶è–þ–ý…Ã_²úªøx?쮸 Âü;ý½H\Ê©ÿ†$O—å p¸P¡UFÕŽAáïÙ|ÿý–Æ0>~Þ¤(Æñ„ãCÆ1Ó¦?¨¯Ð—µ·çÿøÿô?ýoºLóVI–Gl7þV¯ÿËòVý”Eý–‘ÿ‡‚~ËXåcðïöògAºRý‰"fpF|Ä'i(Ñ8·{ml?ehÈÏüö]㜇_·‰*q cö'@T”#hQaC¯âÕ¥Â׿gúÿs‡¿ùÁÿÈ?±2ǾÓ÷Õôóþ-¿§ÓCúÖ>;ü1×¾x'öo¿ÿ‚˜þÌÿ|ã/üEоèŸÿl¿ é—ÿ¼SmŸ©øëÆ×žý„´câ_ŒmthÃ^ñ?Ä}KÅZ߃<"dð‡ƒït/ ÜM£Ÿ"H¿e5Îà ³ $øsûwàŒ§*ß±Sdî*À‚¥B¤1Wñ.ŠÊPéƆ{QJµkÔ*7N3­^r«Z´Ô8z*UkT”ªU¨ï:““”›“l¹e|ùyèÎn1Œ"çˆÄÉÆŠŒ ›«¤a£­"••‘û‰ÿ²zc?·ÿìÄrÀ'ÃoÛ³åË£þÅJK0PHQVAå”±ÞKÿÙ-BøoÿÙ™p…ømûv¸ÛŸøbäàc €¼€Ÿ 𶊧Á‘nÿë½þßÎù¾»ù‘ý‰–Ð;õöÕïÓþžõ²¿ùºãSý’Æ?ã`?³GnÃ_Û·àÆ8ãø ¡.íþÈñ0#öþýš×vŸøVŸ·C°ÚìÃ?ñ…ñÀe', ÆÓykø7E7Á±jψ³ûväáïþ‡ÿà®–ö.[k}[²þ5}•´þ/—Ý¡û鉿d8×öüý›Tü¸ ðÏöè*0ˆ§!c(û§(û«·bùi…ñ_ì‚?æÿgî>þÝŽœøÃQÁÆ;`·(OÀ:*A;®"ÏÿðÿèËü­d%’e‰ÝaßOù}_§ýÄü¿D@qxÃö?B ý¿?g%aЧÃ?Ûœ„0$+~Æ¿3)*ÈCFT¯ÊUŠ#~ÆÃþoãöwéŒÿ±ý¹3Ðß±ÒúuöÀÀOçnŠK‚)­¸‹ˆ6KááÞ›Í?åÐI–ÆÖý5þ5oþXFp|PýŒ¢ÆoÙó²|0ý¸H~ìäþÇk–#i$ޱ.Ò¬`{;ñü[ý‹‘TÛÛö~ãoÊ>~ÛøL*ƒ´§ì{rFqµÇÈ–æöŠOéKWÄ\A~ü¼=Óþíÿ%÷ äycß õwþ5~÷ÿŸŸð~gôùðß^ý—>-|Cð¯‡ß¶÷ìÿâüMñŸ…¾xAÿ…{ûfi_Û^0ñž¹§xsÃz8Õu¿Ù3LÑ´Ñ©kZ…•˜¿Õõ?K²óEÅýí¥¤rOë\ðEÚ‘ã߀ Ž/о!“*GÊÂ~H;YNä ¯ÊUмÇ'ü“þRûÿÙæ~Ëÿú»ü_ë)_Íž8ñWøgšäx ‡4ž.Ži—â1x‰fø<¶½XT£ˆT!2Á`°Œ]ä§ Ëi$”Oo+á<›J¬ªÑ­ ¨¥N½D¬ÕõæsëÒé[¦ˆþf¢ÿ‚2þÓèGüW?‡ü>>b Tðž6ê1€Ê¡QBª¨…-­¯ü³öÿÂuð`äcÄÿpTäøU @0@ù?°öÿ·_Âi?nëïø'µ×†~$i­þ§Çí7Å:Ž•áHþø“Ám«Yè²Xh:Í¿Œî|[?‰ ¾žüMc}à>ÀC ëR¦ªë §Û`ý²?oŸ¿°Õçì÷eñ¢ÛÆwR~Ò_|?ðCÁRx?Oðíü:·¯KRx³ÆRxƒÅ>þÍð6€×–Mâ OHö³j—¶íg _îqá¿ñ<@n)WËk™%–RwV½íÎÓ²ÊÍt±è¨œ>ýž+Eo÷™iÿ’èõü¼È%ÿ‚7~Óƒñ\üíÿ3?ÿØÿªX8ùN:c Œ ¢=?à?´´J ø×àRí# ¾(ñó(—9Ýð´o%Fsµ0è¬1ˆ>ËûÅûCüsðgìËð/âÏíñfëÁ<âOˆ^%²ðå¾wâ-GLðÖ›>£6—áûM_TÑ4»½wThSOÑíucJ²¸Ônm¡¹Ô,âwž:¿³gÇ þÔ~~ÐÞ ðÿ‹ü/áŒ^ Ò|yámǶZ.âë_ë±­mjÇúÿŠ4kiõ o¨ÁŽ¿© ´»·2ËæX"OÇ.?qMâ2ÎTíìÚK]´žêÉù|Æø z8b¶Ûë2ZmÒ?wà~'üö“P£þ_‹€ âo˜Ý÷Hø`„í~\‘°ì1Ê¿ðHÚHO¾pAñ/00Tôÿ…gƒÀèò« F!þŒ«ò÷áWü“þoüOö•ÿ‚f˜þÄÿ†xø' üaÿ…Ùÿ ûKþí½à­ÿïü+øAl?áû7ü/?³ÿkÿÂ{­ùßð‹ù¿Ù‘mùzBü|ùœqcå‹“ÿ„êZFñMë>öÛ_»D¸‡ãkSÅo§ûLž¯þÝüþóáˆ?à‘Ÿ´„DnñŸÀãÊÃÄž:ܘP \|2CœŽÎœ(ÚQü§ƒJ/ø$ÇíçÆ?úG‰«Éã&@F– -¿w(§ÿ»Žÿè#,{̶—K[^kô_ðéþ¡ðý¹}ž*ßö/ÃÝÓå¾Û†ÐÿÁ3~;Fÿ„§áÀê5ÿ±\¤A”cáêeIS·î„ EUØY_ø&ŸÇPGüU_ ~¿ÛÞ0$}1à$ôî:qƒ·gî|½û%þÙÿ³WíÏðçZøµû,üIÿ…£ðûþ6Ô¾k ÿ„;ÇÞ ûŒ´ Ã~%Ô4쯈¾ðŽ·qö}ÅÞ½þеÓgÒ¥þÐû4ÒÝÚ_Am?ñ¸íÞ^ß.Ñ«¿ìêm&ö»æ²½šKÖÛiê&Ÿ³Å]ÔT¿Xýö·O#ó•?àšßÔäø«á1à€?·|]Á#ÃxÇ`)AR‡Ëht!ÿ‚pünŒ‚Þ&øP0Ù5ßqóFIÀð)ÈSdB»@·µtPükã—oöŒ·Oú—Ròþÿ•Š|Ãî×§ŠÓþ¢eøû¿ðOÆ$ÿ‚uükPñ7ÂÁ€UÖüYµxÆ| 2~Uà ;vL?à߆?â§øZ9í­ø¯ŽœŒxy=ñ· ÚWäòÿeëåïÙ/öÏýš¿n‡:×ůÙgâOü-‡Þñ¶¥ðëXñü!Þ>ðOØüe¤è^ñ.¡£ÿe|Eð·„u»³èž.ðõïö…®›>•/ö‡Ù ¾–îÒú d¼hã«6«åÖOV²êvMíwÍ»³µÝ÷°—ðòzSÅwÿz—Kvï¦þ]lÏ„ãÿ‚züfB¿ñQü/•ÁþÛñAdÁ$Gcf ̘ٔ1°­t!ý€>1Gø¨¾Ì5¯–L¬`ªcÀñå SÔ€FU6$ßìÿ$ÿ†Úý£à ÿ?áL²ÿ†øÙÁïøKábÿÂgÿ SÎñׯ¿ÂEýƒÿ/…?áÛÿ {ûOû#ûgÆ¿á"ûö˜þÈû^§ú…Düf㘵WË“IiýŸKf“Z©õMmgóZ/õ ‡¥¯³ÅëÿQSè×÷|¶ÛÈüŒ°7Æÿ3ÃNøÿ‰Ï‰øÎzÿÅÉäsÇN1òì™?`¯‹Ëœø‹á¶yÆ5Ÿ`dc8> äç ÚFÌ!V1=¿ëm?ñ8âÖúÆ]k[þEÔ¼¿½åúmdšà._òïÿ…2òëË~‹KØü¡‡öøµ3¯ü7ƒµu1$.HÏ‚€ÉxU)TòÒò~ÃßÕTo|:\(WVñUàªO„!s…;TàœýP¢¥øËÆÏ_o—_þÅôü¿¿åøúúƒÃ׿³Åôÿ˜©im¾ÏËþ§å¨ýˆ¾+ùü=„jÞ#$rNF<"¹##¸äpTì1[‡ö)ø¥#mü=ùX2Ÿím}ŠáËnÿ‘97œ%A( ˜È·kOÓú(~3q»VxŒºÚiýŸO§ý½å²ÓÈk€ø}˼SÝk‰—[wÉšþÆ¿£Æu¯ (—T×·.# ®ÏÄ6±Œäœp‘áB•Ž#ö:ø˜3ÿÏwþ&šÿpG9ð±ÉÉ<Ž0pWôšŠŸøŒ|k{û|»§üËéô·÷ü¶Ûµ¬¬—ðòÿ—x¿ü*—ÿ#ý}Öüà_ØûâRòu¯ç'Õ5Ü.UÁ`…r\–RH)´!ØQŒOŒ²WÄd+cÁ)BÔuœ‚Ü·'¿2@Œ)6ÔÛ¥èu?øÖV½|¹Ûkåôú[ûß×Ýfø ‡å½‹Õü6¶Thk÷›ƒdxr"ÌFÒÙÛ“ mdo³Ic¡ìÓã¤UUð—xú© !vør0W(HWœ¢5‡íú)?øÍï_/Ñ·ÿ"úk{v—u_•“à–ô±Wêþ³-ò[o©ñ2þÍÞ8íO ŽKí_Žþ$#Ž1Ðpà âýœ¼l„ªxYHè몖‡”nu,¬§r´ídbÚUðoüÇþ ð[þ [ð[Äÿ¾øcâ„ü#á?Š:×Â]GNøµ¢øOBñÞ#м'àŸÝÞÙZx;ÆÞ<Ó$Ñ$Ó¯m~÷öÚ”Ré°ÛÃkux׋ÜiË&«eüªÉÿ°S²æÙ|]lýuOef¸ ‡–Šž)iÿA2Ù[ûº|­ävpþÏþ1Ô|00IÊ^ê$Œ˜Ž9ðøÈ! PLkˆÎÚüñxÿ˜†‡¸¼Ô³ü$ÿÂmñöVñ´¾=xþïxoþOK®øÛÃI£ÿjø»ÂÚ‰âÚßïYhx7Rñ”?±þÒo…¦¡¥O|ß‹œg$ÿ}€qVnØYj­v¥¢¾Šý_¥Ÿú…ÃÖKÙâ—eõ©kÿ’ÿÃt± Ÿ¼Jª€ÞèCj¨Àº½à€ ò4„ |¸Dj§È"˜|"ñ Çúf„>—7ß/NXàãž1òìú.Š•âß/ù}—üðü¿½ä„¸‡“º§‹ÞÿïRïåòëÓä|ùÂÆÁšïD8?)W¹@s“ì±¹ÆÓ¹ €v4nb– 8~k‘à}£GyE†V @Û¦Eò’‡ m #Œ Dò’×Ü(¥/¸ÂZºøü!§åӚݧK ð;Þ–+Um1S_”ày0>kCþ^t¯ûÿuþÏýCý¸Æ1€>]’¯ÃÝiqþ“¥Çr@È#ŒØ€ðx €Wi Wب¤¼YãkVÀhïþãMößÞì—ŸmAp-©â»¼Ëÿ‘ü6<ºjˆA2éà  <ß/ï·È=C6Þ * è¥Jµû èü%¨ª¨ó,aRYŠ®6ð?ÐÐã*}ÕÀ_EètR~+ñ{ÿ—ØïþåOçÿ‚Kàzû<_—ûTôÿÉüö>]ø£ðâÄ™4XtßÚ7ãWÂ]B]B[ ü%×| áý*ïUÕšÉu=sT»Öþx—ÄZŽ¡ug¥hÚz[\k‡DÓ­´¸åÒ4:ûR×o5o'ÿ†2øÿG¹ûaáÆøuÿÎV¾ú¢¼ Wc1¸Š¸¼^[‘â15¥ÏZµL¶.u%h®i5U+Ú)h’µÒG¯‡áì><6›Q¡F<´©CÔaïh§Mé}OÈïÚoöv¶ýŸ¿aÛ"Ôt=KÄš‡‰5$ø{áÙå–øOÂs[¶á :Wytéoç¿–òêêòå®@ˆ¯¤ÿà¤òc?´—ý“÷ÿÓÖ‘EaW2¯šJ5ëÂ…'J<5:xj^ÆŒ(Ñ„U8ÆÒµ®îï©Ý…ÀÒÀS•*S­SÚUz•+ÔöµgV£\Ò”ÚW¿*²¶‡òÿmÊH>ÿÙ…üÿÔëãM.uýFÁÛ_ò’‚?öaõ:øÓ_˦ ÿɯà¿ûÃÿO×>W1ÿ}Äé1 (¢¿L8‚Š( Šr£¾íˆÏ±K¾Õ-µï;`ª¹c€3É©~Í7Ÿöb›gݳc²&[30C¸ca ‡Êì-¹rœ¢¯y%dÛ»JÉZíù+«½•ÕÉrŠm9E4œšm&¢­y=tJêïeu}È(©<™·mò¥Ýýß-·¬òzc?ëuÓýgÉ÷¸¦º::2xu*~Vdn‡VCèÊÊyëºûÁJ-ÙJ-öM6:(eÄpÆÒ9Ç 3€H]Ìz*‚@.Ä*ç’tÑèml³ÂäFÈ6ÅÞhÉaæo*HS°ª•Ü¥šÎ“fÖ°n•M)Þ)$n‘‘–Ue*ÊK'*œ“]•Œ×Ò¬q:»Ÿº‰œcÛЬxµåb1u%RP£%BîSº³Jדoh§¢¶­»kt ­R·±ÂÉ¥4¥ 77£nïEÙ륕܎_ûÐô’äÿÀâÿã4öðí²„fk $RèwEó(wŒ‘ûŸï£¨5íz_‚üå¸yÜÁ¤Yl…¤dì`à†q Ü0 ﵟ†ÒÛi>¸û1Þi—·?<$.Sĺõ‹v»É³uªå#_$6턬a³8ÁÆ/Z\ÒåæJ_ ’qR•ÝùWÄ•îô¾÷cÚ|Ø©EÛDš“NðÒWJÚs^öZ-_3GÊØ6óÒçþû‹ÿŒÖ}îŠñ|ö§|As'›,jêFòÎY–(ÄJ¡rKn“£#Ùu¯ ÉhXÂŒŒ»ñ %„›\îìw+Ç• -Œd«x‰#x˜£©VS‚U=Õ‡UaÑ”á•RŠxºßŧUÖ‚Þ3VqNÖçŠÕyI7õ»hç–'…©R§´K¾jsÑ]]r»¯;=Úºw~iEuš;Or,p²„àB‚M›bZyJ‹ ƒ2±æ¯öà 3!Ü@bªHAµ 1ÜÊXæªí™„Y ²HÐzqÆaÜbÜÔ[Üm'mî›J׺}›VvWG­ Ç (Åʬa''ÌùwºmF׺zhífÒº0h«2Ú\@ ’6sæ|­û¿œ¢ï8ÀW#÷R)h¥åcvt‘Rµt©FJñjKºi¯ÃÊÏѧ±ÙFjñ’’½®šjÿ/+?4ÓZ4}™ÿäÿ”…þÁÿöyŸ²ÿþ®ÿ×úÊWù5ÿÁ9?å!°ýžgì¿ÿ«¿Àõþ²•ü-ôµÿ’‹„ìKŽÿÔèŸWÿ_cÿ¤#ùÎÿ‚°içövÿ‚›ÿÁ ÿn½>Ò}/Sø¿¬þÆßõ+9šÇR¼Ñ~0ÛÜiž‹P‘Dpjº‹~)øŠêÖúá>Å=´–V÷s];Ù/ü‹ö~_ø('íeûJ|M#Úõ¯ì½ÿ²øyàä×­Íõ¾ŸûLþÔÞ2¸Õ>\ÌÖùôoøGtÏÙÇDÖ Õ-lïue}p\ØÙÇ&›^ýÿü¾øÍÿºø÷©xz8Æÿî|!ûFx'Vif´¾ðå÷½zÞóÅšö‡©ÚÇ%î•®Ùü0Ô|{™{fa™¦º6OugmyquüÅš‡í)ðëöŸÿ‚‡x“–>ñí³ñúÞóEÿH]G_›áOìïðïÂ_¼iâ=HXÚbêÛÅø“©Á¢Ú\jš^ˆºäÑÙjW3]^½))5J÷ ¥I>©¹)G­Úp•D´IY£ÝêÓÙÙü’·àÒù3âÏø*ïíS®þÒÿðDßÙ#Nð|s/Åø)7ˆ¿dß…:u•ž°âÏNñ§‰ŸJñÏŒ4Í[V„Cuw¢ÃâïMàíBXôù¦»:œfëKHžæ¾úý¬?i?~ÉÞ ý‚à™±FðûMøùñ÷D>ðŠ<}¥^j >|ø àË9¼[ãÿhWúN­â}lxSBÕbð7‡"»Ótk‹­ UŸ\Õ-£µµ²Ô¿ ?gx—Æ_ðWŸÙ»þ Ÿ©øKMÓþÁ/ÿi¿Ûsö–Ñ´‹{Æ>¼ø]ñ;_ð÷ÆÙÚþ×ëc¼&ð7мgáxmm&†K rê] U—ϽŠãëOø.ì­ðJïþ û~Ø¿¶€¼GãŸØ^çš§ìÑûOjVZ—Š´¿ |7‘ï¾ êŸ¼Oâ½[áÞ«áïxsFºñ÷ŇÔõ-rÃYlx*â¹ÔàѼK|°R…7³UjÅ$¥Ìåd­ÍfÜa£tùoï j›ë¢ím¯ÓMÝßù^Ø~Ô?¶¿üïöÞý?e_Ûwöšø{û_ü%ý·›ÇÞø{ñš?ýœþ!x'â÷†µÛèžÕt_x«QðF³áÝr÷ÆžðÆŸ:jëÚŽ±â--¢¸ôë‹}gæ?ÙëÄW„¿àèOø*OŠµë¥²Ðü3ûxcÄÍ댭¦•£xö Ôu¦ªÛÙÛM+á v_ ÿeÿø6á_ÆÙçÅ_/þx¿ã´ÿþzOÁÿÚÓãgÆß[üVŸÇ¾“À½ç‚|=ñÃÆVÖš_‡¼F4ýwÄw7Ñ“Ã:V¦ßÏâH^‹Y~yÓ¾ðp¿ü¯àY½›M?à—ZßÂc¨Û´)q`>#|ýˆ<öØæ9mÖk_íŸ>&ž)!™ct ¤\¯ŸIFô$¤Ý5M?ÞCÞŒ"ÚVM'mÚ½®Ø>ŸâVÖý;þ?3ì¯ÙGãWüGþ }૟ÛGàOí-ðgö6ýž/|qãýà/ÀþΚGÇ Oâ·…<#¬]øYuŸŽž=Ô|a¢kþ¾oi:¥¨á]å¬qKoxdµ½´†Æ[ÿý­¿n_Ú³áN­û~Åtƒö¿ðPÛ7Ãút¾<ñv¥m­k?¾ ŸxGL×¾;x·FðçöÄ>*ñu˜¾µñ| 4+Í^$¹°Ðî.5í^[¸mlõ_¿à‰ß·ìÁû'Á?¼=û'þÖÿ>þÌ?´ì›ãÏžø¡ð«ãŒ´‡~5‚çXø¯ã‰vwÚ‡âJÖ÷ÆV78†ÒÚëÂ0êñÝ\YL¶Ë4mmquÌ~Üþ'ðOƒ?à¥ðHoø,é¸ñ ~Ǿ.ø4ÿ ¼mñFóIšü2ðçÆ|N¼ø'âßé­o¹áKÚ3R“XÕµ`úfŒ¾K;ä±ÔÚÞ×ZN7«(ºiF<þÉ(YMÆ-Á9-gÍ£ÖO›e£°][âÕÚúív¯ékö=ûÇ´_íûÿµøŸû1ÛWö™ð'íÓû4þÓŸô߀ºçÄK/€^ýœþ-|ø‡ãKÁözG€µë¯øÇáÔCGñ£â&Ôm-¼Qok¡=¥ÔÏ“£ÍÎþÜŸ¶§íçàOø-§ì…ûþËþ?ð5§Ã¿Ÿ²þ©ãgáßį øbëÀòxÒH¿j˜¯>#øƒÄÖ^›âÍÝ·€ô‡^ñ¤|%ãÏÙøò÷Àö¾ }w±x¿Yñ$>ÿ¨ø§ðþ kûÿÁ?¿do‹~ ý£7ýª>\|^ý¾0xàÖ™ðÃ_oæÔüq¯Úx·Á|C®j>8ðÃïüø—­è~¸ñYñç|E…¼7¨üKð͆»}âOz÷ÀÏÚçöÀýœ଺üköÅøÿàïÚFý£~kŸ>|JðÿÀÝàf¯àÝjÊïÇ÷— [Ã~ÕüSauá-7ß~!\éú¯‹5íWÄÓÏ–×Þ(½žî5þxýªåjoø&¯ý™GŽÿõý¿hýªåjoø&¯ý™GŽÿõý¿h´_Ù½†•GhÅ{ñæ³V^ï¯k'w}ÇózI-ú;hûï§Së߈?´ïí…ûkþÚ´§ìOû |dðOì™àߨïAð ÿiïü#Ñ~>xïYø£ñ_\ðÏ>ü8ñ6¹¤ø ÏöZW‡üQ¢øÃÄ0{½aµ[-N J³[+ V÷°ÿ‚y~Û_<[ûXþØðNŸÚóÄß|sûCþÊkàïxs⇀<,>Yü\øCã? x;W·ñ¥à×õØôŸhW5ð³ø‚] X4uñ~¥Çn.-£«~Þ~ßðNo†_ðVÿÛ÷Á_ðVXèþý¥|`Ÿ´ìwñ‡âÏÅ_|ø]¬¯|MâünðÕ·Äxïáï†ST°ñGt+ǽæ‘cà­âæÕµÛÏþÏÿÁ;~ ÿÁþ þÔ¾'Òà›§áæ½ñêóà_Š¥ñ·ˆþ|pø³ñãÂZWÂuñ÷Ã5Ôt}kĺçįˆ? t­g[ñzøB÷F°¶ž?^YhÔöm‘mª­Êœ` ÒŒ¤8Ê2Tãe-“«ÍÌÕù£(¸¥¢IÆâMß[+½S};%kv³ëó?W?h¯|cø“ðsÆ øñ×þ§âæµÿÿü"_?áXø[ã'ü!_ÙÞ)Ñ5m{þ-¿nì<3â?øHü3a¬øKþ&wqcÿooYïÔ4»Hßùÿƒf>þØþ8ýœ¯þ%üýº¿áF~Ͼýµî¿áiþÌßðÌ ~&ÿÂáÿ„À¿uÿÿÅæñF¯ião‡ßð°|w¦xþ)Û ŸøE?²?á*Ò<íZþâþ×+ù;ÿƒk>.|ý–ÿgß±çíñá7Â?ÚVËöôñ·‡4ïƒß~"xWÁ¾<ñn«¬ü=ø!ðÿA·ð?…¼Q©é ñƒøƒÅÞÕt]=L½ŸS½–öм÷Ö±É4Ûö5’IûÔÞ±ŒŸ:oTÞ–VþWv¬Û»vº¿gÖÝWõæ}màoÚ/öúÿ‚¥üNý¦ÇìQûLxöýš¿f/:ŸÀMâ-÷ÀO~Ñß~8|FðeÌž6Ô.´okv~ ð_É#Ö|7áßìû[ÏÜ[½ÍÝì qªè–ßQÿÁ;¿mÿŒ~6~Ö±í]¦x!j?ØçÄ~þÚñ×à +ÍáßÅï†>?²ß¼k¤xkVÔµM[ÂÞ!‡G»Ò?á-Ф»»ÓmæÖô™4ÛÆ’Kû+Ìoø"×Äÿ_ðKK_Ûcþ ûû]üZðWìåã‡ÿµw‹>+|8¿øûã |:Ó~+|ñ§ƒ<àÿxãÁþ,ñþ‰áRÃáÔoìôGŽöÆ}V;K>Þú+ý7Kõ/ø&‡lÿiÿø+ïüËþ oðù5Cözñ?†<û1üø…öQeàÿ‹7^Ð~èõÿ =Ü&û\Ò´[à>ƒöYKwmâ¦XÖêðOo£Tâ’ª¹R§EÓŸ-œ›q·½kË96›i[NTšöj÷nÍ_ïÓ¥´ÿƒs÷ŸöŠð7Æ?‰?#ÿ„Ã6Ï„¿âgwö?ö÷öõžýCK´ÿïø6càoíãÙÊÿâ_ÁïÛ«þgìûàÿÛ^ëþŸìÍÿ Çð·âoü.øGü ð_ñ¿ü^ojöž6ø}ÿ Á7zg€?â°¹ÿ„Sû#þ­#ÎÕ¯î!_ír¿“¿ø6³âçÁßÙoö}ø÷û~Ð?þ|#ý¥l¿oOxsNø=ñâ'…|ãÏêºÏÃß‚ôø[Åž‘â?ˆ<]áWEÐãÐtËÙõ;Ñiom Ï}k“M¿cY$Ÿ½MëÉÙó¦õMéeoåwjÍ»Ž×WìúÛªþ¼Ïÿ‚^xWöµñ÷üþ çàÙkâ×Ã_ÙîMköÇ×¥ñ§Ç_ü8—ãWŠü=·ÆÏÛ×ÂOÿ„wÚ÷ƒ¼¬jšÝÎ¥­jú—‹ükâ‹í‘xNÇIÿ…yãFñ”š‡„¿\à“ŸðP_‰ÿ<=ûp|ý­¼Sá|oÿ‚v|jñ_ÂÏŠ<5áxü£xûÁ>¼ñ¶‡¦|FÔ—ñÛÄ–þ'Õt/|Jñ¿…|Iñe|ðÍ|K¬øKÆ|Câ‹ïèøpx7B“Rðέ/„³¢jöÚp}FÛV¹¸šÊ J*2÷d¹$©Æ1QÕk5&ê)+5)+»]Y6Šÿ u»¾:[ª]Ìø,ïíñöNÿ‚jþÒ?þxÃþ‹žÿ…=ÿ—‹á𷊲á)ø÷ð·ÁZ÷üH|k¢xÃ7ÿoðψõ3þ&z5çÙ~ÙöË?³êö—p~R|oý¬?à­Ÿ?àš¿à©º—í#ð/þÏ |"ýš¼mãÿÙzÓà&‹¬'Æ¿üeƒá‡ƒ—ÇŸ¾7I©h:‡¼eâ=sÆVߤð7Áï‡ ü-à=~Ñ:/ÁŸŠºD?³‡†¾jßdñׇ¼M¯i:‡ÃÿxsÆ×ëâxE|7«_^ê?íõrëÃúÐ^Ký¥ª.«¥þ}ÿÁF¿f;‰ßðKOø!Oí7ã‡þ.ø¥ðCöOøOû-]~Ô ðƒ_ý¬þÌÿ¾ü½ø¯â ”Ð/4ŸÃoceðÃNÐeÕü3­é—¾¶ñMÖµ=Í­”šî‰í#ý”¿àÔøüCMKàŠ,¥ÓQÓ|#àoÛö†ñ§ÅMji-KøKáï7ÿ¥ñ£;Åei¡\øj×PûdÑÃs °:TcN1^즜ªFj4ã9hÚŒTœ“ƒJÒ\ªí½[µ‘vú¥¢z¶—NUôßþé¿ìÇûR~Пð÷ÛÓö(øíñ_ü?Ò~|*ý ?dŸ\øGÁ:8Ò~jMÒþ# /øOº6±®Å§xÏÆ:_†<ë:¶¾O†no4´X&«©\yì[ÿøùñþ Mû@|1ø“©E?ì¡ñ}þ5iÿ°ÔGNð5›Zê±w´oƒ_ÌZž‹£Xø·_ƒâˆu+ïhÿð”ë¾"›MÑ´Á…¶ƒjóØÇó¯üƒâo‹?`oÛköWÿ‚‚ü9ð]׈õ?‰?³‡í7ûx¡¬!Ôõ ­CÇ3øSQøû-xrÃIÒnùµü`¾ºj6z>¨ÒøwCÔtûÖµž?\Ú÷ÿµ?ì½§Á=¿`ø'ƯéÚtž"ÿ‚TüAøA⯈úÆ…àY/u?ü+ø²¶ÿ lË#HÒ.µtaãKÿÞ|WñÑ\êéxf[Ýy5·“Z³…¸ÅÚ?½Š„tZN1jMZÜ­Î4îìï˸]Ýë³»ôvzú&ö켪?a?ÚSö‹ý£?à ŸðT #^ø‚Ú÷ì•û7üFðÀ¯‚Þ¶ðïËm;Gø¡¤x|ÇÄúƒÄ gRÐͨXÝÚK4|!ÿ.ðEýŸì6ÿüIáfð‡Ž?m¿Žÿ?l_èòêßÛ“Aÿ {Çš‚ø0®¦6Ç-ÏíšCoa”¿’òûLÓõ›ÝVÝ~¹ÿ‚•Ê9¿oßû2Ú§ÿT_Žë9[Ú¨¤¬œ!m,ùmÝ´wi¶úÞå-—ž¿~¿øÃû|Cÿ‚ÒþÝßðMï„¿´ç‚¿l¿ÿ ||‘üSÖ|9eû6øKÇ>(ý¥¯|ñ?â_‡íü?ñ[]‚ øà†ïî´k?‡ö:oÂo„^%ñWöG…ì|{wã·Ö¼Y©xcFÛøÿløÓñkþ üñ÷ü/àη¥|#ý¦|ÿ<â}CBðç†üK¡øcâ-¿íð·áÏŽfÑ<1ãë/hÇFñoƒ¼M6¯¤éÞ!µÖ/t=7ÅV©亦m«žþÙÿ&ý‰eø#Á{/‹´ÏÁo üHøEáïÚX×~^|Bð¿ü-ë«ë¯¼cáÍIøduh¼c¬ê>&Ò5MãF‡OÓ$Šî-ZÎSs .óGð]—ì¹ã_Ù{þ Eý¤áø‹ ø‹Â~2øëñ+áÇýKÂÞ'Ž mKDÓ›þ}ZßS¸´¾Ðõ /Ù¯â÷üþ —ðûþ#övýª¾þß³åÿÄéß¾j¿³…>>x›â¯ƒü ¯Åá©o¾›ÆŸø%﯄Òj6²CÍ„¿eÁï{o-ŽݼSÚ®²g†IínaI#V–Þd ~pÿÁm¯Ù—öFý MfßR–Ùÿ³Åݼ¶WwѺ©(Sƒœf ¢ ¤”›æåwM¹Z<Îí+-.ƒùnÞªûÛ[%¿ÞýO®dÚÏöÿ‚þÈ¿´Ã|GÐÿcÛ·öyøÍ{û:üWøŸá/‡^øÝà xûáÇŒt[¿ø·ÀŸ~ ê‘iºç…~"øoKñ/ƒíì#|´ñ>ŸýŒþ!ø=¢xÓ⋼)ã« æ?í[;Oj?5ø6É|7ñ*æë᮵ñײ[gÅZN©­ZÙxW@K³·Ô`ÓáÓt‹‹ytkKý¿>þÍžý—ÿà‘_·ìàï_þÄŸðO¯ÛÄ>9¼Ót|{âˆôŸƒšÏí!¢x¯âwÅ>"_êÿµ¿ Éñ;àýÔú¯>£siq¡xâÇU´H<1.›6œÜi¹Æ.Ò£IºJk–\°n2nnRQårwjí¶ »^ýìïÕ]ÚÚY7t´Z±>øÿ‡ð¥êé~6ÿ‚€ü ø« üNÑ>(é>)ñ ý‘ü7àÏ~Ì>#×¾xÜ|/ñwÁ{}+ÆIᯌš'€~2/÷Ã_ô¯üQá7ÕcÔõæ‘¥´þy?à’ß³‡íññöÓÿ‚Åøkà‡ü“þóâßچÓBøõñ3þóàÇÅøhÿ7ÅÚ†ÁÊ ëÚ$ß/-šZ­šº¿Ä®׎ºk­ßT­­úŸÖ%Q\¥…Q@Q@Q@Q@ÿÁHÿäÆi/û'ïÿ§­"Š?à¤òc?´—ý“÷ÿÓÖ‘Ez˜áKþ¾?ý&SÝz~¬þBàí¯ùIÁû0¿€¿ú|i¯åο¨Ïø;kþRAðGþÌ/à/þ§_kùs¯õÁ¿ù5üÿbxéúçÄæ?ï¸ñ¯ý&!E­e¤Íu²G>T‰ ²2œœF¬[r…"L˜ÂÈ ™dI©R£Í9(¯>¯²KVý6­jt çVJ1]õmöIjß¡FÞÚK™8ð …• î Ì›L€0R3mæ8$ƒ.ÈÒ[èp$r ÜÉ# èÇʪáÔ»©Ë3+ylG”UÐJÛ)¡,20A$»PI)EÚ­!EPÄ ã€«’(âŸ^EluZ*w§.–­»ß{'ËÒÖ÷µæÑò¯ŸÄæuª»Rn”4m&›“NïÞåO“ef½í\•¥ÉD‚ß !“ÊÚÄ´kЦ4‰Ž4`ª#UWÚ¥ÃJUIR@%Nå$U¶•Ê“Ðíf\Žv± ©67°ÿ>Ù«öeÅíÕ­¼pÎâââIŽ6'¼JpÛYT…•,Õˆ ŒóºU¬å(É$®Üä£d—i4öV²ò]={J$å'²»n×Vµú+-zYvFmWk[v’Lad€‰´ep÷eC  Ì»pÌ‹ÚO&H¥@;¼Nƒïä°ù_÷F*!¶v©mªXà€:“Çw'w4ýxê£-n›„“ÝY¦àÞéÙ§ºvê ÚAÙsÂROEÍâÓOk6šæO£W]Ä Ž‘ŒìœHœq“é^ÃàÝÉ$6ì¤iPÊ1¼4²d(+¹aDÉ\ìU;Î<ÃK{Xn®¬¥¼ÓåK³j. ëo9RhÜÁ— G–ÌT¯×_ µOÇqÜø?Q¸c#‡x½ Áb€² ðìŠlaÚ ùÂHX©p>upøt•*žò•8¶à—$RHKG'u%)8Ù¸ûËÔË©EÞz9¹(§ïi⬮’rrÒñnÒå÷’½þ‡økð¢-jÑ#‚"Ú€„Ì L™/b@Il©^ù"±î]ÆŒñ*yMïž"ø2n4Co§™f}R· DÑíÙã\;rÑÅmR9{­Ïn–è ¯m•û/„Ÿ„®e±·Óü-uܲ#[0ñq”[ˆá 9cðüãŠ"e¹vƒÈŠ — ?w_`x§Qð…φ´ëk=îfŸK¸¼ZË[ J®ëBê´óÜiuåÓÆ¶ö‡Q/ ÆÞçÉTO̳×GJÆ£¼ý§4¤¾F¤tp­eÛqøe)FKHh½êpƒ„›’£t¯/wßQM%šMZïU+iËï?ÿ‰¿¡Ó%-£óÕ )º(‘G4›B»B0Û0I¶iÕ%(c“lq»FŸ"øƒ@2Nv:‰Tn 4d|€ʰ+°à²¿œäŸÖŸŠSøI>|{*<§$H÷ƒ*–ŠOøGdóRd‹ÊŒ¿)F¤,Íðç‰ôÍòY§†/-Ÿ|Ío}©UÉ–ݤZýç0S Tàs¶Gû ³0«©J‹I+Ô•^I%îÍ*®? œ¾ÍÚäm¶—%zQœeYÇáœZ{¦­ðíï%Îù’¿,•íwòÓîÙÌk¥ÁuÛ±†Z4yAè[dR2ªå›i ÕBé_VøCÀ߈,¬ÚV[7ĘßkÖ^×5&d…mȶM•ùŠYWpç÷>•#>m´E(Úöæ2Å€8S"ªñË)Þªï7ÞXì4æâé8µ rµ:·~ûš½¤¥ÌŸ#åJËF®÷^\²Èï­]»s(µÒÉÊR§m_ÅËfš²ÒòðçJHŠèØÊ:†S‚ʰ à€FGÔVF¡¦G93EdãzDR&s¹˜°fÄe¤.VW$ˆI‰ ¹õMGÂû¼¼Û¹ÉÈ DÇsgk™WøU”:áÐÙÈâå¶–)6FŒQÔãåa~aò‘Ç #‚ î å&¥ƒ”ê¸ë*J2Uv½à¾(¶’n ê’vÐå’Ä`f¥Ídž9rJöѫŮd—nd½ÖÒ>ÿ‚tÃ,ðPïØB9£hÜ~ÙŸ²ÿ 1>8x!w)èÊH :’­ƒ‚E¬…•üÞÑîà ?°«<3kûeþÌr«¼‘)uO^ ,c1‹†*J£œ[—ù u*@ÿUêþ2úXûWŸð|«R•)<—î˯ûtuJ÷KU¤’iÝkcô®Å,V&¢§ÑŒÔd¥¸&ši½Õ®ž©Ý]´ÌOøkÞ4ðçˆ<ãèž,ð‹4MWÃ^)ð·‰t« wÞ%ðæ»a>—®xĩ֙¬èšÎ™uu§jºV£ksa¨Ø\ÏiwÖóIb|:øiðçàÿƒt‡_ |àŸ…ß¼;ý¡ÿÿ~xWBðOƒt/ímVû]Õ±ü1á« 3DÓ?´õ½ORÖ5±XÁöÝWP¾Ô.|Û»¹æ“¶¢¿“.ík齺_¹õG–i> 蟼GñßEø=ð³Høáã x·ã.—ðûÂV¼Sáë[m ÎÛBñÄKM"/ëz5½§…¼3k—©ëV1[xwB‚8-#O[GÔ4í?V²ºÓ5[=OM¾…íïtýBÚ Û+Ëy$‚êÒå$‚âÔ¾Aá?Ýè~%½ºÒþ/üj·[¼ñu÷Žt»˜Å6-†¦ÈÞµIcÔuWfÓw^í•›×[ÚÉêÒ¶¶ÛNà}ðÛönýþ jºÎ»ðƒà'Á…:߈ïnu/ë? ¾øÀÚ®½¨Þ–7—úΡá} K»Õ/n˹¹º¾šyç.ÆY±Î¾•ð?à¶…ñWÄ¿´?„ ´oþ4Ñ ð׌~2i^ðžñWÅžµ‡Ãöö¾ñ/Ä;M&kº%µ¿„ü-V©«ÝXC†¼?p*hÚrÛz]»Ý·ug«Õv~@xÿ‹ÿgŸ€?|máÿ‰^=øð{Æÿ¼$.…|âÿ†~ ñ/¼2.íÒÎèxÅZΉ{®èÂæÒ(ínl&· “tHª=;RÑ´gK¹Ñ5+MÕt[Û²^i•­ö—wkò³\Ø]E-¤öøUL±<*ü¼ Ò¢‹½5zm®Þ€ñÿ„³ÏÀ€:–—ðàoÁï‚zf³v×ú¾ðែþØê·Ï ­»^êVž Ñ4k{ë¶·±²®n£–f†ÎÖ"å-âT¿ªüø-®üUð×ÇmsáÂígã‚ôIü5à¯€<'¨üUðŸ‡.¡ñ½×‡ü5ñïI›ÅÚ‰soâÏÁ>•¥êö¶Câ_E$ šÎ¢·>£_ƒ?lÿÚWÆßð_ßÛƒö&ñ?ÄŸí?Ù‹àÿì½á?ˆ¿¾ÿÂà/øG|e©øoöAÔ/µøLôÿ Z|AÕ¼û¿Š>:—û?]ñ^§¥Eý»åÃcZfŽš}EJ|í=c)6ÝÜSQk­÷Z=,&Ò·›I~‡ìž«ð?à¶»ñWÃ_µÏ„ µŸþ Ñ'ð׃¾2j¾ðž£ñWÂ~º‡Ä÷^ð×Ä;½&ohZ%Í¿‹|.Ö~7ø/DŸÃ^øÉªøÂzÅ_ ørê[ÝxÃ_îô™¼]¡h—6þ,ñLéZ^¯ka4>%ñR@ɬê+sù‘ð{öÿøñã¿ø-íWÿëñ?‚þé_> þÍÞøÓðëÆ^ñ•Äÿjº®Ÿû7}»û[ćŒï<¬xf oâÇŽ´¸ÿ°ü¥\Åq i–Sj²]éZÇö—ìER®÷‚jÏìÉ]/¹êƒG]}WôŽ#âÃ?†ÿ|9yàÿŠüñ/Â:ŒRÁ¨x[â…4xrþ ã0Ï æ‰â; KLºŠh™¢–9í]$Š8*H¨>|)ø]ðÃÐxGá'Ãoü-ð¥ªÆ–¾øuàÿx#ÃÖÉe‰ Ñ|3§išl+³,k²„ Á@×}EMÝ­wmí}/Þà ñ]_öký|8ñwŽm|Kñ[Å>ð„ü!â?‰¾#[ýoT_|B×<=¤éÚŸ5µÔüKâ=Eu_]jWâÿÄÝØœ\j·òNxàÁo…ž#ø…ã†>|8ñwŽm|Kñ[Å>ð„ü!â?‰¾#[ýoT_|B×<=¤éÚŸ5µÔüKâ=Eu_]jWâÿÄÝØœ\j·òOê4S»×W­¯®öÚþñ¿‰ÿ³§ìùñ¶ëG½øÏð'à×ÅËÏ^ÛêZßÄÿ† ñõÖ‡¨Ú·ú=ÇŠô=Z]2öØHâÞêÉàžî#‘wú¦•¤éZi£èšfŸ£i:|+oa¥éVVÚven¤•‚ÒÊÒ8m­¡RIX¡‰HQ“ZQwk]Ùl¯¢ùÄüEøiðçãƒu‡_¼àŸŠ?¼EýŸÿ ~"øWBñ·ƒußìVÇ]Ò¿¶<1â[ ODÔÿ³5½3MÖ4ÿ¶ØÏö-WO±Ô-¼«»H&Äþ x³áT|Sðƒáw‰~ZèžðÕ¯Á¿xÂzÏ«ox.m*ãÁÞƒáæ£¤ÜøFÂw‡?†´¨ô…°Ð¦Ñ´©t¸-_N´h}FŠ.û½Ö»>þ¾``ø{¾ð†4?øSÚ†<áL𯆼#áíOÑ|1áï hº|NáÍ@Ómí´­'AÒt«km3LÑì--ôû >Þ +[x­¢Ž%òÏ þÌ_³_üsªüOð_ìõð;ÂõÙ!—[ø‡á„ÞðÿŽu™mÕRÞ]WźNi¯ê@Š© Ýê4Jª¨T¸ÑEÚ½›×}wõîãï… ~+Gáx¾(ü5ðƼâÝ'ÇÞ ‹ÇÞðïŒcð‡Žô¸]ƾOiÚŠè-Ñ–îétŸé"ÓXÓ–æàYÞB&6÷‹<#áOxg^ðW޼1áïx7ÅZUî…â x³EÓ|GáŸèš”m¨èÚöƒ¬[^iZÆ•m$–÷º~¡iqiu¼SÃ$lÊz)]÷Ûo 0|-á_ xÃZƒ<áÍÁþð¦§x{Âþð¶§øÃ^Ð4{H¬4@д›{M/GÑô» ²Ó´Í:ÖÚÊÊÒ­í ŠÑÏŸ·ï|`ý‹?kï„¿´øH¾ üQý—¾?ü:ð/‡ÿ´4­'ûwÆ^6øQâß xcGþÕ×o´ÍLþÓÖõ;/í cRÓô«/?í:…õ¥¤SOÔ4SM¦ŸTÓ׺wñ‹þ +ÿøÓ> ~À¿²'€¿l?Ù“á ý¦¾ŸFÖóÆžøKñKƾ=|Nñ–š|+ñFoÙé§Yð¾» j7'ÂÞ'%x¬u&þÎâÒßõŸâ/ÃO‡?<¬|:øµàüQø}â/ìÿøH< ñº¼®ÿdê¶:î•ý±áØjz&§ý™­éšn±§ý¶Æ±jº}Ž¡må]ÚA4}µå9JNMêäå¥ì›wÓWe}µ¬bxkÃ^ð_‡øៀÒiÉá{?ëz¯‡|W¤ê:·Ä]Tþ×ñíޑౡ¤Yx-í+‹K‰|GþãÿûÖ?à›±n…ð+Æ:Þ‰â‰þ(ñ¿‰~-üWÔ|1q©Ýxixóâ‡$’oxëÆ üâèRÌ#K£xŸ\Ð/µ½.IDQ ÆúGbB.=ôí>M=´™,lßJ{6ÓŸL{hO}= 6ÍbÖl†Ù¬ÚØ›v¶1˜ ÄSË;jå7nɶÒÙ_oNÃ<“á¿À€ÿï5íCáÁ?„ ¯üUª^ëž(¾øoðßÁ¾¼ñ&µ©4m¨ëõφ4m.mcT¿h¢kÝCP{‹»¦Š3<ÒR(|GýšÿgOŒ~#ðÇŒ~.üø)ñSÅÞ n¼⯈ÿ ü ãøFå.¬ï’ãÃç‰ô-SSÐ'KÝ;O¼Y´««IêÆÎà0–ÚOj¢‹»Þîýîï÷€QE€(¢Š(¢Š(¢Š(¢Šø‡þ Gÿ&3ûIÙ?ý=iQÿ#ÿ“ý¤¿ìŸ¿þž´Š+ÔÀÿ _õñÿé02žëÓõgòÿmÊH>ÿÙ…üÿÔëãM.uýFÁÛ_ò’‚?öaõ:øÓ_˪#HÁnfÎÕȈí\‘¹›Tgb3Ôôð¿ƒ/ÿBxéúçÄæM,n%·d§vÞÉrÇV_Ó-ÝÈWBÑ Ý'ÊÅ0x ̲ÄÈ[…K¶åÆÑ‰í•UT*€ª *ª€T à8pªÚZGk*¢‡U(Î¥Žÿ›&L7Ýip­ ÆØâÞé D\'äW×bkð´úŸ<¦–Š_íxnÄF ÿkÖlíösgw™·§~†½Fð3L#&—@ÈI¯–¨q•iccʇÔ?³ÏÃ3yñÃोÀŒ·~Zª²£¨Kè±t/Ú7àÆcÈ/¢¯Îãs(•yÎnsTªM9I&ùbß^f×Vœ“Ýr£×§F)Á( 4’w›Õ¤—,\b–ê*1vz7Õ~u>‹p*ñ¶1ò†%=‹,kÀç’:dàV%ÖŒ‘82Ú¬r@’%Ø[*ù£À”(ÚpÛÑX.@aŠûJóáã_ô£û<þÎ7ú/Å]*ÏVÑÍͧ†¾& #‰ ¶1ê_|{ÙÝú)ínì¦G´¹‚Y-&‚EpɿŠùÛÄŸ³D÷º‹Ëi†“¤Z%γ«_@Ëmal¶Þ\J¦2Eåýñqi¥é¶Åî®îŠå„QÝMÈàø·.†kˆ‚”g©à\%Sš´')b1ÜÖŽÒö‰RPµå7.X%$vK ]Ò^óræ›kÞÕrS}c{Ç[¹{·iÅ·&4>.øx¶ÖHX¦àZCIP™ÌwÆBÌ¥&gDSæxjKyä1¦n‚ÆÁ¢ê0#?9.¡^$m‘‚3ªì)÷/Û?,m¤ôëoišbYR/µÜÆ<³-ÅãA‚.$Ù%ÁHÃÁl§m´®‘Âkó â‡Äx¢FÄ2y–Ì̬|³ˆïòl²¢Ì#K€î dÛ8{7U!J¥kÝŒ©Æ<°„šN1Ózs³Š‡5ÓZ5(³ÄÄÐRR„î÷·ñ+êšÞöõVvþ ê¸ý¿aÏCû`þÌøÿÃÓàªÿTZÿ-Ø6ÜÁÿ ýˆø;eý°¿f{„$©$Kñ§ÁEÏËÑD¾b¨ 6Õäaú—×ñßÓGýeàÉÁZrmH­ùT±Ñ¼tÓݕպ+#ê¸.\Â/xâ ¾ê{ü÷?ž¿Ú8ýžàáŸØ—ã µ´m¡þÜ_²×ÆÙË_ÚVÅìvw¿©ä¼?iñ÷þý°¾/)i°ÿìðKöz·Y¬QqãOŽ {ñBWNÔì†Ñ4çÇ^ºŠK(n/.®¯–?.ÖÌÏ©þmÁ¼±‡ìÕûsÿÁ(>'ü%ý©¾ÂÑø}áßø(o~"èþÿ„ÇÇÞ ûŒ´ŸÙ»à§†´ýcûWá׊|#­Ü}ŸDñwˆl¿³îµ)ô©´>Ó=Œ·v–3Û~ÃÁ~ü{OiÚ§Áž0ø{û@þØŸ´ÇÄ‹Þ)ðü«x Æð‡­4o†_<ªhž Ótmvk]+Hð}楡jÚ¦‘¦\êÚ¹¦ÞÉow4Òë:¯á§üöëöúýà†_´Îðÿö7ý¬‡íWñsöÊñ¿þø>ÃàĤø‡à-Ç_³ßÂKiþ>]ø"óÂRx™üá¥ð_‰4mİèú¿ßú%ä¢&Ô ½¦Ú©É)EЄZ•¬â¦¤ÓÞÜÎNë£6¯u'oœm§{[æzÇì£ÿÒý‡~4ÿÁ_5]{öAøqðÏöVÿ‚gø‹CŸÆ~>Óþ%ü^ñÇÛHÖ4ÿø[Ã:µãŸxÆÔxàŽ±£¶£â‹êš]Åγ¥ÙXx£MÕ|/âýI>Îÿ‚ˆø[þÑãßÚ›ÇýªôoÚ?ö»ý§u‹ Å7ß³‡Àÿ~Õ¿îþØh~ð¯‡4›­+ágÀ¿é ø{6¡¢I§x†ât&«©_øÂûÄ7ëöÚ3Ýÿ‚aþÕŸ¿e„³ìIðïþ ‡ÿuðMψ|1áOü]ø™û·…< |}ñÄV6ž2ø»ñCÅr|J¿›ÃÞ³Ö5Iµ}oV’Êõ<%àm* ;;Óô;;áþxcöÿ‚rÁP?à¢~,׿c¯Ú»ö¶ðíñ㟠|Aøñgà¦à¯iž]ïâŠ5¯‡üyãÏø ß<-¥MñNð§‡á)×ìlßHð‡ì´{Mel û(ÜœäÜçxBÔýõM).fæÛµîäÖí{©¤„¶Z+7®š+¤Ò·Ü¯÷ê\ÿƒtÿi߈ÿ5ø(wìéâ{'áÇì¿û@é‰ð?@ý£nõŽŸ þüGñ7Æ=.ËáÄ«mfëVÕôŸø/…–pëº-÷ˆ5ì_êž!Ò-eŠÒÆ7äü›þ Ž?à¢?°wÅíâÿíeûFü8ýœ4ÏÚwźL?³÷À]WÁÞÓ¼Gñ?„ÿ.¼Mã߈^'ñ„üm/luO êžðö‡àÝGEJð̾Õu‹+‰oýü;ãOü3ð7ˆþ&jzïŒô¯xóâðoˆ<-âø‡Dñ¯Â?Xhwl‡MJ—Gû =½„wZǘÁ;¾x_à?ü·ÿøOà½KÆÚ¯…|#ûxr- çâ<[ñ3ÅXjúwì/¯Ç¥ÞøÛÇZ¶»âÍcOÑUmÃÑë½üÚO‡,4 Ížn«ôo‡ü%ñ×þ mÿ5ýµ>1øwö5ý ¿iÏÙ{þ ªü/ñž•â/ÙCÂ~ñ¿‹~|lÓ.ües¯h¾>ð>§â E£hψÓ#Ö4¸Ô¯µ-K]‡Eáÿ`†ßµ~­ÿ~Ü´ÿÇ/Ù_âÀ|Pý‘t]#ú֯¤k"øt/a´ýí|7àø¾1iº4_ ¼Kñ&? øFòoxoÁ>$ñ.™áÏèž8ðî‰âé~“Ä—©ËJ‰I{?«Ç‘]Zÿ»æ÷S¿7773j÷ß ­¶šójìÿ>Öµºþ ÿÊr¿n?û2ÙcÿR¿Wì½~W|)ñÖ¡©Á[¿jMû|Mø•û9xO_ø(¥¯|M—ágÇ]3Çᧉt?„¾ðÖ£à];áE¦¿á­_㎭fÖ<;ãsÅ7gá¾·i©Zµµ´¶>ýQ®Y«5ç5ªevnÞ^é= Š(©¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(âø)ü˜Ïí%ÿdýÿôõ¤QGüþLgö’ÿ²~ÿúzÒ(¯Sü)×Çÿ¤ÀÊ{¯OÕŸÈOüµÿ) ø#ÿfðÿS¯5üÃi‰ob%€ò˜Wc30UbýÔ‘¨WØ HѰ,¾Sy»Hþžàí¯ùIÁû0¿€¿ú|i¯æcAŒ4™pP@•IP¶î‰]ŽX‡ù¥HÙG”dY¤ÙþœxK>O 8Aõy,"¶ûXŠÑêšÙ¿6¶³³?>Ïê{9㤛j mçǪkfÝ·iYkc£­=.ÐÝÝE\¦|Ézä¡*C ç‚Au9k2ºÿ Ĺ”€X¢Vçp38ôÃêNW¶9ûKÙÓ­Y|Tà”iÔ|Š^©6×§{‡¦ªUŒZ¼Uå/E­Ÿ“v‹ë®‡¢èv <¡Ö2BX•r ¸9ÆjÜÀ•–ù ¯¦¼ á¦Y 'ÎNLÂEUY°.”q´á@eÜËͮҀñÏéáæƒ#!ÈÅY·ƒ/ à·å…J¸ÆÐ~` ¶þhI+Y"ƪÌÑÅ@vtŽ8äd åbmÍ€²FªÁöá~W0®ÔT·6²zéîó9=o¥=­fÚ’[Þ?OïmZ~Ê7³[¥)Yßâ›zÙÙ$Ò³õ ü!–ëH‡ZÓby´RñCxt—MÜŠÄYj1ľpiù´ù±½ÌH|É’í§…~Èý˜>¨øïðBcfd>.ü0šgÀU‡ŒtGwò‘Qr 's›¸ñUó96~é2i[\Û[Gwo$ kwaq“i©Ø>%’ÒîXCÅ+"JóFѼq½ÜSCsok4£ÿ¾é–¿~ø—BYn45øŸà$´šC5ï‡îGŠt¹†¦Ñ«<2ººØê$-¾¤‘¹&±umæY®{(GFs:2Ãâ%R´e+ÓŸ³…Y¤Ÿ;÷l¯éÝE&¬ûhÑrJiÙ)Ù¾W)I§ É>‰¹{ÖåŠÑ6ÜÇ}kàâlÜöÏXˆ ¹w³o‘Vf•Ôl^eóâE(0»×çðO|'6:{j·i"içÌK$‘]¦½¹ŠTIã·a7Ùl‹°¹¹uÙȷIJ̡¿m&øW¦Ûiø“_Žxt^X,ôøeXïüU¨B‹+éºt’Ö––Ùµ]m­Þ.6—Z•ͬŸ|_Ò¤Ôî®o'†ÞÝ¥µ¥„ }?M³Vqi§ØÚ9 µÞXÈlÏ6ë«›©§ººiê2|Ú†&¤cJÑSZÕ«'Rí«rBU%Uó4¹¥(µKÜ·´r„yëR•4§ÌÝÚWK–I¯çÑ;éîï̵æ²iþ0x³Ã‹fÒmÈ”’¡‘³Ÿ0 0FÆÂº†P7¢Œ$Â(þ{͕֬ë¡ûÂò30ùL#–©”ÚQ”[k«†÷§Ä}(¦½·ØvüòG¥üœ+Þû”•…ƒ  ~öb7‚ƒãŸ[¡„\MÁ#‡²¢9$ÑÈ‹É9Ú2Ä#ö,³ªÆšS«h+Y'©ZéixÊ;+¨§e{]EÕ½Výõï¿tþlñ8cŽÒí÷\Ŷì"rÖWW±˜ŒRK ¢@^{eŽÑŒfåfò홥@k迆º/µ;È©ñBÏ@‚WBë/‚¼i«HªñycNÓÈØ‹¾`H,T¢üÙ¯îŽí6Ø%·]á)vS4E¤E!îd1+¸Ã!xÔ®£¾ðÅì1\Xͽ¥‰Äq wrÉ"Ixãy¥ˆ¦æHƒóÕ⾋1£*ØZUUZÑ•ZnðT+äW‹ç¡Q;ËŸ‘I»EYh¬¸0òQ«R•¢”%{>kµ}÷í¢·3QÕ»îîÿc¾|3ø3Øy¿´ï‡ ”ˆã¿ÁŒ²ù‰"aXÍ€•Vhdœ )Q·Ú¯? >bÀCûEh7‰² ~ü\‹!ÕNÖŽãH#³æ ‹4Nî .6»§óWð‡ÄI¦\Ú–œ—¶˜‰˜1Ž)„eU˜XgEÁˆÈcLÈOê§þ 3û)x›öœ×­üY­G¤ü!ðµÌsjšÌ¢á$ñMí„ñ‘¡hÓ:Ç–É)TÕï`–Q˜Öv..~×w¦ÿ8x™R9.WŒÌ±ÙÞ6Ž4ãÊœ2»Ö©+Â)AeqJòi¨Bz>yÊ0ICéòÔëâ!NJN÷½|±÷Srn¬”`•îÒÖü¶wHý¿ý”¿f]'ÄžÓ¼VÞ0Mw@Ò4ïiÕàð¾µ¢]G&³¢jžÔ-#]~ÞÎ[ýÈê—Q[F6Ùê¶Æ+ »dšö1òí1ðkÁ^±¹ð®§ñ×ÂZ‡. ÙG/ÃoˆZ”:ù…Zç]¾Õ,´#g©jº¨U…­³kcc¾ËNHíRöY¿aÒ¥8Oê1t°ôhS§Ê¥Ví¯zvm¸{Fï=´/4ŸÁÛŠ“_œ´ŸÁ/ƒ~ÒÚ£4’îŽOƒ_dRæ7”)ž”ÈÁ,гFBdÄÁü\øÇðßà…Œ÷GOý¥´=VM³¬QGðkâý®æmò d7š %ÀXÐ,ª«NcW˜à5}ÑûFxÊ[kíGKº„C{€È‹0’2¬7[Oiqle·º¶“úü.Ö÷QN—òʉ+?ãÿÅ eZêq›ö´Ê ®±æH6·e}û~ø*Ø?Øü%9P£FSÍ3:©Â“ŠŽ*åi^òæ–]N|‰»ÂÓ|Ï™IÉDù Ræ•KR§e«u®ï%öÚ»–Šéi«¶ŒíbÝÂVðP؆]#Ç–ºñö¼ýšVÓËð¯Št†» ñŸÁNSv¯kn©‰…c`ɉ UW?éÝ_å·û M»öÿý„£çþOöl“'°o^UUÁàáŒp˜<ÿRJþsúXbþµpT¯Y¨dxøÇÛ:.|¿Ú +û T¡gfïÊÛwW²GÐðŒT)æ1´oõŠM¸©¤ù¨¦¥)ti«YY««Ü(¢ŠþK>À(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šø‡þ Gÿ&3ûIÙ?ý=iQÿ#ÿ“ý¤¿ìŸ¿þž´Š+ÔÀÿ _õñÿé02žëÓõgòÿmÊH>ÿÙ…üÿÔëãM48¶wcò;aʱœ1*b@ÌIÁ”I.åTˆ”0m¯éþÚÿ”|ÿ³ ø ÿ©×Æšþf4 cÛ,#\´­ò|Ï¢b@x1|£)É•YÄ€ÿ¦¾¦ü'àëtÊ)7¥ôXŠßv¶×^ÏGuùÏ&å‹·J°oFôJ=¶ÖÚÙ®ŽÉ¶º˜%Ž&Ý%´7#’f¸Uàóÿ÷ïÏCóý<×±ø+ÄúŒ2¯‡¾ ÖÎÇ¨Ýøþ ÀªîÚOŽt¶þøqñGÀö²Æ³þÎ5-íÁ’÷\ý¡‘É!Ë 61ôùx@6ŽFrOèGÂß‹ßLѯü2÷Àˆ 32ø‹ö™Þ¥–éÎý¢äˆ™å£f-!T ì øéàûý’ÛbÀŒ£há%ã Ä•bà‘»’ Àãí?‡šòBläG ÑmPÅ"Pbdp_bü²ì•Ä¡€I6€ûH_‡Í2úsR>){X8ßë¸ÛGš—³M¥^ÖsviÙ$›³ÕI ÷岩8·É¤šjWå½¹]Õ×¼÷Õ«þåü5ø›à{–±x?gÿ„ve›o­|y DLÅ$÷ãmÐpîûÐ"†á@ÀOÒ?€>&ГÅ^Õá÷‚<-c«ø«Aдɴ˯‰W:–¯ª\këý™i¬üDÔ4Ùmô[¹â¾Ô5=BÒîÒÅ’£†ëP»··—ðëàÿ‰t¨ã‡T×®t˜d‡ÊÓ­g[kíféS¦ÚNй·X6æûWx|«d¢Iî¯!ŠoÐ/‚¿®|AñŸá+ݘÎ>#|?Ó¬ìlƒCa¦éëâ­2;[ KiÞi-í¡‚¼†K«‰ ÷×w7W—w7þGšdu«ÓÇ:kjTª9¹âñ.Ó'ÏNÓ©;´ ¯$œ`Ÿ+NNðôhVQ„"ùy”¤œo6¹–©»$ÕäœZ»è} ñ ÆÞÔ¬¡ñ·Â߇ڶ‘ †šÐÜ_üM·—ÂßIº³Ò¾%ØÚÚ[7—=Í͵¥­­üs9V½kÂÿüGø›àˆ ¸Y¿gïƒ÷Mæ]n5ßQ•f+0¶øßoŸ?kÅŒ(,wµ—nçâ¼ÚK™bò¤‚hZ GN¾]öºƒòÚ]AŘehíÀ0Ëk<1OÄSÇ ±|}ñ£Ä6Ok6·áÛ©[B¸w·kIåYnôME0M– ÞRÆcQ¾êÎõ¢ŽÚþ4h‚õoí"öòl®YtáðÅ7V´cGØã±´âå˨M­>[r&¤áï§+¥d¥–"¢¨š‹‚”;¦éÍF0RŠÕ&¥¤µå¿"WÒç…üXøÁðñnïÃ~Ì?+&&~ÒàÉæE(FÊ~Ñ),A ±>aàü›?þ!|Sð-ßÚRßözø9dÆFp¶š×í"k¨ÊÈ­{ñÊ÷>hRN]€Ú»7|Þ‡ñ[Öã·˜ûŠ*0¡<¬·Ï† €øm€Ê-°ªükâ»Ï2I€c†”ªÀc‹;†FxYHaón*@P@ýc)¬èÆ>ÍWýÜŸ,§˜fSR\±‚¼^.7¿»%¼\]­otó§ìåkJ])ÓW„ršiFÚ§­ßVr¾.ñ‹zéqmðûÁÚP14e­oþ >ÏÞÿÆz™Â8gi o!”Ry½#T ,°Ecobc‘¤Ò[ǤFUb†ê{‰“`ælÝü¢GËæës±2DT,q${¶³I3²ÈT!b0ª™Ü².1KÃ:n»â nË@ðí”—ºÆ£,BFòÁg nµåÒ Ý$P¼ñ,6‘IÅìþM´-É$°ý&kÄtòlƒ™æù’Àeø­V¼êNP‚R‹§ÝÎ¥Zõe5JŽ.u+U”(ѧíÃGªc°Ô)Rn¶&2ÃMó^ªMÆ×ömS§>t”T9ç)JQ_q~Î×x§â‡4I4ËÝrÃí–WýêèÌt‹iÏjúºÚ^ÿg5Ò¬‘ÛL-î®|ùãD6RÜ[ÿp²ßüçà^ð7Äß|#àß üÖþxFÎóZ—DÕ¯ïü#ícM&ký1䉵›]bÂòkk9­odÕuMfçQÒïD·ê/¥Áüø«âÎ…û:èqü8ð>© çÄ­v ú÷ˆwC%Å­ÔÑÅѳÛ´yæh„QÂ¥m£[ újI¡àx‚Ö ‰.o®¡â﫱»‘¤»hå¶½‘ehQ5ºê ƒ÷mx‰;DþT ñ|_xçŲ§Mb0¼3•ÏÚIÎs< É¥V¥åÉ_7Ç¥5N”ST—2‚x|5jÒû÷O `Òvž6²³qZº®ÏÙ¤“ýÕ'nfÕõIËžJ1þ©çÿ‚ˆj¿¾=é°jºW´m/âÉð·<òKwq%ÇÂÛGâ-uæ‡ûNñ(Äc0é°[¨2_jœÞ(øÿ-틢ܙÆ>j21yÛ$\»7—"ˆÜ7—Ý0ó°ë!üððÅ»'Ä–z€¼•Ú+@Y¤HN¡áMwOp‰Ã*8¾  ÕÀÏžjŸ®f€ ¸•‚NX¢+T]í.ïŸq F…E!sý•pV]•ra°X%K C †¥J.NV•:˜™TIòªµ*UuªNs眜œå)^ß5W:ÉÊ¥U'9ÊRw“MµMrF1“¿&ê 5Ý–§ÐŸ¾.MföWWt–!¢²ye/-¬lìÍ|2´™Ö;týÌLZ8Ô  7Ã>+×ÚþYríܹ-»dhK@y„€[Ë "Ç–ej5ßÏzÎåpͽž@¨H-óc"&Ð$b mb#·7Œëz©¹v·U8åÎðîL„Œ¯Êª«ŸºÊ쬠_˜¿ËrØCD” ¯*“QJ0‹k›–1²nrmÚ7rrnÒ»g‰ÄFŒ%9)]I$´Œ¥Q§%ÌÒj-Yò«{Ÿ÷”`þ®ý€o÷þ ûJrþس2¢ÈÇÆ¯\€;’ÇŽ¬NOZÿTjÿ*¯ø'üŸÿì5ÿg‡û3êêðMª­"ý)䥟ð­—,VOŒŒc{òÆ8Ȥ¿Vú¶ÞìúN “ž0œå,M6ú-i½—D¶Ih–‹@¢¾^ø‹ûp~ÅŸüe¬|:øµû_~Ëß ¾ øwû?þüEøÿð£Á>2пµ´«wJþØðlj|[¦kzgöž‰©éºÆŸöÛ>Û¥j:…·›iwÒz‡Âÿ_ ¾5C⻿„þ8Ñ<¦x/[ð߇õÍsÃRͨørKÿ|*øqñ»ÂÓøÄ‘Â4èž øWñoáߌt¯øGQ×<9yaâX-aÕ[S²Õ,l–yd•ÚvÞöv·{ü×Þ}±ê4V&•â_k·þ%Òô?hšÎ§à½n xÇNÒµ[ FÿÂ~#ºðç‡ückáÿÚZO5Æ…­ÜøGÅžñLV©­üÞñ/‡õÈàm3YÓ®®véQE|óã¯Ú¿öyøqa®jž)ø¡¢&™á¯…ß´Æ]wQðý¦·ãK 7áÿì‰â? x;ö’Ôg»ðf—â s­ü$ñw‹ô? x—ÁQÈþ8o¶«¡é~Ôu?xŠ×Ji7²oÑ\¡¨¢Š@W—|RøÕð«à¯‡.ñ&‰à{ør?Ká½VšÎÿľÒÌ-©ø‹E´¾õ,÷¶gÞÛ€QEbx—ľð_‡ Ñ<'á 蚯‰|SâŸê¶‡<5áÍ Â}S\ñˆ5ÍR{]3FÑ4m2ÖëQÕu]FêÚÃN°¶žîîxmá’EÛ¢¼»á/Åÿ üjðåïŠ|¤üQÑ´Ë nçÃóÚüZøñ§àˆä¿µ°Óug²ðwÇo|8ñv¥¢5¾«k·‰tíë×—ñjZ]¦«>§£jö–>£CMhÕŸfEPEq6Ÿþßÿ`ý‡Çþ ¼ÿ„«ÆÞ-øiá²x«B¸ÿ„â7€á5ÿ„ëÀ“~ÿÛ6ðWü+oˆ¿ð–øWOûF»áÏø@|ký±agÿ¶»öÚ€ (¢€ (¢€ +ør×ÄzWƒ®¼A¢[x»]Ñø]àŸ|Eñ׈?³õ][û Á¾ ЯüKâ}cû+B±Ôõ½Oû3DÓ/¯³ô}7PÕo|³iö7wrÛ~ ñ/‡<'a©âŸhžÓ.µ¿ xj×Qñ«a£X\øÆž#Ò¼àïÁw¨Ïmo6·âÏkº…¼5¥G#_ë¾#Öt­K‚ëSÔm-f,ûo¢õíø¯¼ º(¢€ (¢€ +Ä%ðç„ì Õ Õl4k ŸøÓÄzWƒ¼áø.õí­æÖüYâíwCð·†´¨äkýwÄzΕ¡ép]jz¥¬ÛtQEq?þ"ø7àÿßüZø‹¬Â;ðûáw‚|UñÇ^ þÏÕuoì/ø'B¿ñ/‰õì­ ÇSÖõ?ìÍL¾½þÏÑôÝCU½ò>ͧØÝÝË ìmEPEÄøÿâ/ƒ~hV%ñÖ±ý…¢j~6øiðêÆ÷û?UÔüÿ|`øá_„¿´³hö:…Ü_ð‘|Añ·†•¥Çu‡<5â rHLѵ«mº(¬MWľЯü5¥ëž Ñ4mOÆšÜþðvªê¶uÿ‹Z.ùË÷ŽÖ €Ä€·y~µã)¦Þ|Ó¶G›#1f vå#Év÷n –ÙÈ(£”ÆZPV’TÜ¥'¥)ëÏ{5·¤i;Y$ÊSÒíêÚ÷"¹¥.[5ç¾¶Ò-%¯2÷z_x™'–Sm!Ä„¸Y˜³[©œî DbÈ­&Ó!Þò«À|ù©Þ‰¥yNDq®¹Àè:€Y˜œI Å«ºž¯%Ù˜ªZGfl UT "ü‰Ž a q73Üj0iº|/sws&ËKh‚ù³È‰r_ HÙæ“÷Vñ,—7†|½Üð™v¾3ˆ£ƒÀàèʾ3ˆš§F…JóJ’µ”c{_Þœž‘»Š.0•i¨F.M¸Â䬛÷iA§iT¨ÒÙÚ6µÔT”rf´ÔµÍRÇKÒíMþ§©Nööv±–%œ´k4ó2 ž @Ñ‹‰ü·hŽØ#Šk™í-î=gž+Ñ¿f/ ]hEÂjßüK­éUôx]&·òÚ[[Kdšâ-s¶G¸´î/§ñ°4õ¯h³/…ŸUœG©|bñ4 -m7º³Bæ9•YÖ{HâóÝá W4ò]•¦ÅlvͲÛK?&Ïú½ø™Ú3äŒ}™Ÿ,~o)P*…‰ãôŸ ü5šR™·u,Qœº9w]ÈŠãr¯ÊÀ»Åa]ß2„ufûGötø.×ß¼!nlçm3Æ­ ËðßÅówM¾p4›°ÅXªîoß²Œ»&ଆY^KARÂápõ«Õ¯Q§_ˆTo[ˆ¬­í+Ôä\ܪÔátéFiÓ§Ÿ­V¾6º©ZmÔ”â”)§ÉM]rÆM§h®gèÜ¥¬›rü½:f¥g²q¡vI «,L¹Sònb®Û<¦“,¤sÀ$”¬®ì¤´½›²Ñ¸ÊÍÙÅ4ÒݹYŠ” ß'=ùZp’q”¢ÒRp}èö|·wâ|‹®3-«.©ä–$ÙÚmý†ÊìË s´°® ºŸóóùzq^Ñ®hÞA’£o)Ù£pÄùˆûFI`¡T¶æØTÉÓ œøíÌ- ÒFÊU£vFçIæÂîc  Šú<4•L,¡ïSš©$šw„•¹•›nÎ×è“OCÆÌcgFJܱ‹†‰êÜ¥4Û}lÜZ²³ƒÝmõüúêx¿à¡°u¾ä1ËûdþÌ ØXÎTürðPÚñ¿˜àªˆŒr©ŒVPNÑú·×ùNÁ?`ÿÁ@a>y0þÙŸ³…‹k&OÆï|ó#%P»Ð–ˆHÎU0¯õc¯ã¥D¢ó¾åŠMdØõ;-åõèÙ¿6­éÓK{Á’„²úü±Œd«¥S•[š\ŠÒ~n6Ó§M,|QûTÿÉtÿ‚jÿÙëøïÿ]Íû~×ç—ÆÏjºÿ»ý§ü?ñSãg…þ þÎ>6ñ7Äÿ‚Ú'‚¾,xËÀ|/ñ?á—ü³ö9ø…¥xÛžð¥á­ã§öÆ·¥x>Ó^ðíÅß„¡x2ÓFÑ>èvž4ø²¿W¾-~ÔŸ¾ øŽËÁÞ+oŠ>$ñuÞ‰mâ[Ÿ |ýŸþ?~Ѿ#ðï‡5ýKKмAã}ö|øeñ?Sø¢x³SмM§x#Uñů‡¬øKáþ«£üAÕ<\¾´ñf­á嘹+>WnT¯Ýs©on·åÓ¿ÈúûoëMü9ù ûH|PÖì>3~ÓÐ|Cý¢4O|+ð§íy¨øCCðÆÛ_ö†ÿ‚{ü*–þïö ÿ‚txÛÃm¡~Ùß|;â}OÂZß„µ?üdÕü=û"\K¢xsãìß>+üv[G^ýœ¯¯`ý(ñÿü.?‰¿°}‡Š>Âì´ý —àŸÃO_ <;ñ[þoƒßü_ñáöá_Œ>øMûFéÿ„ Á>ÿ…­ão iŸ ?iÿøvãá÷…¦ð·Šþ$x#HÕ|¤ÝÛêzGÐßþ-xs௄ôŸø¦Ë[¿Ó5ŸŠ?þÚÁáûk «øüGñ÷ãO€>ø:öxµKJ·]MñwÄ}Qñ-ÌwRßÙør×U»ÒôÝgS‚ÓH¾õ´‡»nVµn鸥},·Ñ¾¯MtVgá·Â/Œ´ßÆÿ? ô3­kv?lŸŠ:í½ðçÆ>ñ–¯£xŽÇöGøâωvšL­u?]\xáwÅ?øþ !ª|gø7âo Eâÿ_þß¿¶$qxgCyüm§~Í_/~Ñ%ñ‹> þѧŠ|A­ø—Sµýƒàê¿ Zê> Õoõ›ûox/ööøIàïx~ ½F{›ˆtO øGBÐü-á­*9ÃBðæ¥hz\ºfikîOÃOÛ?öjøÁû?øö¥øuñ'þ/|má_‡^ñ×ü!Þ>Ò·|eãoö³‡†4øF5ß iž1Ó?´þ3êv> þÐÖ<=§éV^ü$Z…õ§…"›\ê®~Y_“–ÎÖÛT¥Õî“üÖÊú+7mo·èÿG÷ŸþÞ~+°ðƉû:Áã߈úßÂÙ×Äÿ´4¾ý¨¾&i_ x"oø]ðÿÂ+íWWÑþ%j^ñ?åý¡þi^ý þhŸ¤|Bøeñ‡Á-ÿ ǼWáÿꇉ~ë:V‰¥xšû[žûÃ?ÙËâ­‰ð…~þÈ^ ñ'‰ Ô|KûJ~Ó |8ÿ>~Ôþðwì›û5ø‚óÇz§À¿ü]ø£â†Þñžƒªø+ãçÃ[Ž_µ­‡ÂõïÚ;áçü]ðµí|úOûl¯Å¿ÙGÄ>ð¯Á_‹ß<]ÿ “àŸ‹<{ûBkÿh߉é¥jÚWÃßÛoþ ¿ð÷âÄù|y Ÿ‹4ŸØkÁ:GìûûGþÓڷň_²/Ã_„ ø)àÝjçâ—†¼ ÿ‹øNÞý䢟µÖ>ï»'ÊåtÔÒÛN_ÆÉèЭ¾»Û^º[ó·â÷?›…ž"ñ÷ÅoŠÿ¾ø'ö û'ìåñö¡øàÝY?d¿ø(§í+ûs}·Uƒö,ÿ‚—ø÷ãoƒu¯ÛGã_Âß ëz7ü,=À¿³Õ®¥ðCáÇÄ _Æ_?áðßíàSðâ¿Å‡µÏÕßÛÿàÔÞ-ÿ‚kþÖß<§|Qñn¦¿²ů xCðÿ~*ø—⯌6ñoŒ ø—âK¿Ú§?t}#ÂÚ÷€¿iÏüvøIáÝ áŧß ü=𖉫|OÑüm·áÿ‹ÿuŸÚž}Qø½ð»Â´T?·—‰|+‚|Aÿý©.~9]~Ìš탪øsKÒ ÿ‚Cx[à—‰~.‰ãOØ{N´_ |Rº·¶Ò-~ëºWíëã‰^Ö!×>)èß¼~øËðÿÇF©á G[ñ™¬üQø¥ðj GJðWŽ.¬4ïˆüGñ+Áßtïݧ‡ ¿„4Oø»á'Ž<-|W&‹àøŽ×Ãú†|G¬ê~9ð-¯‰=F©ÔÝ8»ì®ÝôJ6z+«¦äš³oUp¶Öÿ€ö¦–Çä?ügâ_Äo…ß³…õ߆~?ñ·Ã­nãþ#ÏÖ< â­wÂ:¬ÿð‹ÿÁ(ÿà¢?|5çj¿Óîåÿ„wâ‚|ã­ |Íý“ã/øcÄúÙõ½J¾´ùãþ +ðÂo…¿ ¿iŸ„Vßÿhoøsãü‹þ Uñ¿âÅßÄ/ß|Eâÿ‹¿³|ß²Í×ÿèšt>'Ó|#ðgD¼¸øÁñ2|ýž|/ð‡àÄ?x©¾øÃá>­ðÛÃþðw‡ÿè©N^M>·­¹®îºiÊõ[ê“ÒÁmõݯ»M>vüOç›ã®¯à_‚·?ƒ®iÏž ýª> ÿlÿñ¾ø×öêý£_â7Å¿´þÊ¿ ~&|%ÿ„Kà~9]ÏûqÂWûox«ã?€tøZ> øóÿ ÝþËÒÿoxá¦ð§ÂÞ¡©ÚøãFÿ‚|ÁM¿j9>9þÐÚ¿ÅýDÿ‚ÈøWáÆ§¨|møkáσ¾øQûE~ÕOÃ}#ែt kEðŽ—­øãáþ—¨ø3â–¹£ø‡ãOƒì.Ÿáï…¾%hß4|9ð—îMý¦‹MSM¶ï{+5¶‰½^ú·½ÂÚþŸwåcðoö•Ð>#|ÿ‡„Â1ûLþÔ7ÿðÉßðO/~Ûß¿·¾3k·_Û_µßˆÿá¸>ÝñwÆ¿ÙðéÚ> ‹þ§À¿dýŽô/øG?`4þÖñoû(OöýûŠøýûT^X~ÖÚ«ðÒóþ߈ÉûkþÍ_üUà}Wþ ûUkßü9ðçXý§¾~;?ñç?à—6ø_ñ?Þø“à n÷Úç‡|_£é^4𦅮xÅ>ñÆÿ„|YáÍkTô»ƒkkݤôŠiÙY¦Óm;­l7ÿîkúò?œ½NïÅ?³'Áx3öNøñ³þãFýµÿà§ÿÛßnþ:ücøùñÃþ1ÿþ 5ñ›ö.þÞýŸ>*øçâW—ÿ Ÿþï…?|%ý©à/øÊ}wNðWÆOÂÓñöOŠ_Ô~2üGø~ž'ð/ƒ¿àžß¶×Åü6ñ®·û?蟾&|3ý´¼qûgßü$øâOø)‡üá—ÁeO|lø‹ûHh? µ¿|+ø—ûXéÖo­l|û@øsGñŸÄüTðçÃE°ðçôiE?kªn7wmÝÝJîþòqÕ/²ŸÃæ+yÿŸM/çm}Oƒgo…µ‡íû>xsÅß|Að¯Ã³Ïì•ñ—ÃúOůŒ~/|lñ—ÄËÏÛ_öƒø;vž:ý£~'øá'¿Ù7Gÿ‚ºx‡áŸÅM ÿÙêºOÀÿøö}ð÷5=wö¼ox»ö„ý™~\xŸTø{ñ?Âß þ|<ðg¿y+çŸ ~Óÿ µßÙ?Ãÿ¶†©w­ø/à†³û<é_´þ£â]k¯øOáV£ðÚŠ×w~ ð÷ƒ¤ñeÅη¡xFi&Õto MâY¦¿µžÇC“Yvµk™Rw¿-ýè_ÎÉéµýû]þ¡ó¶O»_—ê~xâíä÷6)¯þÓ^ Ñ`}cãgÂürñïÁø)íUûTø7áŽÿ€ÿ·‰¼E©øËþ añ;Ÿücð;þŒþý…ü"~|<øõmÿÖª<¥x—HðÞ—ûbã_mû4~Ó >þÖ_|I«þÔ¾6Ñ?a-Æßµï|Ký¨?hÿ‹zßÂMGÆZßì÷ÿoø‘ð³GÒ>.þÔ~:Õá2ÿ„ËûWö«ø¡û:jð•ëzWŽþk¾#ü ¾Öþkz–»yý ×—xá/‡>x³ã‡Œt;ÝnëSøûñGIøµã5[› ì4ßèß¾| µ²ðÔVšmÅž‰'„~ ø[QžÛTºÖoÛÄwþ »R‹LºÓ´*½¤_5âõ­Í£z+»§ïZþó¾Öó yöü-¢ìµ^góÍãO_|¡þÍrø7ãïí ðâßâßí ûnèx‚ OÅžø¡øqàãOø'×Àÿ‡ëªøâîzšf·ðßà‡Ä/ü+ðÿÃß‹ß5+øÄ%øIâoê¾(ð]ïµþ×Zª|øý¥|ñ?ÄýÁÿ³¯†¿gŸ†Þ ø;«þÕßðXßÛ7ö¿ñÅ_ü]ý£§øóñÛÃ?>$þÖ:Þ‡áÍ7à2ø›Ã_~!ëþÎÔþÛøJÐtŒZ„WŸ¿õåÞ8øËðÿá¼ÓGãmG[Ð-áÖþ øiuyü㋟^øö…ø«ÁO…>Ò¼Qaá˯k:Þ³ñ&ëLÐüA¥i:¥íÿÃÛ wÃ^)ø„ü#âkº˜ªj’†—“²m?zWZ¤×»¦Ö—h-çw¦þVüíýXþl?i_é#ý‹ÿmý+öíý£>(Ëû]èÿ²žŸð?á…~.þÓ³µÿÆO_ÿÁ6þ xÃÆŸ4؇ÀŸï¾(|.»ý¬6Cá|2ðß|1ö¿þ"ø7áv…aâ_kØZ&§ão†Ÿ¬o³õ]OÏñ—ÆˆÞøKðëGû6c¨]Åÿ ÄxcÃÿÚA•¤ÿiÿjë·Úf‰e¨jV˜Ÿ>-xsãW„õoøZË[°Ó4oŠ?>ÝAâ k [ù~Ѻ׊ü{íãÙ׿´7‡¥ýßüwöXñÇ|Káÿ kÅ–ÿµV·ñ;ÅÞ;ÓxDø“ñâ‹þ#ø§ÂÚ<77Æ/x/â_Â-¿gŸè_ü/ðþ ïûfþß0ø{Ç>ø«ðCáß¿‹¿jˆÿ tëø'¿Âïƒþñ_Ç|Iø—àéß5…V~8xá¿ÄÇý”%ºð?ô3âXxj GQƒ[¹·¹Öü5áøãðÿ†¼GâËõ¿ñgˆô¯ isÏ¥ø[JÖu;]×SÖm.¼Kâ[«H|9à¿CªøÇÆ:®…á \×4íº~ÓMc}—ÄÖÉ&•ž¾ò{©IÉjîýN¿-¿ÈþWÛÄéñßÁ´gÃÝSÆÚÝïìõð;âü#öˆ²ñ_Á¯ø(wí›ûS|?ÓtMsöáø‹¢~Ô?tïÛ_âv‹ðcÇÚßÂï‡ßþI©xÚ x³Æ³ÏìÓãþ#ø³¡ø›À´/€>%ê^í¾ üdñˆ~0øMð_í ðºëâIý¯"ð߀SÄðUÚãâ×Ç/~ÆZ7íI7‡ü ¨ÁÿÒ²ø_ñ7á/Ä=â—ìa£j~ý£(ÿ‚Žü\ðŸ|9ð·Á~1¹Ñ<¦xÃ[ñ/Š ø¥ñ/öðøÓÿÚø-¢ßøÃJÒ¢ð»ûNü Óõ¯jŸ|uoñëÄ_ þê:4žøá?†¿~ ÝêvŸÁ­"×Tùy>&xãâßü—öÊñÄ7ÖLjígŸø*O€`°ñ.¡ñYñ‡ü'ð—Æµ'Ÿ‡þñˆ~.ø3á߯Ok~ ð‚ü5áMWÆ|á>/¿Ñ§ñ7Åý×âN«â…?¹4T)¥®]c%+ó=m}Ù^êívÖá×—ÝþOï?œ¿Œ¿|9yâøsöý½þ(ü`ðçÄoöÓÿiߎ ÿj[ÚFÿÀÿ|Yÿ0ÿ‚oü7ø[®%½Ö¡ñà/ìã­üPøwñ;ö¹>ü0øgðâ÷‡4ÿøoQøâ¿†ß ôŸ ø7èoÛGÄŸ> ê¿ ¿g‹'ñ´ðˆx'Vñõ_ðU¯ø('ìÃã/ú¯Ä¯kÐKð¯à_ˆ> Ú~дíáñ³Âº·„m“\øO©Yø‡Æ_ ô¯Š_|'ð—M׿ásÃá­öºŠ¯h´÷]•ßÅfÛI+´–ÊévNËÌ·ß§ám—KÛú²?™_„;øÓñ{öý¶?n_ˆ´gí ©üoøû<ü-øßð~ÏÃÿ|YðëáW‚>.ÙÁ?bÏÚc\ñ}ÇÂ/†Wž ðÄMÆŸ7|QÕ¿m­;þ »ð?E—à§íñù¬<ð[¿ðWox_à'‹¾!þÆ~ø‚¿~|.Õeý7á&§à¿Œþ xw‹Æ^%øÑñ‹Á>"ñ—ôiE×[òÚÍ5gk$’åø~ÕÚÒíß}ËmúõÛ_]4ì~y~ÑÞÕ~+þÚ²÷ÁýCâ§ÆÏ|.×eïÛWÇ^=ðÁï‹2ø?ÿ Uð7ÅØ3GðL>"ñoÃÝK@øƒ¢Â)wãÝcZÒ5߇^.ð7Œ¿y©ø6ûÄ÷¿ ¼sñ?À>:ü‡×><øù|k¨xKã—Æè>ÿÂñøuð/Ä?´wücö•ÿ‚gÿoê¿à¡¿·ÇÀ?hú?ÅŸ‚þñ?Šÿlx/àGÁïÙSGø™¨|`ñ‡ˆ¼eðëÎðwu;íKÆ?´g_ë_fÙçSãßÃo ø[ÅÓü¾ø1û<üAý¬>Á7|#ñ[àw¾ü0ñgˆ¼9ûuþÖЭ†ümª~Íÿ¨±_‰|Gñ?áWˆ¿h-ÄÞ³¦~ÒŸ|oñ—ám•Þ«uá=#öyºšÃÀŸ³£ðóÃÚ´÷ZÇ€4Oг¯€þüxñ§‚µ©mu»?~*jºÏ‡< ©ë7^ð·×”R”ù•¹Ró_—ầÞÈùéÿ ×ïûÏä§þ.ÀÁ:~|GýŸo/Š?¿kÿ~Á¿|Cû`+öÂñÅ¿|,ðžƒÿ¾ý¢|}mâŸüðÏîüû;k ?j_ ~Î>ƒãæ‘ðßÀ?gø€|? |Lø³âÿ‰¿¾#j_W¾?øoá‡Àˆß<ûCþÔ_<û1xßÁ?´¯ÄOŠŸ~)þÙ¿þÂ[ûYiÚïì­£|'Ñî>9øCâ_Â;O†ÿð•|>Õ¿i_ø_öMøC¬|4ýžõìøÃÁ_ìbøc¦Ýx;ôŸàÂ_|ø-ðƒàOƒ¯u½KÂ?~xá/…µÜØ^xŽÿß<'¤ø;C½ñÞ—¦èÚeÖ·u¦hÖ³ê·:v‘¥XO$òÚi¶6í¬^£U*‰½²rê“w½µåÓ—ì«;Yv·íøZÿ}¿ùæøÛñ/öÓ?dŸÙ§â¿Áül×~.Yülÿ‚¦øöo»ðuãïø]_<5û1ÁN<[ûßê~ ¹¿ñ†k_íß üý–¾ |ø—ñGÃßüSñ7ìúGÄM?Å^)Ô>)ø³^ñŸ—h?<^Å—?h_…×!Ñ>éÿ´åÇìýÿPý®?ॷþøâoÛ7öIðŸ¾&x«ãŸÆ/…þ±ý†´O~Éúçíyã?ü_øsãxróÅ?t$wý”åø‘ð“÷ÿÅ_4¯|cøiñsÄþ2ñ¶§iðíúßï…yðm—ßüOÔü-ãÿ‡—ßþ×§ø6Ó⎭ãiþ|Qñ×Ãì wâ^§ð’- ]þ݇á”tÍÆšµÓö‰[ݾï{-dåf­gdôºÑÝ JÝÏeþ[uê~ üqð·ì7â¿~ÅÿüûUøÛÆß³¿Û_â/ü.¯ÚBÿ‚š~Ó>4ðoÂ?øLbO>‡þ¯ÚN/ÚsV»ø]ö¿ˆ3üðO†?´þ!x{û'Uø»7€¼/ö¿ih?k¼ñÁ¿t+ÿøXþÝÑ4Ï|Køu}{ýŸªéžGŒ¾üFñWÂ_ˆº?Ùµ‹>î_øG~ ø'ÄþþІ 4­[û3ûWB¾ÔôKÝ?R»í¨¬å.d—½¥íy_FÛ}·{ùl [úòKNËCâø)ü˜Ïí%ÿdýÿôõ¤QGüþLgö’ÿ²~ÿúzÒ(¯Kü)×Çÿ¤ÀÎ{¯OÕŸÈOüµÿ) ø#ÿfðÿS¯5ü¹×õÿmÊH>ÿÙ…üÿÔëãM.uþ x7ÿ&¿‚ÿìOý?\øœÇý÷þ5ÿ¤Ä¿czläw ‘Ò¶l5›‹@#âhAÿU!9QÀÄRrP”†@rBI<ô¤êYJ’:ìpêpJCÃ4^bIHÈža™T¦Ö3×”¦â:‘S…õ§>¼^ð—š¶»«Ÿ>¥RŒÝ›„âõZ={4îžû4ìz-¯‰aOŸeÒ‚ÀêJ•tÏœ¿(ÇÊàÁÙLk³söÞñªÚëš=âj+ºÏUÓn†è<¡˜o­ÜaŒ Ãæ%äPÒp¨ÌZ )Ã)R2ÁV”óó)È S,®Œ¬¤«+VRC)!”‚0ÀòÁ_mC‚ú¥-V¤ÕÂkIFî)III7«oK+ku²׫s·%k³‹M[¦l¬µ»ÓW{³Óåñ(˜m§pVÊœ »Y™K<‘ÃI4³:E1#I$²ÈÁ#Š8Ð’I•Y݈U+äsyeô±X¼Ej²T0Г©:³§F•*t)ÞµJÕ›JãË9ÎO•S‚|ò÷:¡¯(B•8^si% ÏžS—»Ájä×$T[“æR²¼’޼ºö¡u¼1=ÅÍÌ«mc§Û‚Í=Ô„ùI<‰Ì0\Ë;¬è’\LðA’'¹Iu þÍÞoxžh5OŠ$€x|™,¡Ø&†ïd»^ H^XîEÝÌ[É­Å¿–|9¦1§Aៀ~â7Ž#·½ñ]ôE<+ᦎÞyçšE<Àë*&œ½Üùxoå·XâXÛ—¿ùM«|bñ–¥ãŸê«w÷FOßG}4Rª3²´ŽÝ%’->-ö™#(óÜË;¦û©n¥øËޏ×:ñ{ˆ0üÁT§ ŠÞTŠ«NžaõyÅÏ3ǸÆU!•áU0Ô\eRµOg^tg‹©…ÃPûì³G$Á¼Ç5šxÉEòÆn6ÃûHÿ ’mBXŠ‘\²’vI8E¨FSŸGàïëøSÀzœöãSø¯¡xt&ÕÛ?þ"ßG M•€Å—á»Á TÄlвFIW]¿¥Ÿ~ü‘afý§|G–øT¿„ˆš2Ï,d‹n[#Ë d_Ÿ*αŸÚ²ʸ #¥’àib§UÊ3,Áeø¹b1Ø©(©×›£‡Ÿ%8§8a¨sMP¢£ç7:µ<ªøº¹e^N Ýä„=¤\)sM¦ãÍ%¯*‡<ÛŠr½í¤O}øðÓK× ƒIÖ„6B壗EÖü¬.ñùˆj‰-.‰zY£c›>—p±]G¹¼ø×ô¿özøu ü^ð审`\ÚZxÜÜÃ夆EŸáŸ‹#ŽxYcòæ†í&Š{w‹Ì¶¸‰¢dÅ$•Éüøað‰~É,´'„oÃåãŽ/†¿í²)æÍöŸ¢Fì$rp ¿˜ÉˆÛ¿a?gOx UÔ´x.~&èÚ×ü#?ˆ¤Ó5{øïNºÑí¯|9®Û›{»½cö2hÏášÖÊKýï$,šn.íëó¾$â XÉÿ´ÂšÃÕRƒÁâÒ…éµNj ¤Ÿ¹(Y·¥H§'Ë>Ì5.Fã.gfêÆ*)5d¥)ò¹&“æWi¶¥Ë$~jß³¬š•Ä¢+KM/O±‚çYÕ.S}ž•eÀŒÂ@žlóHiö†¼ÔuŽ` ÏŸÎŒ¾°³¸½O³6úlÑAç€ofHÙ‚\ß $b.%Š-»,P"µ´A‰KËéûãG€>Ù[§†m¾+xoÃÚ”©q“xâ\³ê׳Zãþ ^kO ËeulY´Øl¤¸²°Óä0YË,ÝÞþ?|oø[ðgmÔ“þÑþ´È#ó>üpG/˜…ö<>¸\»c2)”îÌ–%•·úÜ9ŸÎ¥h)ýmÓªâ¹c‚ÆM(ÉÆÓq§FjU#ñ©'.WU~džxœ?.厶vœT.Òi©:œ·•Òi¸¶íîÉŸÏÄ/ýšiÇ’¹MèP`(l·”ÊÞiPÁÈ$'A.ìü¹â;P’¥ÀÚ €Å&3–xÁÚøÛýÌ.sŸ•p£’T~.|5øA×gý¤|!rc¯Ž‰6²˜Â›Ä ¾ÐÒO ±U)tüøñׇ¼#j'];â&‘«,sÉ“„¼q`|Íß*ÀÚ¦…gq·Ì§såŽÐ F7ŸÛ2Lj©ìŸ&!'ó`ñ”Ò„•¬ý¥¶ÜµÖýµ´ðñÔã*sMÓ¼ ¥ÞSV—+}d¢•â¤îö”šrNëÓ¿àžòÿ°×ýžìÍÿ««Á5þªµþV?ðO˜¢‹þ û$71Ý ý±f}²ÇÑÆÏ…%'Ž7RT+‚0‰ê_È¿JUlÿ…ìQüq‘߳èÒgÒpB¶´ÓOfšþꮟɟžZŽ­¿d¿Ÿµn«ñSÁ?5¿ þÒ¿<#ñ¿á‡Š¾~Ï_?i )´­ö^ýœÿgïø7ÆV?~|Gñ7ÃïxwÄßîüJGÒï¾$i_²²^ƒÿßÃkJ×¼ão |\‹ÆÚ“üÖ¼wÿ F»ñGãh^ÏÅ[Šö~ð?†~0ø'Å~_ 'ÃOx+Â>ð·>é¾ø ið‹öxÔ>j³‡Â¨h¢SrM[vå«»»¶ŸáÓEÓ¾÷IZÞJß×õúÎ_‡þüiø%û#ÿÁ6|=á„uM3öƒÖÿàÑ~ÔŸl|âÍ{ÇÿhoÙÓÅÿ°–¦Ÿ¼e¤¶“o¬|&ø]¦~ο³7Ž>þÑSx®þëDð¯Ä~ÍáŸø/SñWíãoq?²/ìý­è¿Áþ;ü4Ñ'ñÏ€>xá¿o»_ÿÁ"?hoüLøùa/ìÉñ'Àß<ûKþÙ¾0ø­âÿÁC´Oüdñ‰âhŸ~ü}ñí]ñËCø{ñwÁ?o| a¯øÿÁÓU^ÙÙ«|M¶Õ¯­×TöZ+Yèô -<¶ü?Èþy¥ý”¼eãÙWÆÞý«¿g?|\øÏ࿟ðL_ŒÞ*—ãVŸ¥~Õþ)Õÿf¯ƒŸ³”Þ?ð§…¼qaázÓâ§¾ü>Ðlÿ|fø_ð÷Sñ_¾=|cñíñãÀŸ¼ àïø(ÃO‚·ßxþÚ~|nýоø@ýžtOü+øqñGö'ø¿áσº¯ÀY–ÿÁŸ~|vøAâ?‰úO†¿g¿x2ׯz6·£~ËV¿<qð?Eð5Ïj^ ø£xU×¼L| ª~”QIÔm§·,¹’MÛh«[§Ãò»C·ÏKk×Ôþy¾|#øao§xJøuû%øÛÁ?¶”¶¿…|uà_Œ¿ðÄßþk¾ý‰"ý¼,>#øcÁ?ðÖšïÁ¿ øáׂtø%ÚØüÿ†zÖ>-øwÄ>øsiÿ K¨|8Ò|u§Íð6ßïÛgÁßõÏ?³ßˆ¿hÿ‚:ßíû'è ¿hÝÅ~ƒöuñÇísáË/ÚÄ~,ýš/¾ø»Uøðóá÷ůoJømáÚ_FðÿÆ ~>‰à x—ÁwÞ2ðí÷Ž'Dñ‡éE:É=tæë¯¼¬ìí¢_eYÙßq[Kz~ßî?žoŽþjÞý°4í'öKñ¶¥ûA|AðO‡aÿ‚LøçOý‰¾-Ý꿳ïƒeý‰>x#övðÇï6ÿäðÿüëþíq¡üRñ~%xÛöxÕgß]ë|U¡|>Ò|Qoãm[ÔxV¶¾ñŸÃOÙçÆÿ²×‰|bý¿à²‰ûÁ¢üIðOÃÛ|]Ñ,| ñá7Ã_økÁ^-ñ„ß¼GñÂ?üA¥xÇÚÍ—dû_ö®ý’¬>üXø-wû1üÖôŸ.‰á¿_´Þ¹ðÓÂ#ñ/ˆþ,k³_üoþ wñ»OñÇÆÏiöÚ׿iÚGø7áßÚ³Æ?¥ñ®£ñ#ö†ø¡¨üeµø9|jøñƒáÿôOø+E¾¬ºßì/¦j¿h_Z'ÿh_‹³â‡ºï…|7ã‡Þ8±ø}ûSÜøóàg‡¼ñKÄßkþÃz͇ìñáx/]Òõ»/~ÔÿµçŠ|û>x[Áÿ²GˆÿbO„_ l4?Ùëâoˆ4ÿþË_~/xÛâ§Á¯…Ú¶½û7|kñ°þ(Ѽâ?|~ñ׋~ é æømãýâïŠÿWk xrëÄzWŒn¼?¢\ø»BÑøµâ3­é_ ¼/ûKèÞøÁ/ÃçÑ<aâOø.ûÆ^¾ø·¤èž0ù{öý’¬5¿Ú+Ǿ9|Öæðþ|4ñì™añSÂ#³ð?ß ÛÁAÿਿ?gh<ðËÅ–ÖþøwñGà/ìÕâïÙßMøyá­KÂzÆŸÙáÿŒ­>iúWÂx·Áº—îM•F£Ê®´µïæÞ‹»»O]U»•ïýtÿ$|QñþWá·íð#ö¥Ô<1ãoü.øsðOö•ø!ãÛO…žñ—ňÞÕ~;øëöVñ§‚|eoð¯áî…â/ˆ>3ðM­ßìó¬x7Åáׇ¼cã/k¾:ðGˆ¯¼ÿ »OøŸñá·Ëß¶Ä«oÚáÏø.e¿íÏþ6ñvªð•àÏøR^$ðü¾×ü)ûG|øƒâ/׊(R·+¶±Ñ;ÛK·µž©½ÝÕ´q{…¿/òÿ†?žoø'ÿìgÿ oƾ?»ýº¿eíÝ?Âßü3àü7øéð‹ìÿ<-ÿ×ü7þ µ'†±„^ ÿ‚ƒ~Í_~)~Ö"Ñ?aÿ| øÅñƒö;øÓûHxã᥅‡ìeû$øsWƒZý¡"øEñ&ËöjÖü-ûeøsö‹ñ§Œ¼5ñ7Çÿ ¼GàˆÇ‹þ8x³JÑl~!Áã¿~ÿÑTê¶åunkh›\¶í½“꺅¶òüvÕùé£è9ðO¿€Ÿ<1ñwöR¾ñ—†ôO|zøs¢_Oû`ø§À¿ðL/Ž_³÷ÄωÞ#?|uàŸˆºWí/ÿø›ñÌü&ý²tMKãÿˆ<-ãßxƒá‰ñnÿö€øåᇿ|3á«o‡~ñ'Äï}yìáã/‹ðB ~̯Âí¿‹šßüóÀ¿´O„¿t]+DÕtï'ìË¡[xGÖ4߈CJÓüãoü\Ò¼?w§ê%“D¹ð'Œ´Kf{íPÑöÏõâŠRªÛNÚ§½bäÖÉiyzÙ%p²_u¿%ú#ù°ñÁïÙÿPðퟥü.ý‰-¿ƒ|}Á¨>^jßôÏëß¼”Sö®éÛUÖúüJZÚË¥´Kví¨%eoëkW¹ù¯ûiü øUñ»ö*ø[áýöyÑê¿f[ÿ| øUñÛáˆþ'é>ýžüIàË_èÚÞû-ZüPð]ÇÀýÀ|L×<9©xƒà~à W^ñ1ð&©ñGÁ_Ùáÿ„?eÿükøCû0ë~øßü¢-ká–¹wðWÇøåð“öOñü hïü#ðóÂÞ3ðÖ‹ñ7öoýžuÙÄ^&ÕüiðÂÚÆÃáŸ>*x£Æ^ >"üLÕèŸïÿhŽ^ø{ñ÷Ã>¶øwáÿ|Nð'Þ_¶ßÀˆß¾-ø"ÏáÞ™ö‡ßµ×‚tÙö»,õÝBÛYø9á‰úGÆÅÅÚµŽ«Kð»Á7³ÿðP¿€W¼!©øGÅ7¿?j4úŒwvþø‘ð_õ ŠFä¥mRµ´¶í­’Ù»«íe®k+z~ÿ-OÃoüý¦üSðVø¥û@èºßŽÿi_~ןðK…zþ§¢x7WÒu{ÿ…_°ßí‰û5é?#|5Ò¾3Üül°—àGŸ þÜ,¼2,¾1üHýš~xóÄ÷ž-оIû.~ÈSêz†§ñGö”ý ¡š)ûG®–»¾ŽÊÖK•«mh¥¥žúÙ´Ëmäºüµ¿Ëú±ü½|ý˜üSñ öžøqào~ΟØÿ±ÄŸ?gÿ¦‰ð“öøÇÿ÷ýœ¼]³öIÿ‚½x?âïŠ<_û:ø›â¯¼Mgÿ O‰®>ü ø÷qñ¢Óá·ü/OËðá>xÇà'~xƒâÿ¨þܳ§Â¡ðïþ ?ðãİn·ñÛã'ˆ>kÞÿ‚v~dz|[°øYð7Aý…~xÂø5ñ•<wð›övÑ>|ð§Ç¿øsà§ÄüLŸÄgQ×þ|&ñ¾3|1Ó>&ÿF”SöÏ™JÛ$­{lÓ»²Z»ZVJêö·C–ÊÝûëÛkúi{ÛÌâ|+ã_øJµß‰zü"^6ðçü+oXx+ûcÅZö>…ãï·ü9ðÄ_øK~jk¸ÿ„§Á6🠯y6gøà¯øcìÿçÛ¯;j(¬FQEQEQEQEQEQEQE|Cÿ#ÿ“ý¤¿ìŸ¿þž´Š(ÿ‚‘ÿÉŒþÒ_öOßÿOZEê`…/úøÿô˜Ouéú³ù ÿƒ¶¿å$ìÂþÿêuñ¦¿—:þ£?àí¯ùIÁû0¿€¿ú|i¯åÑU™‚¨,ÌBª¨%™‰ÀI'€$ð+ý@ðoþMÿØžú~¹ñ9Ž˜ÜC{s¯ý&"Q_^|ýŠþ4üo–Ö}Ã÷šv+C$ú…Õ¬ÀÅhì7LèUVñäÀ&`îØÌ[HÝý&~Ã_ðD¯Ù ?Äÿ´[j@Á)»×#þб·e ¬¶pÏØ#ea#’ÜH˜¼Èʤ_-â/ÒÃÿcW W,û:…ÒÊryѨéJɧÆNk…§f¯(ýb®·T$”œ}£‡3,âIѤèлO^2„NÍSM^«½—»îßNdÏæ#àgì¯ñçãΫgoðÛÁÕÍÔ°'öýÍ­ÅžŽ#–XÔ ,°é@»dó}.YmeDFHÞ9­Ó%ˆB˜*UT]››óCöõÿ‚³~Òš^·§Ûüð•®]µÛ6X!Ôm-Vqö‹a€Ownÿ6ËÈaŽ0ó\”R¯Äÿ ¿àá¯ÚóÀOzî‘¡ømÛ9¤–)w1•n+ÀÏ0J¸}Çåf$œá7ŒüA“¾0à·Ò 6Í+4ˆmõkõ|»6Ÿiuem>³xßÑÅïø8/ã/Œ?gídø“ÀÞð Ω¤Ýiï­yçIJ ÛwCe¢‰£·Ôeišh]¾Ìꢂ VoäGâ7Ä|jñ߈õ™e†Â6h´Í8HZÓGÓË-­S3srËçÝÌT¼Ó6]Œ0Á}N]ž+ñf<‰ÎqyõlË 2£ÍGÄ:-º´ñy²ŒªbpQxŒEjøºÔ*^Ò­«ª‘—Ìb²ÎÂW†g„Áà VœnQ¡d”eN„½ØM+Â1Œ#ñrÅh›“Ä~&ñ'ÆÏßxŸÄ÷>\.ìÑÚ[ü–¶HQbÓ´ØUV(À_)e•cN7,h« ºwvÑGoPB‚8a!‰p‘Æ¡QFI8UPI8œ×¥¬8á€E #J7mÄ[b!ä’yV4 !xÁfya—#o ‚¥kxyáÆÃ|®†.ž+7Æ*U³ŒÒ0³¯Z6o †”’©™Â„$¡*’sÄT„gUšq.:¾37(áâ¥ì);Y=9ç+7ÍRZ&ݹRåÕå/`ð­ñ&ÒUhÕÞ=„ô $G*¡XŸ˜º&n †¾èøW®B­ò¥X#‚UùB299Fû±ºÉØ’¥FK ¿>Ô|£ä!ÒA5¹l2@xÆìª€à2ŒažG<±çé?x¨YM GTpØ]U•$ʱŒ¹ÏÎYI ¼>ÌFáE}&m…|Óöki{JoìÊ ÆqwV¼RV²îöI•…­í)ÂmÛYµÒ¢ï¯G>dôvJ:ê›þ€¿gßÃyqj’_[éÖ6q¤º¥õÇ6úmŸÊ'2/–%ºœ8ˆZÚ¡·fà…a”J?\> |gÒo¼_áO è„Øx^ÖÝZÙK$m¨jZ„^ñK˪k² ”>¡pĘbˆ­¶hÏij²¤×WWËŸÃÿ‹2ÙAm7d™­Õ¶;ÉWrK;YU¡ Çäʦ@ß}~Î?^ßâw…•ç(ÇOñ±gIÃy‡~+H€.Û‰FØòy‘Ç“˜Ø»"üo?ẕ!Œ«M^¡^J:sC–œ½éFNçI4§ ïîÎ2”œ½|=uZsO•´¹e5^IÚÍ&ÒzÞ2nÛò¶¹G¼OñBÖ´4ÐüC¨Z[âSáÝwœº+Í ¤–Z—+,Þ»˜øo´iS-´³EçÛŸÈÿ¾!¹´¾¿Óo¢Ü£‰'Œ:Ë£r½½Å¼‘f6ŠìM­ä>m­Ô Ò»SZ×]øãû8—Áþ ñgˆ ¸Qn´ý*öK‹?Û¡F±KyT³M%ÅÜ1FÈn0’.Zý—ÿhi±.¼žðÅ´(ÿb¸ñ¹Þ£of¥¦x¿‡bÖæês …Ã[Åk4Â8Ö8f•&__$Éq¦/6ÀÆ­9^XJ5cŠÅBi:œï ƒU±1JINj¥(ó$œ=îoi¬éâ1ЧBj.ÎvŒiÚN|ªÉNñ÷›w»\­[òËâ~ª“Ë8Y‚©o(m"²FÃqrÃíI’T`2à!¾>ñ=Þä(Jïžs+c# Tw°3“´rXýÒ×à—þ$ñwÃ[]ð¿Å =CâWºªiÔ4C£øoX·Ó¢Ò¤—OãjWWZeýã_OõÕ¼Úa¸¶ŠÇP‹J´ž}bÓðßâƒ|iðóÆZ¿ƒ|á­cÂ>%Ðå·z&¹g-•äHÃ|7q«.êÊú6V«Íeg$6wïúwño ñ|V(ÌáˆÄåNO„­ ¸\ZPQQ« >&*õh9´HBÔæù+rT´_›añ: u)ËÙÖŠ§J¤Z”qiÞPrŠn2›QººK–êç¾ÿÁi þøsÁºl_fµ‹Âú^™hB$h`Ó’(Ù¼µ'”Efw¥l‘„Ç_Ñž'ø‹˜ð—€ÞpæK­€Ì8Ÿ-ÄTÆâpµeGO'Ë*·[ ´ÜjÑY†#FœªBQsÃáñTáVh\5“ÒÌóìelM(ÖÃá?w8©BU«%r”dœ'QŒäá%g'um}?áÇÀ-'UÕôý?ÃZŸáïhx‚Ö>Ò {9"I(bT;¤rØRêÒFØà~‘ø3K³ÑdB±‚ÙmtûhÚyQ<àÁVH¼´XÙÀ(ÛÒEŒÇµî&Î{ÀÞ·ð߇!±Kv7kj1n•î/lŒnTd0rKyd [!™Ð<5f¶Ö’ÝLêg•®åDnq,¡Îï+§—Ê~ì*u_àJØšµëNU')''&¥.g%}¥vß3NMós?uÞüÈýž TáJ1ŠWi¨¥fÞª)%½Ø¤¹y[zÜàþ/xi%ÊGòÉ™\¸\BbŽIH\9*Æ” ‰X˜Fã_öæý·®üGñûVø{.¨o4_ ßD—žKÉ•oX™¦iïl g–úÚ! ©6Áå¼Ò“,ð¼áÿ«ïÚ_\ˆi½º¹3}‚øDb@Ñ£5¼‘ÄìÛËxŽâLLr±í²¿ÏÓöÆøãkïüFøµj×:„òx–öãP‚ f·ŠÃmžtÑ!¶ûÚšÙUåwºIdQ:ÙþáàŸpÇq,‡‰ø‘p¬3 zyNe<*ÅP©žÕ¯†† ŠŒåB•:éJºIâh%ˆ§Bœ+Â¥jq—ÄñnaŒÁáý¾õ¨Â½ëÂ2i¬58É9FÍ·Ë%;BmFu%Êâ›_­/ÅŸ…¿4Ò¼C†Ÿwù*A%¿’̰Äñ·–$Š$ù#f™—rÂñ7–Ãâ ~Â~,øïñ‹XÕ¾ xRñ•©’f}Æ8 ’ÿÌynnEÝÃǧ5Ì‹Eõäž@y&½•eË4^Sû|)ø—ñ£Åþ𿈯ïå¶ÔnmM”W08¿]"D)#j$¤—‘ÝE1Ç+Ž–IJŽÓ„)СR–_OŽṳ́ñ¨Ë4jMûT$þ3‰):x烡ZS¡Jru9iGÛ7'%y8ûG8&âœa'(§Îä—á:’¬c*A•YrFUVªÀ©Gßè y­½žŸ§Ù^j”å-á´²‰ïîî¦ &vö¢k¢î°³âHT±8C&Céÿáïü+öEð“s?ûßêPùe5kÚ¦µÈÁØÉ¡ØÉ¤øfàJTZ$áS(CÉ¿ìï ü=ð/€m ‡|á?XùB#gá_hþ·h"(ȯ•gf²&õY9iWÍrÒåëö,ÛÅüT©å¹.£R’|φÀÅYÙÎðÚŽ¤ºÔ+O QߖЕÚùlVY T©Q§š*s”’{¤ª:WæïiòïmOå“À±wíOãÙ-¦Ð>x¿N¶‘ãhõ?[Cà«4Æå¹Y‘-žߘ=œ7&PUbIDVûçáçüçãÊÛ\xóâ¼#æm[‹]ßVñuú&È’)`ðîš®ß ?fÕnQ~bdP#ßû›3d£)ÇÊA]Ù*Cäs€sòû `` «$¡.Çàdõb8'!@Ë ’¯Ï3ø§Ò…l&_ÈÜb°X*r­†U³ æ›Nêñ£J)$ãõ+—a0’p§¸‹ÙÚ­Fá&ÒmÆ£IÅ8Ù4Ü®¾+Ú<¿ü?ÿ‚}üð´pËâ]wƾ8»TBc¹Õm´! ék£YǪ*¸@myäÁÊÌ~ø áÃMwJ¿ðßÿiӨō¤7’iÐêú¬nd‹o­jæûW"Ì#'í‘€dið¥:÷¾Z)Ã?»fhÙ8$± dPdž–×~*ø'Á˜—ž3𯅣ąŸÄ>$Ñôe Æ>DmFê×- ‘QbR7#UWó‡Ì±˜¼Æœ–kŒÄbaUJ?íxÚ³¤¥(Æ.T°µêË 7ÉF•BRŠIjïîQ劋Ž‘E%Í ¥®ïu6•´’»{¦äõ÷9üA$‘ÅódXbÛ Ï;4p|¡vCÌ<¥€1nU µp+Ëüe¯²YL¯39æS€DaB… ›B_c0@áOΆù¶ßöÑýžµè>ð×ÄÝ3ÄÞ+ñ.©i¢é:g‡lµ=ee¼¹bäÕlmdÒmâ„eîdžõ<¨ÒF“"6Uïø–X|wI¹ÕüU¢¦¯gý¼°Ï=…燎½-Æ‘rnôÖ¸K{Ófol­¯­ÿLtM?û6Æ #ÆöšvU7,j4M:×IÙeŠ¢G-¤ª `G'2Ǻ7F?‹ð['‡~|ø{½£Ôùeh|¦hã¹ñÞŸ"ªÉˆîVfà<5£‰Í¼Qá¨á*U¥V·G)Pr„ž *¸ì]9rÉ?cW BµÞ5pÉûgþÌŠìY~8x&*#v|²‰Sl¥Ã!-ïãÿW:ÿ&Ïø'1-ÿ ý„ã-ûfþÌíUUÉøßàrpª¨ôU@à8¯õ“¯Ñþ–£G?áGþ„¸æÞº¿¯Fï[ýÛÜ1B|%jp[U‹“×Vá«Õ·nËo-XQEüœ}0QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEñüþLgö’ÿ²~ÿúzÒ(£þ Gÿ&3ûIÙ?ý=iW©þ¿ëãÿÒ`e=×§êÏçþ áðùþ%ÁqÿcùFh-¿bŸ€ºíÌaKf=ÆŸ.àìp>Ü-gi!~rµû#ðC›LÓô;Y;x`ŽÆ!®!"Þ8UÙÔÑ•|‡lªªH$âEŠü±ÿ!øwÿ OüßáWŠ'E§…àœßÕ§ufÀºøñ’æáQTå¶=ˆ•HÃ$ëññö‡…—zY ˆck„dYVE Ÿ,¢£´©D+1RAÜ^+ç¯2|—F§5.ଧ/åR\´ëâëb³JµºN\¹•u5R½ð+}á:8ÌCWx¬lù.›æ…:táÊ­íÏI½\¾)h¯ý¹áç­R(R£1Ä–)•p«Ÿ•ÈTHðÊ” É$.¯­6¦M0wH)dÆðÎÈMæ?-Ù$U`±î* @û€i+bÛζÒb·ŽÞßʤw3Æ˜ËæÈ~rB€ÙRÈÌ‚HäÞ*áÿ5‘§é)F-äÍpe WbqØp£ÌBUÆ*1¼ dsø_#“¥]FsnM5~KJm96›¾ŠNêû讽…•¹žÑI·ÖÉ&Ò×[&Ò×ç¹òƿͫM¨‹©Ø1ŽX‘cG@ "6pɳË3±ð@fßæ›öƒ»Ô¼⿉: í˜ð¶½©·ˆ“R½KXÀ/Œë²I&x£ptc)&;C$Ѽ?»ßõv¾¤*þj"ÆÏ´á”âUÛ±Ð8pey ®_r¶à?xÿî¾ËâíÛVµŠí§Ky"sHÒÇ,h¦3½ä“j´…‚;©O–~Û(®°¼®pö‘QŒ¶Šqå”$’q·, £m®¾.o‘ÌÒ­6âÕ5iS~ò÷.®—ÄÚš’{9_­Þš¿ðHŸƒ0j÷÷u(Øhâtµðôw°yr\G‘¤º·˜!%QH Ñ ŒÂK*´Gú'ø¯âÍ#õmSQ6Éo–ó*;í#XƒU+ù`‰~DÝæaÑbùÝû=é°x?OÓt]Þ=3N´†Þ+; qvð$OXWl{AIqjÁC ª‘ üiÿ¥ý³®~| Ò|' »Ë¯ü@–K!žs%´ |å™’àI‹˜ÄÒ>$,a·™ab#µƒÊó(βìŸ,¥*Øü×C …¡N ¥JÓ¥ì¡''S)«RR:tùù¦£Ì×?µ£—à爫% T)ÊU4jJÖqPµîäŸ*Š»ººM(ß…øGus¯\üGñ¬«qo§ø×âF·ªè°Èÿ该YÙéº"ê6Ñ2¬‘‹ëÍ6ó2;¹¶·´š8ãF '´ý§N·Ì——v¶± ¥¸™"Hã)•˲/rrO8r !ú×üö£ñ ¾Ä÷ðž‡a½ž›àÕðÿ„Žn© VV·63Xß:ÅmB¯-Ä’&ØÜ®ÝI«S¥kæRås2æüo…|}z®\EIÕ·,a·$\åRRRQi¹:-6Ôµ±ýrŸ|>´Óµ;ÙüGaw¦›öäm>ê=L•[ÛåÓEÃÆ¥.ÄBù’I¶1º3 üfý½þ|-škWÑüS¬\DJÇö].8¡aò8‘æÔ.ôð´, ¦g$0·*}û9|Cø"Ÿ î×W±°27‡%“OGñ´ÿdiîôèÞæpoÕÚ&™á‘tçžW›$K„[¿ÅOÛ§Åß&×5+};I®Yn Ô^2á¹g¸—.ˆ-¾´œ1k|_og¦†/!Ó4ÿé:z’˜ƒùeÄis—cãø–æêwžçT·»šR]ÞâïGšF‘™žI ã5žFmÒvÉPñnxê99þÓ†ºü‡Å0*XµXÿh³í•]e¥$`ç§ÄË–cèlÄð'_˜P§‹§O,Êr̳ÛN0Ùø6R^åÛ*:ÊPÑŹ.—i»ñ×R¯w^R«{{³”§Þ;F¤§gx­cn–ZkúÿØÑ§ñgíOákÉRÚkè~(ñí”10Ñ_I°``Õµ¾Öc—(ÎŒ-ŒlÄ<¨ŸÑ,p6¹ã¯èAÏ—©ø“GŽBC’-F£—3(È\Ãoí ´Yx2þ%Á#™lò0U†þêÑтުà0eü·Å\\iç¹ôù”£—`pø*r÷¢¤èe´kÊ6wµ±¸¼TI%7&äõg¹–acF £©óJJ1²æue+Yk({&ŸhlÕšûT«µ­½Ü‘ˆä¼yæeÆsÞMÀmP|ç—#Ê‹nfÈe üÀÁp|jú¯Çß…~FWµðwÂÖ×\†ÉTñ§‰uH.àdÇÊWNð¦‹8lËpÜ·õ#ª"B¶VáTI¿ïTl88 ~t•Ž@åËuf¯â·þ ]ãdñ×í·ñÖúÞì]Yh:î“à›EI‘Ú?‚ü5£xsV´Œàm)â ?W–xÉ&;¹®8˜ú5åŸ]ñxéE8äÙa‹ŒÚºUñ3Ãe°ŠjéNtq¸†®õŒ*u=ê§.0NÎ¥X¦¯kÆ*RzuJJìÚ9ïø''ü¤/öÿ³Ìý—ÿõwø¿ÖR¿É¯þ Éÿ) ýƒÿìó?eÿý]þ¯õ”¯Kékÿ%ÿØ—ÿ©Ñ ƒøúûý!Q_É'¾QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE|Cÿ#ÿ“ý¤¿ìŸ¿þž´Š(ÿ‚‘ÿÉŒþÒ_öOßÿOZEê`…/úøÿô˜Ouéú³Åÿm?‡±ß~Ü–>;’Ýî?d€^·¸Vu•OÕþ$j÷±Ë†Á€^ɆØÙÓ÷ÌY0¦µ¼ iêð&ÊÙ HYŒi#*—XÜ“æv>YÈRH°}÷ö°ðãj¼;©G3ü!øe§FÈ XÖ=âyKËܹÈ';@%øÚE}ÊÏJÒm"†!¹ž@ F “Oº`yÚ|µu îq’O™Ý¿#â|dÖa‹ÜÚ¨¨Å'~[Ri)k´b¶Vºµícõ^£É–`§¤y¡)§uwÍ8ûÚk~hÙ7fšvÚï«¶–+vLÁæF‹ƒuXYÀtF(beÛnU«eƒ…;+â/Ú3Äâ?´ZÅ"ÈÊË ;X©XãS,®Œ®Û@.FötPbm‘bµö©©A§Y¼óîBa‘•r©TÎÖTUÃ2&RPŘydýáð?Æg‹S½fˆ’F ᜇWu’4¯Ì þéÚGU*UduP|l%XÏÞpi%h¹5¯+ו¤ïðÙÛ•;´ìzx¨¸Ò”î­“Ò÷çi8ßNWk´Öº-®|Wâ?2GK“,Ï’ Î Ê(+‡rXö²/Q%¿i:—i·QÄ×!šÞÝdgc´2.dÌ21iLLGË‘•U;ÅWw V–êq &Á6åHÐHc`àl;P4¤bëå`+E¨ü5¦›™-d»“{)D"Ž^uP$‘”í¢¶]I@Ê1.ÍŠO£¤Ú§åh©?v-ûÜ·zkv“¿-ôkDšÔùúÊ.´ÒÚZKì¦ùy’“Õ¦Õ­Ö<·oKý5àíHGNâD·eEÂù(€l ŠË‘—VrIÂrĉ[/þ]ິÏüZð†­oÓþ)>éÌFò•V–(§a&µ£:9{¹cSÌŒjPT!¿s?jßÚ3Jøð{X×REŸÄ¦j‡L³‡ÊYáK y/n®ü¶xù6¡J“ ß4±! Êò/ñ[ñcâoŒ>1|CÖ¼gâíVIuri&‚Ô"‡ìv!e¸‡Ocñ^‚ Ã+](•ák‡–âk•YZDþ•ú<ðŽ?5â:œ_ZQ§”p¬+Uuj{³ÄæÌ%\>Ž*üïNuq˜‰Å~íR„>,BgÁñ¦oG €†UNÑÄãí´¡N´gVRV÷\å5ÃV×4Ô—$T|yµ3“IF1ý´ƒ§°ø ¸ÿ¾Aõæ» x¶] ö ‹}m"]Ñ–s®[–P7`‘'Åë%7Hd"µgp»V0á iéš<ŒÈ$Ôfpñ†k[}oQ·xå}€™eOŠ—1;—[k ¶.»Ó<#-Η⥹¼HôÛ=6âI‰o%d7Þayëñ"Y­ÓuÙó<²‚Eb|µýKZ¿´MT”¦¥$ìÛqNN*ÊýkhÚÛŸ™BkÆqŒaÈÛQ“»k–ÚÆ:-ZÍ5­í¡î>ý«üGáíîÊËÄ…¢¾µTr/‰šE2Igv¶±?ü,eÌÆll É#)ÜÃwxÿâåßŠä•æñÜ=Áå%Ý$Pëå$¶¾Öˆ|~Í+&é$*Œ·˜é9\±9* MÊ)¤ÞñJË•¿y´Ý¯ÊÜ}Ôì¤Ó°RÀÁÙ5*ŽÉÞM¥¦šFéZòºNö»³ÝŸŽ÷º Í¿š´[s jš‘y ¬q¬Íñ^(euB#YŽ"XÝFÜr·æ d‚YdÞè vÏ«I/œ¬¥B£ø“«<žc«&ÔY˜œ…‰‰Ù_§7ø'w¦ „¬òÔ»:j^~cXàw{‚~!*$0’6• *FùRaòˆü--¬ž[܉ÜЕ½2'¬,_Åš”`ÂF]”(Y†o áœU,Fi†æi¥ï4Ú¶œ‰®x)%&Ó’³Œ¬´Ÿ,^¬;¥NR¦š’²ä•F¢ìÕÚ”®âïeÍ~T“ÛY/Ø?ø%Ï„¿°¾ëÞ$’ÜÁwâê„;)kMÎËM…ògŸÍÙ¦¡òSaVˆ…‘¢‹õ§öw´i"fOóÌ’ÌsLD©4ùmCž"œlÕål3p’·¼¯-UÏ¢ËàÓ¢¥¬£FŸ>úTŒ©m]¯8Þ×w²m½/ôf»{ RÝ\Ï"Emc´Ó0`±Ån,ï&Fqï *0UAꀉ~0›âÄoøþâ&†øÛÅ^0žÆø¦ñ6»­Iaä£{ÖVÄŽ2‡Ì¶¯ÚÿÇ/ð÷ö_ý ¼j“­½î™ð«ÆÉ¦Ý9(°kÚÞu¡h¥~a¯jºpŽ0TK+$ â¿…úýO诖rÐã æPV©[*Êðõ.ôT!‹Åb㲋æöø)^×N/H¦ïŽyS\=>Êu$®ºòÆ:_KZzêÚOF}™ÿäÿ”…þÁÿöyŸ²ÿþ®ÿ×úÊWù5ÿÁ9?å!°ýžgì¿ÿ«¿Àõþ²•ñßK_ù(¸GþĸïýN‰Õÿ_cÿ¤ ¢Š+ù$÷Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ˆà¤òc?´—ý“÷ÿÓÖ‘EðR?ù1ŸÚKþÉûÿéëH¢½Lð¥ÿ_þ“)î½?V}ûAÛˆ:"Ɖç?ÿ‡ñ‡ xfÉØÆí‹‚åFrGÊ¥°—Þ5®™§4Òدš)ÜRJ,Êîý䥈 ŸÝ(`€{Ç;ˆ!ø‡¤¬ŒŸá¿Ãõ ]P Ù02ÁÌEQ·¹Jílå>bñî¶Bÿe@bd8ûN@fA #,™VŒ`:º 9*Wñ>!R©žci´Ô#^So[5¢–«®ÐK§4›Ðý{ 6U—¥¼¨A/-ßnŠï¶ˆó_x¾Y×÷ŒHeeH¸Ý)P#Ée,Y#P çk)ù¼±#âO•ü[$÷2ßÉ+³ÈTãz.åŽ=§$}‹::• 1’$ 1í>$š˜åüÈK E‰`¬JÆW”!†ã¼lŸ7gÌ^(ñº½Ð ËË3È]•QIÊüÍóóî›CÆ^0$±Å»;Gu­ekY»vI$»+¦õߣ1’·²‚ºçj=£ñJNÊí»]Éét•’Iy~§¤#ÊÿzT—_i]﹕†WÕPùÈV%]NÖ<¶·¯ØøB×Í•–R!™¤>|¡I‰!¤“ÊA(cˆ2„éu/iZ}¼³Ý<&ÆýòJˆ#gMÍ)bÞ[I¾ ÈÄàªÝÃã_xºãÇÚÅåݳ¨Ðt©e„ÜP÷—þTn" ÅÙCG42¿)$°mÌá‹Íö7‘c3ìÓ–a£.|]XÓRm:T í*ÕÜWà TùêT×dìŸ2¿ÍfY†‡«^Vn1»I¦ç--._vS“Šæ»åÕ«¥¯ç§üÇ:Ž¥ðÃÅ:æ³,í©ø¯VѼ'£ÛJóÒtG»þÓ{ËK†–-:I¯œ¬O,«–±ˆÚ¿ômÎÅ´í¨· JÌió:D…<[§ÄÙ_çh‘Ÿh[ˆ!úaÿñ¹Ô>øId ›oÄ7‘UÝù:fœÌ~× ;5K’ŒAhÉ’,/ÈŸ ´øîZÌý¤$³7Ú%Î¥ þk.(Ì~>µdIcŠ0¨#hÚ"òId`¡Ü—àøcKÙÒÅæu£E8òÎ¥,-:8ÖRøÿÛ0¸Ú“¨¯Í:òŽÐÓñ Ƥñ™—ÖkûÕU(;´Úƒ›•KÓ»ÑJ5# ihÒ…¯vtþøyq2[2É#æ ¼£¥¼9•ÂìøŽÀ¸MæM„K¹\Jsæ©úËÁ¿å‡ÿnd2Ë%Ÿ†ü½?µZug¸ø™ád™LXÛùjìîð"EXÊß?Ó³×ìní­­µ¹e¹Òoš&•Öý–ÿM»›ÈUÔ´Õ?¼–³ûF<‚-J ÐÊÐ2[4¦~øÚ_>&Û4‹{£á¶—{iyu<±ø‹á_*XWþÙ$&Œ[MiºßR³»U·¹·7HùìnpéÔŒ\½ïkI&Û÷×µ§¤”yRIî¤ÕÓ¼bâå¬(­z¸êŸ*³j*Þü¢›\ÜÚ7u{-üÜø“áeÕ„#L΀¾¤Ò–*rüExüæA*©F XB„Éhÿ ¼E{¨Dšfâ AÐ X}¾í]7äŽ3Ä'!Vaò‚ªr7«© ûƒñ§á=Ÿƒm.í&t“Ä2¬±Þ¬:¾bÐ7gí¯-ÕµæÛÚ§û@‹DàfŸRk–²üÄñ:]øsPe±ñ.­b©Í—Šn­™Ã w3µ¯Ä{DÊùwLa™^7‰cXÌ®Of0–& BvæK•9ÉF¢÷¬ù*¸Ù.k§8ÉI8ûžó‰ÒPÕݤ•õWONÎÍzkï'w­¾šýœ¿gÿ‰2]iš”~ ñÜ2E=ý£>iÄž#ÔmÆ:~©$rx‹_¼‰¬´%ñʲIâ=A6Oea‰YCå±ʹ~¯ƒ±xü1Ì¥¨e˜ÌTÝNg(ÏB¥JkNH)Jk–æå’å䌢’.2*«¥FZFs¤­Ù;&ÓÖš{Ü©Eµ{F*2ý[Ö´'ð_…´o Am5¥¾‡£Zi–bhé¶K\R©`6ÛÆT<’/æ9vú¿ášºoÃÿ "¬¨eÑÅäÊÌkOQÔu11EÁ,ÖWšzÇ$‹“o! ÙþKø…{5Ä­n%¹–Y I&™åi™F|‡Ì1$‰€ô`Ÿ1o›ï#O]+M²Óheޤ•L”FÑ´ûM‘°YwX3+È8˽¿ãZžË €ÂFí:ÓšÑ=0´”mõýïoysm±ëàù§{ó'&îµu%{è•îÕö²nÝÌø,7WŸ±f½¢—+/ÄŸøÁp%]–ÇPŸÇ×MÃ.bX¼°Í÷¹º‰ ÈY‘úþŠ?àºþ6’-övømÊ÷Pñï5[a°»}‚øw÷ ‡ÞЦ÷Åq xÈr\£ ®ùׯ죞[õ 0˜›Yç¶k˜Þé·ìëC*OO‡þE–QwkíXñ3y¹cgÿà´µ“Š©dþÖµ/~¸ý“ìÏø''ü¤/öÿ³Ìý—ÿõwø¿ÖR¿É¯þ Éÿ) ýƒÿìó?eÿý]þ¯õ”¯Ã>–¿òQpý‰qßúÖÈ?ˆÿ¯±ÿÒQEü’{áEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPÄ?ðR?ù1ŸÚKþÉûÿéëH¢ø)ü˜Ïí%ÿdýÿôõ¤Q^¦øRÿ¯ÿI”÷^Ÿ«=ö²ÖítŸˆzžâHŒŸ þI²"Ûœ&ƒn‚†]å,6î)‚ÇoüCâo[ &›vd,»ÍÎJ‘€#U(UbVa¼(Q6…ˆ— ^·ÿ×ït¯‹ž‚ÝâŽ#ðcá´ò4­°}.æ"7cÂ!! Ê’1U1ŒdþXxÇ⾋ Ùêºæ¹kmkoŽæK”â0Ä I.æòí×`bdx¡Ûn.œþe™å•+f˜º’¿,ñ”cÑß•&Þ§} ¥-t¼’‰úNYšG•àéA~ñá”$Þ‰Æí´•ÝÝš¾±mE¿‡šþåâ}¿Ígb ȺºŒ‚1#)'Ê#$`1 ÑHbyWË>$xSG·–}KS`I Uy£KG,¬")iC+*¨Ê1|üû'å—íÿLø]àù/t_ê¶ë%¼I¥9k!2íŽ?´­Õ£ò¢HZ9$…å,缈çgá¿ÅïÛâ÷Æ+û·ë3hº#oélÓF&ÌÛ÷¹1Ì¢R°o@»Ý×ï¾}¸ûŽñZ³À¾É«û6ó\æ…J¥9Ûšx,¾J8¼\œT¥ µG ãd±”“ÎxÏ…öŠœþ»‰âéPšäƒV÷']~î6k–QŠ©;ük«ý{ý«?oÿxF}CDðÍô>"Ô.ËO´'±·vUòžöêØ²aTG¾Þ'ĬX\2±(~€ýœ&Ö¿áœ|âÏ%߈¼kcyã­bâDòåy¼K¨]jZjNíŸfÐ[G³H™ÂEª¤g`E?Ëæ™c¨øŸ]Òô˜[­O\Õ,´»@Ä»Éy©ÞGmj 縸\ *¹cŒg5ýgøŠÖËÁ ÒôI£†ÃžÓô{@ÊcˆZèš}¾Ÿh¬«³nè,ÐP† ”[ýUÄžp—ƒÙ_äù?6aœãc˜fyÞ{ŒäŽ.·Ô£‡Âà¨Ò¥¸`ð–;ãFœÛœðñž*¥y‡çÕ3|voV­|Tù!PÃѹ¥Í.iK^YT¨”"¥RZ®f¡:Žÿ‡¿µwÄX/~?ëH4ŸêÖþÒ4 ÜêÉw,R·”Ú×Ïmâr™¯åŒ”6c]¦H;÷_~0ØÚ=„cá¯Ák€ÛJìüXò0RTeaøÿhŽÊïÛ5ºHàŽDæ?%ø“]’m­ø£X¸ù®m &îêx­Z/7\Òaù¡òä…ä+In貇‰}cá猄–ñE‹G'—:Ê FÚÆ™~"@2#8PÌ× ûƒ±=YŽ42 ƒ'Za–`ñ8ˆÂ¶"„Õ|T#ŠÅZ4§±êÎúIóFQ´cüª¥R¶*¥”_ÖjAj¥BœÜiÎb“Z5kµ#úHøñ“H¹K+Àá—Í þ‡§øŸt­)Qå#ÍñËP󤙈Kc‰™T«y›\þÁxâ‡|5àÃs£x2ÛS³±Ð//­tØu‡ä»×ô½0#-×Ä™¦×mŒ°_Ü‹;­/ió™c‘š+ËgUšÖê"¹Š9’VÆOŒ´á}u_¾ Dª™‡‹<ëf@ddŽfý ã´’½ÄÌÓe˜¡ýwâíi-Γy«ô˶yLXSu§\[ÄÁu->Sñ¶-Ä·vò§—©Û¹ŽXchâ–Ì/‰ßEååÓYdóo™uŸ2 ¸L;|H.ChŽŽ Æ“º?–Ä¥{9NZӅ剺*•³'Æ^ ðÔ±}‘^ëÚ^9˜*œskâË› ¿Ìˆ£³Ô'äÍ}Wûqøá¾"~ן´G‰Ä©5¼ŸüS¢iïˆé^¾ é^Q ‡NÑ­˜lY,Z<¡ü©_è·‡gö?ðŽ^áìêRÈ2Ú•¡ËÊá‰Åaá‹ÄÅ«¿yb+ÕRoYJòz¶|ž.~ÓˆŸzµ-¿Ã8ÇM–ˆû3þ Éÿ) ýƒÿìó?eÿý]þ¯õ”¯òkÿ‚rÊBÿ`ÿû<ÏÙÿWëýe+ù+ékÿ%ÿØ—ÿ©Ñ>‡ þ#þ¾ÇÿHAEWòIï…Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ÿÁHÿäÆi/û'ïÿ§­"Š?à¤òc?´—ý“÷ÿÓÖ‘Ez˜áKþ¾?ý&SÝz~¬ücÿƒ†?o~Ì´7Ãÿ‡¦ _PñŽ·û2|$ñužŸ§(‚&Óu Ÿè¶ÓI¨Ëºr×~½ŽDÎÅ3*-dþ3>9~Øÿþ7µÕŽ¥©É¡øni¦dÐôˉÕdG•¯.™üû™Z,$ŠÎmÀâaŸÝŸø;kþRAðGþÌ/à/þ§_kùs¯ïo¼$à\ ð÷TÊ#˜ñ&g…Xùc³*YT©J8\:¦©§N«£SålE—ÌæÙ®>¬ª`eˆqÂRå§4Ò§F)K÷²^ýK·ïFRönÊÐVÕY™˜³Ìij3Y˜œ’Iä’y$òO&¬@8cê@ü¹?ÌUj¹Â|Ÿ×ü¯ê¬žŸ>1JÚR§9ù]¥MénËÊýŸ”mè——õcêïØ“ÁÃÆÿµ'Áý.HÖK]3ćŗŠè3oàë¿yr«CóépÛ‘‚ÈfîëþðþÕ¾0O ü,ñÖ®d·Ag ßGÍ!Q òÀðÛ;c’n@Û—e ü¥[óþ Eá1ñkâ/Ž&@að€“KØ… âZßk`TÿÄ·CÕ#`0ê& pßIÿÁH|[>ð^öÂ7|M¯iÚ<±«y{ PúŒÒ1có¤onËÞ ùˆÇ˜÷§ó7Œx‡žøƒ,–›röt²pWåL¬qÕk¶ôÒŽwRQirP啜[=<ypî¦ÚÔ«}.ÔŠQÙYNWrmJOm/ø9&¦r×õc’IBF ¶EбTgDñÆŽêÞ\q¨ar¡¼ÙyÍÜh3[s—[† ¡PÑÜI¯ZDùA"—þ.åËÎN]¤r¬v†,³¨vóÁ|c‚5mD#mÛ Uê‹´xûJÛµ0»´Eqµ”•$¬z¼‘}ÝY¶ä’ƒÄ2"’F2|¿ŠÈsÓG@G¸š¬+æ•ãrÓ“„9ZqŒc(Æ1’\¼ª:+$’ŠÒ(ó)sQmÁ'¬“쥤Rv²qµ¢ì•›Ñ&}‹áï‰÷{jÎ’l€"fRë$j.døˆ‘JX°#iÜØ‹– ïZÇW²ð¿¬Ž³$o¬èú´ÑQÀ-oâÿ_HSÌøˆÌÛÞX€‰÷4a˜à7æõŸ‹n _-uhܹÞ~Óª¬û[h {¯Œ‚|£ YW<ª+;nÚƒÇG ±¶£fXU‹\ÓcŠUŽçÎ:7Å™ÌkÂw9Šdy˜Éù ò52úu-£²”»%Ëu*rºM;kÝ%f®vÇMo' 5-'šViëgt¬’n÷²÷«µÿ‹Üý 6¯,aG jEc}¡¶§ÄV™’FÞ̾Q%Y¢fU—çÿøñfiƒjñ™Ë·ú;x‚Ù¦W<ÑIqÏÄ«fêYÈY·ჶVDóéüctchÛUµQ"²–ƒQ·ó‚UáøÀÍ`ü® ¸?20eÈÁ›]•ÉÛ¬J9Ì>"¸ØÃø¹2ž˜$àG"·£…….–z+·Í-¡¢è•×ãµ™œñ)«QNM­&ÓŒ#ѽRrjËDµÞú4[½ñÓÌdmUYŽ7,zü°Â¸DÊKŒÜ_`\¾Ke‹c;ûfãþƒsáDÿüõjíúŠåwÿÆÚ?õÿÊïÿ:éZY-µ——¹÷î÷îsò¦Ü¥ïÉë)I]·ä¶Il’²I%аu’'/¨K9•^>5InÉ%Fðž?Õ~N€—‚TÈãŸø'?†[òf¨Ê˜›Æž!ñ_‰Z\»»Ä·ÃÃv›·np‘ÁáÄU_õj¤L£ù¿¸ºic‰>Ôg–aý£%Ö £å.×c rY¸ùYWõ™ð;ÂÃÁ_³çÂ/ ä,š_ÃÏ ›•#nÛ˽2ÓPÔ7çæ,/ï.w9·¹Ž<ˆÓn:J<1Ã9}4ý¦30Äæmsµ)Ã.Á,—*³äö™¥9Ê2–•#m"×~_¯kSneIÙZ*u#ÅÚËHZÏV›kcêÏÙÒÂ3­xßUhÄ-tm_/‰og›Uš4‘ƒäÆÚeÓrˆˆ‡;H‰O×~;ñ=·€üã/ÞË vž ðˆ¼Ow4«²í¼;¢Þj·ȨÈV+7wTjp+ç¿ÙÓOò<95ìÉ™­x¯P” ;“ìºd:M•³(ŠÏw«Fòì-2cq æ)ãà¥8“À?±ÇýVÞM—šÇ„bðe íãmcMðµØ»Óu[éÈÁ%a`9"¿“ñøJ¹ïÐÊ(óºØì×/Ê)¤•I*µªÐÂ%«ÞJ­I· ë'f“¹õTå8gUÛ–çUßEÊ“–¾V[Ûm´?ˆ½OP¸Õµ-CT»w–ëR¾»Ô.d•̲Iqyq%ÄÏ$†‘ÞIØeØ–<š£Syê¿™ÿ _!¿¼?ZÿUèåXªTéÑ¥…”)Ò§ tᢌ)ÓŠ„"œ¥´b’Z·d|;šm·+¶îÛÝ·«oï×çÙŸbÿÁ9?å!°ýžgì¿ÿ«¿Àõþ²•þN?ðNXHÿ‚…~ÂpãöËý˜OOÞ5þ±Õü%ô»ÃÖÃñ*ÐprÉ1Î)¸»¥ŠoÝo¯sêx}§Ggÿ/cøÀ(¢ŠþC>€(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šø‡þ Gÿ&3ûIÙ?ý=iQÿ#ÿ“ý¤¿ìŸ¿þž´Š+ÔÀÿ _õñÿé02žëÓõgòÿmÊH>ÿÙ…üÿÔëãM.uýFÁÛ_ò’‚?öaõ:øÓ_˨ ÿɯà¿ûÃÿO×>'1ÿ}Äé1 ¾€ÈU$uãòŸÐUêý·#§îâ*¾®Óÿ r—þ•O™çTéóý߯ø%σDýŸ|kãâ)7Žøÿ\M{Çð·ŠubKH/uÝ&ÓS¸†ÒXâ‚{„3Û®ævBÉÉ#Ë·ÌbÃøÃ1Ï#8Äñ5\4ñøgÄY¶>•Ub0’ž.†S8Îp¬”èÑX ²…“^Érµ´½ØR”h*W”[£N–iTR„§´²~ü9ÚKÞrêÚþLR÷Æuz¥Slw´j €A06Ã㢠ùCÅèÏzúÝkMúο­KOÙ›öuµËÂ’øm;T´þÒf]¤©â)íeˆ6W者‚zKÙãömC?~Á6ð[>ÐduòüÀl NŒ–YSÊùd…wû•8Ï)J´¸5ʤš—5Lî;[óTŽWZ¢iGVàÕÕ¯ªg"ËT¤ÓÄVŠÞü”Ô^«D”Ûïº[¿Ÿòöãÿ?Wÿ÷ÿYÿæÞ·ùú¿ÿ¿úÏÿ6õýŠß³ª¨oøRßñ)—#þƒY€l´SÚ›ÿ (vjÓƒáÀà#‚…Ÿ Q1Ž4ð†cŽ8ãXcû%R ªŒÛ[gˆk)3þºàìä¸66[¹q ÃË}Ewn]{YöÑÿeA4¾·Vú˸ëðö“í×òÕÿn?óõÿõŸþmê&Ô.’ܲ aŸP×ccÀÎQ|Y(9ç9<@þÍ¢øwðƒNþÅðïÀ6â]¥’ÇÁ¾‰œ…R¬Êºj!dY82ã: ºº…<že‡€ü%o2Ÿ’èxsEŠe I {$òËà©+!A€$ (qÅ?wðóz¼KR*ÉG[.½ÓZ%&Ÿ^©5–S›ÄÔž›rFÚrõH»û¶WÓ_šþ6vëóç©ÿàO‰ù¥¥Xõç%c±Õ°NÔ›Äìpá|FÜ@'Éõ¯ìŸûßô,øsÿ¶üf¦ŸOÓ¦—O±ÚB‹;} òÊ9?1QÕŽq“ÅM^9Œ!wÁ¹e9;$ÿ¶qýÛòÓú…'+×Åk]Þön}6õ”â’»oË—ª›·Â÷ÿ‡þ?üàýÆ?ðG†ç²Õ‘|Aâßh›¦MI£€jº½ŒŽ²_Ý]„â]Çs‘¸Zþ·5f·µ³ŽÞ(Öx! QŒ,D†8ÑS.Û1 w„ Ðn™â³€Glµ´yÂľ\i½É>\Q;±f!rYËIáõÉÞéD0‡2ÜÉD¿~BÎÅ…ù¤¿ qœ 'ŠùŒÿˆ±\ASŠÅ`pùu » <&… EZÔß¶¨ª×©7R5 •#NŠis¿Ý+ÉÝ"éR§ìé;ÓRWšM^VP„o¯2„¤ê=²“m§sîƒ:jØx?ÁVþ[¡,Ò  o—X¾¿×BÂ9“iwbrv†€C¼¬K ±þgÿÁqüršGìÍðûÁp]ùSøïâ•ëÀ¬UïtŸ hZ­åÌn™ ‹QÕtK‡,¤$ñÛd« úÓ¢Zťà œž[®—io¥Å„ô{+m!· "ÈNd`ŒØÉQ# þs¿à»^Êÿ‚sÿÊB?aû<¯ÙƒÿWoëýa«üžàœÿòØGþÏ+ö`ÿÕÛàzÿXjÿ<~š?òSðWýˆsýXDúÞþ'þ¾ÃÿH (¢¿‹O£ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€>!ÿ‚‘ÿÉŒþÒ_öOßÿOZEÁHÿäÆi/û'ïÿ§­"Šõ0?—ý|úL §ºôýYü„ÿÁÛ_ò’‚?öaõ:øÓ_ËQŸðv×ü¤ƒàý˜_À_ýN¾4×òç_êƒòkø/þÄðÿÓõωÌßqã_úLIa|úŸÈšêü% Íâ¯xgÂöŅlj"øSÇZ¾‹¯Áám^ÛYƒMÓµ{myo,‹KhÿlºÑõ¨ÔCr"˜±’Lcæ¯Úfñ¸^Ì+å´%‰Ì–0Ä`pðäS¯ ¿T¥RP‡5Z¥ç(Ås$ÚJ磩/‡š OkEµÌß’M·k»-vGõÙagm§XXéÖH±ÙiÖV–qª…Xí,­ã¶¶U@ ©Q¢€VÉÀ'Óž'òŸ æ¾ø/ÿ/ý‰¼_‘¦|WÕ¾4|ÔÞßeö¤Þ Ñ>%xZÖXÕB«êz¯áÿ 6M¹¶£*móeý6øUì…ñÎ+að›ößøKâ=JûoÙ<;}ieáß³;ªùxw_ñ†™âAl ÒÊWtcÊ>`þÍe˜pÅ(ÒÎ2.!ʨá鯒ÅfoO ãF*¢ÅSÁÏ :ï!UÅ7«½Ô~š—%dœ*RœŸ$*ÑR¼¶¼9ââïvËk-¬y3I´ãdî¨HúgŒþ³œ€ðr23ø‚ä@#ñ÷aý†uùá鿼={ƒt2ö8e\‘-¾§x¸óL§˜0 }á²².¿aψÑ2›xXq™¤¹:í«ÇƒÎÄLºY\¶ZX¹àà|ÕóT¸ï ””´iÉÞÜ¿VÆA¶ì’WÃk­ïdݼ­{xzÑ»”'ËfÿåÝ¢•·j§nö»½¶hø®®K+†7r𘃖ØRC ÿ–xäcò[€}3_I^~Èÿ­]‘[|mÚ®‘ÜJÉ!+ÎÖÚÛ?Ù7âö¡0µŠûÀ²+´R‹pXØ‘O C4Û åPù,À#|Չ✾­\,ðù–•:u/Z2«R.qö´&×'ÕÚŸ5b(rÎPŒ%]WMÔ£´¡%' ò8¶ÛŠOEtÕää½î]"¯/†ü­§óõdß±§Æ˜™• ð­È öþ `¬pNÕV¬8_™U2IßÏ%uû(þÐ(•à5¸;ÌxƒÅ~ (9s¯[`1!-æ®så!%‡Rã ’¦”ó<¾êò©Š§¯ÙO‘?[»-Ò¸åJ¤Uý•YöŒiÊí®úh½më£>}’EKOeÈŒúddŒàsŠ©9O²Er÷¶åä¹¹‹û=EÉ»‚+t´qy3}™m¬Íta…–éî7Û]4Öð±Ë7·\~Ì´<Šß 51L:ëž¹C¸‚ÅZ×ÄRFá‚J~l¡ PŠá5o€ß´·•5‡þ&B±™Ú(¢Šô˜ƒ¸Æiħtl!BÇh(˜+iç5IóTÎ2ÙÉévɶ•”cÊé^éE+ËGetùgK]òû9Ѧ¬ù\Z”•×½+¥ºÙ;¥ëiMwremªÄ È*Úyg9d¶JÄy æÉ7ƒôøõψ¾Ò&aökŸi?l-›H/ažèáð~Ì—(¸ d~éÛ¹qðëâ,†“áÿŽ¢2(dßáyXΡ¤FÓ÷Bƒa.Ó¬aP‚H$W[ðkÁ>$°ø›o©ø‹ÃZö™c¥hºåÌw:ž“coö«½.}*ÑD×VñG4†ëR,¨®Î <¸)íàÏ3œ2œ|èbðÍÓÁ×CFU'VPj2åŒÞ®N+Nk-î´:(Ñj¥q„¹SS”ù=Û|)]«^ò绳j+sì(Fpó |í$’b²He¹ÁHÁy·’ %Í‘ªŸ-¿ÿø*ç߯Ÿ¶·Ä¸£¹é¾²ð·ƒ´Ä ìë£x{O”,ÀÞjmI¦Qò¤¬Ê½ 7ö>–¶³é¨ÞnÑm#Hòȱ»Hx+ JÌZMª›•RFfÀcüü~ñ’|CøßñoÇQ;I‹¾!ø»Ä1³Æabš¦·yv€ÄU {VP»6®Ü` ú/¢^Wõ¾>Í3ì²nÅrÊÖ¶+0Æ`°ô”´µ§†XÛj¥îGF®ôùpÔâžµ++«}˜E·gÒÒåûßsÈ袊ÿDÏ”>Êÿ‚sÿÊB?aû<¯ÙƒÿWoëýa«üžàœÿòØGþÏ+ö`ÿÕÛàzÿXjÿ<~š?òSðWýˆsýXDúÞþ'þ¾ÃÿH (¢¿‹O£ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€>!ÿ‚‘ÿÉŒþÒ_öOßÿOZEÁHÿäÆi/û'ïÿ§­"Šõ0?—ý|úL §ºôýYü„ÿÁÛ_ò’‚?öaõ:øÓ_ËQŸðv×ü¤ƒàý˜_À_ýN¾4×òç_êƒòkø/þÄðÿÓõωÌßqã_úLIã•UBzõõ?†? ÔÂD=~<Ó£è·:f™ª[é×0ÊKmwk=¼Ñ–ŠXž6e?^·üóþ <öñÚËûQx¦x"XÔ%Ç…>Ü`¡çðT’\¶T3½ÃÊò8#3 ×Îÿ ¿bÿÚ—ã{ÙIðÏà׋üC¤ßÐø¢}2mÂ\¸ñ_ˆ†“ L@`ÞE¥õÅÉPJÀr¹ýbø-ÿ#ñö°jþ*é^|¹fð·ÃÝ.÷^Õ¥B¥Í¬Þ$×m´'O¸o”y–šf½n¨êþa,~]żcàn¤êñ6…3lÆßì“È09öií'zHÓÁâÞumÍ«†„¬¯;YøjXê±OëF›·½í%FRÞó•4ùewËÉn¢ÛWø¶/ø,üfD_Ú>íÕ0—á—Á‰Y€9ÃË'æ™óб“~:0ãÖ?ügö·øÝñ+öPøGãÿø¶ Æž)°ñDþ#Ôdð·„ôeÔ®lü{â"ÂG²ðþ¤ÚÆÖzm…•мv¨TE—Ìy&’O“¾ÿÁ.ÿe_„k6ðÂ×Åš¼/üB»O_<²•¹ŽÊö%Ðí¦ÞÂbÚ~‡e(o,"TûÇCðÚ4ö:p]:ÎÚ=°ÃiæÂ–êhKta QÇÉL^R îêƒ,ù+ÄÎ0à.+Ž Áü—p½&¥j™ ·(˱™…9Òöq¡_ ”áÜ)Ó¦Û©œ#dÃ0) @ØÀÊœ›AÚò1·/íâY0eÓ|+>Öv-5•Û9 ÛŽÄ‹SHã8Ž28PÇ?!E¤k±}ÝbõŽÌ®“pH=%¸uÈÆÆ@fÆ1ãÅÀ¨Ú~@ðÚ‘w÷žØ)![,çgÝ HþMìpœÎRÂÆöµ¯QEi~U+'kõßÞZ³©J«·,éÎv»Šª­çd¦Û·Ý­ôµ«ï>>xŽH¤‡û Á쎇{¾™´)PÁ—:Ç ‡ €ØËБ‘ó~5êºuåõÌšv–i¼ÈÔ}¼F±˜•öšúw‰cNw´ì±¦#Ž0ª¸ãoõ¿B|¹gJœâ[D18Ü@Þµ»:A‡YvõȆ%ãé®ÞÉñâk¶3Él²"˜e¸·TFi$y˜ ZMÄ JSçù²– *Ôÿs©{EËÞQ…)ViYÝ[Ù¨ÝËG6ìêJRŒæÔ7m’æsv÷•ߺõ[žûaþß~5ý›¼§üFðçÂ/⌺Òé+µ‹Ä÷Þ};æMÔ-îÃzð6s̳XË;íŽÖáôý)º ¿šÖð_»¨¦Y.ÿeK¨Ô‚"‹ãlÖùç's?Â{ Ã° ˜:åOÞ_<¤|SðŒ~x‰Ci>-Ño4‰ÜÆ“›9f@öœK˜ÚëL¾Ž×RµÝò‹›h÷|¹üƒxúǼWâ?ø‚ÜÚë~Öõ=T‡æØ·º]ܶs´,ʦ[y^#-´ÀlžÝãš2QÔŸéxÃ;Áñ[Ä\7Oåxº8ºUc›g¸WÊñPT£GšáéÊXŒ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ºß Ê-m|Y~¶Ö6‚{3¨éº~«Ë⯠X¼Ëi©Û]ÚM¥ÝÌ #@Ή3ì*Ç4Ò»¶Ú7ßD›}»w§áø»•ÔÂ_«ϧ…ÿð‡ð_ÿ((ÿ„¿VÿŸO ÿáà¿þPS´?š_ø ÿäÃ_/¿þ¯ôôå讣þý[þ}Ÿæþï3îZ+åøb/Ù×þz~Õÿø³_ø*oÿFÅðÄ_³¯üôý«ÿñf¿ðTßþŠ9iÿÏÏü’AwÛñôÿ7÷yŸWÑ_(Ã~οóÓö¯ÿÅšÿÁSú6(ÿ†"ýç§í_ÿ‹5ÿ‚¦ÿôlQËOþ~ä’ ¾ß§ù¿»Ìú¾ŠùCþ‹öuÿžŸµþ,×þ ›ÿѱ_Ÿ?šÿá·üÄ¿¼ãOÑü±ý|Bý¨?joÚÃw¾:¶øÅû5ý—ÇokûI|køÃ.™â«M'ƚ߆ío<=6‹iƒ3ÛGb·WúÍî¦Õ8ÉIÆwp‹“\­hš[¿Tµ®·vÞúéÿîó?mh¢ŠÈaEz¹®]iV6>Kdðç„gøVöwž÷º5õÜÓ]ßh×7sË=ÝÌóÉ$óÈåä<… oøKõoùôð¿þþ ÿå[QM§)]6¢­uÿo!'}{ÿÀÿƒý=9z+¨ÿ„¿VÿŸO ÿáà¿þPWŠ|ý±>~Ðÿð‘€øçû5üsÿ„Cû#þßøSÚïÁ‰¿ð‹ÿÂAý§ýƒÿ ü!K­ÿbmÿbk?ÙÚfþÒþÈÔþÇç}‚ïÊV›¼ì·|ŠÊû_ßêù}þž_Öôô:+¨ÿ„¿VÿŸO ÿáà¿þPQÿ ~­ÿ>žÿÂÁü ¢Ðþià+ÿ“¾_ü_ééËÑW|AñRÇÂvjž)Õ~xkLºÖü5á«]GÄøy£X\øÆž#Ò¼àïÁw¨èöÖók~,ñv»¡ø[ÃZTr5þ»â=gJÐô¸.µ=FÒÖm¿øKõoùôð¿þþ ÿå‡yà ÿ“ |¾ÿø¿ÓÓ—¢ºøKõoùôð¿þþ ÿå|]ðÿâ'Œ¼]ûe~Ö^×µ§¸ð×~~ËPøKövZn èmâ(>5êþ ¾³Ñôk=?N:¾¹z-†¯­Ím.±¨Ùéz™w}6™ h–– E5&›÷b¤ÓŠWNQŽIëy'¶×ö¿_ò¿ùþôâ¿à¤òc?´—ý“÷ÿÓÖ‘EðR?ù1ŸÚKþÉûÿéëH¢½ð¥ÿ_þ“9î½?V!ðvÙþ AðG'þl/à/þ§_+ùqÞ¾õýEÁÛßò’/‚öa_õ;øÓ_Ë…¦âªCÃ> „TRŽQv›o÷õüío+_ÌøÜ|SÆbþý¶?×õrO3ÛõÿëRç€?Ï¿4Ê‰Ï {f¾ú¾6½:n|íµd’QWmÛ[$íÔäåoÌб—uõ’ök»ay™˜Ìî:×÷™ûüý•¾ü3øWâo þÌŸ³wĉx'Àúψ|oñFÖ~%x‚?Ýø{O“ZÕ4¦ñŒoôŸ]\ÞÍx/ iZ-…‹¹0ئ$Vþ\àë_°ÿ¾=|&?þøj÷ÅÚ=¾»¢x[AÒ'³Ôû>â;û :ÞÖâÞ©Eg­ŽKInà(‘ÿ?øÍC<Ïpyu&iŒÃa(ËO„ÂÓÄJŽ-â!Ft^/Ø×¦¥JŒiT„#V#zó’ÕZ]xYÑÃÊUg‡Yµ¶¯J0rmÆð•›æ»jPøUÛéýåé_,uˆÛþ |?òÚ‘&ïYÓÖØ–+’’\j+ ÅK…DÅœ9@&ЋÇÿ ç!ï¾ ¤LK}7Å‹mÚ‹­´þusò³<‰$ næ79sürèõM"8.|/ñÄ:ð²ÛË¡x£XÑåÎàÑK¦^ÛÈ 7ñDø†e`O­é?µÇ}Ç%‡Æ¿Ë´f3©xªï_ŒçÆ=z}Nºäy©"·pA ÿ1Vá|]”jÂMɧÍõªJË–ÉKÙK¥î¢ôÑëͧ ñ´æ×<%i^ Ó¥6Û¾¯žN÷ní«7¢óÕ¦¡«| Ôܳx/ÄÚQiØ[Ë¥_È»aØÑùÏ6œÒ+JI¤aP;BŒø¬>ÝÊøOiñƒQs¤XNa†`Öš¥Ó¥K6äVÃÈAÇó/cûqþÕ–“G7ü- -rØùZ¿ƒ< ”n_›¢øgL•‚°Íæd-!2ŸWÒऴ’Ç¥¢|)ÕáN §Ã>'°¾fOõ“Zøãì;°bËG¦F IßÞ¨‡–yFcNJÓvK–8…Í-SçpÕZÚõ•Ò²vq­FSns¤£m¡&ÚÒÊÊ--5º¾Í'vBÐxcàÜÏ—Åib eφõÖP¤”ýçÙm.ä*7y¹…Káä“ÞµøSðZûrÅñgKQµ· ËØ©h ýÝ[;ÆXn ŽGáÿ=ñD)zÏÁjÎU¼Ë7ÇZ—‡Õ ¡ŽÊëÂ~%gWl#©Ôb(Ì .ï)=Nÿ‚šø Æ_\øQãKV‡uŸk®Ã~ Ögð”JÁJ¶Ýø;\A';ÁfpÓ“·ä”*^Þpç»jöÕïÕ»r£Íx,=HèÕ¥RŒ®íºsŠ²ëµµÙ¦~´|UøYðwŸüAâ;âW„¼EªéÐÅ™ éšªM¬]ÜÝÏh4ß-. ªÈno.öG“o$QOö…UOËL×÷ÉœX¶¤íXÄr¢•MÌÌØÃmÞAc´6W›üAÿ‚„ü$ŸF—P‡ÂŸ¡ŠÜLÑé×W„ÒâY®Jª/˜ž.žÉ#„ÈiðÈFFaxÇöÿÕ/á|ðþÎÍäpðê>"Öæ½tÊR9´}*ÊÂ"B¨G1kÓ#‚ܰ¤¼<œæá‚ÄYÃÙª˜Šj—*š§)Æ›Ä*Q»‹JRJî-í£]Ž®œT½¼UýÕ[Ú´Õ´´eRMÝ'Ë¥½¬Ù÷MŤ¦GÀPTìä2’¬xÈ Ôvœdõþlÿà§ðø?Oý¦µt8#‡YŸÂºñ_“'_’Ò}²ÉQ´MáÑá⨃kJ%ŸÌW’hßì?~Ù5_0ÇâË%ÃZ—mnVHÂ…[ÝZwY5EÿQ©£ˉfbf/ø¹ñ×Å—Œ~*x³ÄZ¾»â-RþæÐ_jzíÆ¡x×6º}¥¤¶ó^\»É!¶x %2¦Ü*˜ˆ¯ÝüÃfü7ÆÏjÂ(¬§‡–ª¹WXŠØ7uÕ8û/d¥I×JU•Z4­ YÉyy‹ÁbiÆg'^iÍÅÆTãY>O†q¿´JNI§8ÊÎ|¯‡Æz8ç¶y§SÑ…sèÇyäg×½YRpyöã½i`¸Ö®%EËOXó>YÉhš‹I¾k5'ªµ·].xÏ“·3ÓÐØÈõ-f#FOùõÿ>µaœóý?—Ò¾ žCËû‰EÊö´ÓK•6ÓÓ{+®Žý:äéÙÚÿö¯üŸþRûÿÙå~Ìú»|_ë _äçÿåcÿ ý„FzþÙ³¿üÖï×úÆWðOÓ2´kq7¸¦­‘cÓNÛÿhGk7úSÃÑq¡ˆ½µ«ý (¢Šþ3>ˆ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+¨ðÿü‚|qÿb½§þ¦ž®^¹Ÿ|iøQð'À^1ñ—ƈøw᫽;JðþŸ©øŸS†Áu]z÷Åž¾¶Ñ4kf-{¬êòiÚf«ª¶›¥Û]ÞE£é:¾¯,1éšV¡umPMÊÉ6Üd’Z¶Ü]’][Ûæ¿4tÔWÄ?ðò?ØgþŽKáÿý÷­ò¢øyì3ÿG%ðÿþûÖ¿ùQUìjÿϪŸø¿È.»¯½T&¤‘xôZx¢[û;_°2|6Ó¬®gµðÿŠ5«/Q$½ñ>©mskwyâ? i¢âãÂÿ å·D½²k߈Rj>0ºðÝæ‡ðïȾ&øŸû&÷ãç†ÿábh>ÿ„×à—íþÿØ~Ññâ÷Ú%ý¤,?áðïü'^þ̺½þÔþŹºÿ„'â†ÍoÄ~—þk¿#û']ó˜à¥_±»™-ÿiA#E< ðÏ®ÄíÔ[\ÂY4¥cÅ´ÒÛÏ;&‚Y"4nÊoé¿ðSÿØÏFó¿±ÿj¯ é_iòþÑý›©ø–ÇíO™äùßeÓ¢ó|¯6_/Ìݳ̓n7¶v¦ªBIº54‹Ž’ß®Éú«ù§Ñ&ÓM]j×UåëÛÐ÷ˆþ,½³øìÞ¶ñ‡<#%ÇÅÿ‡Ÿ ­<ªxÇÃöw> ‹Ç4-Ä>%ð_Ã¥øWwâßøsÃú?Œ–ÏLñ"|Uø_£Câ/ëöëáÝy<+®éÏ¥ø†ï[ӾϣxßþψƒÅ³'‹¼aà+ÅÑmü5à/ˆz·Ç/÷QxV×|áiõÏ„z^ƒ®kº×‚µ{ˆ°üMñÖ§¨h±O¥YAyáŸÙßùö›ÿ?ýŒôo;ûöªðž•öŸ/íÙºŸ‰l~ÑäùžOö]:/7ÊóeòüÍÛ<É6ã{dOø)ÿìgµ•”µW„ã³Ón’ûN´MOÄ«ma{’Ê—–P.œ"µºIfšT¸#•d–WF&Ók‘ýV¢”d¤ä îí.d®ã¥ÝÛ’I¤”uÅÞó[Ykä—ó×Sê?jöú¶g»QÕ/õý?̲ñ”zΛ¦èz†“âÉ[ûORп°4»F #KÒ Ôl¬¼7¿]ñ;ëžFñT~*ñ%¦¿m¬Þtõñ1ÿ‚•~Ä vÍûLx­¡–iâ·3릧¸H#¸š8ޕ夳Çkl“HªT·\²ÃX¿áä°Ïý—ÃÿûïZÿåEsºU[mR¨¯ÓÙËO-ÝŠºî¾ôðR?ù1ŸÚKþÉûÿéëH¯·«ñÏöæý¹¿dвGÇx ã¿üIâÿxâÓBЭ./à»Ôîà¿°½{kg½°µ·k†·µ™¡…¦Y.dU··Yn%Š'ýŒ¢q”iSRŒ¢ý¥Wi&¹ikgm4Û³¾‹ógʳü”ø(_ýŸýŸþ»Cþ —_W×áþ³ÿOýŠÿb?Ú#öðøEû@|S‡Ã?õÏÛ#Aøoáhm#kËëðNïø'†4~âçR»Ò´é-µ­wÁž/Ó­ °¼¾½‚_ÞÉ©[XAs¥K¨[ÿˆ„à˜ôZ'ÿÀóQW:5fã(ÂN.+5³µ('ø¦%$´o«üÿàÿVgí­2°xkÄ~j¾$ðç‡õ¿|+ý±à¹>‹ÇVžÒ¯õ¾~Ðß ÿàº>%µ^6Ôg‚ù-þ|cø!ð‹á‡ÁFa®xgDøsñWáOÁ« øÆz÷í1ñ'Æ>ú×þ"ÿ‚aÿÑhŸÿü=ÿÍEñüþ‹Dÿøáïþj)•xÿË©;¸·Óá»_ŸÊÚ¦Ó¿ôíý}ûYž7«þصWü.?Úrׯ_µwÁ?€~ðgü7V—âo}ºÏãWÆ?Ù{à‡ÁO |r¿købÏ þÆ–ÿ<-öÍ?À?þ4ÂsûA~Ù>?ýŸþ6x[âoöÿiž&ý¢?g?x'Ô?gÿ‰Ÿ¾3~Ý_~#þÐÏ­þϾ9ðÖ‰ûwü!ñgìÕ¡ðÏÆžø?ãü;ÿ‚k|Hø{û$j¿´ß`ürÖþ&|+ðÏŒ?à žÕ>ê>ø¦Ø7‰~\ë:¿gß‹>¼Ôÿˆ„à˜ôZ'ÿÀóQGüD#ÿÃÿ¢Ñ?þø{ÿšŠ§N¯J {­][ªk·ž·»ÑY¥ÍÌ®¿›ªw/õÓw¦‡ß:W‰|F¿µÇ‰|1ð¿Äß< .‰ßí;¡ø“U¿¿ð?ÀˆøCÃò|-áŠn§Ô®4¯Š?ü"Ú¡ñö`Ñ´ù<§|?ŸÂŸ´Þµ¬üñÏ4/ööúò¿¿â!ø&ý‰ÿðÃßüÔQÿÿÁ0ÿè´Oÿ€þÿ梳t+;~êZ$ºkn¯ôò¶ïVù£ßúÓúûûiûk_‰^ÿ”ÿø×þÑÑãÿý[±õñüþ‹Dÿøáïþj+çØÏö²øûcÿÁlü]ñcà´ÿxROø'ÇÄí*ìÁ=™Ô´«ý?ãOì“bðj–v—w‹kö¦³–âÆUžXn­÷lOÔ÷ U!Îpq^ÊJï¿4¿&Ó峿¼¿¯Çú³?¤J(¢¹K:ÿÈZÓþÅÿêáúåëæ¯‹·×ìkàêž ñ7íðâÃľÓ¼-áÿiê“ê£ëÚO„ô;cD¾¹Ò-/ì¢Õô]F+[ÓMɼѵ‹;í#S†ÓS±»µ‡Í¿áä°Ïý—ÃÿûïZÿåEk*U\¤Õ:96š„ši½vÕ2SVZ­—Tt_ðP_ xÆŸ°Oí»àïx[ñg‹¼Yû!þÒžð·…¼5¥_ë¾#ñ/ˆõ߃>4Òô?øCÒàºÔõoYÔî­tí+JÓ­noõû˜-- šâhãoø»ûn~Éþ*øñ#âìóñoáwÇŠŸ¾k¾´ø³ðÅ_ ¾ Ãû:xsâïŽ>x+Qñ¯ÅŽö¾ øÙðÛöyø]¢xþÿ?u‰žñ]…ׯ€_~/Û|øÏ þÏ~1ðþ—é_ðò?ØgþŽKáÿý÷­ò¢øyì3ÿG%ðÿþûÖ¿ùQMS¨’NWfßÃ%{Ù4ý×£KËw¸î»¯½™ù‰û&þÓŸµ—íYñEýŸll¯Áàï Ã`XøŸãÏìë©þÏ´ö»ñ3Jø]áoø%çÄ_êøã7ìÝðŸàCøÛÂ~+ý®þ"ü;ñ±§þÈöž ‡áÍž·ðÛXøu®ügÒt/Ú_DõÙkö×øñ÷Wø;ã?Œµ‰ðâ§´OØó]øaûxkáïüGáÏÚKáŸÇ/Ù“öpøµñG⿇þëˆk½DÒ>'üWý¡~é_>ügÒ>ü °øŒ~3x{ÅÚÁ?Ú! OŽþ ø¿ûwãgükÇ¿þx+â-ŸÄoˆß²‡Æù¿à¦ß°È¶ø7âßøö<øÿ ¡ý‘ÿ Å/ëßÿj¿_´—í«ë¿m4¯xÏ]ÿ…-ûBxËÄÔ-|Cÿ#ý†èä¾ÿßz×ÿ*(ÿ‡‘þÃ?ôr_ÿï½kÿ•3…IZÔ'›vP•µI*ì4Õ—¼ŸÍoWÄ?äù¿mïû'ÿ²þ™~5Qÿ#ý†èä¾ÿßz×ÿ*+€ý“>*|;øÍû[þÚ=ø[âíÆÞÔ|û'ÚZkº$í5«Ýé–¬¯­¤Ic†âÞâÞâW†ædhÚ+„V·ž dQ§8«”'ìÒ¼¢Ò¿µ§¥ÚZèÅtÚ³O^þLïÿà¤òc?´—ý“÷ÿÓÖ‘EðR?ù1ŸÚKþÉûÿéëH¢»°?—ý|úLžëÓõgó ÿD~É¿µGÇø(Áßüýš?hŒ¾Ó¿bO¾Ô›ks¨jš¦¡soc§ØÛÏww<0C$‹þ›uþxÿð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYWãÞ+x˜x«˜e9†a—`ò™å8:ø:tðs¯Z5cZº®ç7^IÆQk•(èÖ¯SÑÀáa„á J¢œ”›••šV²²ùŸèqEž?ü-ŸŠŸôRþ áeâ?þYQÿ gâ§ý¿ˆøYxÿ–UùOÔ?éïþIÿÛÞÓËñÿ€¡Åþxÿð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQõú{ÿ’öáí<¿øúQ_çÿ gâ§ý¿ˆøYxÿ–TÂÙø©ÿE/âþ^#ÿå•Pÿ§¿ù'ÿnÓËñÿ€¡Åþxÿð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQõú{ÿ’öáí<¿øúQ_çÿ gâ§ý¿ˆøYxÿ–TÂÙø©ÿE/âþ^#ÿå•Pÿ§¿ù'ÿnÓËñÿ€¡Åþxÿð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQõú{ÿ’öáí<¿øúQ_çÿ gâ§ý¿ˆøYxÿ–TÂÙø©ÿE/âþ^#ÿå•Pÿ§¿ù'ÿnÓËñÿ€¡Åþxÿð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQõú{ÿ’öáí<¿øúQ_çÿ gâ§ý¿ˆøYxÿ–TÂÙø©ÿE/âþ^#ÿå•Pÿ§¿ù'ÿnÓËñÿ€¡Åþxÿð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQõú{ÿ’öáí<¿øúQ_çÿ gâ§ý¿ˆøYxÿ–TÂÙø©ÿE/âþ^#ÿå•Pÿ§¿ù'ÿnÓËñÿ€¡Åþxÿð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQõú{ÿ’öáí<¿øúQ_çÿ gâ§ý¿ˆøYxÿ–TÂÙø©ÿE/âþ^#ÿå•Pÿ§¿ù'ÿnÓËñÿ€¡Åþxÿð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQõú{ÿ’öáí<¿øúQ_çÿ gâ§ý¿ˆøYxÿ–TÂÙø©ÿE/âþ^#ÿå•Pÿ§¿ù'ÿnÓËñÿ€¡Åþxÿð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQõú{ÿ’öáí<¿øúQ_çÿ gâ§ý¿ˆøYxÿ–TÂÙø©ÿE/âþ^#ÿå•Pÿ§¿ù'ÿnÓËñÿ€¡Åþxÿð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQõú{ÿ’öáí<¿øúQ_çÿ gâ§ý¿ˆøYxÿ–TÂÙø©ÿE/âþ^#ÿå•Pÿ§¿ù'ÿnÓËñÿ€¡Åþxÿð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQõú{ÿ’öáí<¿øúQ_çÿ gâ§ý¿ˆøYxÿ–TÂÙø©ÿE/âþ^#ÿå•Pÿ§¿ù'ÿnÓËñÿ€¡Åþxÿð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQõú{ÿ’öáí<¿øúQ_çÿ gâ§ý¿ˆøYxÿ–TÂÙø©ÿE/âþ^#ÿå•Pÿ§¿ù'ÿnÓËñÿ€¡Åþxÿð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQõú{ÿ’öáí<¿øúQ_çÿ gâ§ý¿ˆøYxÿ–TÂÙø©ÿE/âþ^#ÿå•Pÿ§¿ù'ÿnÓËñÿ€¡Åþxÿð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQõú{ÿ’öáí<¿øöµÿ#ÿ“ý¤¿ìŸ¿þž´Š+ø»øñ&þÖæÂÿâŽ/lomæ´¼³»ñf½skwisCqmso6 ðÏo<.ñM ¨ñ˲:²±®ª½Œy¹¯'+ÚÛ¤­k¾ÝÉ“æwµ´±ÿÙPythonCard-0.8.2/tools/standaloneBuilder/doc/pic5.jpg0000755000076500007650000022475710231140007022430 0ustar alexalex00000000000000ÿØÿàJFIFÿÛCÿÛCÿÀJX"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ûþ ÿ…ý¥ÿàžÿ´¿Ãÿ‚_¾~Î^!ð޽û7ü/ø£}ñ;áv¥â_Gâ?^x×HÕ!SÑ"øã?éÚuÖ«¤x‡A²Ôå´¼ñ„üY¡ÛêÔ<çöYÿ‚c~Ð>¸ø›ðá·ÆŽŸ¾Á>þ xçöHý˜Â>/|^³Óþ8ÿÁL?mý¡¢o€_ þ=þÌÿ¾-Ã3ø×PO…gYÓ?hhü௠jßðšø¿ÄÿïGƒ³ø'ûÁ 5[/ÚoâïÆ‚?ÿg¯„ß²WíŸáüyø_û[YþÓÞ ø÷ðßö?ý¢ÿeÅðÇÀ߆íàŸƒ÷^!žõo¿mOÚø‡Àw±jzÄè¾ øSNÕ~'øöÿOÕ µñ‡Éÿ¿fo‚_±Ïü7þ ]û5ü+³Ñ->#|+ÖàœWís'†õ‰:÷‡5OÚÇXø«áÏ|Bñ©üJ†ÚâmÅ~×>x—I‡Âz~á->ÇU‚ÂÃþ"µñ‹§}f,ð³‰Å`¨p hâ°Ùf#2ZÁ:YC ‚¥Ž«Eâ©cqJt1ydêÊ©C7Ë*'8âá%ä¼GR§JµLö¥S :öU¹ê§:Ò¡ û)P¦Üe:8…)A·„ħÊéK–ÒÁÊ_·kŸ„?±¬`n,৉à åpw|H”Ä¥†ô\$¬Í žÓF/ø9öè½ðö8Qßþ,§‰r:`á¾#.AËv²íÕÏŽÛô&Oˆ¿²ÿíÏÿÑ¿à™ÿ4ŸŒ¿µa²ÿ‚˜ÿÁ@~+x«Ç_óÀ ð[áï‡>|ZÐôÙGö~ñ?ƒ~2xïâ=ïÁË?‰´5öâo‚<ãÀ> ŠãáѼ»‡Â_~¿²‡ìqûPü7ðÏņ?±~³ñKTñ7üOöTý–~%üñ'ÆŸ¼Eû:~É:¯Á=‰_µ¹ªü¿ø®èÚ¿Å?‰úg޼M©|Jø‰á“ð;Â׺Cø7Á^ðΛáMVÆNU—xqK S™xt°2¥‚Ëó ûF¶êÙ¶/„ËÜjã1¹n"3¯ý™Œªþ³‚ÃÒ…:qQ«9â0±­¤ëñªÂn öªU«Ð\ê¤j{L-,=LBp£G FšÄQŠöujMÊNN1Tê¸rƒþBý¹OüÒoØätÿš)â<Œ€{üHrG¨Ç8;‚Oü}ûr8b~~ÇgŽåø+â=ªDR8 ÄW9%r9QµqPL‘}‹û,~Æß±?ÅÏ„¿¾ øŸÄÚÍçìí£ÿÁuþ4~Î:OŒ4¿ÚGÇÖ¾ ý¡ü àÏÙŸâç> k~#Ñàñã~Ï÷¿¾1jÖ þAñ3àŸÃ¿‡~2ñ€ît ü>Õôø‚]{Sò~ıߎ>&Ad¿°ßí]ðŸâo…ÿbÛGâgƒþü{øQñ¯öpø]ûaþÑßíü9­|ðoÁ‡:ÿí/ñóö—ñ¦·§ø?Æž!Ô>)øá·í!g«jsxÀþ%ðí§‡ô[ÿ躛XO #_†«ÀÒ…L,jÕ“Xjj„>¹ËQÊ®aAÓœþ¥Sžœ—û2«Fx™Q¦êʉœPéÑ©íIUq‚½I]T~ÅJ)G>ekIÂj’›äSò˜¿àã/ÛÉ ð£ö=¿¼Fv¯˜Ê¬Iøƒ‚HÎU„{Z)…18´º¿ðqOí¸@Ýð£ö@SÆGü)Á?W dà§,çõ7ú7ŠWþÿûH|8؃CðÿÄÏÁC£ø…ñ#öd·Ð?jd׿dŸ‡>#ý†­`ðÿí7©x?Xø±yñ—Â9ë~"Ð|Yñ÷^ñ—Á›Ûûï%χn´=3JÒ<5wþéã_†~:ýœþ5ü*ø³âm_Âð~ÁþÿÁ`þé~ð¤º÷Œ<}eû9é_Øß|%«É­ê:7‚îtkéð×ôÖñüiý¦‡ìýwðûö¥Ðoÿjm/àGìÏðWÆ1ðÖ‡eñ÷öÈøÕâ_‰?gh<_ñÖMNÁWáW‚<ᘾø;Z»ñï‰áñ§ào†:o&á¦*t(âxƒ«Šx'„:”êQÆcó¼±)b«`kÂŽY3Q•iÔÃÔÃ,‰¢húwî5 [WÕu ›{7M°·žööòxmmà’yDcôgÀÿðIoØëXø—ðNñïìëâß ˆnoŸ²÷´¼'ûA~ϾøÙà? ~É_þ)øgâ7ƒô¿ˆµGíñÄ>·ñ÷Âë KáÇÅoüSøy¢ø¿GÔÖ8,.´ªÖ£‡£‡UqØœvF¬çšFpöµ2üMyÔäT¡‡P‹¨±uiaZRâšu°ô«ç<޵JQŒêT©ËB޵iÅGÓäXŠtÔT¹ÝKµcRq­ÿÁz¿nß kºç…¼YðKöbðω¼3«êZ‰bÊŸñwünrWceÎÝÈw&ÒŒw¦ß6™-†ãnÞÛ>uýâ/'ìë…;6º?-c–'ËÓþï áÏâ°8,[á\®œ±X<6&PŒk8ÂUéB£Šn­í6“vm-WoÄ9íõ©G4Å5N¤é§x&Ô%Ê›µ7fíwk}É[÷LÁ}¿lrä˜þʺ|Õ¸çÿÅuŸnƒ‘È8ŽAÿóý±ÏüÓÙ@qÿDsVàã8çÇßòç!Ôr8éŽ w§è0@ávâ”cøqÇR0GÊ8ÿV¾œžÛqÆ6¦ñðË€¿è—ËvŽð­Õ+ÿËÏ^Þ‹u•>%ϯ™â^½áÿÈy/»um?s¡ÿ‚ôþØR0 ðÇöURX‚?áNjß(Ý(“ãNX%€S“µ Ïg}?à»ÿµóŸ†Ÿ²ºž7ðwTr3ÁÆ[ÐåP‚¬# D?‡V«†Qµ× ÷Yx_žCÉòFçýÞ[ƒ·ÉÝ”ò¼Ý?f!…Q‚6„ùJì òW÷0är6¦Æ ¸‹ËÙkðË€”´áŒµmökw_ô÷ÍÿÁ¶™Ï‰³ôݳLR³VÖ;_þ½¾Ë«Ñníuûd?໵é?òMeÓ#þö¥‘œsÿ#Ÿ äã§Ý9ÁÜxÿàºßµÛ»á§ì·Ì¿µ"»ãð™ÄíÈ$ Â0b ´‘~((äqŒcŒr9NŸ'Ý8ã¦6㸊Ô# [k¾uòÿtí…QË|»Õ·&ÓÉ2xgÀvñŒe»¯³[·ý|_×N‹UĹó‹ÿ…QVÍ1+Nð]÷cÙtV²Õ²«ÿªýªÈ¾þÌÊq–ð©.ŽÓó‚>)@Ø*?»£yŠEÿ‚ÓþÕ$àü<ý™ÿ„w?/ÍŒŸøª³Ó äã÷‚Çè×hQ°&ÕsA…>\y+Œg+À'äÛ˜l ç§B:t0#oN1Œ.wËŶqðÛèšË¶f¯xÿÓß7Û׬bŸçî×Í1O^ðÿå~KîÝ[OØ(à´µ<¹'áïìÐ#'þ-ÈÀ(N@o€Ø#'.˜UbÅTK$qÁe?j'o‡¿³rã9ÿ‹M>AØp|F2ÌAà€ :«—X¿-©Ø¿)O™†>LåO”ŸÝÉýä{Uwf?/͵޷\ ù{pɌƜä¯ÊÛr>îÀŠ›cÛåÁ5<7àeøÆ²å§òÖ]¿éê×îë£ØUxŸ?‹Ó4įG˧/’éÛn¿®_ðøïÚþ„Ù¸uÎ~MÀùñÉñ £ íÆ%~*Aÿ‹ý§‰ÁðìÞ¼wøM7HÏüT™ùº.@Á9P$0þK㱌œc§ßä‹óqór»qÕ6þât#€0UÎ2'÷ÅŒ' ±€9ËÝl£á¿5ÿ$Ö]·òÕþîÿ½}ßUèʇçî÷Í1[÷‡ÿ+òìöÙ[Üýs‹þ ÿûM;a¼û:uÁÛð¢S·.N¼ I*…]`¤\-¥Ñÿvý¥ˆçÀ³¨ r–;N•É׆ìc®#¨6ÏÉ»tÃ(òñµ‡ >TÌ‘ó!~S·‘±6H a<ºv². ª»WTd&¾@|µÈàáx…Çîò—‡<­n˵µýÚ½Ußü½}»m}“lÆ\SÄ Zf¸­ÿšø|—ݲ¶Ÿªcþ çûJwð'ìì9?óJË÷ºÿÅ@@<ºÀãç1Z‹þ ÙûII×À¿³À鸅,6®íl#àÈ€ bí¬ïkùT@0On$üÃh猞6Ÿ»³0h[/Cµ~R§%v˜ùc¸7’™—wúÔÙݺ#Ͱ‡gÿÞ_ºû5ºßü¼õêúè—ëâ|ýA¿íLMÕµ¼<¿¹§þK·[Y~¬Gÿ`ý£œe¼ û>§LçáXàíR8:Âä6[i;HÚª¹‘!°?à«´Yÿ™ö~¹øV™{×ZPqŽyHù¼¿ËËtÚ£÷{1ÆXr¹HøÈO‘öüƒåòÂ"ìg•my?‡õà½ßbdñƒó c9]¹‹'á×s[ý\Ëíå«å×Ú¿Ïî1ñ2_Ú¸«[¼;ÿ¾ž[o§»úwü_ö‰v øàùXü¿ ÓªÇ'Ü9ʨùNæŒyŒ_ðT¿ÚÛ à€`goÂØþP\¨-»SRxà‚¨UІۋ…³ü¼ˆeÊNÏL„nHòäé·®ÕÚW;¢Ù¾ßjÝ0Ã÷`m`~Q€Ÿ¼Q¸³Ç×flMŽ€~ïÈÛ¦’ðë‚-øÇ2ÿü·dÿçïvûöòZOŠ8%lׯçü ²ï²Õl~›'ü ö‚#Ÿ|Î9Ûðºà’3ý«’28$.@9 ól—þû@ЙðzÿÅ­ƒ€sŽºªäñÈ8Æì|þ_æÔc  a@Âò«…<“ Æí\κ°@0sÓ÷"òqó}ݸþ ¿¹Î>ðKµøs/Ýýš»&¿é÷êÿĈ‡ñß5Åtë'ü·w·exþ”§üßãó|ð%?¼á|A™G;µV9AÆå$…Ìj'kMÿय़Ÿ–ðgÀÄ;³ðÂÛ áHÚù7)ËsFÐỦæÄ)‚¿»Û·çhðÒò[È'äÀùÓ`F}Ðù>e†Õºmòöà–tÊGò§î"Ê6Üõ6"mg•mðó‚’Mpî_ðßá«øþûü½{⎠W¶kŠVi/z=ãýßÕÛ²¶Ÿ¢£þ Oñߟø£þñŸù¦Ÿ.7pßñ0ëÆOAÁÎ>m“§üã³σ¾q»‘ðÂÓ #ÓO'nîv#pŘöÿž uãÏo»÷¾÷ÉÉã9ÀÆ:®ßÝZ‰xc°ð2£äsÈòŽìÜɳËc˜¶y–‚ðó‚¹äËïoå«Ñ¯úx¼úkײ¨ñG;ß5ÅZëíE/Uÿ¥y[K/ÑH¿à¢ÿœÞø$G ðÊÐàU2OÚ3÷Xä2džƒmap–·Gü?ãqw„¾ «c$†v Á$ö HÈÀ%W=H^vþ|[&<°¸e;BäßÃÏü{|¤ìÉbØP¯îüŸ/OÖAµTmTÂcjŒªáXmSå¯Sµz…ÇËŒ¼>àÅ'nÀtû5_EÞ«þ½I|QÄ_ð«Šû?j+¢þê캯‘÷·ü<3ãg9ðŸÁaŒçþ-–Ÿ2þ·k’6ŒŒŽ’£yŠìðP?NÀ7„¾ Æ Ãøiaû°^UËfE ·hÜ\l±EÏà01ž6ã=¹\ä|«–瑌•Ù˜5-“k¡òÂmu9‘ÕbY>fÿFMÄlÃŒ»Y³‘»N©x{Áj-®À^Ë¥[ôÿ§_’~]ïýgÏì¿áW{7ñG´-ö>íÎÖ_|Gû||f~O…> ¨ÀÏü[]<Å#`‘£$eœà©@ ‡.‘N?o?Œg?ñK|ã?óM4¾0¬pq1çŒö8ä¯ÃvéŒ-FFí»s ¸Ú£ìÐeϘñ´Æ‰µqåAp¼và|®p~SÏŒyyy×pmíþ¯à:}š¿ü³Ë_ž‹WqÒþÕÅàPòþç’û·[Ÿp'íÝñ…·gÂßøÜK†º^Õ&aŸœå‰@H%¬rodcÛèÇûqü\vÁðÇÂ.ª †ÚfäE]íòŸ”†` „`з˜#?iK/†c^IØ~PÇ8ù÷sÝÞ6ÌžcòÄlwE³Ì´Ü~e~ë!Û³æOÞÛÌ~Ì~CåíEÄ~Yˆ°y>^˜êxÁªÖáì»W´jöÿ¯’ü×]µµÔ⎠I[5Å-VÒ—÷nëÑtûX~ÛOüË_ ¯ü[}®ã$dryã¦1œ…ü6ÇÅŽâšøKÆæ›èÿ.­îqžÃç•øåG°é¼'Ê¿*åN9>  q…˜¼>ïÃ|‡,qxÀF2™Ã€x9Úü?ÿÀjö_ôñ}þ¾òÕ‘OŠx…ïšâž«¬:[þù~ékËöz~Ùÿ†ð߈Ž[;þhøA¾e‹$`”“ @ò¤,Ȇáì4SöÄø àáÏ…ŠxÈ?4`!ñ@„€º©HpŒ²¬_[˜1íbq"ñ%”îcåC¹‡•™y|Û¢ò|Ý+j„Q† Ã&п,=‘ËÆqµ6¶Sy~]¶rà.MÂwÒ®×÷×O>úîÔÏŠx†-¥šâ’ÒÚǺïO²]_£Ýýh?l‰øçÃß ¯ü[­ óÇý3{ñîÈ#ý®þ&6wxwá€%™~ègh +·Èù›ä ÈGÜÈ¥¤‡äÕŒtéÛ§å~0¶á;¶ºíïQ¸Ç„˜åG•̃nä;“·Ç·Í€ÿP¸=Á·`n•þ«]?éâíÛ{é't®QÄwÍqZ%»‡—÷eÕmëo®¢ý«¾$?ÞðÿÃ1ó0ù~ègn(6}·l•*Q‹¤en#´´?jˆ½ô/†cþéç‡ûãUõ9G—§h¨À鎜ÏEヘàmÇðíÄX¾á ÿȇ²{UÞñ_Ïýk¦éBâž!Óþq[­Ü?»Þšùüµ‘ôÂþÔŸçAøkø|<ðþÿŸCõÇç•чö™ø!ù´‡KÉ ?á_xxÿxé–ݧŒà. 7#ÁEÇØþ\AÇÝÆa>^Ÿpúd}Üü8ÊmZ& -†×<ƒïØ|߸MØÙ´œ/Ì·¯‘»Nsà>QOûⶪ·jÿòñkò¾ú-JÿZxƒ’?𫊿{Âú[¯"}O»cé…ý£üxÀ¢|;€Jÿ¾ðæS#<îÓÕ±é”VàîU;ÄrÃFxëþ€ßǯü[ÿ qéŒØ ûž1Žqólùî!…Œm# ¿.Üá~ðòcã”yi·ÙÜAdzÀ/…;W ãžFíŒGŠà^ÿ¡ ~Õ»ý÷úuÑkbQŒ•1ÂlÄ>á5oøCÁnºTÚÉÿÏß=uù÷Ê\UÄ*JÙ¶+oæ‡ÿ#¦Ë¶Û­×ÑZˆ<_®è«®É¨|'ÐìåÕu "µZIs=Ιi¥^]º&‹à}^4"Ö,•Zy`‘ä2…‹l{ާö‡‰èmø'ÿ†òÿÿ…x§Š!ðlÿ³ŸŠ-þ"ø_þo‡Ó‹ðøëÁð‚j¿á-ðlžðjxŸÂÿð¬´-ÄÚßÄOíí¯´¯øA4 xƒUñwÚÿáÓôZïP‡O¸þldÙûãÇ„><~ʾ*ý¨ÿgßÚ‡ÄðO»_k³Á4ÿg¿x–ç㟌¿àž2¿¹žoƒ¾'ý¸>xkáŸü&ßò$ÿii?³W޼{ñ+ãž•ÿìÒ¯í~üS×|?âÛ›‹ü‰ñØ|§ˆ3l» “dqÃ`± W:•}:–súÌ9¥ÌßÙ^ëjÊ_­äJùŽO—c±9¦lëâh*•\1jæskÝŠ¤ÔU¢´¿áªýtý¹?h¯øX_²íáá/ ê,Ÿðª¬5…'ñ‡<aáXõ-thÿuÏØèZÒ4oI¡®—ãÏøDõ§¼±ÒV»´ñŒ0jž¸³Ôõ’¾8ø­ÿ&Ãÿoÿ³‚ø“ÿ¨§ìýEyù¼(ª˜*´pô0¿YÊð8š´°ðté{j´Ûœ£)8ó5{]êzyDªû,e:µëb>¯˜b¨S©^ju}•>NHÊIFü·i;l~rÁÈ^ø?«þÜß .¾ ~ÔßþkIûü·µð¯Ä ~ÓZæ¹}¦/ˆ>'4>#´ºø1û9|^ð²iwW“ÝéÖö÷Þ%°ñwz>¡%Ήkc6©ß~CáÙŽ2 ÿ‚ƒþÊ‹‡Ü>þÞÛAócmÄâ±e²ªÆˆ… ´ûè·üµÿ) ø#ÿfðÿS¯5ü¹×÷Ç„ü6ñžpŽ#ûs9êÙT%ì0ðÉW¯[ܦñ6"¿.—ýåj’»w“Z%›eX ùŽ*¥ZSNiKÚÖÛŒzF¤b¶è–þ–ý…Ã_²úªøx?쮸 Âü;ý½H\Ê©ÿ†$O—å p¸P¡UFÕŽAáïÙ|ÿý–Æ0>~Þ¤(Æñ„ãCÆ1Ó¦?¨¯Ð—µ·çÿøÿô?ýoºLóVI–Gl7þV¯ÿËòVý”Eý–‘ÿ‡‚~ËXåcðïöògAºRý‰"fpF|Ä'i(Ñ8·{ml?ehÈÏüö]㜇_·‰*q cö'@T”#hQaC¯âÕ¥Â׿gúÿs‡¿ùÁÿÈ?±2ǾÓ÷Õôóþ-¿§ÓCúÖ>;ü1×¾x'öo¿ÿ‚˜þÌÿ|ã/üEоèŸÿl¿ é—ÿ¼SmŸ©øëÆ×žý„´câ_ŒmthÃ^ñ?Ä}KÅZ߃<"dð‡ƒït/ ÜM£Ÿ"H¿e5Îà ³ $øsûwàŒ§*ß±Sdî*À‚¥B¤1Wñ.ŠÊPéƆ{QJµkÔ*7N3­^r«Z´Ô8z*UkT”ªU¨ï:““”›“l¹e|ùyèÎn1Œ"çˆÄÉÆŠŒ ›«¤a£­"••‘û‰ÿ²zc?·ÿìÄrÀ'ÃoÛ³åË£þÅJK0PHQVAå”±ÞKÿÙ-BøoÿÙ™p…ømûv¸ÛŸøbäàc €¼€Ÿ 𶊧Á‘nÿë½þßÎù¾»ù‘ý‰–Ð;õöÕïÓþžõ²¿ùºãSý’Æ?ã`?³GnÃ_Û·àÆ8ãø ¡.íþÈñ0#öþýš×vŸøVŸ·C°ÚìÃ?ñ…ñÀe', ÆÓykø7E7Á±jψ³ûväáïþ‡ÿà®–ö.[k}[²þ5}•´þ/—Ý¡û鉿d8×öüý›Tü¸ ðÏöè*0ˆ§!c(û§(û«·bùi…ñ_ì‚?æÿgî>þÝŽœøÃQÁÆ;`·(OÀ:*A;®"ÏÿðÿèËü­d%’e‰ÝaßOù}_§ýÄü¿D@qxÃö?B ý¿?g%aЧÃ?Ûœ„0$+~Æ¿3)*ÈCFT¯ÊUŠ#~ÆÃþoãöwéŒÿ±ý¹3Ðß±ÒúuöÀÀOçnŠK‚)­¸‹ˆ6KááÞ›Í?åÐI–ÆÖý5þ5oþXFp|PýŒ¢ÆoÙó²|0ý¸H~ìäþÇk–#i$ޱ.Ò¬`{;ñü[ý‹‘TÛÛö~ãoÊ>~ÛøL*ƒ´§ì{rFqµÇÈ–æöŠOéKWÄ\A~ü¼=Óþíÿ%÷ äycß õwþ5~÷ÿŸŸð~gôùðß^ý—>-|Cð¯‡ß¶÷ìÿâüMñŸ…¾xAÿ…{ûfi_Û^0ñž¹§xsÃz8Õu¿Ù3LÑ´Ñ©kZ…•˜¿Õõ?K²óEÅýí¥¤rOë\ðEÚ‘ã߀ Ž/о!“*GÊÂ~H;YNä ¯ÊUмÇ'ü“þRûÿÙæ~Ëÿú»ü_ë)_Íž8ñWøgšäx ‡4ž.Ži—â1x‰fø<¶½XT£ˆT!2Á`°Œ]ä§ Ëi$”Oo+á<›J¬ªÑ­ ¨¥N½D¬ÕõæsëÒé[¦ˆþf¢ÿ‚2þÓèGüW?‡ü>>b Tðž6ê1€Ê¡QBª¨…-­¯ü³öÿÂuð`äcÄÿpTäøU @0@ù?£ðROø+Gìåÿ¹ÿ…1ÿ ÿÁ<_ÿ Ïþ/ü"_ð§¼9à_g²ÿ„û{þ/øM~$|>û'Úÿá`èßÙÙŸÚÿhû6§öϰy6ŸmûÆ´·Ã ~Ë~,ý°-o/¼iðs¿|CûF¥ï‚“«ê¾(øsáï^üIy|*—z¾™¢j:¦­áË&þÆŠï]Ó´Û‹Ùíâ¹ÕlíšK¸¿ ~8xhËÛå–“´_öe+I¦—YÙÙ¥úhz 8~íªx«¥o÷™i×ù¯T~¯ü»öœÿŠçà?où™üþÇýRÁÇÊqÓ\`mèÁÿyý¥¢UÆ¿—iUñG™@ ¹Îï…£y*3©‡EaŒAö_Ú_ØÃö´øsûsþÍ_ ¿jo„º/¼;ðûâü&?ðèÿtÝ Iñ•Ÿü!>>ñOíWûcOð׉<]¢[ý£[ðŽ¥u§ý‹Ä:‡›¥Oc=ÏÙ.åžÆÛêRñË—»,FXœ[MfÒM;«ÞÓÝ4Sà\‚I~ïnŸí2_”WüùÈOø$í&¡Gü&¿ÄÞ<;1»î‘ðÁ Úü¹#aØc•àÿ´ Ÿ|à‚1â_``©éÿ ÏÐåW@ŒCýQP¼qãÕÿ1gþiu·÷ü—õkLx‡ãµ.ø20rx‹Æ˜_ž&8ÿ‹l ‚’ ‰·j‹qg}à–ÿ´P?á-ø6¸P¯ˆ¦T•;~è@‘„U]‰•ÿ‚iüuÅUð—ëý½ãGÓRONã§;v~àQYÿÄkã«ßëm÷ÿ‘u/þHŸõ‡“OÙâî¿ê*_¬+tìÄDÿ‚k|sS“⯄ǂþÝñwŒg à€¤mJ-¡Ð‡þ Ãñº2 x›á@Ãd×|YÇÍ'À§!N@T‘ íÜYþÕ×ËÞý³ÿf¯~Õ_ÿbo |IþÓý§~ø&Ãâ/Ä_†ð‡xúËþßêv~Ô,uøLõ Z|>Õ¼ûOŠ>—û?Bñ^§ªÅý»åÍcºf°š{ÿˆÕÇRÚ¾\ùUݲÚz%ewïm²»òÔ©p»^ž+ú ’¿—Ã¯çØø ?àÔ|Mð°`u¿m^1Ÿ Æß•xNÝ“ø'wÆ¡ø©þŽ{k~+ã§#^O|mè6•ù<¿Ùz*W|ø¿ñÛÆ6ZޥႿ ¼ñkÅ:w†­¬/]“'ìñysŸ|6Ï8Ƴâl ŒgÁ\œáHÙ„*Æ'·û3ö0ý­>þÜÿ³WÃoÚ›á.‹ãoü>ø£ÿ ü#ú?Ä]7BÒ|egÿO¼SðëUþØÓü5âOh–ÿhÖü#©]iÿbñ¡æéSØÏsöK¹g±¶ú†‡ã?ÆñuòäãxµýKtÕïïouÓÓk$.á媧‹×þ¢eåmySè´ÛÈü¡‡öøµ3¯ü7ƒµu1$.HÏ‚€ÉxU)TòÒò~ÃßÕTo|:\(WVñUàªO„!s…;TàœýP¢¥øËÆÏ_o—_þÅôü¿¿åøúúƒÃ׿³Åôÿ˜©im¾ÏËþ§å¨ýˆ¾+ùü=„jÞ#$rNF<"¹##¸äpTì1[‡ö)ø¥#mü=ùX2Ÿím}ŠáËnÿ‘97œ%A( ˜È·kOÓú(~3q»VxŒºÚiýŸO§ý½å²ÓÈk€ø}˼SÝk‰—[wÉšþÆ¿£Æu¯ (—T×·.# ®ÏÄ6±Œäœp‘áB•Ž#ö:ø˜3ÿÏwþ&šÿpG9ð±ÉÉ<Ž0pWöÿ‚’Ãm~Ñ¿ðP€ð¦?áYÃ|lƒà÷ü%¿ð±á3ÿ…©çxëã_‚¿á"þÁÿ„Ÿðƒíÿ…=ý§ý‘ý³ã ßð‘}ûLd}¯SýB¥/xÚ³­—'h¶¾¡Iî“[M­U–×ÙYZWpöSžßí2ÿ䯸üà_ØûâRòu¯ç'Õ5Ü.UÁ`…r\–RH)´!ØQŒOŒ²WÄd+cÁ)BÔuœ‚Ü·'¿2@Œ)6ÔÛ¥èuŸŒ|k+^¾\íµòú}-ýïëîµ>áùoOíß.–þï—õeoÏåý”þ!ŒÄãÁ}1Æ£­ü¼(Ú¸ðØùN2sŽƒŒ`,ŸðÊ¿¿è1àÎàÄÇZàzÿÅ7ÉÉ<Ž1Á_¿h©^0ñ¢Ú¾]ÿ†úü—ã¿ÎÖK€xymOÿ…2òþï—ùl­ð„?²ÿ¢Æ5­•ÚÃ…ýæàÙˆ³´¶vä›YìÒXèEû4øéAÕ|%À^þªBàF]¾ŒÊUçB(aû~ŠOÅþ3{×ËômÿȾšÞÝ¥Ý_×ådø‡e½,Uú¿¬Ë_ü–Ûê|L¿³wŽûSÂcÒûWãÀÿ‰ãŒt€8x¿g/!êžR::ßꥣáÆå@K+)Ü„m;Y£Åö•Ä_ã4­íòûZÖú…=´þ÷—Îöw²³\ÃËjX¥Óýê_üŽŸ+ Cû?øÆâóRÏðñÆŠ¼sÓ Æ>_/ëJ*?â.ñïí²ý­o¨Sµ´þ÷’úÃÚ~ë­ÿQRò×áò^,|ž¿|Zÿ‰‡†útš–`gEìG08+~‚~(‹no|?…l®//É_Þê4DÜvñÑNäRnlþ¡¢›ñwŒš³¯—ÛM>¡Mmkm//ëK?õ‡¬—³ÅYÔT¿wúécæäø=âUT÷BUFÕ cå U>AÃá‰?Ó4!ô¹¾ùzp¸ÒÇôè1—gÑtT¯øÁËì¿ç€§åýï$%À<<Õ<^÷ÿz—{ÿ/—^Ÿ#çȾø†6 ×z!ÁùHº½ÊœœeÌ6ÈT±£s°iÃðÓ\í8ëȸº,2±Ý2/””9hQa'”–¾áE)xµÆÕ×Àá ?.œÖè½:Xo€xyÞô±Z«iŠšü£ÿÈñðëZòó¥ßû¯öêíÆ1Œ1òì•~ëKô(pF<ë’AfÀtƒÁ»HR¾ÅE%âÏ+Z¶G÷o¶þ÷d¼ûj €xymOÛýæ_üá±åÐø#TB —N`@Iæùx­»þAê¶õPoE*P-¯ØoGá-EUG™`˜ ’ÌUq·þ†€¯áSî®ü‚/C¢“ñ_‹ßü¾Àï÷(z?ü_pë×Ùâü¿Ú§§þKøïç±òïŀ߾$ɢæþÑ¿¾èzêÛøgá.»àoéWz®¬ÖK©ëš¥Þ·ð»Ä¾"Ôu «=+FÓÒÚã\:&m¥Ç.‘¤i×Ú–»y«y?ü1—Äú=ÏÛ ÿ7ïþrµ÷Õàb¸»ÄUÅâò܉­.zÕªe±s©+EsIª©^ÑKD•®’=|?að”iá°ØüÚ 1å¥JÖ£§{E:oKê~G~Ó³µ·ìýû~ÙAão|@¾øaªxûÄÞ&ñö£¡ê^$Ô훑2ØÈ™‚Ãl>WamË”å{É+&ÝÚVJ×oÉ]]ì®®K”SiÊ)¤äÓi5kÉë¢WW{+«îAEIäÍ»o•.ïîùm»ýg“Óÿ[û®Ÿë>O½Å5ÑÐáÑóéSò³#p@<:²FVSÈ ]×Þ QnÊQo²i±ÑC,î#†6‘Î8QœBîcÑTv!W<+¦@ƒhóe˜¾"6@¡¶.ð FK3yRB…T®å,Öt›6µƒt¨‚iNðÁH‘#tŒˆœ²«)VRY9PÜäšè¬¬f¾•cˆqÕÜýÔLà³Þ€ucÀõ¯+‹©*’…(BrÕšV¼›{E=µmÛ[¤xX¼}j•½ŽM(É¥(Y¹½wz(ÆÏ],®äìrÿ؇¤—'þÿ§·‡m”#3]"—Cº/™C¼dÜÿ}}A¯kÒüç(ýÃÎän "Èd( ‹'c3‰á€ààW}¬ü6–ÛIðÝÇØŽóL½¹ùá!rž%׬XõÞM›­W)ù!·l%c x%™Æ1xŠÒæ—/2PŠø\“Š”®ïʾ$¯w¥÷¸CÓæÅJ.Ú$Ôšw†’ºVÓš÷²Ñjùš>SþÁ³ÿž—?÷Ü_üf³ïtW‹çµ;â ™<ÙcWR7–ṟF"U ’[p$œmË­xNKBÆde߈I,$ÚçpGc¹\<©lc%XóÄIÄÅJ²œz©î¬:«Œ§ ¬  tSÅÖþ-:®´ñš³Šv·›Søÿóÿ‚ÅÿÁ6<[}©ÞÞþÆ¿³?íO­| Ôµ›½OQ¾ñ'ì…ñËàÇÅ_|”jÚ¥Þ£6¥/ÃíI|cð¢î%ÔfþÇ´ð~‡§‹]>ÐØÛ+þ Ãÿ)ÿƒ|?ìõï¿õz~Å5é?ðp?u?ƒ õÏÛÓÀ,z’~Íÿ´ì'ûCAk ”þ"øûWø+Yð‡ÃVòþQÄÑ|*ý¡µëvvQÎÅì|Wâ. Y€Ê‘Öxiï)5æY8ÿàJñ]/$ÞÇ»³o³×ѨßîßäyGüÓöÙðïüßþ ¶øûOkޛƗÞãN‡àßÁ{š|Uã¯þ×_4 é—z„»Žmwvúψ®í⺿¶ðæ•«M¦Øßê)ke?¥þÓÿ௟ðOïÙðÁ@¾9þÓß>4x/BÕþ Þ|týŒtÙ›OðG†~øsÇ~-ð§‚0Gÿuý—þ7Å5Ö?bÛ›ö¸ø³û;øm!XußÜx>ðxÎÖÛJûF©ý—cg‰«Á@~>XÁa4ÿ„ ©Eÿ |Caû_ÀÚw•í«ªü“ö˜²ñ,óèßðž5·ü"WZ—ÐÛÄðèMâî®`ðÔ÷‰§sàÿðS ¿…³§À?ø#ßüSö}ð^©kðKö.ø‘ðGFÒ,u(üT5þÄÿ¾èÞÕ-5]/ÄÚ£xÆ÷Ä^ÑþxkJ_I®ø·Jñ6®“jöÚ‚ÍâT¹n³û%xß]ÿ‚!k4ÿ iúí{«xûSÿ‚ÄY¿ü ·7Zå—íyñ ÚZ <>ó[x’óÆÿ ~Çz.âñܱGd¶ò¯†*ahɤ”—±Õ$ã>i.wkYÆ*MßY=]ê½%§U¥ÒòzÚÞ‡Úþý¥?h¿ˆÿð[?‰ß³/„~ ²þÉÿ³·ì…àÿü[ð-§‡~\¿þ#k?oðd:¯ŠntŸ‰vZŸ€õû=z×FÓ|Ea£}›ÃPÝ]X¬z™m_ö"¿ÿà‰ºå—í)®þß¿ðQôð­Ç‡`ý±¿i«? ü<¹½¿šò}sà§ìãà'áß‚5¸í&I¢ië×Þ4[í.æÒ×S¶¼°þϼ}JÃJÑu+Þ Æ¢JJ)$ãÆ[|I.{Ûv¤Ú¾»-J]ûëòéøkê'?ðI/Úþ ÿ>ýþ)xÆ?Û{áWÁ­_¼Eà½'㎫û2|9ø™ñOVºÓ| ð£ÄëðþÇáþ•gð»àçƒ|£G®M{qãgÃß¼k⛯jÚ]¾›á oh·þ úóöpÿ‚”~Ñ¿àœ?ðS=wâeσüûrÿÁ<¼7û[ü=ñ¯ˆ¼¢ÚOàù~"ü øyã½_À_4/ x²ßV³{vñ†/m.ô­FmWÕ<+u'‡ìôPøzÃó£þ ™ýµ?dOÙ¿öøÙá/ß´ÇÀïƒ^,µW|uoá_‰_ü'àïêž¼ø7ð+I³Öô/kš¥ž±âk­SÚæm‡e¨\Ï{¦][ELö,ø]«ëðOø8göôºÐ|UáÏ ~ß:Oí·ñàý·‰¬SH!ø9 xöŠñ_„üo§hÓÅý¯c¹«|^ñF’òêWOì~¶ŸN·[Lj:·L๪§Æ1©MBÐI6ä®®’m8ÝÙ¶••’%=cg}õ¿nžºçÿÍý¢à¹?·—Àߨûã3x»örðGÀ3âñ¹øëñwDZè?ð»?j¯†~øóªCñ Oð€¼ð‡SøoðÇMÓ<¦ët«k;Á^,Ö¼CákϧŒt¨µ« ^ | ûEþß_ðT¿‰ß´ØýŠ?i~¿³WìÅñ§Sø £|E¾ø àïÚ;âÏÇˆÞ ³¹“ÆÚ…ÖãÍnÏÁ> øq$zφïü;ýŸky⛋w±¹»½®5]ÛØ?àÝùC—ì{ÿwÿ­Kñº¾ ÿ‚-|Oøÿ´µý¶?àŸ¿µßů~Î^7øûWx³â·Ã‹ÿ¾1ð·Ã­7â·Á_x3Á>ð7Ž<âÏ_èžñYÕ,> FþÏDxïlgÕc´¸ÓíÓt¹•¹«òÂÔäÔ" Ÿ»ÎÔ¤âî›Z-SQæÑ++5´nÞ«ñ²²ºùù·×{þþÇ?¶í)ûBx›öóÿ‚~|iñG‚>~ÜŸ²Ö™q¡øö‡øaà»m{áÞµ¡üVð­õßÁÿúGÂk‘Kâ¾¥á¯x·áÞ»©ÉáZk½'M]I`¿Õmtï›ÿà¿¶‡ícñ'ãoü£á?í¥ûGGñßCý„~*xwáç†|y/Â…¿ "Jð¯‹iŸ øïÅÒè_ <7¤#ñ=ŸÂ­Y}#ZÖ|QÿúÚ=7S“Í¿º¿ç¿à˜³ý§ÿ௿ðS/ø)¿ÃäÖuÙëÄþðOìÇð_âÙE—ƒþ,Ýx[AøC¡üG×ü$÷p›ísJÐuo€úØ3ÿÁS¿à¥ÿï?mßÙ›öøOû!ü¾ñ7ÄëÙ×öq×ÿg]ã>¿ñŸÂ¾Õï¼oñãâv½â½>÷ÀÚÆ­ã? ø‚ÎÞËá-›ÙióÈ—z‡ˆÖÞy4< ÿÍÑ/ÿàšŸüƒÄ~ Ðõ_‹>¾|Kð¿Ã×ÍeáÛ¯Ú%µ #F²´ãSÔµ]Áú…ž¿£|K¹Òîµ+ïiþ¼6¶×:– lî®ÿÿàš±Çüþãàߟø)¿„~|ý»þøçâ‚~=xwö…ý¦~(þϺ֫$~-Õ5¯kÒbø×à¯kº7ü šÏ‡4[;ÿÙºj§F—Zd¿·Ôí5ígéÛïö4ýŒ~5ÿÁ¾8øWþ áMCÄß goÛOøí¯i_¼Añâ.“ñâ…þhžø©¬x;Ä_µÿk1ðÿ‡>|AÒïî&ð>«6‡q¬øV³Ðâ½Ôíõˆõ q¥Î ã.UR*2öqŒyj΢“sS\­JV}SI´vºÞÛ^îútkKuKÓ±úçð;á§ü‚ÊóágÆŠµÏìÛã»øŸá©ñ{öL“ökƒÂ~øQðÛ[×ôø¥eð“ã~ƒãXüu¯øïÞ ¾Öõ(|CÓµýÿÅd60Êúl¨.¿¾~ηƭÿýý¸>øcþ Iÿí;áÙ{ÂzïÄ_ÚãþóàÆ¿ÿ GÁ·ýf±ð/ü(MC\‹á÷‚³í;|D—ÄôŸ…Ÿ ¿hÙ'×>ðNŽ4Ÿ†Z€Ót¿ˆÂËÄ~ð®¬k±iÞ3ñŽ—á#Çúέ¯“á››Íí ªêW¯žñ/‡Í_ÓoÖÿ#è¯Ø·þ ñóâÿü›ö€øcñ'RŠÙCâûüjÓÿa¨Žàk6µÔÿbïhß¾=˜µ=F±ñn¿Ä?êWÞ>Ñÿá)×|E6›£i‚+ mÕç±ÎìÿmŸÚ÷Åž2ÿ‚þüCðÇŦà_ì=ðâƒÿe»Koü$½Ó¼û@ü2øâß|A¿:‘ðç‰|Y©x7Ç~±¼¾Ñ¾ j!ðÚËâ94‰ô™¡³}7Nƒö§ý—´ïø'·ìÿàøÕà½;N“Ä_ðJŸˆ? øKVð.•«êéyðÏ\6ž1ñwˆ´ŸFðj>> Õ¼:–:ü7÷_~Í¿·ì?°ÏüûØx+Æ>ð·í)ûFjŸ´'ÁïÙÖoëÚ7‡¬|9â köªø·¤øŸâþ±ªx‚ Ið¯ÁÝ3Ä>#ÕµÏ@|5e®^øVÃ_– a¤´¿ðK-Cþ ÷û7|øWû"|ý°¿e5èµ?üF¸øyñçág~$ürøÏ¡ÉâOŠ^?“CÑ­ûtüVÿ‚½€ÿÿoËOÚëÇÞ½øañàAñOÆ—ÞÑôß\øWÁ?³gÀ·‰<[ãmGâ±ã øÂßü#¯ëú¦›ká i¶Oo“g>gügþUÍÿ‚³Ý÷ÿë |+¦é¥¤“p©I)(F)©Þé5¬ãç-Z³ÒìiÝߺ}[í÷=vGÙ¿ðLßÚ'þ “ûy| ý¾37‹¿g/| Ó>/ŸŽ¿|{ƒÿ ³öªøgáo:¤?´ÿx À_u?†ÿ tÝ3Ázn±ðgJ¶¸Ó¼âÍkÄ>¼ñšxÇJ‹Z°Õàúá_í'ÿÿ‚œüoý£õoØëöŠøoû~˲—Çk¯Ú6·¯üðçí ãÚ3Ç^Oµøé|Miâ/øzÓÁ_ õ¯´9´»êO‹Î‹¬Y¼Z¥¾­ ¶~ÃÿìÊ¿cßû¸ýj_ÕùÝÿ;øåû5ÿÁ5|'ûx~ÂÿµOÇ_‡?¾"üý²ü}ã 3Oøáã?ü?¿ñŸÃ?|=øsáïx£Ã7ºýΤøÊã^Ñþ¦¾šg„Íî«ý®èš‡öT6zî‘ö…+sWå„9©Ï– A?uÎIÉÅÝ6¬–©¥}ÐK·ªï×K+ýþoÌÑÿƒy`ñ·íÉÿß¶ø¨øsWø‡oûWxFjÞÒõÂZ§Œâø½ûeÇâGÂÚ.¯©ëZ¶‘áËÝqo®tM/SÖ5mGOÓ%µ´½Ôïîb–ê_꺿•/ø7ŸÅúOÄÛ—þ ÁãÝ-b Æÿµ„¼_¢ÃâXð¶¿“â_‹ÿ¶^³¦Å®xcÄVZoˆ<9¬Gg{ jz»§XkEèŸOÔì­omç‚?ê¶²Ä]=ÚzvýÜB ùþl(¢ŠÄ ¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(âø)ü˜Ïí%ÿdýÿôõ¤QGüþLgö’ÿ²~ÿúzÒ(¯Sü)×Çÿ¤ÀÊ{¯OÕŸÈOüµÿ) ø#ÿfðÿS¯5ü¹×õÿmÊH>ÿÙ…üÿÔëãM.uþ x7ÿ&¿‚ÿìOý?\øœÇý÷þ5ÿ¤Ä(¢µ¬´™®¶HçÊ€à±!–FS“ˆÕ+nP¤I“YS#¬‘¯é5*B”y§%çÕöIjß¡æÕ­N„êÉF+¾­¾É-[ô(ÛÛIs"G²¡}ÁY“i Fc¼Çƒ°`eÙúK}ŽA;™$bÁ]8ùQµ\:—u9feo-ˆòŠº [e#T%€F$—j %(»U¤(ªœprB…SëÈ­Ž«Q¥Nôã¥ÒÕ·{ïdùzZÞö¼Ú>UóøœÎµWjMÒ†¤ÓriÝûÜ©òl¬×½«’´¹#‚[ä2y[X–cÚÆ‘±1ÆŒC¤jªûT¸b ‰J©*H©Ü¤€J¶Ò¹Rz¬Ë‘ÎÖ#¡5&ÆöçÛ5~ÃL¸½ºµ·ŽÜ\\C 1ÆÄâW‰Nk*²£e:±žwJµœ¥$•Ûœ”l’í&žÊÖ^K±ç¯iQ¤œ¤öWmÚêÖ¿Ee¯K.ÈͪíknÒC)Œ,±2Œ¢Ž~ì¨d #Y—nÑ{Iãɨw‰Ð}â¼–0+þð#¨ÅD"vÎÕ-µKpRxàäà柱¯Te­Óp’{«4ÜÝ;4÷NÝA{H;.xJIè¹¢ÜZiífÓ\Éôj븑¡‘Ò1€]‚‚s€I€N2}+Ø| $†Ý‚4*F7†–L…ew,(™+’ §yǘiok Â5Õ”·€:|©vmBåÔ½mç*Cí˜2áˆòÙŠ•úëá¶©àøî [Ÿê7 dpò´,PT‘@Œ;A?8I .áÇή’¥QóÞR³§ÜäŠS© hä¥'7yz™u(»ÏG7%ýí"ÜU•ÒNNZ^-Ú\¾òW¿Ðÿ ~E­Z$pD[P™„ “%ìHi-•#Ëß$BCö=ÂK¸Ñž %O)½óÄ_MÆàÈmôó,Ï¢jVäš=»¹ðÖmg£½ÌÓéww‹Yka©B5Ýh]C¶žb».¢¼ºxÖÞÐê%á˜ÛÜù*‰ù–cšâhâ©CØÔwŸ´æ”—Ã(ÔŽŽ¬¢›n? ¥(Éi ½Np“rQ´n•åîûê)¤¢ÓI«]ê¥m9}çøwñ7áô:d³¥´~z¡e7E(æ“hWhCÆf 6Í:¤¥ rmŽ7hÓä_hIÎÇQ*À°!fŒyVv@wóœ“úÓñJ‰'σïe@§”ñ¤‰ðeRÑIÿìžjL‘yQ’å(Ãt…™¾ñ>™ ÞK ´ðÅå³ï™£-âoµ*¹ ’Û´‹_¼à† d œvÈÿa–fc)Bqi%z’¡ËÉ$½Ù¥UÇá³—Ù»\¶Òä¯J3Œ£+8ü3‹OtÕ¾½ä¹ß2Wå’½®þ@}Û9`”¸.»v0ËF#(= lŠFU\³m!C¨Q½+êßxã[ñ•‚ÛJËq¦ø‚sí`ËÃæ¤Ì’­¹ɲ¢?1@Ë*î¼þ粤gͶˆ£^ÜÆX° dU^9e;Ã]àà{ˆœÜ]'¡NV§VïßsW´”¹“ä|©YhÕÞëË–YãU«·neºY9JTí«ø¹lÓVZ^^ñ£©I]GPÊpAVÈà€zŠÈÔ4Èç&h¢ÌœoHŠDÎw3 ØŒ´…ÊÊòÀ‘ 14>©¨ø_c7—›w9"9h˜îlíaó*ÿ ²‡\!Ú9\¶ÒÅ#ÆÈÁÑŠ:œ|¬2Ì>R8áÃd`A=Ô¤Ô°rWeIFJ¢N×¼ÅÒMÁ½RNÚ²XŒ Ô¹¬“ѧ.I^Ú5xµÌ’íÌ—ºÚGÐ?ðN˜eƒþ ûG4mÛ3ö_á†2Ç.å=IRU°pH¯õ¯ò¡ÿ‚{Ú=Ïüög€Æml¿ÙŽUw’%.©ñ«ÁeŒf1pÅITc‹rÿ!.¥Hê½_Æ_Kjóþ•jR¥'’ã½ÙuÿnŽ©^éj´’M;­l~•˜¥ŠÂb$ÔTãZ1šŒ”£wÓM7ºµÓÕ;«¶™åÞ<øð[⟈þøÇâÂ…ßü]ð“[oü)ñO<á?øá—ˆÚÿDÕÄuÏé:ާà½mµ? xsQmWÃwZmù¿ðþ‰vg7U„u¾0ðo„>!x_]ð?ü+á¿x/ÅmÎâoxÃCÓ'ÓõMP}7V±²Õ,îÊf³ÔlíomÌw6ðÊoövŸýŸý“ö?쯱ÿgf}šìÿìÿ#ìßaûϳ}ìßèÿfòü#÷[<¿–®QKúþ¾ä ðãá‡Ã_ƒžÒþ|"øyào…~ÐÞþMÀß<% xÁú<š®£u«ê’i~ðÆŸ¥èº{êZµõî©~Ö–Pµæ£yu{pd¹¸šWîh¢÷ùÈÿ‚Á/3|=ðçÄÝ;à§Ç4ÑtÛ¿„ÿü1¢xÓÃúž‰©|CÐü=¬.³áXÛ¼ŽŸâ+1g%ÃAõœ÷_Ю¹á ø›Âz¿€¼IáøƒÀ¾ ðî¡á Áz扦êÞ×<'«i³hº§…õ_Û\hú—‡u-â}'PÑ/lçÓo4Ù¦±¹¶’ÖG‰º**ç9T““Ý»Ù^ɾɷo¼±Äü:øiðçàÿƒt‡_ |àŸ…ß¼;ý¡ÿÿ~xWBðOƒt/ímVû]Õ±ü1á« 3DÓ?´õ½ORÖ5±XÁöÝWP¾Ô.|Û»¹æ“•ø¹û<üøÿc¦é>üøÙ¦h×k¤iß>ø/âEŽ•|Ý[­î›iã-Y·±»[{ëØæÖ8¦Xo.¢âU`¢¦î÷»¿{ë®úògíEãÿÚàÂ_^þÇ_±þ›ûTø¸x»MðÔßtߌß¿fý/Â~¸Ð|K¨^xÖÛÄ~8Ó.|9{o¤ëºo‡´øDtÛkmN÷þ†Õ-çŠ×F¾ñ7üOöø¯û%Ý~Ø¿ÿh§ðm§íûsþÐZïÆÏˆø­j^"ð¯€tI6Ýh÷¿þüø¹yáëÛ}K@»øŸðÃÁ>>ºÐõ@âÖÿG¸ñ^‡«K¦^Û [ÝY<ÂÄr.ãŸTÒ´+BÓ­4}LÓôm'O…mì4½*ÊÛNÓ¬­Ô’°ZYZG µ´*I+1"I 2kBŠ›»ZîËe}ÈgŽøWövýŸ¼ ão|KðGÀ¿ƒž øâǵ“Å?<+ðËÁ^ñ·‰d²í¬¤ñŠôÏ]Ö^ÒÚY-í[Q¿¹kx$x¢)²™>.~ÏŸÿh ;LÑþ<|øAñ³IÑ/N¥£i>ø3âF¤j& íMþ™eã-Y¶°½6×W6æêÖ(§ò.'‡Ìòæ‘[ר¢î÷»¿{»ýàSÓ´í?HÓìt&ÆÏKÒ´»;m;LÓ4ëh,´ý;O²-¬ìllí’+kK;Kh£·¶¶·Ž8 ‚4Š$HÑTqž>øQð·â´~‹âÃ_|I‹Àþ-Ò|}฼}àïøÆ?xïA[…Ðükátñ¨®âÝnî—Iñ’-59nnä"iwôRžñg„|)ãï ëÞ ñ׆<=ãOø«J½Ð¼Oá/hºoˆü3â=Ríµ^Ðu‹kÍ+XÒ¯í¤’Þ÷OÔ-.-. wŠxd™N< >ÅðÜü‹áç£øB|'Óðª? h ðÜü=›FoKà3àeÓdžƒ%ðó¾ƒ'…Ηý†ú3¶–Ö&ÅŒ¹¢‹¾þ>à|½®þÃÿ±gŠ<à_‡^%ýeï|>ø]ÿ ?ü+?ë¿>jÞ øuÿ ¶«»ã?øA|1¨xJãDðü%Úݼljÿá±Óÿ·õX!Ô5_µÝÄ“)ðëöý‹>øËGø‹ð—öAý—¾|Aðïö‡ü#þ:øuðáG‚|e¡kiWÚ«ýâ xKLÖôÏí=SÔ´}CìWÐ}·JÔ/´ûŸ6Òîxdú†Š|Òµ¹¥g{«»;ï÷õ .Ëúÿ†_qå‡àgÁ3ñ=~7ƒß Æ…Ñ¿á_‹§á÷„Äõð÷žn¿°—ÇÇHÿ„¬hßif¸þË·Ø|ö3ya-Xþ ýš¿g/†ß|[ð{á×À‚~øGãïíïøN¾x+áW|-ðçÆ¿ð”èVžñ?ü%¾д øþ? ØXøw^þØÓ/?¶4+;M#PûFŸo º{]]÷}:¾›}Ý;Äü:øiðçàÿƒt‡_ |àŸ…ß¼;ý¡ÿÿ~xWBðOƒt/ímVû]Õ±ü1á« 3DÓ?´õ½ORÖ5±XÁöÝWP¾Ô.|Û»¹æ“ Å_> øëÆþø™ãoƒß !kžÒtíOÆšÚê~%ñ¢º¯‰.µ+ñâ nìN.5[ù'õ(¤Û{»ú€QEQEQEQEQEQEQEQEQEQEQEñüþLgö’ÿ²~ÿúzÒ(£þ Gÿ&3ûIÙ?ý=iW©þ¿ëãÿÒ`e=×§êÏä'þÚÿ”|ÿ³ ø ÿ©×Æšþ\ëúŒÿƒ¶¿å$ìÂþÿêuñ¦¿—TF‘‚ ÜÍ«  Ú¹#s60¨2ÎÄ"fÿ¨ éá_þ„ðÿÓõω̚XÜKnÉNí½’åŽ¬¿¦Z »®…¢AºO•Š`ð™e‰·; —mÊ £Û*ª¨UU@UU*¨ÀpàU´´ŽÖ4UEªQKÿ6L˜oºÒáZ@3±Å½Òˆ¸N?ȯ®ÄÖxŠ©Bî+Ý„{»êív¯'ײK¡ðøìWÖjÞ.Jœ,"ößYY6¯.ý¬º\URÞÃÖºK I‡™s¾Þ28Lm™ˆb§rºüƒ H%Nw+FsoDÒxK«„WÜ ÛÄÃpÃ`‰˜—$d `@Ìá‚êš>%Ë©dÝ'ÞÚÙ  ãÍùIËœ¿åó9k⣆¼(òº‰~ò³³å{8S¾‰'î¹Y¹;¤•·ÂகJ©Yé4Û»³Z&¯;kÊôŠk¦Ò\•†Š©·ì¶HܾqL¾q– 3ò3€J—Uäm^@¯Iø}áiõ?x'M-¿Ú>.ð݈Œþ׬ÙÛìæ&Îï3oNý z&àf˜FL . “…_-Pâ0?*ÒÆÇ• +¨gŸ†fóã‡ÁKnþ,ü8µUeGP—/Ñb è^3´oÁŒÇ>_E_ÆæQ…*óœÜæ©Tšr’Mòž¼Í®­9'ºåG¯NŒS‚Q„i$ï7«I.X¸Å-ÔTbìôoªüê}àUãlcå K{X×Ï$t8ÉÀ¬K­"peµXä $K°¶TóG(Q´á·¢°\€Ãö•çÃÆxð SVB–9]¿*´ìà7<(ÛÃØÊùž·à™m<°˜ÙY˜þ¯z”rX°QÌX,ܨJÚŽ>•£9FZ&”“kkß–×½öNMßá{%ìö”T]Ÿ2änºÑJ*NQ²»¶‘“æét˜“JŽ+´”ÈÅ™°ÆJùŠIQ• ¾b¨Ü]Õ”WqáÝLéwˆÀ€¥åÁùÆç’3ƒ–Î×Û)$!Ö«¡<.â(ØLœ˜¹a"Ñ7Á8bI9O•—esK™È{“´ÿzMWÆ(Ú­îòÞ”Ó^m.‰¤Þ–VØÍÍFJöå¼›J* É»Ên+ÝUqotä“|×wû§À_¾ÁjmãM†àÄìVXB>Ï*ånòØÁ¹KHåãègâ«aø@Ũ42"ý–S,¨Ûáño‰\L­ö™€Œ¨É[•cÊ_Ê/^¸³wŽ9ÙÞ¡ÑKFÑ‚dT Z22‰6FÄf9#"6FdÓ|K6¥§é0¬“†³°¸„3²6äþØ¿ºù‘IXŸ}ÑHhÀvcæ²WŸˆá\\å ²§ QŒùíUS”“•9{ö圢ši¦Ó»i¸ÚWZÇOU=V®Gªv\×ä•ïͶ¢âÒ“v·Ò"ññ<“Í)‰î'm÷SªÅ™fò‚%Ä‘ÄÞRÌì]åØª$‘Va¶G’³4χWz¤ª­jd*3®…VÃ)Üp¢ó)ic8/(žӎ¨Öˆ4Ó4AØ…É_**b0 ¹b¿ `çå@?S~ü*ѵÈlô_$ºt ÀišñŒË쬿&¢ <¯¡ÝHäßI-¥»Ë{n·6òMm7›˜Ð¥“ÑS©_XCž¤hÓwŒ´\,ï;(¿ÝÆŸ3KÜ»N2tç*’ä§{7Íï$Új>öª-¥¢ÕYh›µ®¾iýžgÉõ/‰š$mj‡>)»Ä¬_ÊX~xúu.¡¤xHŒªäI7¼§€k_.-b¶FT0Bͳ$âPªŒ‘†L »MáY€ |¿éGöyýœoô_ŠºUž­£››O |LGlcÔ¾øö'³»‡tSÚÝÙLis²ZMŠá“ÍŠAó·‰?f‰î-u–Ò; 'H´KgV¾–ÚÂÙm¼¸•Ld‹ËûââÓKÓm‹Ý]ÝË£ºš‘Áñn] ×(ÎSÀ¸J§5hNRÄc¹­¥í¤¡kÊn\°JHì–»¤½æåÍ6×½ªä¦úÆ÷Ž·r÷nÓ‹nLþh|]ðñl¬±MÀ´†"’¡3™:î%Œ…™J8LΉ:§Ìþ*ðÔ–óÈcLÜ+ƒDÔ`F~r]B¼I Û#gUØSî,_¶>XÛI;éÖ"ÞÒ4IJ¤_k¹Œyf[‹Æƒ\I²K‚‘‡‚ÙNÛi]#„׿Ĉ ñDˆdó-™™Xùg;ßäÙeE˜F—ÜɶpönªB•J*4×»SŒya 4œc¦ôçgk¦´jQg‰‰ ¤¥ ÝïnÿâWÕ5½íê¬ì'üÕqû~þÞ‡öÁý™ñÿ‡§ÁUþ¨µþZ°m¹ƒþ ûðvËûa~Ì÷IRH—ãO‚‹Ÿ—¢‰|ÅP@mª ÈÃõ/¯ã¿¦*úËÁ“‚´*ä8Ú‘[ò©c£xé§»+«tVGÕp4\0¹„^ñÅA}Ô÷ùîQEŸrQEQEQEQ^;ñ·ão†~xgDñGŠ4OøŽ/ø×Ã_´=á÷†®|aâ½_Å~0¹–ÃÃZN“á« SUÖ/uU Ò,,4ˆ/µ+­JúÊÞÞÊQ+¼N1rj1WoD—P=ŠŠù'þ¿Rÿ£;ÿ‚ƒâüiÿåðÕú—ýßüÿ¿ãOÿ(+_«ÖÿŸrü?Ì\Ñøϳ>¶¢¾Iÿ†¯Ô¿èÎÿà ßø…ÿùAGü5~¥ÿFwÿÿÄ/øÓÿÊ >¯[þ}Ëðÿ0æuýÃþ}™õµòOü5~¥ÿFwÿÿÄ/øÓÿÊ ?á«õ/ú3¿ø(7þ!ÆŸþPQõzßóî_‡ù‡4{¯ëþóìÏ­¨¯’á«õ/ú3¿ø(7þ!ÆŸþPQÿ _©ÑÿÁA¿ñ þ4ÿò‚«ÖÿŸrü?Ì9£Ý_ðÿŸf}mE|“ÿ _©ÑÿÁA¿ñ þ4ÿò‚øjýKþŒïþ ÿˆ_ñ§ÿ”}^·üû—áþaÍëúÿ‡üû3ëj+äŸøjýKþŒïþ ÿˆ_ñ§ÿ”ÃWê_ôgðPoüBÿ?ü £êõ¿çÜ¿óh÷_×ü?çÙŸ[Q_$ÿÃWê_ôgðPoüBÿ?ü £þ¿Rÿ£;ÿ‚ƒâüiÿåW­ÿ>åø˜sGºþ¿áÿ>ÌúÚŠù'þ¿Rÿ£;ÿ‚ƒâüiÿåðÕú—ýßüÿ¿ãOÿ((ú½où÷/ÃüÚ=×õÿùögÖÔWÉ?ðÕú—ýßüÿ¿ãOÿ((ÿ†¯Ô¿èÎÿà ßø…ÿùAGÕëϹ~æÑøϳ>¶¢¾Iÿ†¯Ô¿èÎÿà ßø…ÿùAGü5~¥ÿFwÿÿÄ/øÓÿÊ >¯[þ}Ëðÿ0æuýÃþ}™õµòOü5~¥ÿFwÿÿÄ/øÓÿÊ ?á«õ/ú3¿ø(7þ!ÆŸþPQõzßóî_‡ù‡4{¯ëþóìÏ­¨¯’á«õ/ú3¿ø(7þ!ÆŸþPQÿ _©ÑÿÁA¿ñ þ4ÿò‚«ÖÿŸrü?Ì9£Ý_ðÿŸf}mE|“ÿ _©ÑÿÁA¿ñ þ4ÿò‚øjýKþŒïþ ÿˆ_ñ§ÿ”}^·üû—áþaÍëúÿ‡üû3ëj+äŸøjýKþŒïþ ÿˆ_ñ§ÿ”ÃWê_ôgðPoüBÿ?ü £êõ¿çÜ¿óh÷_×ü?çÙŸ[Q_$ÿÃWê_ôgðPoüBÿ?ü £þ¿Rÿ£;ÿ‚ƒâüiÿåW­ÿ>åø˜sGºþ¿áÿ>ÌúÚŠù'þ¿Rÿ£;ÿ‚ƒâüiÿåðÕú—ýßüÿ¿ãOÿ((ú½où÷/ÃüÚ=×õÿùögÖÔWÉ?ðÕú—ýßüÿ¿ãOÿ((ÿ†¯Ô¿èÎÿà ßø…ÿùAGÕëϹ~æÑøϳ>¶¢¾Iÿ†¯Ô¿èÎÿà ßø…ÿùAGü5~¥ÿFwÿÿÄ/øÓÿÊ >¯[þ}Ëðÿ0æuýÃþ}™õµòOü5~¥ÿFwÿÿÄ/øÓÿÊ ?á«õ/ú3¿ø(7þ!ÆŸþPQõzßóî_‡ù‡4{¯ëþóìÏ­¨¯’á«õ/ú3¿ø(7þ!ÆŸþPQÿ _©ÑÿÁA¿ñ þ4ÿò‚«ÖÿŸrü?Ì9£Ý_ðÿŸf}mE|“ÿ _©ÑÿÁA¿ñ þ4ÿò‚®é¿µ«ªj6l²7íßa&£{kc÷ˆ?dωþÐlžîxíÒï[ñ7‰,4¯øwH¶iÚ–»¯êšn‹¤Y¤Ú†«gco=ÄgÕë-éËðÿ0æ]ÿ­?Ïú³8¯ø)ü˜Ïí%ÿdýÿôõ¤QWÿà§túGì[ûRi7-Üé~¿Ó®vç²ñ›m+BÒ$R4M$LcgŽ7(AdF%A]Ø%jROuRKÿ%œ÷^Ÿ«?¯ø;kþRAðGþÌ/à/þ§_kù†Ò!ÞÄKå0®Æf`ªÄû©#P¯°‘£`Y|¦óv‘ý<ÿÁÛ_ò’‚?öaõ:øÓ_ÌÆƒi2à *’ 3mÝ»±óJ‘²*(ȳI³ý8ð–|žpƒêòXEmö±£Õ5³~mmgf~}ŸÔösÇI;6ÔÛÎ1TÖÍ»nÒ²ÖÇGZz]¡»ºŠ2¹Lù’õÉB T†Î#‚êr:Öeuþˆs)°D­Îà>fqé†"3Ôœ¯lsö0—³§Z²ø©Á(>Ó¨ù½Rm¯Nö>/MT«µx«Ê^‹[?&í×]EÐìyC¬d„*±*åApr1Œ.Ô ¹*-ò_MxÃL²@þOœœ™„Šª²)`\9(ãi€˹–=›]¤1ãž ÓÃÍFB‘гo^À#oË •q üÀmü:Ð’V²EU™£!Š2€ìéqÈÈÊÄÛ›9dUƒíÂü®a]¨¨'nmdõÓÝærzßJ{Z͵$·¼~žÞÚ´ý”of·JR³¿Å6õ³²I;¥gêþøC-Ö‘µ¦Äóh¥â†ð.é.4›¹ˆ²Ôc‰|àÒ óiób+{˜ù“%ÛO ý‘û0|%Qñßà„ÆÌÉ|]øa4Ï€«èŽïå"¢ä@Nç7qâ0«æ(rlüÒdÒ&¶¹¶¶ŽîÞHÖîÂã&ÓS°|K%¥Ü(°‡ŠVD•æ£x.ã{¸¦†æÞÖhÿGþ |-Ó-~(ü%ñ.„²Ühkñ?À2Ii4†kßÜér M£…Vxeuu±ÔH[}I#rL7bêÚ/̳\öPŽ.Œç:te‡ÄJ2¥hÊW§?g ³I>wîÙ^)ÓºŠMYöÑ¢ä”Ó²S³|®R“N’}r÷­Ë¢m¹Žú×ÁÄÙ¹íž0±rïfß"¬Í+¨Ø¼ËçÄŠPaw¯Ïàž6øNltöÕnÒDÓϘ–I"»M{s¨“ÇnÂ$o²Ùasr곑o‰e™C~ÚMð¯M¶Ò%ñ&¿ðè0¼°YéðÊ±ßø«P…WÓté%!­--³jºÛ[¼:\l#….µ+›Y>"ø¿¥I©Ý\ÞO ½ºKkK"ú~›f¬âÓO±´>sAk¼±Ùžm×W7SOutÒ?Ôdùµ MHÆ”=¢¦µ«VN¥ÛV䄪J«æisJQj0—¹ohåóÖ¥*iO™»´®—,“_Ï¢wÓÝß™kÍdÓü`ñg‡ͤÚ‘)%C#f >``*…u  oEI„Qü÷­Y›+×B÷…äfaò™G,#;S)´£( ¶×V' +ïOˆú QM{o°íùä;Kù8V½÷)+ @ýì(ÄoÇ>.·C¸(›‚ FeDrH!£‘’s´d ˆGìYf%UŒ94§VÐV²N7RµÒÒñ”vWQNÊö<º‹«z­ûëß~éüÙâpÇ¥Û mØD嬮¯c1¤–D€¼öË£Ì1ÊÍåÚ33J€×Ñ t_jwSâ…ž®…Ö_xÓV‘Uâ*òǧ‘° |À:2*X©Eù³_ÝÚ4m°Kn»Â8Rì¦h‹HŠCÜÈbWq†Bñ©!]G}á‹Øb¸±›{Kˆâ2îå’D’ñÆò3KMÌ‘-æ«Å}cFU°´ªªµ£*´Ü9à¨>WȯÏB¢w—?"“vвÑYpaä£V¥+E(Jö|×jú5ïÛEnf£«wÝÝþÇ|øgð6g°óißA)Æ!‚ÿeóD±š *¬ÐÉ8!@R£n?µ_~|Å€‡öŠÐod,ü!ø¹Cª­Æ&GgÌAhÝ@\mwOæ¯áˆ“L¹µ-9/m1+0cR3Ê«0,±΋ƒƘ-ŸÕOügöRñ7í9¯[ø³ZŽÿIøCák˜æÕ5™EÂIâ›Û ã#BѦuŽ9-’R©«ÞÁ,¢/1¬ì\\ý®ïMþpñ2¤r\¯™c³¼m4iÇ•8ew­RW„(R‚Êã:•äÓP„$ô|ó”a’‡Óå©×ÄB:”îÿzùcî¦äÝY(Á+Ý¥­ùlî‘ûû)~̺O‰ÙÃá 8ÙYèZ‡u¸n#°ŠÖ8--t j—¶¶6v°›xKŸ±Ç †ÜG$êHU`]Óÿ8Ÿ¿jÛŠðË¥x¢wд›xäƒÁWà­Ãx`Í/ïmu%‘ït½N8a­Öf¹ÓÜ,ö6­ciòÿ*ð¦#<Ï3¬F`«V¥—Ó•?hœpóª©J¥yP…(¬7³h¹ÔY„J³Œ}¥JpŸÔbéaèЧO•J­Û^ôìÛpöÞ{i^i?‚)·&¿8ÿh…?‚_ý¥´;Fi%ÝŸ¾2È¥Ìo(R-<7)‘‚YfŒ„ɉ‚ ø¹ñá¿Á ûKhz¬›gX¢à×Åû]ÌÛäÈo4K€± YUV(œÆ¯1Àjû£öŒñ”¶×ÚŽ—u†ö ‘a$eXn¶žÒâØËoum&ÿô;ø]­î¢.-å•VÇÿŠʵÔâ97íi”!]bÌl;n*Êûöýð2U°±øJr¡FŒ§šfuS…'>UÊÒ½åÍ,ºœùw…¦ùŸ2“’‰ò¥Í*–¥N:ËVë]ÞJ+íµw-ÒÓWmÚþꄬÿà ± ºG-uãíyû4­§—á_é vã?‚œ¦í^ÖÝS9 Æ$Á“ª®Óº¿Ëoö›wíÿû GÏüžìÙ&O`ß¼ª«ƒÀ$Ãá0x5þ¤•üçô°Åýk:à©^³PÈññ¶t\ù´Wö©BÎÍß•¶î¯d¡á¨SÌchßë›qSIóQM;JRèÓV²³WW¹ñGÄOÿ´oü4oŒ¾|øðOâü+Ï‚þ0ø·Å¿i_|ÿ’Ùã¯Ú ÁZ‡|; ø+öVý ¿µ¿²áŸuOWÕõ=gÃÿò0i–vzeÏÙ®îëoá¿íßû'üEø-gñÚOŽ? ¾øFÛáwÀ‹_ôï‰ß>xOļ9ûIøOAñÁ»/ŽVã í3ᦷã}3Äš\¶×5u°ñ-üÂ/ jZí¼–÷Sñ><ý„> |ný¬>#üvý¢~~Ï?¼#«þÏ?³ÇÂ_†úwů†~øŸâ?xá¯ÄŸÚŸÆ?ïl­ÔÞ›>Tïµåexݶµmëh¨Û[£ëõþ¾_–ºk~ý¨µÚwà·‡ì4xÆÞðwмFº¾á ü.ñÅLJ´;/ƒ_£ñöµañoÄw^6ðö—¤hÏàkKÿíêÿ´¯ìåáÿøSßÛß¾ èŸðÐÿÙŸð ?µþ*øMÿ…çý·ÿïö7ü)ï¶kÐÿÂÍþ×ÿ„ÃÂ_ÙŸð…mý¿þý“ÍþÛÓ>Õø£?ü»ã~±ñÃÅ·ÓYý¯ÄÞÿ…?ûRÅg ügý ?fχ>2øñ»ö€ÿ‚Úø¯âÀo~ØŸ<3ÅÏÿˆÓÿn P»ñdž>.»ñCBðß„´|+ø_៎×1øGê‡ÿ±Æÿ‚ÖÞ)±øyàÙ{Æ:'íðNËà÷Ç/ügø“û@|JðoÂß?ãÇíuñ¿Ä^"”üNÐþ*üAý¼ÿá+»ý´*|Eý”?álj¿.u‹MOán‰ñ´ø7àSp¦¶•Þ’i®íÝ5ñmgð«H5ím¼ûvù«ôµö>òøaûRüø§ðÿâßÄÝ/ÆZ'‡|#ðâÇï„¿5x‹ÂzD? ¼Gû7øãÄþø‡{ãëËê:g‚ôFÓ<5ÄÍçÅ7ú=ùøUâ xÏ\Ót+}im`ÛÔ?i_ÙËIðoÄ_ˆº¯Çï‚zgÃïƒþ6¾øiñkÇZ‡Å_Ùx7áwÄm3UÑô-KÀ|Os¯E¢x'ÆÚ~·â/è÷Þñ-ö™®Újºî§ÏaÞ§e ÿ.øŸöKø¨~ÄŸ·죥k^ ›[øõÿ ïÿ —Åú†¥®ØéRÿÃhx‡â×Å7þ.›má½JïÁÿð¯þ ünñÃëïøF§ø‡ÿ ƒ|£üLƒû#[ñ­ï¿ñ_¿c?‹w¼aâÙò÷Á> ø]sðOö:ø9¦| ð—Åo‰ÿ²—ü%Þ ýœußÛ^êóá•§Æß€ Õ¾ þÍ~ ðíßíðWÇþ Öþ éšæ«âïøS÷Àèø]ãýgZ¸\°mûÖWvÕkǫٴݯ¢·½mXõ²¾ú\úóUý®¿dý ÿÃZ^¹ûO~Ï:6§ãO…Óüpðvªüjøm§_ø³àµ¯‡)ŸÇú\w^‡Ãžñ¹&¬ºf¨Ý[mêÿ´¯ìåáÿøSßÛß¾ èŸðÐÿÙŸð ?µþ*øMÿ…çý·ÿïö7ü)ï¶kÐÿÂÍþ×ÿ„ÃÂ_ÙŸð…mý¿þý“ÍþÛÓ>ÕùCð?þ ³ñûÀ¾ñU§‰µ¯…ÖŸŠ¾(þÆÿ“JƒâÿÅߌSh¶¿à±µgü?ÇZ&«ñcâOÃÇßµ¹~ üv𧃼?ãÏéÑxâÅ]'Ä·^8oé“Áã SÅŸðJÿŠZ߈~*ÝêàŸhŸ´'ü/ÿøëG›ö±ý±ÿgïøáÏÄÛoößý£¼1âü3ýœ$ðm§í•ý³ðûöËMÇ_þ&x×àŽ… j¿5ß x3ãEΉñ‹\ñ…%;¿}èíÓUkÝl•»]ÞÍ'v…wÛ{|¶Ñþ:ÛN§ï%|“ûWÿÈKö;ÿ´ƒ~Åÿúºt úÚ¾Iý«ÿä%ûÿÚA¿bÿý]:0iúì›áÿ‰ºÏŠñf¡ñºûö­°ý›¼]áÿ ü.ý§o^êÛàíKñíZW†üsá‘ñá¿t?„¿oøÃþ ×ð³Ç^1øÅãüTý 5kâoü+ëϽ׎<9{ÿ Ä ~;ZþÔÿ øÏãσÚ/ÀÿøJÿf_‡?þ:hŸðÑ^)øAÿ ƒ¼«éþÛø¨ø_Á~ üàð?ü{àgÀÏéö?¶®­â üVÔ>0~Ûž&ñç‡|Yã_Ø÷á÷Š¿g¯Ùãáïü/ö¸ýŸ>Ûx›Âš—í૟Ú#ÄðOÀ?xYðŸì+¥þØ_õGá5Íåöâ¿üSøG¨ü`ý_ñ_ìSð²ÿàŸìñðKá~¿ñö|²ý‘?á ÿ†XñçÂÝWÞ"ñßÀïøA¾x§ö{Òÿ°—ãÏ…>5xÇ?lø ãß|(Ôÿárxâ_›£øÃPñU—Ø~&é>ñ߇~ð'üçÁß -WþÚ·ö¿ð¿ˆ<_ÿ åŸíãŸøŸàO†üwûTxsÇÿ´wí ûQßøsâ/‰¼7û>é¿°~&þÖ´oü">5ýŠá”þ)ø{Gø¥?Ù|~Þ ð/¯øŸÕ¿à®_ <=?ÄKÏ~Ï´þ‹àŸ†¾ ý¬'Ö¾$ÜØþÏžÔ>~Áu€ÿ¶×íC£i:Gí©|D›àÿì×ñß–>&ðŽ£à]3ö•ø—§|Gðž©û>~Ïßí´ÏˆGÀß@x7öïø{ãOŒº'à o†Ÿ4øããÆÙ×á7í¬Ùü3¾.þÐÿ³ô&øÏðgÂz‘ñCWý ü;âÉû>~Ñ·>/ø«ð'áÏÂOOðOÄÍ࿈Þ%¶ñ‡Á뉞âÿø%ÿÀ/x/âuOü`·Ò>#üÿ‚ |×.4ýÁqj6¾ÿ‚³|}Ð?hÏÚ3PÒ¦¸øumˆ<ãoXé.¯,ï´ïxV[«i_õw‡\ƒÐ<û|=ð_Æ]â}·Ä¿ŒÇ‚|ñƒãíð›ötÖo>Ÿƒ_¿hÚ‹ügøÍá=sHø_¤~Ð~"ñ$ý ÿh‹«Ÿ|Uøíñá'‡gøÙâeð_ß [x?àõ¿Ã0·è¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+—ñÇü‰~/ÿ±_Äúi»®¢¹È—âÿûüAÿ¦›º™üÿ ¿&8î½Wæ~ÿÁVÿäÓ¿l/ûø‹ÿS :(ÿ‚­ÿɧ~Ø_öñþ¦tW>à©ÿ_§ùDrû?á_©üpÿÁÛ_ò’‚?öaõ:øÓ_͆Ž-ØüŽØ@2 lg J˜3peK¹U"% kú_ÿƒ¶¿å$ìÂþÿêuñ¦¿™XöËÀ—-+|Ÿ3Æh˜L_(ÊreVB1 ?韅)¿ ø:Ý2ŠMé}"·Ý­µ×³ÑÝ~uĉ¹bíÒ¬ѽmµ¶¶k£²m®¦ c‰·Im Èãä™®x<ÿǽŻóÐüÿB5ì~ ñ>‡c †ëáïƒu€³€ñê7~?ˆ0*„;¶“ã-ETeU IRÎXøµu~™D—¡¤Hä^€Ÿ,°`2ß| |¸b,GØT¦ªa± óÞ*”­ ÎŒei_’Q½”¯}Ö÷>[QÆ´U£ª’WŒ7^þ²k™§f’N÷²]¿¾|Qð=¬±¬ÿ³‡ÁD‹{pd½×?hdcòHrÂÃãÍŒ}>^ £‘œ“úð·â÷ÃÓ4kÿ ½ð"ÌÀL¾"ý¦w©eºEEó¿h¹"&Gù@hÙ‹HU;þ:x>ÿd¶Å˜°#c(ÚxIxÃ1åX¸$nä‚À°8ûOáæ¼›9´[T1Aˆ”™Ø¿,»%q(`M >ÒáóL¾œÔ£ÏŠ^Ö7úî6Ñæ¥ìÓiWµœÝšvI&ìõGÒB}ùlªN-òAi&š•ùonWuuï=õjÿ¹ ~&øå¬^Ùÿá™fßç[ë_H1I½øÛtœ;¾ô¡¸P0ôà‰´$ñWƒµGø}à Xêþ*Ðt-2m2ëâUÎ¥«ê—Å…ºÿfZk?5 6[}îx¯µ OP´»´±d†(áºÔ.ííåü:ø?â]*8áÕ5ë‡]&!ò´ëYÖÚûYº@é¶“´.mÖ ¹¾ÕÞ*ÆÙ#h’{«Èb›ô à¯Å+Ÿ|gøJ÷f3ˆßôë; ÐØiºzø«LŽÖÂÒÚwšK{hA`¯!’êâC=õÝÍÕåÝÍÄ¿‘æ™jôñΚÄZ•*Žnx¼K´ãIóÓ´êNí(+É''ÊÓ“¼=”a¾^e)' ®eªnÉ5y'®úBüBñ·‡5+(|Emð·áö­¤Cga¦´7ÿmåðà€·Òn¬ô¯‰v6¶–ÍåÏsgsmikk#ÜÎU¯Zð¿Á?þ&ø".oÙûàýÓy—@wãÔeY Ì-¾7ÛçÏÚñc ÝíeÁÛ¹ø¯6’æX¼© šƒQÓ¯—}®£`Ç|¶—PDñfZ0ëp 2ÚÏ SÁqñÃ,_|hñ “ÚÍ­øvêVЮíÚÒyV[½QLe¨7”±˜Ôoº³½h£¶¿ `½[ûH½¼›+–]8F¼1MÕ­Ñö8ìm8¹rÂ*p«O–܉©8{éÊéY)eˆ¨ª&¢à¥'NéºsQŒ¢µI©i-yoÈ•ô¹á>0|<[»ðß³À‡ÊɉŸÄ_´¸2y‘J²Ÿ´JDKBì@˜x?&ßÏÿˆ_ü wö”·ýž¾Y1‘œ-¦µûAHZê2²+^ür½Ïš“—`6®ÅMß7¡üAÖãu¸íæ>â…JŒ(O+-óá‚`>`2†Ël*¿ø®óÌ’`á¥0ª°˜âÎᑞR|ÛŠ?XÊk:1³Uÿw'Ë)æ”Ô—,`¯‹ïîÉok[Ý<éÅ;9ZÒ—JtÕᜟÁ&šQ¶©ëwÕœ¯‹¼G¢Þº\[|>ðv” Mk[ÿˆ³÷€ D¿ñž¦p…ÎÚBÛÈežoHÕK,XÛØ˜äi´–ñãi•X¡ºžâdØcy›÷(‘òùºÜìL‘ IÇm¬ÒLì²X†Œ*¦w`D‡l‹ŒRðΛ®øƒ[²Ð<;e%ˇ¼°Yä-yt¨7I/xÑ ”·ÿÜì·ÿyø | ñ7ÀŸø7Ãu¿ƒž³¼Ö¥Ñ5kûÿÇà{XÓIšÿLy"mf×X°¼šÚÎk[Ù5]SY¹Ôt»Ñ-ĺ‹ép>*ø³¡~κ<ªCyñ+]ˆ>½âÐÉqku4qG4löÁíyš!p©[GhÖÂÄ>š’A¨gxÅ^ µ‚âK›ëƒ¨x€;êìnäi.Ú9F m¯dYGÚMnºƒ ýÛ^"NÑ?•EüE_Ä^9ñl©ÓXŒ/ åsö’sœçO‚riU©yrWÍñéMS¥Õ%Ì ž Z´¾ýÓÂä4§¬¬ÜV®«³öi$ÿuIÛ™µ}Rrç’ŒªyÿࢯƯzEì…î•àmKø²|3¡Ï<’ÝÜIqðŸÇ6Ñø‹]Ey¡þÓ¼GŠ1Ì:Dìê —Ú…ßç7Š>?Ë{bè·&G1€OšŒ… ^vÉ.ÍåÈ¢7 åÄwL<ì:È<<ñnçIñ%ž /%vŠÃÄÐi$¨xS]ÓÜ"pÊŽ/ˆ(#up3çš§Ä«™ (.%d “–(ŠÁ{KûÆgÜB‘‡!QH\ÿAå\—e\˜l RÃPÃa©R‹“•¥N¦&U'R|ª­J•]E*“œùç''9JW·ÍUÅβr©UIÎr”äÓmS\‘ŒdïɺƒMA7e©ô'į‹“_Ù½•ÕãÝ%ˆh¬žYKËk;3A ­fuŽÝ?sŽ5(MðÏŠõö¿–\»w.KnÙÄa òÂ…±å™ZwÅ3Þ³€ù\3og*R |ÅXȉ´ ¨XˆÀmÍã:Þªn]­Õ@Ž9s¼;“!ã+òªªçî²»+(—æïòܶÑ%+ʤÔRŒ"ÚæåŒl›œ›vÜœ›´®Ùçbq£ NJWRI-#)TiÉs4š‹V|ªÞçÄýå?«¿`ƽÿ‚ƒþÃ’œ…?¶į̀„ƒ²1ñ«ÁEW ä±ã«“Ö¿Õ¿Ê«þ ãÿ'ÿû ÙáþÌßúº¼_ê«_È¿Jy)gü+eË“ã#Þü±Ž2)/Õ¾­·»>“‚¤ç‡Ì''yKM¾‹ZoeÑ-’Z%¢Ð(¢ŠþX>Ø(¢Š(¢Š(¢Š*[i"¶¼´¿:~}w§Ë%Æ.³¡hÚèÓ®¦µ¸°’÷O‹Z°¿†Æýì//tói7ŸÙ÷÷ö"qi}w ÑQBm;¦Óî´`uð—êßóéáü!üÿÊ ?á/Õ¿çÓÂÿøCø/ÿ”ËÑUÏ?æ—þÿÌ,»/ëþ}ÇQÿ ~­ÿ>žÿÂÁü £þý[þ}žÿÂÁü £þý[þ}žÿÂÁü £þý[þ}žÿÂÁü £þý[þ}žÿÂÁü £þý[þ} +ß:ãâ¿ÃtXÛvåaã #qØÆ5É ™Zä1'Ì;ƒ†üMðçŒgVf©c'÷…C£6váîʪ"ˆä.§,Æ#µ€ú'àßÄk7âÃ+óº#iñÁw‚hŸ ¥¿ˆôÙÖS"I »IR!e |Ä‘\3Èc[-ÄÉ»NµO-à­WÜ•8)Í-¥f£6ÓårZ5³«j±Õû²†’æMj¤ÓW½×ªéfÕšû#Yø¹Â·˜ìÜ‘#H ‘76NYÙw F\!ùîÙD›¾sñÅ ˜ZiÉ’ ˜þÍwlYÞöÙHuŽâ ¿gxÓå•R5ƸYRäFõó¶©ãÙ|’d gb™KºÌIb|´]ó–﬉nòýkÆSM¼ù¦5l6FbÌíÊG’ìîÜ-³P%F3):´ ­$©¹JNJ.SÖžöjoH6Òv²I”§¥ÛÕµîEsJ\¶kÏ}m¤ZK^eîô¾4ñ2O,¦ÚC‰ p³1f·R 9Ü@ˆÅ‘ZM¦C½åW!€ùóS½Jòœˆã\(%sÐu³18’Š Wu=^K²ÿ1T$´ŽÌ2Ø<<*ª¨EùÂâng¸Ô.`Ótø^æîæM––Ñóg+侑³Í'î­âY.n1 2ù{¹á2ì%|f7GÁÑ•|f/5N 4•ç:•%k(Æö¿½9=#w\a*ÓPŒ\›q…¡iY7îÒƒNÒ©Q¥³´mk¨©(äÍi©kš¥Ž—¥Ú›ýORíìíc,K9hÖiæd<£ùnѰG×3Ú[ÜzÏ‹|W£~Ì^ºÐ4‹„Õ¾1ø–5[Ó«èðºMoä´¶¶–É5ÄZ$çlqiÜ_Oâ `ië^ Ð?f_ >«8RøÅâhZÚn!t+f…Ìs*³¬ö‘Åç»Â(®"iäºxâÕJñ/…_5kÍñÆ’K}¬j×TÓ’ä™DFq›]Fá¶¢¤~LZ5š¸ŽÆÙ"’8×ɶ[å&âLûÇ'ÃpæAØÊë{gVqœa“„óœÊ ¥S8JPË0-©ÁÔtâáR®*¬>ª† ‘Ò©Žª¹ñø˜Â6¼£îEC Bß SIÔ–­(©9IF1T~ü7Ö§¿›Æ.k›êEî"†ñ ·Ví;#Ësr®<Õ¾xwâŒ"YÁº++´vŸ`ü9ð]æ«â}+MŠØíše¶–~MŸ‡u{ñ3´gÉû3>XüÞR U Çé>øk4¥3nêX£9trÆå_•vŠÂ»¾eêÍöìéð]¯¾+xBÜÙÎ ÚgZ2–6#á¿‹æ2î+›|à"i7aбUÜß¿evMÁY ²¼–‚¥…ÂáëW«^£N¾3¨Þ¶/Y[ÚW©È¹¹U©Â4éÒŒ(Ó§N??Z­|muR´Û©)Å(SO’šºåŒ›NÑ\ÏѹKY6åùztÍJÏdâ" Bì ’VX™r§äÜÅ]¶yM&YHç€xÝbÚq™TÉ„âHØãÊ`UU$0Þq¹UI §' ûûQøP!³Œ˜$ÄDªŒ†TŽfhc)HªÄluiï¨MÃçÏx[/0…‘—‚7²¤@ *7a+92­}M|*I)Y]ÙIi{7e£q•›³Ši¥»r²9)A¾N{ò´á$ã)E¤¤àú5ÑìùnïÄù\f[V\SÉ,H%³´( Ûú1 •Ù–@çia\u?ççòôâ½£\Ѽƒ$3FÞS³Fá‰óöŒ’ÁB©mͰ©!“¦A9ñÛ˜Z¤”«FìŒ Î ’Í…ÜÆ( 0@ôxi*˜YB+Þ§5RI4ï +s+6ݯÑ&ž‡˜ÆÎŒ•¹c Õ¹Ji¶úÙ¸µegºÛêø'õÔñÁBÿ`ë}Èc—öÉý˜°±œ©øåࡵã1ÁUåS2,¬ ¢õo¯òœÿ‚~À%ÿ‚€þÂ|òaý³?f ÖLŸÞùæF*J w¡-‘œ« a_êÇ_Æ?J‰Eç|!˚ɱêv[Ëëѳ~m[Ó¦–>÷ƒ% eõùcÉWJ§*·4¹¤üÜm§NšX(¢ŠþU>À(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šø‡þ Gÿ&3ûIÙ?ý=iQÿ#ÿ“ý¤¿ìŸ¿þž´Š+ÔÀÿ _õñÿé02žëÓõgòÿmÊH>ÿÙ…üÿÔëãM.uýFÁÛ_ò’‚?öaõ:øÓ_˨ ÿɯà¿ûÃÿO×>'1ÿ}Äé1/ØÞ›9dæm ³cr6RQ¶BE&&A¹YFò÷GY$C”uWS‚2¬)ÁŒ‚wלօ¦¥qh~Sæ#4eÑˬhc¤’)´n Hò¢¢”o¾Åá=·¿NÊ¢Z§¢žÖòM+ë×Dô³_=ÀRF"Fó 2Îëº$—<E$‰îR]h?³w„ÅÞ'š S⇉ ÞfK(v ¡»Ù.ׂÒ–;‘ws–òA«qoåŸiŒiÐxgà…£øãˆíï|W}O øi£·žyæ‘C0:ʉ§#Ưw>^ùmÖ8„–6åïþEjß¼e©xçÇzªÁýÑ“÷ÑßMªŒÅ,­#·Id‹O‹}¦HÊ<÷2Îé¾ê[©cþ2ã®5μ^â ?ðU)Ã"†#÷•"ªÓ§˜}^qsÌñî1•HexFÕL5T­SÙ×âêapÔ>û,ÀÑÉ0o1Ífž2Q|±›°þÒ?¤›P–"¤W,¤’Nj”çÑø;ÃúÇÄÏMñÇó> o®MÕµ½ÁfKÖм.X®™ÆH!w/w&g¸3FÒ5ßèÇÃ_ }¦X ±,ŒÌ$ub§,ä*ÇŸ<¹¶ÆYF0»ˆÃò‡þð§=¸Ôþ+è^ µvÏàˆ·ÑÃe`1C¥ønðH1"¬‘’@U×oég†dXY¿ißÃÑå‡þ/Ç€a"&Œ³ËÃÙ"Û–ÈòÃçʳ¬gö¬ƒ†r®Èéd¸X©Õr…LË0Y~.XŒv*J*uæèáçÉN)ÎjÓT(¨Á¹ÍέO*¾.®cYW“‚÷y!i \Ói¸óIkÊ¡Ï6✯{iß~ü4ÒõÈ Òu¡ ¹håÑu¿+#K¼~b¢D K¢^–hØÁæÏ¥Ü,WQîo>5ý/ýž¾Ýh?¼9k¨X$6–ž770ùi!‘gøgâÈãžXü¹¡»I¢žÝâó-®"h™$1I%r¾|"_²Kí áðùxã‹á¯Æ{l€ y³}§Á(‘» #\œïæ2G"6ïØOÙÓÀ^Õu- Ÿ‰º6µÿÆâ)4Í^ßÂ>;Ó®´{kßk¶æÞîïXðí…Œš3Çxfµ²’ÿ{É &›‹†{züï‰8‚¤2í0¦°õT ðx´¡zmG“š‚i'îJméR)Éòϳ AK‘¸Å˙ٺ±ŠŠMY)J|®I¤ù•Úm©EòɄڷìë&¥cq(ŠÒÓKÓì`¹ÖuK”ßg¥YE°#0'›<Òš}„!¯5Aㆳçó£ã/€l,î/cÓì;›´PyàÙ’6`—7ÂI‹‰b…¤ nË­mbRòãú~øÑà‡6Véá›oŠÞðö¥*\GdÞø—,úµìÖ¸ÿ„ƒWšÓÃ2Ù]_ßÛm6).,¬4ù rËÄ÷w¿ßþüÛu$ÿ´ƒí2üÏ…$Ëæ!}€î.ÆXÌŠe;€ó%‰emþ·gó©Z [t긮X౓J2q´ÜiÑš•HüjI˕Ǖ_™'ž'ˤ9c­§ ´šjN§-ãetšn-»{²góÃñ Ãÿfšqä®Sz -å2·šT0r ÐK†;?.xŽÔ$©p6ƒ 1IŒåž0v¾6ÿs œçå\(äŸÕ‹Ÿ ~G5ÇÙÿi\„ØÁð«ã„"M¬¦0¦ãÀqï´4“È,Ud ]?>~Êÿ~<ê¶vÿ ¼­\ÙÝKoÜÚÜYèâ9eCÅq$YÔgÌhìã¹B±±”¢«0þ›bïø!Î…ekkâÚÛþ½RæÝd:yöút.C:å"•%L„lGö‹„˜žkˆÜAômðßöWømðšÊÔé~²²x!xIKX  ˆC”Ƴ2"¬gxòAbYv28;>0ø/áv‰y}ysig É#7— (òÚfU ¬Í#”Kº0X…É2ëü)â?ÒG¼FsËð<œ9‘ɤò쮬ÕZúÆPŽe›Ê0Äb”$®¨áéàðµæ• ÔŒZý-ଳ+©N.œq˜ÈÁÊ5±ãRƒÒR…'~MÇRNTýåuIAÿ›ý’ŸE<ÿ ü#v’šd/qÄžg™çùd«¼™}¡G Ÿ0’<‹ÅßðBÙCâË‘áèô ¶O1§Òå–ÖTDhѤãšÝ2X„)‚¥XEÙ¹¿4?o_ø+7í)¥ëz}¿ÀOêðøyZåÛ]¸Óe‚FÒÕgh±†÷vïól¼Vã5ÉE*ñüOð»þý¯<ñÇ®é‰Öݰ#šIb—sVáB¼ ñ—󤫇Ü~VbIÀxÏÄ;ã sÅa•ZÒ­ý•Å™n_š`ëSr橈¼çŒ£9û>hRÄBzÔy1áR”©Ê¦y¦uÔ«ËާhRI{lºU0ó„”\b¿qyÓ×IS¼a%(IÅÝ.ûöµÿ‚ ümøUªøŽÿàóÍâ½'KÝW¸H5‚8¤—þ%×sl´’4#ˆG=Òà“=ÄòÿšG‡¼;ðKI½øñ:ŸRÓnn´Í Ã’“]ëP ˜gÓí “lÒ³H†ßV¿X×˱3iö—VVÓë7ýü^ÿƒ‚þ2øÃö~ÖO‰< áoÜêšMÖžú×n|K ½·t6Z(™Ú;}FV‘¦…ÛìÌÐ*,rfþD~#|Añ'ƯÝøY–Xl#f‹LÓ„…­4}<°"ÚÕ0#77,¾}ÜÅKÍ3eØÃ §ÔåÜ[â¿aãÀœçŸV̱°Ã*<ÔqüC¢Û«O›(ʦ'åˆÄV¯‹­IÒ¥í*×úº©|Æ+,áì%xfxL0ÕiÁ¶àåæIFTèK݄Ҽ#Â?,V‰¹Ar$[–É$Œnʨ(ÆäsË~“ð7Š…”ДuAç …ÕYRL«ÉÛœüå”ÛÃìÄnWÒfØWÍ?f¶—´¦þÌ ÜgukÅ%k.ïd™XZÞÒœ&ݹ՛]*)ÞúôsæOGd£®©¿è ö}ñl7—©%õ¾cgKª_\so¦Ùü¢s"ùb[©Ãˆ…­ªq{vaŽVD£õÃà—Æ}&ûÅþðΈM‡…íañmÕ­”²FÚ†¥¨E༺¦»* Cê I†(ŠÛhÖŒö–«*Muuwü¹ü?ø³-”ÐCxÑÀ&IšÝ[c¼‘°Ew$³°EYÚ ~Lªd ÷×ìãñõíþ'xY^rŒtÿtœ7‘øwâ´ˆí¸”m'™y9‹² Æóþ©RÊ´Õá䣧49iËÞ”dá.t“Jqjþìã)IË×Ã×Qå§4ù[K–SQµä¬Òm'­ã&í¿+k—ô{Äÿô-kCMÄ:…¥°Ž%>×÷yË¢¼ÐªIe©r²Í᛹Ÿ†ûF•1ÛK4^}¹üøûâ›Këý6ú!Ê8’xì±J7+ÛÜ[Éch®Á„ÚÞCæÚÝ@Í(Û±U5­u߉Þ?³‰|àßxŠ ˆëOÒ¯d±Ü!سýºk·•K4Ò\]ÃaŒ†áC "çõ¯Ùöñ¦›ëÉáß [Bö+ë‘]ê6öjZg€[øv-nan¡§0Ø\5¼V³L#c†iXòeõòL—êból jÓ•å„£V8¬T&“©Îð˜5[¤”æªR2IÃÞæöšÎž#ªt&¢ìá'hÁ¶¤çʡ̔ïy·{µÊÕ¿,¾'ê©<³…˜*–ò†Ñ"+$l7,0Ô9%F.bãïÝîB„®ùç2¶20€¹Gq»9;@ç%¯Ý-wþ âO|8Õµß üP³Ô>!Å{ª¦‘áýCD:?†õ‹}:-*Itñ®6¥uu¦_Þ5ôñXß][ͦ‹h¬u´«IçÖ-? þ(ø7ÆŸAÞf…ÃY=,Ï>ÆVÄÒl>Ã÷sŠ”%Z²Q§)FIÂq¥ÎNVrpwV×Óþ|Òu]_OÓü5 iþðV‡ˆ-aÓí ·³‘ r$‘¢†%CºG-….­!`$mŽéƒ4»=Hô+-–×O¶§E“Î d‹ËEœ½$XÌ{Q~âlç¼ áë ør·cv¶£áÙ^âñ†ÈÆåF@#$±W–@¥²‘}ÃVkmi-ÔΦyYÚáŽTFçÊîòºy|§î `AwUþ­‰«^´åRr’rrjRærWÑÊWmó4äß73÷]ïÌÙéÐ¥NT£¥všŠVmꢒQQKÝŠK—•·­Îâ÷‰‘¢\¤,‘Á9•Ë…Ä&(ä”…Ã’¡LhùB•Ù„gþ5ÿnoÛzïĵo‡²ê†óEð½ôIyád¼™Võ‰šfžöÊyo­¢Ú“lXÛÍ)2Ï Îú¾ý¥õȆ‘«Û«“7Ø/„F$ 3[ÉN͸8·ˆî$ÄÇ+ÞÛ+üý?lo6¾ñÿÄo‹V­s¨O'‰on5 ‘¦kx¬6ÙçM2o±}©­•^P'{¤–E­Ÿî ð‡ q‡ÒÈxŸ‰ Ã1À×§”æS¬U ™íZøh`0¸¨ÎT)S¡^”«¨Ôž&‚XŠt)¼*V§|OæÌÛápÿZŒ+Þ¼#&šÃSŒ“”lÛ|²Q“´&ÔgR\®)µúÑ¢üYø[ñ3A}+Ä1Xi÷pA‘q2¤[ù,Ë OybH¢O’6i‘™w,/yl>(ð×ì'âÏŽÿµ[àÇ€u/ÙZ™&gÑìcŠ /üÇ–æä]ÜÐÃâ±øéd”¨á8B )eôñï¬ÊOZŒ±Q£F¤ß±¥BOã8’“§Žx:¥:¡'S–”}³rrW“´pƒ‚n)ÆrŠ|îI~©*Á†2¤¹U— äeXaê¬ ‘Áq]þ€·šÛÙéú}•æ¡©NRÞK(žþîê`²`Goj&º.ë >$…K„2d1þŸþÿÁ2¿d_ù73ü;½ñSPñö½ªkQ|ŒŒšŒšO†n¥@au¢N2ˆ<›þÎðŸÃßøÐØxÁ~ðe”"6~ðæáÛv‚"ŒŠðéVvk"oU‰–•|×-.^¿bͼ_ÁÕJž[âê5)(×Ìñ˜l UœáOý¨êAû­B´ðÕùm ]¯–ÅeÅA*•qi©Ò§9I'ºJ£¥~nöŸ.öÔþY<û~Ôþ=’Úmàç‹ôëi6SñU´> ³HÜn[•“ÅséÜ[íùƒÙÃreV$‘¤Eo¾~Á.~0\­µÇ>!xÂ>fÕ¸µÑ-õo_¢a\‰"–éªíòömVåæ&E=ÿ¹³6J2œ|¤Ý’¤1ÎG8?/°Æª²JìpNOV#’p2 ±  üó0ñ/Šqñ(VÂeüÆ+‚§*ÑWøe[0ža´î¯4¢’N1OR°ùv ' q«ˆ½ªÔnm&ÜaJ4œS“MÊëâ½£ËñoÃÿø'ßÁß G ¾%×|k㋵D&;VÛAÒЩ–º5œz¢«„†×žL¬ÁŽêû·á€¾ü4×t«ÿ ü;ðæ=ŒZŠCy&¯ªÁæè×öH¶úÖ®oµpò,Â2~ÙF‘ß Xó¯{墑¼0cû¶f“‚K‚Aõ px`9mw⯂|‰|[ã? øZøÞ?õs¯òlÿ‚sßðPÏØAŽ2ß¶oìÀNÕU\Ÿþ'  *EPŠÿY:ýéaJ4sþ„èKŽmë«úônõ¿Ý±ÍÃ!‡ÂV§µX¹=un½[vì¶òÕ…Q_ÉÇÓQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ÿÁHÿäÆi/û'ïÿ§­"Š?à¤òc?´—ý“÷ÿÓÖ‘Ez˜áKþ¾?ý&SÝz~¬þpྟâWüö8ðÿ”f‚Ûö)ø ®ÜƶcѼiñ²îÇíÂÐ1Æv’ç+_²?ô9´Í?Cµ‘c·†ìbºâ-ã…]@WÈvʪ¤‚N$PX¯ËðR‡ð”ÿÁmþx¢xÔZxWþ Íð ZwVl ¯ˆß.nN[cØØ‰TŒ2N±ÿhxYw¥È†6¸FE•dQòÊ*0JDA‚³$Àeâ¾zó'ÁùtjsRáÞ ÊrþU%ËN¾.¶+4«Q+¤åË™Q§SU+ÑP·ØðnÓ£ŒÄ5wŠÆÏ’é¾hS§NªÑnÜô›ÕËâ–Šñ¿ÛžxÑõ"…!Š3@ù`‚™W ¹ù\…D  ‰J ’BàêúÓhúdÓt€2–Lo ìdÞcòÝ’EV â ”¸’¶-¼ëm&+xííü¡ Gsñ—€<;ñ.ëì¾.Ñ-µkX®Út·’'14,rÆŠc;ÞGù6«HX#ºTùgí²Šë ÊçiÁ«h§YBI'rÊ 6ÑZëáræùÍ*Ón-SQæ•7ï/rêé|M©©'³•úÝé«ÿ‰ø3¯wñgQÒ†Ž'K_G{—%ÄpK Ky‚U€ÍÌ$²«D¢Šþ,Ò<1ðûVÕ5l–ðio2£¾ØÒ5ˆ0uR±¿–X—äMÞf! ß³Þ›ƒôý7EÑíãÓ4ëHmâ³°·GoDñ E…vÇ´—Ƭ0Ú©ÆŸðZ_Û:çà'ÀÝ'Âz ¼ºÿÄ d±‚ç1"[@ÇÎY™.˜¹ŒM#âBÆy–"1ûX<¯1âŒë.ÉòÊR­Íqt0¸ZtàªT­:^Êrq…8Òœ!:µ%(Ó§OŸšj<ÍsûZ9~xвP¥Bœ¥SF¤­g ^îIò¨«»«¤Òø_„wW:õÏÄÊ·ú~$kz®‹ þŠúUž›¢.£m*ɾ¼Óo3#°[›k{I£Ž4`Ò{OÚtë|ÉywkkZ[‰’$Ž0B™\»"÷'$ó€ ×ò­ÁA?j?ÙÛèð|O èv[ÙÙé¾ _ø@XéÖêÅeksc5ó¬VÑ$*òÜI"mÃÇ"Æë½ð{âýï‹|Qiyñ]ñ‹geZ÷]ñêÜÎì¦Ü’mvíK²Íò©S'îÎàC±¯îl³Ã¼×‡rlË!K†¥BpŽ*¦#xÑ‚¨êP¡CêíÔšµ:Qƾe.W8ó.oÆñ8øWÇתá)ÕÄT[rÁFrEÎU%%%›“¢ÓmK[×)ñ7ÃëM;S½ŸÄvqÚi¿nFÓî£ÔÉU½°€î]4\1?‰nn§yîuK{¹¥%Ýî.ôy¤i™äÈÞ0óYäfÝ!gl• 0K玣“Ÿí1øk È|S¥‹Påö‹>ÐIUÖZRFq|L¹f>€FÌOxõð… xºtò̧,Ë=´ãýŸÃaå%î]¸Ò£¬¥ [’év›¿u*÷uå*··»9Jq½ã´jJvwŠÖ6ée¦¿¡ßðM~Ôþ¼•-¦±ðއâNÑyC ô› [P‹íf9rŒèÂØÆÌCʉýÇkž:ðŽ„ùzŸ‰4xä$9"Ôj1Is2Œ…Ì6ñ®ÐÛI—ó/âWü3ÃòÍ⟋Þ4‘‹ý‹AÑ|9 ’‰5}BMVïkÉ-Às(Ñí~ÐLá!墨? -bÔ¾.éÒË’ÛIÒõÍPá Û;éÓé–Ï!ÃXoî­(ýê¨Þ_Ë|UÅÆž{ŸO™J9v‚§/z*N†[F¼£g{[‹ÅA´’SrnOV{™f4aB 1ŠŸ4¤£.gQÆRµ–²‡²iö†ÍY¯µJ»ZÛÝÉŽKÇžf\a·1äÜÕÎyr<¨Ø¶æl†P¿ÌüƯªü}øWà4e{_|-muÈl˜õOx—T‚îL|¥tï h³†ÉÜ·`mËR:¢$+enD‘[þñ•@VɃ€ÇçIXä\·Vjþ+à¥Þ6O~Ûo­îÅÕ–ƒ®é> ´TI£ø/ÃZ7‡5kHÎÒž ÓõygŒ’c»šá3€ù£^YõßgŽ”SŽM‘f¸Í«¥_<6[¦®”çGˆjïX§SÑΪrácìêUŠjö¼b¥'§T¤¡~Í£žÿ‚rÊBÿ`ÿû<ÏÙÿWëýe+üšÿàœŸò¿Ø?þÏ3ö_ÿÕßàzÿYJô¾–¿òQpý‰qßúÈ?ˆÿ¯±ÿÒQEü’{áEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPÄ?ðR?ù1ŸÚKþÉûÿéëH¢ø)ü˜Ïí%ÿdýÿôõ¤Q^¦øRÿ¯ÿI”÷^Ÿ«<_öÓø{÷íÉcã¹-ÑÞãöHøá{…gYQ4ý_âF¯{¸l Õì˜m?|Å“ k[ÁZöž¡oBl­´…˜Æ’2¡a uÀy>gc圅$€[ßk6¡ñ«Ãº”qÈó?†Ztl€•cÑî'”±,±ýËœ‚s´_¤WÐ,¬ô­&Ò(b™ä¤`É4û¦ç§ËWPÎáQ7$ùÛò>'ÆMf¸ÝÍªŠŒRwåµ&’–»F+ek«^Ö?UáÚ<™f zGššwW|Ó½¦·æ“vi§m®ú»ib·dÌdh¸0U…œDb†&]±ÆåQpJ¶X8S²¾"ý£ä&W!J•LáeE\3"e% Y‡–OÞüfxµ;Öh‘™$`±®ÈuwY!óJüÀ¯î¤uR¥VGUÆÂUŒýç’V‹“Zò½yZNÿ ¹S»IÞÇ§Š‹)NêÑI=/~v“ôåv»Mk¢ÚçÅ~#ó$t¹2ÌñÉ!P¬á¢  á‚‚¸p7 ek"ðP[ðö“ évKuMpò­íÖFv;@c"æAÀ##”ÈÄ|¹UQs¼UwpÑEin¨×²lnT†6õJ@V.¾V°dZÃZi¹’ÖK¹7²”B!åçUINÑ+eÔ” £ìØ¡dú:MªqnVŠ“÷bß½Ëw¦·i;òßF´I­OŸ¬¢ëM(Ý¥¤¾Êo—™)=ZmZÝcËvô¿Ó^Ô„p4î$KvT\/’ˆÀȬ¹ug$œ',H•²ñŸå×þ ¡ñ[LñůxjÖý?â™ÓîœÄo ‰UaibŠvkZ3£—»–51ÜÈÈö¥EB÷3ö­ý£4¯€µu$YüHÚf¨tË8|¥ž°·’öêïËgO“j©2 óK ¯"ÿ¿>&øÃãÄ=kÆ~.Õd—Y×&’h mB(~Çb[ˆtø?è ¬2µÒ‰^&¸yn&¹U•¤Oé_£Ïãó^#©Åõ¥yG µWV§»oˆµ Ò™¾$H—9}ÎT.Ç…„fØÏ',.•GRÔg-[KW~M/Ìú¤öZ¹Z×môT–"Q劦ŸÂ¥Ï'ÊžœÊ<ŠÍo¼šþñÅYÃy|ÐÌ—î"}áoN¹4¨ª…Õ€h>2M)ùÃF!É Uw0ëô¿ jFõ©(K]/Q¿ñ6Õ­R!en÷/'ÏñU–]ªŽL cy2Y\Ã}à‡ZÓ12Ë<«–Aª³¼Q®ô™ãòþ!Fè¾b”Ú’†—~Ç÷ÃÙÞêõ«pú´Š†ÌhLòª€Ad* 8VøÇöQð§ü!?²ÿÂý8¢C5߆¿·.°J™n|Gq>¸“’å]ÛËÔâH¤ ´*Ç±Š²nûßöw±Ž ßjeÛ:§Šµ+„ÁWSk¦ZiöÖò=»¸´ºž ÈWýPÅ~â&dñQÏ1œÉ,Ç4ÄJ“O–Ô1Xùâ)ÆÍ^VÃ7 +{ÊòÕ\ú,¾ :*ZÊ4ióï¥HÁª–ÕÚóíw{&ÛÒÿFk·°Å-ÕÌò$VÖ0;M3 VèòÎòdgþð’£Tž§øø—ã ¾!üFñÿî"hgñϼUã á|oŠok·úÔ‘6Aº7½elHã áØ|Çûjý¯ürÿeÿÚ Æ©:ÛÞéŸ ¼lšmÓ’‹½­è÷Z)ÚWæö«§ãD²²BÞ+ø_¯ÔþŠùg-0Îej•²¬¯RïEB¼V.;(¾oo‚•ítâôŠnøç•5ÃÓì§RJë¯,c¥ôµ§®©Ý¤ôgÙŸðNOùH_ìÿg™û/ÿêïð=¬¥“_ü“þRûÿÙæ~Ëÿú»ü_ë)_ôµÿ’‹„ìKŽÿÔèYð1õö?úB (¢¿’O|(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šø‡þ Gÿ&3ûIÙ?ý=iQÿ#ÿ“ý¤¿ìŸ¿þž´Š+ÔÀÿ _õñÿé02žëÓõgÐ_´±¸øƒ¢,hžsü;ør!†l|nظ.Tg$|ª[ù}ãZéšsM Q Šù¨ÒÁe$¢Èü®ïÞJX‚ ýÒ†°|s¸‚ˆzJÈÁYþü?PÅÑUðÝ“ lÄUp”®ÖÎSæ/ëd/öT&C´ä`ä2É•hÆ« Á“r¥â*™æ6›MB5å6õ³Z)jºíºsI½ײóeYz[Ê„òÝöè®ûh5ñg‹åxĆVT‹Ò•8Ü–RÅ’5Îv²Ÿ›Ë>$ù_ŲOs-ü’»<…N7¢îXãÚpGرà3£©R"@Á#ÓâI yŽ_Ì„±@ °dX‘æ ĬeyBn;ÆÌ)óv|ÅâÛ«Ýœ¼³<…ÙUTœ¯Ìß10é´5ñG‹®<}¬^]Û:J–XMÁeyåFâ ¬]”4sC+ò’K¶ÜμßaÃy3>Í0yf2çÅÕ5&Ó¥JÒ­]Å|0¥Ož¥MvNÉó+üÖe˜að8zµåfã´šnrÒЂå÷e98®k¾]ZºZþzÁA|s¨ê_ `›Ê1j[Ñ)\.Ïˆì „ÞdØD»•ħ>jŸ¬¼ðNWøñvæC,²YøoÁ›ÓûU§V{‰ž†I”Çñ¿–®ÀNï$YŒ­óý7û=xÆîÚÚÛ[–[&ù¢i]oÙoôÛ¹¼…]KMSñ+Ék0_´iÓÈ"Ô¢ ­%³Aúgá-¥øâm³H·°j>ð{iw¶——SÁ¨Ûˆ¾ò¥…á-’A²hÅ´Ö›­õ+;µ[{›spžÆçHÅËÞö´’m¿}{ZzA)G•$žêM];Æ..ZŠѷ«Ž©ò«6¢­ïÊ)µÍÍ£wW²ÑŸÍω>]XA"4ÌáÀx êM!b¡w/ÄWÎdª”`ê•„(A–ð»ÄWº„I¦hþ Ôµ‡ÛîÕÓpŽHã1|Bpòf(*§#zº¿¸?~Ùø6ÒîÒgI|G:ÂØøâ1{}m§Û4Ú¹‰e»¹û5 söýF߇¨*ÊU†Ç·îgí%ñ²×Än¡©èþ)Ô¬n! ­¥Ûx¿PˆÙ¬²aõM/gÄ+6]%š%3ÛeÒæp¼ÚbÆãò'ÁúÞ³ãßÚ3á¦|Iâ=FÑüc§ê’G'ˆµûÈšËA’_\«$ž#ÔdöV•4>[ì¨û—êø;ÁásÊQPú†YŒÅMÔærŒðô*T¦´ä‚”¦¹anY.^HÊ)(òã"ªºTe¤g:JÑQ“²m8Ýi§½Ê”[W´b£/Õ½kBø[FðÔÓZ[èz5¦™f&à ›d°AåÅ*–m¼eCÉ(òð>c—o«þi«¦ü?ð²*ʆ]^L¬À¸ÔõGS\Íey§¬rH¹6ñÂ]Ÿä¿ˆW³\JÖâ[™eÄ‘!’ižV™$awÈ|ÃH˜oF óù¾ñÒ4õÒ´Û-1v¦XéÚITÉDmO´ÑÙ›—uƒ2±ƒŒ°Ûñ~5©ì°˜ $nÓ­9­Ó IA6ß_Þö÷—6Û¾_šw¿2rnëWRW¾‰^í_k&íØüÈÿ‚ÃxÕ|)ûkÚ)r²üIñÿ|RUÙlu ü}tÜ2æ%‹Ák ß{›¨‘¬…—ù¯è£þ ¯ãi"Ñ¿go†ÐL¡/uøóU¶ ·Ø ðÿ‡|;pØ}èªo|WŒ‡%Ê0Úá¿zþÀú9å¿QðÓ ‰µžq›f¹î›~δ2¤ôøäYewö¾Õ7›–6q¿ðáN KY8ª–OíkR÷èÛÙ>Ìÿ‚rÊBÿ`ÿû<ÏÙÿWëýe+üšÿàœŸò¿Ø?þÏ3ö_ÿÕßàzÿYJü3ékÿ%ÿØ—ÿ©Ñ=lƒøúûý!Q_É'¾QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE|Cÿ#ÿ“ý¤¿ìŸ¿þž´Š(ÿ‚‘ÿÉŒþÒ_öOßÿOZEê`…/úøÿô˜Ouéú³Ñÿk-n×Iø‡¡ î$ˆÉðÏáÔ›"-¹Âh6á(eÞQòÃnâ˜,vðOÄ>&ñõ°’i·fB˼Üä©5R…V%fÀr…hX‰pµëðPí~÷Jø¹á˜-Þ(â?>O#JÛgÒîb#pV<"¬©#SÆO凌~+èº ž¡{®k–¶Ö¶ñÈîd¹H# @´’îo.Ýv&Gб¶âèùÏæYžYR¶i‹©+òÏ)F=ùRmèÚwÚ R×KÉ(Ÿ¤å™¤pù^”ïBMèœnÛI]ÝÙ«ëÔ[øy¯î^(ñ÷ÛüØv" ‹«¨ÀX#‚2’|¢0RI͆ g‘|·ñâG…4{ygÔµ8Ö•Wš1ä´q²ÊÂ!2–”2²ªŒ£Ïϱ‚~Y~ÑðTÏ…Þ’÷Gðeññn«n²[ÄšS–².Øá“ûJÝZ?*$…£’H^RÎqÈŽv~ü^ý°>/|b¿¸û~³6‹¢6ñ‘¦Í4hÑâhÐ\Í¿{“Áš%+ô ±¡ýÝ~ûá—Ñ«¸ï…«< ᬚ¿³o5ÎhT êS¹§‚Ë䣋ÅÉÅJP›TpÎ6KHù<çŒð8_h©Ï븘Þ.• ®H5oru×îãf¹eª“¿Æº¿×¿Ú³öÿðç„gÔ4O ßCâ-A’ál´ûIÒ{we_)ïn­‹&D{íâ|JÅ…Ã+‡èÙÂmkþÇÀ>!ñ<ò]ø‹Æ¶7ž:Ö.$O.W›Äº…Ö¥¦¡„îÙöm´{4‰œ$QZªFvSü¾i–:‰õÝ/I¥ºÔõÍRËK´ K¼—šävÐF >{‹…«–8Æs_Öˆ­l¼à/A´š8l<)á½?G´ ¦8…®‰§ÛéöŠÊ»6î‚Í…`¹HÑU±_Õ\Iá' x=•ðîO“ófÎ69†gç¸ÎHâë}J8|. *Q‹†9c±®4i͹ÏâªWœ!8~}S7Çfõj×ÅO’q… =ûš\Òæ”µå•J‰B*U%ªæjƒ¨ïø{ûW|E‚÷ãþ´ƒIðþ­oáM#HЭά—rÅ+yM¨Ý|öÞ!Ðw)šþXÁYCf5Úd‰¿uð‡ã £ØF>ü¸ ´¡žÏÅ#%FVöˆá\®ñ³[¤žäNcøÇž3]sâ_‰5Ù&Øúߊ5‹šæÚònî§ŠÕ¢óuÍ!Öš.H^B°$–î‹(x—Ö>xÈØIoÔX´ryqƒ¬ªm¬aù—â$!3… Íp¯¸;Õ˜à#C È0ru¡VfˆŒ+b(MWÅB8¬U£JpQk^¬ï¤Ÿ4eF1oÊ¡ZU+bªYEýf¤ªQ”)ÍÆœîú8F)5£Qæ»R?¤€4‹”±ò¼ðn|пèz‰÷JÒ•R<ßµ:I˜„¶8‘É•J·™µÏì€þ'øwÃ^ñ|7:7ƒ-µ;;òú×M‡Pø~K½KÓ2Ý|A¹šmvØËýȳºÓÆ™5Œïu>¥ Ågüµ|øø<.ÖòÛë;à±ÇmsýµºKeŽFIl¥ÿ…‡'Ù.•¼›¥@4è 2ÂÂåb¹_Ð_þÑV§À¥:ä*«áß ûZ ›‰ó ;xßr(bo¹1È1<ÊÉŸ“fyLªIEʪŒeïÖ¯RRr«N)ÁÎr|Š.íÆ[;5Êš~Í:‘”V—i§x¨§¹[RÑÝY5k{¯ÞJÈúoãÇÄ{ Mü ß õ{¸e¸Ó¯¾º¶š›"·ŸƒâöŸ9–9¢¼¶uY­n¡’+˜£™%güdøÁñËN×QEðëà´J¡˜Øx³Î¶dFHæoÚ0à+I ;ÜLÍ6YŠß×~ ~Ñv’ØÜé7š±ŸL»g”Àu…7ZużLRÓå?a{bÑüB´uµŽ3=Ï…¯ã¶Ý$¿§Àf-`eвBðC3þEêþ1h§mac€ËK,Ú¼K$¥ö¦æk¯ˆ8a«Ê1/ˆÞE YvŸd·7 ºã}6òßÄ:tjË}lcšÞ/'âPa6e ùª¶­,Eüì¦?KS'§Z:¹ÎN*2”åV£·,4æ•Gu¾’Wjïš/S“ë ›´ªE;/vRŠÒë£w³·¥ýÑ~Ð÷ÚŠHßÛ³ª3Ná×^hU“å•Éñô­ó›…ˆÂ`’ó[es²^ûö øM?h›Ý~FßoáøƒZG‘ŒŒ—Ú¤¶:‚~×vVCe«Þ”@ܬRÏå‚ÿ’w>>šñ–(n¤™Ø \ëV€Ìûw §Ä ØÞb¥Õ ¡evBb•¿dÿà•ú,²hüss¾sq©x_Âv—2I¾›o¨jÚ¬^I ³ýH"bªÑíbïˆý|nžYÁÙ¦&…\]l’äŠsŒ±˜_ow9(K O­IݸÞ0Q¼Žhâ#[J—;j1«RS¹bœy/Ùûòƒ“OWs+?Õ.É|Iñ#Áš,¬6^x—J[§ä-Œw‘Oy'“Rm¼öŒŒ|ñ²£ ‘Êþ…\"ý††ÃOu<²Jí·q!¤L2•BNçUb :m[áO‚¶ê_mn§ŒºhÚ&·~ê2ÏžÂ}>Õø Û"ºÕí¤\íýìjìÎï¿æ³7všr©*U"Vl«@Ù€ÎcUL•RÍ´Ÿ˜üÁÆ•”ó=µ,%ÞªÊugQÙ«-:ræ[¦úŸWƒ‹.—m'òJö×k¹Ytô?‘ø,çŒÏˆ¿l3á+2|7øeàÏ KgÙî±ý¥ã™‚©ÀW6¾,±I°»üÈŠ;0B~L×Õ·Žâ'íyûDxœJ“[ÉñOÅ:&žñ±xŽ•áKçð®•åØtíÙ†Áå’Å£ÊOÊ•þ‹xq–cðåîÎ¥,ƒ-©Z¼®œV¼LZ»÷–"½U&õ”¯'«gÉâçí1X‰÷«RÛü1“ŒwþêZtÙh³?àœŸò¿Ø?þÏ3ö_ÿÕßàzÿYJÿ&¿ø''ü¤/öÿ³Ìý—ÿõwø¿ÖR¿’¾–¿òQpý‰qßúèràb?ëìô„QE$žøQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEñüþLgö’ÿ²~ÿúzÒ(£þ Gÿ&3ûIÙ?ý=iW©þ¿ëãÿÒ`e=×§êÏÆ?ø8cöððçìÁûC|?øz`Õõë³'ÂOYéúrˆ"m7P¹ñ~‹m4šŒ»¡·-wáëØäA ìP#2¨òÖOã3ã—íñoã{]XêZœš†æšfML¸VDwùZòéŸÏ¹•¢ÂH¬æÜ †9ýÙÿƒ¶¿å$ìÂþÿêuñ¦¿—:þöð;ÂNÁðßqµL¢9fxU–;2¨ñqÁÕ•JQÀad£…êjštêº51QnVÄYÙ|ÎmšãêʦX‡%.Zq£M*q”b”¿{%ïÔ»~ôe/fì­mU™™‹1,ÌK31%™‰É$žI'’O$òjĆ>¤Ë“üÅV«‘ ÷ÉýÀ þªÉéóã­¥*sŸ•ÚT×þ–켯ÐùùÙFÞ‰yV>®ý‰<— ±Y,†aî±?ïí[ãð¯ÂÏjæKtz ôqÌÒÏ, ³±V9&áÑ ¹vRÊU¿1ÿà”^ÿ¾"øâdø 4¸ˆP—þ)Õ­ö°fOüKt=R6¢`á‚ ôŸü‡Å³èÿïl#p‡ÄÚö£Ë·—º¨Í#?:Föá|½ê˜Œyz3xLjyïˆ2Éi·/gK á§~XÔÌ*ÇV»oM(çpU%—%YYųÓÁG—êm­J·ÒíA(¥•”á%w&Ô¤öÒÿƒ’jg-poV9$‘ä$j dX«FtOhî­åÇ†Ç Í‘‡œÝÆã5·1™u¸`š Äšõ¤Hñ/”)âéÞ\¼äåÚG*ÇhbË:‡o<Æ8#VÔB6Ð1ý°‘^¨»G´­»S °[DWYIRJÇ«ÉÝÕ›nI(ŸÆ7F6µ[U+)h51A%^Œ Ñ6Êૃó#\ŒµÙ\ºÄ£|Ãâ+€íŒ0‹“(é‚När+z8XRég¢»|ÒÚ.‰]~;Y™ÏšµäÚÒm8Â=Õ'&¬´K]ï£E»ßÍ<ÆFÕU˜ãrÇ¯Ë +„@<¤·øÀñ ÀeöËä¶X¶3¿¶n?è77þOÿÏV¡þÑÿ¨§þWüiÑý£ÿQOü®ÿøÓ®•¥’Ñ+Yy{Ÿ~ï~ç?*mÊ^üž²”•Û~Kd–É+$’] Qi"rú„³™UããT–ì’Q”o ãýWäè x%@ Œ0‡ú9ÿ‚søe¼7û&hŒ©‰¼iâø•¥Ë»¼K|<7i»vç EUÿV¡šDÊ1‘ÿ›û‹¦–8“íFpIfÚ2]`¨Ú>Qâív1Ç%‘[•˜YŸ¼,<û>|"ð¾BÉ¥ü<ð™¹R6í¼»Ó-5 C~~bÂþòçsÛ{˜ãÈ6ã©Ô£Ã3—ÓOÚc3 Nf×;Rœ2ìÁÉr«>OišSœ£)iR1vÒ-wåðŠöµ6æQ¤•¢§R1¼]¬´…¬õi¶¶>¬ý,#:×õVŒH×FÑa•òø–öyµY£I>Lm¡F]7(ˆˆs´ˆ”ýwã¿ÛxÀ2ñì°ÇiàÏø‹Ä÷sJ» ŽÛú-æ«q,Š€ì…b³wu@v !G¾{ý4ÿ#Ó^Ì‘ùš×Šõ J¹>˦C¤Ù[0Bˆ¡Œ÷z´o.ÂÓ&7Þbž7þ Qã‰<û|ÕmäÙy¬xF/Z@.Þ6Ö4ß ]¸û½7U¾œŒV’+ù?„«žñ ¢;­ŽÍrü¢šIT’«Z­ "PнäªÔ›p¾²vi;ŸUNQ£†u]¹aNu]ô\©9kåe½¶ÛCø‹Ôõ [RÔ5K·ynµ+ë½BæI\Ë$——\LòHØi䑙݆]‰cɪ57þ«ùŸð¥òûÃõ¯õ^ŽUŠ¥NXYB*p§N(Â8¨B)Ê[F)%«vGù¦Ûr»ní½Ûz¶þý~}™ö/ü“þRûÿÙæ~Ëÿú»ü_ë)_äãÿ儸(Wì w?l¿Ù€ôôøÝàs_ë_Â_K¼=l?ð‚­,“⛋ºXø¦ýÖú÷>§‡Útqòö?ŒŠ(¯ä3èŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ˆà¤òc?´—ý“÷ÿÓÖ‘EðR?ù1ŸÚKþÉûÿéëH¢½Lð¥ÿ_þ“)î½?V!?ðv×ü¤ƒàý˜_À_ýN¾4×òç_Ôgüµÿ) ø#ÿfðÿS¯5ü¹×úàßüšþ ÿ±pæIˆP¡ýWý‘ü<û0üðÔИf›Á~!¾‰•RE½ñ¬×>0¸Yv1&X[\[w,ÁÀc`‚0‹µâÏÙãáoõÄ×¼qàO x§Q†$´‚÷]Òm5;ˆm!‘¥Ž('¸C=ºîga,‘,’<»|Æ,?Œ3ò1ãŒOUÃO†|E›céP…XÑ–# )âèe3Œç ÉN€«(Y5ì—+[KÝ…)F‚¥yEº4àù`æ•E(JqkK'ïä½ç.­¯äÅ/qh×WªQ6Çq«F ¨€!ñ¤àcl1®:"”<^Œñw¨­Ö´ß¡ñÁüëúÔ´ý™¿g[\·ü)/†Ó¹KOá]&eÚJž"žÖXƒe~ú p (!I¤°ýž?fÔ1ðGálo³à}¡fG_/ÌÀÄèÁ‰e•<¯–A W¹SŒð”«Kƒ\ªI©sTÎáÌÛå¿5Håuª&”un ]Zú¦r,µJMü8 øYðÅ#ãOøf8ãŽ0å†?²U" ¨Íµ¶|¸`6²“?ë®ÎKƒce»—¸ü<·ÑäWvå×µŸmöTKëuo§ü»Ž¿i>Ý-_ñ±öãÿ?Wÿ÷ÿYÿæÞ¢mBà1 -Ë Æõ v6< åÅ’ƒ>s‘ƒÁ$ìÚ/‡4èßì_ün%ÚY,|áè™ÈU*Ì«¦¢E“ƒ.0C Ë« ˆøSÀ0IæXxÂVó)ù.‡‡4X¦PÑ„ ·²O,¾ ’²Q¤B‡QS÷x8÷«Äµ"¬”u²áÛÝ5¢Riõê“Ye8Ù¼MIé·$m§/XÔ‹¿»e}5ù¯ãgn·ÿ>zŸþø—ÿšZU^rV;YÛíI¼NÇ€NÄmÀ$qŒZþÉÿ°|9ÿBχ?ðKaÿÆjiôý:a™tû ä(³·Ú a|£“óXççø3¦­‡ƒüo庢Á} Úùu‹ëýqd,#‘É6—v''hh;ÊİËæüÇ)¤~Ì߼ߕ?Žþ)XÞ¼ Å^÷I𦅪Þ\ÆéZµWD¸rÊBO¶J±Pß­:%¬Z\0ÙÉåºév–ú\QˆA‰ßG²¶Ñ"rB,„æFÍŒ•0¯ç;þ µãÄÕ>)ü ø}HðçÃýcÅ÷H¬ÜxÇ[þÎ[m î­·„ážRÈ™†{VRÁˆOÉ|ËŸxÇÂnQrŒsüNw&ÒJ/*¡‰Î!)¤½×íp”Ò{9òÂüÒVöóû,¾¶¶n”i¤žüò…7g³II¹-ÜocðrŠ(¯õ`øƒì¯ø'?ü¤#öÿ³Êý˜?õvø¿Ö¿Éçþ Ïÿ)ý„ìò¿fý]¾¯õ†¯óÇé£ÿ%?؇0ÿÕ„O­áÏàbëì?ô€¢Š+ø´ú0¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(âø)ü˜Ïí%ÿdýÿôõ¤QGüþLgö’ÿ²~ÿúzÒ(¯Sü)×Çÿ¤ÀÊ{¯OÕŸÈOüµÿ) ø#ÿfðÿS¯5ü¹×õÿmÊH>ÿÙ…üÿÔëãM.uþ x7ÿ&¿‚ÿìOý?\øœÇý÷þ5ÿ¤Ä–—Ï 'ñéü‰®¯ÂZ Þ*ñW†|/lX\x“Ä6ƒA—k¶ŸQ†Ë¸]£kdãƒÒ¹ˆ }Hÿëר|"ñ¶“ðãâ/…ašý¦o…á¼Â¾[BXœÉ`3 FE:øØÐ«õJQu%sU© QNrŒW2M¤®yÚ:‘Røy ¤ö´[\Íù$Ûv»²Ñ7d]–vÚu…Žd‹–eiag¨UŽÒÊÞ;khÕTªE(lœ}9à!Éúkáï‚ÿðRÿØ›ÅðégÅ}[ãGÁMíö_jMàÍâW…­eT*¾§ jþñRaáðtÛ›j2¦ß6_Óo…Q~È_â¶ ¿mÿ„¾#Ô¯¶ý“÷֖^ñ+3º¯‘'‡uÿiž IÔ !Œ¥wF<£æá ÖY‡ R,ã"⪎œi,VafôðÎ4b ê,U<ðÓ§ðþò\Sz»ÝGé©rVIÂ¥)ÉÙòB­+ËkÞ..÷÷l¶²ÚÇ“4›N6HÞꄦxÏá‘Û9È##?ˆ þD?_vØg_ž>›ñ+Ã×±H7C)Ñ/c†UÁÛêw‹0Êyƒ·Þ+"ëöø)·ñ‡å‡šK“®Ú¼x<ìHôË¥Ëe¥‹žÍ_5KŽò IGûFœíËõldnÉ%|6ºÞöMÛÊ×·‡­¹B|¶oþ]Ú)[vªvïk»ÛfŠêä°B±Ècw/ ˆ9m…$2ùgŽF0O%¸Ó5ô•çìñ:ÕÙÄ nоÜ[k>(rT‚Ë&óàå·ÆÝªéĬ’¼ím­³ý“~/j X¯¼ R»H×õ(·ˆÙú3M±®U2Ì7ÍXž)ËêÕÂÏ™a©S§Rõ£*µ"çkBmr}]©óQ†"‡,åÂUÕtÝJ0‹JQrpŸ#‹m¸¤ôWM^NKÞåÒ*òøoÊÚ1Ñ_VMû|i‰™R Ü€¹oâ ÇíQuajÁ³…ù•S$øòW_²í€ù^[ƒ¼ÇˆRXu.0É*iO3Ëàî¯*˜ªqJý”ùõ»²Ý+ŽTªE_ÙUŸhÆœ®Ú曆ÖÞº3çÙ$XÔ±äö\€Xð8ϦFHÎ8ª“”û$W/{n^K›˜¿³Ô\›¸"·KG“7Ù–ÐZÌ×FYnžã}µÓMo +³{uÇìÁûA£È­ðÓQóÇó®¹á”;ˆ,U­|E$n $§æÊ¥®Vø ñ«KySQøâd+¢Š(¯Iˆ;€Q,fœJwFÁR,v‚‰‚¹Öžq“TŸ5Lã-œž‘QÇaœ›iYF1œ®•î”R¼´vWO–t±ß/³jϕũI]{Òº[­“º^¶‘ä×w&VÚ¬B ‚ §FqÃFKd øê#"†Mþו€,êDm?t(6í:Æ$‚Eu¿¼âK‰¶úŸˆ¼5¯i–:V‹®\Çs©é7ö6ÿj»ÒçÒ­MuosHnµ"ÊŠìà£Ë‚>Þ ó9ÁC)ÇΆ/ Ý<xÑ„1eRue£.XÍêäâ´æ²ÞëC¢ªQ§K•59O“ݷ•ڵï.{»6¢·>„g2çÎÒI f K$†[ŒŒ›y"PlÙ©òÛøÿÿ‚®xÝüiûk|KŠ;‘>›á/ x;L@Á¾Îº7‡´ñ©BÌýèÖ¦Ôše*J̫гcékk>šæíFÒ4 ‹´÷‚°Ä¬Å¤Ú©¹U$fl?ÀÿÇï'Ä?ÿüu´‘ø»â‹¼CÿÙ…üÿÔëãM.uþ x7ÿ&¿‚ÿìOý?\øœÇý÷þ5ÿ¤Äž9UT)¯QÏSøcðÍL$CчãÇóÅR¢¿`¡›bhBùiNŠŒS‹Œ”b¬•âÒÚ×n-»]»Ý¾ÝõûÍ *І,bB‚X±8É$à9'¥n®‹~Q[͈3d²1s´aHÄn²X0(Ú »†ù{aáe^”é·{rITnÛ»5—vݕһlç«R•_kV0r¿*•Õí¾×ÑuoKÙu=gá¯íûA|xá?Æÿ‹#¶•&ŽÓÁŸ‹s¦iš¥¾y ¤¶×v³ÛÍh¥‰ãfSõëÁ_?à£Ïo¬¿µŠg‚%B\xSá­Áq ÞI%ËeC;Ü<¯#€ò30Í|ïð›ö/ý©~7½”Ÿ þ x¿Ä:Mð-Š'Ó&ÐájN¯aøS6ÌaÍþÉ<ƒŸfžÒq÷©Ô<-ágQFÜØÚ¸hJÊóµ™ß†¥Ž«ðî´i»{ÞÒTae-ï9SO–W|±¼–ê-µ‹bÿ‚ÁÁFaTEý£îÝS ~|•˜œ<²|:iŸ= 7ã£1ýcÿÁ6kß¿e„~?ñÿ‹`×üiâ›Oâ=FO xOF]JæÏǾ)Ò,${/èÚM¬mg¦ØYX«Çj…DQ™|Ç’i$ù;áOüïöUøHö³hÿ -|Y«Âñ ñÄ+´ñuóÉ )[˜ì¯b]Úmì&-§èvR†òÀQ²%O¼t?Í£Aoc§Ó¬í£Û 6žl)n¡v„·FÅ|‘äÅå Þî¨2Á¿’¼Lãâ¸àðœÀ9w ÑÁbjV©˜ÐËrŒ»˜S/gð™NÂ:mº‘sÆâ/+ZÞ§·†¥‹¡Îñ8‰Ôr*R¬ÜiÙ¦§Õ’Mè£(¨YìÛQ³ûvËã÷Œ#WY¤Ò. ªüÓéÂ6@3bš Œ ©É ´¯#rþÐ%“]7³ígbÓY]³Í¸ìHµ4Ž3€Xã#…sòZF»ÝÖ/XàŒÊé7ƒÒ[‡\Œ`daœcNší쑯&»a3<–Ë")†[‹uDf’G‘Ù€•¤Ü@Ä¥>™Û)aðÒ­O÷0Š—´\±½åR•f•Õ½šÜ´snÎèºn¤¥(ÎmNêðQj1ƒvÑÉ.g7oy]û¯U¹á¶í÷ã_Ù»ÀzÄo|)Òþ èË­.‘â»X¼O}á×Ñc¾`4ÝBÞá<7¯g<Ë5Œ³¾ØínOØÒ› «ù­gÿûºŠe’ïöQ´ºH"(¾6Íožrw3ü'º 08Èùƒ®TýåñSÀZGÅ?xÇá׈”6“âÝóHÌi9³–da©Á¹®´Ëèíu+]ß(¹¶wË‘_È7Œ<+¬xÅ~#ðoˆ-Í®·ámoSÐuH~m‹{¥ÝËg;B̪e·•â2ÛLÉíÞ9£%Iþ‘ð|0ã¼e¼EÃtñYÞW‹£‹¥V9¶{•|¯J1TpY®œ¥ƒÆP«íjû8ÉG†ƒ»G—˜c±tgB¬£M^›Œ©Ò—,àômÊ›kl¤Ûnì~ÿøÏþ ÓoâÏ x£Ã¶²´þÕ5ß ëš.âñêˤjZ¦qcgª¶>èÂú=>{¶µ Ôìåº0Çn·ÖÁšaüñO+O4Ó¾Í,’¸\í #—ln,ØÉ8Ëޤžj*+úçƒ|5ྩ˜Ôá,›û*Y¬p°Æß™cý¬pn» £,ËŒ+·‡?‰ÿ¯°ÿÒŠ(¯âÓèŠ( Š( Š( Š( Š( Š( Š( Š( Š+­ð¼¢Ö×Å—ëmaqsaáÈ'³:Ž›§ê°A<¾*ðŋ̶šµÝ¡”Ú]ÜÀ²4 è“>¬sM+»m£}ôI·Û·pz~‹±ÉQ]Gü%ú·üúx_ÿÿò‚øKõoùôð¿þþ ÿå;Cù¥ÿ€¯þL5òûÿàzÿON^Šê?á/Õ¿çÓÂÿøCø/ÿ”âž5ý±>|6øá/ƒß~9þÍ~ø¹ãïìøA~x×]ø!áoˆÞ5ÿ„§]»ð¿†?áðFº¶&ñü$~&°¾ðîƒý¦^lk¶wzFŸöBÞkt‹ÙÍúA?ý¼Zù}þž^¿‡}=Šê?á/Õ¿çÓÂÿøCø/ÿ”‰âŠ–>°ƒTñN«ðóÃZeַᯠZê> ðïÃÍÂçÄ~4ñ•àïx~ ½GG¶·›[ñg‹µÝÂÞÒ£‘¯õßë:V‡¥Áu©ê6–³‡yà ÿ“¾_ü_ééJŠê?á/Õ¿çÓÂÿøCø/ÿ”Â_«ϧ…ÿð‡ð_ÿ((´?š_ø ÿäÃ_/¿þ¯ôôå诚¿o¯‹~=ð?ìkûDø›Áº¦á_Ø|8Õ!ÓŸæþï3îZ+åøb/Ù×þz~Õÿø³_ø*oÿFÅðÄ_³¯üôý«ÿñf¿ðTßþŠ9iÿÏÏü’AwÛñôÿ7÷yŸWÑ_(Ã~οóÓö¯ÿÅšÿÁSú6(ÿ†"ýç§í_ÿ‹5ÿ‚¦ÿôlQËOþ~ä’ ¾ß§ù¿»Ìú¾ŠùCþ‹öuÿžŸµþ,×þ ›ÿѱ_Ÿ?šÿá·üÄ¿¼ãOÑü±ý|Bý¨?joÚÃw¾:¶øÅû5ý—ÇokûI|køÃ.™â«M'ƚ߆ío<=6‹iƒ3ÛGb·WúÍî¦Õ8ÉIÆwp‹“\­hš[¿Tµ®·vÞúéÿîó?mh¢ŠÈaEz¹®]iV6>Kdðç„gøVöwž÷º5õÜÓ]ßh×7sË=ÝÌóÉ$óÈåä<… oøKõoùôð¿þþ ÿå[QM§)]6¢­uÿo!'}{ÿÀÿƒý=9z+¨ÿ„¿VÿŸO ÿáà¿þPWŠ|ý±>~Ðÿð‘€øçû5üsÿ„Cû#þßøSÚïÁ‰¿ð‹ÿÂAý§ýƒÿ ü!K­ÿbmÿbk?ÙÚfþÒþÈÔþÇç}‚ïÊV›¼ì·|ŠÊû_ßêù}þž_Öôô:+¨ÿ„¿VÿŸO ÿáà¿þPQÿ ~­ÿ>žÿÂÁü ¢Ðþià+ÿ“¾_ü_ééËÑW|AñRÇÂvjž)Õ~xkLºÖü5á«]GÄøy£X\øÆž#Ò¼àïÁw¨èöÖók~,ñv»¡ø[ÃZTr5þ»â=gJÐô¸.µ=FÒÖm¿øKõoùôð¿þþ ÿå‡yà ÿ“ |¾ÿø¿ÓÓ—¢ºøKõoùôð¿þþ ÿå|]ðÿâ'Œ¼]ûe~Ö^×µ§¸ð×~~ËPøKövZn èmâ(>5êþ ¾³Ñôk=?N:¾¹z-†¯­Ím.±¨Ùéz™w}6™ h–– E5&›÷b¤ÓŠWNQŽIëy'¶×ö¿_ò¿ùþôâ¿à¤òc?´—ý“÷ÿÓÖ‘EðR?ù1ŸÚKþÉûÿéëH¢½ð¥ÿ_þ“9î½?V!ðvÙþ AðG'þl/à/þ§_+ùqÞ¾õýEÁÛßò’/‚öa_õ;øÓ_Ë…¦âªCÃ> „TRŽQv›o÷õüío+_ÌøÜ|SÆbþý¶?×õrO3ÛõÿëRç€?Ï¿4Ê‰Ï {f¾ú¾6½:n|íµd’QWmÛ[$íÔäåoÌб—uõ’ök»ay™˜Ìî:×÷™ûüý•¾ü3øWâo þÌŸ³wĉx'Àúψ|oñFÖ~%x‚?Ýø{O“ZÕ4¦ñŒoôŸ]\ÞÍx/ iZ-…‹¹0ئ$Vþ\àë_°ÿ¾=|&?þøj÷ÅÚ=¾»¢x[AÒ'³Ôû>â;û :ÞÖâÞ©Eg­ŽKInà(‘ÿ?øÍC<Ïpyu&iŒÃa(ËO„ÂÓÄJŽ-â!Ft^/Ø×¦¥JŒiT„#V#zó’ÕZ]xYÑÃÊUg‡Yµ¶¯J0rmÆð•›æ»jPøUÛéýåé_,uˆÛþ |?òÚ‘&ïYÓÖØ–+’’\j+ ÅK…DÅœ9@&ЋÇÿ ç!ï¾ ¤LK}7Å‹mÚ‹­´þusò³<‰$ næ79sürèõM"8.|/ñÄ:ð²ÛË¡x£XÑåÎàÑK¦^ÛÈ 7ñDø†e`O­é?µÇ}Ç%‡Æ¿Ë´f3©xªï_ŒçÆ=z}Nºäy©"·pA ÿ1Vá|]”jÂMɧÍõªJË–ÉKÙK¥î¢ôÑëͧ ñ´æ×<%i^ Ó¥6Û¾¯žN÷ní«7¢óÕ¦¡«| Ôܳx/ÄÚQiØ[Ë¥_È»aØÑùÏ6œÒ+JI¤aP;BŒø¬>ÝÊøOiñƒQs¤XNa†`Öš¥Ó¥K6äVÃÈAÇó/cûqþÕ–“G7ü- -rØùZ¿ƒ< ”n_›¢øgL•‚°Íæd-!2ŸWÒऴ’Ç¥¢|)ÕáN §Ã>'°¾fOõ“Zøãì;°bËG¦F IßÞ¨‡–yFcNJÓvK–8…Í-SçpÕZÚõ•Ò²vq­FSns¤£m¡&ÚÒÊÊ--5º¾Í'vBÐxcàÜÏ—Åib eφõÖP¤”ýçÙm.ä*7y¹…Káä“ÞµøSðZûrÅñgKQµ· ËØ©h ýÝ[;ÆXn ŽGáÿ=ñD)zÏÁjÎU¼Ë7ÇZ—‡Õ ¡ŽÊëÂ~%gWl#©Ôb(Ì .ï)=Nÿ‚šø Æ_\øQãKV‡uŸk®Ã~ Ögð”JÁJ¶Ýø;\A';ÁfpÓ“·ä”*^Þpç»jöÕïÕ»r£Íx,=HèÕ¥RŒ®íºsŠ²ëµµÙ¦~´|UøYðwŸüAâ;âW„¼EªéÐÅ™ éšªM¬]ÜÝÏh4ß-. ªÈno.öG“o$QOö…UOËL×÷ÉœX¶¤íXÄr¢•MÌÌØÃmÞAc´6W›üAÿ‚„ü$ŸF—P‡ÂŸ¡ŠÜLÑé×W„ÒâY®Jª/˜ž.žÉ#„ÈiðÈFFaxÇöÿÕ/á|ðþÎÍäpðê>"Öæ½tÊR9´}*ÊÂ"B¨G1kÓ#‚ܰ¤¼<œæá‚ÄYÃÙª˜Šj—*š§)Æ›Ä*Q»‹JRJî-í£]Ž®œT½¼UýÕ[Ú´Õ´´eRMÝ'Ë¥½¬Ù÷MŤ¦GÀPTìä2’¬xÈ Ôvœdõþlÿà§ðø?Oý¦µt8#‡YŸÂºñ_“'_’Ò}²ÉQ´MáÑá⨃kJ%ŸÌW’hßì?~Ù5_0ÇâË%ÃZ—mnVHÂ…[ÝZwY5EÿQ©£ˉfbf/ø¹ñ×Å—Œ~*x³ÄZ¾»â-RþæÐ_jzíÆ¡x×6º}¥¤¶ó^\»É!¶x %2¦Ü*˜ˆ¯ÝüÃfü7ÆÏjÂ(¬§‡–ª¹WXŠØ7uÕ8û/d¥I×JU•Z4­ YÉyy‹ÁbiÆg'^iÍÅÆTãY>O†q¿´JNI§8ÊÎ|¯‡Æz8ç¶y§SÑ…sèÇyäg×½YRpyöã½i`¸Ö®%EËOXó>YÉhš‹I¾k5'ªµ·].xÏ“·3ÓÐØÈõ-f#FOùõÿ>µaœóý?—Ò¾ žCËû‰EÊö´ÓK•6ÓÓ{+®Žý:äéÙÚÿö¯üŸþRûÿÙå~Ìú»|_ë _äçÿåcÿ ý„FzþÙ³¿üÖï×úÆWðOÓ2´kq7¸¦­‘cÓNÛÿhGk7úSÃÑq¡ˆ½µ«ý (¢Šþ3>ˆ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+¨ðÿü‚|qÿb½§þ¦ž®^¹Ÿ|iøQð'À^1ñ—ƈøw᫽;JðþŸ©øŸS†Áu]z÷Åž¾¶Ñ4kf-{¬êòiÚf«ª¶›¥Û]ÞE£é:¾¯,1éšV¡umPMÊÉ6Üd’Z¶Ü]’][Ûæ¿4tÔWÄ?ðò?ØgþŽKáÿý÷­ò¢øyì3ÿG%ðÿþûÖ¿ùQUìjÿϪŸø¿È.»¯½«â_·íqᯠ|Pñ·à?E¢Owû1h~Õoì<ñãâžñŸ£ø¡â›YôÛWâ|8ý˜5>?ê?àñ_í7¢ë?|sà=[Ký‚(¿à£¾<þÆý£n?†?ðº~ øKþgüóà'€ÿá|]¥}§öý¯ÿµ¼uÿ!ðÿü)oØó[ÿ…³áŸøF~6x›þoøA¼1ªÿŠý¨¾Ï㯈îÿáSxƒì_ð‡øçôïþGû ÿÑÉ|?ÿ¾õ¯þTQÿ#ý†èä¾ÿßz×ÿ**ã ±iûD­É.;ë½µëvÚkK]×ßÿúìÏ‹ÿk?Û[âÂÏÛOᯂ|ñ[Á>Ñ4ÿŸ²gÀ{öyø¿ñ‡á'ƒ¼Sñ÷Jý¡~+ü5ð§‹~5|ýŸ.ÿf?|wøÍàŸ øSãMÞañSÂ_¶7Âø{ãÀ‰Zv½ð—ź'Âèÿþyñ'í ñâçìÑðûZOÚoDøíûEx‡âüGâ'ÆÏØ÷ĺ/ü7áÏÙö“¸ÿ‚…~Åwmðľ |,¸ñÏì¿¢h>9×¼wð¿Uø]ûYhß´íâ+ϯø6ûQÖ>ü{µñçê·ü<öÿ£’øÿ}ë_ü¨£þGû ÿÑÉ|?ÿ¾õ¯þTU(Í(ÿ³Îë•ß‘ëoûrêþM?1]_â]z¯/òüOXý˜<}ãß…VâŸë~&ø©áoYðïÆ½'Å^ðçß|8ø«<Ñø«]øc«ü<ð¾±â}3ÂZ'„´Ïèp|-øëâ¬>1ø-sð×âN—ñËöÐ|k¤|tø‹ô5|Cÿ#ý†èä¾ÿßz×ÿ*(ÿ‡‘þÃ?ôr_ÿï½kÿ•›¥U¶ý•E~œ’ÿäP¼?à¤òc?´—ý“÷ÿÓÖ‘_oWãŸíÍûs~É?dŽþðÇø“Åþ$ð=Ŧ…¡Z\_Áw©ÝÁazöÖÏ{akn× ok3C L²\È«on²ÜKOûDã(Ò¦¥EûJ®ÒM;rÒÖÎÚi·g}æÏ”?fù(ðP¿û?û?ýv‡ü.¾¯¯Ãýgþ ŸûþÄ´Gíáð‹ö€ø§†~#럶FƒñßÂÐÚF×–þ ÖÿàßðNÿ h:ýÅÎ¥w¥iÒ[kZïƒ<_§ZAay}{¾½“R¶°‚çJ—P·ÿÿÁ0ÿè´Oÿ€þÿ梮tjÍÆQ„œ]:VkgjPOñLJIhßWùÿÁþ¬ÏÛZþe`ð׈þ ü:Õ|IáÏë~&øWûbÿÁr|?Ž­<9¥_ê3|$ý¡¾ÿÁt|Kjÿ¼m¨Ïò[ü.øÇðCáÂ:ŒÃ\ðΉðçâ¯ÂŸƒV>ð?ŒõïÚcâOŒ|õ¯üD#ÿÃÿ¢Ñ?þø{ÿšŠ?â!ø&ý‰ÿðÃßüÔS…*ñÿ—Rwqo§Ãv¿?•µL/§éÛúûö³ ~ÖÿðÅžý-þ.x[횀~ ühÿ„çö‚ý²|û?ülð·Äßì/‡~Ó9|fýº¾üGý¡Ÿ[ýŸ|sá­öïøCâÏÙª CáŸ<9ðÇ!øwÿÖø‘ð÷öHÕ~=i¾ þÁøå­üLøWáŸÁA|.×|9iñgà'о|A‡ötðçÅß|4ðV£ã_Š?í|ñ³á·ìóð»Dñü!ÿ~$ê?<5â» ¯…_¾"ü_¶ø5ñŸAýžücáý/Ò¿áä°Ïý—ÃÿûïZÿåEðò?ØgþŽKáÿý÷­ò¢š§Q$®Í¿†J÷²iû¯F—–ïqÝw_zÿ3óöMý§?k/Ú³ã‹û>ØþÙ^ ƒÁÞÿ†À±ñ?ÇŸÙ×Sýžÿiíwâf•ð»ÂßðKψ¾Ô<ñÆoÙ»á?À‡ñ·„üWû]üEøwâ cOý‘í<Û=oá¶±ðë]øÏ¤è_´¾‰ê²×í¯ñãî¯ðwÆ?j=àÅOhŸ±æ»ðÃö4ð×ÃßøÃŸ´—Ã?Ž_³'ìáñkâÅü3Ö4?þ×zþ‰¤|Oø¯ûBü;Ò¾4|1øÏ¤| øaðüfð÷‹´‚´Bxëî¿øyì3ÿG%ðÿþûÖ¿ùQGü<öÿ£’øÿ}ë_ü¨«q›¿û<Ö–VƒÑݶõ†·Ñk²ZXI¯æOn¾ž~OïÖçâÇ‚?i¿Ú«ã¯„|Ÿþ-üñöïÆÏø&×~-üðWÄ[?ˆß¿eóÁM¿a‘mðož ð?ìyð+þCû#þ?Š^×¾þÕ¿i/ÚW×~Úi^ñž»ÿ [ö„ñ—ˆÿ¨Zø‡þGû ÿÑÉ|?ÿ¾õ¯þTQÿ#ý†èä¾ÿßz×ÿ**g ’µ¨N)6ì¡+j’þUØi«/y?š>Þ¯ˆ~ ÿÉó~ÛßöOÿdý2üj£þGû ÿÑÉ|?ÿ¾õ¯þTWû&|Tøwñ›ö·ý´<{ð·ÅÚ?¼!¨øöO´´×tIÚkW»Ó,>7Y_[H’Ç Å½Å½Ä,¯ Ì0ÈÑ´W­o<È£Nq…W(N+Ù¥yE¥kOK´µÑŠéµfž½ü™ßÿÁHÿäÆi/û'ïÿ§­"Š?à¤òc?´—ý“÷ÿÓÖ‘Ew`…/úøÿô˜=×§êÏæþˆý“jŽÿðPƒ¾/øû4~Ð|'§~ÄŸ|7¨xŸáOÁ¯ˆ¿<=aâ+?üXÔîôÝkÂÖ4Û]j×MÖ4BãKžæ;èluM:îH Ûi%þoáÜðPÏú0ïÛ7ÿ{ãÿ0ÕúÛ}ñŸã§{y©j_þ%jŽ¡uq}}ã¯]Þß^ÝÊóÝ^^]OªI=ÍÕÌòI5ÅÄÒ<³Jï$ŽÎÌÆ¯ü-ŸŠŸôRþ áeâ?þYWô/ x÷œðÇåY!Ë1Tr¼,pÔñ«âáV¬Tç>iÆ‘;Í«GK$y5²ºuªÎ««8¹»´”l´KK¯#òsþÇÿ ÿ£ý³ñ¾7ÿó Q¿ü‡þ y°wíš{ɯ|oÿæ¿YÿálüTÿ¢—ñÿ /ÿòÊø[??è¥ü@ÿÂËÄü²¯r§ÒW>« pÖN“ê±8Û¦µOécÒÿŸÕ>èÿ‘ù&ßðNø(iòa¿¶vG?òk¿?/ùªÿßÿ‚‡Gü0gíŸíÿ¹ñïþÕúåÿ gâ§ý¿ˆøYxÿ–TÂÙø©ÿE/âþ^#ÿå•yUþÍvܸ{*\Ñå’XŒ[ºÛ¬·¶…G)§ù}S{­#þ_Ó?)ôOØ'þ má¹<Íö*ýº4vÎYtïÙ³ãݬRrI–”“’²£©<ã<×­èß³ü‹K —°ÿí‹®D º§ì›ñ­eTVãOð5Œ¬ä‰.MË9`௿álüTÿ¢—ñÿ /ÿòÊø[??è¥ü@ÿÂËÄü²¯¿Œ8¼Mý¿ dÕ[w末¹ÝlùÓS¿£FŸÙ´µµI«ïe}õÑo«×Ìù_Eø1ÿ#ŒG¥ÿùý·ìSqß.™û5|q¹‹-ÒO²Íàk=£³,¬Þ»˜ˆÇ¿xKöqý½î`W¸ýŽÿl´$r°Ôg‹öÓ.åRX®¼‹çfL³©fFBÛõ_ð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYW‡ˆñ¥[û,Bí]G‹«–Ë–´çÕ_ÞrWé`ym7ÿ/$–ööt¾+ÝIûªïdù®šZ«Ý¾¢ßöiýº6(“öIý¦‘òþÏÁˆü' ã$C+1 kÇû8~ÚÀ~÷ö9ý¤Üà`ÇðâüC<î8o ÌH'yÉläpð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYWãŒCÑå9sóJ´Où÷8.—Ûvú]5ý™JÚÉ¿>[?ü’Q_‡á¡ÔøŸöcý³µ=îÎ?Øßö¡W”A¹aø ñfg*hæ;Aðj6ÆdÆªî«–ß ÌgÁuoØïöã‘ìeûWºå¾KÙÏã†E(ÛcbžÉQ‹yQî ²ÈWÔálüTÿ¢—ñÿ /ÿòÊø[??è¥ü@ÿÂËÄü²­(ñî*‡Á•àV¼ËßÄ;;$Úæ©-]·wiY-‘/*¢Ýùç~ŠÉÅyÙ¶Ûõvî™ño?d/ø(oØæ¶Ð?aoÛ*{Û•x¢º‹ö_øÛ2Z#Œ=À+àr‹"¤äF2b¹Pÿ½…^7ù„ÿÁ8à¢.Ìïû~Ú.îÌîïû/|qfwbK;³x–f$’ÌI'’I¯×ø[??è¥ü@ÿÂËÄü²£þÏÅOú)?ð²ñÿ,«ê²¯s ¦œ£C!Ëg9´êU©ˆÅsÊÛ-’]º¶÷nâÊ¡gzÕní¸Ç¢I%¦‘JöWÑ·k+%ù(¿ðNø(hÿ† ý³¿ñ~7ÿó Sø'ü0?ჿlÞ?ê×¾7ÿó _¬Ÿð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYWÔaþ‘ùæZ5”?uE_Ò+[|ZÝÙ¶ûzòzOWZ§Ýò?(þ Çÿ 'öý³9ÿ«^øÝÿÌ?ùÅNŸðNOø(P?°‡í—ÏýZÿÆîß÷#×êÇü-ŸŠŸôRþ áeâ?þYQÿ gâ§ý¿ˆøYxÿ–Uìa¾”üC†ååá\–\‰Úø¼rÖW»v~oN—ò!ä”[¿¶©ÿ€ÇËË×úZü¹ûþÁ?·Gƒ¿nØ»ÅÞ.ý‹¿k/ xSÂßµ—ìçâ?øŸÄ³ŸÆ ÃÞðö‡ñƒÁÚžµ¯kÚÖ§àë]7GÑ´}6ÖçPÕ5MBæÞÇO±·žîîx`†Iý6ëüñÿálüTÿ¢—ñÿ /ÿòÊø[??è¥ü@ÿÂËÄü²¯Ç¼Vñ0ñW0Ês Ã.Áå3Êpuðtéàç^´jƵu]În¼“Œ¢×*QÑ­^§£Âà •E9)7++4­eeó?ÐâŠÿ<ø[??è¥ü@ÿÂËÄü²£þÏÅOú)?ð²ñÿ,«òŸ¨Óßü“ÿ·;½§—ãÿÿCŠ+üñÿálüTÿ¢—ñÿ /ÿòÊø[??è¥ü@ÿÂËÄü²£êô÷ÿ$ÿíÃÚy~?ðô8¢¿ÏþÏÅOú)?ð²ñÿ,¨ÿ…³ñSþŠ_Äü,¼GÿË*>¡ÿOòOþÜ=§—ãÿÿCŠ+üñÿálüTÿ¢—ñÿ /ÿòÊø[??è¥ü@ÿÂËÄü²£êô÷ÿ$ÿíÃÚy~?ðô8¢¿ÏþÏÅOú)?ð²ñÿ,¨ÿ…³ñSþŠ_Äü,¼GÿË*>¡ÿOòOþÜ=§—ãÿÿCŠ+üñÿálüTÿ¢—ñÿ /ÿòÊø[??è¥ü@ÿÂËÄü²£êô÷ÿ$ÿíÃÚy~?ðô8¢¿ÏþÏÅOú)?ð²ñÿ,¨ÿ…³ñSþŠ_Äü,¼GÿË*>¡ÿOòOþÜ=§—ãÿÿCŠ+üñÿálüTÿ¢—ñÿ /ÿòÊø[??è¥ü@ÿÂËÄü²£êô÷ÿ$ÿíÃÚy~?ðô8¢¿ÏþÏÅOú)?ð²ñÿ,¨ÿ…³ñSþŠ_Äü,¼GÿË*>¡ÿOòOþÜ=§—ãÿÿCŠ+üñÿálüTÿ¢—ñÿ /ÿòÊø[??è¥ü@ÿÂËÄü²£êô÷ÿ$ÿíÃÚy~?ðô8¢¿ÏþÏÅOú)?ð²ñÿ,¨ÿ…³ñSþŠ_Äü,¼GÿË*>¡ÿOòOþÜ=§—ãÿÿCŠ+üñÿálüTÿ¢—ñÿ /ÿòÊø[??è¥ü@ÿÂËÄü²£êô÷ÿ$ÿíÃÚy~?ðô8¢¿ÏþÏÅOú)?ð²ñÿ,¨ÿ…³ñSþŠ_Äü,¼GÿË*>¡ÿOòOþÜ=§—ãÿÿCŠ+üñÿálüTÿ¢—ñÿ /ÿòÊø[??è¥ü@ÿÂËÄü²£êô÷ÿ$ÿíÃÚy~?ðô8¢¿ÏþÏÅOú)?ð²ñÿ,¨ÿ…³ñSþŠ_Äü,¼GÿË*>¡ÿOòOþÜ=§—ãÿÿCŠ+üñÿálüTÿ¢—ñÿ /ÿòÊø[??è¥ü@ÿÂËÄü²£êô÷ÿ$ÿíÃÚy~?ðô8¢¿ÏþÏÅOú)?ð²ñÿ,¨ÿ…³ñSþŠ_Äü,¼GÿË*>¡ÿOòOþÜ=§—ãÿÿCŠ+üñÿálüTÿ¢—ñÿ /ÿòÊø[??è¥ü@ÿÂËÄü²£êô÷ÿ$ÿíÃÚy~?ðô8¢¿ÏþÏÅOú)?ð²ñÿ,¨ÿ…³ñSþŠ_Äü,¼GÿË*>¡ÿOòOþÜ=§—ãÿÿCŠ+üñÿálüTÿ¢—ñÿ /ÿòÊø[??è¥ü@ÿÂËÄü²£êô÷ÿ$ÿíÃÚy~?ðô8¢¿ÏþÏÅOú)?ð²ñÿ,¨ÿ…³ñSþŠ_Äü,¼GÿË*>¡ÿOòOþÜ=§—ãÿÿCŠ+üñÿálüTÿ¢—ñÿ /ÿòÊø[??è¥ü@ÿÂËÄü²£êô÷ÿ$ÿíÃÚy~?ðô8¢¿ÏþÏÅOú)?ð²ñÿ,¨ÿ…³ñSþŠ_Äü,¼GÿË*>¡ÿOòOþÜ=§—ãÿÿCŠ+üñÿálüTÿ¢—ñÿ /ÿòÊø[??è¥ü@ÿÂËÄü²£êô÷ÿ$ÿíÃÚy~?ðô8¢¿ÏþÏÅOú)?ð²ñÿ,¨ÿ…³ñSþŠ_Äü,¼GÿË*>¡ÿOòOþÜ=§—ãÿÿCŠ+üñÿálüTÿ¢—ñÿ /ÿòÊø[??è¥ü@ÿÂËÄü²£êô÷ÿ$ÿíÃÚy~?ðíkþ Gÿ&3ûIÙ?ý=iWñ;wñ;âMý­Í…ÿÄ/^ØÞÛÍiygwâÍzæÖîÒæ6†âÚæÞmAážÞx]âšQã–7dueb ]T){8ós^NWµ·IZ×}»“'ÌïkicÿÙPythonCard-0.8.2/tools/standaloneBuilder/doc/pic6.jpg0000755000076500007650000023510510231140007022416 0ustar alexalex00000000000000ÿØÿàJFIFÿÛCÿÛCÿÀJX"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ûþ ÿ…ý¥ÿàžÿ´¿Ãÿ‚_¾~Î^!ð޽û7ü/ø£}ñ;áv¥â_Gâ?^x×HÕ!SÑ"øã?éÚuÖ«¤x‡A²Ôå´¼ñ„üY¡ÛêÔ<çöYÿ‚c~Ð>¸ø›ðá·ÆŽŸ¾Á>þ xçöHý˜Â>/|^³Óþ8ÿÁL?mý¡¢o€_ þ=þÌÿ¾-Ã3ø×PO…gYÓ?hhü௠jßðšø¿ÄÿïGƒ³ø'ûÁ 5[/ÚoâïÆ‚?ÿg¯„ß²WíŸáüyø_û[YþÓÞ ø÷ðßö?ý¢ÿeÅðÇÀ߆íàŸƒ÷^!žõo¿mOÚø‡Àw±jzÄè¾ øSNÕ~'øöÿOÕ µñ‡Éÿ¿fo‚_±Ïü7þ ]û5ü+³Ñ->#|+ÖàœWís'†õ‰:÷‡5OÚÇXø«áÏ|Bñ©üJ†ÚâmÅ~×>x—I‡Âz~á->ÇU‚ÂÃþ"µñ‹§}f,ð³‰Å`¨p hâ°Ùf#2ZÁ:YC ‚¥Ž«Eâ©cqJt1ydêÊ©C7Ë*'8âá%ä¼GR§JµLö¥S :öU¹ê§:Ò¡ û)P¦Üe:8…)A·„ħÊéK–ÒÁÊ_·kŸ„?±¬`n,৉à åpw|H”Ä¥†ô\$¬Í žÓF/ø9öè½ðö8Qßþ,§‰r:`á¾#.AËv²íÕÏŽÛô&Oˆ¿²ÿíÏÿÑ¿à™ÿ4ŸŒ¿µa²ÿ‚˜ÿÁ@~+x«Ç_óÀ ð[áï‡>|ZÐôÙGö~ñ?ƒ~2xïâ=ïÁË?‰´5öâo‚<ãÀ> ŠãáѼ»‡Â_~¿²‡ìqûPü7ðÏņ?±~³ñKTñ7üOöTý–~%üñ'ÆŸ¼Eû:~É:¯Á=‰_µ¹ªü¿ø®èÚ¿Å?‰úg޼M©|Jø‰á“ð;Â׺Cø7Á^ðΛáMVÆNU—xqK S™xt°2¥‚Ëó ûF¶êÙ¶/„ËÜjã1¹n"3¯ý™Œªþ³‚ÃÒ…:qQ«9â0±­¤ëñªÂn öªU«Ð\ê¤j{L-,=LBp£G FšÄQŠöujMÊNN1Tê¸rƒþBý¹OüÒoØätÿš)â<Œ€{üHrG¨Ç8;‚Oü}ûr8b~~ÇgŽåø+â=ªDR8 ÄW9%r9QµqPL‘}‹û,~Æß±?ÅÏ„¿¾ øŸÄÚÍçìí£ÿÁuþ4~Î:OŒ4¿ÚGÇÖ¾ ý¡ü àÏÙŸâç> k~#Ñàñã~Ï÷¿¾1jÖ þAñ3àŸÃ¿‡~2ñ€ît ü>Õôø‚]{Sò~ıߎ>&Ad¿°ßí]ðŸâo…ÿbÛGâgƒþü{øQñ¯öpø]ûaþÑßíü9­|ðoÁ‡:ÿí/ñóö—ñ¦·§ø?Æž!Ô>)øá·í!g«jsxÀþ%ðí§‡ô[ÿ躛XO #_†«ÀÒ…L,jÕ“Xjj„>¹ËQÊ®aAÓœþ¥Sžœ—û2«Fx™Q¦êʉœPéÑ©íIUq‚½I]T~ÅJ)G>ekIÂj’›äSò˜¿àã/ÛÉ ð£ö=¿¼Fv¯˜Ê¬Iøƒ‚HÎU„{Z)…18´º¿ðqOí¸@Ýð£ö@SÆGü)Á?W dà§,çõ7ú7ŠWþÿûH|8؃CðÿÄÏÁC£ø…ñ#öd·Ð?jd׿dŸ‡>#ý†­`ðÿí7©x?Xø±yñ—Â9ë~"Ð|Yñ÷^ñ—Á›Ûûï%χn´=3JÒ<5wþéã_†~:ýœþ5ü*ø³âm_Âð~ÁþÿÁ`þé~ð¤º÷Œ<}eû9é_Øß|%«É­ê:7‚îtkéð×ôÖñüiý¦‡ìýwðûö¥Ðoÿjm/àGìÏðWÆ1ðÖ‡eñ÷öÈøÕâ_‰?gh<_ñÖMNÁWáW‚<ᘾø;Z»ñï‰áñ§ào†:o&á¦*t(âxƒ«Šx'„:”êQÆcó¼±)b«`kÂŽY3Q•iÔÃÔÃ,‰¢húwî5 [WÕu ›{7M°·žööòxmmà’yDcôgÀÿðIoØëXø—ðNñïìëâß ˆnoŸ²÷´¼'ûA~ϾøÙà? ~É_þ)øgâ7ƒô¿ˆµGíñÄ>·ñ÷Âë KáÇÅoüSøy¢ø¿GÔÖ8,.´ªÖ£‡£‡UqØœvF¬çšFpöµ2üMyÔäT¡‡P‹¨±uiaZRâšu°ô«ç<޵JQŒêT©ËB޵iÅGÓäXŠtÔT¹ÝKµcRq­ÿÁz¿nß kºç…¼YðKöbðω¼3«êZ‰bÊŸñwünrWceÎÝÈw&ÒŒw¦ß6™-†ãnÞÛ>uýâ/'ìë…;6º?-c–'ËÓþï áÏâ°8,[á\®œ±X<6&PŒk8ÂUéB£Šn­í6“vm-WoÄ9íõ©G4Å5N¤é§x&Ô%Ê›µ7fíwk}É[÷LÁ}¿lrä˜þʺ|Õ¸çÿÅuŸnƒ‘È8ŽAÿóý±ÏüÓÙ@qÿDsVàã8çÇßòç!Ôr8éŽ w§è0@ávâ”cøqÇR0GÊ8ÿV¾œžÛqÆ6¦ñðË€¿è—ËvŽð­Õ+ÿËÏ^Þ‹u•>%ϯ™â^½áÿÈy/»um?s¡ÿ‚ôþØR0 ðÇöURX‚?áNjß(Ý(“ãNX%€S“µ Ïg}?à»ÿµóŸ†Ÿ²ºž7ðwTr3ÁÆ[ÐåP‚¬# D?‡V«†Qµ× ÷Yx_žCÉòFçýÞ[ƒ·ÉÝ”ò¼Ý?f!…Q‚6„ùJì òW÷0är6¦Æ ¸‹ËÙkðË€”´áŒµmökw_ô÷ÍÿÁ¶™Ï‰³ôݳLR³VÖ;_þ½¾Ë«Ñníuûd?໵é?òMeÓ#þö¥‘œsÿ#Ÿ äã§Ý9ÁÜxÿàºßµÛ»á§ì·Ì¿µ"»ãð™ÄíÈ$ Â0b ´‘~((äqŒcŒr9NŸ'Ý8ã¦6㸊Ô# [k¾uòÿtí…QË|»Õ·&ÓÉ2xgÀvñŒe»¯³[·ý|_×N‹UĹó‹ÿ…QVÍ1+Nð]÷cÙtV²Õ²«ÿªýªÈ¾þÌÊq–ð©.ŽÓó‚>)@Ø*?»£yŠEÿ‚ÓþÕ$àü<ý™ÿ„w?/ÍŒŸøª³Ó äã÷‚Çè×hQ°&ÕsA…>\y+Œg+À'äÛ˜l ç§B:t0#oN1Œ.wËŶqðÛèšË¶f¯xÿÓß7Û׬bŸçî×Í1O^ðÿå~KîÝ[OØ(à´µ<¹'áïìÐ#'þ-ÈÀ(N@o€Ø#'.˜UbÅTK$qÁe?j'o‡¿³rã9ÿ‹M>AØp|F2ÌAà€ :«—X¿-©Ø¿)O™†>LåO”ŸÝÉýä{Uwf?/͵޷\ ù{pɌƜä¯ÊÛr>îÀŠ›cÛåÁ5<7àeøÆ²å§òÖ]¿éê×îë£ØUxŸ?‹Ó4įG˧/’éÛn¿®_ðøïÚþ„Ù¸uÎ~MÀùñÉñ £ íÆ%~*Aÿ‹ý§‰ÁðìÞ¼wøM7HÏüT™ùº.@Á9P$0þK㱌œc§ßä‹óqór»qÕ6þât#€0UÎ2'÷ÅŒ' ±€9ËÝl£á¿5ÿ$Ö]·òÕþîÿ½}ßUèʇçî÷Í1[÷‡ÿ+òìöÙ[Üýs‹þ ÿûM;a¼û:uÁÛð¢S·.N¼ I*…]`¤\-¥Ñÿvý¥ˆçÀ³¨ r–;N•É׆ìc®#¨6ÏÉ»tÃ(òñµ‡ >TÌ‘ó!~S·‘±6H a<ºv². ª»WTd&¾@|µÈàáx…Çîò—‡<­n˵µýÚ½Ußü½}»m}“lÆ\SÄ Zf¸­ÿšø|—ݲ¶Ÿªcþ çûJwð'ìì9?óJË÷ºÿÅ@@<ºÀãç1Z‹þ ÙûII×À¿³À鸅,6®íl#àÈ€ bí¬ïkùT@0On$üÃh猞6Ÿ»³0h[/Cµ~R§%v˜ùc¸7’™—wúÔÙݺ#Ͱ‡gÿÞ_ºû5ºßü¼õêúè—ëâ|ýA¿íLMÕµ¼<¿¹§þK·[Y~¬Gÿ`ý£œe¼ û>§LçáXàíR8:Âä6[i;HÚª¹‘!°?à«´Yÿ™ö~¹øV™{×ZPqŽyHù¼¿ËËtÚ£÷{1ÆXr¹HøÈO‘öüƒåòÂ"ìg•my?‡õà½ßbdñƒó c9]¹‹'á×s[ý\Ëíå«å×Ú¿Ïî1ñ2_Ú¸«[¼;ÿ¾ž[o§»úwü_ö‰v øàùXü¿ ÓªÇ'Ü9ʨùNæŒyŒ_ðT¿ÚÛ à€`goÂØþP\¨-»SRxà‚¨UІۋ…³ü¼ˆeÊNÏL„nHòäé·®ÕÚW;¢Ù¾ßjÝ0Ã÷`m`~Q€Ÿ¼Q¸³Ç×flMŽ€~ïÈÛ¦’ðë‚-øÇ2ÿü·dÿçïvûöòZOŠ8%lׯçü ²ï²Õl~›'ü ö‚#Ÿ|Î9Ûðºà’3ý«’28$.@9 ól—þû@ЙðzÿÅ­ƒ€sŽºªäñÈ8Æì|þ_æÔc  a@Âò«…<“ Æí\κ°@0sÓ÷"òqó}ݸþ ¿¹Î>ðKµøs/Ýýš»&¿é÷êÿĈ‡ñß5Åtë'ü·w·exþ”§üßãó|ð%?¼á|A™G;µV9AÆå$…Ìj'kMÿय़Ÿ–ðgÀÄ;³ðÂÛ áHÚù7)ËsFÐỦæÄ)‚¿»Û·çhðÒò[È'äÀùÓ`F}Ðù>e†Õºmòöà–tÊGò§î"Ê6Üõ6"mg•mðó‚’Mpî_ðßá«øþûü½{⎠W¶kŠVi/z=ãýßÕÛ²¶Ÿ¢£þ Oñߟø£þñŸù¦Ÿ.7pßñ0ëÆOAÁÎ>m“§üã³σ¾q»‘ðÂÓ #ÓO'nîv#pŘöÿž uãÏo»÷¾÷ÉÉã9ÀÆ:®ßÝZ‰xc°ð2£äsÈòŽìÜɳËc˜¶y–‚ðó‚¹äËïoå«Ñ¯úx¼úkײ¨ñG;ß5ÅZëíE/Uÿ¥y[K/ÑH¿à¢ÿœÞø$G ðÊÐàU2OÚ3÷Xä2džƒmap–·Gü?ãqw„¾ «c$†v Á$ö HÈÀ%W=H^vþ|[&<°¸e;BäßÃÏü{|¤ìÉbØP¯îüŸ/OÖAµTmTÂcjŒªáXmSå¯Sµz…ÇËŒ¼>àÅ'nÀtû5_EÞ«þ½I|QÄ_ð«Šû?j+¢þê캯‘÷·ü<3ãg9ðŸÁaŒçþ-–Ÿ2þ·k’6ŒŒŽ’£yŠìðP?NÀ7„¾ Æ Ãøiaû°^UËfE ·hÜ\l±EÏà01ž6ã=¹\ä|«–瑌•Ù˜5-“k¡òÂmu9‘ÕbY>fÿFMÄlÃŒ»Y³‘»N©x{Áj-®À^Ë¥[ôÿ§_’~]ïýgÏì¿áW{7ñG´-ö>íÎÖ_|Gû||f~O…> ¨ÀÏü[]<Å#`‘£$eœà©@ ‡.‘N?o?Œg?ñK|ã?óM4¾0¬pq1çŒö8ä¯ÃvéŒ-FFí»s ¸Ú£ìÐeϘñ´Æ‰µqåAp¼và|®p~SÏŒyyy×pmíþ¯à:}š¿ü³Ë_ž‹WqÒþÕÅàPòþç’û·[Ÿp'íÝñ…·gÂßøÜK†º^Õ&aŸœå‰@H%¬rodcÛèÇûqü\vÁðÇÂ.ª †ÚfäE]íòŸ”†` „`з˜#?iK/†c^IØ~PÇ8ù÷sÝÞ6ÌžcòÄlwE³Ì´Ü~e~ë!Û³æOÞÛÌ~Ì~CåíEÄ~Yˆ°y>^˜êxÁªÖáì»W´jöÿ¯’ü×]µµÔ⎠I[5Å-VÒ—÷nëÑtûX~ÛOüË_ ¯ü[}®ã$dryã¦1œ…ü6ÇÅŽâšøKÆæ›èÿ.­îqžÃç•øåG°é¼'Ê¿*åN9>  q…˜¼>ïÃ|‡,qxÀF2™Ã€x9Úü?ÿÀjö_ôñ}þ¾òÕ‘OŠx…ïšâž«¬:[þù~ékËöz~Ùÿ†ð߈Ž[;þhøA¾e‹$`”“ @ò¤,Ȇáì4SöÄø àáÏ…ŠxÈ?4`!ñ@„€º©HpŒ²¬_[˜1íbq"ñ%”îcåC¹‡•™y|Û¢ò|Ý+j„Q† Ã&п,=‘ËÆqµ6¶Sy~]¶rà.MÂwÒ®×÷×O>úîÔÏŠx†-¥šâ’ÒÚǺïO²]_£Ýýh?l‰øçÃß ¯ü[­ óÇý3{ñîÈ#ý®þ&6wxwá€%™~ègh +·Èù›ä ÈGÜÈ¥¤‡äÕŒtéÛ§å~0¶á;¶ºíïQ¸Ç„˜åG•̃nä;“·Ç·Í€ÿP¸=Á·`n•þ«]?éâíÛ{é't®QÄwÍqZ%»‡—÷eÕmëo®¢ý«¾$?ÞðÿÃ1ó0ù~ègn(6}·l•*Q‹¤en#´´?jˆ½ô/†cþéç‡ûãUõ9G—§h¨À鎜ÏEヘàmÇðíÄX¾á ÿȇ²{UÞñ_Ïýk¦éBâž!Óþq[­Ü?»Þšùüµ‘ôÂþÔŸçAøkø|<ðþÿŸCõÇç•чö™ø!ù´‡KÉ ?á_xxÿxé–ݧŒà. 7#ÁEÇØþ\AÇÝÆa>^Ÿpúd}Üü8ÊmZ& -†×<ƒïØ|߸MØÙ´œ/Ì·¯‘»Nsà>QOûⶪ·jÿòñkò¾ú-JÿZxƒ’?𫊿{Âú[¯"}O»cé…ý£üxÀ¢|;€Jÿ¾ðæS#<îÓÕ±é”VàîU;ÄrÃFxëþ€ßǯü[ÿ qéŒØ ûž1Žqólùî!…Œm# ¿.Üá~ðòcã”yi·ÙÜAdzÀ/…;W ãžFíŒGŠà^ÿ¡ ~Õ»ý÷úuÑkbQŒ•1ÂlÄ>á5oøCÁnºTÚÉÿÏß=uù÷Ê\UÄ*JÙ¶+oæ‡ÿ#¦Ë¶Û­×ÑZˆ<_®è«®É¨|'ÐìåÕu "µZIs=Ιi¥^]º&‹à}^4"Ö,•Zy`‘ä2…‹l{ާö‡‰èmø'ÿ†òÿÿ…x§Š!ðlÿ³ŸŠ-þ"ø_þo‡Ó‹ðøëÁð‚j¿á-ðlžðjxŸÂÿð¬´-ÄÚßÄOíí¯´¯øA4 xƒUñwÚÿáÓôZïP‡O¸þldÙûãÇ„><~ʾ*ý¨ÿgßÚ‡ÄðO»_k³Á4ÿg¿x–ç㟌¿àž2¿¹žoƒ¾'ý¸>xkáŸü&ßò$ÿii?³W޼{ñ+ãž•ÿìÒ¯í~üS×|?âÛ›‹ü‰ñØ|§ˆ3l» “dqÃ`± W:•}:–súÌ9¥ÌßÙ^ëjÊ_­äJùŽO—c±9¦lëâh*•\1jæskÝŠ¤ÔU¢´¿áªýtý¹?h¯øX_²íáá/ ê,Ÿðª¬5…'ñ‡<aáXõ-thÿuÏØèZÒ4oI¡®—ãÏøDõ§¼±ÒV»´ñŒ0jž¸³Ôõ’¾8ø­ÿ&Ãÿoÿ³‚ø“ÿ¨§ìýEyù¼(ª˜*´pô0¿YÊð8š´°ðté{j´Ûœ£)8ó5{]êzyDªû,e:µëb>¯˜b¨S©^ju}•>NHÊIFü·i;l~rÁÈ^ø?«þÜß .¾ ~ÔßþkIûü·µð¯Ä ~ÓZæ¹}¦/ˆ>'4>#´ºø1û9|^ð²iwW“ÝéÖö÷Þ%°ñwz>¡%Ήkc6©ß~CáÙŽ2 ÿ‚ƒþÊ‹‡Ü>þÞÛAócmÄâ±e²ªÆˆ… ´ûè·üµÿ) ø#ÿfðÿS¯5ü¹×÷Ç„ü6ñžpŽ#ûs9êÙT%ì0ðÉW¯[ܦñ6"¿.—ýåj’»w“Z%›eX ùŽ*¥ZSNiKÚÖÛŒzF¤b¶è–þ–ý…Ã_²úªøx?쮸 Âü;ý½H\Ê©ÿ†$O—å p¸P¡UFÕŽAáïÙ|ÿý–Æ0>~Þ¤(Æñ„ãCÆ1Ó¦?¨¯Ð—µ·çÿøÿô?ýoºLóVI–Gl7þV¯ÿËòVý”Eý–‘ÿ‡‚~ËXåcðïöògAºRý‰"fpF|Ä'i(Ñ8·{ml?ehÈÏüö]㜇_·‰*q cö'@T”#hQaC¯âÕ¥Â׿gúÿs‡¿ùÁÿÈ?±2ǾÓ÷Õôóþ-¿§ÓCúÖ>;ü1×¾x'öo¿ÿ‚˜þÌÿ|ã/üEоèŸÿl¿ é—ÿ¼SmŸ©øëÆ×žý„´câ_ŒmthÃ^ñ?Ä}KÅZ߃<"dð‡ƒït/ ÜM£Ÿ"H¿e5Îà ³ $øsûwàŒ§*ß±Sdî*À‚¥B¤1Wñ.ŠÊPéƆ{QJµkÔ*7N3­^r«Z´Ô8z*UkT”ªU¨ï:““”›“l¹e|ùyèÎn1Œ"çˆÄÉÆŠŒ ›«¤a£­"••‘û‰ÿ²zc?·ÿìÄrÀ'ÃoÛ³åË£þÅJK0PHQVAå”±ÞKÿÙ-BøoÿÙ™p…ømûv¸ÛŸøbäàc €¼€Ÿ 𶊧Á‘nÿë½þßÎù¾»ù‘ý‰–Ð;õöÕïÓþžõ²¿ùºãSý’Æ?ã`?³GnÃ_Û·àÆ8ãø ¡.íþÈñ0#öþýš×vŸøVŸ·C°ÚìÃ?ñ…ñÀe', ÆÓykø7E7Á±jψ³ûväáïþ‡ÿà®–ö.[k}[²þ5}•´þ/—Ý¡û鉿d8×öüý›Tü¸ ðÏöè*0ˆ§!c(û§(û«·bùi…ñ_ì‚?æÿgî>þÝŽœøÃQÁÆ;`·(OÀ:*A;®"ÏÿðÿèËü­d%’e‰ÝaßOù}_§ýÄü¿D@qxÃö?B ý¿?g%aЧÃ?Ûœ„0$+~Æ¿3)*ÈCFT¯ÊUŠ#~ÆÃþoãöwéŒÿ±ý¹3Ðß±ÒúuöÀÀOçnŠK‚)­¸‹ˆ6KááÞ›Í?åÐI–ÆÖý5þ5oþXFp|PýŒ¢ÆoÙó²|0ý¸H~ìäþÇk–#i$ޱ.Ò¬`{;ñü[ý‹‘TÛÛö~ãoÊ>~ÛøL*ƒ´§ì{rFqµÇÈ–æöŠOéKWÄ\A~ü¼=Óþíÿ%÷ äycß õwþ5~÷ÿŸŸð~gôùðß^ý—>-|Cð¯‡ß¶÷ìÿâüMñŸ…¾xAÿ…{ûfi_Û^0ñž¹§xsÃz8Õu¿Ù3LÑ´Ñ©kZ…•˜¿Õõ?K²óEÅýí¥¤rOë\ðEÚ‘ã߀ Ž/о!“*GÊÂ~H;YNä ¯ÊUмÇ'ü“þRûÿÙæ~Ëÿú»ü_ë)_Íž8ñWøgšäx ‡4ž.Ži—â1x‰fø<¶½XT£ˆT!2Á`°Œ]ä§ Ëi$”Oo+á<›J¬ªÑ­ ¨¥N½D¬ÕõæsëÒé[¦ˆþf¢ÿ‚2þÓèGüW?‡ü>>b Tðž6ê1€Ê¡QBª¨…-­¯ü³öÿÂuð`äcÄÿpTäøU @0@ù?£ðROø+Gìåÿ¹ÿ…1ÿ ÿÁ<_ÿ Ïþ/ü"_ð§¼9à_g²ÿ„û{þ/øM~$|>û'Úÿá`èßÙÙŸÚÿhû6§öϰy6ŸmûÆ´·Ã ~Ë~,ý°-o/¼iðs¿|CûF¥ï‚“«ê¾(øsáï^üIy|*—z¾™¢j:¦­áË&þÆŠï]Ó´Û‹Ùíâ¹ÕlíšK¸¿ ~8xhËÛå–“´_öe+I¦—YÙÙ¥úhz 8~íªx«¥o÷™i×ù¯T~¯ü»öœÿŠçà?où™üþÇýRÁÇÊqÓ\`mèÁÿyý¥¢UÆ¿—iUñG™@ ¹Îï…£y*3©‡EaŒAö_Ú_ØÃö´øsûsþÍ_ ¿jo„º/¼;ðûâü&?ðèÿtÝ Iñ•Ÿü!>>ñOíWûcOð׉<]¢[ý£[ðŽ¥u§ý‹Ä:‡›¥Oc=ÏÙ.åžÆÛêRñË—»,FXœ[MfÒM;«ÞÓÝ4Sà\‚I~ïnŸí2_”WüùÈOø$í&¡Gü&¿ÄÞ<;1»î‘ðÁ Úü¹#aØc•àÿ´ Ÿ|à‚1â_``©éÿ ÏÐåW@ŒCýQP¼qãÕÿ1gþiu·÷ü—õkLx‡ãµ.ø20rx‹Æ˜_ž&8ÿ‹l ‚’ ‰·j‹qg}à–ÿ´P?á-ø6¸P¯ˆ¦T•;~è@‘„U]‰•ÿ‚iüuÅUð—ëý½ãGÓRONã§;v~àQYÿÄkã«ßëm÷ÿ‘u/þHŸõ‡“OÙâî¿ê*_¬+tìÄDÿ‚k|sS“⯄ǂþÝñwŒg à€¤mJ-¡Ð‡þ Ãñº2 x›á@Ãd×|YÇÍ'À§!N@T‘ íÜYþÕ×ËÞý³ÿf¯~Õ_ÿbo |IþÓý§~ø&Ãâ/Ä_†ð‡xúËþßêv~Ô,uøLõ Z|>Õ¼ûOŠ>—û?Bñ^§ªÅý»åÍcºf°š{ÿˆÕÇRÚ¾\ùUݲÚz%ewïm²»òÔ©p»^ž+ú ’¿—Ã¯çØø ?àÔ|Mð°`u¿m^1Ÿ Æß•xNÝ“ø'wÆ¡ø©þŽ{k~+ã§#^O|mè6•ù<¿Ùz*W|ø¿ñÛÆ6ZޥႿ ¼ñkÅ:w†­¬/]“'ìñysŸ|6Ï8Ƴâl ŒgÁ\œáHÙ„*Æ'·û3ö0ý­>þÜÿ³WÃoÚ›á.‹ãoü>ø£ÿ ü#ú?Ä]7BÒ|egÿO¼SðëUþØÓü5âOh–ÿhÖü#©]iÿbñ¡æéSØÏsöK¹g±¶ú†‡ã?ÆñuòäãxµýKtÕïïouÓÓk$.á媧‹×þ¢eåmySè´ÛÈü¡‡öøµ3¯ü7ƒµu1$.HÏ‚€ÉxU)TòÒò~ÃßÕTo|:\(WVñUàªO„!s…;TàœýP¢¥øËÆÏ_o—_þÅôü¿¿åøúúƒÃ׿³Åôÿ˜©im¾ÏËþ§å¨ýˆ¾+ùü=„jÞ#$rNF<"¹##¸äpTì1[‡ö)ø¥#mü=ùX2Ÿím}ŠáËnÿ‘97œ%A( ˜È·kOÓú(~3q»VxŒºÚiýŸO§ý½å²ÓÈk€ø}˼SÝk‰—[wÉšþÆ¿£Æu¯ (—T×·.# ®ÏÄ6±Œäœp‘áB•Ž#ö:ø˜3ÿÏwþ&šÿpG9ð±ÉÉ<Ž0pWöÿ‚’Ãm~Ñ¿ðP€ð¦?áYÃ|lƒà÷ü%¿ð±á3ÿ…©çxëã_‚¿á"þÁÿ„Ÿðƒíÿ…=ý§ý‘ý³ã ßð‘}ûLd}¯SýB¥/xÚ³­—'h¶¾¡Iî“[M­U–×ÙYZWpöSžßí2ÿ䯸üà_ØûâRòu¯ç'Õ5Ü.UÁ`…r\–RH)´!ØQŒOŒ²WÄd+cÁ)BÔuœ‚Ü·'¿2@Œ)6ÔÛ¥èuŸŒ|k+^¾\íµòú}-ýïëîµ>áùoOíß.–þï—õeoÏåý”þ!ŒÄãÁ}1Æ£­ü¼(Ú¸ðØùN2sŽƒŒ`,ŸðÊ¿¿è1àÎàÄÇZàzÿÅ7ÉÉ<Ž1Á_¿h©^0ñ¢Ú¾]ÿ†úü—ã¿ÎÖK€xymOÿ…2òþï—ùl­ð„?²ÿ¢Æ5­•ÚÃ…ýæàÙˆ³´¶vä›YìÒXèEû4øéAÕ|%À^þªBàF]¾ŒÊUçB(aû~ŠOÅþ3{×ËômÿȾšÞÝ¥Ý_×ådø‡e½,Uú¿¬Ë_ü–Ûê|L¿³wŽûSÂcÒûWãÀÿ‰ãŒt€8x¿g/!êžR::ßꥣáÆå@K+)Ü„m;Y£Åö•Ä_ã4­íòûZÖú…=´þ÷—Îöw²³\ÃËjX¥Óýê_üŽŸ+ Cû?øÆâóRÏðñÆŠ¼sÓ Æ>_/ëJ*?â.ñïí²ý­o¨Sµ´þ÷’úÃÚ~ë­ÿQRò×áò^,|ž¿|Zÿ‰‡†útš–`gEìG08+~‚~(‹no|?…l®//É_Þê4DÜvñÑNäRnlþ¡¢›ñwŒš³¯—ÛM>¡Mmkm//ëK?õ‡¬—³ÅYÔT¿wúécæäø=âUT÷BUFÕ cå U>AÃá‰?Ó4!ô¹¾ùzp¸ÒÇôè1—gÑtT¯øÁËì¿ç€§åýï$%À<<Õ<^÷ÿz—{ÿ/—^Ÿ#çȾø†6 ×z!ÁùHº½ÊœœeÌ6ÈT±£s°iÃðÓ\í8ëȸº,2±Ý2/””9hQa'”–¾áE)xµÆÕ×Àá ?.œÖè½:Xo€xyÞô±Z«iŠšü£ÿÈñðëZòó¥ßû¯öêíÆ1Œ1òì•~ëKô(pF<ë’AfÀtƒÁ»HR¾ÅE%âÏ+Z¶G÷o¶þ÷d¼ûj €xymOÛýæ_üá±åÐø#TB —N`@Iæùx­»þAê¶õPoE*P-¯ØoGá-EUG™`˜ ’ÌUq·þ†€¯áSî®ü‚/C¢“ñ_‹ßü¾Àï÷(z?ü_pë×Ùâü¿Ú§§þKøïç±òïŀ߾$ɢæþÑ¿¾èzêÛøgá.»àoéWz®¬ÖK©ëš¥Þ·ð»Ä¾"Ôu «=+FÓÒÚã\:&m¥Ç.‘¤i×Ú–»y«y?ü1—Äú=ÏÛ ÿ7ïþrµ÷Õàb¸»ÄUÅâò܉­.zÕªe±s©+EsIª©^ÑKD•®’=|?að”iá°ØüÚ 1å¥JÖ£§{E:oKê~G~Ó³µ·ìýû~ÙAão|@¾øaªxûÄÞ&ñö£¡ê^$Ô훑2ØÈ™‚Ãl>WamË”å{É+&ÝÚVJ×oÉ]]ì®®K”SiÊ)¤äÓi5kÉë¢WW{+«îAEIäÍ»o•.ïîùm»ýg“Óÿ[û®Ÿë>O½Å5ÑÐáÑóéSò³#p@<:²FVSÈ ]×Þ QnÊQo²i±ÑC,î#†6‘Î8QœBîcÑTv!W<+¦@ƒhóe˜¾"6@¡¶.ð FK3yRB…T®å,Öt›6µƒt¨‚iNðÁH‘#tŒˆœ²«)VRY9PÜäšè¬¬f¾•cˆqÕÜýÔLà³Þ€ucÀõ¯+‹©*’…(BrÕšV¼›{E=µmÛ[¤xX¼}j•½ŽM(É¥(Y¹½wz(ÆÏ],®äìrÿ؇¤—'þÿ§·‡m”#3]"—Cº/™C¼dÜÿ}}A¯kÒüç(ýÃÎän "Èd( ‹'c3‰á€ààW}¬ü6–ÛIðÝÇØŽóL½¹ùá!rž%׬XõÞM›­W)ù!·l%c x%™Æ1xŠÒæ—/2PŠø\“Š”®ïʾ$¯w¥÷¸CÓæÅJ.Ú$Ôšw†’ºVÓš÷²Ñjùš>SþÁ³ÿž—?÷Ü_üf³ïtW‹çµ;â ™<ÙcWR7–ṟF"U ’[p$œmË­xNKBÆde߈I,$ÚçpGc¹\<©lc%XóÄIÄÅJ²œz©î¬:«Œ§ ¬  tSÅÖþ-:®´ñš³Šv·›Søÿóÿ‚ÅÿÁ6<[}©ÞÞþÆ¿³?íO­| Ôµ›½OQ¾ñ'ì…ñËàÇÅ_|”jÚ¥Þ£6¥/ÃíI|cð¢î%ÔfþÇ´ð~‡§‹]>ÐØÛ+þ Ãÿ)ÿƒ|?ìõï¿õz~Å5é?ðp?u?ƒ õÏÛÓÀ,z’~Íÿ´ì'ûCAk ”þ"øûWø+Yð‡ÃVòþQÄÑ|*ý¡µëvvQÎÅì|Wâ. Y€Ê‘Öxiï)5æY8ÿàJñ]/$ÞÇ»³o³×ѨßîßäyGüÓöÙðïüßþ ¶øûOkޛƗÞãN‡àßÁ{š|Uã¯þ×_4 é—z„»Žmwvúψ®í⺿¶ðæ•«M¦Øßê)ke?¥þÓÿ௟ðOïÙðÁ@¾9þÓß>4x/BÕþ Þ|týŒtÙ›OðG†~øsÇ~-ð§‚0Gÿuý—þ7Å5Ö?bÛ›ö¸ø³û;øm!XußÜx>ðxÎÖÛJûF©ý—cg‰«Á@~>XÁa4ÿ„ ©Eÿ |Caû_ÀÚw•í«ªü“ö˜²ñ,óèßðž5·ü"WZ—ÐÛÄðèMâî®`ðÔ÷‰§sàÿðS ¿…³§À?ø#ßüSö}ð^©kðKö.ø‘ðGFÒ,u(üT5þÄÿ¾èÞÕ-5]/ÄÚ£xÆ÷Ä^ÑþxkJ_I®ø·Jñ6®“jöÚ‚ÍâT¹n³û%xß]ÿ‚!k4ÿ iúí{«xûSÿ‚ÄY¿ü ·7Zå—íyñ ÚZ <>ó[x’óÆÿ ~Çz.âñܱGd¶ò¯†*ahɤ”—±Õ$ã>i.wkYÆ*MßY=]ê½%§U¥ÒòzÚÞ‡Úþý¥?h¿ˆÿð[?‰ß³/„~ ²þÉÿ³·ì…àÿü[ð-§‡~\¿þ#k?oðd:¯ŠntŸ‰vZŸ€õû=z×FÓ|Ea£}›ÃPÝ]X¬z™m_ö"¿ÿà‰ºå—í)®þß¿ðQôð­Ç‡`ý±¿i«? ü<¹½¿šò}sà§ìãà'áß‚5¸í&I¢ië×Þ4[í.æÒ×S¶¼°þϼ}JÃJÑu+Þ Æ¢JJ)$ãÆ[|I.{Ûv¤Ú¾»-J]ûëòéøkê'?ðI/Úþ ÿ>ýþ)xÆ?Û{áWÁ­_¼Eà½'㎫û2|9ø™ñOVºÓ| ð£ÄëðþÇáþ•gð»àçƒ|£G®M{qãgÃß¼k⛯jÚ]¾›á oh·þ úóöpÿ‚”~Ñ¿àœ?ðS=wâeσüûrÿÁ<¼7û[ü=ñ¯ˆ¼¢ÚOàù~"ü øyã½_À_4/ x²ßV³{vñ†/m.ô­FmWÕ<+u'‡ìôPøzÃó£þ ™ýµ?dOÙ¿öøÙá/ß´ÇÀïƒ^,µW|uoá_‰_ü'àïêž¼ø7ð+I³Öô/kš¥ž±âk­SÚæm‡e¨\Ï{¦][ELö,ø]«ëðOø8göôºÐ|UáÏ ~ß:Oí·ñàý·‰¬SH!ø9 xöŠñ_„üo§hÓÅý¯c¹«|^ñF’òêWOì~¶ŸN·[Lj:·L๪§Æ1©MBÐI6ä®®’m8ÝÙ¶••’%=cg}õ¿nžºçÿÍý¢à¹?·—Àߨûã3x»örðGÀ3âñ¹øëñwDZè?ð»?j¯†~øóªCñ Oð€¼ð‡SøoðÇMÓ<¦ët«k;Á^,Ö¼CákϧŒt¨µ« ^ | ûEþß_ðT¿‰ß´ØýŠ?i~¿³WìÅñ§Sø £|E¾ø àïÚ;âÏÇˆÞ ³¹“ÆÚ…ÖãÍnÏÁ> øq$zφïü;ýŸky⛋w±¹»½®5]ÛØ?àÝùC—ì{ÿwÿ­Kñº¾ ÿ‚-|Oøÿ´µý¶?àŸ¿µßů~Î^7øûWx³â·Ã‹ÿ¾1ð·Ã­7â·Á_x3Á>ð7Ž<âÏ_èžñYÕ,> FþÏDxïlgÕc´¸ÓíÓt¹•¹«òÂÔäÔ" Ÿ»ÎÔ¤âî›Z-SQæÑ++5´nÞ«ñ²²ºùù·×{þþÇ?¶í)ûBx›öóÿ‚~|iñG‚>~ÜŸ²Ö™q¡øö‡øaà»m{áÞµ¡üVð­õßÁÿúGÂk‘Kâ¾¥á¯x·áÞ»©ÉáZk½'M]I`¿Õmtï›ÿà¿¶‡ícñ'ãoü£á?í¥ûGGñßCý„~*xwáç†|y/Â…¿ "Jð¯‹iŸ øïÅÒè_ <7¤#ñ=ŸÂ­Y}#ZÖ|QÿúÚ=7S“Í¿º¿ç¿à˜³ý§ÿ௿ðS/ø)¿ÃäÖuÙëÄþðOìÇð_âÙE—ƒþ,Ýx[AøC¡üG×ü$÷p›ísJÐuo€úØ3ÿÁS¿à¥ÿï?mßÙ›öøOû!ü¾ñ7ÄëÙ×öq×ÿg]ã>¿ñŸÂ¾Õï¼oñãâv½â½>÷ÀÚÆ­ã? ø‚ÎÞËá-›ÙióÈ—z‡ˆÖÞy4< ÿÍÑ/ÿàšŸüƒÄ~ Ðõ_‹>¾|Kð¿Ã×ÍeáÛ¯Ú%µ #F²´ãSÔµ]Áú…ž¿£|K¹Òîµ+ïiþ¼6¶×:– lî®ÿÿàš±Çüþãàߟø)¿„~|ý»þøçâ‚~=xwö…ý¦~(þϺ֫$~-Õ5¯kÒbø×à¯kº7ü šÏ‡4[;ÿÙºj§F—Zd¿·Ôí5ígéÛïö4ýŒ~5ÿÁ¾8øWþ áMCÄß goÛOøí¯i_¼Añâ.“ñâ…þhžø©¬x;Ä_µÿk1ðÿ‡>|AÒïî&ð>«6‡q¬øV³Ðâ½Ôíõˆõ q¥Î ã.UR*2öqŒyj΢“sS\­JV}SI´vºÞÛ^îútkKuKÓ±úçð;á§ü‚ÊóágÆŠµÏìÛã»øŸá©ñ{öL“ökƒÂ~øQðÛ[×ôø¥eð“ã~ƒãXüu¯øïÞ ¾Öõ(|CÓµýÿÅd60Êúl¨.¿¾~ηƭÿýý¸>øcþ Iÿí;áÙ{ÂzïÄ_ÚãþóàÆ¿ÿ GÁ·ýf±ð/ü(MC\‹á÷‚³í;|D—ÄôŸ…Ÿ ¿hÙ'×>ðNŽ4Ÿ†Z€Ót¿ˆÂËÄ~ð®¬k±iÞ3ñŽ—á#Çúέ¯“á››Íí ªêW¯žñ/‡Í_ÓoÖÿ#è¯Ø·þ ñóâÿü›ö€øcñ'RŠÙCâûüjÓÿa¨Žàk6µÔÿbïhß¾=˜µ=F±ñn¿Ä?êWÞ>Ñÿá)×|E6›£i‚+ mÕç±ÎìÿmŸÚ÷Åž2ÿ‚þüCðÇŦà_ì=ðâƒÿe»Koü$½Ó¼û@ü2øâß|A¿:‘ðç‰|Y©x7Ç~±¼¾Ñ¾ j!ðÚËâ94‰ô™¡³}7Nƒö§ý—´ïø'·ìÿàøÕà½;N“Ä_ðJŸˆ? øKVð.•«êéyðÏ\6ž1ñwˆ´ŸFðj>> Õ¼:–:ü7÷_~Í¿·ì?°ÏüûØx+Æ>ð·í)ûFjŸ´'ÁïÙÖoëÚ7‡¬|9â köªø·¤øŸâþ±ªx‚ Ið¯ÁÝ3Ä>#ÕµÏ@|5e®^øVÃ_– a¤´¿ðK-Cþ ÷û7|øWû"|ý°¿e5èµ?üF¸øyñçág~$ürøÏ¡ÉâOŠ^?“CÑ­ûtüVÿ‚½€ÿÿoËOÚëÇÞ½øañàAñOÆ—ÞÑôß\øWÁ?³gÀ·‰<[ãmGâ±ã øÂßü#¯ëú¦›ká i¶Oo“g>gügþUÍÿ‚³Ý÷ÿë |+¦é¥¤“p©I)(F)©Þé5¬ãç-Z³ÒìiÝߺ}[í÷=vGÙ¿ðLßÚ'þ “ûy| ý¾37‹¿g/| Ó>/ŸŽ¿|{ƒÿ ³öªøgáo:¤?´ÿx À_u?†ÿ tÝ3Ázn±ðgJ¶¸Ó¼âÍkÄ>¼ñšxÇJ‹Z°Õàúá_í'ÿÿ‚œüoý£õoØëöŠøoû~˲—Çk¯Ú6·¯üðçí ãÚ3Ç^Oµøé|Miâ/øzÓÁ_ õ¯´9´»êO‹Î‹¬Y¼Z¥¾­ ¶~ÃÿìÊ¿cßû¸ýj_ÕùÝÿ;øåû5ÿÁ5|'ûx~ÂÿµOÇ_‡?¾"üý²ü}ã 3Oøáã?ü?¿ñŸÃ?|=øsáïx£Ã7ºýΤøÊã^Ñþ¦¾šg„Íî«ý®èš‡öT6zî‘ö…+sWå„9©Ï– A?uÎIÉÅÝ6¬–©¥}ÐK·ªï×K+ýþoÌÑÿƒy`ñ·íÉÿß¶ø¨øsWø‡oûWxFjÞÒõÂZ§Œâø½ûeÇâGÂÚ.¯©ëZ¶‘áËÝqo®tM/SÖ5mGOÓ%µ´½Ôïîb–ê_꺿•/ø7ŸÅúOÄÛ—þ ÁãÝ-b Æÿµ„¼_¢ÃâXð¶¿“â_‹ÿ¶^³¦Å®xcÄVZoˆ<9¬Gg{ jz»§XkEèŸOÔì­omç‚?ê¶²Ä]=ÚzvýÜB ùþl(¢ŠÄ ¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(âø)ü˜Ïí%ÿdýÿôõ¤QGüþLgö’ÿ²~ÿúzÒ(¯Sü)×Çÿ¤ÀÊ{¯OÕŸÈOüµÿ) ø#ÿfðÿS¯5ü¹×õÿmÊH>ÿÙ…üÿÔëãM.uþ x7ÿ&¿‚ÿìOý?\øœÇý÷þ5ÿ¤Ä(¢µ¬´™®¶HçÊ€à±!–FS“ˆÕ+nP¤I“YS#¬‘¯é5*B”y§%çÕöIjß¡æÕ­N„êÉF+¾­¾É-[ô(ÛÛIs"G²¡}ÁY“i Fc¼Çƒ°`eÙúK}ŽA;™$bÁ]8ùQµ\:—u9feo-ˆòŠº [e#T%€F$—j %(»U¤(ªœprB…SëÈ­Ž«Q¥Nôã¥ÒÕ·{ïdùzZÞö¼Ú>UóøœÎµWjMÒ†¤ÓriÝûÜ©òl¬×½«’´¹#‚[ä2y[X–cÚÆ‘±1ÆŒC¤jªûT¸b ‰J©*H©Ü¤€J¶Ò¹Rz¬Ë‘ÎÖ#¡5&ÆöçÛ5~ÃL¸½ºµ·ŽÜ\\C 1ÆÄâW‰Nk*²£e:±žwJµœ¥$•Ûœ”l’í&žÊÖ^K±ç¯iQ¤œ¤öWmÚêÖ¿Ee¯K.ÈͪíknÒC)Œ,±2Œ¢Ž~ì¨d #Y—nÑ{Iãɨw‰Ð}â¼–0+þð#¨ÅD"vÎÕ-µKpRxàäà柱¯Te­Óp’{«4ÜÝ;4÷NÝA{H;.xJIè¹¢ÜZiífÓ\Éôj븑¡‘Ò1€]‚‚s€I€N2}+Ø| $†Ý‚4*F7†–L…ew,(™+’ §yǘiok Â5Õ”·€:|©vmBåÔ½mç*Cí˜2áˆòÙŠ•úëá¶©àøî [Ÿê7 dpò´,PT‘@Œ;A?8I .áÇή’¥QóÞR³§ÜäŠS© hä¥'7yz™u(»ÏG7%ýí"ÜU•ÒNNZ^-Ú\¾òW¿Ðÿ ~E­Z$pD[P™„ “%ìHi-•#Ëß$BCö=ÂK¸Ñž %O)½óÄ_MÆàÈmôó,Ï¢jVäš=»¹ðÖmg£½ÌÓéww‹Yka©B5Ýh]C¶žb».¢¼ºxÖÞÐê%á˜ÛÜù*‰ù–cšâhâ©CØÔwŸ´æ”—Ã(ÔŽŽ¬¢›n? ¥(Éi ½Np“rQ´n•åîûê)¤¢ÓI«]ê¥m9}çøwñ7áô:d³¥´~z¡e7E(æ“hWhCÆf 6Í:¤¥ rmŽ7hÓä_hIÎÇQ*À°!fŒyVv@wóœ“úÓñJ‰'σïe@§”ñ¤‰ðeRÑIÿìžjL‘yQ’å(Ãt…™¾ñ>™ ÞK ´ðÅå³ï™£-âoµ*¹ ’Û´‹_¼à† d œvÈÿa–fc)Bqi%z’¡ËÉ$½Ù¥UÇá³—Ù»\¶Òä¯J3Œ£+8ü3‹OtÕ¾½ä¹ß2Wå’½®þ@}Û9`”¸.»v0ËF#(= lŠFU\³m!C¨Q½+êßxã[ñ•‚ÛJËq¦ø‚sí`ËÃæ¤Ì’­¹ɲ¢?1@Ë*î¼þ粤gͶˆ£^ÜÆX° dU^9e;Ã]àà{ˆœÜ]'¡NV§VïßsW´”¹“ä|©YhÕÞëË–YãU«·neºY9JTí«ø¹lÓVZ^^ñ£©I]GPÊpAVÈà€zŠÈÔ4Èç&h¢ÌœoHŠDÎw3 ØŒ´…ÊÊòÀ‘ 14>©¨ø_c7—›w9"9h˜îlíaó*ÿ ²‡\!Ú9\¶ÒÅ#ÆÈÁÑŠ:œ|¬2Ì>R8áÃd`A=Ô¤Ô°rWeIFJ¢N×¼ÅÒMÁ½RNÚ²XŒ Ô¹¬“ѧ.I^Ú5xµÌ’íÌ—ºÚGÐ?ðN˜eƒþ ûG4mÛ3ö_á†2Ç.å=IRU°pH¯õ¯ò¡ÿ‚{Ú=Ïüög€Æml¿ÙŽUw’%.©ñ«ÁeŒf1pÅITc‹rÿ!.¥Hê½_Æ_Kjóþ•jR¥'’ã½ÙuÿnŽ©^éj´’M;­l~•˜¥ŠÂb$ÔTãZ1šŒ”£wÓM7ºµÓÕ;«¶™åÞ<øð[⟈þøÇâÂ…ßü]ð“[oü)ñO<á?øá—ˆÚÿDÕÄuÏé:ާà½mµ? xsQmWÃwZmù¿ðþ‰vg7U„u¾0ðo„>!x_]ð?ü+á¿x/ÅmÎâoxÃCÓ'ÓõMP}7V±²Õ,îÊf³ÔlíomÌw6ðÊoövŸýŸý“ö?쯱ÿgf}šìÿìÿ#ìßaûϳ}ìßèÿfòü#÷[<¿–®QKúþ¾ä ðãá‡Ã_ƒžÒþ|"øyào…~ÐÞþMÀß<% xÁú<š®£u«ê’i~ðÆŸ¥èº{êZµõî©~Ö–Pµæ£yu{pd¹¸šWîh¢÷ùÈÿ‚Á/3|=ðçÄÝ;à§Ç4ÑtÛ¿„ÿü1¢xÓÃúž‰©|CÐü=¬.³áXÛ¼ŽŸâ+1g%ÃAõœ÷_Ю¹á ø›Âz¿€¼IáøƒÀ¾ ðî¡á Áz扦êÞ×<'«i³hº§…õ_Û\hú—‡u-â}'PÑ/lçÓo4Ù¦±¹¶’ÖG‰º**ç9T““Ý»Ù^ɾɷo¼±Äü:øiðçàÿƒt‡_ |àŸ…ß¼;ý¡ÿÿ~xWBðOƒt/ímVû]Õ±ü1á« 3DÓ?´õ½ORÖ5±XÁöÝWP¾Ô.|Û»¹æ“•ø¹û<üøÿc¦é>üøÙ¦h×k¤iß>ø/âEŽ•|Ý[­î›iã-Y·±»[{ëØæÖ8¦Xo.¢âU`¢¦î÷»¿{ë®úògíEãÿÚàÂ_^þÇ_±þ›ûTø¸x»MðÔßtߌß¿fý/Â~¸Ð|K¨^xÖÛÄ~8Ó.|9{o¤ëºo‡´øDtÛkmN÷þ†Õ-çŠ×F¾ñ7üOöø¯û%Ý~Ø¿ÿh§ðm§íûsþÐZïÆÏˆø­j^"ð¯€tI6Ýh÷¿þüø¹yáëÛ}K@»øŸðÃÁ>>ºÐõ@âÖÿG¸ñ^‡«K¦^Û [ÝY<ÂÄr.ãŸTÒ´+BÓ­4}LÓôm'O…mì4½*ÊÛNÓ¬­Ô’°ZYZG µ´*I+1"I 2kBŠ›»ZîËe}ÈgŽøWövýŸ¼ ão|KðGÀ¿ƒž øâǵ“Å?<+ðËÁ^ñ·‰d²í¬¤ñŠôÏ]Ö^ÒÚY-í[Q¿¹kx$x¢)²™>.~ÏŸÿh ;LÑþ<|øAñ³IÑ/N¥£i>ø3âF¤j& íMþ™eã-Y¶°½6×W6æêÖ(§ò.'‡Ìòæ‘[ר¢î÷»¿{»ýàSÓ´í?HÓìt&ÆÏKÒ´»;m;LÓ4ëh,´ý;O²-¬ìllí’+kK;Kh£·¶¶·Ž8 ‚4Š$HÑTqž>øQð·â´~‹âÃ_|I‹Àþ-Ò|}฼}àïøÆ?xïA[…Ðükátñ¨®âÝnî—Iñ’-59nnä"iwôRžñg„|)ãï ëÞ ñ׆<=ãOø«J½Ð¼Oá/hºoˆü3â=Ríµ^Ðu‹kÍ+XÒ¯í¤’Þ÷OÔ-.-. wŠxd™N< >ÅðÜü‹áç£øB|'Óðª? h ðÜü=›FoKà3àeÓdžƒ%ðó¾ƒ'…Ηý†ú3¶–Ö&ÅŒ¹¢‹¾þ>à|½®þÃÿ±gŠ<à_‡^%ýeï|>ø]ÿ ?ü+?ë¿>jÞ øuÿ ¶«»ã?øA|1¨xJãDðü%Úݼljÿá±Óÿ·õX!Ô5_µÝÄ“)ðëöý‹>øËGø‹ð—öAý—¾|Aðïö‡ü#þ:øuðáG‚|e¡kiWÚ«ýâ xKLÖôÏí=SÔ´}CìWÐ}·JÔ/´ûŸ6Òîxdú†Š|Òµ¹¥g{«»;ï÷õ .Ëúÿ†_qå‡àgÁ3ñ=~7ƒß Æ…Ñ¿á_‹§á÷„Äõð÷žn¿°—ÇÇHÿ„¬hßif¸þË·Ø|ö3ya-Xþ ýš¿g/†ß|[ð{á×À‚~øGãïíïøN¾x+áW|-ðçÆ¿ð”èVžñ?ü%¾д øþ? ØXøw^þØÓ/?¶4+;M#PûFŸo º{]]÷}:¾›}Ý;Äü:øiðçàÿƒt‡_ |àŸ…ß¼;ý¡ÿÿ~xWBðOƒt/ímVû]Õ±ü1á« 3DÓ?´õ½ORÖ5±XÁöÝWP¾Ô.|Û»¹æ“ Å_> øëÆþø™ãoƒß !kžÒtíOÆšÚê~%ñ¢º¯‰.µ+ñâ nìN.5[ù'õ(¤Û{»ú€QEQEQEQEQEQEQEQEQEQEQEñüþLgö’ÿ²~ÿúzÒ(£þ Gÿ&3ûIÙ?ý=iW©þ¿ëãÿÒ`e=×§êÏä'þÚÿ”|ÿ³ ø ÿ©×Æšþ\ëúŒÿƒ¶¿å$ìÂþÿêuñ¦¿—TF‘‚ ÜÍ«  Ú¹#s60¨2ÎÄ"fÿ¨ éá_þ„ðÿÓõω̚XÜKnÉNí½’åŽ¬¿¦Z »®…¢AºO•Š`ð™e‰·; —mÊ £Û*ª¨UU@UU*¨ÀpàU´´ŽÖ4UEªQKÿ6L˜oºÒáZ@3±Å½Òˆ¸N?ȯ®ÄÖxŠ©Bî+Ý„{»êív¯'ײK¡ðøìWÖjÞ.Jœ,"ößYY6¯.ý¬º\URÞÃÖºK I‡™s¾Þ28Lm™ˆb§rºüƒ H%Nw+FsoDÒxK«„WÜ ÛÄÃpÃ`‰˜—$d `@Ìá‚êš>%Ë©dÝ'ÞÚÙ  ãÍùIËœ¿åó9k⣆¼(òº‰~ò³³å{8S¾‰'î¹Y¹;¤•·ÂகJ©Yé4Û»³Z&¯;kÊôŠk¦Ò\•†Š©·ì¶HܾqL¾q– 3ò3€J—Uäm^@¯Iø}áiõ?x'M-¿Ú>.ð݈Œþ׬ÙÛìæ&Îï3oNý z&àf˜FL . “…_-Pâ0?*ÒÆÇ• +¨gŸ†fóã‡ÁKnþ,ü8µUeGP—/Ñb è^3´oÁŒÇ>_E_ÆæQ…*óœÜæ©Tšr’Mòž¼Í®­9'ºåG¯NŒS‚Q„i$ï7«I.X¸Å-ÔTbìôoªüê}àUãlcå K{X×Ï$t8ÉÀ¬K­"peµXä $K°¶TóG(Q´á·¢°\€Ãö•çÃÆxð SVB–9]¿*´ìà7<(ÛÃØÊùž·à™m<°˜ÙY˜þ¯z”rX°QÌX,ܨJÚŽ>•£9FZ&”“kkß–×½öNMßá{%ìö”T]Ÿ2änºÑJ*NQ²»¶‘“æét˜“JŽ+´”ÈÅ™°ÆJùŠIQ• ¾b¨Ü]Õ”WqáÝLéwˆÀ€¥åÁùÆç’3ƒ–Î×Û)$!Ö«¡<.â(ØLœ˜¹a"Ñ7Á8bI9O•—esK™È{“´ÿzMWÆ(Ú­îòÞ”Ó^m.‰¤Þ–VØÍÍFJöå¼›J* É»Ên+ÝUqotä“|×wû§À_¾ÁjmãM†àÄìVXB>Ï*ånòØÁ¹KHåãègâ«aø@Ũ42"ý–S,¨Ûáño‰\L­ö™€Œ¨É[•cÊ_Ê/^¸³wŽ9ÙÞ¡ÑKFÑ‚dT Z22‰6FÄf9#"6FdÓ|K6¥§é0¬“†³°¸„3²6äþØ¿ºù‘IXŸ}ÑHhÀvcæ²WŸˆá\\å ²§ QŒùíUS”“•9{ö圢ši¦Ó»i¸ÚWZÇOU=V®Gªv\×ä•ïͶ¢âÒ“v·Ò"ññ<“Í)‰î'm÷SªÅ™fò‚%Ä‘ÄÞRÌì]åØª$‘Va¶G’³4χWz¤ª­jd*3®…VÃ)Üp¢ó)ic8/(žӎ¨Öˆ4Ó4AØ…É_**b0 ¹b¿ `çå@?S~ü*ѵÈlô_$ºt ÀišñŒË쬿&¢ <¯¡ÝHäßI-¥»Ë{n·6òMm7›˜Ð¥“ÑS©_XCž¤hÓwŒ´\,ï;(¿ÝÆŸ3KÜ»N2tç*’ä§{7Íï$Új>öª-¥¢ÕYh›µ®¾iýžgÉõ/‰š$mj‡>)»Ä¬_ÊX~xúu.¡¤xHŒªäI7¼§€k_.-b¶FT0Bͳ$âPªŒ‘†L »MáY€ |¿éGöyýœoô_ŠºUž­£››O |LGlcÔ¾øö'³»‡tSÚÝÙLis²ZMŠá“ÍŠAó·‰?f‰î-u–Ò; 'H´KgV¾–ÚÂÙm¼¸•Ld‹ËûââÓKÓm‹Ý]ÝË£ºš‘Áñn] ×(ÎSÀ¸J§5hNRÄc¹­¥í¤¡kÊn\°JHì–»¤½æåÍ6×½ªä¦úÆ÷Ž·r÷nÓ‹nLþh|]ðñl¬±MÀ´†"’¡3™:î%Œ…™J8LΉ:§Ìþ*ðÔ–óÈcLÜ+ƒDÔ`F~r]B¼I Û#gUØSî,_¶>XÛI;éÖ"ÞÒ4IJ¤_k¹Œyf[‹Æƒ\I²K‚‘‡‚ÙNÛi]#„׿Ĉ ñDˆdó-™™Xùg;ßäÙeE˜F—ÜɶpönªB•J*4×»SŒya 4œc¦ôçgk¦´jQg‰‰ ¤¥ ÝïnÿâWÕ5½íê¬ì'üÕqû~þÞ‡öÁý™ñÿ‡§ÁUþ¨µþZ°m¹ƒþ ûðvËûa~Ì÷IRH—ãO‚‹Ÿ—¢‰|ÅP@mª ÈÃõ/¯ã¿¦*úËÁ“‚´*ä8Ú‘[ò©c£xé§»+«tVGÕp4\0¹„^ñÅA}Ô÷ùîQEŸrQEQEQEQEQEWš|bø¯áoß ü]ñcÆËª7…<§Åªë§F´ŠÿRŽÂKëK'¶³–æÑn~Ì×iq4K8™­â—ìñÏ?—¾)ÿ _©ÑÿÁA¿ñ þ4ÿò‚´…*“W„’vºï£·â„Ú[¿ëúþ´>¶¢¾Iÿ†¯Ô¿èÎÿà ßø…ÿùAGü5~¥ÿFwÿÿÄ/øÓÿÊ ¯«ÖÿŸrü?Ì9£Ý_ðÿŸf}mE|“ÿ _©ÑÿÁA¿ñ þ4ÿò‚øjýKþŒïþ ÿˆ_ñ§ÿ”}^·üû—áþaÍëúÿ‡üû3ëj+äŸøjýKþŒïþ ÿˆ_ñ§ÿ”ÃWê_ôgðPoüBÿ?ü £êõ¿çÜ¿óh÷_×ü?çÙŸ[Q_$ÿÃWê_ôgðPoüBÿ?ü £þ¿Rÿ£;ÿ‚ƒâüiÿåW­ÿ>åø˜sGºþ¿áÿ>ÌúÚŠù'þ¿Rÿ£;ÿ‚ƒâüiÿåðÕú—ýßüÿ¿ãOÿ((ú½où÷/ÃüÚ=×õÿùögÖÔWÉ?ðÕú—ýßüÿ¿ãOÿ((ÿ†¯Ô¿èÎÿà ßø…ÿùAGÕëϹ~æÑøϳ>¶¢¾Iÿ†¯Ô¿èÎÿà ßø…ÿùAGü5~¥ÿFwÿÿÄ/øÓÿÊ >¯[þ}Ëðÿ0æuýÃþ}™õµòOü5~¥ÿFwÿÿÄ/øÓÿÊ ?á«õ/ú3¿ø(7þ!ÆŸþPQõzßóî_‡ù‡4{¯ëþóìÏ­¨¯’á«õ/ú3¿ø(7þ!ÆŸþPQÿ _©ÑÿÁA¿ñ þ4ÿò‚«ÖÿŸrü?Ì9£Ý_ðÿŸf}mE|“ÿ _©ÑÿÁA¿ñ þ4ÿò‚øjýKþŒïþ ÿˆ_ñ§ÿ”}^·üû—áþaÍëúÿ‡üû3ëj+äŸøjýKþŒïþ ÿˆ_ñ§ÿ”ÃWê_ôgðPoüBÿ?ü £êõ¿çÜ¿óh÷_×ü?çÙŸ[Q_$ÿÃWê_ôgðPoüBÿ?ü £þ¿Rÿ£;ÿ‚ƒâüiÿåW­ÿ>åø˜sGºþ¿áÿ>ÌúÚŠù'þ¿Rÿ£;ÿ‚ƒâüiÿåðÕú—ýßüÿ¿ãOÿ((ú½où÷/ÃüÚ=×õÿùögÖÔWÉ?ðÕú—ýßüÿ¿ãOÿ((ÿ†¯Ô¿èÎÿà ßø…ÿùAGÕëϹ~æÑøϳ>¶¢¾Iÿ†¯Ô¿èÎÿà ßø…ÿùAGü5~¥ÿFwÿÿÄ/øÓÿÊ >¯[þ}Ëðÿ0æuýÃþ}™õµòOü5~¥ÿFwÿÿÄ/øÓÿÊ ?á«õ/ú3¿ø(7þ!ÆŸþPQõzßóî_‡ù‡4{¯ëþóìÏ­¨¯’á«õ/ú3¿ø(7þ!ÆŸþPQÿ _©ÑÿÁA¿ñ þ4ÿò‚«ÖÿŸrü?Ì9£Ý_ðÿŸf}mE|“ÿ _©ÑÿÁA¿ñ þ4ÿò‚øjýKþŒïþ ÿˆ_ñ§ÿ”}^·üû—áþaÍëúÿ‡üû3ëj+äŸøjýKþŒïþ ÿˆ_ñ§ÿ”wMý¨u]SQ°Ócý‘¿nû 5Û[ï¼Aû&|Oð¾ƒd÷sÇn—z߉¼Ia¥xwúE³H&ÔµÝTÓt]"Í&Ô5[û;yî#>¯YoN_‡ù‡2ïýiþÕ™ÅÁHÿäÆi/û'ïÿ§­"Š¿ÿ8Ó§Ò?bßÚ“I¹hžçKðuþpð3´=—ˆ´ÛiZ‘"‘¢i"c"Q•+FR½9û8UšIó¿vÊñNÔRj϶$¦’›år”šp¼“è›—½nX­mÈüwÖ¾&ÍÏlñ…ˆ€˜—{6ùfi]FÅæ_>$Rƒ ½~ñ·Âsc§¶«v’&ž|IJIÚkÛ˜¥Dž;v#}–È» ›—P-œ‹|K,ÊöÒo…zm¶‘/‰5øç‡A…å‚ÏO†UŽÿÅZ„(²¾›§I) iim˜ÛUÖÚÝáÒãa)u©\ØÚÉñÅý*MNêæòxmíÐ*[ZXA·ÓôÛ5gš}¡óš X匆Ìónº¹ºš{«¦‘þ£'ͨbjF4¡í5­Z²u.Ú·$%RU_3KšR‹Q„½Ë{G(Gžµ)SJ|ÍÝ¥t¹dšþ}¾žîüË^k&Ÿã‹<8¶m&Ð|‰I*0IóÃTll+¨ez(ÂL"ç½jÌÙ^ºÿ¼/#3”ÈÒ9aÚ™M¥A¶º±8a_z|GÐbŠkÛ}‡oÏ$yÚ_ɰ}ï¹IXX0ÚïaF#x(>9ñuºEÁDÜ0pë*#’@ ˆ¼“£ lB?bË1*¬aÉ¥:°æ‚µ’qº•®–—Œ£²ºŠvW±åÔ][Õoß^û÷OæÏ†8í.ßuÌPKnÂ'-eu{ˆÅ$°Ê$ç¶XíÆaŽVo.Ñ™šT¾‹øk¢øS¼€êŸ,ô%t.²ø+Æš´Š¯W–8ôí<€H»æÑ‘T‚ÅJ/ÍšþèîÑ£m‚[uÞ—e3DZDRþæC»Œ2I ê;ï ^ÃÅŒÛÚXœG—w,’ $—Ž7‘šXŠndˆ1o0í^+è³2­…¥UU­U¦áÏAò¾Ex¾z¼¹ù›´U–ŠËƒ%µ)Z)BW³æ»Wѯ~Ú+s5[¾îïö;àwÃ?³=‡›ûNøz HŽ1 üøË/˜’&ŒÐh)Uf†IÁ •pýªøð£àv,?´Vƒx›!`§áÅȲTíhî42;>b³Dîêãkº5|DšeÍ©iÉ{iˆ‘Yƒ⑘FUYeˆt\Œ†4Ál„þªà“?²—‰¿iÍzßÅšÔwúO \Ç6©¬Ê.OÞØO3¬qÉl’•M^ö eygbâçíwzo󇉕#’åxÌËãhá£N<©Ã+½j’¼!B”WÔ¯&š„!'£çœ£Ô”>Ÿ-N¾"éЄ¤ïwû×Ëu7&êÉF ^í-oËgtÛÿÙKöeÒ|Iáý;Åmã×t #Nñ‘á^ ëZ%Ôrk:&©áýBÒ5×íìå¿Ð,Ž©qu´cmž«lb°»¶I¯c ~Ó¼áûŸ ê-|% ørà­”rü6ø…©C¨ß˜U®uÛíRËB6z–«©Ú…XZÛ6¶6;ì´äŽÕ/e›öÆ_ü ðÎÎiÆÊÏBÐ|;­Ãq„V±Áik£ø[T½µ±³µ„ÛÂ\ýŽ96â9'PòB«îŸùÄøåûVØüW†]+ž…¤ÛÇ$ ¿nÃi{k¨ù,{¥êqÃÕn³5Ξág±µkO—ùW…1æyb3Zµ,¾œ©ûDã‡UJU+Ê„)Ea½œëEΤêÎ œjUœcí*S„þ£KF…:|ªUnÚ÷§fÛ‡´nóÛHòóIüM¸©5ùÇû@|)øø7í-¡Ú3I.èäø5ñ–E.cyB‘iá¹LŒ"È«4d&LL_ÅÏŒ þXÏttÿÚ[CÕdÛ:ž/Úîfß –Cy Â\ʪ±Dæ5yŽWÝ´gŒ¥¶¾Ôt»¨D7°H ˆ³ #*Ãu´ö—Æ[{«i7ÿ¡ßÂíouéqo,¨’³þ?üPÖU®§É¿kL ¡ ë>d€#aÛqVWß·ï’­ƒýÂS• 4e<Ó3ªœ)8¨áò®V•ï.ieÔçÈ›¼-7Ìù”œ”OÅ.iTµ*qÖZ·ZîòQ_m«¹h®–š»hÎ×ö-Ðü%gÿýˆeÒäðÿfÉ2{øÕàuU\ îÇ ƒÁ¯õ$¯ç?¥†/ëY×Jõš†GŒ}³¢çËý ’¿°¥Jvnü­·u{$}ÅBžcFÿX¤ÛŠšOšŠiÚR—Fšµ•šº½ÏŠ>"|ý£á£|eðàÀ‚ÿá^|ø/ñ‡Å¾-øÃûJøëàŸü–Ï~Ð^ Ð|;áÝÁ_²·íý­ý“ÿ û¬êz¾¯©ë>ÿ‘ƒL³³Ó.~Íww[ ÿnÿÙ?â/Ák?ŽÒ|qø]ð÷Â6ß ¾|Zø‡§|Nø™ðÛÂ~#øáÏÚOÂzŒ~ Ù|r´o_iŸ 5¿éž$Òàðí¶¹«­‡‰oæx[R×mä·ºŸ‰ñçì!ð[ãwíañã·íð;öyøíá_öyýž>ü7Ó¾-|3ðŸÄÿø3Ä ~$þÔþ1ø{eiãŸêÚg‡tOiŸ¾Áms êòßë—þÔ¢×´Û }@ºÕ8Ÿ~Ê_l¾(øû㟀eø]âoiß·–û]ü/ø}ãø³Àþñ‡‡'ÿ‚lxKö×ü!ãïˆZ/ÃoˆZŸÃ}oLÔï|wñ;G¾ð÷ÃŸŠ¶准ü%áKÕðõÇuÀÉö¦ôÙò§}¯++Æíµ«o[EFÚÝ_¯õòüµÓ[÷è}E¨þÓ¿¼?aâ?ø§ãOìóáß‚7Âïƒ_­~+j?<'k`|9ñ£Ä~6ð÷ƒ¼Uâ5ÔmôïøoáwŽ.<=¡Ù|ø•µ«‹~#ºñ·‡´½#FZ_ø¿oWý¥g/ÿžþÞøýðODÿ†‡þÌÿ…ý¯ñWÀºoü/?í¿øG±¿áO}³^‡þoö¿ü&þÌÿ„+ûoíÿð”xwìžoöÞ™ö¯ÅÿàßõŽ-¾šÏí~&ðwü)ÿÚ–+=ã?íû6|9ñ—Äoß´ü×Å~x+öÄø1ᘾ.xwþFŸûtèZ…ߎ<1ðéuߊ†ü%£øëá_Âÿ üv¹Â?Pü?ýˆþ7ü¶ñMÃÏþËÞ1Ñ?hÏ‚v_¾9x7ã?ÄŸÚâWƒ~ùÿ?k¯þ"ñ§âv‡ñWâíçÿ ]ßí¡ãM?⎑ñSâ/ì¡ÿ cUøys¬Zj tO§Á¿›…5´®ôì“Mwn鯋k?…ZA¯kmçÛ·Í_¥¯±úð/ãÿßÚBñæ»ðëSûWü+/Ÿ>xëG»¼Ð¦×|/ñàgÄo|:ñ>™¯iú³­ÿbmÿbXøëÂVzÄÖî¥ðçÆ ñ>¡£iðCcÏ ÿ‚Ž~Éþ8ñÇÇ«]ãçìóðCöø]û<øóÆ?´†•û@ü6ÕþiÞ#øûñã·€­~ø—Ķš‘ð„5¿Ü|$ðµÜ ªxÆ[ÿÍñWÃútz&”ði×>$öDñ·û#þØ?²>¹âýGÓ?h=oöâƒÁßô«ýzÿKðçí­âÿŠ.µ_øí¼=oi­ü/ñwÇø&é~8Ö,ÿÂ=áÏÙçIðæ‘­Ýx«ãŠê>)øåñ_[i¥ý¡þ#~Ô‹áoên¾"ëß¶F·¤üTñý—‹~ þÐ>;ñWìÅñWölý¡ü=ãoÚWÀ6:ÿÃoÚ âìW'†ÿbßÚ7þŸìçðĺ'ì½g¢~ÇßðÅÞøgñvÇ\ñ׊þ-üWøsû5þÔ?²GÅ_øƒP}Cáw„í?gøN>~ËjzÇÀ¿ë?´.…㯉ú×ë=WãG„4O‚éâoˆË–ø´ºê“µÚ½µè’¶¶¿6± ¯—ß×Sí{OÛ örÒ¼S ü6ø‹ûDþËÞ ø¹ã/x·Â^øeiûDøUñOŒ¿²¾1ø×àç†-4]ÿ„7ÄÚ¯µ_x6ûÁþ-ðVá½WþߌzW~éú÷Œµͯ긟ÿm‚ßæñާ¥ø÷áw†¼#ð«[ý¯|%ñ‘üñ[Â~øðëıßÅ_|6ø‡¬j~·}gLµø]k¦k1üFñG¼São_ø Àþ5ø«kžžßãÏàïËÁû~Ö ñööý´?ü.Ÿá·íwû<øÏÁ~1øóâO|Iðå‡Ã~Ó¿·WüÇâ­ßÂÿ Z| ñƒñßâÂï…´ï…µïˆÿ õO‰_,4¯¿…4þ!¿‡!ø#àZp¦¹·{ÝmË{ÛÕ¥fï¥ö ¾Þ¾[}ývícô6ÚëöOµø¥|Yºý§¿g›o…zî‰âè'øÕðÚ‡úχ<'ã |2ñOˆ4¯IâUðæ£¢xkâO<ð÷Ä­¦¥5†ãxkÂzŒöÚö»¥Ø]} _—¿?b߈ÑþØúoí™ñ³Dø'‰µ?øiÝøÂúæ»ñ7þßÄoŠ¿ àž³×‚®þ|GñoÂï‡:‡‰¿´>þÇ/|oãY<ð«]Ðáu\|)Òtøf{ÆÚ×ן²/Â_üý“ÿf>1½Ñ5/|ýž~ ü%ñN£á«›ûÏ_øáÇÃo x;\½ðýÞ©¦èÚÖ‰u©è×SéW:Ž‘¥_Ïa$Ýé¶7 %¬Q%•Þ—Zi{èšß–Êïi^é$µû|þî›®¿qäÿðR?ù1ŸÚKþÉûÿéëH¯·ÿmOø(§ü3¿ƒ¿mMá׿ˆ ø¥û/þÈ>?iþ8ñÿµ~Ú|EðÿÀŸ‹~ø;ÇúV…ã}ãm¿ÃÿiŸ <]ŸÇ˜<áÿÙcÄÞ1ðfÿþÓpþÕ¾Ôþi¿ÁHÿäÆi/û'ïÿ§­"¿Oþ0þÀŸ¾?|Lñ—Ž~.ø£ãŒ¼ã߃ÿ> x—àmÏÄô¿†rxã§ÃÝá'ÅùtoèZv—ñÛ¾ø‡ðÛÃÒüMð?¿4_Ù~ûâ„ü'ûJŸ+ûXø_@øñ§z8áKþ¾?ý&sÝz~¬óÿŠ?ðS¿Ÿþ>þÍÿ³Ç øƒá/ÄOÚSÃÿït+ÅŸÿcÛx+ÆŸ¼i¨|1ðÂÿ|ð¿íAâ?ÚGÆž Ÿâ­—€5Ÿ|ø+ñ£à…¨êW>%Ô~2CðïÁ|iào?øyÿøñáŸÃïŠðoöŸð&‡ñÛàÿÃߋ߲֑ñáç‚ü-â¯ÚŽˆ_¾üµðgà þ&]Éàßi´íKû<üoþÐÓ|ø5ã}G⿇þ1ü!ø©ñ'ö\±ñ'ǽÐÕüOã]SÄ…ïüÿàçÃ?Ù_áñÆ [oØÓö`Ñf/>*¶×ü|U Á࿈_±¿Å߆5‘uðþçÂÞ$øÁð»â·ì)ðǾƒVð¼ÿµíFÛŚğƒþ<ðOˆÛ¶}„0i¿ðUMS࿆?lï‹¿µgÂÿˆü?àoÛÿÁ?³G¿¾2Á8þ øïág‡5ïø'ßì³ñõtwâ?ÄÛá¿ìåã?øHý€ÿf_ˆž,×á@ø…cñ3ÂÌžñ·‚~øÃÄ¿õƒáÿü›öqø«â8×áß‚?h|‹âìÇðëWý¦ÿáZZøwàN‹¬~Úÿ ?g‰Ÿ²4ÿlñ‰ü=ñ7Åð¼/jo…?áøðÇÆ;ø%ãÿøH?iïüø?¯ø ⟌¾øÉÿÑýžÿhO‚þ5Ðd/Œ¿>ü@?cÝgÂÿþÛ~Ìÿ´¿Å?þÌÿ?o¯ÙCöuøÏñá§À?†zçíñÀ?á_þÐ%‡ƒ~ þ×?³GÃ?ÚYñÄ=7Ið‡À/|@ø{ñCÃ?¿OüÿØýœ~ü,×þ |=oˆøe«þбwí ¤xfÏź¿ü!šÇìáÏØËÂüáÍgÅ:.¿â ¿‡ïáÿØ_àîŸãUñ†«â¿øƒû_Ç÷V¾;Ò/u­çÃ^7üçÁÇá§À»/Ú·ö¿Ò>|?ÿ… gû1x[Lñ?À˜´Ù#ß³OÆÏƒÿ>øsán‰?ìûsáÿ‹ŸðŠxƒà iþ5ý´4ڧ➟àO ëº&ãý2÷â·Æ_â0?û!þÙ:‹=—Éþ1øÁñŠÛÇÿ¶þ½û'þξ,|,ð¯Á¯ÚTӴߨ2/Ûw\Õ¿kï‚øörÕþ xƒLÕüñÛÀÿ´{¯ÙŸá'мYð’ßönøŽ¿ü[àŸ‰öÿ´G|âßüƒáî…ûCü?¾Òþ#ü`ømðoáŸÆŠÚ7ím£øßáßÃ=cáíŸÁ¯ÙÓá'ü¿ÃÞ;ñg%ðf‡ãŽ7Þ Ö~8ÿÁ0ï¼u¯ÛYê’OyðÏá×ÀÛ?øg@ñ'þ:ø;]ûþïàïøC¼¿ø_´ü4ü4ü5ü6ÿ?ð½¿á{‰ÿ†Pÿ„çþ¯øQ_ðÉòiñŽðŒÿÃ1ÿÂÿwü\øG¿á ?âòW€iðDØÚ×ÎÓõíoö€ñ÷„µøY~#ðÄ‹÷Þ*ÿ„Çßÿáé0x×Þ0ø‹y¤¯ÆßÿkiŸðW/Ú_Lºñ­ÿÅ'ø§ÿ¯ÁÝwVñþ£âÝÇþ"ø”ãþ6ÿ‚¼¿ìññ÷ö‡ºý­þ|`ý›~è¿ÿaMàoÀO~8ýƒ<â¯üeø×ãOø(þ¯ñÅšÆëÚ¶ÿönð‡üIð»öb²{[oßµ/Ø?´~ ê¾ð7†OÄO‰ Ðþ-}¿û%ÁFþ þÚþ1ƒÃ?<3ñÄ‹öð×Ç|UûoÂ-Oág†n¼KñÛãÏìåÂøI<#ñgÅ7¾<øiñ7öaøómÿ §Â âGìã¯øsáÿü%ž øóâøÏáÕÿŒ<üÁ1loüw¯üiñ‡í¡û_øûö—þ¿ü+oÚÄV±¶™ã¿ßð¤tګšü+¯øö?ðÀ]þoþÚÿ´Ÿü]ÿ §àçÅ¿7Gø«áøEügáø§Ã¿P|ý•¼+ðOâ‹þ+ÛüEøÁñ3â'ăÿ¾øëÅ_ü]§x¯Qñ,¾&~Ò¿lüg ±ðî‡m xƒÅ>6ýªþ&I©xSÂþø5à éþøwðCá_Âo‡~ Òü*>ý¢ÿà¨xâ·ìý®i~øÁàØóÂÿ´ÿíoàoÚ?ö±ÖtƒZ×Á¯xWö>ý‹ÿoÿ|tømá?iŸ<]û_ZxƒágÇïÙšúkrÏösðfãþøšßÀ¾6ñ—€ükáøZÃ_ø-÷ìéñª #Cø#ðƒãÆÿŒšçÆ|!°øðSâ×ìñ{ÅBüý£¾9x_Æz‡Å¿‡?¶ß‰¿díÃ÷Þý’þ=ÃuáM_öŒ±øË£j>Ò®5Ï…zo†þ!|5ñŒ=âü›àŸÅ/Écã¿‹´»û9Kñöœø¥'ìmý­ð‹LøÞ;ý²>~Ñÿ ?i wþ­àÖŸû]øXÐþÖÿ´'?³ö ?„ ü`¼âo‹zçÁ­N‚x>~Ðÿ³Õƒ$øið7à—ÁŸƒz‡íü7ûPüTñF¥â¿ ü9Ð>2øÓÅCÀVþ*xÃáßÇÞðàøkþ ³ðOÇ:?‡ÛÀ? ?h|@ø£ÿ “ijWÁí3IøE¤øïö¤øEñ÷ÀŸ~,|øëð·[ñÆ_ |%ð7Ãÿˆÿ e¿Ú[â>Ÿá¯Ú[âwÀ/žÑþ k¾ñ÷ÂO|@ñ§Â/üGçï¿à¯ÿ¬§ñ¤Qüý§õ+oƒ?ßã¿í5­é¿<qá_Ùwៃ¾2þÔ?hMSâß‹ßâd^Ö¼Aû2üVý‘~/x{Ǿø)¬|^ø…ñ‹NÓãñìmáoÚ‡Á:|Gà΃Dÿ‚S|ðvðy~|[ý >|@ýž¿gÿÙ ö{øñ‡BÕ¾k>;øk£þƾý©~ø#Çš~‰ã¿ƒ^0øKâˆ~þÙ_>|Roˆ? |aàK­Äúgˆ>øá×Ä h2°è,¿à—ÿ¬þþÕ ‹þ0][~Ù³µû1|vñUοà±â­z|Bý²>.üOøÑ£ _‡öÞð߯Š?¿n¿=ñ4O…àø5 ê7>Ð~|ð‚|8¾¼óÿÚCþ [¨ü>Ñ>-ÛüýŸþ0xÛÆ?¿iÿÙ[à ¶¿á ÚxWâ¾£ñGö¸ý–~üfø{à‹­Gâç‚®~ü`Ó|ûIxs\øí{7ìÝá_ŽwŒ< ûF| ¸øóû'ZøŸâ|=ÄÏø*§Áß…|QûCø»áÄ áþû_ügý´yüñ“öøÿ ÷Œ~xÇâ‡Ã¯üCðWˆ¿iÛà×ÃùþÏñà×Ä_ xsÃþ"ñ§‡>;kŸðŽ^ø®‚Ñü?ŽO' xÃþ ×ð³Ç^1øÅãüTý 5kâoü+ëϽ׎<9{ÿ Ä ~;ZþÔÿ Ü|?Öþ0Yx Sðî¥'ÂßøZ~ÑþxGBÓ~%­–±ñ,|@ùÿðWŸ…šÞ½ñâŽu¯ˆý‘|û@xGþ·ÇðåÏ>0| ñ'üRø*‰ÿávxGÆ^(ý£tÏøWþ ‹Æß.ÿá[|!ø]ãÝbçöbø¡ÿÂm þÒz¿¿ø‡þ àïøÃ? >#þÊ_µÿÿhü@ð7€<%û5Â1ð'âGÅ=oþßÂÏÚâOÁ¯ÿo|ý ¾)|Ñ~üKÔÿcŸ ÿá#ñ7Åíþ'ˆü#ÿ öвø5û<\?Æë~Cÿ‚6þÈúOÂÿ|¿Ô¾0xŸàß„¼?à_øw®xËD·Ó¾'ê>ÿ‚u|Iÿ‚Xk¾,ñψ¼5àÿxóOñÄ¿ØóÇ>ð­¾ø·áç…l/ÝüVöÁ=ü¤|]øyûB|Jøñû@~оü@ðÏŒ´¿ŠÿŸàO‡õ_Þø'ûZ|ðÂ}w¿>|øe'ÃÿÙ~Ûß´w4ÍKHð&ñOWñߌôõñÄ¿øÂ^ð6Ðx›öïø{ þʶߵ>—ðÓã-§øÁá?ÙÖ_‚~³øgkñ–Ïö‡ñí]£~ÄšÇÁ›™ücñC›Äý¥µKï‡Þ,ñ}ŸÆ[¯„—xsYñ‡~#xÓÁ3ø{ÄZïÜÁV~ øwÄwþøð“ö€øGâ‡ÿjߊ_´öŸã 'á½ÿ ‰àOÙ ágìïñ¯â»ñŠëá_Æ_ˆö^=ÿ„«á—ígû9ø›áö™û*\þÒÅ÷ü,û]Åšƒ|AሚWƒúŽÿ°†£â?Ù/TýšþüKñ€µ}{ößðíxÿõûÏ Þx«ÁzŽ©ÿ<ð·ü+ã5ï‚?´~øÓÁ7^ ðåÌþ=Ó¾è>;øoâÏ Ï¨ÙøÃÿe×t†ñ?ˆî;þ ð ûQñæ¿ñoÅÿ>?x§ã?ÁÿÚ“à§í â‰:ÿ‚ü5¨ü~ð¯ímá_ÙGá¯Ä]CÆÖ¾üð߃¼A üý‹¾ü ð5×ÀÝ á§xWD×|8Öü7gûGxCöŸýŸBøÁðcöµø‡ûxo? ÿfÚCÆšŸ‡~(þÔ|w¤hÿµÔ<#§ñ3à&Ÿñpø³ÿ¦Ñþ-ø·áv³ñoâßÄÚ£ûcâ½áÿÚ—Æ?´&­àOxïDztß°ïüCöfð¿À¯éß²_Á¯€ôÏ숷¯|X¾%Ã>ø“q£øïÇw:—Žcþß„ÞÑ=ÿPý‚î¼E£é—Þ7ý²kÿ|mðwÄ â/Â?ÚCÄZŸìãkã¿‚zƇàOŠ_ Œ¾ø_ömðçìq'öÿÃŽÿ|âïxïö_ñ¿ŽüY£üJõÿ_êgCàèÀ?l/üeÿ‚¤ÿÁ9~]|øðÿáÿ„¾ xã¼Ú‡Ä hþñßË¿?c/ø/oÁOˆ_>'ÚÜ|GÔ¿á&û_ü3¾Ÿª|!ñ§ÁO |@ø'âíÂ_<¥|yñoÃÿˆu_þÿWæˆÿàdý¦?aïÚCÁ¿> xŸÅ¿> kWŸ´ˆ¾1xãþþЋö{ý¾<#ðÿÄwPGà‹3AøðïãoíÇñ/Xð‚¾ÉðàO†~|Xøƒà7ÀøKá?ìÇðëáéýQEQEQEQEQEQEËøãþD¿ÿدâý4Ý×Q\¿Ž?äKñýŠþ ÿÓMÝLþ †_“w^«ó? à«òiß¶ýüEÿ©…ÁVÿäÓ¿l/ûø‹ÿS :+Ÿ ðTÿ¯Óü¢9}Ÿð¯Ôþ8àí¯ùIÁû0¿€¿ú|i¯æƒCGÎì~Gl P63†%LH‰82‰%ܪ‘† µý/ÿÁÛ_ò’‚?öaõ:øÓ_ÌÆ,{e„`K–•¾O™ã4LH&/”e92«!ôÏ”߄ün™E&ô¾‹[îÖÚëÙèî¿:âDܱvéV èÞ‰G¶ÚÛ[5ÑÙ6×S±ÄÛ¤¶†äqòL× ¼ãÞâÝùè~¡šö?xŸC±†Cuð÷ÁºÀYÀxõ¿ÄBÛIñΖnj¢ª2ª…$©g,|Zº¿ Ì¢KˆNÐÒ$r/@O–X0o¾¾\1–#ì*SU0Ø„ùïJV„ç Æ2´¯É(ÞÊW¾ë{Ÿ-‚¨ãZ*ÑÕI+ƯY5ÌÓ³I'{Ù.Çßß>(øÖXÖÙÃàÆ¢E½¸2^럴21ù$9aañæÆ>Ÿ/ÑÈÎIýø[ñ{áéš5ÿ†^øf`&_~Ó;Ô²Ý"¢ùß´\‘#ü 4lŤ*„<²[bÌX±”m<$¼a˜ò¬\7rA`X}§ðó^HMœˆáZ-ª ÄJ LŽ ì_–]’¸”0 &Ði ðù¦_NjQçÅ/kýwhóRöi´«ÚÎnÍ;$“vz£é!>ü¶U'ù ´“MJü··+ºº÷žúµÜ¿†¿|rÖ/ìÿðŽÌ³oó­õ¯$‰˜¤€^ümºÎßzPÜ( úGðÄÚx«ÁÚ£ü>ðG…¬uh:™6™uñ*çRÕõKbÂݳ-5Ÿˆš†›-¾‹w3ü%{³ÇÄo‡úuhl4Ý=|U¦Gkaim;Í%½´ °WÉuq!žúîæêòîæâ_ÈóL޵zxçMb-J•G7<^%Úq¤ùéÚu'v”䓌åiÉÞ Ê0„_/2”“á×2Õ7d𼓋W}¡~!xÛÚ•”>"¶ø[ðûVÒ!³°ÓZ‹ÿ‰¶òøp@[é7VzWÄ»fòç¹³¹¶´µµ¿‘îg*×­x_àŸˆÿ| 7ìýð~é¼Ë  Æ»ñê2¬À…fßíóçíx±…îö²àíÜüW›Is,^TM A¨é×˾×Q°c¾[K¨"x³ ­u¸mg†)ชxá–/¾4x†ÉífÖü;u+hWöíi<«-Þ‰¨¦ ²ÔÊXÌj7ÝYÞ´QÛ_Æ0^­ý¤^ÞM•Ë.œ#^¦êÖŒhûv6œ\¹a ¸U§ËnDÔœ=ôåt¬”²ÄTUQpR“§tÝ9¨Æ QZ¤Ô´–¼·äJú\ð¿‹>-ÝøoÙ‡àCådÄÏâ/Ú\<È¥ÙOÚ%"%ˆ!v Ì<“oçÿÄ/Š~»ûJ[þÏ_,˜ÈÎÓZý ¤@­uY¯~9^çÍ I˰Wb¦ï›Ðþ ëqºÜvóqB¥F'•–ùðÁ0 °Ce¶_|WyæI0 pÒ˜UXLqgpÈÏ ) >mÅH ¬e5ÇÙªÿ»“å”ó ÊjK–0W‹ÅÆ÷÷d·‹‹µ­îžt✭iK¥:jð‚NOà“M(ÛTõ»êÎWÅÞ#Ño].-¾x;J&Œµ­ÿÄÙûÀP"_øÏS8Bç í!mä2€ŠO7¤j¥–¬mìLr4€ZKxñ´ˆÊ¬PÝOq2l1¼Íû¿”Hù|Ýnv&HŠ…Ž$c¶Öi&vY „,CFS;‚°"C¶EÆ)xgM×|A­Ùh²’÷XÔeˆCˆÞX,áÒ¼ºT¤Šž%†Ò)#¸½ŸÉ¶…£Y$–¤ÍxŽžMbs<ß2X ¿BUª×IÊJQtã¹Ô«^¬¦©QÃÅÎ¥j²…4ý£‚8háÕLv…*MÖÄÆOøi¾kÕI¸ÚþͪtçÎ’Š‡<å)AÊ+î/ÙÚâoüAðæ‰&™{®X}²Êã_±±½]Ž‘m"í_W[KßìæºU’;i…½ÕÃ/Ÿø›àO„|ῃºßÁÏÙÞkRèšµýÿ„cð=¬i¤Í¦<‘6³k¬X^Mmg5­ì𮩬Üê:]è–â]Eô¸?ƒŸ|Yпg]?‡Õ!¼ø•®Ä^ñèd¸µºš8£š6{`ö<ÍŠ8T­£´kabMI Ô3¼â¯ZÁq%ÍõÁÔ<@õv7r4—m£P6ײ,£í &·]A~í¯'hŸÊ¢þ"¯‹â/ø¶Té¬F†r¹ûI9Îs§€Á94ªÔ¼¹+æøô¦©ÒŠj’æPO†­Z_~éár NÓÆÖVn+WUÙû4’º¤íÌÚ¾©9sÉF?Õ<ÿðQ WãWǽ"ö B÷Jð6¥üY>ÐçžInî$¸øOã›hüE®¢¼ÐÿiÞ#ÅŒf"ö uKíBïó›Åå½±t[“#˜À'ÍFB†/;d‹—fòäQ†òâ;¦vd?žø·s¤ø’ÏP’»Eaâh 4’ Ô<)®éî8eGÄ‚‘º¸óÍSâUÌвIËE`Š‹½¥Àýã3î!Hè¤. ò® ˲®L6 ©a¨a°Ô©EÉÊÒ§S*“©>UV¥J®¢•IÎ|ó““œ¥+ÛæªâçY9Tª¤ç9JNòi¶©®HÆ2wäÝA¦ ›²ÔúâWÅɯìÞÊêñî’Ä4VO,¥åµ™ †V€³:ÇnŸ¹‰‹G”&øgÅzû_Ë.]»—%·l b0 yaB„XòÌ­F»â™ïYÀ|®·³È)¾b¬dDÚŒT ¬D`6æñoU7.Öê G¹ÞÉ€q•ùUUs÷Y]•”Ëó÷ùn[h’„åRj)FmsrÆ6MÎM»FîNMÚWló±8ˆÑ„§%+©$–‘”ª4乚ME«>Uosâ~òŒÕß° ã^ÿÁAÿaÉNBŸÛöfTBAÙøÕࢫrXñÕ‰Éë_ê_åUÿñÿ“ÿý†¿ìðÿfoý]^ ¯õU¯ä_¥<”³þ²åŠÉñ‘Œo~XÇ—êßVÛÝŸIÁRsÃæ“¼¥‰¦ßE­7²è–É-ÑhQE,lQEQEQEQEQEmÌIqc¥ê+mui} ¶³¤éºÝ‚Þé÷1^é÷§jö—¶]i×ööÚ†q%³Ëa¨ÚÚßÚ<7–¶óÇÔÂ_«ϧ…ÿð‡ð_ÿ(+—¢š”’²“K{&Ò¿}=Yv:øKõoùôð¿þþ ÿåð—êßóéáü!üÿÊ åè§Ï?æ—þÿÌ,»/ëþ}ÇQÿ ~­ÿ>žÿÂÁü £þý[þ}žÿÂÁü £þý[þ}žÿÂÁü £þý[þ}žÿÂÁü £þý[þ}žÿÂÁü £þý[þ}ÿÙ…üÿÔëãM/ö3ýžo0Xß4ÒB…#W÷dyJ*D´EŽ×ŠMÊSú€ÿƒ¶¿å$ìÂþÿêuñ¦¿—hœG$rX#£•WhØ…`Ä_™ Ư̧‘ȯôûÁè©x[Á±jéäÐVM«þþ¾—M~~º šÁO‹ƒWRv²m_Ü•Ó]|íßCÑjöŸtÖ·1L8Þ9ÃFß,€àá$Ž ‚ V-…×Úí–RÈdÉYk"¢¿  >bU7YKnÚÄb®ƒŸJú¸Þ•IF¤t÷©ÔxËF¿).öLø§B­š´éÏTï¼_É´þWOÌöÍPHÝ ¾b›iI€ AÊI»‚6ÄÃ’~dU?Fx/ÅFÙâiTÆJÈA,YyyYœ1e`7¯œHbŸèú¸¶ o9>IlÇ ?ê’XŒ”f!³På°CqêzV·%©ŒÆ&R‡e‘ÚTu\›ˆE_'‚µá/zœ®éÏìν¯k¯‹KÅßG;ýÑRŽ®Ê3ƒjí%¤o§¿ueÏ#i+?ÓüI’ØÚ;ÜÈðÃqˆÉ äE2¢F%ŽâF’0%ŠmÒNþaó™ÏÛß³—ÅËcñ³à²½ó®>+ü7E·nV0Ò7ŒcPÙ•®C|ø8oÄßxÆufaq ˜Ö2xT:3gnþ쪢(ŽBêrÌb;X¢~ üF¸Ó~(ü2¿;¢6Ÿ|x&‰ò [øMe2$ Û´•"P 7ÌIÃ<†5²ÜL›´ëQÄòÞ Õ}ÉS‚œ×òÚVj3m>W%£[:¶«_»(i.dÖªM5{Ýz®–mY¯²5Ÿ‹ù !»yŽÍÉ4€™sdå—pÄaŘþí”I»ç?üP¹…¦\™ ¹ì×vÅ‘­ïm”‡Xî" öw>YU#\A8k…•.Do_;jž=—É&@ÑÆv)”»¬Ä–'ËEß9`~ñÚÁ°6ï/Ö¼e4ÛÏšcVÈódf,ÁNܤy.À~íÁrÛ9Tc2˜Ó«J ÒJ›”¤á¢å=aïf¡ôƒm'k$™Jz]½[^äW4¥Ëf¼÷ÖÚE¤µæ^ïKãO$òÊm¤8— 3ku ³ÄèŒY¤Úd;ÞUrŸ5;Ñ4¯)ÈŽ5‚W8P 3€I!˜ b5wSÕä»/óBKHìÃ-ƒÁcªª„_‘1Ál!N&æ{Bæ 7O…înîdÙim_6y±.Káa‰;<Ò~êÞ%’æãÃ/—»ž.ÂWÆcqpxWÆbñTèУI^s©RV²ŒokûÓ“Ò7qEÆ­5ÅÉ·Z•“~í(4í*•[;FÖºŠ’ŽLÖš–¹ªXéz]©¿Ôõ)ÞÞÎÖ2ij–fžfA3Áah1q?–íÛqMs=¥½Ç¬ø·Åz7ìÅá‹­H¸M[ã‰`U½1ª¾ ¤ÖþA»Kkil“\A¢NvÈ÷=Åôþ Öžµâ öeð³ê³ˆõ/Œ^&E­¦âB¶h\Ç2«:Ïi^{¼!¢Šâ&žK§Ž-^ú9´¯øUðóXñv¼ß¼i$·ÚÆ­p5M9.I”DgµÔnÛj*GäÅ£Y«ˆìm’)#|›e·þPân$ϼpâ|7d­á<®·¶ugÆ¡8O9Ì šU13„¥ ³ÚœGN.*âªÃê¨a0™*˜ê«Ÿ‰Œ#kÁÊ>äT0Ô-ðÅ4IjÒŠ“””cGáÏÃ}j{ù¼aâæ¹¸ñ¤^â(oËunÓ²<·7*ãÍ[ç‡pŽ(Â%œ r²»GiößÞj¾'Ò´Ø­ŽÙ¡Ö[igäÙøwW¿;F|‘³3åÍå*P±<~“á?†³JS63—G.ë¹\nUùX`X¬+»æPެßhþΟÚûâ·„-ÍœàͦxÕ£!Ycb>ø¾c.â± )·Î&“v«]ÍûöQ—dÜË+Éh*X\.µzµê4ëã1 ëbñ•½¥zœ‹›•Zœ#N(Â:tãóõª×Æ×U+Mº’œR…4ù)«®XÉ´íÌý”µ“n_—§LÔ¬öN" ´.À©!•e‰—*~MÌUÛg”Òe”ŽxÖ-§•L˜N$Ž<¦P…RC ç•TÊrpÀ¿µ…8É‚LI@J¨ÈeHáVf†2‘¤Š¬FÇV‘ŽðêäÜ>|ñ—€å²óP°Yx#{!ŠD²¡Ãq&³‘“*×ÔÑǤ’••Ý”–—³vZ7Y»8¦š[·+#‘R”äç¿+NN2”ZJN£]Ï–îñ¼O‘uÆeµeÀU<’Ä‚[;B€­¿£Ù]™dv–Á·Sþqþ/N+Ú5ÍÈ2C4må;4nŸ1hÉ,*–ÜÛ ’:dŸ¹…¡šHÙJ´nÈÀœà© |Ø]ÀŒa‚€Ã‘_G†’©…”"½êsU$“Nð’·2³mÙÚýièxÙŒlèÉ[–1pÑ=[”¦›o­›‹VVp{­¾¡ÿ‚]Oü/ö·Ü†9lŸÙ› ÊŸŽ^ ^7óQŽU1ƒ"ÊÊ Ú ÿVúÿ)Ïø'ì_ø(ì çÏ&Û3ö`p±mdÉøÝàoždb¤ªWzÑ ʲþ¬uücô¨”^w±I¬›§e¼¾½7æÕ½:icïx2P–__–1Œ•tªr«sK‘ZOÍÆÚt饂Š(¯åSìŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ˆà¤òc?´—ý“÷ÿÓÖ‘EðR?ù1ŸÚKþÉûÿéëH¢½Lð¥ÿ_þ“)î½?V!?ðv×ü¤ƒàý˜_À_ýN¾4×òç_Ôgüµÿ) ø#ÿfðÿS¯5ü¹×úàßüšþ ÿ±b3F]±ÊƆ0ŠI!2›Fà¤*!Ê)Fûì^Û{ôìª%ªz)ío$Ò¾½tOK5óØüÄZ¥+*©;¦ì§µ¼”’¿½×Dú5Ü‚GJÙ°Ön-‰¡ýT„åGIÉ@p>RÉ $óÐN“©e*Hë±Ã©Á(Y Ñy‰$i#"y†6eR›XÏ^R›ŠtêENÖœú>ñ{Â^jÚî®|ú•J3vn‹ÕhõìÓº{ìӱ趾%…>}—HF <{©*UÓ>rü£+‚7e1®ÍÏÛxÆ«k®h÷‰¨®ë=WMº ò†a¾·q†0+˜ ”;‘CI£0ñ(˜ùhF@(§ ¥HÈXSÏ̤ €EL²º2²’¬¬YI ¤†RÃÈ# }µ  ê”hµZ“Tc ­%¸¥%%$Þ­½,­­ÖÈ^­ÎÜ”e®Î-5nš5²²ÖïM]îÏO—Ä¢`ñA¾v*° Ãmf ¶ãÀ)! 9çoUN óËÜlê†6¼¡ Táyͤ”/>yN^ìc«“\‘QnO™JÊòJ:òêwÚ…ÔðÄ÷72­µŽŸn 4÷Rå$hò$o0Ás,î°[¢Iq3ÁRHžå%Öƒû7xA¼]ây Õ>(x’|9áðd²‡`š½’íx-!yc¹w0 o$j·þYðæ˜Æ†~øZ?ˆÞ8ŽÞ÷ÅwÑ𯆚;yçži8󬨚rÆ gT¹MözU”[3 y³Í §ØBóQÔ8a€+>:>2øÂÎâö=>ÌÛé°;Ež½™#f s|$‘ˆ¸–(Z@¶ì±@ŠÖÑ%/.?§ïøsenž¶ø­á¿hR¥ÄvMà?‰rÏ«^ÍkøH5y­<3-•Õýý±fÓa²’âÊÃOÁg,°\Ow{øýñ¿áoÁ·ROûGø>Ð# ÌøWñÂA¾bØðøárìeŒÈ¦S¸2X–Vßëpæ:• §õ·N«ŠåŽ 4£'MÆ©TƤœ¹\yUù’yâpüºC–:ÙÚqP»I¦¤êrÞ6WI¦âÛ·»&bŠ/ø('ì8ÜÇtƒöÅý™öËsD<”ž8ÝIP®PÀn$ªu"ý)U³þÿ±F7ñÆG~Ϻz§£IŸIÁ Ø\rÓLE=škøoªº&QE,ŸpQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE|Cÿ#ÿ“ý¤¿ìŸ¿þž´Š(ÿ‚‘ÿÉŒþÒ_öOßÿOZEê`…/úøÿô˜Ouéú³ù ÿƒ¶¿å$ìÂþÿêuñ¦¿—:þ£?àí¯ùIÁû0¿€¿ú|i¯åÑU™‚¨,ÌBª¨%™‰ÀI'€$ð+ý@ðoþMÿØžú~¹ñ9Ž˜ÜC{s¯ý&"Q_^|ýŠþ4üo–Ö}Ã÷šv+C$ú…Õ¬ÀÅhì7LèUVñäÀ&`îØÌ[HÝý&~Ã_ðD¯Ù ?Äÿ´[j@Á)»×#þб·e ¬¶pÏØ#ea#’ÜH˜¼Èʤ_-â/ÒÃÿcW W,û:…ÒÊryѨéJɧÆNk…§f¯(ýb®·T$”œ}£‡3,âIѤèлO^2„NÍSM^«½—»îßNdÏæ#àgì¯ñçãΫgoðÛÁÕÍÔ°'öýÍ­ÅžŽ#–XÔ ,°é@»dó}.YmeDFHÞ9­Ó%ˆB˜*UT]››óCöõÿ‚³~Òš^·§Ûüð•®]µÛ6X!Ôm-Vqö‹a€Ownÿ6ËÈaŽ0ó\”R¯Äÿ ¿àá¯ÚóÀOzî‘¡ømÛ9¤–)w1•n+ÀÏ0J¸}Çåf$œá7ŒüA“¾0à·Ò 6Í+4ˆmõkõ|»6Ÿiuem>³xßÑÅïø8/ã/Œ?gídø“ÀÞð Ω¤Ýiï­yçIJ ÛwCe¢‰£·Ôeišh]¾Ìꢂ VoäGâ7Ä|jñ߈õ™e†Â6h´Í8HZÓGÓË-­S3srËçÝÌT¼Ó6]Œ0Á}N]ž+ñf<‰ÎqyõlË 2£ÍGÄ:-º´ñy²ŒªbpQxŒEjøºÔ*^Ò­«ª‘—Ìb²ÎÂW†g„Áà VœnQ¡d”eN„½ØM+Â1Œ#ñrÅh›“Ä~&ñ'ÆÏßxŸÄ÷>\.ìÑÚ[ü–¶HQbÓ´ØUV(À_)e•cN7,h« ºwvÑGoPB‚8a!‰p‘Æ¡QFI8UPI8œ×¥¬8á€E #J7mÄ[b!ä’yV4 !xÁfya—#o ‚¥kxyáÆÃ|®†.ž+7Æ*U³ŒÒ0³¯Z6o †”’©™Â„$¡*’sÄT„gUšq.:¾37(áâ¥ì);Y=9ç+7ÍRZ&ݹRåÕå/`ð­ñ&ÒUhÕÞ=„ô $G*¡XŸ˜º&n †¾èøW®B­ò¥X#‚UùB299Fû±ºÉØ’¥FK ¿>Ô|£ä!ÒA5¹l2@xÆìª€à2ŒažG<±çé?x¨YM GTpØ]U•$ʱŒ¹ÏÎYI ¼>ÌFáE}&m…|Óöki{JoìÊ ÆqwV¼RV²îöI•…­í)ÂmÛYµÒ¢ï¯G>dôvJ:ê›þ€¿gßÃyqj’_[éÖ6q¤º¥õÇ6úmŸÊ'2/–%ºœ8ˆZÚ¡·fà…a”J?\> |gÒo¼_áO è„Øx^ÖÝZÙK$m¨jZ„^ñK˪k² ”>¡pĘbˆ­¶hÏij²¤×WWËŸÃÿ‹2ÙAm7d™­Õ¶;ÉWrK;YU¡ Çäʦ@ß}~Î?^ßâw…•ç(ÇOñ±gIÃy‡~+H€.Û‰FØòy‘Ç“˜Ø»"üo?ẕ!Œ«M^¡^J:sC–œ½éFNçI4§ ïîÎ2”œ½|=uZsO•´¹e5^IÚÍ&ÒzÞ2nÛò¶¹G¼OñBÖ´4ÐüC¨Z[âSáÝwœº+Í ¤–Z—+,Þ»˜øo´iS-´³EçÛŸÈÿ¾!¹´¾¿Óo¢Ü£‰'Œ:Ë£r½½Å¼‘f6ŠìM­ä>m­Ô Ò»SZ×]øãû8—Áþ ñgˆ ¸Qn´ý*öK‹?Û¡F±KyT³M%ÅÜ1FÈn0’.Zý—ÿhi±.¼žðÅ´(ÿb¸ñ¹Þ£of¥¦x¿‡bÖæês …Ã[Åk4Â8Ö8f•&__$Éq¦/6ÀÆ­9^XJ5cŠÅBi:œï ƒU±1JINj¥(ó$œ=îoi¬éâ1ЧBj.ÎvŒiÚN|ªÉNñ÷›w»\­[òËâ~ª“Ë8Y‚©o(m"²FÃqrÃíI’T`2à!¾>ñ=Þä(Jïžs+c# Tw°3“´rXýÒ×à—þ$ñwÃ[]ð¿Å =CâWºªiÔ4C£øoX·Ó¢Ò¤—OãjWWZeýã_OõÕ¼Úa¸¶ŠÇP‹J´ž}bÓðßâƒ|iðóÆZ¿ƒ|á­cÂ>%Ðå·z&¹g-•äHÃ|7q«.êÊú6V«Íeg$6wïúwño ñ|V(ÌáˆÄåNO„­ ¸\ZPQQ« >&*õh9´HBÔæù+rT´_›añ: u)ËÙÖŠ§J¤Z”qiÞPrŠn2›QººK–êç¾ÿÁi þøsÁºl_fµ‹Âú^™hB$h`Ó’(Ù¼µ'”Efw¥l‘„Ç_Ñž'ø‹˜ð—€ÞpæK­€Ì8Ÿ-ÄTÆâpµeGO'Ë*·[ ´ÜjÑY†#FœªBQsÃáñTáVh\5“ÒÌóìelM(ÖÃá?w8©BU«%r”dœ'QŒäá%g'um}?áÇÀ-'UÕôý?ÃZŸáïhx‚Ö>Ò {9"I(bT;¤rØRêÒFØà~‘ø3K³ÑdB±‚ÙmtûhÚyQ<àÁVH¼´XÙÀ(ÛÒEŒÇµî&Î{ÀÞ·ð߇!±Kv7kj1n•î/lŒnTd0rKyd [!™Ð<5f¶Ö’ÝLêg•®åDnq,¡Îï+§—Ê~ì*u_àJØšµëNU')''&¥.g%}¥vß3NMós?uÞüÈýž TáJ1ŠWi¨¥fÞª)%½Ø¤¹y[zÜàþ/xi%ÊGòÉ™\¸\BbŽIH\9*Æ” ‰X˜Fã_öæý·®üGñûVø{.¨o4_ ßD—žKÉ•oX™¦iïl g–úÚ! ©6Áå¼Ò“,ð¼áÿ«ïÚ_\ˆi½º¹3}‚øDb@Ñ£5¼‘ÄìÛËxŽâLLr±í²¿ÏÓöÆøãkïüFøµj×:„òx–öãP‚ f·ŠÃmžtÑ!¶ûÚšÙUåwºIdQ:ÙþáàŸpÇq,‡‰ø‘p¬3 zyNe<*ÅP©žÕ¯†† ŠŒåB•:éJºIâh%ˆ§Bœ+Â¥jq—ÄñnaŒÁáý¾õ¨Â½ëÂ2i¬58É9FÍ·Ë%;BmFu%Êâ›_­/ÅŸ…¿4Ò¼C†Ÿwù*A%¿’̰Äñ·–$Š$ù#f™—rÂñ7–Ãâ ~Â~,øïñ‹XÕ¾ xRñ•©’f}Æ8 ’ÿÌynnEÝÃǧ5Ì‹Eõäž@y&½•eË4^Sû|)ø—ñ£Åþ𿈯ïå¶ÔnmM”W08¿]"D)#j$¤—‘ÝE1Ç+Ž–IJŽÓ„)СR–_OŽṳ́ñ¨Ë4jMûT$þ3‰):x烡ZS¡Jru9iGÛ7'%y8ûG8&âœa'(§Îä—á:’¬c*A•YrFUVªÀ©Gßè y­½žŸ§Ù^j”å-á´²‰ïîî¦ &vö¢k¢î°³âHT±8C&Céÿáïü+öEð“s?ûßêPùe5kÚ¦µÈÁØÉ¡ØÉ¤øfàJTZ$áS(CÉ¿ìï ü=ð/€m ‡|á?XùB#gá_hþ·h"(ȯ•gf²&õY9iWÍrÒåëö,ÛÅüT©å¹.£R’|φÀÅYÙÎðÚŽ¤ºÔ+O QߖЕÚùlVY T©Q§š*s”’{¤ª:WæïiòïmOå“À±wíOãÙ-¦Ð>x¿N¶‘ãhõ?[Cà«4Æå¹Y‘-žߘ=œ7&PUbIDVûçáçüçãÊÛ\xóâ¼#æm[‹]ßVñuú&È’)`ðîš®ß ?fÕnQ~bdP#ßû›3d£)ÇÊA]Ù*Cäs€sòû `` «$¡.Çàdõb8'!@Ë ’¯Ï3ø§Ò…l&_ÈÜb°X*r­†U³ æ›Nêñ£J)$ãõ+—a0’p§¸‹ÙÚ­Fá&ÒmÆ£IÅ8Ù4Ü®¾+Ú<¿ü?ÿ‚}üð´pËâ]wƾ8»TBc¹Õm´! ék£YǪ*¸@myäÁÊÌ~ø áÃMwJ¿ðßÿiӨō¤7’iÐêú¬nd‹o­jæûW"Ì#'í‘€dið¥:÷¾Z)Ã?»fhÙ8$± dPdž–×~*ø'Á˜—ž3𯅣ąŸÄ>$Ñôe Æ>DmFê×- ‘QbR7#UWó‡Ì±˜¼Æœ–kŒÄbaUJ?íxÚ³¤¥(Æ.T°µêË 7ÉF•BRŠIjïîQ劋Ž‘E%Í ¥®ïu6•´’»{¦äõ÷9üA$‘ÅódXbÛ Ï;4p|¡vCÌ<¥€1nU µp+Ëüe¯²YL¯39æS€DaB… ›B_c0@áOΆù¶ßöÑýžµè>ð×ÄÝ3ÄÞ+ñ.©i¢é:g‡lµ=ee¼¹bäÕlmdÒmâ„eîdžõ<¨ÒF“"6Uïø–X|wI¹ÕüU¢¦¯gý¼°Ï=…燎½-Æ‘rnôÖ¸K{Ófol­¯­ÿLtM?û6Æ #ÆöšvU7,j4M:×IÙeŠ¢G-¤ª `G'2Ǻ7F?‹ð['‡~|ø{½£Ôùeh|¦hã¹ñÞŸ"ªÉˆîVfà<5£‰Í¼Qá¨á*U¥V·G)Pr„ž *¸ì]9rÉ?cW BµÞ5pÉûgþÌŠìY~8x&*#v|²‰Sl¥Ã!-ïãÿW:ÿ&Ïø'1-ÿ ý„ã-ûfþÌíUUÉøßàrpª¨ôU@à8¯õ“¯Ñþ–£G?áGþ„¸æÞº¿¯Fï[ýÛÜ1B|%jp[U‹“×Vá«Õ·nËo-XQEüœ}0QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEñüþLgö’ÿ²~ÿúzÒ(£þ Gÿ&3ûIÙ?ý=iW©þ¿ëãÿÒ`e=×§êÏçþ áðùþ%ÁqÿcùFh-¿bŸ€ºíÌaKf=ÆŸ.àìp>Ü-gi!~rµû#ðC›LÓô;Y;x`ŽÆ!®!"Þ8UÙÔÑ•|‡lªªH$âEŠü±ÿ!øwÿ OüßáWŠ'E§…àœßÕ§ufÀºøñ’æáQTå¶=ˆ•HÃ$ëññö‡…—zY ˆck„dYVE Ÿ,¢£´©D+1RAÜ^+ç¯2|—F§5.ଧ/åR\´ëâëb³JµºN\¹•u5R½ð+}á:8ÌCWx¬lù.›æ…:táÊ­íÏI½\¾)h¯ý¹áç­R(R£1Ä–)•p«Ÿ•ÈTHðÊ” É$.¯­6¦M0wH)dÆðÎÈMæ?-Ù$U`±î* @û€i+bÛζÒb·ŽÞßʤw3Æ˜ËæÈ~rB€ÙRÈÌ‚HäÞ*áÿ5‘§é)F-äÍpe WbqØp£ÌBUÆ*1¼ dsø_#“¥]FsnM5~KJm96›¾ŠNêû讽…•¹žÑI·ÖÉ&Ò×[&Ò×ç¹òƿͫM¨‹©Ø1ŽX‘cG@ "6pɳË3±ð@fßæ›öƒ»Ô¼⿉: í˜ð¶½©·ˆ“R½KXÀ/Œë²I&x£ptc)&;C$Ѽ?»ßõv¾¤*þj"ÆÏ´á”âUÛ±Ð8pey ®_r¶à?xÿî¾ËâíÛVµŠí§Ky"sHÒÇ,h¦3½ä“j´…‚;©O–~Û(®°¼®pö‘QŒ¶Šqå”$’q·, £m®¾.o‘ÌÒ­6âÕ5iS~ò÷.®—ÄÚš’{9_­Þš¿ðHŸƒ0j÷÷u(Øhâtµðôw°yr\G‘¤º·˜!%QH Ñ ŒÂK*´Gú'ø¯âÍ#õmSQ6Éo–ó*;í#XƒU+ù`‰~DÝæaÑbùÝû=é°x?OÓt]Þ=3N´†Þ+; qvð$OXWl{AIqjÁC ª‘ üiÿ¥ý³®~| Ò|' »Ë¯ü@–K!žs%´ |å™’àI‹˜ÄÒ>$,a·™ab#µƒÊó(βìŸ,¥*Øü×C …¡N ¥JÓ¥ì¡''S)«RR:tùù¦£Ì×?µ£—à爫% T)ÊU4jJÖqPµîäŸ*Š»ººM(ß…øGus¯\üGñ¬«qo§ø×âF·ªè°Èÿ该YÙéº"ê6Ñ2¬‘‹ëÍ6ó2;¹¶·´š8ãF '´ý§N·Ì——v¶± ¥¸™"Hã)•˲/rrO8r !ú×üö£ñ ¾Ä÷ðž‡a½ž›àÕðÿ„Žn© VV·63Xß:ÅmB¯-Ä’&ØÜ®ÝI«S¥kæRås2æüo…|}z®\EIÕ·,a·$\åRRRQi¹:-6Ôµ±ýrŸ|>´Óµ;ÙüGaw¦›öäm>ê=L•[ÛåÓEÃÆ¥.ÄBù’I¶1º3 üfý½þ|-škWÑüS¬\DJÇö].8¡aò8‘æÔ.ôð´, ¦g$0·*}û9|Cø"Ÿ î×W±°27‡%“OGñ´ÿdiîôèÞæpoÕÚ&™á‘tçžW›$K„[¿ÅOÛ§Åß&×5+};I®Yn Ô^2á¹g¸—.ˆ-¾´œ1k|_og¦†/!Ó4ÿé:z’˜ƒùeÄis—cãø–æêwžçT·»šR]ÞâïGšF‘™žI ã5žFmÒvÉPñnxê99þÓ†ºü‡Å0*XµXÿh³í•]e¥$`ç§ÄË–cèlÄð'_˜P§‹§O,Êr̳ÛN0Ùø6R^åÛ*:ÊPÑŹ.—i»ñ×R¯w^R«{{³”§Þ;F¤§gx­cn–ZkúÿØÑ§ñgíOákÉRÚkè~(ñí”10Ñ_I°``Õµ¾Öc—(ÎŒ-ŒlÄ<¨ŸÑ,p6¹ã¯èAÏ—©ø“GŽBC’-F£—3(È\Ãoí ´Yx2þ%Á#™lò0U†þêÑтުà0eü·Å\\iç¹ôù”£—`pø*r÷¢¤èe´kÊ6wµ±¸¼TI%7&äõg¹–acF £©óJJ1²æue+Yk({&ŸhlÕšûT«µ­½Ü‘ˆä¼yæeÆsÞMÀmP|ç—#Ê‹nfÈe üÀÁp|jú¯Çß…~FWµðwÂÖ×\†ÉTñ§‰uH.àdÇÊWNð¦‹8lËpÜ·õ#ª"B¶VáTI¿ïTl88 ~t•Ž@åËuf¯â·þ ]ãdñ×í·ñÖúÞì]Yh:î“à›EI‘Ú?‚ü5£xsV´Œàm)â ?W–xÉ&;¹®8˜ú5åŸ]ñxéE8äÙa‹ŒÚºUñ3Ãe°ŠjéNtq¸†®õŒ*u=ê§.0NÎ¥X¦¯kÆ*RzuJJìÚ9ïø''ü¤/öÿ³Ìý—ÿõwø¿ÖR¿É¯þ Éÿ) ýƒÿìó?eÿý]þ¯õ”¯Kékÿ%ÿØ—ÿ©Ñ ƒøúûý!Q_É'¾QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE|Cÿ#ÿ“ý¤¿ìŸ¿þž´Š(ÿ‚‘ÿÉŒþÒ_öOßÿOZEê`…/úøÿô˜Ouéú³Åÿm?‡±ß~Ü–>;’Ýî?d€^·¸Vu•OÕþ$j÷±Ë†Á€^ɆØÙÓ÷ÌY0¦µ¼ iêð&ÊÙ HYŒi#*—XÜ“æv>YÈRH°}÷ö°ðãj¼;©G3ü!øe§FÈ XÖ=âyKËܹÈ';@%øÚE}ÊÏJÒm"†!¹ž@ F “Oº`yÚ|µu îq’O™Ý¿#â|dÖa‹ÜÚ¨¨Å'~[Ri)k´b¶Vºµícõ^£É–`§¤y¡)§uwÍ8ûÚk~hÙ7fšvÚï«¶–+vLÁæF‹ƒuXYÀtF(beÛnU«eƒ…;+â/Ú3Äâ?´ZÅ"ÈÊË ;X©XãS,®Œ®Û@.FötPbm‘bµö©©A§Y¼óîBa‘•r©TÎÖTUÃ2&RPŘydýáð?Æg‹S½fˆ’F ᜇWu’4¯Ì þéÚGU*UduP|l%XÏÞpi%h¹5¯+ו¤ïðÙÛ•;´ìzx¨¸Ò”î­“Ò÷çi8ßNWk´Öº-®|Wâ?2GK“,Ï’ Î Ê(+‡rXö²/Q%¿i:—i·QÄ×!šÞÝdgc´2.dÌ21iLLGË‘•U;ÅWw V–êq &Á6åHÐHc`àl;P4¤bëå`+E¨ü5¦›™-d»“{)D"Ž^uP$‘”í¢¶]I@Ê1.ÍŠO£¤Ú§åh©?v-ûÜ·zkv“¿-ôkDšÔùúÊ.´ÒÚZKì¦ùy’“Õ¦Õ­Ö<·oKý5àíHGNâD·eEÂù(€l ŠË‘—VrIÂrĉ[/þ]ິÏüZð†­oÓþ)>éÌFò•V–(§a&µ£:9{¹cSÌŒjPT!¿s?jßÚ3Jøð{X×REŸÄ¦j‡L³‡ÊYáK y/n®ü¶xù6¡J“ ß4±! Êò/ñ[ñcâoŒ>1|CÖ¼gâíVIuri&‚Ô"‡ìv!e¸‡Ocñ^‚ Ã+](•ák‡–âk•YZDþ•ú<ðŽ?5â:œ_ZQ§”p¬+Uuj{³ÄæÌ%\>Ž*üïNuq˜‰Å~íR„>,BgÁñ¦oG €†UNÑÄãí´¡N´gVRV÷\å5ÃV×4Ô—$T|yµ3“IF1ý´ƒ§°ø ¸ÿ¾Aõæ» x¶] ö ‹}m"]Ñ–s®[–P7`‘'Åë%7Hd"µgp»V0á iéš<ŒÈ$Ôfpñ†k[}oQ·xå}€™eOŠ—1;—[k ¶.»Ó<#-Η⥹¼HôÛ=6âI‰o%d7Þayëñ"Y­ÓuÙó<²‚Eb|µýKZ¿´MT”¦¥$ìÛqNN*ÊýkhÚÛŸ™BkÆqŒaÈÛQ“»k–ÚÆ:-ZÍ5­í¡î>ý«üGáíîÊËÄ…¢¾µTr/‰šE2Igv¶±?ü,eÌÆll É#)ÜÃwxÿâåßŠä•æñÜ=Áå%Ý$Pëå$¶¾Öˆ|~Í+&é$*Œ·˜é9\±9* MÊ)¤ÞñJË•¿y´Ý¯ÊÜ}Ôì¤Ó°RÀÁÙ5*ŽÉÞM¥¦šFéZòºNö»³ÝŸŽ÷º Í¿š´[s jš‘y ¬q¬Íñ^(euB#YŽ"XÝFÜr·æ d‚YdÞè vÏ«I/œ¬¥B£ø“«<žc«&ÔY˜œ…‰‰Ù_§7ø'w¦ „¬òÔ»:j^~cXàw{‚~!*$0’6• *FùRaòˆü--¬ž[܉ÜЕ½2'¬,_Åš”`ÂF]”(Y†o áœU,Fi†æi¥ï4Ú¶œ‰®x)%&Ó’³Œ¬´Ÿ,^¬;¥NR¦š’²ä•F¢ìÕÚ”®âïeÍ~T“ÛY/Ø?ø%Ï„¿°¾ëÞ$’ÜÁwâê„;)kMÎËM…ògŸÍÙ¦¡òSaVˆ…‘¢‹õ§öw´i"fOóÌ’ÌsLD©4ùmCž"œlÕål3p’·¼¯-UÏ¢ËàÓ¢¥¬£FŸ>úTŒ©m]¯8Þ×w²m½/ôf»{ RÝ\Ï"Emc´Ó0`±Ån,ï&Fqï *0UAꀉ~0›âÄoøþâ&†øÛÅ^0žÆø¦ñ6»­Iaä£{ÖVÄŽ2‡Ì¶¯ÚÿÇ/ð÷ö_ý ¼j“­½î™ð«ÆÉ¦Ý9(°kÚÞu¡h¥~a¯jºpŽ0TK+$ â¿…úýO诖rÐã æPV©[*Êðõ.ôT!‹Åb㲋æöø)^×N/H¦ïŽyS\=>Êu$®ºòÆ:_KZzêÚOF}™ÿäÿ”…þÁÿöyŸ²ÿþ®ÿ×úÊWù5ÿÁ9?å!°ýžgì¿ÿ«¿Àõþ²•ñßK_ù(¸GþĸïýN‰Õÿ_cÿ¤ ¢Š+ù$÷Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ˆà¤òc?´—ý“÷ÿÓÖ‘EðR?ù1ŸÚKþÉûÿéëH¢½Lð¥ÿ_þ“)î½?V}ûAÛˆ:"Ɖç?ÿ‡ñ‡ xfÉØÆí‹‚åFrGÊ¥°—Þ5®™§4Òدš)ÜRJ,Êîý䥈 ŸÝ(`€{Ç;ˆ!ø‡¤¬ŒŸá¿Ãõ ]P Ù02ÁÌEQ·¹Jílå>bñî¶Bÿe@bd8ûN@fA #,™VŒ`:º 9*Wñ>!R©žci´Ô#^So[5¢–«®ÐK§4›Ðý{ 6U—¥¼¨A/-ßnŠï¶ˆó_x¾Y×÷ŒHeeH¸Ý)P#Ée,Y#P çk)ù¼±#âO•ü[$÷2ßÉ+³ÈTãz.åŽ=§$}‹::• 1’$ 1í>$š˜åüÈK E‰`¬JÆW”!†ã¼lŸ7gÌ^(ñº½Ð ËË3È]•QIÊüÍóóî›CÆ^0$±Å»;Gu­ekY»vI$»+¦õߣ1’·²‚ºçj=£ñJNÊí»]Éét•’Iy~§¤#ÊÿzT—_i]﹕†WÕPùÈV%]NÖ<¶·¯ØøB×Í•–R!™¤>|¡I‰!¤“ÊA(cˆ2„éu/iZ}¼³Ý<&ÆýòJˆ#gMÍ)bÞ[I¾ ÈÄàªÝÃã_xºãÇÚÅåݳ¨Ðt©e„ÜP÷—þTn" ÅÙCG42¿)$°mÌá‹Íö7‘c3ìÓ–a£.|]XÓRm:T í*ÕÜWà TùêT×dìŸ2¿ÍfY†‡«^Vn1»I¦ç--._vS“Šæ»åÕ«¥¯ç§üÇ:Ž¥ðÃÅ:æ³,í©ø¯VѼ'£ÛJóÒtG»þÓ{ËK†–-:I¯œ¬O,«–±ˆÚ¿ômÎÅ´í¨· JÌió:D…<[§ÄÙ_çh‘Ÿh[ˆ!úaÿñ¹Ô>øId ›oÄ7‘UÝù:fœÌ~× ;5K’ŒAhÉ’,/ÈŸ ´øîZÌý¤$³7Ú%Î¥ þk.(Ì~>µdIcŠ0¨#hÚ"òId`¡Ü—àøcKÙÒÅæu£E8òÎ¥,-:8ÖRøÿÛ0¸Ú“¨¯Í:òŽÐÓñ Ƥñ™—ÖkûÕU(;´Úƒ›•KÓ»ÑJ5# ihÒ…¯vtþøyq2[2É#æ ¼£¥¼9•ÂìøŽÀ¸MæM„K¹\Jsæ©úËÁ¿å‡ÿnd2Ë%Ÿ†ü½?µZug¸ø™ád™LXÛùjìîð"EXÊß?Ó³×ìní­­µ¹e¹Òoš&•Öý–ÿM»›ÈUÔ´Õ?¼–³ûF<‚-J ÐÊÐ2[4¦~øÚ_>&Û4‹{£á¶—{iyu<±ø‹á_*XWþÙ$&Œ[MiºßR³»U·¹·7HùìnpéÔŒ\½ïkI&Û÷×µ§¤”yRIî¤ÕÓ¼bâå¬(­z¸êŸ*³j*Þü¢›\ÜÚ7u{-üÜø“áeÕ„#L΀¾¤Ò–*rüExüæA*©F XB„Éhÿ ¼E{¨Dšfâ AÐ X}¾í]7äŽ3Ä'!Vaò‚ªr7«© ûƒñ§á=Ÿƒm.í&t“Ä2¬±Þ¬:¾bÐ7gí¯-ÕµæÛÚ§û@‹DàfŸRk–²üÄñ:]øsPe±ñ.­b©Í—Šn­™Ã w3µ¯Ä{DÊùwLa™^7‰cXÌ®Of0–& BvæK•9ÉF¢÷¬ù*¸Ù.k§8ÉI8ûžó‰ÒPÕݤ•õWONÎÍzkï'w­¾šýœ¿gÿ‰2]iš”~ ñÜ2E=ý£>iÄž#ÔmÆ:~©$rx‹_¼‰¬´%ñʲIâ=A6Oea‰YCå±ʹ~¯ƒ±xü1Ì¥¨e˜ÌTÝNg(ÏB¥JkNH)Jk–æå’å䌢’.2*«¥FZFs¤­Ù;&ÓÖš{Ü©Eµ{F*2ý[Ö´'ð_…´o Am5¥¾‡£Zi–bhé¶K\R©`6ÛÆT<’/æ9vú¿ášºoÃÿ "¬¨eÑÅäÊÌkOQÔu11EÁ,ÖWšzÇ$‹“o! ÙþKø…{5Ä­n%¹–Y I&™åi™F|‡Ì1$‰€ô`Ÿ1o›ï#O]+M²Óheޤ•L”FÑ´ûM‘°YwX3+È8˽¿ãZžË €ÂFí:ÓšÑ=0´”mõýïoysm±ëàù§{ó'&îµu%{è•îÕö²nÝÌø,7WŸ±f½¢—+/ÄŸøÁp%]–ÇPŸÇ×MÃ.bX¼°Í÷¹º‰ ÈY‘úþŠ?àºþ6’-övømÊ÷Pñï5[a°»}‚øw÷ ‡ÞЦ÷Åq xÈr\£ ®ùׯ죞[õ 0˜›Yç¶k˜Þé·ìëC*OO‡þE–QwkíXñ3y¹cgÿà´µ“Š©dþÖµ/~¸ý“ìÏø''ü¤/öÿ³Ìý—ÿõwø¿ÖR¿É¯þ Éÿ) ýƒÿìó?eÿý]þ¯õ”¯Ã>–¿òQpý‰qßúÖÈ?ˆÿ¯±ÿÒQEü’{áEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPÄ?ðR?ù1ŸÚKþÉûÿéëH¢ø)ü˜Ïí%ÿdýÿôõ¤Q^¦øRÿ¯ÿI”÷^Ÿ«=ö²ÖítŸˆzžâHŒŸ þI²"Ûœ&ƒn‚†]å,6î)‚ÇoüCâo[ &›vd,»ÍÎJ‘€#U(UbVa¼(Q6…ˆ— ^·ÿ×ït¯‹ž‚ÝâŽ#ðcá´ò4­°}.æ"7cÂ!! Ê’1U1ŒdþXxÇ⾋ Ùêºæ¹kmkoŽæK”â0Ä I.æòí×`bdx¡Ûn.œþe™å•+f˜º’¿,ñ”cÑß•&Þ§} ¥-t¼’‰úNYšG•àéA~ñá”$Þ‰Æí´•ÝÝš¾±mE¿‡šþåâ}¿Ígb ȺºŒ‚1#)'Ê#$`1 ÑHbyWË>$xSG·–}KS`I Uy£KG,¬")iC+*¨Ê1|üû'å—íÿLø]àù/t_ê¶ë%¼I¥9k!2íŽ?´­Õ£ò¢HZ9$…å,缈çgá¿ÅïÛâ÷Æ+û·ë3hº#oélÓF&ÌÛ÷¹1Ì¢R°o@»Ý×ï¾}¸ûŽñZ³À¾É«û6ó\æ…J¥9Ûšx,¾J8¼\œT¥ µG ãd±”“ÎxÏ…öŠœþ»‰âéPšäƒV÷']~î6k–QŠ©;ük«ý{ý«?oÿxF}CDðÍô>"Ô.ËO´'±·vUòžöêØ²aTG¾Þ'ĬX\2±(~€ýœ&Ö¿áœ|âÏ%߈¼kcyã­bâDòåy¼K¨]jZjNíŸfÐ[G³H™ÂEª¤g`E?Ëæ™c¨øŸ]Òô˜[­O\Õ,´»@Ä»Éy©ÞGmj 縸\ *¹cŒg5ýgøŠÖËÁ ÒôI£†ÃžÓô{@ÊcˆZèš}¾Ÿh¬«³nè,ÐP† ”[ýUÄžp—ƒÙ_äù?6aœãc˜fyÞ{ŒäŽ.·Ô£‡Âà¨Ò¥¸`ð–;ãFœÛœðñž*¥y‡çÕ3|voV­|Tù!PÃѹ¥Í.iK^YT¨”"¥RZ®f¡:Žÿ‡¿µwÄX/~?ëH4ŸêÖþÒ4 ÜêÉw,R·”Ú×Ïmâr™¯åŒ”6c]¦H;÷_~0ØÚ=„cá¯Ák€ÛJìüXò0RTeaøÿhŽÊïÛ5ºHàŽDæ?%ø“]’m­ø£X¸ù®m &îêx­Z/7\Òaù¡òä…ä+In貇‰}cá猄–ñE‹G'—:Ê FÚÆ™~"@2#8PÌ× ûƒ±=YŽ42 ƒ'Za–`ñ8ˆÂ¶"„Õ|T#ŠÅZ4§±êÎúIóFQ´cüª¥R¶*¥”_ÖjAj¥BœÜiÎb“Z5kµ#úHøñ“H¹K+Àá—Í þ‡§øŸt­)Qå#ÍñËP󤙈Kc‰™T«y›\þÁxâ‡|5àÃs£x2ÛS³±Ð//­tØu‡ä»×ô½0#-×Ä™¦×mŒ°_Ü‹;­/ió™c‘š+ËgUšÖê"¹Š9’VÆOŒ´á}u_¾ Dª™‡‹<ëf@ddŽfý ã´’½ÄÌÓe˜¡ýwâíi-Γy«ô˶yLXSu§\[ÄÁu->Sñ¶-Ä·vò§—©Û¹ŽXchâ–Ì/‰ßEååÓYdóo™uŸ2 ¸L;|H.ChŽŽ Æ“º?–Ä¥{9NZӅ剺*•³'Æ^ ðÔ±}‘^ëÚ^9˜*œskâË› ¿Ìˆ£³Ô'äÍ}Wûqøá¾"~ן´G‰Ä©5¼ŸüS¢iïˆé^¾ é^Q ‡NÑ­˜lY,Z<¡ü©_è·‡gö?ðŽ^áìêRÈ2Ú•¡ËÊá‰Åaá‹ÄÅ«¿yb+ÕRoYJòz¶|ž.~ÓˆŸzµ-¿Ã8ÇM–ˆû3þ Éÿ) ýƒÿìó?eÿý]þ¯õ”¯òkÿ‚rÊBÿ`ÿû<ÏÙÿWëýe+ù+ékÿ%ÿØ—ÿ©Ñ>‡ þ#þ¾ÇÿHAEWòIï…Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ÿÁHÿäÆi/û'ïÿ§­"Š?à¤òc?´—ý“÷ÿÓÖ‘Ez˜áKþ¾?ý&SÝz~¬ücÿƒ†?o~Ì´7Ãÿ‡¦ _PñŽ·û2|$ñužŸ§(‚&Óu Ÿè¶ÓI¨Ëºr×~½ŽDÎÅ3*-dþ3>9~Øÿþ7µÕŽ¥©É¡øni¦dÐôˉÕdG•¯.™üû™Z,$ŠÎmÀâaŸÝŸø;kþRAðGþÌ/à/þ§_kùs¯ïo¼$à\ ð÷TÊ#˜ñ&g…Xùc³*YT©J8\:¦©§N«£SålE—ÌæÙ®>¬ª`eˆqÂRå§4Ò§F)K÷²^ýK·ïFRönÊÐVÕY™˜³Ìij3Y˜œ’Iä’y$òO&¬@8cê@ü¹?ÌUj¹Â|Ÿ×ü¯ê¬žŸ>1JÚR§9ù]¥MénËÊýŸ”mè——õcêïØ“ÁÃÆÿµ'Áý.HÖK]3ćŗŠè3oàë¿yr«CóépÛ‘‚ÈfîëþðþÕ¾0O ü,ñÖ®d·Ag ßGÍ!Q òÀðÛ;c’n@Û—e ü¥[óþ Eá1ñkâ/Ž&@að€“KØ… âZßk`TÿÄ·CÕ#`0ê& pßIÿÁH|[>ð^öÂ7|M¯iÚ<±«y{ PúŒÒ1có¤onËÞ ùˆÇ˜÷§ó7Œx‡žøƒ,–›röt²pWåL¬qÕk¶ôÒŽwRQirP啜[=<ypî¦ÚÔ«}.ÔŠQÙYNWrmJOm/ø9&¦r×õc’IBF ¶EбTgDñÆŽêÞ\q¨ar¡¼ÙyÍÜh3[s—[† ¡PÑÜI¯ZDùA"—þ.åËÎN]¤r¬v†,³¨vóÁ|c‚5mD#mÛ Uê‹´xûJÛµ0»´Eqµ”•$¬z¼‘}ÝY¶ä’ƒÄ2"’F2|¿ŠÈsÓG@G¸š¬+æ•ãrÓ“„9ZqŒc(Æ1’\¼ª:+$’ŠÒ(ó)sQmÁ'¬“쥤Rv²qµ¢ì•›Ñ&}‹áï‰÷{jÎ’l€"fRë$j.døˆ‘JX°#iÜØ‹– ïZÇW²ð¿¬Ž³$o¬èú´ÑQÀ-oâÿ_HSÌøˆÌÛÞX€‰÷4a˜à7æõŸ‹n _-uhܹÞ~Óª¬û[h {¯Œ‚|£ YW<ª+;nÚƒÇG ±¶£fXU‹\ÓcŠUŽçÎ:7Å™ÌkÂw9Šdy˜Éù ò52úu-£²”»%Ëu*rºM;kÝ%f®vÇMo' 5-'šViëgt¬’n÷²÷«µÿ‹Üý 6¯,aG jEc}¡¶§ÄV™’FÞ̾Q%Y¢fU—çÿøñfiƒjñ™Ë·ú;x‚Ù¦W<ÑIqÏÄ«fêYÈY·ჶVDóéüctchÛUµQ"²–ƒQ·ó‚UáøÀÍ`ü® ¸?20eÈÁ›]•ÉÛ¬J9Ì>"¸ØÃø¹2ž˜$àG"·£…….–z+·Í-¡¢è•×ãµ™œñ)«QNM­&ÓŒ#ѽRrjËDµÞú4[½ñÓÌdmUYŽ7,zü°Â¸DÊKŒÜ_`\¾Ke‹c;ûfãþƒsáDÿüõjíúŠåwÿÆÚ?õÿÊïÿ:éZY-µ——¹÷î÷îsò¦Ü¥ïÉë)I]·ä¶Il’²I%аu’'/¨K9•^>5InÉ%Fðž?Õ~N€—‚TÈãŸø'?†[òf¨Ê˜›Æž!ñ_‰Z\»»Ä·ÃÃv›·np‘ÁáÄU_õj¤L£ù¿¸ºic‰>Ôg–aý£%Ö £å.×c rY¸ùYWõ™ð;ÂÃÁ_³çÂ/ ä,š_ÃÏ ›•#nÛ˽2ÓPÔ7çæ,/ï.w9·¹Ž<ˆÓn:J<1Ã9}4ý¦30Äæmsµ)Ã.Á,—*³äö™¥9Ê2–•#m"×~_¯kSneIÙZ*u#ÅÚËHZÏV›kcêÏÙÒÂ3­xßUhÄ-tm_/‰og›Uš4‘ƒäÆÚeÓrˆˆ‡;H‰O×~;ñ=·€üã/ÞË vž ðˆ¼Ow4«²í¼;¢Þj·ȨÈV+7wTjp+ç¿ÙÓOò<95ìÉ™­x¯P” ;“ìºd:M•³(ŠÏw«Fòì-2cq æ)ãà¥8“À?±ÇýVÞM—šÇ„bðe íãmcMðµØ»Óu[éÈÁ%a`9"¿“ñøJ¹ïÐÊ(óºØì×/Ê)¤•I*µªÐÂ%«ÞJ­I· ë'f“¹õTå8gUÛ–çUßEÊ“–¾V[Ûm´?ˆ½OP¸Õµ-CT»w–ëR¾»Ô.d•̲Iqyq%ÄÏ$†‘ÞIØeØ–<š£Syê¿™ÿ _!¿¼?ZÿUèåXªTéÑ¥…”)Ò§ tᢌ)ÓŠ„"œ¥´b’Z·d|;šm·+¶îÛÝ·«oï×çÙŸbÿÁ9?å!°ýžgì¿ÿ«¿Àõþ²•þN?ðNXHÿ‚…~ÂpãöËý˜OOÞ5þ±Õü%ô»ÃÖÃñ*ÐprÉ1Î)¸»¥ŠoÝo¯sêx}§Ggÿ/cøÀ(¢ŠþC>€(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šø‡þ Gÿ&3ûIÙ?ý=iQÿ#ÿ“ý¤¿ìŸ¿þž´Š+ÔÀÿ _õñÿé02žëÓõgòÿmÊH>ÿÙ…üÿÔëãM.uýFÁÛ_ò’‚?öaõ:øÓ_˨ ÿɯà¿ûÃÿO×>'1ÿ}Äé1 ¾€ÈU$uãòŸÐUêý·#§îâ*¾®Óÿ r—þ•O™çTéóý߯ø%σDýŸ|kãâ)7Žøÿ\M{Çð·ŠubKH/uÝ&ÓS¸†ÒXâ‚{„3Û®ævBÉÉ#Ë·ÌbÃøÃ1Ï#8Äñ5\4ñøgÄY¶>•Ub0’ž.†S8Îp¬”èÑX ²…“^Érµ´½ØR”h*W”[£N–iTR„§´²~ü9ÚKÞrêÚþLR÷Æuz¥Slw´j €A06Ã㢠ùCÅèÏzúÝkMúο­KOÙ›öuµËÂ’øm;T´þÒf]¤©â)íeˆ6W者‚zKÙãömC?~Á6ð[>ÐduòüÀl NŒ–YSÊùd…wû•8Ï)J´¸5ʤš—5Lî;[óTŽWZ¢iGVàÕÕ¯ªg"ËT¤ÓÄVŠÞü”Ô^«D”Ûïº[¿Ÿòöãÿ?Wÿ÷ÿYÿæÞ·ùú¿ÿ¿úÏÿ6õýŠß³ª¨oøRßñ)—#þƒY€l´SÚ›ÿ (vjÓƒáÀà#‚…Ÿ Q1Ž4ð†cŽ8ãXcû%R ªŒÛ[gˆk)3þºàìä¸66[¹q ÃË}Ewn]{YöÑÿeA4¾·Vú˸ëðö“í×òÕÿn?óõÿõŸþmê&Ô.’ܲ aŸP×ccÀÎQ|Y(9ç9<@þÍ¢øwðƒNþÅðïÀ6â]¥’ÇÁ¾‰œ…R¬Êºj!dY82ã: ºº…<že‡€ü%o2Ÿ’èxsEŠe I {$òËà©+!A€$ (qÅ?wðóz¼KR*ÉG[.½ÓZ%&Ÿ^©5–S›ÄÔž›rFÚrõH»û¶WÓ_šþ6vëóç©ÿàO‰ù¥¥Xõç%c±Õ°NÔ›Äìpá|FÜ@'Éõ¯ìŸûßô,øsÿ¶üf¦ŸOÓ¦—O±ÚB‹;} òÊ9?1QÕŽq“ÅM^9Œ!wÁ¹e9;$ÿ¶qýÛòÓú…'+×Åk]Þön}6õ”â’»oË—ª›·Â÷ÿ‡þ?üàýÆ?ðG†ç²Õ‘|Aâßh›¦MI£€jº½ŒŽ²_Ý]„â]Çs‘¸Zþ·5f·µ³ŽÞ(Öx! QŒ,D†8ÑS.Û1 w„ Ðn™â³€Glµ´yÂľ\i½É>\Q;±f!rYËIáõÉÞéD0‡2ÜÉD¿~BÎÅ…ù¤¿ qœ 'ŠùŒÿˆ±\ASŠÅ`pùu » <&… EZÔß¶¨ª×©7R5 •#NŠis¿Ý+ÉÝ"éR§ìé;ÓRWšM^VP„o¯2„¤ê=²“m§sîƒ:jØx?ÁVþ[¡,Ò  o—X¾¿×BÂ9“iwbrv†€C¼¬K ±þgÿÁqüršGìÍðûÁp]ùSøïâ•ëÀ¬UïtŸ hZ­åÌn™ ‹QÕtK‡,¤$ñÛd« úÓ¢Zťà œž[®—io¥Å„ô{+m!· "ÈNd`ŒØÉQ# þs¿à»^Êÿ‚sÿÊB?aû<¯ÙƒÿWoëýa«üžàœÿòØGþÏ+ö`ÿÕÛàzÿXjÿ<~š?òSðWýˆsýXDúÞþ'þ¾ÃÿH (¢¿‹O£ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€>!ÿ‚‘ÿÉŒþÒ_öOßÿOZEÁHÿäÆi/û'ïÿ§­"Šõ0?—ý|úL §ºôýYü„ÿÁÛ_ò’‚?öaõ:øÓ_ËQŸðv×ü¤ƒàý˜_À_ýN¾4×òç_êƒòkø/þÄðÿÓõωÌßqã_úLIa|úŸÈšêü% Íâ¯xgÂöŅlj"øSÇZ¾‹¯Áám^ÛYƒMÓµ{myo,‹KhÿlºÑõ¨ÔCr"˜±’Lcæ¯Úfñ¸^Ì+å´%‰Ì–0Ä`pðäS¯ ¿T¥RP‡5Z¥ç(Ås$ÚJ磩/‡š OkEµÌß’M·k»-vGõÙagm§XXéÖH±ÙiÖV–qª…Xí,­ã¶¶U@ ©Q¢€VÉÀ'Óž'òŸ æ¾ø/ÿ/ý‰¼_‘¦|WÕ¾4|ÔÞßeö¤Þ Ñ>%xZÖXÕB«êz¯áÿ 6M¹¶£*móeý6øUì…ñÎ+að›ößøKâ=JûoÙ<;}ieáß³;ªùxw_ñ†™âAl ÒÊWtcÊ>`þÍe˜pÅ(ÒÎ2.!ʨá鯒ÅfoO ãF*¢ÅSÁÏ :ï!UÅ7«½Ô~š—%dœ*RœŸ$*ÑR¼¶¼9ââïvËk-¬y3I´ãdî¨HúgŒþ³œ€ðr23ø‚ä@#ñ÷aý†uùá鿼={ƒt2ö8e\‘-¾§x¸óL§˜0 }á²².¿aψÑ2›xXq™¤¹:í«ÇƒÎÄLºY\¶ZX¹àà|ÕóT¸ï ””´iÉÞÜ¿VÆA¶ì’WÃk­ïdݼ­{xzÑ»”'ËfÿåÝ¢•·j§nö»½¶hø®®K+†7r𘃖ØRC ÿ–xäcò[€}3_I^~Èÿ­]‘[|mÚ®‘ÜJÉ!+ÎÖÚÛ?Ù7âö¡0µŠûÀ²+´R‹pXØ‘O C4Û åPù,À#|Չ✾­\,ðù–•:u/Z2«R.qö´&×'ÕÚŸ5b(rÎPŒ%]WMÔ£´¡%' ò8¶ÛŠOEtÕää½î]"¯/†ü­§óõdß±§Æ˜™• ð­È öþ `¬pNÕV¬8_™U2IßÏ%uû(þÐ(•à5¸;ÌxƒÅ~ (9s¯[`1!-æ®så!%‡Rã ’¦”ó<¾êò©Š§¯ÙO‘?[»-Ò¸åJ¤Uý•YöŒiÊí®úh½më£>}’EKOeÈŒúddŒàsŠ©9O²Er÷¶åä¹¹‹û=EÉ»‚+t´qy3}™m¬Íta…–éî7Û]4Öð±Ë7·\~Ì´<Šß 51L:ëž¹C¸‚ÅZ×ÄRFá‚J~l¡ PŠá5o€ß´·•5‡þ&B±™Ú(¢Šô˜ƒ¸Æiħtl!BÇh(˜+iç5IóTÎ2ÙÉévɶ•”cÊé^éE+ËGetùgK]òû9Ѧ¬ù\Z”•×½+¥ºÙ;¥ëiMwremªÄ È*Úyg9d¶JÄy æÉ7ƒôøõψ¾Ò&aökŸi?l-›H/ažèáð~Ì—(¸ d~éÛ¹qðëâ,†“áÿŽ¢2(dßáyXΡ¤FÓ÷Bƒa.Ó¬aP‚H$W[ðkÁ>$°ø›o©ø‹ÃZö™c¥hºåÌw:ž“coö«½.}*ÑD×VñG4†ëR,¨®Î <¸)íàÏ3œ2œ|èbðÍÓÁ×CFU'VPj2åŒÞ®N+Nk-î´:(Ñj¥q„¹SS”ù=Û|)]«^ò绳j+sì(Fpó |í$’b²He¹ÁHÁy·’ %Í‘ªŸ-¿ÿø*ç߯Ÿ¶·Ä¸£¹é¾²ð·ƒ´Ä ìë£x{O”,ÀÞjmI¦Qò¤¬Ê½ 7ö>–¶³é¨ÞnÑm#Hòȱ»Hx+ JÌZMª›•RFfÀcüü~ñ’|CøßñoÇQ;I‹¾!ø»Ä1³Æabš¦·yv€ÄU {VP»6®Ü` ú/¢^Wõ¾>Í3ì²nÅrÊÖ¶+0Æ`°ô”´µ§†XÛj¥îGF®ôùpÔâžµ++«}˜E·gÒÒåûßsÈ袊ÿDÏ”>Êÿ‚sÿÊB?aû<¯ÙƒÿWoëýa«üžàœÿòØGþÏ+ö`ÿÕÛàzÿXjÿ<~š?òSðWýˆsýXDúÞþ'þ¾ÃÿH (¢¿‹O£ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€>!ÿ‚‘ÿÉŒþÒ_öOßÿOZEÁHÿäÆi/û'ïÿ§­"Šõ0?—ý|úL §ºôýYü„ÿÁÛ_ò’‚?öaõ:øÓ_ËQŸðv×ü¤ƒàý˜_À_ýN¾4×òç_êƒòkø/þÄðÿÓõωÌßqã_úLIã•UBzõõ?†? ÔÂD=~<Ó£è·:f™ª[é×0ÊKmwk=¼Ñ–ŠXž6e?^·üóþ <öñÚËûQx¦x"XÔ%Ç…>Ü`¡çðT’\¶T3½ÃÊò8#3 ×Îÿ ¿bÿÚ—ã{ÙIðÏà׋üC¤ßÐø¢}2mÂ\¸ñ_ˆ†“ L@`ÞE¥õÅÉPJÀr¹ýbø-ÿ#ñö°jþ*é^|¹fð·ÃÝ.÷^Õ¥B¥Í¬Þ$×m´'O¸o”y–šf½n¨êþa,~]żcàn¤êñ6…3lÆßì“È09öií'zHÓÁâÞumÍ«†„¬¯;YøjXê±OëF›·½í%FRÞó•4ùewËÉn¢ÛWø¶/ø,üfD_Ú>íÕ0—á—Á‰Y€9ÃË'æ™óб“~:0ãÖ?ügö·øÝñ+öPøGãÿø¶ Æž)°ñDþ#Ôdð·„ôeÔ®lü{â"ÂG²ðþ¤ÚÆÖzm…•мv¨TE—Ìy&’O“¾ÿÁ.ÿe_„k6ðÂ×Åš¼/üB»O_<²•¹ŽÊö%Ðí¦ÞÂbÚ~‡e(o,"TûÇCðÚ4ö:p]:ÎÚ=°ÃiæÂ–êhKta QÇÉL^R îêƒ,ù+ÄÎ0à.+Ž Áü—p½&¥j™ ·(˱™…9Òöq¡_ ”áÜ)Ó¦Û©œ#dÃ0) @ØÀÊœ›AÚò1·/íâY0eÓ|+>Öv-5•Û9 ÛŽÄ‹SHã8Ž28PÇ?!E¤k±}ÝbõŽÌ®“pH=%¸uÈÆÆ@fÆ1ãÅÀ¨Ú~@ðÚ‘w÷žØ)![,çgÝ HþMìpœÎRÂÆöµ¯QEi~U+'kõßÞZ³©J«·,éÎv»Šª­çd¦Û·Ý­ôµ«ï>>xŽH¤‡û Á쎇{¾™´)PÁ—:Ç ‡ €ØËБ‘ó~5êºuåõÌšv–i¼ÈÔ}¼F±˜•öšúw‰cNw´ì±¦#Ž0ª¸ãoõ¿B|¹gJœâ[D18Ü@Þµ»:A‡YvõȆ%ãé®ÞÉñâk¶3Él²"˜e¸·TFi$y˜ ZMÄ JSçù²– *Ôÿs©{EËÞQ…)ViYÝ[Ù¨ÝËG6ìêJRŒæÔ7m’æsv÷•ߺõ[žûaþß~5ý›¼§üFðçÂ/⌺Òé+µ‹Ä÷Þ};æMÔ-îÃzð6s̳XË;íŽÖáôý)º ¿šÖð_»¨¦Y.ÿeK¨Ô‚"‹ãlÖùç's?Â{ Ã° ˜:åOÞ_<¤|SðŒ~x‰Ci>-Ño4‰ÜÆ“›9f@öœK˜ÚëL¾Ž×RµÝò‹›h÷|¹üƒxúǼWâ?ø‚ÜÚë~Öõ=T‡æØ·º]ܶs´,ʦ[y^#-´ÀlžÝãš2QÔŸéxÃ;Áñ[Ä\7Oåxº8ºUc›g¸WÊñPT£GšáéÊXŒ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ºß Ê-m|Y~¶Ö6‚{3¨éº~«Ë⯠X¼Ëi©Û]ÚM¥ÝÌ #@Ή3ì*Ç4Ò»¶Ú7ßD›}»w§áø»•ÔÂ_«ϧ…ÿð‡ð_ÿ((ÿ„¿VÿŸO ÿáà¿þPS´?š_ø ÿäÃ_/¿þ¯ôôå讣þý[þ}þÁÿ„águß‚øã_øJuÛ¿ øcþ/k«aâoÿÂGâk ïè?ØúeçöÆ»gw¤iÿhÔ-æ·A(½œß¤ÿÛů—ßéåëøwÓÐ讣þý[þ}žÿÂÁü ¢Ðþià+ÿ“ |¾ÿø¿ÓÓ—¢ºøKõoùôð¿þþ ÿåð—êßóéáü!üÿÊ -æ—þ¿ù0×Ëïÿëý=9z+¨ÿ„¿VÿŸO ÿáà¿þPWÆ~$ø•ãMWöñð/ÃÛamüoû#üRñ‘ðÆ‘¥èú‘w⩾2| Ñ#×µKMOÓ“YÔ´ý")týãVûkhVº–¹‹öâwûE¨Æ\Ö“º‹–±KEæ¤ÿ!^Ûù~6^GÔ”QE@Šôs\ºÒ.¬l,,|8–ÉáÏÎþð­ìï=ï…tk빦»¾Ñ®nç–{»™ç’Iç‘ËÈy ßð—êßóéáü!üÿÊ ¶¢›NRºm;EZëþÞBNú÷ÿÿúzrôWQÿ ~­ÿ>žÿÂÁü ¯ø=ûb|ý¡ÿá"ÿ…ñÏökøçÿ‡öGü%¿ð§µß‚áÿ„ƒûOûþ/øB—[þÄþÛþÄÖ²?´þÍý¥ý‘©ýÎûß”­7yÙnù•ö¿¿Ô5òûý<¿­;éètWQÿ ~­ÿ>žÿÂÁü £þý[þ}º¹½šð$^Ò´[ ra±LH­ü¹ÀÖ¿aþ|zøL~ü?ðÕï‹´{}wD𶃤Og¨?ö}Äwöu½­Å¼'RŠÎ)Z9 –’Ü-ÀQ"; þñš†yžàòê8LÓ†ÂQ–*ž; …§ˆ•[ÄBŒè¼_±¯MJ•Ò©F¬*Fõç%ª´ºð³£‡”ªÏ³j*3m^”`äÛá+7ÍvÔ¡ð«·ÓûËÒ¾>Xë·üøå´;":MÞ³§­±,V%$¸ÔVŠ8–1 ‰‹8r€1êšDp\ø_â7ˆt=áe·—BñF±£Ê Á¢—L½·oâ‰ñ 9 ÊÀŸ[Òj/Žú9ŽK~9—hÌgRñUÞ¿Ï!Œzôúœ3uÈóREnà‚Aþb­Âøº (Õ„›“O›ëT•—-’—²—KÝEé£×›OAãiÍ®xJ4Ò¼§Jm·}_<îÝÛVoEæÿ«MCVø©¹fð_‰´¢Ò#°·—J¿‘vñ£óžm9¤V”’HÂ"  v…ñX|»•ðž*Óã0¢çH°œÃ Á­5K§!J–mÈ­†5ƒæ^Çöãý«-&ŽoøZZå°9òµx+(Ü<¿7EðΙ+`1!›Ì 2ÈZBe>¯¤ÿÁH?h %Ž-KDøS«ÂœO†|Oa} ÌŸë&µñÇØw`Å–LŒ’¿½Q,òŒÆœ"•¦ì—,q š6Z§Î᪵µë+¥dìãZŒ¦ÜçIFÚ7BMµ¥•”ZZku}šNìþ… ðÇÁ¹ž1/ŠÒÄËŸ 묡I)ûϲÚ]ÈTnós —ÂÉ&'½kð§àµöå‹âΖ£kn–%±RÐ@7úº¶wŒ($°Ü@!Â-;þ {âˆR8õŸƒÕœ«y—:o޵/ª8C•ׄüJήØGS¨ÄP/˜]ÞRzÿ5ðAŒ¾¹ð£Æ–¬/ë>×]†ü-¬Ïá(•‚•m»ðv¸‚Nw‚Ìá§&* oÉ(T½¼áÏvÕí«ß«våGšðXz‘Ñ«J¥]Ûtçe×kk³Lýhø«ð³àï…>øƒÅ:wį x‹UÓ¡Š 3AÓ5T›X»¹»ž(Ði¾Z\;UÜÞ]ìŽ?&ÞH¢Ÿí ªŸ–>*™¯î/“8,±l;IÚ±ˆåE*›™™±†Û¼‚Çhl¯7øƒÿ øI>.¡…>#C¸™£Ó®4¯ ¥Ä³\•T_1<]=’G ÓáŒ,ŒÂ8þ ñíÿª^=Âø?áý›ÈááÔ|E­Íz蔤shúU•„D…PŽbצG¹`Ix,y9Íȳ‡³U1Õ.U5NS7ˆT£w”¤•Ü[ÛF»\-8©{x(«ûª·µi«ihʤ›ºO–7K{Y³î›‹IL€ ©Ù -Èe%Xñ@¨<í8ÉëüÙÿÁOáð~ŸûMj0èpG³?„<'uâ¿&N¿%¤ûe’2£h›Ã£ÃÅQÖ”K?˜¯$Ñ¿Ø~.ý²þ6j¾aÅ–::2K†´-.Úܬ‘… ·º´:î² j‹þ£SF1—ÌÄÌ_ñs㯊5/üTñgˆµ}vÿÄZ¥ýÍ ¾ÔõÛBñ®mtûKImæ¼¹w’ClðJd,M¸U1_»ø%†ÍøoŒ'žÕ…:QYN7,4+Ur®±°n4ëªqö^ÉJ“®”ª5*´iZ³’òó‚ÄÓŒ(:ÎN½:Ó›‹Œ©Æ²|Ÿ ãh”œ“N2q•œù_%ŒôqÏlóN§£ çÑŽ:ò?Èϯz²¤àóíÇzþÒÁq­\J‹–ž±æ|³’Ñ5“|ÖjOUknº\ñž'ng§¡±‘ê?:ZÌF<ŒŸóëþ}jÂ19çú/¥}<†'—÷‹•íi¦—*m§¦öW]úuÉÓ³µÿí_ø'?ü¤#öÿ³Êý˜?õvø¿Ö¿ÉÏþ ÊÇþûŒõý²ÿfù­Þ¯õŒ¯àŸ¦ehÖân qM["Ǧ·þÐŽÖoô>§‡¢ãC{kV?ú@QEüf}QEQEQEQEQEQEQEQEWQáÿùøãþÅ{OýM:øÓð£àO€¼cã/Œ?<1ðïÃWzv•áý?Sñ>§ ‚êºõï‹<;}m¢hÖÌZ÷YÕäÓ´ÍWUm7K¶»¼‹GÒu}^XcÓ4­BêÚ ›•’m¸É$µm¸»$º¶'·Í~h騯ˆáä°Ïý—ÃÿûïZÿåEðò?ØgþŽKáÿý÷­ò¢«ØÕÿŸU?ð ]w_z:-Wľ#oÚãÃ^ø¡â oÀ~‹DžïöbÐü7ªßØxãÇÄ )GñCÅ6³é·¯Å‡]Pøqû0k:|~Ô~Áâ¿ÚoEÖ~>øçÀz¶—ûþQÁG|yýûFþÜ átüð—ü.Ïø%çÀOÿÃ:ø»JûOíû_ÿkxëþ CáÿøRß±æ·ÿ gÃ?ðŒülñ7ü$ßðƒxcUÿ…ûQ}ŸÇ_þÝÿ¦ñØ¿áñÏéßü<öÿ£’øÿ}ë_ü¨£þGû ÿÑÉ|?ÿ¾õ¯þTUÆbÓö5‰[’]wÖ/{kÖí´Ö–.»¯¿þõÙŸþÖ¶·Äÿ…Ÿ¶ŸÃ_ø+â·‚| ¢iÿ?dÏ÷ìóñãÂOx§ãî•ûBüWøkáOüjøû>]þÌ~$øïñ›Á>ð§Æ›½Ãâ§„¿lo„ ð÷Æ?´í{á/‹tO„5Ñþ1üóâOÚâÅÏÙ£áö´Ÿ´Þ‰ñÛöŠñÅø&ÄOŸ±ï‰t_øoß²/í'qÿ ýŠîÛà7ˆ>%|øYqãŸÙDÐ|s¯xïá~«ð»ö²Ñ¿hÚ?ÄVŸ_ðmö£¬|ø÷kãÏÕoøyì3ÿG%ðÿþûÖ¿ùQGü<öÿ£’øÿ}ë_ü¨ªQšQÿg×+¿#ÖßöåÕüš~bº¿Äºõ^_åøž±û0xúÿÇ¿ ­Å>-ÖüMñSÃÞ³áßzOмáχ>,øqñVy£ñV»ðÇWøyá}cÄúg„´O iž'ÐàøZ#ñ×ÅX|cðZçá¯Ä/ã—í ø×Høéñèjø‡þGû ÿÑÉ|?ÿ¾õ¯þTQÿ#ý†èä¾ÿßz×ÿ*+7J«mû*Šý9%ÿÈ¡Ýw_xÁHÿäÆi/û'ïÿ§­"¾Þ¯Ç?Û›öæý’>(~Éüà/Žþñ'‹üIà{‹M B´¸¿‚ïS»‚þÂõí­žöÂÖÝ®ÞÖf†™d¹‘VÞÝe¸–(Ÿö2‰ÆQ¥MJ2‹ö•]¤šv奭´ÓnÎú/ÍGˆ?äàûîÿõ4ñ}rõà¿ÿmoÙKàö·á¯‡ß~;xÂþ6Ñ|%ºç†.uI/u} ê¾%ñ>­¦Ûk–ºU½óè×÷º=ÛiºŸÙu t]SIÕÖØéº®usãðò?ØgþŽKáÿý÷­ò¢‡J£³TæÓŒ,Ô$Ó÷Í ºî¾ô}½_̬ñÁ_‡Z¯‰<9áýoÄß ÿl_ø.O‡âñÕ§‡4«ýFo„Ÿ´7Ã?ø.‰m_ãWµà¾K…ßþ|"øaðGQ˜kžÑ>üUøSðjÇÃ~ñž½ûL|Iñÿc?áä°Ïý—ÃÿûïZÿåEðò?ØgþŽKáÿý÷­ò¢ª«ùsQÝÅ¿rKá»_g½ŸÊÚ¦+«ß™u꼿ÈüÄÕÿl?Ú«þí9kã/Ú»àŸÀ? ø3þ«Kñ7€>Ýgñ«ãì½ðCà§…¾9‚_µ¿ü1g„ÿcK‹žûfŸà‚ÿ?á9ý ¿lŸþÏÿ<-ñ7û áß4Ï~ѳŸ<ê³ÿÄÏŽ_¿n¯€¿ÿhgÖÿgßøkDý»þø³öjƒPøgãO|ñLj~ÿÁ5¾$|=ý’5_Zoƒ?°~9k>øgÆðPOêŸ õ|@ÓlÄ¿ ®uGÀß³ïÅŸÞ}×ÿ#ý†èä¾ÿßz×ÿ*(ÿ‡‘þÃ?ôr_ÿï½kÿ•N5:aæ½Ö®¡.©¯åóÖ÷z+4¹¹‹¯æ[§ºéoòüv:-+ľ#_Úãľø_â oÇž—D‚ïöÐüIªßßøà?Äü!áù>Çð¿Å7SêWWňþmPøû0hÚ|žÓ¾ÏáOÚoZÖ~xçÇšN—û{}y_ÿÃÈÿaŸú9/‡ÿ÷ÞµÿÊŠ?áä°Ïý—ÃÿûïZÿåEféUvýÕM_µ·W§ÝåmÞ­Ýw_z>Þ¯ˆu/ùIƒìÈ~%ÿêøøMGü<öÿ£’øÿ}ë_ü¨¯$øeñãà÷Çßø(F⃟mÿ#ý†èä¾ÿßz×ÿ*+YRªå&©ÔiÉ´Ô$ÓMèÓ¶©’š²Õlº£¢ÿ‚‚økÄ~4ý‚mßx;Ãúß‹<]âÏÙö”ð×…¼-á­*ÿ]ñ‰|G®üñ¦—¡øÃú—Ö§¬ëzΧuk§iZVks¨ßÜÁii×GxŸÅßÛsöOñWÃÿ‰ÿgŸ‹ ¾8|Tø}ð»]ðå§ÅŸ€ž*ømñÙÓß|qðÓÁZ~(üwµðoÆÏ†ß³ÏÂíÄð‡üiø“¨üLð׊ì.¾|ø‹ñ~Ûàׯ}ö{ñ‡ô¿Jÿ‡‘þÃ?ôr_ÿï½kÿ•ÃÈÿaŸú9/‡ÿ÷ÞµÿÊŠjD’tj»6þ+Þɧî½^[½ÇuÝ}ëüÏÌOÙ7öœý¬¿jÏŒz/ìûcûex&x[þÇÄÿg]Oö{ý§µß‰šWÂï Á/>"øPðÇ¿fï„ÿÆÞñ_íwñá߈5?öG´ðl?lõ¿†ÚÇíwã>“¡~Òú'¨~Ë_¶¿Äº¿Áßü`ý¨ôO€<}¢~ÇšïÃØÓÃ_|â?~Ò_ þ9~ÌŸ³‡Å¯Š?ü?ðÏXÐüCû]ëú&‘ñ?â¿í ðïJøÑðÇã>‘ð7àe‡À7Íÿ6ý†E·Á¿ø7Àÿ±çÀ¯øeìøHþ)xG^øûUüzý¤¿h _]øsi¥x#Æzïü)oÚÆ^#þ¡kâøyì3ÿG%ðÿþûÖ¿ùQGü<öÿ£’øÿ}ë_ü¨©œ*JÖ¡8¤Û²„­ªKùWa¦¬½äþhûz¾!ø3ÿ'ÍûoÙ?ýôËñªøyì3ÿG%ðÿþûÖ¿ùQ\ì™ñSá߯oÚßöÐñïÂßhþ6ð†£àÙ>ÒÓ]Ñ'i­^ïL°øÝe}m"K7÷÷²¼70Ã#FÑ\"µ¼ðK"9Æ\¡8¯f•å•ý­=.Ò×F+¦Õšz÷ògÿ#ÿ“ý¤¿ìŸ¿þž´Š(ÿ‚‘ÿÉŒþÒ_öOßÿOZEÝþ¿ëãÿÒ`D÷^Ÿ«?˜Oø:#öMýª>;ÿÁ@>ø¿àìÑû@|eðžû| ðÞ¡â…?¾"üDðõ‡ˆ¬ü[ñcS»Ðou¯xsXÓmu«]7XÒu .{˜ï¡±Õ4ë¹ X/m¤—ù½ÿ‡qÿÁC?èÿlßüEïÿüÃWëm÷ÆŒ:íæ¥©|Wø•¨j:…ÕÅõýý÷޼Qw{}{w+Ïuyyu>©$÷7W3É$×HòÍ+¼’;;3¿ð¶~*ÑKøÿ…—ˆÿùe_м-ãÞsÃ?•d|‡,ÅQÊð±ÃSÄV¯‹…Z±Sœù§>Dï6­,‘äÖÊéÖ«:®¬âæîÒQ²Ñ-.¼ÉÏøwü3þŒ;öÍÿÄ^øßÿÌ5FÿðNø(aä~Áß¶iíÿ&½ñ¿ÿ˜jýgÿ…³ñSþŠ_Äü,¼GÿË*?álüTÿ¢—ñÿ /ÿòʽʟI\ú¬%ÃY:OªÄãnšÕ=ÿ¤eýKþTû£þGä›Á8?ࡤɆþÙÙÿÉ®üpü¿äF¨Oüþ AðÁŸ¶·übçÇ¿øCWë—ü-ŸŠŸôRþ áeâ?þYQÿ gâ§ý¿ˆøYxÿ–UåWú@g5Ûráì©sG–Ib1nën²ÞÚ¦œåõMî´ùLü§Ñ?`Ÿø)·†äó4Ø«öèÑÛ9eÓ¿fÏv±IÉ$K > XfRNJÊŽ¤óŒó^·£~Î?ðV-,*]þÃÿ¶.¹*6ꟲoƵ•P`[?ÀÖ2³$¹7,僀¾ýÿ…³ñSþŠ_Äü,¼GÿË*?álüTÿ¢—ñÿ /ÿòʼ:þ0âñ7öü5“Umßšr®çu³çMNþfÒÖÕ&¯½”U÷×E¾¯_3å}àÇüŽ1:—üçöß±MÇ|ºgìÕñÆæ,·I>Ë7¬öŽÎ²°zîb#ýá/ÙÇö÷¹^ãö;ý°l>БÊÃQýœ~/ÛL»”mIbºðPxZ/™2Î¥™ lcÕÂÙø©ÿE/âþ^#ÿå•ð¶~*ÑKøÿ…—ˆÿùe^#ÄJ•oì²< µuN.¬Z[.ZÓŸUyÉ_¥å´ßü¼’[ÛÙÒø¯u'“æºij¯vú‹Ù§öèØ¢OÙ'ö˜bFwËû<|S #ðœ$Œa ¬Ä1¯ìáûkûߨçö“sƒÀ?‹ñ ó¸á¼'1 œ`dmç%³‘ÀÂÙø©ÿE/âþ^#ÿå•ð¶~*ÑKøÿ…—ˆÿùe\Ž1G”åÏÍ*Ð}?çÜàº_mÛét×öe+k&üùlÿòIE~†‡SâÙöÎÔôK»8ÿcÚ…^Qå‡à7Å™ü©£˜íÁ¨Û«º®[|ƒ1ŸÕ¿c¿ÛŒFD?±—í^ë–ù-ÿg?Œr£mŠxC$uF-åG¸‚ÊC!_Qÿ…³ñSþŠ_Äü,¼GÿË*?álüTÿ¢—ñÿ /ÿòÊ´£Ç¸ªWZó/ìì“kš¤µvÝÝ¥d¶D¼ª‹wçú+'çfÛoÕÛºgž<ý¿à¡¿cšÛ@ý…¿l©ïnUâŠê/ÙãlÉhŽ0÷¯Ê,Š’7‘ÉŠåCþöxßæÿáÿ‚ˆ»3¿ìûh»»3»¿ì½ñř݉,îÍàbY˜’K1$žI&¿\?álüTÿ¢—ñÿ /ÿòÊø[??è¥ü@ÿÂËÄü²¯ªÊ¼eÌ2šr ‡-œæÓ©V¦#Ï+l´vItZêÛÝ»‹*…ëTm»¶ã‰$–šE+Ù_Fݬ¬—ä¢ÿÁ8?à¡ cþ7öÎÿÄ]øßÿÌ5N?àœ_ðPÀÿ†ý³xÿ«^øßÿÌ5~²ÂÙø©ÿE/âþ^#ÿå•ð¶~*ÑKøÿ…—ˆÿùe_Q‡úGç˜ehpÖPýÕ|N7H­mñkwfÛíêCÉé=]jŸtÈü Oø'ü,dŸØ?öÌçþ­{ãwÿ0ÿç:Á9?à¡@þ¶_?õkÿ»Ü_«ð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYW±†úSñ——…rYr'kâñËY^íÙù½:_ȇ’QnþÚ§þ//_ékòçìûþÝýº?bïx»ö.ý¬¼-áO ~Ö_³ŸˆüOâþÎ4?xsÃÚÆjzÖ½¯kZŸƒ­tÝFÑôÛ[CTÕ5 ›{>ÆÞ{»¹á‚$_ôÛ¯óÇÿ…³ñSþŠ_Äü,¼GÿË*?álüTÿ¢—ñÿ /ÿòÊ¿ñ[Ä|ÃÅ\Ã)Ì3 »”Ï)Á×ÁÓ§ƒzÑ«ÕÕw9ºòN2‹\©GFµzžŽ 'JUä¤Ü¬¬Òµ•—ÌÿCŠ+üñÿálüTÿ¢—ñÿ /ÿòÊø[??è¥ü@ÿÂËÄü²¯Ê~¡ÿOòOþÜîöž_üý(¯óÇÿ…³ñSþŠ_Äü,¼GÿË*?álüTÿ¢—ñÿ /ÿòʨÓßü“ÿ·iåøÿÀ?ÐâŠÿ<ø[??è¥ü@ÿÂËÄü²£þÏÅOú)?ð²ñÿ,¨ú‡ý=ÿÉ?ûpöž_üý(¯óÇÿ…³ñSþŠ_Äü,¼GÿË*?álüTÿ¢—ñÿ /ÿòʨÓßü“ÿ·iåøÿÀ?ÐâŠÿ<ø[??è¥ü@ÿÂËÄü²£þÏÅOú)?ð²ñÿ,¨ú‡ý=ÿÉ?ûpöž_üý(¯óÇÿ…³ñSþŠ_Äü,¼GÿË*?álüTÿ¢—ñÿ /ÿòʨÓßü“ÿ·iåøÿÀ?ÐâŠÿ<ø[??è¥ü@ÿÂËÄü²£þÏÅOú)?ð²ñÿ,¨ú‡ý=ÿÉ?ûpöž_üý(¯óÇÿ…³ñSþŠ_Äü,¼GÿË*?álüTÿ¢—ñÿ /ÿòʨÓßü“ÿ·iåøÿÀ?ÐâŠÿ<ø[??è¥ü@ÿÂËÄü²£þÏÅOú)?ð²ñÿ,¨ú‡ý=ÿÉ?ûpöž_üý(¯óÇÿ…³ñSþŠ_Äü,¼GÿË*?álüTÿ¢—ñÿ /ÿòʨÓßü“ÿ·iåøÿÀ?ÐâŠÿ<ø[??è¥ü@ÿÂËÄü²£þÏÅOú)?ð²ñÿ,¨ú‡ý=ÿÉ?ûpöž_üý(¯óÇÿ…³ñSþŠ_Äü,¼GÿË*?álüTÿ¢—ñÿ /ÿòʨÓßü“ÿ·iåøÿÀ?ÐâŠÿ<ø[??è¥ü@ÿÂËÄü²£þÏÅOú)?ð²ñÿ,¨ú‡ý=ÿÉ?ûpöž_üý(¯óÇÿ…³ñSþŠ_Äü,¼GÿË*?álüTÿ¢—ñÿ /ÿòʨÓßü“ÿ·iåøÿÀ?ÐâŠÿ<ø[??è¥ü@ÿÂËÄü²£þÏÅOú)?ð²ñÿ,¨ú‡ý=ÿÉ?ûpöž_üý(¯óÇÿ…³ñSþŠ_Äü,¼GÿË*?álüTÿ¢—ñÿ /ÿòʨÓßü“ÿ·iåøÿÀ?ÐâŠÿ<ø[??è¥ü@ÿÂËÄü²£þÏÅOú)?ð²ñÿ,¨ú‡ý=ÿÉ?ûpöž_üý(¯óÇÿ…³ñSþŠ_Äü,¼GÿË*?álüTÿ¢—ñÿ /ÿòʨÓßü“ÿ·iåøÿÀ?ÐâŠÿ<ø[??è¥ü@ÿÂËÄü²£þÏÅOú)?ð²ñÿ,¨ú‡ý=ÿÉ?ûpöž_üý(¯óÇÿ…³ñSþŠ_Äü,¼GÿË*?álüTÿ¢—ñÿ /ÿòʨÓßü“ÿ·iåøÿÀ?ÐâŠÿ<ø[??è¥ü@ÿÂËÄü²£þÏÅOú)?ð²ñÿ,¨ú‡ý=ÿÉ?ûpöž_üý(¯óÇÿ…³ñSþŠ_Äü,¼GÿË*?álüTÿ¢—ñÿ /ÿòʨÓßü“ÿ·iåøÿÀ?ÐâŠÿ<ø[??è¥ü@ÿÂËÄü²£þÏÅOú)?ð²ñÿ,¨ú‡ý=ÿÉ?ûpöž_üý(¯óÇÿ…³ñSþŠ_Äü,¼GÿË*?álüTÿ¢—ñÿ /ÿòʨÓßü“ÿ·iåøÿÀ?ÐâŠÿ<ø[??è¥ü@ÿÂËÄü²£þÏÅOú)?ð²ñÿ,¨ú‡ý=ÿÉ?ûpöž_üý(¯óÇÿ…³ñSþŠ_Äü,¼GÿË*?álüTÿ¢—ñÿ /ÿòʨÓßü“ÿ·iåøÿÀ?µ¯ø)ü˜Ïí%ÿdýÿôõ¤Q_ÄíßÄï‰7ö·6ÿ¼q{c{o5¥åß‹5ë›[»K˜Ú‹k›yµ†{yáwŠheGŽXݑՕˆ%uP¥ì`ãÍÍy9^ÖÝ%k]öîLŸ3½­¥ÿÙPythonCard-0.8.2/tools/standaloneBuilder/doc/pic7.jpg0000755000076500007650000022721610231140007022423 0ustar alexalex00000000000000ÿØÿàJFIFÿÛCÿÛCÿÀJX"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ûþ ÿ…ý¥ÿàžÿ´¿Ãÿ‚_¾~Î^!ð޽û7ü/ø£}ñ;áv¥â_Gâ?^x×HÕ!SÑ"øã?éÚuÖ«¤x‡A²Ôå´¼ñ„üY¡ÛêÔ<çöYÿ‚c~Ð>¸ø›ðá·ÆŽŸ¾Á>þ xçöHý˜Â>/|^³Óþ8ÿÁL?mý¡¢o€_ þ=þÌÿ¾-Ã3ø×PO…gYÓ?hhü௠jßðšø¿ÄÿïGƒ³ø'ûÁ 5[/ÚoâïÆ‚?ÿg¯„ß²WíŸáüyø_û[YþÓÞ ø÷ðßö?ý¢ÿeÅðÇÀ߆íàŸƒ÷^!žõo¿mOÚø‡Àw±jzÄè¾ øSNÕ~'øöÿOÕ µñ‡Éÿ¿fo‚_±Ïü7þ ]û5ü+³Ñ->#|+ÖàœWís'†õ‰:÷‡5OÚÇXø«áÏ|Bñ©üJ†ÚâmÅ~×>x—I‡Âz~á->ÇU‚ÂÃþ"µñ‹§}f,ð³‰Å`¨p hâ°Ùf#2ZÁ:YC ‚¥Ž«Eâ©cqJt1ydêÊ©C7Ë*'8âá%ä¼GR§JµLö¥S :öU¹ê§:Ò¡ û)P¦Üe:8…)A·„ħÊéK–ÒÁÊ_·kŸ„?±¬`n,৉à åpw|H”Ä¥†ô\$¬Í žÓF/ø9öè½ðö8Qßþ,§‰r:`á¾#.AËv²íÕÏŽÛô&Oˆ¿²ÿíÏÿÑ¿à™ÿ4ŸŒ¿µa²ÿ‚˜ÿÁ@~+x«Ç_óÀ ð[áï‡>|ZÐôÙGö~ñ?ƒ~2xïâ=ïÁË?‰´5öâo‚<ãÀ> ŠãáѼ»‡Â_~¿²‡ìqûPü7ðÏņ?±~³ñKTñ7üOöTý–~%üñ'ÆŸ¼Eû:~É:¯Á=‰_µ¹ªü¿ø®èÚ¿Å?‰úg޼M©|Jø‰á“ð;Â׺Cø7Á^ðΛáMVÆNU—xqK S™xt°2¥‚Ëó ûF¶êÙ¶/„ËÜjã1¹n"3¯ý™Œªþ³‚ÃÒ…:qQ«9â0±­¤ëñªÂn öªU«Ð\ê¤j{L-,=LBp£G FšÄQŠöujMÊNN1Tê¸rƒþBý¹OüÒoØätÿš)â<Œ€{üHrG¨Ç8;‚Oü}ûr8b~~ÇgŽåø+â=ªDR8 ÄW9%r9QµqPL‘}‹û,~Æß±?ÅÏ„¿¾ øŸÄÚÍçìí£ÿÁuþ4~Î:OŒ4¿ÚGÇÖ¾ ý¡ü àÏÙŸâç> k~#Ñàñã~Ï÷¿¾1jÖ þAñ3àŸÃ¿‡~2ñ€ît ü>Õôø‚]{Sò~ıߎ>&Ad¿°ßí]ðŸâo…ÿbÛGâgƒþü{øQñ¯öpø]ûaþÑßíü9­|ðoÁ‡:ÿí/ñóö—ñ¦·§ø?Æž!Ô>)øá·í!g«jsxÀþ%ðí§‡ô[ÿ躛XO #_†«ÀÒ…L,jÕ“Xjj„>¹ËQÊ®aAÓœþ¥Sžœ—û2«Fx™Q¦êʉœPéÑ©íIUq‚½I]T~ÅJ)G>ekIÂj’›äSò˜¿àã/ÛÉ ð£ö=¿¼Fv¯˜Ê¬Iøƒ‚HÎU„{Z)…18´º¿ðqOí¸@Ýð£ö@SÆGü)Á?W dà§,çõ7ú7ŠWþÿûH|8؃CðÿÄÏÁC£ø…ñ#öd·Ð?jd׿dŸ‡>#ý†­`ðÿí7©x?Xø±yñ—Â9ë~"Ð|Yñ÷^ñ—Á›Ûûï%χn´=3JÒ<5wþéã_†~:ýœþ5ü*ø³âm_Âð~ÁþÿÁ`þé~ð¤º÷Œ<}eû9é_Øß|%«É­ê:7‚îtkéð×ôÖñüiý¦‡ìýwðûö¥Ðoÿjm/àGìÏðWÆ1ðÖ‡eñ÷öÈøÕâ_‰?gh<_ñÖMNÁWáW‚<ᘾø;Z»ñï‰áñ§ào†:o&á¦*t(âxƒ«Šx'„:”êQÆcó¼±)b«`kÂŽY3Q•iÔÃÔÃ,‰¢húwî5 [WÕu ›{7M°·žööòxmmà’yDcôgÀÿðIoØëXø—ðNñïìëâß ˆnoŸ²÷´¼'ûA~ϾøÙà? ~É_þ)øgâ7ƒô¿ˆµGíñÄ>·ñ÷Âë KáÇÅoüSøy¢ø¿GÔÖ8,.´ªÖ£‡£‡UqØœvF¬çšFpöµ2üMyÔäT¡‡P‹¨±uiaZRâšu°ô«ç<޵JQŒêT©ËB޵iÅGÓäXŠtÔT¹ÝKµcRq­ÿÁz¿nß kºç…¼YðKöbðω¼3«êZ‰bÊŸñwünrWceÎÝÈw&ÒŒw¦ß6™-†ãnÞÛ>uýâ/'ìë…;6º?-c–'ËÓþï áÏâ°8,[á\®œ±X<6&PŒk8ÂUéB£Šn­í6“vm-WoÄ9íõ©G4Å5N¤é§x&Ô%Ê›µ7fíwk}É[÷LÁ}¿lrä˜þʺ|Õ¸çÿÅuŸnƒ‘È8ŽAÿóý±ÏüÓÙ@qÿDsVàã8çÇßòç!Ôr8éŽ w§è0@ávâ”cøqÇR0GÊ8ÿV¾œžÛqÆ6¦ñðË€¿è—ËvŽð­Õ+ÿËÏ^Þ‹u•>%ϯ™â^½áÿÈy/»um?s¡ÿ‚ôþØR0 ðÇöURX‚?áNjß(Ý(“ãNX%€S“µ Ïg}?à»ÿµóŸ†Ÿ²ºž7ðwTr3ÁÆ[ÐåP‚¬# D?‡V«†Qµ× ÷Yx_žCÉòFçýÞ[ƒ·ÉÝ”ò¼Ý?f!…Q‚6„ùJì òW÷0är6¦Æ ¸‹ËÙkðË€”´áŒµmökw_ô÷ÍÿÁ¶™Ï‰³ôݳLR³VÖ;_þ½¾Ë«Ñníuûd?໵é?òMeÓ#þö¥‘œsÿ#Ÿ äã§Ý9ÁÜxÿàºßµÛ»á§ì·Ì¿µ"»ãð™ÄíÈ$ Â0b ´‘~((äqŒcŒr9NŸ'Ý8ã¦6㸊Ô# [k¾uòÿtí…QË|»Õ·&ÓÉ2xgÀvñŒe»¯³[·ý|_×N‹UĹó‹ÿ…QVÍ1+Nð]÷cÙtV²Õ²«ÿªýªÈ¾þÌÊq–ð©.ŽÓó‚>)@Ø*?»£yŠEÿ‚ÓþÕ$àü<ý™ÿ„w?/ÍŒŸøª³Ó äã÷‚Çè×hQ°&ÕsA…>\y+Œg+À'äÛ˜l ç§B:t0#oN1Œ.wËŶqðÛèšË¶f¯xÿÓß7Û׬bŸçî×Í1O^ðÿå~KîÝ[OØ(à´µ<¹'áïìÐ#'þ-ÈÀ(N@o€Ø#'.˜UbÅTK$qÁe?j'o‡¿³rã9ÿ‹M>AØp|F2ÌAà€ :«—X¿-©Ø¿)O™†>LåO”ŸÝÉýä{Uwf?/͵޷\ ù{pɌƜä¯ÊÛr>îÀŠ›cÛåÁ5<7àeøÆ²å§òÖ]¿éê×îë£ØUxŸ?‹Ó4įG˧/’éÛn¿®_ðøïÚþ„Ù¸uÎ~MÀùñÉñ £ íÆ%~*Aÿ‹ý§‰ÁðìÞ¼wøM7HÏüT™ùº.@Á9P$0þK㱌œc§ßä‹óqór»qÕ6þât#€0UÎ2'÷ÅŒ' ±€9ËÝl£á¿5ÿ$Ö]·òÕþîÿ½}ßUèʇçî÷Í1[÷‡ÿ+òìöÙ[Üýs‹þ ÿûM;a¼û:uÁÛð¢S·.N¼ I*…]`¤\-¥Ñÿvý¥ˆçÀ³¨ r–;N•É׆ìc®#¨6ÏÉ»tÃ(òñµ‡ >TÌ‘ó!~S·‘±6H a<ºv². ª»WTd&¾@|µÈàáx…Çîò—‡<­n˵µýÚ½Ußü½}»m}“lÆ\SÄ Zf¸­ÿšø|—ݲ¶Ÿªcþ çûJwð'ìì9?óJË÷ºÿÅ@@<ºÀãç1Z‹þ ÙûII×À¿³À鸅,6®íl#àÈ€ bí¬ïkùT@0On$üÃh猞6Ÿ»³0h[/Cµ~R§%v˜ùc¸7’™—wúÔÙݺ#Ͱ‡gÿÞ_ºû5ºßü¼õêúè—ëâ|ýA¿íLMÕµ¼<¿¹§þK·[Y~¬Gÿ`ý£œe¼ û>§LçáXàíR8:Âä6[i;HÚª¹‘!°?à«´Yÿ™ö~¹øV™{×ZPqŽyHù¼¿ËËtÚ£÷{1ÆXr¹HøÈO‘öüƒåòÂ"ìg•my?‡õà½ßbdñƒó c9]¹‹'á×s[ý\Ëíå«å×Ú¿Ïî1ñ2_Ú¸«[¼;ÿ¾ž[o§»úwü_ö‰v øàùXü¿ ÓªÇ'Ü9ʨùNæŒyŒ_ðT¿ÚÛ à€`goÂØþP\¨-»SRxà‚¨UІۋ…³ü¼ˆeÊNÏL„nHòäé·®ÕÚW;¢Ù¾ßjÝ0Ã÷`m`~Q€Ÿ¼Q¸³Ç×flMŽ€~ïÈÛ¦’ðë‚-øÇ2ÿü·dÿçïvûöòZOŠ8%lׯçü ²ï²Õl~›'ü ö‚#Ÿ|Î9Ûðºà’3ý«’28$.@9 ól—þû@ЙðzÿÅ­ƒ€sŽºªäñÈ8Æì|þ_æÔc  a@Âò«…<“ Æí\κ°@0sÓ÷"òqó}ݸþ ¿¹Î>ðKµøs/Ýýš»&¿é÷êÿĈ‡ñß5Åtë'ü·w·exþ”§üßãó|ð%?¼á|A™G;µV9AÆå$…Ìj'kMÿय़Ÿ–ðgÀÄ;³ðÂÛ áHÚù7)ËsFÐỦæÄ)‚¿»Û·çhðÒò[È'äÀùÓ`F}Ðù>e†Õºmòöà–tÊGò§î"Ê6Üõ6"mg•mðó‚’Mpî_ðßá«øþûü½{⎠W¶kŠVi/z=ãýßÕÛ²¶Ÿ¢£þ Oñߟø£þñŸù¦Ÿ.7pßñ0ëÆOAÁÎ>m“§üã³σ¾q»‘ðÂÓ #ÓO'nîv#pŘöÿž uãÏo»÷¾÷ÉÉã9ÀÆ:®ßÝZ‰xc°ð2£äsÈòŽìÜɳËc˜¶y–‚ðó‚¹äËïoå«Ñ¯úx¼úkײ¨ñG;ß5ÅZëíE/Uÿ¥y[K/ÑH¿à¢ÿœÞø$G ðÊÐàU2OÚ3÷Xä2džƒmap–·Gü?ãqw„¾ «c$†v Á$ö HÈÀ%W=H^vþ|[&<°¸e;BäßÃÏü{|¤ìÉbØP¯îüŸ/OÖAµTmTÂcjŒªáXmSå¯Sµz…ÇËŒ¼>àÅ'nÀtû5_EÞ«þ½I|QÄ_ð«Šû?j+¢þê캯‘÷·ü<3ãg9ðŸÁaŒçþ-–Ÿ2þ·k’6ŒŒŽ’£yŠìðP?NÀ7„¾ Æ Ãøiaû°^UËfE ·hÜ\l±EÏà01ž6ã=¹\ä|«–瑌•Ù˜5-“k¡òÂmu9‘ÕbY>fÿFMÄlÃŒ»Y³‘»N©x{Áj-®À^Ë¥[ôÿ§_’~]ïýgÏì¿áW{7ñG´-ö>íÎÖ_|Gû||f~O…> ¨ÀÏü[]<Å#`‘£$eœà©@ ‡.‘N?o?Œg?ñK|ã?óM4¾0¬pq1çŒö8ä¯ÃvéŒ-FFí»s ¸Ú£ìÐeϘñ´Æ‰µqåAp¼và|®p~SÏŒyyy×pmíþ¯à:}š¿ü³Ë_ž‹WqÒþÕÅàPòþç’û·[Ÿp'íÝñ…·gÂßøÜK†º^Õ&aŸœå‰@H%¬rodcÛèÇûqü\vÁðÇÂ.ª †ÚfäE]íòŸ”†` „`з˜#?iK/†c^IØ~PÇ8ù÷sÝÞ6ÌžcòÄlwE³Ì´Ü~e~ë!Û³æOÞÛÌ~Ì~CåíEÄ~Yˆ°y>^˜êxÁªÖáì»W´jöÿ¯’ü×]µµÔ⎠I[5Å-VÒ—÷nëÑtûX~ÛOüË_ ¯ü[}®ã$dryã¦1œ…ü6ÇÅŽâšøKÆæ›èÿ.­îqžÃç•øåG°é¼'Ê¿*åN9>  q…˜¼>ïÃ|‡,qxÀF2™Ã€x9Úü?ÿÀjö_ôñ}þ¾òÕ‘OŠx…ïšâž«¬:[þù~ékËöz~Ùÿ†ð߈Ž[;þhøA¾e‹$`”“ @ò¤,Ȇáì4SöÄø àáÏ…ŠxÈ?4`!ñ@„€º©HpŒ²¬_[˜1íbq"ñ%”îcåC¹‡•™y|Û¢ò|Ý+j„Q† Ã&п,=‘ËÆqµ6¶Sy~]¶rà.MÂwÒ®×÷×O>úîÔÏŠx†-¥šâ’ÒÚǺïO²]_£Ýýh?l‰øçÃß ¯ü[­ óÇý3{ñîÈ#ý®þ&6wxwá€%™~ègh +·Èù›ä ÈGÜÈ¥¤‡äÕŒtéÛ§å~0¶á;¶ºíïQ¸Ç„˜åG•̃nä;“·Ç·Í€ÿP¸=Á·`n•þ«]?éâíÛ{é't®QÄwÍqZ%»‡—÷eÕmëo®¢ý«¾$?ÞðÿÃ1ó0ù~ègn(6}·l•*Q‹¤en#´´?jˆ½ô/†cþéç‡ûãUõ9G—§h¨À鎜ÏEヘàmÇðíÄX¾á ÿȇ²{UÞñ_Ïýk¦éBâž!Óþq[­Ü?»Þšùüµ‘ôÂþÔŸçAøkø|<ðþÿŸCõÇç•чö™ø!ù´‡KÉ ?á_xxÿxé–ݧŒà. 7#ÁEÇØþ\AÇÝÆa>^Ÿpúd}Üü8ÊmZ& -†×<ƒïØ|߸MØÙ´œ/Ì·¯‘»Nsà>QOûⶪ·jÿòñkò¾ú-JÿZxƒ’?𫊿{Âú[¯"}O»cé…ý£üxÀ¢|;€Jÿ¾ðæS#<îÓÕ±é”VàîU;ÄrÃFxëþ€ßǯü[ÿ qéŒØ ûž1Žqólùî!…Œm# ¿.Üá~ðòcã”yi·ÙÜAdzÀ/…;W ãžFíŒGŠà^ÿ¡ ~Õ»ý÷úuÑkbQŒ•1ÂlÄ>á5oøCÁnºTÚÉÿÏß=uù÷Ê\UÄ*JÙ¶+oæ‡ÿ#¦Ë¶Û­×ÑZˆ<_®è«®É¨|'ÐìåÕu "µZIs=Ιi¥^]º&‹à}^4"Ö,•Zy`‘ä2…‹l{ާö‡‰èmø'ÿ†òÿÿ…x§Š!ðlÿ³ŸŠ-þ"ø_þo‡Ó‹ðøëÁð‚j¿á-ðlžðjxŸÂÿð¬´-ÄÚßÄOíí¯´¯øA4 xƒUñwÚÿáÓôZïP‡O¸þldÙûãÇ„><~ʾ*ý¨ÿgßÚ‡ÄðO»_k³Á4ÿg¿x–ç㟌¿àž2¿¹žoƒ¾'ý¸>xkáŸü&ßò$ÿii?³W޼{ñ+ãž•ÿìÒ¯í~üS×|?âÛ›‹ü‰ñØ|§ˆ3l» “dqÃ`± W:•}:–súÌ9¥ÌßÙ^ëjÊ_­äJùŽO—c±9¦lëâh*•\1jæskÝŠ¤ÔU¢´¿áªýtý¹?h¯øX_²íáá/ ê,Ÿðª¬5…'ñ‡<aáXõ-thÿuÏØèZÒ4oI¡®—ãÏøDõ§¼±ÒV»´ñŒ0jž¸³Ôõ’¾8ø­ÿ&Ãÿoÿ³‚ø“ÿ¨§ìýEyù¼(ª˜*´pô0¿YÊð8š´°ðté{j´Ûœ£)8ó5{]êzyDªû,e:µëb>¯˜b¨S©^ju}•>NHÊIFü·i;l~rÁÈ^ø?«þÜß .¾ ~ÔßþkIûü·µð¯Ä ~ÓZæ¹}¦/ˆ>'4>#´ºø1û9|^ð²iwW“ÝéÖö÷Þ%°ñwz>¡%Ήkc6©ß~CáÙŽ2 ÿ‚ƒþÊ‹‡Ü>þÞÛAócmÄâ±e²ªÆˆ… ´ûè·üµÿ) ø#ÿfðÿS¯5ü¹×÷Ç„ü6ñžpŽ#ûs9êÙT%ì0ðÉW¯[ܦñ6"¿.—ýåj’»w“Z%›eX ùŽ*¥ZSNiKÚÖÛŒzF¤b¶è–þ–ý…Ã_²úªøx?쮸 Âü;ý½H\Ê©ÿ†$O—å p¸P¡UFÕŽAáïÙ|ÿý–Æ0>~Þ¤(Æñ„ãCÆ1Ó¦?¨¯Ð—µ·çÿøÿô?ýoºLóVI–Gl7þV¯ÿËòVý”Eý–‘ÿ‡‚~ËXåcðïöògAºRý‰"fpF|Ä'i(Ñ8·{ml?ehÈÏüö]㜇_·‰*q cö'@T”#hQaC¯âÕ¥Â׿gúÿs‡¿ùÁÿÈ?±2ǾÓ÷Õôóþ-¿§ÓCúÖ>;ü1×¾x'öo¿ÿ‚˜þÌÿ|ã/üEоèŸÿl¿ é—ÿ¼SmŸ©øëÆ×žý„´câ_ŒmthÃ^ñ?Ä}KÅZ߃<"dð‡ƒït/ ÜM£Ÿ"H¿e5Îà ³ $øsûwàŒ§*ß±Sdî*À‚¥B¤1Wñ.ŠÊPéƆ{QJµkÔ*7N3­^r«Z´Ô8z*UkT”ªU¨ï:““”›“l¹e|ùyèÎn1Œ"çˆÄÉÆŠŒ ›«¤a£­"••‘û‰ÿ²zc?·ÿìÄrÀ'ÃoÛ³åË£þÅJK0PHQVAå”±ÞKÿÙ-BøoÿÙ™p…ømûv¸ÛŸøbäàc €¼€Ÿ 𶊧Á‘nÿë½þßÎù¾»ù‘ý‰–Ð;õöÕïÓþžõ²¿ùºãSý’Æ?ã`?³GnÃ_Û·àÆ8ãø ¡.íþÈñ0#öþýš×vŸøVŸ·C°ÚìÃ?ñ…ñÀe', ÆÓykø7E7Á±jψ³ûväáïþ‡ÿà®–ö.[k}[²þ5}•´þ/—Ý¡û鉿d8×öüý›Tü¸ ðÏöè*0ˆ§!c(û§(û«·bùi…ñ_ì‚?æÿgî>þÝŽœøÃQÁÆ;`·(OÀ:*A;®"ÏÿðÿèËü­d%’e‰ÝaßOù}_§ýÄü¿D@qxÃö?B ý¿?g%aЧÃ?Ûœ„0$+~Æ¿3)*ÈCFT¯ÊUŠ#~ÆÃþoãöwéŒÿ±ý¹3Ðß±ÒúuöÀÀOçnŠK‚)­¸‹ˆ6KááÞ›Í?åÐI–ÆÖý5þ5oþXFp|PýŒ¢ÆoÙó²|0ý¸H~ìäþÇk–#i$ޱ.Ò¬`{;ñü[ý‹‘TÛÛö~ãoÊ>~ÛøL*ƒ´§ì{rFqµÇÈ–æöŠOéKWÄ\A~ü¼=Óþíÿ%÷ äycß õwþ5~÷ÿŸŸð~gôùðß^ý—>-|Cð¯‡ß¶÷ìÿâüMñŸ…¾xAÿ…{ûfi_Û^0ñž¹§xsÃz8Õu¿Ù3LÑ´Ñ©kZ…•˜¿Õõ?K²óEÅýí¥¤rOë\ðEÚ‘ã߀ Ž/о!“*GÊÂ~H;YNä ¯ÊUмÇ'ü“þRûÿÙæ~Ëÿú»ü_ë)_Íž8ñWøgšäx ‡4ž.Ži—â1x‰fø<¶½XT£ˆT!2Á`°Œ]ä§ Ëi$”Oo+á<›J¬ªÑ­ ¨¥N½D¬ÕõæsëÒé[¦ˆþf¢ÿ‚2þÓèGüW?‡ü>>b Tðž6ê1€Ê¡QBª¨…-­¯ü³öÿÂuð`äcÄÿpTäøU @0@ù?£ðROø+Gìåÿ¹ÿ…1ÿ ÿÁ<_ÿ Ïþ/ü"_ð§¼9à_g²ÿ„û{þ/øM~$|>û'Úÿá`èßÙÙŸÚÿhû6§öϰy6ŸmûÆ´·Ã ~Ë~,ý°-o/¼iðs¿|CûF¥ï‚“«ê¾(øsáï^üIy|*—z¾™¢j:¦­áË&þÆŠï]Ó´Û‹Ùíâ¹ÕlíšK¸¿ ~8xhËÛå–“´_öe+I¦—YÙÙ¥úhz 8~íªx«¥o÷™i×ù¯T~¯ü»öœÿŠçà?où™üþÇýRÁÇÊqÓ\`mèÁÿyý¥¢UÆ¿—iUñG™@ ¹Îï…£y*3©‡EaŒAö_Ú_ØÃö´øsûsþÍ_ ¿jo„º/¼;ðûâü&?ðèÿtÝ Iñ•Ÿü!>>ñOíWûcOð׉<]¢[ý£[ðŽ¥u§ý‹Ä:‡›¥Oc=ÏÙ.åžÆÛêRñË—»,FXœ[MfÒM;«ÞÓÝ4Sà\‚I~ïnŸí2_”WüùÈOø$í&¡Gü&¿ÄÞ<;1»î‘ðÁ Úü¹#aØc•àÿ´ Ÿ|à‚1â_``©éÿ ÏÐåW@ŒCýQP¼qãÕÿ1gþiu·÷ü—õkLx‡ãµ.ø20rx‹Æ˜_ž&8ÿ‹l ‚’ ‰·j‹qg}à–ÿ´P?á-ø6¸P¯ˆ¦T•;~è@‘„U]‰•ÿ‚iüuÅUð—ëý½ãGÓRONã§;v~àQYÿÄkã«ßëm÷ÿ‘u/þHŸõ‡“OÙâî¿ê*_¬+tìÄDÿ‚k|sS“⯄ǂþÝñwŒg à€¤mJ-¡Ð‡þ Ãñº2 x›á@Ãd×|YÇÍ'À§!N@T‘ íÜYþÕ×ËÞý³ÿf¯~Õ_ÿbo |IþÓý§~ø&Ãâ/Ä_†ð‡xúËþßêv~Ô,uøLõ Z|>Õ¼ûOŠ>—û?Bñ^§ªÅý»åÍcºf°š{ÿˆÕÇRÚ¾\ùUݲÚz%ewïm²»òÔ©p»^ž+ú ’¿—Ã¯çØø ?àÔ|Mð°`u¿m^1Ÿ Æß•xNÝ“ø'wÆ¡ø©þŽ{k~+ã§#^O|mè6•ù<¿Ùz*W|ø¿ñÛÆ6ZޥႿ ¼ñkÅ:w†­¬/]“'ìñysŸ|6Ï8Ƴâl ŒgÁ\œáHÙ„*Æ'·û3ö0ý­>þÜÿ³WÃoÚ›á.‹ãoü>ø£ÿ ü#ú?Ä]7BÒ|egÿO¼SðëUþØÓü5âOh–ÿhÖü#©]iÿbñ¡æéSØÏsöK¹g±¶ú†‡ã?ÆñuòäãxµýKtÕïïouÓÓk$.á媧‹×þ¢eåmySè´ÛÈü¡‡öøµ3¯ü7ƒµu1$.HÏ‚€ÉxU)TòÒò~ÃßÕTo|:\(WVñUàªO„!s…;TàœýP¢¥øËÆÏ_o—_þÅôü¿¿åøúúƒÃ׿³Åôÿ˜©im¾ÏËþ§å¨ýˆ¾+ùü=„jÞ#$rNF<"¹##¸äpTì1[‡ö)ø¥#mü=ùX2Ÿím}ŠáËnÿ‘97œ%A( ˜È·kOÓú(~3q»VxŒºÚiýŸO§ý½å²ÓÈk€ø}˼SÝk‰—[wÉšþÆ¿£Æu¯ (—T×·.# ®ÏÄ6±Œäœp‘áB•Ž#ö:ø˜3ÿÏwþ&šÿpG9ð±ÉÉ<Ž0pWöÿ‚’Ãm~Ñ¿ðP€ð¦?áYÃ|lƒà÷ü%¿ð±á3ÿ…©çxëã_‚¿á"þÁÿ„Ÿðƒíÿ…=ý§ý‘ý³ã ßð‘}ûLd}¯SýB¥/xÚ³­—'h¶¾¡Iî“[M­U–×ÙYZWpöSžßí2ÿ䯸üà_ØûâRòu¯ç'Õ5Ü.UÁ`…r\–RH)´!ØQŒOŒ²WÄd+cÁ)BÔuœ‚Ü·'¿2@Œ)6ÔÛ¥èuŸŒ|k+^¾\íµòú}-ýïëîµ>áùoOíß.–þï—õeoÏåý”þ!ŒÄãÁ}1Æ£­ü¼(Ú¸ðØùN2sŽƒŒ`,ŸðÊ¿¿è1àÎàÄÇZàzÿÅ7ÉÉ<Ž1Á_¿h©^0ñ¢Ú¾]ÿ†úü—ã¿ÎÖK€xymOÿ…2òþï—ùl­ð„?²ÿ¢Æ5­•ÚÃ…ýæàÙˆ³´¶vä›YìÒXèEû4øéAÕ|%À^þªBàF]¾ŒÊUçB(aû~ŠOÅþ3{×ËômÿȾšÞÝ¥Ý_×ådø‡e½,Uú¿¬Ë_ü–Ûê|L¿³wŽûSÂcÒûWãÀÿ‰ãŒt€8x¿g/!êžR::ßꥣáÆå@K+)Ü„m;Y£Åö•Ä_ã4­íòûZÖú…=´þ÷—Îöw²³\ÃËjX¥Óýê_üŽŸ+ Cû?øÆâóRÏðñÆŠ¼sÓ Æ>_/ëJ*?â.ñïí²ý­o¨Sµ´þ÷’úÃÚ~ë­ÿQRò×áò^,|ž¿|Zÿ‰‡†útš–`gEìG08+~‚~(‹no|?…l®//É_Þê4DÜvñÑNäRnlþ¡¢›ñwŒš³¯—ÛM>¡Mmkm//ëK?õ‡¬—³ÅYÔT¿wúécæäø=âUT÷BUFÕ cå U>AÃá‰?Ó4!ô¹¾ùzp¸ÒÇôè1—gÑtT¯øÁËì¿ç€§åýï$%À<<Õ<^÷ÿz—{ÿ/—^Ÿ#çȾø†6 ×z!ÁùHº½ÊœœeÌ6ÈT±£s°iÃðÓ\í8ëȸº,2±Ý2/””9hQa'”–¾áE)xµÆÕ×Àá ?.œÖè½:Xo€xyÞô±Z«iŠšü£ÿÈñðëZòó¥ßû¯öêíÆ1Œ1òì•~ëKô(pF<ë’AfÀtƒÁ»HR¾ÅE%âÏ+Z¶G÷o¶þ÷d¼ûj €xymOÛýæ_üá±åÐø#TB —N`@Iæùx­»þAê¶õPoE*P-¯ØoGá-EUG™`˜ ’ÌUq·þ†€¯áSî®ü‚/C¢“ñ_‹ßü¾Àï÷(z?ü_pë×Ùâü¿Ú§§þKøïç±òïŀ߾$ɢæþÑ¿¾èzêÛøgá.»àoéWz®¬ÖK©ëš¥Þ·ð»Ä¾"Ôu «=+FÓÒÚã\:&m¥Ç.‘¤i×Ú–»y«y?ü1—Äú=ÏÛ ÿ7ïþrµ÷Õàb¸»ÄUÅâò܉­.zÕªe±s©+EsIª©^ÑKD•®’=|?að”iá°ØüÚ 1å¥JÖ£§{E:oKê~G~Ó³µ·ìýû~ÙAão|@¾øaªxûÄÞ&ñö£¡ê^$Ô훑2ØÈ™‚Ãl>WamË”å{É+&ÝÚVJ×oÉ]]ì®®K”SiÊ)¤äÓi5kÉë¢WW{+«îAEIäÍ»o•.ïîùm»ýg“Óÿ[û®Ÿë>O½Å5ÑÐáÑóéSò³#p@<:²FVSÈ ]×Þ QnÊQo²i±ÑC,î#†6‘Î8QœBîcÑTv!W<+¦@ƒhóe˜¾"6@¡¶.ð FK3yRB…T®å,Öt›6µƒt¨‚iNðÁH‘#tŒˆœ²«)VRY9PÜäšè¬¬f¾•cˆqÕÜýÔLà³Þ€ucÀõ¯+‹©*’…(BrÕšV¼›{E=µmÛ[¤xX¼}j•½ŽM(É¥(Y¹½wz(ÆÏ],®äìrÿ؇¤—'þÿ§·‡m”#3]"—Cº/™C¼dÜÿ}}A¯kÒüç(ýÃÎän "Èd( ‹'c3‰á€ààW}¬ü6–ÛIðÝÇØŽóL½¹ùá!rž%׬XõÞM›­W)ù!·l%c x%™Æ1xŠÒæ—/2PŠø\“Š”®ïʾ$¯w¥÷¸CÓæÅJ.Ú$Ôšw†’ºVÓš÷²Ñjùš>SþÁ³ÿž—?÷Ü_üf³ïtW‹çµ;â ™<ÙcWR7–ṟF"U ’[p$œmË­xNKBÆde߈I,$ÚçpGc¹\<©lc%XóÄIÄÅJ²œz©î¬:«Œ§ ¬  tSÅÖþ-:®´ñš³Šv·›Søÿóÿ‚ÅÿÁ6<[}©ÞÞþÆ¿³?íO­| Ôµ›½OQ¾ñ'ì…ñËàÇÅ_|”jÚ¥Þ£6¥/ÃíI|cð¢î%ÔfþÇ´ð~‡§‹]>ÐØÛ+þ Ãÿ)ÿƒ|?ìõï¿õz~Å5é?ðp?u?ƒ õÏÛÓÀ,z’~Íÿ´ì'ûCAk ”þ"øûWø+Yð‡ÃVòþQÄÑ|*ý¡µëvvQÎÅì|Wâ. Y€Ê‘Öxiï)5æY8ÿàJñ]/$ÞÇ»³o³×ѨßîßäyGüÓöÙðïüßþ ¶øûOkޛƗÞãN‡àßÁ{š|Uã¯þ×_4 é—z„»Žmwvúψ®í⺿¶ðæ•«M¦Øßê)ke?¥þÓÿ௟ðOïÙðÁ@¾9þÓß>4x/BÕþ Þ|týŒtÙ›OðG†~øsÇ~-ð§‚0Gÿuý—þ7Å5Ö?bÛ›ö¸ø³û;øm!XußÜx>ðxÎÖÛJûF©ý—cg‰«Á@~>XÁa4ÿ„ ©Eÿ |Caû_ÀÚw•í«ªü“ö˜²ñ,óèßðž5·ü"WZ—ÐÛÄðèMâî®`ðÔ÷‰§sàÿðS ¿…³§À?ø#ßüSö}ð^©kðKö.ø‘ðGFÒ,u(üT5þÄÿ¾èÞÕ-5]/ÄÚ£xÆ÷Ä^ÑþxkJ_I®ø·Jñ6®“jöÚ‚ÍâT¹n³û%xß]ÿ‚!k4ÿ iúí{«xûSÿ‚ÄY¿ü ·7Zå—íyñ ÚZ <>ó[x’óÆÿ ~Çz.âñܱGd¶ò¯†*ahɤ”—±Õ$ã>i.wkYÆ*MßY=]ê½%§U¥ÒòzÚÞ‡Úþý¥?h¿ˆÿð[?‰ß³/„~ ²þÉÿ³·ì…àÿü[ð-§‡~\¿þ#k?oðd:¯ŠntŸ‰vZŸ€õû=z×FÓ|Ea£}›ÃPÝ]X¬z™m_ö"¿ÿà‰ºå—í)®þß¿ðQôð­Ç‡`ý±¿i«? ü<¹½¿šò}sà§ìãà'áß‚5¸í&I¢ië×Þ4[í.æÒ×S¶¼°þϼ}JÃJÑu+Þ Æ¢JJ)$ãÆ[|I.{Ûv¤Ú¾»-J]ûëòéøkê'?ðI/Úþ ÿ>ýþ)xÆ?Û{áWÁ­_¼Eà½'㎫û2|9ø™ñOVºÓ| ð£ÄëðþÇáþ•gð»àçƒ|£G®M{qãgÃß¼k⛯jÚ]¾›á oh·þ úóöpÿ‚”~Ñ¿àœ?ðS=wâeσüûrÿÁ<¼7û[ü=ñ¯ˆ¼¢ÚOàù~"ü øyã½_À_4/ x²ßV³{vñ†/m.ô­FmWÕ<+u'‡ìôPøzÃó£þ ™ýµ?dOÙ¿öøÙá/ß´ÇÀïƒ^,µW|uoá_‰_ü'àïêž¼ø7ð+I³Öô/kš¥ž±âk­SÚæm‡e¨\Ï{¦][ELö,ø]«ëðOø8göôºÐ|UáÏ ~ß:Oí·ñàý·‰¬SH!ø9 xöŠñ_„üo§hÓÅý¯c¹«|^ñF’òêWOì~¶ŸN·[Lj:·L๪§Æ1©MBÐI6ä®®’m8ÝÙ¶••’%=cg}õ¿nžºçÿÍý¢à¹?·—Àߨûã3x»örðGÀ3âñ¹øëñwDZè?ð»?j¯†~øóªCñ Oð€¼ð‡SøoðÇMÓ<¦ët«k;Á^,Ö¼CákϧŒt¨µ« ^ | ûEþß_ðT¿‰ß´ØýŠ?i~¿³WìÅñ§Sø £|E¾ø àïÚ;âÏÇˆÞ ³¹“ÆÚ…ÖãÍnÏÁ> øq$zφïü;ýŸky⛋w±¹»½®5]ÛØ?àÝùC—ì{ÿwÿ­Kñº¾ ÿ‚-|Oøÿ´µý¶?àŸ¿µßů~Î^7øûWx³â·Ã‹ÿ¾1ð·Ã­7â·Á_x3Á>ð7Ž<âÏ_èžñYÕ,> FþÏDxïlgÕc´¸ÓíÓt¹•¹«òÂÔäÔ" Ÿ»ÎÔ¤âî›Z-SQæÑ++5´nÞ«ñ²²ºùù·×{þþÇ?¶í)ûBx›öóÿ‚~|iñG‚>~ÜŸ²Ö™q¡øö‡øaà»m{áÞµ¡üVð­õßÁÿúGÂk‘Kâ¾¥á¯x·áÞ»©ÉáZk½'M]I`¿Õmtï›ÿà¿¶‡ícñ'ãoü£á?í¥ûGGñßCý„~*xwáç†|y/Â…¿ "Jð¯‹iŸ øïÅÒè_ <7¤#ñ=ŸÂ­Y}#ZÖ|QÿúÚ=7S“Í¿º¿ç¿à˜³ý§ÿ௿ðS/ø)¿ÃäÖuÙëÄþðOìÇð_âÙE—ƒþ,Ýx[AøC¡üG×ü$÷p›ísJÐuo€úØ3ÿÁS¿à¥ÿï?mßÙ›öøOû!ü¾ñ7ÄëÙ×öq×ÿg]ã>¿ñŸÂ¾Õï¼oñãâv½â½>÷ÀÚÆ­ã? ø‚ÎÞËá-›ÙióÈ—z‡ˆÖÞy4< ÿÍÑ/ÿàšŸüƒÄ~ Ðõ_‹>¾|Kð¿Ã×ÍeáÛ¯Ú%µ #F²´ãSÔµ]Áú…ž¿£|K¹Òîµ+ïiþ¼6¶×:– lî®ÿÿàš±Çüþãàߟø)¿„~|ý»þøçâ‚~=xwö…ý¦~(þϺ֫$~-Õ5¯kÒbø×à¯kº7ü šÏ‡4[;ÿÙºj§F—Zd¿·Ôí5ígéÛïö4ýŒ~5ÿÁ¾8øWþ áMCÄß goÛOøí¯i_¼Añâ.“ñâ…þhžø©¬x;Ä_µÿk1ðÿ‡>|AÒïî&ð>«6‡q¬øV³Ðâ½Ôíõˆõ q¥Î ã.UR*2öqŒyj΢“sS\­JV}SI´vºÞÛ^îútkKuKÓ±úçð;á§ü‚ÊóágÆŠµÏìÛã»øŸá©ñ{öL“ökƒÂ~øQðÛ[×ôø¥eð“ã~ƒãXüu¯øïÞ ¾Öõ(|CÓµýÿÅd60Êúl¨.¿¾~ηƭÿýý¸>øcþ Iÿí;áÙ{ÂzïÄ_ÚãþóàÆ¿ÿ GÁ·ýf±ð/ü(MC\‹á÷‚³í;|D—ÄôŸ…Ÿ ¿hÙ'×>ðNŽ4Ÿ†Z€Ót¿ˆÂËÄ~ð®¬k±iÞ3ñŽ—á#Çúέ¯“á››Íí ªêW¯žñ/‡Í_ÓoÖÿ#è¯Ø·þ ñóâÿü›ö€øcñ'RŠÙCâûüjÓÿa¨Žàk6µÔÿbïhß¾=˜µ=F±ñn¿Ä?êWÞ>Ñÿá)×|E6›£i‚+ mÕç±ÎìÿmŸÚ÷Åž2ÿ‚þüCðÇŦà_ì=ðâƒÿe»Koü$½Ó¼û@ü2øâß|A¿:‘ðç‰|Y©x7Ç~±¼¾Ñ¾ j!ðÚËâ94‰ô™¡³}7Nƒö§ý—´ïø'·ìÿàøÕà½;N“Ä_ðJŸˆ? øKVð.•«êéyðÏ\6ž1ñwˆ´ŸFðj>> Õ¼:–:ü7÷_~Í¿·ì?°ÏüûØx+Æ>ð·í)ûFjŸ´'ÁïÙÖoëÚ7‡¬|9â köªø·¤øŸâþ±ªx‚ Ið¯ÁÝ3Ä>#ÕµÏ@|5e®^øVÃ_– a¤´¿ðK-Cþ ÷û7|øWû"|ý°¿e5èµ?üF¸øyñçág~$ürøÏ¡ÉâOŠ^?“CÑ­ûtüVÿ‚½€ÿÿoËOÚëÇÞ½øañàAñOÆ—ÞÑôß\øWÁ?³gÀ·‰<[ãmGâ±ã øÂßü#¯ëú¦›ká i¶Oo“g>gügþUÍÿ‚³Ý÷ÿë |+¦é¥¤“p©I)(F)©Þé5¬ãç-Z³ÒìiÝߺ}[í÷=vGÙ¿ðLßÚ'þ “ûy| ý¾37‹¿g/| Ó>/ŸŽ¿|{ƒÿ ³öªøgáo:¤?´ÿx À_u?†ÿ tÝ3Ázn±ðgJ¶¸Ó¼âÍkÄ>¼ñšxÇJ‹Z°Õàúá_í'ÿÿ‚œüoý£õoØëöŠøoû~˲—Çk¯Ú6·¯üðçí ãÚ3Ç^Oµøé|Miâ/øzÓÁ_ õ¯´9´»êO‹Î‹¬Y¼Z¥¾­ ¶~ÃÿìÊ¿cßû¸ýj_ÕùÝÿ;øåû5ÿÁ5|'ûx~ÂÿµOÇ_‡?¾"üý²ü}ã 3Oøáã?ü?¿ñŸÃ?|=øsáïx£Ã7ºýΤøÊã^Ñþ¦¾šg„Íî«ý®èš‡öT6zî‘ö…+sWå„9©Ï– A?uÎIÉÅÝ6¬–©¥}ÐK·ªï×K+ýþoÌÑÿƒy`ñ·íÉÿß¶ø¨øsWø‡oûWxFjÞÒõÂZ§Œâø½ûeÇâGÂÚ.¯©ëZ¶‘áËÝqo®tM/SÖ5mGOÓ%µ´½Ôïîb–ê_꺿•/ø7ŸÅúOÄÛ—þ ÁãÝ-b Æÿµ„¼_¢ÃâXð¶¿“â_‹ÿ¶^³¦Å®xcÄVZoˆ<9¬Gg{ jz»§XkEèŸOÔì­omç‚?ê¶²Ä]=ÚzvýÜB ùþl(¢ŠÄ ¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(âø)ü˜Ïí%ÿdýÿôõ¤QGüþLgö’ÿ²~ÿúzÒ(¯Sü)×Çÿ¤ÀÊ{¯OÕŸÈOüµÿ) ø#ÿfðÿS¯5ü¹×õÿmÊH>ÿÙ…üÿÔëãM.uþ x7ÿ&¿‚ÿìOý?\øœÇý÷þ5ÿ¤Ä(¢µ¬´™®¶HçÊ€à±!–FS“ˆÕ+nP¤I“YS#¬‘¯é5*B”y§%çÕöIjß¡æÕ­N„êÉF+¾­¾É-[ô(ÛÛIs"G²¡}ÁY“i Fc¼Çƒ°`eÙúK}ŽA;™$bÁ]8ùQµ\:—u9feo-ˆòŠº [e#T%€F$—j %(»U¤(ªœprB…SëÈ­Ž«Q¥Nôã¥ÒÕ·{ïdùzZÞö¼Ú>UóøœÎµWjMÒ†¤ÓriÝûÜ©òl¬×½«’´¹#‚[ä2y[X–cÚÆ‘±1ÆŒC¤jªûT¸b ‰J©*H©Ü¤€J¶Ò¹Rz¬Ë‘ÎÖ#¡5&ÆöçÛ5~ÃL¸½ºµ·ŽÜ\\C 1ÆÄâW‰Nk*²£e:±žwJµœ¥$•Ûœ”l’í&žÊÖ^K±ç¯iQ¤œ¤öWmÚêÖ¿Ee¯K.ÈͪíknÒC)Œ,±2Œ¢Ž~ì¨d #Y—nÑ{Iãɨw‰Ð}â¼–0+þð#¨ÅD"vÎÕ-µKpRxàäà柱¯Te­Óp’{«4ÜÝ;4÷NÝA{H;.xJIè¹¢ÜZiífÓ\Éôj븑¡‘Ò1€]‚‚s€I€N2}+Ø| $†Ý‚4*F7†–L…ew,(™+’ §yǘiok Â5Õ”·€:|©vmBåÔ½mç*Cí˜2áˆòÙŠ•úëá¶©àøî [Ÿê7 dpò´,PT‘@Œ;A?8I .áÇή’¥QóÞR³§ÜäŠS© hä¥'7yz™u(»ÏG7%ýí"ÜU•ÒNNZ^-Ú\¾òW¿Ðÿ ~E­Z$pD[P™„ “%ìHi-•#Ëß$BCö=ÂK¸Ñž %O)½óÄ_MÆàÈmôó,Ï¢jVäš=»¹ðÖmg£½ÌÓéww‹Yka©B5Ýh]C¶žb».¢¼ºxÖÞÐê%á˜ÛÜù*‰ù–cšâhâ©CØÔwŸ´æ”—Ã(ÔŽŽ¬¢›n? ¥(Éi ½Np“rQ´n•åîûê)¤¢ÓI«]ê¥m9}çøwñ7áô:d³¥´~z¡e7E(æ“hWhCÆf 6Í:¤¥ rmŽ7hÓä_hIÎÇQ*À°!fŒyVv@wóœ“úÓñJ‰'σïe@§”ñ¤‰ðeRÑIÿìžjL‘yQ’å(Ãt…™¾ñ>™ ÞK ´ðÅå³ï™£-âoµ*¹ ’Û´‹_¼à† d œvÈÿa–fc)Bqi%z’¡ËÉ$½Ù¥UÇá³—Ù»\¶Òä¯J3Œ£+8ü3‹OtÕ¾½ä¹ß2Wå’½®þ@}Û9`”¸.»v0ËF#(= lŠFU\³m!C¨Q½+êßxã[ñ•‚ÛJËq¦ø‚sí`ËÃæ¤Ì’­¹ɲ¢?1@Ë*î¼þ粤gͶˆ£^ÜÆX° dU^9e;Ã]àà{ˆœÜ]'¡NV§VïßsW´”¹“ä|©YhÕÞëË–YãU«·neºY9JTí«ø¹lÓVZ^^ñ£©I]GPÊpAVÈà€zŠÈÔ4Èç&h¢ÌœoHŠDÎw3 ØŒ´…ÊÊòÀ‘ 14>©¨ø_c7—›w9"9h˜îlíaó*ÿ ²‡\!Ú9\¶ÒÅ#ÆÈÁÑŠ:œ|¬2Ì>R8áÃd`A=Ô¤Ô°rWeIFJ¢N×¼ÅÒMÁ½RNÚ²XŒ Ô¹¬“ѧ.I^Ú5xµÌ’íÌ—ºÚGÐ?ðN˜eƒþ ûG4mÛ3ö_á†2Ç.å=IRU°pH¯õ¯ò¡ÿ‚{Ú=Ïüög€Æml¿ÙŽUw’%.©ñ«ÁeŒf1pÅITc‹rÿ!.¥Hê½_Æ_Kjóþ•jR¥'’ã½ÙuÿnŽ©^éj´’M;­l~•˜¥ŠÂb$ÔTãZ1šŒ”£wÓM7ºµÓÕ;«¶™åÞ<øð[⟈þøÇâÂ…ßü]ð“[oü)ñO<á?øá—ˆÚÿDÕÄuÏé:ާà½mµ? xsQmWÃwZmù¿ðþ‰vg7U„u¾0ðo„>!x_]ð?ü+á¿x/ÅmÎâoxÃCÓ'ÓõMP}7V±²Õ,îÊf³ÔlíomÌw6ðÊoövŸýŸý“ö?쯱ÿgf}šìÿìÿ#ìßaûϳ}ìßèÿfòü#÷[<¿–®QKúþ¾ä ðãá‡Ã_ƒžÒþ|"øyào…~ÐÞþMÀß<% xÁú<š®£u«ê’i~ðÆŸ¥èº{êZµõî©~Ö–Pµæ£yu{pd¹¸šWîh¢÷ùÈÿ‚Á/3|=ðçÄÝ;à§Ç4ÑtÛ¿„ÿü1¢xÓÃúž‰©|CÐü=¬.³áXÛ¼ŽŸâ+1g%ÃAõœ÷_Ю¹á ø›Âz¿€¼IáøƒÀ¾ ðî¡á Áz扦êÞ×<'«i³hº§…õ_Û\hú—‡u-â}'PÑ/lçÓo4Ù¦±¹¶’ÖG‰º**ç9T““Ý»Ù^ɾɷo¼±Äü:øiðçàÿƒt‡_ |àŸ…ß¼;ý¡ÿÿ~xWBðOƒt/ímVû]Õ±ü1á« 3DÓ?´õ½ORÖ5±XÁöÝWP¾Ô.|Û»¹æ“•ø¹û<üøÿc¦é>üøÙ¦h×k¤iß>ø/âEŽ•|Ý[­î›iã-Y·±»[{ëØæÖ8¦Xo.¢âU`¢¦î÷»¿{ë®úògíEãÿÚàÂ_^þÇ_±þ›ûTø¸x»MðÔßtߌß¿fý/Â~¸Ð|K¨^xÖÛÄ~8Ó.|9{o¤ëºo‡´øDtÛkmN÷þ†Õ-çŠ×F¾ñ7üOöø¯û%Ý~Ø¿ÿh§ðm§íûsþÐZïÆÏˆø­j^"ð¯€tI6Ýh÷¿þüø¹yáëÛ}K@»øŸðÃÁ>>ºÐõ@âÖÿG¸ñ^‡«K¦^Û [ÝY<ÂÄr.ãŸTÒ´+BÓ­4}LÓôm'O…mì4½*ÊÛNÓ¬­Ô’°ZYZG µ´*I+1"I 2kBŠ›»ZîËe}ÈgŽøWövýŸ¼ ão|KðGÀ¿ƒž øâǵ“Å?<+ðËÁ^ñ·‰d²í¬¤ñŠôÏ]Ö^ÒÚY-í[Q¿¹kx$x¢)²™>.~ÏŸÿh ;LÑþ<|øAñ³IÑ/N¥£i>ø3âF¤j& íMþ™eã-Y¶°½6×W6æêÖ(§ò.'‡Ìòæ‘[ר¢î÷»¿{»ýàSÓ´í?HÓìt&ÆÏKÒ´»;m;LÓ4ëh,´ý;O²-¬ìllí’+kK;Kh£·¶¶·Ž8 ‚4Š$HÑTqž>øQð·â´~‹âÃ_|I‹Àþ-Ò|}฼}àïøÆ?xïA[…Ðükátñ¨®âÝnî—Iñ’-59nnä"iwôRžñg„|)ãï ëÞ ñ׆<=ãOø«J½Ð¼Oá/hºoˆü3â=Ríµ^Ðu‹kÍ+XÒ¯í¤’Þ÷OÔ-.-. wŠxd™N< >ÅðÜü‹áç£øB|'Óðª? h ðÜü=›FoKà3àeÓdžƒ%ðó¾ƒ'…Ηý†ú3¶–Ö&ÅŒ¹¢‹¾þ>à|½®þÃÿ±gŠ<à_‡^%ýeï|>ø]ÿ ?ü+?ë¿>jÞ øuÿ ¶«»ã?øA|1¨xJãDðü%Úݼljÿá±Óÿ·õX!Ô5_µÝÄ“)ðëöý‹>øËGø‹ð—öAý—¾|Aðïö‡ü#þ:øuðáG‚|e¡kiWÚ«ýâ xKLÖôÏí=SÔ´}CìWÐ}·JÔ/´ûŸ6Òîxdú†Š|Òµ¹¥g{«»;ï÷õ .Ëúÿ†_qå‡àgÁ3ñ=~7ƒß Æ…Ñ¿á_‹§á÷„Äõð÷žn¿°—ÇÇHÿ„¬hßif¸þË·Ø|ö3ya-Xþ ýš¿g/†ß|[ð{á×À‚~øGãïíïøN¾x+áW|-ðçÆ¿ð”èVžñ?ü%¾д øþ? ØXøw^þØÓ/?¶4+;M#PûFŸo º{]]÷}:¾›}Ý;Äü:øiðçàÿƒt‡_ |àŸ…ß¼;ý¡ÿÿ~xWBðOƒt/ímVû]Õ±ü1á« 3DÓ?´õ½ORÖ5±XÁöÝWP¾Ô.|Û»¹æ“ Å_> øëÆþø™ãoƒß !kžÒtíOÆšÚê~%ñ¢º¯‰.µ+ñâ nìN.5[ù'õ(¤Û{»ú€QEQEQEQEQEQEQEQEQEQEQEñüþLgö’ÿ²~ÿúzÒ(£þ Gÿ&3ûIÙ?ý=iW©þ¿ëãÿÒ`e=×§êÏä'þÚÿ”|ÿ³ ø ÿ©×Æšþ\ëúŒÿƒ¶¿å$ìÂþÿêuñ¦¿—TF‘‚ ÜÍ«  Ú¹#s60¨2ÎÄ"fÿ¨ éá_þ„ðÿÓõω̚XÜKnÉNí½’åŽ¬¿¦Z »®…¢AºO•Š`ð™e‰·; —mÊ £Û*ª¨UU@UU*¨ÀpàU´´ŽÖ4UEªQKÿ6L˜oºÒáZ@3±Å½Òˆ¸N?ȯ®ÄÖxŠ©Bî+Ý„{»êív¯'ײK¡ðøìWÖjÞ.Jœ,"ößYY6¯.ý¬º\URÞÃÖºK I‡™s¾Þ28Lm™ˆb§rºüƒ H%Nw+FsoDÒxK«„WÜ ÛÄÃpÃ`‰˜—$d `@Ìá‚êš>%Ë©dÝ'ÞÚÙ  ãÍùIËœ¿åó9k⣆¼(òº‰~ò³³å{8S¾‰'î¹Y¹;¤•·ÂகJ©Yé4Û»³Z&¯;kÊôŠk¦Ò\•†Š©·ì¶HܾqL¾q– 3ò3€J—Uäm^@¯Iø}áiõ?x'M-¿Ú>.ð݈Œþ׬ÙÛìæ&Îï3oNý z&àf˜FL . “…_-Pâ0?*ÒÆÇ• +¨gŸ†fóã‡ÁKnþ,ü8µUeGP—/Ñb è^3´oÁŒÇ>_E_ÆæQ…*óœÜæ©Tšr’Mòž¼Í®­9'ºåG¯NŒS‚Q„i$ï7«I.X¸Å-ÔTbìôoªüê}àUãlcå K{X×Ï$t8ÉÀ¬K­"peµXä $K°¶TóG(Q´á·¢°\€Ãö•çÃÆxð SVB–9]¿*´ìà7<(ÛÃØÊùž·à™m<°˜ÙY˜þ¯z”rX°QÌX,ܨJÚŽ>•£9FZ&”“kkß–×½öNMßá{%ìö”T]Ÿ2änºÑJ*NQ²»¶‘“æét˜“JŽ+´”ÈÅ™°ÆJùŠIQ• ¾b¨Ü]Õ”WqáÝLéwˆÀ€¥åÁùÆç’3ƒ–Î×Û)$!Ö«¡<.â(ØLœ˜¹a"Ñ7Á8bI9O•—esK™È{“´ÿzMWÆ(Ú­îòÞ”Ó^m.‰¤Þ–VØÍÍFJöå¼›J* É»Ên+ÝUqotä“|×wû§À_¾ÁjmãM†àÄìVXB>Ï*ånòØÁ¹KHåãègâ«aø@Ũ42"ý–S,¨Ûáño‰\L­ö™€Œ¨É[•cÊ_Ê/^¸³wŽ9ÙÞ¡ÑKFÑ‚dT Z22‰6FÄf9#"6FdÓ|K6¥§é0¬“†³°¸„3²6äþØ¿ºù‘IXŸ}ÑHhÀvcæ²WŸˆá\\å ²§ QŒùíUS”“•9{ö圢ši¦Ó»i¸ÚWZÇOU=V®Gªv\×ä•ïͶ¢âÒ“v·Ò"ññ<“Í)‰î'm÷SªÅ™fò‚%Ä‘ÄÞRÌì]åØª$‘Va¶G’³4χWz¤ª­jd*3®…VÃ)Üp¢ó)ic8/(žӎ¨Öˆ4Ó4AØ…É_**b0 ¹b¿ `çå@?S~ü*ѵÈlô_$ºt ÀišñŒË쬿&¢ <¯¡ÝHäßI-¥»Ë{n·6òMm7›˜Ð¥“ÑS©_XCž¤hÓwŒ´\,ï;(¿ÝÆŸ3KÜ»N2tç*’ä§{7Íï$Új>öª-¥¢ÕYh›µ®¾iýžgÉõ/‰š$mj‡>)»Ä¬_ÊX~xúu.¡¤xHŒªäI7¼§€k_.-b¶FT0Bͳ$âPªŒ‘†L »MáY€ |¿éGöyýœoô_ŠºUž­£››O |LGlcÔ¾øö'³»‡tSÚÝÙLis²ZMŠá“ÍŠAó·‰?f‰î-u–Ò; 'H´KgV¾–ÚÂÙm¼¸•Ld‹ËûââÓKÓm‹Ý]ÝË£ºš‘Áñn] ×(ÎSÀ¸J§5hNRÄc¹­¥í¤¡kÊn\°JHì–»¤½æåÍ6×½ªä¦úÆ÷Ž·r÷nÓ‹nLþh|]ðñl¬±MÀ´†"’¡3™:î%Œ…™J8LΉ:§Ìþ*ðÔ–óÈcLÜ+ƒDÔ`F~r]B¼I Û#gUØSî,_¶>XÛI;éÖ"ÞÒ4IJ¤_k¹Œyf[‹Æƒ\I²K‚‘‡‚ÙNÛi]#„׿Ĉ ñDˆdó-™™Xùg;ßäÙeE˜F—ÜɶpönªB•J*4×»SŒya 4œc¦ôçgk¦´jQg‰‰ ¤¥ ÝïnÿâWÕ5½íê¬ì'üÕqû~þÞ‡öÁý™ñÿ‡§ÁUþ¨µþZ°m¹ƒþ ûðvËûa~Ì÷IRH—ãO‚‹Ÿ—¢‰|ÅP@mª ÈÃõ/¯ã¿¦*úËÁ“‚´*ä8Ú‘[ò©c£xé§»+«tVGÕp4\0¹„^ñÅA}Ô÷ùîQEŸrQEQEQEQEWË>/ý«¼?៉ž0øO¢üý¥þ+x¯Àz…5_‚¶¢¾Iÿ†¯Ô¿èÎÿà ßø…ÿùAGü5~¥ÿFwÿÿÄ/øÓÿÊ W­ÿ>åø˜sGºþ¿áÿ>ÌúÚŠù'þ¿Rÿ£;ÿ‚ƒâüiÿåðÕú—ýßüÿ¿ãOÿ((ú½où÷/ÃüÚ=×õÿùögÖÔWÉ?ðÕú—ýßüÿ¿ãOÿ((ÿ†¯Ô¿èÎÿà ßø…ÿùAGÕëϹ~æÑøϳ>¶¢¾Iÿ†¯Ô¿èÎÿà ßø…ÿùAGü5~¥ÿFwÿÿÄ/øÓÿÊ >¯[þ}Ëðÿ0æuýÃþ}™õµòOü5~¥ÿFwÿÿÄ/øÓÿÊ ?á«õ/ú3¿ø(7þ!ÆŸþPQõzßóî_‡ù‡4{¯ëþóìÏ­¨¯’á«õ/ú3¿ø(7þ!ÆŸþPQÿ _©ÑÿÁA¿ñ þ4ÿò‚«ÖÿŸrü?Ì9£Ý_ðÿŸf}mE|“ÿ _©ÑÿÁA¿ñ þ4ÿò‚øjýKþŒïþ ÿˆ_ñ§ÿ”}^·üû—áþaÍëúÿ‡üû3ëj+äŸøjýKþŒïþ ÿˆ_ñ§ÿ”ÃWê_ôgðPoüBÿ?ü £êõ¿çÜ¿óh÷_×ü?çÙŸ[Q_$ÿÃWê_ôgðPoüBÿ?ü £þ¿Rÿ£;ÿ‚ƒâüiÿåW­ÿ>åø˜sGºþ¿áÿ>ÌúÚŠù'þ¿Rÿ£;ÿ‚ƒâüiÿåðÕú—ýßüÿ¿ãOÿ((ú½où÷/ÃüÚ=×õÿùögÖÔWÉ?ðÕú—ýßüÿ¿ãOÿ((ÿ†¯Ô¿èÎÿà ßø…ÿùAGÕëϹ~æÑøϳ>¶¢¾Iÿ†¯Ô¿èÎÿà ßø…ÿùAGü5~¥ÿFwÿÿÄ/øÓÿÊ >¯[þ}Ëðÿ0æuýÃþ}™õµòOü5~¥ÿFwÿÿÄ/øÓÿÊ ?á«õ/ú3¿ø(7þ!ÆŸþPQõzßóî_‡ù‡4{¯ëþóìÏ­¨¯’á«õ/ú3¿ø(7þ!ÆŸþPQÿ _©ÑÿÁA¿ñ þ4ÿò‚«ÖÿŸrü?Ì9£Ý_ðÿŸf}mE|“ÿ _©ÑÿÁA¿ñ þ4ÿò‚øjýKþŒïþ ÿˆ_ñ§ÿ”}^·üû—áþaÍëúÿ‡üû3ëj+äŸøjýKþŒïþ ÿˆ_ñ§ÿ”ÃWê_ôgðPoüBÿ?ü £êõ¿çÜ¿óh÷_×ü?çÙŸ[Q_$ÿÃWê_ôgðPoüBÿ?ü £þ¿Rÿ£;ÿ‚ƒâüiÿåW­ÿ>åø˜sGºþ¿áÿ>ÌúÚŠù'þ¿Rÿ£;ÿ‚ƒâüiÿå{Â?‰Ú¯Å©|TÁ/Ú#áE§„´k=fïQøñðoÅíu}¬Øh°éþ‹Æ0Xßøšþ)¯ÖïR:E•Ο¢ÙÇÖ¯ôû½W@´ÕÓ¡V)ÊP’I]·k%÷‡2ïýiþÕ™êÔWËž8ý¤(þ̶ÿ ®~$xâN±ð Å6Gñ‚ÛÇ7>Ã~,ýž~9|uðv­u§¯ÃírßÅRø‚Æó@ÔZÛJ¹µ8µKM0tæ““ŽŠ×wN×vW³îìO¯õdÿ&Œoø)ü˜Ïí%ÿdýÿôõ¤QGüþLgö’ÿ²~ÿúzÒ(¯Gü)×Çÿ¤ÀÎ{¯OÕŸÈOüµÿ) ø#ÿfðÿS¯5üÃi‰ob%€ò˜Wc30UbýÔ‘¨WØ HѰ,¾Sy»Hþžàí¯ùIÁû0¿€¿ú|i¯æcAŒ4™pP@•IP¶î‰]ŽX‡ù¥HÙG”dY¤ÙþœxK>O 8Aõy,"¶ûXŠÑêšÙ¿6¶³³?>Ïê{9㤛j mçǪkfÝ·iYkc£­=.ÐÝÝE\¦|Ézä¡*C ç‚Au9k2ºÿ Ĺ”€X¢Vçp38ôÃêNW¶9ûKÙÓ­Y|Tà”iÔ|Š^©6×§{‡¦ªUŒZ¼Uå/E­Ÿ“v‹ë®‡¢èv <¡Ö2BX•r ¸9ÆjÜÀ•–ù ¯¦¼ á¦Y 'ÎNLÂEUY°.”q´á@eÜËͮҀñÏéáæƒ#!ÈÅY·ƒ/ à·å…J¸ÆÐ~` ¶þhI+Y"ƪÌÑÅ@vtŽ8äd åbmÍ€²FªÁöá~W0®ÔT·6²zéîó9=o¥=­fÚ’[Þ?OïmZ~Ê7³[¥)Yßâ›zÙÙ$Ò³õ ü!–ëH‡ZÓby´RñCxt—MÜŠÄYj1ľpiù´ù±½ÌH|É’í§…~Èý˜>¨øïðBcfd>.ü0šgÀU‡ŒtGwò‘Qr 's›¸ñUó96~é2i[\Û[Gwo$ kwaq“i©Ø>%’ÒîXCÅ+"JóFѼq½ÜSCsok4£ÿ¾é–¿~ø—BYn45øŸà$´šC5ï‡îGŠt¹†¦Ñ«<2ººØê$-¾¤‘¹&±umæY®{(GFs:2Ãâ%R´e+ÓŸ³…Y¤Ÿ;÷l¯éÝE&¬ûhÑrJiÙ)Ù¾W)I§ É>‰¹{ÖåŠÑ6ÜÇ}kàâlÜöÏXˆ ¹w³o‘Vf•Ôl^eóâE(0»×çðO|'6:{j·i"içÌK$‘]¦½¹ŠTIã·a7Ùl‹°¹¹uÙȷIJ̡¿m&øW¦Ûiø“_Žxt^X,ôøeXïüU¨B‹+éºt’Ö––Ùµ]m­Þ.6—Z•ͬŸ|_Ò¤Ôî®o'†ÞÝ¥µ¥„ }?M³Vqi§ØÚ9 µÞXÈlÏ6ë«›©§ººiê2|Ú†&¤cJÑSZÕ«'Rí«rBU%Uó4¹¥(µKÜ·´r„yëR•4§ÌÝÚWK–I¯çÑ;éîï̵æ²iþ0x³Ã‹fÒmÈ”’¡‘³Ÿ0 0FÆÂº†P7¢Œ$Â(þ{͕֬ë¡ûÂò30ùL#–©”ÚQ”[k«†÷§Ä}(¦½·ØvüòG¥üœ+Þû”•…ƒ  ~öb7‚ƒãŸ[¡„\MÁ#‡²¢9$ÑÈ‹É9Ú2Ä#ö,³ªÆšS«h+Y'©ZéixÊ;+¨§e{]EÕ½Výõï¿tþlñ8cŽÒí÷\Ŷì"rÖWW±˜ŒRK ¢@^{eŽÑŒfåfò홥@k迆º/µ;È©ñBÏ@‚WBë/‚¼i«HªñycNÓÈØ‹¾`H,T¢üÙ¯îŽí6Ø%·]á)vS4E¤E!îd1+¸Ã!xÔ®£¾ðÅì1\Xͽ¥‰Äq wrÉ"Ixãy¥ˆ¦æHƒóÕ⾋1£*ØZUUZÑ•ZnðT+äW‹ç¡Q;ËŸ‘I»EYh¬¸0òQ«R•¢”%{>kµ}÷í¢·3QÕ»îîÿc¾|3ø3Øy¿´ï‡ ”ˆã¿ÁŒ²ù‰"aXÍ€•Vhdœ )Q·Ú¯? >bÀCûEh7‰² ~ü\‹!ÕNÖŽãH#³æ ‹4Nî .6»§óWð‡ÄI¦\Ú–œ—¶˜‰˜1Ž)„eU˜XgEÁˆÈcLÈOê§þ 3û)x›öœ×­üY­G¤ü!ðµÌsjšÌ¢á$ñMí„ñ‘¡hÓ:Ç–É)TÕï`–Q˜Öv..~×w¦ÿ8x™R9.WŒÌ±ÙÞ6Ž4ãÊœ2»Ö©+Â)AeqJòi¨Bz>yÊ0ICéòÔëâ!NJN÷½|±÷Srn¬”`•îÒÖü¶wHý¿ý”¿f]'ÄžÓ¼VÞ0Mw@Ò4ïiÕàð¾µ¢]G&³¢jžÔ-#]~ÞÎ[ýÈê—Q[F6Ùê¶Æ+ »dšö1òí1ðkÁ^±¹ð®§ñ×ÂZ‡. ÙG/ÃoˆZ”:ù…Zç]¾Õ,´#g©jº¨U…­³kcc¾ËNHíRöY¿aÒ¥8Oê1t°ôhS§Ê¥Ví¯zvm¸{Fï=´/4ŸÁÛŠ“_œ´ŸÁ/ƒ~ÒÚ£4’îŽOƒ_dRæ7”)ž”ÈÁ,гFBdÄÁü\øÇðßà…Œ÷GOý¥´=VM³¬QGðkâý®æmò d7š %ÀXÐ,ª«NcW˜à5}ÑûFxÊ[kíGKº„C{€È‹0’2¬7[Oiqle·º¶“úü.Ö÷QN—òʉ+?ãÿÅ eZêq›ö´Ê ®±æH6·e}û~ø*Ø?Øü%9P£FSÍ3:©Â“ŠŽ*åi^òæ–]N|‰»ÂÓ|Ï™IÉDù Ræ•KR§e«u®ï%öÚ»–Šéi«¶ŒíbÝÂVðP؆]#Ç–ºñö¼ýšVÓËð¯Št†» ñŸÁNSv¯kn©‰…c`ɉ UW?éÝ_å·û M»öÿý„£çþOöl“'°o^UUÁàáŒp˜<ÿRJþsúXbþµpT¯Y¨dxøÇÛ:.|¿Ú +û T¡gfïÊÛwW²GÐðŒT)æ1´oõŠM¸©¤ù¨¦¥)ti«YY««Üüòý£¿m/ˆß>#|rÓ4‚ ñÇÂ?Ùoö^ðíiñÿÆú¿ÆÝwÁ­~ø¯]ý¤mõà÷ÂË?Þ5ðÏÄoh^ý™¼[«éšo~0üмA®ëÞðí߉<;§¶§â‹¯5_Ž´/оø®|_ø]£|oñ¦‰?‰|ðoUñÿ„ô,ðå¬> ¸ºñ†¾]êÐø»]Ñ-­ü'â™çÕt½"êÂ|5â dSFÔZÛócöÃýƒþ#|}ý£~"üNðÇÃÙ{^ÿ…‰û/|$øðëöŠø™â}wLý£boˆÞñ×í7â ïÚöqÑ4ÿ€^:þÕñ·‡¿áxxÇ>Bøëð]»ñ×ÂmÒoxc?Œ4M¿Ú{ö@ý¤þ3|~ð׊ôÍ{DñOÃm3ö†ý‘~/hŸˆ?kÚ?á‡Áÿ‡ÿ~.üø—㟅P~È üâoÙ×ö˜ÖüM¬|3ñ÷Ž<5ñã/‰¼9ã7Äô¯ôÏ|øq­Þ(rÁòê—»«¿[G{·³æv÷[JÉlß×ÿšý<¿ÏÍöûËPý¥g-'Á¿~"꿾 韾øÚûá§Å¯j| eàß…ß´ÍWGе/|Eñ=ν‰àŸiú߈¼?£ßxWÄ·Úf»iªëº>Ÿ=„wz”3ö¿ð²þÿ¹ÿ…Ãÿ ÿ‚áQÿÂÿ /þŸü%Zü+ŸøW?Ø_ð”Âÿ ¿Ûÿáÿ„'þŸø¨¿á*þÓþÂþÂÿ‰¿Ûÿ³ÿÒ+ò\ÿ‚w|oÖ|-áö»³ø'e«|øÙàÿ|"ðÂoŒÿ´ìÛÿ /ßüý¢¾'t¯Ú“áW†_ö‚ý–> Øjß´ß~/|ý“ô?ÚgBý›¼Ÿ~Î^øûâÿÙ÷âÿ†tÙëêd韱‡†>øj?øwâ…>6xö²Ð¦ñ÷Æ?x7SøàŸÛ+Bý¶®~øŸãÅ­GâÆÂuãøëö‹ñ‡õ wSÕuýwãF•ðD´—Mø ¦'+ZMÞI=¬“ß­î½-­“ºc×·ãéÿîó‡?ðR?ÙËâ»ñ¯[ÿ…Ïû/h?³ïÁ¿x‹Á_ð¾¯ÿjÉ¡xãûáÏìmâïøK|*ŸÙpx&ëÁ:O¿køSž?׿áf¿ü ÿ´_†šÙ5í[ã'öWÃÿ¯4¯Žµßо%ø¡ü_ø]¬üoð^‰‰|cðoJñÿ„õоðåÔ>¸µñ‰~ZjÓx»BÑ.müYáiàÕuM"ÖÂh|Káùc“YÓšçòUý€?k‰ÿµOÚâ~Ï>ÔüIûCx;âÖ©à|Yø“ñ.ÃHðçƒþ.ÿÁüW•‡‹õÏÙÿá]Ƶ­ê~ÿ‚g|d¹{kèv#ñ¿Ã= u+í2÷Å>&ð±âÏø%?‹ü}ñßÀ:æ±¢iþø‹­þÞ>4ðwÆÍWö’ý®>#ßøsÄ·‡?i-êÓÃ_°%ߊ| û'ü+ÖþXþÔ¾)ðôÿ4¿üA¿ø“áÏx‚öO‡žñÏǽGÆ鯖žõµJÒ³²Õ»«ë{òï{¥důožÝºnºéåæ~†ËûwþÉ÷PüÕ<ñÇáwÄÿüuý¡¡ý–¼-ñ áÄφÞ5ø£|i¿øUã‹:ƒ|WâÍ/Æ ¦iÚ߉tÏÚø[Ã~Ó¤ÕüY¬øãÇ¿4;O=¿ŠcÔ­{kŸÚëöO³°øµª]þÓ߳ͮ™ð [Ó|5ñÛQ¹øÕðÚ ‚¾#Ö|G{àí#Ãÿ®åñ*Ûü8Öõ_iº…´Ý+Æ2h×÷Þ#°½Ðí`—SµžÖ?ž.þ~Ñ¿>'üøûñ3À_²÷Ã?ˆ?~6xÄÐxOá·Œüuñ#UñçÃ7á'íEðKÄ©ãÚ3Äþëoÿž‰û]øÏâÂ?„Ið&ïBÒ|eàhº‡Å[[OÚKUñ7ÀŸ—´Ÿø'Çí}áŸÙ'À¾%Ô¾ èÚ'ì+àŸÙ·àÃ?è^:ñ׈õ__~þ×ßðOߎ^3ø™ã¯ j <-iðÆÏðûö‚ |)ðÿ‰þ>hZ¿Œ¾,M¡j¿¼9¢xÊþ{»¿øUßum+À¿|ˆdÿ„'ÆZžŸáÿfkw¶Ö2öÕù{ûüÕoþ-üDøý<^6Ð>ø[ÆßµN…û'è~xËá'Äÿø7öÑøŸðö®ý¨üuñƒÃ?-¼9ã˰~Õñ/À~Õ~|Õ|9ð“À7'ñßôÿ‰¾ øaú…Q$“²wï從©Z룺è5ý[Só âÅïüñ_üŸÇ¿¾ |@øYâ ˆðD‡Z‡¾ü7Ñþ0|Sðï>4~×Íðoâ”ÿ >ë¿ >5YxçâçÃ/ø»Mðo‡`øIñX¿ñ|#­ø€i–RþŸ~Åþ;k¾;ñöƒ}©~×ÿ´oìåsÿ ²ÏÁ´íiû9x;öIøÙá?Šzžû@k_|9âo…:ÿÀïØkÄÿìÿàÏøö_°øyã_þÍ5ñ³ñwö‰ñŽ’þ?ñ·ƒ< 㸿g_˜?gŸ‚žøýûY~ÞÞñŽ¡â 7HмAÿšø×gqá›­:ÏQ“Å_³_Æ?þÑ~ÓîfÕ4­fÙü?«xÛá_‡´¿ZÅg£}á[ÍfÇGÕt^âÇ\Ó¿oµQÕ5 ßXø³Ä¶ðçˆ.ucGÑ­¼+>ãÝ: ø›ÃÑxOÅ’ø‡Ã:î¯gáû=_^Òüumsà]SÁ~*ox/Ã6wž&ºðM׌|âÏjð©׸é(Â[¿WùŸœ ÿmoü7ý¾ktˆj߇¿<ûü}ðÃý+ágƒ>þÍÿ¾ ÿÂAám_ö£ðÿÁýgáγâÏ|ø}â«=Gãç5‡ ¼'âoÙCâ_Æ/þß¶¾ ñ Ò|'¬Ü迲½á_‡޹ssñOÄÞÒ>|dÔ¾úÆÏØCáïÆ}G㦭Ä¿Œ .h_ü:Ѿ!é_o>Þü=ÖõøWâÃx³Åÿ~*|/øð;ãWˆ>5|øoðã5·íðÛã/…|KðÏáìê4? ø_Æÿ³ÿŸxcÏüWÿÒø{®ø«KÔ|9û@~Óþøw/ÆÙcã÷į‚úo‹þüGð¯ÇOŒ¿±ö£ð„¾-üQý ¾üfý¨õ\h²÷À xöo~Ð~ ƒÇ:wÈüE­ÛËñÆ¿.|fðwˆþübñ_…¾ø~ãâ·í ð^-;Â<=û=ø«WŸãƒô|9¾¹Ðüy¢x ý¢ÿà¨xâ·ìý®i~øÁàØóÂÿ´ÿíoàoÚ?ö±ÖtƒZ×Á¯xWö>ý‹ÿoÿ|tømá?iŸ<]û_ZxƒágÇïÙšúkrÏösðfãþøšßÀ¾6ñ—€ükáøZOþÈ¿ðO~É?ðª¶|xý ?høgÿÙýeÏÙ×þ£ü ´ÿ…ð&ïþgü$Þð·ü(?_á1ÿ„ÇþOÁí¿|eÿ…¡ãøUúGü"^!ðÏü$ßÿá6óÿˆðJo‚¼G%Žþ-þÐïìå/ÄÚs┟±·ö·Â-3àKxïöÈøYûGü,ý¤5ßøN´ƒZít?ácCû[þО4þÌ_Ú€hþñÄ žÓü/àÏ x#ÁÞò†¿ð[ïÙÓãTF‡ðGáÆÿ5ÏŒøCaðà§Å¯Ø â÷Š„þ;ø5ûG|rð¿Œõ‹m¿~ÉÚ?‡ï¼û%ü{†ëš¿ícñ—FÔ|¥\kŸ ôß üBøkâzÿ†¿à«?üs£ø}¼ð“ö€ñ§ÄŠ?ð©üJø­ûNþÓÿ´WÄO‚¿Åïx›âÞ¹ðkFÓ ž€_´?ìõcàÉ>| ø%ðgàÞŸáû þÔ?5øWöƒøg¥üMð–Ÿâ ÚxÿÀÞ%ð¯‹-të_xâgˆ^)øEñá·‰Ž…ªø‡ÂÚ‡ˆ>|Vð7Œü¬ëžñGŒ~ø‹QðåνðóÆÞ4ðN¥ x«Wö ñÿ<+û>|3ÒþxKPñ¹mˆ<ãŸø«Å—Zu׊¼yñ3â÷Ä/ü]ø¿ñ'ÄÃBÒ¼=ám?Äþ+xçÆ~=Öt?ø_Áß|;¨øŽçAøyàŸø'MÐ<+¤{QEQEQEQEQEQEQEQEQEQEQEQEQEàÿ¿ä/ýŠú¿þ¦Ÿ ëÞ+Áþ9È&_ûõýM>Ö8àÔÿê‡תüÏȇ?ò|¿¶Gýš‡üOÿVÿüо¯¯”>ÿÉòþÙöjðM?ý[ÿðV*÷ŸßüF³û_ü ¾ðOˆöx'Æ·ö?ð–øÿ]ðWÚ>#X`ÿºð­ßö?ÃO}Á>)ûG‰ÿá5ñü?o×|ý ÿa|4ø“ÿ ¡ÿ¯“Sì׸ùwîl·—¯èŽÚ¿¿àžßò“Ïø,/ýwý’?õ!ý°+ökJŸÄs_ø–=sJÑ4í2×[‚]é^ ¿Öoõß7‡(øÖXÖÙÃàÆ¢E½¸2^럴21ù$9aañæÆ>Ÿ/ÑÈÎIýø[ñ{áéš5ÿ†^øf`&_~Ó;Ô²Ý"¢ùß´\‘#ü 4lŤ*„<²[bÌX±”m<$¼a˜ò¬\7rA`X}§ðó^HMœˆáZ-ª ÄJ LŽ ì_–]’¸”0 &Ði ðù¦_NjQçÅ/kýwhóRöi´«ÚÎnÍ;$“vz£é!>ü¶U'ù ´“MJü··+ºº÷žúµÜ¿†¿|rÖ/ìÿðŽÌ³oó­õ¯$‰˜¤€^ümºÎßzPÜ( úGðÄÚx«ÁÚ£ü>ðG…¬uh:™6™uñ*çRÕõKbÂݳ-5Ÿˆš†›-¾‹w3ü%{³ÇÄo‡úuhl4Ý=|U¦Gkaim;Í%½´ °WÉuq!žúîæêòîæâ_ÈóL޵zxçMb-J•G7<^%Úq¤ùéÚu'v”䓌åiÉÞ Ê0„_/2”“á×2Õ7d𼓋W}¡~!xÛÚ•”>"¶ø[ðûVÒ!³°ÓZ‹ÿ‰¶òøp@[é7VzWÄ»fòç¹³¹¶´µµ¿‘îg*×­x_àŸˆÿ| 7ìýð~é¼Ë  Æ»ñê2¬À…fßíóçíx±…îö²àíÜüW›Is,^TM A¨é×˾×Q°c¾[K¨"x³ ­u¸mg†)ชxá–/¾4x†ÉífÖü;u+hWöíi<«-Þ‰¨¦ ²ÔÊXÌj7ÝYÞ´QÛ_Æ0^­ý¤^ÞM•Ë.œ#^¦êÖŒhûv6œ\¹a ¸U§ËnDÔœ=ôåt¬”²ÄTUQpR“§tÝ9¨Æ QZ¤Ô´–¼·äJú\ð¿‹>-ÝøoÙ‡àCådÄÏâ/Ú\<È¥ÙOÚ%"%ˆ!v Ì<“oçÿÄ/Š~»ûJ[þÏ_,˜ÈÎÓZý ¤@­uY¯~9^çÍ I˰Wb¦ï›Ðþ ëqºÜvóqB¥F'•–ùðÁ0 °Ce¶_|WyæI0 pÒ˜UXLqgpÈÏ ) >mÅH ¬e5ÇÙªÿ»“å”ó ÊjK–0W‹ÅÆ÷÷d·‹‹µ­îžt✭iK¥:jð‚NOà“M(ÛTõ»êÎWÅÞ#Ño].-¾x;J&Œµ­ÿÄÙûÀP"_øÏS8Bç í!mä2€ŠO7¤j¥–¬mìLr4€ZKxñ´ˆÊ¬PÝOq2l1¼Íû¿”Hù|Ýnv&HŠ…Ž$c¶Öi&vY „,CFS;‚°"C¶EÆ)xgM×|A­Ùh²’÷XÔeˆCˆÞX,áÒ¼ºT¤Šž%†Ò)#¸½ŸÉ¶…£Y$–¤ÍxŽžMbs<ß2X ¿BUª×IÊJQtã¹Ô«^¬¦©QÃÅÎ¥j²…4ý£‚8háÕLv…*MÖÄÆOøi¾kÕI¸ÚþͪtçÎ’Š‡<å)AÊ+î/ÙÚâoüAðæ‰&™{®X}²Êã_±±½]Ž‘m"í_W[KßìæºU’;i…½ÕÃ/Ÿø›àO„|ῃºßÁÏÙÞkRèšµýÿ„cð=¬i¤Í¦<‘6³k¬X^Mmg5­ì𮩬Üê:]è–â]Eô¸?ƒŸ|Yпg]?‡Õ!¼ø•®Ä^ñèd¸µºš8£š6{`ö<ÍŠ8T­£´kabMI Ô3¼â¯ZÁq%ÍõÁÔ<@õv7r4—m£P6ײ,£í &·]A~í¯'hŸÊ¢þ"¯‹â/ø¶Té¬F†r¹ûI9Îs§€Á94ªÔ¼¹+æøô¦©ÒŠj’æPO†­Z_~éár NÓÆÖVn+WUÙû4’º¤íÌÚ¾©9sÉF?Õ<ÿðQ WãWǽ"ö B÷Jð6¥üY>ÐçžInî$¸øOã›hüE®¢¼ÐÿiÞ#ÅŒf"ö uKíBïó›Åå½±t[“#˜À'ÍFB†/;d‹—fòäQ†òâ;¦vd?žø·s¤ø’ÏP’»Eaâh 4’ Ô<)®éî8eGÄ‚‘º¸óÍSâUÌвIËE`Š‹½¥Àýã3î!Hè¤. ò® ˲®L6 ©a¨a°Ô©EÉÊÒ§S*“©>UV¥J®¢•IÎ|ó““œ¥+ÛæªâçY9Tª¤ç9JNòi¶©®HÆ2wäÝA¦ ›²ÔúâWÅɯìÞÊêñî’Ä4VO,¥åµ™ †V€³:ÇnŸ¹‰‹G”&øgÅzû_Ë.]»—%·l b0 yaB„XòÌ­F»â™ïYÀ|®·³È)¾b¬dDÚŒT ¬D`6æñoU7.Öê G¹ÞÉ€q•ùUUs÷Y]•”Ëó÷ùn[h’„åRj)FmsrÆ6MÎM»FîNMÚWló±8ˆÑ„§%+©$–‘”ª4乚ME«>Uosâ~òŒÕß° ã^ÿÁAÿaÉNBŸÛöfTBAÙøÕࢫrXñÕ‰Éë_ê_åUÿñÿ“ÿý†¿ìðÿfoý]^ ¯õU¯ä_¥<”³þ²åŠÉñ‘Œo~XÇ—êßVÛÝŸIÁRsÃæ“¼¥‰¦ßE­7²è–É-ÑhQE,lQEQEQEQEjiZ³è±Üǧi~…¯®¾Ý¨\Ëàï ^_ê7¿f¶²[ÍKQ½Ñn/õ¨ì,¬tøn/ng–:ÆÆÂ'K;+X"Ôÿ„¿VÿŸO ÿáà¿þPW/EW<ÿšZh½ç²ÙoÐ,»#¨ÿ„¿VÿŸO ÿáà¿þPQÿ ~­ÿ>žÿÂÁü ®^Š9çüÒÿÀŸù…—eýÃ/¸ê?á/Õ¿çÓÂÿøCø/ÿ”Â_«ϧ…ÿð‡ð_ÿ(+—¢Žyÿ4¿ð'þaeÙ_ðËî:øKõoùôð¿þþ ÿåð—êßóéáü!üÿÊ å裞Í/ü ÿ˜Yv_×ü2ûŽ£þý[þ}žÿÂÁü ®^Š9çüÒÿÀŸù…—eýÃ/¸ê?á/Õ¿çÓÂÿøCø/ÿ”Â_«ϧ…ÿð‡ð_ÿ(+—¢Žyÿ4¿ð'þaeÙ_ðËî:øKõoùôð¿þþ ÿåð—êßóéáü!üÿÊ å裞Í/ü ÿ˜Yv_×ü2ûŽ£þý[þ}žÿÂÁü ®^Š9çüÒÿÀŸù…—eýÃ/¸ê?á/Õ¿çÓÂÿøCø/ÿ”Â_«ϧ…ÿð‡ð_ÿ(+—¢Žyÿ4¿ð'þaeÙ_ðËî:øKõoùôð¿þþ ÿåð—êßóéáü!üÿÊ å裞Í/ü ÿ˜Yv_×ü2ûŽ£þý[þ}žÿÂÁü ®^Š9çüÒÿÀŸù…—eýÃ/¸ê?á/Õ¿çÓÂÿøCø/ÿ”Â_«ϧ…ÿð‡ð_ÿ(+—¢Žyÿ4¿ð'þaeÙ_ðËî:øKõoùôð¿þþ ÿåð—êßóéáü!üÿÊ å裞Í/ü ÿ˜Yv_×ü2ûŽ£þý[þ}žÿÂÁü ®^Š9çüÒÿÀŸù…—eýÃ/¸ê?á/Õ¿çÓÂÿøCø/ÿ”ÏŠµ{«;Ë]ÞÚþ(à¼w†|5¥O<][ß$/w¦i6—b!wim;F³ª;›Ã(Ås”QÏ?æ–º?yì÷[õ .Ëúÿ†_qùCûHø·öðø%ûV|Qñÿì±ûMûMø?ã'ìùû&ø?Pñ‘øÇðWÀV^ñ/À/ˆÿ·µ¯xf üEøð÷ÄZ­Ö³¥þѾ ÕmÔ?h«ÏgËð¯â'ħišqøáw´ÿ„Žm6êàjOmfu/ìÛÛ±ûAEµã(*tà¥dÜT“Ñ©-äÖë°rêÛ·{v·câø)ü˜Ïí%ÿdýÿôõ¤QGüþLgö’ÿ²~ÿúzÒ(®ìð¥ÿ_þ“9î½?V!?ðv×ü¤ƒàý˜_À_ýN¾4×òÿc?Ùæó€-óM$(R0exÿvAg”¢¤AËDXíx¤Ü¥?¨ø;kþRAðGþÌ/à/þ§_kùv‰ÄrG!‚:9UvˆV @uùœ`:üÊyŠÿO¼Š—…¼®žMdÚ¿ïëét×çë¡ðÙ¬ñX¸5u'k&ÕýÈÙ]5×ÎÝô=¯i÷MksÀà#ãœ4mòÈþHàØ bØ]}®Ùe,†L•F²*+ðÁ“æ%Q“q”¶í¬F*à89ô¯«éT”jGOzH÷Œ´kò’ïdÏjt*Ù«NœõNûÅü›OåtüÏlѵЫæ)¶”‘¤¤›¸#a,IÜ0 'æESôg‚üTmž&‘ÕLd¬‰ÔÅ—WU™ÃVzùĆ)ñn«‹`¶ó“ä–Ìrþ¡‰%ÉFb9[7§¥krZ˜ÁŒaRe áp1†Y¥GUÀ)¸„Uòqø+^÷©ÊîœþÌàûÚöºø´¼]ôq“¿Ða±­(êì£86®ÒZFú{ñWPv\ñÒ6’³ý1ðoÄ™-£½Ì 1ÇŒžDQ Š$bPî$i#X¦Ý$ïæ9œý½û9|\¶?> +ß:ãâ¿ÃtXÛvåaã #qØÆ5É ™Zä1'Ì;ƒ†üMðçŒgVf©c'÷…C£6váîʪ"ˆä.§,Æ#µ€ú'àßÄk7âÃ+óº#iñÁw‚hŸ ¥¿ˆôÙÖS"I »IR!e |Ä‘\3Èc[-ÄÉ»NµO-à­WÜ•8)Í-¥f£6ÓårZ5³«j±Õû²†’æMj¤ÓW½×ªéfÕšû#Yø¹Â·˜ìÜ‘#H ‘76NYÙw F\!ùîÙD›¾sñÅ ˜ZiÉ’ ˜þÍwlYÞöÙHuŽâ ¿gxÓå•R5ƸYRäFõó¶©ãÙ|’d gb™KºÌIb|´]ó–﬉nòýkÆSM¼ù¦5l6FbÌíÊG’ìîÜ-³P%F3):´ ­$©¹JNJ.SÖžöjoH6Òv²I”§¥ÛÕµîEsJ\¶kÏ}m¤ZK^eîô¾4ñ2O,¦ÚC‰ p³1f·R 9Ü@ˆÅ‘ZM¦C½åW!€ùóS½Jòœˆã\(%sÐu³18’Š Wu=^K²ÿ1T$´ŽÌ2Ø<<*ª¨EùÂâng¸Ô.`Ótø^æîæM––Ñóg+侑³Í'î­âY.n1 2ù{¹á2ì%|f7GÁÑ•|f/5N 4•ç:•%k(Æö¿½9=#w\a*ÓPŒ\›q…¡iY7îÒƒNÒ©Q¥³´mk¨©(äÍi©kš¥Ž—¥Ú›ýORíìíc,K9hÖiæd<£ùnѰG×3Ú[ÜzÏ‹|W£~Ì^ºÐ4‹„Õ¾1ø–5[Ó«èðºMoä´¶¶–É5ÄZ$çlqiÜ_Oâ `ië^ Ð?f_ >«8RøÅâhZÚn!t+f…Ìs*³¬ö‘Åç»Â(®"iäºxâÕJñ/…_5kÍñÆ’K}¬j×TÓ’ä™DFq›]Fá¶¢¤~LZ5š¸ŽÆÙ"’8×ɶ[å&âLûÇ'ÃpæAØÊë{gVqœa“„óœÊ ¥S8JPË0-©ÁÔtâáR®*¬>ª† ‘Ò©Žª¹ñø˜Â6¼£îEC Bß SIÔ–­(©9IF1T~ü7Ö§¿›Æ.k›êEî"†ñ ·Ví;#Ësr®<Õ¾xwâŒ"YÁº++´vŸ`ü9ð]æ«â}+MŠØíše¶–~MŸ‡u{ñ3´gÉû3>XüÞR U Çé>øk4¥3nêX£9trÆå_•vŠÂ»¾eêÍöìéð]¯¾+xBÜÙÎ ÚgZ2–6#á¿‹æ2î+›|à"i7aбUÜß¿evMÁY ²¼–‚¥…ÂáëW«^£N¾3¨Þ¶/Y[ÚW©È¹¹U©Â4éÒŒ(Ó§N??Z­|muR´Û©)Å(SO’šºåŒ›NÑ\ÏѹKY6åùztÍJÏdâ" Bì ’VX™r§äÜÅ]¶yM&YHç€xÝbÚq™TÉ„âHØãÊ`UU$0Þq¹UI §' ûûQøP!³Œ˜$ÄDªŒ†TŽfhc)HªÄluiï¨MÃçÏx[/0…‘—‚7²¤@ *7a+92­}M|*I)Y]ÙIi{7e£q•›³Ši¥»r²9)A¾N{ò´á$ã)E¤¤àú5ÑìùnïÄù\f[V\SÉ,H%³´( Ûú1 •Ù–@çia\u?ççòôâ½£\Ѽƒ$3FÞS³Fá‰óöŒ’ÁB©mͰ©!“¦A9ñÛ˜Z¤”«FìŒ Î ’Í…ÜÆ( 0@ôxi*˜YB+Þ§5RI4ï +s+6ݯÑ&ž‡˜ÆÎŒ•¹c Õ¹Ji¶úÙ¸µegºÛêø'õÔñÁBÿ`ë}Èc—öÉý˜°±œ©øåࡵã1ÁUåS2,¬ ¢õo¯òœÿ‚~À%ÿ‚€þÂ|òaý³?f ÖLŸÞùæF*J w¡-‘œ« a_êÇ_Æ?J‰Eç|!˚ɱêv[Ëëѳ~m[Ó¦–>÷ƒ% eõùcÉWJ§*·4¹¤üÜm§NšX(¢ŠþU>À(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šø‡þ Gÿ&3ûIÙ?ý=iQÿ#ÿ“ý¤¿ìŸ¿þž´Š+ÔÀÿ _õñÿé02žëÓõgòÿmÊH>ÿÙ…üÿÔëãM.uýFÁÛ_ò’‚?öaõ:øÓ_˨ ÿɯà¿ûÃÿO×>'1ÿ}Äé1/ØÞ›9dæm ³cr6RQ¶BE&&A¹YFò÷GY$C”uWS‚2¬)ÁŒ‚wלօ¦¥qh~Sæ#4eÑˬhc¤’)´n Hò¢¢”o¾Åá=·¿NÊ¢Z§¢žÖòM+ë×Dô³_=ÀRF"Fó 2Îëº$—<E$‰îR]h?³w„ÅÞ'š S⇉ ÞfK(v ¡»Ù.ׂÒ–;‘ws–òA«qoåŸiŒiÐxgà…£øãˆíï|W}O øi£·žyæ‘C0:ʉ§#Ưw>^ùmÖ8„–6åïþEjß¼e©xçÇzªÁýÑ“÷ÑßMªŒÅ,­#·Id‹O‹}¦HÊ<÷2Îé¾ê[©cþ2ã®5μ^â ?ðU)Ã"†#÷•"ªÓ§˜}^qsÌñî1•HexFÕL5T­SÙ×âêapÔ>û,ÀÑÉ0o1Ífž2Q|±›°þÒ?¤›P–"¤W,¤’Nj”çÑø;ÃúÇÄÏMñÇó> o®MÕµ½ÁfKÖм.X®™ÆH!w/w&g¸3FÒ5ßèÇÃ_ }¦X ±,ŒÌ$ub§,ä*ÇŸ<¹¶ÆYF0»ˆÃò‡þð§=¸Ôþ+è^ µvÏàˆ·ÑÃe`1C¥ønðH1"¬‘’@U×oég†dXY¿ißÃÑå‡þ/Ç€a"&Œ³ËÃÙ"Û–ÈòÃçʳ¬gö¬ƒ†r®Èéd¸X©Õr…LË0Y~.XŒv*J*uæèáçÉN)ÎjÓT(¨Á¹ÍέO*¾.®cYW“‚÷y!i \Ói¸óIkÊ¡Ï6✯{iß~ü4ÒõÈ Òu¡ ¹håÑu¿+#K¼~b¢D K¢^–hØÁæÏ¥Ü,WQîo>5ý/ýž¾Ýh?¼9k¨X$6–ž770ùi!‘gøgâÈãžXü¹¡»I¢žÝâó-®"h™$1I%r¾|"_²Kí áðùxã‹á¯Æ{l€ y³}§Á(‘» #\œïæ2G"6ïØOÙÓÀ^Õu- Ÿ‰º6µÿÆâ)4Í^ßÂ>;Ó®´{kßk¶æÞîïXðí…Œš3Çxfµ²’ÿ{É &›‹†{züï‰8‚¤2í0¦°õT ðx´¡zmG“š‚i'îJméR)Éòϳ AK‘¸Å˙ٺ±ŠŠMY)J|®I¤ù•Úm©EòɄڷìë&¥cq(ŠÒÓKÓì`¹ÖuK”ßg¥YE°#0'›<Òš}„!¯5Aㆳçó£ã/€l,î/cÓì;›´PyàÙ’6`—7ÂI‹‰b…¤ nË­mbRòãú~øÑà‡6Véá›oŠÞðö¥*\GdÞø—,úµìÖ¸ÿ„ƒWšÓÃ2Ù]_ßÛm6).,¬4ù rËÄ÷w¿ßþüÛu$ÿ´ƒí2üÏ…$Ëæ!}€î.ÆXÌŠe;€ó%‰emþ·gó©Z [t긮X౓J2q´ÜiÑš•HüjI˕Ǖ_™'ž'ˤ9c­§ ´šjN§-ãetšn-»{²góÃñ Ãÿfšqä®Sz -å2·šT0r ÐK†;?.xŽÔ$©p6ƒ 1IŒåž0v¾6ÿs œçå\(äŸÕ‹Ÿ ~G5ÇÙÿi\„ØÁð«ã„"M¬¦0¦ãÀqï´4“È,Ud ]?>~Êÿ~<ê¶vÿ ¼­\ÙÝKoÜÚÜYèâ9eCÅq$YÔgÌhìã¹B±±”¢«0þ›bïø!Î…ekkâÚÛþ½RæÝd:yöút.C:å"•%L„lGö‹„˜žkˆÜAômðßöWømðšÊÔé~²²x!xIKX  ˆC”Ƴ2"¬gxòAbYv28;>0ø/áv‰y}ysig É#7— (òÚfU ¬Í#”Kº0X…É2ëü)â?ÒG¼FsËð<œ9‘ɤò쮬ÕZúÆPŽe›Ê0Äb”$®¨áéàðµæ• ÔŒZý-ଳ+©N.œq˜ÈÁÊ5±ãRƒÒR…'~MÇRNTýåuIAÿ›ý’ŸE<ÿ ü#v’šd/qÄžg™çùd«¼™}¡G Ÿ0’<‹ÅßðBÙCâË‘áèô ¶O1§Òå–ÖTDhѤãšÝ2X„)‚¥XEÙ¹¿4?o_ø+7í)¥ëz}¿ÀOêðøyZåÛ]¸Óe‚FÒÕgh±†÷vïól¼Vã5ÉE*ñüOð»þý¯<ñÇ®é‰Öݰ#šIb—sVáB¼ ñ—󤫇Ü~VbIÀxÏÄ;ã sÅa•ZÒ­ý•Å™n_š`ëSr橈¼çŒ£9û>hRÄBzÔy1áR”©Ê¦y¦uÔ«ËާhRI{lºU0ó„”\b¿qyÓ×IS¼a%(IÅÝ.ûöµÿ‚ ümøUªøŽÿàóÍâ½'KÝW¸H5‚8¤—þ%×sl´’4#ˆG=Òà“=ÄòÿšG‡¼;ðKI½øñ:ŸRÓnn´Í Ã’“]ëP ˜gÓí “lÒ³H†ßV¿X×˱3iö—VVÓë7ýü^ÿƒ‚þ2øÃö~ÖO‰< áoÜêšMÖžú×n|K ½·t6Z(™Ú;}FV‘¦…ÛìÌÐ*,rfþD~#|Añ'ƯÝøY–Xl#f‹LÓ„…­4}<°"ÚÕ0#77,¾}ÜÅKÍ3eØÃ §ÔåÜ[â¿aãÀœçŸV̱°Ã*<ÔqüC¢Û«O›(ʦ'åˆÄV¯‹­IÒ¥í*×úº©|Æ+,áì%xfxL0ÕiÁ¶àåæIFTèK݄Ҽ#Â?,V‰¹Ar$[–É$Œnʨ(ÆäsË~“ð7Š…”ДuAç …ÕYRL«ÉÛœüå”ÛÃìÄnWÒfØWÍ?f¶—´¦þÌ ÜgukÅ%k.ïd™XZÞÒœ&ݹ՛]*)ÞúôsæOGd£®©¿è ö}ñl7—©%õ¾cgKª_\so¦Ùü¢s"ùb[©Ãˆ…­ªq{vaŽVD£õÃà—Æ}&ûÅþðΈM‡…íañmÕ­”²FÚ†¥¨E༺¦»* Cê I†(ŠÛhÖŒö–«*Muuwü¹ü?ø³-”ÐCxÑÀ&IšÝ[c¼‘°Ew$³°EYÚ ~Lªd ÷×ìãñõíþ'xY^rŒtÿtœ7‘øwâ´ˆí¸”m'™y9‹² Æóþ©RÊ´Õá䣧49iËÞ”dá.t“Jqjþìã)IË×Ã×Qå§4ù[K–SQµä¬Òm'­ã&í¿+k—ô{Äÿô-kCMÄ:…¥°Ž%>×÷yË¢¼ÐªIe©r²Í᛹Ÿ†ûF•1ÛK4^}¹üøûâ›Këý6ú!Ê8’xì±J7+ÛÜ[Éch®Á„ÚÞCæÚÝ@Í(Û±U5­u߉Þ?³‰|àßxŠ ˆëOÒ¯d±Ü!سýºk·•K4Ò\]ÃaŒ†áC "çõ¯Ùöñ¦›ëÉáß [Bö+ë‘]ê6öjZg€[øv-nan¡§0Ø\5¼V³L#c†iXòeõòL—êból jÓ•å„£V8¬T&“©Îð˜5[¤”æªR2IÃÞæöšÎž#ªt&¢ìá'hÁ¶¤çʡ̔ïy·{µÊÕ¿,¾'ê©<³…˜*–ò†Ñ"+$l7,0Ô9%F.bãïÝîB„®ùç2¶20€¹Gq»9;@ç%¯Ý-wþ âO|8Õµß üP³Ô>!Å{ª¦‘áýCD:?†õ‹}:-*Itñ®6¥uu¦_Þ5ôñXß][ͦ‹h¬u´«IçÖ-? þ(ø7ÆŸAÞf…ÃY=,Ï>ÆVÄÒl>Ã÷sŠ”%Z²Q§)FIÂq¥ÎNVrpwV×Óþ|Òu]_OÓü5 iþðV‡ˆ-aÓí ·³‘ r$‘¢†%CºG-….­!`$mŽéƒ4»=Hô+-–×O¶§E“Î d‹ËEœ½$XÌ{Q~âlç¼ áë ør·cv¶£áÙ^âñ†ÈÆåF@#$±W–@¥²‘}ÃVkmi-ÔΦyYÚáŽTFçÊîòºy|§î `AwUþ­‰«^´åRr’rrjRærWÑÊWmó4äß73÷]ïÌÙéÐ¥NT£¥všŠVmꢒQQKÝŠK—•·­Îâ÷‰‘¢\¤,‘Á9•Ë…Ä&(ä”…Ã’¡LhùB•Ù„gþ5ÿnoÛzïĵo‡²ê†óEð½ôIyád¼™Võ‰šfžöÊyo­¢Ú“lXÛÍ)2Ï Îú¾ý¥õȆ‘«Û«“7Ø/„F$ 3[ÉN͸8·ˆî$ÄÇ+ÞÛ+üý?lo6¾ñÿÄo‹V­s¨O'‰on5 ‘¦kx¬6ÙçM2o±}©­•^P'{¤–E­Ÿî ð‡ q‡ÒÈxŸ‰ Ã1À×§”æS¬U ™íZøh`0¸¨ÎT)S¡^”«¨Ôž&‚XŠt)¼*V§|OæÌÛápÿZŒ+Þ¼#&šÃSŒ“”lÛ|²Q“´&ÔgR\®)µúÑ¢üYø[ñ3A}+Ä1Xi÷pA‘q2¤[ù,Ë OybH¢O’6i‘™w,/yl>(ð×ì'âÏŽÿµ[àÇ€u/ÙZ™&gÑìcŠ /üÇ–æä]ÜÐÃâ±øéd”¨á8B )eôñï¬ÊOZŒ±Q£F¤ß±¥BOã8’“§Žx:¥:¡'S–”}³rrW“´pƒ‚n)ÆrŠ|îI~©*Á†2¤¹U— äeXaê¬ ‘Áq]þ€·šÛÙéú}•æ¡©NRÞK(žþîê`²`Goj&º.ë >$…K„2d1þŸþÿÁ2¿d_ù73ü;½ñSPñö½ªkQ|ŒŒšŒšO†n¥@au¢N2ˆ<›þÎðŸÃßøÐØxÁ~ðe”"6~ðæáÛv‚"ŒŠðéVvk"oU‰–•|×-.^¿bͼ_ÁÕJž[âê5)(×Ìñ˜l UœáOý¨êAû­B´ðÕùm ]¯–ÅeÅA*•qi©Ò§9I'ºJ£¥~nöŸ.öÔþY<û~Ôþ=’Úmàç‹ôëi6SñU´> ³HÜn[•“ÅséÜ[íùƒÙÃreV$‘¤Eo¾~Á.~0\­µÇ>!xÂ>fÕ¸µÑ-õo_¢a\‰"–éªíòömVåæ&E=ÿ¹³6J2œ|¤Ý’¤1ÎG8?/°Æª²JìpNOV#’p2 ±  üó0ñ/Šqñ(VÂeüÆ+‚§*ÑWøe[0ža´î¯4¢’N1OR°ùv ' q«ˆ½ªÔnm&ÜaJ4œS“MÊëâ½£ËñoÃÿø'ßÁß G ¾%×|k㋵D&;VÛAÒЩ–º5œz¢«„†×žL¬ÁŽêû·á€¾ü4×t«ÿ ü;ðæ=ŒZŠCy&¯ªÁæè×öH¶úÖ®oµpò,Â2~ÙF‘ß Xó¯{墑¼0cû¶f“‚K‚Aõ px`9mw⯂|‰|[ã? øZøÞ?õs¯òlÿ‚sßðPÏØAŽ2ß¶oìÀNÕU\Ÿþ'  *EPŠÿY:ýéaJ4sþ„èKŽmë«úônõ¿Ý±ÍÃ!‡ÂV§µX¹=un½[vì¶òÕ…Q_ÉÇÓQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ÿÁHÿäÆi/û'ïÿ§­"Š?à¤òc?´—ý“÷ÿÓÖ‘Ez˜áKþ¾?ý&SÝz~¬þpྟâWüö8ðÿ”f‚Ûö)ø ®ÜƶcѼiñ²îÇíÂÐ1Æv’ç+_²?ô9´Í?Cµ‘c·†ìbºâ-ã…]@WÈvʪ¤‚N$PX¯ËðR‡ð”ÿÁmþx¢xÔZxWþ Íð ZwVl ¯ˆß.nN[cØØ‰TŒ2N±ÿhxYw¥È†6¸FE•dQòÊ*0JDA‚³$Àeâ¾zó'ÁùtjsRáÞ ÊrþU%ËN¾.¶+4«Q+¤åË™Q§SU+ÑP·ØðnÓ£ŒÄ5wŠÆÏ’é¾hS§NªÑnÜô›ÕËâ–Šñ¿ÛžxÑõ"…!Š3@ù`‚™W ¹ù\…D  ‰J ’BàêúÓhúdÓt€2–Lo ìdÞcòÝ’EV â ”¸’¶-¼ëm&+xííü¡ Gsñ—€<;ñ.ëì¾.Ñ-µkX®Út·’'14,rÆŠc;ÞGù6«HX#ºTùgí²Šë ÊçiÁ«h§YBI'rÊ 6ÑZëáræùÍ*Ón-SQæ•7ï/rêé|M©©'³•úÝé«ÿ‰ø3¯wñgQÒ†Ž'K_G{—%ÄpK Ky‚U€ÍÌ$²«D¢Šþ,Ò<1ðûVÕ5l–ðio2£¾ØÒ5ˆ0uR±¿–X—äMÞf! ß³Þ›ƒôý7EÑíãÓ4ëHmâ³°·GoDñ E…vÇ´—Ƭ0Ú©ÆŸðZ_Û:çà'ÀÝ'Âz ¼ºÿÄ d±‚ç1"[@ÇÎY™.˜¹ŒM#âBÆy–"1ûX<¯1âŒë.ÉòÊR­Íqt0¸ZtàªT­:^Êrq…8Òœ!:µ%(Ó§OŸšj<ÍsûZ9~xвP¥Bœ¥SF¤­g ^îIò¨«»«¤Òø_„wW:õÏÄÊ·ú~$kz®‹ þŠúUž›¢.£m*ɾ¼Óo3#°[›k{I£Ž4`Ò{OÚtë|ÉywkkZ[‰’$Ž0B™\»"÷'$ó€ ×ò­ÁA?j?ÙÛèð|O èv[ÙÙé¾ _ø@XéÖêÅeksc5ó¬VÑ$*òÜI"mÃÇ"Æë½ð{âýï‹|Qiyñ]ñ‹geZ÷]ñêÜÎì¦Ü’mvíK²Íò©S'îÎàC±¯îl³Ã¼×‡rlË!K†¥BpŽ*¦#xÑ‚¨êP¡CêíÔšµ:Qƾe.W8ó.oÆñ8øWÇתá)ÕÄT[rÁFrEÎU%%%›“¢ÓmK[×)ñ7ÃëM;S½ŸÄvqÚi¿nFÓî£ÔÉU½°€î]4\1?‰nn§yîuK{¹¥%Ýî.ôy¤i™äÈÞ0óYäfÝ!gl• 0K玣“Ÿí1øk È|S¥‹Påö‹>ÐIUÖZRFq|L¹f>€FÌOxõð… xºtò̧,Ë=´ãýŸÃaå%î]¸Ò£¬¥ [’év›¿u*÷uå*··»9Jq½ã´jJvwŠÖ6ée¦¿¡ßðM~Ôþ¼•-¦±ðއâNÑyC ô› [P‹íf9rŒèÂØÆÌCʉýÇkž:ðŽ„ùzŸ‰4xä$9"Ôj1Is2Œ…Ì6ñ®ÐÛI—ó/âWü3ÃòÍ⟋Þ4‘‹ý‹AÑ|9 ’‰5}BMVïkÉ-Às(Ñí~ÐLá!墨? -bÔ¾.éÒË’ÛIÒõÍPá Û;éÓé–Ï!ÃXoî­(ýê¨Þ_Ë|UÅÆž{ŸO™J9v‚§/z*N†[F¼£g{[‹ÅA´’SrnOV{™f4aB 1ŠŸ4¤£.gQÆRµ–²‡²iö†ÍY¯µJ»ZÛÝÉŽKÇžf\a·1äÜÕÎyr<¨Ø¶æl†P¿ÌüƯªü}øWà4e{_|-muÈl˜õOx—T‚îL|¥tï h³†ÉÜ·`mËR:¢$+enD‘[þñ•@VɃ€ÇçIXä\·Vjþ+à¥Þ6O~Ûo­îÅÕ–ƒ®é> ´TI£ø/ÃZ7‡5kHÎÒž ÓõygŒ’c»šá3€ù£^YõßgŽ”SŽM‘f¸Í«¥_<6[¦®”çGˆjïX§SÑΪrácìêUŠjö¼b¥'§T¤¡~Í£žÿ‚rÊBÿ`ÿû<ÏÙÿWëýe+üšÿàœŸò¿Ø?þÏ3ö_ÿÕßàzÿYJô¾–¿òQpý‰qßúÈ?ˆÿ¯±ÿÒQEü’{áEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPÄ?ðR?ù1ŸÚKþÉûÿéëH¢ø)ü˜Ïí%ÿdýÿôõ¤Q^¦øRÿ¯ÿI”÷^Ÿ«<_öÓø{÷íÉcã¹-ÑÞãöHøá{…gYQ4ý_âF¯{¸l Õì˜m?|Å“ k[ÁZöž¡oBl­´…˜Æ’2¡a uÀy>gc圅$€[ßk6¡ñ«Ãº”qÈó?†Ztl€•cÑî'”±,±ýËœ‚s´_¤WÐ,¬ô­&Ò(b™ä¤`É4û¦ç§ËWPÎáQ7$ùÛò>'ÆMf¸ÝÍªŠŒRwåµ&’–»F+ek«^Ö?UáÚ<™f zGššwW|Ó½¦·æ“vi§m®ú»ib·dÌdh¸0U…œDb†&]±ÆåQpJ¶X8S²¾"ý£ä&W!J•LáeE\3"e% Y‡–OÞüfxµ;Öh‘™$`±®ÈuwY!óJüÀ¯î¤uR¥VGUÆÂUŒýç’V‹“Zò½yZNÿ ¹S»IÞÇ§Š‹)NêÑI=/~v“ôåv»Mk¢ÚçÅ~#ó$t¹2ÌñÉ!P¬á¢  á‚‚¸p7 ek"ðP[ðö“ évKuMpò­íÖFv;@c"æAÀ##”ÈÄ|¹UQs¼UwpÑEin¨×²lnT†6õJ@V.¾V°dZÃZi¹’ÖK¹7²”B!åçUINÑ+eÔ” £ìØ¡dú:MªqnVŠ“÷bß½Ëw¦·i;òßF´I­OŸ¬¢ëM(Ý¥¤¾Êo—™)=ZmZÝcËvô¿Ó^Ô„p4î$KvT\/’ˆÀȬ¹ug$œ',H•²ñŸå×þ ¡ñ[LñůxjÖý?â™ÓîœÄo ‰UaibŠvkZ3£—»–51ÜÈÈö¥EB÷3ö­ý£4¯€µu$YüHÚf¨tË8|¥ž°·’öêïËgO“j©2 óK ¯"ÿ¿>&øÃãÄ=kÆ~.Õd—Y×&’h mB(~Çb[ˆtø?è ¬2µÒ‰^&¸yn&¹U•¤Oé_£Ïãó^#©Åõ¥yG µWV§»oˆµ Ò™¾$H—9}ÎT.Ç…„fØÏ',.•GRÔg-[KW~M/Ìú¤öZ¹Z×môT–"Q劦ŸÂ¥Ï'ÊžœÊ<ŠÍo¼šþñÅYÃy|ÐÌ—î"}áoN¹4¨ª…Õ€h>2M)ùÃF!É Uw0ëô¿ jFõ©(K]/Q¿ñ6Õ­R!en÷/'ÏñU–]ªŽL cy2Y\Ã}à‡ZÓ12Ë<«–Aª³¼Q®ô™ãòþ!Fè¾b”Ú’†—~Ç÷ÃÙÞêõ«pú´Š†ÌhLòª€Ad* 8VøÇöQð§ü!?²ÿÂý8¢C5߆¿·.°J™n|Gq>¸“’å]ÛËÔâH¤ ´*Ç±Š²nûßöw±Ž ßjeÛ:§Šµ+„ÁWSk¦ZiöÖò=»¸´ºž ÈWýPÅ~â&dñQÏ1œÉ,Ç4ÄJ“O–Ô1Xùâ)ÆÍ^VÃ7 +{ÊòÕ\ú,¾ :*ZÊ4ióï¥HÁª–ÕÚóíw{&ÛÒÿFk·°Å-ÕÌò$VÖ0;M3 VèòÎòdgþð’£Tž§øø—ã ¾!üFñÿî"hgñϼUã á|oŠok·úÔ‘6Aº7½elHã áØ|Çûjý¯ürÿeÿÚ Æ©:ÛÞéŸ ¼lšmÓ’‹½­è÷Z)ÚWæö«§ãD²²BÞ+ø_¯ÔþŠùg-0Îej•²¬¯RïEB¼V.;(¾oo‚•ítâôŠnøç•5ÃÓì§RJë¯,c¥ôµ§®©Ý¤ôgÙŸðNOùH_ìÿg™û/ÿêïð=¬¥“_ü“þRûÿÙæ~Ëÿú»ü_ë)_ôµÿ’‹„ìKŽÿÔèYð1õö?úB (¢¿’O|(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šø‡þ Gÿ&3ûIÙ?ý=iQÿ#ÿ“ý¤¿ìŸ¿þž´Š+ÔÀÿ _õñÿé02žëÓõgÐ_´±¸øƒ¢,hžsü;ør!†l|nظ.Tg$|ª[ù}ãZéšsM Q Šù¨ÒÁe$¢Èü®ïÞJX‚ ýÒ†°|s¸‚ˆzJÈÁYþü?PÅÑUðÝ“ lÄUp”®ÖÎSæ/ëd/öT&C´ä`ä2É•hÆ« Á“r¥â*™æ6›MB5å6õ³Z)jºíºsI½ײóeYz[Ê„òÝöè®ûh5ñg‹åxĆVT‹Ò•8Ü–RÅ’5Îv²Ÿ›Ë>$ù_ŲOs-ü’»<…N7¢îXãÚpGرà3£©R"@Á#ÓâI yŽ_Ì„±@ °dX‘æ ĬeyBn;ÆÌ)óv|ÅâÛ«Ýœ¼³<…ÙUTœ¯Ìß10é´5ñG‹®<}¬^]Û:J–XMÁeyåFâ ¬]”4sC+ò’K¶ÜμßaÃy3>Í0yf2çÅÕ5&Ó¥JÒ­]Å|0¥Ož¥MvNÉó+üÖe˜að8zµåfã´šnrÒЂå÷e98®k¾]ZºZþzÁA|s¨ê_ `›Ê1j[Ñ)\.Ïˆì „ÞdØD»•ħ>jŸ¬¼ðNWøñvæC,²YøoÁ›ÓûU§V{‰ž†I”Çñ¿–®ÀNï$YŒ­óý7û=xÆîÚÚÛ[–[&ù¢i]oÙoôÛ¹¼…]KMSñ+Ék0_´iÓÈ"Ô¢ ­%³Aúgá-¥øâm³H·°j>ð{iw¶——SÁ¨Ûˆ¾ò¥…á-’A²hÅ´Ö›­õ+;µ[{›spžÆçHÅËÞö´’m¿}{ZzA)G•$žêM];Æ..ZŠѷ«Ž©ò«6¢­ïÊ)µÍÍ£wW²ÑŸÍω>]XA"4ÌáÀx êM!b¡w/ÄWÎdª”`ê•„(A–ð»ÄWº„I¦hþ Ôµ‡ÛîÕÓpŽHã1|Bpòf(*§#zº¿¸?~Ùø6ÒîÒgI|G:ÂØøâ1{}m§Û4Ú¹‰e»¹û5 söýF߇¨*ÊU†Ç·îgí%ñ²×Än¡©èþ)Ô¬n! ­¥Ûx¿PˆÙ¬²aõM/gÄ+6]%š%3ÛeÒæp¼ÚbÆãò'ÁúÞ³ãßÚ3á¦|Iâ=FÑüc§ê’G'ˆµûÈšËA’_\«$ž#ÔdöV•4>[ì¨û—êø;ÁásÊQPú†YŒÅMÔærŒðô*T¦´ä‚”¦¹anY.^HÊ)(òã"ªºTe¤g:JÑQ“²m8Ýi§½Ê”[W´b£/Õ½kBø[FðÔÓZ[èz5¦™f&à ›d°AåÅ*–m¼eCÉ(òð>c—o«þi«¦ü?ð²*ʆ]^L¬À¸ÔõGS\Íey§¬rH¹6ñÂ]Ÿä¿ˆW³\JÖâ[™eÄ‘!’ižV™$awÈ|ÃH˜oF óù¾ñÒ4õÒ´Û-1v¦XéÚITÉDmO´ÑÙ›—uƒ2±ƒŒ°Ûñ~5©ì°˜ $nÓ­9­Ó IA6ß_Þö÷—6Û¾_šw¿2rnëWRW¾‰^í_k&íØüÈÿ‚ÃxÕ|)ûkÚ)r²üIñÿ|RUÙlu ü}tÜ2æ%‹Ák ß{›¨‘¬…—ù¯è£þ ¯ãi"Ñ¿go†ÐL¡/uøóU¶ ·Ø ðÿ‡|;pØ}èªo|WŒ‡%Ê0Úá¿zþÀú9å¿QðÓ ‰µžq›f¹î›~δ2¤ôøäYewö¾Õ7›–6q¿ðáN KY8ª–OíkR÷èÛÙ>Ìÿ‚rÊBÿ`ÿû<ÏÙÿWëýe+üšÿàœŸò¿Ø?þÏ3ö_ÿÕßàzÿYJü3ékÿ%ÿØ—ÿ©Ñ=lƒøúûý!Q_É'¾QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE|Cÿ#ÿ“ý¤¿ìŸ¿þž´Š(ÿ‚‘ÿÉŒþÒ_öOßÿOZEê`…/úøÿô˜Ouéú³Ñÿk-n×Iø‡¡ î$ˆÉðÏáÔ›"-¹Âh6á(eÞQòÃnâ˜,vðOÄ>&ñõ°’i·fB˼Üä©5R…V%fÀr…hX‰pµëðPí~÷Jø¹á˜-Þ(â?>O#JÛgÒîb#pV<"¬©#SÆO凌~+èº ž¡{®k–¶Ö¶ñÈîd¹H# @´’îo.Ýv&Gб¶âèùÏæYžYR¶i‹©+òÏ)F=ùRmèÚwÚ R×KÉ(Ÿ¤å™¤pù^”ïBMèœnÛI]ÝÙ«ëÔ[øy¯î^(ñ÷ÛüØv" ‹«¨ÀX#‚2’|¢0RI͆ g‘|·ñâG…4{ygÔµ8Ö•Wš1ä´q²ÊÂ!2–”2²ªŒ£Ïϱ‚~Y~ÑðTÏ…Þ’÷Gðeññn«n²[ÄšS–².Øá“ûJÝZ?*$…£’H^RÎqÈŽv~ü^ý°>/|b¿¸û~³6‹¢6ñ‘¦Í4hÑâhÐ\Í¿{“Áš%+ô ±¡ýÝ~ûá—Ñ«¸ï…«< ᬚ¿³o5ÎhT êS¹§‚Ë䣋ÅÉÅJP›TpÎ6KHù<çŒð8_h©Ï븘Þ.• ®H5oru×îãf¹eª“¿Æº¿×¿Ú³öÿðç„gÔ4O ßCâ-A’ál´ûIÒ{we_)ïn­‹&D{íâ|JÅ…Ã+‡èÙÂmkþÇÀ>!ñ<ò]ø‹Æ¶7ž:Ö.$O.W›Äº…Ö¥¦¡„îÙöm´{4‰œ$QZªFvSü¾i–:‰õÝ/I¥ºÔõÍRËK´ K¼—šävÐF >{‹…«–8Æs_Öˆ­l¼à/A´š8l<)á½?G´ ¦8…®‰§ÛéöŠÊ»6î‚Í…`¹HÑU±_Õ\Iá' x=•ðîO“ófÎ69†gç¸ÎHâë}J8|. *Q‹†9c±®4i͹ÏâªWœ!8~}S7Çfõj×ÅO’q… =ûš\Òæ”µå•J‰B*U%ªæjƒ¨ïø{ûW|E‚÷ãþ´ƒIðþ­oáM#HЭά—rÅ+yM¨Ý|öÞ!Ðw)šþXÁYCf5Úd‰¿uð‡ã £ØF>ü¸ ´¡žÏÅ#%FVöˆá\®ñ³[¤žäNcøÇž3]sâ_‰5Ù&Øúߊ5‹šæÚònî§ŠÕ¢óuÍ!Öš.H^B°$–î‹(x—Ö>xÈØIoÔX´ryqƒ¬ªm¬aù—â$!3… Íp¯¸;Õ˜à#C È0ru¡VfˆŒ+b(MWÅB8¬U£JpQk^¬ï¤Ÿ4eF1oÊ¡ZU+bªYEýf¤ªQ”)ÍÆœîú8F)5£Qæ»R?¤€4‹”±ò¼ðn|пèz‰÷JÒ•R<ßµ:I˜„¶8‘É•J·™µÏì€þ'øwÃ^ñ|7:7ƒ-µ;;òú×M‡Pø~K½KÓ2Ý|A¹šmvØËýȳºÓÆ™5Œïu>¥ Ågüµ|øø<.ÖòÛë;à±ÇmsýµºKeŽFIl¥ÿ…‡'Ù.•¼›¥@4è 2ÂÂåb¹_Ð_þÑV§À¥:ä*«áß ûZ ›‰ó ;xßr(bo¹1È1<ÊÉŸ“fyLªIEʪŒeïÖ¯RRr«N)ÁÎr|Š.íÆ[;5Êš~Í:‘”V—i§x¨§¹[RÑÝY5k{¯ÞJÈúoãÇÄ{ Mü ß õ{¸e¸Ó¯¾º¶š›"·ŸƒâöŸ9–9¢¼¶uY­n¡’+˜£™%güdøÁñËN×QEðëà´J¡˜Øx³Î¶dFHæoÚ0à+I ;ÜLÍ6YŠß×~ ~Ñv’ØÜé7š±ŸL»g”Àu…7ZużLRÓå?a{bÑüB´uµŽ3=Ï…¯ã¶Ý$¿§Àf-`eвBðC3þEêþ1h§mac€ËK,Ú¼K$¥ö¦æk¯ˆ8a«Ê1/ˆÞE YvŸd·7 ºã}6òßÄ:tjË}lcšÞ/'âPa6e ùª¶­,Eüì¦?KS'§Z:¹ÎN*2”åV£·,4æ•Gu¾’Wjïš/S“ë ›´ªE;/vRŠÒë£w³·¥ýÑ~Ð÷ÚŠHßÛ³ª3Ná×^hU“å•Éñô­ó›…ˆÂ`’ó[es²^ûö øM?h›Ý~FßoáøƒZG‘ŒŒ—Ú¤¶:‚~×vVCe«Þ”@ܬRÏå‚ÿ’w>>šñ–(n¤™Ø \ëV€Ìûw §Ä ØÞb¥Õ ¡evBb•¿dÿà•ú,²hüss¾sq©x_Âv—2I¾›o¨jÚ¬^I ³ýH"bªÑíbïˆý|nžYÁÙ¦&…\]l’äŠsŒ±˜_ow9(K O­IݸÞ0Q¼Žhâ#[J—;j1«RS¹bœy/Ùûòƒ“OWs+?Õ.É|Iñ#Áš,¬6^x—J[§ä-Œw‘Oy'“Rm¼öŒŒ|ñ²£ ‘Êþ…\"ý††ÃOu<²Jí·q!¤L2•BNçUb :m[áO‚¶ê_mn§ŒºhÚ&·~ê2ÏžÂ}>Õø Û"ºÕí¤\íýìjìÎï¿æ³7všr©*U"Vl«@Ù€ÎcUL•RÍ´Ÿ˜üÁÆ•”ó=µ,%ÞªÊugQÙ«-:ræ[¦úŸWƒ‹.—m'òJö×k¹Ytô?‘ø,çŒÏˆ¿l3á+2|7øeàÏ KgÙî±ý¥ã™‚©ÀW6¾,±I°»üÈŠ;0B~L×Õ·Žâ'íyûDxœJ“[ÉñOÅ:&žñ±xŽ•áKçð®•åØtíÙ†Áå’Å£ÊOÊ•þ‹xq–cðåîÎ¥,ƒ-©Z¼®œV¼LZ»÷–"½U&õ”¯'«gÉâçí1X‰÷«RÛü1“ŒwþêZtÙh³?àœŸò¿Ø?þÏ3ö_ÿÕßàzÿYJÿ&¿ø''ü¤/öÿ³Ìý—ÿõwø¿ÖR¿’¾–¿òQpý‰qßúèràb?ëìô„QE$žøQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEñüþLgö’ÿ²~ÿúzÒ(£þ Gÿ&3ûIÙ?ý=iW©þ¿ëãÿÒ`e=×§êÏÆ?ø8cöððçìÁûC|?øz`Õõë³'ÂOYéúrˆ"m7P¹ñ~‹m4šŒ»¡·-wáëØäA ìP#2¨òÖOã3ã—íñoã{]XêZœš†æšfML¸VDwùZòéŸÏ¹•¢ÂH¬æÜ †9ýÙÿƒ¶¿å$ìÂþÿêuñ¦¿—:þöð;ÂNÁðßqµL¢9fxU–;2¨ñqÁÕ•JQÀad£…êjštêº51QnVÄYÙ|ÎmšãêʦX‡%.Zq£M*q”b”¿{%ïÔ»~ôe/fì­mU™™‹1,ÌK31%™‰É$žI'’O$òjĆ>¤Ë“üÅV«‘ ÷ÉýÀ þªÉéóã­¥*sŸ•ÚT×þ–켯ÐùùÙFÞ‰yV>®ý‰<— ±Y,†aî±?ïí[ãð¯ÂÏjæKtz ôqÌÒÏ, ³±V9&áÑ ¹vRÊU¿1ÿà”^ÿ¾"øâdø 4¸ˆP—þ)Õ­ö°fOüKt=R6¢`á‚ ôŸü‡Å³èÿïl#p‡ÄÚö£Ë·—º¨Í#?:Föá|½ê˜Œyz3xLjyïˆ2Éi·/gK á§~XÔÌ*ÇV»oM(çpU%—%YYųÓÁG—êm­J·ÒíA(¥•”á%w&Ô¤öÒÿƒ’jg-poV9$‘ä$j dX«FtOhî­åÇ†Ç Í‘‡œÝÆã5·1™u¸`š Äšõ¤Hñ/”)âéÞ\¼äåÚG*ÇhbË:‡o<Æ8#VÔB6Ð1ý°‘^¨»G´­»S °[DWYIRJÇ«ÉÝÕ›nI(ŸÆ7F6µ[U+)h51A%^Œ Ñ6Êૃó#\ŒµÙ\ºÄ£|Ãâ+€íŒ0‹“(é‚När+z8XRég¢»|ÒÚ.‰]~;Y™ÏšµäÚÒm8Â=Õ'&¬´K]ï£E»ßÍ<ÆFÕU˜ãrÇ¯Ë +„@<¤·øÀñ ÀeöËä¶X¶3¿¶n?è77þOÿÏV¡þÑÿ¨§þWüiÑý£ÿQOü®ÿøÓ®•¥’Ñ+Yy{Ÿ~ï~ç?*mÊ^üž²”•Û~Kd–É+$’] Qi"rú„³™UããT–ì’Q”o ãýWäè x%@ Œ0‡ú9ÿ‚søe¼7û&hŒ©‰¼iâø•¥Ë»¼K|<7i»vç EUÿV¡šDÊ1‘ÿ›û‹¦–8“íFpIfÚ2]`¨Ú>Qâív1Ç%‘[•˜YŸ¼,<û>|"ð¾BÉ¥ü<ð™¹R6í¼»Ó-5 C~~bÂþòçsÛ{˜ãÈ6ã©Ô£Ã3—ÓOÚc3 Nf×;Rœ2ìÁÉr«>OišSœ£)iR1vÒ-wåðŠöµ6æQ¤•¢§R1¼]¬´…¬õi¶¶>¬ý,#:×õVŒH×FÑa•òø–öyµY£I>Lm¡F]7(ˆˆs´ˆ”ýwã¿ÛxÀ2ñì°ÇiàÏø‹Ä÷sJ» ŽÛú-æ«q,Š€ì…b³wu@v !G¾{ý4ÿ#Ó^Ì‘ùš×Šõ J¹>˦C¤Ù[0Bˆ¡Œ÷z´o.ÂÓ&7Þbž7þ Qã‰<û|ÕmäÙy¬xF/Z@.Þ6Ö4ß ]¸û½7U¾œŒV’+ù?„«žñ ¢;­ŽÍrü¢šIT’«Z­ "PнäªÔ›p¾²vi;ŸUNQ£†u]¹aNu]ô\©9kåe½¶ÛCø‹Ôõ [RÔ5K·ynµ+ë½BæI\Ë$——\LòHØi䑙݆]‰cɪ57þ«ùŸð¥òûÃõ¯õ^ŽUŠ¥NXYB*p§N(Â8¨B)Ê[F)%«vGù¦Ûr»ní½Ûz¶þý~}™ö/ü“þRûÿÙæ~Ëÿú»ü_ë)_äãÿ儸(Wì w?l¿Ù€ôôøÝàs_ë_Â_K¼=l?ð‚­,“⛋ºXø¦ýÖú÷>§‡Útqòö?ŒŠ(¯ä3èŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ˆà¤òc?´—ý“÷ÿÓÖ‘EðR?ù1ŸÚKþÉûÿéëH¢½Lð¥ÿ_þ“)î½?V!?ðv×ü¤ƒàý˜_À_ýN¾4×òç_Ôgüµÿ) ø#ÿfðÿS¯5ü¹×úàßüšþ ÿ±pæIˆP¡ýWý‘ü<û0üðÔИf›Á~!¾‰•RE½ñ¬×>0¸Yv1&X[\[w,ÁÀc`‚0‹µâÏÙãáoõÄ×¼qàO x§Q†$´‚÷]Òm5;ˆm!‘¥Ž('¸C=ºîga,‘,’<»|Æ,?Œ3ò1ãŒOUÃO†|E›céP…XÑ–# )âèe3Œç ÉN€«(Y5ì—+[KÝ…)F‚¥yEº4àù`æ•E(JqkK'ïä½ç.­¯äÅ/qh×WªQ6Çq«F ¨€!ñ¤àcl1®:"”<^Œñw¨­Ö´ß¡ñÁüëúÔ´ý™¿g[\·ü)/†Ó¹KOá]&eÚJž"žÖXƒe~ú p (!I¤°ýž?fÔ1ðGálo³à}¡fG_/ÌÀÄèÁ‰e•<¯–A W¹SŒð”«Kƒ\ªI©sTÎáÌÛå¿5Håuª&”un ]Zú¦r,µJMü8 øYðÅ#ãOøf8ãŽ0å†?²U" ¨Íµ¶|¸`6²“?ë®ÎKƒce»—¸ü<·ÑäWvå×µŸmöTKëuo§ü»Ž¿i>Ý-_ñ±öãÿ?Wÿ÷ÿYÿæÞ¢mBà1 -Ë Æõ v6< åÅ’ƒ>s‘ƒÁ$ìÚ/‡4èßì_ün%ÚY,|áè™ÈU*Ì«¦¢E“ƒ.0C Ë« ˆøSÀ0IæXxÂVó)ù.‡‡4X¦PÑ„ ·²O,¾ ’²Q¤B‡QS÷x8÷«Äµ"¬”u²áÛÝ5¢Riõê“Ye8Ù¼MIé·$m§/XÔ‹¿»e}5ù¯ãgn·ÿ>zŸþø—ÿšZU^rV;YÛíI¼NÇ€NÄmÀ$qŒZþÉÿ°|9ÿBχ?ðKaÿÆjiôý:a™tû ä(³·Ú a|£“óXççø3¦­‡ƒüo庢Á} Úùu‹ëýqd,#‘É6—v''hh;ÊİËæüÇ)¤~Ì߼ߕ?Žþ)XÞ¼ Å^÷I𦅪Þ\ÆéZµWD¸rÊBO¶J±Pß­:%¬Z\0ÙÉåºév–ú\QˆA‰ßG²¶Ñ"rB,„æFÍŒ•0¯ç;þ µãÄÕ>)ü ø}HðçÃýcÅ÷H¬ÜxÇ[þÎ[m î­·„ážRÈ™†{VRÁˆOÉ|ËŸxÇÂnQrŒsüNw&ÒJ/*¡‰Î!)¤½×íp”Ò{9òÂüÒVöóû,¾¶¶n”i¤žüò…7g³II¹-ÜocðrŠ(¯õ`øƒì¯ø'?ü¤#öÿ³Êý˜?õvø¿Ö¿Éçþ Ïÿ)ý„ìò¿fý]¾¯õ†¯óÇé£ÿ%?؇0ÿÕ„O­áÏàbëì?ô€¢Š+ø´ú0¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(âø)ü˜Ïí%ÿdýÿôõ¤QGüþLgö’ÿ²~ÿúzÒ(¯Sü)×Çÿ¤ÀÊ{¯OÕŸÈOüµÿ) ø#ÿfðÿS¯5ü¹×õÿmÊH>ÿÙ…üÿÔëãM.uþ x7ÿ&¿‚ÿìOý?\øœÇý÷þ5ÿ¤Ä–—Ï 'ñéü‰®¯ÂZ Þ*ñW†|/lX\x“Ä6ƒA—k¶ŸQ†Ë¸]£kdãƒÒ¹ˆ }Hÿëר|"ñ¶“ðãâ/…ašý¦o…á¼Â¾[BXœÉ`3 FE:øØÐ«õJQu%sU© QNrŒW2M¤®yÚ:‘Røy ¤ö´[\Íù$Ûv»²Ñ7d]–vÚu…Žd‹–eiag¨UŽÒÊÞ;khÕTªE(lœ}9à!Éúkáï‚ÿðRÿØ›ÅðégÅ}[ãGÁMíö_jMàÍâW…­eT*¾§ jþñRaáðtÛ›j2¦ß6_Óo…Q~È_â¶ ¿mÿ„¾#Ô¯¶ý“÷֖^ñ+3º¯‘'‡uÿiž IÔ !Œ¥wF<£æá ÖY‡ R,ã"⪎œi,VafôðÎ4b ê,U<ðÓ§ðþò\Sz»ÝGé©rVIÂ¥)ÉÙòB­+ËkÞ..÷÷l¶²ÚÇ“4›N6HÞꄦxÏá‘Û9È##?ˆ þD?_vØg_ž>›ñ+Ã×±H7C)Ñ/c†UÁÛêw‹0Êyƒ·Þ+"ëöø)·ñ‡å‡šK“®Ú¼x<ìHôË¥Ëe¥‹žÍ_5KŽò IGûFœíËõldnÉ%|6ºÞöMÛÊ×·‡­¹B|¶oþ]Ú)[vªvïk»ÛfŠêä°B±Ècw/ ˆ9m…$2ùgŽF0O%¸Ó5ô•çìñ:ÕÙÄ nоÜ[k>(rT‚Ë&óàå·ÆÝªéĬ’¼ím­³ý“~/j X¯¼ R»H×õ(·ˆÙú3M±®U2Ì7ÍXž)ËêÕÂÏ™a©S§Rõ£*µ"çkBmr}]©óQ†"‡,åÂUÕtÝJ0‹JQrpŸ#‹m¸¤ôWM^NKÞåÒ*òøoÊÚ1Ñ_VMû|i‰™R Ü€¹oâ ÇíQuajÁ³…ù•S$øòW_²í€ù^[ƒ¼ÇˆRXu.0É*iO3Ëàî¯*˜ªqJý”ùõ»²Ý+ŽTªE_ÙUŸhÆœ®Ú曆ÖÞº3çÙ$XÔ±äö\€Xð8ϦFHÎ8ª“”û$W/{n^K›˜¿³Ô\›¸"·KG“7Ù–ÐZÌ×FYnžã}µÓMo +³{uÇìÁûA£È­ðÓQóÇó®¹á”;ˆ,U­|E$n $§æÊ¥®Vø ñ«KySQøâd+¢Š(¯Iˆ;€Q,fœJwFÁR,v‚‰‚¹Öžq“TŸ5Lã-œž‘QÇaœ›iYF1œ®•î”R¼´vWO–t±ß/³jϕũI]{Òº[­“º^¶‘ä×w&VÚ¬B ‚ §FqÃFKd øê#"†Mþו€,êDm?t(6í:Æ$‚Eu¿¼âK‰¶úŸˆ¼5¯i–:V‹®\Çs©é7ö6ÿj»ÒçÒ­MuosHnµ"ÊŠìà£Ë‚>Þ ó9ÁC)ÇΆ/ Ý<xÑ„1eRue£.XÍêäâ´æ²ÞëC¢ªQ§K•59O“ݷ•ڵï.{»6¢·>„g2çÎÒI f K$†[ŒŒ›y"PlÙ©òÛøÿÿ‚®xÝüiûk|KŠ;‘>›á/ x;L@Á¾Îº7‡´ñ©BÌýèÖ¦Ôše*J̫гcékk>šæíFÒ4 ‹´÷‚°Ä¬Å¤Ú©¹U$fl?ÀÿÇï'Ä?ÿüu´‘ø»â‹¼CÿÙ…üÿÔëãM.uþ x7ÿ&¿‚ÿìOý?\øœÇý÷þ5ÿ¤Äž9UT)¯QÏSøcðÍL$CчãÇóÅR¢¿`¡›bhBùiNŠŒS‹Œ”b¬•âÒÚ×n-»]»Ý¾ÝõûÍ *І,bB‚X±8É$à9'¥n®‹~Q[͈3d²1s´aHÄn²X0(Ú »†ù{aáe^”é·{rITnÛ»5—vݕһlç«R•_kV0r¿*•Õí¾×ÑuoKÙu=gá¯íûA|xá?Æÿ‹#¶•&ŽÓÁŸ‹s¦iš¥¾y ¤¶×v³ÛÍh¥‰ãfSõëÁ_?à£Ïo¬¿µŠg‚%B\xSá­Áq ÞI%ËeC;Ü<¯#€ò30Í|ïð›ö/ý©~7½”Ÿ þ x¿Ä:Mð-Š'Ó&ÐájN¯aøS6ÌaÍþÉ<ƒŸfžÒq÷©Ô<-ágQFÜØÚ¸hJÊóµ™ß†¥Ž«ðî´i»{ÞÒTae-ï9SO–W|±¼–ê-µ‹bÿ‚ÁÁFaTEý£îÝS ~|•˜œ<²|:iŸ= 7ã£1ýcÿÁ6kß¿e„~?ñÿ‹`×üiâ›Oâ=FO xOF]JæÏǾ)Ò,${/èÚM¬mg¦ØYX«Çj…DQ™|Ç’i$ù;áOüïöUøHö³hÿ -|Y«Âñ ñÄ+´ñuóÉ )[˜ì¯b]Úmì&-§èvR†òÀQ²%O¼t?Í£Aoc§Ó¬í£Û 6žl)n¡v„·FÅ|‘äÅå Þî¨2Á¿’¼Lãâ¸àðœÀ9w ÑÁbjV©˜ÐËrŒ»˜S/gð™NÂ:mº‘sÆâ/+ZÞ§·†¥‹¡Îñ8‰Ôr*R¬ÜiÙ¦§Õ’Mè£(¨YìÛQ³ûvËã÷Œ#WY¤Ò. ªüÓéÂ6@3bš Œ ©É ´¯#rþÐ%“]7³ígbÓY]³Í¸ìHµ4Ž3€Xã#…sòZF»ÝÖ/XàŒÊé7ƒÒ[‡\Œ`daœcNší쑯&»a3<–Ë")†[‹uDf’G‘Ù€•¤Ü@Ä¥>™Û)aðÒ­O÷0Š—´\±½åR•f•Õ½šÜ´snÎèºn¤¥(ÎmNêðQj1ƒvÑÉ.g7oy]û¯U¹á¶í÷ã_Ù»ÀzÄo|)Òþ èË­.‘â»X¼O}á×Ñc¾`4ÝBÞá<7¯g<Ë5Œ³¾ØínOØÒ› «ù­gÿûºŠe’ïöQ´ºH"(¾6Íožrw3ü'º 08Èùƒ®TýåñSÀZGÅ?xÇá׈”6“âÝóHÌi9³–da©Á¹®´Ëèíu+]ß(¹¶wË‘_È7Œ<+¬xÅ~#ðoˆ-Í®·ámoSÐuH~m‹{¥ÝËg;B̪e·•â2ÛLÉíÞ9£%Iþ‘ð|0ã¼e¼EÃtñYÞW‹£‹¥V9¶{•|¯J1TpY®œ¥ƒÆP«íjû8ÉG†ƒ»G—˜c±tgB¬£M^›Œ©Ò—,àômÊ›kl¤Ûnì~ÿøÏþ ÓoâÏ x£Ã¶²´þÕ5ß ëš.âñêˤjZ¦qcgª¶>èÂú=>{¶µ Ôìåº0Çn·ÖÁšaüñO+O4Ó¾Í,’¸\í #—ln,ØÉ8Ëޤžj*+úçƒ|5ྩ˜Ôá,›û*Y¬p°Æß™cý¬pn» £,ËŒ+·‡?‰ÿ¯°ÿÒŠ(¯âÓèŠ( Š( Š( Š( Š( Š( Š( Š( Š+­ð¼¢Ö×Å—ëmaqsaáÈ'³:Ž›§ê°A<¾*ðŋ̶šµÝ¡”Ú]ÜÀ²4 è“>¬sM+»m£}ôI·Û·pz~‹±ÉQ]Gü%ú·üúx_ÿÿò‚øKõoùôð¿þþ ÿå;Cù¥ÿ€¯þL5òûÿàzÿON^Šê?á/Õ¿çÓÂÿøCø/ÿ”âž5ý±>|6øá/ƒß~9þÍ~ø¹ãïìøA~x×]ø!áoˆÞ5ÿ„§]»ð¿†?áðFº¶&ñü$~&°¾ðîƒý¦^lk¶wzFŸöBÞkt‹ÙÍúA?ý¼Zù}þž^¿‡}=Šê?á/Õ¿çÓÂÿøCø/ÿ”‰âŠ–>°ƒTñN«ðóÃZeַᯠZê> ðïÃÍÂçÄ~4ñ•àïx~ ½GG¶·›[ñg‹µÝÂÞÒ£‘¯õßë:V‡¥Áu©ê6–³‡yà ÿ“¾_ü_ééJŠê?á/Õ¿çÓÂÿøCø/ÿ”Â_«ϧ…ÿð‡ð_ÿ((´?š_ø ÿäÃ_/¿þ¯ôôå诚¿o¯‹~=ð?ìkûDø›Áº¦á_Ø|8Õ!ÓžÿÂÁü ¢Ðþià+ÿ“ |¾ÿø¿ÓÓ—¢ºøKõoùôð¿þþ ÿå|gâO‰^4Õoü=¸ÖßÁ6ÿ²?Å/ i^ i~*›ã' ={T´Ðôý95KOÒ"—OÑ®5o¶¶…k©k‘è¿`!×´ZŒeÍi;¨¹k´^jOòí¿—ãeä}IET (¯A×5Ë­"êÆÂÂÇÉlžðŒàOá ÞÎóÞøWF¾»šk»íæîyg»¹žy$žy¼‡ ÿ ~­ÿ>žÿÂÁü «j)´å+¦Ó´U®¿íä$ï¯øð§§/Euð—êßóéáü!üÿÊ ñOƒß¶'ÀÚþ/øPÿf¿ŽðˆdÂ[ÿ {]ø!ñ7þøH?´ÿ°á"ÿ„)u¿ìOí¿ìMgû#ûOìßÚ_ÙŸØüï°]ùJѳw–ï‘Y_kûýC_/¿ÓËúÓ¾ž‡Euð—êßóéáü!üÿÊ ?á/Õ¿çÓÂÿøCø/ÿ”ZÍ/üòc×Ëïÿëý=9z*ïˆ>*XøN SÅ:¯ÃÏ i—Z߆¼5k¨øƒÃ¿4k ŸøÓÄzWƒ¼áø.õÚÞmoÅž.×t? xkJŽF¿×|G¬éZ—Ö§¨ÚZÍ·ÿ ~­ÿ>žÿÂÁü ¢Ðï/üòa¯—ßÿ×úzrôWQÿ ~­ÿ>žÿÂÁü ¯‹¾üDñ—‹¿l¯ÚËÃ:ö´÷ð/ÃÙj xvÎËMÑô ¼Eƽ_ÄÖz>g§éÇW×/E°Õõ¹­¥Ö5=/CÓ.ï¦Ó4 ÒÁ¨¦¤Ó~ìTšqJéÊ1Ñ©=o$öÚâ¾×ëþWÿ?þœWüþLgö’ÿ²~ÿúzÒ(£þ Gÿ&3ûIÙ?ý=iW£þ¿ëãÿÒ`g=×§êÏä#þÛ ÁH>äÿÍ…üÿÔëãE.;×Þ¿¨¯ø;{þREðCþÌ+à/þ§kùp¯ôÃÂUHxgÁ°ŠŠQÊ ®Ómþþ¿­åkùŸŠxÌCÏÿ¶Çúþ®Iæ{~¿ýjC!ðù÷æ™Q9äl×ßWÆ×§M϶¬’J*í»kdºœœ±íùš2î¾²^Íwl2Ï3 ãsù=ÇZþó?`Ÿƒ¿²·Àÿ† üMá¿Ù“önøƒñ"oøYñþ"hÚÏįG⛿iòkZ¦”Þ ñþ“àë«›Ù¯Eá­+E°±w&ÄŠßÀëœ=köàwǯ„ÇáßÃÿ ^ø»G·×tO h:DözƒÿgÜGa§[ÚÜ[Âu(¬â•£’‘Éi-ÂÜ#° Ÿçÿ¨g™î.£„Í1˜l%b©ã°˜Zx‰QżD(΋ÅûôÔ©Q*„j¤o^rZ«K¯ :8yJ¬ðñ«6¢£6ÕéFM¸Þ³|×mJ »}?¼½+ã厱ûÁ¯‡þ[C²#¤Ýë:zÛÅaòRKEaX£‰c¨˜³€g(ÄÚxÿáœä=÷Á´‰‰bï¦ø±bM»QbU¶ŸÂή~Vg‘$„ ÜÆç.Ž]㩤GÏ…þ#x‡CÞ[yt/k< ¹Ü)tËÛyfþ(Ÿ̬ õ½'ö¢øï£˜ä°ø×ã™vŒÆu/]ëñœòǯO©Ã7\5$Vî$æ*Ü/‹ ’XI¹4ù¾µIYrÙ){)t½Ô^š=y´ô6œÚç„£M+Á:t¦ÛwÕóÉÞíݵfô^oú´Ô5oº›–oø›J-"; yt«ùl;?9æÓšEiI Œ"*§hQŸ‡Àû¹_ â­>0c .t‹ À 0ÌÓTºr©fÜŠØ`#Y8þeìn?Ú²Òhæÿ…¡e®[Ÿ+WðgB²ÃËót_ é’°V¼Â,…¤&SêúOüƒö€²XâÔ´O…:¼)Á”øgÄöÒ Éþ²k_}‡v YhôÈÁ)!ÛûÕòÏ(ÌiÂ)ZnÉrǹ£eª|î«[^²ºVNÎ5¨ÊmÎt”m£t$ÛZYYE¥¦·WÙ¤îÏèZ |™ãø­,Al±¹ð޺ʒŸ¼û-¥Ü…Fï70©| ’b{Ö¿ ~ _nX¾,éj6¶áyaâ[ m¡Û«gx‚K ÄÈü"Ó¿à§¾(…#Yø1áíYÊ·™s¦øëRðú£”1Ù]xOĬêí„u:ŒEù¥Ýå' ißðS_ËëŸ øSáÿˆÂÈÌ#à¯þßú¥ãÜ/ƒþÙÙ¼ŽGÄZÜ×®JG6¥YXDHUæ-zdp[–4—‚À瓜Ü0X‹8{5SMRåSTå8Óx…J7qiJI]Ž´k±ÕÂÓŠ—·‚Š¿º«{Vš¶–ŒªI»¤ùct·µ›>鸴”Èø ’܆RU:ƒÎÓŒž¿ÍŸüþéÿ´Ö£‡pë3øCÂw^+òdàëòZO¶Y#*6‰¼:<:ø£RñÅOx‹W×oüEª_ÜÚ íOQ½¸Ô/æ×O´´–ÞkË—y$6Ï„¦BÀTÛ…Sû¿‚Xl߆øÂyíXS¥”ãpòÃBµW*ë[ãNº§e씩:éJ£R«F•¡+9//1x,M8ƒ¬äëÓ­9¸¸ÁÊœk'ÉðÎ7ö‰IÉ4ã'YÏ•ðâXÏGöÏ4àêz0®}ã¯#üŒú÷«*NÏ>Üw¯í,ÕĨ¹`éëgË9-Qi7Íf¤õV¶ë¥ÏáÒvæzz£ó¥¬ÄcÈÉÿ>¿çÖ¬#ž§òúWÑá3Èbyq(¹^Öšir¦ÚzoeuÑß§\;;_ð>Õÿ‚sÿÊB?aû<¯ÙƒÿWoëýa«üœÿàœ¬áá?°ˆÏ_Û/ö`÷ÿšÝàzÿXÊþ úfVn&à·Õ²,ziÛíífÿCêxz.41¶µcÿ¤Q_ÆgÑQ@Q@Q@Q@Q@Q@Q@Q@uÿOŽ?ìW´ÿÔÓÂË×3ã¯? >ø Æ>2øÃñÃü5w§i^Óõ?êpØ.«¯^ø³Ã·ÖÚ&lůu^M;LÕuVÓt»k»È´}'WÕå†=3JÔ.­ª ¹Y&ÛŒ’KVÛ‹²K«b{|×æŽšŠø‡þGû ÿÑÉ|?ÿ¾õ¯þTQÿ#ý†èä¾ÿßz×ÿ**½_ùõSÿ—ù×u÷£¢Õ|Kâ6ý®<5አÖüàh´Iîÿf-Ãz­ý‡þ<|@“ “â”›qªüQøqá×õ‡³³§Çà}Gáü+ý¦ô]gãïŽ|«i°OåüwÇŸØß´oíÇðÇþOÁ? Âìÿ‚^|ðü3¯‹´¯´þÑ¿µÿö·Ž¿à¤>ÿ…-ûkð¶|3ÿÏÆÏÂMÿ7†5_øQ_µÙüuñáÝßü*o}‹þÿþÿÃÈÿaŸú9/‡ÿ÷ÞµÿÊŠ?áä°Ïý—ÃÿûïZÿåE\aV-?cQ蕹%ѧ}b÷¶½nÛMibëºûÿàÿ]™ñígûk|OøYûiü5ðO‚¾+x'ÀÚ&Ÿñ³öLø¯~Ï?þ0ü$ðwŠ~>é_´/ņ¾ñoƯ³åßìÇâOŽÿ¼á? |i»Ð,>*xKöÆøAàß|cøñ+N×¾ø·DøAã]ãÏ>$ý¡~ |\ýš>kIûM蟿h¯üQÿ‚hüDøÙûø—Eð?†ü9û"þÒwðP¯Ø®í¾xƒâWÁo…—9ý—ôMÇ:÷Žþê¿ ¿k-ö€ý£üEaàyõÿßj:ÇÀv¾<ýVÿ‡‘þÃ?ôr_ÿï½kÿ•ÃÈÿaŸú9/‡ÿ÷ÞµÿÊŠ¥¥öyÝr»ò=mÿn]_ɧæ+«üK¯Uåþ_‰ë³¯ü{ðªÑüSâÝoÄß<1­ë>ø×¤ø«Áþøsâχgš?k¿ u‡žÖÿ±^ïÿSO×/^ ñ¯öÖý”¾k~ø}ñ'ã·€{£ÞéúͶ›©ý—P—EÕ4]mŽ›ªé×W>7ÿ#ý†èä¾ÿßz×ÿ*(tª;5Nm8ÂÍBM?qlÒ ®ëïGÛÕüÊÁá¯üøuªø“ÞÖüMð¯öÅÿ‚äø~/ZxsJ¿ÔføIûC|3ÿ‚èø–Õþ5xÛQž ä·ø]ñà‡Â/†u†¹ááÏÅ_…?¬|7àëß´ÇÄŸøö3þGû ÿÑÉ|?ÿ¾õ¯þTQÿ#ý†èä¾ÿßz×ÿ**¡ ±ÿ—5Ü[÷$¾µö{Ùü­ªbº½ù—^«ËüÌM_öÃýª¿áqþÓ–¾2ý«¾ üðσ?Ẵ¿xíÖ¾1þËß> x[ãø%û[ÿÃxOö4·ø¹áo¶iþø/ñ£þŸÚ öÉñÿìÿñ³Âß°¾øLñ7íû9øÁ>¡û?üLøåñ›öêø ñö†}oö}ñφ´OÛ¿á‹?f¨5†~4ðçÁÿx‡áßü[âGÃßÙ#Uøõ¦ø3ûã–·ñ3á_†|aÿðþ©ðÏQð÷Ä 6Á¼KðÚçYÔ| û>üYðíçÝðò?ØgþŽKáÿý÷­ò¢øyì3ÿG%ðÿþûÖ¿ùQTãS¦kÝjêêšþ_=ow¢³K›˜ºþeº{®–ÿ/Çc¢Ò¼Kâ5ý®¥q¥|QøáÐ5ˆÿ³§Éà};áüþý¦õ­gàŽ|y¤é··×•ñü<öÿ£’øÿ}ë_ü¨£þGû ÿÑÉ|?ÿ¾õ¯þTVn•WoÝTÑ%ðK[uz}ÞVÝêÝ×u÷£íêø‡Rÿ”‘x7þ̇â_þ¯„ÔÃÈÿaŸú9/‡ÿ÷ÞµÿÊŠòO†_>|}ÿ‚„h!ø9ñÃÿ4}ö5ø—£jךò¿ö~¤~7|¾Kk«{¨m®¢ómnb– š³Ï‰’d’Úá"¨S©7(N+ÙËYFItêЛOf·]|ÑúsEVG‹ÿä-iÿb¿ÿõ ðýrõóWÅ¿Ûëö5ð?uOø›ö‰øqaâ_ éÞðÿˆ´ÈuIõFÑõí'Âzޱ¢_\é—öQjú.£ Ε­é¦äÞhÚÅö‘©Ãi©ØÝÚÃæßðò?ØgþŽKáÿý÷­ò¢µ•*®RjFœ›MBM4Þ;j™)«-V˪:/ø(/†¼GãOØ'öÝðwƒ¼?­ø³ÅÞ,ýÿiO x[ÂÞÒ¯õßø—ÄzïÁŸiz‡ü?¡ép]jzη¬êwVºv•¥iÖ·7úýÌ–Mq4q·‰ü]ý·?dÿ|?ø‘ñöyø·ð»ã‡ÅO‡ß µßZ|Yø ⯆ßaý<9ñwÇ <¨ø×âÇ{_ülømû<ü.Ñüfý­ÿmü-ñvãoj>ý“í-5ÝvšÕîôËÖWÖÒ$±Ãqoqoq +Ãs 24mÂ+[ϲ(ÓœaUÊŠöi^Qi_ÚÓÒí-tbºmY§¯&wÿðR?ù1ŸÚKþÉûÿéëH¢ø)ü˜Ïí%ÿdýÿôõ¤Q]ØáKþ¾?ý&Ouéú³ù„ÿƒ¢?dßÚ£ã¿üàï‹þþÍ´Æ_ éß±'Àß ê'øSðkâ/ÄOXxŠÏÅ¿5;½÷Zð‡‡56×ZµÓu'P¸Ò繎úSN»’‚öÚI›ßøwü3þŒ;öÍÿÄ^øßÿÌ5~¶ß|gøÃ©ÞÞjZ—ʼnZ†£¨]\__ßßxëÅw·×·r¼÷W——Sê’Osus<’Mqq4,Ò»É#³³1«ÿ gâ§ý¿ˆøYxÿ–Uý ÂÞ=ç<1ÃùVA‡ÈrÌU¯ 5tÔïèѧöm-mRjûÙE_}t[êõó>WÑ~ ÁHãéÁ>mûÜw˦~Í_nbËt“ì³xÏhìàK+7®æ"1ïÞýœo{˜î?c¿ÛÃí ¬5ÙÇâý´Ë¹FÔ–+¯…¢ùÙ“,êY‘¶Æ=Wü-ŸŠŸôRþ áeâ?þYQÿ gâ§ý¿ˆøYxÿ–Uáâk¦–ª÷o¨·ýšnŠ$ý’i†$g|¿³ÇÅ0@ÀÀ"? ÂA8ÉÊÌAÀñþζ°½ýŽi781üø¿Ï;ŽÂs ÆFÞr[9ü-ŸŠŸôRþ áeâ?þYQÿ gâ§ý¿ˆøYxÿ–UÀøãôyN\üÒ­Óþ}Î ¥öݾ—MfR¶²oÏ–Ïÿ$”Wáøhu>'ý˜ÿlíOD»³ö7ý¨UånX~|Y™ßÊš9ŽÐ|±™1ª»ªå·È3ð][ö;ý¸ÄdCû~Õî¹o’ßösøÇ!‘J6ØØ§„2GTbÞT{ˆ,¤2õø[??è¥ü@ÿÂËÄü²£þÏÅOú)?ð²ñÿ,«J<{Š¡ðex¯2÷ñÎÉ6¹ªKWmÝÚVKdKʨ·~yߢ²q^vm¶ý]»¦|[ãÏÙ þ ö9­´Ø[öÊžöå^(®¢ý—þ6Ì–ˆãp ø¢È©#yŒ˜®T?ïaWþa?ðNø(‹³;þÁß¶‹»³;»þËßYØ’ÎìÞ%™‰$³Iä’kõÃþÏÅOú)?ð²ñÿ,¨ÿ…³ñSþŠ_Äü,¼GÿË*ú¬«Æ\Ã)§(ÐÈrÙÎm:•jb1\ò¶ËGd—E®­½Û¸²¨YÞµFÛ»n1è’Ii¤R½•ômÚÊÉ~J/üƒþ ?áƒlïüEßÿüÃTãþ Åÿ ø`ïÛ7úµïÿüÃWë'ü-ŸŠŸôRþ áeâ?þYQÿ gâ§ý¿ˆøYxÿ–Uõ¤~y†V‡ eÝQWÄãtŠÖß·vm¾Þ¤<ž“ÕÖ©÷GüÊÿ‚qÿÁBÆIýƒÿlÎê×¾7óþqS§ü“þ Ïì!ûeóÿV¿ñ»·ýÈõú±ÿ gâ§ý¿ˆøYxÿ–TÂÙø©ÿE/âþ^#ÿå•{o¥?á¹yxW%—"v¾/µ•îÝŸ›Ó¥üˆy%ïíªà1òòõþ–¿.~Á?°OíÑàïÛ£ö.ñw‹¿bïÚËÂÞð·íeû9øÄþ'ñìçñƒCð÷‡<=¡ü`ðv§­kÚöµ©ø:×MÑômMµ¹Ô5MSP¹·±Óìmç»»ž!’EÿMºÿ<ø[??è¥ü@ÿÂËÄü²£þÏÅOú)?ð²ñÿ,«ñï¼GÌ"øã?éÚuÖ«¤x‡A²Ôå´¼ñ„üY¡ÛêÔ<çöYÿ‚c~Ð>¸ø›ðá·ÆŽŸ¾Á>þ xçöHý˜Â>/|^³Óþ8ÿÁL?mý¡¢o€_ þ=þÌÿ¾-Ã3ø×PO…gYÓ?hhü௠jßðšø¿ÄÿïGƒ³ø'ûÁ 5[/ÚoâïÆ‚?ÿg¯„ß²WíŸáüyø_û[YþÓÞ ø÷ðßö?ý¢ÿeÅðÇÀ߆íàŸƒ÷^!žõo¿mOÚø‡Àw±jzÄè¾ øSNÕ~'øöÿOÕ µñ‡Éÿ¿fo‚_±Ïü7þ ]û5ü+³Ñ->#|+ÖàœWís'†õ‰:÷‡5OÚÇXø«áÏ|Bñ©üJ†ÚâmÅ~×>x—I‡Âz~á->ÇU‚ÂÃþ"µñ‹§}f,ð³‰Å`¨p hâ°Ùf#2ZÁ:YC ‚¥Ž«Eâ©cqJt1ydêÊ©C7Ë*'8âá%ä¼GR§JµLö¥S :öU¹ê§:Ò¡ û)P¦Üe:8…)A·„ħÊéK–ÒÁÊ_·kŸ„?±¬`n,৉à åpw|H”Ä¥†ô\$¬Í žÓF/ø9öè½ðö8Qßþ,§‰r:`á¾#.AËv²íÕÏŽÛô&Oˆ¿²ÿíÏÿÑ¿à™ÿ4ŸŒ¿µa²ÿ‚˜ÿÁ@~+x«Ç_óÀ ð[áï‡>|ZÐôÙGö~ñ?ƒ~2xïâ=ïÁË?‰´5öâo‚<ãÀ> ŠãáѼ»‡Â_~¿²‡ìqûPü7ðÏņ?±~³ñKTñ7üOöTý–~%üñ'ÆŸ¼Eû:~É:¯Á=‰_µ¹ªü¿ø®èÚ¿Å?‰úg޼M©|Jø‰á“ð;Â׺Cø7Á^ðΛáMVÆNU—xqK S™xt°2¥‚Ëó ûF¶êÙ¶/„ËÜjã1¹n"3¯ý™Œªþ³‚ÃÒ…:qQ«9â0±­¤ëñªÂn öªU«Ð\ê¤j{L-,=LBp£G FšÄQŠöujMÊNN1Tê¸rƒþBý¹OüÒoØätÿš)â<Œ€{üHrG¨Ç8;‚Oü}ûr8b~~ÇgŽåø+â=ªDR8 ÄW9%r9QµqPL‘}‹û,~Æß±?ÅÏ„¿¾ øŸÄÚÍçìí£ÿÁuþ4~Î:OŒ4¿ÚGÇÖ¾ ý¡ü àÏÙŸâç> k~#Ñàñã~Ï÷¿¾1jÖ þAñ3àŸÃ¿‡~2ñ€ît ü>Õôø‚]{Sò~ıߎ>&Ad¿°ßí]ðŸâo…ÿbÛGâgƒþü{øQñ¯öpø]ûaþÑßíü9­|ðoÁ‡:ÿí/ñóö—ñ¦·§ø?Æž!Ô>)øá·í!g«jsxÀþ%ðí§‡ô[ÿ躛XO #_†«ÀÒ…L,jÕ“Xjj„>¹ËQÊ®aAÓœþ¥Sžœ—û2«Fx™Q¦êʉœPéÑ©íIUq‚½I]T~ÅJ)G>ekIÂj’›äSò˜¿àã/ÛÉ ð£ö=¿¼Fv¯˜Ê¬Iøƒ‚HÎU„{Z)…18´º¿ðqOí¸@Ýð£ö@SÆGü)Á?W dà§,çõ7ú7ŠWþÿûH|8؃CðÿÄÏÁC£ø…ñ#öd·Ð?jd׿dŸ‡>#ý†­`ðÿí7©x?Xø±yñ—Â9ë~"Ð|Yñ÷^ñ—Á›Ûûï%χn´=3JÒ<5wþéã_†~:ýœþ5ü*ø³âm_Âð~ÁþÿÁ`þé~ð¤º÷Œ<}eû9é_Øß|%«É­ê:7‚îtkéð×ôÖñüiý¦‡ìýwðûö¥Ðoÿjm/àGìÏðWÆ1ðÖ‡eñ÷öÈøÕâ_‰?gh<_ñÖMNÁWáW‚<ᘾø;Z»ñï‰áñ§ào†:o&á¦*t(âxƒ«Šx'„:”êQÆcó¼±)b«`kÂŽY3Q•iÔÃÔÃ,‰¢húwî5 [WÕu ›{7M°·žööòxmmà’yDcôgÀÿðIoØëXø—ðNñïìëâß ˆnoŸ²÷´¼'ûA~ϾøÙà? ~É_þ)øgâ7ƒô¿ˆµGíñÄ>·ñ÷Âë KáÇÅoüSøy¢ø¿GÔÖ8,.´ªÖ£‡£‡UqØœvF¬çšFpöµ2üMyÔäT¡‡P‹¨±uiaZRâšu°ô«ç<޵JQŒêT©ËB޵iÅGÓäXŠtÔT¹ÝKµcRq­ÿÁz¿nß kºç…¼YðKöbðω¼3«êZ‰bÊŸñwünrWceÎÝÈw&ÒŒw¦ß6™-†ãnÞÛ>uýâ/'ìë…;6º?-c–'ËÓþï áÏâ°8,[á\®œ±X<6&PŒk8ÂUéB£Šn­í6“vm-WoÄ9íõ©G4Å5N¤é§x&Ô%Ê›µ7fíwk}É[÷LÁ}¿lrä˜þʺ|Õ¸çÿÅuŸnƒ‘È8ŽAÿóý±ÏüÓÙ@qÿDsVàã8çÇßòç!Ôr8éŽ w§è0@ávâ”cøqÇR0GÊ8ÿV¾œžÛqÆ6¦ñðË€¿è—ËvŽð­Õ+ÿËÏ^Þ‹u•>%ϯ™â^½áÿÈy/»um?s¡ÿ‚ôþØR0 ðÇöURX‚?áNjß(Ý(“ãNX%€S“µ Ïg}?à»ÿµóŸ†Ÿ²ºž7ðwTr3ÁÆ[ÐåP‚¬# D?‡V«†Qµ× ÷Yx_žCÉòFçýÞ[ƒ·ÉÝ”ò¼Ý?f!…Q‚6„ùJì òW÷0är6¦Æ ¸‹ËÙkðË€”´áŒµmökw_ô÷ÍÿÁ¶™Ï‰³ôݳLR³VÖ;_þ½¾Ë«Ñníuûd?໵é?òMeÓ#þö¥‘œsÿ#Ÿ äã§Ý9ÁÜxÿàºßµÛ»á§ì·Ì¿µ"»ãð™ÄíÈ$ Â0b ´‘~((äqŒcŒr9NŸ'Ý8ã¦6㸊Ô# [k¾uòÿtí…QË|»Õ·&ÓÉ2xgÀvñŒe»¯³[·ý|_×N‹UĹó‹ÿ…QVÍ1+Nð]÷cÙtV²Õ²«ÿªýªÈ¾þÌÊq–ð©.ŽÓó‚>)@Ø*?»£yŠEÿ‚ÓþÕ$àü<ý™ÿ„w?/ÍŒŸøª³Ó äã÷‚Çè×hQ°&ÕsA…>\y+Œg+À'äÛ˜l ç§B:t0#oN1Œ.wËŶqðÛèšË¶f¯xÿÓß7Û׬bŸçî×Í1O^ðÿå~KîÝ[OØ(à´µ<¹'áïìÐ#'þ-ÈÀ(N@o€Ø#'.˜UbÅTK$qÁe?j'o‡¿³rã9ÿ‹M>AØp|F2ÌAà€ :«—X¿-©Ø¿)O™†>LåO”ŸÝÉýä{Uwf?/͵޷\ ù{pɌƜä¯ÊÛr>îÀŠ›cÛåÁ5<7àeøÆ²å§òÖ]¿éê×îë£ØUxŸ?‹Ó4įG˧/’éÛn¿®_ðøïÚþ„Ù¸uÎ~MÀùñÉñ £ íÆ%~*Aÿ‹ý§‰ÁðìÞ¼wøM7HÏüT™ùº.@Á9P$0þK㱌œc§ßä‹óqór»qÕ6þât#€0UÎ2'÷ÅŒ' ±€9ËÝl£á¿5ÿ$Ö]·òÕþîÿ½}ßUèʇçî÷Í1[÷‡ÿ+òìöÙ[Üýs‹þ ÿûM;a¼û:uÁÛð¢S·.N¼ I*…]`¤\-¥Ñÿvý¥ˆçÀ³¨ r–;N•É׆ìc®#¨6ÏÉ»tÃ(òñµ‡ >TÌ‘ó!~S·‘±6H a<ºv². ª»WTd&¾@|µÈàáx…Çîò—‡<­n˵µýÚ½Ußü½}»m}“lÆ\SÄ Zf¸­ÿšø|—ݲ¶Ÿªcþ çûJwð'ìì9?óJË÷ºÿÅ@@<ºÀãç1Z‹þ ÙûII×À¿³À鸅,6®íl#àÈ€ bí¬ïkùT@0On$üÃh猞6Ÿ»³0h[/Cµ~R§%v˜ùc¸7’™—wúÔÙݺ#Ͱ‡gÿÞ_ºû5ºßü¼õêúè—ëâ|ýA¿íLMÕµ¼<¿¹§þK·[Y~¬Gÿ`ý£œe¼ û>§LçáXàíR8:Âä6[i;HÚª¹‘!°?à«´Yÿ™ö~¹øV™{×ZPqŽyHù¼¿ËËtÚ£÷{1ÆXr¹HøÈO‘öüƒåòÂ"ìg•my?‡õà½ßbdñƒó c9]¹‹'á×s[ý\Ëíå«å×Ú¿Ïî1ñ2_Ú¸«[¼;ÿ¾ž[o§»úwü_ö‰v øàùXü¿ ÓªÇ'Ü9ʨùNæŒyŒ_ðT¿ÚÛ à€`goÂØþP\¨-»SRxà‚¨UІۋ…³ü¼ˆeÊNÏL„nHòäé·®ÕÚW;¢Ù¾ßjÝ0Ã÷`m`~Q€Ÿ¼Q¸³Ç×flMŽ€~ïÈÛ¦’ðë‚-øÇ2ÿü·dÿçïvûöòZOŠ8%lׯçü ²ï²Õl~›'ü ö‚#Ÿ|Î9Ûðºà’3ý«’28$.@9 ól—þû@ЙðzÿÅ­ƒ€sŽºªäñÈ8Æì|þ_æÔc  a@Âò«…<“ Æí\κ°@0sÓ÷"òqó}ݸþ ¿¹Î>ðKµøs/Ýýš»&¿é÷êÿĈ‡ñß5Åtë'ü·w·exþ”§üßãó|ð%?¼á|A™G;µV9AÆå$…Ìj'kMÿय़Ÿ–ðgÀÄ;³ðÂÛ áHÚù7)ËsFÐỦæÄ)‚¿»Û·çhðÒò[È'äÀùÓ`F}Ðù>e†Õºmòöà–tÊGò§î"Ê6Üõ6"mg•mðó‚’Mpî_ðßá«øþûü½{⎠W¶kŠVi/z=ãýßÕÛ²¶Ÿ¢£þ Oñߟø£þñŸù¦Ÿ.7pßñ0ëÆOAÁÎ>m“§üã³σ¾q»‘ðÂÓ #ÓO'nîv#pŘöÿž uãÏo»÷¾÷ÉÉã9ÀÆ:®ßÝZ‰xc°ð2£äsÈòŽìÜɳËc˜¶y–‚ðó‚¹äËïoå«Ñ¯úx¼úkײ¨ñG;ß5ÅZëíE/Uÿ¥y[K/ÑH¿à¢ÿœÞø$G ðÊÐàU2OÚ3÷Xä2džƒmap–·Gü?ãqw„¾ «c$†v Á$ö HÈÀ%W=H^vþ|[&<°¸e;BäßÃÏü{|¤ìÉbØP¯îüŸ/OÖAµTmTÂcjŒªáXmSå¯Sµz…ÇËŒ¼>àÅ'nÀtû5_EÞ«þ½I|QÄ_ð«Šû?j+¢þê캯‘÷·ü<3ãg9ðŸÁaŒçþ-–Ÿ2þ·k’6ŒŒŽ’£yŠìðP?NÀ7„¾ Æ Ãøiaû°^UËfE ·hÜ\l±EÏà01ž6ã=¹\ä|«–瑌•Ù˜5-“k¡òÂmu9‘ÕbY>fÿFMÄlÃŒ»Y³‘»N©x{Áj-®À^Ë¥[ôÿ§_’~]ïýgÏì¿áW{7ñG´-ö>íÎÖ_|Gû||f~O…> ¨ÀÏü[]<Å#`‘£$eœà©@ ‡.‘N?o?Œg?ñK|ã?óM4¾0¬pq1çŒö8ä¯ÃvéŒ-FFí»s ¸Ú£ìÐeϘñ´Æ‰µqåAp¼và|®p~SÏŒyyy×pmíþ¯à:}š¿ü³Ë_ž‹WqÒþÕÅàPòþç’û·[Ÿp'íÝñ…·gÂßøÜK†º^Õ&aŸœå‰@H%¬rodcÛèÇûqü\vÁðÇÂ.ª †ÚfäE]íòŸ”†` „`з˜#?iK/†c^IØ~PÇ8ù÷sÝÞ6ÌžcòÄlwE³Ì´Ü~e~ë!Û³æOÞÛÌ~Ì~CåíEÄ~Yˆ°y>^˜êxÁªÖáì»W´jöÿ¯’ü×]µµÔ⎠I[5Å-VÒ—÷nëÑtûX~ÛOüË_ ¯ü[}®ã$dryã¦1œ…ü6ÇÅŽâšøKÆæ›èÿ.­îqžÃç•øåG°é¼'Ê¿*åN9>  q…˜¼>ïÃ|‡,qxÀF2™Ã€x9Úü?ÿÀjö_ôñ}þ¾òÕ‘OŠx…ïšâž«¬:[þù~ékËöz~Ùÿ†ð߈Ž[;þhøA¾e‹$`”“ @ò¤,Ȇáì4SöÄø àáÏ…ŠxÈ?4`!ñ@„€º©HpŒ²¬_[˜1íbq"ñ%”îcåC¹‡•™y|Û¢ò|Ý+j„Q† Ã&п,=‘ËÆqµ6¶Sy~]¶rà.MÂwÒ®×÷×O>úîÔÏŠx†-¥šâ’ÒÚǺïO²]_£Ýýh?l‰øçÃß ¯ü[­ óÇý3{ñîÈ#ý®þ&6wxwá€%™~ègh +·Èù›ä ÈGÜÈ¥¤‡äÕŒtéÛ§å~0¶á;¶ºíïQ¸Ç„˜åG•̃nä;“·Ç·Í€ÿP¸=Á·`n•þ«]?éâíÛ{é't®QÄwÍqZ%»‡—÷eÕmëo®¢ý«¾$?ÞðÿÃ1ó0ù~ègn(6}·l•*Q‹¤en#´´?jˆ½ô/†cþéç‡ûãUõ9G—§h¨À鎜ÏEヘàmÇðíÄX¾á ÿȇ²{UÞñ_Ïýk¦éBâž!Óþq[­Ü?»Þšùüµ‘ôÂþÔŸçAøkø|<ðþÿŸCõÇç•чö™ø!ù´‡KÉ ?á_xxÿxé–ݧŒà. 7#ÁEÇØþ\AÇÝÆa>^Ÿpúd}Üü8ÊmZ& -†×<ƒïØ|߸MØÙ´œ/Ì·¯‘»Nsà>QOûⶪ·jÿòñkò¾ú-JÿZxƒ’?𫊿{Âú[¯"}O»cé…ý£üxÀ¢|;€Jÿ¾ðæS#<îÓÕ±é”VàîU;ÄrÃFxëþ€ßǯü[ÿ qéŒØ ûž1Žqólùî!…Œm# ¿.Üá~ðòcã”yi·ÙÜAdzÀ/…;W ãžFíŒGŠà^ÿ¡ ~Õ»ý÷úuÑkbQŒ•1ÂlÄ>á5oøCÁnºTÚÉÿÏß=uù÷Ê\UÄ*JÙ¶+oæ‡ÿ#¦Ë¶Û­×ÑZˆ<_®è«®É¨|'ÐìåÕu "µZIs=Ιi¥^]º&‹à}^4"Ö,•Zy`‘ä2…‹l{ާö‡‰èmø'ÿ†òÿÿ…x§Š!ðlÿ³ŸŠ-þ"ø_þo‡Ó‹ðøëÁð‚j¿á-ðlžðjxŸÂÿð¬´-ÄÚßÄOíí¯´¯øA4 xƒUñwÚÿáÓôZïP‡O¸þldÙûãÇ„><~ʾ*ý¨ÿgßÚ‡ÄðO»_k³Á4ÿg¿x–ç㟌¿àž2¿¹žoƒ¾'ý¸>xkáŸü&ßò$ÿii?³W޼{ñ+ãž•ÿìÒ¯í~üS×|?âÛ›‹ü‰ñØ|§ˆ3l» “dqÃ`± W:•}:–súÌ9¥ÌßÙ^ëjÊ_­äJùŽO—c±9¦lëâh*•\1jæskÝŠ¤ÔU¢´¿áªýtý¹?h¯øX_²íáá/ ê,Ÿðª¬5…'ñ‡<aáXõ-thÿuÏØèZÒ4oI¡®—ãÏøDõ§¼±ÒV»´ñŒ0jž¸³Ôõ’¾8ø­ÿ&Ãÿoÿ³‚ø“ÿ¨§ìýEyù¼(ª˜*´pô0¿YÊð8š´°ðté{j´Ûœ£)8ó5{]êzyDªû,e:µëb>¯˜b¨S©^ju}•>NHÊIFü·i;l~rÁÈ^ø?«þÜß .¾ ~ÔßþkIûü·µð¯Ä ~ÓZæ¹}¦/ˆ>'4>#´ºø1û9|^ð²iwW“ÝéÖö÷Þ%°ñwz>¡%Ήkc6©ß~CáÙŽ2 ÿ‚ƒþÊ‹‡Ü>þÞÛAócmÄâ±e²ªÆˆ… ´ûè·üµÿ) ø#ÿfðÿS¯5ü¹×÷Ç„ü6ñžpŽ#ûs9êÙT%ì0ðÉW¯[ܦñ6"¿.—ýåj’»w“Z%›eX ùŽ*¥ZSNiKÚÖÛŒzF¤b¶è–þ–ý…Ã_²úªøx?쮸 Âü;ý½H\Ê©ÿ†$O—å p¸P¡UFÕŽAáïÙ|ÿý–Æ0>~Þ¤(Æñ„ãCÆ1Ó¦?¨¯Ð—µ·çÿøÿô?ýoºLóVI–Gl7þV¯ÿËòVý”Eý–‘ÿ‡‚~ËXåcðïöògAºRý‰"fpF|Ä'i(Ñ8·{ml?ehÈÏüö]㜇_·‰*q cö'@T”#hQaC¯âÕ¥Â׿gúÿs‡¿ùÁÿÈ?±2ǾÓ÷Õôóþ-¿§ÓCúÖ>;ü1×¾x'öo¿ÿ‚˜þÌÿ|ã/üEоèŸÿl¿ é—ÿ¼SmŸ©øëÆ×žý„´câ_ŒmthÃ^ñ?Ä}KÅZ߃<"dð‡ƒït/ ÜM£Ÿ"H¿e5Îà ³ $øsûwàŒ§*ß±Sdî*À‚¥B¤1Wñ.ŠÊPéƆ{QJµkÔ*7N3­^r«Z´Ô8z*UkT”ªU¨ï:““”›“l¹e|ùyèÎn1Œ"çˆÄÉÆŠŒ ›«¤a£­"••‘û‰ÿ²zc?·ÿìÄrÀ'ÃoÛ³åË£þÅJK0PHQVAå”±ÞKÿÙ-BøoÿÙ™p…ømûv¸ÛŸøbäàc €¼€Ÿ 𶊧Á‘nÿë½þßÎù¾»ù‘ý‰–Ð;õöÕïÓþžõ²¿ùºãSý’Æ?ã`?³GnÃ_Û·àÆ8ãø ¡.íþÈñ0#öþýš×vŸøVŸ·C°ÚìÃ?ñ…ñÀe', ÆÓykø7E7Á±jψ³ûväáïþ‡ÿà®–ö.[k}[²þ5}•´þ/—Ý¡û鉿d8×öüý›Tü¸ ðÏöè*0ˆ§!c(û§(û«·bùi…ñ_ì‚?æÿgî>þÝŽœøÃQÁÆ;`·(OÀ:*A;®"ÏÿðÿèËü­d%’e‰ÝaßOù}_§ýÄü¿D@qxÃö?B ý¿?g%aЧÃ?Ûœ„0$+~Æ¿3)*ÈCFT¯ÊUŠ#~ÆÃþoãöwéŒÿ±ý¹3Ðß±ÒúuöÀÀOçnŠK‚)­¸‹ˆ6KááÞ›Í?åÐI–ÆÖý5þ5oþXFp|PýŒ¢ÆoÙó²|0ý¸H~ìäþÇk–#i$ޱ.Ò¬`{;ñü[ý‹‘TÛÛö~ãoÊ>~ÛøL*ƒ´§ì{rFqµÇÈ–æöŠOéKWÄ\A~ü¼=Óþíÿ%÷ äycß õwþ5~÷ÿŸŸð~gôùðß^ý—>-|Cð¯‡ß¶÷ìÿâüMñŸ…¾xAÿ…{ûfi_Û^0ñž¹§xsÃz8Õu¿Ù3LÑ´Ñ©kZ…•˜¿Õõ?K²óEÅýí¥¤rOë\ðEÚ‘ã߀ Ž/о!“*GÊÂ~H;YNä ¯ÊUмÇ'ü“þRûÿÙæ~Ëÿú»ü_ë)_Íž8ñWøgšäx ‡4ž.Ži—â1x‰fø<¶½XT£ˆT!2Á`°Œ]ä§ Ëi$”Oo+á<›J¬ªÑ­ ¨¥N½D¬ÕõæsëÒé[¦ˆþf¢ÿ‚2þÓèGüW?‡ü>>b Tðž6ê1€Ê¡QBª¨…-­¯ü³öÿÂuð`äcÄÿpTäøU @0@ù?¦_·ÿüà·ü³Ä³Ïƒ¾'ü+ý¡¾-ø»öžÖüaᯅ>ýž<á?øUñ„/þémá÷ÐüCñÁö·âMOâ_‡4ï é^µñþ±~/- ×Â;ÿ>øKÿ“ýš|uñKá×Á_Œ ?koØŸâÆ=vëß¼1ûkþÏšÿÀøþ(jö©§(´ð‰¥âÍ=Þ¡ªYh:}¶«¯éWwÞ#»Ó4 ky5]{öº¿áßñüAiMVËZÕ§ý›IÝGFíÎïn]í¥ŸCÐÿQ8}Jü˜«Úßï2ÿä|ôÿ4|"¿ðFïÚpcþ+Ÿ€ý¿ægñÿûõK)ÇLaq´G£üçö–‰Tü ]¤aWÅ>e2ç;¾ä¨Îv¦†1Ù¤j*Ž||ÒO–iÿRÚK·iùz”ø jΞ*ßö%ùDþrþ ûI¨Qÿ ¯ÀÅÀñ7Ìnû¤|0Bv‚?.@ÈØvå_ø$?í$'Æß¸ Œx—ǘ*z³ÁàtyUÆÐ#ÿFTT¯xõÌFYÿ†Ú]mýÿ%ýZÓáøíO½ÿÞeÿÈþzŸÎ´ðHÏÚB"7xÏàqåHaâOnL(®>!ÎGgNm(þSÁ¥ücöŠŒsã‚}#Äž8$eñlÓå,¼t ¨WjEý ×åïìÿ$ÿ†Úý£à ÿ?áL²ÿ†øÙÁïøKábÿÂgÿ SÎñׯ¿ÂEýƒÿ/…?áÛÿ {ûOû#ûgÆ¿á"ûö˜þÈû^¦ÿâ7qìÔ¥íòÆ¢—7ü'RVM¨¯¶ž®ÊËæ‚\ Ãò~õ]¿©?µ§íŸû5~Ãt_‹_µ7ÄŸøUß¼Eãm7áÖâøC¼}ão¶xËVмIâ]?GþÊøuáokvÿhÑ<#âßí ­6 */ìÿ³O}ÝÝŒ?PÒ~6qå“uòë?…¼¶Ÿ-®“æÖÚ'½¯}ìÈ|ÃÍ¿Ýâï{¿ö©vÿÇàÐÿ‚]üó7|'ñ?ñ¡sÏü[Ð èO¦>C˜à˜?#+»ÅŸŽ àÆ;“%”‡jŲxĉ…P£e‚KoÝÊ(ÿˆÝÇô–=¿æ[K¥­¯5ú/øt‹ÿPø~ܾÏoû —áîéòßmÃhà™¿£ÂSðˆ`uÿ‹Ø®R Ê1ðõ2¤©Û÷BŒ"ªìH,¯üOã¨#þ*¯„¿_íï>˜ð ’zw8ÁÛ³÷Šø|u{ýc-¾ÿò.¥ÿÉþ ðòiû<]×ýEKõån‘øˆŸðMoŽjr|Uð˜ð@Û¾.à‘Œá¼Àã‚0 ©Cå´:ÿÁ8~7FAo|(l€šï‹8ù£$àxä)È €2!] [‹?Úº)¿øåÛý£-Óþ¥Ô¼¿¿åbŸðûµéâ´ÿ¨™~>ïüñ‰?àÔ|Mð°`u¿m^1Ÿ Æß•xNÝ“ø'wÆ¡ø©þŽ{k~+ã§#^O|mè6•ù<¿Ùz*W"ømžqgÄØÎ‚¹9Ã6‘³UŒOoúÛE/øqk}c.µ­ÿ"ê^_Þòý6²Bà._òïÿ…2òëË~‹KØü¡‡öøµ3¯ü7ƒµu1$.HÏ‚€ÉxU)TòÒò~ÃßÕTo|:\(WVñUàªO„!s…;TàœýP¢¥øËÆÏ_o—_þÅôü¿¿åøúúƒÃ׿³Åôÿ˜©im¾ÏËþ§å¨ýˆ¾+ùü=„jÞ#$rNF<"¹##¸äpTì1[‡ö)ø¥#mü=ùX2Ÿím}ŠáËnÿ‘97œ%A( ˜È·kOÓú(~3q»VxŒºÚiýŸO§ý½å²ÓÈk€ø}˼SÝk‰—[wÉšþÆ¿£Æu¯ (—T×·.# ®ÏÄ6±Œäœp‘áB•Ž#ö:ø˜3ÿÏwþ&šÿpG9ð±ÉÉ<Ž0pWôšŠŸøŒ|k{û|»§üËéô·÷ü¶Ûµ¬¬—ðòÿ—x¿ü*—ÿ#ý}Öüà_ØûâRòu¯ç'Õ5Ü.UÁ`…r\–RH)´!ØQŒOŒ²WÄd+cÁ)BÔuœ‚Ü·'¿2@Œ)6ÔÛ¥èu?øÖV½|¹Ûkåôú[ûß×Ýfø ‡å½‹Õü6¶Thk÷›ƒdxr"ÌFÒÙÛ“ mdo³Ic¡ìÓã¤UUð—xú© !vør0W(HWœ¢5‡íú)?øÍï_/Ñ·ÿ"úk{v—u_•“à–ô±Wêþ³-ò[o©ñ2þÍÞ8íO ŽKí_Žþ$#Ž1Ðpà âýœ¼l„ªxYHè몖‡”nu,¬§r´ídbÚUðoüÇþ ð[þ [ð[Äÿ¾øcâ„ü#á?Š:×Â]GNøµ¢øOBñÞ#м'àŸÝÞÙZx;ÆÞ<Ó$Ñ$Ó¯m~÷öÚ”Ré°ÛÃkux׋ÜiË&«eüªÉÿ°S²æÙ|]lýuOef¸ ‡–Šž)iÿA2Ù[ûº|­ävpþÏþ1Ô|00IÊ^ê$Œ˜Ž9ðøÈ! PLkˆÎÚüñxÿ˜†‡¸¼Ô³ü$ÿÂmñöVñ´¾=xþïxoþOK®øÛÃI£ÿjø»ÂÚ‰âÚßïYhx7Rñ”?±þÒo…¦¡¥O|ß‹œg$ÿ}€qVnØYj­v¥¢¾Šý_¥Ÿú…ÃÖKÙâ—eõ©kÿ’ÿÃt± Ÿ¼Jª€ÞèCj¨Àº½à€ ò4„ |¸Dj§È"˜|"ñ Çúf„>—7ß/NXàãž1òìú.Š•âß/ù}—üðü¿½ä„¸‡“º§‹ÞÿïRïåòëÓä|ùÂÆÁšïD8?)W¹@s“ì±¹ÆÓ¹ €v4nb– 8~k‘à}£GyE†V @Û¦Eò’‡ m #Œ Dò’×Ü(¥/¸ÂZºøü!§åӚݧK ð;Þ–+Um1S_”ày0>kCþ^t¯ûÿuþÏýCý¸Æ1€>]’¯ÃÝiqþ“¥Çr@È#ŒØ€ðx €Wi Wب¤¼YãkVÀhïþãMößÞì—ŸmAp-©â»¼Ëÿ‘ü6<ºjˆA2éà  <ß/ï·È=C6Þ * è¥Jµû èü%¨ª¨ó,aRYŠ®6ð?ÐÐã*}ÕÀ_EètR~+ñ{ÿ—ØïþåOçÿ‚Kàzû<_—ûTôÿÉüö>]ø£ðâÄ™4XtßÚ7ãWÂ]B]B[ ü%×| áý*ïUÕšÉu=sT»Öþx—ÄZŽ¡ug¥hÚz[\k‡DÓ­´¸åÒ4:ûR×o5o'ÿ†2øÿG¹ûaáÆøuÿÎV¾ú¢¼ Wc1¸Š¸¼^[‘â15¥ÏZµL¶.u%h®i5U+Ú)h’µÒG¯‡áì><6›Q¡F<´©CÔaïh§Mé}OÈïÚoöv¶ýŸ¿aÛ"Ôt=KÄš‡‰5$ø{áÙå–øOÂs[¶á :Wytéoç¿–òêêòå®@ˆ¯¤ÿà¤òc?´—ý“÷ÿÓÖ‘EaW2¯šJ5ëÂ…'J<5:xj^ÆŒ(Ñ„U8ÆÒµ®îï©Ý…ÀÒÀS•*S­SÚUz•+ÔöµgV£\Ò”ÚW¿*²¶‡òÿmÊH>ÿÙ…üÿÔëãM.uýFÁÛ_ò’‚?öaõ:øÓ_˦ ÿɯà¿ûÃÿO×>W1ÿ}Äé1 (¢¿L8‚Š( Šr£¾íˆÏ±K¾Õ-µï;`ª¹c€3É©~Í7Ÿöb›gݳc²&[30C¸ca ‡Êì-¹rœ¢¯y%dÛ»JÉZíù+«½•ÕÉrŠm9E4œšm&¢­y=tJêïeu}È(©<™·mò¥Ýýß-·¬òzc?ëuÓýgÉ÷¸¦º::2xu*~Vdn‡VCèÊÊyëºûÁJ-ÙJ-öM6:(eÄpÆÒ9Ç 3€H]Ìz*‚@.Ä*ç’tÑèml³ÂäFÈ6ÅÞhÉaæo*HS°ª•Ü¥šÎ“fÖ°n•M)Þ)$n‘‘–Ue*ÊK'*œ“]•Œ×Ò¬q:»Ÿº‰œcÛЬxµåb1u%RP£%BîSº³Jדoh§¢¶­»kt ­R·±ÂÉ¥4¥ 77£nïEÙ륕܎_ûÐô’äÿÀâÿã4öðí²„fk $RèwEó(wŒ‘ûŸï£¨5íz_‚üå¸yÜÁ¤Yl…¤dì`à†q Ü0 ﵟ†ÒÛi>¸û1Þi—·?<$.Sĺõ‹v»É³uªå#_$6턬a³8ÁÆ/Z\ÒåæJ_ ’qR•ÝùWÄ•îô¾÷cÚ|Ø©EÛDš“NðÒWJÚs^öZ-_3GÊØ6óÒçþû‹ÿŒÖ}îŠñ|ö§|As'›,jêFòÎY–(ÄJ¡rKn“£#Ùu¯ ÉhXÂŒŒ»ñ %„›\îìw+Ç• -Œd«x‰#x˜£©VS‚U=Õ‡UaÑ”á•RŠxºßŧUÖ‚Þ3VqNÖçŠÕyI7õ»hç–'…©R§´K¾jsÑ]]r»¯;=Úºw~iEuš;Or,p²„àB‚M›bZyJ‹ ƒ2±æ¯öà 3!Ü@bªHAµ 1ÜÊXæªí™„Y ²HÐzqÆaÜbÜÔ[Üm'mî›J׺}›VvWG­ Ç (Åʬa''ÌùwºmF׺zhífÒº0h«2Ú\@ ’6sæ|­û¿œ¢ï8ÀW#÷R)h¥åcvt‘Rµt©FJñjKºi¯ÃÊÏѧ±ÙFjñ’’½®šjÿ/+?4ÓZ4}™ÿäÿ”…þÁÿöyŸ²ÿþ®ÿ×úÊWù5ÿÁ9?å!°ýžgì¿ÿ«¿Àõþ²•ü-ôµÿ’‹„ìKŽÿÔèŸWÿ_cÿ¤#ù_ÿƒ¼KáÏþÞßðAøÇÄ'„ü#á?ÚóÄ~%ñOŠ|KªØh^ðׇ4/Œß±†©®xƒÄæ©=®™£hš6™ku¨êº®£uma§X[Oww<6ðÉ"Üÿ‚ÌüMø7ÿ2_Ø›ö1ý‡~4øCã·ÇmCö¸ðwÅÍsÅß³‡Žt/¼áOø{Ç?ÿhÚOþ ÿ¨ñOìëñƒö¿ý­þ~Ö_³'ǯÚ'Eø3ñWH‡öpð×À-[à ž:ð÷‰µí'PøâïxÚý|Cà﯆õkëÝGâ=¾£®]xCš É´µEÕt¿ÿ‚ø|4øeû]|ÿ‚x~ÞÞѵ¿ÚöMø%ñvÃÆŸl¾ÜßNš¿ìñ‚óáÞ«ñ;ÄÓ¦y¤xÆÄév_ ¬<1ª\hZÆ­ø6jw:±Ò_I¼Õ´?IJ—üƒá߈i©|ñE”ºbê:o„| ûaþÐÞ4ø©­M2e¢i |=ñæÿâ4¾#Ôgx¬­4+Ÿ Zêlš8na¶GEÁBŒ¤äç‘%9];(ó9'M¥i.UvÞ·µÛ»Õ+Y«¶•´×Í=·ÿƒûyûf|?ý·¼_¯Á{ðöðø=ûü²ð†‰©â~Ï^øÓñëâëþ#¼Öîÿâoü5ð÷GðµÏ†£ð®›ag.•ªjÍwÿ =ãOm-ãø‡þ {ÿø­ñköÅýª?àÿ~3|ý©ѵ«O j66ö>#Ox}´•K$þÕð¤¼sÿûÕüÿEñ7ÃM/ö:ð?쇧xÇöKðïÇüÕ¼}-Ïì5ÝCŶ^5ִ߇çfÕµ°<Cf¡¥híï¡»½Ñ´èO ÿ³ºýŸoàãÛÊãöVð¿„|!û?·ìU¦'Ãm'Àƒáç.´¸[ö$ƒQñ7‚ü;i¤hzuׄük¯Ç«xËþ0Ò,_Cø‹¤kÖ´-O[ÑüQe­j A{9)$ÿrªFJI>e§´ø¤ììÓÑ;«h˜7ª·óYݽvÕ-¿¥ÝŸ{|+ý¤ÿà ?ðSŸÿ´~­û~Ñ_ ÿcOÙcöRøíuð;FÖõÿ€¾ý¡|qûFxëÀ©ö¿/‰­ñ†™§üpñŸ‡~ßøÏៈ>ü9ð÷ƒ|SðÄ¿ê1½Æ®÷è­êûýÖéÕŸÈ¿ü¡àoŒðÎ_¾%ÿÂõÿŒ}ÿ…ÙðçÀßðÌßð¬|-ÿ%þ_Ú?_ÿ…ëÿ ›íð›È“ÿü+°Â-ÿ3WÚÿµ¿s_¦_~5~ÔßðHïÙö‘ý§mÛø(MôCáÆƒð;Áp~Î ?eñáÏ꺦¿¢O§^ê_um`øFñEλáýcÄ7z”/}á}À:›ørËRÔ5¹­[çø:‡á׋¼wÿÐðÞµá}&ãU±øWûOü7ø‹ãF¶Šy¤Òü"~ü]𠺳G2Ÿ³Úø‡ÇžŽîYLP[ZO=Ô³*BU¢ÿ‚ßÛü-ÿ‚ ÿÁ2¼{'ìYñcá÷í7ãÙ³âÂßÚ'WðWÀˆžøâK´øFú×Å>ðÖ©¬êÚ]Úx'Å>:ñ>ŸáûˆôÏê÷žÔl´‹}F÷N»Ñîn6•:•¹IÆo–7Kš÷­xÞöm4ÚÝ´…­åmì­÷Zöëc´ø«©ÁjÿfOÙ÷ÅŸ·§Ž¿k_ÙçâÌøicñsâì*Ÿ³N‘࿇ð†§è¾ ø‹¤|?ý 4Ïß|X¾ñ^ƒá» ~m>ÿÅ1jš%Þ¥>¡:âÝtkk_Ú¿Ù“ãï„¿joÙóàïíà[MCNð¯ÆO‡þñæ“¥jæÙµmuËî.ôY¬¦¸²mSB¿ûV¨½œóZ½å”ío,”søßûpÁZ?aŒðL?ŽíðÇö‡øcãÏŠ_´—ìÏâï…þøKÄúGˆ>9Ý|Bøïà{¯‡úO…/>éZߎô­SHÖ|X©«¥þ’Ù%…̉5î-ÒëîÏø$ŸìÝâÙ'þ Éû)|ñ͆¥¤xßÂßo|Cã] W–ÊmKÃ~/øŸâï|Vñ?…îäÓÑlüÏ kž6¿ÐB÷Ri©ÞßÊ{>uö|Ó‚„ÕG”/6î’Wåi$ÝÞ®íÛF·²wÒï¯kk箟wŸ)ÿRý»üeû|#ø[§üðvƒãÏÚKöøÏáÙãöÐ<]<ðx*ËÇ3¸ëâŸ-•冧uáݽ¥«Xé—PÝ]ëÆÓÛéßn¹…g¿„ðUo…¿>j?ÿl_µ7Âë~'Ÿã'…ÇìÝað[Åß l.<â‹ÿ Y|ñ_ƒ¼Y-¯ôM?âM¯„´+×øá¦ñׄõ=WQ{¿í#6ßÿÁÀ? 5íYÿ‚nþÞvZ‰¼Ià¿Ø#ö»ð¯Ä/ŒvžÓŽ®ÞøK¯xÛáW‹|GãGM¶SªÜYèZŸÁýHi,Çj)üHøGð‹á'íEðsâçÄ·ºõŸ‚ýtëØþþþÜðZoÚ—ö½ÿ‚ª~Ì?³'ˆ~ø—JøûJx«Àÿ¾.~Ð~𗃿fè~7øSÃÞÒ|;ðÏáß~+x·â‰á­>-'Ä8µñ¶›á{O…ÚœúôwZ§‹¢¸¹û÷âíIûrø§ã¿ìóÿ¬ø7ñ?áw„ÿký+ö;ð¿ÆÿÛsöÉÖ<gñ#ÂÞ ¾´Ñ4_ëúŸÁ„Ëmð÷ÃÞ"ñ‰þ)jv^(°‡Æz„ü¥xgÄIáFk»Í#Eùwþ=ÿ)ÿƒƒÿìõìõz~ÚÕóüö<ýŽü-ÿ¾Ô>6ÁJ|{©þÅß¶7À­HðÅøÃÆÞø_àOÚ{áï‡< àû ľ7øiâojÞI>|/»–Öߌ·¨ÞøæMM|Û]òïÂzµVPåŠå¦¥X)9OÙÁü-¥+&åË¢mjÝå_•;îìîú_ú×t~£þÌ¿µïíMð/þ 4ŸðL/ÛwãÃßÚÄgÝ?ã¯ì÷û@øoá~•ð?Äþ2mÿ-<[á/øDñ&³áY5ƒcàokZZøJÚÑlôÿ ë7·†êÞþ(t^ƒö£ð—ükÃ!ñ·ÄËø+¯ì±û#øEñ'¼Mà…¾*ý™¾\xSSøsgâ ÛÏèß¾.ü_ø‘oâ [ˆ¼/caaã/ø3IÐííµ Ý~çM]®—qoâß²?ìóÿû|ý°¾ÜþÄ×?|UûVjãøcuð[ö–ø¿û@ÇáË5øMã£ãcÅPÛü_øƒðûAÑçð#ø‹A‚ûÆVȲkšÖ“g¢ ×g°žßó7þ uûxŸVýº~+Á^‡À‰·å§íuãïÞü0øð ø§ãKï èúo‡.|+àŸÙ³àÛÄž-ñ¶£ñXñ¿…ü áo‡þ×õýSMµð‡…4Û'·‹I³r¦Üã¹chÊŒ/6å(¹F›n1–­^ÒÑ-Jòow§¼öÓKèÛ×EÛ©õ”Ÿ¶oÇïø*ïü[öŠøéáŠÚ/ìÓñ7á/ƒi þÔÖøU£üDðÏÆŸü7ýü[â|"Ð-¼y~—? ì~/xSÇ~Õæñÿ†õ wÄ~Ô­oôí[Å’å ‡þ ùøWûXøWöý–¿i{öõOý‹<7£þÒšö³ûKû1ü-YiZ?Ä_Žš&£w/í"5øYž]·Ä y¾0?üJ¾êÿÈý&¾pÿ‚ øÄŸàŸðR߆~²þÒñwÄ_~Ù>𮟗_·ø“Åß±‡Áïèv[‘%uûV§¨ZÁ”ŠGfUáOÔ¿ðFïþÎß¿à‹^ÿ‚vj?~øsöø—ðŸöØø«|ºøàÍ#㎙wñÇ´§uscðÓV¿“Åòɦx#ăÅr]Â3{ii¦YÞßÝÄöšu÷—UŒjÂ)(ªé?r2q‹„®õM«t–ëdÐ/²õø{½ýß?øsÙ>|gÿ‚§ÁKþÞ~Û¿³7í!ðŸöCø!}âo‰Öÿ³¯ìã¯þκÆ}ã?…| «ßx:ÞÿãÇÄí{Åz}ïµ[Æ~ñ½—Â[7²Ò-ç‘.õ5­¼ò}ýÿžý¼“þ /ûxö…Ô´ÝBøƒ¥«ü<ø½áïJçEѾ&xJ=>Mgû2ÎãPÕu 'K×´[Bñv£êº…è¾"Ó ¹½¾Â_\ÿ0¿ðMØãþqðïáOüßÂ? ¾ ~ÝÿüsñÁ?¼;ûBþÓ?gÝkU’?êš×‚µi1|kðWµÝþMgÚ-ÿ‚ìÝ5S£K­2_Ûêvšö³ý=ÿÁ0<+ÿöðWÁO‰~ÿ‚jÙXCðKøíâK꺊>%xß¾$ø²¾øf¾%Ö|%㉾!ñE÷ˆôH|8<¡I©xgV—ÂYÑ5{m8>£m«\ÜEe¥{²\’Tã¨êµš“u•š”•Ý®¬›Aþëw}:t·T»˜?ðYßÚ+ãìÿÕý¤~?üñ‡ü ?<ÿ {þ/ÿÂ?áoÿdÿÂSñïáo‚µïøø×Dñ†oþßáŸë:güLôkϲý³í–gÔ-í.àü¤øßûXÁ[>Á4þÁSu/ÚGà_ü#žøEû5xÛÇÿ²õ§ÀMXO~øËÃ/>!|n“RÐuxËÄz猭¾!Iàoƒß>ø[À2x†ëÁi¬xêÃÂÐkZïÝÿðq?ü¡ËöÂÿ»~ÿÖ¥ø#_~ß¿òªÏ?ìÊ?àš¿ú˜~ÊÔRK’•ãåˆämÆ2n-BëTí»ÕjžÍ]Š[½^‘ovµ¹úûiÿÁMn~~Éÿ²Å/ÙÏÂ:O޾4ÁA¼EðCá÷ìŸáßͨiþ±ñÇýJ×¼3âÿˆÑÚ­ˆäð¯†lµÍ%uM/Hµƒ[Ô5}SHÒÙt«k›íGNùö‡ý¤ÿ࡟ðJþο?kÿÚßá'íeû2|zý¢t_ƒ?tˆg |Õ¾Éã¯x›^Òu‡þ.ðç¯×Ä>ðŠøoV¾½Ô~#Ûê:åׇô9 ¼—ûKT]WKüûÿ‚~Ìv¿à–ŸðBŸÚoÆ?ü]ñKà‡ìŸðŸöZºý¨<á¿ûYý™þ%|ø{ñ_Ä) ^i>-†ÞÆËᆠ˫øg[Ó/|?mâ›­j{›[)5ÝÚðø†š—ÀYK¦.£¦øGÀß¶í ãOŠšÔÓ 6Z&—ð—Ãßoþ#Kâ=FwŠÊÓB¹ðÕ®¡öÉ£†æ`$t¨Æœb½ÙM9TŒÔiÆrѵ©9'•¤¹UÛz·k"íõKDõm.:«é¿üÓÙö¤ý¡?áï·§ìQñÛâ$¾#ø¤ü,øUû@~É>¹ð‚tq¤ü2Ô›¥üF^#ðŸ…tmc]‹NñŸŒt¿ y?Öum|Ÿ ÜÞhÿh°MWR¸óØ·þ ñóâÿü›ö€øcñ'RŠÙCâûüjÓÿa¨Žàk6µÔÿbïhß¾=˜µ=F±ñn¿Ä?êWÞ>Ñÿá)×|E6›£i‚+ mÕç±ç_ø-Äß~Àß¶×ì¯ÿøs໯êgÚoö0ñCXC©êZ‡Žgð¦£ñöZð冓¤Ü=ók!øÁ}t&Ôlô}Q¥ðé÷­k<~¹µïÿjÙ{Nÿ‚{~ÀÿðN^ Ó´é1xÇÚ.“ðÈêÑxÇYÔ|M¤jš-ÆŸ¦IÜZµœ¦æ]æà»/ÙsÆ¿²÷ü‹ûIÃñAñ„üeñ×âWÃú—…¼OÚ–‰¦xŸö‘ý™üàìXG7Ze¾»à_‡ÞñZéú«ÏªÛͯÎ/>ÆÌº]‡G"çjPŠŠÅB÷R‹œ¹¢ô\Ѳ‹ÖöÑ+'bo¦úò6õëeoMþgì'ì'ñ“þ ñËGý‘¿koÚ?_ýœ>~Äv³ô=øËáH/-¼AûBü{Ó¥ø®ÝhŸ5fоÉàéþ8ñÕdž>0ÚxÁ&øu?„|+7ü"úµ¾§qi}¡ê_³_Åïø*?ü/á÷ü6GìíûU|-ý‡?gËÿˆ5Ó¾|Õfÿ ||ñ7Å_ø_‹ÃRß|xñ߉|Icwà鵯øsÄzlö_ !¶¹ÒtÛÛáo©jwVÚ>°>äýš>Gñóþ·û?ü –ö}6/?ðKß…_ ¤Ômd†+›þ#~Ê:ƒÞöÞ[‹{»x§µ]dÏ “ÚÜÂ’F­-¼È6üáÿ‚*þÛ_³/ìûxöHý¯>5|3ý—ÿh_Ù+Ç_<ñOáOÇxsá猡¸Ö~*øË↟¨økI×µX.9¶‹NÔ|šÍ¾¥-³ÿg‹»yl®ï£uRP§8ÍAEAI(77ÍÊî›r´yÚVZ]òݽU÷¶¶K½úŸ\þȵŸíÿ!ý‘h?†þø¡þÆ·oìóñš÷öuø¯ñ?Â_¼9ñ»Àþñ÷Ãè·~%ño>üAÕ"ÓuÏ üEðÞ—â_ÛØx¦ý/¼/ªÝjú–Ÿ>£ý£Þ_|£ÿzÿ‚¤ügø‡ÿ¬ý¬?n?Û‹â ÿÅýWöyøÃñf{¤ø?á¿õ{ïx+à¿ÁŸhžÒ4¿xwÁŸWÕüSâÍ^ÏKÔukau-þ½omª:ÒÒ;N£þð¯]Õuø(÷íç} x§Ã>ý¾¿kÏ|Fø9iâ}?ûüCð{Dñ§ÅxSÇV=ÌÚ¶vž Ô~0x‡LIu ‡Žú/ Ãu§Aö'QÕ$à“³gŠk¯ø7;þ )ðÀ¶:†­ãŸ~Òþ8×ü¡éWº‡ˆüaðÇá×ì—ñWÂþ¶ŸS`Fñ>»à› þÓ-ª4z‹¢ßiîË}oN4ÿ{¢¢ªQ»²¼ï핹¬š²Wi[MÛb½—~W×{ZÝOÔm_ãü3_ýŠuoø*†ûMþÏžðœ?5¿Úgß°‡ü3]¯Œ</Á»]ÿâ^ƒ?‰¾?ßøËCø­yñóáqµ½ÕWC´Ðü+5ì1ÛéöZ{\KzžíûBÿÁbnôßø'ÿìûEþÍ>ðï‹~=~ß~2ð'Á¯€ž ñV«öÏxGâÇŠu+¿ ø±¼uy¤ßY_jZ?ÃÏ麇…/¬´»«këͦÛ^µªjR[þI~ß²×üuñöPøK­þÓV_>~Ò~ð6‰àïÚ?Áÿk/¾$Ø|kðm’øoâUÍ×Ã]k㯅d·ÏŠ´SZµ²ð®—go¨Á§Ã¦éòèÖ>—û~|ý›<û/ÿÁ"¿nØ;ÁÞ,¿ý‰?àŸ_¶?ˆ|sy¦èø÷Åé?5ŸÚCDñ_ÄïŠ |D¿Õþ%k~“âwÁû©ô^}FæÒãBñÅŽ«hxb]6m9¸ÓsŒ\%¥F“t” ×,¹`ÜdÜܤ£ÊäîÕÛlv½ú+Ùߪ»µ´²néh´?b| ðþ áKÕÒümÿøñWAø¢|QÒ|SâAû#øoÁž.ý˜|G¯|$ñ¸ø_âï‚öúWŒ“Ã_4Oüd_=/è1_ø£ÂoªÇ©êÍ#KiüòÁ%¿gÛãâí§ÿ‹ð×Áø)'ü3çć?µ ¦…ñëâgü1çÁŠÿðÑþ2oŠÿµ ‚xëþÏk–Z'Áÿ/[ÐüeâøF<=ö”ÿðe¾Éá)æþ¬¼ÿ&ý…>)üHøGð‹á'íEðsâçÄ·ºõŸ‚JׄTœ`Ô}”×´I¾^[4µ[5u‰\¯t×[¾©[[õ?¬J(¢¹K (¢€ (¢€ (¢€ (¢€>!ÿ‚‘ÿÉŒþÒ_öOßÿOZEÁHÿäÆi/û'ïÿ§­"Šõ0?—ý|úL §ºôýYü„ÿÁÛ_ò’‚?öaõ:øÓ_ËQŸðv×ü¤ƒàý˜_À_ýN¾4×òç_êƒòkø/þÄðÿÓõωÌßqã_úLBŠ+ZËIšëdŽ|¨ de98Y¶å D™1…2:Éþ“R¤)GšrQ^}_d–­úmZÔèAά”b»êÛì’Õ¿B½´—2$qà *Ü™6™`¤f8ÛÌpH;]‘¤·ÐàHä¹’F,Ð#•UéwS–fVòØ(« •¶R5BXd`‚Iv ’R‹µZBŠ¡ˆÇW$(QÅ>¼ŠØêµTïN:]-[w¾öO—¥­ïkÍ£å_?‰ÌëUv¤Ý(hÚM7&߽ʟ&ÊÍ{Ú¹+K’0ˆ!¾@C'•µ‰hÖ=¡LihÁT:Fª¯µK†*”ª’¤€JÊH«m+•'¡Ú̹íb:Rloaþ}³Wì4ˋ۫[xáÅÅÄ0“lN%x”á¶²© *6X«Açt«YÊQ’I]¹ÉFÉ.Òiì­eä»zö•IÊOevÝ®­kôVZô²ìŒÚ®Ö¶í$2˜ÂÉ !hÊ(à'îʆ@20(™vᘴž0L‘J€wxÞ+É`1ó¿ï:ŒTB'líRÛT±À'u'ŽîNîiûñÕFZÝ7 'º³MÁ½Ó³OtíÔ´ƒ²ç„¤ž‹š-ŦžÖm5ÌŸF®»‰#Ø('88ã'Ò½‡Áº’HmØ#HÒ¡”cxidÈPWr‰’¹!تwœy†–ö°Ü#]YKx§Ê—fÔ.]@;ÖÞr¤>ѹƒ.-˜©_®¾jžŽâ¹ð~£pÆG ñ{A‚ÅeAáÙØÃ´ó„±Rà|êáðé*U=å+:qmÁ.H¥:–ŽNêJ*Rq³q÷—©—R‹¼ôsrQOÞÒ-ÅY]$äå¥âÝ¥Ëï%{ýð×áDZÕ¢GEµ ˜@™2^Ä€’ÙR<½òD$?cÜ$»âTò›ß—p'xµ–¶”#]Ö…Ô0;iæ+¸Òê+˧mí¢^½Ï’¨Ÿ™f9®&Ž*”=GyûNiI|2HèáZÊ)¶ãðÊRŒ–Ñ{Ôá 7%Fé^^ï¾¢šJ-4šµÞªVÓ—Þ‡~C¦K:[GçªStQ"Ži6…v„Eñ€dœìu¨Ü hÈù'•`WaÁd9É?­?§ð8’|ø>öT yOH‘ïU-ŸðŽÉæ¤É•!~RŒ7HY›áÏéš ä² O ^[>ùš2Þ&ûR«’ -»HµûÎ`¦@©ÀçlöfaV1R”'’W©*¼’KÝšU\~9}›µÈÛm.Jô£8Ê2³Ã8´÷M[áÛÞKó%~Y+Úïä§Ý³˜Ö K‚ë·c ´hò2ƒÐ¶È¤eUË6Ò1ª…Ò¾­ð‡€.5¿YX-´¬·oˆ'1¾Ö¬¼1®jLÉ! Û‘l›*#ó ²®à+Ïî|+*F|ÛhŠ0QµíÌe‹p¦EUã–S¼1UÞn¼±ØiÍÅÒqjåjuný÷5{IK™>GÊ•–]î¼¹e‘Þ5Z»væQk¥“”¥NÚ¿‹–Í5e¥åáÏ:”‘ѱ”u §•`AÁŒŽ¨¬CLŽrfŠ,ÉÆôˆ¤Lçs1`͈ËH\¬¯ ,I“Asêš…ö3yy·s’#‰ŽæÎÖ2¯ð«(u¡³‘ÅËm,R×üã_h>0ðŠô}GÃÞ(ð§Št}?Äñ&¬ZKa«hzþ…«[ÝézƪXÏ=–£¦j6·6W¶“Kos°Èèw¨¯ä˽5zmåéØú£Ï~ü$øSðoÁÖÿþü2ø{ð¯áý¤Ú…ŧ¾ø/Ã~ðu­Æ­<—Z¬öþðÆ›¥è°Í©ÜÍ-Ρ,v*÷³Ë$×-$ŽÌy þÌ_³_üsªüOð_ìõð;ÂõÙ!—[ø‡á„ÞðÿŽu™mÕRÞ]WźNi¯ê@Š© Ýê4Jª¨T¸ÑNï]^»êõõïóËþ$|ø/ñü4ÿ¾ü/ø¨þ ×-(ø‹ã‡‡¾ü+Ð~5x¿Aµð¯‹>/èß|%¥üQñG†,mü?ieáÏ|@±Ò ñf· ÙÚøK¶ֺ>¥«\éööþðü1[¤z.š¶Þ©E{]ÚÖµú^öô¾¾ ygо|ñ×ü#ñ3Æß¾xÇâG€ ÛxâоxKÄ>7ðK_Äߟø¯VÒ.õï ›ØcŽ+³£_Ù˜‘#›z*€ïüø-ð³Ä¼cðÃáÂï‡.ø·­¯‰~+x§À~ðŸ„úÖe)5µå•ÔrÛ\ÛÊ„¬ÏÇ"’¬¤W˜|"ýŸ¾~ÏÚf¯¢|ø%ð‹àޝßŪëºGÂ/†Þ øm¦kz½¸´ƒRÕì<¢è¶š•ü6ж±^^E5Ävê!I0½vŠ›»Zîݺ}ÃWðßàÀƒwšö¡ð‡àŸÂ?…Wþ*Õ/uÏ_|7øoàß^x“ZÔš6ÔuzçÃ6—6±ª_´Q5=ÅÝÓEži )·E+»5wgºèíµýòïüø-ð³Ä¼cðÃáÂï‡.ø·­¯‰~+x§À~🄠Ÿ‰ëñ¸üøX~4.ÿâü]?¼$~'¯‡¼óuý„¾>:Gü%cFûK5ÇöXÕ¾Ãç±›Èó jõ:)ÝêîîônïUÙ÷˾üø-ð ×¾øðƒáwÁ_êZÝωu |%ð„þxrÿÄw–n—wâ ÝÁÚN¦]kwZf¤i×:¬ö²_Ïa¥i¶’ÎÖö6±Å¡~ͳ§…þ)jŸ|5ð ে~5ë\Úë_4/…~Ò>)k×–Ö¶Wvú§Ä ?B·ñf¡Õ•¥Ì7z¼ÑÏmgkªÑ[ĉíTQw®¯]õzú÷Æþ'þΟ³çÆÛ­÷ã?ÀŸƒ_/<={o©hþx'Ç×Z£hZßè÷+ÐõitËÛa#‹{«'‚xC¸ŽEÜsêšV“¥hZu¦¢iš~¤é𭽆—¥Y[iÚu•º’V K+Há¶¶…I%b†$@I!FMhQEÝ­we²¾‹äñá§ÃŸŒ Ö>|Zð‚~(ü>ñöü$ø‹á] ÆÞ ײu[wJþØðljl5=SþÌÖôÍ7XÓþÛc?ص]>ÇP¶ò®í šÐüáOh>ðg†43¾ð‡´}?EðLJ¼1¢éði:7‡4=M·¶Ò´IÒ­­´Í3G°´·Óì4ûx,­mâ¶Š8—Ëáï øSÂÚ>Ÿáÿ xo@Ñí"°Òt=BÒmí4½GÒì`‚ËNÓ4ë[k++Hb·¶‚(cD>~ܼeñƒö,ý¯¾ü:Ñÿá"øƒñGö^øÿðëÀ¾þÐÒ´ŸíßxÛáG‹|5áûW]¾Ó4M3ûO[Ôìl¿´5KOÒ¬¼ÿ´êÖ–‘M<PÑM6š}SO^éÜÆ/ø$¯üãLø-ûþÈžý°ÿfO„ƒöšø~5[Ïxcá/Å/|8>6øõñ;ÆZið¯Ä=¼cg¦gÂúî¨ÜŸ xœ”Yâ±Ô|›û;‹KÖˆ¿ >ü`ðn±ðëâ×€<ñGá÷ˆ¿³ÿá ð/Ä_ è^6ðn»ý“ªØëºWödžéÙýà|9ûbüZý´>Xü:ðÿìYûh?´Õ׌-üW£ø§ÄÚßíðûàg†~I§'…ìü­ê¾ñ^“¨êßt]Sû_Ä·zG‚Ć‘eà·´h®.5ý.%ñø#üïXÿ‚mþźÀ¯ëz'ˆ~'ø£Æþ%ø·ñ_QðÅÆ§uá¤ñ·Šl4 =+B¸ÕRÞâæËAð„|+¡Í{Ÿ¥[êz†}ªE§Bo^I¿Thªç|œ‰$›NM^òjö½ÛVWv²^wzŠÚßúéþGˆxÏödý›~#øÇFø‰ñ ö|ø!ãψ’I¼=ã¯ü'ðŠü¼×µ„?þü*¿ñV©{®x¢ûá¿ÃøóĚ֤Ѷ£¬k×>Ñ´¹µRý¢‰¯u Aî.îš(ÌóHQH¡ñöký>1øÃ1ø»ð à§ÅOx&uºðgо#ü+ð/ŽñfÒ®­$[«;€Â[h=ªŠ.ï{»÷»¿ÞER¢Š(¢Š(¢Š(¢Š(âø)ü˜Ïí%ÿdýÿôõ¤QGüþLgö’ÿ²~ÿúzÒ(¯Sü)×Çÿ¤ÀÊ{¯OÕŸÈOüµÿ) ø#ÿfðÿS¯5ü¹×õÿmÊH>ÿÙ…üÿÔëãM.¨#A¹›;W  µrFælaPeˆD ÌÿP<ÓÂþ ¿ý áÿ§ëŸ™4±¸–Ý’Û{%ËYL´w!] DƒtŸ+Áà+2Ë!nv.Û”F$#¶UUPªª€ªªUP0€àÀ «ii¬hªŠT£:–;þl™0ßu¥Â´€gc‹{¤1p œ‘_]‰¬ñR…ÜW»÷wÕÚí^O¯d—Cáñد¬Õ¼\•8.XEí¾²²m^]ûYt¸ª¥½‡­t–“2ç}¼dp˜Û3ÅNåuùJœîVŒæÞ‰¤ð—W¯¹A·‰†á†Á0?.HÉ@À€™Ã#Õ4}K—RɺO½µ²#@AÇ›ò“–#„8Ëæ*r×ÅG xQåuýåggÊöp§}OÝr³rwI;+o…Á]*•R³Ò0i·wf´M^vוé×;M¤¹+ SoÙm‘¹|â™|ã,gäg•.«ÈÚ¼^“ðûÂÓê~<ðNšZ)´|]á».7ý¯Y³·ÙÌMÞfÞúôMÀÍ0Œ˜\ ' ¾Z¡Ä`~T!¥*@VPþÏ? ÍçÇ‚–/2ÝüYøqjªÊŽ¡.<_¢Äмgh߃ |¾Š¿;Ì£ Uç9¹ÍR©4å$›å‹}y›]ZrOuÊ^§£$ÒIÞoV’\±qŠ[¨¨ÅÙèßUùÔú-À«ÆØÇÊ–<ö,±¯žHèq“X—Z2DàËj±ÈAH—al¨æP£iÃoE`¹†+í+χŒñà@¦>¬„),r»~UiÙÀnxQ·†!±•ó=oÁ2Úy…a1²³0ý^õ(ä2±`¢68#˜°Y¹P•µ|%+FrŒ´M)&Ö׿-¯{윛¿ÂöKÙí(¨»>eÈÜ'u¢”Tœ£ewm#'ÍÒé1&•Wi(‘‹3`7Œ•ó’£*|ÅQ¸»«(2®ãú™ÒïK!Ë;ƒòÎ $g-¯¶RHB ­WBx]ÄQ°™91rÂD¢$n'‚pÄ’rŸ+.Êæ–93÷'iÿôš¯ŒQ´'[Ýå¼#)¦¼Ú]I½,­±›šŒ•íËy6”T“w”ÜWºª&âÞéÉ&ù®ï÷O€¾'}‚ÔÛÇ; š! Á‰Ø¬°„2}žUÊÝ屃r–3Ê$ ÇÑÏÅVþÃð‹Phd:Eû,¦YQ·Ãâß"¸™[í3P ’8·*2Ç”*¿•^½qfïs³¼C¢–£Ȩ´d0elˆÌrFDlŒþɦø–mKOÒaY' gaqgdmÉý±uó"’±>û¢6*Ñ€ìÇÍd¯?¸¹ÊeN£óÚª§)'*r÷íË9E4ÓM§vÓq´®µŽ.žª2z­\T칯É+ßš1mEÅ¥&ío¤f—¹vœdéÎU%ÉNöo›ÞI´Ô}íT[KEª²Ñ7k]|Óû<þÏ“ê_4HÚÔ"|Sw‰X¿”°ü$ñôê\CHð‘UÈ,’nyOÖ¾\ZÄlŒ¨`…›fIÄ¡U# ˜v›Â²;ùÒìóû8ßè¿t«=[G676žø˜$Ž$&ØÇ©|ñìOgwè§µ»²™Òæ d´š Ã'›ƒço~ÍÜZê/-¤vN‘h—:έ}-µ…²Ûyq*˜É—÷ÅŦ—¦Ûº»º+–Gu4?#ƒâܺ®" Qœ>§p•NjМ¥ˆÇsZ;KÚ%IBהܹ`”‘Ù,-wI{ÍËšm¯{UÉMõïnåîݧÜ™üÐø»áâØY!b›i E%B>g2uÜK 2”p˜uO™üUá©-çÆ™¸V ˆ ¨ÀŒü亅x’A¶FΫ°§ÜX¿lþ<|8±¶’wÓ¬E½¤i‰eH¾×sòÌ·¸“d—#²¶ÒºG ¯Ì/ˆâ‰Éæ[32±òÎv#¿È²ÊŠ70.¸-’?láìÝT…*”Ti¯v2§òÂi8ÇMéÎÎ*×MhÔ¢ÏAIJ»ÞÝÿįªk{ÛÕYØOø'ªãöýý‡=íƒû3ãÿO‚«ýQkü´?`Ûsü+ö#àí—öÂý™î’¤‘/ÆŸ?/EùŠ €ÛT‘†?ê__ÇLUõ—ƒ'hUÈqµ"·åRÇFñÓOvWV謪àh¸as½ãŠ‚û©ïóÜ(¢Šþ9>ä(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šø‡þ Gÿ&3ûIÙ?ý=iQÿ#ÿ“ý¤¿ìŸ¿þž´Š+ÔÀÿ _õñÿé02žëÓõgòÿmÊH>ÿÙ…üÿÔëãM0ÚD"[؉`<£æØÌÌX‚?u$jöÒ4l /”ÞnÒ?§Ÿø;kþRAðGþÌ/à/þ§_kù˜Ðc M&AÜ%RTm»¢Wc–!þiR6EQåi6§ϓŽ}^K­¾Ö"´z¦¶oÍ­¬ìÏϳúžÎxé'fÚ‚ÛyÆ1êšÙ·mÚVZØèëOK´7wQFW)Ÿ2^ y(A`JÃyÄ`ƒ]NGZÌ®¿Ãq.e (•¹ÜÌÎ=0ÄFz“•íŽ~ÆötëV_8%Úu"—ªMµéÞÇÅá骕c¯yKÑkgäÝ¢úë¡èºƒO(uŒ…V%\¨.F1…Úw0%B¥¾Bk靸i–HÉó““0‘UVE, ‡%m8Pw2dzk´† lEos2d»iá_²?f„ª>;ü˜Ù™ O‹¿ &™ðcaãÝü¤TAˆ ÜæîÚ4\’švJvo•ÊRiÂòO¢n^õ¹b´M·#ñßZø8›7=³Æ"`n]ìÛäU™¥u™|ø‘J .õùüÆß ÍŽžÚ­ÚHšyóÉ$Wi¯nb•xíØDö["ì.n]@¶r-ñ,³(oÛI¾é¶ÚD¾$×ãž– =>V;ÿj¢Êún$¤5¥¥¶cmW[kw‡K„p¥Ö¥sck'Ä_ô©5;«›Éá··@©miaBßOÓlÕœZiö6‡Îh-`w–23ͺêæêiGúŒŸ6¡‰©Ò‡´TÖµjÉÔ»jÜ•IU|Í.iJ-F÷-í¡zÔ¥M)ó7v•Òå’kùôNú{»ó-y¬šŒ,ðâÙ´›Aò%$¨dlÁ'Ì Q±°®¡” è£ 0Š?žõ«3ezèCþð¼ŒÌ>S#Hå„gje6”eÚêÄá…}éñAŠ)¯mö¿<‘çi' Á÷¾å%a`Ãh½…à øçÅÖèapDÀa쨎Id4r"òNvŒ±ý‹,α‡&”êÚ ÖIÆêVºZ^2ŽÊê)Ù^Ç—QuoU¿}{ïÝ?›_å^Äg™æuˆÌjÔ²úr§íŽuU)T¯*¥†ös­:“«8P‚q©Vq´©NúŒ],=éò©U»kÞ›nÑ»Ïm#ËÍ'ðE6â¤×çíð§àpKàß´¶‡hÍ$»£“àׯY¹å E§†å20@‹"¬Ñ™10D>1ü7ø!c=ÑÓÿimU“lëQüø¿k¹›|‚Y æƒ p4 *ªÅ˜Õæ8 _t~Ñž2–ÚûQÒî¡ÞÁ 2"Ì$Œ« ÖÓÚ\[mî­¤ßþ‡ µ½ÔS¥Å¼²¢JÏøÿñCYVºœG&ý­2‚„+¬@ù’‡mÅY_~ß¾J¶ö? NT(Ñ”óLΪp¤â£‡Ê¹ZW¼¹¥—SŸ"nð´ß3æRrQ>C¹¥RÔ©ÇYjÝk»ÉE}¶®å¢ºZjí£;_Ø·Cð•Ÿüö!—Hñ宼cý¯?f•´òü+â!®Â|gðS”Ý«ÚÛªbG!XĘ2bBUUÏúwWùmþÃný¿ÿa(ùÿ“Ãý›$ÉìãWÕUpxƒ¸c&¿Ô’¿œþ–¿­g\+Öj>1ö΋Ÿ/ö‚Jþ•(YÙ»ò¶ÝÕì‘ô<# yŒmýb“n*i>j)§iJ]jÖVjê÷ (¢¿’ϰ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€>!ÿ‚‘ÿÉŒþÒ_öOßÿOZEÁHÿäÆi/û'ïÿ§­"Šõ0?—ý|úL §ºôýYü„ÿÁÛ_ò’‚?öaõ:øÓ_͆Ž-ØüŽØ@2 lg J˜3peK¹U"% kú_ÿƒ¶¿å$ìÂþÿêuñ¦¿™XöËÀ—-+|Ÿ3Æh˜L_(ÊreVB1 ?鯅)¿ ø:Ý2ŠMé}"·Ý­µ×³ÑÝ~sĉ¹bíÒ¬ѽmµ¶¶k£²m®¦ c‰·Im Èãä™®x<ÿǽŻóÐüÿB5ì~ ñ>‡c †ëáïƒu€³€ñê7~?ˆ0*„;¶“ã-ETeU IRÎXøµu~™D—¡¤Hä^€Ÿ,°`2ß| |¸b,GØT¦ªa± óÞ*”­ ÎŒei_’Q½”¯}Ö÷>[QÆ´U£ª’WŒ7^þ²k™§f’N÷²]¿¾|Qð=¬±¬ÿ³‡ÁD‹{pd½×?hdcòHrÂÃãÍŒ}>^ £‘œ“úð·â÷ÃÓ4kÿ ½ð"ÌÀL¾"ý¦w©eºEEó¿h¹"&Gù@hÙ‹HU;þ:x>ÿd¶Å˜°#c(ÚxIxÃ1åX¸$nä‚À°8ûOáæ¼›9´[T1Aˆ”™Ø¿,»%q(`M >ÒáóL¾œÔ£ÏŠ^Ö7úî6Ñæ¥ìÓiWµœÝšvI&ìõGÒB}ùlªN-òAi&š•ùonWuuï=õjÿ¹ ~&øå¬^Ùÿá™fßç[ë_H1I½øÛtœ;¾ô¡¸P0ôà‰´$ñWƒµGø}à Xêþ*Ðt-2m2ëâUÎ¥«ê—Å…ºÿfZk?5 6[}îx¯µ OP´»´±d†(áºÔ.ííåü:ø?â]*8áÕ5ë‡]&!ò´ëYÖÚûYº@é¶“´.mÖ ¹¾ÕÞ*ÆÙ#h’{«Èb›ô à¯Å+Ÿ|gøJ÷f3ˆßôë; ÐØiºzø«LŽÖÂÒÚwšK{hA`¯!’êâC=õÝÍÕåÝÍÄ¿‘æ™jôñΚÄZ•*Žnx¼K´ãIóÓ´êNí(+É''ÊÓ“¼=”a¾^e)' ®eªnÉ5y'®úBüBñ·‡5+(|Emð·áö­¤Cga¦´7ÿmåðà€·Òn¬ô¯‰v6¶–ÍåÏsgsmikk#ÜÎU¯Zð¿Á?þ&ø".oÙûàýÓy—@wãÔeY Ì-¾7ÛçÏÚñc ÝíeÁÛ¹ø¯6’æX¼© šƒQÓ¯—}®£`Ç|¶—PDñfZ0ëp 2ÚÏ SÁqñÃ,_|hñ “ÚÍ­øvêVЮíÚÒyV[½QLe¨7”±˜Ôoº³½h£¶¿ `½[ûH½¼›+–]8F¼1MÕ­Ñö8ìm8¹rÂ*p«O–܉©8{éÊéY)eˆ¨ª&¢à¥'NéºsQŒ¢µI©i-yoÈ•ô¹á>0|<[»ðß³À‡ÊɉŸÄ_´¸2y‘J²Ÿ´JDKBì@˜x?&ßÏÿˆ_ü wö”·ýž¾Y1‘œ-¦µûAHZê2²+^ür½Ïš“—`6®ÅMß7¡üAÖãu¸íæ>â…JŒ(O+-óá‚`>`2†Ël*¿ø®óÌ’`á¥0ª°˜âÎᑞR|ÛŠ?XÊk:1³Uÿw'Ë)æ”Ô—,`¯‹ïîÉok[Ý<éÅ;9ZÒ—JtÕᜟÁ&šQ¶©ëwÕœ¯‹¼G¢Þº\[|>ðv” Mk[ÿˆ³÷€ D¿ñž¦p…ÎÚBÛÈežoHÕK,XÛØ˜äi´–ñãi•X¡ºžâdØcy›÷(‘òùºÜìL‘ IÇm¬ÒLì²X†Œ*¦w`D‡l‹ŒRðΛ®øƒ[²Ð<;e%ˇ¼°Yä-yt¨7I/xÑ ”·ÿÜì·ÿyø | ñ7ÀŸø7Ãu¿ƒž³¼Ö¥Ñ5kûÿÇà{XÓIšÿLy"mf×X°¼šÚÎk[Ù5]SY¹Ôt»Ñ-ĺ‹ép>*ø³¡~κ<ªCyñ+]ˆ>½âÐÉqku4qG4löÁíyš!p©[GhÖÂÄ>š’A¨gxÅ^ µ‚âK›ëƒ¨x€;êìnäi.Ú9F m¯dYGÚMnºƒ ýÛ^"NÑ?•EüE_Ä^9ñl©ÓXŒ/ åsö’sœçO‚riU©yrWÍñéMS¥Õ%Ì ž Z´¾ýÓÂä4§¬¬ÜV®«³öi$ÿuIÛ™µ}Rrç’ŒªyÿࢯƯzEì…î•àmKø²|3¡Ï<’ÝÜIqðŸÇ6Ñø‹]Ey¡þÓ¼GŠ1Ì:Dìê —Ú…ßç7Š>?Ë{bè·&G1€OšŒ… ^vÉ.ÍåÈ¢7 åÄwL<ì:È<<ñnçIñ%ž /%vŠÃÄÐi$¨xS]ÓÜ"pÊŽ/ˆ(#up3çš§Ä«™ (.%d “–(ŠÁ{KûÆgÜB‘‡!QH\ÿAå\—e\˜l RÃPÃa©R‹“•¥N¦&U'R|ª­J•]E*“œùç''9JW·ÍUÅβr©UIÎr”äÓmS\‘ŒdïɺƒMA7e©ô'į‹“_Ù½•ÕãÝ%ˆh¬žYKËk;3A ­fuŽÝ?sŽ5(MðÏŠõö¿–\»w.KnÙÄa òÂ…±å™ZwÅ3Þ³€ù\3og*R |ÅXȉ´ ¨XˆÀmÍã:Þªn]­Õ@Ž9s¼;“!ã+òªªçî²»+(—æïòܶÑ%+ʤÔRŒ"ÚæåŒl›œ›vÜœ›´®Ùçbq£ NJWRI-#)TiÉs4š‹V|ªÞçÄýå?«¿`ƽÿ‚ƒþÃ’œ…?¶į̀„ƒ²1ñ«ÁEW ä±ã«“Ö¿Õ¿Ê«þ ãÿ'ÿû ÙáþÌßúº¼_ê«_È¿Jy)gü+eË“ã#Þü±Ž2)/Õ¾­·»>“‚¤ç‡Ì''yKM¾‹ZoeÑ-’Z%¢Ð(®'Pø—ðçIÒ¾"뺯ü¦hŸþÝÿ kXÔÉàÝwGñ<þ^‰©Ù_O·?‰|9kâ=+Á×^ Ñ-¼]®èž ñ.‡áiõ[|G¬øsÂwþÒüSâ +C’uÔõÃZŸ<§xƒU´µšÃF¿ñg†­5í®5Ý.;¯å‹>ßÖÿ–§ÛtQEQEW⯈¾ ðN»ðÓÃ^'Ö?³5¿Œ6¿øuðêËû?U½ÿ„‹ÆZgßüZ¾ÑþÓ§ØÝÚi>GÃï…Þ:ñö†»>™¥Ký…ý• ôšÞ§£éº‡mGë°Q@‰ªø—Úÿ†´½sÄ&©øÓ[ŸÃ^Óµ]VÃN¿ñgˆí|9âÝxÃV—sÃq®ëvÞðŸŠ|S>•¥Çu‡<5â rHLѵ«lO†Ÿ|ñƒáÏ€>-|:Ö?á"ø}ñGÁ>ø‹à_gêºOöïƒ|m¡Xx—ÃÇöV»c¦kzgöž‰©ØÞÿgënŸªÙyÿfÔ,m.âšË=í§¿üŸÜÀí¨¢± ñ/‡.¼Gªø:×Ä%Ï‹´-Ãþ%×<-«a7ˆôox²ÿĺ_…¼AªèqÎÚž¢x—Sð_Œtïê·v°Øk7þñ-¦=ÍÆ…ªGj·EywůŒ¿þørËÄßun}_[¶ð׆ôø+Çþ xÏÄw6–²|?à…ÿ <9ã‰>?Öì¼9¡ø‹Åúƕ࿠k·úü-âßk0XxGÂ~#Ö´¾ÛÃ^ °ñg‡ð6袊(¬Oø—Þ ð爩®xƒÄæ©=®™£hš6™ku¨êº®£uma§X[Oww<6ðÉ"x—×^#Õ|kâ çÅÚ‰áÿ랃U°›Äz7‡GÃï…Þ:ñö†»>™¥Ký…ý• ôšÞ§£éºý}ÛÛQX“ø—Ö¾#Ò¼uâ ÛÅÚî‰âè~ŸU°‡Äzχ<'á­/Å> Ò´9']OQÑ<5©øÓÁÚwˆ5[KY¬4kÿxjÓQžÚã]ÒãºÛ Š( Š+ør×ÄzWƒ®¼A¢[x»]ÑGÃï…Þ:ñö†»>™¥Ký…ý• ôšÞ§£éº‡mGë°Q@ÄßüEðn™ñ¿ oµ#â¼ãÿˆ¾ðÿö~«/öŸƒ~k¿ <5ã­cûV4K/ì-oãë/ìýCR´Õu?øH¾Ó£ØêšN»>™ÛQúìEPEPE‰‰|9uâ=WÁÖ¾ Ñ.|]¡hžñ.¹áh5[ ¼G£xsÅ—þ%Òü-â WCŽvÔôíĺŸ‚üc§xU»µ†ÃY¿ðŸ‰m4éîn4-R;P º(¬HÿÙ…üÿÔëãM.Ñ8ŽHä °GG*®Ñ± Áˆ¿2Œ_™O#‘_é÷ƒÑRð·ƒbÕÓÉ ¬›Wýý}.šüýt>5‚ž+®¤ídÚ¿¹+¦ºùÛ¾‡¢Õí>é­nb˜q¼s†¾YÀ?ÂI@¬[ ¯µÛ,¥É’²ÖEE~ |Ī2n ²–ݵˆÅ\>•õq½*’HéïS©ñ–~R]ì™ð-N…[5iÓž©ßx¿“iü®Ÿ™íš6 ‘º|Å6Ò’#ƒ”“wl%‰;†$üȪ~Œð_гÄÒ:©Œ•‘:‚X²ò ò ³8bÊÀo_8Å>-ÑõqlÞr|’ÙŽ@Ô1$°#(ÌCg ¡Ë`†ãÔô­nKS2Œ*L¤#0Ë"´¨ê¸7оN?kÂ^õ9]ÓŸÙœ{^×_—‹¾Ž2wú 6"5¢¥]”gÕÚKHßO~*êËž:FÒV¦> ø“%±´w¹‘á†8ã’ÈŠ"dDŒJÄ$`KÛ¤üÃç3Ÿ·¿g/‹–ÇãgÁe{ç\|Wøn‹nܬ ø.ðMä·ñ›:ÊdI!A·i*D,¡@o˜’+†y ke¸™7iÖ£‰å¼ªû’§9¯å´¬ÔfÚ|®KF¶umV:¿vPÒ\É­Tšj÷ºõ],Ú³_dk?!òCvó›’$i2&æÉË;.áˆÃ‹„?1ýÛ(“wÎ~!ø¡s M ¹2AsÙ®í‹#[ÞÛ)±ÜDìï|²ªF¸‚p× *\ˆÞ¾vÕ<{/’L£ŒìS)wY‰,O–‹¾rÀý㵃`1 mÞ_­xÊi·Ÿ4Æ­‘æÈÌY‚¹Hò]€ýÛ‚å¶r ¨Æe1§V”¤•7)IÂ)EÊzÂ3ÞÍB-éÚNÖI2”ô»z¶½È®iK–Íyï­´‹Ik̽ޗƞ&Iå”ÛHq!.f,ÖêAg;ˆÑ²+I´Èw¼ªä0>jw¢i^S‘k…®p: f'’C1@Äjî§«Év_æ*„–‘Ù†[‚Ç…UU¿"c‚ØBœMÌ÷…ÌnŸ ÜÝÜɲÒÚ ¾lòb\—Âà vy¤ýÕ¼K%ÍÆ!†_/w<&]„¯ŒÆâ(àð8:2¯ŒÅâ&©Ñ¡F’¼çR¤­eÞ×÷§'¤n⋌%Zj‹“n0´-+&ýÚPiÚU*4¶v­u%™­5-sT±Òô»S©êS½½¬e‰g-Í<Ì‚g‚ÂÐ4bâ-Ú#¶âšæ{K{YñoŠôoÙ‹ÃZ‘pš·Æ?À«zcU}I­ü‚#v–ÖÒÙ&¸‚ Dœí‘î- {‹éüA¬ =kÄìËágÕgê_¼M‹[MÄ.…lйŽeVužÒ8¼÷xCEÄM<—OZ½ôsi^%ð«áæ±âíy¾#xÒIoµZàjšr\“(ˆÎ3k¨Ü#¶ÔTÉ‹F³WØÛ$RGù6Ëoü¡ÄÜIŸxáÄønÈ#[Ây]olêÎ3Œ#B2pžs™A4ªbg Jfµ8:Žœ\*UÅU‡ÕPÂa2:U1ÕW>?F׃”}Ȩa¨[áŠi:’Õ¥')(Æ*߆úÔ÷óxÃÅÍsqâH½ÄPÞ!–êݧdynnUÇš·ÏáQ„K87@åevŽÓì‡> ¼Õ|O¥i±[³C¬¶ÒÏɳðî¯~&vŒù#fgË›ÊT ¡bxý' f”¦mÝKg.Ž]×r"¸Ü«ò°.À±XWwÌ¡Y¾Ñý> µ÷Åo[›9Á›Lñ«FB²ÆÄ|7ñ|Æ]Åc@SoœM&ì1V*»›÷ì£.ɸ+!–W’ÐT°¸\=jõkÔiׯbÖÅâ++{Jõ97*µ8F:Q…téÇçëU¯®ªV›u%8¥ iòSW\±“iÚ+™ú7)k&Ü¿/N™©YìœDAh]RC*Ë.Tü›˜«¶Ï)¤Ë)ð¬[N3*™0œIyL ¡ ¤†Î7*©!”äá€j? 6q“˜’€•QÊ‘Â¬Í e#IXŽ­#áÕɸ|ùã/Ëeæ 2#`²ðFöCˆeC†âL2g#&U¯©£…I%++»)-/fì´n2³vqM4·nVG"¥(7ÉÏ~Vœ$œe(´”œFº=Ÿ-ÝãxŸ"ëŒËjË€ªy%‰¶v…[F!²»2Èí,+ƒn§üãüþ^œW´kš7d†hÛÊvhÜ1>b>Ñ’X(U-¹¶$2tÈ'>;s C4‘²•hÝ‘9ÁR@ù°»Ã†"¾ %S (E{ÔæªI&á%nefÛ³µú$ÓÐñ³ÙÑ’·,bá¢z·)M6ß[7¬¬à÷[}Cÿþºž/ø(_ìo¹ rþÙ?³63•?¼6¼oæ8*¢#ªcE•”´Aþ­õþSŸðOØ¿ðPØAÏžL?¶gìÀábÚÉ“ñ»Àß<ÈÅIT®ô%¢3•d +ýXëøÇéQ(¼ï„9b“Y6=NËy}z6oÍ«ztÒÇÞðd¡,¾¿,c*éTåVæ—"´Ÿ›´éÓKŸ¼5â;ŸÚãâO쑦x[Ÿá·í¿ñGöEý£þ!x¢÷J¿Õì&ðçÃ/xãBý­| ©iðYh>7ýž|að¯öý?e¯‹^Öæ6ñüÚçâ^¹ã|SøaðS]ùÄ~-ý£OÃÏj7—~6Ÿâü÷àŸÀߨ«Äß¼]ã_|4¹ø•¡|Qÿ‚‚xká—í½ñ{ã×ÇôxëàOü'±oìuû<~ØïñKÂowñöYøûXj¿´+øÏâ=¦­ðoâ¶Ÿû“ñkö¤øEð_Äv^ñ[|Qñ'‹®ôKoÜø[à·ìÿñûöñ‡|9¨ßêZ^…âè³çÃ/‰úŸÃýÅšž…âm;Á¯Ž-|=aã›ÿxæÓÂëwñtz)¡þÓÿ ¼OãcÁ~»Öüco¦ü.ý™¾0i¾6ð7Äø·ÀÿµŸÄŠ~k^ÔþÉâOVѧð—\ñŒ/üZðçÁ_ é>1ñM–·¦k?~ü%µƒÃöÖWñøãïÆŸ| ðuìñj:–•nº&›âïˆú£â[˜î¥¿³ð宫w¥éºÎ§¦‘}ê5<ú¹rèÜzÞê*Î-µwÍu{üïp¶ÞKüµùXþy¾ø‡BøÏáïØÿÀ~ý®¾6]~Ø´7‚|Eà¯ø)gƒ¼ û^üFñŸÅ¿Ùßþ?ؓ㞱ñ‹Å³~Î>%ñ û øÛáoí¥gðÃú½àß‚ÿ ¿áJ|OºðÇÀ½Óþñ…ïÃ?šgÇ_ÛÃã/öGü%VŸð¯?᱿áýƒ5øV9Ô|;ÿ ‹ãÁ?øSßð×þ)ýŸüωÚïü+ŸŸ·ಿbø¹©ÂAáoÿ¿dOøEfñßÚ|ÿ ?úñÿ “û?ÿÂÆÿ…gÿ ¿´?á6ÿ…iÿ ÷ü)OÿðÏÿ𱿷áÿ„þ‡þÏü3oü&ßð±¿âÐÿÂ+ÿ [ûwþüXÿ°ÂÜÿŠ.¾¡ªs³»†ëNoVôÑi~T¼£n·BO¿oÓüŸÞ~y~ÝÞ ÿ…‹ñþ Ûà§ño¼i¯þÚþ+´Õuï‡Z÷ü"ž2m ?ø'ßíßwâ Gñl—ß„á.Ñ-õ j-ðe߇~#x_JÖïµï†~5ðÄ?Ã^5Ð> ø³ñ‹HøTÿ¿f¿øÃ[µømðÏö¼¹Ð¾|Rý¤?ॴßì[àxsKýŒ¿c¯‹º—ÂþÝ^½øñëâgÅüDý¨¾&xóá?Á‰º¯Š¬$ø­¤|$ø»áÿÚÂðNCûføçÄ¿?h†Ñ|Uøƒñö.ýœßâÆÆùÛá‡ÆsÃÿþ0ë?µ<ú.£ñ{áw„ÿh¨o/øV?øƒþ -ûR\ürºý™4/ÛUðæ—¤Aÿ†ð·Á/ü ]ÆŸ°öh¾ø¥uom¤Zü3×t¯Ûׯ?¼'¬C®|SÑ¿£Jâl>"ø7Søâ¯„¶:ÇŸñÁ> ðÄ_øû?U‹û3Á¿u߉~ð.±ý«5Œz%ïöî·ðâ-—ö~Ÿ©]êºgü#¿iÖ,tûM[BŸS~Ñ;ûŠÚ½ÒïDݵŠ\ªÍYÙ_{Ÿ{íú~:oÒççŸü—À¿ 5~¿>4xÛÆß ¾ü-ý¨|g7Å/Ší ñoöpðoÃoøÏöAý§|7¤øŸÇ_þüGøm§ø+ûcâãü(øiákºî™ª¦«ño„^×aÓþ5x«Âž5ü×ðΟñ§ökÿ‚jÁ;~.~Í?hoþÑ_?d;¿Øhº‡ŒüYñWÚ´ÚGü3öý > xáŸì»vš§À [ðgÅŸ‚?tÏkø/añWÆÖ}#â/‹~#kþ/ê??¦ª)F¥¢£k¥Ñ½÷´µ»Êï]l´º¸[[ßúÓü¿ñGþ ñãûÏþѺ•ÃŒßüsðŽßàŸŽ®þ%xcà÷üïöªÿ‚©çâ0ñ×ÂH~kÞ"ñ×Ç„úw†fŸì¿ Ëñ³OÒ<%¤üEÐußÚûwSÖ#ðWôÿ€úïÃÃö¥Õ¾#xËþ Uð›à-‡ÆÏŸ~øÛþÓÅZÂωt-wà'üWÄþ?Ðmæ°’OøG¿áe˜øi¥x£Å¾M â6•ÿO‚<]àø'âg߆ž:ðoíuq>?ø‹àß…Ú‡‰|u¬ahšŸ¾|:±½þÏÕu??Æ_>#xWá/íìÚ=Ž¡wü$_|máÿhMzV“ý§ý«®ßiš%–¡©Z÷“j:¸ò¥~gw³»M·Úþ—°[K_·án/mÃo|&Ò<ûF|øâ¿þÐÚ€~ÿÁW|_ðká|°~Õ_´Þ‘ñCøãø"^µûMëúv«ñ‹Eø¹§|_ñ¦¶¿üKâmCÃþ5ñÇŽ¼IãøÄþ%ø;áè_üC¬ø÷åï‰æÒbÿøëáí[ñG\ý¼uÏÙö‹ñ/üáî•ûZ|UñÿŽ>xKÿ‚mþÓ>#øƒÄ¿³.£ñ?Ä>ý‰u¿†ÿ·/†¾ xb WáçÂï‚7ÿ¾ ^øà7†§ð~‹ã;Ÿ‡ºçõ ¥x‚ÃY¿ñ.i· Ç„õ¸:Öþèzü ¿³ç‡>ø7áºÿð›~ÍšÁˆ:ƒ|[á—|!ñ/â7ÁM+àÇ«¿þÔ?îçýµÿà£_³¥ðŸOñV»ñGUñ/ìÃû"x7þ I©|%ø'ðëá]íý†‰ñãeÞ·û$|+Õl~=|CþÖß¼ew¬xGÆŸ´.­ðûÅW>ƒ÷’Š•SK5}~wæòþòÿÀWȳ¾ÿÖŸäþóùDño‹üCñÓÁ¿µ÷ì×ðÄ?ð´üñ7þ yûtxê=7ögÿ‚—~ÛðRÍ+âÇ„š¯ìñeð‡Á>øµñWáÿƒáñ¶ÿ C^ÓX|xðÇ„¼ ûZxÚÿþ ÙàŸÙo‹_ìmŸ‹~#ðo‡<â;Ÿø-æ¥â}CöйøÉ©øóáßü$ÿµGÂoÙ¯áF±ã­/ã_‡5_ê¾øuû4êzíÿ„/ì¾_ÿC4U:ªÖåv×í6îíï]¦ù’IEôóVHKÏ·Kmm=4ÕyŸ€c›ãÿíq¤|ð—í5ûCx—ö%µÑ?m oàÖ¹ðÏö¨ø«¬Ø|søà¿Á"oC'í[¦øÛYøÕñ7DøuûP|_ý¥ll>!xWãzøãÂ>#Ѽgû8Âykð_Nñ÷Á Oè|Køaÿýº¼[iãÿEãoƒ~ ÿ‚¯øá¿ÄøJµ×øáÍ öiø½ûUü(ø'ÿ K÷ñ¶±ãox'á·‚­?áeëÚö©ñÄzî‹ÿ ¯‹|U¯xÛQÕ¼Cö¿Ä_Û'öøWã-cÁ>2ñ¢»ð§öü,/xkà§Æÿ|$øEý¡¥Xø¿áy|rðßüøýàíWEø…âÏø\=ðOü! 5ÿ|Oñwö'Ãïhž%¿ú†“›÷o’qjÿjͶïew+«¾¶^I yüº-ù~'á·í³c­þÍþ#ýžü¨übÖî>xïDý£|{ñ—â—í[ÿ,ý¡¿a¿x‹ö±¿ýš4¯†Ií;ðÃ^!¸ð>·âOê?¼EàïØ»áFð‹ölÖ¬-¾$üAðÂþhvº?—ü.ø‘ánóCÑnßÚwÆÚÃæø'¢k¿²üý­ÿkï‡_ð¼µ_þÕ_¶–‰¨øà_Ä/¿ìßûCÁH¼máÙ矱/„(»ýª£ñçÆèfŠOu&ÿ™JÏvôѤõ³kt­è[]þ_wùiê/_ m­WáçüÇö³OŒŸ´¿´ÿÚwÇŸ±GÃ_гN•∞2Öÿhßi^"ÿ‚?~É—?¾ ø~ CSø¯©ø'Lý£tÏŽ3ñçÆ_XKàßøëŸ>&x÷Åz¾ øŸâ]ëÈm|qñ×þ sñ“à_‹>9þÐÞø7¤kµ«yðûáŸÆßˆ ,5«~ÌðBýgÂ~Ox#ZÑ|sàmþ9øÑñ â„ÿ ¼UðóÄsxÅ>3Òu/_øâ—ÆüCý(ðwü+ŸØïÀ?±‡ì³¥Âm®hšŸü"ß²_Â]cPþÂÔõTÿ…?û5|Iø‹¦ë_u oøF-íß¿gÏZßj^ðôŸiñ–§£Á†ôÍööûEö»ÿˆ¾ Ó>#xWá-ö±ä|Añ·‚|ñÃþÏÕeþÓðoÂíwᧆ¼u¬jÃc&‰eý…­ü`øueýŸ¨jVš®§ÿ Út{BÓI×gÓš»q†êVwèÒJIrénF÷ÑÝÝX5¶¯k}úo¯_–çà‡þ/üaÖjyô]Gâ÷Âï þÑPþÞ^%ð¬~ ñü[ö¤¹øåuû2h_¶«áÍ/Hƒþ áo‚^%øº'?aí:Ñ|5ñJêÞÛHµøg®é_·¯Œ~%xOX‡\ø§£øAâÍÃÂß¼ð§Á¶ øuñ/DðïôiE/j¬Ò‹WMi.é«jŸ»­ÔU’¶o>ß…·îôßÌü6ÿ‚¨h³x+ãOh?ø»âþ*xö ý»<û8jÞøÁñWÂñ_í›gâÏÙgÆß²_Áü9Ñ|e¦|6ø¿ñGâÿˆôψ7:Wìë¬øGÆOûQØ|<ƒBñ§ÃïŠZÂižöÏÙ‡Æßo?k x[ö4ý¥u¿ÚCà†¥û<üpñíuí‰ñ3öÞðçþ*øâOì×§~Î0j¾1ø™ñwãmÇÁ}oÅ^ñGí3'‡ü5 kž ‡âõ‡†|Kªk:WŒ_á‘wàßÕÚòïüeøãÿÝø;ÃºŽ·‹´ï…ß þ2êÞñ/‚¼qàèþ5_üCÒþê> ÐümáÏjz·«ê > éÚ¯‚µ›[x>ÿÃsÚxÓÞ¸¼Ó#½\íÁFÍò¦¯},ÛµÕº7îë£Ô-¯Îþ}? 5î~yÿÂmð6ûöÕøÃáÿÚ“ö•ÖþüTðïí ð{Ãÿ±¿ÁÝWöÄø™û7Ø|KøUð+övñ‡çð×ì÷á/‹¿ ¼ûJèž)ý©|GñßÁsø—Å~ø›7üG£øƒà~«ªëZÃËxoâ‹k¿‰Ÿ¿àœðO/Œú¯ÇŠ>8¸ý¥´OÙ{[ý²>*þÒ?·?Ç/ÙËáþŸðþóö6ø¹ã¶·ûFü:Ò¼Fÿ²&ˆŸß௃‡Ä/„¾ ðoŽ?iGðûáßí ãÏŠ>.ø½ãø¯ö»â‡í?ð«áF·ªx[\»ÖõohZßì¡¥k¾ðþ4×úE‡íûCÝþÌŸ¡«É£xrëDºø“£x¦OÁ¥ëš‡ˆôxOUÕ$ðýÍÆ¡á}?Ä?CSçi+ÅÛÝZ¿åMWæRß{=íbÚï÷|·û­èì9pþÐ)§|‹Ãßþ%ü.Õ¾ø·ö†ñÆ»ð'ãßðWÛ7àïìÉà¿øáÁ]7WøE/ün/…>ø¿ûQüQñÇÅÿˆßñ7‚µ—ˆ|eñ³Àÿü+û/Ác>þÍ3ÿÂïý¥tŸµþÔ?m?xö ý™?áø†>k´OÆÏèŸ5ÏÿÂ¥ý þ Ý|lý´¿áQý§ö“øOñ#Å åÒ¼'ý]ÑMUKhumûÏTÔ“V·[¦Þí«»·p³Ó]­Óµ¿ÉýçâüãÇ÷ž-ý£u+†ÿ¾ øçá¿Á?]üJðÇÁïø)ßíUÿSÏÄa㯄ü ×¼E㯎ÿ ôï þÍ?Ù~—ãfŸ¤xKIø‹ ë¿´öGà¯éÿ/õ߇ž)ÿTýª/>k¿´±ðúóþ_Ž_³ÏÁ=[Vøegâø(íUðKâ7uß|9½øÇ¢|lø/ÿïø9ðóâwÂ?Û àŸÃÝCÄ7><ø‘ñƒOÒ¾ëïÁ¾>Iá¿¿õÿ§ïô °¹ñ«áhàÖ×SÑ´Oø‚îê xŽ×ÓXx–ÿĺv•ã­*ëºÝµÇ„õIgÕ’·3»ë¬­wu¥ôÓd[K_]5·ktÙmò?/à¦z·ÃQýu‹¿?áž>¯í¯­Úx×âÇü, à÷ö&…©~Áÿ·›w ÿÂÔפ´ÿ…}ÿ íiðëþß ëø¢ÂWöï…^5ð?Äȼ%âýä/ƒ1Íñÿö¸Ò> øKöšý¡¼KûÚ蟶†·ðk\øgûT|UÖl>9ü?ð_„?à‘7¡“ö­Ó|m¬üjø›¢|:ý¨>/þÒ¶6¼+ñ½|qáèÞ3ýœ?á<µø/§xûà†§ûÿ^]«|Zðæñ§Àn¬µ¹<]ñáwÅÿ‹Z£µƒxr×ß|Yð?ÁÞ)²ÕnäÔ¢ÔàÖïõ?¾ŸÃöÖšEõ…Õ†›âYuKJ¸³Òíu•ÙY&ÚŒ’×Eñ>d­¤•ÝôWµ®óê¿M>vüOÃßµEå‡ím ê¿ /?á øŒŸ¶¿ìÕð/Å^Õà µV½ñßuÚ{áWìÛãÿxóþ saðóÆ²¿Ã/‚¼©ß¿Âo?ñw„t/ø[ã'Áo^ñ‹ûI|Oøiá þ$jß´oÁÿø'¿ìûFüøÙûPüUý®?iÙ{ÄšÝÿ~$xëã—ü'~)›þ 7ûR~ÒŸ ´ ~Ï:üš÷Á4ñ¶‹ñ³àßÁ¥Ð|[áO„0ücøÿÍÝŸÅüLñÅ_Œz¯Ä¯é>Š~Ñ$’†ÛÞWºI¤µ_ ÝíµÖ×Ô-®ÿÖŸåøŸŠ?³¾£û&êðQŸƒW²Ç_~Ðz"~Ŷ|>/ñÿí_ûB~ØŸtÍU~:Á>ßMðÇ…~&|Xø­ñƒáö…ãk+I'Õ|à_‡Þ%±ñ–™¡k_ è·~5Ü|MýÉ¢—´Õ;7¢ZÊïâæzÛª÷vÙõZ_š}¶I~ŸÕç/Ãÿþ0ë?µ<ú.£ñ{áw„ÿh¨o/øV?øƒþ -ûR\ürºý™4/ÛUðæ—¤Aÿ†ð·Á/ü ]ÆŸ°öh¾ø¥uom¤Zü3×t¯Ûׯ?¼'¬C®|SѶõ?Ž¿·‡Á¯íøEm?áaÿÃÿÂEûißð³üs¨ø‹þïÆ?Ÿð¸á#aÁ¾ÛñsMÿ„ÂÞÿ‡€þ×ð•MàO³xûþƒú¢Ÿ´_È­Ù¶þîÊͤ¶Wºê™o7ý[~û}Í£ó_öÝ7ÿ³§ìà½Ëö‘ø£ðâßáÇÅø'×Ã_~ÔÞ+øƒáÅø«¥økÏÙ¯á×ÄŠ_þ"xÓDºð6³­ë>ºñ©ñCWñ÷…µ/‡þ*‡Rñ$~;ð®«áWYЮ¾ÿ„‡Bø‡ûO|ø)û+þ×_;x:Êyu7U·mRñwÃNñ-´v±_ÞxrëU´Òõ-SžÓW±õJiE«]·-tI]FÎÖwi§mt»î k÷~wï×g¡øûJøÛ _ößðþµûJüQðíaðKD³ðÿü àî«ûb|ið¿Ž>.Øxsö2ø)â?‚3økö{¼ø»ceûvë~5ý²õ/‹ž ¸ñ/Å¿|~ñLj_ˆ>øÛUñÝ„cð&Ž~Ýÿ>&|6ý®>#èÚÄ=oEø!âýöñ/Ç»‰Ÿ¶OÇ/Ùgào€|9â/ÁV´|@ÿ´_‚m|u¯~ÆÚ'>*|ý”´ CUø7¢øÃã'ÄÍ;ÁŸ üe=ûühñsø÷þ¼SáßÁ +À¾+üZ¿ñ—¾!üAø³ÿö‰âŸÚÿÂ)ðÃÀºïÄü4ø9á-+À ð.‰ÿOÃoâ¿Ä»Ý_ñV›â¯‹zßü&vÞ?ø›ã;M°h T]Uío»÷vi{¶årݾgt;~wÓå¿Ý÷h~|5ø«¤__ø"Ãö¡ý«ôO~ÁÚηûOêþ'|3ÿ‚ˆþÓw_ ¬þ x_ß°¯Â†iÿ<ñt?³/ÅOÚ;[Ôõï~Þ>2°ðd|àxæµñŸÃ2úεû!CáÏ‚¿Ciúì›û?~Û?iŸüuñ¶ðÎïþ åû4|Eøã wö¯ý¡> ø7㯃~x{öÚÖ>6ëð•×Åoé?µŸü*ÿÙõ~ü[ñ>ŸaáÏ‹¯…µ_ˆ0þÐ ciñ3ãVµãïþ×QC©{«4ši¥-Ów¾Û»Y·{­õÔVùíÓk$´íú\(¢ŠÈgÄ?ðR?ù1ŸÚKþÉûÿéëH¢ø)ü˜Ïí%ÿdýÿôõ¤Q^¦øRÿ¯ÿI”÷^Ÿ«?Ÿø;kþRAðGþÌ/à/þ§_kùs¯ê3þÚÿ”|ÿ³ ø ÿ©×Æšþ\ëý@ðoþMÿØžú~¹ñ9ûî#ükÿI‰~ÆôÙÈ x˜3hU›‘²’² )0³ù2 ÊÊ7–º:ȉ"£ªºœ•`Ndp@#¸¼æ´-5+‹CòŸ1£.ŽXåcCE$™M£pRG•å£}ö/ í½úvUÕ=ö·’i_^º'¥šùì~â-R••TÓvSÚÞJI_Þë¢}îA#¥lØk7€GÄЃþªBr£ˆ¤ä 8) €ä„’yè'IÔ²•$uØáÔà”,‡†h¼Ä’4‘‘<Ã2©M¬g¯)MÅ:u"§ ëN}x½á/5mwW>}J¥»7 Åê´zöiÝ=öiØô[_Ÿ>ˤ#=Ô•*éŸ9~Q•Áƒ²˜×fçí¼?ãUµ×4{ÄÔWuž«¦Ý ÐyC0ß[¸Ã‡ÌJÈ¡¤áQ˜x”L|´# S†R¤d‚¬)çæR@"¦Y]YIVV ¬¤†RC)a䂾چõJ4Z­Iª1„Ö’ÜR’’’oVÞ–VÖëd?¯VçnJ2×gš·MÙYkw¦®÷g§ËâQ0xÆ „Fß;XPa¶³‰[qà†Œ‚ s·ž"·á廀r§ ä~s·ø•$ÀNÀáf•Œ„m#nŒ7‹.œ|ÛNà­•8v³24–y#†$’iftŠ(bF’Ie‘‚Gq /$’;*""³»ª WÈæòËéb±xŠÕd¨a¡'RugN*TèS½j•«6”)Ç–sœŸ*§ùåî6uC^P…*p¼æÒJŸ<§/v1‚ÕÉ®H¨·'Ì¥ey%yu;íBê xb{‹›™VÚÇO·š{© ò’4y7˜`¹–wX-Ñ$¸™à‚)$Or’ëAý›¼ Þ.ñ<ÐjŸðø 2YC°M ÞÉv¼¼±Ü‹»˜·’5[‹,øsLcNƒÃ?ü-ÄoGo{â»èŠxWÃM¼óÏ4ŠyÖTM95{¹òðßËn±Ä$±·/ò(›VøÅã-KÇ>;ÕVï¾Žúh¥Tf)eiºK$Z| [í2FQç¹–wM÷RÝKñ—q®uâ÷aø‚©N1¼©V<Ãêó‹žgqŒªC+Â6ªa¨¸Ê¥jžÎ¼èÏS †¡÷ÙfŽIƒyŽk4ñ’‹åŒÜm‡ö‘þ$Ú„±"¹e$ì’p‹PŒ§>ÁÞÖ>&x¢oˆ?™õ}rn­­î 2^´lî…árÅtÈv2A ¹{¹3=Áš6‘®ÿF>øcí2Àe‰dfa#«9g!V<ùà Ͷ2Ê1…ÜF×|?ð§€õ9íÆ§ñ_BðèM«¶üE¾Ž›+Š/Ãw‚@©ˆÙdŒ’ ®»K>ü3ø3"ÂÍûNø6,?ð©~< 4ežXþÉܶG–È¿>Uc?µd3•pGK%ÀÒÅN«”*fY‚ËñrÄc±RQS¯7G>JqNpÃPæš¡EF ÎnujyUñusʼœ»É{H¸Ræ›MÇšK^Uy·å{ÛHžûð?ᦗ®A“­l…ËG.‹­ùY]ãóÕ Z]ô³FÆ6}.ábºsyñ¯éìõðëAø½áË]BÁ ¹´´ñ¹¹‡ËI ‹?Ã?Gð²ÇåÍ ÚMöï™mqDÉ!ŠI+“ø%ðÃáý’XÿhO߇ËÇ_ ~3ÛdSÍ›í> DØIäà1’9·~Â~Ξð«©hð\üMѵ¯øF4I¦jöþñÞu£Û^øs]·6÷wzLJl,dÑž;Ã5­”—ûÞHY4Ü\3Û×ç|IÄ ±“ÿi…5‡ª¥ƒÅ¥ Ój<œÔI?rP³oJ‘NO–}˜j \Æ.\ÎÍÕŒTRjÉJSårM'Ì®ÓmJ/–Hü&Õ¿gY5+‰DV–š^Ÿcγª\¦û=*Ê-„<ÙæÓì! y¨ê0ÀŸ?|agq{ŸfmôØ¢ƒÏÞÌ‘³¹¾HÄ\K- [vX Ekhƒ——Ó÷Æ|9²·O Û|Vð߇´ )Râ;&ðĹgÕ¯fµÇü$¼Öž–Êêþþسi°ÙIqea§È`³–X.'»½ü~øßð·àÎÛ©'ý£ühGæ|+øá Ž_1 ìx|p¹v2ÆdS)Ü™,K+oõ¸s?JÐSúÛ§UÅrÇŒšQ“¦ãNŒÔªGãRN\®<ªüÉ<ñ8~]!Ëlí8¨]¤ÓRu9o+¤ÓqmÛÝ“?žˆ^û4Ó%r›Ð ÀPÙo)•¼Ò¡ƒHN‚\1Ø9ùsÄv¡%K´ŠLg,ñƒµñ·û˜\ç?*áG$þ¨ü\økð‚9®>ÏûHøBä .Æ…_!me1…7ˆ}¡¤ž@!b« Réùñã¯xFÔNºwÄM#VXç“& xâÀù›¾UµM Î8ão™NçË¡@Œo?¶d˜ÕSÙ>LBN3æÁã)¥ +YûJ1m¹k­ú7kiáã©ÆTæ›§yAJ?¼¦­.VúÉE+ÅIÝí)4ä×§Á2økRÖ¼¨øÏÀÚ¦·ðGÀÚæâo‹Sø;Åþ)ðçƒü9sm⻯Máý7_½ý“¢¿—ígmmõÓÝqj˧¯«î­±÷ó—á²ŸÂoü9ý˜5¿ÿÁLt-oþ ¿´¿Ç¯þÀßf¿ñGÅ_‡ÿ¶Ïìsâ/Ú?ÇŸÿiX¼ðçßµf‰iñ'Ã:·Æ?Šß‚i=j‹^ðŸ‰>/iŸ®|5¥ß|HÒ¿dÿd½þ¿‡:Ö•¯x+ÆÞø¹µ'øÿ­xþïþwâÆ6м65ŸŠ¶ìü%à üaðOŠü2¾O†ž&ðW„|áo|9Ó|+ðÓáìñ¨|Ôÿg„?PÑD¦äš¶íËWwwm?æ‹§}î’µ¼•¿¯ëô?5ÿd_‰ó|ø-û0þÅ~1øIûCj_þ ü.ø+û=ø¦O |ø«yðZþo‡ð×õÏ‹ý§uO hß³U×Âë¯ h×_t¨u‹:WÅYü'$ îþXþÓ-'À(¿<í¿ci¾ÿÁ8?àžQøsà^‰¡k×Ú'ì½­~ßšÅÙ[â¯í…â?xsñ·ÅÏ xsÂ?´‡ìÉáxö…ý¤4O„?´/~h >SW°ý—/ô_x§Ã~ ð¿€òéþþ(¦ª4ÛJÜÍJZîýí´µ—5ÕÓ³J÷ må¢ôÓ»ËCùˇិ¡ü‹À¾%øð»Æ¿³¯Ž¿ho|Qðlž?ÿ‚5~Ðß~ü¿ð·Â/‚¿ü-ðëàü·Ã?|SûJüÑ>(ø¦çöø“«|{ñëü6ðæ—ñ3Eø¿=ÏÃmSGý©þüMñŸ‰ëŸ²—Å]à/ˆ~;ý”uµý¥toÙçþ Ùû4ü Õ4ÏÙö_ˆÿhÿþØš>¹ÿÌÓ| „¼AñªãöZø]ðƒÂ>ñõÇì×ñ¢Ëã&£û6~Ê>ºÒ×Ãß´–áoxCÅ>4þ¨(ªUšéÖû珞D·O^¤ìµ¹m¼¿à‘ø£ÿøøImá¯Ú7RñŸÃß x'á·Ãë‚~:ðÇŽ¼5ð?þ ;ñãþ oðçž2ñ޾j¿5߉°~пu o㿼¢xKâ}‡Â™¼ðÏÄzWÂÍ Æ¿“ÆÞ:ðßÄŸøâ_ûp~Ìž ÚÛâOÆ Ùkþ}oâç‚àŸéß¼û8j¿õÝkÁ¿iï‹Z¿üWÃ-ñW€ü â½S@ÿ„óöÖü/ð›^ð/ïtWöÄøs-§ì½ð³Bø×­ØËð¶Û÷’ŠŸhù¹µÙ-Òm&¥«I'ª×MVžam•¿Úè~kþÄÞø¡üiý¡0Eðù4OØxoÃ^ ±ñ—ˆ¯¾jÚ'ƒþC×~èSø7öÃðÖ›û9xÙઞ.ÿ‡’„ý§¡ý˜>#[øÊÓþ.«ûGê²?ü#ðQÓðÞ/… þÏýœ¼Eð—á÷~ÓûHhð«´«} àMïü">$ð¼ÞÒy(£Ú;·g¯/]}ÕeÌíï'ö–—î‚Ûy}Ý:|´ì9~|"ø™âé°÷ì¥ñGàWÁ oöÑiÝ;áŸì—ñûö¿ñ7ˆæÿ‚˜Á7ücð·ÅÉiwðÃö}ñ÷µ¿„üû\ø¦Ããøõ«ÿٟמ3×5|3ˆzM׉½Cö—ý‡þÁâ? ¼û ø%¿f/ÿç?h«„þ ø¡\|$»ñOïÛoãö¥ûjxÃáï¿øJ_xÛãf¡ûxwDðÄÿü=ðÞ¿ñâà |#]ÅÑx£ÁÕ¿y(§íd¬•ìõ“m»Åݽ.ýÛ'e£·@²ý>]——‘øð»öEøñ{öòñ-׌ÿfn_Ùmã¶µðïÁ>ø+㇟o<9û!ÿÁ<'ðŸÂ>-ø=âï x[Â7ú&‘qðÃâe§ƒþüMðtö ø™ð+XÔl<¢üOø çûoÙFëDz§Å:ç>~ÐÚ—‡<¢x“àWìÏàï†ÿ¾ xÂö~ÿ‚ÿÁQ.þ|)³ºÒtTøwû:ü.Ñþüoý™ô¿(øí⟂³ÈøU®h2x3Çv_ ¾ø»QðgîMF×+WVеßÙmßÕ»_MmÓt[[ÿ]?ÈþC¼ û/üoƒðÄ¿‡ŸðŠ|gÖ?eïÙÂ_³‰üKÿ­ý ?jŸÚ‡à‡öOìû5|;ŽÓào퇣|køGðöñ·ÃïÚ³Ãÿu¿ ø+ãgˆ>ÿÂøØ—áoèžÓ.µ¿ø–ëNðþ•a£X\øÆž#Õ|cãOi§Amo6·âÏkºçŠ|KªÉ_ë¾#Öu]sTžëSÔnî¦'SŸu¶ÛY^×èžËg}[wè [úþ¿ ~á·ü* þ_±Ã9xÛþ'ÿ ÿ„ÿþcþƒâ7öïü2¯ü<7þWØ?áàð­ÿáVÂÿÕÿ‹aÿ ÓþíŸð®ã?áÿ„¿þ,å}¯ÿ¾ýœ<û?~ÅŸ³#Ãð£þׯ~Ëß³L?µ_hº­¿Æ={Æ^øQ£[§†>)øƒÅˆ7ð«®õmwÁžð/‰ïÛJø9ák{†~м#àíJðÖúE)Tm8ê“i½oµô]¢¯¢ÖÝØ[ü¿-û½Í„ßæý’´ü ñïÂOÚÆŸ5Úöªøµðá~ |ø«ñ?áÿÅ~Ò¿´ßÅÏ_ ì´ïš†Á…šÜ ñ6Ûá­¿iˆß,< ã xÅ~%Ô¬>ßxãOŒþøýáß‹~*ý­´ˆÞý—üá/ŒúOí¯û5i¾.ñŸ€?àîÿh öjð×í=ð«áÆ«ñbÿþ ”Ÿ¼ð£Æ~ ø³û9Zé·_þü+øñ/Çß>|QñWìûñcÂx;ágǯ‹^þ†h¦ªY¹[W{ë½ÞªÖÙöÞû4´e¾å²ôµ¾ëÍ€ýŠþ#|5ÿ‚{þÁ·²·Àÿ|9ý·¼mû/xƒá§Åωµ×|ûFÇ®ë¿ðI¿Ú’?øãOÆÏ^é^<ðo‚|ûTi_tøWâ_t/‡?$íÿÁRf¯øX¼5ñ‡Âá`|\Ø£öÌøð/⟄¾ÂkñáßíãwöñGìE¯ZxßAÐu_|ÿ„ÄÞøåâ/~Ò¾%Ôüð·öu×u{WñÅ_†Ú‡Ä þ×QKÚ>e.©5ê÷²]õÑ_°[Kz?ºßä~Q~Ì> øgûXxkÅ?±§ìÕ­þÍÿ4ßÙç㇇ÿh+X?c¿‰Ÿ±‡4k~ð…ÿi˜ü?â]Cñ¬?lø›aã)£J(U—2¿ÃË«Mï}[Vzé·Ã§˜[O»ºÚÛYéåÙê~Q|,øyâ=;öêÖ¼m¨|+ø£§þηßi¹>.©i'ÃÿþÐڿÿÙêÃâÆ;O…-à»mOán‰ñ›Sð·ía¤ü/ø«¬iž ÑÇŸµÄcñ{ãVÿOøáï |ñÿñý™<ð‡âì£ñ#âÇìµÿïÅÏÁ/?àžŸ¼ ñCPýœ5]WÆ^øñð?á'íá¿ÚSGø‹ñLð.¥¨~Ï6‹áŠ>|4¾Ô>1k¿.~(éZVð‹ÂÞ2Ô>jžðßï%{Gf­dâ¢ìÝì®×Þß½ß]¯t[[ÿ]?4gàíõû"ü?ñoíy­øïRý˜u¿ø»ãÆ·ÿ˜Ñ~üqøKðWÇ¿Ä xàíåâCöµñuïíð[ÃW3ý—õ½öZ×¾Y\ü`ñg¾_øŸÀþÓ|=ð÷ÆZíÇÂKMð–/íeû*ê¿>1ë^ýŸþx'áïì[cÿ ñâïÃö1ñ—íû*ø«U½ð·üÁ~>ÖÝþÑþ6Oˆ3~ÃsxÃOðÊM'tšQV½õmí Yzzhþ~½OÏ/ø&çÃíWáÿÂO‰¨Ðcø'Å_5?ü-ðv‰û(øËöøaà§Ã…^Õ´/ƒŸ²·Ä¯‰Ÿ>&|&ðN§ñ3üg¯ÃãˆگŽ>-ø¯âoÄÍÀ·~ ñ¯…~#|@üóÔþ~Þ µÿáEÝÿÂ7ÿ Ÿÿ ìû*íð6£â?샟´wü.øTÞ)ð×ößÃÂÇø'ð?þüçþçÅÏÂUâŸþ?l¿ßxÓÊñÇü4÷ô3E%Q§'dù­tÒé§d®Óiè¯w Yiåÿü‘ø7ûH|øaðgâ7‹~ÍûÿÂñøcû/Á7g€±xßöRø·ûjüø-ªü%×ॿüQàø?â‡Åÿ–ø]ªhZ%Æá†_x“Å?~xÇ_¾xSã«ñ«Â|Wă¿ ->~Ï_~þÇÞ ñŸÁ?ø'ÆÚïÀÍKö¦ÿ‚J|[ý§üeñãgÅO‹~:½øÛà[_„·Wÿ±Ç‚àž_mñ¶áOâðü ý—¾ é_|=Âx~|ýžµ«›OèfŠ~Õé½Õ¾Ö¨òÞÍ=m¿“z'f‹ziþiþŸ—cùËý–ÿe>-ýÿl‹>)ø_ñDÿÁBüCû<ü=ÑgωŸ®üYá¿>øÓâø#ìuðËÄ.øUã/Šº¦”ÿ ~(ø£ãyñ—Ãߌ<3©xCÅž'ñgãðŸÅïj'á&aá/køw¦þÏ? k ?öƒý’àŸ?~|+øgûþÛRüDÕ¾þÁúßìÏâ?Œ¿,>$þÆ6ðwÁ_ ü9ñŸ~ |Iñ×Å<9àÿ\ü5‡Å>Ò<ã;ÿjúÂßx›^ð·Æ}3áïîM:­·u£VµÚVqå·šVºìÛï¡eýnÝÓßÎÚ÷ (¢²QEQEQEQEQEQEñüþLgö’ÿ²~ÿúzÒ(£þ Gÿ&3ûIÙ?ý=iW©þ¿ëãÿÒ`e=×§êÏä'þÚÿ”|ÿ³ ø ÿ©×Æšþ\ëúŒÿƒ¶¿å$ìÂþÿêuñ¦¿—EVf  ³1 ª –f'9$ž“À¯õÁ¿ù5üÿbxéúçÄæ:cq íοô˜‰E}yð?ö+øÓñ¾[YôÞiÚ4­ “êV³£°Ý3¡UX Ç“™ƒ»c1m#wô™û Á¼d4ÿüBÑmüM©¦ï\ûBÆÝ”‚²ÙÃ<_`•„ŒdKq Rbó#*‘|·ˆ¿H_ü=\5\d³ìêK)ÉçF£¥+&ž79¬>š¼£õŠºÝP’RqôrŽ̳‰'F“£Bí ø]¢^_^\ÚYŧBòHÍåŠ<¶™•C+3HÆ%îŒ!rL„:ÿ xô‘ãoœòü'dri<»+«5V¾±”#™fòŒ1¥ +ª8zx<-D¹¥Bu#¿DËx+,ÊêG‹§f20rlE8Æ ô”¡Iß“EñÔ“•?y]FRGÅÁ&ÿd§ÑF?¿Åݤ¦™ Üq'™æyþY*ï&_hgQÃgÌ$"ñwüƒöPø€²Ã¤xz=í“Ìiô¹eµ•4i#xæ·L–! `©VQvnoÍÛ×þ ÍûJizÞŸoðú¼>V¹v×n4Ù`‡Q´µYÇÚ,a†=Ý»üÛ/ U†8ÃÍrQJ¼ü.ÿƒ†¿kÏ•ý­áç‡ òºxºx¬ß©VÎ3HÂνhÙ¼.RJ¤p^g ’„ªIÏRW~iĸêøÌTÜ£‡Š—°¤ídô眬ß5Ih›våK–7W”½ƒÂ·Ä›IU£WxöÐ$‘ª…b~bè˜ ¸0<û£á^¹ ´;Ê•`ŽYWåÈäåîÆë'bJ•,6þtøoQò\‡IÖå²@É㲪€Ê1†yòÇŸ¤ü â¡e4%PyÃauVT“*Æ2vç?9e$6ðû1…ô™¶óOÙ­¥í)¿³(7ÅÝZñIZË»Ù&V·´§ ·nuf×JŠw¾½ù“ÑÙ(ëªoúýŸ|[ åŪI}o§XÙÆ’ê—×Ûé¶(œÈ¾X–êpâ!kj„\^ݘc‚†Q(ýpø%ñŸI¾ñ…<3¢aá{X|[uke,‘¶¡©jxÅ/.©®Ê‚Pú…ÃaŠ"¶Ú5£=¥ªÊ“]]]ÿ.þ,Ëe´Þ4p ’f·VØï$l]É,ìdVv„ƒ“*™}õû8ü}{‰ÞWœ£?ÆÅ' äD>ø­"»n%cÉæGNcbìˆñ¼ÿ†êT†2­5xF…y(éÍZr÷¥8K$ÒœZƒ¿»8ÊRrõðõÔyiÍ>VÒå”Ômy'k4›IëxÉ»oÊÚåýñ?Åý ZÐÓCñ¡il#‰O‡uýÞrè¯4*’Yj\¬³xfî`gá¾Ñ¥LD¶ÒÍŸn#þ>ø†æÒúÿM¾ˆGrŽ$ž0ë,RÊö÷òE˜Ú+°a6·ù¶·P3J6ìUMk]wâwìâ_ø7Åž"‚âEºÓô«Ù,wv,ÿn…Å-åRÍ4—pÅc!¸PÂH¹ýkö_ý |i¦ÄºòxwÃУýŠãÄzäWz½š–™àþ‹[˜[¨iÌ6 o¬ÓãXášV<™}|“%Ä:˜¼Û´åya(ÕŽ+ ¤ês¼& VÄÅ)%9ª”£Ì’p÷¹½¦³§ˆÄF* ¨»8IÚ0m§i9ò¨s%;ÇÞmÞírµoË/‰úªO,áf ¥¼¡´HŠÉ ÅË µ$IQ€Ë€†øûÄ÷{¡+¾yÌ­ŒŒ .AQÜnÀÎNÐ9É`k÷K]ÿ‚_ø“Åß5mwÂÿ,õˆq^ꩤxPÑá½bßN‹J’] ñ§ÃÏjþ ñÿ†µø—C”ZÝèšåœ¶W‘# ðÝÆ®<»«+èØ]Xj6¯5•ýœ\ÙÜ\[¼r7éÜż3ÄuñX|£3†#•9m‡Ä`è)Ô§/gZ**‘jPiŧyAÊ)¸ÊmFêé.[«žûÿñçöÿý†¿ìðÿfoý]^ ¯õU¯ò§ÿ‚zH©ûþÂÀ‚ZOÛöeÆKÂèð[“’@#GvÉÉU!C9ToõX¯æ?¥-ÿ·¸U¾¹F5ÝõÿmŽ¿^÷=þMa1¯¾"¼íM«ú_KítÖ阚¯‰|9¡_økK×ñ?„g¯…×·‹$³ø¡ñÏ\ø{ðþîÃÀ5KI¦|7ñÝ߇¿5ÿlÿ~Ð~<|Iöuø/ñ³ãF·ûx'ÁÖŸ5?…<ø!ðÿÀ>ý¼5›Ÿ |×4Ú*ÏãÇOƒþ+×<{ð"?Ù¿á¼þ-ø ¤Þê7_³Wíyûn|ºñ¬ÚßÄ-CFðgÏ?µ7†߶ ÿü«ã'Áí[ö†ø‡qñoþÙû3|_ø¤|3øáûXxBÃâUÿÄßÁE`øs¤§ÀŸ xÿÃg‹tOéžðCiÿüYðòÿמ#ñŒî/<<]ñKât¾,þ^5£“vi_–ͦÜTo®‰©_]ìíÜûk½•¯ç}¾ïÊöëØþ(¯åâƤ,ý ´OÙ÷ö¬ø]©[èZÝ®•ÿòø‰ñ+þ ûfÍãX^|øs®é¾%ø[û,ø Á´—üÏDпl½kã…4˜:xWÂ^ ð—ÂÛMKOø}/ü#¶ž ´|[áß|[Ð4-Nïᎃñ Lø1£x+ᯅ©òÇ™½ídÖº«®®ÝõM5m®'ëÓӾ֧מ8øÕð«áÄÓZxÇÇ&—©Úë|?}¡Á,ÚψôÛÿÚ/â¬_~ϪøoC‡R×´­â?ÅFºðw‡üK¨éÖ¾kýÄ·Wš­®™á__i^£_Î_üKá‡Ãû?ÛCÅ:æ¿ñoâÁÿ‰?µ¿ø"ž‰û=ß[|~ñƇaãˆÿ‚’xçCøÄ¿ ~øïÄúçÀ_ŒºßÀo‡z·Âÿ‰º—ÃÝkàÿÄÏü!ñŒì¾2ë>ÒüGñcÄ~$ñ–ßíeâ~Íßõ¯€þ%øÚÛöbƒþÿâ/Æ;ÿÚ+öîý¥~h^Ò¾-x[þ ‡¤kúÇŒ?à Ý߯¯Ú7öuðO‰þ+þÍŸ²/‡¼?§ø[Å:Wƒ|CñÓDøMec¤ÅûDüM_?fšVní_T­´/g}]åev®ÓO–×eü¾í®ï²îC4Wç—üsľ)ñWÂO‰ºž¥ñ Á?~'ÆÍNÓà†£ðëö‡øÇûbx7FøsÃ…Rkšû_üqøsðÿÆ?´~ÏŒó|ZÖuÛ^|AоêºÕ÷À /Û]üÔ<à_Ãoøh»ÿéø=ñö}ý¼¾(üvý¯üAûüañí€t¯Û Äüqð³Âzüûö‰ñõ·Š|KðkÃ>7»ðgìí­ü,ý©|)û8øšGÃüiŸâðþñ3âÏ‹þ&üfø©|M&Ü•öimÝ7¯EkYêõ²WZ…öóÿ4¼»ŸÖµbj¾%ðæ…á­/\ñ‰£j~4Öçð׃´íWU°Ó¯üYâ;_xƒÆ7^ðÕ¥ÜðÜkºÝ·„|'âŸÏ¥iqÝ_ÃáÏ xƒ\’Ó4mFêÛò‹ãÿ†þ|øð#À?´?íEñ³À?³üûJüDø©ñ·âŸí›ñoà'ü%¿µ–®þÊÚ7Â}ã㟄>%ü#´øoÿ WÃí[ö•ño…ÿdß„:ÇÃOÙïPþÈñ¿Œ<ðÆ/†:m׃¾^øÛñ/öÓ?dŸÙ§â¿Áül×~.Yülÿ‚¦øöo»ðuãïø]_<5û1ÁN<[ûßê~ ¹¿ñ†k_íß üý–¾ |ø—ñGÃßüSñ7ìúGÄM?Å^)Ô>)ø³^ñšTî“OG{6¬´R¶ºõ޽“O­ßO;~_æC5‰ªø—Úÿ†´½sÄ&©øÓ[ŸÃ^Óµ]VÃN¿ñgˆí|9âÝxÃV—sÃq®ëvÞðŸŠ|S>•¥Çu‡<5â rHLѵ«oæÃAøÉâðž,»ø1ûBü.»ø!‰ð§Oý§.?gïø*‡íqÿ-¿ð‡Ãÿ~Ù¿²O„ü}ñ3Å_þ1|/ðýì5¢x öO×?kËûÿø?âÿßxƒÃ—ž)øÓ¡#¿ì§/Ä„ŸC|qð·ì7â¿~ÅÿüûUøÛÆß³¿Û_â/ü.¯ÚBÿ‚š~Ó>4ðoÂ?øLbO>‡þ¯ÚN/ÚsV»ø]ö¿ˆ3üðO†?´þ!x{û'Uø»7€¼/ö¿ih²³ÕË®ÑMÝFé?z×nÉ$Ýû§ _o;~6Õy+ë±û]ñÁºgÄo ü%¾Ö<ˆ>6ðOþ"øcÃÿÙú¬¿Ú~ ø]®ü4ð׎µíXldÑ,¿°µ¿Œ¬¿³õ JÓUÔÿá"ûNc¨Zi:ìúgm_šÿ´¯Â»Œ_··ì“á kÆŸ|áÁû!þÞš¯ˆ`øKñÄ |GâÛ /ŒßðNt²ðÕïÄŸÝè_<'¢C¯\èÞ+¹ŸáŽ<â=fÿÂúo†uÿjß µÏøÆž~3ý¢RóÁ~ø_ãíS[ÔðÀ/hß|9âÅloþ"üÖ¬µ‰ßi\H•>e›»Z«-5šV»Kìê¯Ö÷{"úµçÿÈÿŸü1ýWñÁºgÄo ü%¾Ö<ˆ>6ðOþ"øcÃÿÙú¬¿Ú~ ø]®ü4ð׎µíXldÑ,¿°µ¿Œ¬¿³õ JÓUÔÿá"ûNc¨Zi:ìúgàìýûGøãÆ~,ýŠþ |[øõ­üDøÉñ£áwì!âø< à¯Ú3âÁ/ŽZ]‡Åÿ‚ßßâJø/þ ÆŸ ìµûdþÏ:—ŒüAñSâïÇÿÚî)ì¼GðG៊>?ø_áÅ÷…|}û xt?¯?nýsà>‰ûiþÇûGþÒðÌ¿ µÙ{öëÓõÿÃAÛ~Ëÿðžj£â¿üçQÑþÂå±ñ‚~ øwÌ»ÓÇ>Ãð£â4üðwŠ|AûoÿhþÈþý‹üG¨øëâ_¼[ªé ñGÃŒ¶zoÚ‹Åž6ñ†'~4þÔáüi£ü_øùð»Âßµ†“ð»à§ìãâ?‰_·OíƒûøãÅ8Õÿc/€'ŸâÂßø%ŸÃ_ÙtÙ~Ù:&¥ûeøƒãKé ø‡ð^ÿâůˆŠ¿cßü+Óì~i_ 4—ì]íË]RÓ^—÷¯fº)ÿOÆÛýþžhþ¨(¯ÃoÚøãBøK?íS7Ç?ÚÄ!ÿ‚®ø—àW†ì¼Añ·âϯ ü ñüUý”µÏ…0|±Ö´ï„4Ñá‰|]¤xkÅ<ñâgÃùµÝ*ßáߎü' ü-ø#¡ü0ú‡öÙñÃýãOì÷áßÚ?ãv·û?~ÉúçÂïÚ7Zñ_`ý¢¼qû#xr÷ö†ðç‹?f‹~Õ~>ü<øƒð—Äc[Õ~x£ö—Ö|?ð~_ˆ)¢xþÃÃ~%ñ¥÷ƒ|E}ð“IÖüšÚ÷ÖIÙkx«´•õémUß–¬¾—ïk|íþgéEømakãWÀŸðSÿ޳§Ç?ÚâçˆÿgSÒ¿`_ økãoÄŸÒþïþ ;û,xãÀ¾%ðÿ…µâËÚ«[øâïéž,Ò øçqñßÚ—Ž<‰$üKðô?ˆ¿ Õl4k ŸøÓÄzWƒ¼áø.õí­æÖüYâíwCð·†´¨äkýwÄzΕ¡ép]jz¥¬Ûuü¯·‰Óã¿‚ÿhχº§µ»ßÙëàwÅø$Gíe⿃_ðPïÛ7ö¦ø¦èšçíÃñDý¨~6éß¶¿Äíàǵ¿…ß¾ ü(“Rñ´>ñgŒ?gŸÙ§ÇüGñgCñ7€ÿh_|KÔ¼ Û|øÉâÿüað>›à¿Úáu×Ä“û^Eá¿§ˆ?વÇůŽ^8ýŒ´oÚ’oøQƒþ ¥eð¿âoÂ_ˆz'Å/ØÃFÔü5ûFx‹^ÖSÄŸ üQ¥ÁE> üfÒ¼GuâŒzsö.ÏWtõÑix©&ýîÏ[]®‰‡6Þæ“éç§#ú4ñWÄ_ø']øiá¯ëÙšßÆ_ü:øueýŸªÞÿÂEã-3áÏþ-_hÿiÓìní4Ÿ#á÷ÂïxƒûC]ŸLÒ¥þÂþʆúMoSÑôÝC¶¯ç/à'Œ~xçâüCÄWÿ¾(üMýµµŠ7Ú×íà-_öŠøýñ?ßþ4ë?ðMÛûã„~%|Ô¾ øàì‰ñE>,¿ˆto ü_‡ß%ð­ö±áøõ_ ë°ØO¨héwe5‰Ã•¥®Ú¶¬¯Í%§“Qºï¨'ÓÒÉþ§µÑ_€¿~4üIð‡ÃÿŽŸµßÄoöyø7ãŸÚáÏìÍûO7Ãïž,øð[ᇇ?g?Ùö‚¿øÕ®ŠÞø—Œ>krÿÁ\¯üKû-ëô‹þ °øßá?‚Ÿ³wÃM+Xñÿ€|qˆ~7íüý¦üð§ö•_x›ö¥ûü³Jÿ†°øuðã¯ÆÚ?Uñ—À꺀à•þ9ð¶oûN|Yñ׈4ÿŽ~6°ø¹uû{iµüJñߌ¼1màߟ |}¥xCá?ˆ<%á:öO]nÒoEu¦ñ¿ó_ìÛmoÐ/ú~6ÛË]{¼•Äø«â/ƒ|®ü4ð׉õìÍoã¯þ|:²þÏÕoá"ñ–™ðçÇÿ¯´´éö7všO‘ðûáw޼Aý¡®Ï¦iRÿaeC}&·©èún¡ðoìÙñ#Çÿ`ߎ´?‰|'âí_âü½>üJñÂ/ˆþ*ü2°Ð¿kÏÚAøOyìíâíüIñF·ð—ÚO…´ß ~ϧ„í¼Fað¶•ðš? Ø\CƒæÇ‚u- ãÏÄ?ÙSá—…~-øÚOÃkè×ÿgoø(?ÄoÛãá þÜÿ‚}ÿÁJO|ðÓöÓøËà]ã¿€þ6kþð¥Žñãág…µ»/øQß ý±>4ü¿±øªÿ³oüãã'Â/‡-ý²çø»áþ7Öõ‡ý¢mŸø?áÄþ#‡Äž³ÖËÃz—†?gï‡ð|4í¿d¿ÚÖÃáoÄOˆZí+ñß[°øWãO…ÚG‡ÿcþ"ø¿Ä~*¿ý¡¼'ðóöêÿ‚“ø[ÀsþÍš]íηã?Ú¿â‹e©bë©üKðÖÓâ—ÆŸÞñ—ìûãj¿5 ×ÓVЧÔÏ üEðoµß‰~ðƱý§­üñµ‡Ã¯ˆ¶_Ùú­—ü#¾2ÔþøâÕŽöBÆÒÓVóþ|Qð/ˆ?´4)õ=*/íß쩯£ÖôÍcMÓÿ›†_5[ËŸÙÅ_~3xÛÁ¿þ)ÿÁ<¿àŽs~ÙŸuŒ¾2øIªÛø7Xøÿyñ΋∿´æ‡â¿øóá‡ü&_µFð3H¾ñկįê¾>ñ—‰t…ºÖ»®éÿ5o x§õþ ™7à GöúŸàljümão…ÓþÚú$Þ ñŸüuño⎻âí*_Ø?ösâ{‰Ÿõß|Aø‹à~í®u_†ž:—ľ"ðo‹¾ÝøWÄ µÝ[áv¡àÛû‡*|ªZ·džÚ]¸¦›ï«i[k;ôïÿåþzùŸ¨TWò¿ñ/ãÜÚOì_áß| ý«~(ëŸ·Ž¹û!þÑ~%ÿ‚ü=Ò¿kOо?ñÇÀoéðM¿ÚcâGÄx—öeÔ~'ø‡Ã±.·ðßöåð×Áo Aªü<ø]ðFÿà×Ä ßüðÔþÑ|gsð÷\öÏŽ¬4$Õgýƒ?kÝoö©ðޝðºÓXý³~"/í™â?‰þðý×í›û xFëÆ<ø±à ¯‰>ÿ‚wèž)ýš¾ ~Ý(Öü[û1|?ø#áχÿü-ñ âïÃÏØ[þËþ›áƒö.é_vÖªÉYÛW{$þËë¦×кóéë­ºy_Sú4¢¿›…ž"ñ÷ÅoŠÿ¾ø'ö û'ìåñö¡øàÝY?d¿ø(§í+ûs}·Uƒö,ÿ‚—ø÷ãoƒu¯ÛGã_Âß ëz7ü,=À¿³Õ®¥ðCáÇÄ _Æ_?áðßíàSðâ¿Å‡µÏרîmWDñ7í‘ð}¼Oãox'àíC¡ü:øZ~"øëÆ_üe¢x7Äß²ìŸñËVÑõ‰ßµßüLñÆï‰Ÿ~!kZ~¡ãÏx›UÑ4­fÇÁº%öàŸ øWú$ÊŸ-õÕ%+[£vîÕîöW[ëµÄïýy'úùzCiß¾k>8ðçÃÇ&¿âïhŸ|A¡Xx~YµÛ «Ùë₾ük‚éÞøsLÖþüIø…áoø—ÃZ¦­eâ;_ÜêºdzT×ñBèÞ£_̯ì³û8ü"Ô?m |‡ãWí áßø_Dÿ‚Ëk¾é_¶GÇáñWIø«ÁI?gïþÍÍâVÖ~(êß>hŸ|®xGã´¾ë|qûTC¥xÆß>_êøåñƒÁ:Á‡ÿð¼~| ñíÿXý¥à™ÿÛú¯Âø(oíñðÄ>ñg࿃¼Oâ¿ÛÆÞ øð{öTÑþ&jÓ<¢^éšço.Øxsö2ø)â?‚3økö{¼ø»ceûvë~5ý²õ/‹ž ¸ñ/Å¿|~ñLj_ˆ>øÛUñÝ„cð&Ž~Ýÿ>&|6ý®>#èÚÄ=oEø!âýöñ/Ç»‰Ÿ¶OÇ/Ùgào€|9â/ÁV´|@ÿ´_‚m|u¯~ÆÚ'>*|ý”´ CUø7¢øÃã'ÄÍ;ÁŸ üe=ûühñsøªW¶»«­-ü»kg¤¬µ^òµí¨ïùÛO–ÿÝ©ûÿXx—×^#Õ|kâ çÅÚ‰áÿ랃U°›Äz7‡x/öð÷üŠ_é¿|muiñsö(ý¿á”u wö¿øßâ¿þÒ?ðƒÇûeØüFÿ„Gñ7Æ=cÁßµü _5„¿¼Oö;âGü!Z¯Äˆh‹ß쟈?µÿˆ¾1N“»zEµh飵›¾é]ÊײWM¡^ÿ‡â“ÓO?#õâŠ(¬ÆQEQE|Cÿ#ÿ“ý¤¿ìŸ¿þž´Š(ÿ‚‘ÿÉŒþÒ_öOßÿOZEê`…/úøÿô˜Ouéú³ù ÿƒ¶¿å$ìÂþÿêuñ¦¾tÿ‚AÁ9ü9ñÑ—ãgÅ.]CAµ¸–o éM‘‡O•ã}jê ÀÎ÷QK†ý‹m£Ý"´—6ÓÛý?ÿ_é7zÿüëözЬÉ}­~Ãÿ³¶“g®æ{½Gâ/Æ;;tU-4È¡A'¯ÚÿØCáf—ðÏà_‡<¦ÅökX¼/¥é–„ ‚F† 9"›ËRyDVgpP6ÉAuý∹ x á·d¸ÚØ Ã‰òÜELn' VTq4ò|²«u°ð«MÆ­˜b14iʤ%<>AÞf…ÃY=,Ï>ÆVÄÒl>Ã÷sŠ”%Z²Q§)FIÂq¥ÎNVrpwV×Óþ|Òu]_OÓü5 iþðV‡ˆ-aÓí ·³‘ r$‘¢†%CºG-….­!`$mŽéƒ4»=Hô+-–×O¶§E“Î d‹ËEœ½$XÌ{Q~âlç¼ áë ør·cv¶£áÙ^âñ†ÈÆåF@#$±W–@¥²‘}ÃVkmi-ÔΦyYÚáŽTFçÊîòºy|§î `AwUþ­‰«^´åRr’rrjRærWÑÊWmó4äß73÷]ïÌÙéÐ¥NT£¥všŠVmꢒQQKÝŠK—•·­Îâ÷‰‘¢\¤,‘Á9•Ë…Ä&(ä”…Ã’¡LhùB•Ù„gþ5ÿnoÛzïĵo‡²ê†óEð½ôIyád¼™Võ‰šfžöÊyo­¢Ú“lXÛÍ)2Ï Îú¾ý¥õȆ‘«Û«“7Ø/„F$ 3[ÉN͸8·ˆî$ÄÇ+ÞÛ+üý?lo6¾ñÿÄo‹V­s¨O'‰on5 ‘¦kx¬6ÙçM2o±}©­•^P'{¤–E­Ÿî ð‡ q‡ÒÈxŸ‰ Ã1À×§”æS¬U ™íZøh`0¸¨ÎT)S¡^”«¨Ôž&‚XŠt)¼*V§|OæÌÛápÿZŒ+Þ¼#&šÃSŒ“”lÛ|²Q“´&ÔgR\®)µúÑ¢üYø[ñ3A}+Ä1Xi÷pA‘q2¤[ù,Ë OybH¢O’6i‘™w,/yl>(ð×ì'âÏŽÿµ[àÇ€u/ÙZ™&gÑìcŠ /üÇ–æä]ÜÐÃâ±øéd”¨á8B )eôñï¬ÊOZŒ±Q£F¤ß±¥BOã8’“§Žx:¥:¡'S–”}³rrW“´pƒ‚n)ÆrŠ|îI~©*Á†2¤¹U— äeXaê¬ ‘Áq]þ€·šÛÙéú}•æ¡©NRÞK(žþîê`²`Goj&º.ë >$…K„2d1þŸþÿÁ2¿d_ù73ü;½ñSPñö½ªkQ|ŒŒšŒšO†n¥@au¢N2ˆ<›þÎðŸÃßøÐØxÁ~ðe”"6~ðæáÛv‚"ŒŠðéVvk"oU‰–•|×-.^¿bͼ_ÁÕJž[âê5)(×Ìñ˜l UœáOý¨êAû­B´ðÕùm ]¯–ÅeÅA*•qi©Ò§9I'ºJ£¥~nöŸ.öÔþY<û~Ôþ=’Úmàç‹ôëi6SñU´> ³HÜn[•“ÅséÜ[íùƒÙÃreV$‘¤Eo¾~Á.~0\­µÇ>!xÂ>fÕ¸µÑ-õo_¢a\‰"–éªíòömVåæ&E=ÿ¹³6J2œ|¤Ý’¤1ÎG8?/°Æª²JìpNOV#’p2 ±  üó0ñ/Šqñ(VÂeüÆ+‚§*ÑWøe[0ža´î¯4¢’N1OR°ùv ' q«ˆ½ªÔnm&ÜaJ4œS“MÊëâ½£ËñoÃÿø'ßÁß G ¾%×|k㋵D&;VÛAÒЩ–º5œz¢«„†×žL¬ÁŽêû·á€¾ü4×t«ÿ ü;ðæ=ŒZŠCy&¯ªÁæè×öH¶úÖ®oµpò,Â2~ÙF‘ß Xó¯{墑¼0cû¶f“‚K‚Aõ px`9mw⯂|‰|[ã? øZøÞ?õs¯òlÿ‚sßðPÏØAŽ2ß¶oìÀNÕU\Ÿþ'  *EPŠÿY:ýéaJ4sþ„èKŽmë«úônõ¿Ý±ÍÃ!‡ÂV§µX¹=un½[vì¶òÕ…üåü{ðwÂ/üQÿ‚·øvÃàʼn¿¶¶¯ñFÇEýŽ|{¤þο¾'øsà¿Ægþ ¯ûXüñwÃ_ºoÃïüý‘>(§Å—ðö³â¯Œ ñá‹4[ |-ñ§ÅoXx/á×ÃMoþ×kû%Xhÿ²ÿÇ?ˆÃàF·}ñ“ÆŸ·—ÆÝSâåþ«áø«â¯‹¿aé?à°Z×Åo |5áí^ÛWñŸˆgŸŠÿ²ÖâOOû2ü0Òo<ûDÃã/j~øcñÇßµFñ¿òŸ³IE¹5Ìâ¬ãüÉ;üZÅ^×êÖÇÒß_¿g}­¿ž»¹4Wó+ñkÁ?³†—ñëàN·áÙ«âÃOø'ÿˆ¿ho¾¸øàØïö“ø/Žþ9h±ßüâïãœðþÆÞøEàߌŸ4OxÅ_²ÿ„~5x–×àοðÏão­_…Ÿ5_ü=øiñ#¾> | Öï|Y¿áÏZ'†ÿàž—~?Þüø%ñ£þ ûC~Õ ¼®|ÿ‚|hž Ô´/ø&Ïû¿„þkwþ~ߚׇ¾-xŸá‡|9¡Íã?Šú̶Ä~×>ñ_ß²W^óWW»¯»£mÏO„/úlûÛ]¶Wþ®MUåÞøËðÿÇF©á G[ñ™¬üQø¥ðj GJðWŽ.¬4ïˆüGñ+Áßtïݧ‡ ¿„4Oø»á'Ž<-|W&‹àøŽ×Ãú†|G¬ê~9ð-¯‰?!ÿaŸØîÂã㮣ãO? µ¿ižýžgŸ~ÏúÇÄÿ‚>#øEðÏÁšÜ¶¯ü£â€ øIû;ø¿âÅàö·û<|+ñ—Áßüð׉õ™?hoÙSào‰ü1ðûPÒ¾ê~<ñçÃò÷Œ¿d_ü=ø=­üýÿfoàçíK¢~ןðQ¯·‹~ü¿ø)`Þø»û-ÿÁaႼA¢þÒº/†¼ð¯YÑ<% übø1à¯êºÅ+ëÙ³Ä~6ð¯Oð»Æwþ{8ÞKŸUml’³MÝÝÝ$ì¯m³Wh.ôÓúºÿ7÷ÓUywÀÿ„¾øð[áÀŸ^ëz—„~ ü.ðÂ_ j>%¹°¼ñÿ‡>xOIðv‡{â ½/MÑ´Ë­nëLÑ­gÕntí#J°žþIå´ÓlmÚ;X¿|û;Ûjvßõx'þo†p|¹Ò¾'øöUÿ‚4|xý‚<ñU??g¿øaÿh/‚ß¾=é^6ýºü£ø'áïÅÿx¿à/ÀÿëÞ2ñ?ìÕãÿÚ—àÖ“âï |Løÿð“Á?Wàž:Þø-â}"×áF‰ð§Â6ÿu§ð >ø/ñWöTøãOá?Í©xÏÀ?±Æ_øÇ?²&ˆž9ø+Xøgwqcañ/Ç ñoíS§iâßöˆ×ÊPQ‹´›Õ]8¸ú^ýuv[µ®×hNöÓ§uå·—ùzyWŠx«à†•ãoŒ >.xŸÆ^6Ôí>ý¿[øuð¯> ²øsá߉úŸ…¼ðòûãÚôÿÚ|QÕ¼m?ÂïŠ>:øoý®üKÔþE¡k¿Û°ü2♣øÓOüý‡ô¿ 音¯üƒâGì]û+üQñoíAðçöyÐ|oûDx¯Å_>4þÏ×ÿ´/ì?àŸtO üÕÿmÚáÎàÏŠÿ ¼CûRêÿ³Vð·ÀÞøñ3áÿ¼9ᆾ9økà‹o‚¿4ÝKÀÜM‡Á¿‰‘|DkO„³Ö‰¡þÍZ¿Âí#Pý¡mÿfÿø%Ç/ø'Wþ/xsÀ·WüÿÅŸ>üTøñ;â‡~&þÓÚÝ·ì€iKx2ãᕇį‡ÿþ9üøÿ|SãŒß ü^ÊÍ®{nµží;«¾[¥uwï'¦ÌW¿Nß§å}úXþ¨(¯åâO¯‡úÿíñFÛöRý”4O¿³5†‰ûxÃãŸÃÁ;¼q⟇ÿþÿbÁ^üoãïÁ8>Íð‹ö…øÇ¢[þзß|5£èþ/ð†|qáï|0ð—í žÕþ|3ðŸÄ­_öOþ ¹ðûUøð“âj4Øþ ñWÆÍOÄÿ |¢~Ê>2ý‡~xÁ©ðÃáW…µm àçì­ñ+âgÄO‰Ÿ ¼©üLðÇÄ/ëðøòÃá¶«ã‹~+ø›ñ3Dð-ß‚|ká_ˆß&TÔUùµÓG·IÙ»´¤¯ðÞöÔißñý6Úë]ÏÐÚ+ù)ý¦þü~ø‹¦üDñ/ÃØÿDøñ'âßÂïÛÃLý¨¼?û=ÿÁ5¾.üø™£x³âìûaßè¿þ,~ÙĹtø(‰â/Ú)|'eþ|×~ |_øåà…ßîüDø{§~Í_5»…~4ø]«øƒöΓáׄ5x³ã‡ƒ¼-e¥]Ç©K©Ï­Øj¼c?ˆ-®ô‹ [ KÃRéÚ–«qyªZèÞ£_”_°¿Ãï…^ý¬?jïþÏ?²f·û.|ñìóûé^žÙžoÙgß|qá/‰?· üAñ.•ðÛRð¿ü]§k~·ñ'ƒü)â>&xÁ_'°Ó¼5âkoßü&ñ_Âox×âüø™sûSÏu⟠èš7Çõý¼¼Kñ×â·‡ÿà˜_¼KûGÍû<ÚþØ:¯Äxnø+&£ñϳ}·Âíwö9‡Cøkâ_ Gwu­øOömÔu_Ø÷Kø_ãO‹:5§ÂMtäMµÍk(½UÝÜSwI¾Tžíü;=BûyýÛ¥»·{®ýèÒŠþy¾~Åð­cßø&ußÃÿ>þÐ^6ø'kðÓö®ø‘ðV×þŸÛN? k¿ðKÚZ9ü⟟/t­[Á¿ð†þÐZWÁMàÏ…~6ø×Bø9ðcâ¿‚gÏ i6 Ò~ü>Ò|<|ð}çÃ|ø§áoÙ¿þ¿?j üOñ÷ŠÿfØöªýŽt­[þÙöêø¬[xþ ±ã ߉¿üQãoøÇâïÀ;þÒß ¼«ÂÜðoÅO ø_Ä0 ~Æ~-×¼(:k[Jö½½ÝÚm%ñ=[Z-[¾‹F}»~Ÿ•õô?¡š+ðá§ìÿaûUÁAþ&|Føéû-üQ—özñf·ûXø«@ðïíðËÄzÃÿØ_þοðCÏü/Õþ#|>ÖZø›Dñ­Ç¯‰^6øð·ãF“?ˆü'ã†ZŸ‹~ü?ý¡~kZ7Ã+Ãÿ>&\þÔóÝx§Ãz&ñýo/üGµø­áÿø&Ç/þÑó~Ï6¿¶«ñ#ÁÞŸþ ɨüsðŸìßmð»]ýŽaÐþø—‘ÝÝk~ý›uWö=ÒþøÓâÎið“]=šþ}ySk–ö½ôѽµm$®»…üºÿ—ùéÞÇï÷о"ø7Á:ïÃO xŸXþÌÖþ0xÚÿá×ë/ìýV÷þ/iŸ|ñjûGûNŸcwi¤ù¾xëÄÚìúf•/ööT7Òkzž¦êŸþ-xsãïÁo„¼e­é¾øÕð»À¼-§x–ÚÂÏÄvøá='Æ:—ˆ-4½KYÓ-u»]3YµƒU¶Óµ}V øçŠÓR¾·Xî¥ø£þ !ð'áWÄý_ö;ø™ñ‹öyÑ?h†ßÿhoxƒâ¶›?ÀY¿hÿé ¼wû2|}øz°i_ ¼=àψßø³Âß|ý™üGû0þÌðJï‹?ÿdíoUý¬4ï…Úí c5½ÿþ4üI‡Mÿ‚cþÑÚæ—û?~Ѽqc¨ø§Á ›ö•ð×À¯‡Þð·ÅÍI¾|ñg†þ xOÃÞðõÇ^ÑR„\S»æ}íËuÎí{«h£ºÒë£ »í§ÿ³þoî?r~%üEðoÁÿ‡>?øµñXÿ„wá÷Âïø«â/޼AýŸªêߨ^ ðN…â_ëÙZާ­êÙš&™}{ýŸ£éº†«{ä}›O±»»–$>%üEðoÁÿ‡>?øµñXÿ„wá÷Âïø«â/޼AýŸªêߨ^ ðN…â_ëÙZާ­êÙš&™}{ýŸ£éº†«{ä}›O±»»–$þen?eo|Y°ý§¾|#ý˜¾/¿ŒðMÛOºu¯Âïø%ÿÄø&?¯ˆ_µÆ•â?ÙÇQýš´ˆ¾ý¤¾/x“Sñ¿Å†šöµâÏ€Ÿ¼mà‡ø{7‰>$Þ|$ø•ã {Mø×ið›õãã·ÀŸ…_à—_´7ÀoÙ“öyÑ4/üBýž~=xàwÀo|›öl°°ø«5§ŒõÏÁߌ^ øXÿ µ±ñ¾ ?Ç^ñ/‰ü1á8`ñi_týV;{?Äò·®[É»ÊÒv·,tÞîéüZ=ºY‚wéÓ¿¦ÝÖ»þ׺/޼ñÎçöøK>6Ò¿áSøØ|ø…¨éúî«àMVçUñ—À…[UøuãoøžÃÆÞû7‚~9øjÊÇÅÚV¥àßxÆZv±sá÷³þÊÑüBø{àoüø£­~Ò¾ñŠ>x7âÄ¿ˆð…Å߉8ñïˆî¦›TñÄψúæ¦éþ)ø£ñ?Å×úçÄ/Š3“Mµ¿ñ¯Äø“Åš¢6§¬ÝÈþ£_—¿ðRO‡áLk-ðü'^Ð?ábé’x{â'ì-ñþ Gû9&»âøAn´gÆ_²ÏÁ?øsâå‡ÆË ?ÚõÁöš~«ðçá·uoÚ á×o4Ÿ|pøo±ùyñkàÆÿø›â¤þºøÏñÁ?m?f ßþÁß´üÃö¡ýž|ßÙàGƒcÐ~ÿÁP´oÚ ÀþøÛáíY¤üeÔ|'âßž>ø}ÿïÆÈ|Gû_üAñ®›àïŒvž:ºQ‚ž®vníû­ë{tw{ÝÙ{«{]\½ºy-¶Óåä—SúÕh¯ƒš'ü'ŸÚ~0û/ü+/Ÿ ¿g_ÿÅ?♿±>1üsÿ…-ÿ ³Áÿèú$¿Ú_ð”ÃCüÿŠƒHû…´OøL?â¢ÖôøGüQý‰êWˆ,5›ÿéÖkpÜxO[ƒÃú¤š¯†¼G¡X]_ÜøsÃþ)Ž jšæ•§iž4ÑLñ.k?‰|w®ør×ÄvÞ ðuÖ«‹¼'âFüøÿû |Õ>#~Ú³ø“öðOŒþ ø«ö×ý’¿l? øÎÓöF¶ø‡ÿ 7ì›àýwöÚÒâf‹ðÛ_Ñ5¿x¯[ðíiªø·öZÓ|KuûB|lþÙñ¯ˆ4_ƒ¾:´ø³¦ßøÇkáwì‹ðÿâ÷íåâ[¯þÌ:Ü¿²$Ú'Çmkáß‚<}ðWÇ>ÞxrÿöCÿ‚xOá?„|[ð{ÅÞð·„oôM"ãá‡ÄËOüø›àéì<ñ3àV±¨Øx7EøŸð Ïœµù¤½ÖÞ‹¤bì½ínÛ[ôòw5íÕuóôè~ÿÑ_Ï7ïƒ> Ѽkã-+öÅý‹|mûFü.±ÿ…µðÃöøKâÙKUý ü-à[ŸÁCà¡vÐø'áÞ›â?ë_ ?d¯ø§örñì;ᯇþ=ø±â€üUðsà Ҿ!7Âïú…ïÃÏ.ý>Íi¢Á;¨/®ßÖŸçøµß>øsãïÁo‹ÿ|c{­é¾øÕð»Çÿ |S¨øjæÂÏÄvøá=[ÁÚåï‡îõM7YÓ-u»]3YºŸJ¹ÔtV øà–ïM¾·Y-eÛ¿ø‹àÝ3â7…~ßkGÄx'Çÿ|1áÿìýV_í?ü.×~xkÇZÇö¬62h–_ØZ߯‡V_Ùú†¥iªêð‘}§G±Ô-4v}3ðþ ÷ðâg†>.þÊWÞ2ðÞ‰á_tKéÿløþ …ñËö~ø™ñ;Ägà޼ñJý¥ÿà£?~9Ÿ„ß¶N‰©|ñ…¼{âO|!Ñ>-ßþм1ð÷ãï†|5mðïÃþ$øàO¡¿à©?³Wü,ˆÞøÃá?€?ð°>.?ìQûf|øñOÂ_ ¿á5øðïöÇñÆ»û?ø£ö"×­öÑò§~ªÖ »mÛñµþí~ãöºŠü¢ý˜|ð6Ïö°ð׊cOÙ«[ý›þi¿³ÏÇþÐV°~Ç?bxã⯈>$þÍzìã>«à¾ \|hÖü+á þÓ1øĺ‡ãX~Øx›Äº^³ªø9þ/iž2>*|%ñïíý࿆7º$??h}oáçíÉñ?Ás\ßý¿Äÿ?a 6Óá÷ˆüG.²4Ùµí [¹ø©âÏø$§‰<áo øKð>¿áÏÙ{ãPñu®ˆþ'ñ'‡hYäWµÚ÷\µVzn­}“’×Um¯t_ô_}¶îµ?Wh¯åëÄß³&«ñöRø}ðsàgìµão ÁA.eïŽß¿o‰š‡ìáã/š¯Çx³þ ÕûH|%ñÞñöÊøƒà_ü*ý«¿áa~ݾ-ø%â»íCEøÛñ[Jøã+ öµ¾ñ„¼©üMðïÐß¶­Ö·ûi|mýžOÃ?ŸµáøWáݾñ—ÄWà—í û7ßÛ_øƒþ ›ÿñ׊t OâmáwÇÿë~ øMð»Æçø¥aá¿xrËÚ?ˆ)àÛSáWôOÙ\Ѽ;ñFÖßöÎÑ>xƒá‡öÇ‚&Óì4;Š³ÏÆïÚWÃxÃÅFþ_O­Øxà4¿øká÷Š|â?øVð ž"Ò´ÿøóÃ~-½úá×ÃO‡?ü£ü:øKàü.ø}áßíøGü ð뺂|¡kj·Úî«ýá Xiš&™ý§­êz–±¨}ŠÆ¶êº…ö¡sæÝÝÏ4ŸÍ‡?g¯Úú-Gþ п < ão†Ÿ|ûÁ1ü'}ã/ü8ñ5†…ðëÆ^ýƒÿàµø‹á¯kZÇ‚|[¢|4ñ·†µ¿Š|qâ?|=ø¥|øñSáf·ãß¿m5?àÿÄÆJWvåÖ7Ótõk^Ñn×ÚÀÛÓO_½~ýÇôÕ?ˆ,-¼G¥xZH5¶ÔõÄ ´ºƒÃ^#ºðä6¿ðÖ¨ÁªøÆ×J›Â:·sqâÍ.Oøk\×4ïø²Â×ĺ§…´­gLð_Œnô//øwðCJðÄoŠÿ¯üeãoˆ~,ÿÂ=¢_øƒÆ§Á¶¿ðŠ|0ð.»ñÄ¿ >xKJðƒ| ¢Âðç[ø¯ñ.÷A×üU¦ø«âÞ·ÿ …Ý·þ&øÎÓFð¬ã_í[ðo‰·_±6ƒð›àí ࿆ÖZ%÷†þ"h«¦|UÐþ*ü<ñ£ÿvÿ‚DøÛâÆ£ãÏ‹ž×õ_7ÅJßáÇÇŒ:ßíáÿŠþ%¿ø¥ƒþ!~Ô øÍãÿ4ßïöþ6þÌž øSûJ·…|3û-}þ Ù¥Ã'üEøùð+àÿìáªøËà?u]GÀ?ðUx§X¸ý˜þxÄÇ?X|\ºý‚uˆ:…>øïÆ^¶ðoÀ?Š^5±Ò¼!ðŸÃþ-ð›PVøšmJêÊï–I%ñnô´zµ¸]öíøÛËe}ü¶?y(¯Èø'¶¿ðçáß‹¿jÿ |"ý™¼mðoáŸÄø(mŸ…|ðÿ¿t/†ºÂm ÿà™?²ïÅ{O‰þè3iŸð¥|ñ7þÇ»°°ñ6ƒ¢üFÓ>#|`ð‚¾*øÀŸ5ïø{ï+·’}·WÚïÓq…QREPEPÄ?ðR?ù1ŸÚKþÉûÿéëH¢ø)ü˜Ïí%ÿdýÿôõ¤Q^¦øRÿ¯ÿI”÷^Ÿ«?œø/‡Ãçø•ÿÇýŽX ¦U®~W!Q#Ã("Rƒ$¸:¾´Ú>™4ÁÝ ¥“Ã; Y7˜ü·d‘U‚Ǹ¨%‹o:ÛIŠÞ;{(B‘ÜÏc/›!ùÉ deK#2 #“z<¨‡ü`ÖFŸ¤¤·“5Á”1]‰ÄGaÂ1 W|¨Æð‘Ïá|ŽN”!u͹4Õù-)´äÚnú);«ï¢º>öVæ{E&ß[$›K]l›K_žçÈü_6­6¢.§`Æ9bE$ˆØHAÃ&Ï.48ÎÇÁy›šoÚïRðgŠþ$è7¶6cÂÚö¦Þ"MJö4y-c4¾0#®É$™âÀYÑŒ¤˜í “Fðþï|KÕÚø\«ù¨‹>Ó„>SˆQWnÇ@áÁ•ä*¹}ÊØO€üeàüKºû/‹´KmZÖ+¶-ä‰ÌM#K±¢˜Î÷‘þMªÒî¤>Yûl¢ºÂò¹ÃÚEF0jÚ)Ç–P’IÆÜ²‚´Vºø\¹¾G3J´Û‹TÔy¥MûËܺº_jjIìå~·zjÿÁ"~ Á«ßÝüYÔt£a£‰Ò×ÃÑÞÁåÉqF’èÞ`„•E 3F‚3 ,ªÑèŸâ¿‹4 |>ÕµMDÛ%¼[̨ï¶4b T¬oå€%ùw™‡EˆHçwì÷¦Áàý?MÑt{xôÍ:Òx¬ì-ÄQÛÀ‘ñõê¸Juq'VܰQ†Ü‘s•IIIE¦äè´ÛRÖÇõÊ|MðúÓNÔïgñ…ÜvšoÛ‘´û¨õ2Uol ;—M”¸c æI&ØÆèÌ€|ñ›ö÷øYð¶i­_GñN±q+Ùt¸â…‡ÈâG›P»ÓÂBа(B™œÂܨôìåñàŠ|/»]^ÆÀÈÞ–M=ÄÓý‘§»Ó£{™Á¿Whšg†EÓœ^§âM9 HµŒR\Ì£!s ¼k´6ÒAeà|Ëø•ÿŒðü³x§â÷$bÿbÐt_C$…¤"M_P“U»ÚòKpÊ4{_´“8HD»Äªî‹Xµ/‹ºt²Æd¶Òt½sT8BvÎútúe³ÈpÁVû«GF ?zª7€Á—òßqq§žçÓæRŽ]Ãà©ËÞŠ“¡–ѯ(ÙÞÖÆâñPm$”Ü›“ÕžæY…P‚Œb§Í)(ÆË™Ôq”­e¬¡ìš}¡³VkíR®Ö¶÷rF#’ñç™—mÌcy7µAóž\*6-¹›!”/óÿÁñ«ê¿~ø ^×Áß []r&=SÆž%Õ »“)];š,á²w-ÀrßÔŽ¨‰ Ù[…Q$Vÿ¼eP²@àà1ùÒV9—-Õš¿Šßø)w“Ç_¶ßÇ[ë{±ue ëºO‚m$Ghþ ðÖáÍZÒ3´§ˆ4ý^Yã$˜îæ¸Là>cè×–}wÄYã¥ã“dY†.3jéWÄÏ –Â)«¥9ÑÆâ»Ö0©Ôôsªœ¸XÁ;:•b𽝩IéÕ)(_³hç¿àœŸò¿Ø?þÏ3ö_ÿÕßàzÿYJÿ&¿ø''ü¤/öÿ³Ìý—ÿõwø¿ÖR½/¥¯ü”\#ÿb\wþ§D2àb?ëìô„q>øuàßë¿üKáû3[øÁãkˆ¿o´5[ßøH¼e¦|9ðÂ[cìÚ…õݦ“ä|>ø]à_ÿgèPišT¿Ø_Ú³XÉ­êzÆ¥¨vÔQ_É?×ݱïœOоx7ÆÚïÃOøŸGþÓÖþøÚÿâ/ëßí VËþßj|ð–ûXû6Ÿ}ii«yÿ¾(øëÃÿÙúìž•öïö¬61ëzf©iýµQúlEPEPðÓá׃~ü9ðÂ_‡Z?ü#¿¾x'¿¼ áÿí WVþÂðo‚t+ xcGþÕ×oµ=oSþÌÑ4Ë/í cRÔ5[ß#í:…õÝܳO&߉|?aâÏxƒÂÚ¤úÝ®™â]Uðþ£uá¯øÁ~#¶°Öl'Ó®çðÿŒ|ªè^.ðž· ½Ì’i^%ð¶¹£xB¿X5MUÓµ;[[¸vè¢î÷¾»ß­û⟿g¿†ÿá"ŸÀ¶Þ6Ô5¿ÿdCâ?üSø·ñoã¿ÄmWJðïö›økÃ>9xãâ/ÄðO…îõÿê¾ð,>%‹Á¾×|cãhZŸ­øÛÅ—úǵÑE ¶îÛo»Õ€QEQEQEQEQEQEQEQEQEâŸ~øãŸü#¿ðšëß4OøEÿµÿ³?áO~Ò¿´oìñöŸí¿ì϶ÂEÿ â¯Ã/øKüŸì‹OìøK¶ÿáóu?ììßí½gíþ¡á¯ xsÁ~ðÿƒ¼áýÂ~𞉥xkÂÞðÖ•a¡xsÃ^Ь Òô?øCÒàµÓ4mFÓ-mtí+JÓ­m¬4ë h-- †Þã]º)ÝÚ×v[+è¾@QE (¢€ âl>x7Løâ¯‹V:?‘ñÆÞ ðïøƒûCU—ûOÁ¿ µß‰~%ð.ý•5ôš%—ö·ñƒâ-ïö†Ÿ¦ÚjºŸü$_fÖ/µ M'BƒLí¨£õÜŠ( Š( ¸Ÿˆ¾Ð¾(ø7Xð/‰oüm¦hšïöÛo¾|KøðÆPfj¶:Å·ö?Ä_„¾*ðOÄù·z|êðøŸLþÖÒ¤¾Ðµ_¶èšž¥§ÝöÔQ¶ÀywÂ_ƒ_þør÷Ã?´ín}_[¹ñ/‰5ÿx×Çþ xÏÄw6nŒ?Öì¼9¡øwÂ>«ãOë·úü-á/èÓØxGÂ~Ñt¿Q¢ŠoVîû° (¢€ (¢€ (¢€>!ÿ‚‘ÿÉŒþÒ_öOßÿOZEÁHÿäÆi/û'ïÿ§­"Šõ0?—ý|úL §ºôýYâÿ¶ŸÃØï¿nKÉnŽ÷²GÀ/ÛÜ+:ʉ§êÿ5{ØåÃ`ÀN¯dÃlléûæ,˜SZÞ Ð?´õ x el…¤,Æ4‘• K¬nÉó;,ä)$Ø>ûûXxqµ^Ô£ŽG™þü2Ó£d¬kq<¥‰eî\ä üm"¾eg¥i6‘CÜÏ #I§Ý0<í>Zº†w ‰¸É'Ìîß‘ñ>2k0ÅÆîmTTb“¿-©4”µÚ1[+]Zö±ú¯ÑäË0SÒ<ДӺ»æœ}í5¿4l›³M;mwÕÛK»&`ó#EÁ€º¬,à:#12íŽ7*‹‚U²Á•ñíâqÚ-b‘dee†¬T¬q©–WFWm #{:(16È‹±ZûTÔ Ó¬Þy÷!0Èʹ Tªg ë**á™)(bÌ<²~ðøã3ũ޳D ŒÉ#pÎC«ºÉšWætí#ª•*²:¨>6¬gï84’´\š×•ëÊÒwølíÊÚNö=+ñ™#¥É–gŽI …g e ù,{Y‚€(’߇´K´‚[¨âk‡Íon²3±Ú2æ´¦@¦#åÈʪ‹â«»†Š+KuF¸…“`›r¤h$1°p6¨R±uò°ƒ"Ô~ÓMÌ–²]ɽ”¢G/:¨HÊvˆÑ[.¤ e—fÅ 'ÑÒmS‹r´TŸ»ýî[½5»Iß–ú5¢Mj|ýeZiFí-%öS|¼ÉIêÓjÖë[·¥þšðv¤#§q"[²¢á|”@6EeÈË«9$á9bD­—Œÿ.¿ð]ŠÚgŒ~-xÃV·éÿΟtæ#yJ« KS°“Zѽܱ©ŽæFGµ(*ß¹Ÿµoí¥|ø=¬k©"ÏâFÓ5C¦YÃå,𥅼—·W~[< |›P¥IošXeyø­ø±ñ7ƾ!ë^3ñv«$ºÎ¹4“AjCö;²ÜC§À±ø¯Aa•®”Jð5ÃËq5ʬ­"JýxGšñN/­(ÓÊ8Vªºµ=Ùâs f®G ~w‡§:¸ÌDâ¿v©B!3àøÓ7£…ÀC*§hâqŽö‹ZP§Z3«)+{®rš„a«kšjK’*><򪃮¤£þÚAÓØ|P\ß úó]‡†¼[.…{ž¶‘.èË9×-Ë(°H“âõÇ’›¤2N‘Z³¸]«p…4ôÍFdj38xÃ5­¾·¨Û¼r¾ÀL²§ÅK˜ŠÇŽË„-µ„ÛÝéž–çKñ ÒÜÞ$zmž›q$ƒÄ·’²oN°¼õø‘,ÖéºìùžYA"Œ±>ZŠþ¥­_Ú&ªJSR’vm¸§'e~µ´mmÏÌ¡Fµã8Æ0äm¨ÉݵËmc­fšÖöÐ÷ þÕþ#ðöweeâBÑ_Z*9ÄÍ"™$¿³»[XŸþ2æc ¶6Pd‘”îa»À¼ñrïÅrJóxnàÈrž&‚`…œ,Ï/Å9D¯c·˜§ 7Ë” s Ê±ÕâÊJª;x—S»UÆ3º>(Ç!]ŠUO˜Š¤©$€–×F/0‘nï îI!ó|E¨ˆŒ†”Íñ"D¹Ëîr¡v<,#0>Æy8©ap´ª:¦£9jÚZ»òi~gÕ'²ÕÊÖ»o¢¤±,U4þ.y>TôæQäVk}ä×÷Ž*ÎËæ†d¿qï zuÉ¥ET.¬Añ’iOÎ0ÞHb«¹‡_¥øKPº7¨5IBZézøÿ‰¶­j‘ +w¹y>Ь²íTr`SÉ’Êà®èß|8ºÖ™‰–YåXIJuUâw¤Ï—ñ 7Eó  6Ô”4»ð?¸¾~Î÷W©â‰f%Ò?†Ÿî’(u‡ò’[_ ëNŽD>?f‰“t’ F[Ìtœ®XœÎ•&åÒox¥eÊß¼Ún×ån>êvRiØ)``ìš•Gdï&ÒÓM#t­y]'{]ÙîÏÇ{ÝæßÍ?Ú-Œ¹† 5MH¼‚V8Öfø¯2º¡¬€G,î£n9[s²A,²ot;gÕ¤—ÎVR¡QüIÕžO1Õ“j,ÌNBÄÄì¯Óü»ÓÂVyj]5/?1¬p;½Á?•G’IJ…#|©°ùÄ~–ÖO-îD€îhJÞ‹™‚V/âMJ0a#.Ê,ŒC7ÐpÎ*–#4Ãs4Ò÷šm[ND×<’Š“iÉYÆVZO–/ VÒ§)SMIYrJ£QvjíJWqw²æ¿*Ií¬—ìüçÂ_Ø_õïIn`»ñGŒõB”ƒ5¦‰ge¦Âù3Ïæì¿‹SPù)°«DBÈÑEúÓû;Ú4ž#ñ¦­.ÒOÒ4D•üÏ‘õ[‡Õ¤TŒ6cBg•T !PY·Æ?²…?á ý—þéÅ®ü5ý¹u‚TËsâ;‰õÄœ—*îÞ^§E ]¡V=ŒU“wÞÿ³½ŒpøfûS.ÙÕÌÿ‚rÊBÿ`ÿû<ÏÙÿWëýe+üšÿàœŸò¿Ø?þÏ3ö_ÿÕßàzÿYJøï¥¯ü”\#ÿb\wþ§DêÈ?ˆÿ¯±ÿÒQEü’{áEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPÄ?ðR?ù1ŸÚKþÉûÿéëH¢ø)ü˜Ïí%ÿdýÿôõ¤Q^¦øRÿ¯ÿI”÷^Ÿ«>‚ý íÇÄcDóŸáßÃøÃ<3dì ãvÅÁr£9#åRØËï×LÓšiˆlWÍF”î )%Gåw~òRÄ Oî”0@=ƒãÄüCÒVF Ïðßáú†.Ѝ†ì˜`€æ"¨Û€Ü¥v¶rŸ1x÷[!² 12}§ 3 –L«F0] œƒ•+øŸ©TÏ1´Új¯)·­šÑKU×h%ÓšMè~½G›*ËÒÞT —–ï·EwÛDy¯‹<_,ëûÆ$2²¤\n”¨Æä²–,‘¨sµ”üÞX‘ñ'Êþ-’{™oä•Ùä*q½rÇÓ€’>ÅJÉ öŸM‹Ìrþd%Šƒ"Ä0V%c+ÊÃqÞ6aO›³æ/xŽÝ^èåå™ä.Ê¨Š¤å~fùˆù€wM¡ã/ Xâ„]£ºŠV²µ¬Ý»$’]•ÓzïјÉ[ÙA]sµŽÑø¥'evÝ®äôºJÉ$¼¿SÒå ÿ½*K‚¯´®÷ÜÊÃ+ê¨ üä+®§k[[×ì|!kæÊË ©ÌÒ>P¤ÄÆŠRIå ” ޱÄHaBtº—Œ4­>ÞYîž“c~ù%D³¦æ”±o-¤ßd@âpU îÎáñ¯Š<]qãíbòîÙÔh:T²Ân ({Ëÿ*7bì¡£š_”’X ¶æpÅæûȱ™öiƒË0Ñ—>.¬i©6*Pv•jî+á…*|õ*k²vO™_æ³,ÃÃÕ¯+7ݤÓs––„/»)ÉÅs]òêÕÒ×óÓþ ãGRøaâsY–vÔüW«hÞÑí¥y‹é:#Ýÿi½Œe¥‰CK$×ÎV'–UƒËXÄm_Šz6‹çNâÚvÎÔ[‰†¥ f4ù"Bž-Óâ@ì¯ó´HÏ´-åÃý0ÿ‚‡xŒ\ê|$²ÍÆ·âȃ*î‰|3Nf?kš€%ÉF ´dÉäO†Ú|w-f~ÒY›íçRŽ5—f?Z²$±ÅT´my$Ž20?ÐîËð|1À‹ ¥ìébó:Ñ¢œygR– ë)|í˜\mIÔWæyGhiø†cRxÌËë5ýꪔÚmAÍÊ¥éÝ襑…´´iB×»:ü<¸™-™d‘óÞQ‹RÞ‰Jáv|G`\&ó&Â%Ü®%9óTýeàß‚r¿Ãÿ‹·2e’ÏÃ~ ÞŸÚ­:³Ü|LðŒ2L¦?ˆ¬müµvwx"È,eoŸé¿ÙëÀö7vÖÖÚܲÜé7ÍJë~˦ÝÍä*êZjŸˆ^KY‚ý£NžA¥heh-šÓ? | m/ÀŸmšE½ƒQð¿ƒÛK½´¼ºž FØüEð¯•,+ÿ l’ “F-¦´Ýo©YݪÛÜÛ›€¤|ö78têF.^÷µ¤“mûëÚÓÒ J<©$÷RjéÞ1qrÖV½\uO•Yµo~QM®nmº½–Œþn|Ið²ê ¦gÀ_RiË ¹~"¼~s •T£P ¬!Bä´…Þ"½Ô"M3Gñ è…¬>ßv®›„rG‹â‡«0ùAU9ÕÔ…ýÁøÓðžÏÁ¶—v“:IâVXïV_1h³ö‹WÇ–êÚóm‡íSý E¢ ð3O©5ËY~bx.ü9¨2Øø—V± TæËÅ7VÌá„»™Ú×â=¢e|»&0̯ı¬fW'³˜K¡;s%Êœä£Q{ŠV|•\l—5Óœd¤œ}ÏyÄé(jîÒJú«§§gf½5÷“»ÖßM~Î_³ÿÄ™.´ÍJ?xî"ž³ÞM¥k*•Á,±Ëã‚3>ù¼ä¸Žç϶wFEŽR‡÷áìÅ}ªZk“ÙxW[³Õ®<ã=>û@šBÎ/´ê¾¾²['íž! ™q$Ì%±ŽY®ty¤D…§µxY?gÿ‰×Ö×6‘KâÍ~i&¸@oj͹å˜Ù¦ÐõÌK-ÝÏÙ­Ÿ·ê6ü>@ÁVR¬6<…¿s?i/–¾ Óu OGñN¥cqXõm.ÛÅú„FÍe“ªi{>!Y²é,Ñ)žÜƒ.—3€-æÓ7‘>ÖõŸþÑŸ 4ƒâOê6ã?T’9—s‚±á…eIª˜Æ2,¥©Æ°$„ª¼Ñ%£–V ”´¡••Te¾~}ŒòËö‹ÿ‚¦|.ð|—º?ƒ/‹u[u’Þ$Òœµ™vÇ ŸÚVêÑùQ$-’Bò–sˆÞDs³ðßâ÷íñ{ãýÇÛõ™´]·ˆô6i£FF‚æmûܘæ Ñ)X7 ]îë÷ß ¾\}ÇxŒ-Yà_ dÕý›y®sB¥RœíÍ<_%^.N*R„Ú£†q²XˆÊGÉç¡¢xfúj — e§ÚN“ØÛ»*ùO{ulY0ª#ßoâV,.X”?@~Îk_ðÎ>ñ‰ç’ïÄ^5±¼ñÖ±q"yr¼Þ%Ô.µ-5 'vϳh-£Ù¤Lá"ŠÕR3°"ŸåóL±Ô|O®ézL -Ö§®j–Z] b]ä¼Ôï#¶‚5óÜ\.\±Æ3šþ³üEkeàéz ¤ÑÃaáO éú= e1Ä-tM>ßO´VUÙ·th(CÊFŠ­ŠþªâO 8KÁ쯇r|Ÿ›0Îq±Ì3<ï=ÆrG[êQÃápTiRŒ\0x Ëq£NmÎxxÏR¼á Ãó꙾;7«V¾*|‹Œ(aè¿ÜÒæ—4¥¯,ªTJR©-W3P„GÃßÚ»â,¿õ¤O‡õk iF…nud»–)[ÊmFëç¶ñƒ¹L×òÆ Ê1®Ó$Hû¯„?lmÂ1ð×àµÀm¥ ö~,y)*2°ü´G åwˆíšÝ$ ðG"sÀž<ñšëŸüI®É6ÇÖüQ¬\|×6Ð?“wuÉt ­äÝ*§E–+Êþ‚ø'öе>ø)×!U_øHÀ¿ÚÐHäÜ|Hð˜YÛÆû‘CÃ}ÉŽAˆÑæVHäü›3ÊeRJ.UTc(/~µz’“•ZqNs“äQwn2ÙÙ®TÓöiÔŒ¢´»M;ÅE8¥ÊÚ–ŽêÉ«[Ý~òVGÓ>#ØèbhÿáøO¨ÛÝÃ-Æx-õÕ´ÔlÙ¼ø$´ù̱ÈÍ峪Íku ‘\ÅÉ+?ã'ÆŽZp¾ºŠ/‡_¢UÌÆÃÅžu³ 22G3~Ðq‡ZIÞâfi²ÌPÆþ»ñö‹´–ÆçI¼ÕŒúeÛ<¦¬)ºÓ®-â`º–Ÿ)ø‹ Û‰â[»ySËÔíÜÇ,1´qKæÄïˆ"òò鯬²y7̺ϙ \&¾$H!Š4GGãIÝËbR½œ§-iÂòÄÝG•Jž'N$Ý8¶•:±-¯)¤’æÑÞ-7zÊöJ7OTãÒ´SMr-}Û==ëɵk‘eûBµ¶¢h~ ÒÜ”Mm^ÔŒºó›—lÐ#Dz³±C€­Пj¹´å×à¹Ö£€Iðÿâ +­¬q™î|-¶é%ø>1h#«(tU’‚Ÿò/Wñ‹@Í;k XâYfÕâY%/µ73]|AÃÕ^P©‰|„lFò(JË´ø£%¹¸U×#é·–ø>!Ó£V[ëcÖñy?ƒ ³)ÍUµib/ç`E1úZ™=:ÑÕÎrqQ”§*µ¹a§4ª;­ô’»W|ÑzœŸXTÝ¥R)Ù{²”V—]½½/è~ˆxÛö‡¾ÔRFþÝQšwºô{B¬Ÿ,®O¥oœÜ,F7˜Û+’÷ß°SÿÂiûDÞëò6ûø'ÄÒ<Œdd¾Õ%±Ðö»²²-^ô¢åb”î,ü“¹ñô׌±Cu$ÎÅçZ°”gÛû¸m> ^Æó.¨] +²¨ mû'ÿ¯Ñe“CøÏã›ó›KÂþ´¹’NôÛ}CVÕ`BòH]˜ßèâAVkxÜGëãpòÎÍ10¼*âë`0´—$SœeŒÂûx»¹ÉBXjxÍjNíÆñ‚äsGØÊT¹ÛQZ’œmËãÉ~Ïß”lšz¸Ë™Yþ¨évKâO‰ Ñea²óĺRÝ8w!lc¼Š{É<˜ú“mç´dc畎Wô*áì0Ü6{©å’Wm»‰ Âa”ªw:¬l YÓljß |´‡Rø³kuȯuí/ÌN¹µñeŠM…ßæDQÙ„jòf¾«ý¸üpß?kÏÚ#ÄâTšÞOŠ~)Ñ4÷‹Ät¯ _?…t¯(çhÖÌ6,–-P‚~T¯ô[ÃŒ³û€øG/pöu)dmJÐååpÄâ°ðÅâbÕß¼±ê©7¬¥y=[>O?iŠÄO½Z–ßጜc¿÷RÓ¦ËD}™ÿäÿ”…þÁÿöyŸ²ÿþ®ÿ×úÊWù5ÿÁ9?å!°ýžgì¿ÿ«¿Àõþ²•ü•ôµÿ’‹„ìKŽÿÔèŸCÿ_cÿ¤ ¢Š+ù$÷Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ˆà¤òc?´—ý“÷ÿÓÖ‘EðR?ù1ŸÚKþÉûÿéëH¢½Lð¥ÿ_þ“)î½?V~1ÿÁ÷‡‡?fÚáÿÃÓ¯¨xÇ[ý™>xºÏOÓ”Aiº…Ï‹ô[i¤ÔeÝ ¹k¿^Ç"gb•G–²Ÿ¿l‹ÚêÇRÔäÐü74Ó2hzeÄê²#¿Ê×—Lþ}Ì­Eg6àq0ÏîÏüµÿ) ø#ÿfðÿS¯5ü¹×÷·Þp.†ø{ªeÌx“3¬|±Ù•G‹Ž¬ªT‚Ž %.STÓ§UÑ©Š‹r¶"ÎËæsl×VU02Ä8á)rÓiSŒ£¥ûÙ/~¥Û÷£){7eh+j¬ÌÌY‰fbY™‰,ÌNI$òI<’y'“V 1õ ~\Ÿæ*µ\ˆa¾OëþWõVOOŸ¥m)Sœü®Ò¦¿ô·eå~‡ÏÎÊ6ôKËú±õwìIàáãÚ“àþ—$k%®™âCâËÅt·ðu߉¼¹UŠ¡Žyô¸mŠÈÁd3€wu‰ÿxjß'…~xëW2[ ³Ðo£Žf¨†y`xmбÉ7ˆ m˲~R­ùÿ¢ð˜¿øµñÇ 0øGÀI¥ÀìB„¿ñN­oµƒ0*â[¡ê‘°u 8o¤ÿà¤>-ŸGø/{a„>&×´íXÕ¼½Ð(}Fi±ùÒ7· åïP|ÄcÌ{Óù›Æ_Åd9éÈ# #Š\MVóJñ¹iÉ­8Æ1”cÆÉ.^U’IEiy”¹¨¶à“ÖIÆöRŠÒ);Y8ÚÑvJÍè“>Åð÷Äû‹=ˆ5gI6@N³)u’µ2|DH¥,X´îl ÅË÷­ã«Ùx_ÆÖGY’7Öt}Úhލà·ñ‡¯¤)æ|Dfm‹o,@Dûš0ÌpózÏÅ·/–º´n\ï?iÕV}­´ =ׯ Á>Q…,«žU·mAã‰#†XÛQ‹3, *Å®i±Å*ÇsçHâÌ„f5‰a;œÅ2<Ìdü…ù™}:–ÑÙJݒ底9]&µî’³W;c‹¦·“„š–“‹M+4õ³‹ºVI7{Ù{ÎÇÕÚÿʼnn~ÐW–0È#…Nµ"±ˆ>ÐÛSâ+LÉ#of_(’¬Ñ3*‚Ëóÿ‰üx³4ÁµxÌåÛý¼AlÓ+Èh¤¸ŠçâU³ u,ä,Û‰pÁÛ+"yôþ1º1´mªÚ¨‘YKA¨ÛùŠÁ*ðü`f‰°~W\™2ä`Í®ÊäíÖ%ƒæ\l aƒü\™@ÏLp#‘[Ñ—K=Ûæ–ÐÑtJëñÚÌÎx”Õ¨§&Ö“iÆèÞ©95e¢Zï}-ÞøŽiæ26ª¬Ç–=~Xa\"å%¿Æˆn/°._%²Å±ý³qÿA¹¿ð¢þzµöýE?ò»ÿãNíúŠåwÿÆt­,–‰ZËËÜû÷{÷9ùSnR÷äõ”¤®Ûò[$¶IY$’èX:‹I—Ô%œÊ¯¤·d’Œ£xOê¿'@KÁ*da„?ÑÏüŸÃ-á¿Ù3@ÔeLMãOø¯Ä­.]Ýâ[áá»MÛ·8Hàðâ*¯úµ Ò&QŒüßÜ]4±ÄŸj3‚K0þÑ’ëFÑòk±Œ†9,ŠÜ|¬ÀÈ+úÌøáaà¯Ùóá…òM/áç„ÍÊ‘·måÞ™i¨jóó÷—;œ„ÛÜÇDi·N¥᜾š~Ó˜bs6¹Ú”á—`–K•Yò{LÒœåKJ‘‹¶‘k¿/„Wµ©·2$ì­:‘âíe¤-g«Mµ±õgìéaÖ¼oª´b@–º6‹ ¯—Ä·³ÍªÍHÁòcm 2é¹DDC¤D§ë¿øžÛÀ~ñ—Œïe†;Ox?Ä^'»šUÙvÞÑo5[‰dTd+›»ªµ 8óßìé§ùšödÌÖ¼W¨JPÉö]2&ÊÙ‚E g»Õ£yv™1¸†óñ¿ðRIàØ‹ãþ«o&ËÍcÂ1x2Ðvñ¶±¦øZì ÀÝ麭ôä`’°°‘_Éøü%\÷ŒheyÝlvk—åÒJ¤•ZÕha„Uï%V¤Û…õ“³IÜúªr3ªíË sªï¢åIË_+-í¶ÚÄ^§¨\jÚ–¡ª]»Ëu©_]ê2JæY$¸¼¸’âg’FÃHï$ŒÎì2ìKMQ©¼‡õ_Ìÿ…/ßÞ­ªôr¬U*tèÒÂÊéS…:pÑFéÅBNRÚ1I-[²>Í6Û•ÛwmîÛÕ·÷ëóìϱàœŸò¿Ø?þÏ3ö_ÿÕßàzÿYJÿ'ø',$ÁB¿a¸qûeþ̧§ÆïšÿXêþú]áëaø„h89d˜çÜ]ÒÇÅ7î·×¹õ<>Ó£ˆ³ÿ—±ü`QE!Ÿ@QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE|Cÿ#ÿ“ý¤¿ìŸ¿þž´Š(ÿ‚‘ÿÉŒþÒ_öOßÿOZEê`…/úøÿô˜Ouéú³ù ÿƒ¶¿å$ìÂþÿêuñ¦¿—:þ£?àí¯ùIÁû0¿€¿ú|i¯åοÔÿä×ð_ý‰áÿ§ëŸ˜ÿ¾â?Æ¿ô˜…_@ä*’ ºqùOè*õ~Û‘Ó÷q_W iÿ…9KÿJ‡§Ìóªtùþ‡ï×üçÁ¢~Ͼ5ñŒñ›Ç:»ŠÕÊ•ó´ i––Ò*<Ŷ£®Â –Dh]AdåÏø*7ŠËj?<’´RÆšç‰ï-Q¤U•.ç‹M°šT.€„{;ã ó‡2LB…Gê¿ìà¡àÙ‡àφ¦„Ã4Þ³ñ ôLª’-ïf¹ñ…Â˱‰2ÂÚâÛ¹f „]¯~Ï |®&½ãx[Å:Œ1%¤ºî“i©ÜCi ,qA=Âí×s;¡d‰d‘åÛæ1aüa˜ç‘bxš®xü3â,ÛJ„*ÆŒ±IOC)œg8VJth¬YBɯd¹ZÚ^ì)J4+Ê-ѧË4ª)BS‹ZY?~í%ï9um&){ˆãFº½Rˆ©¶;Z5@ aqÑ|¡âôg‹½@ýnµ¦ýŽç_Ö¥§ìÍû:Úå¿áI|6È*Z é3.ÒTñö²Ä+÷Õ€YA H=%‡ìñû6¡ˆŸ‚? `›x-Ÿè 2:ù~`6'F K,©å|² B»ýÊœg€”¥Z\åRMKš¦wfß-ùªG+­Q4£«pjê×Õ3‘eªRiâ+Eo~Jj/U¢Jm÷Ý-ßÏù ûqÿŸ«ÿûÿ¬ÿóoGÛüý_ÿßýgÿ›zþÅÀïÙÕT7ü)oƒx”Ë‘ÿ ¿Á¬À6áF‚Z ©ˆíMƒ;5iÁðàpÁÂφ(ÇxÃ1Çq‡,1ý’©UFm­³åõ”™ÿ]pvr\-ܸ…Çáå¾"»·.½¬ûhÿ² š_[«}?åÜuø{Iöëùjÿ·ùú¿ÿ¿úÏÿ6õjˆInY0Ϩk±±àg(¾,” óœŒ fÑ|;øA§Fÿbøwàq.ÒÉcàßDÎB©Ve]5²,œq‚]]Gž‚O2ÃÀ~·™OÉt<9¢Å2†Œ$½’yeðT•‚ À8⊟»Àøyǽ^%©d£­—Þé­“O¯TšË)ÆÍâjOM¹#m9zƤ]ýÛ+é¯Í;u¿ùóÔÿð'Ä¿üÒÒ¬z󒱨êÎØ'jMâv8p¾#n Œd€z×öOýƒáÏú|9ÿ‚[þ3SO§éÓ Ë§Øí!E¾Ðy 埘¨êÇ8É⦯Æ»àܲœ’Û8ŠŽþíùiýB“•¿ëâµ®ï{7 ¾›zÊqI]·åËÕMÛá{ÿÃÿþð~¿ãø#ÃsÙjȾ ño‡4MÓ&¤ÑÀ5]^ÆÆGY/î®Âq.ã¹ÈÜŒ-[š³[ÚÙÇok ¼…Š(Æ"Ch©—mŠ…;‰Âè7LñYÀ#¶ÚÚ<áb_.4ÞäŸ.(€ س¹,åˆ$ðúäït¢C™ndŠ"_¿!gbÂŽ|Ò_†8ÎPÅ|ÆÄX® ©‡Åb°8|º†]…ž B†"­joÛTUkÔ›©Nš…J‘§E4¹ßî•äî‘t©S‹öté©+Í&¯+(B7×™BRuYI¶Ó¹÷?Á5l<à«-Ð éÐ7ˬ__ë‹!aŽI´»±9;C@!ÞV%†Xÿ3ÿà¸þ9M#öfø}à¸.ü©üwñJÆõàV*÷ºO…4-Vòæ7L‚ÐE¨êº%ÖRxí²UІýiÑ-bÒá†ÎO-×K´·ÒâŒB Nú=•¶‰Û d'20Fld¨‘…9ßð]¯&©ñOàoÃèòG‡>ë/¸"Ed†ãÆ:ßörÛmpm¼' ò–DÌ3Ú²– B~Kà®\ø‹Æ>r‹”cŸâs¹6’QyU Nq M%î¿k„¦“ÙÏ–æ’··˜ÏÙeõµ³t£M$÷ç”)»=šJMÉnã{ƒ”QE«ÄeÁ9ÿå!°ýžWìÁÿ«·Àõþ°ÕþO?ðNùHGì#ÿg•û0êíð=¬5ž?Mù)ø+þÄ9‡þ¬"}oÿ_aÿ¤Q_ŧхQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ÿÁHÿäÆi/û'ïÿ§­"Š?à¤òc?´—ý“÷ÿÓÖ‘Ez˜áKþ¾?ý&SÝz~¬þBàí¯ùIÁû0¿€¿ú|i¯åο¨Ïø;kþRAðGþÌ/à/þ§_kùs¯õÁ¿ù5üÿbxéúçÄæ?ï¸ñ¯ý&$°Œ¾}?OäMu~ÐfñWм3á{bÂãÄž Ñ´ ¸›XÔm´øŠŒ6X=Âí['•Ì@8cê@ü‡ÿ^½Cá´Ÿ‡|)ã­_E¿×àð¶¯m¬Á¦éÚ½¶‹<·–E¥´¶]húÔj!¹LØÉ&1ó ×í3xÜ/ æòÚÄæK˜b08xr)×ÆÆ…_ªR‹©(Cš­HRŠs”b¹’m%sÎÑÔŠ—ÃÍ'µ¢ÚæoÉ&۵ݖ‰»#úì°³¶Ó¬,të$Xì´ë+K 8ÕB¬v–VñÛ[Fª T‚(Ñ@«dàéÏ“ùOÐs_|ÿ‚—þÄÞ/‡HÓ>+êß> êoo²ûRohŸ¼-k,j¡Uõ=Wðÿˆ ƒ¦ÜÛQ•6ù²þ›|*‹öBøç°øMûoü%ñ¥}·ìž¾´²ðï‰YÕ|‰<;¯øÃLñN ¶i e+º1å0f²Ì8b”igåTpôãIb³ ƒ7§†q£Qb©àç†?‡÷ªâ›ÕÞê?MK’²N)NNÏ’h©^[^ñqw¿»eµ–Ö<™¤Úq²F÷T$}3Æ ŽÙÎ@x9üAò øŠû°þÃ:üð‰ô߉^½ŠAºN‰{2®È–ßS¼\y€¦S̾ðÙY_°çÄh™M¿Œ<,8ÌÒ\vÕãÁçbG¦],€.[-,\ðp>jùª\wJJ?Ú4äïn_«c ÛvI+áµÖ÷²nÞV½¼=hÝÊå³òîÑJÛµS·{]ÞÛ4|WW%‚ŽC¹xLAËl)!Ë™¯¤¯?d‰Ö®Èž#øktUöâÛYñC’¤Y7Ÿ-¾6íWHî%d•çkmmŸì›ñ{P˜ZÅ}àY•ÚF¿©E¸,lFȧÐ!šmˆ…r¨|–`¾jÄñN_V®x|Ë J:—­U©8ûZk“êíOšŒ19g(F®«¦êQ„ZP’‹“„ù[mÅ'¢ºjòr^÷.‘W—Ã~VÓùŽŠú²oØÓãLLÊxVäÈ{0V8'j‹« V œ/̪™$ïÀç’ºý”hÊðÜæÉ"Æ¥'²äÇÆ}22Fp9ÅTœ§Ù"¹{Ûrò\ÜÅýž¢äÝÁºZ8¼™¾Ì¶‚Öfº0ÂËt÷í®škxaXå›Û®?fÚ Eo†š˜¦?uÏÜ¡ÜAb­kâ)#pˆA%?6P…(Epš·ÀoZ[ÊšÃÿ!XÌíQEzLA܉c4âSº6 ¡c´Lδ󌚤ùªgläôŠŽ; äÛJÊ1Œåt¯t¢•売º|³¥ˆ®ù}œèÓV|®-JJëÞ•ÒÝlÒõ´&»¹2¶Õbdm<‚3Ž‚2[%â<…ód›Áú|zçÄ_é0û5ω4Ÿ¶ ͤ°Ïtpƒx?fK”\2 ?tíܸøuñÃIðÿÇQ2oðŽ¼¬gPÒ#iû¡A°—iÖ0¨A$+­ø5àŸX|M·ÔüEá­{L±Ò´]ræ;OI¿±·ûUÞ—>•h¢k«x£šCu©TWg\öðg™Î N>t1xféàëÆŒ!ˆ£*“«(5rÆoW'§5–÷ZhµR8Â\©©Ê|ží¾®Õ¯ysÝÙµ¹ö#8y>v’I1Y$2Ü„`¤`¼ÛɃfÈÕO–ßÇÿüsÆïãOÛ[â\Q܉ôßÙx[ÁÚb öuѼ=§J`ïFµ6¤Ó(ùRVe^…›ûK[YôÔo7hŠ6‘¤yHdXݤ¼†%f-&ÕMÊ©#3`1þþ?xÉ>!üoø·ã¨¤Åßü]âÙã0±MS[¼»@b*†=«(]›Wn0}Ñ/+úßf™‹‹öY7b¹ek[˜c0XzJZZÓÃ,mµR÷#£W ú|¸jqOZ••Õ¾Ì"Û³éirýï¹ätQE¢gÊeÁ9ÿå!°ýžWìÁÿ«·Àõþ°ÕþO?ðNùHGì#ÿg•û0êíð=¬5ž?Mù)ø+þÄ9‡þ¬"}oÿ_aÿ¤Q_ŧхQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ÿÁHÿäÆi/û'ïÿ§­"Š?à¤òc?´—ý“÷ÿÓÖ‘Ez˜áKþ¾?ý&SÝz~¬þBàí¯ùIÁû0¿€¿ú|i¯åο¨Ïø;kþRAðGþÌ/à/þ§_kùs¯õÁ¿ù5üÿbxéúçÄæ?ï¸ñ¯ý&$ñʪ¡H=zŽzŸÃ†ja"Œ??ž*•û ÛB§ËJp„Tbœ\d£d¯–Ö»qmÚíÞíð8&ï¯ÞhQTT1`¨³ªʼnÀI'É=+ut[òŠÞlA›%‘‹£ @Þ#pÍ’Á€ùFÐUÜ7ËØ¸ƒ *ô§M»Û’J£vÝÙ¨4»¶ì®•Ûg=Z”¨òûZ±ƒ•ùT®¯mö¾‹«z^Ë©ë? hÿÚ àÛÀß þ7üXøq´©4vž øâŸéÎÑô[3LÕ-ôëÈe%¶»µžÞhËE,O2Ÿ¯[þ ùÿ{xíeý¨¼S<,j㟠n ˆ°PÎóø*I.[*Þáåy‘™†kç„ß±íKñ½ì¤øgðkÅþ!Òoh|Q>™6á €®\x¯ÄCIÐ& 0o"Òúâä¨%`9\þ±|ÿ‚øûXH5?Žt¯ À¾\³x[áî—{¯jÒ¡RæÖok¶ÚF“§Ü7Ê<ËM3^·Tu0– ?.âÞ1ð7 Rux›™¶coöIäû4ö“½N¤iàño :Š6æÆÕÃBVW¬Îü5,uX§‡u£MÛÞö’£ )oyÊš|²»åä·Qm«ü[ü þ 3 ¢/ívê˜KðËàĬÀáå“áÓLùèXÉ¿qëþ ³û[ünø•û(|#ñÿü[¿ãOØx¢ê2x[Âz2êW6~=ñN‘a#ÙxFÒmck=6ÂÊÅ^;T*"ŒËæ<“I'Éß à—²¯ÂGµ›GøakâÍ^‰ˆþ!]§‹¯žHYJÜÇe{èvÓoa1m?C²”7–‘*}ã¡øm {8.gmØa´óaKu ´%º0†(ãä&/)÷uA– ü•âgpÇ„àþ˸^Ž RµLƆ[”eØÌœé{8Я„ÊpîéÓmÔ‹ž7yZЦõ=¼5,]w‰ÄN£”yR•fãNÍ58ά’oEEBÏfÚŸÛ¶_¼aºÍ&‘p]WæŸN²á˜Ð l`eNHM íyÛ—ö€ñ,˜2龟k;šÊ휆mÇbE©¤qœÇ(㟢Ò5ؾî±zÇfWI¸$’Ü:äcã 3 ã‚qâ‹`@Ôí? xm H»ûÏl­–s³î†$&ö8Ng)ac{Zר¢´Š¿*•“µúïï-YÔ¥UÛ–tç;]ÅUVó²SmÛîÖúZÇÕ÷ŸÞ#XÌJû M};ı§;ÚvXÓÇU\q·ú߉!>\³Æ¥Nq-¢œn oHZÝ Ã¬»zˆä Cñô×odxñ5Û ™ä¶YL2Ü[ª#4’<ŽÌ­&â%)óüÎÙK†•j¹„T½¢åï(”«4¬î­ìÔn壛vwEÓu%)FsjwW‚‹QŒ¶ŽIs9»{ÊïÝz­Ïý°ÿo¿þÍÞÓþ#xsáN—ñF]itÚÅâ{ヒó¦ê÷ á½x9æY¬eöÇkpú~Æ”Ý_Ík?ø/ÝÔS,—²¥ÔjAEñ¶k|󓹟á=ÐaÀØGÌr§ï/ŠžÒ>)ø Æ?¼D¡´Ÿè·šDîcIÍœ³ { N¥Ìmu¦_Gk©ZîùEÍ´{¾\ŠþA¼aá]cÀÞ+ñƒ|Anmu¿ kzžƒªCól[Ý.î[9ÚeS-¼¯–Ú`6OnñÍ(êOô€< á‡àøƒ-â.§ŠÎò¼]]*±Í³Ü «åx¨*QŠ£‚Ípôå,2…_kWÙÆJ8Ü4Ú<¼Ã‹£8ºejôÜeN”¹g£nTÛ\ëe&Ûp—c÷ÿÆð^›xKŰý•§ð¾©®øg\ÑtïÛüoV]#RÕ4ë‹=U´ð‡FÑéóÜ}µ­§g-ц;u¾¶ ÓçŠyZy¦ðid•Âçhi»cqfÆIÆXœu$óQQ_×<á¯ðLƧ dßÙRÍc…†6øüËícƒuÝfXÌdéYâj¹ªrЍÜyÓä‡/ˆÅâ1\žÞ§´äæå÷asrßàŒoð«^öÖÛ»”QE}ÑÌ}•ÿçÿ”„~Â?öy_³þ®ß×úÃWù<ÿÁ9ÿå!°ýžWìÁÿ«·Àõþ°Õþxý4ä§à¯ûæú°‰õ¼9ü Oý}‡þQEŸFQEQEQEQEQEQEQEQEQ]o…å¶¾,¿[k ‹›A=™ÔtÝ?U‚ åñW†,^e´Ôí®í ¦Òîæ‘ gD™öcši]Ûmï¢M¾Ý»ƒÓðü]ŽJŠê?á/Õ¿çÓÂÿøCø/ÿ”Â_«ϧ…ÿð‡ð_ÿ()ÚÍ/üòa¯—ßÿ×úzrôWQÿ ~­ÿ>žÿÂÁü ¯ñ¯í‰ð#á·Äo |ø‹ñÏökðÅÏ`ÿÂ ð³ÆºïÁ |Fñ¯ü%:íß…ü1ÿ—‚5Õ°ñ7ˆÿá#ñ5…÷‡tì}2óûc]³»Ò4ÿ´jó[ ”^ÎoÒ ÿíâ×Ëïôòõü;éètWQÿ ~­ÿ>žÿÂÁü ¬O|T±ð„§Šu_‡žÓ.µ¿ xj×Qñ‡~hÖ>#ñ§ˆô¯x;Ãð]ê:=µ¼Úß‹<]®è~ðÖ•®øYÒ´=. ­OQ´µ˜´;Ëÿ_ü˜õòûÿàzÿOJTWQÿ ~­ÿ>žÿÂÁü £þý[þ}ñF©©·‡&Ö5MWÄWS_jª@‘{ü1ìëÿ=?jÿüY¯ü7ÿ£b­Â ÊU,Üc+r·nh©%F‚ï·V·ìÒÿ?»Ìú¾ŠùCþ‹öuÿžŸµþ,×þ ›ÿѱ^)ÿ ßþ Ñÿ þ×þ â'ü4ý¯ø|WüOþüŠßðœÿÉ1ÿ†öÿ„ÛþDŸø¬?ä ÿ"·üTò ÿK¤¡µFì®í h»úßnÝW—ù¿»Ìý¢¾Pÿ†"ýç§í_ÿ‹5ÿ‚¦ÿôlQÿ Eû:ÿÏOÚ¿ÿkÿMÿèØ£–ŸüüÿÉ$}¿Oów™õ}ò‡ü1ìëÿ=?jÿüY¯ü7ÿ£bøb/Ù×þz~Õÿø³_ø*oÿFÅ´ÿççþI »íøú›û¼Ï«è¯”?ሿg_ùéûWÿâÍà©¿ýùóðy¯þÁhüKðÁ~4øÝÁ»ØÇ>.“á×Ä/Úƒö¦ý <7{ã«oŒ_³_Ù|vö¿´—Æ¿Œ2éž*´Ò|i­ønÖóÃÓh¶h3=´v+u¬ÞêmSŒ”œgw¹5ÊÖ‰¥»õA{Zëwmﮟð~ï3öÖŠ(¬†W ëšåÖ‘ucaacáĶOxFp'ð…ogyï|+£_]Í5Ýösw<³ÝÜÏ<’O<Ž^CÈPÆÿ„¿VÿŸO ÿáà¿þPUµÚr•ÓiÚ*×_öòw׿üø?ÓÓ—¢ºøKõoùôð¿þþ ÿåx§ÁïÛàGíÿ ü(޳_Ç?øD?²?á-ÿ…=®üø›ÿ¿ü$ÚØ?ð‘ºßö'ößö&³ý‘ý§öoí/ìOì~wØ.ü¥hÙ»ÎËwȬ¯µýþ¡¯—ßéåýißOC¢ºøKõoùôð¿þþ ÿåð—êßóéáü!üÿÊ -æ—þ¿ù1ëå÷ÿÀõþžœ½wÄ,|'a©âWá熴˭oÃ^µÔ|Aá߇š5…ψüiâ=+ÁÞðüzŽmo6·âÏkº…¼5¥G#_ë¾#Öt­K‚ëSÔm-fÛÿ„¿VÿŸO ÿáà¿þPQhw—þ¿ù0×Ëïÿëý=9z+¨ÿ„¿VÿŸO ÿáà¿þPWÅßþ"xËÅß¶Wíeá{Z{ xáÇ쵄¼;ge¦èú†Þ"ƒã^¯â ë=F³Óôã«ë—¢ØjúÜÖÒëž—¡é—wÓiš‰i`ÔSRi¿v*M8¥tåèÔž·’{mq_kõÿ+ÿŸáßN+þ Gÿ&3ûIÙ?ý=iQÿ#ÿ“ý¤¿ìŸ¿þž´Š+ÑÀÿ _õñÿé03žëÓõgòÿm?à¤ræÂþÿêuñ¢¿—ëï_ÔWü½ÿ)"ø!ÿfðÿS¿5ü¸Wúaá*¤<3àØEE(åWi¶ÿ_ÎÖòµüÏÇÅû,´zd`”íýêˆyg”f4á­7d¹cˆ\ѲÕ>w U­¯Y]+'gÔe6ç:J6Ѻm­,¬¢ÒÓ[«ìÒwgô-†> Ìñ‰|V– ¶XÜøo]e IOÞ}–ÒîB£w›˜T¾I1=ë_…?¯·,_tµ¼°ñ-Š6‚¿ÐíÕ³¼aA%†âä~ißðSßB‘Ǭüðö¬å[̹Ó|u©x}QÀÊ쮼'âVuvÂ:F"|ÀÒîò“Ð4ïø)¯‚ eõÏ…4µ`@xwYðöºì7à±mf D¬«m߃µÀ „s¼g 91Pk~IB¥íç{¶¯m^ý[°ç*<ׂÃÔŽZU(ÊîÛ§8«.»[]šgëGÅ_…Ÿ|)ðÿÄ)Ó¾%xKÄZ® Piš™ª¤ÚÅÝÍÜñ@&ƒMòÒàÙÚ¬†æòïdqù6òEÿhUTü±ñTÍq|™Áe‹aÚNÕŒG*)TÜÌÍŒ6Ýä;C`%y¿Äø(OÂIôiu|)ñ­ÄÍq¥xM.%šäª¢ù‰âéì’8@l†Ÿ „adfÇðWŒoýRñîÁÿììÞG£â-nk×@Œ¥#›GÒ¬¬"$*„s½28-ËKÁ`sÉÎn,Eœ=š©ˆ¦©r©ªrœi¼B¥¸´¥$®âÞÚ5ØêáiÅKÛÁE_ÝU½«M[KFU$ÝÒ|±º[ÚÍŸtÜZJd|NÉnC)*ÇŒ‚AçiÆO_æÏþ ƒôÿÚkQ‡C‚8u™ü!á;¯ù2puù-'Û,‘•DÞ*ˆ6´¢YüÅy&þÃñwí—ñ³Uó ~,±ÐÑ’Xü5¡ivÖådŒ(U½Õ¡×ucT_õš1Œ¸–f&bÿ‹Ÿ|Q©xÇâ§‹ŒqבþF}{Õ•'çŸn;×ö– jâT\°tõ3圖‰¨´›æ³Rz«[uÒçŒðé;s== ŒQùÒÖb1ädÿŸ_óëV‰Ï?Óù}+èð™ä1<¿¸”\¯kM4¹Sm=7²ºèïÓ®N¯øjÿÁ9ÿå!°ýžWìÁÿ«·Àõþ°ÕþNðNV?ððŸØDg¯í—û0{ÿÍnð=¬eý3+F·p[ŠjÙ=4í¿ö„v³¡õ<=‹ÛZ±ÿÒŠ(¯ã3肊( Š( Š( Š( Š( Š( Š( Š( ºÿÈ'Çö+Úêiá åë™ñׯŸ…|ã|aøá‡~»Ó´¯éúŸ‰õ8lUׯ|YáÛëmF¶b׺ί&¦jº«iº]µÝäZ>“«êòÙ¥jVÕܬ“mÆI%«mÅÙ%Õ±=¾kóGME|Cÿ#ý†èä¾ÿßz×ÿ*(ÿ‡‘þÃ?ôr_ÿï½kÿ•^Ưüú©ÿ€Kü‚ëºûÑÑj¾%ñ~×ðÇÅk~ð4Z$÷³‡á½VþÃÀÿ> IáIñJ?Š)µŸM¸Õ~(ü8ðŠëú‡ÃÙƒYÓãð>£ðþþÓz.³ñ÷Ç>Õ´¿Ø'ò‹þ ;ãÏìoÚ7öãøcÿ §àŸ„¿ávÁ/>xþ×ÅÚWÚhßÚÿû[Ç_ðRÿ–ý5¿ø[>ÿ„gãg‰¿á&ÿ„ïü(¯Ú‹ìþ:ø‡ðîïþ7ˆ>ÅÿŽNÿáä°Ïý—ÃÿûïZÿåEðò?ØgþŽKáÿý÷­ò¢®0«Ÿ±¨ôJÜ’èÓ¾±{Û^·m¦´±uÝ}ÿð®Ìø¿ö³ýµ¾'ü,ý´þø'Á_¼àmOøÙû&|׿gŸ‹ÿ~x;Å?t¯Úâ¿Ã_ x·ãWÀÙòïöcñ'ÇŒÞ ðŸ…>4Ýè<%ûc| ðo‡¾1üø•§kß |[¢| ñ®ñçŸ~п>.~͵¤ý¦ôOŽß´Wˆ~(ÿÁ4~"|lý|K¢øÃ~ý‘i;ø(WìWvß¼Añ+à·ÂËþËú&ƒã{Ç õ_…ßµ–û@~Ñþ"°ð<úÿƒoµcàÇ»_~«ÃÈÿaŸú9/‡ÿ÷ÞµÿÊŠ?áä°Ïý—ÃÿûïZÿåERŒÒû<î¹]ù¶ÿ·.¯äÓóÕþ%תòÿ/ÄõÙƒÇ×þ=øUhþ)ñn·âoŠžÖõŸükÒ|Uàÿ|9ñgʳÍе߆:¿ÃÏ ë'Ó<%¢xKLñ>‡ÂÑ޾*Ãã‚×? ~$é¿hƺGÇOˆ¿CWÄ?ðò?ØgþŽKáÿý÷­ò¢øyì3ÿG%ðÿþûÖ¿ùQYºU[oÙTWéÉ/þEëºûÃþ Gÿ&3ûIÙ?ý=iöõ~9þÜß·7ì‘ñCöHøïà/|wð?‰<_âOÜZhZ¥ÅüzÜö¯ml÷¶¶ípÖö³40´Ë%ÌŠ¶öë-ıDÿ±”N2*jQ”_´ªí$Ó·--lí &›vwÑ~lùCöaÿ’ÿ ÿ³ÿ³ÿ×hÁ2ëêúü?Öà©ÿ±_ìGûD~Þ¿hŠpøgâ>¹ûdh?íü- ¤myoàoþ ÝÿïðÆƒ¯Ü\êWzV%¶µ®ø3Åúu¤—×°KáÛÙ5+k.t©u ñüþ‹Dÿøáïþj*çF¬ÜeIÅÓ¥f¶v¥ÿĤ–õŸüêÌýµ¯Ê/Ù‡ãWìÉá¯ø—ö^øÉã…×?®o/ÚëÅzGìÉâ t|r[ÿÁDþ5|qøñ€ÐC¬üIµÑ-|9¬ü<ý£|5ñA¼!‡<ðÎ+öˆ¸ñ&…ðïB—ÇZw“ÿÄB?ðL?ú-ÿà?‡¿ù¨£þ"ÿ‚aÿÑhŸÿü=ÿÍE …dšt§«OF“M^ÝûÿÁhïuÿoëË^Ìù*Û/öê´øUûê‘~Ó? ¼?â?ˆ_°oìÙûKè&ý |[ðïá5ÿígûIüw›â'Š|sð;¿~þÁÿ¼]ûPèŸ -ôƒþ±ø ûIû9~Ñöžø³ámSø‹ñ âOÆ/‡2ðqûx~Ö¼}ãOÚ‹öpø}ãmÄúgÇŸ…ß·oìÇeûk_>ø—ö¤ðåÿ€aïÚwÄ^ø•áÙ'ÀŸ²ç…þ=xWDøÑñà—‡|GðÇþ4ý­>:xsâOÁïŽ~ Ö´oƒÚ§ñwÀ6ÿþµÿˆ„à˜ôZ'ÿÀóQGüD#ÿÃÿ¢Ñ?þø{ÿšŠÑS¨þ­®¶ÙjõOn>åd$Õ¾.ß…¿>¾¯³9ûUþÒ·¶?ƒþx7ö ø'â…Ö^6ý—¼%ð§ÂÞ5ø§à>#~Ùÿ³ßÄ…¿|Uñ7ö©ð—ìýð‡ö$ñ‡ÄßÚW>4 ã÷ìûûHþÏ?²o€u߃÷zßÄO†šÂï¿/¼{ûÉ_‰_ñüþ‹Dÿøáïþj(ÿˆ„à˜ôZ'ÿÀóQYÊYZÔ\l¬ím_w¶¬jK_{w÷m§õçÙŸ¶µø•á_ùOÿí?ÿÕ·ûQÿÿÁ0ÿè´Oÿ€þÿ梾pýŒÿk/_¶?üÏÅß>xÛOñ—…$ÿ‚||NÒ®ÌÙKJ¿Óþ4þÉ6/©giwx¶¿jk9n,eYå†êßvÉð]AoP¥R¬ç줮ûóAÛðbm>[;ûËúü«3úD¢Š+”³¨ñü…­?ìWð?þ¡~®^¾jø·û}~ƾñî©àß~Ñ?,¨Ú>½¤øOC±Ö4Kë"ÒþÊ-_EÔa¹Òµ½4Ü›ÍX³¾Ò58m5;»X|ÛþGû ÿÑÉ|?ÿ¾õ¯þTV²¥UÊMS¨Ó“i¨I¦›Ñ§mS%5eªÙuGEÿð׈üiûþÛ¾ðw‡õ¿x»ÅŸ²í)ᯠx[ÃZUþ»â?ø]ø3ãM/Cðÿ‡ô=. ­OYÖõNê×NÒ´­:ÖæÿQ¿¹‚ÒÒ ®&Ž6ñ?‹¿¶çìŸâ¯‡ÿ>!þÏ?þ|pø©ðûáv»áËO‹?.øãá§‚µüQøïkàߟ ¿gŸ…Ú'ˆÿáøÓñ'Qø™á¯Ø]|*øñâý·Á¯Œúì÷ãé~•ÿ#ý†èä¾ÿßz×ÿ*(ÿ‡‘þÃ?ôr_ÿï½kÿ•Õ:‰$èÕvmü2W½“OÝz4¼·{Žëºû×ùŸ˜Ÿ²oí9ûY~ÕŸô_ÙöÇöÊðLð·ü6‰þ<þκŸì÷ûOk¿4¯…Þÿ‚^|Eð.¡àÿŽ3~Íß þ?¼'â¿Úïâ/ÿkìiàØ~Ùë µ‡ZïÆ}'Bý¥ôOPý–¿mˆuƒ¾3øÁûQèŸþ*xûDý5߆±§†¾øÄ~ý¤¾ürý™?g‹_~+øáž±¡ø‡ö»×ôM#âÅÚáÞ•ñ£áÆ}#àoÀË€0xÇã7‡¼] üý¢Ç_uÿÃÈÿaŸú9/‡ÿ÷ÞµÿÊŠ?áä°Ïý—ÃÿûïZÿåE[ŒÝÿÙæ´²´Ží·¬5¾‹]’ÒÂM2{uôóò~·?<ûMþÕ_|#à´øçñoàŸ‹ÿ·~6Á6¼{ñoà‡‚¾"ÙüFøû(|o›þ mû ‹oƒ~-ðoÿcÏ_ðÊÙð‘üRð޽ð?ö«øõûI~о»ðæÓJðGŒõßøRß´'Œ¼GýB×Ä?ðò?ØgþŽKáÿý÷­ò¢øyì3ÿG%ðÿþûÖ¿ùQS8T•­BqI·e [T—ò®ÃMY{ÉüÑöõ|CðgþO›öÞÿ²û ÿé—ãUðò?ØgþŽKáÿý÷­ò¢¸Ù3â§Ã¿Œßµ¿í¡ãß…¾.Ñümá GÀÿ²}¥¦»¢NÓZ½Þ™añºÊúÚD–8n-î-î!exna†F¢¸Ekyà–EsŒ*¹Bq^Í+Ê-+ûZz]¥®ŒWM«4õïäÎÿþ Gÿ&3ûIÙ?ý=iQÿ#ÿ“ý¤¿ìŸ¿þž´Š+»ü)×Çÿ¤À‰î½?V0ŸðtGì›ûT|wÿ‚€|ñÀÿÙ£ö€øËá=;ö$øá½CÄÿ ~ |Eø‰áëYø·âƧw Þë^ðæ±¦ÚëVºn±¤ê\÷1ßCcªi×r@°^ÛI/ó{ÿãÿ‚†ч~Ù¿ø‹ßÿù†¯ÖÛïŒÿu;ÛÍKRø¯ñ+PÔu «‹ëûûïx¢îöúöîWžêòòê}RIîn®g’I®.&‘åšWy$vvf5álüTÿ¢—ñÿ /ÿòÊ¿¡x[Ǽç†8*È0ùYŠ£•ác†§ˆ­_ µb§9óN0|‰ÞmZ:Y#É­•Ó­Vu]YÅÍݤ£e¢Z]y“Ÿðî?ø(gýwí›ÿˆ½ñ¿ÿ˜jÿàœ?ðPÃÈýƒ¿lÓÛþM{ãÿ0ÕúÏÿ gâ§ý¿ˆøYxÿ–TÂÙø©ÿE/âþ^#ÿå•{•>’¹õX8K†²tŸU‰ÆÝ5ª{ÿHËû—üþ©÷GüÉ6ÿ‚pÁCHÿ“ ý³²9ÿ“]øáùÈPŸø&ÿü8‚?áƒ?lÿoøÅÏŽð†¯×/ø[??è¥ü@ÿÂËÄü²£þÏÅOú)?ð²ñÿ,«Ê¯ô€Îk¶åÃÙRæ,’ÄbÝÖÝe½´*9M8ÿËê›Ýiòþ™ùO¢~Á?ðSo Éæh±WíÑ£¶r˧~ÍŸíb“’H–|°Ì¤œ••Içæ½oFýœà¬ZXT»ý‡ÿl]r TmÕ?dßk* À*·¬eg IrnX1Ë-}ûÿ gâ§ý¿ˆøYxÿ–TÂÙø©ÿE/âþ^#ÿå•xuüaÅâoíøk&ªÛ¿4å]ÎëgΚý4þÍ¥­ªM_{(«ï®‹}^¾gÊú/Áø)b8u/ø'Ïí¿b›ŽùtÏÙ«ãÌYn’}–oYíœ e`õÜÄF=ûÂ_³íïs½Çìwû`Ø}¡#•†£û8ü_¶™w(Ú’Åuà ð´_;2eK22ØÇªÿ…³ñSþŠ_Äü,¼GÿË*?álüTÿ¢—ñÿ /ÿòʼªþó’¿KËi¿ùy$··³¥ñ^êOÝW{'ÍtÒÕ^íõÿ³OíѱDŸ²Oí0ÄŒï—öxø¦Gá8H' ÂYˆ8c^?ÙÃöÖ÷¿±Ïí&ç?€âçqÃxNbA8ÀÈÛÎKg#€ÿ…³ñSþŠ_Äü,¼GÿË*?álüTÿ¢—ñÿ /ÿòʸb)ËŸšU úϹÁt¾Û·Òé¯ìÊVÖMùòÙÿä’Šü? §Äÿ³í©è—vqþÆÿµ ¼¢ ËÀo‹3;ùSG1ÚƒQ¶3 5Wu\¶ùc> «~Ç·Œˆc/Ú½×-ò[þÎä2)FÛð†HêŒ[Êq”†B¾£ÿ gâ§ý¿ˆøYxÿ–TÂÙø©ÿE/âþ^#ÿå•iGqT> ¯µæ^þ!ÙÙ&×5Ijí»»JÉl‰yUïÏ;ôVN+ÎͶ߫·tÏ‹|yû!ÁC~Ç5¶û ~ÙSÞÜ«ÅÔ_²ÿÆÙ’Ñaî_”Y$o"1“ʇýì*ñ¿Ì'þ ÃÿvgØ;öÑwvgwÙ{ã‹3»YÝ›Àij1$–bI<’M~¸ÂÙø©ÿE/âþ^#ÿå•ð¶~*ÑKøÿ…—ˆÿùe_U•x˘e4å[9ͧR­LF+žVÙhì’èµÕ·»wU ;Ö¨ÛwmÆ=I-4ŠW²¾»YY/ÉEÿ‚pÁC@Çü0oíÿˆ»ñ¿ÿ˜jœÁ8¿à¡€ÿ ûfñÿV½ñ¿ÿ˜jýdÿ…³ñSþŠ_Äü,¼GÿË*?álüTÿ¢—ñÿ /ÿòʾ£ôÏ0ÊÐᬡûª*øœn‘ZÛâÖîÍ·ÛÔ‡“ÒzºÕ>èÿ‘ù@ŸðN?ø(XÉ?°í™ÏýZ÷ÆïþaÿÎ*tÿ‚rÁB€9ý„?l¾ê×þ7vÿ¹¿V?álüTÿ¢—ñÿ /ÿòÊø[??è¥ü@ÿÂËÄü²¯c ô§â7// ä²äN×Åã–²½Û³ózt¿‘$¢ÝýµOü>^^¿Ò×åÏØ'ö ýº<ût~ÅÞ.ñwì]ûYx[žý¬¿g?øŸÄþ#ýœþ0h~ð燴?ŒÔõ­{^Öµ?Zéº>£é¶·:†©ªj6ö:}¼÷wsÃ2H¿é·_çÿ gâ§ý¿ˆøYxÿ–TÂÙø©ÿE/âþ^#ÿå•~=â·ˆù‡Š¹†S˜fv)žSƒ¯ƒ§O:õ£V5«ªîsuäœe¹RŽjõ=N”ª)ÉI¹YY¥k+/™þ‡WùãÿÂÙø©ÿE/âþ^#ÿå•ð¶~*ÑKøÿ…—ˆÿùe_”ýCþžÿäŸý¹Ýí<¿øúQ_çÿ gâ§ý¿ˆøYxÿ–TÂÙø©ÿE/âþ^#ÿå•Pÿ§¿ù'ÿnÓËñÿ€¡Åþxÿð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQõú{ÿ’öáí<¿øúQ_çÿ gâ§ý¿ˆøYxÿ–TÂÙø©ÿE/âþ^#ÿå•Pÿ§¿ù'ÿnÓËñÿ€¡Åþxÿð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQõú{ÿ’öáí<¿øúQ_çÿ gâ§ý¿ˆøYxÿ–TÂÙø©ÿE/âþ^#ÿå•Pÿ§¿ù'ÿnÓËñÿ€¡Åþxÿð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQõú{ÿ’öáí<¿øúQ_çÿ gâ§ý¿ˆøYxÿ–TÂÙø©ÿE/âþ^#ÿå•Pÿ§¿ù'ÿnÓËñÿ€¡Åþxÿð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQõú{ÿ’öáí<¿øúQ_çÿ gâ§ý¿ˆøYxÿ–TÂÙø©ÿE/âþ^#ÿå•Pÿ§¿ù'ÿnÓËñÿ€¡Åþxÿð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQõú{ÿ’öáí<¿øúQ_çÿ gâ§ý¿ˆøYxÿ–TÂÙø©ÿE/âþ^#ÿå•Pÿ§¿ù'ÿnÓËñÿ€¡Åþxÿð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQõú{ÿ’öáí<¿øúQ_çÿ gâ§ý¿ˆøYxÿ–TÂÙø©ÿE/âþ^#ÿå•Pÿ§¿ù'ÿnÓËñÿ€¡Åþxÿð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQõú{ÿ’öáí<¿øúQ_çÿ gâ§ý¿ˆøYxÿ–TÂÙø©ÿE/âþ^#ÿå•Pÿ§¿ù'ÿnÓËñÿ€¡Åþxÿð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQõú{ÿ’öáí<¿øúQ_çÿ gâ§ý¿ˆøYxÿ–TÂÙø©ÿE/âþ^#ÿå•Pÿ§¿ù'ÿnÓËñÿ€¡Åþxÿð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQõú{ÿ’öáí<¿øúQ_çÿ gâ§ý¿ˆøYxÿ–TÂÙø©ÿE/âþ^#ÿå•Pÿ§¿ù'ÿnÓËñÿ€¡Åþxÿð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQõú{ÿ’öáí<¿øúQ_çÿ gâ§ý¿ˆøYxÿ–TÂÙø©ÿE/âþ^#ÿå•Pÿ§¿ù'ÿnÓËñÿ€¡Åþxÿð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQõú{ÿ’öáí<¿øúQ_çÿ gâ§ý¿ˆøYxÿ–TÂÙø©ÿE/âþ^#ÿå•Pÿ§¿ù'ÿnÓËñÿ€¡Åþxÿð¶~*ÑKøÿ…—ˆÿùeGü-ŸŠŸôRþ áeâ?þYQõú{ÿ’öáí<¿øúQ_çÿ gâ§ý¿ˆøYxÿ–TÂÙø©ÿE/âþ^#ÿå•Pÿ§¿ù'ÿnÓËñÿ€k_ðR?ù1ŸÚKþÉûÿéëH¢¿‰Û¿‰ßoínl/þ!xâöÆöÞkKË;¿k×6·v—1´7×6ój öóÂïÐʱ»#«+Jê¡KØÁÇ›šòr½­ºJÖ»íÜ™>g{[KÿÙPythonCard-0.8.2/tools/standaloneBuilder/doc/pic9.jpg0000755000076500007650000016316410240730043022433 0ustar alexalex00000000000000ÿØÿàJFIFHHÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀR "ÿÄÿÄ[ !“Ñ1QST’Ò"23ARU”•³Ó56Vrst±²#Baq‘£Á$4buC¡áDF%&‚ƒ¢´'We…¤ÔâÿÄÿÄ&QA!"1a2#BRÿÚ ?ÐåÎ\ÛY9”töe•KfIè£Æ©€É ÷ÅÀyÍÿŠY_вÿÑñÂSÿñæÇ¶Gö‘~£pä ÙéiãŒe…ÌÇo<ƦYMeOçšÒÞUÒ°>[>ÅÀMØ™1!-y¸ê?ÉAþ3åA²=YÝ¥¼ý#|ùÉ!ÿõOxå’ʦ°fÊc[qUÚ”ð[ÕÔOVLz,&øóQ¹Î,iïîoÀzºã:Y~i§Þ#æ\CôË”}Èõgv”ò~–r²h*e²lèéê1feuÃdÂnvŠãqÔnâW}dd½½iäål¯´ãÉú¶Ô=ÙÆšÙ^ZöB#¾ñýƒyñ¾ÙöUµdäE…jYL‰µnµXà+$£s^ç\ËÝÆ¿ðéÿƒïÚƒüdÊ.…dz³»Kèý2eB²}YÝ¥ÑÜ¥‰ÜΑ¡–îwOálëÿÖã»1Šüß{ƒ/ß~µoU’ù3K”6Ìbͧ¤§±+¬Ç6GJ÷6Hæ{s‚\ãœÒÛ‰:€âÖn½[þXŸ~ÔCôÅ”= Éõgv—ßñ‡(z“êÇ´¤µì¼£¶¿H³­Y«¢²'µäm;­0¥#‹ZÝ`Zhißp"ûÅò3'™@ËB¢È«‡]RúWç)œÙ!{\çÈZHyãsšu>D™Ðˆ‹Çõ>ýª©J¹U_RÊj;*Ψ÷áŠ7=θ^n×@•ý0eB²}Xö–ƒ lË8ZY=lYVF-.¢¸ÔËœ’^ Eà†‹ÚF·‚N+Ç’ì—èò³-êªè+éj%— m§SË,¹ÎלÍ9®¨—Žøž ­hý¦qø‚óøùwÒöPþ•êÇ´½‹¶ÿC²½Xö”öݫȌŸ¢¦‚Ï’8k*éæ®ŠY 5-ÂqßpcÞ Ãqõ­.@ØRZ{*l¹bºÔšŠV哱°=áí•î#ÎÞA–ft".qí~ý³?âå¿Ðì¯V=¥4ÿ¥¨¤Íi6]Ÿv1,yÊ77…îÖ*–ÎÉ«ѲìËWƒ˜Úš«:¾hìø¥Ç<ð¼4ã!$HkµáZï²¶l6Z´UP0š,ž¤¾Ìd2Ë6'HæÜÈĬq â$¸Ýx¼orЉ­¤o¯ÕOø¡”ú™Áv~‹œÍg´G`Çuøq_u÷k¹Gþ,ÛÝËõsÚZÙrZÆ€ Ÿ”¾;,å#Hkå¸ë£ ÅÇqq [úÕ6LØâÏemmŒÊzñcÖÕËg>I˜Øß<´»8w®7jºå#-x“¿µø±ot;/ÕÏi}ÿíî‡eú¹í+8²RÁ1IX(%–y,š:جøCæ¹Ò¸¶BÈÃÚ÷…¼oÕˆß~ ®¬›Igˆ¬›:Û§¦î’+éËŒRÉ„çEξ!ºñ†÷&YhÄ|bFÿrÉÒ½½Ðì¿W=¥Ñé/)f§š¢;2ðA‡;#i[#pÄo¸^u Õ•IØöµ¯bËUtÓUÚ ´%£/Œ.vkÁq‹°–€u‚8×klú3’¯§¨žXéªlÛÏ$““›k§pq䆀<šš9,´~+ûö¡ÿ²—DÒø6ƒFÎf³Ú#°cºü8¯ºûµÜ¢ÿíΉfz¹í-Lv ”PØõÖwYÇ)$dlÅ#3ìl/Àq<’q{n¿ÉqTØÏ©|ö §K˜²ªjÉã}3^ö9…®Þoġ¹1ËFqIßÛ‹üS·:%™êç´º¨ÿHYOhLa¢²hêd ÄY ž@¾ëî‹XX¦:¢Ñ¨|¹úG9ΉÆ',êo|æÞòß~®-z´y#lÙL!s±j°9íÂH½·/7Ýyþ+¶¦––8ÜbÌg”ÏëºOÒ]¿ ¯ŠZ>9â×±ôÄ‘Æ'QH¿IVüó2(¨lù${ƒXÆS\N ¿YQÙ¶›SsÚ"Ÿt,–GË[ÍàÖæ¤kƒ/òàâ]ªàý’”4M§¨0š¢ª³ÞÊÈöÃQœ‘Ø\ç¸H;î6µ—<†åË)Ðý~V7ϵ,¿¤«~ _´6|r1ůcéˆ-#Œ~¢¾ÅúI·§•‘ECg¾G¸5¬m1%Äê õ•.VÙV{YShWÓÉfÔÉlO11ÎuD7b†Hñ}p½¤7¾ââ_rNɳÜÊkB‚šKF¦;^‰•Žk©á»t±Ž7w׋ÜK{Þ.5ðìÝ´¼î­Ÿ¤{z_´6|r1Å®c©ˆ-#Œ~¢¾‰v×E³}\ïW5–#ê+&³kíªkë[Ph¢t¯„‰h<5†âß5×ßä.1aØâãàØñ7'›js²b| ‹Ú{ë°›® uê#UÙŒ´+þO¿n/ñ.Úè¶o«ëèý%[=Îõs½vÉ“v`£š²–ÎÒkfRUÃg‡Èæâ‘å²µ®Æ@~Ñ»¿%ßiò>‰Ù~`e>~ÂÒŸM~~û¤ /z ‰&õ¨ ¿©÷íÆ?IÉÿâÙÞ®w¯¿â=±ÑlïWÿÚî§Éû,Q2®®Êl‚Ë«ª–…Ï•¡ŽŽ@#qiv1x¿ŒÜnÔ¼KaYRE+BØ\ûZ{$y1É«½mî#£Æ Öuñ]/Cÿ“ïÚ:\ºÊ*éLTve%D¸‹!¤sÈ·Ŭ(äý![pÊø¥¢ ŽF8µÌu1¤q‚/ÔT–•›f~‘lû:΢t è žf/Å› x€×å7Þ|—Ê/œö·ß&üåo =<²ÿŸŠ´œ²ˆý_ˆ–¿F³¶û^¿Ä;_£Yûý¬x^ÂëãétÇ&]µ¿â¯Ñ¬ý‡þ×ßñ ×èÖ~Ãÿk$¾§§ÑÉ—moøƒktk?aÿµèeý­Ñ¨6ûY!ü°ž>ŸG&]µ}ßZ½ƒaÿ´îúÕèôý¬²)ãéôreÛT2öÕèÔý¯C.íSÿÇ Øíeð^ÇðOO£“.Ú®î­NC°ÿÚwujtz‡þÖ`/©ãéôrgÛMÝÍ©Ñèvû^†\ZgÿB?üý¬¸^Âxú}™vÓŒ¶´ú=Ãÿkïv¶—G¢Øíf‚ú§ŸG&}´ÚÚ\ÅÃÿk×v–—1E°Y¥èñôú92í¤îÊÑæ(ö ïv61E±Yо§ŸIÉŸmv61G°_FXZ<ÅÅgWМ}/&]´C+­bb½w[hs4{³À~åì)Á§ÑÉŸkîëkùš=ˆ_{¬¯æhö!P¢¼}™vÐ «¯?ôi6!}S\èÒlB¡ Øþ piôreÚóºšîf“bºŠîf“b"úœ}™v¼O]ÍRlBõÝ-o3K± Œ/cø'ŸG&}®»¤­æ©v!;¤­æ©v!SõN >Ž\û\Œ£¬æiv!zEYÍSlB¥ Øþ Á§ÑÉ—kŽè*ùªmˆ_{ «æ©¶!T…õ84úN\ûZðý_5M± ×UóTÛ ª¡üƒO¥äϵ¸·*¹ª}_xr«›§ÙV?‚ú§ŸG.}¬øn«›§Ùô[U'þ>È*Åè'ŸG&}¬Å³SÍÓì‚ûÂõÜ «Bö‡O£—>Ö/QÍÁ²-jŽn UëèN>ŽL»X‹V£›ƒd7/Bԟ̃d7*ñÇĽŽ%8pèåÏ·o ÏæC²nå÷„çó Ù7râExtú92íÝÂ3y웹zó؇dÝË„ þ páÑËŸn½>o2“w.ùð´™)KC®1q^/óUb(²ŠÊÉš+mŠ­ù¸šüÛŸ{‹/æ‚xš’óÿF8á¶trË)ù•¤³¾Ÿ,“Ò1¥Î9“¨ÿ ç†ÔŽJZ¹*¨©ÙU &³05×9¡ÃÉu÷ÄU5QYYM“•õ¶=V“NÆÉŸ›s.peä\à‡óRÙΣe™b:·FÀ,ˆði¥¸°ÃÅ‹U÷_ÿ•æßþ;íÿVÂ̯҅̑³ž#i{°3 fàÔ³ëä´lè+£4ñÅ;CØ$ˆb¸€uÜ(U•QIn†)Ötø´v°~Ôw_‡þëåŽ 9B*¡ÏSšA‹4eÆÜÓ/%×Woâ¹j2úÌÓ3ÌE¯qËÏQì¿ÿ•—Êk_KÉ›z\ÏòàÀ÷²0ÛÍÍ$u÷\뿟‘dl *ѧ¶,©­{6Ò“'ć¨å~yök€ê†ßàÞKšâ$øZ×|ßÊï½ÉùcLfïáf*¾Rå¶Ie«•t¶Å‡iCDøh£‡™ñ¼ø›‹Zu\îUOÜ·é/éwÿçOÙ_©ÔxÁõùBÀŒ­´ZËRªiØÈ(ÝZl±*^0Àd 9ó ǼW›Ûx:Æ£ú2ˆª‚tâfÙËGôy–Ö»m+r’¬4‚ õ<‹¯â%—ùJæ¢ýe=Ÿ]OYM_fGQO#e‰øÞp¹¦ðn1ÜuƵíý YöS ¯QŠqST^ìqGš…•2ÆÃ…Îi}ÍŒ‹£w{¬^Eûe¿3R"¾‹ã•¢Ì¦¯®ž²ª¾Ì’¢¢GK+ñ¼bsäÜ#»Œž%øEoô»3k'a~••½]“œ)Æ:ª¯0纎Z¢Öæ¤}â8ÈsìW$ùu·”•Ö~L×fcš®ÔŠÍ}[秦l ¦Í=ñÌüCÀuíxoð ?³WÑË þ[ý.ÌÚIØ_GèŽßévnÑý…ú“”•6ŽPÕYâ‘òÓDÒt†1¬8OSBH9†€Z æòCAiSÍÕ8q~4?D¶÷K³vì/£ôMot»7hþÂýݪ¶i­+.:ª‚(kg4äTR>W5Â)dÅ{emâèÀºï-÷ù\­ ¦|¯©†¦:hÅsšÓßy‘¡­&KÚ"—Yh¸›Û{ÍÕ8q~uþÛ½.ÍÚ?°ƒôOnô»7hþÂÛÚZ)j¨…L56`ŠwI[ CX÷hú5C]Ѝ]çÄ_eZ&Ô¡m^‰53qŒK$OÎ4€CÚc{ÚZoÕ¯ÉüÍÕ8q~V?E6èÿåYÛGö¡ú*·:]´a~¾±4¹}ì» ®¦9¡Ò£Î×Hú †DÆ Y&yÎmÎï˜.¸ºößuüiæêœ8²ÿá]¹Ò¬í£û þÛ*ÎÚ?°´³þèfŽžª•ïÓN÷VÂÉ ™Î„RÔH.tos/.‡‹=î»ê,ëXWÏ=4´U4UPµ’> ŒØ\ëØç6âXñu÷÷ºÀ^óuN_™Ñe·Ò¬í£û Ðý[cÿ•gíØ_­¢yº§/ÉÂûo¥YûGößð¾ÛéV~Ñý…úÊ'›ªpâü˜~Œ-®•gíØ^‡èÆÚüš £û õtSÍÕ8q~T?FvÏI Ú?°Ÿá³Òh6ì/ÕQ<ÝS‡åᥳÒh6ì.û3"ò–Ç–ih«læ:h Ã8ÂEí!Ñ‘q¸/ÑQ'û5&*N_˜Éú;¶¥•ò:¢Î{‹ˆas@'î—ŸðÞØé4;GöWêžf¡Ã‹òÿðâØé4=wöW¡ú9µÇÿ"‡®þÊý9ÍÕ8q~d?Gv¸ÿäPõÝÙ^¿ÃË[¤QußÙ_¥¢yš‰Ã‹óOðòÖé]wöWU‘¹Ad×G[E[EDWà}å×^:‹â%~‚‰?ש1R¼8¿6£ëW¤QuÝÙ^»€µzE]Ý•ú:'™¨œ8°TnÙµM©¥©³›3|=¹Ì&ðAÌ7ÇÖ£¨È‹j®ªZ™ê¨ß4Ï2=Øœ/q7“po*ýòõ.ׇçc ­Aÿ^®îÊú2Ôçèúîì¯ÐÑ_3U80~{Ü%©ÏÑõÝÙ_{…´ùú>»»+ôO3TáÅùøÈkLף뻲½ ‡´‡ýzN»»+|‰æjœ0]ÄZ\ý']Ý”î&Òçé:îì­ê'™ªpbÁ÷isÔwvW¡‘vˆÿ­K×wen‘<ÍS‡¸ËGž¥ë»²ÆÚ<õ/YÝ•¸E<ÍCƒ#¸ÛGž¥ë;²¾Œ´ýj^³»+lŠùš‡ XÉ @Õ¥ë;²¾÷#_ÏSuÙ[4SËÔ80c;’¯ç©ºÎ쯣$ëÇýZn³»+d‰åê±ã%+‡ýZ~±ì¯½Ê×s´ýgnZôO/PàÁ‘îZ»§ë;rw-[ÎÓõŽå®Dòõ Y1“¼å?Xî^»™¬ç)úÇrÕ"yz‡ ¯sUœäc¹}îj³œƒ¬w-J'—¨pbÌ œ¬õ ëËèÉÚ±ÿR±Ü´Èž^¡Áƒ5Üõ_9Xî_{ž«ç ëËH‰åê3ƒ'êÇýH:Çrú,¯>±Ü´Hž^¡Áƒ>,*¯>æw'Õyðÿ3¹h<½CƒÔùðÿ3¹z-Hý¸¿™Ü¯Q<½CƒTyñ3¹}àz>/æw+´SÊÔ80Rp=GŸó;—ÑdOçEüÎåt‰åjª•8ý¨ÿ™Üœ?ó;•º'•¨p`©à¹üèÿ™Ü¾‹2aûQÿ3¹Z¢yZ‡ ÁgL?j?æw/¼/œÏæw+$O+PàÁ]ÁòùÌþgr |æ3¹X¢yZ‡C ò³ùÿézr]Æßæ»Q<­Cƒ‡'+šû¢IÊßæ»<­Cƒ ¥xò·ù¯BãÊÕÒ‰åj9óå ¶¦Ä«©¨|¦Ü´£ÅÄÈäcZÐ5 WH³–¾Y~¬icã>욨{ oZŽk…ÄXAEê,ž«‘² µbdq¶&åc@k@h™È¾EŽOñ­ŸêŠKºhݹGl>7 œ×NÒýãôëm–’ Vºš hÄll/`¾àäà$›€ýÚ¸¸ÕÚ+Ë=?Õsµ^Ÿµ¶Ìì. jÈNGÛ TM;¦W¾b ‹ŽäÍ \¨òÇæ¥ö_Ü'$þQ±¡¨ñƒê3ò…Lû•ö }Žd›G­ÒsŽc÷=ϸÝv¢óv£ä¾õsQãÔgå 馑¤‚cj ÈÝë›lÛrVžd’–¾¾˜Ìé FeìvºY%ÀIi-ÒÈak®w„H_)twùÑí[½4wùÑí[½M­d‹TR[SG5$ùø¦§À\ì:ž×0½ÞE]_’m´if†kfÒ©¦4•s0@Qï!®¼"ìãÀ, =ö»îhjßÕu2Ű½îÎp¸Ïð VÂ÷³Â}×¹à~()(²zžÎ¯5tµ5,sÝ#§eì-˜>I%×¶ðé¤# i×ß\­Ôº;üèö­Þš;üèö­Þƒ‚®‚*Êšäsèç3ÆEÅÆ7Çqý×Hy5ܪåÉ* —ÊÊ™ªf¡{¦P¹Í±ó‰Ð$½ÂYu1›€¹·hôwùÑí[½sÓËTóÃŒ‘ð<Ç& šàÐâ/ââ#ðãAH2Z7T²²kR¾jøÜÊ·æƒÚr±£ c ¹¹ù/m÷‘y \»l{žÆ‚vB÷É%L™íc],ŽƵ ÜÝy¼’M¶Žÿ:=«w¦Žÿ:=«w ‰RI’Ötö-›dOž–’‚<Ó_q‘¹‡ÀCˆ’;Šíw-Žÿ:=«w®z‰b¥–ž)eŒIPòÈš\CKî^ðƒ5l䌖‹UNûV²®µÑÊ ’©ìk±[C\âHn#ªòC@Vöu’('ž¦ZÚšÚ©šÈß=Fì .-mÌk[p/y¾ëûíd€.±DDP¶Dé-ÃpÔKœãü­þt{VïTDŠ]þt{VïMþt{VïA(óñÉi¬tñ1¯‘­7á¾ëÈÕ¯ Õ¼)K£Ép$°^×#G÷Mþt{VïA)twùÑí[½|tEŒ/{âkZ/$ÊÐþh#TycóFÒû/îÅ=DUtÑTÀìQJÁ#q´‹Á¸þåO–?4m/²þá hj<`úŒü¡qÛõ5T¦zˆ.q²RSÓK+al“V`.sXuÌ$c$´ÜÀòdì¨ñƒê3ò…[”‘Üe“7v*ë%¸ð]}Ö,û¯âÆë¯ðY}ï°‰cɬ¦7‡(¨N 7b¥¬wƒ›ºûëuø¦ßï¾üoÅÁ^Úì™4òZ¹Ie¶,7Æ*%©¥l®fnæg$ªx¼æ›Æ×_úÂAÆü[§K¯V¥]iÃlâlÿp¾å¡‰Ê:ë>¿"_UeÕÍ--M+À–±ÓXúxÏ…)¾ë®. p¼“¥ç9·³\Ö7ˆk@y$›€âü²™æ?ÑM>wPm¥s1Ýxmkøq‹î¿®¿Âe÷?q”º „Ê ˜H|vecšAâ" T‘)Ë€êaUK“Ö½U+™œŽhLŒºðà×Ì×\F°÷-u=§gÓ×RIœ§¨²F뮽¤^?‚üÑÒ[õ•Uo³ ¢m,5§i«¨’,E—x±8‹À¾þ0G‘p²ÀÊ8¢lqhÐÄËðÇQ×BÁy¼ÜÖF\ãS±û Âä÷ÊÙGÿ'QîÚ¹²NÖµìZ¸¬‹dÃRÊê·6•ñ×ÍRø›¿ Œ¬socåÄŒ`]pÕÓ“ß+eüG»jÝÄÇÀ—*2šÙ¡·›ehlÃM#Œô¯Ò¤‘€46F]‡4O–ü^Kµò:ÚËfßvˆþÃ?ÿì®|¦•°þd‘Äáe5š÷]}÷ ê‰â×ĵ}ÝU}Ùù?Gak,fj— ñ‹Œ¢ÙKc.²¶Á¥–®±”&(a|Æ7ÙRÂeÃwz׃u÷øW¹ Òecƒò‡%Ü8Œµú%bÿJ–¥%£“N¤{Ü#¤˜<»9p$²ï £ñ-–T|»’¿iQîJLT$å3N´D\ÔDDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDDAßfxÁõÇåråÊÌ¡§²ìúŠX­jK>ÒtÈå©7G&à\ò c.¹Á¥÷‚A¹¯ÂZº¬Ï>¸ü®Pe‡OY}¦mI¬©©á8ë"{8Ž,`¶á¬ÞF«Î±zÜ~#‡$­êúºÙ,ËO<ù48+`šx›…:9Þ÷8ÂImÃõ€\.¼ôÚ9aOCm²Ïm9™‚¥”“<>ç¶gµ¯ c.%à1Áî:ƒZA®~Ëmœªm=L1Y6\öÄ.k©íÓšYÌRœÉ#’ LJ84†áâ¼—kú8¥²§…ÓÔ@Öå-ÃXÙ›úØÃŽ.ôf':÷yÄq“!y4tõîP}•'åz²U¿ý{”eIù^¬–'õWÔ$ÿø#V^ØÊŠÉ²©¹=“ÕÖck)éæš¹µtï•Ñ–æ {.“‹XïHãêßÒ%t´=gIM\ 5§9¢Ô>=­¢™à1Í7bkM×ùü’ ´†‚«OõqÕ‡™S+Ý3ß{ZÒ^ò\ÒÐ[]q pÆzÑ„ÄL=ŸÍü:ŸÑ„çŒÅCm–¤|»É .X¬˜³Ì£™£]ü®Õĺ¿G_¤{cô`e_ SPàҷ7¢1í¿e¾üNw˜9<«1—õ¶…³‘­’¦Êud-•ãd.uíÃÉpó„‹Æ«ï “ô%L)lŒ¸`_EÿôÔ.±/þÓôŒžùµe}ÎÈ.XüÑ´¾Ëû…Õ“ß6¬¯¹ÃùåËš6—Ùp³íZ>£?(UyS†ê*^ÐÖ Ë'…—^hßv,û¯¾ìnºÿ—ÞûJ>£?(YËJ¶Ð¯’µ§'*óUQæ$Z#œŒgp‡µ×ÜeÅq$ѪâðëÓ›Z“¥Á´Ô3Z”.  Þ°dÕñáÈ6G‹ØEŸÞ_œºëãk_$í{6˜´OWCUOy¹¸Ÿh¾ï%åd+â´ç°j¬ºLž¬‚) t0E¦S¶A“¦3:ƒX ¼†´]­Ï.ÕÍlÖÙ´v4Õ÷‡9³Ç[}×øÞO{Éåö#,ꬡ„©2FÔl@¹Ú䦹ĹÎ?­2šÃ}ì ñ9Âî-kó'ä…‘ߤ“]Xi㱟M-EŸM$~fH´fâqy8œ],„ w\Ào”¶¥$ÒEO“u4€ÙMTLÅs@¾ëøµyuÿ]iÚ.¶ó\+ú=‚¿3~oJšš\Ý}دºû‡ V¢V3˨—çyeo £§u <š>u²‰;ÛîäÎåkú.§4Ô™iãàÚsÿŠ• ÐìŸÿ•WR“r芡Ô4Ô¶V@Afé‘äu,´ÑâÔ@$6ëîÄ™Jù¶*nݹ=ójÊûœ?.\±ù£i}—÷ ¾Æ§–’óé§nb¦Ž7¶ðnph^?zàËš6—Ùp§¶š>£?(\-´(žö±•”îsÀ A$ÿ5ÝQãÔgå I¥e ÑaCÞ-¨3•¹I_K-³;,Êi,ë!×TJkÙœÑ &qdy² }À‹Èã Òk~Ʀ‚Içµè"†9Í3ä}KÖÊæ2IÔà?gqSd½ZV­uŸAQS5['¦ðµòDÖÃÄEà‡1Ä\| ñ®XlKRΚž¶‘´u5I^ 2Îè˜c¨¨c qÄZ pÝßzµ…½EµA@*$´kè)!Žq|•Mo|X…Ø®Âë‰8o=íÇËpžKN‚+F+:JêfWJÜqÓ:V‰ÝzÃo¼ŽôëýÇ‘`èr2ºšg¶ùÍ…+1VO@'a¤£iI"@taÖ/']í×}fdõmílÙ¬ù%§™ï“𘢊0ÖDq_âZZã%í.¾çaï•ÚÈ·¬ënË‚¾Ž¦3´í¨-/n(Úëü0 ¸‚׃ûÚáä+£„¨:m6Õ»×6OÑUÙ6E›6h¶Šš8#š9 2`½¸‹KFÚÖ;ŒÜ\Gì‡:ãIŸŸ“®Ppp•M¦Ú·zp•M¦Ú·zïÒgçäë”Ògçäë”%AÓi¶­Þœ%AÓi¶­Þ»ô™ùù:å4™ùù:å PtÚm«w§ PtÚm«w®ý&~~N¹M&~~N¹AÁÂT6›jÝéÂT6›jÝë¿IŸŸ“®SIŸŸ“®Ppp•M¦Ú·zp•M¦Ú·zïÒgçäë”Ògçäë”%AÓi¶­Þœ%AÓi¶­Þ»ô™ùù:å4™ùù:å PtÚm«w§ PtÚm«w®ý&~~N¹M&~~N¹AÁÂT6›jÝéÂT6›jÝë¿IŸŸ“®SIŸŸ“®Ppp•M¦Ú·zp•M¦Ú·zïÒgçäë”Ògçäë”%AÓi¶­Þœ%AÓi¶­Þ»ô™ùù:å4™ùù:å PtÚm«w§ PtÚm«w®ý&~~N¹M&~~N¹AÁÂT6›jÝéÂT6›jÝë¿IŸŸ“®SIŸŸ“®Ppp•M¦Ú·zp•M¦Ú·zïÒgçäë”Ògçäë”%AÓi¶­Þœ%AÓi¶­Þ»ô™ùù:å4™ùù:å PtÚm«w§ PtÚm«w®ý&~~N¹M&~~N¹AÁÂT6›jÝéÂT6›jÝë¿IŸŸ“®SIŸŸ“®Ppp•M¦Ú·zp•M¦Ú·zïÒgçäë”Ògçäë”%AÓi¶­Þœ%AÓi¶­Þ»ô™ùù:å4™ùù:å PtÚm«w§ PtÚm«w®ý&~~N¹M&~~N¹AÁÂT6›jÝéÂT6›jÝë¿IŸŸ“®SIŸŸ“®Ppp•M¦Ú·zp•M¦Ú·zïÒgçäë”Ògçäë”%AÓi¶­Þœ%AÓi¶­Þ»ô™ùù:å4™ùù:å PtÚm«w§ PtÚm«w®ý&~~N¹M&~~N¹AÁÂT6›jÝéÂT6›jÝë¿IŸŸ“®SIŸŸ“®Ppp•M¦Ú·zp•M¦Ú·zïÒgçäë”Ògçäë”%AÓi¶­Þœ%AÓi¶­Þ»ô™ùù:å4™ùù:å PtÚm«w§ PtÚm«w®ý&~~N¹M&~~N¹AÁÂT6›jÝéÂT6›jÝë¿IŸŸ“®SIŸŸ“®Ppp•M¦Ú·zp•M¦Ú·zïÒgçäë”Ògçäë”%AÓi¶­Þœ%AÓi¶­Þ»ô™ùù:å4™ùù:å PtÚm«w§ PtÚm«w®ý&~~N¹M&~~N¹AÁÂT6›jÝéÂT6›jÝë¿IŸŸ“®SIŸŸ“®Ppp•M¦Ú·zp•M¦Ú·zïÒgçäë”Ògçäë”%AÓi¶­Þœ%AÓi¶­Þ»ô™ùù:å4™ùù:å PtÚm«w§ PtÚm«w®ý&~~N¹M&~~N¹AÁÂT6›jÝéÂT6›jÝë¿IŸŸ“®SIŸŸ“®Ppp•M¦Ú·zp•M¦Ú·zïÒgçäë”Ògçäë”%AÓi¶­Þœ%AÓi¶­Þ»ô™ùù:å4™ùù:å PtÚm«w§ PtÚm«w®ý&~~N¹M&~~N¹AÁÂT6›jÝéÂT6›jÝë¿IŸŸ“®SIŸŸ“®Ppp•M¦Ú·zp•M¦Ú·zïÒgçäë”Ògçäë”%AÓi¶­Þœ%AÓi¶­Þ»ô™ùù:å4™ùù:å PtÚm«w§ PtÚm«w®ý&~~N¹M&~~N¹AÁÂT6›jÝéÂT6›jÝë¿IŸŸ“®SIŸŸ“®Ppp•M¦Ú·zp•M¦Ú·zïÒgçäë”Ògçäë”ñMñç!‘’2ü8˜àEü—â?š¦Ëš6—Ùp®!sŸ¥9Î.qª7’oÿ¥§Ëš6—ÙpžÆ†£Æ¨ÏÊ-/Éô_u‡ÝµuTxÁõùBå¥ù>‹î°û¶ •A·âfV›H×:‘•1Ô09ÅÏ¿­teÀk¼5çVj £ ©²¬zººšj)­H#– yghsœö´àm÷b ¸ CÊ9P[¢®ýŒéßµè Ì´ÎŒT³eq FEúœK]sxõEÆâ P0:ÿA۾Γrpëýnû:MË~‰P0:ÿA۾Γrpëýnû:MË~‰P0:ÿA۾Γrpëýnû:MË~‰P0:ÿA۾Γrpëýnû:MË~‰P0:ÿA۾Γrpëýnû:MË~‰P0:ÿA۾Γrpëýnû:MË~‰P0:ÿA۾Γrpëýnû:MË~‰P0:ÿA۾Γrpëýnû:MË~‰P0:ÿA۾Γrpëýnû:MË~‰P0:ÿA۾Γrpëýnû:MË~‰P0:ÿA۾Γrpëýnû:MË~‰P0:ÿA۾Γr²¥™ÕT¨u5E8s‹Du˜ßªíe§XãòîZÕMiøÓõÏåj“ àDEDDD@DDD@EÅlÚaÚ–k;¢SI>ox]u÷¯»ŽåîKN‚+F+:JêfWJÜqÓ:V‰ÝzÃo¼ŽôëýÇ‘QÔ‹Š+fËžIãŠÒ£‘ôò6šÉÚLR9ØZ× õ8»PY:”sÛtX6Ü3²®†$œÉJöÈÖ\A¸žôŽ>4(ª(­Ö¾ŠY-(ÙGSOVÚ9âcÌ­lsDw;¼8I¯¸]Žãqä–ôQÚu0<ÓEKJæÇ5Lõ;Ÿš|®kZF²ÖÜMàa{÷°„èªêíÚXalÔòCU+c¢¨ÌÊ ¡‘ï€@ý ÷²ö’dmG<ͧ§’g‚[ Èwz©‹(›<,šÛ’)DzϵÀë5…ai|•Yöü¥]ä¯Ìûî{¶«2ü:ÿA۾Γrpëýnû:MË~ŠÔ#ïô»ìé7'¿Ðvﳤܷè•ïô»ìé7'¿Ðvﳤܷè•ïô»ìé7'¿Ðvﳤܷè•ïô»ìé7'¿Ðvﳤܷè•ïô»ìé7'¿Ðvﳤܷè•ïô»ìé7'¿Ðvﳤܷè•ïô»ìé7'¿Ðvﳤܷè•ïô»ìé7'¿Ðvﳤܷè•ïô»ìé7'¿Ðvﳤܷè•ïô»ìé7'¿Ðvﳤܷè•ïô»ìé7'¿Ðvﳤܷè•ïô»ìé7'¿Ðvﳤܷè•ïô»ìé7'¿Ðvﳤܷè•ïô»ìé7/L¶Þ÷µ‚ŶÚ\@½ôkGñ'P¼ê[ÕOúY¾£¿¨ŸtEÍ·ÞO®?Á}Í3¤Gü¹J×Ïÿæ~r¬ª\Ó:DÉÛ—k ’Ѩ¡øå§c!†Œx®ü½ïþGïºuGg|î·>Ê—ðz zo«ïGÝDª2Çæ¥ö_Ü+zo«ïGÝDª2Çæ¥ö_Ü'±¡¨ñƒê3ò…ËKò}Ýa÷m]U0}F~P¹i~O¢û¬>í¨)«ì km[B±³² $¤‚:9Ú ŸOjhâ”0µÒ]Ny®½½ëÀ3ýî[ÄKÚ¼’¯ž‚®ÍL5%­Is®ªœIú¸€÷!â½Mgd´ôvø©2H"«¨«ŽgWNãŠS!Â)ï0ŒéïuàôÞÝb%‚"(ˆ€ˆˆ+ì:]7(²šœTONçEF[4Âö8g#Èn j ´ñA öUd ö[¬ø-;JŽ)¨´ £ˆšˆ{ûšCãp`Ù.†p5¡³2LØ!¬Œ^o'6ÒIýæí~EïH›É»–­è2N Eµ.´kª!Š®zÚzI³B8&˜È^æ–°<ê–@œás¸¯…~IÁ]hº¥¶u<2ÕÁ[QIhÇ<ИËâæQFkš.oä“ãH›É»“H›É»“pùFÓCK ­+JJ:gÀi)#)™ ¬‘Œhkx¾&7… œJlгf“=[_êd‰áí½’MRʬc½¸–K A\.puëîÿ6=“w&ÿ6=“w&ágdÙ,²¢ŸüÌõU2çª*gÃŽWák!kEÌcÞ´x7›É$Ø,æÿ6=“w&ÿ6=“w&á£EœÒæÇ²näÒæÇ²näÜ4h³šCüØöMÜšCüØöMÜ›†sH›É»“H›É»“pÑ¢ÎiócÙ7riócÙ7rn4YÍ!þl{&îM!þl{&îMÃF‹9¤?ÍdÝɤ?ÍdÝɸhÑg4‡ù±ì›¹4‡ù±ì›¹7 ,æÿ6=“w&ÿ6=“w&á£EœÒæÇ²näÒæÇ²näÜ4h³šCüØöMÜšCüØöMÜ›†sH›É»“H›É»“pѪkOÆ®+W.ÿ6=“w//•Ò†áy­ðI•xDEDDD@DDDA]oÐKjäå©g@æ6jºI`cžHhs˜Z ¸W•ÅÁuñZõ†8h&¡­«Š²I*âøœÆFÜ- Î?©?Â]~‡¾¾EFù_WAfPV6ÔÖdÒ0ºAWg§{Üö–Â[Ov Þ }ÅÀ Í¥©bÖIaå|0µ’Íj¶GSF×\I4±Ä&à s–ëˆÖ´¨–3Uù:ÛjµµQÔÔÓPÕÁœ™‘“ ™àÒØ¤Â[©À<’]ßC×`\V¶IWÚ93 š›„euDõ’¹ÎÂée¦š+šn¼µ®•múÄl]À’%Œ¯bJÊàê8 •Ö\à ¶ž¥ò¼›†´0ê׬Œ#Yh:ÄD¶—ÉUŸ`ÿÊUÞJüϱ>á»j­ 8¹­sN¢× ÁýÄ56ÿ6=“w+CF‹9¤?ÍdÝɤ?ÍdÝɹ4YÍ!þl{&îM!þl{&îMÃF‹9¤?ÍdÝɤ?ÍdÝɸhÑg4‡ù±ì›¹4‡ù±ì›¹7 ,æÿ6=“w&ÿ6=“w&á£EœÒæÇ²näÒæÇ²näÜ4h³šCüØöMÜšCüØöMÜ›†sH›É»“H›É»“pÑ¢ÎiócÙ7riócÙ7rn4YÍ!þl{&îM!þl{&îMÃF‹9¤?ÍdÝɤ?ÍdÝɸhÑg4‡ù±ì›¹4‡ù±ì›¹7 ,æÿ6=“w&ÿ6=“w&á£EœÒæÇ²näÒæÇ²näÜ4j*Ÿô³}G~ ‡H›É»“H›É»’ħý|ÿþgàW‚RøŒocZ|Ì$¹·@Þ.7Üoרv»Â©²ÔÅ+S,”e‹!ׂúÇ—R¦îv_OÛ;fvU¬ ªmÚDÐÉú¶›ˆ²ùø­Ç½:®o¸ë7ꪳ¾w[ŸeKø=;—ÓöÎÙ…ÕfX̳**gÒêªe¨ kßPæ“soºëš<⃶›ÁªûÑ÷Q*Œ±ù£i}—÷ Þ›ÁªûÑ÷Q*Œ±ù£i}—÷ ìhj<`úŒü¡rÒüŸE÷X}ÛWUGŒQŸ”.Z_“è¾ë»j QbršÚ®¡·+㧯¬‡E³b©§‚:V¾ %.šüü†3›aͰ^À#x¸‘wieMŸe[”–UYÁ-VÇç¢ã{‹3xó†÷/ _¬€ h³U9ofÒYέ¨†¦ÌùˆDÙ¸„Ǿâ{ÞÂ3o½¯s^ÒÛœÐKAî‡)(*rz;fùiäpŒf9Ò™3A€ƒ„“'{‹.,:Ò…º,L9a-=©h6¾’ÒkÛSš§  §.¶ 9Á×bÇQxïî¹î¿‰ w;ô`ÇjUQKQƒFÏËŽ×\ém®2‹ƒ­ÌáÔN&âPÔ"ÏO”Ul¬²ààzÊwÔÖŠyb¨—fÌR¿\×–j1ë‹€½ï›|nËJFÓG?×–Ô69(€_XÇÉaÌïûÑ|Ñj“¹ÜZÊTUtvõ-mdT±G0|ºUÅÀ]þ^fÂÿ/•Î~î;¸•¢ †ÍnZÝ} —œYHÈœçUHö“Œ®Âšy<‹«ƒ2Ç›°¶óv% eE ­•3ш Vj‰¶w†µÏq{Zå¡Î$€Ö—7®n&߈-|·µ(ìvÖÙðÁhICHúËISÜÜÓ\ðÛÌ’Æè\s2‡3 ÎÍ ‚Z1ê!|–<Ý…·›°œ–<Ý…·›°¹,NÔ²ZËÄ´5ÖÝ©O,0àlµRßœt˜y‰Íµž%Ýé½oZv¥¬×Ü ¢¡¡¶ìºy©f‡ï{¥¥–üãdÀÛŒ­i¯ð ï…Ê×Á™cÍØ[y» Á™cÍØ[y» ¢—.r¢ªÎ¥«}IFËQ”Òо¡Œ"6ËQw`eA|À6{ñ] Å­¼w÷7³»KbS2†I*å––ì…ìÉlTN{yÆ×:làh-- Á‰Äã ×Á™cÍØ[y» Á™cÍØ[y» öÁ´+*ÝiRW˜$ª³ªÅ3æ‚3%¾(å .qmÂPÛ±ðߪû…ÂT We7amæì'e7amæì-ª%@ÅpfXóvÞnÂpfXóvÞnÂÚ¢T We7amæì'e7amæì-ª%@ÅpfXóvÞnÂpfXóvÞnÂÚ¢T We7amæì'e7amæì-ª%@ÅpfXóvÞnÂpfXóvÞnÂÚ¢T We7amæì'e7amæì-ª%@ÅpfXóvÞnÂpfXóvÞnÂÚ¢T We7amæì'e7amæì-ª%@ÅpfXóvÞnÂpfXóvÞnÂÚ¢T We7amæì'e7amæì-ª%@ÅpfXóvÞnÂ솞¶ V‹GGÒ±¸8S—p"âà ãäÜêU5§ãO×?•ªLwˆc!¥’8ái$<0"óŠnM ì¥GŒQŸ”(”W³h¶Ï‚™ÐÂK竆 ÞûÃCž75Ý}ß¿ù.ÅG”Þ"Ìÿ“¦üá^ "*¼¥«žÏÉ[b¶•ùºŠz)¥‰÷…Ía Üu`q ´E‚Ý©³¥tùÛnÕ¡ÂØÞ+([M#g|±Ç cÅ!ÁØßˆ›ÀÂÝm¿¾í´²¶’š’µï†¾f6¢8ë¢lD>XZó#ckœN&椸½¡¤³Œ‚/PҢ˻ô`ÇjUQKQƒFÏËŽ×\ém®2‹ƒ­ÌáÔN&âž|¢«ee—ÖS¾¦´SË@Œ»6b•øÚæ¼³QXÄ\=ï|ÛÔ4(³Y[”SYVU«ŸMS5u=žú“$B<4Àµøìã†!{nhqïMãX½\ØÒÛsYm{Ý4n–0XY#žøÃ‹Ú"kŒ·ŒÖXèœMÄ¡¥ECTG<ƞ˯ž¦¡®‘”ÌÍb1´0™Ì‚'7õ‘ëkÏ…w]‡–¿,¨©DÓ> J8(ä!äDÆçˆ¤}IakÎ6ÜÀ°Ó‹âÄ”5³RåDÂÓ³¨E—SLõlŠzyóeí…ñLæÈÒÉ .Å ¯“s]ÞÞ[zÍÊÚJšJ'²ù©žÚxä­•±Éfk m‘­ âvv;ËZ øÀå **K)ém½ÅKYNÚºm*˜ÔÆž`È€ # {°¾öânµv‚ÉOE<̺8Üðà^¸,ø2¶Ò³ik¡†ÄlU0²fÏ(pk€"û™Ç­uÚ_%V}ƒÿ)QYVÍeKÒDúÒ>‚Ne$¿€5€U~`%®lŽiŽøÝ„ºÄ\–<Ý…·›°œ–<Ý…·›°© ÊûvÊÈ®µT–$V•§}8$Âæ0ºGÎÒDràÙI-.À/ u…^[Û]QlVRÐÍBÚ»F–xKÛ#´aRö½Ï$x¦,- :Î<_°-B:ø3,y» o7a83,y» o7apM_mYUkÇ-M%e±UEgÃDÚ[<µ¯8ëZXú€ d®¼ÊѨj&àî;+)­Jü¦qŽ(í;B*{9îž<ã!|2ÚEÎ1µúñhäa8ü'áï•ïƒ2Ç›°¶óvƒ2Ç›°¶óv²ÖÞ1[² 71bQ>ª¨¹ÅP觪‰ì`ÅsÅ6 â]›¾â$¾ñ_”ÙQnWØ9I¶dqØòÓÚt1Jã(c¸šìñ|„˜]Þ[pq8ˆeîT þ ËnÂÛÍØN ËnÂÛÍØ\SM“…£]›f=ϲ˜lú_JÖÏVø](!±þµÍ¼óPŠ>ùÞ xòƒ)8S) žØèe†’Õ†êcn)›ª²Üæb¼ÝßÌðáË<­7ªße7amæì'e7amæì* ¬¥¶™Wae£¤¨}£cÈê8 -t¢¢…­kÜén”·:Þh; ÖÜW·Aaå¿]”vU£MIJö²©õ@±¦GˆÅ9eÍŽi'üΰç<À{Übå@ùÁ™cÍØ[y» Á™cÍØ[y» ¥¯´­ ª"ŠZHlû:ݳ)e‰Ð9òÌã5,¸Û&0?ZÑ„±Þ ×ßwµô¹s•Vu5[ìêJ6ZŒ¦–…õ a¶Zˆ#»* æ³ßŠèn-m㿹ªoÁ™cÍØ[y» Á™cÍØ[y» “»KbS2†I*å––ì…ìÉlTN{yÆ×:làh-- Á‰ÄãeRTåÉØ_e ¨tQ\úy0 ¤‘®l"Køª°™<˜ñjÀUße7amæì'e7amæì*‹[--+C$ë«`}%6•ˆæqš9!žá(¸ Z Nlµ¤°çó…ÌmÄÙEmBmj\å$ÕñVÃgÐG&ithê%$>v¶â×H@/nÎ7’Tœ–<Ý…·›°œ–<Ý…·›°©)2šÔ´m ê« €GÒÍCQ6¶~šÒ´–±ß«.¸Üá~C/wcòÖފβk›;íºx*èà,|B¯¨¥ŒÇ#ñ;ÃT;ðÖÜY~_pTþ ËnÂÛÍØN ËnÂÛÍØ]3å¥E’ùUS8¤šÐ°™(2'2)ÜÚfNÓ€¸–Ö‘Œß„›Å÷wÛöõSÐäýDÖlÓÍQ¤ªŽ‘ñ·2øêžX#2¸‡ßIáâ#õž{­P>pfXóvÞnÂpfXóvÞnÂàvVÚSQØsVÓÙµ[l¤®¦‡GpÑZj©…ļ‰H-x ¹Ñß„ßpŽÎˬ¢©¡§«ª² ¦†ÔŠ (.lfóÓC{ÖÎ÷ÎÖŠ†¸» >4È0ªŸe7amæì'e7amæì)ië-‡eÍ—CSiPË™¤®ÒÛH׆Kq¤,¾2óšg|¥ýé$]œ¹»¨® ËnÂÛÍØN ËnÂÛÍØ[TJŠà̱æì-¼Ý„à̱æì-¼Ý…µD¨® ËnÂÛÍØ_E•¬8¦eˆØ†·–K+œå¸‹Ïî¼´QTÿ¥›ê;ðJù˜#šF îkˆÿáKSþªo®ïÅD²¢"("¦ðj¾ô}ÔJ£,~hÚ_eý·¦ðj¾ô}ÔJ£,~hÚ_eý¾Ɔ£Æ¨ÏÊ-/Éô_u‡ÝµuTxÁõùBå¥ù>‹î°û¶ ©´òjRº¢¢JêÈ¢ª¦e%U4Y¼Üñ4¼áq,.ç kšn:®"ô¬É¨jëP+« ŠJ˜j禋7›šX‹ \âæ!®æò’MÚ%Š’´í{+ëÛSŸlñT—±Ïˆ†ÅØšZóÎasÞA¸–´·¶[)ìgÍQS%Îl‚¡ïA+^$lšÆÃÀpmØEÀaÃÞ«AšnEÒ½.¦Ð¯ª©3‰Ý,¦ \àêw ÃÑwùXÆ¡Ä]å Ž§dÅ,šT2ÕV>Ï©ÏÐgb¾\YÃ{@y¼½æç8€]x pÝ¢X¨ŽÀᚪӯ«©‚vÍó9€²àæá cË‹_#IȇqÞÖ–òG‘ôLm;WY,T™¦ÑÆ÷0 hÙ,rÚCAsI†0KËsuI'D‰b’ıŸGUYhÖE *ê¤s›2ºHéšCq5„†øoi‘Ä5¸œíwá]¢ ‚ijɶm÷ÖÑ™(+a‚$‹&¯iÅÎߨÞG*¶¬°²zЧ¥§­°èª`¤f xæ l-¸ ˜ nh¹ \9"àElYÒÙ6% £=£GdRÓ×O‹=S d’b8‰Á·›È߯RªÉ±+­-Ë"–¢º 9š™¨ƒä ÄÜ.-¼\I"î"«7 8l›žZ™a²)c’ªVÏPöQ™dk±µî!½óƒ»àN°uñ©CeHDZöl.cÙ+ÓIxsev)Aïu‡¸^áûGY½T"nt0PY”qÑÐQ²’–;ðC1¼’nh É'þë£Hg›&ÉÛ–qpÑé ódÙ;ri ódÙ;rÎ"n=!žl›'nM!žl›'nYÄMÃG¤3Í“díɤ3Í“díË8‰¸hô†y²l¹4†y²l¹g7 Ï6M“·&Ï6M“·,â&á£ÒæÉ²väÒæÉ²våœDÜ4zC<Ù6NÜšC<Ù6Nܳˆ›†Hg›&ÉÛ“Hg›&ÉÛ–qpÑé ódÙ;ri ódÙ;rÎ"n=!žl›'nM!žl›'nYÄMÃG¤3Í“díɤ3Í“díË8‰¸hô†y²l¹UZ'ƒ®py#Hý–ò®I‘沺’ŒÜµP1ጽ®;ÑäU­}”Æ5¢ÐÔÖÆÑ}sɺ3{o%×’O„N· N¼jRIaYJùe²¨_#ÉsžêvâxÉ7k+ÏsÖ'¡ìÿVfå~PÖSTGf²ˆ¤p´©‰ x&ìc‘h•|v‘ ¬–+*…’0‡5í§`-#ˆƒv¢¬-§A«eVYӹ톮À÷0€à×4´‘}úî+©rÚZTÌ‚g=­dðÎ r6F~KØ/ý×ñ*c#™]fÚ0SÕÍúèª]KM+š!†y™#]%á¸ÍæY/θjmÚ„AH옥“J†ZªÇÙõ9âú àlWË‹8oh7—¼Üç ¯an#°8fª´ëêê`³E<Î`,¸9¸CƲâ×ÈÒpâ!Üwµ¥¶è‚’Úɨm­'üõe—M¢UhÙ³ž‹¾¹§uÙÇëmǾ7ßpºHòz(§˜¶¾½´²:Y#&±¸½ÁÍKÉ{ÍÅäëÀ­Ãnˆ(Y’ÑÂÈß©_ c+c3XÜ$-sÆŒXÂp°Á7ÞçrÛ9uhSRÏ0¨Ÿ9,FyK›u!¥œAqn &÷_®óĵ–)"ɨ[TÊÚŠêʪøä쪗6Àf1¬Ãt²ƒÞßúîðÒØ(ò>І:h!«¬Ñ!Ì9ôÅÌ,šHZÆÇ#ŽAÃ5¦¹­8ã[¯Ñ"X« °ilî ÌÉ3¸6‰Ô0ã âŒæõºá­ßªoÃYÕÉhˆƒž½–ΪŽ69ïtOkZÑy$ƒpYX¶u46=„kèm :‘‘2GÓã|1†¼5ׯºãqÖ¹Q"hwÖØY=i26WØtULò=ž€<5Ïv'‘{u;Y>S¬®ÆÁ@ÌÞ675+çŽêb0HüXž5jqÆûÏÄîR©]î›ÉŠz:š8rvÎŽ–«‘ ,æ†K„ÞÜM ¹×bþ% °²y´ m‡D(ÞÆ±ôâ€fÜÖ¼½ · Ä9ÎÈ\O\›…¸¡²›NúvÙ°ˆNÚWÆ);×BÐCc# Å€9À7ˆb<ª7Ù6$••U’Y®ª«ˆÁS3¨|Ñc݆÷6àÇV «7 :[&Ä¡³§³¨ìŠZzñg©¡¢ ŽLC ±46ãxøÂGdØ‘`ÍÙ¬ÍáÁ†ˆ 8sxnïu]™ŠîLÛ<Ñub&áÞË '£¨«¨e‡DÙëXöUHÚ;^oxyÃ{ƒŽ² ÷ùWE •g2PÙ°Ò²=¶ L6½ÁÏ ºƒœ q U›…U“bWZ0Z5–E-Ets53Qɉ¸\[x¸’EÜE!²lJyje†È¥ŽJ©[=CÙDe‘®Æ×¸†÷Îï:Áׯ«7 wÐÙR1ì}› ˜öJÇ4Ò^Ù]ŠP{Ýaî¸~ÑÖoJ:*Îd ¡³a¥d {!l˜m{ƒžu8@ã ª7 x(lªZˆª)ìØaž*qK‘Òas!ñ!·†¯ÖMˆû:K9ÖE+¨eÁœ¦4@Æü­míÃq¸1€r·*ÄMÂÎ&ħ‚ž,ŠX¡¦¿1(ƒ[ïl‡ ï{ö5Ú¿i ñ€Ù6%<µ2ÃdRÇ%T­ž¡ì¢ 2È×ckÜC{çwÀ`ëãUˆ›…¥gPZvM©gÉÇiÄøªd†×»y²ëðëph‚<(l›ÌŠ8¨,ŠZHã”ÎÆAD# ´°¼ÝN-%·ñÜnâUˆ›‡\ù?bHÙ³4 ¤’¢® ʉiiDošH¥´¼†÷Ýð×~¾øëÞº"²lHtìÕ‘K_¦á¢I¾ûóï~'qßáUX‰¸[ÓPÙTTôÔô–l0AJòúxâ¤ÂØ\C,·4÷‚GœyJìÒæÉ²våœDÜ4zC<Ù6NÜšC<Ù6Nܳˆ›†Hg›&ÉÛ“Hg›&ÉÛ–qpÑé ódÙ;rŽyšúyÖÈ\X@·r@‰bZŸõS}w~*$ESx5_z>ê%Q–?4m/²þá[Óx5_z>ê%Q–?4m/²þá_cCQãÔgå –—äú/ºÃîÚºª<`úŒü¡rÒüŸE÷X}ÛPJ‹kÚÖF\V×SE¤ÁÁ´°>—YŽWÉP!8È$_ lwq~»ÔÅ “]jÙ¹5MAG.l>¶½Ò;Dk³­eT‚I0™¢k{ç³V#áj^B†ñÆÊ{RÛ´Y›KfÑi±š©$–7HæÝOFðHinq߯,ãn Óû8]u-½UQ’¶e©G0Ï_Rˆäg09™ÇF L® ჈ 1Ê$Yª;n¾¾¦Jˆç²¢¡§ž y^ç‰$q?sÞß®£ÄZ5·{IA”vÍmMÈÅ• u©IG,•&î l‘Õ˃pšwÜnyòÜ?@E“ÉËR¾ÓÊk@Ï30R2ÄÖ» ¥eMTFFîð8Eyn³­£{¯=4ò‰ ŽfSJê›fyDù£žkcµibk É7‹®CS#±­CôÔY<–Ê+^Ùž×Ù짤­¤Ó)‰1µÁ·³½J÷H.^òØî¸^Þø¬AMEeËnå5¯–­£K,t5¢÷‡ß~&Ÿ4q~õmÜ3~‘[»xþ‹%¾weÙR~-‚Ô#)Ü3>‘[»xþw ϤVîÞ?†µh¨Êw ϤVîÞ?†Ã3é»·á­Z Êw ϤVîÞ?†Ã3é»·á­Z Êw ϤVîÞ?†Ã3é»·á­Z Êw ϤVîÞ?†Ã3é»·á­Z Êw ϤVîÞ?†Ã3é»·á­Z Êw ϤVîÞ?†Ã3é»·á­Z Êw ϤVîÞ?†Ã3é»·á­Z Êw ϤVîÞ?†Ã3é»·á­Z Êw ϤVîÞ?†Ã3é»·á­Z Êw ϤVîÞ?†Ã3é»·á­Z Êw ϤVîÞ?†Ã3é»·á­Z Êw ϤVîÞ?†Ã3é»·á­Z Êw ϤVîÞ?†Ã3é»·á­Z Êw ϤVîÞ?†¥slºfÓ6¢¢¤¶G_5CÞíM:Èj¿Èâ´ÊšÓñ§ëŸÊÕ$A,¦75­lw`i×OìܼiócÙ7rTxÁõùBàm§@ö5í®¦s^ØÞ× ZAl‡ dkâqÔÓåJ›>vUÆØÚ\÷5º¥kûNtN‘€+†°n"‚{VºKkY´ºME¯ZÚ:ak®§Š)„½{\æÎöœböÊÓy¸1ZdXÚ\¥¶ªEc] 3SÒGú—¹¤º¡õÂ;á)`?ªÕ/ Á†AqrŽ,¢­žØ†’™¶h«¬Ž…hæãþqÇ kµhäfÉ7HðK®Ö¡¶E†9[l˜­Y™ fȤ}EA-~)ÝÕ1¹¬÷âžðIv îºKï”E†É(b‚|™ž™Ö……%MlŒh©”b$ ×ÈþøÞ{÷r””YÛ2’:\¸¶ón™ÙÚ*I]™ò\L•7†â' y.ÈÙi#‡ô…CP×L_=›WŒ>g¹ƒ ”Àai8Yûð½…D@DDD@DDD@DDD@DDD@DDD@DDD@DDDA7ƒU÷£î¢UcóFÒû/î½7ƒU÷£î¢UcóFÒû/îö450}F~P¹i~O¢û¬>í«ª£Æ¨ÏÊ-/Éô_u‡Ýµ¡ Móˆ˜&{ZÇH19­$€O”ç\?yå\µV5—]J)jìÚ:Šq!˜E, {1’IuÄ]ˆ—8“Ǭò®ÔAËMfPQ½¯¥¡¦Ínº(šÒs[p¸q]bîF7$¶eöp³¦¡¦’„5¬ω¦0ÖÝ„a"ë…Âáä¸.¤AË%™A-££% 3ë¢nê]LŒn½A×^|u~óʸ«ò^Æ´E*,úgCHæ–C™acšÖHÆ1Í#[Z%qÈx¼·Û¢"£¥ƒ1™¦†<ÄfpFn3wzÛ¸›Þ·PÕÞŽEàÙ”,&†˜–9Ïi17½sž$$jÔKÚ×çxÂêD´¶e õÒPÓSÍRìsÉMc¥uäÞâ|o'Yå+©ËŸƒ­kJÐtÑ»Ll-÷À°F¬›/ü~ýW\&ÎXúÎìªdK<&ÎXúÎì§ ³–>³»*™¹<&ÎXúÎì§ ³–>³»*™ä\ð›9cë;²œ&ÎXúÎìªdK‘sÂlå¬îÊp›9cë;²©‘.EÏ ³–>³»)Âlå¬îʦD¹<&ÎXúÎì§ ³–>³»*™ä\ð›9cë;²œ&ÎXúÎìªdK‘sÂlå¬îÊp›9cë;²©‘.EÏ ³–>³»)Âlå¬îʦD¹<&ÎXúÎì§ ³–>³»*™ä\ð›9cë;²œ&ÎXúÎìªdK‘sÂlå¬îÊp›9cë;²©‘.EÏ ³–>³»)Âlå¬îʦD¹<&ÎXúÎì§ ³–>³»*™ä\ð›9cë;²¸kflÄ9®i%ÄÛõjhòȹK•ÙE 5‰¶}©.l5…ñQHZHÚÅþ^.EÍÝ4^ж}Aû•â ÊZv™µgÁ›i±Ì¯‚G:Z7µ¡¡âòMÚ¹V­D@DDD@\²Ù”ÙÂΚ†šJÖ°S>&˜Ã[v„‹® ‡’ຑ(³(à4ÂÀÚgF"nDÐ@Œ‹µ´:æñk<«Ä–5—5+©e³hßNè™ ‰Ð4°ÆÂKE×ai$Ä/Ô»QQÊ,ÊÀø 0…ð6™Ñˆ›…Ñ4#"ímι¼ZÏ*êD@\QXÖ\O$Vmo¨‘³Læ@Ðe‘®Ä×8Ý­ÁÚÁ:ÁÖ»QÑÒÏŸÏSC&~1 Øã9¿½uümï¨êï*çdæ&˜×1²ŒMkˆ$äµ·Ü9´@DEEMàÕ}èû¨•FXüÑ´¾Ëû…oMàÕ}èû¨•FXüÑ´¾Ëû…} GŒQŸ”.Z_“è¾ë»jê¨ñƒê3ò…ÇU‘SÁù#š‰‘ßž“^‹ýÈ'EÎJ-¼Ÿ 0ÖrQmäøiBTQa¬ä¢ÛÉðÓ g%ÞO†”%EÎJ-¼Ÿ 0ÖrQmäøiBTQa¬ä¢ÛÉðÓ g%ÞO†”%EÎJ-¼Ÿ 0ÖrQmäøiBTQa¬ä¢ÛÉðÓ g%ÞO†”%EÎJ-¼Ÿ 0ÖrQmäøiBTQa¬ä¢ÛÉðÓ g%ÞO†”%EÎJ-¼Ÿ 0ÖrQmäøiBTQa¬ä¢ÛÉðÓ g%ÞO†”%EÎJ-¼Ÿ 0ÖrQmäøiBTQa¬ä¢ÛÉðÓ g%ÞO†”%EÎJ-¼Ÿ 0ÖrQmäøiBTQa¬ä¢ÛÉðÓ g%ÞO†”%EÎJ-¼Ÿ 0ÖrQmäøiBTQa¬ä¢ÛÉðÓ g%ÞO†”%EÎJ-¼Ÿ 0ÖrQmäøiBTQa¬ä¢ÛÉðÓ g%ÞO†”%EÎJ-¼Ÿ 0ÖrQmäøiBTQa¬ä¢ÛÉðÓ g%ÞO†”%EÎJ-¼Ÿ 0ÖrQmäøiBTQa¬ä¢ÛÉðÓ g%ÞO†”%EÎJ-¼Ÿ 0ÖrQmäøiBTQa¬ä¢ÛÉðÓ g%ÞO†”%EÎJ-¼Ÿ 0ÖrQmäøiBTQa¬ä¢ÛÉðÓ g%ÞO†”%EÎJ-¼Ÿ 0ÖrQmäøiBTQa¬ä¢ÛÉðÓ g%ÞO†”%EÎJ-¼Ÿ 0ÖrQmäøiBTQa¬ä¢ÛÉðÓ g%ÞO†”%EÎJ-¼Ÿ 0ÖrQmäøiBTQa¬ä¢ÛÉðÓ g%ÞO†”%EÎJ-¼Ÿ 0ÖrQmäøiBTQa¬ä¢ÛÉðÓ g%ÞO†”%EÎJ-¼Ÿ 0ÖrQmäøiBTQa¬ä¢ÛÉðÓ g%ÞO†”%EÎJ-¼Ÿ 0ÖrQmäøiBTQa¬ä¢ÛÉðÓ g%ÞO†”%EÎJ-¼Ÿ 0ÖrQmäøiBTQa¬ä¢ÛÉðÓ g%ÞO†”%EÎJ-¼Ÿ 0ÖrQmäøiBTQa¬ä¢ÛÉðÓ g%ÞO†”%EÎJ-¼Ÿ 0ÖrQmäøiBTQa¬ä¢ÛÉðÓ g%ÞO†”%EÎJ-¼Ÿ 0ÖrQmäøiBTQa¬ä¢ÛÉðÓ g%ÞO†”%EÎJ-¼Ÿ 0ÖrQmäøiBTQa¬ä¢ÛÉðÓ g%ÞO†”Þ WÞº‰TeÍK쿸W0Fø¢“:è‹ä˜ÉtNq`cxÈiò*l±ù£i}—÷ ìhj<`úŒü¡qÀú© †g2•Œ•“yåÀ8æ]}Ç—þ벣ƨÏÊ-/Éô_u‡Ýµr°OI”Nª¯6“ißS )*©ª@‚&»RE‹¾s¤/³n¸HÓ‰¸ogºœ¦¬‚δíHì¦KgQ¶« ÅUÒÁŒ; nkK£p9Ç[Ih¼áùZl®è%wÚ•Up˜å•´‘Ë$E×w|m8á„\ç6ñ·ô]Ï=%•Rú“6MeÛPÙø-FlgsY~9ÁνÍǵ÷Æú=G”“­ÙìºK*™õ˜žéóöŒ‚6–CJNšv«çàÖŽô»Ä.¬–·'·ŸiÕ]urRc HÖ¾š \Ð.Ô_}øŽ·¨}em %m¶ËHÙM Ã.u´ôÕ0ºG¼BÐìlp Àчˆññv”•t´{©2nÚ€=¬k™›#YsÜÐ.6æÞ÷5£‰¢å &TTQÐØU¶†“œm$V…k¢ª|‚¡¦®’àÃsA¾ twÉ1žv±×Þç>HZð‡¾"7âi$ Ež[IcNÓ’–ÓÛO)ãcè&ssld‘µ¤Nfk¾üZï¸\¶hñœŸÊg9Îk³ïЩӴ€@Ã1vq <\ÏœëÃMO%TЗ¾™9ØK#–[È ü €àK…Í.¿^¯xk9(¶ò|5OKiEEŠšÀ·c‹VÅŸ.ÐÐÖ·‰­£P¸q›¯%Mïô»ìé7)BË g%ÞO†˜k9(¶ò|5[ïô»ìé7'¿Ðvﳤܭ ,5œ”[y>a¬ä¢ÛÉðÕo¿Ðvﳤܜ:ÿA۾ΓrP²ÃYÉE·“á¦ÎJ-¼Ÿ Vðëýnû:MÉïô»ìé7% ,5œ”[y>a¬ä¢ÛÉðÕo¿Ðvﳤܜ:ÿA۾ΓrP²ÃYÉE·“á¦ÎJ-¼Ÿ Vðëýnû:MÉïô»ìé7% ,5œ”[y>a¬ä¢ÛÉðÕo¿Ðvﳤܜ:ÿA۾ΓrP²ÃYÉE·“á¦ÎJ-¼Ÿ Vðëýnû:MÉïô»ìé7% ,5œ”[y>a¬ä¢ÛÉðÕo¿Ðvﳤܜ:ÿA۾ΓrP²ÃYÉE·“á¦ÎJ-¼Ÿ Vðëýnû:MÉïô»ìé7% ,5œ”[y>a¬ä¢ÛÉðÕo¿Ðvﳤܜ:ÿA۾ΓrP²ÃYÉE·“á¦ÎJ-¼Ÿ Vðëýnû:MÉïô»ìé7% ,5œ”[y>a¬ä¢ÛÉðÕo¿Ðvﳤܜ:ÿA۾ΓrP²ÃYÉE·“á¦ÎJ-¼Ÿ Vðëýnû:MÉïô»ìé7% ,5œ”[y>a¬ä¢ÛÉðÕo¿Ðvﳤܜ:ÿA۾ΓrP²ÃYÉE·“á¦ÎJ-¼Ÿ Vðëýnû:MÉïô»ìé7% ,5œ”[y>a¬ä¢ÛÉðÕo¿Ðvﳤܜ:ÿA۾ΓrP²ÃYÉE·“á¦ÎJ-¼Ÿ Vðëýnû:MÉïô»ìé7% ,5œ”[y>a¬ä¢ÛÉðÕo¿Ðvﳤܜ:ÿA۾ΓrP²ÃYÉE·“á¦ÎJ-¼Ÿ Vðëýnû:MÊàµÍ ÄÒÒZ„ñ‹Å÷åA/{Ù&p0:9Lg‹ïZëï Úäò)TÞ WÞº‰J€ õSA Îe++&óË€p̺û/ýÔê*_“è¾ë»j ±=S+r¦©‘Û襾 ØëËii.¥‰à¾èÄÖ¸—¸ßx7\î%}>UÉR¾Ë†Ë©žgŽžiãŠW½íkc1áF’]#HÝé¸b÷[5™Ÿµì³eZ5f°W6– $ŒG¬´÷·±€j»Á'ZŠSC=¢+¤ÉÜ 3bkÜÑG8ïmØ^èÇxç ›sˆ$amǽQé™MY 6Êc+%«4°E-V‡>BÙHis7½§e®s]ˆxnXßgÛ5‚çÙTN©‘‚mO{QØ9¹×^C-JIe6ÄÌšÊÁs\×ÇKP×ń֯ðqFÐàÂÜ¹Æøê¬ë²”STd­ºøLf'³C¨ÐI7Éqýcƒœç:òâàC‰)C¶¤¯¬”SÒY”Ω’z¶ÄÙ«Æ©å9ÎpŒâç š^q_©x9_1·…žË°±’E C³r9ñ>F±Ülc¢ÂÑ#q("ç ÍÅâhìù¡l}ÏeX$–V¾žž¦‘åò l!Ø\ãym÷^­BàŠÌmTS³&mØóX0Ãì„–LBæ9Í mÄ´‘·ô\¡òÕ´ª)²ªfH×ËG {ZÆT¾"Ù'«1ßsG~.cI¼ñ4´ ¤r¯É¼±©–ŽÆ¡6}eeÔÔ‘UU`™ïÎÉ oÅxŒ°´ \]#]áެWQÕT>¢lœ·],™ŒNÐ&æd2GÅÈòOïâ7…Ë%•LúcMeNØÚÈ…-FlæÀ s™~¹¡­¹Îà u÷¢å {*Ö¬´Ÿ(}žÊqæ9ª/sÄÜæá¼H[཮kÞ™Wœ"“ÏïßtgñYÊ#Cg¿&NåD88]G=ÀàÖx£hs°Çà4›ÀZ°á×úÝöt›’…–ÎJ-¼Ÿ 0ÖrQmäøj·‡_è;wÙÒnN íßgI¹(Ya¬ä¢ÛÉðÓ g%ÞO†«xuþƒ·}&äá×úÝöt›’…–ÎJ-¼Ÿ 0ÖrQmäøj·‡_è;wÙÒnN íßgI¹(Ya¬ä¢ÛÉðÓ g%ÞO†«xuþƒ·}&äá×úÝöt›’…–ÎJ-¼Ÿ 0ÖrQmäøj·‡_è;wÙÒnN íßgI¹(Ya¬ä¢ÛÉðÓ g%ÞO†«xuþƒ·}&äá×úÝöt›’…–ÎJ-¼Ÿ 0ÖrQmäøj·‡_è;wÙÒnN íßgI¹(Ya¬ä¢ÛÉðÓ g%ÞO†«xuþƒ·}&äá×úÝöt›’…–ÎJ-¼Ÿ 0ÖrQmäøj·‡_è;wÙÒnN íßgI¹(Ya¬ä¢ÛÉðÓ g%ÞO†«xuþƒ·}&äá×úÝöt›’…–ÎJ-¼Ÿ 0ÖrQmäøj·‡_è;wÙÒnN íßgI¹(Ya¬ä¢ÛÉðÓ g%ÞO†«xuþƒ·}&äá×úÝöt›’…–ÎJ-¼Ÿ 0ÖrQmäøj·‡_è;wÙÒnN íßgI¹(Ya¬ä¢ÛÉðÓ g%ÞO†«xuþƒ·}&äá×úÝöt›’…–ÎJ-¼Ÿ 0ÖrQmäøj·‡_è;wÙÒnN íßgI¹(Ya¬ä¢ÛÉðÓ g%ÞO†«xuþƒ·}&äá×úÝöt›’…–ÎJ-¼Ÿ 0ÖrQmäøj·‡_è;wÙÒnN íßgI¹(Ya¬ä¢ÛÉðÓ g%ÞO†«xuþƒ·}&åpZæ†âii-ÂxÅâû¿ò Š½ì“8¦3ÅÀ÷­u÷íry>XüÑ´¾Ëû…oMàÕ}èû¨•FXüÑ´¾Ëû„ö450}F~P¹i~O¢û¬>í«ª£Æ¨ÏÊ-/Éô_u‡ÝµŒ–ùÝ”_eIøH¶ ’ß;²‹ì©? ÁnDDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDœ¨ñƒê3ò…£YÊ>£?(RG-7ƒU÷£î¢R¨©¼¯½u•eE/Éô_u‡ÝµJ¢¥ù>‹î°û¶ ñ’ß;²‹ì©? Ácò[çvQ}•'á"Ø-ˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€³•0}F~P´k9QãÔgå Hå¦ðj¾ô}ÔJ£,~hÚ_eý·¦ðj¾ô}ÔJ£,~hÚ_eýÂϵhj<`úŒü¡rÒüŸE÷X}ÛWUGŒQŸ”.Z_“è¾ë»j-ó»(¾Ê“ð‘l?%¾weÙR~-‚Ü ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆ 9QãÔgå F³•0}F~P¤ŽZo«ïGÝD¥QSx5_z>ê%*ÊŠ*_“è¾ë»j•EKò}Ýa÷mAã%¾weÙR~-‚Çä·Îì¢û*OÂE°[„g*<`úŒü¡hÖr£Æ¨ÏÊ‘ËMàÕ}èû¨•FXüÑ´¾Ëû…oMàÕ}èû¨•FXüÑ´¾Ëû…ŸjÐÔxÁõùBå¥ù>‹î°û¶®ª>£?(\´¿'Ñ}ÖvÔ2[çvQ}•'á"Ø,~K|îÊ/²¤ü$[¸Ar£Æ¨ÏÊg*<`úŒü¡I´Þ WÞº‰J¢¦ðj¾ô}ÔJU•T¿'Ñ}ÖvÕ*Š—äú/ºÃîÚƒÆK|îÊ/²¤ü$[ÉoÙEöTŸ„‹`·""" """ """ """ """ """ """ """ """ """ ""ÎTxÁõùBѬåGŒQŸ”)#–›ÁªûÑ÷Q*Œ±ù£i}—÷ Þ›ÁªûÑ÷Q*Œ±ù£i}—÷ >Õ¡¨ñƒê3ò…ËKò}Ýa÷m]U0}F~P¹i~O¢û¬>í¨íªU/Éô_u‡ÝµŒ–ùÝ”_eIøH¶ ’ß;²‹ì©? ÁnDDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDœ¨ñƒê3ò…£YÊ>£?(RG-7ƒU÷£î¢UcóFÒû/î½7ƒU÷£î¢UcóFÒû/î}«CQãÔgå –—äú/ºÃîÚºª<`úŒü¡rÒüŸE÷X}ÛPxÉoÙEöTŸ„‹`±ù-ó»(¾Ê“ð‘láD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@YÊ>£?(Z5œ¨ñƒê3ò…$rÓx5_z>ê%*Š›ÁªûÑ÷Q)VTQRüŸE÷X}ÛTª*_“è¾ë»j-ó»(¾Ê“ð‘l?%¾weÙR~-‚Ü ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆ 9QãÔgå F³•0}F~P¤ŽZo«ïGÝDª2Çæ¥ö_Ü+zo«ïGÝDª2Çæ¥ö_Ü,ûV†£Æ¨ÏÊ-/Éô_u‡ÝµuTxÁõùBå¥ù>‹î°û¶ ñ’ß;²‹ì©? Ácòhæ²§(%“¼ñÒµ¯v âïò‹Çó W¤ÁÏÇ× P‰QE¤ÁÏÇ× ¤ÁÏÇ× ‰QE¤ÁÏÇ× ¤ÁÏÇ×%E“?\&“?\ •ZLü}pšLü}p‚TQi0sñõÂi0sñõ QE¤ÁÏÇ× ¤ÁÏÇ×%E“?\&“?\ •ZLü}pšLü}p‚TQi0sñõÂi0sñõ QE¤ÁÏÇ× ¤ÁÏÇ×%E“?\&“?\ •ZLü}pšLü}p‚TQi0sñõÂi0sñõ QE¤ÁÏÇ× ¤ÁÏÇ×%E“?\&“?\ •ZLü}pšLü}p‚TQi0sñõÂi0sñõ QE¤ÁÏÇ× ¤ÁÏÇ×%E“?\&“?\ •ZLü}pšLü}p‚TQi0sñõÂi0sñõ Vr£Æ¨ÏÊö“?\*>£?(Y‘ËMàÕ}èû¨”ª*o«ïGÝD¥QE/Éô_u‡ÝµJ¢¥ù>‹î°û¶ ñ’ß;²‹ì©? Ácòhæ²§(%“¼ñÒµ¯v âïò‹Çó W¤ÁÏÇ× P‰QE¤ÁÏÇ× ¤ÁÏÇ× ‰QE¤ÁÏÇ× ¤ÁÏÇ×%E“?\&“?\ •ZLü}pšLü}p‚TQi0sñõÂi0sñõ QE¤ÁÏÇ× ¤ÁÏÇ×%E“?\&“?\ •ZLü}pšLü}p‚TQi0sñõÂi0sñõ QE¤ÁÏÇ× ¤ÁÏÇ×%E“?\&“?\ •ZLü}pšLü}p‚TQi0sñõÂi0sñõ QE¤ÁÏÇ× ¤ÁÏÇ×%E“?\&“?\ •ZLü}pšLü}p‚TQi0sñõÂi0sñõ QE¤ÁÏÇ× ¤ÁÏÇ×%E“?\&“?\ •ZLü}pšLü}p‚TQi0sñõÂi0sñõ Vr£Æ¨ÏÊö“?\*>£?(Y‘ËMàÕ}èû¨•FXüÑ´¾Ëû…oMàÕ}èû¨•FXüÑ´¾Ëû…=«CQãÔgå –—äú/ºÃîÚºª<`úŒü¡rÒüŸE÷X}ÛPvǤˆÛ‚RÆ`gC|¼—¯XªúGõÆõ¾.¨3”H:±Uôë銯¤\o\ª®{r2ŠšÇpïæŒ¸¾óÞ¸â1¶ëµâlS›ïÕš¸øM¼/±Uôë銯¤\oYꬣ §·hlxêi¦®¨œÅ$ ¹ÈZ!|¸Ë8îïòx@ÿ—”tÍ«YIgTÓUÃM2šŠyÛ#K¤tƒ{Ä@Œ?Úþa¡ÅWÒ?®7¦*¾‘ýq½r¢¬U}#úãzç’½ÑV2‘Õg>øÝ+XÙq €I¸êÖáÇÇÿb¼ª7üú‡þ2OzÄ&ÏR÷†¶i &à1•&*¾‘ýq½EMþª®ßÅDƒ«_Hþ¸Þ—Õôëë•f¢ÊJò \Öe3,Îu••ŽtØ´ƒN×fÌa·ÜO¨u‘q ~*¾‘ýq½1Uôëê¡öÍ—UM+í*6ÔRÄfž#;CâŒKœ/½­¸ƒyÕ¬%³eÚ2:+JŽ¥ïŒÌÆÃ;^]vàÖÜ@‹ø¯ ·ÅWÒ?®7¦*¾‘ýq½TR[6]¡$¢´¨êXù ,t3µáÏ ÄZ:Ý„wÂô–Ù²à’å´¨ã}Dކ¾vƒ,v5¢ýnÔ@Ö¤øªúGõÆô¾¯¤\o\¨Oi¸³´õo’Ö|õ¡oúY>» —_Hþ¸Þ˜ªúGõÆõʈ:±Uôë銯¤\oT6ͧUgºÏ†Š’šŠÚ“4æ6褒àÇ(Ⱥï*öûV+6Ί¦Þ¨ ³\ç`8ªÁ»€{Ã/$ î¸yy/AwН¤\oLU}#úãzÊXÙ[KiºÌŠQ 6‘ Lœ>뢆G1ÚºkÀÞÖâÕ}ËBƒ«_Hþ¸Þ˜ªúGõÆõʈ=ÕÖ¾Š&ÉQY¯‘±7õ×’çÐþ3ý×­&~~N¹Yì¦ñgü7ç ñºLüüršLüür¢Dé3óòuÊ:­Íϸk¦ñ+™K/‹ƒêÌäâ«é×Ó_Hþ¸Þ¹W­hpežjY׺H¡…ØA’I/7›‰Âóq ^@ l‘÷yp\5‚úú¾‘ýq½1Uôëë=”yGA“vUE]]M3&lK<³¶7T9¿oã$Ü5Ư(è)íÚ:ši«ª'1Ignrˆ_.2Î;»À<ž?Ä48ªúGõÆôÅWÒ?®7®TAÕŠ¯¤\o\òWº*ÆR:¬çߥk.#„ 7ZÜ8øÿìW•FÿŸPÿÆIïXƒDÙê^ðÖÍ!$Ü2¤ÅWÒ?®7¨©¿ÕCõÛø¨ub«é×Òú¾‘ýq½r¬ÔYI^A«šÌ¦e™Â¡²±Î›iÚìÙŒ6âû‰ïõN².!¯ÅWÒ?®7¦*¾‘ýq½T>ٲ㪩¥}¥FÚŠXŒÓÄgh|Q€ s…÷µ·o:µ„£¶l»BFGEiQÔ½ñ™˜ØgkË£Â\:ÛˆâäøªúGõÆôÅWÒ?®7ªŠKfË´#d”V•K!…ކv¼9ḋA[°‚nã¸^’Û6\A¶•o¨‘ÐÂ×ÎÐe‘®Âæ´_­ÁÚˆÁÔ‚ß_Hþ¸Þ—Õôëë•)í#Wvž­òGÌÄ×›‰k‹MܺÁ×ÄWC$ªÙßp¸énüOîY¼‘ù·ÚÏïž´-ÿK'×oàäâ«é×Ó_Hþ¸Þ¹QV*¾‘ýq½1Uôëê†Ù´ê¬÷YðÑRCSQ[R`cfœÂÆÝ’\ãÅ]å^ßjÅfÙÑTÛÕkœìX1â×pxeä}×/%è.ñUôë銯¤\oYK+im7Y‘J!‚¢Ñ¦Ò!‰“‡ÝtPÈæ;P!÷MxÚÜZ¯¹hPub«é×Ó_Hþ¸Þ¹Qºº×ÑDÙ*+05ò6&þºò\â߯ºõ¤ÏÏÉ×+=”Þ"Ìÿ“¦üá^ —IŸŸ“®SIŸŸ“®TH‚]&~~N¹RU¹¡Ù÷ícÀ~%s)eñp}Cùœ‚\U}#úãzb«é××*âµ­ ³Í@‹:÷I1°»2I#ceæãsq8^n$ ȉ¾*¾‘ýq½/ªé×Öi¶½£OYCKhÙÂúºœËd§ªÎÆjY/¼±®Ä3W„ žqÖS-û[:[F;^ô1;•-©aŽÕ¨ºûÞ9P]â«é×Ó_Hþ¸Þªá´è*gŽ+©¥šHK#d­s7 [Iý®%Åjå›Ijêiª+¬êI*¤¢líakqkËA¼k»ö‚ *¾‘ýq½1Uôëê¢Ê´8NŽJŒÖoLðaÅ}ù©_üC÷y/»ZíAêJ÷EXÊGUœûãt­ceÄp‚&ã«[‡ýŠøç9î.s‹œ|¤Þ¨ŸóêøÉ=ë⩼¯½u¨Ëš6—Ùp­é¼¯½u¨Ëš6—ÙpžÆ†£Æ¨ÏÊ-/Éô_u‡ÝµuTxÁõùBå¥ù>‹î°û¶ ê—ÅÁõær‰V×Ó[55ÒÚ°S@Öálfå$¸¿^²|ƒÉüW/eÒ=ž;h/N¯%­ –ZMµTõb²:FàÑ]$E¹ŒdÆdè¡Æî0ëµaÁÙCô‚gŽÚpvPý ƒÙã¶‚–ÒÉ;RЧ6N:8ìóS[>—q—üÄuìÖ »×TqãÖ~«îm-²-ú«Fº–‚ÔA>*ß)kc38»\M¼“#EÜ—›õ}pvPý ƒÙã¶œ”?H öxí µÕN»H†ÿVÂsr—Üó~&ëhïF«Æo:…ÚçT|”?H öxí§eÒ=ž;h/þ}Cÿ'½bpvPý ƒÙã¶½ÐØõÐÛÑ®´£ªx§t k)³wæºÿù¿ùA}Mþª®ßÅD…Ò0b…Ìl£[ Û‰ ù/‹Çî¼*>ʤ{ʤ{ʤ{‘Fë>ÔŠK2º’‚ÍŽ¢’šjCB*œÈYݲ¯Ô"hÀøëïuÍÁÙCô‚gŽÚpvPý ƒÙã¶‚—'rNÔ°OSŽŽyâ¦0f³®kOùjV_‹>2–ë®ð_‹Œa:üUYë³0æ³—bΜY¼â»…Vî»]÷÷ª«ƒ²‡éÏ´àì¡úA³Çmâ*>ʤ{¡üÎQ*Úúkf¦ [V hÜ-ŒÑã<¤—ëÖOy?Š¢ÉW[tÚ6ff0MðÔ0<×:)[ i"û,ºû×ßqºãÉÁÙCô‚gŽÚpvPý ƒÙã¶‚¾Ú°­œ¦¡e=q ¡ht­Ãœµ¯¦ž"ìE¬Äo•½íÂàÒqÀÇ“6£ ¨š6²åtM’lUHéã`’æš— q€é1Æ~Áó†Ûƒ²‡éÏ´àì¡úA³ÇmQÇ’Y;[bOU-[¡ý|A¡Œó"¦[‹Þw{;#¬oýõvþH[VÄõ= ô¬×ÌÒA4lfŽcfãAx7ÂxÜBÐpvPý ƒÙã¶œ”?H öxí¨:ìZ lÚ `™ÌsWS8,$Œ2Nù5Ž;ž/ý÷«GÁÙCô‚gŽÚpvPý ƒÙã¶€ÿŸPÿÆIïX¯5 ] °-ëJ:§Šw@Ö²›7p.k¯ð›ÿ•r‚*o«ïGÝD¥QSx5_z>ê%*Š—äú/ºÃîÚ¥QRüŸE÷X}ÛPuKâàú‡ó9D«ké­šš€imX) kp¶3GŒò’\_¯Y>Aäþ+—ƒ²‡éÏ´Š’Ð±jí r:ÖZSP²ž˜Å éDfG¸ÄŒspþ®7\oÅ‘|àì¡úA³Çm8;(~AìñÛAE>JÛ0X•–u0©²ø$:yßj(Ì͉ú£v7J1ô4Ýx:»…‹lÓÖÒ2¨%¥£´*­Jú—±ò:VÎC d4Ov,GSoºópïàì¡úA³Çm8;(~AìñÛT\Æe/”HÆ5¡×FZòK›pÖEÂã}âíz€7ë¸{T|”?H öxí§eÒ=ž;j ÅFÿŸPÿÆIïXœ”?H öxí¯t6=t6À´k­(êž)ÝZÊlÝÀ¹®¿Â>oþP_Sª‡ë·ñQ!tŒ¡s(ÖÂöâh>KÀ"ñû¯ ƒ²‡éÏ´‹'GE&¦Zísj:¬Ö²0$1:¬Èæçq^b%„qȾåaÁÙCô‚gŽÚpvPý ƒÙ㶃?]õ•1Útì̸M¦Ëò×Ô8 *(1âã»A/ùŠy¨™E1ž¾x§H],†áPç™\\Yy_~Hºàì¡úA³Çm8;(~AìñÛAxŠƒ²‡éÏ´àì¡úA³Çm@É›p}¬þùëBßô²}vþUv5œë&ËŽÓ œÇ=Åá˜A.ywæî>U%¡£4 Š‚º*NûÜú|éuÃPðŒòù8¼¡ÖŠƒ²‡éÏ´àì¡úA³Çmœ¨±¥¶"³„tTÍ¥«ÏÉK\âØänjFqà~°^ƒäQºÏµ"’Ì®¤ ³c¨¤¦šÐЧ2F÷FAl‚+õš0à¾:ûÝspvPý ƒÙã¶œ”?H öxí ¥ÉÜ“µ,ÓÔ㣞x©Œ¬ëšÓþZ•—âÀOŒ¥ºë¼âãN¿VzìÌ9¬åس§oø®ÃácÕ†û®×}ýêªàì¡úA³Çm8;(~AìñÛAxŠƒ²‡éÏ´àì¡úA³Çm)¼E™ÿ'Mù¼Yùl;Z®Zm6ÚŠh¡¨Ž| ¢ÀIcºüz¸–,¾.¨3”J¶¾šÙ©¨–Õ‚š· c4xÏ)%Åúõ“äO⨲UÖݶ™™ÌG<5 $5ΊVÈH¾àK.¾ãu÷Ün¸òpvPý ƒÙã¶œ”?H öxí ¯¶¬+g)¨YO\h(Z+pÁ#ç-k駈»k1åo{p¸4œFð1äͨÈ*&¬†y]d„[R:xØ$¹¦¥Ã`:L@1Ÿ°A$<á¶àì¡úA³Çm8;(~AìñÛTqä–NÖØ“ÕKVè_hc'|ŧH©–â÷€]ÞÎÁˆë$ÿ}]¿’Õ±=@ÏBðí+DµótM£†˜Ù‡8Ð^ ä0ž7´”?H öxí§eÒ=ž;j»‚[6‚X&sçUÔÎ # “¾FcŽç‹ÿ}êÅQðvPý ƒÙã¶œ”?H öxí ?çÔ?ñ’{Ö+ÅMCc×Cl FºÒŽ©âÐ5¬¦ÍÜ šëü#æÿå\ Š›ÁªûÑ÷Q*Œ±ù£i}—÷ Þ›ÁªûÑ÷Q*Œ±ù£i}—÷ ìhj<`úŒü¡r2‘Œ‘¶®´5Œ hÅ Àx¾@ºê<`úŒü¡p¶Ð¢{ÚÆVS¹Î7%“üÐI£—[֋ᦌ:]oZ/†³õ¹I_I-³;,Êi,ë!×TJkÙœÑ &qdy² }À‹Èã âR•íKWFײLlu×_+£eüW9ÎimÞp-܃£F.·­ÃMtºÞ´_ qÒÛö5sáe%¯APéœæDØjXó#šœqÖ@ 8mû¬«{­zÚ7U8Ô²èN¯½7‚.7kAÙ£—[֋ᦌ:]oZ/†¸ç¶è"°*m¸ge] I9’•í=¬¸4ƒq=é|kŠŸ)b}lPÎú ©%ª}L‚HãkŽ"ZÛÞšïڸΌ:]oZ/†š0éu½h¾çe³eÉKMTËJÔõRiå´²Y 5¦ûœëÁ zŠ›M¤Ígt¨sXÝ<à»Imü ‚òPzчK­ëEðÓF.·­ÃQp•M¦Ú·zp•M¦Ú·z taÒëzÑ|4чK­ëEðÔ\%AÓi¶­Þœ%AÓi¶­Þ‚]tºÞ´_ 4aÒëzÑ|5 PtÚm«w§ PtÚm«w —F.·­ÃMtºÞ´_ EÂT6›jÝéÂT6›jÝè%чK­ëEðÓF.·­ÃQp•M¦Ú·zp•M¦Ú·z taÒëzÑ|4чK­ëEðÔ\%AÓi¶­Þœ%AÓi¶­Þ‚]tºÞ´_ 4aÒëzÑ|5 PtÚm«w§ PtÚm«w —F.·­ÃMtºÞ´_ EÂT6›jÝéÂT6›jÝè%чK­ëEðÓF.·­ÃQp•M¦Ú·zp•M¦Ú·z taÒëzÑ|4чK­ëEðÔ\%AÓi¶­Þœ%AÓi¶­Þ‚]tºÞ´_ 4aÒëzÑ|5 PtÚm«w§ PtÚm«w —F.·­ÃMtºÞ´_ EÂT6›jÝéÂT6›jÝè%чK­ëEðÓF.·­ÃQp•M¦Ú·zp•M¦Ú·z taÒëzÑ|4чK­ëEðÔ\%AÓi¶­Þœ%AÓi¶­Þ‚]tºÞ´_ 4aÒëzÑ|5 PtÚm«w§ PtÚm«w —F.·­ÃMtºÞ´_ EÂT6›jÝéÂT6›jÝè%чK­ëEðÓF.·­ÃQp•M¦Ú·zp•M¦Ú·z taÒëzÑ|4чK­ëEðÔ\%AÓi¶­Þœ%AÓi¶­Þ‚]tºÞ´_ 4aÒëzÑ|5 PtÚm«w§ PtÚm«w èŽ6C˜ÇJòé Žt®i$–µ¾FÄн/Mñç!‘’2ü8˜àEü—â?šö€¡e##m]hkÑŠ-@ €ñ|L¹›hQ=íc+)Ü瀂Iþh$чK­ëEðÓF.·­ÃTVŽQÕQºÔž >h,›ôÉRY.¨›+³l !ÝãÛuîmî¼jÌ•YAOj:…Îc] ^Téek-ÑP$?í¹…·›µ‡yºÂçF.·­ÃMtºÞ´_ sÉlÙqhyËJšmÚ&)Ú4‹î»¾úüM⿌r¨ê­º k*Ñ´Y;*a³›)¨m;Ú÷5Ñ·™Ç©Ày Üh;4aÒëzÑ|4чK­ëEðÕ5>RÄúØ¡ôRKTú˜+‘ÆÖ6Dµ·'¼45ßµp±e³eÉKMTËJÔõR`”NÒÉ^I­7Üç^¸kÔPthÃ¥Öõ¢øi£—[Ö‹á¯:m&k;¥CšÆèñçØšHsoåG‚¼p•M¦Ú·z taÒëzÑ|4чK­ëEðÔ\%AÓi¶­Þœ%AÓi¶­Þ‚]tºÞ´_ 4aÒëzÑ|5 PtÚm«w§ PtÚm«w —F.·­ÃMtºÞ´_ EÂT6›jÝéÂT6›jÝè%чK­ëEðÓF.·­ÃQp•M¦Ú·zp•M¦Ú·z taÒëzÑ|4чK­ëEðÔ\%AÓi¶­Þœ%AÓi¶­Þ‚]tºÞ´_ 4aÒëzÑ|5 PtÚm«w§ PtÚm«w —F.·­ÃMtºÞ´_ EÂT6›jÝéÂT6›jÝè%чK­ëEðÓF.·­ÃQp•M¦Ú·zp•M¦Ú·z taÒëzÑ|4чK­ëEðÔ\%AÓi¶­Þœ%AÓi¶­Þ‚]tºÞ´_ 4aÒëzÑ|5 PtÚm«w§ PtÚm«w —F.·­ÃMtºÞ´_ EÂT6›jÝéÂT6›jÝè%чK­ëEðÓF.·­ÃQp•M¦Ú·zp•M¦Ú·z taÒëzÑ|4чK­ëEðÔ\%AÓi¶­Þœ%AÓi¶­Þ‚]tºÞ´_ 4aÒëzÑ|5 PtÚm«w§ PtÚm«w —F.·­ÃMtºÞ´_ EÂT6›jÝéÂT6›jÝè%чK­ëEðÓF.·­ÃQp•M¦Ú·zp•M¦Ú·z taÒëzÑ|4чK­ëEðÔ\%AÓi¶­Þœ%AÓi¶­Þ‚]tºÞ´_ 4aÒëzÑ|5 PtÚm«w§ PtÚm«w —F.·­ÃMtºÞ´_ EÂT6›jÝéÂT6›jÝè:#Ææ1Ò¼ºC#+šI%­o‘ q4*\±ù£i}—÷ æ)¢ž<ä22F_‡¿’ñüGóTÙcóFÒû/îØÐÔxÁõùB‚’iE™DÁ#Ã4XFãw‹jž£Æ¨ÏÊ-/Éô_u‡Ýµ56KÐpå¥j×Yô3U²ziß _$Ml10 D^sEÇÊ«‹$«ÙiEVf¦º ·Î؃‚vÉW,¤L0÷Æ6=®Í¸ñkWmƒg[¹Ym¶ÑŠI[TÆ0ÙäŒàûü üÇȯ;€É¾…?®ÏÛV‘‹¤É*ø(i tÔÅÐÒY08‡:âêYÌ’]«ˆƒÞòž;•]£“Vü5W9Œ­žC3hO!©y¬¦yÆX[NÛ¢sœˆ4(h_¤w“} ]Ÿ¶ÀdßBŸ×gí«C15…_W“ÙGÆš*ëe²‘$sã‰ÆÂÑŒ´ð8œ"ìD\n¼×ZÙÛÕžÅ4†hÚ%|o$hE­.h½—šGŒM¼·HêŽà2o¡Oë³öÓ¸ ›èSúìý´¡‹+\ÚAš‚•N÷N&©ž¤†9¬cƒ¤’ó3Kc¹Ñ–°[s˜èÃÎÆžZ†´¹àDüN7!7¶ó„ßpÖEÄ!Õyºóï¸ ›èSúìý´î&úþ»?m({Ògçäë”Ògçäë•㸠›èSúìý´î&úþ»?mJô™ùù:å4™ùù:åxî&úþ»?m;€É¾…?®ÏÛJô™ùù:å4™ùù:åxî&úþ»?m;€É¾…?®ÏÛJô™ùù:å4™ùù:åxî&úþ»?m;€É¾…?®ÏÛJô™ùù:å4™ùù:åxî&úþ»?m;€É¾…?®ÏÛJô™ùù:å4™ùù:åxî&úþ»?m;€É¾…?®ÏÛJô™ùù:å4™ùù:åxî&úþ»?m;€É¾…?®ÏÛJô™ùù:å4™ùù:åxî&úþ»?m;€É¾…?®ÏÛJô™ùù:å4™ùù:åxî&úþ»?m;€É¾…?®ÏÛJô™ùù:å4™ùù:åxî&úþ»?m;€É¾…?®ÏÛJô™ùù:å4™ùù:åxî&úþ»?m;€É¾…?®ÏÛJô™ùù:å4™ùù:åxî&úþ»?m;€É¾…?®ÏÛJô™ùù:å4™ùù:åxî&úþ»?m;€É¾…?®ÏÛJô™ùù:å4™ùù:åxî&úþ»?m;€É¾…?®ÏÛJô™ùù:å4™ùù:åxî&úþ»?m;€É¾…?®ÏÛJô™ùù:å4™ùù:åxî&úþ»?m;€É¾…?®ÏÛJô™ùù:å4™ùù:åxî&úþ»?m;€É¾…?®ÏÛJô™ùù:å4™ùù:åxî&úþ»?m;€É¾…?®ÏÛJô™ùù:å4™ùù:åxî&úþ»?mz•­c˜Ö45­€.a 1Jç…Î~”ç8¹Æ¨ÞI¿þ”JE7ƒU÷£î¢R¨ Í$Ò‹2‰‚G†h°Œ!ÆïÕéEKò}Ýa÷mAœµ,KRv[´T­£u%µ~vygs$§Å!8c !÷ ÜÛÉ»UןsäܳÛ̪x¦–ZŒ´ˆ’üAÍ¥tÜEáÍá׎3¨‚î»6Á³­Ü¬¶ÛhÅ$­‚*clòFp}þ …þãä\ô°~jëm&ÅQHë>‚žžYmÛRƒ¥|­Àçg.i¶ñxÆ¡åÕ"–|‡¬’z·;3;+sÑJÓ_Q#cª'”ÈîÏ^Ùî,qhHï‰RØ5OÈÛbÇC¤Véù·p ü’¹—›¯Ô/Ô|·^­$É܃‡AÎÔÁ]¡bµ¤M÷]›ýg~&ñ_áUŸ“Y+UA[UWE%¢¨ž*-¥0Í67ºç¼—Œ!цH/ý—ƒy¡›µ²6¶Ñ¶+«<-ŠiLÑ´JøÞHЋZ\Ñ{/4›yn& Ô$+\ÚAš‚•N÷N&©ž¤†9¬cƒ¤’ó3Kc¹Ñ–°[s˜èÃÍ…T£ÚJÛ5²ÔR6ϯ§¨–+AÖÔ‚"èŸp5ÙËœNqÜGV¨ù.$Él‰†Ô†Ë•ñ²Ð™˜â¤u©(•í×­¬Î^Gzí`y"Pé§–¡.x?€ÍÈMí¼á7Ü5‘q#Èu^n¼Í¤ÏÏÉ×*’Ô²2ȳ!´jMô³fŒ´ä¹Ñ¾Hã΂dÆ ¬%Ü@Þ/ZvGØöµ5-}>K-$õ/«žÔš6G›’›ßw|gïWk¿T¡w¤ÏÏÉ×)¤ÏÏÉ×*‚K?ô{MUiS×M ìúˆéæ5v¬‘çÄÙXEòñ’÷^Xû¸¯RMadx® ¦£§Ó4›BK>gCjLíFC$®ç¾° MÄb¿÷ ½&~~N¹M&~~N¹^;€É¾…?®ÏÛNà2o¡Oë³öÒ‡½&~~N¹M&~~N¹^;€É¾…?®ÏÛNà2o¡Oë³öÒ‡½&~~N¹M&~~N¹^;€É¾…?®ÏÛNà2o¡Oë³öÒ‡½&~~N¹M&~~N¹^;€É¾…?®ÏÛNà2o¡Oë³öÒ‡½&~~N¹M&~~N¹^;€É¾…?®ÏÛNà2o¡Oë³öÒ‡½&~~N¹M&~~N¹^;€É¾…?®ÏÛNà2o¡Oë³öÒ‡½&~~N¹M&~~N¹^;€É¾…?®ÏÛNà2o¡Oë³öÒ‡½&~~N¹M&~~N¹^;€É¾…?®ÏÛNà2o¡Oë³öÒ‡½&~~N¹M&~~N¹^;€É¾…?®ÏÛNà2o¡Oë³öÒ‡½&~~N¹M&~~N¹^;€É¾…?®ÏÛNà2o¡Oë³öÒ‡½&~~N¹M&~~N¹^;€É¾…?®ÏÛNà2o¡Oë³öÒ‡½&~~N¹M&~~N¹^;€É¾…?®ÏÛNà2o¡Oë³öÒ‡½&~~N¹M&~~N¹^;€É¾…?®ÏÛNà2o¡Oë³öÒ‡½&~~N¹M&~~N¹^;€É¾…?®ÏÛNà2o¡Oë³öÒ‡½&~~N¹M&~~N¹^;€É¾…?®ÏÛNà2o¡Oë³öÒ‡½&~~N¹M&~~N¹^;€É¾…?®ÏÛNà2o¡Oë³öÒ‡½&~~N¹M&~~N¹^;€É¾…?®ÏÛNà2o¡Oë³öÒ‡½&~~N¹M&~~N¹^;€É¾…?®ÏÛ^¥kXæ5 kc` €BLR¹ásŸ¥9Î.&¨ë&ÿúQ*|±ù£i}—÷ Þ›ÁªûÑ÷Q*Œ±ù£i}—÷ {>£?(\´¿'Ñ}ÖvÕÕQãÔgå –—äú/ºÃîÚƒÆK|îÊ/²¤ü$[ÉoÙEöTŸ„‹`·""" """ """ """ """ """ """ """ """ """ ""ÎTxÁõùBѬåGŒQŸ”)#–›ÁªûÑ÷Q)TTÞ WÞº‰J²¢Š—äú/ºÃîÚ¥QRüŸE÷X}ÛPVQÙœ7[–¶N{3§YðÓgpâÁŽ9[ŠëÅ÷_}×…Ñ-ƒ”•yF2†j[**ªmG¤etd¸VÇb 5UÞ.c¯Áv«ïÙ–”65«–¥CdtTPTHØÀ.-c%q÷PÊ z“,jèªè)4ʪz8¨é#´^êpã¦Hç¹æ XKa#Syk÷knáQäµ±g>±ñEeUð´O޶:·¼ÇOŠ¢¢csp~½¿æœÜ$ňF5Œ}í¥¯aÚRÖÖÏdUGNÊÚvŠ–|±½¸p¹¢ö"2FùEïhlE£¼\ô™]]iÌø,ë9ç¤au|o¬ÀAM l²é*ynÆb`¼‹Î)­wØÐ[´•³gj¨¥uLžG~¾*‡½Ð´a#¿ÇZœs@†÷Íj ;#%²–ŶßkSÒY³>GÔƒOQlÔJZÙHÐsÏ…Ïy¾™Úˆ4ªåÑgdU¥eÑAbÅ=$ö~‘AU-cžæJ×R²¸¢·¾2 ³‡QÃßXdîZrÔe›%›%-CYPgÅœhc¢ÑÈ l‘±äÔ´Þæ¶âÓp ‡ÝWÛ¶ÍE›]OKŠíX=+jƒ;Ùl“3£áÆ×¼?|ã®æ^Ö‚È«xÅcÀùìÜʼnDÊZP׿C¢ž–V=ç ÌØK@vnûÁ’û†¢[j̪²íЍ). §¬‰ƒ{šé´–‹‰Ž7‡rc …åS¿.æÑk*!²£s,ªy*-@ú¢ÓY,Ñ8AÞéÅM1³wŒXˆl–µ¹Y]ú:Ê»F8ô))b´a¦’Éê3‘‰/ÂÜÄÂ@Ý«]üAÇ“¹iXͱc–zIGQOU3˜÷_‰–q£s0ëšÇ/p¸a–FEZV}£“•ÏHæY”TTó=×¹ÐÓÖDâÞ÷X.©aݨ;ŠàENTZç(¬‹+@ŽŽ¦ZØ4/¨¥’ § N 8ek©ÜK[{ok@‡#²òö²² Š»!©ŠŠ¢LÕi‘ÑÇXüÜq;v1x h“„áEÏ5VBäõED²M<¶e3ä’G9î14’IÖI:ïWˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆ 9QãÔgå F³•0}F~P¤ŽZo«ïGÝDª2Çæ¥ö_Ü+zo«ïGÝDª2Çæ¥ö_Ü,ûV†£Æ¨ÏÊ-/Éô_u‡ÝµuTxÁõùBå¥ù>‹î°û¶ ñ’ß;²‹ì©? Ácò[çvQ}•'á"Ø-ˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€³•0}F~P´k9QãÔgå Hå¦ðj¾ô}ÔJU7ƒU÷£î¢R¬¨¢¥ù>‹î°û¶©TT¿'Ñ}ÖvÔdìÕe6SÓÔEÐKOJÉ#‘¡Í{KeuF«—d91“†Ñ­¢i®’¼EO4²KhU>hÙ|͈²W<¹ŸõÇxá©ÎSµÓÑðŽ›–¼òŸáø>;7. ½ð®ãÕʪÛ[”ue8°ÞÊ6WÉ+kô‡5¢°ÝëÈ:œ‘q¿½/[„n$É VBÇRH0=¬¨•¢¡¥ÅÄOs¿^ œòD˜¯/y7ãuòICce+t·Ç¤f³ôm9ì,-•¢L õÝî,Ήþ«½¿-yÕilÁiYsZ4¶tUf†½ñV¹Ô­v(š6Ö1¸n-/‰ÆF_#žgp8° ´fEX-‰Ñº–yqÊe•óÖM+å.kæ½îysãscŒÜKÞ ÁGEe佑ôÌŽ–ãlŽ|¯c ttØZçb8ILy¾ñ„Þ 8:Jú)2ªj9êò­ÖC%«ÌÂÉ-#;\!³ÈÄÖþ»2JF.÷¿ÕÆÅ»W‘™[fZ4“›vÓ¤:Œa¬–n¦÷< ؾR@ÖÂëµ4ÜŠÜ—ÉØà–¦ªÅ;3³T¸ÕÉr5Ï|¯àÙ#ÄùÞÐáp…Ù&OY’ÐTP: 4J–T²hDò¼T<¾[Àwq76ÞCn…ƒ·hm»NN‚̎ՒȪ¤–fT:VÌê§PÀó/1iãï´Ž?*ý"ƒ5ÁÔÙŒþg4ÌF<æ…Øóþ+¸ñw×ñëAÏ=‰gTÚê%*ÊŠ*_“è¾ë»j•EKò}Ýa÷mANÏ .Se=ED±ÃTô¯’IÖ46RI'Pk½tA—r[6„22®:H)é $³ªQ,²:|MlNf7€ØAïZn䛺¾Ì³a¶m\°²ê#`­¢‚žGF@pkÙ+I‚/¸òØì“¶*-ƒmTÛT.´âÌh®ŠÎ{!fmµ 8Øf.}íª“‰í¸†zÁÜ"ÒL¯°âd/u\…’3ÜÊy\)ÚZL÷7õ9¯Ɇâǃv]ÏÂ46‰jÔ”Ô’GI[%5E3àαÃu8Àqc{£|·’ç€wz9é2FºÌ™óÙÖÌpOVÂÚùGŒ’fšbè}ÑœUÝŒJ.Áx7ReEƒ-Så´¨ÄòTf¡š1ΚHj5;Žqìn;;‰¡Í.l‡¾5=Rd…bžÏ¡ž ÏC55‡PÙ!ª’Q›lX˜Ó…ÇP¹¼eIS•sw=•Ö¥¤–Kú'¶÷2fŠ8§iq¾Ò`WGdØ9bì£á©CEQS¥>WOGŒ09”Q±†&Tœtgºñ#ÅÃ]Å× Š|…вnذ)m¨m CL,¤ŽêXi˜ëÀuÂ'8‹…åÂì8{àì“-lÇUY°Ñ™*…mki ™€µ®ŠW²VŒ7¾'ˆðŒNÅsJ’ƒ-lKF4ÕSá©Àbt´sDÒvmĽ€5¯' np-i$•¹3¥eDVëk0M›ŒÅ‰¿«-uúÅø™Tð8°¹­=𽦾—!tjJnÅ£ÒYTسbЦ2⻬wÝwìñ÷ÜH/2jÒšÙÉ["Ô¨lmž¶Š‰!¡Ï`qMמR­}…fp&OY–N{= ÒEMÇâºóu÷_uåX """ """ """ """ """ """ """ """ ""ÎTxÁõùBѬåGŒQŸ”)#–›ÁªûÑ÷Q*Œ±ù£i}—÷ Þ›ÁªûÑ÷Q*Œ±ù£i}—÷ >Õ¡¨ñƒê3ò…ËKò}Ýa÷m]U0}F~P¹i~O¢û¬>í¨íªU/Éô_u‡Ýµe§À•¹kkfsÚ Ÿ Nkx#•Øo¸Ý}×_qR[RÛͶ2~ŠZÛ¦Ðm¦ãðˆÚúJ¶Þøq¼0¸´‡Œd÷˜qÌ–ùÝ”_eIøH´6fETU $qÊgc §da²–€§’Ûøî7q-Â1v–]ÚôöLµtTqÕOe²¦KR(àLpÍ,AáÏ™†0óO)¸ ‹| Ü1ÉW–öÅ—gT[”´3P¶®Ñ¥†žöÈíT½¯sÉ ^)‹ CN³ì enMX6“#e}‰fÕ27Èö6zV<5Ïv'‘xÔ\ídùN²£€PZ.´h©`Ñf³ªÞÁ3!Žø§’!#¥ŽðF"* ädºðAÖ{O)²¦É¶bà¡´«§Ñ´i)(Œx3ª{¯ŽJ€p¥çá®ì'Žƒ(-zŒªÂ!¤¤µ-zZ:K§ŽDûIÎqdr\I€IÞÜ\ìý%G]Lh଎»6*=$ da%€ÇlŒÜ\ãyn-zÉ XVÙù?TÖmeBa®ÁE;éZæH"kådd]v†½ÀCɬ ÉÕ啽-“mODlØ'°è¦¨©3S>VÕ:9ªb¹€HÓ&”»YŒöouÆRÖÚT™KDh+©)˜ËÑ⸸S—0ÓàsÈpÂç^]®æãìWˆò›$l ^{"ŽÓ“7HÉRP2’FncžæµÆ'>+㌋Øö\.!פ–ɳg§Ñæ³é$ƒ;–â8<ÜE׸HûÏ—¯ã(1ö6QZYA–6lÍPQºž¸¾Ïª‰Ì¨kY¢‰™ŠæK‰î{N¿Õ½º}ãx¹ô <þDƒ=Ïç3csoþvöþ<:¸—B" """ """ """ """ """ """ """ """ ,åGŒQŸ”-ÎTxÁõùB’9i¼¯½u¨Ëš6—Ùp­é¼¯½u¨Ëš6—Ùp³íZ>£?(\´¿'Ñ}ÖvÕÕQãÔgå –—äú/ºÃîÚƒÆK|îÊ/²¤ü$[ÉoÙEöTŸ„‹`·""" """ """ """ """ """ """ """ """ """ ""ÎTxÁõùBѬåGŒQŸ”)#–›ÁªûÑ÷Q)TTÞ WÞº‰J²¢Š—äú/ºÃîÚ¥QRüŸE÷X}ÛPR>†¢Ó/¨(ãÎUUYQà 1‰îŠ`Ñy¸ ÉjIò:¥¹nÊÈ©jÛuî¡–”ÒG%4l®„¹Ì3°ÉWxá ·È´ÉoÙEöTŸ„‹`·ü™+”µ*g6dñég-XÚ(⦮TÁ#ÙŽçÈ×ÆÚ–·H×t—8Œo¾92"²¢[bª‹%£³Y£×ÉeÓ»Gk©ª]a{3o-åðÊC]y"õúâ ü¾ÙȪ¹+¦Š;6wXÕÊilêèÜÖ‡ÃM…튤šÐöTßpÅ! \÷¤žÅ«©¤É˜ª¨äª65l2LjfdîšêwGkÍØËd8¹ÁŽ9·86ü!ÚÄAù‘‘öœVDö…›ÑÑÔRTGŸ, Š¢8éZ/ºCLéZüñ!Ï$^æLD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@YÊ>£?(Z5œ¨ñƒê3ò…$rÓx5_z>ê%Q–?4m/²þá[Óx5_z>ê%Q–?4m/²þágÚ´50}F~P¹i~O¢û¬>í«ª£Æ¨ÏÊ-/Éô_u‡ÝµŒ–ùÝ”_eIøH¶ 1BÈ(*êªâl‚¢¨0Jìbâhƒuןçü.îá7òÉÖoejÑrŠ›„ßË'Y½”á7òÉÖoe.Ê*n,föS„ßË'Y½”¸(©¸Mü²u›ÙN,föRà\¢¦á7òÉÖoe8Mü²u›ÙKrŠ›„ßË'Y½”á7òÉÖoe.Ê*n,föS„ßË'Y½”¸(©¸Mü²u›ÙN,föRà\¢¦á7òÉÖoe8Mü²u›ÙKrŠ›„ßË'Y½”á7òÉÖoe.Ê*n,föS„ßË'Y½”¸(©¸Mü²u›ÙN,föRà\¢¦á7òÉÖoe8Mü²u›ÙKrŠ›„ßË'Y½”á7òÉÖoe.Ê*n,föS„ßË'Y½”¸(©¸Mü²u›ÙN,föRà\¢¦á7òÉÖoe8Mü²u›ÙKrŠ›„ßË'Y½”á7òÉÖoe.Ê*n,föS„ßË'Y½”¸(©¸Mü²u›ÙN,föRà\¢¦á7òÉÖoe8Mü²u›ÙKrŠ›„ßË'Y½”á7òÉÖoe.ÊÎTxÁõùBêá7òÉÖoeqÊñ#ñ@¸ ¿ˆ\¤Ê¹é¼¯½u•EMàÕ}èû¨”ªŠ—äú/ºÃîÚ¥QRüŸE÷X}ÛPxÉoÙEöTŸ„‹`³,‚‚®ª®&È**ƒ®Æ.!€†€7]yþÂîî,föV­(©¸Mü²u›ÙN,föRà\¢¦á7òÉÖoe8Mü²u›ÙKrŠ›„ßË'Y½”á7òÉÖoe.Ê*n,föS„ßË'Y½”¸(©¸Mü²u›ÙN,föRà\¢¦á7òÉÖoe8Mü²u›ÙKrŠ›„ßË'Y½”á7òÉÖoe.Ê*n,föS„ßË'Y½”¸(©¸Mü²u›ÙN,föRà\¢¦á7òÉÖoe8Mü²u›ÙKrŠ›„ßË'Y½”á7òÉÖoe.Ê*n,föS„ßË'Y½”¸(©¸Mü²u›ÙN,föRà\¢¦á7òÉÖoe8Mü²u›ÙKrŠ›„ßË'Y½”á7òÉÖoe.Ê*n,föS„ßË'Y½”¸(©¸Mü²u›ÙN,föRà\¢¦á7òÉÖoe8Mü²u›ÙKrŠ›„ßË'Y½”á7òÉÖoe.Ê*n,föS„ßË'Y½”¸(©¸Mü²u›ÙN,föRà\¬åGŒQŸ”.®,föW¯? €›ø…ÊL«ž›ÁªûÑ÷Q*Œ±ù£i}—÷ Þ›ÁªûÑ÷Q*Œ±ù£i}—÷ {>£?(\´¿'Ñ}ÖvÕÕQãÔgå –—äú/ºÃîÚƒ±Òâ„5¬ÖÂMìžøò…çH›É»’_Ô?™Ê$éócÙ7rðkšÙÙ|gµÏleŒÄæ´€Hk¹·ŸÞ9W•ƒ´-¾ª·™IXúJ ‘jÙ$b”±ÞÚ¬l/I mÎ0@n8u†úJæÄø™#àc¥vÚæ0ºâ놭fæ“w <ˆ+šéß|f5¯taŒÄÖ¸ jµ×Üyæv͵WÂ4óÇhçíŠZÚã ‰†3„GOT"~l éÆÐí׿«m×7]C&VÚ™œ¢e®$¤¤“ºXKê\c¦´ ®ºû¯XY$ÍK™Ìâeø#v'ÈXCõý€wVÛ6å•-kiªæ´¥§©–Š&…‡Žƒ¤ÌÖ¶ø™}4ã¾›Ç}þÈãâQÚ6äoe”ã”tÔvtðJémZWDØß3 #k¤ÆÀ|§·~¯½u᪥µ ®ŒÉI=-C׺ ÇmÇ+\Ò?qʧÒæÇ²nåùVGWI¤Ø“ÖÖèôTk kß‘Ühèe͹Ä}¬œ`Üï H_¤é”¹ìΓw9™Áœ³˜1á»ÎÁß]Çv¾$‘Ù¤?ÍdÝɤ?ÍdÝÊ$AY”UÕÓP¶'ˆóµôñ¼±¤´¼^/û—÷jVj)¼E™ÿ'Mù¼@DENé qBÖka&öO|yBK/‹ƒêÌåCH›É»—‰«›M“Îø"†6—¾G±kZä’F •yT™WªÄl‡S"­£šG&Fʘœ÷äkZ 'ˆIAgI”u¡$¢´,ú–>S  £xsÃq‚8Ý„wÂõÛ¤?ÍdÝË”vÕC¨m,žu5£]O<…¯§nu²½´unŽü.Õû&ãqâ7E: t‡ù±ì›¹RÍY<™a1}Ð $͵¡ »8Áy»ŒÝËÅyå*ÕQ¿çÔ?ñ’{Ö ÐS€ê˜‚ð?Å}ÒæÇ²nä¦ÿU×oâ¢A.ÿ6=“w*貞ɞÑ6t6­™%ps˜i™$F@æßˆaïÇ’â»çñG^,s$Õ4ϳ;¢pì§sfÅÂd4çKËn¸‘ƒX·‚qÑt‡ù±ì›¹4‡ù±ì›¹~ahe-¿ÖÜŒ´(â}4UÅ´YÀùadl“5.g3‰—àØŸ!aÔ;öÝ[lÛ–Tµ­¦«šÒ–ž¦Z(`šñ&©®"6´—ã¹— oìâï•¡úÿ6=“w&ÿ6=“w,$VåD:]U%µÂöEŸ™¨¨«ýK±±ÙÖÌÌq47õmÍpçÁâx»ŠÕ¶²šŠ¢ž)khè§u0©dU35™ÙŸ$‡G±HgÍ´FË¢,qÅ}÷½¸eÒ4‡ù±ì›¹4‡ù±ì›¹Dˆ*rj¦jË:Љ ’¾iñ8ý«À¸¨ W‘»<Ž¥ØÚ/sAòUÉ›p}¬þùëBßô²}vþOa¤?ÍdÝɤ?ÍdÝÊ$A}µGe@ÙíÊ*8\ìJƒm.¸›¯uÚîWî^é-H- VUQOKSNûðKcØëÆâ5`û,ÎYÕhO°*4ú: ‘ÿ3ZÛâeôÓŽøbo÷øk#‰GhÛ‘½–SŽQÓQÙÓÁ+¥µi]c|Ì,h®“uòœ:Ýú¾>õ׆ª–Ô‚º3%$ôµ ^èƒ5´8k­sHýÄ*ŸH›É»—åY]&“bO[[£ÑPY®¯~Gq£¡—6çö²qƒs¼-!~“¦Rç³:L9ÜægpbÎ`džï;}wÚø’Gfÿ6=“w&ÿ6=“w(‘fQWTCMBØž#Î×ÓÆòÆ’Òñx¼ î>_Ý©Yª<¦ñgü7ç ñ;¤1ÅkY­„›Ø =ñå ,¾.¨3• !þl{&î^&®m4O;àŠÚ^ùÆ5­h’I€UåRe^«²LжŽix™*bsÜO‘­h$ž %&PYÖ„l’ŠÐ³êXùL,t.áÏ ÄZãvMÜw ×nÿ6=“w,QÛTu¡´²yÔÖu<ò¾¹ÖÊöÑÕº8ñ3Â7“ÞxÇäÄ/åƒ(­&Øõ¦Knޡޖ&EhÃ[ã§qÆçggÑ„MmÌk@͹ؤ‘„Z¤iócÙ7rñ5si ’yßPÆÒ÷Èö1­k@¼’HÔò¬^F[v…·]3ª«™,0R45°>9]¤ÔÇÆ ‰l Ö0´ÞHh¼A•ÙIVçÛ-¬„SÔSVÓ:‚jˆóñSJìà„FÖ¸Æs¤p-x8F!†PýN*æÎÂø_s ˜ÆÒZá¨q‚#ÈA^ô‡ù±ì›¹gòWä‰ÿä«ÿýܪíTÕ“É–SÝ ’LÛZ ³Œ›¸ÍܼWžR­Uþ}Cÿ'½b¼A7ƒU÷£î¢UcóFÒû/î½7ƒU÷£î¢UcóFÒû/îØÐÔxÁõùBå¥ù>‹î°û¶®ª>£?(\PéQÒÓÄhdÅ1Ænž¯k@?·ûsÚ6ô4sGO¡Z3¹ŒïÞÐI&ìW\uÅø®>é¢ôU³êÜ­ñÔô6ÐöÓOA“mmGtÑz*ÙõîNé¢ôU³êÜ­ñÔô6ÐöÓOA“mmGtÑz*ÙõîNé¢ôU³êÜ­ñÔô6ÐöÓOA“mmGtÑz*ÙõîNé¢ôU³êÜ­ñÔô6ÐöÓOA“mmGtÑz*Ùõî\ôUO´r¹•l¢­‚P>2êŠwF1@¼‹¸¯þJÿOA“mm1Ôô6ÐöÐLÉ™NöÍ&,œnÂÒãpÖnòOîÕtÑz*ÙõîVøêz ›h{iާ É¶‡¶‚£ºh½lúƒ÷'tÑz*ÙõîVøêz ›h{iާ É¶‡¶‚£ºh½lúƒ÷'tÑz*ÙõîVøêz ›h{iާ É¶‡¶‚£ºh½lúƒ÷'tÑz*ÙõîVøêz ›h{iާ É¶‡¶‚£ºh½lúƒ÷'tÑz*ÙõîVøêz ›h{iާ É¶‡¶‚¯%b–“E$OÎLì0µÀ\Eàëˆ*¾ԊͥôõsºG‹›MNéHɸ\8ÇýŠ“OA“mm1Ôô6ÐöÐTwM¢­ŸP~äîš/E[> ýÊßOA“mm1Ôô6ÐöÐTwM¢­ŸP~äîš/E[> ýÊßOA“mm1Ôô6ÐöÐTwM¢­ŸP~äîš/E[> ýÊßOA“mm1Ôô6ÐöÐTwM¢­ŸP~äîš/E[> ýÊßOA“mm1Ôô6ÐöÐfm;LÚγà‚Í´ØæWÁ#-ÚÐÐñy&í\«V¢ÇSÐdÛCÛLu=M´=´¢‹OA“mm1Ôô6ÐöÒ„ª¾Ñ·¡£š:} ÑÌg|è(Þö‚I7bºã¨Ž/Åuã©è2m¡í¦:žƒ&ÚÚ Žé¢ôU³êÜÓEè«gÔ¹[ã©è2m¡í¦:žƒ&ÚÚ Žé¢ôU³êÜÓEè«gÔ¹[ã©è2m¡í¦:žƒ&ÚÚ Žé¢ôU³êÜÓEè«gÔ¹[ã©è2m¡í¦:žƒ&ÚÚ Žé¢ôU³êÜÓEè«gÔ¹[ã©è2m¡í¦:žƒ&ÚÚ *§Ú9\ʶQVÁ (uE;£ŒŒ ^EÜWÿ%¤Qc©è2m¡í¦:žƒ&ÚÚ7ƒU÷£î¢R¨éÙ#"•ÒÇ›t“—†—µÆì¶ó„‘ÆÒ¤@QRüŸE÷X}ÛT«ž*:Zx ˜£†8ÍÓÃuíhöÿr{FÞ†Žhéô+Fw1ó £{Ú $݊뎢8¿ÇÝ4^ж}Aû•¾:žƒ&ÚÚc©è2m¡í ¨îš/E[> ýÉÝ4^ж}Aû•¾:žƒ&ÚÚc©è2m¡í ¨îš/E[> ýÉÝ4^ж}Aû•¾:žƒ&ÚÚc©è2m¡í ¨îš/E[> ýÉÝ4^ж}Aû•¾:žƒ&ÚÚc©è2m¡í ¨îš/E[> ýËžŠ©öŽW2­”U°BÊÆ]QNèÆ##‘wÿÉ_ã©è2m¡í¦:žƒ&ÚÚ ™3)Þ٤ł3ØZ\nÍÀ^IýÃZ¢îš/E[> ýÊßOA“mm1Ôô6ÐöÐTwM¢­ŸP~äîš/E[> ýÊßOA“mm1Ôô6ÐöÐTwM¢­ŸP~äîš/E[> ýÊßOA“mm1Ôô6ÐöÐTwM¢­ŸP~äîš/E[> ýÊßOA“mm1Ôô6ÐöÐTwM¢­ŸP~äîš/E[> ýÊßOA“mm1Ôô6ÐöÐUä¬RÓ°2h¤‰ùÉ‚F¸+ˆ¼cQXWÚ‘Y´ >ž®wHñsi©Ý)y7 ‡ããÿ±Rc©è2m¡í¦:žƒ&ÚÚ Žé¢ôU³êÜÓEè«gÔ¹[ã©è2m¡í¦:žƒ&ÚÚ Žé¢ôU³êÜÓEè«gÔ¹[ã©è2m¡í¦:žƒ&ÚÚ Žé¢ôU³êÜÓEè«gÔ¹[ã©è2m¡í¦:žƒ&ÚÚ Žé¢ôU³êÜÓEè«gÔ¹[ã©è2m¡í¦:žƒ&ÚÚ Í§i›YÖ|Y¶›Êø$s¥£{Z/$Ý«•jÔXêz ›h{iާ É¶‡¶‚TQc©è2m¡í¦:žƒ&ÚÚP•WÚ6ô4sGO¡Z3¹ŒïÞÐI&ìW\uÅø®¼u=M´=´ÇSÐdÛCÛAQÝ4^ж}Aû“ºh½lúƒ÷+|u=M´=´ÇSÐdÛCÛAQÝ4^ж}Aû“ºh½lúƒ÷+|u=M´=´ÇSÐdÛCÛAQÝ4^ж}Aû“ºh½lúƒ÷+|u=M´=´ÇSÐdÛCÛAQÝ4^ж}Aû“ºh½lúƒ÷+|u=M´=´ÇSÐdÛCÛAAETûG+™VÊ*Ø!eã.¨§tc‘„ È»Šÿä´Š,u=M´=´ÇSÐdÛCÛ@¦ðj¾ô}ÔJ£,~hÚ_eý¸§dŒŠWKmÒN^^×°FÛÎGJ§Ëš6—ÙpžÆ†£Æ¨ÏÊJZ>£?(Q ›7XÇ>G‚á}Í`>R9rù†rM˜í$¾.¨3–K)mé­Ë2‘¶…¥GO55L6}©‘Îc¡ ¼f¤!·=Úîî×ă[†rM˜í&9É6c´²T9O%5;©í*ZÇÔEdØÃ+eñS4´[, ZÖ´“~!?uuS(¡±­)«ÿY¥a€>"q9ÒÄÑ‘…ÎðµÜACM†rM˜í&9É6c´²MËûKR–Š*ŒzNd2\ln¹Z×F3np”ÞÍma²0» ù`kçú%e5 ôÔ0ÈЇFÖ¿¾pÂàu ÃqëÂ†Ó ä›1ÚL0s’lÇic¨ÿHv{*N÷¼A¨n "y’0@Ås^sB÷6üînàI7¸·KIS¥Ò²lÌÐ^ÍÂön ù°u‚Aã‚ Ì0s’lÇipK_ m¨¬ØÚ÷9ôï¨sÜ5 y¾üG’ë¼·êêToùõüdžõˆ/¢frV2û±8 ù¼0s’lÇi)¿ÕCõÛøª›~¾[+'-KF±ÓRRK;ðKKšÂà Äj¼ ¶Ã9&Ìv“ ä›1ÚY+\ÚY=gi¦Û¬¬‹I¥cÛ5,oTF×`1·ÞÇ<…Ä’Ü$®j̰£ ³_WUK4/ФRÍO4ôñ>'–g.|¢3{KOzâ{ïÜn >9É6c´˜`ç$ÙŽÒÌSe•Y7ùx+$¥ÎA«3XbfFè¸ÈqÅcn–Ÿ4L2eÕŸ"¢¦Ž² IiU5L¦!C1ÆÆ–÷÷³š;³€{°Ün n9É6c´˜`ç$ÙŽÒÄC—4••ô³R½î¥ÌTG-; R9ÕJfÄÐö8°“Ÿðü#|AiºÐeDox¦ŠË¯–Ñ{d nhIhc‰.2ȺXާ“ßZphðÁÎI³¤Ã9&Ìv—™_«eQÚ05톮NƼà×48uúî+©—h2Ô¡q±Ìc¤‘:îkÜÐOñÃ}ÞKüªÂ8ØèÜ÷½Í w­¿ŽÿÞ9$~mÁö³ûç­ ÒÉõÛø9 ä›1ÚL0s’lÇiD³V}uc­÷Å]_SΞf6ŠZK©ß.͘¥Â/°5äcýA„]Þ« ä›1ÚL0s’lÇid™—Vx²ÙhVQÖPÁ53j©IˆgØ\Æ‚ ^C{ébùhïâ#ÝZÐÚpFlÚJšê—:FºšžHæyÌÙ;‚ò{û®¼; †« ä›1ÚL0s’lÇigíkRxa 6M‚ЭdoýXl4ù{%Ø|ĈŠë³Ô?¤ :JI&­¨švÏ,f³¾ž Z-<Ž.sœÈñbšò¾÷jF¥ÐpÁÎI³¤Ã9&Ìv—\… =m+ó”õ6XŸqšáx7cQò©ÐsZ•ðY°Àð$•ÓTENÖá ½À^Mçˆ^ï]‘ÇœÅß5¡¢ò]-ÞOâ¨2›ÄYŸòtßœ- ^.¨?0@Í3¤Gü¹3Léÿ'nQ" sLéÿ'nLÓ:DÉÛ–s*-™lx¬ãm jªóUW4º8Ûš‘÷ÝšÉ`•,[}µ‘ÕTÓNd«4´µtŒ"²"Η3[® {â/ÚÁ8@hóLéÿ'nLÓ:DÉÛ–}ù]aÇPúwW~¶7=Ýïzƾ7‡<÷­ÔIÂû´æ™Ò#þNÜ™¦tˆÿ“·(‘VU5—gTWO;LP0½Áqq»È5qž%*£Ëš6—Ùp¯@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@SfâkçÈð\/¹¬ÊG/îP©eñp}Cùœ¨aƒœ“f;I†rM˜í(•&VVÏgäû§§¨šæ¦š3, dk¡ÿŒ“Þ±;‘±z<þ·7muPXm™Rjia‘²–ñ>w¿½$.s”ä‚Þ›ýT?]¿Šã¬¤‚С¨¢ªfrž¢'E+/#\."ñ¬j>E>k?úç79ÞâkËH¿Uà`þñ­Twa¿Öª7 Œäé™ W[•n"‘™Ó r²AÞÆÆƒ{£h%À/¶óz|š…ö„ö…5uelÒ¹æxsn 9‘1ÌìspœÄgŠûÆ¢!IÜe…þÿZ¨ÞÆX_ïõªè ¢É* (YÑMRaÒωÎn,Tí…¬2ÿâë®Õu=‘õÒTGÂSæ(é)³4ðT¶}õ‘HÂ×c=á—ç1yxŽ+þâì/÷úÕFôî2Âÿ­ToTA6JÓԘ䫯¯¨©® ¨‘ìÄ_ÚðÐÐÀZè# †›Ž&¸¸“Ã_“–„Š¦È¨|–‹#ª+çªd2<8FÛ°èòFAF51¤fƳ‰×Ú÷a¿Öª7§q–ûýj£zv5‘%‘dÙô!4­¤Ž8ü5¯ ˆG†ë‰ $cã¾ýWáÔ¬aÑAo•ó9­ 2<ç8ÎçP÷*¾ã,/÷úÕFôî2Âÿ­ToPE’?6àûYýóÖ…¿édúíüªlM‚˜,Ö¹´’V³$’$pq½Äd¯^¿'é­±émx¬sÄQºðÑ4Œuïˆññ^yPt*¶ØŒáHë%®¬™Èé ¦•í1Ã#šæ—4áÆu=à8´\¹·xî2Âÿ­ToNã,/÷úÕFôVNEˆ,J kNЩ©ª¥¤Šž i\ÓïŠæ7Çdg¼±~N—f¦Å¤Úøñ6ø!kðâf0ÆÖþ®?ƒ[oãs‹¤î2Âÿ­ToNã,/÷úÕFõGT–\ºÍ%óö|™È¯¸¸æŸ|ç^]Þ¼›ï¼›‰Ô|δé$¦3>Òùj$ÆCHÿ˜ºà;ß%÷ £¯,pmM0ql¤Ó¸€âVHǬ4jpÕˆë¼J·¹Ù}?lí™ØNçeôý³¶gaâ*>çeôý³¶ga;—ÓöÎÙ„ ±ù£i}—÷ ñgê2TUÓÉE·kIƒ ˜éc Ž¢Ð ""€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€¥—ÅÁõær‰pÖäÕ›iLÚªÇHdsnI™ H¸›†»ø¹oòª;—-¡A¥LÈ&sÚÖO à°€qG#dh×佂ÿÝâî2Âÿ­ToNã,/÷úÕFôëlZꊪ‰$™²ÔG10Õ˜dt‘½·=÷ë¼ u÷òÉ“/|ôõM·mVVBÙXjA…Î{d1Þ ]c@Í2àÖ·ˆ“y$™ûŒ°¿ßëUÓ¸Ë ýþµQ½'q¶s31ÓÏYOI”ó6–)Vdƒ6ç ÞÄÆN…÷bï—Š<‹¤³bˆYö…},ñµ±¶¡†'?Š‹n{ n"ž"Nïâ!wwa¿Öª7§q–ûýj£z£¶Ì ŠÊ²¨ìè÷CI cžAqkZ ºíwÔª;Œ°¿ßëUÓ¸Ë ýþµQ½Aþ}Cÿ'½b¼TÔ¶ed[¬‚¯5’S=øŒ²<60æ;óÆMÜ^iâòÜ *<±ù£i}—÷ ñQåÍK쿸H>£?(Q)j<`úŒü¡D€ˆŠ" """ "" i¿ÕCõÛø¨”´ßê¡úíüTJŒM§•µTvµ±-;¯ ‘­§²äŒšªÏÔÇ ktwÎsËs¬q;‰wEnÕTåmm”ÛbǦѪY(¥„º¦hó1Èç4çGœà.µÛW“úUŸ”TšVÇßfïÌâ§d&1ÁTÌáh‘¤â3„\zÅéð/è2†šÒ¶e §cÜÖRGRÙ°8úIæ8÷ŽiŽì.!×âw¥[ª3'e²jŸSOZÇMPÐ*³’×;?$İ "ù¦ë¯f³„ã·•BF™f…Ìïï ˆ´›Ü0kÄn¹·ƒ«¾:Æ$YMâ,Ïù:oÎâ£ÊofÉÓ~p¯@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DD,¾.¨3”JY|\Pþg*"T9QlËcÅgëh([UW˜’ª¹¥ÑÆÜÔâÆÍd° ʯ—uŸ¦ÖY•ÜIŸñß‘ÝÇ«Æ_~¾+¼¨*¬Ü¥ÖlÕ5µÔ±•9ˆ*h!{Ù[Þ5÷ÅKÜë¯{HiwŠyÕqÌ«¤á*–:LT¦§’2>gÊ÷Î׳6qss:Û‡p¾þ#w‹O$b´[ä’šWKh6º8êéDЇ vÁ…ìÄ1‹pÖÛ‰oÚø¦È yXÎþÆ6Å›‚K9†”=¦ ›á^Ûª]p¾ðZÒ\ã}ï}.PÙ°ÒÁTùfÑæÅúÖÓHYs³¤6è°›Ádžë}ØMÇå••1ºªçSß‹õnïÈpalfïÖ8<†ÌD9Á¤b ,í§ú?e}–(™5šÐiŸY|tåÎ{‹éØ×4BëÞu÷ĆGy%¤ºÆ¿%h›Iµ5Ì’ ·G#au0-sØö½¦a}Ò…¬ÔLc ‹ˆkšøt5¥¥¦sÈk°=’FèÞÇ\ Îc€sMĈ‚u*»Æe‰BøÚ6™%29´t¦ˆ€ïX §­mR.]*oGÔõ£í¦•7£êzÑöÐu"åÒ¦ô}OZ>ÚiSz>§­mR.]*oGÔõ£í¦•7£êzÑöÐu"åÒ¦ô}OZ>ÚiSz>§­mR.]*oGÔõ£í¦•7£êzÑöÐt»›‘Ñ>îöF€KO‹ÁÞTÎËéûglβҦô}OZ>ÚiSz>§­mos²ú~ÙÛ3°ÎËéûglβҦô}OZ>ÚiSz>§­mos²ú~ÙÛ3°ÎËéûglβҦô}OZ>ÚiSz>§­mos²ú~ÙÛ3°ÎËéûglβҦô}OZ>ÚiSz>§­mos²ú~ÙÛ3°ÎËéûglβҦô}OZ>ÚiSz>§­mË2Ίʳ㣆I$c ŠB1çîq“äKBŠZè™- ºF‡b:3šÒãä¼–“ªóÅwð_t©½SÖ¶šTÞ©ëGÛA[Ü쾟¶vÌì's²ú~ÙÛ3°¬´©½SÖ¶šTÞ©ëGÛA[Ü쾟¶vÌì's²ú~ÙÛ3°¬´©½SÖ¶šTÞ©ëGÛA[Ü쾟¶vÌì's²ú~ÙÛ3°¬´©½SÖ¶šTÞ©ëGÛA[Ü쾟¶vÌì's²ú~ÙÛ3°¬´©½SÖ¶šTÞ©ëGÛAYÜÈtÐ>{^Ó¨l2²fÇ,Œ-.i_Þ~åz¹t©½SÖ¶šTÞ©ëGÛAÔ‹—J›Ñõ=hûi¥Mèúž´}´H¹t©½SÖ¶šTÞ©ëGÛAÔ‹—J›Ñõ=hûi¥Mèúž´}´H¹t©½SÖ¶šTÞ©ëGÛAÔ‹—J›Ñõ=hûi¥Mèúž´}´H¹t©½SÖ¶šTÞ©ëGÛAÔ‹—J›Ñõ=hûi¥Mèúž´}´H¹t©½SÖ¶šTÞ©ëGÛAÔ‹—J›Ñõ=hûi¥Mèúž´}´H¹t©½SÖ¶šTÞ©ëGÛAÔ‹—J›Ñõ=hûi¥Mèúž´}´H¹t©½SÖ¶šTÞ©ëGÛAÔ‹—J›Ñõ=hûi¥Mèúž´}´H¹t©½SÖ¶šTÞ©ëGÛAÔ‹—J›Ñõ=hûi¥Mèúž´}´H¹t©½SÖ¶šTÞ©ëGÛAÔ‹—J›Ñõ=hûi¥Mèúž´}´H¹t©½SÖ¶šTÞ©ëGÛAÔ‹—J›Ñõ=hûi¥Mèúž´}´H¹t©½SÖ¶šTÞ©ëGÛAÔ‹—J›Ñõ=hûi¥Mèúž´}´H¹t©½SÖ¶šTÞ©ëGÛAÔ‹—J›Ñõ=hûi¥Mèúž´}´H¹t©½SÖ¶šTÞ©ëGÛAÔ‹—J›Ñõ=hûi¥Mèúž´}´H¹t©½SÖ¶šTÞ©ëGÛAÔ«k¬™«ª3¼1hÓ´45±@ö5­BxÉ:Éãä]TÞ©ëGÛM*oGÔõ£í ­îv_OÛ;fv¹Ù}?lí™ØVZTÞ©ëGÛM*oGÔõ£í ­îv_OÛ;fv¹Ù}?lí™ØVZTÞ©ëGÛM*oGÔõ£í ­îv_OÛ;fv¹Ù}?lí™ØVZTÞ©ëGÛM*oGÔõ£í ­îv_OÛ;fv¹Ù}?lí™ØVZTÞ©ëGÛM*oGÔõ£í ã °™Ehéϯ­ª›4aCÚàH'‰ ñ´+eË¥Mèúž´}´Ò¦ô}OZ>Ú¥G–?4m/²þáYiSz>§­mUeS¤—#mW¾ ! Œü´ßyò\O"@›(­wØÕo”Ùâø©ãÄòæÅºB_+Ú×0žû ‘}Âò8'ËuZ<54õ†M=’ÌØ¥˜´4ˆ³e½û î{\ZàCu´:þѱ›jU¿<ù£‡3AZúwëÅìs\Eθ¿’æ“$,¹'†QN":'¶+%Ñ–æË£cÃ[€¦´qü™Ê:¸l –Í3Üéì¸êbž™òÕÉ3Z"kœöÉ•‡V?Ú¼‹¯>í‹z¶­¡¶tªH-*'žIŸ À¾XZ"Á­¥’µ§šu¸«^‚ÊÉj „Ç ˆcÏVºlÔz»ÖcyÀÝM¼6àp¶þ!r¯%¨+k›Y3G1lu®Ž7È ö5á¯pÂÝnÜÖŽ f)²ö¦²I‚ÛùƒHùsÑFá,±ÆÑ#Ýk]úÐë£2íz=c,¥` žÍcd•φ˜2 ¸:VT2™áä°anvFÜàK/qkOzn#É .#{iÁÌtm}cœØp=²5±‚û£n&0ámÍ8¸¤~JÙ²6çSFnÏa:MŦYD¯ â¼;8Ö¸­¤ $ ã£ÊùŸI]I4U±ÔèÒ6–)jb,cÁÎ5ƒ pÊÍo ׋Œ Õ~NZv…Lö4•U¨m¯e¾½ñ½Œ §x0÷±áh8\áß—õºøïÓPXÐÙ°:*`s±½òTç÷\î{œ\ãpòMÀÄ\,É -UA£‡CSéëæ²' `¿õM"îõ˜Gzß4]sUVG–4T‚fh3Yõ˜„}öq’B‹¯âºByo¿UÌ£ª¬£ ¥šŽfDM¡I¸£Ä]çcÑ®àHwÇU÷\H#¾[žkb Uø´¸"tQ¸V805Þ,Âo¸qÙoš.‚«%¨*ìñC+ÚqRjðÅZèŽt¼È]‰¯ÃqpÜ ×q ƒžßš[¬û>)_ ´*Å;åcˆsù^Ásbs/ãÄ à,Ÿtö½›¦ZU.¬š–:›AŽ @Ø$l÷5‘Æt>èEæA†àþ2[~îÔ±ßhÒ±Œš8j!‘³Sͧ6ö›Æ«Á-"ö¸ kœ/®XòBËŽy¥4âQ3¥{¡ž±ÒÂ!vp¶7¼±¥ØÞ js‡ ћˌ£ž† û:›= ­¢|¨ŠPÓ{©ë?d‘q§A¼w×-³_]nXÆ ˜ëR¢˜È*]œ•ÑCP×5цáÃŽ2G~|›â²vBØò „ÐËPenº¢Ò–Wà’;¯t„†iEÃοŽâº›’Ô µ#´ZÇ ã‘Ó1¢µÙ¦Èæ¹®p‹âëÎÉq3%h¸^ç9­3öœâËøÝr³–Á§šØ‚Õ~-.nŽ w„ °›îcö[æ‹–]Žû:•ì|ÑÍQ4®š¢lmÉo>RC@¹­’Ö‹ÍÊ l ¶Ì–… Õ”¹ÊšxñŠG š×T27ÝŒ'ëi¿UÀêUÑeME ŒgÃSi‰­RPI4d’†Æ\ó+#ˆ¹¥¯dÌÕýão^õ°«³#­…±T67±²G(à;æ<=§Qò9 ÿÙrÕdÝcæ|±†É+š÷>£ƒÚ CÚæ8» Â\.%·4’1î˘-)jgÖgji©b†ŠFL%ÇV^ì"7H[ àæñxh¿m~\:†Ë§®}—6¨ß5e;™8–5Äb šì/-2æÉßa¼9!e–)Ã…ÎÇXæH0—àððàâe–÷‰ØÝˆ›ÊñU‘VM](¦’6#ŠA {â34’HµàÉysÏ~N·¸ñ¸ß~M^ZIm%£;7•âªW[_™Í’a.v©_xºæ—^ÑcfÛóUØuv…E•Y´¸ñS²1M…¡ßª1Žu÷áÖÖ÷À`^{’ÔÉS$ÌtÏžûÝ5kžc½Áߪ.yÍwÁ§¼ÃqcOì‹§¦°ié(f¤‡Y6,䆱Ε䋱K±—\ûÀ. ÅQÚ–•¹fÃOšè¤Ž§J†*Ç;7Ôâ÷_senqÀÄCxõx¹kòÖ®IKCLÆÌùàuàË™©ˆÕC¯{áç6VÜèó‚âH>-TY-AaѱÂXe2‰ô×^MׇÉÚp°¸C¹¢è‘VK$sÄ7Æbc]^òÈZ\×]KîŠç1„` Ã…·]pTsœ¢–(*ÌôLlÔ¶…- ØÉ‹š]0‚÷Z54Ïɯ’ýQÙ9GUkC;â³ál±É4Ž©-©†7¾âé£{›peî ½Á×$‹‰ï“$lég†g¶Rèîád|e¥‘¸î‘Ã{ç‚Ny7$9-A .¥Ç,R¹õ®šBcx|cÞ]…®†ßuäêÖo‚+NÓª§®¥  ¤†¢®xä˜ ‰Ì1†FXß<â¾F\0ÝuúÅÀz,²–¼ Ø¬Ö $ÏKyÕOŠ¡¹ŸªÁ†àg`=ÿqêIhX4öžlÔbkã¿´õŽ‚@ ×·nk°›"û‰h7j º"è©m:šÂC›$ñË 3j „2(ã`ÍæÜAŒ8ÛÁÃw‚ *l½©¬¤Ò`°æÁ>`Ò>\ôQ¸K,q´H÷B×~´:èÌ€†»^ N–É´e¯qTÓ² ª9ó²9LŒÄXÉ´‘†Fñ´k¼kóæ<²â7¶œÇF×Ö9͇Û#[/º6âcÜÓ ‹€ Æ 2:iªe…±µõR f9àq81¬¿YÕÞ±£W"H¥ÑßçGµnôÑßçGµnô"—GÕ»ÓGÕ»ÐDŠ]þt{VïMþt{VïA)twùÑí[½4wùÑí[½H¥ÑßçGµnôÑßçGµnô"—GÕ»ÓGÕ»ÐDŠ]þt{VïMþt{VïA)twùÑí[½4wùÑí[½H¥ÑßçGµnôÑßçGµnô"—GÕ»ÓGÕ»ÐDŠ]þt{VïMþt{VïA)twùÑí[½4wùÑí[½H¥ÑßçGµnôÑßçGµnô"—GÕ»ÓGÕ»ÐDŠ]þt{VïMþt{VïA)twùÑí[½4wùÑí[½H¥ÑßçGµnôÑßçGµnô"—GÕ»ÓGÕ»ÐDŠ]þt{VïMþt{VïA)twùÑí[½4wùÑí[½H¥ÑßçGµnôÑßçGµnô"—GÕ»ÓGÕ»ÐDŠ]þt{VïMþt{VïA)twùÑí[½4wùÑí[½H¥ÑßçGµnôÑßçGµnô"—GÕ»ÓGÕ»ÐDŠ]þt{VïMþt{VïA)twùÑí[½4wùÑí[½H¥ÑßçGµnôÑßçGµnô"—GÕ»ÓGÕ»ÐDŠ]þt{VïMþt{VïA)twùÑí[½4wùÑí[½H¥ÑßçGµnôÑßçGµnô"—GÕ»ÓGÕ»ÐDª2¿æ=­õ[ýÕæŽÿ:=«wª\²a"-Pç2òÖðyy?ŠGèü9ÖsÞ^úʇ9ÆòL®$Ÿæ¾iõ.}¡D[CO¬ésí iõ.}¡D@Óë:\ûBš}gKŸhQ4úΗ>ЦŸYÒçÚD >³¥Ï´)§Öt¹ö…O¬ésí iõ.}¡D@Óë:\ûBš}gKŸhQ4úΗ>ЦŸYÒçÚD >³¥Ï´)§Öt¹ö…O¬ésí iõ.}¡D@Óë:\ûBš}gKŸhQ4úΗ>ЦŸYÒçÚD >³¥Ï´)§Öt¹ö…O¬ésí iõ.}¡D@Óë:\ûBš}gKŸhQ4úΗ>ЦŸYÒçÚD >³¥Ï´)§Öt¹ö…O¬ésí iõ.}¡D@Óë:\ûBš}gKŸhQ4úΗ>ЦŸYÒçÚD >³¥Ï´)§Öt¹ö…O¬ésí iõ.}¡D@Óë:\ûBš}gKŸhQ4úΗ>ЦŸYÒçÚD >³¥Ï´)§Öt¹ö…O¬ésí iõ.}¡D@Óë:\ûBš}gKŸhQ4úΗ>ЦŸYÒçÚD >³¥Ï´)§Öt¹ö…O¬ésí iõ.}¡D@Óë:\ûBš}gKŸhQ4úΗ>ЦŸYÒçÚD >³¥Ï´)§Öt¹ö…O¬ésí iõ.}¡D@Óë:\ûBš}gKŸhQ4úΗ>ЦŸYÒçÚD >³¥Ï´)§Öt¹ö…O¬ésí iõ.}¡D@Óë:\ûBš}gKŸhQ4úΗ>ЦŸYÒçÚD >³¥Ï´)§Öt¹ö…O¬ésí iõ.}¡D@Óë:\ûBš}gKŸhQ4úΗ>ЦŸYÒçÚD >³¥Ï´)§Öt¹ö…O¬ésí iõ.}¡D@Óë:\ûBš}gKŸhQ4úΗ>ЦŸYÒçÚD >³¥Ï´)§Öt¹ö…O¬ésí øêÚ§´µÕ3‘qCqˆ?ÿÙPythonCard-0.8.2/tools/standaloneBuilder/doc/standaloneBuilder.html0000755000076500007650000003303210240730044025401 0ustar alexalex00000000000000 PythonCard standaloneBuilder tool

Introduction

The process of converting a PythonCard project into a stand-alone application, complete with installer and un-install entry, is fairly tedious to do 'by hand'. Whilst writing some documentation (see here) to cover this, it became clear that there was a need for some application software (written using PythonCard, naturally!) to help automate the process. The standaloneBuilder tool is the result. The program offers the user the ability to manage the development and release of successive versions of an application project written using PythonCard.

Comments on this document and/or bug reports related to the standaloneBuilder tool may be posted to the PythonCard users mailing list, http://lists.sourceforge.net/lists/listinfo/pythoncard-users, for discussion.

Pre-Requisites

As well as Python, wxPython and PythonCard, you will need to have installed and configured McMillan Installer and Inno Setup on your computer. These packages can be downloaded from the following locations as of the time of writing:

Both packages come with comprehensive documentation - installation and setup should be painless.

Configuring standaloneBuilder

When launching standaloneBuilder for the first time, it detects that the preferences need to be configured and drops you straight into the preferences dialog.

You can come back to this dialog at any time by clicking the preferences button on the main screen. All of the options have help buttons (marked with '?') associated with them, so you can (hopefully) figure out what each one is for without too much difficulty. The program will try to find as much information as it can, you should only need to tell it your name and where to find the directory you keep all your projects in.

After filling in any missing information, click the OK button to save your preferences for use In future projects.

Creating a new project

For the purposes of this document, we'll use the standaloneBuilder tool in conjunction with the application created in walkthrough #2, to illustrate the steps involved in the creation, development and distribution of a typical PythonCard program. We'll assume that you have already followed the walkthrough and you have the counter.py application fully functional.

To begin, click on the 'New' button to start the new project wizard and fill in the details as required:






After completing the new project wizard, the program will create the project and add in some default folders and template files. A 'save' dialog will then be presented to allow the project details to be written to disk. The main window will now appear as shown below:

Adding files to the project

The first step will be to define the main script file for the project. In this case, there is only one script, namely counter.py, so click the '...' button next to the main script file text field. Navigate to the sab-demo folder and select the 'counter.py' script. Click the Open button to add it to the project:


A note is probably in order at this point about the Script files box. Generally, McMillan Installer is quite good at working out if there are any additional source files associated with the main script, simply by examining any import lines in the source code. This may appear to make the Script files box largely superfluous. If you intend to only ever build projects for Windows platforms, then you may well find that you never need to explicitly list any additional script files. If, however, you also want to distribute your project to Linux users, then things are slightly different. When running standaloneBuilder on Linux, the rebuild button simply builds a compressed tar file containing the items you have specified as making up your project. In this scenario, only those files that you have explicitly listed will be included in the tar file. Also, by including your script files explicitly, the usefulness of standaloneBuilder as a general purpose project manager comes into play. You can edit a given script file by simply selecting it in the list and clicking the Edit... button.

Now, under the Resource files section of the main window, click the Add button. Select the counter.rsrc.py file and click on Open. This adds the resource file into the project:

Having added the resource file, you can now open it in the resource editor simply by clicking on the Edit button on the main window. Files which are added in other sections of the main window can be edited in the same way. Script files will be opened using the program defined as the text editor in preferences. This defaults to the PythonCard code editor, but can be changed if required. Files listed under the Pixmaps section will be opened using whatever you specify as your default image editor in preferences,

Project properties

That pretty much covers the mechanics of adding and editing the files which make up your project. The project properties dialog provides a number of options which affect how the final standalone version of your program is built. To access this, click the Properties button on the main window:

The first few fields determine the folder layout within your project. All the paths used within standaloneBuilder are relative. For example, the default build directory is simply called 'build' - in practice, this folder would be created in whatever you specified as the base folder when the project was initially created, this would in turn be created as a sub folder of your top level 'projects' folder defined in the preferences. Thus, in this example:

  • Projects folder in preferences is P:\
  • The project was created in a folder called sab-demo
  • The build directory is called simply build

The full path to the build directory is therefore P:\sab-demo\build. Having all of the folder references relative to each other allows standaloneBuilder to maintain projects on both Windows and Linux platforms, with Python itself taking care of the differences in path separators.

The application publisher, application URL and application licence fields are used by Inno Setup when the final version of the program is built

The other options from Deployment type onwards correspond to the same options in the McMillan Installer. Note that new projects are always created with the Console option turned on - this is intended to aid with debugging. The build process generates a warning message to remind you to turn this off before making a release of your finished application.

Changelog & README buttons

Clicking the Changelog button launches the text editor defined in preferences and opens the project changelog file for further editing:

Additional entries can be made directly using this option. Alternatively, there is an 'add changelog entry' option on the 'tools' menu. This pops up a small text entry dialog like so:

The entry then gets added to the changelog. Entries are made so that the most recently added is at the top:

The README button does a similar thing, but instead uses the text editor to open a file called readme.txt in the project base folder

The Run Button

When clicked, the Run... button executes the main script of your project. It firstly pops up a small dialog wherein you can specify a number of useful command line options:

There must be a reason why this looks suspiciously like the run-time options dialog from the PythonCard resource editor, but I'm sure I couldn't even begin to guess what that reason might be... :-)

The Rebuild button

Clicking this button causes the standalone version of your application to be rebuilt. As sab-demo is a new project, it has been created with the console option switched on. The first thing standaloneBuilder does is to remind you about this:

The build then proceeds. If all is successful, the program will tell you where it has stored the installer for the project:

A scrolling text window is also displayed where you can see the output from the build process:

When the build has completed, the self extracting installer executable can be copied to another Windows machine ad run. The resulting setup wizard looks the same as virtually any other piece of 'professionally' produced software:

The executable itself looks and behaves exactly the same as any other program. This is the result of right-clicking the sab-demo.exe file and selecting 'Properties':

The Release button

When you are happy that you have thoroughly debugged your project and are ready to release it to the outside world, you should open the project in standaloneBuilder and click the Release button. Doing this puts the current release of the project into a frozen state, in which no further changes can be made until you have checked and confirmed that the release is okay.

The first thing that happens upon clicking the Release button is that a warning dialog pops up to give you the option of changing your mind:

Assuming that you click OK at this point, a number of things then happen to the project. Firstly, the status gets changed from Open to Frozen and the majority of the controls on the main window get disabled:

Secondly, the 'release date TBA' tag at the top of the project changelog gets replaced by the current date. At this point, only the Rebuild and buttons will work. You should carry out a final rebuild of your project under both Windows and Linux, if applicable. Under Linux, the Rebuild process simply produces a TAR archive of the files which make up your project, as opposed to a standalone binary executable.

When you are happy that everything has been rebuilt as you need it, you are ready to close off the current release and start the next version of your project. To do this, just click the Release button again. You will be presented with this dialog:

Click OK to confirm the release. You then have an opportunity to decide what the next version number of your project will be, with the option to override what the program offers as a deafult. In the example shown below I have decided that the next release of the sab-demo project should have a version number of 0.9.1:

The main window is then refreshed. The build number has been reset to 1 and a new changelog entry has been added to indicate the start of the release cycle for the new version number:


$Revision: 1.4 $ : $Author: l2kphil $ : Last updated $Date: 2005/05/12 19:36:04 $

PythonCard-0.8.2/tools/standaloneBuilder/helpAbout.rsrc.py0000755000076500007650000000151710227755536023601 0ustar alexalex00000000000000{'type':'CustomDialog', 'name':'dlgAbout', 'title':'About standaloneBuilder:', 'position':(129, 133), 'size':(680, 370), 'components': [ {'type':'Button', 'name':'AboutBtn', 'position':(10, 5), 'size':(-1, 32), 'label':'About', }, {'type':'Button', 'name':'AuthorBtn', 'position':(90, 5), 'size':(-1, 32), 'label':'Author', }, {'type':'Button', 'name':'LicenseBtn', 'position':(170, 5), 'size':(-1, 32), 'label':'License', }, {'type':'HtmlWindow', 'name':'HtmlWindow', 'position':(5, 40), 'size':(668, 255), 'backgroundColor':(255, 255, 255), }, {'type':'Button', 'id':5100, 'name':'btnOK', 'position':(590, 305), 'size':(-1, 32), 'label':'Close', }, ] # end components } # end CustomDialog PythonCard-0.8.2/tools/standaloneBuilder/newProjectWizard.gtk.rsrc.py0000755000076500007650000000343510431133454025726 0ustar alexalex00000000000000{'type':'CustomDialog', 'name':'Template', 'title':'New Project Wizard', 'position':(171, 401), 'size':(600, 310), 'components': [ {'type':'Image', 'name':'Image1', 'position':(-5, -5), 'size':(174, 324), 'actionBindings':{}, 'file':'pixmaps/newproject.png', }, {'type':'Button', 'name':'backBtn', 'position':(330, 270), 'actionBindings':{}, 'enabled':False, 'label':'< Back', }, {'type':'Button', 'name':'nextBtn', 'position':(415, 270), 'actionBindings':{}, 'label':'Next >', }, {'type':'Button', 'id':5101, 'name':'cancelBtn', 'position':(510, 270), 'actionBindings':{}, 'label':'Cancel', }, {'type':'StaticText', 'name':'page0text1', 'position':(175, 0), 'actionBindings':{}, 'font':{'faceName': 'Tahoma', 'family': 'sansSerif', 'size': 20}, 'text':'Welcome to the new project', 'userdata':'page0', }, {'type':'StaticText', 'name':'page0text2', 'position':(175, 30), 'actionBindings':{}, 'font':{'faceName': 'Tahoma', 'family': 'sansSerif', 'size': 20}, 'text':'wizard!', 'userdata':'page0', }, {'type':'StaticText', 'name':'page0text3', 'position':(175, 85), 'actionBindings':{}, 'font':{'faceName': 'Tahoma', 'family': 'sansSerif', 'size': 10}, 'text':'This will gather the information required to create a brand new project.', 'userdata':'page0', }, {'type':'StaticText', 'name':'page0text4', 'position':(175, 100), 'actionBindings':{}, 'font':{'faceName': 'Tahoma', 'family': 'sansSerif', 'size': 10}, 'text':'Click Next to continue, or Cancel to exit the wizard.', 'userdata':'page0', }, ] # end components } # end CustomDialog PythonCard-0.8.2/tools/standaloneBuilder/newProjectWizard.rsrc.py0000755000076500007650000000311510227755536025153 0ustar alexalex00000000000000{'type':'CustomDialog', 'name':'Template', 'title':'New Project Wizard', 'position':(171, 401), 'size':(600, 330), 'components': [ {'type':'Image', 'name':'Image1', 'position':(-5, -5), 'size':(174, 324), 'file':'pixmaps/newproject.png', }, {'type':'Button', 'name':'backBtn', 'position':(330, 275), 'enabled':False, 'label':'< Back', }, {'type':'Button', 'name':'nextBtn', 'position':(415, 275), 'label':'Next >', }, {'type':'Button', 'id':5101, 'name':'cancelBtn', 'position':(510, 275), 'label':'Cancel', }, {'type':'StaticText', 'name':'page0text1', 'position':(175, 0), 'font':{'faceName': 'Tahoma', 'family': 'sansSerif', 'size': 20}, 'text':'Welcome to the new project', 'userdata':'page0', }, {'type':'StaticText', 'name':'page0text2', 'position':(175, 30), 'font':{'faceName': 'Tahoma', 'family': 'sansSerif', 'size': 20}, 'text':'wizard!', 'userdata':'page0', }, {'type':'StaticText', 'name':'page0text3', 'position':(175, 85), 'font':{'faceName': 'Tahoma', 'family': 'sansSerif', 'size': 10}, 'text':'This will gather the information required to create a brand new project.', 'userdata':'page0', }, {'type':'StaticText', 'name':'page0text4', 'position':(175, 100), 'font':{'faceName': 'Tahoma', 'family': 'sansSerif', 'size': 10}, 'text':'Click Next to continue, or Cancel to exit the wizard.', 'userdata':'page0', }, ] # end components } # end CustomDialog PythonCard-0.8.2/tools/standaloneBuilder/newProjectWizardPage1.gtk.rsrc.py0000755000076500007650000000162210431133454026600 0ustar alexalex00000000000000{'type':'CustomDialog', 'name':'Template', 'title':'New Project Wizard', 'position':(171, 401), 'size':(600, 310), 'components': [ {'type':'StaticText', 'name':'page1text1', 'position':(175, 0), 'actionBindings':{}, 'font':{'faceName': 'Tahoma', 'family': 'sansSerif', 'size': 20}, 'text':'New project wizard', 'userdata':'page1', }, {'type':'StaticText', 'name':'page1text2', 'position':(175, 60), 'actionBindings':{}, 'text':'Project name', 'userdata':'page1', }, {'type':'TextField', 'name':'projectName', 'position':(175, 80), 'size':(415, -1), 'actionBindings':{}, 'userdata':'page1', }, {'type':'Image', 'name':'Image1', 'position':(-5, -5), 'size':(174, 324), 'actionBindings':{}, 'file':'pixmaps/newproject.png', }, ] # end components } # end CustomDialog PythonCard-0.8.2/tools/standaloneBuilder/newProjectWizardPage1.rsrc.py0000755000076500007650000000145210227755536026033 0ustar alexalex00000000000000{'type':'CustomDialog', 'name':'Template', 'title':'New Project Wizard', 'position':(171, 401), 'size':(600, 330), 'components': [ {'type':'StaticText', 'name':'page1text1', 'position':(175, 0), 'font':{'faceName': 'Tahoma', 'family': 'sansSerif', 'size': 20}, 'text':'New project wizard', 'userdata':'page1', }, {'type':'StaticText', 'name':'page1text2', 'position':(175, 60), 'text':'Project name', 'userdata':'page1', }, {'type':'TextField', 'name':'projectName', 'position':(250, 55), 'size':(340, -1), 'userdata':'page1', }, {'type':'Image', 'name':'Image1', 'position':(-5, -5), 'size':(174, 324), 'file':'pixmaps/newproject.png', }, ] # end components } # end CustomDialog PythonCard-0.8.2/tools/standaloneBuilder/newProjectWizardPage2.gtk.rsrc.py0000755000076500007650000000163110431133454026601 0ustar alexalex00000000000000{'type':'CustomDialog', 'name':'Template', 'title':'New Project Wizard', 'position':(171, 401), 'size':(600, 310), 'components': [ {'type':'StaticText', 'name':'page2text1', 'position':(175, 0), 'actionBindings':{}, 'font':{'faceName': 'Tahoma', 'family': 'sansSerif', 'size': 20}, 'text':'New project wizard', 'userdata':'page2', }, {'type':'StaticText', 'name':'page2text2', 'position':(175, 60), 'actionBindings':{}, 'text':'Project description', 'userdata':'page2', }, {'type':'TextField', 'name':'projectDesc', 'position':(175, 80), 'size':(415, -1), 'actionBindings':{}, 'userdata':'page2', }, {'type':'Image', 'name':'Image1', 'position':(-5, -5), 'size':(174, 324), 'actionBindings':{}, 'file':'pixmaps/newproject.png', }, ] # end components } # end CustomDialog PythonCard-0.8.2/tools/standaloneBuilder/newProjectWizardPage2.rsrc.py0000755000076500007650000000146110227755536026034 0ustar alexalex00000000000000{'type':'CustomDialog', 'name':'Template', 'title':'New Project Wizard', 'position':(171, 401), 'size':(600, 330), 'components': [ {'type':'StaticText', 'name':'page2text1', 'position':(175, 0), 'font':{'faceName': 'Tahoma', 'family': 'sansSerif', 'size': 20}, 'text':'New project wizard', 'userdata':'page2', }, {'type':'StaticText', 'name':'page2text2', 'position':(175, 60), 'text':'Project description', 'userdata':'page2', }, {'type':'TextField', 'name':'projectDesc', 'position':(275, 55), 'size':(315, -1), 'userdata':'page2', }, {'type':'Image', 'name':'Image1', 'position':(-5, -5), 'size':(174, 324), 'file':'pixmaps/newproject.png', }, ] # end components } # end CustomDialog PythonCard-0.8.2/tools/standaloneBuilder/newProjectWizardPage3.gtk.rsrc.py0000755000076500007650000000207510431133454026605 0ustar alexalex00000000000000{'type':'CustomDialog', 'name':'Template', 'title':'New Project Wizard', 'position':(171, 401), 'size':(600, 310), 'components': [ {'type':'StaticText', 'name':'page3text1', 'position':(175, 0), 'actionBindings':{}, 'font':{'faceName': 'Tahoma', 'family': 'sansSerif', 'size': 20}, 'text':'New project wizard', 'userdata':'page3', }, {'type':'StaticText', 'name':'page3text2', 'position':(175, 60), 'actionBindings':{}, 'text':'Base directory', 'userdata':'page3', }, {'type':'TextField', 'name':'baseDir', 'position':(175, 80), 'size':(385, -1), 'actionBindings':{}, 'userdata':'page3', }, {'type':'Button', 'name':'baseDirBtn', 'position':(565, 80), 'size':(25, 25), 'actionBindings':{}, 'label':'...', 'userdata':'page3', }, {'type':'Image', 'name':'Image1', 'position':(-5, -5), 'size':(174, 324), 'actionBindings':{}, 'file':'pixmaps/newproject.png', }, ] # end components } # end CustomDialog PythonCard-0.8.2/tools/standaloneBuilder/newProjectWizardPage3.rsrc.py0000755000076500007650000000167310227755536026042 0ustar alexalex00000000000000{'type':'CustomDialog', 'name':'Template', 'title':'New Project Wizard', 'position':(171, 401), 'size':(600, 330), 'components': [ {'type':'StaticText', 'name':'page3text1', 'position':(175, 0), 'font':{'faceName': 'Tahoma', 'family': 'sansSerif', 'size': 20}, 'text':'New project wizard', 'userdata':'page3', }, {'type':'StaticText', 'name':'page3text2', 'position':(175, 60), 'text':'Base directory', 'userdata':'page3', }, {'type':'TextField', 'name':'baseDir', 'position':(255, 55), 'size':(300, -1), 'userdata':'page3', }, {'type':'Button', 'name':'baseDirBtn', 'position':(560, 55), 'size':(25, 25), 'label':'...', 'userdata':'page3', }, {'type':'Image', 'name':'Image1', 'position':(-5, -5), 'size':(174, 324), 'file':'pixmaps/newproject.png', }, ] # end components } # end CustomDialog PythonCard-0.8.2/tools/standaloneBuilder/newProjectWizardPage4.gtk.rsrc.py0000755000076500007650000000403210431133454026601 0ustar alexalex00000000000000{'type':'CustomDialog', 'name':'Template', 'title':'New Project Wizard', 'position':(175, 82), 'size':(600, 310), 'components': [ {'type':'Image', 'name':'Image1', 'position':(-5, -5), 'size':(174, 324), 'actionBindings':{}, 'file':'pixmaps/newproject.png', }, {'type':'Button', 'name':'backBtn', 'position':(330, 270), 'actionBindings':{}, 'enabled':False, 'label':'< Back', }, {'type':'Button', 'name':'nextBtn', 'position':(415, 270), 'actionBindings':{}, 'label':'Next >', }, {'type':'Button', 'id':5101, 'name':'cancelBtn', 'position':(510, 270), 'actionBindings':{}, 'label':'Cancel', }, {'type':'StaticText', 'name':'page4text1', 'position':(175, 0), 'actionBindings':{}, 'font':{'faceName': 'Tahoma', 'family': 'sansSerif', 'size': 20}, 'text':'Ready to create new project', 'userdata':'page4', }, {'type':'StaticText', 'name':'page4text3', 'position':(175, 85), 'actionBindings':{}, 'font':{'faceName': u'Tahoma', 'size': 10}, 'text':'We now have the information required to create a brand new project.', 'userdata':'page4', }, {'type':'StaticText', 'name':'page4text4', 'position':(175, 100), 'actionBindings':{}, 'font':{'faceName': u'Tahoma', 'size': 10}, 'text':'Click Create to continue, or Cancel to exit the wizard.', 'userdata':'page4', }, {'type':'StaticText', 'name':'page4text5', 'position':(175, 125), 'actionBindings':{}, 'font':{'faceName': u'Tahoma', 'size': 10}, 'text':'After the project has been created, you should open the project', 'userdata':'page4', }, {'type':'StaticText', 'name':'page4text6', 'position':(175, 140), 'actionBindings':{}, 'font':{'faceName': u'Tahoma', 'size': 10}, 'text':'properties page and ensure that the settings are to your liking.', 'userdata':'page4', }, ] # end components } # end CustomDialog PythonCard-0.8.2/tools/standaloneBuilder/newProjectWizardPage4.rsrc.py0000755000076500007650000000346010227755536026037 0ustar alexalex00000000000000{'type':'CustomDialog', 'name':'Template', 'title':'New Project Wizard', 'position':(175, 82), 'size':(600, 330), 'components': [ {'type':'Image', 'name':'Image1', 'position':(-5, -5), 'size':(174, 324), 'file':'pixmaps/newproject.png', }, {'type':'Button', 'name':'backBtn', 'position':(340, 275), 'enabled':False, 'label':'< Back', }, {'type':'Button', 'name':'nextBtn', 'position':(415, 275), 'label':'Next >', }, {'type':'Button', 'id':5101, 'name':'cancelBtn', 'position':(510, 275), 'label':'Cancel', }, {'type':'StaticText', 'name':'page4text1', 'position':(175, 0), 'font':{'faceName': 'Tahoma', 'family': 'sansSerif', 'size': 20}, 'text':'Ready to create new project', 'userdata':'page4', }, {'type':'StaticText', 'name':'page4text3', 'position':(175, 85), 'font':{'faceName': u'Tahoma', 'size': 10}, 'text':'We now have the information required to create a brand new project.', 'userdata':'page4', }, {'type':'StaticText', 'name':'page4text4', 'position':(175, 100), 'font':{'faceName': u'Tahoma', 'size': 10}, 'text':'Click Create to continue, or Cancel to exit the wizard.', 'userdata':'page4', }, {'type':'StaticText', 'name':'page4text5', 'position':(175, 125), 'font':{'faceName': u'Tahoma', 'size': 10}, 'text':'After the project has been created, you should open the project', 'userdata':'page4', }, {'type':'StaticText', 'name':'page4text6', 'position':(175, 140), 'font':{'faceName': u'Tahoma', 'size': 10}, 'text':'properties page and ensure that the settings are to your liking.', 'userdata':'page4', }, ] # end components } # end CustomDialog PythonCard-0.8.2/tools/standaloneBuilder/outputWindow.gtk.rsrc.py0000755000076500007650000000600210431133454025146 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'Template', 'backgrounds': [ {'type':'Background', 'name':'outputWindow', 'title':'Rebuild project', 'size':(400, 300), 'visible':0, 'components': [ {'type':'TextArea', 'name':'importError', 'position':(10, 10), 'size':(375, 205), 'actionBindings':{}, 'editable':False, 'enabled':False, 'visible':False, }, {'type':'Button', 'name':'clipBoardBtn', 'position':(95, 225), 'actionBindings':{}, 'label':'Clipboard', 'toolTip':'Click here to copy the PythonCard component imports line to the Windows clipboard', }, {'type':'Button', 'name':'closeBtn', 'position':(10, 225), 'actionBindings':{}, 'label':'Close', }, {'type':'StaticText', 'name':'txt5', 'position':(10, 90), 'actionBindings':{}, 'text':'Returned messages:', }, {'type':'TextArea', 'name':'returnedText', 'position':(10, 105), 'size':(375, 110), 'actionBindings':{}, }, {'type':'StaticText', 'name':'txt4c', 'position':(145, 70), 'actionBindings':{}, 'text':'please wait...', 'visible':False, }, {'type':'StaticText', 'name':'txt4b', 'position':(145, 70), 'actionBindings':{}, 'font':{'style': 'bold', 'faceName': 'Verdana', 'family': 'sansSerif', 'size': 8}, 'text':'Done', 'visible':False, }, {'type':'StaticText', 'name':'txt4a', 'position':(10, 70), 'actionBindings':{}, 'text':'Rebuilding distributable:', 'visible':False, }, {'type':'StaticText', 'name':'txt3c', 'position':(145, 50), 'actionBindings':{}, 'text':'please wait...', 'visible':False, }, {'type':'StaticText', 'name':'txt3b', 'position':(145, 50), 'actionBindings':{}, 'font':{'style': 'bold', 'faceName': 'Verdana', 'family': 'sansSerif', 'size': 8}, 'text':'Done', 'visible':False, }, {'type':'StaticText', 'name':'txt3a', 'position':(10, 50), 'actionBindings':{}, 'text':'Rebuilding application:', 'visible':False, }, {'type':'StaticText', 'name':'txt2b', 'position':(145, 30), 'actionBindings':{}, 'font':{'style': 'bold', 'faceName': 'Verdana', 'family': 'sansSerif', 'size': 8}, 'text':'Done', 'visible':False, }, {'type':'StaticText', 'name':'txt2a', 'position':(10, 30), 'actionBindings':{}, 'text':'Rebuilding versioninfo file:', 'visible':False, }, {'type':'StaticText', 'name':'txt1b', 'position':(145, 10), 'actionBindings':{}, 'font':{'style': 'bold', 'faceName': 'Verdana', 'family': 'sansSerif', 'size': 8}, 'text':'Done', 'visible':False, }, {'type':'StaticText', 'name':'txt1a', 'position':(10, 10), 'actionBindings':{}, 'text':'Rebuilding spec file:', 'visible':False, }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/tools/standaloneBuilder/outputWindow.py0000755000076500007650000000400710431133454023415 0ustar alexalex00000000000000#!/usr/bin/python # # projectmanager message output window # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # Copyright (C)2003 Phil Edwards, phil@linux2000.com # vim: ts=4 sw=4 ai et import string import time import sys from PythonCard import model, dialog import wx class outputWindow(model.Background): def on_initialize(self, event): self.parent = self.GetParent() def clearLines(self): self.components.returnedText.text = '' self.components.importError.text = '' self.Refresh() wx.Yield() def addLine(self, text): if self.components.returnedText.enabled: self.components.returnedText.text += str(text) else: self.components.importError.text += str(text) #self.Refresh() #self.Update() #wx.Yield() def on_closeBtn_mouseClick(self, event): self.Hide() def on_close(self, event): self.Hide() def on_clipBoardBtn_mouseClick(self, event): if sys.platform.startswith('win'): stuff = wx.TextDataObject() stuff.SetText(self.components.clipBoardBtn.userdata) if wx.TheClipboard.Open(): wx.TheClipboard.SetData(stuff) wx.TheClipboard.Close() if __name__ == '__main__': app = model.PythonCardApp(outputWindow) app.MainLoop() PythonCard-0.8.2/tools/standaloneBuilder/outputWindow.rsrc.py0000755000076500007650000000536610431133454024376 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'Template', 'backgrounds': [ {'type':'Background', 'name':'outputWindow', 'title':'Rebuild project', 'size':(400, 300), 'visible':0, 'components': [ {'type':'TextArea', 'name':'importError', 'position':(10, 10), 'size':(375, 205), 'enabled':False, 'visible':False, }, {'type':'Button', 'name':'clipBoardBtn', 'position':(90, 225), 'label':'Clipboard', 'toolTip':'Click here to copy the PythonCard component imports line to the Windows clipboard', 'visible':False, }, {'type':'Button', 'name':'closeBtn', 'position':(10, 225), 'label':'Close', }, {'type':'StaticText', 'name':'txt5', 'position':(10, 90), 'text':'Returned messages:', }, {'type':'TextArea', 'name':'returnedText', 'position':(10, 105), 'size':(375, 110), }, {'type':'StaticText', 'name':'txt4c', 'position':(145, 70), 'text':'please wait...', 'visible':False, }, {'type':'StaticText', 'name':'txt4b', 'position':(145, 70), 'font':{'style': 'bold', 'faceName': 'Verdana', 'family': 'sansSerif', 'size': 8}, 'text':'Done', 'visible':False, }, {'type':'StaticText', 'name':'txt4a', 'position':(10, 70), 'text':'Rebuilding distributable:', 'visible':False, }, {'type':'StaticText', 'name':'txt3c', 'position':(145, 50), 'text':'please wait...', 'visible':False, }, {'type':'StaticText', 'name':'txt3b', 'position':(145, 50), 'font':{'style': 'bold', 'faceName': 'Verdana', 'family': 'sansSerif', 'size': 8}, 'text':'Done', 'visible':False, }, {'type':'StaticText', 'name':'txt3a', 'position':(10, 50), 'text':'Rebuilding application:', 'visible':False, }, {'type':'StaticText', 'name':'txt2b', 'position':(145, 30), 'font':{'style': 'bold', 'faceName': 'Verdana', 'family': 'sansSerif', 'size': 8}, 'text':'Done', 'visible':False, }, {'type':'StaticText', 'name':'txt2a', 'position':(10, 30), 'text':'Rebuilding versioninfo file:', 'visible':False, }, {'type':'StaticText', 'name':'txt1b', 'position':(145, 10), 'font':{'style': 'bold', 'faceName': 'Verdana', 'family': 'sansSerif', 'size': 8}, 'text':'Done', 'visible':False, }, {'type':'StaticText', 'name':'txt1a', 'position':(10, 10), 'text':'Rebuilding spec file:', 'visible':False, }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/tools/standaloneBuilder/pixmaps/0000755000076500007650000000000010434046773022002 5ustar alexalex00000000000000PythonCard-0.8.2/tools/standaloneBuilder/pixmaps/blank.png0000755000076500007650000000017710223215533023573 0ustar alexalex00000000000000‰PNG  IHDRwSÞbKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÒ(0'LÎ IDATxœchhhKÓÒIEND®B`‚PythonCard-0.8.2/tools/standaloneBuilder/pixmaps/exit.png0000755000076500007650000000147510223215533023457 0ustar alexalex00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“òIDATxÚÅ–KOSAÇ÷Þ3so©"XÁê¦!1bܘ˜°%n$qgd£ W®\?€Æè7ð h> ¼bTJCÔh‚Ä5˜˜R° TJ/ŠJ¯‹bmm ˆ!N2¹Éœ{þ¿33çÌ lr3Ö°{ÿª/kýñæÍk¦§gH&gH$’LLN’š›ËÛ£Ñ&&&+úWlÒ¡Pˆ@ ÀÞ½!\w‘C‡2Äb1^¼x‰a@6›]5@³Âø ÞÖÊîÃMD£´ÎE×ÞÞÁ©S's"Z±0-³d–æzªeéÕSâm­47!NçÇ?‘ˆ…ZYš²Kôa2ͳá«S†?Ò ÒÒrŒë×;èíí£»»‹ÎÎ.D J –X%3õÖü] ?‘ §§ ¿ ÝÝ]y›rÚÑD~àÎÛÛÉdÜ"»R‚Ò Q½Ñ(sˆ:À¾ñ›@$2HMM ®›)=Ñ ÃË2±Ä*\ŽDJœÎˆ?~ü`p'®»Xv†ß¿ý@´€a J0­ß¹#§/-ɤ«²€>àùóQêëëËFþ«-//ç=ÃÀQ²öô­|p]·Äîº.©TŠ……´­°m+l[c­ìÞ–ŽÅbŒ½gpäó™ÚíTmñáøm”VÅKTö3ÜHÌLÌáyžç‘L&‰ÇgçFOß²Kø·U±§.„íè\( Ó4ÿîÊ{ÇÔÔƒÃƒÜ >ŸßÁ®²q|6¢k%â½u¥}W潡{tößÀÞªÙ®Åöiì Eõ_.ýÍ~µð€ìûí ”IEND®B`‚PythonCard-0.8.2/tools/standaloneBuilder/pixmaps/new.png0000755000076500007650000000131410230715372023273 0ustar alexalex00000000000000‰PNG  IHDRàw=ø“IDATxÚµ•ËNA†¿ª™fÄac4ÁȆøì ñ%pcÂ3°ö Ü›¸ðdÁ ¸Ó(è‚¥ QZ ‘Kb`˜¾Ô9.º«º™+D­N¥NúòÿuÎÿŸjøcmmÍ^å½§€^cvßív[———u}}ý 0 ˜Qº»»«ÝnW'8Ž5Ž{Ç==88Ð(ŠtggG#à04£+—$====ÑÍÍ7zxx¨ªª[[[º²²â€¶'¹ÄÔl6GÖOUÃ*"E çççLMM°ººÊÆÆ†m4/€&`ê“„QÕb ÆXT…‚‹z½N’¤t:þÏ 1—±t(°*}ù{iš±·÷•ûû|Øþˆ~Fßyùêu<¾ÕÇíØû{Æä+ªkQqÌḬ̀´ô¹ùÛqrü à&PZ"7Œ_Éï¡H’!"tfÛ¹~­IÜcöÖ4ÀÜ‚A`EQQŒ5¨h(Q­Vj\\tÉÒ„ ´J£X€¡ýÀ>6Îä÷TqΡ"(¤Iøþþ½»>4à œ À@Ì50ef"ˆišà2G­^ÇeÙ€ G— ±õÀ^ƒ¢²,×ÁZz£XþóÈ sYÑk‘UúÃ[9ËÒI®E~9qã œs¥-+€"kkHàœ+ŽÍ´tÞ$ œ«œ5þd®6 ·¯ ÞMÕgKT¤^ݽ)Üd(m*…‹üÔ)Q’$aG€p"Á¢Æ”ŽñÀ¨VtLgggAL¾{k-2„À@.n(Syv´iE ’×wD ´WþZœc"::ƒ÷ïÞÒºaòZ ¢ÅŽ‹þÏŸ™Po**lúäë×÷Ù5úãæsà0mú²™/fã/8Žã?ÁÙäsψ­½IEND®B`‚PythonCard-0.8.2/tools/standaloneBuilder/pixmaps/newproject.png0000644000076500007650000004222410223215533024660 0ustar alexalex00000000000000‰PNG  IHDR¤:¯p ôPLTE\=Bˆ666l‰xhVZ”–˜ª `87<†ww†&&&§§ª~‚¯CGˆ^`‰©—†“““di©GGGɸ¦R¹§•h rxFHg‡ˆ™ØÃ­ {„‡· sil•moœööö38|XWX#+…BH—]xwy„‡§Ë³› mqdX´´µ¦‘zBjm›KY\ƒY[zgfgc+2ˆÓ½¦46XG ')Qqtœ™›·,1x$)sadŒ$&K&¹£ŒfZO”˜ÃgfuÅÆÉÄ­•„ƒ„ ^ m$†ÇÉÞ¥§ÉSZ <k”„sÐÐâfi“aw{³²›…koª¨¨µØØÜ wVUd {MC;A<8W`c„uxžFEU b\a¤ %pU›‹z d75EKQ›(&8œœœ¸ºÕ¹ºÅѸž ilŽevy¡f5=“™†qTJC–l{~¢(-ups¤ MLPxl_%?Abž‰toq“y„„”•œ7:c]RHVž“‡Fueh‹4,%@>FqdšŽx{ž A‘» j_c™x|ªŸ « L:3,Á§Ž Rfjž Ç‘£^#&`Lir±Ê¾²©œop‡pt¯EHojk‚.0T]_~df ~¿ÁÙ°£—¾³¨ R Z“‡y}~txª_^e¹¬  ?–‰zqc3 8%+{ÓÊ¿ª­ÐQOP`%~ Y¯²Ó b¯°»k-6eg†ž} ^Y~~…eÙÑÈ *uw”poq)#.1fMtop30Q)/}-,B iOQsž—‡u X¿¯./L¯±Ì]——˜ˆˆˆQP`ÏÏÓ°Ÿ´¢‘ŽŽ”/..±¡OOWuááä ™ˆw[1/;n~n™™¡¢’D¾ bKGDˆH pHYs  d_‘tIMEÕ*äe·… IDATxœí \Ôeöÿ!”À!.*š9É‚*& š¤âš`Š H‚ä£rQPÌ•D4RSQ00'¼$xKM)Í xI[1ÝR6ú%»Fy·/à-eüÏ9Ïó|/3ß Ýýíþ_¯Ž:3 4óæs.Ïy.óÍÊêwûÝ~·ßíwûÝ~·ßíÿëaÕ£ ûO‚5…øß©Â C³£Û°ÿ"L#@´hñà¿DNÑ’éÖNÍùŸc´R2D;;Ïh; L«ÿ§JFÆ`76!!::ú¿EL¥ŽD˜@–”œŒwÄ© üI©fÄäää´´äÌ9pƒ BÍÿ¨”JWbÚœ9s<çx{zÂý©Ðÿ+ñçÿQÁˆžžžc=ÆŽ…{•)Ãz„q— ×÷°úWröàDæ!‰‘!Ž;vôXë¤Ñ£‰sNZ2P'0ª‹&Óõ_DÉgþˆÓ¶,$1"âèÑII£³‡Â q"e‚Q`*1ÿù0寢r“ôʪÚ#p(Xv&Ü'RÎI#—›Œ?ÿ9yÔ˜1+µ³€U:4338Ó6888“a¢Ë©ñ°4GúÛDlNs£uLÊš xÞÁEÞÞÞˆI”˜>©Ñu(œó››i¬B’³Á×ÀxÞEÖ„<”(ÓxŽÛImcU·¸$5Ýê(¹À84ÓÁÚÛÁÚÚºØÅ1­ƒ3™Ã¡`F«†s«¦ü·c4f :|íí’míâââŸí˜ÙèqF™ÀGÆi§ùïñ´™ „_;dÛºd»xe¥­ x<“;\¦L6"U¼\³ulA8ÊYC(¤ƒµ‹mQvv–mvvQ¶µ5P2)Ó¨ãˆÆiN‚lƽqs4lQƈ&WŽHˆB—ì¢"€´-¶;xKg˜ê™M¦Õq6ƒÒ‚faaüŸ2L†„$oƒÙ aQ–­?h©†LC—ÃßÑsX;'¥R µÔæ“§.*焉ê#\M2ÚÚÚy9—ùÙ"§‹5L*˜s’Ó†ŽÅ&.Y©nß[ލ´5(Oš4O d"_q±—WV–óš¬,/ÿâb%RR”’Á£ÓÈX¿)c6KKóˆû¬ ÃTQ6-¤Ä­LÙª5Æyš’“0é§d)½Ó¡[5xLÁD謳…§OŸ0`@·nš”͉G¥ŠÈ3G˜‹x¦Ä¤;ü%¸–„M¯aãË©™½ ‰éÖééÀÉ0» ¦ l–»Õ2&³¹þV×<³åú6GÂ?É “p†d¶L4Ù8a÷îÝÓKÜáÖ9OK”*)›Éh§8v¬­§dLNÖ$&p³‰aff+„Ó§Oï¾îˆÓÁAv9P>Å)›ÇÈ=&ùXQÄï%=©¯I!œuc™ÉšœÉ ­Ò9âôˆéÇcài»[£˜¤¥€<¢ ©%_«‹Ub/v' ž L»|m )ÉEÔœï¾0à´Cút†‘˜8}¦sDbDD£L7¢Ô‚4b “]&!ò‘")©,‰×àÑŠQMô²É,y<ÙÏ;€ IC?ý´1:¤wODÄÄÄDw÷ˆ™ºDwxD˜Ó»£ÇÉárî4Q|8#—E¼#*†:CÇèÑRc#QBX²GóNú ­[·$d÷î± ¢»{ll¬ûnÞgÄôÄéÝÓ9%IÙ$d˜´ JŒ‘b5Ö‰¡C…Iw2/D$&¾]ºÈÓÓ§»ë,vÇŽ²Ø1¡;Êvfbb¬ûtð8æ¸,%¤N“-ê‰X{Jb€ÿ†`V™¦D)<žœüî0ÈÝëÔ ëŠ 9ÑXZ»#&ƹlL‰³sLÌŽXwçô¸5&ˆJ’Ò¬Rk(3ʈ¼’„Š’’™É»/å»ï>…†”÷à-!™àkççgÎùåp¸qŽÙªCwG‡ÃÉ*º d+gËŒLFD”Æ3ïo©D L¾™ÆÀÂ$H¦¤gŒ57ètÝËÇ pïKqi,¥‘’f’FÖQ±C8ÞN‰r,ïcå&f'IÉÓ($2î(‹ j5L8j0G3)YÍ@ÊΖuÊdä„Ö`áxÃ99% ¼åê IJ¢ü *¦6ƒ_‡ï. 0344tæ)ôx,—Rø›eÓB²b7š:šLiDÃÑå꿬Yï€Í¸. È#LIF‰î&o$2‚~cÂCïÏ,)Ù½\î\Ƥ”ü­ie,¤2 “h=‚5^Dö©ljeY&·Zò )%È.’ Œ¡¡§Æ„ßß]2f x\RÊþæOYRRRb„.›Öñ!ØLv×½;º`rC(ÚkS`åiFIÞ6„–”Ìœð‡cÆ”$WÒ[)domHãˆ9ãí"#ÚÚδµ¥Î€Z˜ôîÖ§Umë=‘7ˆ÷ÙwÒ)©9\hIøñS3gîÞ=æå?üá÷_ܽ{÷ÌSLJ—«.Fr;Âvºgn°1’çŒuQ¶ ‹ØAÆ0§OÇFKѵ2J&a7DŒpßAâ1¼1c^~ùå îÿíþ„ ^~y̘1»g+¡ÆÄºGàHÞ­K'sJšIŒÖÙ^EŒ±Z‚݉‰ÔDP?c-šÖÏxkÍ›­#’Ç1w *q䆠,Câòþ‹m×Bâ`vKv¥\5v›rôh‰ÑÅŶ¬˜– ŠÜÝÝw»c[@ý‹{,ï•R2c\Ê!)%y=œ yÿÆ‹¯‰ œÎƒò3iô6‘v&Bb΀ŠÎ^E¸ ÝBgDl ïY øN’R¤ÎSG¤¤€D!K&0Æî¿Ê¥LTf7¾Â;3Háí±cB¢«‹tYÀÝUì˜Xê±Üct—šRŠzN…’йH PÆ7&Œ)‘K¯“:}‘üW\¾2¯¤‘·™³i5Ï˰Æß š¬càöXΆDÑXÃ˧œ—Câ°(йî H„ Ÿê¬ÈêïØÊ:Û.µ ɽ=t¨$$­8f…:gÁÈ3&&¦ (u¡î¼¯VH©‚|J )勌qÂ&Ü5”œÒ•‘·³¥õA‚´S@öPº[’’·%!‹Šýˆèbb0 %¼­F)ù|¯‹r¹D¾yæp¿ÆoüaB ¶A¡Çq‘U¬Y‹;sJJ!©ö¶`ôÊr.18;;ÁfÕκj’Råoò)IÊn’”ŸOàŒ/ÞŸ©Ã†òuÝ/Zi•¶(ÄÆ™Ùæ":A±Íª„,.öÊ*+Ó…Ò9ô8¸\–’ù[©-e÷éCnÆ'@g,Ë¡HµøÏC2Ì¢’iŠäÞF!³²ÊÖ@—ªC>‚ÎG¬ìo#HE-¿Çú^’r#%Íý /¾øâ+c†¬YŒ^ÅE^kø¦¼m¦‚45 …·q³³!}Ö"Ûñ5ÔT#öø™FBj%ŽÉÈ­†”Ü]rj Äe“îþå‚Ýßþ†¿u2ñÍ6å¾Õ}nôiÛ¶­-ö}%YÔŸR‡ÏŽH[âv*H“n’ÇäX³1 ñ8âÒ`ò‹´d±F-gâT'ŸêÀrŸÔ¶m×ÚbŰõwÉf“oÁ(z Óv·ivKÙ"»¡98®Ã„”ªì¦!çÓÏ@‹OøªhÜ‘ÀeXZôšÚF_èSaSžššMs]‘µ˜ÎÑ”“íæÉBj)iRÌ5êd ÔG‚„ziP×Ioq„•mG+X?¶±ñ(ôñhhЧ>Î&ÇÞζ|þ.N’ðc9Ò¹³šÅÇî̆Eô»Nä  È4I”¸½³üù}Ey…‡“““M?±°Ÿ•Í2eFYÇŠ P-w›»uáÐY0H¸uŽuç%D@Ž¡OÑlÕ^òy'½‡OÞéʧœ6á‚Hf±‹XPJâÿ¡tÚ¥ HK]s 6j¢ Úã^$•9ô%H±›ý´“‡Þ¦M›+WF'±Äà¡¶Ö™|-‰1ò8Ñ‚4r’5úIŒÊ5¡±¸®(õ“±; eؾp!ƒ‡U„$Ûr #%Ÿ¾bSPŒÏ·ió&[ê¤ÅÍlo¸‘Ù’¶òœ¥–’&é­î̳tÅîH¹cÇnÞ™»Ç꼤Zl’´1†”vÀ¨¯Ð7´yþùçÛH ²ð³.ÁŠÅb¶ì®> ªÕ¥Ñ§Ø¹(ÑÖ‘cw‹9Nb‘s‘$¤Øt'o³Í[òÍ ml8ãóËÅÊ6­§gŽVnÒò¼V5Ó«iÍñHE–­-­Çó)-Mj#lmËlåˆT q^A0Þ½ Œø²žø»àŽwp’Øha»AòÑ_Ëj+£³Å]ƒDÕ¼ž¤&‹ ©,@MŒNÈøBzšvÿ<‚ÇÊü„ˆ’ši¼Õ$6HÒgÙ“žnÍ8ûˈÞÒ6 ?’£í®c`»ð‚ž.Þc•Û§"mXño¤âȽ¼‹C.‡èCNkë¼IOO7Ú#Q¤v4 †Äx—1J[¨£Çf[NRnó²ß,Á|ýÑuÔ{$œ’¶Y‘3=4=–ÊÙv“ŠQ8;:ú…+ÐÙãÓŸ(7(GÛºŒǘDTV ¦Mv›ä±¸ÑzA ¸épúô†¨ÁŒ±A0Šýo<T”„ÅPå¸l’ÝæGép%¼&nY3Ó±»ï2¢h´dgÓ`ȘÄ%g VïžÊ ™dÄh~—¶ãŒaŒŸªvi¥³{¨ã!Æø<2.Þà{¼C³lÙNª(s¤iƒy÷Шèv JJxÚf¶ƒÝIˆM3&I5rmMQ°j_r¬hÊ>t`9uÔZrL¶»N îÝp¯á3"0Š€ŒæM1®–¶ðjëíìï-Æ€`Õì&Áâà­ép¥'@vᜟ%²;EQèm·î§†™QÞ ¢ãñÖº,y*+Íe=ó3BjJ©>ÍÒ©‹dìNuøQÁø|Cƒh*ŽñÞ™ÚR¾9imXãâ"ð,`’jUÀ|=·¨%ÿú79ètÎè©FdŒ[у1¾À[g®"ÛøsâìÂvP­ÕÝr²ù郥ji'͙ö®™YÓ­‘Xé®þdÄ8šo¡rD˜]–èð–/9ÈG¦›–²GSvÒ!«ä{÷dLºýDu¦.šÍjN>Ý 7>ÒÄØÛÛ…Ö iOÍ6Ü`[$–Ó\¤OHk~²”M(i˜€)N~   [Õ©?‰‘š Æø£Ìè`]lK“÷¢bÛㆢb¾0IgT jj)5 5yÚI˜_ñ³DÚ •Ç'í¸½àÔ —e!q*W´¦×jüý‹~…[Zá-.R|â`¬I‚kAš?Ñðî‘§dû oÞ•¢Ú)¡©@ÆGöJKsìv–ÎWb³üO•x±µò²2œÓ‚¾ô娍 iáÀì/Ò¾ X¼1& #F™Q†ÄÙ&ÄàCYVYÙš¬™%ekÊʲüuEêÏE(>Ýh^Ií#Ü HFz¤®5G+Ö{Ø/ÿ˜’Q>‘Ê—¼ uCœËœ×Ì _ƒû7†Ðb¾Ú…¹“”¤Z.· ¤ùsæG”vod@Áx…©ñ9”`‰k‡^Y†p³Îy÷q¸q-Éò/6–2M¹ògÒôS óHÇ#J-¹ & ë¡fÇf‡RD¢´RŠg«vÿ€»Çq/¬ˆö­5 ÃÌCjˆI”z÷îØQ¥¦ŠlËj*ˆñ6æ³u9YHÜO+ù! †ðS:ð¸W±zSÑSÑVZ†ÔÂdç¾;öîŠv<Ò±cÇ0Õ§Ðzli#7/`¸âQî±²·‹Šü³p[ÀPr*t÷)Ã3 àq”ÒVlÏ&%ÉÛ#MBj‰Ù£·ÊŽÀ¿0 _Ž 8#[(O“b’»;« ! á?¼|*|&ž¤S(‰îæ…RŠŸlH ÙQ‚äßþ² †Äøô¾´4é39,«ÉÑCè’ðððã3ï¿üòqxP2_pT[ñ™¶I ¤MBö0öyocë¯üô—?)q÷oh°¸¸8kŽÈøînñ½ vÿ>Þ²ý¾™3Oýpx‘6«]ï ~OK@Ê& û›@*¿‹Œœñ‘/åÎ$YúpŽ”:ô÷„Ý?„’»1$ÁÛ¤uþþU+ïÏÏo]˜ã—›¡?š'¤|¬jÎyL^Z Ï«ŽUŠ e ðQ1‡Gg¾˜7¯ Ògäì_±íæžd{öÜܶbÕþüœ8§ÈuÈxÈIÅ(Ÿ·Ãb¦rXÄÝS„„çÐpg/­a1¡9â–¯ yX¹íV‡ƒ×®ÝFûíàÁƒÛöçøèÞ\Ýc50zpÆHYsþF) %¸_î¼;Œ5†!eEæŒfB.ÿ9#¤ð°ëM@¼}»°÷Ñ>Þ³*¿µ_œÓ›NP ysÆÍAb r6ÐŽ9´j쨳ÁŸq£³6MtA Ä”ÜÂý7o)ßGÆ¿€µÛ³ ü^½Þ lÆø´êš"ücý*Jè̽¨é=Åš^¯â5:õy „Œnºév® ׯ0ªÑHE&$0þÏ_Þ¯ïYUÑPPÀÿ}°õ*ç´ÚI‹ûÎg„ø>d*¶ãŒ·o_ƒÈ¼†˜ù?€ùþÇ+â ô¬F5d‚‰”EìSÀþ^ÅÇC‹½ØY›ì¢âOÄ$sZïot%Da·;l[uxÿáU®{~,0?®öàŒp½y«!¾ÏDìpópÔr,ê­¡$íÐ÷ÛVU4({X”’oõââ@‰N^€§µÌÝÿ»|XJFHNëi®H(©xûöÁ=®Q~ÃÎ ZpÞ&.#7$°Úw”oyo 9£ZÉh!¥ê¨(-³ qfË,Ù|Í 7šxç“9FBj@ž\~î[±5¦ Šøœ`WäûÅMmŬ÷¾¼ ?ë=àéiã;@v´{Œ!¼µmUë¸óZõ昭¬¬"lôz#F¤â¨–¼Aé-–þtYÒÒßÂ'Ê«—8»}{ê¨:·ø;KÞ^>h æ´ž2Þ&Â'£ñ–ëáÂè+Þ>wAPZƒFÏŸ/#AJ­Ðõ®-¢:ûãÝL¬ö]r©sÏ7Þ8»x»cí¨:{·?*ÓÆh{ñÜ· 'æ´n ®¾5U| 1oºî/ ’”«_¯ßÌ)qÀ.0Ë(I‰ÃNš´÷'–£¼ËŠ–]á;êÒÆK=ÁÞx㳋gW¹¤}}Ý.s'¿/o5?êë­k(ã“òÚÁÛVäç䯅丕‡TÄÅ ¼€ŒëhÀ6e4ºJ”ÑÆ¹À\øD½Û’7ö䆌ÛW.±GH°ëW›  WbecåܨE®ÃG¶c„I)ᘡ‡ÂSˆíd†>eNo#q£¥jóoÙÄUõ_ÒS2Ð…ã6j"d}]‚‰ËC §¹Þ¼Ù¸hÑ3ãßë……‡S¶»}ð”Ç8½>.#$„QúÄ­¿BÏmFeT*(O,›X]µR„¡ yTÉ8„\¹³vÔ(ô¬6VòdF΃m·n¹VrÆY½z=÷ä_¸7 sׯ{½ê7N `ÐÑC#^ ¿rGš??kÌhrRÂ.aóBΧzÔŠmö¾N‘f sêÀë#@Àw¦Lyçõ×R*d„ç¦L!!'WÙSHd€qf£®ÝÆ‘¨ãsd;¨?·V´Î êßjùŒ·×¯GÌ8ˆÏŒ@û¶ï·ûøàž!ooÐV2lóÂr_¼)xûú”wd{ãž=ßa*¢Žƒ/^yf2ó3ƒ\h¬dFÎá›×FÞte¾~î¹^½xÞ´Ã\U˜± ãçצ>£ºö}ÖðnË×3%üñOŒ…€ B’!Àìù†x4e 0Î^9¹ÔM@‚ž£—‡´®¼u­Ãx…ÏÉÛçÄY±1擟×Ïh€ \½äûoÝܶ*G¿N xbY@ §Àý#{‡hßxc !ƒ¯&o±çuÆcÍ÷~o]»6ž ù$9K*@”7úMb¼>i ¾þowpm„"¿þKéu¢ÁÃUHl¯“Hfí ñÍÁÄÛÝHH‚¬2õv„äÈá·FÎB:YHÊ›mù!úï Ê0¿Íßóþ_žü¸Ã¶ÆÃýâxâÌù ÄUøú”×…Y†$™p0BÒÑž7èí£îg_4¸Ù¡C¯v³TB"ä­mQ!ú·×Ÿ`”'Öës W@GÞ Ve~N†Ó—Vv£—]¬ñut<;…ó½C‰Òm0Ü)¿&o—VñA#ó¢ä9¿‡•Ð>Ž9’ò… ¹<&ÞÄñ&n½ž(§6¬óÛ¿f 0Ûi¬l¢ßüA©/T(( §¨(Ø`aøèìYÇåŽ\ÈÒ%u’\ÉeF¹˜âÕ8¾CbÄ´™%Ü’P—öçdddÄÅ}ùÝЀB!¯upu–“QÁˆœ“2[ɨ$ƳgÔ”ûœÊûù¬€t«ª#H»ÓŒ aHÄ×È‘í¨þ`£+µ’nmkDÈÜÜ8ýÔ›õë=Êó·áü ‡ôi~q‹Q) Y©Æªò:AN1Ö‘ó|)Gƒò®^=y2Ì 9Až©%AÖ1îÍÅÞâHÙ‹d|R‚œEÞnÜ_˜ÃŒ~}ÉŠœU4I„h½ùÀ/Nåe1˜Àý;LNãX<{¶&nç#óö†±k5Û…]õAF¬’5 HG#Ès!­]Çߎb:"Õ®x»±òra.ô’Р­·ÑÇ…´^q0 ‚Þšæ§ŸÌkÌØ“u,(OQÈ7侓'7 m!ÛW¾xqWò¶£5¼äíFç¡JB—v 1ÉÏš³z‘•0qÐC›£!ôk63ÈÛ·ûéK$WÑÙ¹gOg|@¾fá·øìNoàm걉wýíì. …õˆ¬!!1¹ía~Ã!?0‚ŒË‰"%ßÙŽ ù$F% ö Œ¨$$±>—õ…+:|Œ‹, $ÌdŠ IDATPr72"¤3v‡¢>/ÿ®‹w\/øùhäêu“&Mjö,X_°ÇÐ^x¬ï³“Ž:²J^ É ]$‡ªf„èr#Åd/yò5 uìõÞp„œÕÚ/<­‡¹¢>dÿ¶ƒŒ+·;@›Y€,M8cÏ!Àøú`ÿq+K¯{ØÌˆŒ\÷å&´ý¹m±lJY, q¼qcþ¶SC…´†ä¾‰yë8÷u¯‘ïÝB>È ’ñí·ãrVì9È5®Ý‚1ý‡$g3HCÏ7ÎŽ˜X¡Ÿ´nÒ.ž¬Þc/=J¶ŸäÁs»trí(ûzîîQFÞæ—ßÈ“ûv¯Y !G¾7§]Îo÷öß×çæoÛƒJ‚]†èg$%2£\⸤ºüúˆŽý"ù+»°þ²µj%6Ò$C%÷úðÜ.…¹ƒ½SҾƸ”S•ŽÅœAò´aÏd¡_. :;®p@^û—4nUæd\— ÌÙ³;G”Ž1ù\[öþÇæ©Ë×:dªÞÓOÿ™*ùl{LnÌ›ÒLn7¦¤}€q)çUrx‡k¬±;€·Ÿ™v9ê!í5€³õ~ù+¶íépðãÛ·oÜö0W¿FàÛp§Àæü®eÖÙÅYÅÎYÅþÙÖÞŸv¹÷î/äè“äû“0²ȼTÕ×Õ»Õ3%Å«¹…ãoÞŽR2o3wSDŽG!d!L¾â2ü ÷¯rE)¯AWépvñä‰6G##ó–ÿx")øƒì?R\yñ‰ƒ‚"¿–åê="ÛŸŸ¦äž±½+ É(’nBÉOŒóæ!¤ Lp† ÈçdH×ÊÊE $(™ã‡“îüüU+¶ájt™­3ô G©øõ°KöLúÎÁŶ¸ÌÙ^¢‹‰Mœn=à³.÷žúÆD?YÈŽ½[õï¿)evW IˆÉÚ: ÒxP²!‡äs, ÉÝ‘P·É q» ws^;¸gUÈú¼ TúÚoÙ²nùÔÍÿXx±tûÎ?_Ûù@͈‰ñ)3Þüé§§Õê)…äJztíÊòæLªi_eœ7~ÓÀÛ9)lrL›E—%ÈB þ>xðfa\T?ÊÛ°Þ.¼{¯Ë§Ý#Üc ¡™>à¥y¯¾õ–©€êܴ¬©…äÆƒb\aã6Jœ#oÏJ’7‘QV²!¯ZA¹gO‡¹3ÚcõÙûõ±£3RâaþêX_UUíãaSòçñ##Ú:r%1¹r%B:º¡4âØ_T3îÍhíêJ#7 ‹É+ä6ÉEsçFQÞdþþi¤$X~\ž¢øu<òÔ½.ÝN§OÇO9ípè~ºÛKó>%ÍjÉC2òÌl‘Ü?‹œNBBL¢xóêú–ZI›•³M“ÛxP\ïWéŠÎp®$õ»Ïµë5„\´t|H­[?|HŒ $ZcÈ ÐQªwñCUm®\qj°±©ÐÛ48]‘„äbÞÅ ™&÷ErËö¾ÆyC /æ6_àèíEs£ÀÙQćóžVY‰ÞÊ›ÛVåÎèß[®~ Ò«¯~4ï%s@w¼¸êøê[*S}MJÂȽîú8’rrÛk$wc!ÙÂE% á®•¨ä|T²õèËqÚ*¦¤k~îQRYIKóJükƒŸ©»Ë’û.7x‚=…ÏaHRrŒã!ÉFníAæNãiBr%qWäZ"rþ|ù`ØáiÓQÉm« 3¦B@*„$)?úhÞ¼y/Á?x¤îU²æ±ûW¹’4ríÔ–»Ñz¹ýf#ÈœJWmÀݽfÍ’ ÉÛÀ8w~)9. ^¾ ¨•ào˜šùň|D©äÝçÉÚ°»»we ÙóWøúoΟé*’»®Ž•I0#F«ÖÐ] gÃ̈3YWpöÜùs©ÍŠzu9 n+AIW×ÊÖ!)½!ù'¥fIr‰'˜½4à£yô€¾ ƒzïþa› Vò‘;€Úr,åö&ƒ¢UTãx- 9¼=mÑüùòa¦yTþþùbÅþ£„8“#ﮉŠmЮ4Ð=WC¦ŠãxÂ9w=‡¬6†œF¨£‘ÏQ‚˜œ…êäC4¬AV5BZÛwv<$å„ýè­Wß2Ih§÷/uë·ó¤€=3Ű½g/¦A1 Æ !)mì'š@ºŽç¾öÍn°J‚¿1%‰3ÿòªÆÆÆ«úeõ…±æÏÜUjvר$¯ 5xÐ=S󧟾>thˆÈàíÙ”Üö£ìÅxc¼ dÕ8räÈYJHê%]±–cê@ÞfÔåÊJ<”ï—q®? ©N^þ@¤0 F&"Zz"ݽ„r‚–OýrÁ.lØNYõ¬»p›j éz ‡…ÔïBLrÈùóÙ ˆŒÛ åᜌó[úÒp£LÞçÉ‹%QÈâ999544Â-<$5úúëÕë6œd/B"]=ËmãŽ×Êê& Ù”4JHŒIW J,æ2jî4‚\Õ:Wß# †›o¾Q%ï¼nâ×’ëH—œ<žž>}Üž¦‹–÷î½ûîWv³ù§T$7˜ñ heE݇dw€Èæ‰Tƒæ£³qXŒºLJ®ˆ ‰‹œDJ>/«ˆ¢5ˆ )?…:¢Š660i¯ðµ)ÐÛØ šW®¼ùæ±¼½{—ûÌ^,'·=c4’„ì%!ÂDä{˜ÝÏH£"UÊË—§Áè ÎöØÛ#ìÂ/G¾yK¨8ò7ÝÏûè#éYŒF‘>/š¨£Ëñ²ëǾԩÓï&O-ïÊvJkÜøî¬½}ý&¸¼Ë!%_##B>³ˆAbÖÌŸÃMååÖ¹6l9É-ë…æTÐF2ñé¨÷(ð𨨨´‡[½´< 3¸åËÏí캘'w½éf<("d¯^ %¹Ž$d%*9Ÿª–ò¨?ȉ›øs˜Ý… ¿|£¬`§§óó„¡Ž@ȈDºØíŽÐº¢G¿lZ§/’Ïïä+,UXz˜»ë÷™@öêÕKV²äÈá”6ÌÝó©’£—áTÈ‹~¹áС~úIY¡ ú\&éˆ[¹6Õ>復åå>>>™?ÏX4õÇ f“·qäÆÝYfƯ)¥5êHÎÆä&HÀ„?QsçBñ°0÷zÀÄ ;» ¿<õª(‚TtKw‡Q ™A@ž¦KÅ8ÇîØ¡ ߺck¬s,^&ïô€O»ŒõLóéÊVXJj«DÞÔ›&·•šd$g3!Y$î Â3äN@@|Þ†u«}ýÌjDT–A*„ÌœðIÌ{ÊGÕùúÖµõõõµ÷õPAÊùa N|2µ|1ÛÁµ* ²¼ Hd„‘|üx™r>ÃŒÂÅ–Ö~>ý 좿z÷©{LÇnrŒÁ[V¹a@Ò…Þ¶î0„êBOÅèJ [Ùe0à…pÔˆT&·qÇË!ÙX8‹ûš]ÉÝ‹„ÇçÎÅ#'$ 4 àç« ä×_ÿijU´«¨¢;¨ƒ LNú– Xí[U›êÖvÔZ7_¼T(ùý Í'>ä( •Ém2(ä,)12HHo6|C<âœ1ǯ¼´_@ùQ;òÞ<6£Àê`÷î‰:º“Õ$…™1t¡¦™á%:] JÙÝÚá»OG-8+òÛr.¤½ÆÎ´,ä,d|%wsFH\ýó›üx¿€ëAW÷BH~ýæ›(jaVn·8¨°ç ñ,Œv©kÛ‚½vã5¸MMu³¯«rÜ~æñl—êž=ß9Ke²N I7“Ž— c/¤Ì¸þ<À¥`ñG€Œ_!IBRб “GDDĆNˆà!Hç£L„¸ÔmhhIÉî1ÇKØ%OQL< _Mç•0qjå4éxM!‡Ë‹xP>˜vf¶ dà„Ô_Ý».ïc’µ¢ÂÇǧºn|*ð+)019jmÛ>µ©U“w &ar!9B†t»nr–"m†+•${p™„ ñ!Bž'!;uyIdï÷¼JLI"])Ñ}: ÌÓ§åäŽÑ…—„žÒ•”8£ŒÓ»[{74i#ßœU&·Û.-H©ü¼÷ž )¼ þ~ðàÁeb \ùáäÒ~åG¯îÍ;vLÒÃÃÇ7Æ“Àªµp|+X`6PÖëyhÖºU¹}^5ÊÍ•¼?p׿Í'¾H>r»IãÛ^ J2r8÷6%Íå¹Ðý@Öø…„œ7_½û®$$]˜Üݳ”ãp£Ã«‚±¨äý^Ó`ˆq6qŽ1è¨N: ø4itüÙÁÊäæï—š½xçB2F>ÚDA‹†KæÀ8bö¸?>^àm †¤„*¯®¯ª†¥Ú·ºª>×ÔRÂOT”ûúˆ³~îïxÄ|»kó‰±>l¼™@m¹½ÙAÑò½ñl¸Y$†DZ@F¿Ù]ÇQÞ@H~AJJãIìÖ˜CŒáTLŒ¡„2—Iy:‚¯T¿~f«®$vk¬{âV÷î8à$>!ÅHn{®¤[ $ë&UBJMùC¶¤ñRQÓuåÍŒ}{óò0$i`¦ˆÃäMµ·ÿÜ·~­ou5“’+‰QYPáƒr—ûÖúà÷*|î¤|!¹ z1* À]&Q&ãÍ@Žì%e69W¡aÂÍ9cüb„ì×Z oæ1%»óJaIÉ)Ãq]Œ|átx„–x¡­†qZ¹‡‰Ï€šÚ:)o†iB¢õRê9m„le’7û$æÍS ;ÿs vÛ”·¾Ød¹¹¥öy­O*LœëFa-ÄÆ±Ç2êÌËGyÐS6?§|=P ŠØ§á‚Z=_«Zgr¤\"QÇiXó£ò>$D`üë/€|¼´ôΉџz[w粯õ~üø©S§vÁKO/¡Ë~ã•cÙÙ寻'ÆðÁ/X8ÚsNüY> eK“ÄX¥•Ü2$#¤ÍDÜrˆÚŸÿÊcnnüæ Ëkº²¼±9¹aÝ!jhYWŒÐUUõ}úÔÚW‰˜ÄÅ^'©©¤Ð´©¨¶ÑS—4cÆ‚ЖãÆçJ‚¬+“Ë@2¤¢Ak¬¬|ð ÷G±´ÎÍxâBïAŽ”7gPHv¢[$7ŽÎ¡Ç!&ñ Š”ÞØ|§‹Î’®ä‚%Óó_ãß3mj KKÅ.“½Æ2ƒ”Fb¬œvùÁeБ틣Çf<[…y³[ È«ë¨bm7²Ú×¾í(PêRëäìn´d½»“[ÀxóhdÐòåA¢ã-Ý™*”¬w¨ )ÒPx¦2Ó yV炌x®Šò[ <…’RvïÐA£z ›FÝV~z&¤˜ë žÎg@]:ÝûâÝHn¾xáX‹™G”nAš·nÊ*VB¾DQ_ÆT̸9™íü¼X°—ÍoÚ¼Év؈ã놳œÂøÖûR^ËBÊÓI'|ôf›7¿>–—·w_Êv¶èƒ"Acfr[ ÂÆÆiÓÀÑ—Y¾£žHæ‡óƒ9dCNï}$Ö&è*Ð[ ;vÄÄèŽïˆÙ¢nþÿŠI8<êvš¯pÐ2Pt¼’›ï×Á ¨™ÜV„Ø邌—Gå3Gçz|;õ«Þâ¤ß·Û»v…Rpñè† ‡p¢È'HÊr_tª¡ Âú_ÉÙFeN8M‡Iæ×ÇV¯ÛpÕ‡Ÿ³áÉ͔ԭ¬+§aG¶Ÿé‰ßNÝ'™dyƒ!ùDdØ6å¦  'îìÊ1%îteÔÄ­’Ê¥!øOØš»âìÞ¼JŠä&È;Ú¤!Šxùðap5T¿Œ”©ûþת¿Äتܟ /äá*›r )+p?†fèÌËÙ8ããB²xT-²±»Ÿ^ 5Þ¥äÆTï6H²·>ŽÚ¿??k‘‘r­¬dÆ}ÕùÇÉý.Ú쥘Äe]±Ò#¦8[C¥ÿóÒôôBHiµRlK¼õÍ7¿àjù°í’ØñÖrÈz·úsf²æ›†Üµ­ž̘Ē[!K‹íi’ëFH˜Ü2¥…ʼYÌס#yrÿãæö¦Èô6¾êdü¨4‡<ÚBHå”›ò¦´ßuLnq€·I{ÁŒ=†BN:¿sÜ8“ä^b6¹›„ «fãM¿øu¤dsMë½XÕ۴ɪ`6y~wGÙݾûZ)ÿŸ:è7`Ôë«eÏ‚Ž“¬*¸ªä ûÍ»ä +~<ÿ·Ù&ɬ¬6” oSrãÊ@V˜eÔ†TäÍõŸ 4ùñ€Húˆ×³ kß´­^½N²c‘’ǼÝGnZåÈó-„TäM AþññëØž\§°H…q^XЇd>>¹@+E«©Ù9$~઎V¡3ò7CÚùz1ȉ`w®ƒ±w$s<àp<«4ö)@ü£4ü†0ÉÛ;SGÕñQ±Ê|rkCÊß>áDYZ:yòÊ•³»²·lÑ#âàÁ*DãJd¤RNÉÍ «Í'wSäÊab7ùÌÊÙRIiŽØ‹›?üõ‡Wá6nÜ8’,¹YÞ”›OnMHUÞx1)?\¹rå¸Ù]»úów&Œ¬ÁYYp+FAÈ9eJÎH(`IË ô0Ϩ ©ÌzþÒ€è/½ï`/I2j*¡ã8‰‘ Yr×#¤ùAQRþn´¯§dæ¯~óÁ¨¨ôöj"A–öãÉmu’» ÈÍŽ^ J#fSóW0vU@>Û ²!-$wËý¥7j QÓüM¢‘A’·yr“’#,$·¤"o&.h¿ Ò_‹ñÃ%H~™%ŒÉ Í–Ä<¤2oüé­Ø;þ6DµŠ‚C²_bq#H ŒZò7ªýecïëEL€}}kšºš9›ªd@-‘­Ç"d)¹-Cn®ñ·d2ÒbßÅ‹U”f# “S%oWYJnË˶a‰7ìêßU…逎08±?üg¥ÂEÿÉ­£€ÜžJÇ@ÉúKÉ­©È›;³ùÛt²(R]§p\ìOêßG¹µ%Fª@´ZŽ%¨¯/·”ÜÊùÍ8‰²«‘©Þ’ûn×f”=Í9#„$®–ÓÇ÷ëë=,%·¤ü½G|è¯'(gûnßîkòì8U8*d½t¬ÁÉ£EÈv¥Ø2Ç)ÛöÇÙFO“‡Á'‘'7& Yg1¹M!!ùýEÛ›Ä3gãÆG%"2NNeEÈG‹Ém )…dïNwèÜùÒï8ËÛiS“I˜{U˜¢ÒÓ’ÛS¥õ´“Ûd«V{#zøÖ¾òÚk¯õ!ÃÓé¿þZ»Ô¾sçÎ0sp<°ý ¾ï‡Ž­ŠÄE—¤£ yÝbr›Bª¿F KÛöÑ´ÏÉ}m*ØÚµðK,«?°}ûYø&£cI‡_pwWÕŠE?7½Åän ’Ìnï°xßZSPAÈ ¾Ðø5è7X›Zë6jÉ’;KGì<39 ¦"ýìù<Ñâ2&ä&s?hwbÙˆúÔ¶*ÆWÚªL‹RúYF»–$¯­Ånå’Bö·üãs‚K—¤*ßW²>/Ùk’ Eñ$<³Z07º!³<(¶’ìˆC×Η:w^²Ô`oº¶-°ºôWÅÛ‡12#BÒcœ)š]ˆÖ†l£©…í;ºté£k_ûüs¦ž‘¨ÂÛ ª–™$k¼åäþ×@¶jutãÆ>:m-7|HO< æviãÒKõõaŽíëè¸ÍÞ­– BêÚÔ†&^Ý$qšãosœrÈZF7DbH(­K Ù¯ßïÛׄڋ-=zé’L9ÄñÑKëãRËC`s!h‹H r##R ÈõŒ†)ǦœÛ|È–‘†ä%ijÀoŽdMår !›G–—RîˆYJ`¼T¿ä€€¬9÷¯‡´L–WPìÌŒݨÄů.]ªïÌ·×Ô8ZœcÿÚ¨aAñUTO:Kv ë¼LL¶ž²g5`ÕËÿ*Ô°©ñÕë;w6A’Œ?¿„R¦Ž ·#dMü¿ R}èeù;¾õKÊ%¸Q6cÎ$1ÖT[X0ý' {È„ ®ûº-E³QÛ”˜öK5ÿüú|ÈxrÁõªzM2㌜ÈX_·DŽÉššÀ$ ²ÿ!Ͼ#ê°õÞøèRòèR3•GÆD!;« «7ÿ ñÕýñƒ%m±Ó[+™¹úÍGC.f½½(“²¼EU¨y ý¤4õÅ nÜí,›Þk¡' ©€¬©îÔÊæ0N:¹ü×oL¸6ìšÔK´ÜÖs?êfßY ÜœÒ÷¢öFn‹ '©ìê07ˆÃ¥—à aƒÍ÷$^ÅdÏìEw! «Íl77RÍ6IìcîMY*Û¯dk×þÚö•WúP ~C2ãy³¶YUU¥€ ü-JšÁcÛ²[úÒ™ é ‚U«Ú_ RCH|±eÛ` R âïø0\¦ H{Pr÷5ðyü<ãü A úª(M1Uç=,§µ9È'$[¸pá2ø7° %>?x7ÊþWd\ÛVe­=²ºÜ#eÆùïw 4¬oK(›†¤— BN¹p¡üe||JJ¼‡¨;ªn)„äR7{ûQ¾ç!¶àEH+‹f¼Ý÷ Ñ4i ¦¤xÜ©ð©H9ÿýÀeD³æâ²™}W Ûµ ¬¥¬˜gË$BÆ8lØ‚ ÇŒüý/Äë Z°k š`m—Šôýg ÍŤtQåCy”[spɸ`Ájù”Øop·¹ì–) ôÜ ] ûö[A« ©BDƼnj…lQâ4 ’ìXÐ0xÓï%ûv—"Ôd$cPÐcMA6·iøÛäÐ߱ȠaÌ¡´Ê(háF¥byÆfC6_Jáûc‘ðÖ €“ôhlË‚¯ù·IDAT– ù2Œóµ”Ñds)tuйLM Ð]*D-F…³µ!›CiÞáÂò‚‚R•Orá&#®>¤8ýùló„Ô€´èp5¦üÅê¼¼ „©:H ®^}èPß–3ö·Ô˜+tšPª¿:´z5Љ±9Œ¡*¬Ùˆf-O´) 1Sa $#?«[ÂØJk¦éñg^Þõrª-O63*Š#·¢&c+͹¢y1áe›Ôö1vó'çÖ¢F1¥m¥¥„j®™¼šEÄþ­,A*(Ûó—T<Û¬XµH¨F´ÌhnqÀˆ²ý$ñú6—óYSD¥ŒæËšùÿ½ý?ÿ<6cOIEND®B`‚PythonCard-0.8.2/tools/standaloneBuilder/pixmaps/open.png0000755000076500007650000000206410230715372023446 0ustar alexalex00000000000000‰PNG  IHDRàw=øbKGDùC»éIDATxÚÝ•ËoUUÆû¼îmy…^Z,–j‰M¡iâÀ˜hDãF>9àñ0š8r‚&*Fc¢!Ô,¥C¥Ð¦­¹moo{k{çìÇrp(8 Mœø%+g眕o­õíuÖ‚ÿà>à÷ööú³×ø¶exQôWXäïEá á–²îëëÌÎÍF¾?÷ùÑáá¡GΜùŒ¯¿ú•b©cvöõFÐÇÏ~ÇÎ]'ÚÛ·õ R(δliyš¥åi>@š¤ +/ vú›­ (—k'?ü能ÕJ'‚çy(¥ð<ÅÞ®Ý z†âJé=ßßu©»;¨FQÔªÂZKÇ<$ëƒÖØ×;ÂôÌåJkßóð0 QJqxè ‹ùÂË—/ÿ("»€Í6ðÞéêÚw6ŽcÛºƒgû÷›sçÏú·~»†Öš¤–âûA NpN°Öb­£-»“¶laâ)E&“!Ê„ø~@©Täø«o3<üÜŽ‰‰©r³’`qaÙ÷=Ÿ|~‰L&K­RA) ðk™lD¶-Cj6HÖ×+(O!Îa`´eeu­™ôöÞÞÞt~~ÞllTÑÆ±R(‘hÍ'IaieË=óæË@!“ ?íëÛ÷] åjÂÈ¥1F¹Â¶Ö™Ç&Œ1hm0ÚôCØòÄ[/f"™½@¥RåÆõ)öìÙÍݹËEÚ„1¶nÚ¤)¥Ò:µ¤BµwzM§;·g¿B¥¶†sADZgçÜ?¬ùÎÓ"¯% i¢™üõ.ñ½…Ÿ€ràœcltŠ\.Ç홋P€ JÕetΡT},9W`EkCª5i’R,®qsbŠ0ð§=å€ù¹{œ:õ.iZ#IÒå 8qxÊÃ:‹s‚ï{Xë0Ú€R¤IŠuޤ–’¦š{¿/ðí7r¹'.XK1(­­qúôû\»q¾ñwÖe°§¸š[[×Ü5ˆµˆJ¥uÆÇ'Ã0¸ÞõTnÔ$ÉFP«$´µG”ËUŒ±Xk[’4%tN@cëÄF×ýÒT·üò÷ œ?÷3;;¶aEÿY*i¼vü îÎÜ"Ÿ_Bk‹1¦q‰ÒÊX¡êäÖµ*¨ËY×2IR¦nÏrñéý¹‘jµV‰ãØqôù7žÿ[µ0 ®8ÐýÊððÁ'{zz|uäÈÀA”×Y Àÿ`: —ÅK|êh’$Wî¯ô¾^.ÝR%€èsu‹þÛ·DgÇe•$gô9 Ë€2²ç倸ëÿ[ô¹ºU‚2é“\!ìvûp(Ô§9¬R@3"ååå¬Ë/ÐÕYÀ!«ÕZìÒ¬îzÝ=6Lc_~ÑB"1Gt*Ä‘¦C]ÀS€!-M:€ÑÑQü~?6› À (Z§µÀ·ÛξRZºˆÍäóèýíÆ‚Ó®†F5úP(„ÙlVÝž¢Àd:Á3ÀɶÖÓ%%%òò$¥¤ÈÏ/@QÆ|2pg¦£! ˜&“ɤÎ`0¬¶ËÏS’dÁ²eaodAÕœø' fc3ÂõK§8á8¶°×ß߯ÞWIÊ/ÌNW›^FUl’ ª’k; "Sa‹ÍwïM§Ó©‚W[e€Æåz@/™ó€‡3°(R% N¦ƒ àEàÑzd‘"´ÝhWlÓ‚xëuñòÞÝ*ÉÖ ò]UÛ+ÚN§›ÍFÓáÃè³ô¬ÍÍ&6å“ÏZTiöißÑ­n?ÕNEÙF‚Á0ï½Z§îΜ?Žb‹…D<ÊÀÀGšì:¤š–öSíbÐ7!.´w‰Ök¿‹7~­¦ãy™w1>>.Âáp÷ÞÔªkŸš®¥fŠrüì5ÞØ»ƒÎë7¸åùôRɤêFJ‹Å‚‚'ʶQ»³–ŽcÈ9t0è3Ÿ¹ò+¯5Xùájî!Öš†‡G˜OÌ©~ Lfóztl)}ˆR|àsàýôa§´ýt›Æ]Õ\øñ:>€g^bxx„ÀØ_\<Ù¤Ž8pOvëPa2™ˆD¢x½^F|~œN'À Òò}7{j+¸tµŸ?@M]}:ø~`FF’’ bã¦Íޞª®&•ú/ZŠK'¥&îú2 ¸eþ§yYЄ–dg]½W¹AW‹Ðt%;žÛwhøwÀ îKpÒHÔ)G0¥íƒZ ç]Gñ{1Zï¨à_!I0»„ÆÕË(3“’Ä f^H›¢v RžÏ¦ ͪþ ´ƒÎ(Ôq;/‹•EMiR³*ûÀ[©K¨|IEND®B`‚PythonCard-0.8.2/tools/standaloneBuilder/pixmaps/save.png0000755000076500007650000000171310230715372023443 0ustar alexalex00000000000000‰PNG  IHDRàw=øbKGDùC»€IDATxÚ½•KhUÇßù¾û¾7¹¹MÒD¢ ‚H7%U| ´Z ÑE)â¶ŠË∺(èFwÝ»ì* ¢Rµ Z”Ô º‘Ü“››{¿ç93.î#‰M4âÙ9æ?óŸ93ð?­3€þ‡û% <¯ W~éðg¸ÉÕKyóùÇ1¾Š aƇ¾nã<*½Ó3Ø|‰?ù‚ÇξÎú毜>0DÁ „X;üñÛשּׂ®³ùÍè¶@À¦)JH‘–*`3Òn„‡¢¾OØî âذc\ÿù:‹×–&+€¨zˆŠ…"+‡ŸåA¼^¦h®Bgu“Úh•nì¨4Æ›+x*DÅy/Oš)¢:0™ÌÀŠ P©ù<ôö…'ñóóç1Æ 6\yf ù€$rèjqÎîÒƒmQD·¸¸ˆn‡ú¯«Ýn÷8 |’$Ý@ÔCœ¥Õj1;;{`Ïzvìn€!E Îõzý¶éQUTÜÞ$¤ÿxPŠâ8Ê£Á>909%ïA¸²r[ÍÏÏcàl¶7@ê”8µî?ÅÜÜI’Üê©UAìºÃüȾñhv“½4S’ÄQ«Ï`wQ5^Ï#QT•À7䓌Z¹0¤ÏCfÓÅGKåa•t;[´67H㈗®qùûtǹys™Ç!’íÿѬ³ BØéðÄ“OQ,y÷·X[mðÞû°¾¾F…ÄQÈ?Ê¥O¿¦|çQ2S gûüUÈû=½X*Sê{>X­6YÚ£ qd‚Zu„b©Ä çÌ­ÕµÝì¬CÄ!Nˆ£qŽ,³¬6Wéõ¨4g©TkLNÝA±XÆÚ _SÄy4#¥à퓃Ÿ¾ºLŽ]+diB†„aˆ³nX5I1Ögâè4…B‘$‰q¤IJNEÝÞ?ùÁ‹Þøîô g©ÕÌÜs/?\ý–™™^{õã“S½ R¡V%r´6þâ×Ë$qL—ƤFÐ!aè?9ì,¾ïÄÉü20”¼ÃÁÊýÛ94Úó€ èÑN jîpÔ—óÿЙ÷RIEND®B`‚PythonCard-0.8.2/tools/standaloneBuilder/pixmaps/standaloneBuilder.ico0000644000076500007650000000706610225720275026140 0ustar alexalex00000000000000 ¨&hÎ( @ÿÿÿËþÿ™þÿeþÿ3þÿýýþËÿËËÿ™ËÿeËÿ3ÌÿËýþ™ÿË™ÿ™™ÿe˜ÿ3˜ÿ˜ýþeÿËeÿ˜eÿeeÿ3eÿeýþ3ÿË3ÿ˜3ÿe3ÿ33ÿ2ýýýËý˜ýeý2ýýÿÿËËÿË™ÿÌeÿË3ÿÌýËÿËËÌÌ̘ËËfËÌ2ËËËÌÿ™Ë˘˘˜Ëf˜Ì2˜Ë™ÌÿeËËf̘fÌffÌ2eËeÌÿ3ËË2˘2Ëe2Ë22Ë2ÌýËË̘ÌeÌ2ÌÌÿÿ™Ëÿ™™ÿ™eÿ˜3ÿ™ý˜ÿÌ™Ë˘˜Ë˜fÌ™2˘̙ÿ™™Ë˜˜™™™e˜˜3˜™—˜ÿe˜Ìf˜˜e˜ee˜3e™e˜ÿ3˜Ë2˜˜3™e3™33™2˜ý˜Ì˜—˜e˜2˜˜ÿÿeËÿe˜ÿeeÿe3ÿfýeÿËeÌÌf˜ÌffÌf2ËeÌfÿ˜eÌ™f˜˜ee˜e3™f˜eÿeeÌff˜eefff2eeefÿ3eË2e™3ee2e22e2fýeÌe˜eef2ffÿÿ3Ìÿ3˜ÿ3fÿ33ÿ3ý2ÿÌ3ËË2˜Ë2eË22Ë2Ì3ÿ™3˘2™™3e™33™3˜2ÿf3Ëe2™f3ee22e2f3ÿ33Ë22™33e2233312ý2Ì2˜2f2122ýýËý˜ýeý2ýýýËÌÌ™ÌeÌ3ÌÌý˜Ì™˜˜e˜2˜˜ýeÌf˜eff2ffý2Ì3˜2f3222ý̘f2îܺªˆvTD"îܺªˆvTD"îܺªˆvTD"îîîÝÝÝ»»»ªªªˆˆˆwwwUUUDDD"""ÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùûþþÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùùùûûûþþÿÿÿÿÿÿ;þÿÿÿÿÿÿÿÿÿÿÿÿÿÿùùùùõõûûûûþÿÿÿ;;ÿþeeÿÿÿÿÿÿÿÿÿÿùùùùõõ÷÷õõûûÿÿ;;ÿÿ×þÿÿeeÿÿÿÿÿÿÿùùùõõ÷÷÷÷÷÷ÿÿ;;ÿÿÒÒ×þññÿÿeeÿÿÿÿÿùõõ÷÷÷÷÷÷ÿÿ;;ÿÿÒÒÒÒ™þññèèÿÿeeÿÿÿÿ÷÷÷÷ù÷÷÷þüÿÿ××ÒÒ××™þèèèèÛÛÿÿÿþÿÿÿÿÿ÷÷ûÿ÷þüÿÿ××ÒÒ××ÒþèèññÛÛÿÿÿþÿÿüÿÿ÷õûÿÿÿþÿÿ™™ÒÒ™™ÒþññññÛÛÿÿþÿÿÿüÿÿ÷õûÿÿÿþÿÿ™™××™™þññÛÛÛÛÿÿþÿÿüÿÿÿ÷õûÿÿÿÿþÿÒÒ××ssþssÛÛññÿþÿÿÿüÿÿÿ÷õûÿÿÿÿþÿÒÒKKssKþssKKññÿþÿÿÿüÿÿÿ÷õûÿÿÿÿÿþÿÿKKKþKKÿÿþÿÿÿÿÿüÿÿ÷õûÿÿÿÿÿþÿÿÿÿsþÿÿÿÿþÿÿÿÜÜÜÿÿýýýÿÿÿÿÿÿþÿÿÿÿÿsþÿÿÿÿÿþÿÿÿÿÙÙÜÿÿþþþÿÿÿÿÿÿþÿÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿ#ÙÜÿþõûûþÿÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿþÿÿÿÿÿÿÿÿþõ÷÷ûûþÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿþÿÿÿÿÿÿÿÿþ÷÷ûûþÿÿÿÿÿÿþÿÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿþ÷÷ûûþÿÿÿÿÿÿþÿÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿþ÷÷ýýþÿÿÿÿÿÿÿþÿÿÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿþýýýþÿÿÿÿÿÿÿþÿÿÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿþþýùûþÿÿÿÿÿÿÿþÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ÷ùûþÿÿÿÿÿÿþÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ÷ùûþÿÿÿÿÿÿþÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ÷ùûþÿÿþþþþÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ÷ùûþþùùùùþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ÷ùûþ÷÷÷÷ÿ÷þþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ÷ùþ÷ÿÿÿÿù÷þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþùþ÷÷÷÷÷÷þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿ?ÿÿüóÿðÀÿÀ?ÀÀ(Àhppx{7}Àïýóï~ûßà>ûßà?{¿à?{¿à?»ð?»øÚÿþÚÿÿéÿÿƒ ÿÿÀÿÿàÿÿðÿÿøÿÿþÿ( ÿÿÿËþÿ™þÿeþÿ3þÿýýþËÿËËÿ™ËÿeËÿ3ÌÿËýþ™ÿË™ÿ™™ÿe˜ÿ3˜ÿ˜ýþeÿËeÿ˜eÿeeÿ3eÿeýþ3ÿË3ÿ˜3ÿe3ÿ33ÿ2ýýýËý˜ýeý2ýýÿÿËËÿË™ÿÌeÿË3ÿÌýËÿËËÌÌ̘ËËfËÌ2ËËËÌÿ™Ë˘˘˜Ëf˜Ì2˜Ë™ÌÿeËËf̘fÌffÌ2eËeÌÿ3ËË2˘2Ëe2Ë22Ë2ÌýËË̘ÌeÌ2ÌÌÿÿ™Ëÿ™™ÿ™eÿ˜3ÿ™ý˜ÿÌ™Ë˘˜Ë˜fÌ™2˘̙ÿ™™Ë˜˜™™™e˜˜3˜™—˜ÿe˜Ìf˜˜e˜ee˜3e™e˜ÿ3˜Ë2˜˜3™e3™33™2˜ý˜Ì˜—˜e˜2˜˜ÿÿeËÿe˜ÿeeÿe3ÿfýeÿËeÌÌf˜ÌffÌf2ËeÌfÿ˜eÌ™f˜˜ee˜e3™f˜eÿeeÌff˜eefff2eeefÿ3eË2e™3ee2e22e2fýeÌe˜eef2ffÿÿ3Ìÿ3˜ÿ3fÿ33ÿ3ý2ÿÌ3ËË2˜Ë2eË22Ë2Ì3ÿ™3˘2™™3e™33™3˜2ÿf3Ëe2™f3ee22e2f3ÿ33Ë22™33e2233312ý2Ì2˜2f2122ýýËý˜ýeý2ýýýËÌÌ™ÌeÌ3ÌÌý˜Ì™˜˜e˜2˜˜ýeÌf˜eff2ffý2Ì3˜2f3222ý̘f2îܺªˆvTD"îܺªˆvTD"îܺªˆvTD"îîîÝÝÝ»»»ªªªˆˆˆwwwUUUDDD"""ÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿùûûþÿÿÿÿÿÿÿÿÿÿùù÷÷÷ÿÿÿÿþÿÿÿÿÿÿ÷÷ù÷ÿÿÿÒ×þñèÿÿÿÿÿÿûÿþÿ×Ò×þññÛÿþüÿÿûÿþÿÒ×™þñÛñÿþüÿÿûÿÿÿKsþsKÿÿÿÿüÿýÿþþÿÿþÿÿþþÿÙÜþþþþÿþÿÿÿþ÷ûþþþþþþÿÿÿþ÷ýþþþþÿÿÿÿÿþþþþþþþþþÿÿÿÿÿÿþþþþþþþÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿþÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿã߀€€€ÀàðøüPythonCard-0.8.2/tools/standaloneBuilder/prefsDialog.gtk.rsrc.py0000755000076500007650000001571410431133454024667 0ustar alexalex00000000000000{'type':'CustomDialog', 'name':'prefsDialog', 'title':'standaloneBuilder Preferences', 'position':(133, 73), 'size':(705, 395), 'components': [ {'type':'TextField', 'name':'resEditPath', 'position':(205, 30), 'size':(405, -1), 'actionBindings':{}, 'userdata':'Select the location on your computer where the PythonCard resource editor is installed.', }, {'type':'Button', 'name':'resEditPathBtn', 'position':(620, 25), 'size':(30, 30), 'actionBindings':{}, 'label':'...', }, {'type':'Button', 'name':'resEditPathHelpBtn', 'position':(650, 25), 'size':(30, 30), 'actionBindings':{}, 'label':'?', }, {'type':'TextField', 'name':'srcEditPath', 'position':(205, 60), 'size':(405, -1), 'actionBindings':{}, 'userdata':'Select the location on your computer where the PythonCard source code editor is installed.\n', }, {'type':'Button', 'name':'srcEditPathBtn', 'position':(620, 55), 'size':(30, 30), 'actionBindings':{}, 'label':'...', }, {'type':'Button', 'name':'srcEditPathHelpBtn', 'position':(650, 55), 'size':(30, 30), 'actionBindings':{}, 'label':'?', }, {'type':'TextField', 'name':'txtEditPath', 'position':(205, 90), 'size':(405, -1), 'actionBindings':{}, 'userdata':'Select the location on your computer where the PythonCard source code editor is installed.\n', }, {'type':'Button', 'name':'txtEditPathBtn', 'position':(620, 85), 'size':(30, 30), 'actionBindings':{}, 'label':'...', }, {'type':'Button', 'name':'txtEditPathHelpBtn', 'position':(650, 85), 'size':(30, 30), 'actionBindings':{}, 'label':'?', }, {'type':'TextField', 'name':'pixmapEditPath', 'position':(205, 120), 'size':(405, -1), 'actionBindings':{}, 'userdata':'Select the location on your computer where your preferred pixmap editor is installed.\n', }, {'type':'Button', 'name':'pixmapEditPathBtn', 'position':(620, 115), 'size':(30, 30), 'actionBindings':{}, 'label':'...', }, {'type':'Button', 'name':'pixmapEditPathHelpBtn', 'position':(650, 115), 'size':(30, 30), 'actionBindings':{}, 'label':'?', }, {'type':'TextField', 'name':'compilerPath', 'position':(205, 150), 'size':(405, -1), 'actionBindings':{}, 'userdata':'Select the location on your computer where the Inno setup compiler is installed.', }, {'type':'Button', 'name':'compilerPathBtn', 'position':(620, 145), 'size':(30, 30), 'actionBindings':{}, 'label':'...', }, {'type':'Button', 'name':'compilerPathHelpBtn', 'position':(650, 145), 'size':(30, 30), 'actionBindings':{}, 'label':'?', }, {'type':'TextField', 'name':'projectsPath', 'position':(205, 180), 'size':(405, -1), 'actionBindings':{}, 'userdata':'Select the location on your computer where you normally keep your PythonCard projects.', }, {'type':'Button', 'name':'projectsPathBtn', 'position':(620, 175), 'size':(30, 30), 'actionBindings':{}, 'label':'...', }, {'type':'Button', 'name':'projectsPathHelpBtn', 'position':(650, 175), 'size':(30, 30), 'actionBindings':{}, 'label':'?', }, {'type':'Choice', 'name':'buildTool', 'position':(205, 245), 'size':(130, -1), 'actionBindings':{}, 'items':[u'py2exe', u'pyInstaller'], 'stringSelection':'pyInstaller', 'userdata':'Select the tool which you would prefer to use when building the executables for your projects.', }, {'type':'Button', 'name':'buildToolHelpBtn', 'position':(650, 245), 'size':(30, 30), 'actionBindings':{}, 'label':'?', }, {'type':'TextField', 'name':'installerPath', 'position':(205, 280), 'size':(405, -1), 'actionBindings':{}, 'userdata':'Select the location on your computer where the pyInstaller software is installed. Note that standaloneBuilder assumes that you have already configured this according to the documentation that comes with it.\n', }, {'type':'Button', 'name':'installerPathBtn', 'position':(620, 275), 'size':(30, 30), 'actionBindings':{}, 'label':'...', }, {'type':'Button', 'name':'installerPathHelpBtn', 'position':(650, 275), 'size':(30, 30), 'actionBindings':{}, 'label':'?', }, {'type':'TextField', 'name':'appPublisher', 'position':(205, 310), 'size':(405, -1), 'actionBindings':{}, 'userdata':"Defines the name which will be used to add an 'AppPublisher' entry to your Inno script file. This name will appear when someone does a right click on your standalone executable and selects 'properties'.", }, {'type':'Button', 'name':'appPublisherHelpBtn', 'position':(650, 305), 'size':(30, 30), 'actionBindings':{}, 'label':'?', }, {'type':'Button', 'id':5100, 'name':'btnOK', 'position':(520, 355), 'actionBindings':{}, 'label':'OK', }, {'type':'Button', 'id':5101, 'name':'btnCancel', 'position':(610, 355), 'actionBindings':{}, 'label':'Cancel', }, {'type':'StaticText', 'name':'StaticText2', 'position':(80, 185), 'actionBindings':{}, 'text':'Projects directory:', }, {'type':'StaticText', 'name':'StaticText7', 'position':(70, 155), 'actionBindings':{}, 'text':'Inno setup compiler:', }, {'type':'StaticText', 'name':'StaticText5', 'position':(45, 125), 'actionBindings':{}, 'text':'Preferred pixmap editor:', }, {'type':'StaticText', 'name':'StaticText9', 'position':(90, 95), 'actionBindings':{}, 'text':'Plain text editor:', }, {'type':'StaticText', 'name':'StaticText4', 'position':(45, 65), 'actionBindings':{}, 'text':'PythonCard code editor:', }, {'type':'StaticText', 'name':'StaticText3', 'position':(20, 35), 'actionBindings':{}, 'text':'PythonCard resource editor:', }, {'type':'StaticBox', 'name':'StaticBox1', 'position':(10, 5), 'size':(685, 215), 'actionBindings':{}, 'label':'Paths to external files', }, {'type':'StaticText', 'name':'StaticText6', 'position':(90, 315), 'actionBindings':{}, 'text':'Publisher name:', }, {'type':'StaticText', 'name':'StaticText1', 'position':(75, 285), 'actionBindings':{}, 'text':'Path to pyInstaller:', }, {'type':'StaticText', 'name':'StaticText8', 'position':(70, 255), 'actionBindings':{}, 'text':'Preferred build tool:', }, {'type':'StaticBox', 'name':'StaticBox2', 'position':(10, 225), 'size':(685, 125), 'actionBindings':{}, 'label':'Other settings', }, ] # end components } # end CustomDialog PythonCard-0.8.2/tools/standaloneBuilder/prefsDialog.rsrc.py0000755000076500007650000001437210431133454024102 0ustar alexalex00000000000000{'type':'CustomDialog', 'name':'prefsDialog', 'title':'standaloneBuilder Preferences', 'position':(123, 38), 'size':(665, 415), 'components': [ {'type':'TextField', 'name':'resEditPath', 'position':(165, 25), 'size':(405, -1), 'userdata':'Select the location on your computer where the PythonCard resource editor is installed.', }, {'type':'Button', 'name':'resEditPathBtn', 'position':(580, 25), 'size':(25, -1), 'label':'...', }, {'type':'Button', 'name':'resEditPathHelpBtn', 'position':(610, 25), 'size':(25, -1), 'label':'?', }, {'type':'TextField', 'name':'srcEditPath', 'position':(165, 55), 'size':(405, -1), 'userdata':'Select the location on your computer where the PythonCard source code editor is installed.\n', }, {'type':'Button', 'name':'srcEditPathBtn', 'position':(580, 55), 'size':(25, -1), 'label':'...', }, {'type':'Button', 'name':'srcEditPathHelpBtn', 'position':(610, 55), 'size':(25, -1), 'label':'?', }, {'type':'TextField', 'name':'txtEditPath', 'position':(165, 85), 'size':(405, -1), 'userdata':'Select the location on your computer where the PythonCard source code editor is installed.\n', }, {'type':'Button', 'name':'txtEditPathBtn', 'position':(580, 85), 'size':(25, -1), 'label':'...', }, {'type':'Button', 'name':'txtEditPathHelpBtn', 'position':(610, 85), 'size':(25, -1), 'label':'?', }, {'type':'TextField', 'name':'pixmapEditPath', 'position':(165, 115), 'size':(405, -1), 'userdata':'Select the location on your computer where your preferred pixmap editor is installed.\n', }, {'type':'Button', 'name':'pixmapEditPathBtn', 'position':(580, 115), 'size':(25, -1), 'label':'...', }, {'type':'Button', 'name':'pixmapEditPathHelpBtn', 'position':(610, 115), 'size':(25, -1), 'label':'?', }, {'type':'TextField', 'name':'compilerPath', 'position':(165, 145), 'size':(405, -1), 'userdata':'Select the location on your computer where the Inno setup compiler is installed.', }, {'type':'Button', 'name':'compilerPathBtn', 'position':(580, 145), 'size':(25, -1), 'label':'...', }, {'type':'Button', 'name':'compilerPathHelpBtn', 'position':(610, 145), 'size':(25, 25), 'label':'?', }, {'type':'TextField', 'name':'projectsPath', 'position':(165, 175), 'size':(405, -1), 'userdata':'Select the location on your computer where you normally keep your PythonCard projects.', }, {'type':'Button', 'name':'projectsPathBtn', 'position':(580, 175), 'size':(25, -1), 'label':'...', }, {'type':'Button', 'name':'projectsPathHelpBtn', 'position':(610, 175), 'size':(25, -1), 'label':'?', }, {'type':'Choice', 'name':'buildTool', 'position':(165, 245), 'size':(130, -1), 'items':[u'py2exe', u'pyInstaller'], 'stringSelection':'pyInstaller', 'userdata':'Select the tool which you would prefer to use when building the executables for your projects.', }, {'type':'Button', 'name':'buildToolHelpBtn', 'position':(610, 245), 'size':(25, -1), 'label':'?', }, {'type':'TextField', 'name':'installerPath', 'position':(165, 275), 'size':(405, -1), 'userdata':'Select the location on your computer where the pyInstaller software is installed. Note that standaloneBuilder assumes that you have already configured this according to the documentation that comes with it.\n', }, {'type':'Button', 'name':'installerPathBtn', 'position':(580, 275), 'size':(25, -1), 'label':'...', }, {'type':'Button', 'name':'installerPathHelpBtn', 'position':(610, 275), 'size':(25, -1), 'label':'?', }, {'type':'TextField', 'name':'appPublisher', 'position':(165, 305), 'size':(405, -1), 'userdata':"Defines the name which will be used to add an 'AppPublisher' entry to your Inno script file. This name will appear when someone does a right click on your standalone executable and selects 'properties'.", }, {'type':'Button', 'name':'appPublisherHelpBtn', 'position':(610, 305), 'size':(25, -1), 'label':'?', }, {'type':'Button', 'id':5100, 'name':'btnOK', 'position':(495, 355), 'label':'OK', }, {'type':'Button', 'id':5101, 'name':'btnCancel', 'position':(575, 355), 'label':'Cancel', }, {'type':'StaticText', 'name':'StaticText2', 'position':(70, 180), 'text':'Projects directory:', }, {'type':'StaticText', 'name':'StaticText7', 'position':(60, 150), 'text':'Inno setup compiler:', }, {'type':'StaticText', 'name':'StaticText5', 'position':(40, 120), 'text':'Preferred pixmap editor:', }, {'type':'StaticText', 'name':'StaticText9', 'position':(80, 90), 'text':'Plain text editor:', }, {'type':'StaticText', 'name':'StaticText4', 'position':(40, 60), 'text':'PythonCard code editor:', }, {'type':'StaticText', 'name':'StaticText3', 'position':(20, 30), 'text':'PythonCard resource editor:', }, {'type':'StaticBox', 'name':'StaticBox1', 'position':(5, 0), 'size':(645, 215), 'label':'Paths to external files', }, {'type':'StaticText', 'name':'StaticText6', 'position':(80, 310), 'text':'Publisher name:', }, {'type':'StaticText', 'name':'StaticText1', 'position':(65, 280), 'text':'Path to pyInstaller:', }, {'type':'StaticText', 'name':'StaticText8', 'position':(60, 250), 'text':'Preferred build tool:', }, {'type':'StaticBox', 'name':'StaticBox2', 'position':(5, 220), 'size':(645, 125), 'label':'Other settings', }, ] # end components } # end CustomDialog PythonCard-0.8.2/tools/standaloneBuilder/propertiesDialog.gtk.rsrc.py0000644000076500007650000001060110431133454025727 0ustar alexalex00000000000000{'type':'CustomDialog', 'name':'propertiesDialog', 'title':'Project properties', 'position':(468, 29), 'size':(450, 385), 'components': [ {'type':'TextField', 'name':'buildPath', 'position':(130, 5), 'size':(265, -1), 'actionBindings':{}, }, {'type':'Button', 'name':'buildPathBtn', 'position':(400, 5), 'size':(25, 22), 'actionBindings':{}, 'label':'...', }, {'type':'TextField', 'name':'distPath', 'position':(130, 40), 'size':(265, -1), 'actionBindings':{}, }, {'type':'Button', 'name':'distPathBtn', 'position':(400, 40), 'size':(25, 22), 'actionBindings':{}, 'label':'...', }, {'type':'TextField', 'name':'pixmapsPath', 'position':(130, 75), 'size':(265, -1), 'actionBindings':{}, }, {'type':'Button', 'name':'pixmapsPathBtn', 'position':(400, 75), 'size':(25, 22), 'actionBindings':{}, 'label':'...', }, {'type':'TextField', 'name':'tarballPath', 'position':(130, 110), 'size':(265, -1), 'actionBindings':{}, }, {'type':'Button', 'name':'tarballsPathBtn', 'position':(400, 110), 'size':(25, 22), 'actionBindings':{}, 'label':'...', }, {'type':'TextField', 'name':'appPublisher', 'position':(130, 145), 'size':(265, -1), 'actionBindings':{}, }, {'type':'TextField', 'name':'appURL', 'position':(130, 180), 'size':(265, -1), 'actionBindings':{}, }, {'type':'TextField', 'name':'appLicence', 'position':(130, 215), 'size':(265, -1), 'actionBindings':{}, }, {'type':'Button', 'name':'appLicenceBtn', 'position':(400, 215), 'size':(25, 22), 'actionBindings':{}, 'label':'...', }, {'type':'Choice', 'name':'buildType', 'position':(125, 250), 'size':(140, -1), 'actionBindings':{}, 'items':[u'Single file', u'Single directory'], 'stringSelection':'Single directory', }, {'type':'CheckBox', 'name':'asciiChk', 'position':(120, 285), 'actionBindings':{}, 'label':'No encoding', }, {'type':'CheckBox', 'name':'consoleChk', 'position':(250, 285), 'actionBindings':{}, 'label':'Console', }, {'type':'CheckBox', 'name':'compressChk', 'position':(345, 285), 'actionBindings':{}, 'label':'Compress', }, {'type':'CheckBox', 'name':'striplibsChk', 'position':(120, 305), 'actionBindings':{}, 'label':'Strip libs (Linux)', }, {'type':'CheckBox', 'name':'optimizeChk', 'position':(250, 305), 'actionBindings':{}, 'label':'Optimize', }, {'type':'CheckBox', 'name':'debugChk', 'position':(345, 305), 'actionBindings':{}, 'label':'Debug', }, {'type':'Button', 'id':5100, 'name':'btnOK', 'position':(270, 340), 'actionBindings':{}, 'label':'OK', }, {'type':'Button', 'id':5101, 'name':'btnCancel', 'position':(355, 340), 'actionBindings':{}, 'label':'Cancel', }, {'type':'StaticText', 'name':'StaticText9', 'position':(25, 220), 'actionBindings':{}, 'text':'App licence file', }, {'type':'StaticText', 'name':'StaticText8', 'position':(20, 185), 'actionBindings':{}, 'text':'Application URL', }, {'type':'StaticText', 'name':'StaticText7', 'position':(30, 150), 'actionBindings':{}, 'text':'App publisher', }, {'type':'StaticText', 'name':'StaticText6', 'position':(30, 285), 'actionBindings':{}, 'text':'Build options', }, {'type':'StaticText', 'name':'StaticText5', 'position':(15, 255), 'actionBindings':{}, 'text':'Deployment type', }, {'type':'StaticText', 'name':'StaticText4', 'position':(15, 115), 'actionBindings':{}, 'text':'Tarballs directory', }, {'type':'StaticText', 'name':'StaticText3', 'position':(15, 80), 'actionBindings':{}, 'text':'Pixmaps directory', }, {'type':'StaticText', 'name':'StaticText2', 'position':(5, 45), 'actionBindings':{}, 'text':'Distribution directory', }, {'type':'StaticText', 'name':'StaticText1', 'position':(30, 10), 'actionBindings':{}, 'text':'Build directory', }, ] # end components } # end CustomDialog PythonCard-0.8.2/tools/standaloneBuilder/propertiesDialog.rsrc.py0000755000076500007650000000716310227755536025175 0ustar alexalex00000000000000{'type':'CustomDialog', 'name':'propertiesDialog', 'title':'Project properties', 'position':(555, 29), 'size':(430, 395), 'components': [ {'type':'TextField', 'name':'buildPath', 'position':(115, 5), 'size':(265, -1), }, {'type':'Button', 'name':'buildPathBtn', 'position':(385, 5), 'size':(25, 22), 'label':'...', }, {'type':'TextField', 'name':'distPath', 'position':(115, 40), 'size':(265, -1), }, {'type':'Button', 'name':'distPathBtn', 'position':(385, 40), 'size':(25, 22), 'label':'...', }, {'type':'TextField', 'name':'pixmapsPath', 'position':(115, 75), 'size':(265, -1), }, {'type':'Button', 'name':'pixmapsPathBtn', 'position':(385, 75), 'size':(25, 22), 'label':'...', }, {'type':'TextField', 'name':'tarballPath', 'position':(115, 110), 'size':(265, -1), }, {'type':'Button', 'name':'tarballsPathBtn', 'position':(385, 110), 'size':(25, 22), 'label':'...', }, {'type':'TextField', 'name':'appPublisher', 'position':(115, 145), 'size':(265, -1), }, {'type':'TextField', 'name':'appURL', 'position':(115, 180), 'size':(265, -1), }, {'type':'TextField', 'name':'appLicence', 'position':(115, 215), 'size':(265, -1), }, {'type':'Button', 'name':'appLicenceBtn', 'position':(385, 215), 'size':(25, 22), 'label':'...', }, {'type':'Choice', 'name':'buildType', 'position':(110, 250), 'size':(125, -1), 'items':[u'Single file', u'Single directory'], 'stringSelection':'Single directory', }, {'type':'CheckBox', 'name':'asciiChk', 'position':(105, 285), 'label':'No encoding', }, {'type':'CheckBox', 'name':'consoleChk', 'position':(220, 285), 'label':'Console', }, {'type':'CheckBox', 'name':'compressChk', 'position':(315, 285), 'label':'Compress', }, {'type':'CheckBox', 'name':'striplibsChk', 'position':(105, 305), 'label':'Strip libs (Linux)', }, {'type':'CheckBox', 'name':'optimizeChk', 'position':(220, 305), 'label':'Optimize', }, {'type':'CheckBox', 'name':'debugChk', 'position':(315, 305), 'label':'Debug', }, {'type':'Button', 'id':5100, 'name':'btnOK', 'position':(10, 340), 'label':'OK', }, {'type':'Button', 'id':5101, 'name':'btnCancel', 'position':(95, 340), 'label':'Cancel', }, {'type':'StaticText', 'name':'StaticText9', 'position':(25, 220), 'text':'App licence file', }, {'type':'StaticText', 'name':'StaticText8', 'position':(20, 185), 'text':'Application URL', }, {'type':'StaticText', 'name':'StaticText7', 'position':(30, 150), 'text':'App publisher', }, {'type':'StaticText', 'name':'StaticText6', 'position':(30, 285), 'text':'Build options', }, {'type':'StaticText', 'name':'StaticText5', 'position':(15, 255), 'text':'Deployment type', }, {'type':'StaticText', 'name':'StaticText4', 'position':(15, 115), 'text':'Tarballs directory', }, {'type':'StaticText', 'name':'StaticText3', 'position':(15, 80), 'text':'Pixmaps directory', }, {'type':'StaticText', 'name':'StaticText2', 'position':(5, 45), 'text':'Distribution directory', }, {'type':'StaticText', 'name':'StaticText1', 'position':(30, 10), 'text':'Build directory', }, ] # end components } # end CustomDialog PythonCard-0.8.2/tools/standaloneBuilder/readme.txt0000755000076500007650000000333510431133454022314 0ustar alexalex00000000000000standaloneBuilder tool version 0.2.0 This version of standaloneBuilder ought to be quite stable and usable in most circumstances. There are still some limitations: 1. The MacOS platform is not currently supported. As I don't own a Mac, this will have to be addressed by someone else! 2. You can only create projects in subdirectories of the main projects directory specified in your preferences. This is annoying, and will be fixed in the next release. 3. The online manual feature has not yet been implemented. 4. The program is not able to manage non-PythonCard projects. 5. The build mechanism is still relatively simple-minded - a number of the more advanced features of pyInstaller and py2exe are not fully supported. 6. At the time of writing (May 2006) the current stable version of pyInstaller is version 1.1 - this version has a bug which leads to executables being corrupted when a Win32 Icon resource is inserted into the .EXE file. This means it will be necessary to install the unstable development snapshot of pyInstaller until such time as version 1.2 is released. 7. The program does not work too well when trying to use external programs other than the regular PythonCard tools, i.e. code editor and resource editor. Please refer to the changelog.txt file for a full list of changes made in this release. Feedback or bug reports can be sent to the PythonCard users mailing list, https://lists.sourceforge.net/lists/listinfo/pythoncard-users Useful links: PythonCard main website: http://pythoncard.sourceforge.net/ pyInstaller website: http://pyinstaller.hpcf.upr.edu/cgi-bin/trac.cgi py2exe website: http://www.py2exe.org/ Inno Setup website: http://www.jrsoftware.org/isinfo.php PythonCard-0.8.2/tools/standaloneBuilder/standaloneBuilder.gtk.rsrc.py0000644000076500007650000003626110431133454026064 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'Template', 'backgrounds': [ {'type':'Background', 'name':'standaloneBuilder', 'title':u'PythonCard standaloneBuilder', 'size':(800, 610), 'statusBar':1, 'menubar': {'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ {'type':'MenuItem', 'name':'menuFileNew', 'label':'&New\tCtrl+N', 'command':'newBtn', }, {'type':'MenuItem', 'name':'menuFileOpen', 'label':'&Open\tCtrl+O', 'command':'openBtn', }, {'type':'MenuItem', 'name':'menuFileSave', 'label':'&Save\tCtrl+S', 'command':'saveBtn', }, {'type':'MenuItem', 'name':'menuFileSaveAs', 'label':'Save &As...', }, {'type':'MenuItem', 'name':'fileSep2', 'label':'-', }, {'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'menuFileExit', }, ] }, {'type':'Menu', 'name':'Edit', 'label':'&Edit', 'items': [ {'type':'MenuItem', 'name':'menuEditMainScript', 'label':u'&Main script...', 'command':'EditMainScript', }, {'type':'MenuItem', 'name':'menuEditChglog', 'label':u'&Changelog...', 'command':'editChgLog', }, {'type':'MenuItem', 'name':'menuEditReadme', 'label':u'&README...', 'command':'editReadme', }, {'type':'MenuItem', 'name':'menuEditSpecfile', 'label':u'&Spec file...', 'command':'editSpecFile', }, {'type':'MenuItem', 'name':'menuEditInnoFile', 'label':u'&Inno script...', 'command':'editInnoFile', }, {'type':'MenuItem', 'name':'menuEditProps', 'label':u'&Project properties...', 'command':'editProps', }, {'type':'MenuItem', 'name':'editSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditPrefs', 'label':u'&Preferences...', 'command':'editPrefs', }, ] }, {'type':'Menu', 'name':'menuTools', 'label':'&Tools', 'items': [ {'type':'MenuItem', 'name':'menuToolsLogAdd', 'label':u'A&dd changelog entry...\tShift++', 'command':'menuToolsLogAdd', }, {'type':'MenuItem', 'name':'menuToolsChkImport', 'label':u'&Check component imports', 'command':'menuToolsChkImport', }, {'type':'MenuItem', 'name':'toolSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuToolsAddScript', 'label':u'Add &script...', 'command':'addScript', }, {'type':'MenuItem', 'name':'menuToolsAddResource', 'label':u'Add &resource...', 'command':'addResource', }, {'type':'MenuItem', 'name':'menuToolsAddPixmap', 'label':u'Add &pixmap...', 'command':'addPixmap', }, {'type':'MenuItem', 'name':'menuToolsAddOther', 'label':u'Add &other...', 'command':'addOther', }, {'type':'MenuItem', 'name':'toolSep2', 'label':u'-', }, {'type':'MenuItem', 'name':'menuToolsRunMain', 'label':u'Run &main script', 'command':'runMainScript', }, {'type':'MenuItem', 'name':'toolSep3', 'label':u'-', }, {'type':'MenuItem', 'name':'menuToolsRebuild', 'label':'R&ebuild\tCtrl+R', 'command':'rebuildCmd', }, {'type':'MenuItem', 'name':'menuToolsRelease', 'label':u'&Release\tCtrl+M', 'command':'releaseCmd', }, ] }, {'type':'Menu', 'name':'menuHelp', 'label':'&Help', 'items': [ {'type':'MenuItem', 'name':'menuHelpManual', 'label':u'&Manual', 'command':'menuHelpManual', }, {'type':'MenuItem', 'name':'menuHelpAbout', 'label':u'&About standaloneBuilder...', 'command':'menuHelpAbout', }, ] }, ] }, 'strings': { u'testString':u'This is a test string', }, 'components': [ {'type':'Button', 'name':'mainScriptEditBtn', 'position':(375, 120), 'size':(52, 25), 'actionBindings':{}, 'command':'EditMainScript', 'font':{'faceName': u'Sans', 'size': 8}, 'label':'Edit...', 'toolTip':'Edit the main script', }, {'type':'StaticText', 'name':'versionString', 'position':(560, 125), 'actionBindings':{}, 'text':'n/a', }, {'type':'ImageButton', 'name':'newBtn', 'position':(5, 5), 'size':(38, 38), 'actionBindings':{}, 'backgroundColor':(255, 255, 255), 'border':'3d', 'command':'newBtn', 'file':'pixmaps/new.png', 'toolTip':'Create a new project', 'userdata':'frozen', }, {'type':'ImageButton', 'name':'openBtn', 'position':(40, 5), 'size':(38, 38), 'actionBindings':{}, 'backgroundColor':(255, 255, 255), 'border':'3d', 'command':'openBtn', 'file':'pixmaps/open.png', 'toolTip':'Open an existing project', 'userdata':'frozen', }, {'type':'ImageButton', 'name':'saveBtn', 'position':(75, 5), 'size':(38, 38), 'actionBindings':{}, 'backgroundColor':(255, 255, 255), 'border':'3d', 'command':'saveBtn', 'file':'pixmaps/save.png', 'toolTip':'Save the current project', 'userdata':'frozen', }, {'type':'ImageButton', 'name':'prefsBtn', 'position':(705, 5), 'size':(38, 38), 'actionBindings':{}, 'backgroundColor':(255, 255, 255), 'border':'3d', 'command':'editPrefs', 'file':'pixmaps/prefs.png', 'toolTip':'standaloneBuilder preferences', 'userdata':'frozen', }, {'type':'ImageButton', 'name':'quitBtn', 'position':(750, 5), 'size':(38, 38), 'actionBindings':{}, 'backgroundColor':(255, 255, 255), 'border':'3d', 'command':'quitBtn', 'file':'pixmaps/exit.png', 'toolTip':'Quit the program', 'userdata':'frozen', }, {'type':'TextField', 'name':'projectName', 'position':(95, 60), 'size':(250, -1), 'actionBindings':{}, }, {'type':'TextField', 'name':'projectIcon', 'position':(500, 60), 'size':(250, -1), 'actionBindings':{}, }, {'type':'Button', 'name':'iconBtn', 'position':(755, 60), 'size':(25, 25), 'actionBindings':{}, 'label':'...', }, {'type':'TextField', 'name':'baseDir', 'position':(95, 90), 'size':(250, -1), 'actionBindings':{}, }, {'type':'Button', 'name':'baseDirBtn', 'position':(350, 90), 'size':(25, 25), 'actionBindings':{}, 'label':'...', }, {'type':'TextField', 'name':'projectDesc', 'position':(500, 90), 'size':(250, -1), 'actionBindings':{}, }, {'type':'TextField', 'name':'mainScript', 'position':(95, 120), 'size':(250, -1), 'actionBindings':{}, }, {'type':'Button', 'name':'mainScriptBtn', 'position':(350, 120), 'size':(25, 25), 'actionBindings':{}, 'label':'...', }, {'type':'StaticBox', 'name':'StaticBox2', 'position':(5, 165), 'size':(380, 160), 'actionBindings':{}, 'label':'Script files:', }, {'type':'List', 'name':'scriptList', 'position':(15, 180), 'size':(360, 100), 'actionBindings':{}, 'items':[], }, {'type':'Button', 'name':'scriptAddBtn', 'position':(15, 285), 'actionBindings':{}, 'command':'addScript', 'label':'Add...', }, {'type':'Button', 'name':'scriptDelBtn', 'position':(100, 285), 'actionBindings':{}, 'label':'Remove', }, {'type':'Button', 'name':'scriptEditBtn', 'position':(185, 285), 'actionBindings':{}, 'label':'Edit...', }, {'type':'Button', 'name':'scriptDelAllBtn', 'position':(295, 285), 'actionBindings':{}, 'label':'Clear all', }, {'type':'StaticBox', 'name':'StaticBox3', 'position':(405, 165), 'size':(380, 160), 'actionBindings':{}, 'label':'Resource files:', }, {'type':'List', 'name':'resList', 'position':(415, 180), 'size':(360, 100), 'actionBindings':{}, 'items':[], }, {'type':'Button', 'name':'resAddBtn', 'position':(415, 285), 'actionBindings':{}, 'command':'addResource', 'label':'Add..', }, {'type':'Button', 'name':'resDelBtn', 'position':(500, 285), 'actionBindings':{}, 'label':'Remove', }, {'type':'Button', 'name':'resEditBtn', 'position':(585, 285), 'actionBindings':{}, 'label':'Edit...', }, {'type':'Button', 'name':'resDelAllBtn', 'position':(695, 285), 'actionBindings':{}, 'label':'Clear all', }, {'type':'StaticBox', 'name':'StaticBox4', 'position':(5, 325), 'size':(380, 160), 'actionBindings':{}, 'label':'Pixmap files:', }, {'type':'List', 'name':'pixmapList', 'position':(15, 340), 'size':(360, 100), 'actionBindings':{}, 'items':[], }, {'type':'Button', 'name':'pixmapAddBtn', 'position':(15, 445), 'actionBindings':{}, 'command':'addPixmap', 'label':'Add...', }, {'type':'Button', 'name':'pixmapDelBtn', 'position':(100, 445), 'actionBindings':{}, 'label':'Remove', }, {'type':'Button', 'name':'pixmapEditBtn', 'position':(185, 445), 'actionBindings':{}, 'label':'Edit...', }, {'type':'Button', 'name':'pixmapDelAllBtn', 'position':(295, 445), 'actionBindings':{}, 'label':'Clear all', }, {'type':'StaticBox', 'name':'StaticBox5', 'position':(405, 325), 'size':(380, 160), 'actionBindings':{}, 'label':'Other files:', }, {'type':'List', 'name':'otherList', 'position':(415, 340), 'size':(360, 100), 'actionBindings':{}, 'items':[], }, {'type':'Button', 'name':'docAddBtn', 'position':(415, 445), 'actionBindings':{}, 'command':'addOther', 'label':'Add...', }, {'type':'Button', 'name':'docDelBtn', 'position':(500, 445), 'actionBindings':{}, 'label':'Remove', }, {'type':'Button', 'name':'docEditBtn', 'position':(585, 445), 'actionBindings':{}, 'label':'Edit...', }, {'type':'Button', 'name':'docDelAllBtn', 'position':(695, 445), 'actionBindings':{}, 'label':'Clear all', }, {'type':'Button', 'name':'propertiesBtn', 'position':(15, 490), 'size':(85, -1), 'actionBindings':{}, 'command':'editProps', 'label':'Properties...', 'toolTip':'Change your projects properties', }, {'type':'Button', 'name':'changelogBtn', 'position':(100, 490), 'size':(85, -1), 'actionBindings':{}, 'command':'editChgLog', 'label':'Changelog...', 'toolTip':'Edit the changelog file', }, {'type':'Button', 'name':'readmeBtn', 'position':(100, 525), 'actionBindings':{}, 'command':'editReadme', 'label':'README...', 'toolTip':'Edit the README file', }, {'type':'Button', 'name':'specBtn', 'position':(185, 490), 'actionBindings':{}, 'command':'editSpecFile', 'label':'Spec file...', 'toolTip':'Edit the applications spec file', }, {'type':'Button', 'name':'innoBtn', 'position':(185, 525), 'size':(85, -1), 'actionBindings':{}, 'command':'editInnoFile', 'label':'Inno script...', 'toolTip':'Edit the Inno setup script for your application', }, {'type':'Button', 'name':'runBtn', 'position':(295, 490), 'actionBindings':{}, 'command':'runMainScript', 'label':'Run...', 'toolTip':'Run the application', }, {'type':'Button', 'name':'rebuildBtn', 'position':(695, 490), 'actionBindings':{}, 'command':'rebuildCmd', 'label':'Rebuild', 'toolTip':'Rebuild the standalone version of your application', 'userdata':'frozen', }, {'type':'Button', 'name':'releaseBtn', 'position':(695, 525), 'actionBindings':{}, 'command':'releaseCmd', 'label':'Release', 'toolTip':'Make a release of your finished application', 'userdata':'frozen', }, {'type':'StaticBox', 'name':'StaticBox1', 'position':(5, 45), 'size':(780, 115), 'actionBindings':{}, 'label':'Project:', }, {'type':'StaticText', 'name':'StaticText5', 'position':(15, 125), 'actionBindings':{}, 'text':'Main script', }, {'type':'StaticText', 'name':'StaticText4', 'position':(420, 95), 'actionBindings':{}, 'text':'Description', }, {'type':'StaticText', 'name':'StaticText9', 'position':(430, 65), 'actionBindings':{}, 'text':'Icon (Win)', }, {'type':'StaticText', 'name':'StaticText8', 'position':(500, 125), 'actionBindings':{}, 'text':'Version', }, {'type':'StaticText', 'name':'StaticText7', 'position':(15, 95), 'actionBindings':{}, 'text':'Directory', }, {'type':'StaticText', 'name':'StaticText6', 'position':(15, 65), 'actionBindings':{}, 'text':'Name', }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/tools/standaloneBuilder/standaloneBuilder.py0000755000076500007650000030715710431133454024340 0ustar alexalex00000000000000#!/usr/bin/python # # PythonCard standaloneBuilder tool - Phil Edwards # Copyright (c) 2001-2005 PythonCard developers # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. 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. # 3. The name of the author may not be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. # # vim: ai et sw=4 ts=4 # standard imports import os import sys import ConfigParser import time import pprint # pythoncard imports import wx from wxPython.html import wxHtmlEasyPrinting from PythonCard import dialog, model, util from PythonCard.templates.dialogs import runOptionsDialog # local imports from customDialogs import * import outputWindow # temporary hack until we get it working properly under MacOS if wx.Platform == '__WXMAC__': from wxPython.wx import wxPySimpleApp, wxFrame, wxMessageDialog, wxICON_EXCLAMATION, wxOK, wxVERSION_STRING app = wxPySimpleApp() title = 'Sorry!' frame = wxFrame(None, -1, title) message = 'standaloneBuilder currently does not work properly under MacOS. This shortcoming will ' message += 'be fixed in a future release.\n\nClick OK to exit.' dialog = wxMessageDialog(frame, wrap_string(message, 52), title, wxICON_EXCLAMATION | wxOK) dialog.ShowModal() dialog.Destroy() sys.exit(0) if sys.platform.startswith('win'): try: from win32api import GetShortPathName import versionInfo except ImportError: from wxPython.wx import wxPySimpleApp, wxFrame, wxMessageDialog, wxICON_EXCLAMATION, wxOK, wxVERSION_STRING app = wxPySimpleApp() title = 'Required component missing' frame = wxFrame(None, -1, title) message = "standaloneBuilder requires that you have a version of the Python win32 extensions " + \ "installed - this appears to be missing from your system.\n\nClick OK to exit." dialog = wxMessageDialog(frame, wrap_string(message, 60), title, wxICON_EXCLAMATION | wxOK) dialog.ShowModal() dialog.Destroy() sys.exit(0) else: import commands # imports required by mcmillan installer #from PythonCard.components import statictext, imagebutton, textfield, \ # textarea, list, staticbox, checkbox, choice from PythonCard.components import button, checkbox, choice, htmlwindow, image, imagebutton, list, spinner, staticbox, statictext, textarea, textfield class standaloneBuilder(model.Background): ############################################################################## # generic pythoncard event handlers # ############################################################################## def on_initialize(self, event): self.str = self.resource.strings self.startTitle = self.GetTitle() self.loadConfig() # start with almost all of the UI disabled for comp in self.components.keys(): self.components[comp].enabled = False self.components.newBtn.enabled = True self.components.openBtn.enabled = True self.components.prefsBtn.enabled = True self.components.quitBtn.enabled = True # likewise, start with almost all of the menu disabled self.menuBar.setEnabled('menuFileNew', True) self.menuBar.setEnabled('menuFileOpen', True) self.menuBar.setEnabled('menuFileSave', False) self.menuBar.setEnabled('menuFileSaveAs', False) self.menuBar.setEnabled('menuFileExit', True) self.menuBar.setEnabled('menuEditMainScript', False) self.menuBar.setEnabled('menuEditChglog', False) self.menuBar.setEnabled('menuEditReadme', False) self.menuBar.setEnabled('menuEditSpecfile', False) self.menuBar.setEnabled('menuEditInnoFile', False) self.menuBar.setEnabled('menuEditProps', False) self.menuBar.setEnabled('menuEditPrefs', True) self.menuBar.setEnabled('menuToolsLogAdd', False) self.menuBar.setEnabled('menuToolsChkImport', False) self.menuBar.setEnabled('menuToolsAddScript', False) self.menuBar.setEnabled('menuToolsAddResource', False) self.menuBar.setEnabled('menuToolsAddPixmap', False) self.menuBar.setEnabled('menuToolsAddOther', False) self.menuBar.setEnabled('menuToolsRunMain', False) self.menuBar.setEnabled('menuToolsRebuild', False) self.menuBar.setEnabled('menuToolsRelease', False) self.menuBar.setEnabled('menuHelpManual', True) self.menuBar.setEnabled('menuHelpAbout', True) self.documentChanged = False self.cmdLineArgs = {'debugmenu':False, 'logging':False, 'messagewatcher':False, 'namespaceviewer':False, 'propertyeditor':False, 'shell':False, 'otherargs':''} if sys.platform.startswith('win32'): self.PATHSEP = os.sep + os.sep else: self.PATHSEP = os.sep self.setupCode = open('templates/setup.py').read() self.outputWindow = model.childWindow(self, outputWindow.outputWindow) def on_close(self, event): if self.doExit(): event.Skip() def on_menuFileExit_command(self, event): self.close() ########################################################################## # top level routines - menu code # ########################################################################## def on_menuFileSaveAs_select(self, event): wildcard = "Project files (*.pmr)|*.pmr;*.PMR|All files (*.*)|*.*" if self.documentPath is None: dir = os.path.join(self.cfg.get('ConfigData', 'projects'), self.components.baseDir.text) if sys.platform.startswith('win'): filename = '%s.pmr' % self.components.projectName.text else: filename = 'Untitled.pmr' else: dir = os.path.dirname(self.documentPath) filename = os.path.basename(self.documentPath) result = dialog.saveFileDialog(None, "Save As", dir, filename, wildcard) if result.accepted: path = result.paths[0] self.saveFile(path) return 1 else: return 0 def on_menuToolsLogAdd_command(self, event): vstring = string.split(self.components.versionString.text, '.') template = {} template['name'] = self.components.projectName.text template['major'] = vstring[0] template['minor'] = vstring[1] template['fix'] = vstring[2] basedir = os.path.join(self.cfg.get('ConfigData', 'projects'), self.components.baseDir.text) chglog = os.path.join(basedir, 'changelog.txt') if not os.path.exists(chglog): fd = open(chglog, 'w') tmplfile = os.path.join('templates', 'changelog.txt') chglogData = open(tmplfile, 'r').read() chglogData = chglogData % template dashes = '-' * len(chglogData) fd.write(chglogData + '\n') fd.write(dashes + '\n') fd.close() # add a new changelog entry result = dialog.multilineTextEntryDialog(self, 'Add Changelog Entry', 'Enter the new text below, and click OK:') if result.accepted: fmtstring = string.split(wrap_string(result.text, 65), '\n') infd = open(chglog, 'r') outfd = open(chglog + '-new', 'w') # keep the top 2 lines of the existing file outfd.write(infd.readline()) outfd.write(infd.readline()) # write out the new entry for cnt in range(len(fmtstring)): if fmtstring[cnt] != '': if cnt == 0: outfd.write(' - ' + fmtstring[cnt] + '\n') else: outfd.write(' ' + fmtstring[cnt] + '\n') # then write out all the remaining entries ln = infd.readline() while ln: outfd.write(ln) ln = infd.readline() infd.close() outfd.close() os.unlink(chglog) os.rename(chglog + '-new', chglog) def on_menuToolsChkImport_command(self, event): if self.components.mainScript.text != '': impFound, impLine = self.checkImports() if not impFound: self.outputWindow.components.clipBoardBtn.userdata = impLine self.outputWindow.components.txt5.enabled = False self.outputWindow.components.txt5.visible = False self.outputWindow.components.returnedText.enabled = False self.outputWindow.components.returnedText.visible = False self.outputWindow.components.importError.enabled = True self.outputWindow.components.importError.visible = True self.outputWindow.SetTitle('PythonCard Component Import Check') self.outputWindow.Show() self.outputWindow.clearLines() self.outputWindow.components.txt1a.visible = False # rebuilding spec file self.outputWindow.components.txt1b.visible = False # done self.outputWindow.components.txt2a.visible = False # rebuilding versioninfo file self.outputWindow.components.txt2b.visible = False # done self.outputWindow.components.txt3a.visible = False # rebuilding application self.outputWindow.components.txt3b.visible = False # done self.outputWindow.components.txt3c.visible = False # please wait... self.outputWindow.components.txt4a.visible = False # rebuilding distributable self.outputWindow.components.txt4b.visible = False # done self.outputWindow.components.txt4c.visible = False # please wait #self.outputWindow.components.clipBoardBtn.visible = True txt = 'The main script should include the following import statement on a ' self.outputWindow.addLine(txt) txt = 'single line:\n\n' self.outputWindow.addLine(txt) txt = impLine + '\n\n' self.outputWindow.addLine(txt) if sys.platform.startswith('win'): self.outputWindow.components.clipBoardBtn.visible = True txt = 'Click the \'Clipboard\' button below to place this line on ' self.outputWindow.addLine(txt) txt = 'the clipboard ready to be pasted into your code.' self.outputWindow.addLine(txt) else: self.outputWindow.components.clipBoardBtn.visible = False txt = 'Copy and paste this line into your code before rebuilding.' self.outputWindow.addLine(txt) else: title = 'Component import check' txt = 'PythonCard components import line present and correct!' bull = dialog.messageDialog(self, wrap_string(txt, 60), title, wx.ICON_INFORMATION) def on_menuHelpManual_command(self, event): title = 'Sorry!' txt = 'Online manual functionality will be implemented in a future ' txt += 'version of standaloneBuilder.' bull = dialog.alertDialog(self, txt, title) def on_menuHelpAbout_command(self, event): dlg = HTMLHelp(self) dlg.showModal() dlg.destroy() ########################################################################## # toplevel routines - toolbar button events # ########################################################################## def on_newBtn_command(self, event): if not self.saveIfRequired(): return dlg = newProjectWizard(self) dlg.ShowModal() result = dlg.getResult() if result.accepted: self.newFile(result) dlg.Destroy() def on_openBtn_command(self, event): if not self.saveIfRequired(): return wildcard = "Project files (*.pmr)|*.pmr;*.PMR|All files (*.*)|*.*" result = dialog.openFileDialog(wildcard=wildcard) if result.accepted: path = result.paths[0] self.openFile(path) def on_saveBtn_command(self, event): if self.documentPath is None: # this a "new" document and needs to go through Save As... self.on_menuFileSaveAs_select(None) else: self.saveFile(self.documentPath) def on_editPrefs_command(self, event): dlg = prefsDialog(self, self.CONFIG_FILE) dlg.ShowModal() dlg.Destroy() if self.components.projectName.text != '': if self.cfg.get('ConfigData', 'buildtool') != 'pyInstaller': self.components.specBtn.enabled = False self.menuBar.setEnabled('menuEditSpecfile', False) else: self.components.specBtn.enabled = True self.menuBar.setEnabled('menuEditSpecfile', True) def on_quitBtn_command(self, event): self.Close() ########################################################################## # top level routines - user interface events # ########################################################################## def on_iconBtn_mouseClick(self, event): title = 'Select icon' basepath = os.path.join(self.cfg.get('ConfigData', 'projects'), self.components.baseDir.text) #basepath = os.path.join(basepath, self.components.projectIcon.text) wildcard = "Icon files (*.ico)|*.ico;*.ICO|All files (*.*)|*.*" old = self.components.projectIcon.text result = dialog.openFileDialog(self, title, basepath, '', wildcard=wildcard) if result.accepted: rpath = self.getRelativePath(basepath, result.paths[0]) if rpath != old: self.components.projectIcon.text = rpath self.documentChanged = True self.updateStatusBar() def on_baseDirBtn_mouseClick(self, event): title = 'Select directory' basepath = os.path.join(self.cfg.get('ConfigData', 'projects'), self.components.baseDir.text) old = self.components.baseDir.text result = dialog.directoryDialog(self, title, basepath) if result.accepted: projdir = self.cfg.get('ConfigData', 'projects') rpath = string.replace(result.path, projdir, '') if rpath[0] == os.sep: rpath = rpath[1:] if rpath != old: self.components.baseDir.text = rpath self.documentChanged = True self.updateStatusBar() def on_mainScriptBtn_mouseClick(self, event): title = 'Select main script file' basepath = os.path.join(self.cfg.get('ConfigData', 'projects'), self.components.baseDir.text) old = self.components.mainScript.text wildcard = "Script files (*.py)|*.py;*.PY" result = dialog.fileDialog(self, title, basepath, '', wildcard) if result.accepted: rpath = self.getRelativePath(basepath, result.paths[0]) if rpath != old: if rpath in self.components.scriptList.items: title = 'Script select error' msg = '"%s" must be removed from the list of additional scripts if you wish to set it as the main script for your project' % rpath bull = dialog.alertDialog(self, wrap_string(msg, 60), title) else: self.checkResourceFile(result.paths[0]) self.components.mainScript.text = rpath self.documentChanged = True self.updateStatusBar() def on_EditMainScript_command(self, event): editor = self.cfg.get('ConfigData', 'codeeditor') item = self.pathJoin(self.components.mainScript.text) item = os.path.join(self.components.baseDir.text, item) item = os.path.join(self.cfg.get('ConfigData', 'projects'), item) if sys.platform.startswith('win'): os.system('python "' + editor + '" "' + item + '"') else: os.system('"' + editor + '" "' + item + '"') def on_addScript_command(self, event): # add a script file to the project title = 'Select script(s)' wildcard = "Script files (*.py)|*.py;*.PY|All files (*.*)|*.*" basepath = os.path.join(self.cfg.get('ConfigData', 'projects'), self.components.baseDir.text) current = self.components.scriptList.items result = dialog.openFileDialog(self, title, basepath, '', wildcard, wx.MULTIPLE) if result.accepted: for p in result.paths: path = os.path.basename(p) if not (path in current): if path == self.components.mainScript.text: title = 'Script select error' msg = 'You have already selected "%s" as your main script - it does not need to be included in this list' % path bull = dialog.alertDialog(self, wrap_string(msg, 60), title) else: self.checkResourceFile(p) current.append(path) current.sort() self.documentChanged = True self.updateStatusBar() if self.documentChanged: self.components.scriptList.items = current def on_scriptDelBtn_mouseClick(self, event): if self.components.scriptList.stringSelection != '': self.components.scriptList.items = self.delItem(self.components.scriptList.items, self.components.scriptList.stringSelection) def on_scriptEditBtn_mouseClick(self, event): if self.components.scriptList.stringSelection != '': editor = self.cfg.get('ConfigData', 'codeeditor') item = self.pathJoin(self.components.scriptList.stringSelection) item = os.path.join(self.components.baseDir.text, item) item = os.path.join(self.cfg.get('ConfigData', 'projects'), item) if sys.platform.startswith('win'): os.system('python "' + editor + '" "' + item + '"') else: os.system(editor + ' ' + item) def on_scriptDelAllBtn_mouseClick(self, event): title = 'Are you absolutely sure?' msg = 'This will remomve all the listed script files from your project. Is this really what you want to do?' result = dialog.messageDialog(self, wrap_string(msg, 60), title, wx.ICON_EXCLAMATION | wx.YES_NO | wx.NO_DEFAULT) if result.accepted: self.components.scriptList.items = [] self.documentChanged = True self.updateStatusBar() def on_addResource_command(self, event): # add a resource file to the project title = 'Select resource file' basepath = os.path.join(self.cfg.get('ConfigData', 'projects'), self.components.baseDir.text) wildcard = "Resource files (*.rsrc.py)|*.rsrc.py;*.RSRC.PY|All files (*.*)|*.*" current = self.components.resList.items self.components.resList.items = self.addItem(title, basepath, wildcard, current) def on_resDelBtn_mouseClick(self, event): if self.components.resList.stringSelection != '': self.components.resList.items = self.delItem(self.components.resList.items, self.components.resList.stringSelection) def on_resEditBtn_mouseClick(self, event): if self.components.resList.stringSelection != '': editor = self.cfg.get('ConfigData', 'reseditor') item = self.pathJoin(self.components.resList.stringSelection) item = os.path.join(self.components.baseDir.text, item) item = os.path.join(self.cfg.get('ConfigData', 'projects'), item) if sys.platform.startswith('win'): os.system('python "' + editor + '" "' + item + '"') else: os.system(editor + ' ' + item) def on_resDelAllBtn_mouseClick(self, event): title = 'Are you absolutely sure?' msg = 'This will remomve all the listed resource files from your project. Is this really what you want to do?' result = dialog.messageDialog(self, wrap_string(msg, 60), title, wx.ICON_EXCLAMATION | wx.YES_NO | wx.NO_DEFAULT) if result.accepted: self.components.resList.items = [] self.documentChanged = True self.updateStatusBar() def on_addPixmap_command(self, event): # add a pixmap file to the project title = 'Select pixmap file' basepath = os.path.join(self.cfg.get('ConfigData', 'projects'), self.components.baseDir.text) basepath = os.path.join(basepath, self.project.get('Project', 'pixmapspath')) refpath = basepath #basepath = os.path.join(self.components.baseDir.text, self.project.get('Project', 'pixmapspath')) wildcard = "GIF Image (*.gif)|*.gif;*.GIF" wildcard += "|JPEG Image (*.jpg, *.jpeg)|*.jpg;*.jpeg;*.JPG;*.JPEG" wildcard += "|PNG Image (*.png)|*.png;*.PNG" wildcard += "|All files (*.*)|*.*" current = self.components.pixmapList.items self.components.pixmapList.items = self.addItem(title, basepath, wildcard, current, refpath) def on_pixmapDelBtn_mouseClick(self, event): if self.components.pixmapList.stringSelection != '': self.components.pixmapList.items = self.delItem(self.components.pixmapList.items, self.components.pixmapList.stringSelection) def on_pixmapDelAllBtn_mouseClick(self, event): title = 'Are you absolutely sure?' msg = 'This will remomve all the listed pixmaps from your project. Is this really what you want to do?' result = dialog.messageDialog(self, wrap_string(msg, 60), title, wx.ICON_EXCLAMATION | wx.YES_NO | wx.NO_DEFAULT) if result.accepted: self.components.pixmapList.items = [] self.documentChanged = True self.updateStatusBar() def on_addOther_command(self, event): # add a resource file to the project title = 'Select documentation/other file' #basepath = os.path.join(self.components.baseDir.text, self.project.get('Project', 'docfilepath')) basepath = os.path.join(self.cfg.get('ConfigData', 'projects'), self.components.baseDir.text) refpath = os.path.join(self.cfg.get('ConfigData', 'projects'), self.components.baseDir.text) wildcard = "Text files (*.txt)|*.txt;*.TXT" wildcard += "|All files (*.*)|*.*" current = self.components.otherList.items self.components.otherList.items = self.addItem(title, basepath, wildcard, current, refpath) def on_docDelBtn_mouseClick(self, event): if self.components.otherList.stringSelection != '': self.components.otherList.items = self.delItem(self.components.otherList.items, self.components.otherList.stringSelection) def on_docEditBtn_mouseClick(self, event): if self.components.otherList.stringSelection != '': editor = self.cfg.get('ConfigData', 'texteditor') itempath = os.path.join(self.cfg.get('ConfigData', 'projects'), self.components.baseDir.text) itempath = os.path.join(itempath, self.components.otherList.stringSelection) if sys.platform.startswith('win'): if editor.endswith('.py'): os.system('python "' + editor + '" "' + itempath + '"') else: os.system('"' + editor + '" "' + itempath + '"') else: os.system(editor + ' ' + itempath) def on_docDelAllBtn_mouseClick(self, event): title = 'Are you absolutely sure?' msg = 'This will remomve all the listed files from your project. Is this really what you want to do?' result = dialog.messageDialog(self, wrap_string(msg, 60), title, wx.ICON_EXCLAMATION | wx.YES_NO | wx.NO_DEFAULT) if result.accepted: self.components.otherList.items = [] self.documentChanged = True self.updateStatusBar() def on_editProps_command(self, event): dlg = propertiesDialog(self) dlg.ShowModal() dlg.Destroy() self.updateStatusBar() def on_editChgLog_command(self, event): # edit changelog, create it if it doesn't exist vstring = string.split(self.components.versionString.text, '.') template = {} template['name'] = self.components.projectName.text template['major'] = vstring[0] template['minor'] = vstring[1] template['fix'] = vstring[2] basedir = os.path.join(self.cfg.get('ConfigData', 'projects'), self.components.baseDir.text) chglog = str(os.path.join(basedir, 'changelog.txt')) if not os.path.exists(chglog): fd = open(chglog, 'w') tmplfile = os.path.join('templates', 'changelog.txt') chglogData = open(tmplfile, 'r').read() chglogData = chglogData % template fd.write(chglogData) fd.close() editor = self.cfg.get('ConfigData', 'texteditor') if sys.platform.startswith('win'): if editor.endswith('.py'): os.system('python "' + editor + '" "' + chglog + '"') else: os.system('"' + editor + '" "' + chglog + '"') else: os.system(editor + ' ' + chglog) def on_editReadme_command(self, event): editor = self.cfg.get('ConfigData', 'texteditor') basedir = os.path.join(self.cfg.get('ConfigData', 'projects'), self.components.baseDir.text) readme = os.path.join(basedir, 'readme.txt') if sys.platform.startswith('win'): if editor.endswith('.py'): os.system('python "' + editor + '" "' + readme + '"') else: os.system('"' + editor + '" "' + readme + '"') else: os.system(editor + ' ' + readme) def on_editSpecFile_command(self, event): editor = self.cfg.get('ConfigData', 'texteditor') basedir = os.path.join(self.cfg.get('ConfigData', 'projects'), self.components.baseDir.text) spec = self.components.projectName.text + '.spec' spec = os.path.join(basedir, spec) cmd = '"' + editor + '" "' + spec + '"' if sys.platform.startswith('win'): if editor.endswith('.py'): os.system('python "' + editor + '" "' + spec + '"') else: os.system('"' + editor + '" "' + spec + '"') else: os.system(editor + ' ' + spec) def on_editInnoFile_command(self, event): editor = self.cfg.get('ConfigData', 'texteditor') basedir = os.path.join(self.cfg.get('ConfigData', 'projects'), self.components.baseDir.text) spec = self.components.projectName.text + '.iss' spec = os.path.join(basedir, spec) if sys.platform.startswith('win'): if editor.endswith('.py'): os.system('python "' + editor + '" "' + spec + '"') else: os.system('"' + editor + '" "' + spec + '"') else: os.system(editor + ' ' + spec) def on_runMainScript_command(self, event): # save the project if required ret = self.saveIfRequired() if not ret: return result = runOptionsDialog.runOptionsDialog(self, self.cmdLineArgs) if result.accepted: self.cmdLineArgs['debugmenu'] = result.debugmenu self.cmdLineArgs['logging'] = result.logging self.cmdLineArgs['messagewatcher'] = result.messagewatcher self.cmdLineArgs['namespaceviewer'] = result.namespaceviewer self.cmdLineArgs['propertyeditor'] = result.propertyeditor self.cmdLineArgs['shell'] = result.shell self.cmdLineArgs['otherargs'] = result.otherargs self.runScript(False) def on_rebuildCmd_command(self, event): # we have to make sure that there is something defined as a 'main # script' before we can do a rebuild if self.components.mainScript.text == '': title = 'Project error!' txt = 'You have not specified the main script for this project!' bull = dialog.alertDialog(self, wrap_string(txt, 60), title) return # save the project if required if not self.saveIfRequired(): return # rebuild under Linux just involves making a tarball of the source # code plus associated files if sys.platform.startswith('linux') or sys.platform.startswith('freebsd'): self.rebuildLinux() return 0 impFound, impLine = self.checkImports() if not impFound: self.outputWindow.components.clipBoardBtn.userdata = impLine self.outputWindow.components.txt5.enabled = False self.outputWindow.components.txt5.visible = False self.outputWindow.components.returnedText.enabled = False self.outputWindow.components.returnedText.visible = False self.outputWindow.components.importError.enabled = True self.outputWindow.components.importError.visible = True self.outputWindow.Show() self.outputWindow.clearLines() self.outputWindow.components.txt1a.visible = False # rebuilding spec file self.outputWindow.components.txt1b.visible = False # done self.outputWindow.components.txt2a.visible = False # rebuilding versioninfo file self.outputWindow.components.txt2b.visible = False # done self.outputWindow.components.txt3a.visible = False # rebuilding application self.outputWindow.components.txt3b.visible = False # done self.outputWindow.components.txt3c.visible = False # please wait... self.outputWindow.components.txt4a.visible = False # rebuilding distributable self.outputWindow.components.txt4b.visible = False # done self.outputWindow.components.txt4c.visible = False # please wait txt = 'The main script should include the following import statement on a ' self.outputWindow.addLine(txt) txt = 'single line:\n\n' self.outputWindow.addLine(txt) txt = impLine + '\n\n' self.outputWindow.addLine(txt) if sys.platform.startswith('win'): self.outputWindow.components.clipBoardBtn.visible = True txt = 'Click the \'Clipboard\' button below to place this line on ' self.outputWindow.addLine(txt) txt = 'the clipboard ready to be pasted into your code.' self.outputWindow.addLine(txt) else: txt = 'Copy and paste this line into your code before rebuilding.' self.outputWindow.addLine(txt) return # give a warning message if the debug and/or console options # are switched on in project properties. if self.project.getboolean('Project', 'console') or self.project.getboolean('Project', 'debug'): txt = 'Please note that you currently have either the debug and/or the console option(s)' txt += ' switched on in the properties for this project.\n\nYou should probably switch these off' txt += ' prior to building the final version of your application' title = 'Project options warning!' bull = dialog.alertDialog(self, wrap_string(txt, 60), title) self.outputWindow.components.txt5.enabled = True self.outputWindow.components.txt5.visible = True self.outputWindow.components.returnedText.enabled = True self.outputWindow.components.returnedText.visible = True self.outputWindow.components.importError.enabled = False self.outputWindow.components.importError.visible = False self.outputWindow.components.txt1a.visible = False # rebuilding spec file self.outputWindow.components.txt1b.visible = False # done self.outputWindow.components.txt2a.visible = False # rebuilding versioninfo file self.outputWindow.components.txt2b.visible = False # done self.outputWindow.components.txt3a.visible = False # rebuilding application self.outputWindow.components.txt3b.visible = False # done self.outputWindow.components.txt3c.visible = False # please wait... self.outputWindow.components.txt4a.visible = False # rebuilding distributable self.outputWindow.components.txt4b.visible = False # done self.outputWindow.components.txt4c.visible = False # please wait # delete all transient files from previous rebuilds basedir = str(os.path.join(self.cfg.get('ConfigData', 'projects'), self.components.baseDir.text)) versionfile = os.path.join(basedir, 'versioninfo.txt') innofile = self.components.projectName.text + '.iss' innofile = os.path.join(basedir, innofile) try: os.unlink(str(versionfile)) except: pass try: os.unlink('datafiles.dat') except: pass try: os.unlink('buildoptions.dat') except: pass try: os.unlink('standalone.dat') except: pass try: os.unlink(str(innofile)) except: pass self.recursiveDirDelete(os.path.join(basedir, 'build')) self.recursiveDirDelete(os.path.join(basedir, 'dist')) # window for progress marks and output messages self.outputWindow.Show() self.outputWindow.clearLines() # make all the text fields invisible self.outputWindow.components.txt1a.visible = False # rebuilding spec file self.outputWindow.components.txt1b.visible = False # done self.outputWindow.components.txt2a.visible = False # rebuilding versioninfo file self.outputWindow.components.txt2b.visible = False # done self.outputWindow.components.txt3a.visible = False # rebuilding application self.outputWindow.components.txt3b.visible = False # done self.outputWindow.components.txt3c.visible = False # please wait... self.outputWindow.components.txt4a.visible = False # rebuilding distributable self.outputWindow.components.txt4b.visible = False # done self.outputWindow.components.txt4c.visible = False # please wait # rebuild the spec file - not required when using py2exe self.outputWindow.components.txt1a.visible = True # rebuilding spec file self.outputWindow.Update() self.outputWindow.Refresh() if self.cfg.get('ConfigData', 'buildtool') == 'pyInstaller': self.buildSpecFile() # not required with py2exe self.outputWindow.components.txt1b.visible = True # done # rebuild the versioninfo file self.outputWindow.components.txt2a.visible = True # rebuilding versioninfo file self.outputWindow.Update() self.outputWindow.Refresh() self.buildVersionFile() self.outputWindow.components.txt2b.visible = True # done # rebuild the application self.outputWindow.components.txt3a.visible = True # rebuilding application self.outputWindow.components.txt3c.visible = True # please wait... self.outputWindow.Update() self.outputWindow.Refresh() if self.cfg.get('ConfigData', 'buildtool') == 'pyInstaller': allokay = self.buildApplication() else: allokay = self.buildWithpy2exe() self.outputWindow.components.txt3c.visible = False self.outputWindow.components.txt3b.visible = True # done if not allokay: self.outputWindow.components.txt3b.text = '*** ERROR ***' self.outputWindow.Update() # rebuild the Inno script file self.outputWindow.components.txt4a.visible = True # rebuilding distributable self.outputWindow.components.txt4c.visible = True # please wait self.outputWindow.Update() self.outputWindow.Refresh() if allokay: self.buildInnoFile() # rebuild the distributable #self.buildDistFile() self.outputWindow.components.txt4c.visible = False self.outputWindow.components.txt4b.visible = True # done if allokay: self.buildInstaller() #self.outputWindow.Update() #self.outputWindow.Refresh() #self.outputWindow.Raise() else: self.outputWindow.components.txt4b.text = '*** ERROR ***' # rebuilding distributable # if the project is not frozen, increment the build number to finish if self.project.get('Project', 'status') == 'open' and allokay: build = self.project.getint('Project', 'build') build += 1 self.project.set('Project', 'build', str(build)) self.documentChanged = True self.updateStatusBar() self.outputWindow.Update() self.outputWindow.Refresh() self.outputWindow.Raise() def on_releaseCmd_command(self, event): # do stuff for releasing a project pstatus = self.project.get('Project', 'status') if pstatus == 'open': # give a warning message if the debug and/or console options # are switched on in project properties. if self.project.getboolean('Project', 'console') or self.project.getboolean('Project', 'debug'): txt = 'Please note that you currently have either the debug and/or the console option(s)' txt += ' switched on in the properties for this project.\n\nYou might want to switch these off' txt += ' prior to releasing the final version of your application' title = 'Project options warning!' bull = dialog.alertDialog(self, wrap_string(txt, 60), title) # freeze the project ready for release txt = 'This will freeze the current release so that no more changes can ' txt += 'be made. You should only do this if you are absolutely sure that ' txt += 'your project is ready to be released. Once frozen, the project ' txt += 'should be rebuilt on all the platforms you are interested in.\n\nYou ' txt += 'should then click the release button again to un-freeze the ' txt += 'project and initialize the next version.\n\nIf you clicked this ' txt += 'button by mistake, select Cancel below, otherwise select OK to ' txt += 'continue with the release process.' result = dialog.messageDialog(self, wrap_string(txt, 60), 'Please confirm', wx.ICON_EXCLAMATION|wx.OK|wx.CANCEL) if not result.accepted: return 0 if not self.freezeProject(): return 0 if pstatus == 'frozen': # mark the release as finished and start the next one vstring = self.project.get('Project', 'projectdesc') + ' Ver ' vstring += self.project.get('Project', 'majorversion') + '.' vstring += self.project.get('Project', 'minorversion') + '.' vstring += self.project.get('Project', 'fixnumber') txt = 'You are about to release %s ' % vstring txt += '- this will close off the current release and start a new ' txt += 'release. Please ensure that you have run the build process on all ' txt += 'applicable platforms before continuing.\n\nIf you clicked this ' txt += 'button by mistake, select Cancel below, otherwise select OK to ' txt += 'continue with the release process.' result = dialog.messageDialog(self, wrap_string(txt, 60), 'Please confirm', wx.ICON_EXCLAMATION|wx.OK|wx.CANCEL) if not result.accepted: return 0 if not self.releaseProject(): return 0 ############################################################################## # second level stuff - routines called by the first level code # ############################################################################## def recursiveDirDelete(self, path=None): # recursively delete a sub directory if path is None: return if not os.path.isdir(path): return for root, dirs, files in os.walk(path, topdown=False): for name in files: os.unlink (os.path.join(root, name)) for name in dirs: os.rmdir(os.path.join(root, name)) os.rmdir(path) def checkResourceFile(self, path): # when adding a script, see if there is a matching resource file root, ext = os.path.splitext(path) script = os.path.basename(path) resfile = root + '.rsrc.py' if os.path.isfile(resfile): # is it already in the list of resource files? if not os.path.basename(resfile) in self.components.resList.items: txt = '%s has a matching PythonCard resource file. Would you like to also' % (script) txt += ' add the resource file to your project?' result = dialog.messageDialog(self, wrap_string(txt, 60), 'Please confirm', wx.ICON_EXCLAMATION|wx.YES_NO|wx.YES_DEFAULT) if result.accepted: x = self.components.resList.items x.append(os.path.basename(resfile)) x.sort() self.components.resList.items = x def runScript(self, useInterpreter): item = self.pathJoin(self.components.mainScript.text) item = os.path.join(self.components.baseDir.text, item) item = os.path.join(self.cfg.get('ConfigData', 'projects'), item) # pinched this code from the resource editor - thanks, Kevin! #path = os.path.join(self.cfg.get('ConfigData', 'projects'), self.components.baseDir.text) #path, filename = os.path.split(self.filename) path, filename = os.path.split(item) name = filename.split('.')[0] if os.path.exists(os.path.join(path, name + ".pyw")): filename = '"' + os.path.join(path, name + ".pyw") + '"' else: filename = '"' + os.path.join(path, name + ".py") + '"' # the args should come from a dialog or menu items that are checked/unchecked args = self.getCommandLineArgs() if useInterpreter: interp = ' -i ' else: interp = ' ' if sys.platform.startswith('win'): # KEA 2002-03-06 # always launch with console in the resourceEditor for debugging purposes python = os.path.join(os.path.dirname(sys.executable), 'python.exe') if ' ' in python: pythonQuoted = '"' + python + '"' else: pythonQuoted = python if useInterpreter and os.name != 'nt': os.spawnv(os.P_NOWAIT, python, [pythonQuoted, interp, filename, args]) else: os.spawnv(os.P_NOWAIT, python, [pythonQuoted, interp, filename, args]) else: if ' ' in sys.executable: python = '"' + sys.executable + '"' else: python = sys.executable os.system(python + interp + filename + args + ' &') def saveIfRequired(self): # save the project if required retflag = True if self.documentChanged: save = self.saveChanges() if save == wx.ID_CANCEL: retflag = False # don't do anything, just go back to editing elif save == wx.ID_NO: pass # any changes will be lost else: if self.documentPath is None: # if the user cancels out of the Save As then go back to editing if not self.on_menuFileSaveAs_select(None): retflag = False else: self.saveFile(self.documentPath) return retflag def getCommandLineArgs(self): args = ' ' if self.cmdLineArgs['debugmenu']: args += '-d ' if self.cmdLineArgs['logging']: args += '-l ' if self.cmdLineArgs['messagewatcher']: args += '-m ' if self.cmdLineArgs['namespaceviewer']: args += '-n ' if self.cmdLineArgs['propertyeditor']: args += '-p ' if self.cmdLineArgs['shell']: args += '-s ' if self.cmdLineArgs['otherargs'] != '': args += self.cmdLineArgs['otherargs'] return args def getRelativePath(self, root, path): # remove the root part of an absolute path retPath = string.replace(path, root, '') if retPath[0] == os.sep: retPath = retPath[1:] #bull = raw_input() return retPath def loadConfig(self): # first job is to work out where the config file should be stored if sys.platform.startswith('linux') or sys.platform.startswith('freebsd'): # on Linux & FreeBSD, it goes in ~/.pmrc self.HOMEDIR = os.path.expanduser('~') self.CONFIG = '.standaloneBuilderrc' else: # Windows needs to put the config file in C:\Program Files\PM\pm.ini self.HOMEDIR = os.path.dirname(sys.argv[0]) self.CONFIG = 'standaloneBuilder.ini' self.CONFIG_FILE = os.path.join(self.HOMEDIR, self.CONFIG) # allow a different config file to be specified on the command line # for testing purposes etc for optnum in range(len(sys.argv)): if sys.argv[optnum] == '-f': self.CONFIG_FILE = sys.argv[optnum + 1] break # create a default config the very first time we run standaloneBuilder if not os.path.exists(self.CONFIG_FILE): self.createConfig() else: self.cfg = ConfigParser.ConfigParser() self.cfg.read(self.CONFIG_FILE) # check that pyInstaller and py2exe haven't gone missing instpath = self.cfg.get('ConfigData', 'installerpath') btool = self.cfg.get('ConfigData', 'buildtool') if btool == 'pyInstaller' and not os.path.exists(instpath): title = '*** WARNING ***' txt = 'Your copy of pyInstaller was previously located at ' txt += instpath + '. It appears to have vanished. You should open ' txt += 'the preferences dialog and check that your settings are ' txt += 'still valid.' bull = dialog.alertDialog(self, wrap_string(txt, 60), title) if btool == 'py2exe': try: from distutils.core import setup as wibble except ImportError: title = '*** WARNING ***' txt = 'You have configured standaloneBuilder to use py2exe as ' txt += 'the build mechanism but you do not appear to have a ' txt += 'copy of the distutils package installed. You should open ' txt += 'the preferences dialog and check that your settings are ' txt += 'still valid.' bull = dialog.alertDialog(self, wrap_string(txt, 60), title) try: import py2exe as wibble except ImportError: title = '*** WARNING ***' txt = 'You have configured standaloneBuilder to use py2exe as ' txt += 'the build mechanism but you do not appear to have a ' txt += 'copy of the py2exe package installed. You should open ' txt += 'the preferences dialog and check that your settings are ' txt += 'still valid.' bull = dialog.alertDialog(self, wrap_string(txt, 60), title) # check that Inno Setup is still installed isccpath = self.cfg.get('ConfigData', 'compilerpath') if not os.path.exists(isccpath) and sys.platform.startswith('win'): title = '*** WARNING ***' txt = 'Your copy of Inno Setup was previously located at ' txt += isccpath + '. It appears to have vanished. You should open ' txt += 'the preferences dialog and check that your settings are ' txt += 'still valid.' bull = dialog.alertDialog(self, wrap_string(txt, 60), title) def doExit(self): if self.documentChanged: save = self.saveChanges() if save == wx.ID_CANCEL: return 0 elif save == wx.ID_NO: return 1 else: if self.documentPath is None: return self.on_menuFileSaveAs_select(None) else: self.saveFile(self.documentPath) return 1 else: return 1 def saveFile(self, path): self.UI2Project() try: f = open(path, 'w') self.project.write(f) f.close() self.documentPath = path self.documentChanged = False self.SetTitle(os.path.split(path)[-1] + ' - ' + self.startTitle) self.updateStatusBar() except: pass def saveChanges(self): if self.documentPath is None: filename = "Untitled" else: filename = self.documentPath msg = "The text in the %s file has changed.\n\nDo you want to save the changes?" % filename result = dialog.messageDialog(self, msg, 'textEditor', wx.ICON_EXCLAMATION | wx.YES_NO | wx.CANCEL) return result.returned def newFile(self, wizResult): self.documentPath = None self.documentChanged = True self.SetTitle(wizResult.projectName + ' - ' + self.startTitle) self.statusBar.text = wizResult.projectName self.components.projectName.text = wizResult.projectName self.components.projectIcon.text = '' self.components.baseDir.text = wizResult.baseDir self.components.projectDesc.text = wizResult.projectDesc self.components.mainScript.text = '' self.components.versionString.text = '0.1.1' self.components.scriptList.items = [] self.components.resList.items = [] self.components.pixmapList.items = [] self.components.otherList.items = [] # here's where we create a basic project definition self.project = ConfigParser.ConfigParser() self.UI2Project() # add in the remainder of the project default properties self.project.set('Project', 'build', '1') self.project.set('Project', 'docfilespath', 'doc') self.project.set('Project', 'buildfilespath', 'build') self.project.set('Project', 'distfilespath', 'dist') self.project.set('Project', 'pixmapspath', 'pixmaps') self.project.set('Project', 'tarballspath', 'tarballs') self.project.set('Project', 'onedir', '1') self.project.set('Project', 'ascii', '0') self.project.set('Project', 'striplib', '0') self.project.set('Project', 'console', '1') # best to have a console for new projects! self.project.set('Project', 'optimize', '1') self.project.set('Project', 'compress', '0') self.project.set('Project', 'debug', '0') self.project.set('Project', 'publisher', self.cfg.get('ConfigData', 'publisher')) self.project.set('Project', 'appurl', '') self.project.set('Project', 'status', 'open') self.project.set('Project', 'applicence', 'doc,gpl.txt') x = os.path.join('build', '%s.iss' % self.components.projectName.text) self.project.set('Project', 'innoscript', x) x = os.path.join('build', '%s.spec' % self.components.projectName.text) self.project.set('Project', 'specfile', x) self.project.set('Otherfiles', '0', os.path.join('doc', 'about.html')) self.project.set('Otherfiles', '1', os.path.join('doc', 'author.html')) self.project.set('Otherfiles', '2', os.path.join('doc', 'gpl.txt')) self.project.set('Otherfiles', '3', os.path.join('doc', 'gpl.html')) self.project.set('Otherfiles', '4', 'changelog.txt') self.project.set('Otherfiles', '5', 'readme.txt') self.createProject() self.Project2UI() self.on_menuFileSaveAs_select(None) # save the project self.updateStatusBar() for comp in self.components.keys(): self.components[comp].enabled = 1 def delItem(self, items, selected): newlist = [] for item in items: if selected != item: newlist.append(item) if newlist != items: self.documentChanged = True self.updateStatusBar() return newlist def addItem(self, title, basepath, wildcard, current, refpath=None): x = current[:] result = dialog.openFileDialog(self, title, basepath, '', wildcard, wx.MULTIPLE) if result.accepted: for p in result.paths: if not os.path.exists(p): title = 'Invalid filename!' txt = '%s is not a valid filename!' % p bull = dialog.alertDialog(self, wrap_string(txt, 70), title) else: if refpath is None: # we want the whole path to the item path = os.path.basename(p) else: # we just want the part thats relative to 'refpath' path = string.replace(p, refpath + os.sep, '') if not (path in x): x.append(path) x.sort() self.documentChanged = True self.updateStatusBar() self.Refresh() return x def rebuildLinux(self): # build a tarball for a Linux system # create a top level directory for the stuff to go in vstring = self.components.versionString.text tdir = self.project.get('Project', 'name') tdir += '-' + vstring tdir += '-' + self.project.get('Project', 'build') topdir = tdir tarball = tdir + '.tar.gz' tdir = os.path.join(self.components.baseDir.text, tdir) tdir = os.path.join(self.cfg.get('ConfigData', 'projects'), tdir) try: cmd = 'rm -rf %s' % tdir os.system(cmd) #os.removedirs(tdir) except: pass os.mkdir(tdir) # write everything out to a 'manifest.in' file basedir = os.path.join(self.cfg.get('ConfigData', 'projects'), self.components.baseDir.text) manifestfile = os.path.join(basedir, 'manifest.in') fd = open(manifestfile, 'w') fd.write(self.pathJoin(self.project.get('Project', 'mainscript')) + '\n') # main script file section = 'Scripts' self.sectionOutput(section, fd) section = 'ResourceFiles' self.sectionOutput(section, fd) section = 'Pixmaps' prefix = self.pathJoin(self.project.get('Project', 'pixmapspath')) self.sectionOutput(section, fd, prefix) section = 'Otherfiles' self.sectionOutput(section, fd) fd.close() # use cpio to copy everything listed in manifest.in into the temp # directory just created cmd = "cd %s; cat manifest.in|cpio -vdump %s" % (basedir, topdir) os.system(cmd) # now we can create the tarball, ensuring that the tarballs path # actually exists beforehand tb = os.path.join(basedir, self.pathJoin(self.project.get('Project', 'tarballspath'))) try: os.mkdir(tb) except: pass tb = os.path.join(tb, tarball) cmd = "cd %s; tar -zcvf %s %s > /dev/null 2>&1" % (basedir, tb, topdir) os.system(cmd) # remove the temporary directory when done cmd = "cd %s; rm -rf %s" % (basedir, topdir) os.system(cmd) def checkImports(self): # if we're building from a PythonCard application, check that the # main script includes imports of the required PythonCard components imps = {} impline = 'from PythonCard.components import ' basedir = os.path.join(self.cfg.get('ConfigData', 'projects'), self.components.baseDir.text) for res in self.components.resList.items: fullpath = str(os.path.join(basedir, res)) res = util.readAndEvalFile(fullpath) try: comps = res['components'] except: comps = res['application']['backgrounds'][0]['components'] for comp in comps: type = comp['type'] if not imps.has_key(type): imps[type] = 1 ikeys = imps.keys() ikeys.sort() for i in ikeys: impline += i.lower() + ', ' impline = impline[:-2] #print impline # read through the main script looking for a matching import line mainScript = os.path.join(basedir, str(self.components.mainScript.text)) fd = open(mainScript) impFound = False line = fd.readline() while line: if line == impline + '\n': impFound = True break line = fd.readline() fd.close() return impFound, impline def buildWithpy2exe(self): # rebuild the application using py2exe basedir = str(os.path.join(self.cfg.get('ConfigData', 'projects'), self.components.baseDir.text)) mainScript = self.components.mainScript.text mainResource = str(mainScript.split('.py')[0] + '.rsrc.py') finalResource = str(self.components.projectName.text + '.rsrc.py') if mainResource != finalResource: fd = open(os.path.join(basedir, mainResource)) res = fd.read() fd.close() fd = open(os.path.join(basedir, finalResource), 'w') fd.write(res) fd.close() origin = os.getcwd() os.chdir(basedir) # make sure we have a setup.py script in the current directory setupScript = os.path.join(basedir, 'setup.py') if not os.path.exists(setupScript): fd = open(setupScript, 'w') fd.write(self.setupCode) fd.close() specfile = os.path.join(basedir, self.components.projectName.text + '.spec') versionfile = os.path.join(basedir, 'versioninfo.txt') exefile = os.path.join(self.pathJoin(self.project.get('Project', 'buildfilespath')), self.project.get('Project', 'name') + '.exe') # write out all the files that make up the application into a list of # tuples that py2exe can deal with data_files = [] tmp = ('.', []) # commented this out, as we don't need to explicitly distribute the extra python # modules that the main script imports - anything that does actually need # to be distributed should be added to the 'other files' list by the user #for script in self.components.scriptList.items: tmp[1].append(str(script)) # then add in all resource files, which will also be in the top level # directory for res in self.components.resList.items: if res == mainResource: tmp[1].append(str(finalResource)) else: tmp[1].append(str(res)) # and anything in the 'other files' list which doesn't appear to be in # its own sub-directory for other in self.components.otherList.items: if not os.sep in other: tmp[1].append(str(other)) data_files.append(tmp) # add in all the pixmap files pixmap = self.project.get('Project', 'pixmapspath') tmp = (str(pixmap), []) for pix in self.components.pixmapList.items: tmp[1].append(str(os.path.join(pixmap, pix))) data_files.append(tmp) # now process everything in the 'other files' list that lives in its # own subdirectory, generating a tuple for each sub-directoy found subdirs = {} for item in self.components.otherList.items: item = str(item) if os.sep in item: d = string.split(item, os.sep) if subdirs.has_key(d[0]): ilist = subdirs[d[0]] ilist.append(item) else: ilist = [] ilist.append(item) subdirs[d[0]] = ilist for subdir in subdirs.keys(): data_files.append((subdir, subdirs[subdir])) # write the data_files information out to a file where the setup script # can read it from fd = open('datafiles.dat', 'w') pprint.pprint(data_files, fd) fd.close() # build a second dictionary which is used to define the application # itself to py2exe standalone = {} standalone['script'] = str(self.components.mainScript.text) standalone['dest_base'] = self.project.get('Project', 'name') if self.components.projectIcon.text != '': standalone['icon_resources'] = [(1, str(self.components.projectIcon.text))] fd = open('standalone.dat', 'w') pprint.pprint(standalone, fd) fd.close() # create a data file which tells the setup script whether we want a console # build or not fd = open('buildoptions.dat', 'w') buildOpts = {} if self.project.getboolean('Project', 'console'): buildOpts['buildType'] = 'console' else: buildOpts['buildType'] = 'windows' pprint.pprint(buildOpts, fd) fd.close() # run the setup script and capture the output cmd = 'python setup.py py2exe' stin, stout, sterr = os.popen3(cmd) stin.close() result = stout.readline() while result: self.outputWindow.addLine(result) self.outputWindow.Update() self.outputWindow.Refresh() result = stout.readline() stout.close() # see if there were any errors allokay = True result = sterr.readline() while result: allokay = False self.outputWindow.addLine(result) self.outputWindow.Update() self.outputWindow.Refresh() result = sterr.readline() sterr.close() # update the version information in the executable if allokay: basedir = os.path.join(self.cfg.get('ConfigData', 'projects'), self.components.baseDir.text) exefile = os.path.join(basedir, self.project.get('Project', 'distfilespath')) exefile = os.path.join(exefile, self.project.get('Project', 'name')) exefile += '.exe' versionfile = os.path.join(basedir, 'versioninfo.txt') versionInfo.SetVersion(exefile, versionfile) # flip back to the original working directory os.chdir(origin) return allokay def buildSpecFile(self): # build a spec file and write it to disk basedir = os.path.join(self.cfg.get('ConfigData', 'projects'), self.components.baseDir.text) specfile = os.path.join(basedir, self.components.projectName.text + '.spec') versionfile = os.path.join(basedir, 'versioninfo.txt') exefile = os.path.join(self.pathJoin(self.project.get('Project', 'buildfilespath')), self.project.get('Project', 'name') + '.exe') mainScript = self.components.mainScript.text mainResource = mainScript.split('.py')[0] + '.rsrc.py' finalResource = self.components.projectName.text + '.rsrc.py' spec = [] spec.append("p = '%s%s' # defines project root directory" % (basedir, os.sep)) spec.append("a = Analysis([os.path.join(HOMEPATH,'support\\_mountzlib.py'),") spec.append(" os.path.join(HOMEPATH,'support\\useUnicode.py'),") spec.append(" p + '%s']," % self.components.mainScript.text) spec.append(" pathex=['%s'])" % self.cfg.get('ConfigData', 'installerpath')) spec.append("pyz = PYZ(a.pure)") spec.append("exe = EXE(pyz,") spec.append(" a.scripts,") spec.append(" exclude_binaries=1,") spec.append(" name='%s'," % exefile) if int(self.project.getboolean('Project', 'debug')) == 1: spec.append(" debug=True,") else: spec.append(" debug=False,") if int(self.project.getboolean('Project', 'striplib')) == 1: spec.append(" strip=True,") else: spec.append(" strip=False,") if int(self.project.getboolean('Project', 'compress')) == 1: spec.append(" upx=True,") else: spec.append(" upx=False,") if int(self.project.getboolean('Project', 'console')) == 1: spec.append(" console=True,") else: spec.append(" console=False,") if self.components.projectIcon.text != '': iconfile = os.path.join(basedir, self.components.projectIcon.text) spec.append(" icon = '%s'," % iconfile) spec.append(" version = '%s')" % versionfile) spec.append("coll = COLLECT(exe,") spec.append(" a.binaries,") # add in all the resource files for res in self.components.resList.items: if res == mainResource: spec.append(" [('%s', p + '%s', 'DATA')]," % (finalResource, res)) else: spec.append(" [('%s', p + '%s', 'DATA')]," % (res, res)) # add in all the pixmap files for p in self.components.pixmapList.items: pixmap = os.path.join(self.project.get('Project', 'pixmapspath'), p) spec.append(" [('%s', p + '%s', 'DATA')]," % (pixmap, pixmap)) # add in all the other files for other in self.components.otherList.items: spec.append(" [('%s', p + '%s', 'DATA')]," % (other, other)) # last few bits and bobs #spec.append(" strip=%s," % int(self.project.getboolean('Project', 'striplib'))) #spec.append(" upx=%s," % int(self.project.getboolean('Project', 'compress'))) if int(self.project.getboolean('Project', 'striplib')) == 1: spec.append(" strip=True,") else: spec.append(" strip=False,") if int(self.project.getboolean('Project', 'compress')) == 1: spec.append(" upx=True,") else: spec.append(" upx=False,") spec.append(" name='%s')" % self.project.get('Project', 'distfilespath')) fd = open(specfile, 'w') for s in spec: s = string.replace(s, os.sep, self.PATHSEP) fd.write(s + '\n') fd.close() def buildVersionFile(self): # build a versioninfo file and write it to disk VINFO = open(os.path.join('templates', 'versioninfo.txt')).read() vinfo = {} vinfo['major'] = self.project.get('Project', 'majorversion') vinfo['minor'] = self.project.get('Project', 'minorversion') vinfo['fix'] = self.project.get('Project', 'fixnumber') vinfo['build'] = self.project.getint('Project', 'build') vinfo['name'] = self.project.get('Project', 'name') vinfo['date'] = time.strftime('%Y%m%d').upper() vinfo['publisher'] = self.project.get('Project', 'publisher') vinfo['desc'] = self.project.get('Project', 'projectdesc') vinfo['companyname'] = self.cfg.get('ConfigData', 'companyname') basedir = os.path.join(self.cfg.get('ConfigData', 'projects'), self.components.baseDir.text) versionfile = os.path.join(str(basedir), 'versioninfo.txt') #bull = raw_input('should now have [%s]' % versionfile) fd = open(versionfile, 'w') fd.write(VINFO % vinfo) fd.close() def buildApplication(self): # run the pyInstaller build script and capture the output if sys.platform.startswith('win'): cmd = 'python ' + GetShortPathName(self.cfg.get('ConfigData', 'installerpath')) else: cmd = self.cfg.get('ConfigData', 'installerpath') basedir = os.path.join(self.cfg.get('ConfigData', 'projects'), self.components.baseDir.text) specfile = os.path.join(basedir, self.components.projectName.text + '.spec') # possible bug??? cmd += ' "' + specfile + '" -o "' + os.path.join(basedir, self.pathJoin(self.project.get('Project','buildfilespath'))) + '"' stin, stout, sterr = os.popen3(cmd) stin.close() result = stout.readline() while result: self.outputWindow.addLine(result) self.outputWindow.Update() self.outputWindow.Refresh() result = stout.readline() stout.close() # see if there were any errors allokay = True result = sterr.readline() while result: allokay = False self.outputWindow.addLine(result) self.outputWindow.Update() self.outputWindow.Refresh() result = sterr.readline() sterr.close() return allokay def buildInnoFile(self): # rebuild the Inno Setup spec file inno = [] basedir = os.path.join(self.cfg.get('ConfigData', 'projects'), self.components.baseDir.text) innofile = self.components.projectName.text + '.iss' innofile = os.path.join(basedir, innofile) inno.append('; script auto-generated by standaloneBuilder - do not edit!') inno.append('') inno.append('[Setup]') inno.append('AppName=%s' % self.project.get('Project', 'name')) appverstring = self.project.get('Project', 'name') + ' ' appverstring += self.project.get('Project', 'majorversion') + '.' appverstring += self.project.get('Project', 'minorversion') + '.' appverstring += self.project.get('Project', 'fixnumber') inno.append('AppVerName=%s' % appverstring) if self.project.get('Project', 'publisher') != '': inno.append('AppPublisher=%s' % self.project.get('Project', 'publisher')) if self.project.get('Project', 'appurl') != '': inno.append('AppPublisherURL=%s' % self.project.get('Project', 'appurl')) if self.project.get('Project', 'appurl') != '': inno.append('AppSupportURL=%s' % self.project.get('Project', 'appurl')) if self.project.get('Project', 'appurl') != '': inno.append('AppUpdatesURL=%s' % self.project.get('Project', 'appurl')) inno.append('DefaultDirName={pf}%s' % (chr(92) + self.project.get('Project', 'name'))) inno.append('DefaultGroupName=%s' % self.project.get('Project', 'name')) inno.append('AllowNoIcons=yes') if self.project.get('Project', 'applicence') != '': licencefile = os.path.join(basedir,self.pathJoin(self.project.get('Project', 'applicence'))) inno.append('LicenseFile=%s' % licencefile) infofile = os.path.join(basedir, 'changelog.txt') inno.append('InfoBeforeFile=%s' % infofile) outputfile = self.project.get('Project', 'name') + '-' outputfile += self.project.get('Project', 'majorversion') + '.' outputfile += self.project.get('Project', 'minorversion') + '.' outputfile += self.project.get('Project', 'fixnumber') + '-' outputfile += self.project.get('Project', 'build') inno.append('OutputBaseFilename=%s' % outputfile) inno.append('') inno.append('[Tasks]') inno.append('Name: "desktopicon"; Description: "Create a &desktop icon"; GroupDescription: "Additional icons:"; Flags: unchecked') inno.append('Name: "quicklaunchicon"; Description: "Create a &Quick Launch icon"; GroupDescription: "Additional icons:"; Flags: unchecked') inno.append('') inno.append('[Files]') outputDir = os.path.join(basedir, self.pathJoin(self.project.get('Project', 'distfilespath'))) for f in os.listdir(outputDir): fullname = os.path.join(outputDir, f) if not os.path.isdir(fullname): inno.append('Source: "%s"; DestDir: "{app}"; Flags: ignoreversion' % fullname) else: x = len(os.listdir(fullname)) if x > 0: inno.append('Source: "%s\\*"; DestDir: "{app}\\%s"; Flags: ignoreversion recursesubdirs' % (fullname, f)) inno.append('') inno.append('[Icons]') inno.append('Name: "{group}\\%s"; Filename: "{app}\\%s.exe"' % (self.project.get('Project', 'name'), self.project.get('Project', 'name').lower())) inno.append('Name: "{userdesktop}\\%s"; Filename: "{app}\\%s.exe"; Tasks: desktopicon' % (self.project.get('Project', 'name'), self.project.get('Project', 'name').lower())) inno.append('Name: "{userappdata}\\Microsoft\\Internet Explorer\\Quick Launch\\%s"; Filename: "{app}\\%s.exe"; Tasks: quicklaunchicon' % (self.project.get('Project', 'name'), self.project.get('Project', 'name').lower())) fd = open(innofile, 'w') for s in inno: s = string.replace(s, os.sep, self.PATHSEP) fd.write(s + '\n') fd.close() def buildInstaller(self): # rebuild the distributable basedir = os.path.join(self.cfg.get('ConfigData', 'projects'), self.components.baseDir.text) innofile = self.components.projectName.text + '.iss' innofile = os.path.join(basedir, innofile) try: import ctypes except ImportError: try: import win32api except ImportError: #import os os.startfile(innofile) else: win32api.ShellExecute(0, "compile", innofile, None, None, 0) else: res = ctypes.windll.shell32.ShellExecuteA(0, "compile", innofile, None, None, 0) if res < 32: raise RuntimeError, "ShellExecute failed, error %d" % res def freezeProject(self): # freeze the project for a release frozen = False basedir = os.path.join(self.cfg.get('ConfigData', 'projects'), self.components.baseDir.text) chglog = os.path.join(basedir, 'changelog.txt') newchglog = os.path.join(basedir, 'changelog-new.txt') fd = open(chglog, 'r') log = fd.readlines() fd.close() # There should be a 'TBA' tag in the first line if 'TBA' in log[0]: rdate = time.strftime('%B %d %Y') log[0] = string.replace(log[0], 'TBA', rdate) dashes = '-' * (len(log[0]) - 1) log[1] = dashes + '\n' fd = open(newchglog, 'w') for line in log: fd.write(line) fd.close() os.unlink(chglog) os.rename(newchglog, chglog) self.project.set('Project', 'status', 'frozen') self.documentChanged = True for comp in self.components.keys(): if self.components[comp].userdata != 'frozen': self.components[comp].enabled = False self.updateStatusBar() frozen = True else: title = 'Release error!' txt = 'Release date tag seems to be missing from the changelog file!' bull = dialog.alertDialog(self, wrap_string(txt, 60), title) return frozen def releaseProject(self): # confirm a release released = False basedir = os.path.join(self.cfg.get('ConfigData', 'projects'), self.components.baseDir.text) # first confirm what the new version number will be vstring = self.components.versionString.text dlg = versionDialog(self, vstring) if dlg.ShowModal() != wx.ID_OK: return 0 vstring = dlg.getVersion() # returns a list-type template = {} template['name'] = self.components.projectName.text template['major'] = vstring[0] template['minor'] = vstring[1] template['fix'] = vstring[2] # now prepend this to the top of the changelog tmplfile = os.path.join('templates', 'changelog.txt') chglogData = open(tmplfile, 'r').read() chglogData = chglogData % template dashes = '-' * len(chglogData) chglog = os.path.join(basedir, 'changelog.txt') fd = open(chglog, 'r') log = fd.readlines() fd.close() newchglog = os.path.join(basedir, 'changelog-new.txt') fd = open(newchglog, 'w') fd.write(chglogData) # new stuff fd.write(dashes + '\n') fd.write('\n\n') # couple of blank lines for line in log: fd.write(line) fd.close() os.unlink(chglog) os.rename(newchglog, chglog) # update the project and UI with the new version number and un-freeze self.project.set('Project', 'majorversion', vstring[0]) self.project.set('Project', 'minorversion', vstring[1]) self.project.set('Project', 'fixnumber', vstring[2]) self.project.set('Project', 'build', '1') self.project.set('Project', 'status', 'open') self.components.versionString.text = vstring[0] + '.' + vstring[1] + '.' + vstring[2] self.documentChanged = True self.updateStatusBar() released = True for comp in self.components.keys(): self.components[comp].enabled = True return released ############################################################################## # third level stuff - routines called by the second level code # ############################################################################## def createConfig(self): # create a config file the first time pimp is run title = 'Initial setup' txt = 'Since this is the first time you have run standaloneBuilder, you need to configure ' txt += 'the program according to your preferences. Most users should find that the ' txt += 'default settings are satisfactory.\n\nOn this system, settings will be stored ' txt += 'in "%s". In the preferences dialog, you can click the "?" buttons to get ' % self.CONFIG_FILE txt += 'help with any of the options.\n\nClick OK to begin configuring standaloneBuilder.' bull = dialog.alertDialog(self, wrap_string(txt, 60), title) self.cfg = ConfigParser.ConfigParser() self.cfg.add_section('ConfigData') # see if we have the PythonCard code editor want = os.path.join('PythonCard', 'tools') want = os.path.join(want, 'codeEditor') want = os.path.join(want, 'codeEditor.py') editor = self.lookFor(want) self.cfg.set('ConfigData', 'codeeditor', editor) # see if we have the PythonCard resource editor # C:\Python23\Lib\site-packages\PythonCard\tools\resourceEditor want = os.path.join('PythonCard', 'tools') want = os.path.join(want, 'resourceEditor') want = os.path.join(want, 'resourceEditor.py') resedit = self.lookFor(want) self.cfg.set('ConfigData', 'reseditor', resedit) self.cfg.set('ConfigData', 'pixmapeditor', '') self.cfg.set('ConfigData', 'texteditor', editor) # see if we can find pyInstaller # C:\Python23\pyInstaller\Build.py want = os.path.join('pyInstaller', 'Build.py') installer = self.lookFor(want) self.cfg.set('ConfigData', 'installerpath', installer) if installer == '': self.cfg.set('ConfigData', 'buildtool', 'py2exe') else: self.cfg.set('ConfigData', 'buildtool', 'pyInstaller') # see if we can find the Inno Setup command line compiler # C:\Program Files\Inno Setup 5\ISCC.exe want = os.path.join('Inno Setup 5', 'ISCC.exe') compiler = self.lookFor(want) self.cfg.set('ConfigData', 'compilerpath', compiler) self.cfg.set('ConfigData', 'publisher', '') self.cfg.set('ConfigData', 'companyname', '') if sys.platform.startswith('linux') or sys.platform.startswith('freebsd'): projdir = os.path.expanduser('~') projdir = os.path.join(projdir, 'proj') else: projdir = '' self.cfg.set('ConfigData', 'projects', projdir) dlg = prefsDialog(self, self.CONFIG_FILE) if dlg.ShowModal() != wx.ID_OK: title = 'Preferences not saved!' txt = 'You must configure your preferences before using standaloneBuilder!' bull = dialog.alertDialog(self, wrap_string(txt, 60), title) dlg.destroy() sys.exit(1) dlg.Destroy() def UI2Project(self): # update the project object try: self.project.add_section('Project') except: pass vstring = string.split(self.components.versionString.text, '.') self.project.set('Project', 'majorversion', str(vstring[0])) self.project.set('Project', 'minorversion', str(vstring[1])) self.project.set('Project', 'fixnumber', str(vstring[2])) self.project.set('Project', 'name', self.components.projectName.text) # set the project basepath, we need to split off the top level projects # folder as defined in prefs base = self.getRelativePath(self.cfg.get('ConfigData', 'projects'), self.components.baseDir.text) base = self.pathSplit(base) self.project.set('Project', 'basepath', base) self.project.set('Project', 'projectdesc', self.components.projectDesc.text) self.project.set('Project', 'mainscript', self.pathSplit(self.components.mainScript.text)) self.project.set('Project', 'iconfile', self.pathSplit(self.components.projectIcon.text)) self.project.set('Project', 'innoscript', '%s.iss' % self.components.projectName.text) self.project.set('Project', 'specfile', '%s.spec' % self.components.projectName.text) try: self.project.remove_section('Scripts') self.project.add_section('Scripts') except: pass cnt = 0 for item in self.components.scriptList.items: self.project.set('Scripts', str(cnt), self.pathSplit(item)) cnt += 1 try: self.project.remove_section('ResourceFiles') self.project.add_section('ResourceFiles') except: pass cnt = 0 for item in self.components.resList.items: self.project.set('ResourceFiles', str(cnt), self.pathSplit(item)) cnt += 1 try: self.project.remove_section('Otherfiles') self.project.add_section('Otherfiles') except: pass cnt = 0 for item in self.components.otherList.items: self.project.set('Otherfiles', str(cnt), self.pathSplit(item)) cnt += 1 try: self.project.add_section('Pixmaps') except: pass cnt = 0 for item in self.components.pixmapList.items: self.project.set('Pixmaps', str(cnt), self.pathSplit(item)) cnt += 1 def pathSplit(self, item): # splits a path up into comma separated sections out = string.replace(item, os.sep, ',') return out def updateStatusBar(self): string = self.components.projectName.text string += '-' string += self.components.versionString.text string += ' (Build ' + self.project.get('Project', 'build') + ')' string += ' - Release status: %s' % self.project.get('Project', 'status') mod = '' if self.documentChanged: mod = ' *' if self.documentPath is not None: self.SetTitle(self.startTitle + ' - [' + os.path.split(self.documentPath)[-1] + mod + ']') else: self.SetTitle(self.startTitle + ' - [Untitled' + mod + ']') self.statusBar.text = string try: wx.Yield() except: pass def createProject(self): # create all the folders and other gubbins basepath = os.path.join(self.cfg.get('ConfigData', 'projects'), self.pathJoin(self.project.get('Project', 'basepath'))) try: os.mkdir(os.path.join(basepath, self.project.get('Project', 'buildfilespath'))) except: pass try: os.mkdir(os.path.join(basepath, self.project.get('Project', 'distfilespath'))) except: pass try: os.mkdir(os.path.join(basepath, self.project.get('Project', 'pixmapspath'))) except: pass try: os.mkdir(os.path.join(basepath, self.project.get('Project', 'tarballspath'))) except: pass try: os.mkdir(os.path.join(basepath, self.project.get('Project', 'docfilespath'))) except: pass # copy in various things from templates templatedir = os.path.dirname(os.path.abspath(__file__)) templatedir = os.path.join(templatedir, 'templates') vinfo = {} vinfo['major'] = self.project.get('Project', 'majorversion') vinfo['minor'] = self.project.get('Project', 'minorversion') vinfo['fix'] = self.project.get('Project', 'fixnumber') vinfo['build'] = str('%04d' % self.project.getint('Project', 'build')) vinfo['name'] = self.project.get('Project', 'name') vinfo['date'] = time.strftime('%Y%b%d').upper() vinfo['publisher'] = self.project.get('Project', 'publisher') vinfo['desc'] = self.project.get('Project', 'projectdesc') vinfo['appurl'] = self.project.get('Project', 'appurl') # HTML about page VINFO = open(os.path.join(templatedir, 'about.html')).read() afile = os.path.join(basepath, self.project.get('Project', 'docfilespath')) afile = os.path.join(afile, 'about.html') if os.path.exists(afile): txt = '%s already exists. Would you like to overwrite this' % (afile) txt += ' file with a new version?' result = dialog.messageDialog(self, wrap_string(txt, 60), 'Please confirm', wx.ICON_EXCLAMATION|wx.YES_NO|wx.NO_DEFAULT) if result.accepted: fd = open(afile, 'w') fd.write(VINFO % vinfo) fd.close() else: fd = open(afile, 'w') fd.write(VINFO % vinfo) fd.close() # HTML author page VINFO = open(os.path.join(templatedir, 'author.html')).read() afile = os.path.join(basepath, self.project.get('Project', 'docfilespath')) afile = os.path.join(afile, 'author.html') if os.path.exists(afile): txt = '%s already exists. Would you like to overwrite this' % (afile) txt += ' file with a new version?' result = dialog.messageDialog(self, wrap_string(txt, 60), 'Please confirm', wx.ICON_EXCLAMATION|wx.YES_NO|wx.NO_DEFAULT) if result.accepted: fd = open(afile, 'w') fd.write(VINFO % vinfo) fd.close() else: fd = open(afile, 'w') fd.write(VINFO % vinfo) fd.close() # HTML GPL license text page VINFO = open(os.path.join(templatedir, 'gpl.html')).read() afile = os.path.join(basepath, self.project.get('Project', 'docfilespath')) afile = os.path.join(afile, 'gpl.html') if os.path.exists(afile): txt = '%s already exists. Would you like to overwrite this' % (afile) txt += ' file with a new version?' result = dialog.messageDialog(self, wrap_string(txt, 60), 'Please confirm', wx.ICON_EXCLAMATION|wx.YES_NO|wx.NO_DEFAULT) if result.accepted: fd = open(afile, 'w') fd.write(VINFO % vinfo) fd.close() else: fd = open(afile, 'w') fd.write(VINFO % vinfo) fd.close() # plaintext GPL license text page VINFO = open(os.path.join(templatedir, 'gpl.txt')).read() afile = os.path.join(basepath, self.project.get('Project', 'docfilespath')) afile = os.path.join(afile, 'gpl.txt') if os.path.exists(afile): txt = '%s already exists. Would you like to overwrite this' % (afile) txt += ' file with a new version?' result = dialog.messageDialog(self, wrap_string(txt, 60), 'Please confirm', wx.ICON_EXCLAMATION|wx.YES_NO|wx.NO_DEFAULT) if result.accepted: fd = open(afile, 'w') fd.write(VINFO % vinfo) fd.close() else: fd = open(afile, 'w') fd.write(VINFO % vinfo) fd.close() # changelog template VINFO = open(os.path.join(templatedir, 'changelog.txt')).read() afile = os.path.join(basepath, 'changelog.txt') if os.path.exists(afile): txt = '%s already exists. Would you like to overwrite this' % (afile) txt += ' file with a new version?' result = dialog.messageDialog(self, wrap_string(txt, 60), 'Please confirm', wx.ICON_EXCLAMATION|wx.YES_NO|wx.NO_DEFAULT) if result.accepted: fd = open(afile, 'w') txtline = VINFO % vinfo dashes = '-' * len(txtline) fd.write(txtline) fd.write(dashes + '\n') fd.close() else: fd = open(afile, 'w') txtline = VINFO % vinfo dashes = '-' * len(txtline) fd.write(txtline) fd.write(dashes + '\n') fd.close() # readme template VINFO = open(os.path.join(templatedir, 'readme.txt')).read() afile = os.path.join(basepath, 'readme.txt') if os.path.exists(afile): txt = '%s already exists. Would you like to overwrite this' % (afile) txt += ' file with a new version?' result = dialog.messageDialog(self, wrap_string(txt, 60), 'Please confirm', wx.ICON_EXCLAMATION|wx.YES_NO|wx.NO_DEFAULT) if result.accepted: fd = open(afile, 'w') fd.write(VINFO % vinfo) fd.close() else: fd = open(afile, 'w') fd.write(VINFO % vinfo) fd.close() def Project2UI(self): vstring = (self.project.get('Project', 'majorversion')) +'.' vstring += (self.project.get('Project', 'minorversion')) + '.' vstring += (self.project.get('Project', 'fixnumber')) self.components.versionString.text = vstring self.components.projectName.text = self.project.get('Project', 'name') self.components.baseDir.text = self.pathJoin(self.project.get('Project', 'basepath')) self.components.projectDesc.text = self.project.get('Project', 'projectdesc') self.components.mainScript.text = self.pathJoin(self.project.get('Project', 'mainscript')) self.components.projectIcon.text = self.pathJoin(self.project.get('Project', 'iconfile')) self.components.scriptList.items = self.sectionOutput('Scripts') self.components.resList.items = self.sectionOutput('ResourceFiles') self.components.otherList.items = self.sectionOutput('Otherfiles') self.components.pixmapList.items = self.sectionOutput('Pixmaps') def sectionOutput(self, section, fd=None, prefix=None): # take a section of a project file and either output # it to a given filehandle or add it to a list. In both # cases, os-specific path separators are added as # required cnt = 0 list = [] while 1: try: item = self.project.get(section, str(cnt)) except: break else: if prefix is not None: item = os.path.join(prefix, item) if fd is None: list.append(self.pathJoin(item)) else: fd.write(self.pathJoin(item) + '\n') cnt += 1 return list def pathJoin(self, item): # replace commas with os-specific path separators if ',' in item: ilist = string.split(item, ',') result = '' for part in ilist: result = os.path.join(result, part) item = result return item def lookFor(self, want): found = '' searchpaths = sys.path if sys.platform.startswith('linux') or sys.platform.startswith('freebsd'): searchpaths.append('/usr/share') if sys.platform.startswith('win'): searchpaths.append('C:\\Program Files') for search in searchpaths: if os.path.exists(os.path.join(search, want)): found = os.path.join(search, want) break return found def openFile(self, path): self.project = ConfigParser.ConfigParser() self.project.read(path) self.documentPath = path self.documentChanged = False self.SetTitle(os.path.split(path)[-1] + ' - ' + self.startTitle) self.Project2UI() self.updateStatusBar() pstatus = self.project.get('Project', 'status') if pstatus == 'frozen': title = 'Frozen project' txt = 'This release of the %s project has been frozen ready ' % self.project.get('Project', 'name') txt += 'for release. The project ' txt += 'should be rebuilt on all the platforms you are interested in.\n\nYou ' txt += 'should then click the release button to un-freeze the ' txt += 'project and initialize the next version.' bull = dialog.alertDialog(self, wrap_string(txt, 60), title) for comp in self.components.keys(): if self.components[comp].userdata != pstatus: self.components[comp].enabled = False else: self.components[comp].enabled = True self.menuBar.setEnabled('menuFileNew', True) self.menuBar.setEnabled('menuFileOpen', True) self.menuBar.setEnabled('menuFileSave', False) self.menuBar.setEnabled('menuFileSaveAs', False) self.menuBar.setEnabled('menuFileExit', True) self.menuBar.setEnabled('menuEditMainScript', False) self.menuBar.setEnabled('menuEditChglog', False) self.menuBar.setEnabled('menuEditReadme', False) self.menuBar.setEnabled('menuEditSpecfile', False) self.menuBar.setEnabled('menuEditInnoFile', False) self.menuBar.setEnabled('menuEditProps', False) self.menuBar.setEnabled('menuEditPrefs', True) self.menuBar.setEnabled('menuToolsLogAdd', False) self.menuBar.setEnabled('menuToolsChkImport', False) self.menuBar.setEnabled('menuToolsAddScript', False) self.menuBar.setEnabled('menuToolsAddResource', False) self.menuBar.setEnabled('menuToolsAddPixmap', False) self.menuBar.setEnabled('menuToolsAddOther', False) self.menuBar.setEnabled('menuToolsRunMain', False) self.menuBar.setEnabled('menuToolsRebuild', True) self.menuBar.setEnabled('menuToolsRelease', True) self.menuBar.setEnabled('menuHelpManual', True) self.menuBar.setEnabled('menuHelpAbout', True) if pstatus == 'open': for comp in self.components.keys(): self.components[comp].enabled = True self.menuBar.setEnabled('menuFileNew', True) self.menuBar.setEnabled('menuFileOpen', True) self.menuBar.setEnabled('menuFileSave', True) self.menuBar.setEnabled('menuFileSaveAs', True) self.menuBar.setEnabled('menuFileExit', True) self.menuBar.setEnabled('menuEditMainScript', True) self.menuBar.setEnabled('menuEditChglog', True) self.menuBar.setEnabled('menuEditReadme', True) self.menuBar.setEnabled('menuEditSpecfile', True) self.menuBar.setEnabled('menuEditInnoFile', True) self.menuBar.setEnabled('menuEditProps', True) self.menuBar.setEnabled('menuEditPrefs', True) self.menuBar.setEnabled('menuToolsLogAdd', True) self.menuBar.setEnabled('menuToolsChkImport', True) self.menuBar.setEnabled('menuToolsAddScript', True) self.menuBar.setEnabled('menuToolsAddResource', True) self.menuBar.setEnabled('menuToolsAddPixmap', True) self.menuBar.setEnabled('menuToolsAddOther', True) self.menuBar.setEnabled('menuToolsRunMain', True) self.menuBar.setEnabled('menuToolsRebuild', True) self.menuBar.setEnabled('menuToolsRelease', True) self.menuBar.setEnabled('menuHelpManual', True) self.menuBar.setEnabled('menuHelpAbout', True) if self.cfg.get('ConfigData', 'buildtool') != 'pyInstaller': self.components.specBtn.enabled = False self.menuBar.setEnabled('menuEditSpecfile', False) else: self.components.specBtn.enabled = True self.menuBar.setEnabled('menuEditSpecfile', True) if __name__ == '__main__': app = model.Application(standaloneBuilder) app.MainLoop() PythonCard-0.8.2/tools/standaloneBuilder/standaloneBuilder.rsrc.py0000755000076500007650000003540210431133454025277 0ustar alexalex00000000000000{'application':{'type':'Application', 'name':'Template', 'backgrounds': [ {'type':'Background', 'name':'standaloneBuilder', 'title':'PythonCard standaloneBuilder', 'size':(800, 594), 'statusBar':1, 'menubar': {'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ {'type':'MenuItem', 'name':'menuFileNew', 'label':'&New\tCtrl+N', 'command':'newBtn', }, {'type':'MenuItem', 'name':'menuFileOpen', 'label':'&Open\tCtrl+O', 'command':'openBtn', }, {'type':'MenuItem', 'name':'menuFileSave', 'label':'&Save\tCtrl+S', 'command':'saveBtn', }, {'type':'MenuItem', 'name':'menuFileSaveAs', 'label':'Save &As...', }, {'type':'MenuItem', 'name':'fileSep2', 'label':'-', }, {'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'menuFileExit', }, ] }, {'type':'Menu', 'name':'Edit', 'label':'&Edit', 'items': [ {'type':'MenuItem', 'name':'menuEditMainScript', 'label':u'&Main script...', 'command':'EditMainScript', }, {'type':'MenuItem', 'name':'menuEditChglog', 'label':u'&Changelog...', 'command':'editChgLog', }, {'type':'MenuItem', 'name':'menuEditReadme', 'label':u'&README...', 'command':'editReadme', }, {'type':'MenuItem', 'name':'menuEditSpecfile', 'label':u'&Spec file...', 'command':'editSpecFile', }, {'type':'MenuItem', 'name':'menuEditInnoFile', 'label':u'&Inno script...', 'command':'editInnoFile', }, {'type':'MenuItem', 'name':'menuEditProps', 'label':u'&Project properties...', 'command':'editProps', }, {'type':'MenuItem', 'name':'editSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditPrefs', 'label':u'&Preferences...', 'command':'editPrefs', }, ] }, {'type':'Menu', 'name':'menuTools', 'label':'&Tools', 'items': [ {'type':'MenuItem', 'name':'menuToolsLogAdd', 'label':u'A&dd changelog entry...\tShift++', 'command':'menuToolsLogAdd', }, {'type':'MenuItem', 'name':'menuToolsChkImport', 'label':u'&Check component imports', 'command':'menuToolsChkImport', }, {'type':'MenuItem', 'name':'toolSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuToolsAddScript', 'label':u'Add &script...', 'command':'addScript', }, {'type':'MenuItem', 'name':'menuToolsAddResource', 'label':u'Add &resource...', 'command':'addResource', }, {'type':'MenuItem', 'name':'menuToolsAddPixmap', 'label':u'Add &pixmap...', 'command':'addPixmap', }, {'type':'MenuItem', 'name':'menuToolsAddOther', 'label':u'Add &other...', 'command':'addOther', }, {'type':'MenuItem', 'name':'toolSep2', 'label':u'-', }, {'type':'MenuItem', 'name':'menuToolsRunMain', 'label':u'Run &main script', 'command':'runMainScript', }, {'type':'MenuItem', 'name':'toolSep3', 'label':u'-', }, {'type':'MenuItem', 'name':'menuToolsRebuild', 'label':'R&ebuild\tCtrl+R', 'command':'rebuildCmd', }, {'type':'MenuItem', 'name':'menuToolsRelease', 'label':u'&Release\tCtrl+M', 'command':'releaseCmd', }, ] }, {'type':'Menu', 'name':'menuHelp', 'label':'&Help', 'items': [ {'type':'MenuItem', 'name':'menuHelpManual', 'label':u'&Manual', 'command':'menuHelpManual', }, {'type':'MenuItem', 'name':'menuHelpAbout', 'label':u'&About standaloneBuilder...', 'command':'menuHelpAbout', }, ] }, ] }, 'strings': { u'testString':u'This is a test string', }, 'components': [ {'type':'ImageButton', 'name':'newBtn', 'position':(5, 5), 'size':(32, 32), 'backgroundColor':(255, 255, 255), 'border':'3d', 'command':'newBtn', 'file':'pixmaps/new.png', 'toolTip':'Create a new project', 'userdata':'frozen', }, {'type':'ImageButton', 'name':'openBtn', 'position':(40, 5), 'size':(32, 32), 'backgroundColor':(255, 255, 255), 'border':'3d', 'command':'openBtn', 'file':'pixmaps/open.png', 'toolTip':'Open an existing project', 'userdata':'frozen', }, {'type':'ImageButton', 'name':'saveBtn', 'position':(75, 5), 'size':(32, 32), 'backgroundColor':(255, 255, 255), 'border':'3d', 'command':'saveBtn', 'file':'pixmaps/save.png', 'toolTip':'Save the current project', 'userdata':'frozen', }, {'type':'ImageButton', 'name':'prefsBtn', 'position':(705, 5), 'size':(32, 32), 'backgroundColor':(255, 255, 255), 'border':'3d', 'command':'editPrefs', 'file':'pixmaps/prefs.png', 'toolTip':'standaloneBuilder preferences', 'userdata':'frozen', }, {'type':'ImageButton', 'name':'quitBtn', 'position':(750, 5), 'size':(32, 32), 'backgroundColor':(255, 255, 255), 'border':'3d', 'command':'quitBtn', 'file':'pixmaps/exit.png', 'toolTip':'Quit the program', 'userdata':'frozen', }, {'type':'TextField', 'name':'projectName', 'position':(95, 60), 'size':(250, -1), }, {'type':'TextField', 'name':'projectIcon', 'position':(500, 60), 'size':(250, -1), }, {'type':'Button', 'name':'iconBtn', 'position':(755, 60), 'size':(22, 22), 'label':'...', }, {'type':'TextField', 'name':'baseDir', 'position':(95, 90), 'size':(250, -1), }, {'type':'Button', 'name':'baseDirBtn', 'position':(350, 90), 'size':(22, 22), 'label':'...', }, {'type':'TextField', 'name':'projectDesc', 'position':(500, 90), 'size':(250, -1), }, {'type':'TextField', 'name':'mainScript', 'position':(95, 120), 'size':(250, -1), }, {'type':'Button', 'name':'mainScriptBtn', 'position':(350, 120), 'size':(22, 22), 'label':'...', }, {'type':'Button', 'name':'mainScriptEditBtn', 'position':(375, 120), 'size':(50, 22), 'command':'EditMainScript', 'label':'Edit...', }, {'type':'List', 'name':'scriptList', 'position':(15, 185), 'size':(360, 95), 'items':[], }, {'type':'Button', 'name':'scriptAddBtn', 'position':(15, 285), 'size':(-1, 22), 'command':'addScript', 'label':'Add...', }, {'type':'Button', 'name':'scriptDelBtn', 'position':(95, 285), 'size':(-1, 22), 'label':'Remove', }, {'type':'Button', 'name':'scriptEditBtn', 'position':(175, 285), 'size':(-1, 22), 'label':'Edit...', }, {'type':'Button', 'name':'scriptDelAllBtn', 'position':(300, 285), 'size':(-1, 22), 'label':'Clear all', }, {'type':'List', 'name':'resList', 'position':(415, 185), 'size':(360, 95), 'items':[], }, {'type':'Button', 'name':'resAddBtn', 'position':(415, 285), 'size':(-1, 22), 'command':'addResource', 'label':'Add..', }, {'type':'Button', 'name':'resDelBtn', 'position':(495, 285), 'size':(-1, 22), 'label':'Remove', }, {'type':'Button', 'name':'resEditBtn', 'position':(575, 285), 'size':(-1, 22), 'label':'Edit...', }, {'type':'Button', 'name':'resDelAllBtn', 'position':(700, 285), 'size':(-1, 22), 'label':'Clear all', }, {'type':'List', 'name':'pixmapList', 'position':(15, 340), 'size':(360, 95), 'items':[], }, {'type':'Button', 'name':'pixmapAddBtn', 'position':(14, 440), 'size':(-1, 22), 'command':'addPixmap', 'label':'Add...', }, {'type':'Button', 'name':'pixmapDelBtn', 'position':(95, 440), 'size':(-1, 22), 'label':'Remove', }, {'type':'Button', 'name':'pixmapEditBtn', 'position':(175, 440), 'size':(-1, 22), 'label':'Edit...', }, {'type':'Button', 'name':'pixmapDelAllBtn', 'position':(300, 440), 'size':(-1, 22), 'label':'Clear all', }, {'type':'List', 'name':'otherList', 'position':(415, 340), 'size':(360, 95), 'items':[], }, {'type':'Button', 'name':'docAddBtn', 'position':(414, 440), 'size':(-1, 22), 'command':'addOther', 'label':'Add...', }, {'type':'Button', 'name':'docDelBtn', 'position':(495, 440), 'size':(-1, 22), 'label':'Remove', }, {'type':'Button', 'name':'docEditBtn', 'position':(575, 440), 'size':(-1, 22), 'label':'Edit...', }, {'type':'Button', 'name':'docDelAllBtn', 'position':(700, 440), 'size':(-1, 22), 'label':'Clear all', }, {'type':'Button', 'name':'propertiesBtn', 'position':(15, 475), 'size':(74, 22), 'command':'editProps', 'label':'Props...', 'toolTip':'Change your projects properties', }, {'type':'Button', 'name':'changelogBtn', 'position':(95, 475), 'size':(76, 22), 'command':'editChgLog', 'label':'Chglog...', 'toolTip':'Edit the changelog file', }, {'type':'Button', 'name':'readmeBtn', 'position':(95, 500), 'size':(-1, 22), 'command':'editReadme', 'label':'README...', 'toolTip':'Edit the README file', }, {'type':'Button', 'name':'specBtn', 'position':(175, 475), 'size':(-1, 22), 'command':'editSpecFile', 'label':'Spec file...', 'toolTip':'Edit the applications spec file', }, {'type':'Button', 'name':'innoBtn', 'position':(175, 500), 'size':(76, 22), 'command':'editInnoFile', 'label':'Inno script...', 'toolTip':'Edit the Inno setup script for your application', }, {'type':'Button', 'name':'runBtn', 'position':(300, 475), 'size':(-1, 22), 'command':'runMainScript', 'label':'Run...', 'toolTip':'Run the application', }, {'type':'Button', 'name':'rebuildBtn', 'position':(700, 475), 'size':(-1, 22), 'command':'rebuildCmd', 'label':'Rebuild', 'toolTip':'Rebuild the standalone version of your application', 'userdata':'frozen', }, {'type':'Button', 'name':'releaseBtn', 'position':(700, 500), 'size':(-1, 22), 'command':'releaseCmd', 'label':'Release', 'toolTip':'Make a release of your finished application', 'userdata':'frozen', }, {'type':'StaticText', 'name':'versionString', 'position':(500, 125), 'text':'n/a', }, {'type':'StaticBox', 'name':'StaticBox2', 'position':(5, 165), 'size':(380, 150), 'label':'Script files:', }, {'type':'StaticBox', 'name':'StaticBox3', 'position':(405, 165), 'size':(380, 150), 'label':'Resource files:', }, {'type':'StaticBox', 'name':'StaticBox4', 'position':(5, 320), 'size':(380, 150), 'label':'Pixmap files:', }, {'type':'StaticBox', 'name':'StaticBox5', 'position':(405, 320), 'size':(380, 150), 'label':'Other files:', }, {'type':'StaticBox', 'name':'StaticBox1', 'position':(5, 40), 'size':(780, 125), 'label':'Project:', }, {'type':'StaticText', 'name':'StaticText5', 'position':(15, 125), 'text':'Main script file', }, {'type':'StaticText', 'name':'StaticText4', 'position':(395, 95), 'text':'Project description', }, {'type':'StaticText', 'name':'StaticText9', 'position':(435, 65), 'text':'Icon (Win)', }, {'type':'StaticText', 'name':'StaticText8', 'position':(450, 125), 'text':'Version', }, {'type':'StaticText', 'name':'StaticText7', 'position':(15, 95), 'text':'Base directory', }, {'type':'StaticText', 'name':'StaticText6', 'position':(15, 65), 'text':'Name', }, ] # end components } # end background ] # end backgrounds } } PythonCard-0.8.2/tools/standaloneBuilder/templates/0000755000076500007650000000000010434046773022317 5ustar alexalex00000000000000PythonCard-0.8.2/tools/standaloneBuilder/templates/about.html0000755000076500007650000000131610237632052024313 0ustar alexalex00000000000000
%(name)s (%(desc)s) Version %(major)s.%(minor)s.%(fix)s
insert project logo here Add a verbose description of your project here...

%(name)s project homepage: %(appurl)s

Developed using the PythonCard GUI toolkit and wxPython, http://pythoncard.sourceforge.net

PythonCard-0.8.2/tools/standaloneBuilder/templates/author.html0000755000076500007650000000104210237632053024500 0ustar alexalex00000000000000

%(name)s was developed by %(publisher)s I would like to also extend my grateful thanks to the following:




Kevin Altis altis@semi-retired.com, without whose excellent work on PythonCard none of this would be possible.

PythonCard-0.8.2/tools/standaloneBuilder/templates/changelog.txt0000755000076500007650000000007610237632053025006 0ustar alexalex00000000000000%(name)s Version %(major)s.%(minor)s.%(fix)s release date TBA PythonCard-0.8.2/tools/standaloneBuilder/templates/gpl.html0000644000076500007650000003642410237632053023771 0ustar alexalex00000000000000

This program is distributed under the terms of the GPL v2.

GNU GENERAL PUBLIC LICENSE

Version 2, June 1991

Copyright (C) 1989, 1991 Free Software Foundation, Inc.
675 Mass Ave, Cambridge, MA 02139, USA

Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

Preamble

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

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

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

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

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

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

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

The precise terms and conditions for copying, distribution and modification follow.

GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

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

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

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

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

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

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

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

c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)

These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.

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

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

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

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

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

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

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

If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.

4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.

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

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

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

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

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

This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.

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

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

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

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

NO WARRANTY

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

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

END OF TERMS AND CONDITIONS

PythonCard-0.8.2/tools/standaloneBuilder/templates/gpl.txt0000644000076500007650000004310310225720710023627 0ustar alexalex00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. PythonCard-0.8.2/tools/standaloneBuilder/templates/readme.txt0000755000076500007650000000006110225720710024301 0ustar alexalex00000000000000This is the README file for the %(name)s project.PythonCard-0.8.2/tools/standaloneBuilder/templates/setup.py0000755000076500007650000000410710431133454024024 0ustar alexalex00000000000000#!/usr/bin/python # # generic py2exe setup script - Phil Edwards # Copyright (c) 2001-2005 PythonCard developers # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. 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. # 3. The name of the author may not be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. # # vim: ai et sw=4 ts=4 from distutils.core import setup import py2exe data_files = eval((open('datafiles.dat').read())) standalone = eval((open('standalone.dat').read())) buildOpts = eval((open('buildoptions.dat').read())) buildType = buildOpts['buildType'] zipfile = r"lib/sharedlib" options = {"py2exe": {"compressed": 1, "optimize": 2}} if buildType != "windows": setup(options = options, zipfile = zipfile, data_files = data_files, console = [standalone]) else: setup(options = options, zipfile = zipfile, data_files = data_files, windows = [standalone]) PythonCard-0.8.2/tools/standaloneBuilder/templates/versioninfo.txt0000755000076500007650000000163610431133454025420 0ustar alexalex00000000000000VSVersionInfo( ffi=FixedFileInfo( filevers=(%(major)s, %(minor)s, %(fix)s, %(build)s), prodvers=(%(major)s, %(minor)s, %(fix)s, %(build)s), mask=0x3f, flags=0x0, OS=0x40004, fileType=0x1, subtype=0x0, date=(0, 0) ), kids=[ StringFileInfo( [ StringTable( '040904B0', [StringStruct('CompanyName', '%(companyname)s'), StringStruct('FileDescription', '%(name)s Executable'), StringStruct('FileVersion', '%(major)s.%(minor)s.%(fix)s.%(date)s%(build)s'), StringStruct('InternalName', '%(name)s'), StringStruct('LegalCopyright', '\xa9 %(publisher)s. All rights reserved.'), StringStruct('OriginalFilename', '%(name)s.exe'), StringStruct('ProductName', '%(desc)s'), StringStruct('ProductVersion', '%(major)s.%(minor)s.%(fix)s')]) ]), VarFileInfo([VarStruct('Translation', [1033, 1200])]) ] ) PythonCard-0.8.2/tools/standaloneBuilder/versionDialog.rsrc.py0000755000076500007650000000202310227755536024454 0ustar alexalex00000000000000{'type':'CustomDialog', 'name':'nextVersion', 'title':'Next Release Version Number', 'position':(169, 114), 'size':(260, 145), 'components': [ {'type':'StaticText', 'name':'StaticText1', 'position':(10, 10), 'text':'Please confirm the next release version number:', }, {'type':'Spinner', 'name':'majorVersion', 'position':(10, 40), 'size':(47, -1), 'max':100, 'min':0, 'value':11, }, {'type':'Spinner', 'name':'minorVersion', 'position':(87, 40), 'size':(47, -1), 'max':100, 'min':0, 'value':0, }, {'type':'Spinner', 'name':'fixLevel', 'position':(164, 40), 'size':(47, -1), 'max':100, 'min':0, 'value':0, }, {'type':'Button', 'id':5100, 'name':'btnOK', 'position':(10, 90), 'default':1, 'label':'OK', }, {'type':'Button', 'id':5101, 'name':'btnCancel', 'position':(90, 90), 'label':'Cancel', }, ] # end components } # end CustomDialog PythonCard-0.8.2/tools/standaloneBuilder/versionInfo.py0000755000076500007650000004643110431133454023175 0ustar alexalex00000000000000# copyright 2001 McMillan Enterprises, Inc. # license: use as you please. No warranty. # Gordon McMillan gmcm@hypernet.com # import win32api import struct import pywintypes import string import pprint TEST=0 LOAD_LIBRARY_AS_DATAFILE = 2 RT_VERSION = 16 def getRaw0(o): return o.raw def getRaw1(o): return str(buffer(o)) import sys if hasattr(sys, "version_info"): pyvers = sys.version_info[0]*10 + sys.version_info[1] else: toks = string.split(sys.version, '.', 2) pyvers = int(toks[0])*10 + int(toks[1]) if pyvers < 20: getRaw = getRaw0 else: getRaw = getRaw1 ##VS_VERSION_INFO { ## WORD wLength; // Specifies the length of the VS_VERSION_INFO structure ## WORD wValueLength; // Specifies the length of the Value member ## WORD wType; // 1 means text, 0 means binary ## WCHAR szKey[]; // Contains the Unicode string "VS_VERSION_INFO". ## WORD Padding1[]; ## VS_FIXEDFILEINFO Value; ## WORD Padding2[]; ## WORD Children[]; // Specifies a list of zero or more StringFileInfo or VarFileInfo structures (or both) that are children of the current version structure. ##}; def decode(pathnm): h = win32api.LoadLibraryEx(pathnm, 0, LOAD_LIBRARY_AS_DATAFILE) nm = win32api.EnumResourceNames(h, RT_VERSION)[0] data = win32api.LoadResource(h, RT_VERSION, nm) vs = VSVersionInfo() j = vs.fromRaw(data) if TEST: print vs if data[:j] != vs.toRaw(): print "AAAAAGGHHHH" txt = repr(vs) glbls = {} glbls['VSVersionInfo'] = VSVersionInfo glbls['FixedFileInfo'] = FixedFileInfo glbls['StringFileInfo'] = StringFileInfo glbls['StringTable'] = StringTable glbls['StringStruct'] = StringStruct glbls['VarFileInfo'] = VarFileInfo glbls['VarStruct'] = VarStruct vs2 = eval(txt+'\n', glbls) if vs.toRaw() != vs2.toRaw(): print print 'reconstruction not the same!' print vs2 win32api.FreeLibrary(h) return vs class VSVersionInfo: def __init__(self, ffi=None, kids=None): self.ffi = ffi self.kids = kids if kids is None: self.kids = [] def fromRaw(self, data): i, (sublen, vallen, wType, nm) = parseCommon(data) #vallen is length of the ffi, typ is 0, nm is 'VS_VERSION_INFO' i = ((i + 3) / 4) * 4 # now a VS_FIXEDFILEINFO self.ffi = FixedFileInfo() j = self.ffi.fromRaw(data, i) #print ffi if TEST: if data[i:j] != self.ffi.toRaw(): print "raw:", `data[i:j]` print "ffi:", `self.ffi.toRaw()` i = j while i < sublen: j = i i, (csublen, cvallen, ctyp, nm) = parseCommon(data, i) if string.strip(str(nm)) == "StringFileInfo": sfi = StringFileInfo() k = sfi.fromRaw(csublen, cvallen, nm, data, i, j+csublen) if TEST: if data[j:k] != sfi.toRaw(): rd = data[j:k] sd = sfi.toRaw() for x in range(0, len(rd), 16): rds = rd[x:x+16] sds = sd[x:x+16] if rds != sds: print "rd[%s:%s+16]: %s" % (x, x, `rds`) print "sd[%s:%s+16]: %s" % (x, x, `sds`) print print "raw: len %d, wLength %d" % (len(rd), struct.unpack('h', rd[:2])[0]) print "sfi: len %d, wLength %d" % (len(sd), struct.unpack('h', sd[:2])[0]) self.kids.append(sfi) i = k else: vfi = VarFileInfo() k = vfi.fromRaw(csublen, cvallen, nm, data, i, j+csublen) self.kids.append(vfi) if TEST: if data[j:k] != vfi.toRaw(): print "raw:", `data[j:k]` print "vfi:", `vfi.toRaw()` i = k i = j + csublen i = ((i + 3) / 4) * 4 return i def toRaw(self): nm = pywintypes.Unicode('VS_VERSION_INFO') rawffi = self.ffi.toRaw() vallen = len(rawffi) typ = 0 sublen = 6 + 2*len(nm) + 2 pad = '' if sublen % 4: pad = '\000\000' sublen = sublen + len(pad) + vallen pad2 = '' if sublen % 4: pad2 = '\000\000' tmp = [] for kid in self.kids: tmp.append(kid.toRaw()) tmp = string.join(tmp, '') sublen = sublen + len(pad2) + len(tmp) return struct.pack('hhh', sublen, vallen, typ) + getRaw(nm) + '\000\000' + pad + rawffi + pad2 + tmp def __repr__(self, indent=''): tmp = [] newindent = indent + ' ' for kid in self.kids: tmp.append(kid.__repr__(newindent+' ')) tmp = string.join(tmp, ', \n') return "VSVersionInfo(\n%sffi=%s,\n%skids=[\n%s\n%s]\n)" % (newindent, self.ffi.__repr__(newindent), newindent, tmp, newindent) def parseCommon(data, start=0): i = start + 6 (wLength, wValueLength, wType) = struct.unpack('3h', data[start:i]) #print "wLength, wValueLength, wType, i:", wLength, wValueLength, wType, i i, szKey = parseUString(data, i, i+wLength) #i = ((i + 3) / 4) * 4 #print `data[start+6:start+wLength]` return i, (wLength, wValueLength, wType, szKey) def parseUString(data, start, limit): i = start while i < limit: if data[i:i+2] == '\000\000': break i = i + 2 szKey = pywintypes.UnicodeFromRaw(data[start:i]) i = i + 2 #print "szKey:", '"'+str(szKey)+'"', "(consumed", i-start, "bytes - to", i, ")" return i, szKey ##VS_FIXEDFILEINFO { // vsffi ## DWORD dwSignature; //Contains the value 0xFEEFO4BD ## DWORD dwStrucVersion; //Specifies the binary version number of this structure. The high-order word of this member contains the major version number, and the low-order word contains the minor version number. ## DWORD dwFileVersionMS; // Specifies the most significant 32 bits of the file’s binary version number ## DWORD dwFileVersionLS; // ## DWORD dwProductVersionMS; // Specifies the most significant 32 bits of the binary version number of the product with which this file was distributed ## DWORD dwProductVersionLS; // ## DWORD dwFileFlagsMask; // Contains a bitmask that specifies the valid bits in dwFileFlags. A bit is valid only if it was defined when the file was created. ## DWORD dwFileFlags; // VS_FF_DEBUG, VS_FF_PATCHED etc. ## DWORD dwFileOS; // VOS_NT, VOS_WINDOWS32 etc. ## DWORD dwFileType; // VFT_APP etc. ## DWORD dwFileSubtype; // 0 unless VFT_DRV or VFT_FONT or VFT_VXD ## DWORD dwFileDateMS; ## DWORD dwFileDateLS; ##}; class FixedFileInfo: def __init__(self, filevers=(0, 0, 0, 0), prodvers=(0, 0, 0, 0), mask=0x3f, flags=0x0, OS=0x40004, fileType=0x1, subtype=0x0, date=(0, 0)): self.sig = -17890115 # 0xfeef04bd self.strucVersion = 0x10000 self.fileVersionMS = (filevers[0] << 16) | (filevers[1] & 0xffff) self.fileVersionLS = (filevers[2] << 16) | (filevers[3] & 0xffff) self.productVersionMS = (prodvers[0] << 16) | (prodvers[1] & 0xffff) self.productVersionLS = (prodvers[2] << 16) | (prodvers[3] & 0xffff) self.fileFlagsMask = mask self.fileFlags = flags self.fileOS = OS self.fileType = fileType self.fileSubtype = subtype self.fileDateMS = date[0] self.fileDateLS = date[1] def fromRaw(self, data, i): (self.sig, self.strucVersion, self.fileVersionMS, self.fileVersionLS, self.productVersionMS, self.productVersionLS, self.fileFlagsMask, self.fileFlags, self.fileOS, self.fileType, self.fileSubtype, self.fileDateMS, self.fileDateLS) = struct.unpack('13l', data[i:i+52]) return i+52 def toRaw(self): return struct.pack('13l', self.sig, self.strucVersion, self.fileVersionMS, self.fileVersionLS, self.productVersionMS, self.productVersionLS, self.fileFlagsMask, self.fileFlags, self.fileOS, self.fileType, self.fileSubtype, self.fileDateMS, self.fileDateLS) def __repr__(self, indent=''): fv = (self.fileVersionMS >> 16, self.fileVersionMS & 0xffff, self.fileVersionLS >> 16, self.fileVersionLS & 0xFFFF) pv = (self.productVersionMS >> 16, self.productVersionMS & 0xffff, self.productVersionLS >> 16, self.productVersionLS & 0xFFFF) fd = (self.fileDateMS, self.fileDateLS) tmp = ["FixedFileInfo(", "filevers=%s," % (fv,), "prodvers=%s," % (pv,), "mask=%s," % hex(self.fileFlagsMask), "flags=%s," % hex(self.fileFlags), "OS=%s," % hex(self.fileOS), "fileType=%s," % hex(self.fileType), "subtype=%s," % hex(self.fileSubtype), "date=%s" % (fd,), ")" ] return string.join(tmp, '\n'+indent+' ') ##StringFileInfo { ## WORD wLength; // Specifies the length of the version resource ## WORD wValueLength; // Specifies the length of the Value member in the current VS_VERSION_INFO structure ## WORD wType; // 1 means text, 0 means binary ## WCHAR szKey[]; // Contains the Unicode string "StringFileInfo". ## WORD Padding[]; ## StringTable Children[]; // Specifies a list of zero or more String structures ##}; class StringFileInfo: def __init__(self, kids=None): self.name = "StringFileInfo" if kids is None: self.kids = [] else: self.kids = kids def fromRaw(self, sublen, vallen, name, data, i, limit): self.name = name while i < limit: st = StringTable() j = st.fromRaw(data, i, limit) if TEST: if data[i:j] != st.toRaw(): rd = data[i:j] sd = st.toRaw() for x in range(0, len(rd), 16): rds = rd[x:x+16] sds = sd[x:x+16] if rds != sds: print "rd[%s:%s+16]: %s" % (x, x, `rds`) print "sd[%s:%s+16]: %s" % (x, x, `sds`) print print "raw: len %d, wLength %d" % (len(rd), struct.unpack('h', rd[:2])[0]) print " st: len %d, wLength %d" % (len(sd), struct.unpack('h', sd[:2])[0]) self.kids.append(st) i = j return i def toRaw(self): if type(self.name) is STRINGTYPE: self.name = pywintypes.Unicode(self.name) vallen = 0 typ = 1 sublen = 6 + 2*len(self.name) + 2 pad = '' if sublen % 4: pad = '\000\000' tmp = [] for kid in self.kids: tmp.append(kid.toRaw()) tmp = string.join(tmp, '') sublen = sublen + len(pad) + len(tmp) if tmp[-2:] == '\000\000': sublen = sublen - 2 return struct.pack('hhh', sublen, vallen, typ) + getRaw(self.name) + '\000\000' + pad + tmp def __repr__(self, indent=''): tmp = [] newindent = indent + ' ' for kid in self.kids: tmp.append(kid.__repr__(newindent)) tmp = string.join(tmp, ', \n') return "%sStringFileInfo(\n%s[\n%s\n%s])" % (indent, newindent, tmp, newindent) ##StringTable { ## WORD wLength; ## WORD wValueLength; ## WORD wType; ## WCHAR szKey[]; ## String Children[]; // Specifies a list of zero or more String structures. ##}; class StringTable: def __init__(self, name=None, kids=None): self.name = name self.kids = kids if name is None: self.name = '' if kids is None: self.kids = [] def fromRaw(self, data, i, limit): #print "Parsing StringTable" i, (cpsublen, cpwValueLength, cpwType, self.name) = parseCodePage(data, i, limit) # should be code page junk #i = ((i + 3) / 4) * 4 while i < limit: ss = StringStruct() j = ss.fromRaw(data, i, limit) if TEST: if data[i:j] != ss.toRaw(): print "raw:", `data[i:j]` print " ss:", `ss.toRaw()` i = j self.kids.append(ss) i = ((i + 3) / 4) * 4 return i def toRaw(self): if type(self.name) is STRINGTYPE: self.name = pywintypes.Unicode(self.name) vallen = 0 typ = 1 sublen = 6 + 2*len(self.name) + 2 tmp = [] for kid in self.kids: raw = kid.toRaw() if len(raw) % 4: raw = raw + '\000\000' tmp.append(raw) tmp = string.join(tmp, '') sublen = sublen + len(tmp) if tmp[-2:] == '\000\000': sublen = sublen - 2 return struct.pack('hhh', sublen, vallen, typ) + getRaw(self.name) + '\000\000' + tmp def __repr__(self, indent=''): tmp = [] newindent = indent + ' ' for kid in self.kids: tmp.append(repr(kid)) tmp = string.join(tmp, ',\n%s' % newindent) return "%sStringTable(\n%s'%s', \n%s[%s])" % (indent, newindent, str(self.name), newindent, tmp) ##String { ## WORD wLength; ## WORD wValueLength; ## WORD wType; ## WCHAR szKey[]; ## WORD Padding[]; ## String Value[]; ##}; class StringStruct: def __init__(self, name=None, val=None): self.name = name self.val = val if name is None: self.name = '' if val is None: self.val = '' def fromRaw(self, data, i, limit): i, (sublen, vallen, typ, self.name) = parseCommon(data, i) limit = i + sublen i = ((i + 3) / 4) * 4 i, self.val = parseUString(data, i, limit) return i def toRaw(self): if type(self.name) is STRINGTYPE: self.name = pywintypes.Unicode(self.name) if type(self.val) is STRINGTYPE: self.val = pywintypes.Unicode(self.val) vallen = len(self.val) + 1 typ = 1 sublen = 6 + 2*len(self.name) + 2 pad = '' if sublen % 4: pad = '\000\000' sublen = sublen + len(pad) + 2*vallen return struct.pack('hhh', sublen, vallen, typ) + getRaw(self.name) + '\000\000' + pad + getRaw(self.val) + '\000\000' def __repr__(self, indent=''): if pyvers < 20: return "StringStruct('%s', '%s')" % (str(self.name), str(self.val)) else: return "StringStruct('%s', '%s')" % (self.name, self.val) def parseCodePage(data, i, limit): #print "Parsing CodePage" i, (sublen, wValueLength, wType, nm) = parseCommon(data, i) #i = ((i + 3) / 4) * 4 return i, (sublen, wValueLength, wType, nm) ##VarFileInfo { ## WORD wLength; // Specifies the length of the version resource ## WORD wValueLength; // Specifies the length of the Value member in the current VS_VERSION_INFO structure ## WORD wType; // 1 means text, 0 means binary ## WCHAR szKey[]; // Contains the Unicode string "VarFileInfo". ## WORD Padding[]; ## Var Children[]; // Specifies a list of zero or more Var structures ##}; class VarFileInfo: def __init__(self, kids=None): if kids is None: self.kids = [] else: self.kids = kids def fromRaw(self, sublen, vallen, name, data, i, limit): self.sublen = sublen self.vallen = vallen self.name = name i = ((i + 3) / 4) * 4 while i < limit: vs = VarStruct() j = vs.fromRaw(data, i, limit) self.kids.append(vs) if TEST: if data[i:j] != vs.toRaw(): print "raw:", `data[i:j]` print "cmp:", `vs.toRaw()` i = j return i def toRaw(self): self.vallen = 0 self.wType = 1 self.name = pywintypes.Unicode('VarFileInfo') sublen = 6 + 2*len(self.name) + 2 pad = '' if sublen % 4: pad = '\000\000' tmp = [] for kid in self.kids: tmp.append(kid.toRaw()) tmp = string.join(tmp, '') self.sublen = sublen + len(pad) + len(tmp) return struct.pack('hhh', self.sublen, self.vallen, self.wType) + getRaw(self.name) + '\000\000' + pad + tmp def __repr__(self, indent=''): tmp = map(repr, self.kids) return "%sVarFileInfo([%s])" % (indent, string.join(tmp, ', ')) ##Var { ## WORD wLength; // Specifies the length of the version resource ## WORD wValueLength; // Specifies the length of the Value member in the current VS_VERSION_INFO structure ## WORD wType; // 1 means text, 0 means binary ## WCHAR szKey[]; // Contains the Unicode string "Translation" or a user-defined key string value ## WORD Padding[]; // ## WORD Value[]; // Specifies a list of one or more values that are language and code-page identifiers ##}; STRINGTYPE = type('') class VarStruct: def __init__(self, name=None, kids=None): self.name = name self.kids = kids if name is None: self.name = '' if kids is None: self.kids = [] def fromRaw(self, data, i, limit): i, (self.sublen, self.wValueLength, self.wType, self.name) = parseCommon(data, i) i = ((i + 3) / 4) * 4 for j in range(self.wValueLength/2): kid = struct.unpack('h', data[i:i+2])[0] self.kids.append(kid) i = i + 2 return i def toRaw(self): self.wValueLength = len(self.kids) * 2 self.wType = 0 if type(self.name) is STRINGTYPE: self.name = pywintypes.Unicode(self.name) sublen = 6 + 2*len(self.name) + 2 pad = '' if sublen % 4: pad = '\000\000' self.sublen = sublen + len(pad) + self.wValueLength tmp = [] for kid in self.kids: tmp.append(struct.pack('h', kid)) tmp = string.join(tmp, '') return struct.pack('hhh', self.sublen, self.wValueLength, self.wType) + getRaw(self.name) + '\000\000' + pad + tmp def __repr__(self, indent=''): return "VarStruct('%s', %s)" % (str(self.name), repr(self.kids)) def SetVersion(exenm, versionfile): txt = open(versionfile, 'r').read() vs = eval(txt+'\n', globals()) hdst = win32api.BeginUpdateResource(exenm, 0) win32api.UpdateResource(hdst, RT_VERSION, 1, vs.toRaw()) win32api.EndUpdateResource (hdst, 0) if __name__ == '__main__': import sys TEST = 1 if len(sys.argv) < 2: decode('c:/Program Files/Netscape/Communicator/Program/netscape.exe') else: print "Examining", sys.argv[1] decode(sys.argv[1]) PythonCard-0.8.2/tools/textEditor/0000755000076500007650000000000010434046773017015 5ustar alexalex00000000000000PythonCard-0.8.2/tools/textEditor/find.rsrc.py0000644000076500007650000000153207464012215021251 0ustar alexalex00000000000000{'type':'CustomDialog', 'name':'dlgFind', 'title':'Find dialog', 'size':(370, 120), 'components': [ {'type':'StaticText', 'name':'stcFindWhat', 'position':(7, 10), 'text':'Find What:', }, {'type':'TextField', 'name':'fldFind', 'position':(70, 7), 'size':(195, -1), }, {'type':'Button', 'name':'btnFindNext', 'position':(280, 5), 'label':'Find Next', 'id':5100, 'default':1, }, {'type':'Button', 'name':'btnCancel', 'position':(280, 35), 'label':'Cancel', 'id':5101, }, {'type':'CheckBox', 'name':'chkMatchWholeWordOnly', 'position':(7, 35), 'label':'Match whole word only', }, {'type':'CheckBox', 'name':'chkMatchCase', 'position':(7, 55), 'label':'Match case', }, ] # end components } # end CustomDialog PythonCard-0.8.2/tools/textEditor/readme.txt0000644000076500007650000000264207464367033021023 0ustar alexalex00000000000000simple text editor If you use this sample as a real text editor then you should be careful to always work on backup copies of documents in case there are bugs that might corrupt your text. You can set the default font which along with the last position and size of the window will be saved in a user.config.txt file. This sample shows off the FindDialog in dialog.py, which is a custom dialog built directly in wxPython as well as the FindDialog class based on GenericDialog, which works more like a normal background. The resource definition for the class is in find.rsrc.py. You can use the FindDialog class as a template for how to do your own modal dialog classes. You must use the OK (5100) and Cancel (5101) ids for your default and cancel buttons or the dialog won't be dismissed properly. The find dialog remembers the last find settings and so acts more like a Find Next. The find algorithm is not able to do a "match whole words only" find. The About dialog displays the current filename, character, word, and line count. This is the only sample that uses a .pyw extension, so it doesn't show a console window when the sample is run. If any error messages are output due to a runtime error, you won't see them. You can change the extension back to .py if you want to experiment with the code. Scriptlets See the following message in the archive for more info. http://aspn.activestate.com/ASPN/Mail/Message/PythonCard/1181106PythonCard-0.8.2/tools/textEditor/scriptlets/0000755000076500007650000000000010434046773021211 5ustar alexalex00000000000000PythonCard-0.8.2/tools/textEditor/scriptlets/documentWordCount.py0000644000076500007650000000107010106740620025230 0ustar alexalex00000000000000import wx from PythonCard import dialog def wordCount(text): chars = len(text) words = len(text.split()) # this doesn't always match the getNumberOfLines() method # so this should probably be changed lines = len(text.splitlines()) return chars, words, lines if bg.documentPath is None: filename = 'Untitled' else: filename = os.path.basename(bg.documentPath) dialog.MessageDialog(bg, "Document: %s\n" % filename + "%d chars, %d words, %d lines" % wordCount(bg.components.fldDocument.text), 'Word Count', wx.ICON_INFORMATION | wx.OK) PythonCard-0.8.2/tools/textEditor/scriptlets/insertDateAndTime.py0000644000076500007650000000022207461334060025116 0ustar alexalex00000000000000import time now = time.localtime(time.time()) dateStr = time.strftime("%A, %B %d, %Y, %I:%M %p", now) comp.fldDocument.replaceSelection(dateStr) PythonCard-0.8.2/tools/textEditor/scriptlets/selectionWordCount.py0000644000076500007650000000112410106740620025377 0ustar alexalex00000000000000import wx from PythonCard import dialog def wordCount(text): chars = len(text) words = len(text.split()) # this doesn't always match the getNumberOfLines() method # so this should probably be changed lines = len(text.splitlines()) return chars, words, lines if bg.documentPath is None: filename = 'Untitled' else: filename = os.path.basename(bg.documentPath) text = bg.components.fldDocument.getStringSelection() dialog.MessageDialog(bg, "Document: %s\n" % filename + "%d chars, %d words, %d lines" % wordCount(text), 'Word Count', wx.ICON_INFORMATION | wx.OK) PythonCard-0.8.2/tools/textEditor/scriptlets/testIgnore.py0000644000076500007650000000016010053523531023670 0ustar alexalex00000000000000# ignore is a regular expression that will match the filenames # for the modules to exclude. ignore = '.*\.py$' PythonCard-0.8.2/tools/textEditor/scriptlets/unorderedList.py0000644000076500007650000000036407461334060024404 0ustar alexalex00000000000000# inserts "\t* " before each line in the selection text = bg.components.fldDocument.getStringSelection() unorderedList = "" for i in text.splitlines(1): unorderedList += "\t* " + i bg.components.fldDocument.replaceSelection(unorderedList) PythonCard-0.8.2/tools/textEditor/textEditor.pyw0000644000076500007650000004701310127116712021704 0ustar alexalex00000000000000#!/usr/bin/python """ __version__ = "$Revision: 1.76 $" __date__ = "$Date: 2004/09/30 23:59:06 $" I had noticed before that selecting a menu item wipes out the contents of the status bar, but I had forgotten about it. I need to investigate this. I'm assuming some sort of help tip is supposed to be displayed?! Other ideas without turning this into a full blown editor insert time/date stamp like notepad.exe in Windows """ from PythonCard import configuration, dialog, log, model, resource, util from PythonCard.templates.dialogs import findDialog import os, sys import wx from wx.html import HtmlEasyPrinting import pprint USERCONFIG = 'user.config.txt' def textToHtml(txt): # the wxHTML classes don't require valid HTML # so this is enough html = txt.replace('\n\n', '

') html = html.replace('\n', '
') return html class TextEditor(model.Background): def on_initialize(self, event): self.singleItemExpandingSizerLayout() # KEA 2002-06-27 # copied from codeEditor.py # wxFileHistory isn't wrapped, so use raw wxPython # also the file list gets appended to the File menu # rather than going in front of the Exit menu # I suspect I have to add the Exit menu after the file history # which means changing how the menus in resources are loaded # so I'll do that later self.fileHistory = wx.FileHistory() fileMenu = self.GetMenuBar().GetMenu(0) self.fileHistory.UseMenu(fileMenu) wx.EVT_MENU_RANGE(self, wx.ID_FILE1, wx.ID_FILE9, self.OnFileHistory) self.configPath = os.path.join(configuration.homedir, 'texteditor') self.loadConfig() self.lastFind = {'searchText':'', 'wholeWordsOnly':0, 'caseSensitive':0} self.startTitle = self.title if len(sys.argv) > 1: # accept a file argument on the command-line filename = os.path.abspath(sys.argv[1]) log.info('textEditor filename: ' + filename) if not os.path.exists(filename): filename = os.path.abspath(os.path.join(self.application.startingDirectory, sys.argv[1])) #print filename if os.path.isfile(filename): self.openFile(filename) # the second argument can be a line number to jump to # this is experimental, but a nice feature if (len(sys.argv) > 2): try: line = int(sys.argv[2]) self.gotoLine(line) except: pass else: self.newFile() else: self.newFile() self.printer = HtmlEasyPrinting() self.visible = True def on_idle(self, event): self.updateTitleBar() def updateTitleBar(self): title = self.title modified = self.documentChanged if modified and title[0] != '*': self.title = '* ' + title + ' *' elif not modified and title[0] == '*': self.title = title[2:-2] def OnFileHistory(self, event): fileNum = event.GetId() - wx.ID_FILE1 path = self.fileHistory.GetHistoryFile(fileNum) if self.documentChanged: save = self.saveChanges() if save == "Cancel": # don't do anything, just go back to editing return elif save == "No": # any changes will be lost pass else: if self.documentPath is None: # if the user cancels out of the Save As then go back to editing if not self.on_menuFileSaveAs_select(None): return else: self.saveFile(self.documentPath) self.openFile(path) def loadConfig(self): try: if not os.path.exists(self.configPath): os.mkdir(self.configPath) path = os.path.join(self.configPath, USERCONFIG) self.config = util.readAndEvalFile(path) if self.config != {}: self.setDocumentFont() if 'position' in self.config: self.position = self.config['position'] if 'size' in self.config: self.size = self.config['size'] if 'history' in self.config: history = self.config['history'] history.reverse() for h in history: self.fileHistory.AddFileToHistory(h) except: self.config = {} def saveConfig(self): self.config['defaultFont'] = self.components.fldDocument.font self.config['position'] = self.GetRestoredPosition() self.config['size'] = self.GetRestoredSize() history = [] for i in range(self.fileHistory.GetCount()): history.append(self.fileHistory.GetHistoryFile(i)) self.config['history'] = history try: path = os.path.join(self.configPath, USERCONFIG) f = open(path, "w") pprint.pprint(self.config, f) f.close() except: pass # argh def saveChanges(self): # save configuration info in the app directory #filename = os.path.basename(self.documentPath) if self.documentPath is None: filename = "Untitled" else: filename = self.documentPath msg = "The text in the %s file has changed.\n\nDo you want to save the changes?" % filename result = dialog.messageDialog(self, msg, 'textEditor', wx.ICON_EXCLAMATION | wx.YES_NO | wx.CANCEL) return result.returnedString def doExit(self): if self.documentChanged: save = self.saveChanges() if save == "Cancel": return False elif save == "No": return True else: if self.documentPath is None: return self.on_menuFileSaveAs_select(None) else: self.saveFile(self.documentPath) return True else: return True def on_close(self, event): if self.doExit(): self.saveConfig() self.fileHistory = None self.printer = None event.skip() def setDocumentFont(self): self.components.fldDocument.font = self.config['defaultFont'] def on_doSetFont_command(self, event): result = dialog.fontDialog(self, self.components.fldDocument.font) if result.accepted: self.config['defaultFont'] = result.font self.setDocumentFont() def on_menuFileSave_select(self, event): if self.documentPath is None: # this a "new" document and needs to go through Save As... self.on_menuFileSaveAs_select(None) else: self.saveFile(self.documentPath) def on_menuFileSaveAs_select(self, event): wildcard = "Text files (*.txt)|*.TXT;*.txt|All files (*.*)|*.*" if self.documentPath is None: dir = '' filename = '*.txt' else: dir = os.path.dirname(self.documentPath) filename = os.path.basename(self.documentPath) result = dialog.saveFileDialog(None, "Save As", dir, filename, wildcard) if result.accepted: path = result.paths[0] self.saveFile(path) self.fileHistory.AddFileToHistory(path) return True else: return False def on_fldDocument_textUpdate(self, event): self.documentChanged = True def newFile(self): self.components.fldDocument.text = '' self.documentPath = None self.documentChanged = 0 self.title = 'Untitled - ' + self.startTitle self.statusBar.text = 'Untitled' def openFile(self, path): try: f = open(path) self.components.fldDocument.text = f.read().replace('\r\n','\n') f.close() self.documentPath = path self.documentChanged = 0 self.title = os.path.split(path)[-1] + ' - ' + self.startTitle self.statusBar.text = path self.fileHistory.AddFileToHistory(path) except: pass def saveFile(self, path): try: f = open(path, 'w') f.write(self.components.fldDocument.text) f.close() self.documentPath = path self.documentChanged = 0 self.title = os.path.split(path)[-1] + ' - ' + self.startTitle self.statusBar.text = path except: pass def on_menuFileNew_select(self, event): if self.documentChanged: save = self.saveChanges() if save == "Cancel": # don't do anything, just go back to editing pass elif save == "No": # any changes will be lost self.newFile() else: if self.documentPath is None: if self.on_menuFileSaveAs_select(None): self.newFile() else: self.saveFile(self.documentPath) self.newFile() else: # don't need to save self.newFile() def on_menuFileOpen_select(self, event): # should probably have an alert dialog here # warning about saving the current file before opening another one if self.documentChanged: save = self.saveChanges() if save == "Cancel": # don't do anything, just go back to editing return elif save == "No": # any changes will be lost pass else: if self.documentPath is None: # if the user cancels out of the Save As then go back to editing if not self.on_menuFileSaveAs_select(None): return else: self.saveFile(self.documentPath) # split this method into several pieces to make it more flexible wildcard = "Text files (*.txt)|*.txt;*.TXT|All files (*.*)|*.*" result = dialog.openFileDialog(wildcard=wildcard) if result.accepted: path = result.paths[0] # an error will probably occur here if the text is too large # to fit in the wxTextCtrl (TextArea) or the file is actually # binary. Not sure what happens with CR/LF versus CR versus LF # line endings either self.openFile(path) def on_menuFilePrint_select(self, event): source = textToHtml(self.components.fldDocument.text) self.printer.PrintText(source) def on_menuFilePrintPreview_select(self, event): source = textToHtml(self.components.fldDocument.text) self.printer.PreviewText(source) def on_menuFilePageSetup_select(self, event): self.printer.PageSetup() # the following was copied and pasted from the searchexplorer sample def on_menuEditUndo_select(self, event): widget = self.findFocus() if hasattr(widget, 'editable') and widget.canUndo(): widget.undo() def on_menuEditRedo_select(self, event): widget = self.findFocus() if hasattr(widget, 'editable') and widget.canRedo(): widget.redo() def on_menuEditCut_select(self, event): widget = self.findFocus() if hasattr(widget, 'editable') and widget.canCut(): widget.cut() def on_menuEditCopy_select(self, event): widget = self.findFocus() if hasattr(widget, 'editable') and widget.canCopy(): widget.copy() def on_menuEditPaste_select(self, event): widget = self.findFocus() if hasattr(widget, 'editable') and widget.canPaste(): widget.paste() def on_menuEditClear_select(self, event): widget = self.findFocus() if hasattr(widget, 'editable'): if widget.canCut(): # delete the current selection, # if we can't do a Cut we shouldn't be able to delete either # which is why i used the test above sel = widget.replaceSelection('') else: ins = widget.getInsertionPoint() try: widget.replace(ins, ins + 1, '') except: pass def on_menuEditSelectAll_select(self, event): widget = self.findFocus() if hasattr(widget, 'editable'): widget.setSelection(0, widget.getLastPosition()) # end of searchexplorer edit menu items def findNext(self, searchText, wholeWordsOnly, caseSensitive): fldDocument = self.components.fldDocument selOffset = fldDocument.getSelection()[1] offset = util.findString(searchText, fldDocument.text[selOffset:], caseSensitive, wholeWordsOnly) if offset != -1: offset += selOffset fldDocument.setSelection(offset, offset + len(searchText)) fldDocument.setFocus() def on_doEditFind_command(self, event): # keep track of the last find and preload # the search text and radio buttons lastFind = self.lastFind # two versions of Find, the first one is using the FindDialog # defined in dialog.py, the second one is using a FindDialog class # defined in templates.dialogs.findDialog # the second one is what you should base your own dialogs on """ result = dialog.findDialog(self, lastFind['searchText'], lastFind['wholeWordsOnly'], lastFind['caseSensitive']) """ result = findDialog.findDialog(self, lastFind['searchText'], lastFind['wholeWordsOnly'], lastFind['caseSensitive']) if result.accepted: lastFind['searchText'] = result.searchText lastFind['wholeWordsOnly'] = result.wholeWordsOnly lastFind['caseSensitive'] = result.caseSensitive self.findNext(lastFind['searchText'], lastFind['wholeWordsOnly'], lastFind['caseSensitive']) def on_doEditFindNext_command(self, event): self.findNext(self.lastFind['searchText'], self.lastFind['wholeWordsOnly'], self.lastFind['caseSensitive']) def findNth(self, pattern, n, txt): """find the nth occurance of pattern in txt and return the offset""" #print "findNth", pattern, n start = 0 offset = -1 i = 1 while i <= n: offset = txt.find(pattern, start) #print 'offset', offset # if the pattern isn't found before the end of the text is reached # return -1 if offset == -1: break start = offset + 1 i = i + 1 return offset def gotoLine(self, lineNumber): try: if lineNumber <= self.components.fldDocument.getNumberOfLines(): if wx.Platform == '__WXGTK__': sel = self.components.fldDocument.xyToPosition(0, lineNumber - 1) self.components.fldDocument.setSelection(sel, sel) self.components.fldDocument.setInsertionPoint(sel) else: # windows wxTE_RICH style wraps lines, so we need to count # newlines to get an offset if lineNumber == 1: self.components.fldDocument.setInsertionPoint(0) else: #offset = self.findNth('\n', lineNumber - 1, self.components.fldDocument.text) offset = util.findnth(self.components.fldDocument.text, '\n', lineNumber - 1) self.components.fldDocument.setInsertionPoint(offset + 1) except: pass def on_doEditGoTo_command(self, event): result = dialog.textEntryDialog(self, 'Goto line number:', 'Goto line', '') # this version doesn't alert the user if the line number is out-of-range # it just fails quietly if result.accepted: try: self.gotoLine(int(result.text)) except: pass def wordCount(self, text): chars = len(text) words = len(text.split()) # this doesn't always match the getNumberOfLines() method # so this should probably be changed lines = len(text.split('\n')) return chars, words, lines def on_doHelpAbout_command(self, event): # once we have generic dialogs going, put a more interesting # About box here if self.documentPath is None: filename = 'Untitled' else: filename = os.path.basename(self.documentPath) dialog.messageDialog(self, 'textEditor sample' + "\n\n" + \ "Document: %s\n" % filename + \ "%d chars, %d words, %d lines" \ % self.wordCount(self.components.fldDocument.text), 'About textEditor...', wx.ICON_INFORMATION | wx.OK) def on_menuScriptletShell_select(self, event): self.loadShell() if self.application.shell is not None: self.application.shellFrame.visible = not self.application.shellFrame.visible def on_menuScriptletSaveShellSelection_select(self, event): if self.application.shell is not None: txt = self.application.shell.GetSelectedText() lines = [] for line in txt.splitlines(): lines.append(self.application.shell.lstripPrompt(line)) # this is the quick way to convert a list back into a string # appending to strings can be slow because it creates a new string # each time, so a list is used instead while building up the script script = "\n".join(lines) try: wildcard = "Python files (*.py)|*.py|All Files (*.*)|*.*" scriptletsDir = os.path.join(self.application.applicationDirectory, 'scriptlets') result = dialog.saveFileDialog(None, "Save As", scriptletsDir, 'scriptlet.py', wildcard) if result.accepted: path = result.paths[0] f = open(path, 'w') f.write(script) f.close() except: pass def on_menuScriptletRunScriptlet_select(self, event): self.loadShell() #curDir = os.getcwd() if self.application.shell is not None: wildcard = "Python files (*.py)|*.py|All Files (*.*)|*.*" # wildcard = '*.py' scriptletsDir = os.path.join(self.application.applicationDirectory, 'scriptlets') result = dialog.openFileDialog(self, 'Open', scriptletsDir, '', wildcard) if result.accepted: filename = result.paths[0] try: command = 'execfile(%r)' % filename self.application.shell.run(command=command, prompt=0, verbose=0) except: pass #os.chdir(curDir) if __name__ == '__main__': app = model.Application(TextEditor) app.MainLoop() PythonCard-0.8.2/tools/textEditor/textEditor.rsrc.py0000644000076500007650000001222410047606372022470 0ustar alexalex00000000000000 { 'application':{ 'type':'Application', 'name':'textEditor', 'backgrounds': [ { 'type':'Background', 'name':'bgTextEditor', 'title':'Text Editor PythonCard Application', 'statusBar':1, 'visible':0, 'style':['resizeable'], 'menubar': { 'type':'MenuBar', 'menus': [ { 'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ { 'type':'MenuItem', 'name':'menuFileNew', 'label':'&New\tCtrl+N' }, { 'type':'MenuItem', 'name':'menuFileOpen', 'label':'&Open\tCtrl+O' }, { 'type':'MenuItem', 'name':'menuFileSave', 'label':'&Save\tCtrl+S' }, { 'type':'MenuItem', 'name':'menuFileSaveAs', 'label':'Save &As...' }, { 'type':'MenuItem', 'name':'fileSep1', 'label':'-' }, { 'type':'MenuItem', 'name':'menuFilePageSetup', 'label':'Page Set&up...' }, { 'type':'MenuItem', 'name':'menuFilePrint', 'label':'&Print...\tCtrl+P' }, { 'type':'MenuItem', 'name':'menuFilePrintPreview', 'label':'Print Pre&view' }, { 'type':'MenuItem', 'name':'fileSep2', 'label':'-' }, { 'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit', } ] }, # most of the edit menu was copied from the searchexplorer sample {'type':'Menu', 'name':'Edit', 'label':'&Edit', 'items': [ { 'type':'MenuItem', 'name':'menuEditUndo', 'label':'&Undo\tCtrl+Z'}, { 'type':'MenuItem', 'name':'menuEditRedo', 'label':'&Redo\tCtrl+Y'}, { 'type':'MenuItem', 'name':'editSep1', 'label':'-' }, { 'type':'MenuItem', 'name':'menuEditCut', 'label':'Cu&t\tCtrl+X'}, { 'type':'MenuItem', 'name':'menuEditCopy', 'label':'&Copy\tCtrl+C'}, { 'type':'MenuItem', 'name':'menuEditPaste', 'label':'&Paste\tCtrl+V'}, { 'type':'MenuItem', 'name':'editSep2', 'label':'-' }, { 'type':'MenuItem', 'name':'menuEditFind', 'label':'&Find...\tCtrl+F', 'command':'doEditFind'}, { 'type':'MenuItem', 'name':'menuEditFindNext', 'label':'&Find Next\tF3', 'command':'doEditFindNext'}, { 'type':'MenuItem', 'name':'menuEditGoTo', 'label':'&Go To...\tCtrl+G', 'command':'doEditGoTo'}, { 'type':'MenuItem', 'name':'editSep3', 'label':'-' }, { 'type':'MenuItem', 'name':'menuEditClear', 'label':'Cle&ar\tDel'}, { 'type':'MenuItem', 'name':'menuEditSelectAll', 'label':'Select A&ll\tCtrl+A'} ] }, { 'type':'Menu', 'name':'menuFormat', 'label':'F&ormat', 'items': [ { 'type':'MenuItem', 'name':'menuFormatFont', 'label':'&Font...', 'command':'doSetFont'}, ] }, { 'type':'Menu', 'name':'menuScriptlet', 'label':'&Scriptlet', 'items': [ { 'type':'MenuItem', 'name':'menuScriptletShell', 'label':'Shell'}, { 'type':'MenuItem', 'name':'scriptletSep1', 'label':'-' }, { 'type':'MenuItem', 'name':'menuScriptletSaveShellSelection', 'label':'Save Shell Selection...'}, { 'type':'MenuItem', 'name':'menuScriptletRunScriptlet', 'label':'Run Scriptlet...'}, ] }, { 'type':'Menu', 'name':'menuHelp', 'label':'&Help', 'items': [ { 'type':'MenuItem', 'name':'menuHelpAbout', 'label':'&About textEditor...', 'command':'doHelpAbout'}, ] }, ] }, 'components': [ { 'type':'TextArea', 'name':'fldDocument', 'position':(0, 0), 'size':( 600, 400 ), 'text':'' }, ] } ] } } PythonCard-0.8.2/turtle.py0000644000076500007650000006031610221715123015403 0ustar alexalex00000000000000 """ Created: 2001/10/12 __version__ = "$Revision: 1.21 $" __date__ = "$Date: 2005/03/28 05:46:59 $" """ import math import wx import time class AbstractTurtle: def __init__(self, size): """ this should be called after a subclass has done its init """ self._size = size self._tracing = False self._degrees() # KEA 2002-03-01 # define abbreviated versions of commands # these should still work even if the AbstractTurtle or BitmapTurtle # classes are subclasses # Get the class for an instance. selfClass = self.__class__ # Assign several synonyms as Class attributes. if not hasattr(selfClass, 'fd'): selfClass.fd = selfClass.forward if not hasattr(selfClass, 'bk'): selfClass.bk = selfClass.backward if not hasattr(selfClass, 'back'): selfClass.back = selfClass.backward if not hasattr(selfClass, 'rt'): selfClass.rt = selfClass.right if not hasattr(selfClass, 'lt'): selfClass.lt = selfClass.left if not hasattr(selfClass, 'st'): selfClass.st = selfClass.showTurtle if not hasattr(selfClass, 'ht'): selfClass.ht = selfClass.hideTurtle if not hasattr(selfClass, 'pu'): selfClass.pu = selfClass.penUp if not hasattr(selfClass, 'pd'): selfClass.pd = selfClass.penDown if not hasattr(selfClass, 'clearScreen'): selfClass.clearScreen = selfClass._clear if not hasattr(selfClass, 'cg'): selfClass.cg = selfClass._clear if not hasattr(selfClass, 'cs'): selfClass.cs = selfClass._clear if not hasattr(selfClass, 'cls'): selfClass.cls = selfClass._clear if not hasattr(selfClass, 'pc'): selfClass.pc = selfClass.color if not hasattr(selfClass, 'setPenColor'): selfClass.setPenColor = selfClass.color if not hasattr(selfClass, 'bc'): selfClass.bc = selfClass.setBackColor if not hasattr(selfClass, 'draw'): selfClass.draw = selfClass.lineTo # this caused some problems when reset() in the subclass tried # to call its superclass AbstractTurtle.reset() so I probably wasn't doing # the method calls correctly # until I figure it out, I put all the needed code of reset() into # the subclass self.reset() def distance(self, t2): """returns the distance between two turtles""" return math.sqrt(math.pow(self._position[0] - t2._position[0], 2) + math.pow(self._position[1] - t2._position[1], 2)) def distanceXY(self, x, y): """returns the distance between turtle (self) and a point (x, y)""" return math.sqrt(math.pow(self._position[0] - x, 2) + math.pow(self._position[1] - y, 2)) def _degrees(self, fullcircle=360.0): self._fullcircle = fullcircle self._invradian = math.pi / (fullcircle * 0.5) # illegal syntax, so I used None and the if tests instead #def plot(self, x=self._position[0], y=self._position[1]): def plot(self, x=None, y=None): """ override """ pass # may have to do multiple versions of methods if case-sensitivity # is an issue def dot(self, x, y): """Logo plot, should only be 1 pixel wide though""" self.plot(x, y) # there are also setX and setY, but I don't remember if they do a plot or a moveTo... def getXY(self): """returns the turtle position""" return self._position # this may actually be the Logo plot command rather than # the equivelant of a moveTo # need to change these methods so they can handle # x, y or a tuple (x, y) def setXY(self, pos): """another name for moveTo this may actually be the Logo plot command rather than the equivelant of a moveTo""" self.moveTo(pos[0], pos[1]) def line(self, x1, y1, x2, y2): """ override """ pass def getHeading(self): """returns the turtle heading in degrees""" return self._angle def setHeading(self, angle): """set the turtle heading in degrees""" if self._dirty: self._drawTurtle() self._angle = angle % self._fullcircle if self._visible: self._drawTurtle() # my math is shaky, there has to be a shorter # way to return an angle between 0 - 360 # remember however that 0,0 is the top-left corner # and positive x, positive y is the bottom-right # not positive x, negative y as in normal cartesian coordinates # THIS WAS HACKED TOGETHER SO IT COULD VERY WELL BE BUGGY def towardsXY(self, x, y): """returns the angle the turle would need to heading towards to face the position x, y""" xDir = x - self._position[0] yDir = y - self._position[1] try: angle = math.atan(yDir / xDir) * 180 / math.pi except: # should occur when xDir == 0.0 (divide by zero) if yDir == 0.0: return 0.0 elif yDir < 0: return 90.0 else: return 270.0 if xDir < 0: angle = 180 - angle elif yDir < 0: angle = -1.0 * angle elif yDir > 0: angle = 360.0 - angle return angle def towards(self, t): """equivelant to towardsXY returns the angle the turle would need to heading towards to face the position x, y""" return self.towardsXY(t._position[0], t._position[1]) def _radians(self): self._degrees(2.0 * math.pi) def forward(self, distance): """moves the turtle forward distance""" angle = self._angle * self._invradian self._goto(self._position[0] + distance * math.cos(angle), self._position[1] - distance * math.sin(angle)) def backward(self, distance): """moves the turtle backward distance""" self.forward(-distance) def left(self, angle): """turns the turtle left angle degrees""" if not self._drawingTurtle and self._dirty: self._drawTurtle() self._angle = (self._angle + angle) % self._fullcircle #print self._angle if not self._drawingTurtle and self._visible: self._drawTurtle() def right(self, angle): """turns the turtle right angle degrees""" self.left(-angle) def polygon(self, sides, distance): """draws a polygon with sides of length distance (e.g. polygon(4, 100) draws a square) polygon uses the forward and right methods to move the turtle""" angle = 360.0 / sides for i in range(sides): self.forward(distance) self.right(angle) def cPolygon(self, sides, radius): """draws a polygon centered on the current turtle position (e.g. cPolygon(4, 100) draws a square) the radius determines the size of the polygon, so that a circle with the same radius would intersect the vertices cPolygon uses the forward and right methods to move the turtle""" self.penUp() self.forward(radius) angle = 180.0 - (90.0 * (sides - 2) / sides) self.right(angle) # must be the same as polygon turn above self.penDown() edge = 2 * radius * math.sin(math.pi / sides) # logo uses sin(180 / sides); Python uses radians self.polygon(sides, edge) self.left(angle) # turn back to where we started self.penUp() self.backward(radius) self.penDown() def showTurtle(self): """makes the turtle visible the visibility of the turtle is independent of the turtle pen, use penUp() and penDown() to control the pen state""" if not self._visible: self._drawTurtle() self._visible = True def hideTurtle(self): """hides the turtle the visibility of the turtle is independent of the turtle pen, use penUp() and penDown() to control the pen state""" if self._dirty: self._drawTurtle() self._visible = False def _drawTurtle(self): """ override """ pass def suspendOdometer(self): """suspends the turtle odometer""" self._odometerOn = False def resumeOdometer(self): """resumes the turtle odometer""" self._odometerOn = True def getOdometer(self): """returns the turtle odometer""" return self._odometer def resetOdometer(self): """resets the turtle odometer to 0.0""" self._odometer = 0.0 def penUp(self): """raises the turtle pen, so no drawing will occur on subsequent commands until the pen is lowered with penDown""" self._drawing = False def penDown(self): """lowers the turtle pen""" self._drawing = True """ # Logo functions to implement # see http://www.embry.com/rLogo/rLogoReference.html # and http://www.embry.com/rLogo/Index.html for a working logo applet # setpencolor will be handled by color() setpencolor and setpc (red) (green) (blue) - changes the pen color to the specified color. (red), (green), and (blue) must range from 0 to 255. setbackcolor and setbc (red) (green) (blue) - changes the background color to the specified color. (red), (green), and (blue) must range from 0 to 255 write """ def write(self, txt): """ override """ pass def width(self, width): """set the pen width""" self._width = float(width) def home(self): """resets the turtle back to its starting location""" x0, y0 = self._origin self._goto(x0, y0) #self._goto(self._origin) self._angle = 0.0 def _clear(self): """ override """ pass # need to enhance this to support the various # color settings: colourName, rgb """ valid named colors from wxWindows http://www.lpthe.jussieu.fr/~zeitlin/wxWindows/docs/wxwin64.htm#wxcolourdatabase aquamarine, black, blue, blue violet, brown, cadet blue, coral, cornflower blue, cyan, dark grey, dark green, dark olive green, dark orchid, dark slate blue, dark slate grey dark turquoise, dim grey, firebrick, forest green, gold, goldenrod, grey, green, green yellow, indian red, khaki, light blue, light grey, light steel blue, lime green, magenta, maroon, medium aquamarine, medium blue, medium forest green, medium goldenrod, medium orchid, medium sea green, medium slate blue, medium spring green, medium turquoise, medium violet red, midnight blue, navy, orange, orange red, orchid, pale green, pink, plum, purple, red, salmon, sea green, sienna, sky blue, slate blue, spring green, steel blue, tan, thistle, turquoise, violet, violet red, wheat, white, yellow, yellow green """ def color(self, *args): """ override """ pass def setBackColor(self, *args): """ override """ pass def turtleDelay(self, s): """set the delay the turtle waits between drawing commands""" self._turtleDelay = s def reset(self): """ this should be called after a subclass has done its reset """ width, height = self._size self._origin = width/2.0, height/2.0 #print "width: %d, height: %d" % (width, height) #print "_origin.x: %f, _origin.y: %f" % (self._origin[0], self._origin[1]) self._position = self._origin self._angle = 0.0 # used for save and restore methods self._savePosition = self._position self._saveAngle = self._angle # used for LIFO stack of turtle state self._turtleStack = [] self._odometer = 0.0 # don't waste time tracking unless requested self._odometerOn = False # whether the pen is down self._drawing = True # the pen width self._width = 1 # whether the turtle is visible, independent of the pen state self._visible = False # if _dirty then erase old turtle before drawing self._dirty = False # only true while drawing the turtle self._drawingTurtle = False # number of seconds to pause after drawing the turtle self._turtleDelay = 0 # implicit save of pen state, penUp, pen state restore # KEA 2004-05-09 # why the heck did I not require both x and y to be specified? # is that the way Logo works? def moveTo(self, x=None, y=None): """move the turtle to position x, y""" if x is None: x = self._position[0] if y is None: y = self._position[1] drawingState = self._drawing self._drawing = False self._goto(x, y) self._drawing = drawingState # this might get an implicit save of pen state, penDown, pen state restore def lineTo(self, x=None, y=None): """draw a line between the current turtle position and x, y the turtle is moved to the new x, y position""" if x is None: x = self._position[0] if y is None: y = self._position[1] self._goto(x, y) def _goto(self, x1, y1): """ override """ self._position = (float(x1), float(y1)) # could save more than position and heading below # perhaps the turtle color, whether it is shown or not? def save(self): """save the current turtle position and heading""" self._savePosition = self._position self._saveAngle = self._angle def restore(self): """restore the turtle position and heading to the last saved state""" self.moveTo(self._savePosition[0], self._savePosition[1]) self.setHeading(self._saveAngle) def push(self): """push the current turtle position and heading onto a LIFO stack""" self._turtleStack.append((self._position, self._angle)) def pop(self): """set the turtle position and heading to the state popped from a LIFO stack""" try: position, angle = self._turtleStack.pop() self.moveTo(position[0], position[1]) self.setHeading(angle) except IndexError: pass class BitmapTurtle(AbstractTurtle): def __init__(self, canvas): self.canvas = canvas #self.dc.SetOptimization(1) AbstractTurtle.__init__(self, canvas.size) # illegal syntax, so I used None and the if tests instead #def plot(self, x=self._position[0], y=self._position[1]): def plot(self, x=None, y=None): """draws a point at x, y using the current pen color and width note that the the turtle position is not changed by plot""" #self.dc.SetPen(self._color, self._width) ###self.dc.SetPen(self._pen) self.canvas._bufImage.SetPen(self._pen) if x is None: x = self._position[0] if y is None: y = self._position[1] # setting the color makes chaos1 over 3 times slower # so we probably need to do a simpler if/then check # prior to setting the color # that means keeping the variable in a form that is # simple to compare to the underlying dc canvas self.canvas.drawPoint((round(x), round(y))) # other variations #self.dc.DrawLine(x, y, x+1, y+1) #self._goto(x, y) # actually this isn't equivelant # KEA 2005-03-26 # this is necessary to force a screen update on the Mac if wx.Platform == '__WXMAC__' and self.canvas.autoRefresh: #self.canvas.Refresh() self.canvas.Update() def line(self, x1, y1, x2, y2): """draws a line from x1, y1 to x2, y2 using the current pen color and width note that the the turtle position is not changed by line""" ###self.dc.SetPen(self._pen) self.canvas._bufImage.SetPen(self._pen) ###self.dc.DrawLine(x1, y1, x2, y2) self.canvas.drawLine((round(x1), round(y1)), (round(x2), round(y2))) # KEA 2005-03-26 # this is necessary to force a screen update on the Mac if wx.Platform == '__WXMAC__' and self.canvas.autoRefresh: #self.canvas.Refresh() self.canvas.Update() # probably replace this with a wxPython primitive for polygons # so we can support filled polys... # def polygon(self, sides, distance): """ # Logo functions to implement # see http://www.embry.com/rLogo/rLogoReference.html # and http://www.embry.com/rLogo/ for a working logo applet # setpencolor will be handled by color() setpencolor and setpc (red) (green) (blue) - changes the pen color to the specified color. (red), (green), and (blue) must range from 0 to 255. setbackcolor and setbc (red) (green) (blue) - changes the background color to the specified color. (red), (green), and (blue) must range from 0 to 255 """ def write(self, txt): """prints txt at the current turtle position""" ###self.dc.DrawText(txt, self._position[0], self._position[1]) self.canvas.drawText(txt, self._position) def _clear(self): ###self.dc.Clear() self.canvas.clear() self._dirty = False # KEA 2005-03-26 # this is necessary to force a screen update on the Mac if wx.Platform == '__WXMAC__' and self.canvas.autoRefresh: #self.canvas.Refresh() self.canvas.Update() # need to enhance this to support the various # color settings: colourName, rgb """ valid named colors from wxWindows http://www.lpthe.jussieu.fr/~zeitlin/wxWindows/docs/wxwin64.htm#wxcolourdatabase aquamarine, black, blue, blue violet, brown, cadet blue, coral, cornflower blue, cyan, dark grey, dark green, dark olive green, dark orchid, dark slate blue, dark slate grey dark turquoise, dim grey, firebrick, forest green, gold, goldenrod, grey, green, green yellow, indian red, khaki, light blue, light grey, light steel blue, lime green, magenta, maroon, medium aquamarine, medium blue, medium forest green, medium goldenrod, medium orchid, medium sea green, medium slate blue, medium spring green, medium turquoise, medium violet red, midnight blue, navy, orange, orange red, orchid, pale green, pink, plum, purple, red, salmon, sea green, sienna, sky blue, slate blue, spring green, steel blue, tan, thistle, turquoise, violet, violet red, wheat, white, yellow, yellow green """ def width(self, w): """set the pen width""" if self._dirty: self._drawTurtle() #self._width = float(width) #self._width = w self._pen.SetWidth(w) if self._visible: self._drawTurtle() def color(self, *args): """set the foreground pen color both (r, g, b) values and named colors are valid""" if self._dirty: self._drawTurtle() # _color is actually the pen here # I need to just keep a pen and change the elements # of it if len(args) == 1: #self._color = wx.Pen(wx.NamedColour(args[0])) #self._color = wx.NamedColour(args[0]) self._pen.SetColour(wx.NamedColour(args[0])) else: # self._color = wx.Pen(wx.Colour(args[0], args[1], args[2])) #self._color = wx.Colour(args[0], args[1], args[2]) self._pen.SetColour(wx.Colour(args[0], args[1], args[2])) if self._visible: self._drawTurtle() # http://www.lpthe.jussieu.fr/~zeitlin/wxWindows/docs/wxwin265.htm # wxPen reference for pen width and style # colourdb.py for actual rgb color values of named colors in wxPython """ print self._color.GetCap() print self._color.GetColour() #print self._color.GetDashes() print self._color.GetJoin() print self._color.GetStipple() print self._color.GetStyle() print self._color.GetWidth() """ """ example output 130 (0, 0, 255) 122 100 1 """ #print self._color # self.dc.SetPen(wx.Pen(wx.NamedColour(args[0]))) # the background is shared, not specific to each turtle def setBackColor(self, *args): """set the background pen color both (r, g, b) values and named colors are valid""" if len(args) == 1: self.canvas.backgroundColor = args[0] else: self.canvas.backgroundColor = (args[0], args[1], args[2]) # non-optimized turtle # the turtle rotates from its base rather than a pivot point # in the "center" of the turtle shape # # as currently implemented drawTurtle is designed to erase # itself on a subsequent call to drawTurtle # in addition, this version does not use offscreen bitmaps # so an inversion is done on the pixels underneath the turtle # rather than showing the actual color of the current turtle def _drawTurtle(self): """private method for drawing the turtle when showTurtle() has been called to make the turtle visible""" #if not self._drawingTurtle: self._dirty = not self._dirty self._drawingTurtle = True drawingState = self._drawing currentPos = self._position currentAngle = self._angle #self._pen.SetCap(wx.CAP_PROJECTING) #self._pen.SetJoin(wx.JOIN_BEVEL) ###self.dc.SetPen(self._pen) self.canvas._bufImage.SetPen(self._pen) ###self.dc.SetLogicalFunction(wx.INVERT) self.canvas._bufImage.SetLogicalFunction(wx.INVERT) a = 30 # make a larger to get a bigger turtle b = 2 * a * math.tan(15 * self._invradian) c = a / math.cos(15 * self._invradian) self.pu(); self.forward(a); self.pd() self.left(165) self.forward(c) self.left(105) self.forward(b) self.left(105) self.forward(c) #self._pen.SetJoin(wx.JOIN_ROUND) #self._pen.SetCap(wx.CAP_ROUND) ###self.dc.SetLogicalFunction(wx.COPY) self.canvas._bufImage.SetLogicalFunction(wx.COPY) self._angle = currentAngle self._drawing = drawingState self._position = currentPos self._drawingTurtle = False if self._dirty and self._turtleDelay > 0: time.sleep(self._turtleDelay) def reset(self): """reset the turtle to its initial state""" self._size = self.canvas.size self._color = wx.Pen(wx.NamedColour("black")) self._pen = wx.Pen('black', 1, wx.SOLID) self.setBackColor('white') AbstractTurtle.reset(self) def _goto(self, x1, y1): if not self._drawingTurtle: if self._odometerOn: self._odometer += self.distanceXY(x1, y1) if self._dirty: # this is necessary to avoid an endless loop as drawTurtle uses _goto #self._dirty = 0 #visible = self._visible #self._visible = 0 self._drawTurtle() #self._visible = visible x0, y0 = start = self._position self._position = (float(x1), float(y1)) if self._drawing: """ if self._tracing: dx = float(x1 - x0) dy = float(y1 - y0) distance = hypot(dx, dy) nhops = int(distance) #print "tracing %d %d %d %d" % (x0, y0, x0, y0) #self.dc.SetPen(self._color, self._width) self.dc.SetPen(self._pen) self.dc.DrawLine(x0, y0, x1, y1) else: """ #print "%d %d %d %d" % (x0, y0, x0, y0) #self.dc.SetPen(self._color, self._width) if not self._drawingTurtle: ###self.dc.SetPen(self._pen) self.canvas._bufImage.SetPen(self._pen) ###self.dc.DrawLine(x0, y0, x1, y1) self.canvas.drawLine((round(x0), round(y0)), (round(x1), round(y1))) if not self._drawingTurtle: # KEA 2005-03-26 # this is necessary to force a screen update on the Mac if wx.Platform == '__WXMAC__' and self.canvas.autoRefresh: self.canvas.Update() if self._visible: # this is necessary to avoid an endless loop as drawTurtle uses _goto #self._visible = 0 #self._dirty = 1 self._drawTurtle() #self._visible = 1 PythonCard-0.8.2/twistedModel.py0000644000076500007650000000147710044000556016533 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.2 $" __date__ = "$Date: 2004/04/28 19:09:34 $" """ """ Adapted from Uwe C. Schroeder's cookbook entry "Using wxPython with Twisted Python" http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/181780 """ import wx import model from twisted.internet import reactor class TwistedApplication(model.Application): def OnInit(self): model.Application.OnInit(self) reactor.startRunning() wx.EVT_TIMER(self, 999999, self.OnTimer) self.twistedTimer = wx.Timer(self, 999999) self.twistedTimer.Start(250, False) return True def OnTimer(self, event): reactor.iterate() def OnExit(self): # need to stop the timer for cleanup purposes self.twistedTimer.Stop() self.twistedTimer = None reactor.stop() PythonCard-0.8.2/util.py0000644000076500007650000003311210433161425015040 0ustar alexalex00000000000000""" __version__ = "$Revision: 1.39 $" __date__ = "$Date: 2006/05/18 21:11:49 $" """ import os import sys import imp import re import fnmatch # Thomas Heller's function for determining # if a module is running standalone def main_is_frozen(): if sys.platform == 'darwin': # this is a temporary hack for bundlebuilder return not (sys.executable == '/System/Library/Frameworks/Python.framework/Versions/2.3/Resources/Python.app/Contents/MacOS/Python' or \ sys.executable == '/Library/Frameworks/Python.framework/Versions/2.4/Resources/Python.app/Contents/MacOS/Python' or \ sys.executable == '/Library/Frameworks/Python.framework/Versions/2.5/Resources/Python.app/Contents/MacOS/Python') else: return (hasattr(sys, "frozen") or # new py2exe, McMillan hasattr(sys, "importers") # old py2exe or imp.is_frozen("__main__")) # tools/freeze, cx_freeze def get_main_dir(): if main_is_frozen(): return os.path.dirname(sys.executable) return os.path.dirname(sys.argv[0]) # this is how I expected os.path.dirname to work # it might be better to name this directoryName instead?! def dirname(path): if os.path.isdir(path): return path else: return os.path.split(path)[0] def readAndEvalFile(filename): f = open(filename) # KEA 2004-09-11 # this should be a cleaner way of changing line endings # that works for the Mac (\r) as well as Windows (\r\n) line endings # but just in case this breaks something I'll leave the # old way commented out #txt = f.read().replace('\r\n','\n') txt = '\n'.join(f.read().splitlines()) f.close() return eval(txt, globals()) def findString(pattern, text, caseSensitive=0, wholeWordsOnly=0): """ search for pattern in text and return the offset of the first match or -1 if the text is not found """ if wholeWordsOnly or not caseSensitive: # we could probably just always use # a regular expression, but I'm guessing # that string find() is quicker if wholeWordsOnly: pattern = r'\b' + pattern + r'\b' if caseSensitive: p = re.compile(pattern) else: p = re.compile(pattern, re.IGNORECASE) match = p.search(text) if match is None: return -1 else: return match.start() else: return text.find(pattern) # original function by Steve Purcell def findnth(s, substr, n): """find the nth occurance of substr in s return the offset""" offset = -1 for i in xrange(n): offset = s.find(substr, offset+1) if offset == -1: break return offset # KEA 2002-01-16 # we may switch to the findnth function below # I have tested it for large values of n yet """ # original by Mark Pilgrim and Alex Martelli def findnth(theString, searchString, n): pieces = theString.split(searchString, n) # print 'O',pieces,len(pieces),n+1 if len(pieces) != n+1: return -1 # print 'O',len(theString), len(pieces[n]), len(searchString) return len(theString)-len(pieces[n])-len(searchString) """ def normalizeEOL(text): """Return text with line endings replaced by \n.""" #return text.replace('\r\n', '\n').replace('\r', '\n') return '\n'.join(text.splitlines()) # KEA doc handling adapted from python_docs # method in IDLE EditorWindow.py def documentationURL(filename): fn = os.path.dirname(__file__) if isinstance(filename, str): url = "http://pythoncard.sourceforge.net/" + filename fn = os.path.join(fn, "docs", "html", filename) else: url = "http://pythoncard.sourceforge.net/" + "/".join(filename) fn = os.path.join(fn, "docs", "html", os.sep.join(filename)) fn = os.path.normpath(fn) if os.path.isfile(fn): if sys.platform == 'darwin': # webbrowser on Mac OS X likes a file: prefix fn = 'file:' + fn return fn else: return url def dirwalk(dir, patterns=['*'], recurse=1): """walk a directory tree, using a generator matching filenames with the patterns list based on http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/105873""" for f in os.listdir(dir): fullpath = os.path.join(dir,f) if os.path.isdir(fullpath) and not os.path.islink(fullpath): if recurse: for x in dirwalk(fullpath, patterns, recurse): # recurse into subdir yield x else: for pattern in patterns: if fnmatch.fnmatch(f, pattern): yield fullpath break def wordwrap(text, width): """word-wrap function that preserves line breaks and spaces http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/148061""" return reduce(lambda line, word, width=width: '%s%s%s' % (line, ' \n'[(len(line[line.rfind('\n')+1:]) + len(word.split('\n')[0] ) >= width)], word), text.split(' ') ) def caseinsensitive_sort(strList): """case-insensitive string comparison sort doesn't do locale-specific compare though that would be a nice addition usage: strList = caseinsensitive_sort(strList)""" tuplesList = [(x.lower(), x) for x in strList] tuplesList.sort() return [x[1] for x in tuplesList] # this is similar to the function above # but is used for sorting a list of dictionaries # by a particular key # it is used by the flatfileDatabase.py module # records missing the name field will end up # ahead of records that do def caseinsensitive_listKeySort(recs, name): tupleList = [(recs[i].get(name, '').lower(), i) for i in xrange(len(recs))] tupleList.sort() return [recs[i] for dummy, i in tupleList] # adapted from John Bair's Xml2Obj cookbook recipe # http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/149368 from xml.parsers import expat class Element: 'A parsed XML element' def __init__(self,name,attributes): 'Element constructor' # The element's tag name self.name = name # The element's attribute dictionary self.attributes = attributes # The element's cdata self.cdata = '' # The element's child element list (sequence) self.children = [] def AddChild(self,element): 'Add a reference to a child element' self.children.append(element) def getAttribute(self,key): 'Get an attribute value' return self.attributes.get(key) #return unicode.encode(self.attributes.get(key)) def getData(self): 'Get the cdata' return self.cdata def getElements(self,name=''): 'Get a list of child elements' #If no tag name is specified, return the all children if not name: return self.children else: # else return only those children with a matching tag name elements = [] for element in self.children: if element.name == name: elements.append(element) return elements class Xml2Obj: 'XML to Object' def __init__(self): self.root = None self.nodeStack = [] def StartElement(self,name,attributes): 'SAX start element even handler' # Instantiate an Element object element = Element(name.encode(),attributes) # Push element onto the stack and make it a child of parent if len(self.nodeStack) > 0: parent = self.nodeStack[-1] parent.AddChild(element) else: self.root = element self.nodeStack.append(element) def EndElement(self,name): 'SAX end element event handler' self.nodeStack = self.nodeStack[:-1] def CharacterData(self,data): 'SAX character data event handler' if data.strip(): data = data.encode() element = self.nodeStack[-1] element.cdata += data return def Parse(self,filename): # Create a SAX parser Parser = expat.ParserCreate() # SAX event handlers Parser.StartElementHandler = self.StartElement Parser.EndElementHandler = self.EndElement Parser.CharacterDataHandler = self.CharacterData # Parse the XML File fp = open(filename) data = fp.read() fp.close() ParserStatus = Parser.Parse(data, 1) return self.root def XmlToListOfDictionaries(filename): parser = Xml2Obj() element = parser.Parse(filename) return [rec.attributes for rec in element.getElements()] # KEA 2003-07-02 # this will become the generalized script launching function after # release 0.7.1 # currently it is only used by the slideshow sample def getCommandLineArgs(cmdLineArgs): args = [] if cmdLineArgs['otherargs'] != '': args.append(cmdLineArgs['otherargs']) if cmdLineArgs['debugmenu']: args.append('-d') if cmdLineArgs['logging']: args.append('-l') if cmdLineArgs['messagewatcher']: args.append('-m') if cmdLineArgs['namespaceviewer']: args.append('-n') if cmdLineArgs['propertyeditor']: args.append('-p') if cmdLineArgs['shell']: args.append('-s') return args def runScript(filename, args=' ', requireConsole=False, useInterpreter=False): if filename is None: # KEA 2002-03-25 # should probably present an error dialog here return filename = '"' + filename + '"' if useInterpreter: interp = ' -i ' else: interp = ' ' if sys.platform.startswith('win'): python = sys.executable if ' ' in python: pythonQuoted = '"' + python + '"' else: pythonQuoted = python if useInterpreter and os.name != 'nt': os.spawnv(os.P_NOWAIT, python, [pythonQuoted, interp, filename, args]) else: os.spawnv(os.P_NOWAIT, python, [pythonQuoted, interp, filename, args]) else: if ' ' in sys.executable: python = '"' + sys.executable + '"' else: python = sys.executable os.system(python + interp + filename + ' ' + args + ' &') # KEA 2004-04-25 # let's finally figure out all the quoting rules for 0.8 # whether we need to run as a background process, whatever # and establish a generalized launch routine # args should probably be passed in as a list # from samples.py # on_launch_command # # also see codeEditor, findfiles, and resourceEditor script launching # slideshow for example usage of runScript above # runScript should handle any required quoting rather than the calling script # # this is the perfect kind of thing to have a unit test for to try various # pathnames with spaces, characters that need to be quoted a specific way, # whether args need to be quoted, etc. """ # KEA 2002-04-28 # os.spawnv probably works on all platforms # and regardless of the quoting needs for paths with # and without spaces, but each platform is separate # below until that is confirmed if ' ' in filename: filename = '"' + filename + '"' python = sys.executable if ' ' in python: pythonQuoted = '"' + python + '"' else: pythonQuoted = python os.spawnv(os.P_NOWAIT, python, [pythonQuoted, filename] + args) """ def colorFromString(s): s = s.strip() if s == '': color = None elif (s.startswith('(') and s.endswith(')')) or (s.startswith('[') and s.endswith(']')): # assume a color tuple try: r, g, b = s[1:-1].split(',') color = (int(r), int(g), int(b)) except: color = None else: # assume color string such as blue or #0000FF # we could do further verification here # to avoid an exception being thrown when color is set color = s return color # compute relative path # http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/208993 def pathsplit(p, rest=[]): (h,t) = os.path.split(p) if len(h) < 1: return [t]+rest if len(t) < 1: return [h]+rest return pathsplit(h,[t]+rest) def commonpath(l1, l2, common=[]): if len(l1) < 1: return (common, l1, l2) if len(l2) < 1: return (common, l1, l2) if l1[0] != l2[0]: return (common, l1, l2) return commonpath(l1[1:], l2[1:], common+[l1[0]]) # KEA 2004-08-24 # I made a few changes below to get rid of redundant leading .. def relativePath(p1, p2): # AGT 2005-05-10 # Protect against the case where one of the parameters is 'None' # e.g. in the resourceEditor before the resource file has been saved if not p1: p1 = '' if not p2: p2 = '' (common,l1,l2) = commonpath(pathsplit(p1), pathsplit(p2)) p = [] if len(l1) > 0: p = ['../' * len(l1)] p = p + l2 path = os.path.join(*p) # KEA 2004-08-24 # this isn't really the right place to get rid of Windows-specific # path stuff, but I don't want to have to stick this code everywhere # I call relativePath, so let's see if this causes a problem # we want all paths to be Unix-like with forward slashes path = path.replace('\\\\', '/').replace('\\', '/') if path.startswith('../'): path = path[3:] return path # platform independent way of getting highest # resolution for doing timing if sys.platform[:3] == 'win': # time.clock has better resolution on Windows from time import clock time = clock else: # but time.time is better on *nix from time import time PythonCard-0.8.2/widget.py0000644000076500007650000005050210222037401015340 0ustar alexalex00000000000000 """ __version__ = "$Revision: 1.136 $" __date__ = "$Date: 2005/03/28 17:29:37 $" """ import wx import event import error import font import graphic import component def makeNewId(id): if id == -1: return wx.NewId() else: return id class WidgetSpec( component.ComponentSpec ) : def __init__( self, name, parent, events, subclassAttributes ) : events.extend( event.WIDGET_EVENTS ) attributes = { 'id':{'presence':'optional', 'default':-1}, 'enabled' : { 'presence' : 'optional', 'default' : 1 }, 'visible' : { 'presence' : 'optional', 'default' : 1 }, 'foregroundColor' : { 'presence' : 'optional', 'default' : None }, 'backgroundColor' : { 'presence' : 'optional', 'default' : None }, #'helpText' : { 'presence' : 'optional', 'default' : '' }, 'toolTip' : { 'presence' : 'optional', 'default' : '' }, 'font' : { 'presence' : 'optional', 'default' : None }, 'position' : { 'presence' : 'optional', 'default' : [ -1, -1 ] }, 'size' : { 'presence' : 'optional', 'default' : [ -1, -1 ] }, 'userdata' : {'presence':'optional', 'default':''} } attributes.update(subclassAttributes) component.ComponentSpec.__init__( self, name, parent, events, attributes ) class Widget(component.Component): """ The base class for all of our GUI controls. Each Widget must bind itself to the wxPython event model. When it receives an event from wxPython, it will convert the event to a PythonCArd event.Event ( SelectEvent, ClickEvent, etc ) and post the event to the EventQueue. """ # _spec = WidgetSpec() def __init__(self, aParent, aResource): component.Component.__init__(self, aResource) self._parent = aParent self._resource = aResource self._setUserdata(self._resource.userdata) # KEA 2004-04-23 # Controls are enabled and visible by default # so no need to enable and call Show unless False. if not self._resource.enabled: self._setEnabled(self._resource.enabled) if not self._resource.visible: self._setVisible(self._resource.visible) if self._resource.foregroundColor is not None: self._setForegroundColor(self._resource.foregroundColor) if self._resource.backgroundColor is not None: self._setBackgroundColor(self._resource.backgroundColor) if self._resource.toolTip != "": self._setToolTip(self._resource.toolTip) if self._resource.font is None: self._font = None else: self._setFont(font.Font(self._resource.font, self)) def __repr__(self): return str(self.__dict__) def _getId(self): # KEA 2004-04-20 # the id is generated using makeNewId by the base wxPython control return self.GetId() def _setId(self, id): raise AttributeError, "id attribute is read-only" # KEA 2004-04-21 # finding the parent is probably going to be a common task # I'm tempted to make this a read-only attribute like id # but the user would never specify it, so it won't show up # in the spec, but before that is done the framework, samples, # and tools have to be checked for use of a parent variable def getParent(self): return self.GetParent() def _getToolTip(self): try: return self.GetToolTip().GetTip() except: return "" def _getFont(self): if self._font is None: desc = font.fontDescription(self.GetFont()) self._font = font.Font(desc) return self._font def _setForegroundColor( self, aColor ) : aColor = self._getDefaultColor( aColor ) self.SetForegroundColour( aColor ) self.Refresh() # KEA wxPython bug? def _setBackgroundColor( self, aColor ) : aColor = self._getDefaultColor( aColor ) self.SetBackgroundColour( aColor ) self.Refresh() # KEA wxPython bug? def _setToolTip(self, aString): toolTip = wx.ToolTip(aString) self.SetToolTip(toolTip) def _setFont(self, aFont): if isinstance(aFont, dict): aFont = font.Font(aFont, aParent=self) else: # Bind the font to this widget. aFont._parent = self self._font = aFont aWxFont = aFont._getFont() self.SetFont( aWxFont ) def _getUserdata(self): return self._userdata def _setUserdata(self, aString): self._userdata = aString def _getDefaultColor( self, aColor ) : if aColor is None : return wx.NullColour else : # KEA 2001-07-27 # is the right place for this check? if isinstance(aColor, tuple) and len(aColor) == 3: return wx.Colour(aColor[0], aColor[1], aColor[2]) else: return aColor # KEA 2004-04-16 # can the method below be replaced with #setFocus = wx.Window.SetFocus # even if Widget doesn't subclass wx.Window? # the same issue applies to other aliases that might be created # above and below # if not perhaps Widget should subclass wx.Window? def setFocus(self): self.SetFocus() def _getPosition(self): # get the actual position, not (-1, -1) return self.GetPositionTuple() def _setPosition(self, aPosition): self.Move(aPosition) def _getSize(self): # return the actual size, not (-1, -1) return self.GetSizeTuple() def _setSize(self, aSize): self.SetSize(aSize) def _getEnabled(self): return self.IsEnabled() def _setEnabled(self, aBoolean): self.Enable(aBoolean) def _getVisible(self): return self.IsShown() def _setVisible(self, aBoolean): self.Show(aBoolean) def _getForegroundColor(self): return self.GetForegroundColour() def _getBackgroundColor(self): return self.GetBackgroundColour() def redraw(self): """Force an immediate redraw without waiting for an event handler to finish.""" self.Refresh() self.Update() # KEA 2004-04-16 # if a subclass overrides any of the methods below then it needs to # set the property as well so the appropriate method gets used backgroundColor = property(_getBackgroundColor, _setBackgroundColor) font = property(_getFont, _setFont) foregroundColor = property(_getForegroundColor, _setForegroundColor) enabled = property(_getEnabled, _setEnabled) id = property(_getId, _setId) #position = property(wx.Window.GetPositionTuple, wx.Window.Move) position = property(_getPosition, _setPosition) size = property(_getSize, _setSize) toolTip = property(_getToolTip, _setToolTip) userdata = property(_getUserdata, _setUserdata) visible = property(_getVisible, _setVisible) # KEA 2004-05-02 # this will probably end up in Scriptable or Component # it should be completely generic # the only problem part would be the reference to the parent (background) # where the events are actually defined which would make this problematic # for a compound component or events bound to a Panel # what we really want is a reference to the application instance # there is probably some method to give us that in wxWidgets # UPDATE - I think GetTopLevelParent is what I was looking for def _bindEvents(self, eventList): # shouldn't components be subclasses of Scriptable? # components would have their own handlers but when # looking for a handler match it will search the parents # for now just grab handlers from the background # the references below would be self.findHandler instead of # background.findHandler # KEA 2004-09-13 # switching back to the earlier hack for finding the parent background # in order to support the PageBackground experiments #background = self.GetParent().GetParent() parent = self.GetParent() if isinstance(parent, wx.Dialog): background = parent else: background = parent.GetParent() if wx.GetApp()._showDebugMenu: bindUnusedEvents = True else: bindUnusedEvents = False # helper variable to simplify test for whether to bind InsteadOfTypeEvents # there is a good chance we will need to know # which events are bound, if we want to dynamically add or remove # events later, so go ahead and keep a reference to the list self.boundEvents = {} self.eventIdToHandler = {} self.wxEventIdMap = {} if 0: print "\nBINDING...", self.name actionBindings = {} if self.actionBindings is not None: actionBindings = self.actionBindings for eventClass in eventList: #for eventClass in ButtonEvents: # need to figure out a way to avoid the need # for this id to class mapping which is used in _dispatch below self.wxEventIdMap[eventClass.id] = eventClass # command handler overrides normal mouseClick or select handler # so dispatch will automatically dispatch to the command handler # by looking up the handler this way # it also means that if there is a command association with this component # then the regular mouseClick or select handler will never be bound, just ignored if issubclass(eventClass, event.CommandTypeEvent) and self.command: handler = background.findHandler('on_' + self.command + '_command') if not handler: handler = background.findHandler('on_' + self.name + '_' + eventClass.name) else: handler = background.findHandler('on_' + self.name + '_' + eventClass.name) if not handler: handler = background.findHandler('on_' + eventClass.name) if not handler: handlerData = actionBindings.get(eventClass.name) if handlerData is not None: handlerObjectName, handlerFunction = handlerData handlerObject = background.components.get(handlerObjectName) if handlerObject is not None: handler = getattr(handlerObject, handlerFunction, None) if not handler: handler = background.findHandler('on_' + handlerObjectName + '_' + handlerFunction) if handler or bindUnusedEvents: # only bind events that have an event handler # in this scenario unused events are never bound # which is more efficient, but the Message Watcher needs # to be changed # alternatively we can bind everything and then in _dispatch # if there isn't a match in eventIdToHandler then we know # the event isn't used and we can set used to False # the complication would be that we probably have to have to # always call Skip() which may or may not be a hassle with components # this doesn't bind command events # they would be of the form on_somename_command # or perhaps on_command but I don't think we would want # to support that # the event binding would be specific to a component # since on dispatch command overrides something like mouseClickEvent # but the name of the command is not related to the component # need to look at whether self.command has a value and then bind # with ButtonMouseClickEvent.binding if that isn't already bound # then in dispatch have to check again I think # need to avoid double binding # also binding shouldn't be order-specific # so how to avoid binding mouseDrag to _dispatch # if mouseMove is already bound or if binding mouseMove # not rebinding if mouseDrag is already bound # perhaps MouseDragEvent keeps a reference to MouseMoveEvent # and that is inserted into boundEvents, then we check boundEvents # prior to rebinding? if not self.boundEvents.get(eventClass.binding, None): self.Bind(eventClass.binding, self._dispatch) self.boundEvents[eventClass.binding] = eventClass.name if handler: if 0: print " binding", self.name, eventClass.name, handler.__name__, eventClass.id # KEA 2004-05-02 # change to just using the method directly, Handler class not needed # actually the Handler class isn't needed at all # so if the initial list built to simplify findHandler # just stores a reference to the method that would be fine # as long as the whole system uses that # the only reason we don't just build the list ourselves # in _bindEvents is that every component needs to do findHandler # so it is more efficient to do once when the Scriptable object # is created than to reparse for each component #self.eventIdToHandler[eventClass.id] = handler #self.eventIdToHandler[eventClass.id] = handler.getFunction() self.eventIdToHandler[eventClass.id] = handler if 0: print "\n boundEvents:" for name in self.boundEvents.values(): print " ", name print "\n\n" print "\n self.eventIdToHandler:" for id in self.eventIdToHandler: # KEA 2004-05-02 # change to just using the method directly, Handler class not needed #print " ", id, self.eventIdToHandler[id]._function print " ", id, self.eventIdToHandler[id] print "\n\n" def _dispatch(self, aWxEvent): eventType = aWxEvent.GetEventType() eventClass = self.wxEventIdMap[eventType] eventClassInstance = eventClass() # decorate will add the relevant event attributes aWxEvent = eventClassInstance.decorate(aWxEvent, self) if self.command and isinstance(eventClassInstance, event.CommandTypeEvent): # need to report the name for the handler if it exists eventName = 'command ' + self.command else: if isinstance(eventClassInstance, event.InsteadOfTypeEvent): # changes eventType if needed # e.g. mouseDrag instead of mouseMove eventType = eventClassInstance.translateEventType(aWxEvent) eventName = self.wxEventIdMap[eventType].name # cleanup eventClass = None eventClassInstance = None # it shouldn't be possible to be in _dispatch for an event # that wasn't bound above, but just in case... # KEA 2004-05-02 # change to just using the method directly, Handler class not needed #handler = self.eventIdToHandler.get(eventType, None) handler = self.eventIdToHandler.get(eventType, None) # KEA 2005-03-28 # don't fire events when objects are in the process of being deleted if handler and not aWxEvent.target.IsBeingDeleted(): event.EventLog.getInstance().log(eventName, self.name, True) if 0: print "dispatching", handler.__name__ # make a lowercase alias aWxEvent.skip = aWxEvent.Skip # the event handlers are part of the Background so # we have to have a reference to call the handler below # if Scriptable takes over the dispatch then # this would need to work differently if the actual # handler could be somewhere else # KEA 2004-09-13 # switching back to the earlier hack for finding the parent background # in order to support the PageBackground experiments #background = self.GetParent().GetParent() ## background = wx.GetTopLevelParent(self) parent = self.GetParent() if isinstance(parent, wx.Dialog): background = parent else: background = parent.GetParent() # this is what is in event.py # aHandler.getFunction()( aOwner, self.getSource(), self ) # KEA 2004-05-02 # change to just using the method directly, Handler class not needed #handler.getFunction()(background, aWxEvent) handler(background, aWxEvent) # do we have to clean up this alias? aWxEvent.skip = None # how about this local reference to handler? handler = None background = None else: event.EventLog.getInstance().log(eventName, self.name, False) # hopefully this is all we need to do for "unused events" aWxEvent.Skip() # cleanup aWxEvent.target = aWxEvent.eventObject = None class Panel(wx.Panel): def __init__(self, aParent, imageFile, tiled): wx.Panel.__init__(self, aParent, -1, style=wx.TAB_TRAVERSAL | wx.NO_FULL_REPAINT_ON_RESIZE) self._frame = aParent self._imageFile = imageFile self._backgroundTiling = tiled # KEA 2001-07-27 # Load the bitmap once and keep it around # this could fail, so should be a try/except. if imageFile is not None : self._bitmap = graphic.Bitmap(imageFile) wx.EVT_ERASE_BACKGROUND( self, self.onEraseBackground ) wx.EVT_WINDOW_DESTROY(self, self._OnDestroy) def _OnDestroy(self, event): # memory leak cleanup self._bitmap = None def tileBackground(self, deviceContext): # tile the background bitmap sz = self.GetClientSize() bmp = self._bitmap.getBits() w = bmp.GetWidth() h = bmp.GetHeight() if isinstance(self, wx.ScrolledWindow): # adjust for scrolled position spx, spy = self.GetScrollPixelsPerUnit() vsx, vsy = self.GetViewStart() dx, dy = (spx * vsx) % w, (spy * vsy) % h else: dx, dy = (w, h) x = -dx while x < sz.width: y = -dy while y < sz.height: deviceContext.DrawBitmapPoint(bmp, (x, y)) y = y + h x = x + w def getForegroundColor(self): return self.GetForegroundColour() def getBackgroundColor(self): return self.GetBackgroundColour() def _getDefaultColor(self, aColor): if aColor is None : return wx.NullColour else : # KEA 2001-07-27 # is the right place for this check? if isinstance(aColor, tuple) and len(aColor) == 3: return wx.Colour(aColor[0], aColor[1], aColor[2]) else: return aColor def setForegroundColor(self, aColor): aColor = self._getDefaultColor(aColor) self.SetForegroundColour(aColor) self.Refresh() # KEA wxPython bug? def setBackgroundColor(self, aColor): aColor = self._getDefaultColor(aColor) self.SetBackgroundColour(aColor) self.Refresh() # KEA wxPython bug? def onEraseBackground(self, aWxEvent): deviceContext = aWxEvent.GetDC() if not deviceContext : deviceContext = wx.ClientDC(self) r = self.GetUpdateRegion().GetBox() deviceContext.SetClippingRegion(r.x, r.y, r.width, r.height) if self._backgroundTiling: self.tileBackground( deviceContext ) else: deviceContext.DrawBitmapPoint(self._bitmap.getBits(), (0, 0)) position = property(wx.Panel.GetPositionTuple, wx.Panel.SetPosition, doc="position of the panel") size = property(wx.Panel.GetSizeTuple, wx.Panel.SetSize, doc="size of the panel")